mirror of https://github.com/iptv-org/iptv
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
import { Storage } from '@freearhey/storage-js'
|
|
import { Collection } from '@freearhey/core'
|
|
import parser from 'iptv-playlist-parser'
|
|
import { Stream } from '../models'
|
|
|
|
type PlaylistPareserProps = {
|
|
storage: Storage
|
|
}
|
|
|
|
export class PlaylistParser {
|
|
storage: Storage
|
|
|
|
constructor({ storage }: PlaylistPareserProps) {
|
|
this.storage = storage
|
|
}
|
|
|
|
async parse(files: string[]): Promise<Collection<Stream>> {
|
|
const parsed = new Collection<Stream>()
|
|
|
|
for (const filepath of files) {
|
|
if (!this.storage.existsSync(filepath)) continue
|
|
const _parsed: Collection<Stream> = await this.parseFile(filepath)
|
|
parsed.concat(_parsed)
|
|
}
|
|
|
|
return parsed
|
|
}
|
|
|
|
async parseFile(filepath: string): Promise<Collection<Stream>> {
|
|
const content = await this.storage.load(filepath)
|
|
const parsed: parser.Playlist = parser.parse(content)
|
|
|
|
const streams = new Collection<Stream>()
|
|
parsed.items.forEach((data: parser.PlaylistItem) => {
|
|
const stream = Stream.fromPlaylistItem(data)
|
|
stream.filepath = filepath
|
|
|
|
streams.add(stream)
|
|
})
|
|
|
|
return streams
|
|
}
|
|
}
|