foamzou / bilibili-downloader

哔哩哔哩(b站)音视频下载脚本
64 stars 5 forks source link

Generated file name may include metacharacters of bash. #2

Closed Bergpss closed 1 month ago

Bergpss commented 1 month ago

问题描述

生成的命令中:mp3或mp4的文件名(也就是当前视频的名称)中可能包含需要转义的字符,bash会报错。

错误举例:

生成的命令

mkdir "《红歌100首》华语群星---我们走在大路上-立体声伴奏(高清)" ; cd "《红歌100首》华语群星---我们走在大路上-立体声伴奏(高清)" ; curl 'https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/00/55/355825500/355825500-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1725380459&gen=playurlv2&os=cosbv&oi=0&trid=90a5788ef73b4c749cace0c576e804c2u&mid=29499066&platform=pc&og=cos&upsig=669d25491f8486c4a93cb2afba589904&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&bvc=vod&nettype=0&orderid=0,3&buvid=DB7D9181-DEDE-EF14-36F4-8A47782F0DB650833infoc&build=0&f=u_0_0&agrr=0&bw=16232&logo=80000000'   -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'   -H 'referer: https://www.bilibili.com/video/BV1mv411p7Ph/?spm_id_from=333.337.search-card.all.click&vd_source=3113da39f2358e4781863def2c95f6b8'   --compressed -o audio.m4s -Lv -s ; ffmpeg -i audio.m4s  -c:v copy -strict experimental 《红歌100首》华语群星---我们走在大路上-立体声伴奏(高清).mp3

报错

-bash: syntax error near unexpected token `('

可能的解决方法(问了 ChatGPT)

  1. 给文件名加上引号
  2. 转义特殊字符

针对两种解决办法,我做的尝试

  1. 已尝试修改代码,并测试成功
    
    function ffmpegMp4(name) {
    return `ffmpeg -i ${VIDEO_NAME} -i ${AUDIO_NAME}  -c:v copy -strict experimental \'${name}.mp4\'`;
    }

function ffmpegMp3(name) { return ffmpeg -i ${AUDIO_NAME} -c:v copy -strict experimental \'${name}.mp3\'; }


2. 暂时不知道如何通过代码解决,因为无法知道特殊字符的具体位置

PS:问题可能“太小”不至于写这么多,但我想尽力表述清楚。
foamzou commented 1 month ago

谢谢,写得很清晰。已 fix: https://github.com/foamzou/bilibili-downloader/commit/1ca2f613f7e6e19b92eefdc084caf820483d01ca

其实本代码已经在生成名字的时候做了一些过滤,但还是漏了一些特殊字符,例如你提到的 ( )。在这个正则加上就行

name: document.title.replace('_哔哩哔哩_bilibili', '').replace(/[ |.|\/]/g, '-'),

不过本次 fix 是如你的方案一样直接加上了引号,一劳永逸。