(stream: HuyaStreamInfo)
| 24 | |
| 25 | const logger = log4js.getLogger("message"); |
| 26 | export const downloadStream = (stream: HuyaStreamInfo) => { |
| 27 | // 每段视频持续时间,单位s |
| 28 | const partDuration = "1800" |
| 29 | // let huyaRoomId = getRoomArrInfo(infoJson.streamerInfo)[0].roomLink; |
| 30 | // let huyaRoomTitle = getRoomArrInfo(infoJson.streamerInfo)[0].roomTitle; |
| 31 | // console.log("开始下载 ", stream.streamName); |
| 32 | logger.info("开始下载 ", stream.streamName) |
| 33 | // const cmd = `ffmpeg -i "${streamUrl}" -f mp4 res.MP4`; |
| 34 | // 命名加上时间戳 |
| 35 | // console.log("streamUrl", stream.streamUrl); |
| 36 | const timeV = dayjs().format("YYYY-MM-DD"); |
| 37 | const cmd = `ffmpeg`; |
| 38 | // console.log("11", huyaRoomId + `${timeV}res.MP4`); |
| 39 | let savePath = join(rootPath, "/download") |
| 40 | let startNumber = 0 |
| 41 | if (!fs.existsSync(savePath)) { |
| 42 | fs.mkdirSync(savePath) |
| 43 | } |
| 44 | let dirName = join(savePath, stream.streamName) |
| 45 | if (!fs.existsSync(dirName)) { |
| 46 | fs.mkdirSync(dirName) |
| 47 | } |
| 48 | dirName = join(dirName, timeV) |
| 49 | if (!fs.existsSync(dirName)) { |
| 50 | fs.mkdirSync(dirName) |
| 51 | } else { //文件夹存在,说明有视频未上传,接着前面的序号下载 |
| 52 | let ps = fs.readdirSync(dirName); |
| 53 | startNumber = ps.length |
| 54 | } |
| 55 | const fileName: string = join(dirName, `${stream.streamName}-${timeV}-part-%03d.mp4`); |
| 56 | //伪装了请求头,避免服务器返回403 |
| 57 | const fakeX: any = { |
| 58 | 'Accept': '*/*', |
| 59 | 'Accept-Encoding': 'gzip, deflate, br', |
| 60 | 'Accept-Language': 'zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,ru;q=0.5', |
| 61 | 'Origin': 'https://www.huya.com', |
| 62 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36' |
| 63 | } |
| 64 | let fakeHeaders = "" |
| 65 | for (let key of Object.keys(fakeX)) { |
| 66 | fakeHeaders = `${fakeHeaders}${key}: ${fakeX[key]}\r\n` |
| 67 | } |
| 68 | const huyaApp = spawn(cmd, [ |
| 69 | "-headers", |
| 70 | fakeHeaders, |
| 71 | "-i", |
| 72 | stream.streamUrl, |
| 73 | "-c:v", |
| 74 | "copy", |
| 75 | "-c:a", |
| 76 | "copy", |
| 77 | "-f", |
| 78 | "segment", |
| 79 | "-segment_time", |
| 80 | partDuration, |
| 81 | "-segment_start_number", |
| 82 | startNumber.toString(), |
| 83 | fileName, |
no test coverage detected
searching dependent graphs…