昨天晚上困得批爆,睡了一顿醒来后突然想做做一直想做的guilded tube,四五个小时后撸出来了🤔结果又是改进它,又是顺便(迫真)改进了下guilded drive脚本,又是做了个github actions版的guilded tube,嗯是搞到七八点才搞完(悲🤔考虑到cuties impact的版本活动明天四点就结束了,而我居然还有四个号没打活动剧情,这实在是太离谱了(🤔
poc
首先按照惯例(迫真)我先撸了一个小型的概念验证,生成了一个m3u8,用浏览器版guilded上传页面上传了四个分片,并将返回的txt链接(guilded当然不支持上传ts文件)粘贴了进去,最后将魔改后的m3u8上传到discord上🤔
双击后它居然开始播放了🤔看来m3u8里的视频分片填txt真的一点问题也没有,可以说是解决了我的(自guilded drive技术诞生以来就有的)最后一个忧虑(确信🤔既然如此,我就可以放心去魔改discord tube脚本了🤔
thonkeqing
一顿迫真分析后,我删掉了原来脚本里一大堆和上传相关的代码,因为guilded多线程上传和discord完全不一样(确信🤔
现在我多线程上传ts文件的方法和基于tar数据流的guilded文件夹上传脚本基本上一毛一样,除了我塞进split --filter
的东西不是tar数据流而是文件列表,所以分割依据也不是字节数而是行数(确信🤔
子脚本里面自然是先暂存stdin获取的文件列表,然后一行一个线程开始上传🤔m3u8文件名被当作参数传进了这个子脚本,所以接下来就可以上传完获取链接就地替换m3u8里的对应行了(确信🤔考虑到现在guilded上传txt时文件名这个参数有用了,我完全可以将原文件名、checksum、文件大小等信息全部塞进文件名里🤔话说上传音乐和上传txt走的是同一个api,这guilded的第一世界程序员脑子是不是被新冠美帝变种雷普了114514遍啊(半恼🤔
luminethonk
接下来我在本地做了一顿迫真测试,效果还不错,它既可以将生成的m3u8上传到guilded也可以上传到discord,因为guilded肯定不支持上传m3u8但discord支持🤔此时,discord webhook可以一条消息带两个文件,消息内容是m3u8的guilded链接(以txt的形式),附件当然是上传到discord的m3u8🤔实测mpv是可以输进那个txt文件为后缀的m3u8链接播放的,但浏览器肯定不行🤔浏览器肯定得用discord链接🤔
接下来在某大盘鸡上测试,结果出现了问题,我一次性设置的线程太多了,guilded开始封那台vps的ip(全恼🤔我寻思一时半会它也没什么解封的可能性,干脆用我之前设置的cloudflare cname域名上传得了,有种恁去封cloudflare的1145141919810个ip啊(吴慈悲🤔除了cloudflare白嫖版限制一次请求最大体积100MB,那么我的分片大小就只能设置成90MB左右了🤔
用新参数96MB/16线程设置好guilded drive后,它不仅走了ipv6还直接跑出了3Gbps的速度,我去,这机子居然能上3Gbps🤔其实我在某vps评测里看到它现在已经支持突发10Gbps了,3Gbps估计有点受限于其磁盘io的意思🤔很不幸的是一次多线程批处理只有一半线程能出结果,还有一半返回不了链接(恼🤔
看来,我得同时给guilded drive和guilded tube都加一些错误处理和重试脚本了🤔考虑到这玩意每个上传线程里面都是各种管道,我的while循环只能加到管道开始的地方,也就是那个叫做upload_subprocess函数里面的某条语句那里,不然管道后端的函数重新跑起来时再也无法从stdin里读到东西(悲🤔同理guilded drive v4也被我否定了,它尽管没有任何中间临时文件,但它连分片同时算checksum和上传的功能都没法实现,更别说无限重试了(恼🤔
又一顿迫真折腾后,现在它不仅可以对上传失败的分片进行重试,还有带颜色的输出,就像我的discord drive脚本那样(确信🤔而且我还能测出来,无论是guilded drive还是guilded tube,比较合适的线程数是8,而不是16🤔我也借此机会给guilded drive文件的上传部分加上了以checksum作为文件名的功能,顺便添加了其他一些改进,还将github actions用的版本也更新了一遍🤔这两个脚本现在都非常完善了(确信🤔
另外既然它都开始走cloudflare了,我的另外一个之前跑guilded drive龟速的大盘鸡是不是也可以光速跑了?🤔随便测试了下,现在它能跑出1Gbps甚至⑨00Mbps的速度,不错🤔尽管不能将分片大小设置成256MB还是有点不爽🤔
thonkhida
现在几乎只剩下一个问题了:一个叫做guilded tube的东西居然还要依赖discord,这听起来何尝不是一种ntr(大嘘🤔所以我还可以写一个cloudflare workers,来将guilded链接便乘真·m3u8🤔实现起来很简单,它只要检测到链接后面的扩展名是m3u8,就会获取链接对应的guilded文件,将里面所有的链接替换成它的域名(以相对路径/
的形式)或者不替换,然后生成一个新的response对象,设置好content-type为application/x-mpegURL
再返回🤔否则的话就和我以前写的guilded下载worker一样照原样返回文件🤔
现在,这玩意应该可以随便用了(确信🤔
github actions
接下来我还可以将这个脚本魔改成github actions版,因为为什么不🤔现在基本上可以删掉它里面绝大多数的冗余代码,包括那段又臭又长的参数处理玩意,因为github actions上不可能会有什么参数需要处理,它基本上只需要两个参数:一个视频文件url,一个discord webhook url🤔
然后再随便写个yml,也是接受两个参数,搞定🤔
当然我需要先下载aria2c和ffmpeg,然后极其尴尬的事情发生了:apt安装ffmpeg可能需要一分钟,但用它给视频做hls分片的速度是一千多倍速;而静态ffmpeg尽管只要几秒就能完成安装,但它处理视频的速度只有几十倍速🤔实在是让人吴fuck说(半恼🤔
examples
discord托管的guilded tube m3u8:
https://cdn.discordapp.com/attachments/976157335020007494/1046157786251264020/thonk.m3u8
guilded tube直链(大嘘),没有替换里面的分片链接:
https://guildedtube.wiebitte.workers.dev/6a433287338fbb468f3adacdfdc1dd2b-Full.m3u8
将分片链接替换成了(和m3u8)相同的域名:
https://guildedtube2.wiebitte.workers.dev/6a433287338fbb468f3adacdfdc1dd2b-Full.m3u8
pc可能需要装cors everywhere,手机的话应该不需要(确信🤔