forked from XueshiQiao/WWDC_2015_Video_Subtitle
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathm3u82str.js
68 lines (58 loc) · 2.36 KB
/
m3u82str.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
const request = require('request');
const fx = require('fs-extra');
const fs = require('fs');
const cheerio = require('cheerio');
const argv = require('minimist')(process.argv.slice(2));
const sutil = require('./subtitle_util');
const getContentFromUrl = function (url) {
return new Promise(function(resolve, reject) {
request(url, function(err, response, body) {
if (!err && response.statusCode === 200) {
resolve(body);
} else {
const errorMessage = '[!] Cannot download '+url;
reject(errorMessage);
}
});
});
}
const saveStr = async (webvttFilesLines, fileName) => {
webvttFilesLines = webvttFilesLines.filter((line) => line.indexOf("WEBVTT") !== 0 && line.indexOf("X-TIMESTAMP-MAP") !== 0);
webvttFilesLines = sutil.webvttLinesToSrtLines(webvttFilesLines);
return new Promise(function(resolve, reject) {
fx.outputFile(fileName, webvttFilesLines.join("\n"), function (err) {
if (err) return reject(err);
resolve();
});
});
}
const getWebvttFileUrls = async (m3u8Url) => {
const urlArr = m3u8Url.split('/'); urlArr.pop();
const urlPrefix = urlArr.join('/')+'/';
const content = await getContentFromUrl(m3u8Url);
let webvttFileNames = content.split("\n").filter((line, index) => line.indexOf("fileSequence") === 0);
webvttFileNames = webvttFileNames.map((fileName) => urlPrefix+fileName);
return webvttFileNames;
}
const downWebvtts2Srt = async (webvttFileNames) => {
let webvttFilesLines = [];
for (let i = 1; i < webvttFileNames.length; i++) {
const fileUrl = webvttFileNames[i];
console.log("[+] Start to download webvtt file: " + fileUrl);
const content = await getContentFromUrl(fileUrl);
lines = content.split("\n");
webvttFilesLines = webvttFilesLines.concat(lines);
}
return webvttFilesLines;
}
(async () => {
const m3u8Url = argv._[0] || argv.url;
const srtFileName = (argv.fileName || Date.now())+'.srt';
if (!m3u8Url) return console.log('[!] No m3u8 url provided exit()');
//'https://p-events-delivery.akamaized.net/17qopibbefvoiuhbsefvbsefvopihb06/vod2/cc2/zho/prog_index.m3u8';
let webvttFileNames = await getWebvttFileUrls(m3u8Url);
//webvttFileNames = webvttFileNames.slice(0, 20);
const webvttFileLines = await downWebvtts2Srt(webvttFileNames);
await saveStr(webvttFileLines, srtFileName);
console.log('[~] File have save to', srtFileName);
})();