This repository was archived by the owner on Sep 30, 2023. It is now read-only.
forked from kaltura/hls-toolkit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhlsGrep.js
More file actions
123 lines (110 loc) · 2.98 KB
/
hlsGrep.js
File metadata and controls
123 lines (110 loc) · 2.98 KB
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
* Created by itayk on 2/11/15.
*/
var fs = require('fs');
var http = require('http');
var q = require('q');
var request = require('request');
var arguments = process.argv.slice(2);
var hlsStream = arguments[0] || 'http://abclive.abcnews.com/i/abc_live4@136330/master.m3u8';
var name=arguments[1] || 'ABC';
var baseDir = 'public/' + name + 'Stream/';
if ( !fs.existsSync('public')){
fs.mkdirSync( 'public' );
}
if ( !fs.existsSync(baseDir) ) {
fs.mkdirSync( baseDir );
}
var masterFile = fs.createWriteStream(baseDir+ 'master.m3u8');
function readMaster(){
var deferred = q.defer();
var request = http.get(hlsStream, function(res) {
res.on('data', function(data) {
masterFile.write(data);
}).on('end', function() {
masterFile.end();
deferred.resolve();
});
});
return deferred.promise;
}
function parseMaster(){
var defferred = q.defer();
var bw = {};
var readFile = fs.readFile(baseDir+ 'master.m3u8','utf8',function(err,data){
console.log(data);
var lines = data.split('\n');
for (var i=0;i<lines.length;i++){
var line = lines[i];
var bwMatch = line.match(/#EXT-.*BANDWIDTH=([0-9]*),/);
if (bwMatch && bwMatch.length > 1){
bw[bwMatch[1]] = lines[i+1];
}
}
defferred.resolve(bw);
});
return defferred.promise;
}
function downloadSegments(bwObj){
if ( !fs.existsSync(name + 'Stream')) {
fs.mkdirSync( name + 'Stream' );
}
for (var i in bwObj){
var path = baseDir + 'bitRate_'+i +'/';
if ( !fs.existsSync(path)) {
fs.mkdirSync( path);
}
monitorAndDownload(bwObj[i],path )
// break;
}
}
function monitorAndDownload(url,path){
if (url.indexOf("http") == -1){
url = hlsStream.replace(/([\w,\s-]+\.m3u8)/ig,url);
}
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
var fileExsit = false;
var passheader = false;
if (!fs.existsSync(path +'playlist.m3u8')) {
fs.writeFile( path + 'playlist.m3u8','' );
}
else{
fileExsit = true;
}
var tsHash = {};
var lines = body.split('\n');
for (var i=0;i<lines.length;i++){
var line= lines[i];
var tsLength = line.match(/#EXTINF:([0-9\.]*)/);
if (tsLength && tsLength.length>1){
passheader = true;
var fileName = lines[i+1].match(/([\w,\s-]+\.ts)/);
if (fileName && fileName.length>1) {
if (!fs.existsSync(path + fileName[1])) {
fs.appendFileSync(path +'playlist.m3u8',line + "\n");
fs.appendFileSync(path +'playlist.m3u8',fileName[1] + "\n");
var tsUrl = lines[i+1];
if (tsUrl.indexOf("http") == -1){
tsUrl = url.replace(/([\w,\s-]+\.m3u8)/ig,tsUrl);
}
request
.get( tsUrl )
.on( 'error' , function ( err ) {
console.log( err )
} )
.pipe( fs.createWriteStream( path + fileName[1] ) );
}
}
}else{
if (!fileExsit && !passheader) {
fs.appendFileSync( path + 'playlist.m3u8' , line + "\n" );
}
}
}
}
})
}
readMaster()
.then( parseMaster)
.then( downloadSegments);