“如果要在教育和生产中拥抱AI,使用AI编程应该是个入门的标杆。”

2017年左右我开始眼下的项目,基于Classin做国际数学课程。为了方便教研,我录制了所有的互动课程。不知不觉间,这些视频记录的体积就增加到了数千G的规模。单是2024年我就花了1万多块来存储它们。到2026年,这个费用就已经让我无法容忍了。
Classin(EEO)①允许用户下载并删除云端视频,也提供了官方的Chrome插件。可惜,官方的插件只提供针对单条记录的快捷下载。这意味着,针对过往十年的数千条课程记录,我需要重复数千次的“点开、下载、关闭、再点开”的操作。视频文件通常有500M以上大小,下载时间长,连续操作之后,浏览器会积累多个下载任务、每个任务的速度也会大幅降低。为了稳妥,我通常需要暂停操作、等着下载任务清空,然后开始下一波。

机械操作、等候计算机相应,检查进度;重复操作、重复等候……无聊、耗时还在其次,长时间的枯燥操作很容易引发疏漏。如果把记录和校验的环节加入其中,整个过程还会变得更加磨人。

去年我请兼职的小女生帮忙下载了大概1TB的内容。她前前后花了接近一个多月,花了我数千元的工资。
今年,我打算自己来解决这个问题;用它来作为学习AI编程的小的敲门砖。
第一版需求
总结前面的痛点,我把第一版需求设定为:以eeo提供的官方Chrome插件为基础,批量、自动下载存储视频。
开发工具
Google Gemini。
原本听说ChatGPT的Codex也挺好。可惜他们家充值会员超级费劲。

开发过程

参考网络当中的经验,我首先让Gemini浏览了Classin的Chrome插件的源代码,让它评估是否可以实现我的需求。令人惊喜的是:Gemini明确反馈,期望的功能容易实现。实际上,最终Gemini提交的所有新代码全都是官方版本的基础之上、通过增加代码来实现的。
接着,我直接让Gemini生成用于开发的项目文档。这不是为了给我看,主要是为了保证Gemini开发的时候,有个固定的需求的锚点。
这个插件项目的流程实在简单。Gemini的第一版代码就基本能用。有时候系统报错,我截图故障界面丢给Gemini,它也能很快给出诊断和订正。大概三四个版本之后,新的插件实际就足够使用了。
反倒是,在使用过程中我不断提出了额外的需求。于是,更多的修正版本就诞生了。
更多修正版
迭代修正版的所花的精力比第一版(实现主要功能)花的时间更多。

改进1 :文件命名

首先是文件命名方式的调整。
Classin的下载插件在过去几年里有改版。相比之前,最新版本修改了文件和存储路径的命名方式,删除了二者里的统一的数字编号。我这次改写就是以最新版本为基础的。
但是我前两年已经零星存储过一些,它们使用了原来版本的路径与命名方式。最新下载的内容就没法与原来的存档直接整合。权衡再三,我选择把所有新下载的视频全部按照原来冗长、不美观但是信息丰富方便查找的方式命名。
改进2 :负载控制

下载负荷的问题已经在前面提到过。自动化下载之后,插件大概每秒钟能启动一个新的下载任务。实际下载的过程却远比这个慢。Chrome里的下载进程会很快累积。如果不加以控制,最终浏览器可能会同时下载数十、上百个文件。一旦系统负荷过高(其实我也不清楚多“高”的负载会引发不稳定),或者出现意外中断,大量的下载需要返工,费时费力。
测试我还发现,限制下载总速度的瓶颈通常是网络的下载带宽,五到七个同时启动就能充分利用带宽资源。以它为基础,如果同时发起更多下载任务,系统会保持总速度不变,相应降低每个进程的下载速度。额外的下载进程就毫无意义。
更新后的下载逻辑是:插件监视浏览器的下载进程数量,当下载进程达到9个;后续的下载任务就暂缓启动。这个粗暴的设定未必是最佳,在我这里倒是挺好用。
改进3 :记录生成

大概是因为年纪大了,完成某个时间范围内的下载、需要启动新任务的时候,我经常忘记了云端数据库里新录入的查询条件到底是下载过的、还是没下载的。通过比对下载文件、确认进度是费时费力。更重要的担忧是,原有批量下载操作在一定程度上违背了数据安全原则——操作重要的数据信息需要留下记录。
更新后的插件新增了记录功能:每次下载结束之后,插件都会自动在下载目录下生成一个小的日志文件,在文件名和内容里都指明下载内容的时间范围。
最终成果
在备课之余,一边摸索着改插件、一边用插件,在4天时间里我改出了6、7个版本,下载了大概600G文件。借助最新版本的插件,我只需要准备一台备用电脑在旁边,每隔1小时操作几秒钟,就能完成记录下载;这项工作就再也不用占用备课时间了。
赶上家里网络给力,有时候一小时就能下载80G以上。对于我这样的小工作室,清理一学期的数据可能在一个上午顺手就被完成了。
分享下载
这里我把最新版的Chrome插件发布在Flowin。有兴趣的同行可以点击下方链接、扫描二维码或者点击阅读原文自行下载使用。

https://flowin.cn/open/4592e08d8fec49dd8ef6fbd625cb952e/d601408c3c3149c89a6b6f21295d7fc9
插件的基础的版权一定是归于EEO,我的贡献就可以忽略不计。
虽然新插件没有什么危险操作,提醒大家在首次使用的时候不妨谨慎些。如果有任何问题,欢迎随时讨论。
一点心得
因为全程使用Gemini编程,偶尔检查代码的工作量极小,所以从编程能力的角度来说,这个项目前后,我几乎没有什么进步。触动是在其他方面。
对我这样的外行来说,编程开发首先是一种思维方式的训练。正如前文所述,开发之前我把核心需求发给了Gemini,请它写出需求文档;我简短的两句话在它这里膨胀到了数页纸。Gemini详细列举了插件运行的各种参数要求、界定了业务流程。其中绝大部分都是我最初意识不到,同时不可或缺的。在生活和工作当中,我们会逐渐要求自己建立各种思维习惯,“用户思维”、“学科思维”、“学生思维”等等,这些思维框架通常能帮助我们更好地筛选重点。以至于,我很容易忘记另一项基本能力:把事情考虑得周全、表述的严谨。
这一轮的尝试还是由偶然的兴趣所驱动,前前后后编程相关的时间消耗其实只有数个小时——熬一个通宵、加上推迟几个教研任务就能拿到个雏形。后面任意潜在功能开发(包括学习、试错的环节)所需要的投入不会是在这个数量级。保持工作的单位时间产出、保持生活的松弛,才有更多探索的可能性。
补充说明:
① Classin为C端产品,被大众熟知。它由eeo公司开发,同时在eeo的系统进行管理。
夜雨聆风