9
15
2017
44

放弃 you-get,转投 youtube-dl

本文来自依云's Blog,转载请注明。

you-get 是一个视频下载工具。我于五年零一周前(2012年9月7日)在 AUR 打包并维护其 git 版本。当时还是叫 python-you-get-git,后来根据 Arch 官方的推荐,与语言没什么关系的软件不带语言前缀,改名为 you-get-git

youtube-dl 是另一个差不多同时期出现的视频下载工具,一开始主要针对 YouTube 等跨国网站。

选择 you-get 一部分原因是当时它对国内网站的支持更好,另一方面也是支持国产。但是今天,我决定放弃 you-get 了。

五年来,我一直是支持 you-get 的。也尝试过向其贡献代码。目前已经有29个提交被合并,排名第五位。基本上都是一些很小的修改,比如编码问题、未回收的僵尸进程、标题的反转义、ffmpeg 命令的特殊字符转义、支持 python -m 调用、视频链接的解析更新和扩充、进度条的修正和优化,等等。

其实这些年来,我一直想做更多事:

  • 可选地使用 requests 库,以提高解析速度,改善用户体验
  • 支持使用 aria2c 下载视频链接
  • 支持网易云课堂的更高清晰度的未内嵌字幕的视频(pr#1002
  • 解析更准确的信息
  • 一些其它网站的解析器(比如 bilibili 的 bangumi.bilibili.com 子域)

但是,其中很多都没能完成。勉强完成的也很奇怪:明明是针对网易云课堂的解析,我还非得关心网易云音乐。一直以来,我对 you-get 的修改都是事倍功半。我也曾尝试过更深入的修改,但是牵一发而动全身,往往要改就得改很大很大一部分代码,然后完全没有办法保证其正确性。就像今天的事情一样。

我花了数小时的时间,牺牲睡眠,把命令行选项解析由 getopt 改成了 argparse(pr#2260)。促使我做此修改的原因是,我想下载 bilibili 一整个播放列表的视频。我记得 you-get 有下载整个播放列表的功能。但是我读了好几遍 help 信息,都没有找到那个选项。我记错了吗?阅读源码之后,我终于找到了那个选项。同时,我也看到了在 C 和 bash 代码里经常看到的,一长串 if/else 来解析命令行选项。翻了好几屏。

当一个相对独立的代码片断翻屏时,bug 数量会骤增。

曾经在公司里遇到过一个 case,非常直接地证明这句论断是有多么正确。那个函数刚好超过一屏数行,而在第二屏的那部分代码,有个「}」和「return」的顺序写反了。我也是拿 Vim 的匹配括号跳转功能才发现的。

当然了,不管怎样的代码,不动它是不会出新问题的。然而我动了它。回报我的是两个局部变量名忘记改了:pr#2346pr#2355

这种问题在 nvchecker 重构以支持 aiohttp 时并没有发生。为什么呢?我们有测试。如此明显的问题,只要 cover 了必然会发现。所以我可以放心大胆地重构。

you-get 呢?you-get 也有测试。我在提交 pull requests 之后有个习惯:盯着未完成的测试,直到它变绿。如果红了,赶紧看看是不是自己代码的问题,是就赶紧修掉。一些项目(比如 Tornado)的测试本地跑起来要配置环境、装不少东西,太麻烦了,所以我习惯先提了 pr,然后等 Travis-CI 的结果。可这次,测试过了。但是有两个重要的功能却并不能正常工作。

其实呢,对于这种简单的错误,通常 linter 会告诉我的。我有装 neomake,全面支持各种 linter,用起来十分惬意。但 pylint……就像 jslint 一样,我很讨厌它们。因为它们不仅检查潜在的问题,同时还检查代码风格。而代码风格这事是每个项目单独配置的,而不是开发者自己配置好,然后让自己参与的所有开源项目都遵守。不过今天我也终于知道了另一个 Python linter——pyflakes 很对我的味口:只管问题,不管风格。

总之呢,由于各种原因,重写中出了这么两个直接立刻让用户不能用的 bug。很抱歉。一般来说,出错了就改呗。更深入一些,分析一下为什么会出现这种错误,今后怎么避免同样的错误两次出现(早年向 Tornado 提交代码时,Ben Darnell 一个简单的行为教会了我一件事:修了 bug 就写个对应的测试)。但是 you-get 的协作者 rosynirvana 不按惯例来,反而要求放弃此修改。如果就如此也就算了,后续讨论中我意识到了一个真相——为什么我在 you-get 上的工作如此困难?

The best part of you-get is that it's not so pythonic so those who only know js or as3 can take part in, moving from the universal getopt to a py-domain-specific library cannot be a nice idea.

source

What library nowaday pythonists love do not really matter here because those one know js and as3 can contribute even more in this project.

source

因为 you-get 根本就是反 Pythoner 的!作为一个 Python 项目,you-get 想要吸引的是 JavaScript 和 ActionScript 3 开发者!

我很震惊。

  • 作为 Python 开发者,我已被他们刻意排斥在外。
  • 作为 JavaScript 开发者,我还是觉得 C 好难写,还是 pythonic 的代码比较好维护啊。
  • 作为 C 开发者,我倒是对这种长达数屏的作用域见怪不怪了。不过重复的逻辑,咱一般会用宏之类的手段给整成声明式的啊。

所以,我的努力注定不会有多少效果。

然后,我看了一眼 youtube-dl。其实就瞟了一眼,也没看出太多东西来,但是

  • 按 URL 进行正则匹配的,网易云音乐和网易云课堂可以分开处理了!
  • 解析器以 class 表达,有组织有纪律!不用用 Python 的语法写 C 了!

我 disown 了 AUR 和 [archlinuxcn] 里的 you-get-git 包。关闭了未完成的 issue 和 feature pr。等修复 argparse 引入的错误的 pr 被合并(不管是只修正问题还是退回到 getopt),事一了,我就删掉仓库,只保留网易云课堂的高清视频解析代码(花了我一整天的)。已安装的 you-get 暂时保留,但首选 youtube-dl,遇到问题有时间就去修一下。已经投入到 you-get 的时间是沉没成本,不必留恋。

Category: python | Tags: python 编程 软件开发 | Read Count: 51899
文雨 说:
Sep 15, 2017 10:04:17 AM

学到的经验和技术的积累永不会沉没
还不知道youtube-dl还支持国内的,回来看看

jiazhoulvke 说:
Sep 15, 2017 10:45:00 AM

两个都用过,感谢依云的无私贡献~

sass-in 说:
Sep 15, 2017 11:15:00 AM

仙子这类型的geeker是真正为开源社区做贡献的,免费为别人解答了那么多问题,只是为仙子得到的回报有些感觉可惜。这种分享精神也只有在程序员圈子里才能看见,层主这种zf背景家庭的人,程序员还是太单纯了,一些算计放在其他行业也是小打小闹。

<b>建议仙子可以考虑建立一个自己发起的开源项目,而不是总是作为contributor为其他项目提交pr,有时候做出了贡献本来要让其他人也看见,有一个平台发挥自己的最大能力。</b>

仙子太geek了,那些公众号写点初级教程图的是啥?还不是让其他行业的人找自己来合作。程序员之间都喜欢相互轻视,但是外行对技术还完全不了解,仙子的技术放在这个小圈子真的是浪费了。

sass-in 说:
Sep 15, 2017 11:23:39 AM

向yinwang那样每次都语出惊人的人,在网上已经很有影响力,当然他本来也有能力,他现在回国找他合作的人肯定不少(包括其他行业的),只不过快40了还是那么中二肯定不行。

仙子没有yiwang那么会喷,交际方面又感觉很单纯,翻了以前的blog,像仙子这种技术级别的,按理说根本不会存在一些找工作之类的问题。

所以有时候适当推销一下自己,<b>写一点教程类文章</b>,以仙子的技术很多hr会自动来找你(逼乎hr一大堆,只是仙子要写一些初级类文章让这些hr看到),毕竟仙子的github摆在那里。

sass-in 说:
Sep 15, 2017 11:30:10 AM

看博客右边的链接,类似万伟刚,伍佳贤,陈浩这些人当然他们分享了很多优质内容,但是博客给他们带来的影响力带来了很多的合作机会。

Avatar_small
依云 说:
Sep 15, 2017 11:57:32 AM

写初级类的文章太浪费时间了啊。

工作方面我也不知道是怎么回事,每次看中的职位、接受的面试邀请都是满怀希望地去,满心凄凉地回。除了一些意外之外,可能是自己完全不会讨好 HR 吧。

我不是不会像王垠那样乱喷一气。一是时间、精力有限,二是我不想妄议自己并不了解的东西。

Avatar_small
依云 说:
Sep 15, 2017 11:58:56 AM

自己弄一个 you-get 项目太累了,也没有必要。至于其它的项目,也有一些,只是不会推广。好像也没什么推广的,用途都比较小众。

sass-in 说:
Sep 15, 2017 05:44:58 PM

没有必要去做一个类似于you-get之类的项目,可以好好休息一段时间去确定一个方向,不一定要是这种完全的业务性质的,可以试一试框架之类的开发。

仙子你确实不会推广的,比如推广类似知乎rss项目,1000+star其实非常容易的,只是仙子每天都想着写代码没去考虑这些项目的。推这项目主要是要<b>持续曝光</b>,天朝的智商税不去收是没法体会的(给仙子一个参考案例https://www.zhihu.com/people/zhijun-liu),不能推完第一个版本就不推了。

比如假设你推you-get,每次新增加一个功能都要去写篇文章让一批新的用户知道,比如每次新增对一个网站的支持,就,就写一篇“如何利用xx免费获取xx的资源”,免费这些词语一定不能省。

过段时间再来和仙子邮箱聊吧,真的建议好好去休息一下找找灵感,可以去<b>参加一些志愿者活动,多去和别人的生活产生交集</b>,毕竟仙子是90后呀。

之前也没有和程序员打过交道,geek的生活节奏我多去从twitter上面考察考察。当然内向的人也有好处自己活的自在,每天脑子没想那么多东西。

sass-in 说:
Sep 15, 2017 05:56:09 PM

不懂编程的人一大堆,仙子你在sf去把自己平时如何使用wget, curl之类工具随便写成文章去分享一下,去感受一下巨大的需求吧,很多程序员要是有武大(背背书还是可以的)和仙子这样的github,简历上早就吹上天了。

工作方面,给仙子一个建议,有些面试题刷着挺无聊的,但是套路是死的。归根到底还是仙子不会推销自己呀,我这种水平的人知乎都有一大堆hr来找你(层主学生,有时候为了用户调研目的去知乎装逼玩玩)平时看见某某团队直接负责人发的东西,多去点下赞勾搭一下,直接招进去,不走正常的流程。

过段时间忙完这几周我替仙子自己写一份简历吧,你的github真的被你浪费了。

最后还是不要每天都忙着给开源社区做贡献,多去休息一下,参加志愿活动~~~

yan12125 说:
Oct 08, 2017 04:32:53 AM

您好:偶然路過發現這篇,作為youtube-dl曾經的的主要開發者之一 (4th most commits),想來分享一些想法。

我使用繁體中文較為方便,希望不會影響到各位的閱讀 :)

1. 首先,you-get的這些事件我必須付一些責任。當初是我向@soimort推薦將@rosynirvana加入collaborator [1] 。萬萬沒想到此人的行事風格會對這個社群帶來如此負面影響,很抱歉。

[1] https://github.com/soimort/you-get/pull/2015#issuecomment-304350845

2. youtube-dl本身也有一些問題,無論是在管理上或是代碼上。而我想最大的問題,在於缺乏開發者。這個項目待解決的issue與pull reques非常多,Travis CI上更是有約1/5的failed test久未處理 [1],然而主要開發者只有一位dstftw。(我個人閒暇時間日益減少,精力無法顧及如此龐大的項目:/)如果有足過多的人力,我想要做個javascript virtual machine [2] 或是 WideVine decoder [3]都不是問題 :D

[1] https://github.com/rg3/youtube-dl/pull/14341
[2] https://github.com/rg3/youtube-dl/pull/11272
[3] https://github.com/rg3/youtube-dl/issues/1753

3. 從一個維護者的角度,看到新血的加入,內心是雀躍的。由於我本身也是Arch Linux使用者,曾在多處見到lilydjwg這個帳號的蹤跡。而從這篇文章的字裡行間,也可看出博主對Python的了解。相信博主的加入,能夠帶來一注新的活水 ;-)

順帶一題,現在youtube-dl要求pull request必須通過flake8的檢查。雖然這個工具的標準比pylint寬鬆一些,但他也是風格和問題一併檢查的。這部份可能會給您帶來困擾,先在此提醒。

Avatar_small
依云 说:
Oct 08, 2017 03:59:35 PM

我不一定加入开发 youtuble-dl,看我的需求而定了。

flake8 应该不是多大的问题。一个多人项目,有风格规范会容易很多。我也早已习惯了让自己适应周围代码的风格。

yan12125 说:
Oct 08, 2017 11:00:17 PM

倒不一定要是實際撰寫code,只要是在公開場合討論、分享,對社群的發展就是一大助力了:)

Beining 说:
Oct 09, 2017 02:04:33 PM

我是Beining。

由于个人的问题,我对You-Get项目的贡献不足。

关于PR #2015 我没有跟踪所以不发表看法。

You-Get在解析模块的技术债很多,想做的事情更多,未来如何我也不知道。

对于社区分裂问题我会与@rosynirvana 进行私下沟通。

祝好,
Beining

Beining 说:
Oct 09, 2017 02:13:51 PM

不要自责:作为collaborator我应该紧盯项目,然而我没有做到。

所有的开源项目都面临着这种问题:开发者缺失。没有人愿意加入开发,只顾着开issue。发了PR没人测试 takes forever to merge.没PR bug就存在;提了PR,没能力测试。是钱的问题,也不完全是钱的问题。是精力的问题,也不完全是精力的问题。

然而即便如此世界也照常运转:开源项目是一群开发者和用户的意念所集 在无人愿意时自然凋零。作为collaborator,我希望我们能在任何环境下坚信我们的未来是美好的:我们的心血在任何条件下都不会白费。

中文退步太快,不胡说八道了:我去看一遍issue。

jackyzy823 说:
Oct 10, 2017 07:33:08 PM

在这篇日志里看到了许多熟悉的contributors和collaborators。感谢各位为开源世界做贡献。
lilydjwg说的问题的确是存在的,的确也是每个人都想改进的。
以一个after-work project 的角度看的话,缺乏开发文档,代码规范,测试用例,以及没人想来重构都是可以理解的。

我也厌倦了解析swf,混淆过的javascript和网站定期更新的各种参数密钥。yan12125的思路是对的,不是我们来分析网站的请求并转换成用python实现的代码,而是所有的一切都是工具来自动解析完成,而我们来实现这个工具。

yan12125 说:
Oct 11, 2017 12:50:26 AM

> 不要自责:作为collaborator我应该紧盯项目,然而我没有做到。

謝謝!倒也不應將責任都放在collaborators上。我時常認為,在一個龐大的項目中,開發者之間的信任是相當重要的。相信其他開發者會寫出好的code,相信他們可以妥善處理issue、pull requests等等。若沒有這種信任感支撐著,每個commit,每個issue tracer/review下的留言,都要一一去檢視,再多的時間都不夠用。也正因如此,一開始的審核相當重要。

夕凉 说:
Nov 27, 2017 08:57:19 AM

来支持大佬。

yan12125 说:
Nov 27, 2017 02:21:27 PM

最近這兒留言多了起來,我也回來看看現況。you-get的issue tracker最近有兩個issue令我感到五味雜陳

https://github.com/soimort/you-get/issues/2523
"谁分享个人最新版本的exe电脑的程序呗,作者好坑,都2个版本了也没有exe文件出来"

https://github.com/soimort/you-get/issues/2518
"@rosynirvana 哪去了?"

這讓我想到shadowsocks主要貢獻者之一clowwindy曾說過的話
(https://github.com/shadowsocks/shadowsocks-windows/issues/293#issuecomment-132253168)

> 最适合这个民族的其实是一群小白围着大大转,大大通过小白的夸奖获得自我满足,然后小白的吃喝拉撒都包给大大解决的模式

或許這些事情也不能單怪rosynirvana對開發者不友善,而是整個開源社區的文化沒有發展到一個健康的狀態。

Beining 说:
Nov 27, 2017 02:24:11 PM

还是人少。人多了都不是问题。人少了什么问题都是问题。

然而我们能怎么办 现找老婆现生也来不及了是不是。。。

yan12125 说:
Nov 27, 2017 02:48:22 PM

Beining大 把issue tracker disable了!?

Beining 说:
Nov 27, 2017 02:51:53 PM

没啊 我不是owner啊 我没权限的???

yan12125 说:
Nov 27, 2017 03:00:36 PM

我誤會了,我以為collaborator有權限,抱歉

那樣看來是soimort做出了一些決定...

Beining 说:
Nov 27, 2017 03:13:21 PM

静候佳音吧。

我觉得无论是You-Get还是Youtube-DL的开发者社群都应该从其他平台的逆向开发者中获取灵感:在PC上,软件可以用各种方法反调试,然而在浏览器中这些想法要么做不到要么无意义(任何代码肯定要在虚拟机里面跑,反逆向没有意义,而且不可能阻止第三方查看原始堆栈信息;JavaScript的所有代码只能混淆不能真正加密;即使使用WASM,第三方只需要截获API请求即可- 甚至不必须可以重放;程序的入口点不可能隐藏)。

一个新的通用的处理办法应该是可以完成的,或者说,如果允许调用Headless Chrome后,应该可以大幅度减轻开发者的工作压力,让这种项目变得真正工程化,而不是大家自己摸索。

我们应该拉个Slack群什么的。。

Avatar_small
依云 说:
Nov 27, 2017 04:09:34 PM

那不就是浏览器扩展了么。学 cliget,截获相关请求然后显示一些下载项?

yan12125 说:
Nov 27, 2017 05:09:02 PM

使用一個真正的瀏覽器確實是是必走之路。youtube-dl裡面已經有一個extractor (openload.py)在探索phantomjs的可能性。目前youtube-dl的一個目標族群是放在back-end上,瀏覽器擴展的形式可能會給目前的使用者帶來一些困擾。當然cliget抓取連結的思路仍然是值得參考的。

Avatar_small
依云 说:
Dec 24, 2017 11:16:28 PM

推广部分,其实那些项目我并不想推广啊。morerssplz 在知乎稍微推广了一下,主要目的还是推广 RSS。现在每天会花掉不少流量了,然而还是没什么人来 pr……而 elimage,我有意地不去推广,现在每天都会用掉十来G流量。而且当初没考虑过赚钱,所以现在也没办法加广告什么的了。

我没有什么真正想去推广的项目。(啊 Arch 中文社区源算一个,但是我根本不知道有多少用户……)

Avatar_small
依云 说:
Dec 24, 2017 11:18:06 PM

被HR找其实也挺烦的。通常都是我没有意愿去的公司。遇到过两个想去的,但是都没能过面试,唉……

xiaoke 说:
Mar 21, 2018 03:17:00 AM

youtube-dl无法下载腾讯视频啊,他的好处是可以aria2多线程,you-get国内支持多,但是不能多线程很烦

Avatar_small
依云 说:
Mar 21, 2018 09:03:09 AM

我不太用国内的视频站。

Carson 说:
Apr 12, 2018 11:04:38 AM

有考虑支持下腾讯视频吗?或者有思路吗,单个ip的资源速度太慢了,分段下载又不知道如何处理合适

Avatar_small
依云 说:
Apr 12, 2018 01:35:01 PM

没用过、不了解腾讯视频呢。

aa 说:
May 03, 2018 07:20:21 AM

大神辛苦告诉一下 Youget的列表下载在哪啊。。。。
全网就你提了列表下载,还没说怎么下。。。

hhhh 说:
Sep 03, 2018 12:23:35 PM

第一行,七年零一周写错了。。
吓死我了,我还以为已经2019年了

Avatar_small
依云 说:
Sep 03, 2018 01:19:27 PM

哎,我当时是怎么算的……

zbinlin 说:
Dec 10, 2018 03:05:20 PM

依云,我在 baidu 搜索“you-get 关闭 issue”时,发现 aliyun 好像把你的这篇 blog 给扒了,而且 baidu 排名比你的高。重要的是它没有给出来源,这么大的公司还干这种事,可真无耻的。

https://www.aliyun.com/jiaocheng/517179.html

Avatar_small
依云 说:
Dec 10, 2018 09:59:58 PM

看上去是 UGC,已发邮件要求删除。

至于百度,它在国内呢,有墙的……

Ricar 说:
Jun 29, 2019 01:23:34 AM

现在搜you-set的百度排序本文在第四位呢~~!
外行做视频找素材路过了这里,观摩以上contributors collaborators大佬对话,只想说表示深深的感谢,谢谢博主桑的贡献

Copper 说:
Mar 04, 2020 01:53:16 PM

youtube-dl对国内的有些站,比如说bilibili,支持比you-get还要好。我前一阵子下载B站视频的时候就发现,you-get有的时候解析出来这个视频是xxxMB,结果一直下载超过100%到了yyyyMB都停止不了,只能Ctrl+C重新下,而youtube-dl就没有任何问题。

wb14123 说:
Jul 12, 2020 03:01:25 AM

我也是经常遇到这个问题。但是 you-get 可以下载弹幕。要是 youtube-dl 也能下载弹幕就好了。

td2015 说:
Feb 27, 2021 04:54:03 PM

一直想找有关视频下载的方法论来针对性学习,可惜在这方面外国人和中国人一样“实用主义”
视频下载攻防的生态相当奇怪,小网站可以轻易地绕过所有的主流通用型下载方式,而大公司由于有youtube-dl这种变形金刚的存在反而无处遁形,甚至直接用最简单的认证、有序数字结尾的文件名,挥舞着白旗……
我预感大公司围猎youtube-dl的一天终究会来到,我只希望那一天来得越晚越好

Avatar_small
依云 说:
Feb 27, 2021 06:26:23 PM

因为除了直接放视频文件地址的,就没有通用的下载方式啊(

yan12125 说:
Feb 27, 2021 07:37:58 PM

> 我预感大公司围猎youtube-dl的一天终究会来到

2020年,成員包含美國諸多業者的RIAA協會,致函GitHub,使得約一個月的時間內,youtube-dl無法從GitHub存取。此事件某種程度上或許可類比各大公司圍獵youtube-dl。令人感激的是,EFF律師等人提供非常寶貴的協助,讓youtube-dl能夠回到GitHub。作為曾經的youtube-dl主要貢獻者之一,我有幸能夠參與大多數與EFF律師的討論。我想我比許多人有更深刻的感觸:科技巨頭作惡無法避免,但只要有決心與充分的謹慎,就能撼動不當的決策。

td2015 说:
Feb 28, 2021 09:03:04 PM

没想到在我正常使用过程中竟然发生过这样的事情(可能是我用的频率不高)……感谢你们的贡献,希望战果得以巩固


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com