Files
iptv/scripts/commands/playlist/generate.ts

114 lines
3.2 KiB
TypeScript
Raw Normal View History

2025-04-16 20:54:55 +03:00
import { PlaylistParser, DataProcessor, DataLoader } from '../../core'
2025-04-23 20:56:19 +03:00
import type { DataProcessorData } from '../../types/dataProcessor'
import { DATA_DIR, LOGS_DIR, STREAMS_DIR } from '../../constants'
import type { DataLoaderData } from '../../types/dataLoader'
import { Logger, Storage, File } from '@freearhey/core'
2025-04-16 20:54:55 +03:00
import { Stream } from '../../models'
2025-03-29 11:39:46 +03:00
import { uniqueId } from 'lodash'
2023-09-15 18:40:35 +03:00
import {
2025-04-23 20:56:19 +03:00
IndexCategoryGenerator,
IndexLanguageGenerator,
IndexCountryGenerator,
IndexRegionGenerator,
2023-09-15 18:40:35 +03:00
CategoriesGenerator,
CountriesGenerator,
LanguagesGenerator,
RegionsGenerator,
2025-07-10 21:13:43 +03:00
IndexGenerator,
SourcesGenerator
2023-09-15 18:40:35 +03:00
} from '../../generators'
async function main() {
const logger = new Logger()
2025-04-23 20:56:19 +03:00
const logFile = new File('generators.log')
2023-09-15 18:40:35 +03:00
2023-09-17 04:08:50 +03:00
logger.info('loading data from api...')
2025-04-16 20:54:55 +03:00
const processor = new DataProcessor()
const dataStorage = new Storage(DATA_DIR)
const loader = new DataLoader({ storage: dataStorage })
const data: DataLoaderData = await loader.load()
const {
2025-04-23 20:56:19 +03:00
feedsGroupedByChannelId,
2025-07-10 21:13:43 +03:00
logosGroupedByStreamId,
2025-04-23 20:56:19 +03:00
channelsKeyById,
2025-04-16 20:54:55 +03:00
categories,
countries,
2025-04-23 20:56:19 +03:00
regions
2025-04-16 20:54:55 +03:00
}: DataProcessorData = processor.process(data)
2023-09-15 18:40:35 +03:00
2023-09-17 04:08:50 +03:00
logger.info('loading streams...')
2025-04-16 20:54:55 +03:00
const streamsStorage = new Storage(STREAMS_DIR)
2025-03-29 11:39:46 +03:00
const parser = new PlaylistParser({
2025-04-16 20:54:55 +03:00
storage: streamsStorage,
2025-04-23 20:56:19 +03:00
feedsGroupedByChannelId,
2025-07-10 21:13:43 +03:00
logosGroupedByStreamId,
2025-04-23 20:56:19 +03:00
channelsKeyById
2025-03-29 11:39:46 +03:00
})
2025-04-16 20:54:55 +03:00
const files = await streamsStorage.list('**/*.m3u')
2025-03-29 11:39:46 +03:00
let streams = await parser.parse(files)
const totalStreams = streams.count()
2025-07-10 21:13:43 +03:00
logger.info(`found ${totalStreams} streams`)
logger.info('filtering streams...')
2025-03-30 03:01:05 +03:00
streams = streams.uniqBy((stream: Stream) =>
stream.hasId() ? stream.getChannelId() + stream.getFeedId() : uniqueId()
)
2023-09-15 18:40:35 +03:00
2025-03-29 11:39:46 +03:00
logger.info('sorting streams...')
streams = streams.orderBy(
[
(stream: Stream) => stream.getId(),
2025-03-30 03:01:05 +03:00
(stream: Stream) => stream.getVerticalResolution(),
2025-03-29 11:39:46 +03:00
(stream: Stream) => stream.getLabel()
],
['asc', 'asc', 'desc']
)
2023-09-15 18:40:35 +03:00
logger.info('generating categories/...')
2025-04-23 20:56:19 +03:00
await new CategoriesGenerator({ categories, streams, logFile }).generate()
2025-03-29 11:39:46 +03:00
2023-09-15 18:40:35 +03:00
logger.info('generating countries/...')
await new CountriesGenerator({
countries,
streams,
2025-04-23 20:56:19 +03:00
logFile
2023-09-15 18:40:35 +03:00
}).generate()
2025-03-29 11:39:46 +03:00
2023-09-15 18:40:35 +03:00
logger.info('generating languages/...')
2025-04-23 20:56:19 +03:00
await new LanguagesGenerator({ streams, logFile }).generate()
2025-03-29 11:39:46 +03:00
2023-09-15 18:40:35 +03:00
logger.info('generating regions/...')
await new RegionsGenerator({
streams,
regions,
2025-04-23 20:56:19 +03:00
logFile
2023-09-15 18:40:35 +03:00
}).generate()
2025-03-29 11:39:46 +03:00
2025-07-10 21:13:43 +03:00
logger.info('generating sources/...')
await new SourcesGenerator({ streams, logFile }).generate()
2023-09-15 18:40:35 +03:00
logger.info('generating index.m3u...')
2025-04-23 20:56:19 +03:00
await new IndexGenerator({ streams, logFile }).generate()
2025-03-29 11:39:46 +03:00
2023-09-15 18:40:35 +03:00
logger.info('generating index.category.m3u...')
2025-04-23 20:56:19 +03:00
await new IndexCategoryGenerator({ streams, logFile }).generate()
2025-03-29 11:39:46 +03:00
2023-09-15 18:40:35 +03:00
logger.info('generating index.country.m3u...')
await new IndexCountryGenerator({
streams,
2025-04-23 20:56:19 +03:00
logFile
2023-09-15 18:40:35 +03:00
}).generate()
2025-03-29 11:39:46 +03:00
2023-09-15 18:40:35 +03:00
logger.info('generating index.language.m3u...')
2025-04-23 20:56:19 +03:00
await new IndexLanguageGenerator({ streams, logFile }).generate()
2025-03-29 11:39:46 +03:00
2023-09-15 18:40:35 +03:00
logger.info('generating index.region.m3u...')
2025-04-23 20:56:19 +03:00
await new IndexRegionGenerator({ streams, regions, logFile }).generate()
logger.info('saving generators.log...')
const logStorage = new Storage(LOGS_DIR)
logStorage.saveFile(logFile)
2023-09-15 18:40:35 +03:00
}
main()