Files
epg/scripts/commands/guides/update.js

124 lines
3.2 KiB
JavaScript
Raw Normal View History

2022-10-26 04:41:23 +03:00
const { db, api, logger, file, zip } = require('../../core')
2022-06-16 21:58:15 +03:00
const { generateXMLTV, Program, Channel } = require('epg-grabber')
2022-01-09 16:09:19 +03:00
const _ = require('lodash')
2022-01-12 13:27:27 +03:00
const PUBLIC_DIR = process.env.PUBLIC_DIR || '.gh-pages'
2022-10-26 04:41:23 +03:00
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
2022-05-09 16:21:50 +03:00
const CURR_DATE = process.env.CURR_DATE || new Date()
2022-01-09 16:09:19 +03:00
2022-10-26 04:41:23 +03:00
const logPath = `${LOGS_DIR}/guides/update.log`
2023-01-08 11:22:35 +03:00
let channels_dic = {}
let db_programs = []
let guides = []
2023-01-08 11:22:35 +03:00
2022-01-09 16:09:19 +03:00
async function main() {
2022-10-26 04:41:23 +03:00
logger.info(`starting...`)
2022-01-10 22:16:18 +03:00
2023-01-08 13:17:56 +03:00
logger.info('loading data/channels.json...')
2022-10-26 04:41:23 +03:00
await api.channels.load()
2022-01-21 22:40:25 +03:00
2023-01-09 10:45:17 +03:00
let api_channels = await api.channels.all()
2022-10-26 04:41:23 +03:00
api_channels.forEach(channel => {
channels_dic[channel.id] = channel
})
2022-02-01 06:17:12 +03:00
2022-10-26 04:41:23 +03:00
logger.info('loading database/programs.db...')
await db.programs.load()
2023-01-08 11:22:35 +03:00
db_programs = await db.programs.find({})
2022-10-26 04:41:23 +03:00
logger.info(`found ${db_programs.length} programs`)
2023-01-09 10:45:17 +03:00
await generate()
logger.info(`creating ${logPath}...`)
await file.create(logPath, guides.map(g => JSON.stringify(g)).join('\r\n'))
2023-01-09 10:45:17 +03:00
logger.info('finished')
2023-01-08 11:22:35 +03:00
}
main()
2023-01-09 10:45:17 +03:00
async function generate() {
2023-01-08 11:22:35 +03:00
let sites = _.groupBy(db_programs, 'site')
for (let site in sites) {
2022-10-27 19:16:17 +03:00
let programs = {}
2023-01-09 10:45:17 +03:00
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)
2022-10-26 04:41:23 +03:00
}
2022-10-27 19:16:17 +03:00
}
2023-01-09 10:45:17 +03:00
let filename = `${site}`
let { channels } = await save(filename, Object.values(programs))
2022-10-27 19:16:17 +03:00
for (let channel of channels) {
2023-01-08 13:17:56 +03:00
guides.push({
2022-10-27 19:16:17 +03:00
lang: channel.lang,
site: channel.site,
channel: channel.id,
filename
2023-01-08 13:17:56 +03:00
})
2022-10-26 04:41:23 +03:00
}
}
2022-01-09 16:09:19 +03:00
}
2023-01-09 10:45:17 +03:00
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
}
2023-01-08 11:22:35 +03:00
2023-01-09 10:45:17 +03:00
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)
}
})
2023-01-08 11:22:35 +03:00
})
2023-01-09 10:45:17 +03:00
let channels = _.sortBy(Object.values(all_channels), 'id')
2023-01-08 11:22:35 +03:00
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 {
2023-01-09 10:45:17 +03:00
channels: Object.values(all_channels),
2023-01-08 11:22:35 +03:00
programs
}
}