Merge pull request #50558 from iptv-org/patch-2026.09.1

Patch 2026.09.1
This commit is contained in:
Pecaquito
2026-09-04 16:52:14 -04:00
committed by GitHub
18 changed files with 9011 additions and 8771 deletions
+22 -9
View File
@@ -22,6 +22,28 @@ body:
validations:
required: true
- type: dropdown
id: live_247
attributes:
label: Live 24/7 (required)
description: Is this stream active 24 hours a day?
options:
- 'Yes'
- 'No'
validations:
required: true
- type: dropdown
id: geo_blocked
attributes:
label: Geo-blocked (required)
description: Is this stream blocked in any country?
options:
- 'No'
- 'Yes'
validations:
required: true
- type: dropdown
id: quality
attributes:
@@ -40,15 +62,6 @@ body:
- 480i
- 360p
- type: dropdown
id: label
attributes:
label: Label
description: Is there any reason why the broadcast may not work?
options:
- 'Not 24/7'
- 'Geo-blocked'
- type: input
id: http_user_agent
attributes:
+18 -10
View File
@@ -25,6 +25,24 @@ body:
description: "ID of the stream consisting of `<channel_id>` or `<channel_id>@<feed_id>`. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request."
placeholder: 'BBCAmerica.us@East'
- type: dropdown
id: live_247
attributes:
label: Live 24/7
description: Is this stream active 24 hours a day?
options:
- 'Yes'
- 'No'
- type: dropdown
id: geo_blocked
attributes:
label: Geo-blocked
description: Is this stream blocked in any country?
options:
- 'No'
- 'Yes'
- type: dropdown
id: quality
attributes:
@@ -43,16 +61,6 @@ body:
- 360p
- '~'
- type: dropdown
id: label
attributes:
label: Label
description: Is there any reason why the broadcast may not work?
options:
- 'Not 24/7'
- 'Geo-blocked'
- '~'
- type: input
id: http_user_agent
attributes:
+8841 -8675
View File
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -113,11 +113,12 @@ async function main() {
streams = streams.sortBy(
[
(stream: Stream) => stream.title,
(stream: Stream) => (stream.isGeoBlocked ? -1 : 0),
(stream: Stream) => (stream.isNot247 ? -1 : 0),
(stream: Stream) => stream.getVerticalResolution(),
(stream: Stream) => stream.label,
(stream: Stream) => stream.url
],
['asc', 'desc', 'asc', 'asc']
['asc', 'desc', 'desc', 'desc', 'asc']
)
logger.info('saving...')
+4 -3
View File
@@ -48,10 +48,11 @@ async function main() {
streams = streams.sortBy(
[
(stream: Stream) => stream.getId(),
(stream: Stream) => stream.getVerticalResolution(),
(stream: Stream) => stream.label
(stream: Stream) => (stream.isGeoBlocked ? -1 : 0),
(stream: Stream) => (stream.isNot247 ? -1 : 0),
(stream: Stream) => stream.getVerticalResolution()
],
['asc', 'desc', 'desc']
['asc', 'desc', 'desc', 'desc']
)
logger.info('filtering streams...')
+6 -6
View File
@@ -109,7 +109,7 @@ async function runTest(stream: Stream) {
stream.statusCode = result.status.code
if (stream.statusCode === 'OK') return
if (errorStatusCodes.includes(stream.statusCode) && !stream.label) {
if (errorStatusCodes.includes(stream.statusCode) && !stream.getLabels().length) {
errors++
} else {
warnings++
@@ -129,7 +129,7 @@ function drawTable() {
{ name: '', alignment: 'center', minLen: 3, maxLen: 3 },
{ name: 'tvg-id', alignment: 'left', color: 'green', minLen: 25, maxLen: 25 },
{ name: 'url', alignment: 'left', color: 'green', minLen: 100, maxLen: 100 },
{ name: 'label', alignment: 'left', color: 'yellow', minLen: 13, maxLen: 13 },
{ name: 'labels', alignment: 'left', color: 'yellow', minLen: 13, maxLen: 13 },
{ name: 'status', alignment: 'left', minLen: 25, maxLen: 25 }
]
})
@@ -138,14 +138,14 @@ function drawTable() {
const tvgId = truncate(stream.getTvgId(), 25)
const url = truncate(stream.url, 100)
const color = getColor(stream)
const label = stream.label || ''
const labels = stream.getLabels().join(';')
const status = stream.statusCode || 'PENDING'
const row = {
'': index,
'tvg-id': chalk[color](tvgId),
url: chalk[color](url),
label: chalk[color](label),
labels: chalk[color](labels),
status: chalk[color](status)
}
table.append(row)
@@ -206,14 +206,14 @@ function getColor(stream: Stream): string {
if (!stream.statusCode) return 'gray'
if (stream.statusCode === 'LOADING...') return 'white'
if (stream.statusCode === 'OK') return 'green'
if (errorStatusCodes.includes(stream.statusCode) && !stream.label) return 'red'
if (errorStatusCodes.includes(stream.statusCode) && !stream.getLabels().length) return 'red'
return 'yellow'
}
function isBroken(stream: Stream): boolean {
if (!stream.statusCode) return false
if (stream.label) return false
if (stream.getLabels().length) return false
if (!errorStatusCodes.includes(stream.statusCode)) return false
return true
+7 -1
View File
@@ -261,9 +261,15 @@ async function addStream(issue: Issue) {
user_agent: httpUserAgent,
referrer: httpReferrer,
quality,
label: data.getString('label') || ''
label: null
})
const live247 = data.getBoolean('live_247')
const geoBlocked = data.getBoolean('geo_blocked')
stream.isNot247 = live247 === undefined ? false : !live247
stream.isGeoBlocked = geoBlocked === true
stream.updateTitle().updateFilepath()
stream.setGuides(apiData.guidesGroupedByStreamId.get(stream.getId()))
+9 -3
View File
@@ -11,7 +11,9 @@ export class DataSet {
}
missing(key: string): boolean {
return this._data.missing(key) || this._data.get(key) === undefined
const keys = Array.isArray(key) ? key : [key]
return keys.every(_key => this._data.get(_key) === undefined)
}
isDeleted(key: string): boolean {
@@ -20,8 +22,12 @@ export class DataSet {
return this._data.get(key) === deleteSymbol
}
getBoolean(key: string): boolean {
return Boolean(this._data.get(key))
getBoolean(key: string): boolean | undefined {
const value = this._data.get(key)
if (value === undefined || value === '') return undefined
return value === 'TRUE'
}
getString(key: string): string | undefined {
+45 -22
View File
@@ -14,6 +14,8 @@ export class Stream extends sdk.Models.Stream {
tvgId?: string
statusCode?: string
guides = new Collection<sdk.Models.Guide>()
isNot247?: boolean
isGeoBlocked?: boolean
setGuides(guides?: sdk.Models.Guide[]) {
this.guides = new Collection(guides)
@@ -48,40 +50,44 @@ export class Stream extends sdk.Models.Stream {
}
}
const data = {
label: dataSet.isDeleted('label') ? '' : dataSet.getString('label'),
quality: dataSet.isDeleted('quality') ? '' : dataSet.getString('quality'),
httpUserAgent: dataSet.isDeleted('http_user_agent')
? ''
: dataSet.getString('http_user_agent'),
httpReferrer: dataSet.isDeleted('http_referrer') ? '' : dataSet.getString('http_referrer')
}
const live247 = dataSet.getBoolean('live_247')
const geoBlocked = dataSet.getBoolean('geo_blocked')
if (data.label !== undefined) this.label = data.label
if (data.quality !== undefined) this.quality = data.quality
if (data.httpUserAgent !== undefined) this.user_agent = data.httpUserAgent
if (data.httpReferrer !== undefined) this.referrer = data.httpReferrer
if (live247 !== undefined) this.isNot247 = !live247
if (geoBlocked !== undefined) this.isGeoBlocked = geoBlocked
const quality = dataSet.isDeleted('quality') ? '' : dataSet.getString('quality')
const httpUserAgent = dataSet.isDeleted('http_user_agent')
? ''
: dataSet.getString('http_user_agent')
const httpReferrer = dataSet.isDeleted('http_referrer')
? ''
: dataSet.getString('http_referrer')
if (quality !== undefined) this.quality = quality
if (httpUserAgent !== undefined) this.user_agent = httpUserAgent
if (httpReferrer !== undefined) this.referrer = httpReferrer
return this
}
static fromPlaylistItem(data: parser.PlaylistItem): Stream {
function escapeRegExp(text) {
function escapeRegExp(text: string) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
}
function parseName(name: string): {
title: string
label: string
labels: string[]
quality: string
} {
let title = name
const [, label] = title.match(/ \[(.*)\]$/) || [null, '']
title = title.replace(new RegExp(` \\[${escapeRegExp(label)}\\]$`), '')
const [, labels] = title.match(/ \[(.*)\]$/) || [null, '']
title = title.replace(new RegExp(` \\[${escapeRegExp(labels)}\\]$`), '')
const [, quality] = title.match(/ \(([0-9]+[pi])\)$/) || [null, '']
title = title.replace(new RegExp(` \\(${quality}\\)$`), '')
return { title, label, quality }
return { title, labels: labels.split(';'), quality }
}
if (!data.name) throw new Error('"name" property is required')
@@ -89,7 +95,7 @@ export class Stream extends sdk.Models.Stream {
const tvgId = data.tvg?.id || ''
const [channelId, feedId] = tvgId.split('@')
const { title, label, quality } = parseName(data.name)
const { title, labels, quality } = parseName(data.name)
const stream = new Stream({
channel: channelId || null,
@@ -99,11 +105,13 @@ export class Stream extends sdk.Models.Stream {
url: data.url,
referrer: data.http?.referrer || null,
user_agent: data.http?.['user-agent'] || null,
label: label || null
label: null
})
stream.tvgId = tvgId
stream.line = data.line
stream.isNot247 = labels.includes('Not 24/7')
stream.isGeoBlocked = labels.includes('Geo-blocked')
return stream
}
@@ -417,13 +425,28 @@ export class Stream extends sdk.Models.Stream {
title += ` (${this.quality})`
}
if (this.label) {
title += ` [${this.label}]`
const labels = this.getLabels()
if (labels.length) {
title += ` [${labels.join(';')}]`
}
return title
}
getLabels(): string[] {
const labels: string[] = []
if (this.isNot247 === true) {
labels.push('Not 24/7')
}
if (this.isGeoBlocked === true) {
labels.push('Geo-blocked')
}
return labels
}
toString(options: { public?: boolean } = {}) {
options = { ...{ public: false }, ...options }
@@ -471,7 +494,7 @@ export class Stream extends sdk.Models.Stream {
title: this.title,
url: this.url,
quality: this.quality,
label: this.label,
labels: this.getLabels(),
user_agent: this.user_agent,
referrer: this.referrer
}
+12 -2
View File
@@ -234,7 +234,8 @@ export function parseIssueBody(body: string): DataSet {
'Channel ID': 'channel_id',
'Feed ID': 'feed_id',
'Stream URL': 'stream_url',
Label: 'label',
'Live 24/7': 'live_247',
'Geo-blocked': 'geo_blocked',
Quality: 'quality',
'HTTP User-Agent': 'http_user_agent',
'HTTP User Agent': 'http_user_agent',
@@ -257,7 +258,16 @@ export function parseIssueBody(body: string): DataSet {
if (!_label || !_value) return data
const id = FIELDS.get(_label)
const value: string = _value === '_No response_' || _value === 'None' ? '' : _value
let value: string = ''
if (_value === '_No response_' || _value === 'None') {
value = ''
} else if (_value === 'Yes') {
value = 'TRUE'
} else if (_value === 'No') {
value = 'FALSE'
} else {
value = _value
}
if (!id) return
@@ -1,25 +1,25 @@
[
{
"channel": null,
"feed": null,
"title": "Daawah TV",
{
"channel": null,
"feed": null,
"title": "Daawah TV",
"url": "http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8",
"referrer": null,
"user_agent": null,
"quality": null,
"label": null
},
{
"channel": null,
"feed": null,
"title": "Example (720|)",
"url": "https://example.com/live.m3u8",
"referrer": null,
"user_agent": null,
"quality": null,
"label": null
},
{
"quality": null,
"labels": []
},
{
"channel": null,
"feed": null,
"title": "Example (720|)",
"url": "https://example.com/live.m3u8",
"referrer": null,
"user_agent": null,
"quality": null,
"labels": []
},
{
"channel": null,
"feed": null,
"title": "Andorra TV",
@@ -27,7 +27,7 @@
"referrer": "http://imn.iq",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
"quality": "720p",
"label": "Not 24/7"
"labels": ["Not 24/7"]
},
{
"channel": "AndorraTV.ad",
@@ -37,7 +37,7 @@
"referrer": null,
"user_agent": null,
"quality": null,
"label": null
"labels": []
},
{
"channel": "BBCNews.uk",
@@ -47,7 +47,7 @@
"referrer": null,
"user_agent": null,
"quality": null,
"label": null
"labels": []
},
{
"channel": "LDPRTV.ru",
@@ -57,7 +57,7 @@
"referrer": null,
"user_agent": null,
"quality": "1080p",
"label": null
"labels": []
},
{
"channel": "MeteoMedia.ca",
@@ -67,7 +67,7 @@
"referrer": null,
"user_agent": null,
"quality": null,
"label": null
"labels": []
},
{
"channel": "VisitXTV.nl",
@@ -77,7 +77,7 @@
"referrer": null,
"user_agent": null,
"quality": null,
"label": null
"labels": []
},
{
"channel": "Zoo.ad",
@@ -87,6 +87,6 @@
"referrer": null,
"user_agent": null,
"quality": "720p",
"label": null
"labels": []
}
]
]
@@ -1,5 +1,5 @@
#EXTM3U
#EXTINF:-1 tvg-id="",Manorama News -2 (1080p) [U3] (Alt) [Geo-blocked] [Not 24/7]
#EXTINF:-1 tvg-id="",Manorama News -2 (1080p)
#EXTVLCOPT:http-referrer=http://test.com
#EXTVLCOPT:http-user-agent=Mozilla/5.0
https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8
@@ -1,10 +1,10 @@
#EXTM3U x-tvg-url="https://example.com/guide.xml.gz"
#EXTINF:-1 tvg-id="NPO1.nl@SD",NPO 1 (342p) [Geo-blocked]
http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo1/npo1.isml/.m3u8
#EXTINF:-1 tvg-id="NPO2.nl@SD",NPO 2 (1080p) [Geo-blocked]
http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo22.isml/.m3u8
#EXTINF:-1 tvg-id="NPO2.nl@SD",NPO 2 (342p)
http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo2.isml/.m3u8
#EXTINF:-1 tvg-id="NPO2.nl@SD",NPO 2 (1080p) [Geo-blocked]
http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo22.isml/.m3u8
#EXTINF:-1 tvg-id="NPO2.nl@SD",NPO 2 (302p) [Geo-blocked]
#EXTVLCOPT:http-referrer=http://imn.iq
#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
@@ -1,5 +1,5 @@
#EXTM3U x-tvg-url="https://example.com/guide.xml.gz"
#EXTINF:-1 tvg-id="TFX.fr@SD",TFX
#EXTINF:-1 tvg-id="TFX.fr@SD",TFX [Not 24/7;Geo-blocked]
#EXTVLCOPT:http-referrer=https://pkpakiplay.xyz/
#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1
srt://stream.alabbassia.com:8890?mode=caller&latency=200&streamid=read:live/alabbassia
@@ -3,7 +3,7 @@
http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8
#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked]
http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8
#EXTINF:-1 tvg-id="",Fox Sports (720p)
#EXTINF:-1 tvg-id="",Fox Sports (720p) [Not 24/7;Geo-blocked]
https://jmp2.uk/plu-5a74b8e1e22a61737979c6bf.m3u8
#EXTINF:-1 tvg-id="BeanoTV.uk@SD",Beano TV (1080p)
https://a5b4bacecd47433dad06d3189fc7422e.mediatailor.us-east-1.amazonaws.com/v1/manifest/04fd913bb278d8775298c26fdca9d9841f37601f/RakutenTV-eu_BeanoTV/b1f233d5-847c-437d-aa4f-f73e67a85323/2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz"
+4 -4
View File
@@ -538,7 +538,7 @@ module.exports = [
closed_at: null,
author_association: 'COLLABORATOR',
active_lock_reason: null,
body: '### Stream ID\n\nTFX.fr\n\n### Stream URL\n\nsrt://stream.alabbassia.com:8890?mode=caller&latency=200&streamid=read:live/alabbassia\n\n### Label\n\nNone\n\n### HTTP User Agent\n\nMozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1\n\n### HTTP Referrer\n\nhttps://pkpakiplay.xyz/\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv-org.github.io/issues/1381\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
body: '### Stream ID\n\nTFX.fr\n\n### Stream URL\n\nsrt://stream.alabbassia.com:8890?mode=caller&latency=200&streamid=read:live/alabbassia\n\n### Live 24/7\n\nNo\n\n### Geo-blocked\n\nYes\n\n### HTTP User Agent\n\nMozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1\n\n### HTTP Referrer\n\nhttps://pkpakiplay.xyz/\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv-org.github.io/issues/1381\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
reactions: {
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/reactions',
total_count: 0,
@@ -1761,7 +1761,7 @@ module.exports = [
closed_at: null,
author_association: 'COLLABORATOR',
active_lock_reason: null,
body: '### Stream URL (required)\n\nhttps://servilive.com:3126/live/tele2000live.m3u8\n\n### New Stream URL\n\nhttps://xui-backend.energeek.cl/live/9/playlist.m3u8?username=ZZDemoIPTVGH&password=mdo96EuqMkTR|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz"\n\n### Stream ID\n\nBBCAmerica.us@East\n\n### Quality\n\n720p\n\n### Label\n\n~\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n~\n\n### Directives (optional)\r\n\r\n#EXTVLCOPT:http-referrer=http://imn.iq\r\n\r\n#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148\r\n\r\n#KODIPROP:inputstream=inputstream.adaptive\r\n\r\n#KODIPROP:inputstream.adaptive.manifest_type=mpd\r\n\r\n#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha\r\n\r\n#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}|\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
body: '### Stream URL (required)\n\nhttps://servilive.com:3126/live/tele2000live.m3u8\n\n### New Stream URL\n\nhttps://xui-backend.energeek.cl/live/9/playlist.m3u8?username=ZZDemoIPTVGH&password=mdo96EuqMkTR|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz"\n\n### Stream ID\n\nBBCAmerica.us@East\n\n### Quality\n\n720p\n\n### Live 24/7\n\nYes\n\n### Label\n\n~\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n~\n\n### Directives (optional)\r\n\r\n#EXTVLCOPT:http-referrer=http://imn.iq\r\n\r\n#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148\r\n\r\n#KODIPROP:inputstream=inputstream.adaptive\r\n\r\n#KODIPROP:inputstream.adaptive.manifest_type=mpd\r\n\r\n#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha\r\n\r\n#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}|\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
reactions: {
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/reactions',
total_count: 0,
@@ -1840,7 +1840,7 @@ module.exports = [
closed_at: null,
author_association: 'COLLABORATOR',
active_lock_reason: null,
body: '### Stream URL\n\nhttps://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8\n\n### Stream ID\n\n_No response_\n\n### Quality\n\nNone\n\n### Label\n\nNone\n\n### HTTP User-Agent\n\n_No response_\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
body: '### Stream URL\n\nhttps://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8\n\n### Stream ID\n\n_No response_\n\n### Quality\n\nNone\n\n### Label\n\nNone\n\n### Live 24/7\n\nNone\n\n### Geo-blocked\n\nNone\n\n### HTTP User-Agent\n\n_No response_\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
reactions: {
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14121/reactions',
total_count: 0,
@@ -2535,7 +2535,7 @@ module.exports = [
closed_at: null,
author_association: 'COLLABORATOR',
active_lock_reason: null,
body: '### Stream URL\n\nhttps://jmp2.uk/plu-5a74b8e1e22a61737979c6bf.m3u8\n\n### Stream ID\n\n~\n\n### Quality\n\n720p\n\n### Label\n\nNone\n\n### HTTP User-Agent\n\nNone\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
body: '### Stream URL\n\nhttps://jmp2.uk/plu-5a74b8e1e22a61737979c6bf.m3u8\n\n### Stream ID\n\n~\n\n### Quality\n\n720p\n\n### Live 24/7\n\nNone\n\n### Geo-blocked\n\nNone\n\n### HTTP User-Agent\n\nNone\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)',
reactions: {
url: 'https://api.github.com/repos/iptv-org/iptv/issues/39097/reactions',
total_count: 0,
@@ -3,5 +3,5 @@
http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8
#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked]
http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8
#EXTINF:-1 tvg-id="FoxSports.uk",Fox Sports
#EXTINF:-1 tvg-id="FoxSports.uk",Fox Sports [Not 24/7;Geo-blocked]
https://jmp2.uk/plu-5a74b8e1e22a61737979c6bf.m3u8
+8 -2
View File
@@ -10,7 +10,8 @@ describe('report:create', () => {
if (process.env.DEBUG === 'true') console.log(cmd, stdout)
expect(
stdout.includes(`
normalize(stdout).includes(
normalize(`
┌─────────┬─────────────┬──────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────┬──────────────────────┐
│ (index) │ issueNumber │ type │ streamId │ streamUrl │ status │
├─────────┼─────────────┼──────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────────────────┤
@@ -26,7 +27,12 @@ describe('report:create', () => {
│ 9 │ 20956 │ 'channel search' │ 'IONTV.us' │ undefined │ 'fulfilled' │
│ 10 │ 25157 │ 'streams:add' │ 'OnTimeSports.eg@SD' │ 'OnTime Sports SD.mu38' │ 'invalid_stream_url' │
│ 11 │ 39097 │ 'streams:edit' │ '~' │ 'https://jmp2.uk/plu-5a74b8e1e22a61737979c6bf.m3u8' │ 'nonexistent_link' │
└─────────┴─────────────┴──────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────────────┘`)
└─────────┴─────────────┴──────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────────────┘`).trim()
)
).toBe(true)
})
})
function normalize(text: string) {
return text.replace(/\r\n/g, '\n')
}