Merge branch 'master' into patch-2026.09.1

Resolved conflict in scripts/models/stream.ts: kept the branch's
labels/isNot247/isGeoBlocked handling in fromPlaylistItem while adopting
master's optional-chaining guards for data.tvg / data.http.
This commit is contained in:
Sanaei
2026-09-04 18:01:12 +02:00
17 changed files with 276 additions and 226 deletions
+5 -4
View File
@@ -93,7 +93,8 @@ export class Stream extends sdk.Models.Stream {
if (!data.name) throw new Error('"name" property is required')
if (!data.url) throw new Error('"url" property is required')
const [channelId, feedId] = data.tvg.id.split('@')
const tvgId = data.tvg?.id || ''
const [channelId, feedId] = tvgId.split('@')
const { title, labels, quality } = parseName(data.name)
const stream = new Stream({
@@ -102,12 +103,12 @@ export class Stream extends sdk.Models.Stream {
title: title,
quality: quality || null,
url: data.url,
referrer: data.http.referrer || null,
user_agent: data.http['user-agent'] || null,
referrer: data.http?.referrer || null,
user_agent: data.http?.['user-agent'] || null,
label: null
})
stream.tvgId = data.tvg.id
stream.tvgId = tvgId
stream.line = data.line
stream.isNot247 = labels.includes('Not 24/7')
stream.isGeoBlocked = labels.includes('Geo-blocked')
+11 -2
View File
@@ -39,9 +39,18 @@ export function isURI(string: string): boolean {
}
export function normalizeURL(url: string): string {
const normalized = normalizeUrl(url, { stripWWW: false })
let normalized: string
try {
normalized = normalizeUrl(url, { stripWWW: false })
} catch {
return url.replace(/\s/g, '+')
}
return decodeURIComponent(normalized).replace(/\s/g, '+').toString()
try {
return decodeURIComponent(normalized).replace(/\s/g, '+')
} catch {
return normalized.replace(/\s/g, '+')
}
}
export function truncate(string: string, limit: number = 100) {