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: validations:
required: true 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 - type: dropdown
id: quality id: quality
attributes: attributes:
@@ -40,15 +62,6 @@ body:
- 480i - 480i
- 360p - 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 - type: input
id: http_user_agent id: http_user_agent
attributes: 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." 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' 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 - type: dropdown
id: quality id: quality
attributes: attributes:
@@ -43,16 +61,6 @@ body:
- 360p - 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 - type: input
id: http_user_agent id: http_user_agent
attributes: attributes:
+2620 -2454
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( streams = streams.sortBy(
[ [
(stream: Stream) => stream.title, (stream: Stream) => stream.title,
(stream: Stream) => (stream.isGeoBlocked ? -1 : 0),
(stream: Stream) => (stream.isNot247 ? -1 : 0),
(stream: Stream) => stream.getVerticalResolution(), (stream: Stream) => stream.getVerticalResolution(),
(stream: Stream) => stream.label,
(stream: Stream) => stream.url (stream: Stream) => stream.url
], ],
['asc', 'desc', 'asc', 'asc'] ['asc', 'desc', 'desc', 'desc', 'asc']
) )
logger.info('saving...') logger.info('saving...')
+4 -3
View File
@@ -48,10 +48,11 @@ async function main() {
streams = streams.sortBy( streams = streams.sortBy(
[ [
(stream: Stream) => stream.getId(), (stream: Stream) => stream.getId(),
(stream: Stream) => stream.getVerticalResolution(), (stream: Stream) => (stream.isGeoBlocked ? -1 : 0),
(stream: Stream) => stream.label (stream: Stream) => (stream.isNot247 ? -1 : 0),
(stream: Stream) => stream.getVerticalResolution()
], ],
['asc', 'desc', 'desc'] ['asc', 'desc', 'desc', 'desc']
) )
logger.info('filtering streams...') logger.info('filtering streams...')
+6 -6
View File
@@ -109,7 +109,7 @@ async function runTest(stream: Stream) {
stream.statusCode = result.status.code stream.statusCode = result.status.code
if (stream.statusCode === 'OK') return if (stream.statusCode === 'OK') return
if (errorStatusCodes.includes(stream.statusCode) && !stream.label) { if (errorStatusCodes.includes(stream.statusCode) && !stream.getLabels().length) {
errors++ errors++
} else { } else {
warnings++ warnings++
@@ -129,7 +129,7 @@ function drawTable() {
{ name: '', alignment: 'center', minLen: 3, maxLen: 3 }, { name: '', alignment: 'center', minLen: 3, maxLen: 3 },
{ name: 'tvg-id', alignment: 'left', color: 'green', minLen: 25, maxLen: 25 }, { name: 'tvg-id', alignment: 'left', color: 'green', minLen: 25, maxLen: 25 },
{ name: 'url', alignment: 'left', color: 'green', minLen: 100, maxLen: 100 }, { 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 } { name: 'status', alignment: 'left', minLen: 25, maxLen: 25 }
] ]
}) })
@@ -138,14 +138,14 @@ function drawTable() {
const tvgId = truncate(stream.getTvgId(), 25) const tvgId = truncate(stream.getTvgId(), 25)
const url = truncate(stream.url, 100) const url = truncate(stream.url, 100)
const color = getColor(stream) const color = getColor(stream)
const label = stream.label || '' const labels = stream.getLabels().join(';')
const status = stream.statusCode || 'PENDING' const status = stream.statusCode || 'PENDING'
const row = { const row = {
'': index, '': index,
'tvg-id': chalk[color](tvgId), 'tvg-id': chalk[color](tvgId),
url: chalk[color](url), url: chalk[color](url),
label: chalk[color](label), labels: chalk[color](labels),
status: chalk[color](status) status: chalk[color](status)
} }
table.append(row) table.append(row)
@@ -206,14 +206,14 @@ function getColor(stream: Stream): string {
if (!stream.statusCode) return 'gray' if (!stream.statusCode) return 'gray'
if (stream.statusCode === 'LOADING...') return 'white' if (stream.statusCode === 'LOADING...') return 'white'
if (stream.statusCode === 'OK') return 'green' 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' return 'yellow'
} }
function isBroken(stream: Stream): boolean { function isBroken(stream: Stream): boolean {
if (!stream.statusCode) return false if (!stream.statusCode) return false
if (stream.label) return false if (stream.getLabels().length) return false
if (!errorStatusCodes.includes(stream.statusCode)) return false if (!errorStatusCodes.includes(stream.statusCode)) return false
return true return true
+7 -1
View File
@@ -261,9 +261,15 @@ async function addStream(issue: Issue) {
user_agent: httpUserAgent, user_agent: httpUserAgent,
referrer: httpReferrer, referrer: httpReferrer,
quality, 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.updateTitle().updateFilepath()
stream.setGuides(apiData.guidesGroupedByStreamId.get(stream.getId())) stream.setGuides(apiData.guidesGroupedByStreamId.get(stream.getId()))
+9 -3
View File
@@ -11,7 +11,9 @@ export class DataSet {
} }
missing(key: string): boolean { 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 { isDeleted(key: string): boolean {
@@ -20,8 +22,12 @@ export class DataSet {
return this._data.get(key) === deleteSymbol return this._data.get(key) === deleteSymbol
} }
getBoolean(key: string): boolean { getBoolean(key: string): boolean | undefined {
return Boolean(this._data.get(key)) const value = this._data.get(key)
if (value === undefined || value === '') return undefined
return value === 'TRUE'
} }
getString(key: string): string | undefined { getString(key: string): string | undefined {
+45 -22
View File
@@ -14,6 +14,8 @@ export class Stream extends sdk.Models.Stream {
tvgId?: string tvgId?: string
statusCode?: string statusCode?: string
guides = new Collection<sdk.Models.Guide>() guides = new Collection<sdk.Models.Guide>()
isNot247?: boolean
isGeoBlocked?: boolean
setGuides(guides?: sdk.Models.Guide[]) { setGuides(guides?: sdk.Models.Guide[]) {
this.guides = new Collection(guides) this.guides = new Collection(guides)
@@ -48,40 +50,44 @@ export class Stream extends sdk.Models.Stream {
} }
} }
const data = { const live247 = dataSet.getBoolean('live_247')
label: dataSet.isDeleted('label') ? '' : dataSet.getString('label'), const geoBlocked = dataSet.getBoolean('geo_blocked')
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')
}
if (data.label !== undefined) this.label = data.label if (live247 !== undefined) this.isNot247 = !live247
if (data.quality !== undefined) this.quality = data.quality if (geoBlocked !== undefined) this.isGeoBlocked = geoBlocked
if (data.httpUserAgent !== undefined) this.user_agent = data.httpUserAgent
if (data.httpReferrer !== undefined) this.referrer = data.httpReferrer 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 return this
} }
static fromPlaylistItem(data: parser.PlaylistItem): Stream { static fromPlaylistItem(data: parser.PlaylistItem): Stream {
function escapeRegExp(text) { function escapeRegExp(text: string) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
} }
function parseName(name: string): { function parseName(name: string): {
title: string title: string
label: string labels: string[]
quality: string quality: string
} { } {
let title = name let title = name
const [, label] = title.match(/ \[(.*)\]$/) || [null, ''] const [, labels] = title.match(/ \[(.*)\]$/) || [null, '']
title = title.replace(new RegExp(` \\[${escapeRegExp(label)}\\]$`), '') title = title.replace(new RegExp(` \\[${escapeRegExp(labels)}\\]$`), '')
const [, quality] = title.match(/ \(([0-9]+[pi])\)$/) || [null, ''] const [, quality] = title.match(/ \(([0-9]+[pi])\)$/) || [null, '']
title = title.replace(new RegExp(` \\(${quality}\\)$`), '') 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') 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 tvgId = data.tvg?.id || ''
const [channelId, feedId] = tvgId.split('@') const [channelId, feedId] = tvgId.split('@')
const { title, label, quality } = parseName(data.name) const { title, labels, quality } = parseName(data.name)
const stream = new Stream({ const stream = new Stream({
channel: channelId || null, channel: channelId || null,
@@ -99,11 +105,13 @@ export class Stream extends sdk.Models.Stream {
url: data.url, url: data.url,
referrer: data.http?.referrer || null, referrer: data.http?.referrer || null,
user_agent: data.http?.['user-agent'] || null, user_agent: data.http?.['user-agent'] || null,
label: label || null label: null
}) })
stream.tvgId = tvgId stream.tvgId = tvgId
stream.line = data.line stream.line = data.line
stream.isNot247 = labels.includes('Not 24/7')
stream.isGeoBlocked = labels.includes('Geo-blocked')
return stream return stream
} }
@@ -417,13 +425,28 @@ export class Stream extends sdk.Models.Stream {
title += ` (${this.quality})` title += ` (${this.quality})`
} }
if (this.label) { const labels = this.getLabels()
title += ` [${this.label}]`
if (labels.length) {
title += ` [${labels.join(';')}]`
} }
return title 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 } = {}) { toString(options: { public?: boolean } = {}) {
options = { ...{ public: false }, ...options } options = { ...{ public: false }, ...options }
@@ -471,7 +494,7 @@ export class Stream extends sdk.Models.Stream {
title: this.title, title: this.title,
url: this.url, url: this.url,
quality: this.quality, quality: this.quality,
label: this.label, labels: this.getLabels(),
user_agent: this.user_agent, user_agent: this.user_agent,
referrer: this.referrer referrer: this.referrer
} }
+12 -2
View File
@@ -234,7 +234,8 @@ export function parseIssueBody(body: string): DataSet {
'Channel ID': 'channel_id', 'Channel ID': 'channel_id',
'Feed ID': 'feed_id', 'Feed ID': 'feed_id',
'Stream URL': 'stream_url', 'Stream URL': 'stream_url',
Label: 'label', 'Live 24/7': 'live_247',
'Geo-blocked': 'geo_blocked',
Quality: 'quality', Quality: 'quality',
'HTTP User-Agent': 'http_user_agent', 'HTTP User-Agent': 'http_user_agent',
'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 if (!_label || !_value) return data
const id = FIELDS.get(_label) 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 if (!id) return
@@ -7,7 +7,7 @@
"referrer": null, "referrer": null,
"user_agent": null, "user_agent": null,
"quality": null, "quality": null,
"label": null "labels": []
}, },
{ {
"channel": null, "channel": null,
@@ -17,7 +17,7 @@
"referrer": null, "referrer": null,
"user_agent": null, "user_agent": null,
"quality": null, "quality": null,
"label": null "labels": []
}, },
{ {
"channel": null, "channel": null,
@@ -27,7 +27,7 @@
"referrer": "http://imn.iq", "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", "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", "quality": "720p",
"label": "Not 24/7" "labels": ["Not 24/7"]
}, },
{ {
"channel": "AndorraTV.ad", "channel": "AndorraTV.ad",
@@ -37,7 +37,7 @@
"referrer": null, "referrer": null,
"user_agent": null, "user_agent": null,
"quality": null, "quality": null,
"label": null "labels": []
}, },
{ {
"channel": "BBCNews.uk", "channel": "BBCNews.uk",
@@ -47,7 +47,7 @@
"referrer": null, "referrer": null,
"user_agent": null, "user_agent": null,
"quality": null, "quality": null,
"label": null "labels": []
}, },
{ {
"channel": "LDPRTV.ru", "channel": "LDPRTV.ru",
@@ -57,7 +57,7 @@
"referrer": null, "referrer": null,
"user_agent": null, "user_agent": null,
"quality": "1080p", "quality": "1080p",
"label": null "labels": []
}, },
{ {
"channel": "MeteoMedia.ca", "channel": "MeteoMedia.ca",
@@ -67,7 +67,7 @@
"referrer": null, "referrer": null,
"user_agent": null, "user_agent": null,
"quality": null, "quality": null,
"label": null "labels": []
}, },
{ {
"channel": "VisitXTV.nl", "channel": "VisitXTV.nl",
@@ -77,7 +77,7 @@
"referrer": null, "referrer": null,
"user_agent": null, "user_agent": null,
"quality": null, "quality": null,
"label": null "labels": []
}, },
{ {
"channel": "Zoo.ad", "channel": "Zoo.ad",
@@ -87,6 +87,6 @@
"referrer": null, "referrer": null,
"user_agent": null, "user_agent": null,
"quality": "720p", "quality": "720p",
"label": null "labels": []
} }
] ]
@@ -1,5 +1,5 @@
#EXTM3U #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-referrer=http://test.com
#EXTVLCOPT:http-user-agent=Mozilla/5.0 #EXTVLCOPT:http-user-agent=Mozilla/5.0
https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8 https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8
@@ -1,10 +1,10 @@
#EXTM3U x-tvg-url="https://example.com/guide.xml.gz" #EXTM3U x-tvg-url="https://example.com/guide.xml.gz"
#EXTINF:-1 tvg-id="NPO1.nl@SD",NPO 1 (342p) [Geo-blocked] #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 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) #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 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] #EXTINF:-1 tvg-id="NPO2.nl@SD",NPO 2 (302p) [Geo-blocked]
#EXTVLCOPT:http-referrer=http://imn.iq #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 #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" #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-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 #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 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 http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8
#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked] #EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked]
http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8 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 https://jmp2.uk/plu-5a74b8e1e22a61737979c6bf.m3u8
#EXTINF:-1 tvg-id="BeanoTV.uk@SD",Beano TV (1080p) #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" 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, closed_at: null,
author_association: 'COLLABORATOR', author_association: 'COLLABORATOR',
active_lock_reason: null, 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: { reactions: {
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/reactions', url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/reactions',
total_count: 0, total_count: 0,
@@ -1761,7 +1761,7 @@ module.exports = [
closed_at: null, closed_at: null,
author_association: 'COLLABORATOR', author_association: 'COLLABORATOR',
active_lock_reason: null, 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: { reactions: {
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/reactions', url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/reactions',
total_count: 0, total_count: 0,
@@ -1840,7 +1840,7 @@ module.exports = [
closed_at: null, closed_at: null,
author_association: 'COLLABORATOR', author_association: 'COLLABORATOR',
active_lock_reason: null, 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: { reactions: {
url: 'https://api.github.com/repos/iptv-org/iptv/issues/14121/reactions', url: 'https://api.github.com/repos/iptv-org/iptv/issues/14121/reactions',
total_count: 0, total_count: 0,
@@ -2535,7 +2535,7 @@ module.exports = [
closed_at: null, closed_at: null,
author_association: 'COLLABORATOR', author_association: 'COLLABORATOR',
active_lock_reason: null, 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: { reactions: {
url: 'https://api.github.com/repos/iptv-org/iptv/issues/39097/reactions', url: 'https://api.github.com/repos/iptv-org/iptv/issues/39097/reactions',
total_count: 0, total_count: 0,
@@ -3,5 +3,5 @@
http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8
#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked] #EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked]
http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8 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 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) if (process.env.DEBUG === 'true') console.log(cmd, stdout)
expect( expect(
stdout.includes(` normalize(stdout).includes(
normalize(`
(index) issueNumber type streamId streamUrl status (index) issueNumber type streamId streamUrl status
@@ -26,7 +27,12 @@ describe('report:create', () => {
9 20956 'channel search' 'IONTV.us' undefined 'fulfilled' 9 20956 'channel search' 'IONTV.us' undefined 'fulfilled'
10 25157 'streams:add' 'OnTimeSports.eg@SD' 'OnTime Sports SD.mu38' 'invalid_stream_url' 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' 11 39097 'streams:edit' '~' 'https://jmp2.uk/plu-5a74b8e1e22a61737979c6bf.m3u8' 'nonexistent_link'
`) `).trim()
)
).toBe(true) ).toBe(true)
}) })
}) })
function normalize(text: string) {
return text.replace(/\r\n/g, '\n')
}