mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-09 16:40:07 -04:00
123 lines
3.2 KiB
JavaScript
123 lines
3.2 KiB
JavaScript
const { db, api, logger, file, zip } = require('../../core')
|
|
const { generateXMLTV, Program, Channel } = require('epg-grabber')
|
|
const _ = require('lodash')
|
|
|
|
const PUBLIC_DIR = process.env.PUBLIC_DIR || '.gh-pages'
|
|
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
|
|
const CURR_DATE = process.env.CURR_DATE || new Date()
|
|
|
|
const logPath = `${LOGS_DIR}/guides/update.log`
|
|
|
|
let channels_dic = {}
|
|
let db_programs = []
|
|
let guides = []
|
|
|
|
async function main() {
|
|
logger.info(`starting...`)
|
|
|
|
logger.info('loading data/channels.json...')
|
|
await api.channels.load()
|
|
|
|
let api_channels = await api.channels.all()
|
|
api_channels.forEach(channel => {
|
|
channels_dic[channel.id] = channel
|
|
})
|
|
|
|
logger.info('loading database/programs.db...')
|
|
await db.programs.load()
|
|
db_programs = await db.programs.find({})
|
|
logger.info(`found ${db_programs.length} programs`)
|
|
|
|
await generate()
|
|
|
|
logger.info(`creating ${logPath}...`)
|
|
await file.create(logPath, guides.map(g => JSON.stringify(g)).join('\r\n'))
|
|
|
|
logger.info('finished')
|
|
}
|
|
|
|
main()
|
|
|
|
async function generate() {
|
|
let sites = _.groupBy(db_programs, 'site')
|
|
|
|
for (let site in sites) {
|
|
let programs = {}
|
|
for (let prog of sites[site]) {
|
|
let key = prog.channel + prog.start
|
|
if (!programs[key]) {
|
|
programs[key] = prog
|
|
} else {
|
|
programs[key] = merge(programs[key], prog)
|
|
}
|
|
}
|
|
|
|
let filename = `${site}`
|
|
let { channels } = await save(filename, Object.values(programs))
|
|
|
|
for (let channel of channels) {
|
|
guides.push({
|
|
lang: channel.lang,
|
|
site: channel.site,
|
|
channel: channel.id,
|
|
filename
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
function merge(p1, p2) {
|
|
for (let prop in p1) {
|
|
if (Array.isArray(p1[prop])) {
|
|
p1[prop] = _.orderBy(
|
|
_.uniqWith(p1[prop].concat(p2[prop]), _.isEqual),
|
|
v => (v.lang === 'en' ? Infinity : 1),
|
|
'desc'
|
|
)
|
|
}
|
|
}
|
|
|
|
return p1
|
|
}
|
|
|
|
async function save(filepath, programs) {
|
|
let all_channels = {}
|
|
programs.forEach(p => {
|
|
p.titles.forEach(t => {
|
|
let c = channels_dic[p.channel]
|
|
c.site = p.site
|
|
c.lang = t.lang
|
|
if (!all_channels[p.channel + t.lang]) {
|
|
all_channels[p.channel + t.lang] = new Channel(c)
|
|
}
|
|
})
|
|
})
|
|
|
|
let channels = _.sortBy(Object.values(all_channels), 'id')
|
|
channels = _.uniqBy(channels, 'id')
|
|
|
|
programs = _.sortBy(programs, ['channel', 'start'])
|
|
programs = programs.map(p => new Program(p, new Channel(channels_dic[p.channel])))
|
|
programs = _.uniqBy(programs, p => p.channel + p.start)
|
|
|
|
const xmlFilepath = `${PUBLIC_DIR}/guides/${filepath}.xml`
|
|
const gzFilepath = `${PUBLIC_DIR}/guides/${filepath}.xml.gz`
|
|
const jsonFilepath = `${PUBLIC_DIR}/guides/${filepath}.json`
|
|
logger.info(`creating ${xmlFilepath}...`)
|
|
const xmltv = generateXMLTV({
|
|
channels,
|
|
programs,
|
|
date: CURR_DATE
|
|
})
|
|
await file.create(xmlFilepath, xmltv)
|
|
logger.info(`creating ${gzFilepath}...`)
|
|
const compressed = await zip.compress(xmltv)
|
|
await file.create(gzFilepath, compressed)
|
|
logger.info(`creating ${jsonFilepath}...`)
|
|
await file.create(jsonFilepath, JSON.stringify({ channels, programs }))
|
|
|
|
return {
|
|
channels: Object.values(all_channels),
|
|
programs
|
|
}
|
|
}
|