下載神器被 Github 下架后,作者寫(xiě)下了這篇回應(yīng)
【前哨君注】:先簡(jiǎn)單回顧一下 youtube-dl 下架事件的前后經(jīng)過(guò)。
10 月 23 日,外媒報(bào)道
youtube-dl在 RIAA 投訴之后被 GitHub 下架。此時(shí)其 Star 有 7.55 萬(wàn)。
GitHub 下架行為引發(fā)開(kāi)發(fā)者社區(qū)強(qiáng)烈反彈,很多程序員開(kāi)始在 GitHub 上瘋狂發(fā)布傳播 youtube-dl 項(xiàng)目。在 GitHub 的十月熱榜中,就有一個(gè)是?youtube-dl 的復(fù)刻版。
11?月 7 日,youtube-dl?的開(kāi)發(fā)者 Ricardo García 寫(xiě)文回應(yīng),下面是出自我們團(tuán)隊(duì)司健帥的譯文。
11 月 17 日,GitHub 正式恢復(fù)
youtube-dl倉(cāng)庫(kù)。
12 月 4 日,截止我們發(fā)文為止,youtube-dl?的 Star 數(shù)已高達(dá) 8.37 萬(wàn),在 GitHub 大約排在第 29 位。
可能大家已經(jīng)知道了,在我寫(xiě)下這篇文章之時(shí),GitHub 已經(jīng)根據(jù)美國(guó)唱片業(yè)協(xié)會(huì)(RIAA)提出的數(shù)字千年版權(quán)法(DMCA)下架了youtube-dl倉(cāng)庫(kù)。對(duì)于這個(gè)項(xiàng)目的現(xiàn)有維護(hù)者和未來(lái)走向,我不宜發(fā)表什么評(píng)論。但我想和你們分享一下我最初幾年開(kāi)發(fā)和維護(hù)youtube-dl的故事,算是對(duì)下架要求的一個(gè)回應(yīng)吧。

偷銅線的賊
每一個(gè)好故事都得有個(gè)反派。在youtube-dl的故事里,我就把那些偷銅線的賊作為反派吧。
2006年,我住在距離西班牙北部城市阿維萊斯(Avilés)5到10公里的一個(gè)小鎮(zhèn)子上。那時(shí),阿維萊斯已經(jīng)有不錯(cuò)的基礎(chǔ)設(shè)施建設(shè),住在那里的人可以用 ADSL 來(lái)上網(wǎng)。我家離電話交換中心非常遠(yuǎn),所以沒(méi)有這樣便利的上網(wǎng)條件。鎮(zhèn)子上用來(lái)上網(wǎng)的銅線經(jīng)常會(huì)被小偷偷走,網(wǎng)絡(luò)服務(wù)時(shí)常會(huì)中斷。電話公司知道自己的銅線早晚會(huì)被偷走,于是就把銅線換成了細(xì)細(xì)的質(zhì)量很差的材料,這種情況持續(xù)了好幾年。
我在家唯一的聯(lián)網(wǎng)方式是用一個(gè) 56k 的貓撥號(hào)上網(wǎng)。撥號(hào)上網(wǎng)的信號(hào)太差了,我不得不把這個(gè)貓的速度限制到 33.6 kbps,這樣網(wǎng)絡(luò)連接才能穩(wěn)定一點(diǎn),實(shí)際上我的下載速度很難超過(guò)每秒 4KB。
那年 YouTube 已經(jīng)越來(lái)越受歡迎,年底被 Google 收購(gòu)了。
整晚地下載
基于上面所說(shuō)網(wǎng)絡(luò)狀況,你應(yīng)該能想象看 YouTube 視頻是多么痛苦了。緩沖那些稍微大點(diǎn)的視頻要花掉很長(zhǎng)的時(shí)間,比如一個(gè) 10MB 大小的短片需要40分鐘才能完成——根本無(wú)法實(shí)時(shí)觀看。如果視頻再長(zhǎng)一點(diǎn)或清晰度再高一點(diǎn),那么緩沖常就得以小時(shí)計(jì)算了,緩沖時(shí)我還不能在網(wǎng)上干其他事。更別提還存在網(wǎng)絡(luò)中斷的可能,一旦中斷就得從頭再來(lái)。如果你喜歡某些視頻想多看幾遍,那你就要像個(gè)受虐狂一樣不斷的去重復(fù)這個(gè)過(guò)程。
這個(gè)情況讓我不得不研究下載視頻的方法,這樣只要把有趣的視頻下載到本地就可以隨時(shí)觀看。如果下載視頻的工具又足夠好,哪怕像現(xiàn)在一樣下載經(jīng)常中斷也能隨時(shí)恢復(fù)下載。
那時(shí)網(wǎng)上已經(jīng)有一些下載 YouTube 視頻的工具,其中包括一個(gè)非常流行的油猴腳本,但這些工具里沒(méi)有一個(gè)能滿足我的要求。出于偶然的想法,我嘗試自己去寫(xiě)一個(gè)這樣的工具,而這基本上這就是youtube-dl出現(xiàn)的原因了。為了方便自己使用,我把這個(gè)工具做成了命令行的方式。而我選擇 Python 語(yǔ)言的原因是它有廣泛的標(biāo)準(zhǔn)庫(kù)支持,功能實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,還有一個(gè)附帶的好處是它不依賴任何特定的平臺(tái)。
從 Ethereal 開(kāi)始
程序的最初版本只能下載 YouTube 視頻,而它的架構(gòu)基本沒(méi)有什么專門的設(shè)計(jì),因?yàn)樗煌瓿闪俗鳛橐粋€(gè)簡(jiǎn)單腳本該完成的事——下載視頻,根本不需要什么架構(gòu)設(shè)計(jì)。程序原始代碼只有223行,其中只有143行是真正的代碼,還有44行的備注和36行的空白。選擇youtube-dl這個(gè)名字的純碎是為了方便,它非常直接又容易記住。我只要憑直覺(jué)在終端里面輸入 Y——O——U 加 Tab 就打開(kāi)它。
那時(shí)我已經(jīng)用 Linux 好幾年了。為了讓需要的人用到這個(gè)軟件,我決定以自由軟件許可證的方式發(fā)布這個(gè)軟件(前幾個(gè)版本使用的是 MIT)。那時(shí)候還沒(méi)有 GitHub,我只能「勉為其難」地使用 SourceForge 托管項(xiàng)目,為了創(chuàng)建這個(gè)項(xiàng)目,又必須在 SF 上填寫(xiě)一些無(wú)聊的表單。最終我放棄了在 SF 上進(jìn)行發(fā)布,而是在網(wǎng)絡(luò)供應(yīng)商贈(zèng)送的空間上發(fā)布了這個(gè)軟件。如今已經(jīng)很少有網(wǎng)絡(luò)供應(yīng)商提供存儲(chǔ)空間了,但那時(shí)供應(yīng)商給用戶提供郵箱和 FTP 空間是很常見(jiàn)的,用戶都有自己的網(wǎng)絡(luò)空間。軟件發(fā)布第一版的時(shí)間是2006年8月8日,不過(guò)在發(fā)布之前我已經(jīng)使用幾周了。
為了寫(xiě)這個(gè)程序,我去研究在用戶看視頻時(shí) Firefox 瀏覽器都做了些什么。沒(méi)記錯(cuò)的話那時(shí) Firefox 還沒(méi)有用來(lái)分析用戶網(wǎng)絡(luò)活動(dòng)的開(kāi)發(fā)者工具。網(wǎng)絡(luò)連接使用的是 HTTP 協(xié)議,加載 YouTube 視頻時(shí)我用 Wireshark (那時(shí)候它的名字是 Ethereal)進(jìn)行網(wǎng)絡(luò)抓包,事實(shí)證明這個(gè)軟件非常有價(jià)值。我寫(xiě)youtube-dl就是想和瀏覽器做一樣的工作——獲取同樣的視頻文件。youtube-dl會(huì)一字不差地把 Linux 上 Firefox 瀏覽器的 User-Agent 發(fā)給 YouTube,目的是讓 YouTube 返回跟用瀏覽器時(shí)一樣的網(wǎng)頁(yè),用這個(gè)網(wǎng)頁(yè)再研究瀏覽器怎么處理。
還要說(shuō)明的是,YouTube 使用的是 Adobe Flash 播放器,視頻是 Flash 的 FLV 格式,要讓瀏覽器支持這個(gè)格式就需要專有插件(可能還有人記得libflashplayer.so),而這種視頻格式也讓很多瀏覽器開(kāi)發(fā)工具失效了。Flash 播放器長(zhǎng)時(shí)間以來(lái)都有安全方面的問(wèn)題。我用? Flashblock 瀏覽器擴(kuò)展來(lái)阻止網(wǎng)頁(yè)里的插件自動(dòng)加載,原有的 Flash 內(nèi)容會(huì)被替換成一個(gè)可點(diǎn)擊的按鈕,只有主動(dòng)點(diǎn)擊按鈕播放插件才會(huì)加載。
除了讓瀏覽器更安全外,F(xiàn)lashblock 還有兩個(gè)很不錯(cuò)的用途:一方面,它能移除網(wǎng)頁(yè)上吵鬧繁雜的廣告,某些第三方廣告還有安全問(wèn)題;另外一方面,它能幫我我分析播放器是如何加載視頻的,等視頻頁(yè)面加載完成后打開(kāi) Wireshark,然后再點(diǎn)擊加載視頻,這樣就能抓到插件下載視頻播放器和內(nèi)容時(shí)的流量數(shù)據(jù)了。
補(bǔ)充一點(diǎn),使用 Flash 播放器觀看視頻時(shí)其實(shí)已經(jīng)把文件下載到本地了(Linux 系統(tǒng)會(huì)存放到 /tmp 目錄),很多人不用工具就能來(lái)保存視頻。但是youtube-dl要方便一些,比如它能自動(dòng)的抓取視頻標(biāo)題來(lái)給視頻文件命名。
哈哈,“小鮮肉”(Freshmeat)來(lái)了
Flash 插件最終還是改版了,用戶不再那么容易就能下載視頻。它使用的第一個(gè)手段是在視頻下載成功后就解除關(guān)聯(lián),插件在頁(yè)面關(guān)閉之前通過(guò)文件的索引關(guān)聯(lián)、播放視頻,但視頻在系統(tǒng)文件里面是不可見(jiàn)的。雖然通過(guò) /proc 系統(tǒng)查看瀏覽器的文件描述也能找到視頻文件,但這樣的限制越來(lái)越多,youtube-dl 開(kāi)始顯得越來(lái)越方便了。
那時(shí)有許許多多的免費(fèi)軟件和開(kāi)源軟件愛(ài)好者,我用一款叫作? Freshmeat 的服務(wù)訂閱自己感興趣的軟件動(dòng)態(tài)。我在發(fā)布youtube-dl時(shí)也在這個(gè)網(wǎng)站上創(chuàng)建了一個(gè)項(xiàng)目,這樣用戶就能獲得軟件的更新通知,也能查看軟件的新特性、升級(jí)內(nèi)容和功能日志等。Freshmeat 首頁(yè)會(huì)展示最近更新的軟件,在上面能發(fā)現(xiàn)一些有趣的新項(xiàng)目,這些軟件通常一天有幾十個(gè)。我猜linux.com的編輯 Joe Barr 就是通過(guò)這個(gè)網(wǎng)站發(fā)現(xiàn)了我的項(xiàng)目,并且在 2006 年為我的項(xiàng)目寫(xiě)一篇介紹文章。
linux.com那時(shí)候和現(xiàn)在有點(diǎn)不一樣,它跟Slashdot和Linux Weekly News這些經(jīng)典網(wǎng)站一樣都是 Linux 愛(ài)好者最常訪問(wèn)的網(wǎng)站,反正我會(huì)經(jīng)常瀏覽。
從那時(shí)候開(kāi)始,youtube-dl開(kāi)始變得越來(lái)越流行,我經(jīng)常收到一些郵件感謝我創(chuàng)造并維護(hù)這個(gè)軟件。
代碼托管
時(shí)間很快來(lái)到了2008年。youtube-dl慢慢變得越來(lái)越受歡迎,經(jīng)常有用戶建議我寫(xiě)類似的程序支持更多網(wǎng)站的視頻下載,我也答應(yīng)了這些要求。那時(shí)我決定開(kāi)始重寫(xiě)這個(gè)程序,為的就是讓程序原生支持更多視頻網(wǎng)站。我的想法很簡(jiǎn)單——把程序內(nèi)部分成幾個(gè)功能模塊,簡(jiǎn)化內(nèi)部最重要的模塊:一個(gè)模塊是文件下載器;一個(gè)模塊是信息提取,這個(gè)提取器是針對(duì)特定視頻網(wǎng)站代碼的對(duì)象(或類)。給程序特定或者似 URL 的地址后,提取器會(huì)查詢并確定哪個(gè)模塊能處理這種類型的 URL,然后根據(jù)視頻或者視頻列表來(lái)獲取視頻信息。這樣就能通過(guò)視頻地址或者播放列表下載特定的視頻,也會(huì)保存視頻的標(biāo)題等信息。
我也趁機(jī)切換了版本控制系統(tǒng),更改了程序托管的地方。在那時(shí)的版本控制軟件的戰(zhàn)爭(zhēng)中,Git 最終贏得了勝利,但 Mercurial(Python 語(yǔ)言實(shí)現(xiàn)的一款分布式版本控制軟件)也有很多用戶,在測(cè)試了這兩款產(chǎn)品后,我覺(jué)得比起 Git 我還是更喜歡用 Mercurial。于是我在youtube-dl項(xiàng)目上使用了 Mercurial,很自然地把它遷移到了 BitBucket:那時(shí) BitBucket 只能托管 Mercurial 倉(cāng)庫(kù),而 GitHub 只能托管 Git 倉(cāng)庫(kù)。這兩個(gè)版本控制軟件都是 2008 年發(fā)布的,和當(dāng)時(shí)的 SourceForge 相比都是業(yè)界清流。它們?yōu)槊總€(gè)用戶劃分了項(xiàng)目命名空間(比如只要求項(xiàng)目名稱在你的賬戶里唯一,不要求在整個(gè)網(wǎng)站中唯一),結(jié)合分布式版本控制系統(tǒng),用戶能快速發(fā)布軟件到任何一個(gè)平臺(tái)。盡管如此方便,我還是在幾年后才把項(xiàng)目歷史遷移到 Git 并使用 GitHub 托管。
毫無(wú)疑問(wèn),我應(yīng)該抓住重寫(xiě)代碼的機(jī)會(huì)給軟件重新起名。但我不想因?yàn)楦拿尷嫌脩裘曰螅疫@個(gè)名字已經(jīng)聚集起了小小的名氣。
那年家里的上網(wǎng)環(huán)境也變了:手機(jī)上網(wǎng)套餐有了發(fā)展,年末我用上了 3G 數(shù)據(jù)套餐和 3G 撥號(hào)貓,這是我第一次用上還算不錯(cuò)的網(wǎng)絡(luò)。即使這樣我也一直在使用youtube-dl。那時(shí)我每個(gè)月的網(wǎng)費(fèi)是45 美元,流量是5GB。雖然網(wǎng)速不錯(cuò)但算一下平均每天只有 150MB 流量,上網(wǎng)的時(shí)候就要有所取舍,避免下載太大的內(nèi)容。youtube-dl就能預(yù)防我下載那些大視頻。
新的歸宿
我在 2009 年底搬到了阿萊維斯并和女朋友(現(xiàn)在是我的妻子,也是兩個(gè)孩子的媽媽)住在了一起。我人生第一次用上了人家都用了好幾年的寬帶服務(wù)。我記得當(dāng)時(shí)大寬帶是 100MB 下載和 10MB 上傳。這很大程度地減少了我用youtube-dl的頻率和對(duì)這個(gè)項(xiàng)目的關(guān)注度。
那時(shí)版本控制軟件已經(jīng)在市場(chǎng)上分出了勝負(fù),不久之后我就把項(xiàng)目遷移到了 Git 并且托管在 GitHub。YouTube 也開(kāi)始在網(wǎng)頁(yè)測(cè)試 HTML5 視頻,不過(guò)直到 2015 年 HTML5 才成為默認(rèn)的播放選項(xiàng)。到 2011 年,我已經(jīng)做了好幾年的軟件工程師,我不再急于回家寫(xiě)代碼去優(yōu)化youtube-dl,或者給它添加我自己不用的新特性。
2011 年下半年,我正在處理另外一個(gè)重要的個(gè)人軟件項(xiàng)目。在意識(shí)到已經(jīng)幾個(gè)月沒(méi)有維護(hù)youtube-dl后,我決定放棄項(xiàng)目維護(hù)者的身份。Philipp Hagemeister 是一個(gè)非常棒的開(kāi)發(fā)者,他在 GitHub 上提交了一些待合并的修改,這些修改都是用戶感興趣的特性。我給了他youtube-dl倉(cāng)庫(kù)的提交、合并權(quán)限,到此為止基本就是我開(kāi)發(fā)youtube-dl的所有故事了。
根據(jù) Git 的記錄,我最后為項(xiàng)目貢獻(xiàn)代碼是 2011年3月,再然后就是2011年8月份合并了 Philipp 的提交。在這之后為只有一次的文書(shū)方面的修改提交:在代碼里把項(xiàng)目地址從 rg3.github.com 換成了 rg3.github.io。更改的原因是 GitHub 把用戶頁(yè)面從 用戶名.github.com 遷移到了 用戶名.github.io。沒(méi)記錯(cuò)的話,GitHub 是為了避免官方域名 github.com 下有惡意用戶而發(fā)生安全問(wèn)題。?
盡管之后我?guī)缀鯖](méi)有參與youtube-dl項(xiàng)目的開(kāi)發(fā),但是項(xiàng)目頁(yè)面地址一直在我的賬戶里:https://github.com/rg3/youtube-dl 和? https://rg3.github.io/youtube-dl/?。只有當(dāng) Philipp 和其他維護(hù)者要給更多開(kāi)發(fā)者開(kāi)通提交權(quán)限時(shí)候我才出現(xiàn),這些開(kāi)發(fā)者包括了那時(shí)的 Filippo Valsorda 和現(xiàn)在的維護(hù)者 Sergey。比較遺憾的是,項(xiàng)目 issue 在 2019 年出現(xiàn)了一些釣魚(yú)問(wèn)題,可是只有項(xiàng)目所有者才允許屏蔽那些用戶。這件事讓我們決定把項(xiàng)目變?yōu)?GitHub 的組織模式,每個(gè)有提交權(quán)限的開(kāi)發(fā)者都會(huì)被邀請(qǐng)加入這個(gè)組織(盡管不是每個(gè)人都會(huì)加入)。變成組織模式后,所有項(xiàng)目維護(hù)者都能自由的管理項(xiàng)目,我不用再時(shí)不時(shí)介入了。
對(duì)多年來(lái)維護(hù)項(xiàng)目的開(kāi)發(fā)者,我要重申我最真摯的謝意:感謝你們地提高了代碼的質(zhì)量,感謝你們建立了團(tuán)結(jié)貢獻(xiàn)者的真正社區(qū),感謝你們讓這個(gè)我在十多年前寫(xiě)的程序變得如此流行,感謝你們滿足了成千上萬(wàn)人的需要。
離線并且免費(fèi)
我要再說(shuō)一次,在youtube-dl發(fā)展的 14 年里,它作為工具的目標(biāo)始終如一。美國(guó)唱片業(yè)協(xié)會(huì)提出數(shù)字千年版權(quán)法之前和之后,都有很多人都解釋了自己是為了什么使用這個(gè)工具。
對(duì)我來(lái)說(shuō),這個(gè)工具是用來(lái)離線訪問(wèn)那些已經(jīng)公開(kāi)發(fā)布在網(wǎng)上的視頻。在一個(gè)隨時(shí)都有移動(dòng)網(wǎng)絡(luò)和互聯(lián)網(wǎng)的世界,你可能會(huì)質(zhì)疑是否真的有這個(gè)需求。如果 Netflix、亞馬遜、迪斯尼和 HBO 在他們流行的應(yīng)用里加入相似的離線功能,我想一定會(huì)有人需要的。對(duì)于長(zhǎng)途旅行的人、去國(guó)外旅游的人(特別是跟孩子一起)、或者在乘坐地鐵或飛機(jī)的人、網(wǎng)絡(luò)連接不好或者按流量計(jì)費(fèi)的那些人,如果能離線閱讀評(píng)測(cè)、報(bào)告和新聞,離線收聽(tīng)播客、收看演講等,都是非常方便的。
youtube-dl還有個(gè)作用就是當(dāng)不具備在線環(huán)境時(shí)觀看在線內(nèi)容。要知道不是所有的平臺(tái)和架構(gòu)都能運(yùn)行老舊的 Flash 插件——完全取決于用戶的選擇。如今,盡管瀏覽器能播放視頻,但通常會(huì)非常的耗電。而youtube-dl能用高效的本地播放器播放視頻。mpv 播放器就原生支持youtube-dl,只要在播放器里面輸入視頻網(wǎng)址就能通過(guò)youtube-dl播放流媒體,根本不用下載到本地。
另外,默認(rèn)的在線頁(yè)面可能缺少一些輔助功能:對(duì)一些人來(lái)說(shuō)很難做內(nèi)容的導(dǎo)航,有些缺少幫助色弱人士的顏色過(guò)濾器,但一些本地播放器卻有這樣的功能。
最后,但是同樣重要的是,像youtube-dl這樣的工具能讓用戶用免費(fèi)軟件下載在線視頻。我知道純粹的自由或開(kāi)源軟件愛(ài)好者是不多的,一直以來(lái)我也不認(rèn)為自己是這樣的人。專利軟件在當(dāng)代生活中一直存在并且扮演著重要角色,在我們?yōu)g覽網(wǎng)頁(yè)時(shí)運(yùn)行的 Javascript 中就有它們大量的身影,盡管專利軟件有各自的商業(yè)目標(biāo),但是這些目標(biāo)并不總是和用戶利益一致。通用數(shù)據(jù)保護(hù)條例(GDPR)存在的缺陷和問(wèn)題就是佐證。使用youtube-dl查看視頻能讓你保持真正的隱私模式,但像 uBlock Origin 和 Privacy Badger 這些插件只能勉強(qiáng)做到了。
youtube-dl?項(xiàng)目鏈接:
https://github.com/ytdl-org/youtube-dl
-?EOF -?
更多優(yōu)秀開(kāi)源項(xiàng)目(點(diǎn)擊下方圖片可跳轉(zhuǎn))
如果覺(jué)得本文介紹的開(kāi)源項(xiàng)目不錯(cuò),歡迎轉(zhuǎn)發(fā)推薦給更多人。
分享、點(diǎn)贊和在看
支持我們分享更多優(yōu)秀開(kāi)源項(xiàng)目,謝謝!

