mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-10 09:00:07 -04:00
Merge branch 'iptv-org:master' into master
This commit is contained in:
commit
e689f97125
12 changed files with 201 additions and 107 deletions
52
package-lock.json
generated
52
package-lock.json
generated
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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\&\;\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) {
|
||||||
|
|
|
@ -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 & 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 & 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 & 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 & 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 & Family' }]
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it('can handle empty guide', () => {
|
it('can handle empty guide', () => {
|
||||||
|
|
104
sites/i.mjh.nz/i.mjh.nz_us-skygo.channels.xml
Normal file
104
sites/i.mjh.nz/i.mjh.nz_us-skygo.channels.xml
Normal 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>
|
|
@ -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')}`
|
||||||
},
|
},
|
||||||
|
|
|
@ -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', () => {
|
||||||
|
|
|
@ -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}`
|
||||||
},
|
},
|
||||||
|
|
|
@ -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"}
|
||||||
|
|
|
@ -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"}
|
||||||
|
|
24
yarn.lock
24
yarn.lock
|
@ -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"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue