9
15
2017
16

放弃 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: 2444
文雨 说:
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下的留言,都要一一去檢視,再多的時間都不夠用。也正因如此,一開始的審核相當重要。


登录 *


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

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com