Merge pull request #2130 from iptv-org/add-nhkworldpremium.com
Add nhkworldpremium.com
This commit is contained in:
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>
|
||||
Reference in new issue
Block a user