-
-
Save michaelfeinbier/4177949 to your computer and use it in GitHub Desktop.
IPTV m3u to tvheadend configuration
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env node | |
var fs = require("fs"); | |
var tv = fs.readFileSync("siol.m3u", "UTF-8").split("\n\n"); | |
var tags = []; | |
var iptvs = []; | |
var channels = []; | |
function trim(s) { | |
s = s.replace(/(^\s*)|(\s*$)/gi,""); | |
s = s.replace(/[ ]{2,}/gi," "); | |
s = s.replace(/\n /,"\n"); return s; | |
} | |
function parse_kanali (vir, cb) { | |
for (var i = 1; i < tv.length; i++) { | |
cb(tv[i].split("\n")) | |
}; | |
} | |
function parse_kanal (arr_kanal, cb) { | |
/* [ '#EXTINF:40,CMC', | |
'#EXTTV:Glasbeni;hrv;CMC', | |
'udp://@232.4.2.16:5002' ]*/ | |
var basic = arr_kanal[0].slice("#EXTINF:".length - arr_kanal[0].length).split(","); | |
var xtra = arr_kanal[1].slice("#EXTTV:".length - arr_kanal[1].length).split(";"); | |
var ip = arr_kanal[2].slice( arr_kanal[2].indexOf("@")+1 , arr_kanal[2].lastIndexOf(":") ); | |
var port = arr_kanal[2].slice( arr_kanal[2].lastIndexOf(":")+1 ); | |
//console.log("basic", basic); | |
//console.log("xtra", xtra); | |
//console.log("ip", ip); | |
//console.log("port", port); | |
/* basic [ '303', 'Radio Hit' ] | |
xtra [ 'Radio', 'slv', '' ] | |
ip 232.3.1.3*/ | |
cb(basic[0], basic[1], xtra, ip, port) | |
} | |
function gen_iptv_json(port, ip, name, id) { | |
return { | |
"pmt": 0, | |
"stype": 1, | |
"port": port, | |
"interface": "eth0", | |
"group": ip, | |
"channelname": trim(name), | |
"mapped": id, | |
"pcr": 0, | |
"disabled": 0 | |
} | |
} | |
function gen_chan_json(name, tags, id) { | |
return { | |
"name": name, | |
"tags": tags, | |
"dvr_extra_time_pre": 0, | |
"dvr_extra_time_post": 0, | |
"channel_number": id | |
} | |
} | |
function gen_tag_json(id, name) { | |
return { | |
"enabled": 1, | |
"internal": 0, | |
"titledIcon": 0, | |
"name": name, | |
"comment": name, | |
"icon": "", | |
"id": id | |
} | |
} | |
function arr_all_tags (b_tags) { | |
// if array contains element with ",", further splice it | |
var tb_tags = []; | |
for (var i = b_tags.length - 1; i >= 0; i--) { | |
if (b_tags[i].indexOf(",") != -1) { | |
var zac_tag = b_tags[i].split(","); | |
tb_tags = tb_tags.concat(zac_tag) | |
}else{ | |
tb_tags.push(b_tags[i]); | |
} | |
}; | |
return tb_tags; | |
} | |
parse_kanali(tv, function(kanal) { | |
parse_kanal(kanal, function(id, name, xtra, ip, port) { | |
xtra.pop(); // odstrani zadnji bz strings | |
xtra = arr_all_tags(xtra) | |
iptvs.push( gen_iptv_json(port, ip, name, id) ) | |
channels.push( gen_chan_json(name, xtra, id) ) //doda kar vse kanale v string, kasneje obdelaj | |
tags = tags.concat(xtra) | |
}); | |
}); | |
// remove duplicate tags | |
var mtags = tags.filter(function(elem, pos) { | |
return tags.indexOf(elem) == pos; | |
}); | |
tags = mtags; | |
//// remove duplicate tags | |
function gen_dir (name) { | |
try{fs.rmdirSync(__dirname + name);}catch(e){}; | |
try{fs.mkdirSync(__dirname + name);}catch(e){}; | |
} | |
function fix_tags (arr) { | |
var ret = []; | |
for (var i = 0; i < arr.length; i++) { | |
ret.push(tags.indexOf(arr[i])+1); // povecaj ker zacnemo channeltags z 1 | |
}; | |
return ret; | |
} | |
gen_dir("/channels"); | |
gen_dir("/channeltags"); | |
gen_dir("/iptvservices"); | |
for (var i = 0; i < iptvs.length; i++) { | |
iptvs[i].mapped = String(i+1); | |
fs.writeFileSync(__dirname+"/iptvservices/iptv_"+String(i+1), JSON.stringify(iptvs[i]), "utf-8"); | |
}; | |
for (var i = 0; i < tags.length; i++) { | |
fs.writeFileSync(__dirname+"/channeltags/"+String(i+1), JSON.stringify(gen_tag_json( i+1, tags[i] )), "utf-8"); | |
}; | |
for (var i = 0; i < channels.length; i++) { | |
channels[i].tags = fix_tags(channels[i].tags); | |
channels[i].channel_number = i+1; | |
console.log(i, channels[i].name); | |
fs.writeFileSync(__dirname+"/channels/"+String(i+1), JSON.stringify(channels[i]), "utf-8") | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment