Merge branch 'iptv-org:master' into master

This commit is contained in:
smrtprjcts 2022-11-21 07:04:17 +01:00 committed by GitHub
commit e689f97125
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 201 additions and 107 deletions

52
package-lock.json generated
View file

@ -15,8 +15,8 @@
"commander": "^8.2.0", "commander": "^8.2.0",
"csv-parser": "^3.0.0", "csv-parser": "^3.0.0",
"dayjs": "^1.10.8", "dayjs": "^1.10.8",
"epg-grabber": "^0.29.2", "epg-grabber": "^0.29.4",
"epg-parser": "^0.1.6", "epg-parser": "^0.2.0",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"fs-extra": "^10.0.1", "fs-extra": "^10.0.1",
"glob": "^7.2.0", "glob": "^7.2.0",
@ -2146,9 +2146,9 @@
} }
}, },
"node_modules/dayjs": { "node_modules/dayjs": {
"version": "1.11.2", "version": "1.11.6",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz",
"integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ=="
}, },
"node_modules/debug": { "node_modules/debug": {
"version": "4.3.4", "version": "4.3.4",
@ -2402,9 +2402,9 @@
} }
}, },
"node_modules/epg-grabber": { "node_modules/epg-grabber": {
"version": "0.29.2", "version": "0.29.4",
"resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.29.2.tgz", "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.29.4.tgz",
"integrity": "sha512-8DyPh6e1NQvOQaoE3UV0DKvCqUWS6+rxIy61Po04r/S5FP/RpsqKXdVL38f47nmI9V3xharwjBuL9zAV7e6kCQ==", "integrity": "sha512-GNKP8Q01HV3DXq3MEFQvFUlr3ejNsw8QSgGWvQ/lQTdgBXNJMEblz241wac9BNnte/fb+u9ExIyiskpds/dFug==",
"dependencies": { "dependencies": {
"axios": "^0.21.1", "axios": "^0.21.1",
"axios-cache-interceptor": "^0.10.3", "axios-cache-interceptor": "^0.10.3",
@ -2436,7 +2436,7 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/epg-parser": { "node_modules/epg-grabber/node_modules/epg-parser": {
"version": "0.1.6", "version": "0.1.6",
"resolved": "https://registry.npmjs.org/epg-parser/-/epg-parser-0.1.6.tgz", "resolved": "https://registry.npmjs.org/epg-parser/-/epg-parser-0.1.6.tgz",
"integrity": "sha512-g6AxKOvs0E4bTGPdIUh8/FDKdrVjbf4DVK0jIFuChDt7wBRJmMVyqbLeS8NApf6M2wpCRLBpIenXOCS88w0Rqw==", "integrity": "sha512-g6AxKOvs0E4bTGPdIUh8/FDKdrVjbf4DVK0jIFuChDt7wBRJmMVyqbLeS8NApf6M2wpCRLBpIenXOCS88w0Rqw==",
@ -2444,6 +2444,15 @@
"xml-js": "^1.6.11" "xml-js": "^1.6.11"
} }
}, },
"node_modules/epg-parser": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/epg-parser/-/epg-parser-0.2.0.tgz",
"integrity": "sha512-+wmWylP9RPK1tzZKRZ291H8+vDd4LB1ZY0UP16bACyqpwmMu/xkE92jUaXm6wBMn6lpfSepYmT2mgLLi+NCsHQ==",
"dependencies": {
"dayjs": "^1.11.6",
"xml-js": "^1.6.11"
}
},
"node_modules/error-ex": { "node_modules/error-ex": {
"version": "1.3.2", "version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@ -7909,9 +7918,9 @@
} }
}, },
"dayjs": { "dayjs": {
"version": "1.11.2", "version": "1.11.6",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz",
"integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ=="
}, },
"debug": { "debug": {
"version": "4.3.4", "version": "4.3.4",
@ -8097,9 +8106,9 @@
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
}, },
"epg-grabber": { "epg-grabber": {
"version": "0.29.2", "version": "0.29.4",
"resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.29.2.tgz", "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.29.4.tgz",
"integrity": "sha512-8DyPh6e1NQvOQaoE3UV0DKvCqUWS6+rxIy61Po04r/S5FP/RpsqKXdVL38f47nmI9V3xharwjBuL9zAV7e6kCQ==", "integrity": "sha512-GNKP8Q01HV3DXq3MEFQvFUlr3ejNsw8QSgGWvQ/lQTdgBXNJMEblz241wac9BNnte/fb+u9ExIyiskpds/dFug==",
"requires": { "requires": {
"axios": "^0.21.1", "axios": "^0.21.1",
"axios-cache-interceptor": "^0.10.3", "axios-cache-interceptor": "^0.10.3",
@ -8121,8 +8130,6 @@
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
}
}
}, },
"epg-parser": { "epg-parser": {
"version": "0.1.6", "version": "0.1.6",
@ -8131,6 +8138,17 @@
"requires": { "requires": {
"xml-js": "^1.6.11" "xml-js": "^1.6.11"
} }
}
}
},
"epg-parser": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/epg-parser/-/epg-parser-0.2.0.tgz",
"integrity": "sha512-+wmWylP9RPK1tzZKRZ291H8+vDd4LB1ZY0UP16bACyqpwmMu/xkE92jUaXm6wBMn6lpfSepYmT2mgLLi+NCsHQ==",
"requires": {
"dayjs": "^1.11.6",
"xml-js": "^1.6.11"
}
}, },
"error-ex": { "error-ex": {
"version": "1.3.2", "version": "1.3.2",

View file

@ -43,8 +43,8 @@
"commander": "^8.2.0", "commander": "^8.2.0",
"csv-parser": "^3.0.0", "csv-parser": "^3.0.0",
"dayjs": "^1.10.8", "dayjs": "^1.10.8",
"epg-grabber": "^0.29.2", "epg-grabber": "^0.29.4",
"epg-parser": "^0.1.6", "epg-parser": "^0.2.0",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"fs-extra": "^10.0.1", "fs-extra": "^10.0.1",
"glob": "^7.2.0", "glob": "^7.2.0",

View file

@ -100,7 +100,7 @@ async function main() {
channels = _.sortBy(channels, 'id') channels = _.sortBy(channels, 'id')
channels = _.uniqBy(channels, 'id') channels = _.uniqBy(channels, 'id')
programs = programs = _.sortBy(programs, ['channel', 'start']) programs = _.sortBy(programs, ['channel', 'start'])
programs = programs.map(p => new Program(p, new Channel(channels_dic[p.channel]))) programs = programs.map(p => new Program(p, new Channel(channels_dic[p.channel])))
programs = _.uniqBy(programs, p => p.channel + p.start) programs = _.uniqBy(programs, p => p.channel + p.start)

View file

@ -7,76 +7,39 @@ const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(isBetween) dayjs.extend(isBetween)
dayjs.extend(customParseFormat) dayjs.extend(customParseFormat)
const API_ENDPOINT = 'https://raw.githubusercontent.com/matthuisman/i.mjh.nz/master'
module.exports = { module.exports = {
site: 'i.mjh.nz', site: 'i.mjh.nz',
request: { request: {
cache: { cache: {
ttl: 6 * 60 * 60 * 1000 // 6h ttl: 3 * 60 * 60 * 1000 // 3h
}, },
maxContentLength: 20 * 1024 * 1024 // 20Mb maxContentLength: 30 * 1024 * 1024 // 30Mb
}, },
url: function ({ channel }) { url: function ({ channel }) {
const [source] = channel.site_id.split('#') const [path] = channel.site_id.split('#')
return `https://raw.githubusercontent.com/matthuisman/i.mjh.nz/master/${source}.xml` return `${API_ENDPOINT}/${path}.xml`
}, },
parser: function ({ content, channel, date, cached }) { parser: function ({ content, channel, date, cached }) {
let programs = [] return parseItems(content, channel, date)
const items = parseItems(content, channel, date)
items.forEach(item => {
programs.push({
title: parseTitle(item, channel),
description: parseDescription(item, channel),
category: parseCategory(item, channel),
start: parseStart(item),
stop: parseStop(item)
})
})
return programs
}, },
async channels({ path, lang = 'en' }) { async channels({ path, lang = 'en' }) {
const [service] = path.split('/') let xml = await axios
let data = await axios .get(`${API_ENDPOINT}/${path}.xml`)
.get(`https://i.mjh.nz/${service}/app.json`)
.then(r => r.data) .then(r => r.data)
.catch(console.log) .catch(console.log)
let data = parser.parse(xml)
const channels = [] return data.channels.map(channel => {
const items = data.channels || data return {
for (let id in items) {
const channel = items[id]
channels.push({
lang, lang,
site_id: `${path}#${id}`, site_id: `${path}#${channel.id}`,
name: channel.name name: channel.name[0].value
}
}) })
} }
return channels
}
}
function parseTitle(item, channel) {
return item.title.length ? item.title[0].value : null
}
function parseDescription(item, channel) {
return item.desc.length ? item.desc[0].value : null
}
function parseCategory(item, channel) {
const category = item.category.length ? item.category[0].value : ''
return category.split(/\s\&amp\;\s/g).filter(c => c)
}
function parseStart(item) {
return dayjs(item.start, 'YYYYMMDDHHmmss ZZ')
}
function parseStop(item) {
return dayjs(item.stop, 'YYYYMMDDHHmmss ZZ')
} }
function parseItems(content, channel, date) { function parseItems(content, channel, date) {

View file

@ -1,6 +1,7 @@
// npm run channels:parse -- --config=./sites/i.mjh.nz/i.mjh.nz.config.js --output=./sites/i.mjh.nz/i.mjh.nz_us-pluto.channels.xml --set=path:PlutoTV/us // npm run channels:parse -- --config=./sites/i.mjh.nz/i.mjh.nz.config.js --output=./sites/i.mjh.nz/i.mjh.nz_us-pluto.channels.xml --set=path:PlutoTV/us
// npx epg-grabber --config=sites/i.mjh.nz/i.mjh.nz.config.js --channels=sites/i.mjh.nz/i.mjh.nz_us-pluto.channels.xml --output=guide.xml --days=2 // npx epg-grabber --config=sites/i.mjh.nz/i.mjh.nz.config.js --channels=sites/i.mjh.nz/i.mjh.nz_us-pluto.channels.xml --output=guide.xml --days=2
// npx epg-grabber --config=sites/i.mjh.nz/i.mjh.nz.config.js --channels=sites/i.mjh.nz/i.mjh.nz_us-stirr.channels.xml --output=guide.xml --days=2 // npx epg-grabber --config=sites/i.mjh.nz/i.mjh.nz.config.js --channels=sites/i.mjh.nz/i.mjh.nz_us-stirr.channels.xml --output=guide.xml --days=2
// npx epg-grabber --config=sites/i.mjh.nz/i.mjh.nz.config.js --channels=sites/i.mjh.nz/i.mjh.nz_us-skygo.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./i.mjh.nz.config.js') const { parser, url } = require('./i.mjh.nz.config.js')
const dayjs = require('dayjs') const dayjs = require('dayjs')
@ -24,22 +25,20 @@ it('can generate valid url', () => {
it('can parse response', () => { it('can parse response', () => {
const content = `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE tv SYSTEM "xmltv.dtd"><tv generator-info-name="www.matthuisman.nz"> <channel id="51c75f7bb6f26ba1cd00002f"> <display-name>Little Stars Universe</display-name> <icon src="https://images.pluto.tv/channels/51c75f7bb6f26ba1cd00002f/colorLogoPNG.png"/> </channel> <programme channel="51c75f7bb6f26ba1cd00002f" start="20220503104922 +0000" stop="20220503112122 +0000"> <title>Barney and Friends</title> <desc>Baby Bop forgets to say "please" and "thank you". Riff shares his dream of becoming an inventor.</desc> <category>Children &amp; Family</category> </programme><programme channel="51c75f7bb6f26ba1cd00002f" start="20220504104922 +0000" stop="20220504112122 +0000"> <title>Barney and Friends</title> <desc>Baby Bop forgets to say "please" and "thank you". Riff shares his dream of becoming an inventor.</desc> <category>Children &amp; Family</category> </programme></tv>` const content = `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE tv SYSTEM "xmltv.dtd"><tv generator-info-name="www.matthuisman.nz"> <channel id="51c75f7bb6f26ba1cd00002f"> <display-name>Little Stars Universe</display-name> <icon src="https://images.pluto.tv/channels/51c75f7bb6f26ba1cd00002f/colorLogoPNG.png"/> </channel> <programme channel="51c75f7bb6f26ba1cd00002f" start="20220503104922 +0000" stop="20220503112122 +0000"> <title>Barney and Friends</title> <desc>Baby Bop forgets to say "please" and "thank you". Riff shares his dream of becoming an inventor.</desc> <category>Children &amp; Family</category> </programme><programme channel="51c75f7bb6f26ba1cd00002f" start="20220504104922 +0000" stop="20220504112122 +0000"> <title>Barney and Friends</title> <desc>Baby Bop forgets to say "please" and "thank you". Riff shares his dream of becoming an inventor.</desc> <category>Children &amp; Family</category> </programme></tv>`
const result = parser({ content, channel, date }).map(p => { const results = parser({ content, channel, date })
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([ expect(results[0]).toMatchObject({
{
start: '2022-05-03T10:49:22.000Z', start: '2022-05-03T10:49:22.000Z',
stop: '2022-05-03T11:21:22.000Z', stop: '2022-05-03T11:21:22.000Z',
title: 'Barney and Friends', title: [{ value: 'Barney and Friends' }],
description: desc: [
'Baby Bop forgets to say "please" and "thank you". Riff shares his dream of becoming an inventor.', {
category: ['Children', 'Family'] value:
'Baby Bop forgets to say "please" and "thank you". Riff shares his dream of becoming an inventor.'
} }
]) ],
category: [{ value: 'Children &amp; Family' }]
})
}) })
it('can handle empty guide', () => { it('can handle empty guide', () => {

View file

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="i.mjh.nz">
<channels>
<channel lang="en" xmltv_id="AlJazeeraEnglish.qa" site_id="SkyGo/epg#sky.90">Al Jazeera</channel>
<channel lang="en" xmltv_id="AnimalPlanetAustralia.au" site_id="SkyGo/epg#sky.76">Animal Planet</channel>
<channel lang="en" xmltv_id="BBCEarthNewZealand.nz" site_id="SkyGo/epg#sky.74">BBC Earth</channel>
<channel lang="en" xmltv_id="BBCUKTVNewZealand.nz" site_id="SkyGo/epg#sky.7">BBC UKTV</channel>
<channel lang="en" xmltv_id="BBCWorldNewsAsiaPacific.uk" site_id="SkyGo/epg#sky.89">BBC World News</channel>
<channel lang="en" xmltv_id="BravoNewZealand.nz" site_id="SkyGo/epg#sky.12">Bravo</channel>
<channel lang="en" xmltv_id="BravoNewZealandPlus1.nz" site_id="SkyGo/epg#sky.512">Bravo PLUS 1</channel>
<channel lang="en" xmltv_id="BreezeTV.nz" site_id="SkyGo/epg#sky.114">Breeze TV</channel>
<channel lang="en" xmltv_id="CartoonNetworkAustralia.au" site_id="SkyGo/epg#sky.102">Cartoon Network</channel>
<channel lang="en" xmltv_id="CBeebiesAustralia.au" site_id="SkyGo/epg#sky.103">Cbeebies</channel>
<channel lang="en" xmltv_id="CGTN.cn" site_id="SkyGo/epg#sky.310">CGTN</channel>
<channel lang="en" xmltv_id="CGTNDocumentary.cn" site_id="SkyGo/epg#sky.309">CGTN Documentary</channel>
<channel lang="en" xmltv_id="CNBCAustralia.au" site_id="SkyGo/epg#sky.91">CNBC</channel>
<channel lang="en" xmltv_id="CNNInternationalAsiaPacific.hk" site_id="SkyGo/epg#sky.87">CNN</channel>
<channel lang="en" xmltv_id="ColorsAsiaPacific.in" site_id="SkyGo/epg#sky.151">Colors</channel>
<channel lang="en" xmltv_id="CountryTV.nz" site_id="SkyGo/epg#sky.81">Country TV</channel>
<channel lang="en" xmltv_id="DiscoveryChannelNewZealand.nz" site_id="SkyGo/epg#sky.70">Discovery</channel>
<channel lang="en" xmltv_id="DiscoveryTurboNewZealand.nz" site_id="SkyGo/epg#sky.75">Discovery Turbo</channel>
<channel lang="en" xmltv_id="EAustralia.au" site_id="SkyGo/epg#sky.14">E!</channel>
<channel lang="en" xmltv_id="FaceTV.nz" site_id="SkyGo/epg#sky.83">FACE TV</channel>
<channel lang="en" xmltv_id="Firstlight.nz" site_id="SkyGo/epg#sky.206">Firstlight</channel>
<channel lang="en" xmltv_id="HGTVNewZealand.nz" site_id="SkyGo/epg#sky.21">HGTV</channel>
<channel lang="en" xmltv_id="HistoryAustralia.au" site_id="SkyGo/epg#sky.73">HISTORY</channel>
<channel lang="en" xmltv_id="HopeChannelNewZealand.nz" site_id="SkyGo/epg#sky.204">Hope Channel</channel>
<channel lang="en" xmltv_id="JONES.nz" site_id="SkyGo/epg#sky.8">JONES!</channel>
<channel lang="en" xmltv_id="JONEStoo.nz" site_id="SkyGo/epg#sky.208">JONES! too</channel>
<channel lang="en" xmltv_id="LivingChannel.nz" site_id="SkyGo/epg#sky.17">Living</channel>
<channel lang="en" xmltv_id="MTV80s.uk" site_id="SkyGo/epg#sky.123">MTV 80s</channel>
<channel lang="en" xmltv_id="MTVHitsNewZealand.nz" site_id="SkyGo/epg#sky.22">MTV Hits</channel>
<channel lang="en" xmltv_id="MTVNewZealand.nz" site_id="SkyGo/epg#sky.15">MTV</channel>
<channel lang="en" xmltv_id="NickelodeonAustralia.au" site_id="SkyGo/epg#sky.101">Nickelodeon</channel>
<channel lang="en" xmltv_id="NickJrAustralia.au" site_id="SkyGo/epg#sky.104">Nick Jr.</channel>
<channel lang="en" xmltv_id="NickMusicAustralia.au" site_id="SkyGo/epg#sky.100">Nick Music</channel>
<channel lang="en" xmltv_id="ParliamentTV.nz" site_id="SkyGo/epg#sky.86">Parliament TV</channel>
<channel lang="en" xmltv_id="Prime.nz" site_id="SkyGo/epg#sky.4">Prime</channel>
<channel lang="en" xmltv_id="PrimePlus1.nz" site_id="SkyGo/epg#sky.514">Prime PLUS 1</channel>
<channel lang="en" xmltv_id="Rialto.nz" site_id="SkyGo/epg#sky.39">Rialto</channel>
<channel lang="en" xmltv_id="RT.ru" site_id="SkyGo/epg#sky.92">RT</channel>
<channel lang="en" xmltv_id="ShineTV.nz" site_id="SkyGo/epg#sky.201">Shine TV</channel>
<channel lang="en" xmltv_id="SkyArena.nz" site_id="SkyGo/epg#sky.65">SKY Arena</channel>
<channel lang="en" xmltv_id="SkyArtsNewZealand.nz" site_id="SkyGo/epg#sky.20">Sky Arts</channel>
<channel lang="en" xmltv_id="SkyBoxOffice041.nz" site_id="SkyGo/epg#sky.41">SKY Box Office 041</channel>
<channel lang="en" xmltv_id="SkyBoxOffice042.nz" site_id="SkyGo/epg#sky.42">SKY Box Office 042</channel>
<channel lang="en" xmltv_id="SkyBoxOffice043.nz" site_id="SkyGo/epg#sky.43">SKY Box Office 043</channel>
<channel lang="en" xmltv_id="SkyBoxSets.nz" site_id="SkyGo/epg#sky.9">Sky Box Sets</channel>
<channel lang="en" xmltv_id="SkyMoviesAction.nz" site_id="SkyGo/epg#sky.32">Sky Movies Action</channel>
<channel lang="en" xmltv_id="SkyMoviesClassics.nz" site_id="SkyGo/epg#sky.34">Sky Movies Classics</channel>
<channel lang="en" xmltv_id="SkyMoviesFamily.nz" site_id="SkyGo/epg#sky.36">Sky Movies Family</channel>
<channel lang="en" xmltv_id="SkyMoviesGreats.nz" site_id="SkyGo/epg#sky.33">Sky Movies Greats</channel>
<channel lang="en" xmltv_id="SkyMoviesPremiere.nz" site_id="SkyGo/epg#sky.30">Sky Movies Premiere</channel>
<channel lang="en" xmltv_id="SkyNewsAustralia.au" site_id="SkyGo/epg#sky.85">Sky News</channel>
<channel lang="en" xmltv_id="SkySport1NewZealand.nz" site_id="SkyGo/epg#sky.51">Sky Sport 1</channel>
<channel lang="en" xmltv_id="SkySport2NewZealand.nz" site_id="SkyGo/epg#sky.52">Sky Sport 2</channel>
<channel lang="en" xmltv_id="SkySport3NewZealand.nz" site_id="SkyGo/epg#sky.53">Sky Sport 3</channel>
<channel lang="en" xmltv_id="SkySport4NewZealand.nz" site_id="SkyGo/epg#sky.54">Sky Sport 4</channel>
<channel lang="en" xmltv_id="SkySport5NewZealand.nz" site_id="SkyGo/epg#sky.55">Sky Sport 5</channel>
<channel lang="en" xmltv_id="SkySport6NewZealand.nz" site_id="SkyGo/epg#sky.56">Sky Sport 6</channel>
<channel lang="en" xmltv_id="SkySport7NewZealand.nz" site_id="SkyGo/epg#sky.57">Sky Sport 7 beIN SPORTS</channel>
<channel lang="en" xmltv_id="SkySport9NewZealand.nz" site_id="SkyGo/epg#sky.59">Sky Sport 9</channel>
<channel lang="en" xmltv_id="SoHo.nz" site_id="SkyGo/epg#sky.10">SoHo</channel>
<channel lang="en" xmltv_id="StarGold.in" site_id="SkyGo/epg#sky.152">Star Gold</channel>
<channel lang="en" xmltv_id="TABTrackside1.nz" site_id="SkyGo/epg#sky.62">TAB Trackside 1</channel>
<channel lang="en" xmltv_id="TABTrackside2.nz" site_id="SkyGo/epg#sky.63">TAB Trackside 2</channel>
<channel lang="en" xmltv_id="TeReo.nz" site_id="SkyGo/epg#sky.82">Te Reo</channel>
<channel lang="en" xmltv_id="TheEdgeTV.nz" site_id="SkyGo/epg#sky.111">The Edge TV</channel>
<channel lang="en" xmltv_id="Three.nz" site_id="SkyGo/epg#sky.3">Three</channel>
<channel lang="en" xmltv_id="ThreePlus1.nz" site_id="SkyGo/epg#sky.503">ThreePlusOne</channel>
<channel lang="en" xmltv_id="TLCNewZealand.nz" site_id="SkyGo/epg#sky.16">TLC</channel>
<channel lang="en" xmltv_id="TVNZ1.nz" site_id="SkyGo/epg#sky.1">TVNZ 1</channel>
<channel lang="en" xmltv_id="TVNZ1Plus1.nz" site_id="SkyGo/epg#sky.501">TVNZ 1+1</channel>
<channel lang="en" xmltv_id="TVNZ2.nz" site_id="SkyGo/epg#sky.2">TVNZ 2</channel>
<channel lang="en" xmltv_id="TVNZ2Plus1.nz" site_id="SkyGo/epg#sky.502">TVNZ 2+1</channel>
<channel lang="en" xmltv_id="TVNZDUKE.nz" site_id="SkyGo/epg#sky.23">TVNZ DUKE</channel>
<channel lang="en" xmltv_id="TVNZDUKEPlus1.nz" site_id="SkyGo/epg#sky.504">DukePlus1</channel>
<channel lang="en" xmltv_id="UniversalTVNewZealand.nz" site_id="SkyGo/epg#sky.210">Universal TV</channel>
<channel lang="en" xmltv_id="Vibe.nz" site_id="SkyGo/epg#sky.6">Vibe</channel>
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.11">Comedy Central</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.13">eden</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.150">Star Plus Hindi</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.160">TFC</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.18">ID</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.19">Whakaata Māori</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.202">Daystar</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.203">SonLife</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.24">Rush</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.25">Shopping Channel</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.31">Sky Movies Comedy</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.35">Sky Movies Collection</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.40">SKY Box Office</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.5">Sky 5</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.50">Sky Sport Select</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.505">eden +1</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.58">Sky Sport Premier League</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.60">ESPN HD</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.600">Sky Sport Pop-up 1</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.61">ESPN 2</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.71">CI</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.72">NAT GEO</channel> -->
<!-- <channel lang="en" xmltv_id="" site_id="SkyGo/epg#sky.88">Fox News</channel> -->
</channels>
</site>

View file

@ -10,9 +10,7 @@ dayjs.extend(customParseFormat)
module.exports = { module.exports = {
site: 'musor.tv', site: 'musor.tv',
url({ channel, date }) { url({ channel, date }) {
const diff = date.diff(dayjs.utc().startOf('d'), 'd') return dayjs.utc().isSame(date, 'd')
return diff === 0
? `https://musor.tv/mai/tvmusor/${channel.site_id}` ? `https://musor.tv/mai/tvmusor/${channel.site_id}`
: `https://musor.tv/napi/tvmusor/${channel.site_id}/${date.format('YYYY.MM.DD')}` : `https://musor.tv/napi/tvmusor/${channel.site_id}/${date.format('YYYY.MM.DD')}`
}, },

View file

@ -10,14 +10,20 @@ const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat) dayjs.extend(customParseFormat)
dayjs.extend(utc) dayjs.extend(utc)
const date = dayjs.utc('2022-11-20', 'YYYY-MM-DD').startOf('d') const date = dayjs.utc('2022-11-19', 'YYYY-MM-DD').startOf('d')
const channel = { const channel = {
site_id: 'HATOS_CSATORNA', site_id: 'HATOS_CSATORNA',
xmltv_id: 'Hatoscsatorna.hu' xmltv_id: 'Hatoscsatorna.hu'
} }
it('can generate valid url', () => { it('can generate valid url', () => {
expect(url({ channel, date })).toBe('https://musor.tv/napi/tvmusor/HATOS_CSATORNA/2022.11.20') expect(url({ channel, date })).toBe('https://musor.tv/napi/tvmusor/HATOS_CSATORNA/2022.11.19')
})
it('can generate valid url for today', () => {
const today = dayjs.utc().startOf('d')
expect(url({ channel, date: today })).toBe('https://musor.tv/mai/tvmusor/HATOS_CSATORNA')
}) })
it('can parse response', () => { it('can parse response', () => {

View file

@ -3,16 +3,14 @@ const axios = require('axios')
const dayjs = require('dayjs') const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc') const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone') const timezone = require('dayjs/plugin/timezone')
const isToday = require('dayjs/plugin/isToday')
dayjs.extend(utc) dayjs.extend(utc)
dayjs.extend(isToday)
dayjs.extend(timezone) dayjs.extend(timezone)
module.exports = { module.exports = {
site: 'tvgids.nl', site: 'tvgids.nl',
url: function ({ date, channel }) { url: function ({ date, channel }) {
const path = date.isToday() ? '' : `${date.format('DD-MM-YYYY')}/` const path = dayjs.utc().isSame(date, 'd') ? '' : `${date.format('DD-MM-YYYY')}/`
return `https://www.tvgids.nl/gids/${path}${channel.site_id}` return `https://www.tvgids.nl/gids/${path}${channel.site_id}`
}, },

View file

@ -1 +1 @@
{"titles":[{"lang":"en","value":"InfoNeu "}],"actors":[],"adapters":[],"commentators":[],"composers":[],"date":null,"directors":[],"editors":[],"guests":[],"presenters":[],"producers":[],"sub_titles":[],"urls":[],"writers":[],"descriptions":[],"categories":[],"episodeNumbers":[],"icon":{"src":""},"ratings":[],"channel":"AndorraTV.ad","start":1641711600000,"stop":1641715200000,"site": "chaines-tv.orange.fr","_qid":"0Wefq0oMR3feCcuY","_id":"6AzYe7lqcSN05ZUq"} {"titles":[{"lang":"en","value":"InfoNeu "}],"actors":[],"adapters":[],"commentators":[],"composers":[],"date":null,"directors":[],"editors":[],"guests":[],"presenters":[],"producers":[],"sub_titles":[],"urls":[],"writers":[],"descriptions":[],"categories":[],"episodeNumbers":[],"icon":{"src":""},"ratings":[],"channel":"CNNInternationalEurope.us","start":1641711600000,"stop":1641715200000,"site": "chaines-tv.orange.fr","_qid":"0Wefq0oMR3feCcuY","_id":"6AzYe7lqcSN05ZUq"}

View file

@ -1,2 +1,2 @@
{"_qid":"0Wefq0oMR3feCcuY","programs":[{"titles":[{"lang":"en","value":"InfoNeu "}],"descriptions":[],"categories":[],"icon":null,"channel":"AndorraTV.ad","site": "chaines-tv.orange.fr","start":1641711600000,"stop":1641715200000}],"error":null} {"_qid":"0Wefq0oMR3feCcuY","programs":[{"titles":[{"lang":"en","value":"InfoNeu "}],"descriptions":[],"categories":[],"icon":null,"channel":"CNNInternationalEurope.us","site": "chaines-tv.orange.fr","start":1641711600000,"stop":1641715200000}],"error":null}
{"_qid":"1XzrxNkSF2AQNBrT","programs":[],"error":"Invalid header value char"} {"_qid":"1XzrxNkSF2AQNBrT","programs":[],"error":"Invalid header value char"}

View file

@ -1454,10 +1454,10 @@
"whatwg-mimetype" "^2.3.0" "whatwg-mimetype" "^2.3.0"
"whatwg-url" "^8.0.0" "whatwg-url" "^8.0.0"
"dayjs@^1.10.4", "dayjs@^1.10.8": "dayjs@^1.10.4", "dayjs@^1.10.8", "dayjs@^1.11.6":
"integrity" "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" "integrity" "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ=="
"resolved" "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz" "resolved" "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz"
"version" "1.11.2" "version" "1.11.6"
"debug@^3.1.0": "debug@^3.1.0":
"integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="
@ -1618,10 +1618,10 @@
"resolved" "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" "resolved" "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"
"version" "2.2.0" "version" "2.2.0"
"epg-grabber@^0.29.2": "epg-grabber@^0.29.4":
"integrity" "sha512-8DyPh6e1NQvOQaoE3UV0DKvCqUWS6+rxIy61Po04r/S5FP/RpsqKXdVL38f47nmI9V3xharwjBuL9zAV7e6kCQ==" "integrity" "sha512-GNKP8Q01HV3DXq3MEFQvFUlr3ejNsw8QSgGWvQ/lQTdgBXNJMEblz241wac9BNnte/fb+u9ExIyiskpds/dFug=="
"resolved" "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.29.2.tgz" "resolved" "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.29.4.tgz"
"version" "0.29.2" "version" "0.29.4"
dependencies: dependencies:
"axios" "^0.21.1" "axios" "^0.21.1"
"axios-cache-interceptor" "^0.10.3" "axios-cache-interceptor" "^0.10.3"
@ -1645,6 +1645,14 @@
dependencies: dependencies:
"xml-js" "^1.6.11" "xml-js" "^1.6.11"
"epg-parser@^0.2.0":
"integrity" "sha512-+wmWylP9RPK1tzZKRZ291H8+vDd4LB1ZY0UP16bACyqpwmMu/xkE92jUaXm6wBMn6lpfSepYmT2mgLLi+NCsHQ=="
"resolved" "https://registry.npmjs.org/epg-parser/-/epg-parser-0.2.0.tgz"
"version" "0.2.0"
dependencies:
"dayjs" "^1.11.6"
"xml-js" "^1.6.11"
"error-ex@^1.3.1": "error-ex@^1.3.1":
"integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
"resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"