前言(都是废话,想看最终结果自己跳转到总结)
说起来挺离谱的,我用Termux挺长时间了,曾经用you-get下载B站视频都是无往不利的,但最近更新you-get后下载B站视频就莫名其妙报错,而用电脑下就毫无压力,这能忍吗?当然不能,所以我决定和这个bug一刚到底。最后的解决方案也是让我当场破防,无语凌噎。
环境介绍
Termux版本:0.118.0
you-get版本:0.4.1612
报错代码:
ValueError: Sign not allowed in string format specifier
** 小贴士 **
查看you-get报错方式:在you-get命令后加--debug
(注意空格)
举例:
you-get --debug 视频网址
过程分析
方案1
当我看见这个关于format报错的时候,我就直接打算打开you-get相关的源码看看,根据报错:输入vim /data/data/com.termux/files/usr/lib/python3.10/site-packages/you_get/common.py
并跳转到869行。
以下为那一行报错代码所在函数的具体代码:
def update(self):
self.displayed = True
bar_size = self.bar_size
percent = round(self.received * 100 / self.total_size, 1)
if percent >= 100:
percent = 100
dots = bar_size * int(percent) // 100
plus = int(percent) - dots // bar_size * 100
if plus > 0.8:
plus = '█'
elif plus > 0.4:
plus = '>'
else:
plus = ''
bar = '█' * dots + plus
# 下面这一行代码报错
bar = self.bar.format(
percent, round(self.received / 1048576, 1), bar,
self.current_piece, self.total_pieces, self.speed
)
sys.stdout.write('\r' + bar)
sys.stdout.flush()
通过它给出的变量和前后对比,不难看出,这不就是进度条嘛,第一个解决方案就立刻出来了,直接把报错的那一行代码注释掉就完工了。果不其然,注释掉后能下载视频了
** 注释代码后的函数 **
** 注释代码后的运行截图 **
能跑了,但是进度条坏了,并不完美。
方案2
没有进度条这种事情下短视频还好,长视频就难受了,都不知道下载到哪了,所以我放弃了方案1,进而我又去查了一下错误代码所指向的那个format字符串的源代码,又想到报错的内容
self.bar = '{:>4}%% ({:>%s}/%sMB) ├{:─<%s}┤[{:>%s}/{:>%s}] {}' % (
total_str_width, total_str, self.bar_size, total_pieces_len, total_pieces_len )
看见这个字符串后我想到了一个很离谱的方式,把字体缩小
,说不一定就能显示了呢?然后我测试了一下,还真成了,这就很离谱。
** 字体缩小后的下载显示 **
** 小贴士:字体放大缩小方式 **
到这里,基本可以肯定解决方案了,这个报错是内容显示不全导致的,只要适当缩小字体,就能解决这个问题(不用像我这样缩小的这么小)。
总结
解决方案就是缩小字体(缩小字体的方式上面那个动图展示的),小到能显示进度条就行。
如果实在不行,就把报错的那一行注释掉(具体注释内容看过程分析的方案1),没进度条,就肯定不能报错了。
最后我只想说报错并不可怕,可怕的是不想思考。