下载神器被 Github 下架后,作者写下了这篇回应
【前哨君注】:先简单回顾一下 youtube-dl 下架事件的前后经过。
10 月 23 日,外媒报道
youtube-dl
在 RIAA 投诉之后被 GitHub 下架。此时其 Star 有 7.55 万。
GitHub 下架行为引发开发者社区强烈反弹,很多程序员开始在 GitHub 上疯狂发布传播 youtube-dl 项目。在 GitHub 的十月热榜中,就有一个是 youtube-dl 的复刻版。
11 月 7 日,youtube-dl 的开发者 Ricardo García 写文回应,下面是出自我们团队司健帅的译文。
11 月 17 日,GitHub 正式恢复
youtube-dl
仓库。
12 月 4 日,截止我们发文为止,youtube-dl 的 Star 数已高达 8.37 万,在 GitHub 大约排在第 29 位。
可能大家已经知道了,在我写下这篇文章之时,GitHub 已经根据美国唱片业协会(RIAA)提出的数字千年版权法(DMCA)下架了youtube-dl
仓库。对于这个项目的现有维护者和未来走向,我不宜发表什么评论。但我想和你们分享一下我最初几年开发和维护youtube-dl
的故事,算是对下架要求的一个回应吧。
偷铜线的贼
每一个好故事都得有个反派。在youtube-dl
的故事里,我就把那些偷铜线的贼作为反派吧。
2006年,我住在距离西班牙北部城市阿维莱斯(Avilés)5到10公里的一个小镇子上。那时,阿维莱斯已经有不错的基础设施建设,住在那里的人可以用 ADSL 来上网。我家离电话交换中心非常远,所以没有这样便利的上网条件。镇子上用来上网的铜线经常会被小偷偷走,网络服务时常会中断。电话公司知道自己的铜线早晚会被偷走,于是就把铜线换成了细细的质量很差的材料,这种情况持续了好几年。
我在家唯一的联网方式是用一个 56k 的猫拨号上网。拨号上网的信号太差了,我不得不把这个猫的速度限制到 33.6 kbps,这样网络连接才能稳定一点,实际上我的下载速度很难超过每秒 4KB。
那年 YouTube 已经越来越受欢迎,年底被 Google 收购了。
整晚地下载
基于上面所说网络状况,你应该能想象看 YouTube 视频是多么痛苦了。缓冲那些稍微大点的视频要花掉很长的时间,比如一个 10MB 大小的短片需要40分钟才能完成——根本无法实时观看。如果视频再长一点或清晰度再高一点,那么缓冲常就得以小时计算了,缓冲时我还不能在网上干其他事。更别提还存在网络中断的可能,一旦中断就得从头再来。如果你喜欢某些视频想多看几遍,那你就要像个受虐狂一样不断的去重复这个过程。
这个情况让我不得不研究下载视频的方法,这样只要把有趣的视频下载到本地就可以随时观看。如果下载视频的工具又足够好,哪怕像现在一样下载经常中断也能随时恢复下载。
那时网上已经有一些下载 YouTube 视频的工具,其中包括一个非常流行的油猴脚本,但这些工具里没有一个能满足我的要求。出于偶然的想法,我尝试自己去写一个这样的工具,而这基本上这就是youtube-dl
出现的原因了。为了方便自己使用,我把这个工具做成了命令行的方式。而我选择 Python 语言的原因是它有广泛的标准库支持,功能实现起来比较简单,还有一个附带的好处是它不依赖任何特定的平台。
从 Ethereal 开始
程序的最初版本只能下载 YouTube 视频,而它的架构基本没有什么专门的设计,因为它只完成了作为一个简单脚本该完成的事——下载视频,根本不需要什么架构设计。程序原始代码只有223
行,其中只有143
行是真正的代码,还有44
行的备注和36
行的空白。选择youtube-dl
这个名字的纯碎是为了方便,它非常直接又容易记住。我只要凭直觉在终端里面输入 Y——O——U 加 Tab 就打开它。
那时我已经用 Linux 好几年了。为了让需要的人用到这个软件,我决定以自由软件许可证的方式发布这个软件(前几个版本使用的是 MIT)。那时候还没有 GitHub,我只能「勉为其难」地使用 SourceForge 托管项目,为了创建这个项目,又必须在 SF 上填写一些无聊的表单。最终我放弃了在 SF 上进行发布,而是在网络供应商赠送的空间上发布了这个软件。如今已经很少有网络供应商提供存储空间了,但那时供应商给用户提供邮箱和 FTP 空间是很常见的,用户都有自己的网络空间。软件发布第一版的时间是2006年8月8日
,不过在发布之前我已经使用几周了。
为了写这个程序,我去研究在用户看视频时 Firefox 浏览器都做了些什么。没记错的话那时 Firefox 还没有用来分析用户网络活动的开发者工具。网络连接使用的是 HTTP 协议,加载 YouTube 视频时我用 Wireshark (那时候它的名字是 Ethereal)进行网络抓包,事实证明这个软件非常有价值。我写youtube-dl
就是想和浏览器做一样的工作——获取同样的视频文件。youtube-dl
会一字不差地把 Linux 上 Firefox 浏览器的 User-Agent 发给 YouTube,目的是让 YouTube 返回跟用浏览器时一样的网页,用这个网页再研究浏览器怎么处理。
还要说明的是,YouTube 使用的是 Adobe Flash 播放器,视频是 Flash 的 FLV 格式,要让浏览器支持这个格式就需要专有插件(可能还有人记得libflashplayer.so
),而这种视频格式也让很多浏览器开发工具失效了。Flash 播放器长时间以来都有安全方面的问题。我用 Flashblock 浏览器扩展来阻止网页里的插件自动加载,原有的 Flash 内容会被替换成一个可点击的按钮,只有主动点击按钮播放插件才会加载。
除了让浏览器更安全外,Flashblock 还有两个很不错的用途:一方面,它能移除网页上吵闹繁杂的广告,某些第三方广告还有安全问题;另外一方面,它能帮我我分析播放器是如何加载视频的,等视频页面加载完成后打开 Wireshark,然后再点击加载视频,这样就能抓到插件下载视频播放器和内容时的流量数据了。
补充一点,使用 Flash 播放器观看视频时其实已经把文件下载到本地了(Linux 系统会存放到 /tmp 目录),很多人不用工具就能来保存视频。但是youtube-dl
要方便一些,比如它能自动的抓取视频标题来给视频文件命名。
哈哈,“小鲜肉”(Freshmeat)来了
Flash 插件最终还是改版了,用户不再那么容易就能下载视频。它使用的第一个手段是在视频下载成功后就解除关联,插件在页面关闭之前通过文件的索引关联、播放视频,但视频在系统文件里面是不可见的。虽然通过 /proc 系统查看浏览器的文件描述也能找到视频文件,但这样的限制越来越多,youtube-dl 开始显得越来越方便了。
那时有许许多多的免费软件和开源软件爱好者,我用一款叫作 Freshmeat 的服务订阅自己感兴趣的软件动态。我在发布youtube-dl
时也在这个网站上创建了一个项目,这样用户就能获得软件的更新通知,也能查看软件的新特性、升级内容和功能日志等。Freshmeat 首页会展示最近更新的软件,在上面能发现一些有趣的新项目,这些软件通常一天有几十个。我猜linux.com
的编辑 Joe Barr 就是通过这个网站发现了我的项目,并且在 2006 年为我的项目写一篇介绍文章。
linux.com
那时候和现在有点不一样,它跟Slashdot
和Linux Weekly News
这些经典网站一样都是 Linux 爱好者最常访问的网站,反正我会经常浏览。
从那时候开始,youtube-dl
开始变得越来越流行,我经常收到一些邮件感谢我创造并维护这个软件。
代码托管
时间很快来到了2008年。youtube-dl
慢慢变得越来越受欢迎,经常有用户建议我写类似的程序支持更多网站的视频下载,我也答应了这些要求。那时我决定开始重写这个程序,为的就是让程序原生支持更多视频网站。我的想法很简单——把程序内部分成几个功能模块,简化内部最重要的模块:一个模块是文件下载器;一个模块是信息提取,这个提取器是针对特定视频网站代码的对象(或类)。给程序特定或者似 URL 的地址后,提取器会查询并确定哪个模块能处理这种类型的 URL,然后根据视频或者视频列表来获取视频信息。这样就能通过视频地址或者播放列表下载特定的视频,也会保存视频的标题等信息。
我也趁机切换了版本控制系统,更改了程序托管的地方。在那时的版本控制软件的战争中,Git 最终赢得了胜利,但 Mercurial(Python 语言实现的一款分布式版本控制软件)也有很多用户,在测试了这两款产品后,我觉得比起 Git 我还是更喜欢用 Mercurial。于是我在youtube-dl
项目上使用了 Mercurial,很自然地把它迁移到了 BitBucket:那时 BitBucket 只能托管 Mercurial 仓库,而 GitHub 只能托管 Git 仓库。这两个版本控制软件都是 2008 年发布的,和当时的 SourceForge 相比都是业界清流。它们为每个用户划分了项目命名空间(比如只要求项目名称在你的账户里唯一,不要求在整个网站中唯一),结合分布式版本控制系统,用户能快速发布软件到任何一个平台。尽管如此方便,我还是在几年后才把项目历史迁移到 Git 并使用 GitHub 托管。
毫无疑问,我应该抓住重写代码的机会给软件重新起名。但我不想因为改名让老用户迷惑,而且这个名字已经聚集起了小小的名气。
那年家里的上网环境也变了:手机上网套餐有了发展,年末我用上了 3G 数据套餐和 3G 拨号猫,这是我第一次用上还算不错的网络。即使这样我也一直在使用youtube-dl
。那时我每个月的网费是45 美元
,流量是5GB
。虽然网速不错但算一下平均每天只有 150MB 流量,上网的时候就要有所取舍,避免下载太大的内容。youtube-dl
就能预防我下载那些大视频。
新的归宿
我在 2009 年底搬到了阿莱维斯并和女朋友(现在是我的妻子,也是两个孩子的妈妈)住在了一起。我人生第一次用上了人家都用了好几年的宽带服务。我记得当时大宽带是 100MB 下载和 10MB 上传。这很大程度地减少了我用youtube-dl
的频率和对这个项目的关注度。
那时版本控制软件已经在市场上分出了胜负,不久之后我就把项目迁移到了 Git 并且托管在 GitHub。YouTube 也开始在网页测试 HTML5 视频,不过直到 2015 年 HTML5 才成为默认的播放选项。到 2011 年,我已经做了好几年的软件工程师,我不再急于回家写代码去优化youtube-dl
,或者给它添加我自己不用的新特性。
2011 年下半年,我正在处理另外一个重要的个人软件项目。在意识到已经几个月没有维护youtube-dl
后,我决定放弃项目维护者的身份。Philipp Hagemeister 是一个非常棒的开发者,他在 GitHub 上提交了一些待合并的修改,这些修改都是用户感兴趣的特性。我给了他youtube-dl
仓库的提交、合并权限,到此为止基本就是我开发youtube-dl
的所有故事了。
根据 Git 的记录,我最后为项目贡献代码是 2011年3月,再然后就是2011年8月份合并了 Philipp 的提交。在这之后为只有一次的文书方面的修改提交:在代码里把项目地址从 rg3.github.com 换成了 rg3.github.io。更改的原因是 GitHub 把用户页面从 用户名.github.com 迁移到了 用户名.github.io。没记错的话,GitHub 是为了避免官方域名 github.com 下有恶意用户而发生安全问题。
尽管之后我几乎没有参与youtube-dl
项目的开发,但是项目页面地址一直在我的账户里:https://github.com/rg3/youtube-dl 和 https://rg3.github.io/youtube-dl/ 。只有当 Philipp 和其他维护者要给更多开发者开通提交权限时候我才出现,这些开发者包括了那时的 Filippo Valsorda 和现在的维护者 Sergey。比较遗憾的是,项目 issue 在 2019 年出现了一些钓鱼问题,可是只有项目所有者才允许屏蔽那些用户。这件事让我们决定把项目变为 GitHub 的组织模式,每个有提交权限的开发者都会被邀请加入这个组织(尽管不是每个人都会加入)。变成组织模式后,所有项目维护者都能自由的管理项目,我不用再时不时介入了。
对多年来维护项目的开发者,我要重申我最真挚的谢意:感谢你们地提高了代码的质量,感谢你们建立了团结贡献者的真正社区,感谢你们让这个我在十多年前写的程序变得如此流行,感谢你们满足了成千上万人的需要。
离线并且免费
我要再说一次,在youtube-dl
发展的 14 年里,它作为工具的目标始终如一。美国唱片业协会提出数字千年版权法之前和之后,都有很多人都解释了自己是为了什么使用这个工具。
对我来说,这个工具是用来离线访问那些已经公开发布在网上的视频。在一个随时都有移动网络和互联网的世界,你可能会质疑是否真的有这个需求。如果 Netflix、亚马逊、迪斯尼和 HBO 在他们流行的应用里加入相似的离线功能,我想一定会有人需要的。对于长途旅行的人、去国外旅游的人(特别是跟孩子一起)、或者在乘坐地铁或飞机的人、网络连接不好或者按流量计费的那些人,如果能离线阅读评测、报告和新闻,离线收听播客、收看演讲等,都是非常方便的。
youtube-dl
还有个作用就是当不具备在线环境时观看在线内容。要知道不是所有的平台和架构都能运行老旧的 Flash 插件——完全取决于用户的选择。如今,尽管浏览器能播放视频,但通常会非常的耗电。而youtube-dl
能用高效的本地播放器播放视频。mpv 播放器就原生支持youtube-dl
,只要在播放器里面输入视频网址就能通过youtube-dl
播放流媒体,根本不用下载到本地。
另外,默认的在线页面可能缺少一些辅助功能:对一些人来说很难做内容的导航,有些缺少帮助色弱人士的颜色过滤器,但一些本地播放器却有这样的功能。
最后,但是同样重要的是,像youtube-dl
这样的工具能让用户用免费软件下载在线视频。我知道纯粹的自由或开源软件爱好者是不多的,一直以来我也不认为自己是这样的人。专利软件在当代生活中一直存在并且扮演着重要角色,在我们浏览网页时运行的 Javascript 中就有它们大量的身影,尽管专利软件有各自的商业目标,但是这些目标并不总是和用户利益一致。通用数据保护条例(GDPR)存在的缺陷和问题就是佐证。使用youtube-dl
查看视频能让你保持真正的隐私模式,但像 uBlock Origin 和 Privacy Badger 这些插件只能勉强做到了。
youtube-dl
项目链接:
https://github.com/ytdl-org/youtube-dl
- EOF -
更多优秀开源项目(点击下方图片可跳转)
如果觉得本文介绍的开源项目不错,欢迎转发推荐给更多人。
分享、点赞和在看
支持我们分享更多优秀开源项目,谢谢!