diff --git a/package-lock.json b/package-lock.json index bbdbe4a2..17694674 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,11 @@ "dependencies": { "dayjs": "^1.10.4", "epg-grabber": "^0.2.5", + "glob": "^7.1.6", "html-to-text": "^7.0.0", "jsdom": "^16.5.0", - "parse-duration": "^0.4.4" + "parse-duration": "^0.4.4", + "xml-js": "^1.6.11" } }, "node_modules/@types/tough-cookie": { diff --git a/package.json b/package.json index 9511989f..3bfeef9b 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,10 @@ "dependencies": { "dayjs": "^1.10.4", "epg-grabber": "^0.2.5", + "glob": "^7.1.6", "html-to-text": "^7.0.0", "jsdom": "^16.5.0", - "parse-duration": "^0.4.4" + "parse-duration": "^0.4.4", + "xml-js": "^1.6.11" } } diff --git a/scripts/update-codes.js b/scripts/update-codes.js new file mode 100644 index 00000000..2a39fcaa --- /dev/null +++ b/scripts/update-codes.js @@ -0,0 +1,70 @@ +const fs = require('fs') +const glob = require('glob') +const path = require('path') +const convert = require('xml-js') + +function main() { + let codes = {} + console.log('Starting...') + glob('sites/**/*.xml', null, function (er, files) { + files.forEach(filename => { + const channels = parseChannels(filename) + channels.forEach(channel => { + if (!codes[channel.xmltv_id + channel.name]) { + codes[channel.xmltv_id + channel.name] = { + name: channel.name, + code: channel.xmltv_id + } + } + }) + }) + + const sorted = Object.values(codes).sort((a, b) => { + if (a.name < b.name) return -1 + if (a.name > b.name) return 1 + return 0 + }) + writeToFile('codes.csv', convertToCSV(sorted)) + console.log('Done') + }) +} + +function writeToFile(filename, data) { + console.log(`Saving all codes to '${filename}'...`) + const dir = path.resolve(path.dirname(filename)) + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }) + } + + fs.writeFileSync(path.resolve(filename), data) +} + +function convertToCSV(arr) { + let string = 'Channel Name,EPG Code (tvg-id)\n' + for (const item of arr) { + string += `${item.name},${item.code}\n` + } + + return string +} + +function parseChannels(filename) { + if (!filename) throw new Error('Path to [site].channels.xml is missing') + console.log(`Loading '${filename}'...`) + + const xml = fs.readFileSync(path.resolve(filename), { encoding: 'utf-8' }) + const result = convert.xml2js(xml) + const site = result.elements.find(el => el.name === 'site') + const channels = site.elements.find(el => el.name === 'channels') + + return channels.elements + .filter(el => el.name === 'channel') + .map(el => { + const channel = el.attributes + channel.name = el.elements.find(el => el.type === 'text').text + + return channel + }) +} + +main()