Merge pull request #2130 from iptv-org/add-nhkworldpremium.com

Add nhkworldpremium.com
This commit is contained in:
Ismaël Moret authored and GitHub committed 2023-07-19 21:35:58 +02:00
commit 3a119500bd
6 files changed
+161

No files matched your search

@@ -0,0 +1 @@
{"item":{"startDate":"2023-07-10","endDate":"2023-07-17","episodes":[{"programId":0,"programTitle":"TBA","episodeId":0,"episodeTitle":null,"suspendFlg":true,"schedule":"2023-07-09 00:00:00","period":"00:55:00"},{"programId":450,"programTitle":"We Love Fluffy Animals Mini","episodeId":250368,"episodeTitle":null,"schedule":"2023-07-09 00:55:00","period":"00:05:00","suspendFlg":true,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":380,"programTitle":"Verbalizing Hard to Express Feelings","episodeId":250217,"episodeTitle":null,"schedule":"2023-07-09 01:00:00","period":"00:30:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":281,"programTitle":"Japanese Entertainment Encyclopedia","episodeId":249442,"episodeTitle":null,"schedule":"2023-07-09 01:30:00","period":"00:30:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":24,"programTitle":"News & Weather","episodeId":248925,"episodeTitle":null,"schedule":"2023-07-09 02:00:00","period":"00:05:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":49,"programTitle":"Child-Rearing Hints & Tips mini","episodeId":249115,"episodeTitle":null,"schedule":"2023-07-09 02:05:00","period":"00:05:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":49,"programTitle":"Child-Rearing Hints & Tips mini","episodeId":249116,"episodeTitle":null,"schedule":"2023-07-09 02:10:00","period":"00:05:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":49,"programTitle":"Child-Rearing Hints & Tips mini","episodeId":249117,"episodeTitle":null,"schedule":"2023-07-09 02:15:00","period":"00:05:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":443,"programTitle":"Drama Serial Encore \"Ama-chan\"","episodeId":249860,"episodeTitle":"Eps. 84","schedule":"2023-07-09 02:20:00","period":"00:15:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":447,"programTitle":"Somewhere Street","episodeId":249837,"episodeTitle":"\"Bilbao & San Sebastian, Spain\"","schedule":"2023-07-09 02:35:00","period":"01:30:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":208,"programTitle":"Darwin's Amazing Animals","episodeId":249402,"episodeTitle":"\"Queen Alexandra's Birdwing\"","schedule":"2023-07-09 04:05:00","period":"00:28:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":450,"programTitle":"Mini Program","episodeId":250022,"episodeTitle":null,"schedule":"2023-07-09 04:33:00","period":"00:02:00","suspendFlg":true,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":387,"programTitle":"Dear Japan","episodeId":249779,"episodeTitle":null,"schedule":"2023-07-09 04:35:00","period":"00:25:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":428,"programTitle":"What the Villains Have to Say","episodeId":249974,"episodeTitle":null,"schedule":"2023-07-09 05:00:00","period":"00:30:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":431,"programTitle":"NHK ACADEMIA","episodeId":249949,"episodeTitle":"\"Kataoka Mami\" Part 1","schedule":"2023-07-09 05:30:00","period":"00:30:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":13,"programTitle":"News","episodeId":248734,"episodeTitle":null,"schedule":"2023-07-09 06:00:00","period":"00:10:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":390,"programTitle":"Samurai Drama Selections \"Kumokiri Nizaemon 3\"","episodeId":249595,"episodeTitle":"Eps. 7","schedule":"2023-07-09 06:10:00","period":"00:43:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":117,"programTitle":"Weather","episodeId":249281,"episodeTitle":null,"schedule":"2023-07-09 06:53:00","period":"00:02:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":24,"programTitle":"News & Weather","episodeId":248917,"episodeTitle":null,"schedule":"2023-07-09 06:55:00","period":"00:05:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":20,"programTitle":"News: Good Morning, Japan","episodeId":248826,"episodeTitle":null,"schedule":"2023-07-09 07:00:00","period":"00:45:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":115,"programTitle":"Natural Grandeur of the East","episodeId":249270,"episodeTitle":null,"schedule":"2023-07-09 07:45:00","period":"00:14:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":406,"programTitle":"World Weather","Line truncated
@@ -0,0 +1 @@
{"item":{"startDate":"2023-07-10","endDate":"2023-07-17","episodes":[{"programId":0,"programTitle":"\u672a\u5b9a","episodeId":0,"episodeTitle":null,"suspendFlg":true,"schedule":"2023-07-09 00:00:00","period":"00:55:00"},{"programId":450,"programTitle":"\u3082\u3075\u3082\u3075\u30e2\u30d5\u30e2\u30d5\u3000\u306d\u3053\u306e\u697d\u5712\u3000\u30df\u30cb","episodeId":250368,"episodeTitle":null,"schedule":"2023-07-09 00:55:00","period":"00:05:00","suspendFlg":true,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":380,"programTitle":"\u8a00\u8449\u306b\u3067\u304d\u306a\u3044\u3001\u305d\u3093\u306a\u591c\u3002","episodeId":250217,"episodeTitle":"\u7b2c2\u30b7\u30fc\u30ba\u30f3\uff0829\uff09","schedule":"2023-07-09 01:00:00","period":"00:30:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":281,"programTitle":"\u6797\u5bb6\u6b63\u8535\u306e\u6f14\u82b8\u56f3\u9451","episodeId":249442,"episodeTitle":"\u9078\u300c\u7acb\u5ddd\u5fd7\u306e\u8f14\u3000\u30a6\u30a8\u30b9\u30c8\u30e9\u30f3\u30c9\u3000\u9234\u3005\u820e\u99ac\u308b\u3053\u300d","schedule":"2023-07-09 01:30:00","period":"00:30:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":24,"programTitle":"\u30cb\u30e5\u30fc\u30b9\u30fb\u6c17\u8c61\u60c5\u5831","episodeId":248925,"episodeTitle":null,"schedule":"2023-07-09 02:00:00","period":"00:05:00","suspendFlg":true,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":49,"programTitle":"\u307e\u3044\u306b\u3061\u30b9\u30af\u30b9\u30af","episodeId":249115,"episodeTitle":null,"schedule":"2023-07-09 02:05:00","period":"00:05:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":49,"programTitle":"\u307e\u3044\u306b\u3061\u30b9\u30af\u30b9\u30af","episodeId":249116,"episodeTitle":null,"schedule":"2023-07-09 02:10:00","period":"00:05:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":49,"programTitle":"\u307e\u3044\u306b\u3061\u30b9\u30af\u30b9\u30af","episodeId":249117,"episodeTitle":null,"schedule":"2023-07-09 02:15:00","period":"00:05:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":443,"programTitle":"\u9023\u7d9a\u30c6\u30ec\u30d3\u5c0f\u8aac\u30fb\u30a2\u30f3\u30b3\u30fc\u30eb\u300c\u3042\u307e\u3061\u3083\u3093\u300d","episodeId":249860,"episodeTitle":"\uff0884\uff09","schedule":"2023-07-09 02:20:00","period":"00:15:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":447,"programTitle":"\u4e16\u754c\u3075\u308c\u3042\u3044\u8857\u6b69\u304d","episodeId":249837,"episodeTitle":"\u30d3\u30eb\u30d0\u30aa\uff06\u30b5\u30f3\uff65\u30bb\u30d0\u30b9\u30c1\u30e3\u30f3\uff5e\u30b9\u30da\u30a4\u30f3\uff5e","schedule":"2023-07-09 02:35:00","period":"01:30:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":208,"programTitle":"\u30c0\u30fc\u30a6\u30a3\u30f3\u304c\u6765\u305f\uff01","episodeId":249402,"episodeTitle":"\u300c\u64ae\u3063\u305f\u305e\uff01\u6fc0\u30ec\u30a2\u3000\u4e16\u754c\u6700\u5927\u306e\u30c1\u30e7\u30a6\u300d","schedule":"2023-07-09 04:05:00","period":"00:28:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":450,"programTitle":"\u30df\u30cb\u756a\u7d44","episodeId":250022,"episodeTitle":null,"schedule":"2023-07-09 04:33:00","period":"00:02:00","suspendFlg":true,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":387,"programTitle":"Dear\u306b\u3063\u307d\u3093","episodeId":249779,"episodeTitle":"\u300c\u305f\u3060\u3044\u307e\u3068\u8a00\u3048\u308b\u5834\u6240\uff5e\u611b\u77e5\u3000\u4fdd\u898b\u56e3\u5730\uff5e\u300d","schedule":"2023-07-09 04:35:00","period":"00:25:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":428,"programTitle":"\u30f4\u30a3\u30e9\u30f3\u306e\u8a00\u3044\u5206","episodeId":249974,"episodeTitle":"\u6bd2\u30ad\u30ce\u30b3","schedule":"2023-07-09 05:00:00","period":"00:30:00","suspendFlg":false,"rebroadcastFlg":true,"bilingualFlg":false,"englishFlg":false},{"programId":431,"programTitle":"NHK\u30a2\u30ab\u30c7\u30df\u30a2","episodeId":249949,"episodeTitle":"\u7247\u5ca1\u771f\u7f8e\uff08\u524d\u7de8\uff09\u73fe\u4ee3\u30a2\u30fc\u30c8\u306e\u30ad\u30e5\u30ec\u30fc\u30bf\u30fc\u3068\u306f\uff1f","schedule":"2023-07-09 05:30:00","period":"00:30:00","suspendFlg":false,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":13,"programTitle":"\u30cb\u30e5\u30fc\u30b9","episodeId":248734,"episodeTitle":null,"schedule":"2023-07-09 06:00:00","period":"00:10:00","suspendFlg":true,"rebroadcastFlg":false,"bilingualFlg":false,"englishFlg":false},{"programId":390,"programTitle":"\u3010\u7279\u9078\uff01\u6642\u4ee3\u5287\u3011\u96f2\u9727\u4ec1\u5de6\u885b\u95803","episLine truncated
@@ -0,0 +1,56 @@
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
dayjs.extend(utc)
dayjs.extend(timezone)
module.exports = {
site: 'nhkworldpremium.com',
days: 7,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url({ channel }) {
return `https://nhkworldpremium.com/backend/api/v1/front/episodes?lang=${channel.lang}`
},
parser({ content, date }) {
let programs = []
const items = parseItems(content, date)
items.forEach(item => {
const start = dayjs.tz(item.schedule, 'Asia/Seoul')
const duration = parseDuration(item)
const stop = start.add(duration, 's')
programs.push({
title: item.programTitle,
sub_title: item.episodeTitle,
start,
stop
})
})
return programs
}
}
function parseDuration(item) {
const [h, m, s] = item.period.split(':')
if (!h || !m || !s) return 0
return parseInt(h) * 3600 + parseInt(m) * 60 + parseInt(s)
}
function parseItems(content, date) {
try {
const data = JSON.parse(content)
if (!data || !data.item || !Array.isArray(data.item.episodes)) return []
return data.item.episodes.filter(ep => ep.schedule.startsWith(date.format('YYYY-MM-DD')))
} catch (err) {
return []
}
}
@@ -0,0 +1,91 @@
// npx epg-grabber --config=sites/nhkworldpremium.com/nhkworldpremium.com.config.js --channels=sites/nhkworldpremium.com/nhkworldpremium.com_en.channels.xml --output=guide.xml
// npx epg-grabber --config=sites/nhkworldpremium.com/nhkworldpremium.com.config.js --channels=sites/nhkworldpremium.com/nhkworldpremium.com_ja.channels.xml --output=guide.xml
const { parser, url, request } = require('./nhkworldpremium.com.config.js')
const fs = require('fs')
const path = require('path')
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc('2023-07-10', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '#',
xmltv_id: 'NHKWorldPremium.jp',
lang: 'en'
}
it('can generate valid url', () => {
expect(url({ channel })).toBe('https://nhkworldpremium.com/backend/api/v1/front/episodes?lang=en')
})
it('can generate valid url for Japanese guide', () => {
const channel = {
site_id: '#',
xmltv_id: 'NHKWorldPremium.jp',
lang: 'ja'
}
expect(url({ channel })).toBe('https://nhkworldpremium.com/backend/api/v1/front/episodes?lang=ja')
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content_en.json'))
let results = parser({ content, date })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results.length).toBe(56)
expect(results[0]).toMatchObject({
start: '2023-07-09T15:35:00.000Z',
stop: '2023-07-09T16:20:00.000Z',
title: 'NHK Amateur Singing Contest',
sub_title: '"Maizuru City, Kyoto Prefecture"'
})
expect(results[55]).toMatchObject({
start: '2023-07-10T14:35:00.000Z',
stop: '2023-07-10T15:15:00.000Z',
title: 'International News Report 2023',
sub_title: null
})
})
it('can parse response with Japanese guide', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content_ja.json'))
let results = parser({ content, date })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results.length).toBe(56)
expect(results[0]).toMatchObject({
start: '2023-07-09T15:35:00.000Z',
stop: '2023-07-09T16:20:00.000Z',
title: 'NHKのど自慢',
sub_title: '【京都から生放送!▽前川清・相川七瀬】'
})
expect(results[55]).toMatchObject({
start: '2023-07-10T14:35:00.000Z',
stop: '2023-07-10T15:15:00.000Z',
title: '国際報道2023',
sub_title: null
})
})
it('can handle empty guide', () => {
const results = parser({ content: {}, date })
expect(results).toMatchObject([])
})
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="nhkworldpremium.com">
<channels>
<channel lang="en" xmltv_id="NHKWorldPremium.jp" site_id="#">NHK World Premium</channel>
</channels>
</site>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="nhkworldpremium.com">
<channels>
<channel lang="ja" xmltv_id="NHKWorldPremium.jp" site_id="#">NHK World Premium</channel>
</channels>
</site>