diff --git a/scripts/commands/playlist/update.ts b/scripts/commands/playlist/update.ts index 50cad5dde..439371473 100644 --- a/scripts/commands/playlist/update.ts +++ b/scripts/commands/playlist/update.ts @@ -32,7 +32,7 @@ async function main() { const files = await streamsStorage.list('**/*.m3u') const streams = await parser.parse(files) - logger.info('removing broken streams...') + logger.info('removing streams...') await removeStreams({ streams, issues }) logger.info('edit stream description...') @@ -73,12 +73,12 @@ async function removeStreams({ streams, issues }: { streams: Collection; issues: ) requests.forEach((issue: Issue) => { const data = issue.data - if (data.missing('brokenLinks')) return + if (data.missing('streamUrl')) return - const brokenLinks = data.getString('brokenLinks') || '' + const streamUrls = data.getString('streamUrl') || '' let changed = false - brokenLinks + streamUrls .split(/\r?\n/) .filter(Boolean) .forEach(link => { @@ -131,15 +131,7 @@ async function editStreams({ .updateFilepath() } - const label = data.getString('label') || '' - const quality = data.getString('quality') || '' - const httpUserAgent = data.getString('httpUserAgent') || '' - const httpReferrer = data.getString('httpReferrer') || '' - - if (data.has('label')) stream.setLabel(label) - if (data.has('quality')) stream.setQuality(quality) - if (data.has('httpUserAgent')) stream.setUserAgent(httpUserAgent) - if (data.has('httpReferrer')) stream.setReferrer(httpReferrer) + stream.update(data) processedIssues.add(issue.number) }) diff --git a/scripts/commands/report/create.ts b/scripts/commands/report/create.ts index 4ad272de3..5841858d9 100644 --- a/scripts/commands/report/create.ts +++ b/scripts/commands/report/create.ts @@ -37,17 +37,17 @@ async function main() { const streamsGroupedByChannelId = streams.groupBy((stream: Stream) => stream.channelId) const streamsGroupedById = streams.groupBy((stream: Stream) => stream.getId()) - logger.info('checking broken streams reports...') - const brokenStreamReports = issues.filter(issue => - issue.labels.find((label: string) => label === 'broken stream') + logger.info('checking streams:remove requests...') + const removeRequests = issues.filter(issue => + issue.labels.find((label: string) => label === 'streams:remove') ) - brokenStreamReports.forEach((issue: Issue) => { - const brokenLinks = issue.data.getArray('brokenLinks') || [] + removeRequests.forEach((issue: Issue) => { + const streamUrls = issue.data.getArray('streamUrl') || [] - if (!brokenLinks.length) { + if (!streamUrls.length) { const result = { issueNumber: issue.number, - type: 'broken stream', + type: 'streams:remove', streamId: undefined, streamUrl: undefined, status: 'missing_link' @@ -55,10 +55,10 @@ async function main() { report.add(result) } else { - for (const streamUrl of brokenLinks) { + for (const streamUrl of streamUrls) { const result = { issueNumber: issue.number, - type: 'broken stream', + type: 'streams:remove', streamId: undefined, streamUrl: truncate(streamUrl), status: 'pending' diff --git a/scripts/core/dataProcessor.ts b/scripts/core/dataProcessor.ts index 3290fe5b3..2ea8d2868 100644 --- a/scripts/core/dataProcessor.ts +++ b/scripts/core/dataProcessor.ts @@ -68,7 +68,7 @@ export class DataProcessor { ) const channelsKeyById = channels.keyBy((channel: Channel) => channel.id) - let feeds = new Collection(data.feeds).map(data => + const feeds = new Collection(data.feeds).map(data => new Feed(data) .withChannel(channelsKeyById) .withLanguages(languagesKeyByCode) diff --git a/scripts/core/issueParser.ts b/scripts/core/issueParser.ts index 61e61c6d9..d1874ce33 100644 --- a/scripts/core/issueParser.ts +++ b/scripts/core/issueParser.ts @@ -7,8 +7,7 @@ const FIELDS = new Dictionary({ 'Channel ID': 'channelId', 'Feed ID': 'feedId', 'Stream URL': 'streamUrl', - 'Broken Link': 'brokenLinks', - 'Broken Links': 'brokenLinks', + 'New Stream URL': 'newStreamUrl', Label: 'label', Quality: 'quality', 'Channel Name': 'channelName', diff --git a/scripts/generators/categoriesGenerator.ts b/scripts/generators/categoriesGenerator.ts index f6d455d4b..4752dec64 100644 --- a/scripts/generators/categoriesGenerator.ts +++ b/scripts/generators/categoriesGenerator.ts @@ -1,4 +1,4 @@ -import { Collection, Storage, Logger, File } from '@freearhey/core' +import { Collection, Storage, File } from '@freearhey/core' import { Stream, Category, Playlist } from '../models' import { PUBLIC_DIR } from '../constants' import { Generator } from './generator' diff --git a/scripts/models/feed.ts b/scripts/models/feed.ts index 2b1fa9d34..8407695e6 100644 --- a/scripts/models/feed.ts +++ b/scripts/models/feed.ts @@ -1,5 +1,5 @@ -import { Collection, Dictionary } from '@freearhey/core' import { Country, Language, Region, Channel, Subdivision } from './index' +import { Collection, Dictionary } from '@freearhey/core' import type { FeedData } from '../types/feed' export class Feed { @@ -106,7 +106,7 @@ export class Feed { regionsKeyByCode: Dictionary, subdivisionsKeyByCode: Dictionary ): this { - let broadcastCountries = new Collection() + const broadcastCountries = new Collection() if (this.isInternational()) { this.broadcastCountries = broadcastCountries diff --git a/scripts/models/stream.ts b/scripts/models/stream.ts index 443a249b9..692bd303b 100644 --- a/scripts/models/stream.ts +++ b/scripts/models/stream.ts @@ -2,6 +2,7 @@ import { Feed, Channel, Category, Region, Subdivision, Country, Language } from import { URL, Collection, Dictionary } from '@freearhey/core' import type { StreamData } from '../types/stream' import parser from 'iptv-playlist-parser' +import { IssueData } from '../core' export class Stream { name?: string @@ -39,6 +40,24 @@ export class Stream { this.label = data.label || undefined } + update(issueData: IssueData): this { + const data = { + label: issueData.getString('label'), + quality: issueData.getString('quality'), + httpUserAgent: issueData.getString('httpUserAgent'), + httpReferrer: issueData.getString('httpReferrer'), + newStreamUrl: issueData.getString('newStreamUrl') + } + + if (data.label !== undefined) this.label = data.label + if (data.quality !== undefined) this.setQuality(data.quality) + if (data.httpUserAgent !== undefined) this.userAgent = data.httpUserAgent + if (data.httpReferrer !== undefined) this.referrer = data.httpReferrer + if (data.newStreamUrl !== undefined) this.url = data.newStreamUrl + + return this + } + fromPlaylistItem(data: parser.PlaylistItem): this { if (!data.name) throw new Error('"name" property is required') if (!data.url) throw new Error('"url" property is required') @@ -98,12 +117,6 @@ export class Stream { return this } - setLabel(label: string): this { - this.label = label - - return this - } - setQuality(quality: string): this { const { verticalResolution, isInterlaced } = parseQuality(quality) @@ -113,18 +126,6 @@ export class Stream { return this } - setUserAgent(userAgent: string): this { - this.userAgent = userAgent - - return this - } - - setReferrer(referrer: string): this { - this.referrer = referrer - - return this - } - getLine(): number { return this.line || -1 } @@ -387,7 +388,7 @@ function parseQuality(quality: string | null): { isInterlaced: boolean | null } { if (!quality) return { verticalResolution: null, isInterlaced: null } - let [, verticalResolutionString] = quality.match(/^(\d+)/) || [null, undefined] + const [, verticalResolutionString] = quality.match(/^(\d+)/) || [null, undefined] const isInterlaced = /i$/i.test(quality) let verticalResolution = 0 if (verticalResolutionString) verticalResolution = parseInt(verticalResolutionString)