接上条,自从编译出想要的mpv后,就想着编译个iina只是举手之劳,没想到今天试了试才发现,事情没那么简单。。
iina的GitHub仓库是有配置构建的workflow的,理论上只要修改下它的构建脚本,将它依赖的libmpv替换自己构建的就行了。
libmpv
但是我fork之后构建出的最新版本iina虽然能在我的mac 10.15上打开,可播放任意文件都会闪退。一开始以为是我修改造成的问题,于是从iina官方仓库的action里下载了最新版本,结果也是一样……
没办法只好手动checkout到上一次稳定版本的commit,然后再跑一次构建脚本,这次在下载依赖包的环节就失败了。。由此可见现代软件构建链的脆弱性,太多环境太多版本了。。
从头构建暂时走不通,就想办法直接改本地的app。
众所周知.app文件其实是个特定结构的文件夹,iina也不例外,而iina.app里面恰好就有一个libmpv.2.dylib,这个文件我已经构建出来了能播放hevc flv的版本,就在这个链接里(libmpv-x86_64-45c1c58.zip)。
.app
iina.app
libmpv.2.dylib
libmpv-x86_64-45c1c58.zip
所以问题就成了怎样将iina.app里的libmpv.2.dylib替换成我们自己构建的。
直接替换好像不行,app直接打不开,我折腾半天又是codesign又是xattr,还是行不通,实在搞不懂mac的安全策略。。
codesign
xattr
最终在otool的帮助下发现了线索,otool -L /Applications/IINA.app/Contents/MacOS/IINA可以查看它依赖的dylib,里面就有我们的目标libmpv,于是先执行
otool
otool -L /Applications/IINA.app/Contents/MacOS/IINA
dylib
install_name_tool -change @rpath/libmpv.2.dylib /Users/me/code/github/mpv-mac/temp/libmpv.2.dylib /Applications/IINA.app/Contents/MacOS/IINA
将二进制IINA中引用的libmpv链接重定向到本地下载好的新构建的dylib文件
这样还没完,因为otool分析这个新构建的libmpv.2.dylib会发现它还引用了一个libluajit-5.1.2.dylib,这个文件的路径/Users/runner/work/mpv-mac/mpv-mac/opt/lib/libluajit-5.1.2.dylib在我的本地mac上找不到,但也在libmpv-x86_64-45c1c58.zip这个压缩包里。所以需要再执行下install_name_tool:
libluajit-5.1.2.dylib
/Users/runner/work/mpv-mac/mpv-mac/opt/lib/libluajit-5.1.2.dylib
install_name_tool -change /Users/runner/work/mpv-mac/mpv-mac/opt/lib/libluajit-5.1.2.dylib /Users/me/code/githubx/mpv-mac/temp/libluajit-5.1.2.dylib libmpv.2.dylib # 此外二进制IINA也引用了libluajit,所以也顺带改下 install_name_tool -change @rpath/libluajit-5.1.2.dylib /Users/me/code/github/mpv-mac/temp/libluajit-5.1.2.dylib /Applications/IINA.app/Contents/MacOS/IINA
依赖问题解决后,再执行一遍codesign -s - -f /Applications/IINA.app
codesign -s - -f /Applications/IINA.app
这样就能成功打开iina.app了,而且它内部调用的libmpv也变成了我们自己构建的版本,所以也能成功打开hevc的flv文件了。
折腾一晚上终于把macOS 10.15上能跑的支持hevc flv的mpv编译出来了
macOS 10.15
又学到一招,GitHub提供某个pull的patch下载,构造链接方式为 https://patch-diff.githubusercontent.com/raw/username/reponame/pull/ID.patch
https://patch-diff.githubusercontent.com/raw/username/reponame/pull/ID.patch
比如这个pull的补丁文件下载链接为https://patch-diff.githubusercontent.com/raw/iwestlin/lab/pull/1.patch
(来自 https://github.com/iwestlin/lab/pull/1.patch的重定向
https://github.com/iwestlin/lab/pull/1.patch
一行代码获取抖音网页视频源地址:
[...document.querySelector('.xgplayer video').childNodes].pop().src
冒出一个idea,理论上现在的科技完全可以做到:「象棋AR眼镜」
带上这种眼镜以后,只要视野内出现类似棋盘的图像,就会激活特定的图像识别系统,将盘面转化为标准棋谱格式,然后调用类似皮卡鱼这种象棋引擎,算出红黑方各自的最佳招之后(因为图片无法确定接下来是谁走棋),再绘制到眼镜中棋盘所在的视野中。
感觉要是实现出来的话,至少能做成产品大卖的,不比什么苹果vr酷炫多了😅
https://blog.glyphdrawing.club/font-with-built-in-syntax-highlighting/
https://platform.deepseek.com/api-docs/zh-cn/function_calling/
pipe.js:
pipe.js
process.stdout.write(require('fs').readFileSync(0, 'utf-8')) // or process.stdin.pipe(process.stdout)
script -q /dev/null node -p "Boolean(0)" | node pipe.js # will print yellow false
https://stablediffusion3.net/zh-CN
啥叫递归啊
url to text(for llm
我才知道娜塔丽波特曼是犹太人……还有她今年离婚了。。😅
=== update ===
才注意到原来费曼也是犹太人😭
let a = await (Promise.reject('msg')).catch(e => e) a === 'msg' // true
(但如果把await放到括号里面就catch不住了🙅♀️
node从v18起就支持把JS代码打包成二进制了:https://nodejs.org/api/single-executable-applications.html
(我记得好像记录过这个,但是找不到了...😅😅
成功用workerd把gdshare在vps上跑起来了
docker pull dcard/workerd docker run -d -p 8081:8081 -v .:/app dcard/workerd serve /app/workerd.capnp
第二条命令执行的时候要确保当前目录有两个文件,一个是workerd.capnp:
workerd.capnp
using Workerd = import "/workerd/workerd.capnp"; const helloWorldExample :Workerd.Config = ( services = [ (name = "main", worker = .helloWorld) ], sockets = [ ( name = "http", address = "*:8081", http = (), service = "main" ) ] ); const helloWorld :Workerd.Worker = ( serviceWorkerScript = embed "worker.js", compatibilityDate = "2023-02-28", );
另一个是worker.js
worker.js
addEventListener('fetch', event => { event.respondWith(handle(event.request)); }); async function handle(request) { return new Response("Hello World\n"); }
(实际上我是用了gdshare
其实不一定要用docker,我本地迷你主机就成功用官方发布的二进制的workerd跑起来了,但是我的vps ubuntu版本比较老,直接跑二进制会报错……
workerd
具体命令则是 ./workerd serve workerd.capnp
./workerd serve workerd.capnp
老版本的node(比如8)在请求用let's encrypt的https证书加密的网站时会报错certificate has expired
certificate has expired
有几种解决办法,最正确的是升级node版本,我试了下14就不报错了。。 最省事的是在env里加一句NODE_TLS_REJECT_UNAUTHORIZED=0
NODE_TLS_REJECT_UNAUTHORIZED=0
更灵活点可以在具体的请求里忽略tls报错:
const https = require("https"); const agent = new https.Agent({ rejectUnauthorized: false, });
最硬核的就是改node源码自己编译了。。
HTTP 418 I'm a teapot