YouTube-DL项目的由来

2020-11-11 00:49:18

正如你可能知道的,在写这篇文章的时候,YouTube-dl在GitHub的存储库被屏蔽了,因为GitHub代表RIAA收到了一封DMCA的下架信。虽然我不能评论目前的维护者计划或正在进行的讨论,但考虑到信中的说法,我认为将YouTube-dl作为项目创建者和最初维护者的头几年写下来是有价值的。

所有好的故事都至少需要一个恶棍,所以我武断地选择了偷铜贼作为故事中的恶棍,这个故事催生了YouTube-dl的今天。早在2006年,我住在距离阿维莱斯5到10公里的一个小镇上,阿维莱斯本身就是西班牙北部的一个小城市或小镇。虽然阿维莱斯的人们享受着一些不错的基础设施和服务,包括有线电视和ADSL互联网接入,但我居住的地区缺乏这些优势。我离电话交换机太远了,无法享受ADSL,铜盗们多年来一直在沿途窃取铜线,导致电话服务不时中断,电话公司知道这些电线可能会再次被盗,因此更换了更弱、更细的电线。在这一点上,这种情况已经持续了几年。

这意味着到目前为止,我家庭互联网接入的唯一选择是拨号连接和56K的V.90调制解调器。事实上,连接质量太差了,我不得不将调制解调器的速度限制在33.6kbps模式,这样连接至少是稳定的。实际下载速度很少超过4KB/秒。YouTube当时越来越受欢迎,直到当年年底被谷歌收购。

正如你可以想象的那样,在我上面描述的那种连接上观看任何YouTube视频肯定是痛苦的。任何中等大小的视频都需要很长时间才能下载。例如,如果你计算一下,一段10MB的短片需要40分钟才能下载,这使得流媒体成为不可能。一个更长、质量更高的视频将需要几个小时的时间,在您等待连接可用期间,连接将无法用于其他目的,更不用说连接被中断并不得不重新启动下载过程的可能性。现在想象一下,在看完一段特定的视频后,你会非常喜欢它,然后想要再看一遍或三遍。再次经历这一过程几乎是一种受虐狂行为。

这种情况让我对下载我想看的视频的可能性很感兴趣:如果视频很有趣,拥有一份拷贝就意味着我可以很容易地观看几次。此外,如果下载程序运行良好,如果连接中断,下载过程可能会恢复,就像经常发生的情况一样。

当时,还有其他从YouTube下载视频的解决方案,包括一个非常流行的Gresemonkey脚本。纯属偶然,我测试的为数不多的几个工具在我工作时都不工作,所以我决定探索创建我自己的工具的可能性。这或多或少就是YouTube-dl诞生的原因。我把它做成了一个命令行程序,使它对我来说很容易使用,并用Python编写它,因为它很容易,这要归功于它广泛的标准库,还有一个很好的副作用,那就是它将是独立于平台的。

该程序的最初版本只适用于YouTube视频。它几乎没有任何内部设计,因为它是不需要的。作为一个简单的脚本,它做了它必须做的事情,直截了当地说出了要点。行数只有223行,实际代码行只有143行,其中44行是注释,36行是空白。选择这个名字纯粹是出于方便:YouTube-dl是一个显而易见的名字,很难忘记,在我的终端上,它可以直观地输入为“Y-O-U-TAB”。

那时我已经使用Linux好几年了,我决定以自由软件许可证(麻省理工学院的第一个版本)发布这个程序,以防有人会觉得它有用。当时,GitHub还不存在,我们只能用SourceForge来“凑合”,它有一个有点繁琐的表格,你需要填写它才能创建一个新项目。所以,我没有去SourceForge,而是很快把它发布在我的互联网提供商给我的网络空间下。虽然现在并不常见,但对于互联网服务提供商来说,给你一个电子邮件地址和一些你可以使用FTP上传内容的网络空间是很常见的。那样的话,你就可以在网上拥有自己的个人网站了。第一个公开的版本是2006.08.08,尽管那时我可能已经使用这个程序好几个星期了。

为了制作这个程序,我研究了使用Firefox观看YouTube视频时网络浏览器在做什么。如果我没记错的话,Firefox还没有今天用来分析网络活动的开发工具。连接主要是HTTP和Wireshark,直到那一年,Wireshark还被称为“以太”,事实证明,在加载YouTube视频时,检查进出我的盒子的网络流量是非常宝贵的。我编写youtube-dl的具体目标是做与网络浏览器相同的事情来检索视频。它甚至发送了一个从Firefox for Linux逐字复制的User-Agent字符串,以确保该网站向程序发送的视频网页版本与用于研究网络浏览器正在做什么的版本相同。

此外,YouTube当时还使用Adobe Flash作为播放器。视频被用作Flash Video文件(FLV),这意味着需要一个专有插件才能在浏览器上观看它们(很多人都会记得可怕的libflashplayer.so库),这将使任何浏览器开发工具变得毫无用处。这个专有插件一直是安全建议和问题的来源。我使用了一个名为Flashblock的Firefox扩展,它在默认情况下阻止加载插件,并将网页中使用插件嵌入的内容替换为包含可点击图标的占位符元素,这样内容只会按需加载,除非用户请求,否则不会使用插件库。

除了让浏览体验更安全外,Flashblock还有两个不错的副作用。一方面,它从许多网页上删除了大量嘈杂和令人厌恶的广告,这在由第三方提供服务时也可能成为安全问题的来源。另一方面,它可以方便地分析视频播放器是如何下载视频的。我会等到视频页面完全下载完毕,然后开始使用Wireshark记录流量,然后点击嵌入式视频播放器占位符图标,允许其加载。这样,需要分析的唯一流量与下载视频播放器应用程序的插件和下载视频的应用程序本身相关。

同样值得一提的是,当时的Flash Player插件已经将这些视频的副本下载到了你的硬盘上(它们存储在Linux下的/tmp中),许多用户依靠该功能来保存它们的副本,而无需使用额外的工具。例如,youtube-dl更方便,因为它可以检索视频标题,并以自动方式更恰当地命名文件。

Flash Player插件最终被修改,这样视频就不会那么容易被抓取了。最初的措施之一是在创建视频文件后取消链接,以便i节点仍然存在,并可供使用它的进程使用(直到它被关闭),同时从文件系统的角度保持该文件不可见。仍然可以通过使用/proc文件系统来检查浏览器进程使用的文件描述符来获取文件,但是通过每一个小步骤,youtube-dl变得越来越方便。

就像当时许多自由和开源的爱好者一样,我用鲜肉订阅了我感兴趣的项目的新版本。当我创建youtube-dl时,我还在网站上为它创建了一个项目条目,这样用户就可以很容易地获得新版本的通知,以及列出新功能、修复和改进的更改日志。人们还可以浏览鲜肉来寻找新的有趣的项目,它的首页包含了最新的更新,通常一天只有几十个。这只是我的猜测,在2006年,linux.com的编辑乔·巴尔(安息吧)发现了这个项目,并决定写一篇关于这个项目的文章。Linux.com当时有点不同,我认为它是Linux爱好者经常访问的网站之一,还有其他经典网站,如Slashdot或Linux Weekly News。至少对我来说是这样。

从那时起,YouTube-dl的人气开始增长,我开始时不时地收到一些电子邮件,感谢我创建和维护这个程序。

快进到2008年。YouTube-dl的受欢迎程度一直在缓慢增长,用户经常要求我制作类似的程序,以便从更多的网站下载,我已经几次答应了这个请求。正是在这一点上,我决定从头开始重新编写程序,使其在本地支持多个视频网站。我有一些简单的想法,可以将程序内部划分为几个部分。为了简化最重要的部分:一个是每个网站通用的文件下载程序,另一个是信息提取程序:包含特定于视频网站的代码的对象(类)。当给定URL或伪URL时,信息提取器将被查询以了解哪个信息提取器可以处理该类型的URL,然后请求提取INFORM

我还借此机会切换了版本控制系统,并更改了项目的托管位置。当时,Git正在赢得开源项目的分布式版本控制系统之战,但Mercurial也有很多用户,在对两者都进行了测试后,我决定我更喜欢它而不是Git。我开始在youtube-dl上使用它,并将项目转移到了Bitbucket,这是自然而然的选择。当时,Bitbucket只能托管Mercurial存储库,而GitHub只能托管Git存储库。这两款产品都是在2008年推出的,与SourceForge相比,这两款产品都带来了新鲜空气。将按用户划分的项目名称空间(即项目名称不必是全球唯一的,但对于您的项目而言是唯一的)与分布式源代码控制系统相结合,意味着您可以在几分钟内将您的个人项目发布到这两个站点中的任何一个。无论如何,将项目历史迁移到Git并将项目迁移到GitHub还需要几年时间。

在重写这个项目时,毫无疑问,我应该抓住机会重新命名它,但我不想让现有用户感到困惑,我保留了这个名称,以努力保持该程序的小小人气。

那一年,国内的技术环境也发生了一些变化。移动数据计划开始获得吸引力,在那年年底,我给自己买了一台3G调制解调器和数据计划,这是我第一次能够以相当快的速度浏览网络。无论如何,这并没有让我停止使用youtube-dl。我每月支付45欧元,但每月的数据上限是5 GB。连接速度终于很快了,但根据计算,我平均每天只能使用150MB左右,这意味着我在使用网络时必须有选择性,如果可能的话,要避免大量下载。YouTube-dl对防止我多次下载大型视频文件有很大帮助。

一段时间之后,也就是2009年底,我搬到了阿维莱斯,终于开始和我的女朋友(现在是我的妻子,两个孩子的母亲)住在一起。我第一次开始使用我的很多朋友和家人多年来的标准连接和服务。我记得那是一个100/10 Mbps(下行/上行)的电缆连接,没有每月上限。这一变化无疑标志着我使用youtube-dl的频率以及我对这个项目的关注程度出现了转折点。

没过多久,我终于把它转到了Git和GitHub上,当时市场已经发出了声音,这两种工具都是可行的。YouTube也开始尝试HTML5视频,尽管它要到2015年左右才会成为默认选项。2011年,我做了几年的全职软件工程师工作,总的来说,我并不急于回家编写更多的代码,调优YouTube-dl,或者实现我可能不会亲自使用的最受欢迎的功能请求。

2011年下半年,我正在进行另一个重要的个人软件项目,知道自己已经好几个月没有完成这项任务了,于是决定辞去YouTube-dl维护员一职。Philipp Hagemeister已经被证明是一个伟大的程序员,在GitHub中有一些未决的拉请求,其中有几个许多人感兴趣的修复。我给了他访问我的youtube-dl回购的提交权限,这基本上就是我这方面的故事了。该项目的Git主分支日志显示,我有一个连续的提交流,直到2011年3月,他们跳到2011年8月合并Philipp的修复。从那以后,一名职员在2013年承诺在源代码中将rg3.github.com改为rg3.github.io,这是GitHub将用户页面从USERNAME.github.com移动到USERNAME.github.io时所需要的,以避免(如果我没记错的话)恶意用户网页从他们自己的官方github.com域提供服务时出现的安全问题。

虽然我基本上没有参与Youtube-dl的开发,但多年来官方项目页面一直以我在https://github.com/rg3/youtube-dl和https://rg3.github.io/youtube-dl/.的用户名命名。只有当Philipp或其他维护人员要求我授予其他开发人员提交权限时,我才会出现,比如当时的Filippo Valsorda或谢尔盖(Sergey),他是目前的维护人员之一。不幸的是,在2019年,我们的项目问题跟踪器出现了一个小问题,只有项目所有者才被允许屏蔽用户。这使得我们最终将项目转移到了一个GitHub组织,在那里所有拥有提交访问权限的人都被邀请了(尽管不是每个人都加入了)。GitHub组织让项目维护人员可以更自由地行动,而不需要我时不时地介入文书工作。

我想重申我最真诚的感谢这些年来不同的项目维护人员,他们极大地改进了代码,能够围绕它创建一个真正的贡献者社区,他们使这个项目比我卸任近10年时更受欢迎。

我想再说一次,YouTube-dl作为一个工具的目的在它存在的14年中几乎没有改变。在收到RIAA的DMCA信之前和之后,许多人解释了他们是如何怀着不同的目标使用YouTube-dl的。

对我来说,它一直是关于离线访问已经在网上向普通公众提供的视频。在一个移动网络和始终在线的互联网连接的世界里,你可能会怀疑这是否真的有必要。我想,如果Netflix、亚马逊、迪士尼或HBO都在它们极其流行的流媒体应用中实现了类似的功能,那肯定是这样的。对于长途公路旅行,或者特别是带着孩子出国旅行,或者在地下或飞机上,或者在连接不畅或连接不畅的地方,离线访问评论、报道、播客、讲座、新闻或艺术品是非常方便的。

YouTube-dl的另一个副作用是当默认的在线界面不能完成任务时在线访问。旧的专有Flash插件并不适用于所有平台和架构,具体取决于您的选择。如今,网络浏览器可以播放视频,但有时可能无法利用高效可用的GPU解码,从而在播放过程中浪费大量电池电量。YouTube-DL可以与本地视频播放器相结合,以使播放某些视频成为可能和/或高效。例如,MPV包括本地YouTube-dl支持。你只需要给它提供一个受支持的视频网站的网址,它就会使用youtube-dl来访问视频流并播放它,而不会在你的硬盘上存储任何东西。

默认的在线界面也可能缺乏可访问性特征,可能会使某些人难以导航内容,或者缺少同样可以从本地视频播放器应用程序获得的色盲滤镜。

最后但并非最不重要的一点是,像youtube-dl这样的工具允许人们只使用免费软件访问在线视频。我知道没有多少自由、自由和开放源码的软件纯粹主义者。我甚至不认为自己是其中之一,绝对不会。专有软件一直存在于我们的现代生活中,每天以大量Javascript代码的形式提供给我们,供我们的Web浏览器运行,具有许多不同的不同目的,并不总是符合用户的最佳利益。GDPR的所有缺陷和问题都证明了这一点。使用youtube-dl访问在线视频可能会给你一种隐姓埋名模式的安心,uBlock Origin或Privacy Badger只能勉强理解。