You-Get 是什么?
You-Get 是一个常用的视频下载工具, 使用 Python 编写, 开源发布在 Github 上并可以通过 pip 安装.
Github 上的项目主页: https://github.com/soimort/you-get.
为什么要修改文件名最大长度?
先谈一个话题: 文件系统对文件名长度的限制.
几乎所有文件系统对文件名长度都有限制, 例如, ext4, Btrfs 的限制是 255 bytes, NTFS 的限制是 255 characters. 更多的文件系统限制信息可以参考维基百科——文件系统的对比页面.
值得注意的是, 以上几个文件系统的例子中, 我特意强调了 byte 与 character 的区别. 对英文来说, 1 character = 1 byte, 而其他语言, 尤其是亚洲语系, 每个字符通常占用 2 ~ 3 个字节. 至于为什么是这个数字, 就要扯到 Unicode 字符集和 UTF-8 编码了, 这些日后再谈.
换言之, 在涉及文件操作的软件开发过程中, 对文件名长度进行适当限制是必需的. 保守起见, 将长度限制设为 255 / 3 = 85, 甚至是 80 个字符似乎都是很有必要的.
You-Get 的开发者就是这样设计的.
但这也带来了问题: 在用 You-Get 执行下载时, 常常会因为所下载视频名称的字符数达到了 80 的限制而导致视频名称被强行截断, 特别是在下载 bilibili 视频的时候. 详情可以看这个 issue (You-Get 使用 pr 作为 issue 区).
出现这种情况时, 往往不是视频名称的长度真正超过了文件系统的限制, 而是由于名称中包含了相当一部分英文导致 80 的 "名额" 被抢占了.
怎样修改?
彻底一点的解决方案当然是添加计算真正的字节数的模块, 并使其不超过 255. 但这需要针对不同的系统编码环境做适配, 这也是面临的主要障碍. 例如, 尽管在至少十年前几乎所有 Linux 发行版就统一采用 UTF-8 作为系统编码, 但直到现在 Windows 的简体中文版仍然使用 GBK 作为文件名的编码. 这就使得同一个汉字, 在 Linux 下是 3 字节长度, 在 Windows 下却可能是 2 字节长度, 给计算字节数带来相当不便. 更遑论 Windows 的日文版同样未使用 UTF-8, 而是使用 Shift JIS 编码. 在目前的文档编码流行度中, 居于 UTF-8 之后的正是 Shift JIS 和 GB 2312 (GBK 的前身), 也可谓是另一种意义上的 "有名" 了.
简单的解决方案倒是有. You-Get 对文件名的截断操作在 fs.py
文件中. 对于 Linux, 这一文件应当在 /usr/lib/python-version/site-packages/you_get/util
目录或者 /home/$USER/.local/lib/python-version/site-packages/you_get/util
目录下. 文件的倒数第二行应当如下:
text = text[:80] # Trim to 82 Unicode characters long
将 80 修改为较大的数值即可. 比如, 修改为 200:
# used to be 80
text = text[:200] # Trim to 82 Unicode characters long
建议添加注释, 以便在出问题时能够还原.