Create QueueCreator

This commit is contained in:
freearhey 2023-10-15 09:48:30 +03:00
parent f3ba9fbcfe
commit 11856161c2
4 changed files with 96 additions and 73 deletions

View file

@ -1,7 +1,7 @@
import { Logger, Timer, Storage, Collection } from '@freearhey/core' import { Logger, Timer, Storage, Collection } from '@freearhey/core'
import { program } from 'commander' import { program } from 'commander'
import { CronJob } from 'cron' import { CronJob } from 'cron'
import { Queue, Job, ChannelsParser } from '../../core' import { QueueCreator, Job, ChannelsParser } from '../../core'
import { Channel } from 'epg-grabber' import { Channel } from 'epg-grabber'
import path from 'path' import path from 'path'
import { SITES_DIR } from '../../constants' import { SITES_DIR } from '../../constants'
@ -78,12 +78,12 @@ async function main() {
logger.info(` found ${parsedChannels.count()} channels`) logger.info(` found ${parsedChannels.count()} channels`)
logger.info('creating queue...') logger.info('creating queue...')
const queue = new Queue({ const queueCreator = new QueueCreator({
parsedChannels, parsedChannels,
logger, logger,
options options
}) })
await queue.create() const queue = await queueCreator.create()
logger.info(` added ${queue.size()} items`) logger.info(` added ${queue.size()} items`)
const job = new Job({ const job = new Job({

View file

@ -9,3 +9,4 @@ export * from './guideManager'
export * from './guide' export * from './guide'
export * from './apiChannel' export * from './apiChannel'
export * from './apiClient' export * from './apiClient'
export * from './queueCreator'

View file

@ -1,9 +1,5 @@
import { Storage, Collection, DateTime, Logger, Dictionary } from '@freearhey/core' import { Dictionary } from '@freearhey/core'
import { ChannelsParser, ConfigLoader, ApiChannel } from './' import { SiteConfig, Channel } from 'epg-grabber'
import { SITES_DIR, DATA_DIR, CURR_DATE } from '../constants'
import { Channel, SiteConfig } from 'epg-grabber'
import path from 'path'
import { GrabOptions } from '../commands/epg/grab'
export type QueueItem = { export type QueueItem = {
channel: Channel channel: Channel
@ -12,83 +8,38 @@ export type QueueItem = {
error: string | null error: string | null
} }
type QueueProps = {
logger: Logger
options: GrabOptions
parsedChannels: Collection
}
export class Queue { export class Queue {
configLoader: ConfigLoader _data: Dictionary
logger: Logger
sitesStorage: Storage
dataStorage: Storage
parser: ChannelsParser
parsedChannels: Collection
options: GrabOptions
date: DateTime
_items: QueueItem[] = []
constructor({ parsedChannels, logger, options }: QueueProps) { constructor() {
this.parsedChannels = parsedChannels this._data = new Dictionary()
this.logger = logger
this.sitesStorage = new Storage()
this.dataStorage = new Storage(DATA_DIR)
this.parser = new ChannelsParser({ storage: new Storage() })
this.date = new DateTime(CURR_DATE)
this.options = options
this.configLoader = new ConfigLoader()
} }
async create() { missing(key: string): boolean {
const channelsContent = await this.dataStorage.json('channels.json') return this._data.missing(key)
const channels = new Collection(channelsContent).map(data => new ApiChannel(data))
const queue = new Dictionary()
for (const channel of this.parsedChannels.all()) {
if (!channel.site || !channel.xmltv_id) continue
if (this.options.lang && channel.lang !== this.options.lang) continue
const configPath = path.resolve(SITES_DIR, `${channel.site}/${channel.site}.config.js`)
const config: SiteConfig = await this.configLoader.load(configPath)
const found: ApiChannel = channels.first(
(_channel: ApiChannel) => _channel.id === channel.xmltv_id
)
if (found) {
channel.logo = found.logo
} }
const days = this.options.days || config.days || 1 add(
const dates = Array.from({ length: days }, (_, day) => this.date.add(day, 'd')) key: string,
dates.forEach((date: DateTime) => { { channel, config, date }: { channel: Channel; date: string | null; config: SiteConfig }
const dateString = date.toJSON() ) {
const key = `${channel.site}:${channel.lang}:${channel.xmltv_id}:${dateString}` this._data.set(key, {
if (queue.missing(key)) {
queue.set(key, {
channel, channel,
date: dateString, date,
config, config,
error: null error: null
}) })
} }
})
}
this._items = Object.values(queue.data())
}
size(): number { size(): number {
return this._items.length return Object.values(this._data.data()).length
} }
items(): QueueItem[] { items(): QueueItem[] {
return this._items return Object.values(this._data.data()) as QueueItem[]
} }
isEmpty(): boolean { isEmpty(): boolean {
return this._items.length === 0 return this.size() === 0
} }
} }

View file

@ -0,0 +1,71 @@
import { Storage, Collection, DateTime, Logger } from '@freearhey/core'
import { ChannelsParser, ConfigLoader, ApiChannel, Queue } from './'
import { SITES_DIR, DATA_DIR, CURR_DATE } from '../constants'
import { SiteConfig } from 'epg-grabber'
import path from 'path'
import { GrabOptions } from '../commands/epg/grab'
type QueueCreatorProps = {
logger: Logger
options: GrabOptions
parsedChannels: Collection
}
export class QueueCreator {
configLoader: ConfigLoader
logger: Logger
sitesStorage: Storage
dataStorage: Storage
parser: ChannelsParser
parsedChannels: Collection
options: GrabOptions
date: DateTime
constructor({ parsedChannels, logger, options }: QueueCreatorProps) {
this.parsedChannels = parsedChannels
this.logger = logger
this.sitesStorage = new Storage()
this.dataStorage = new Storage(DATA_DIR)
this.parser = new ChannelsParser({ storage: new Storage() })
this.date = new DateTime(CURR_DATE)
this.options = options
this.configLoader = new ConfigLoader()
}
async create(): Promise<Queue> {
const channelsContent = await this.dataStorage.json('channels.json')
const channels = new Collection(channelsContent).map(data => new ApiChannel(data))
const queue = new Queue()
for (const channel of this.parsedChannels.all()) {
if (!channel.site || !channel.xmltv_id) continue
if (this.options.lang && channel.lang !== this.options.lang) continue
const configPath = path.resolve(SITES_DIR, `${channel.site}/${channel.site}.config.js`)
const config: SiteConfig = await this.configLoader.load(configPath)
const found: ApiChannel = channels.first(
(_channel: ApiChannel) => _channel.id === channel.xmltv_id
)
if (found) {
channel.logo = found.logo
}
const days = this.options.days || config.days || 1
const dates = Array.from({ length: days }, (_, day) => this.date.add(day, 'd'))
dates.forEach((date: DateTime) => {
const dateString = date.toJSON()
const key = `${channel.site}:${channel.lang}:${channel.xmltv_id}:${dateString}`
if (queue.missing(key)) {
queue.add(key, {
channel,
date: dateString,
config
})
}
})
}
return queue
}
}