MCPcopy
hub / github.com/iptv-org/iptv / LanguagesGenerator

Class LanguagesGenerator

scripts/generators/languagesGenerator.ts:10–60  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

8type LanguagesGeneratorProps = { streams: Collection<Stream>; logFile: File }
9
10export class LanguagesGenerator implements Generator {
11 streams: Collection<Stream>
12 storage: Storage
13 logFile: File
14
15 constructor({ streams, logFile }: LanguagesGeneratorProps) {
16 this.streams = streams.clone()
17 this.storage = new Storage(PUBLIC_DIR)
18 this.logFile = logFile
19 }
20
21 async generate(): Promise<void> {
22 const streams: Collection<Stream> = this.streams
23 .sortBy((stream: Stream) => stream.title)
24 .filter((stream: Stream) => stream.isSFW())
25
26 const languages = new Collection<sdk.Models.Language>()
27 streams.forEach((stream: Stream) => {
28 stream.getLanguages().forEach((language: sdk.Models.Language) => {
29 languages.add(language)
30 })
31 })
32
33 languages
34 .filter(Boolean)
35 .uniqBy((language: sdk.Models.Language) => language.code)
36 .sortBy((language: sdk.Models.Language) => language.name)
37 .forEach(async (language: sdk.Models.Language) => {
38 const languageStreams = streams.filter((stream: Stream) => stream.hasLanguage(language))
39
40 if (languageStreams.isEmpty()) return
41
42 const playlist = new Playlist(languageStreams, { public: true })
43 const filepath = `languages/${language.code}.m3u`
44 await this.storage.save(filepath, playlist.toString())
45 this.logFile.append(
46 JSON.stringify({ type: 'language', filepath, count: playlist.streams.count() }) + EOL
47 )
48 })
49
50 const undefinedStreams = streams.filter((stream: Stream) => stream.getLanguages().isEmpty())
51 if (undefinedStreams.isEmpty()) return
52
53 const playlist = new Playlist(undefinedStreams, { public: true })
54 const filepath = 'languages/undefined.m3u'
55 await this.storage.save(filepath, playlist.toString())
56 this.logFile.append(
57 JSON.stringify({ type: 'language', filepath, count: playlist.streams.count() }) + EOL
58 )
59 }
60}

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected