mirror of
https://github.com/iptv-org/iptv
synced 2026-09-06 03:50:47 -04:00
Merge pull request #50558 from iptv-org/patch-2026.09.1
Patch 2026.09.1
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Generated
+2621
-2455
File diff suppressed because it is too large
Load Diff
@@ -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...')
|
||||
|
||||
@@ -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...')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()))
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"referrer": null,
|
||||
"user_agent": null,
|
||||
"quality": null,
|
||||
"label": null
|
||||
"labels": []
|
||||
},
|
||||
{
|
||||
"channel": null,
|
||||
@@ -17,7 +17,7 @@
|
||||
"referrer": null,
|
||||
"user_agent": null,
|
||||
"quality": null,
|
||||
"label": null
|
||||
"labels": []
|
||||
},
|
||||
{
|
||||
"channel": null,
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user