Skip to content

Instantly share code, notes, and snippets.

@dz0ny
Created November 28, 2012 18:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dz0ny/4163058 to your computer and use it in GitHub Desktop.
Save dz0ny/4163058 to your computer and use it in GitHub Desktop.
IPTV m3u to tvheadend configuration
#!/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