mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-10 09:00:07 -04:00
commit
d90c7a54b9
12 changed files with 207 additions and 370 deletions
2
SITES.md
2
SITES.md
|
@ -41,7 +41,7 @@
|
|||
| [ena.skylifetv.co.kr](sites/ena.skylifetv.co.kr) | 🟢 | |
|
||||
| [energeek.cl](sites/energeek.cl) | 🟢 | |
|
||||
| [entertainment.ie](sites/entertainment.ie) | 🟢 | |
|
||||
| [epg.i-cable.com](sites/epg.i-cable.com) | 🔴 | https://github.com/iptv-org/epg/issues/2228 |
|
||||
| [hoy.tv](sites/hoy.tv) | 🟢 | |
|
||||
| [firstmedia.com](sites/firstmedia.com) | 🟢 | |
|
||||
| [flixed.io](sites/flixed.io) | 🟢 | |
|
||||
| [foxsports.com.au](sites/foxsports.com.au) | 🟢 | |
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,89 +0,0 @@
|
|||
const axios = require('axios')
|
||||
const { DateTime } = require('luxon')
|
||||
|
||||
const API_ENDPOINT = 'http://epg.i-cable.com/ci/channel'
|
||||
|
||||
module.exports = {
|
||||
site: 'epg.i-cable.com',
|
||||
days: 2,
|
||||
request: {
|
||||
cache: {
|
||||
ttl: 60 * 60 * 1000 // 1h
|
||||
}
|
||||
},
|
||||
url: function ({ channel, date }) {
|
||||
return `${API_ENDPOINT}/epg/${channel.site_id}/${date.format('YYYY-MM-DD')}?api=api`
|
||||
},
|
||||
parser({ content, channel, date }) {
|
||||
const programs = []
|
||||
const items = parseItems(content, date)
|
||||
for (let item of items) {
|
||||
const prev = programs[programs.length - 1]
|
||||
let start = parseStart(item, date)
|
||||
const stop = start.plus({ minutes: 30 })
|
||||
if (prev) {
|
||||
if (start < prev.start) {
|
||||
start = start.plus({ days: 1 })
|
||||
date = date.add(1, 'd')
|
||||
}
|
||||
prev.stop = start
|
||||
}
|
||||
programs.push({
|
||||
title: parseTitle(item, channel),
|
||||
start,
|
||||
stop
|
||||
})
|
||||
}
|
||||
|
||||
return programs
|
||||
},
|
||||
async channels({ lang }) {
|
||||
const data = await axios
|
||||
.get(`${API_ENDPOINT}/category/0?api=api`)
|
||||
.then(r => r.data)
|
||||
.catch(console.error)
|
||||
|
||||
let channels = []
|
||||
const promises = data.cates.map(c => axios.get(`${API_ENDPOINT}/category/${c.cate_id}?api=api`))
|
||||
await Promise.allSettled(promises).then(results => {
|
||||
results.forEach(r => {
|
||||
if (r.status === 'fulfilled') {
|
||||
channels = channels.concat(r.value.data.chs)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
return channels.map(c => {
|
||||
let name = lang === 'zh' ? c.channel_name : c.channel_name_en
|
||||
name = c.remark_id == 3 ? `${name} [HD]` : name
|
||||
|
||||
return {
|
||||
site_id: c.channel_no,
|
||||
name,
|
||||
lang
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function parseTitle(item, channel) {
|
||||
return channel.lang === 'en' ? item.programme_name_eng : item.programme_name_chi
|
||||
}
|
||||
|
||||
function parseStart(item, date) {
|
||||
let meridiem = item.session_mark === 'PM' ? 'PM' : 'AM'
|
||||
return DateTime.fromFormat(
|
||||
`${date.format('YYYY-MM-DD')} ${item.time} ${meridiem}`,
|
||||
'yyyy-MM-dd hh:mm a',
|
||||
{
|
||||
zone: 'Asia/Hong_Kong'
|
||||
}
|
||||
).toUTC()
|
||||
}
|
||||
|
||||
function parseItems(content) {
|
||||
const data = JSON.parse(content)
|
||||
if (!data || !Array.isArray(data.epgs)) return []
|
||||
|
||||
return data.epgs
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
const { parser, url } = require('./epg.i-cable.com.config.js')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
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('2022-11-15', 'YYYY-MM-DD').startOf('d')
|
||||
const channel = {
|
||||
site_id: '003',
|
||||
xmltv_id: 'HOYTV.hk',
|
||||
lang: 'zh'
|
||||
}
|
||||
|
||||
it('can generate valid url', () => {
|
||||
expect(url({ channel, date })).toBe(
|
||||
'http://epg.i-cable.com/ci/channel/epg/003/2022-11-15?api=api'
|
||||
)
|
||||
})
|
||||
|
||||
it('can parse response', () => {
|
||||
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
|
||||
let results = parser({ content, channel, date })
|
||||
results = results.map(p => {
|
||||
p.start = p.start.toJSON()
|
||||
p.stop = p.stop.toJSON()
|
||||
return p
|
||||
})
|
||||
|
||||
expect(results[0]).toMatchObject({
|
||||
start: '2022-11-14T22:00:00.000Z',
|
||||
stop: '2022-11-14T23:00:00.000Z',
|
||||
title: 'Bloomberg 時段'
|
||||
})
|
||||
|
||||
expect(results[31]).toMatchObject({
|
||||
start: '2022-11-15T21:00:00.000Z',
|
||||
stop: '2022-11-15T21:30:00.000Z',
|
||||
title: 'Bloomberg 時段'
|
||||
})
|
||||
})
|
||||
|
||||
it('can parse response in English', () => {
|
||||
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
|
||||
const channelEN = { ...channel, lang: 'en' }
|
||||
let results = parser({ content, channel: channelEN, date })
|
||||
results = results.map(p => {
|
||||
p.start = p.start.toJSON()
|
||||
p.stop = p.stop.toJSON()
|
||||
return p
|
||||
})
|
||||
|
||||
expect(results[0]).toMatchObject({
|
||||
start: '2022-11-14T22:00:00.000Z',
|
||||
stop: '2022-11-14T23:00:00.000Z',
|
||||
title: 'Bloomberg Hour'
|
||||
})
|
||||
})
|
||||
|
||||
it('can handle empty guide', () => {
|
||||
const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json'))
|
||||
const results = parser({ date, channel, content })
|
||||
|
||||
expect(results).toMatchObject([])
|
||||
})
|
|
@ -1,100 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channels>
|
||||
<channel site="epg.i-cable.com" lang="de" xmltv_id="DWDeutsch.de" site_id="140">DW (Deutsch)</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ABCAustralia.au" site_id="326">ABC Australia</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="AlJazeeraEnglish.qa" site_id="133">Al Jazeera English</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="AnimalPlanetSoutheastAsia.sg" site_id="757">Animal Planet</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ArirangTV.kr" site_id="325">Arirang TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="AsianFoodNetwork.sg" site_id="717">Asian Food Network [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="BBCEarthAsia.uk" site_id="721">BBC Earth</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="BBCLifestyleAsia.uk" site_id="760">BBC Lifestyle</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="BBCNewsAsiaPacific.uk" site_id="122">BBC WorldNews</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="BloombergTVAsia.hk" site_id="155">Bloomberg TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="BoomerangAsia.sg" site_id="512">Boomerang</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CartoonNetworkAsia.sg" site_id="511">Cartoon Network</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CBeebiesAsia.uk" site_id="517">CBeebies</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CCTV1.cn" site_id="341">CCTV-1 [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CCTV11.cn" site_id="340">CCTV-11-Opera</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CCTV13.cn" site_id="111">CCTV-News</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CCTV4Asia.cn" site_id="112">CCTV-4</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CGTN.cn" site_id="129">CGTN</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CGTNDocumentary.cn" site_id="722">CGTN-Documentary [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ChannelBlue.hk" site_id="901">Channel Blue</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ChannelFire.hk" site_id="902">Channel Fire</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CNAInternational.sg" site_id="130">Ch News Asia</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CNBCAsia.sg" site_id="127">CNBC HK</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="CNNInternationalAsiaPacific.hk" site_id="124">CNNI</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="DaVinciAsia.de" site_id="513">Da Vinci</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="DiscoveryAsia.sg" site_id="710">Discovery Asia [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="DiscoveryChannelSoutheastAsia.sg" site_id="754">Discovery</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="DiscoveryScienceSoutheastAsia.sg" site_id="758">Discovery Sci</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="DMAXSoutheastAsia.sg" site_id="759">DMAX</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="DragonTV.cn" site_id="334">Dragon TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="DreamWorksChannelAsia.us" site_id="510">DreamWorks</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="DWEnglish.de" site_id="139">DW (English)</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="EBCAsia.tw" site_id="331">ETTV Asia</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="EBCYOYO.tw" site_id="502">Asia YOYO TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ETTVAsiaNews.tw" site_id="114">ETTV AsiaNews</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="EuronewsEnglish.fr" site_id="136">euronews(Eng)</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="EuronewsPortuguese.fr" site_id="137">euronews(Por)</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="EurosportAsia.fr" site_id="651">Eurosport</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="EVE.us" site_id="756">EVE</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="FashionTVAsia.fr" site_id="375">Fashion TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="FightSports.us" site_id="652">FIGHT SPORTS</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="France24English.fr" site_id="135">France 24 English</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="GlobalTrekker.sg" site_id="708">Global Trekker [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="GuangdongSatelliteTV.cn" site_id="305">GRT GBA Satellite TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="HITS.sg" site_id="310">HITS [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="HITSMovies.sg" site_id="213">HITS MOVIES [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="HKIBC.hk" site_id="005">HK Int’l Business Ch</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="HLN.us" site_id="125">CNN HLN News</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="HOYTV.hk" site_id="003">HOY TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="HubeiSatelliteTV.cn" site_id="337">Hubei TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="HunanTVInternational.cn" site_id="336">Hunan TV International</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLECableMovies.hk" site_id="251">CABLE Movies</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEChannel18.hk" site_id="618">Channel 18</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLECinep.hk" site_id="253">Cine p.</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEFamilyEntertainmentChannel.hk" site_id="371">Family Entertainment Channel</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEFinanceInfoChannel.hk" site_id="151">i-CABLE Finance Info Channel</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEHD603.hk" site_id="603">HD Channel 603 [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEHorseRacing1.hk" site_id="668">Horse Racing 1</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLEHorseRacing2.hk" site_id="669">Horse Racing 2</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLELiveNewsChannel.hk" site_id="153">i-CABLE Live News Channel</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLENewsChannel.hk" site_id="152">i-CABLE News Channel</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLESportsChannel.hk" site_id="661">Sports Channel</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLESportsPlus1.hk" site_id="662">Sports Plus 1</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLESportsPlus2.hk" site_id="664">Sports Plus 2</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="iCABLESportsPlus3.hk" site_id="665">Sports Plus 3</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="LFCTV.uk" site_id="654">LFCTV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="MTVLive.uk" site_id="333">MTV Live</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="MyCinemaEurope.ch" site_id="252">MyCineEu</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="NationalGeographic.hk" site_id="752">National Geographic</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="NationalGeographicWild.hk" site_id="751">Nat Geo Wild</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="NHKWorldJapan.jp" site_id="126">NHK World-Japan</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="NHKWorldPremium.jp" site_id="322">NHK World Pr</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="NickelodeonAsia.sg" site_id="514">Nickelodeon</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="NickJrAsia.sg" site_id="515">Nick Jr.</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="OutdoorChannelInternational.us" site_id="761">Outdoor Channel</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ParamountNetworkAsia.us" site_id="312">Paramount Network Asia [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="PetClubTV.hk" site_id="730">Pet Club TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="PhoenixChineseChannel.hk" site_id="376">Phoenix Chi</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="PhoenixHongKongChannel.hk" site_id="304">Phoenix Hong Kong Channel</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="PhoenixInfoNewsChannel.hk" site_id="154">PhoenixInfonews</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ROCKEntertainment.sg" site_id="378">ROCK Entertainment</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ROCKExtreme.sg" site_id="318">ROCK Extreme [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="RT.ru" site_id="131">Russia Today</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ShenzhenSatelliteTV.cn" site_id="335">SZTV</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="SkyNewsInternational.uk" site_id="121">Sky News</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="StarChineseChannel.hk" site_id="332">STAR Chinese Channel</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="StarChineseMovies.hk" site_id="204">Star Chinese Movies [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="TechStorm.sg" site_id="610">TechStorm [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="Thrill.hk" site_id="219">Thrill</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="TLCSoutheastAsia.sg" site_id="755">TLC</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="TravelChannelSoutheastAsia.sg" site_id="718">Travel Channel [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="tvNAsia.hk" site_id="377">tvN</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="WION.in" site_id="852">WION</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="ZeeCinemaAsia.in" site_id="853">Zee Cinema</channel>
|
||||
<channel site="epg.i-cable.com" lang="en" xmltv_id="Zing.in" site_id="854">Zing</channel>
|
||||
<channel site="epg.i-cable.com" lang="fr" xmltv_id="France24French.fr" site_id="134">France 24 French</channel>
|
||||
<channel site="epg.i-cable.com" lang="hi" xmltv_id="ZeeTVAsiaPacific.sg" site_id="851">Zee TV</channel>
|
||||
</channels>
|
|
@ -1,69 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channels>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="AnimalPlanetSoutheastAsia.sg" site_id="757">動物星球頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="AsianFoodNetwork.sg" site_id="717">亞洲美食頻道 [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="BBCEarthAsia.uk" site_id="721">BBC Earth</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="BBCLifestyleAsia.uk" site_id="760">BBC Lifestyle</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="BloombergTVAsia.hk" site_id="155">Bloomberg TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="BoomerangAsia.sg" site_id="512">Boomerang 頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CartoonNetworkAsia.sg" site_id="511">卡通頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CCTV1.cn" site_id="341">中央電視台綜合頻道 [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CCTV11.cn" site_id="340">中央電視台戲曲頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CCTV13.cn" site_id="111">中央電視台新聞頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CCTV4Asia.cn" site_id="112">中央電視台中文國際頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ChannelBlue.hk" site_id="901">歡樂台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ChannelFire.hk" site_id="902">惹火台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="CNAInternational.sg" site_id="130">亞洲新聞台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DiscoveryAsia.sg" site_id="710">Discovery Asia [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DiscoveryChannelSoutheastAsia.sg" site_id="754">Discovery</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DiscoveryScienceSoutheastAsia.sg" site_id="758">Discovery科學頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DMAXSoutheastAsia.sg" site_id="759">DMAX</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DragonTV.cn" site_id="334">東方衛視國際頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="DreamWorksChannelAsia.us" site_id="510">夢工廠</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EBCAsia.tw" site_id="331">東森亞洲衛視</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EBCYOYO.tw" site_id="502">東森亞洲幼幼台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ETTVAsiaNews.tw" site_id="114">東森亞洲新聞台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EuronewsEnglish.fr" site_id="136">euronews(Eng)</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EuronewsPortuguese.fr" site_id="137">euronews(Por)</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="EVE.us" site_id="756">EVE</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="GlobalTrekker.sg" site_id="708">Global Trekker [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="GuangdongSatelliteTV.cn" site_id="305">大灣區衛視</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HITS.sg" site_id="310">HITS [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HITSMovies.sg" site_id="213">HITS MOVIES [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HKIBC.hk" site_id="005">香港國際財經台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HOYTV.hk" site_id="003">HOY TV</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HubeiSatelliteTV.cn" site_id="337">湖北衛視</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="HunanTVInternational.cn" site_id="336">湖南廣播電視台國際頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLECableMovies.hk" site_id="251">有線電影台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEChannel18.hk" site_id="618">有線18台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLECinep.hk" site_id="253">Cine p.</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEFamilyEntertainmentChannel.hk" site_id="371">綜合娛樂台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEFinanceInfoChannel.hk" site_id="151">財經資訊台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEHD603.hk" site_id="603">高清603台 [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEHorseRacing1.hk" site_id="668">賽馬1台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLEHorseRacing2.hk" site_id="669">賽馬2台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLELiveNewsChannel.hk" site_id="153">直播新聞台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLENewsChannel.hk" site_id="152">新聞台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLESportsChannel.hk" site_id="661">體育台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLESportsPlus1.hk" site_id="662">Sports Plus 1</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLESportsPlus2.hk" site_id="664">Sports Plus 2</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="iCABLESportsPlus3.hk" site_id="665">Sports Plus 3</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="MyCinemaEurope.ch" site_id="252">光影歐洲</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="NationalGeographic.hk" site_id="752">國家地理頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="NationalGeographicWild.hk" site_id="751">國家地理野生頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="NickelodeonAsia.sg" site_id="514">Nickelodeon</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ParamountNetworkAsia.us" site_id="312">Paramount Network Asia [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="PhoenixChineseChannel.hk" site_id="376">鳯凰衛視中文台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="PhoenixHongKongChannel.hk" site_id="304">鳳凰衛視香港台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="PhoenixInfoNewsChannel.hk" site_id="154">鳳凰衛視資訊台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ROCKEntertainment.sg" site_id="378">ROCK綜藝娛樂</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ROCKExtreme.sg" site_id="318">ROCK超極娛樂 [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ShenzhenSatelliteTV.cn" site_id="335">深圳電視台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="StarChineseChannel.hk" site_id="332">衛視中文台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="StarChineseMovies.hk" site_id="204">衛視電影台 [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="Thrill.hk" site_id="219">驚慄電影台</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="TLCSoutheastAsia.sg" site_id="755">旅遊生活頻道</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="TravelChannelSoutheastAsia.sg" site_id="718">旅遊頻道 [HD]</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="tvNAsia.hk" site_id="377">tvN</channel>
|
||||
<channel site="epg.i-cable.com" lang="zh" xmltv_id="ZeeCinemaAsia.in" site_id="853">Zee Cinema</channel>
|
||||
</channels>
|
|
@ -1,37 +0,0 @@
|
|||
# epg.i-cable.com
|
||||
|
||||
https://epg.i-cable.com/
|
||||
|
||||
### Download the guide
|
||||
|
||||
Chinese:
|
||||
|
||||
```sh
|
||||
npm run grab -- --site=epg.i-cable.com --lang=zh
|
||||
```
|
||||
|
||||
English:
|
||||
|
||||
```sh
|
||||
npm run grab -- --site=epg.i-cable.com --lang=en
|
||||
```
|
||||
|
||||
### Update channel list
|
||||
|
||||
Chinese:
|
||||
|
||||
```sh
|
||||
npm run channels:parse -- --config=./sites/epg.i-cable.com/epg.i-cable.com.config.js --output=./sites/epg.i-cable.com/epg.i-cable.com_zh.channels.xml --set=lang:zh
|
||||
```
|
||||
|
||||
English:
|
||||
|
||||
```sh
|
||||
npm run channels:parse -- --config=./sites/epg.i-cable.com/epg.i-cable.com.config.js --output=./sites/epg.i-cable.com/epg.i-cable.com_en.channels.xml --set=lang:en
|
||||
```
|
||||
|
||||
### Test
|
||||
|
||||
```sh
|
||||
npm test -- epg.i-cable.com
|
||||
```
|
6
sites/hoy.tv/hoy.tv.channels.xml
Normal file
6
sites/hoy.tv/hoy.tv.channels.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channels>
|
||||
<channel site="hoy.tv" lang="zh" xmltv_id="HOYIBC.hk" site_id="76">HOY 國際財經台</channel>
|
||||
<channel site="hoy.tv" lang="zh" xmltv_id="HOYTV.hk" site_id="77">HOY TV</channel>
|
||||
<channel site="hoy.tv" lang="zh" xmltv_id="HOYInfotainment.hk" site_id="78">HOY 資訊台</channel>
|
||||
</channels>
|
63
sites/hoy.tv/hoy.tv.config.js
Normal file
63
sites/hoy.tv/hoy.tv.config.js
Normal file
|
@ -0,0 +1,63 @@
|
|||
const axios = require('axios')
|
||||
const convert = require('xml-js')
|
||||
const dayjs = require('dayjs')
|
||||
const timezone = require('dayjs/plugin/timezone')
|
||||
|
||||
dayjs.extend(timezone)
|
||||
|
||||
module.exports = {
|
||||
site: 'hoy.tv',
|
||||
days: 2,
|
||||
request: {
|
||||
cache: {
|
||||
ttl: 60 * 60 * 1000 // 1h
|
||||
}
|
||||
},
|
||||
url: function ({ channel, date }) {
|
||||
return `https://epg-file.hoy.tv/hoy/OTT${channel.site_id}${date.format('YYYYMMDD')}.xml`
|
||||
},
|
||||
parser({ content, channel, date }) {
|
||||
const data = convert.xml2js(content, {
|
||||
compact: true,
|
||||
ignoreDeclaration: true,
|
||||
ignoreAttributes: true
|
||||
})
|
||||
|
||||
const programs = []
|
||||
|
||||
for (let item of data.ProgramGuide.Channel.EpgItem) {
|
||||
const start = dayjs.tz(item.EpgStartDateTime._text, 'YYYY-MM-DD HH:mm:ss', 'Asia/Hong_Kong')
|
||||
|
||||
if (! date.isSame(start, 'day')) {
|
||||
continue
|
||||
}
|
||||
|
||||
const epIndex = item.EpisodeInfo.EpisodeIndex._text
|
||||
const subtitle = parseInt(epIndex) > 0 ? `第${epIndex}集` : undefined
|
||||
|
||||
programs.push({
|
||||
title: `${item.ComScore.ns_st_pr._text}${item.EpgOtherInfo?._text || ''}`,
|
||||
sub_title: subtitle,
|
||||
description: item.EpisodeInfo.EpisodeLongDescription._text,
|
||||
start,
|
||||
stop: dayjs.tz(item.EpgEndDateTime._text, 'YYYY-MM-DD HH:mm:ss', 'Asia/Hong_Kong'),
|
||||
})
|
||||
}
|
||||
|
||||
return programs
|
||||
},
|
||||
async channels({ lang }) {
|
||||
const data = await axios
|
||||
.get('https://api2.hoy.tv/api/v2/a/channel')
|
||||
.then(r => r.data)
|
||||
.catch(console.error)
|
||||
|
||||
return data.data.map(c => {
|
||||
return {
|
||||
site_id: c.videos.id,
|
||||
name: c.name.zh_hk,
|
||||
lang: 'zh',
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
116
sites/hoy.tv/hoy.tv.test.js
Normal file
116
sites/hoy.tv/hoy.tv.test.js
Normal file
|
@ -0,0 +1,116 @@
|
|||
const { parser, url } = require('./hoy.tv.config.js')
|
||||
const dayjs = require('dayjs')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
|
||||
dayjs.extend(utc)
|
||||
|
||||
jest.mock('axios')
|
||||
|
||||
const date = dayjs.utc('2024-09-13', 'YYYY-MM-DD').startOf('d')
|
||||
const channel = {
|
||||
site_id: '76',
|
||||
xmltv_id: 'HOYIBC.hk',
|
||||
lang: 'zh'
|
||||
}
|
||||
const content = `<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<ProgramGuide>
|
||||
<Channel id="76">
|
||||
<EpgItem>
|
||||
<EpgStartDateTime>2024-09-13 11:30:00</EpgStartDateTime>
|
||||
<EpgEndDateTime>2024-09-13 12:30:00</EpgEndDateTime>
|
||||
<EpgOtherInfo>[PG]</EpgOtherInfo>
|
||||
<DisableLive>false</DisableLive>
|
||||
<DisableVod>false</DisableVod>
|
||||
<VODLicPeriod>2024-09-27 11:30:00</VODLicPeriod>
|
||||
<ProgramInfo>
|
||||
<ProgramId>0</ProgramId>
|
||||
<ProgramTitle></ProgramTitle>
|
||||
<ProgramPos>0</ProgramPos>
|
||||
<FirstRunDateTime></FirstRunDateTime>
|
||||
<ProgramThumbnailUrl>http://tv.fantv.hk/images/thumbnail_1920_1080_fantv.jpg</ProgramThumbnailUrl>
|
||||
</ProgramInfo>
|
||||
<EpisodeInfo>
|
||||
<EpisodeId>EQ00135</EpisodeId>
|
||||
<EpisodeIndex>46</EpisodeIndex>
|
||||
<EpisodeShortDescription>點講都係一家人</EpisodeShortDescription>
|
||||
<EpisodeLongDescription></EpisodeLongDescription>
|
||||
<EpisodeThumbnailUrl>http://tv.fantv.hk/images/nosuchthumbnail.jpg</EpisodeThumbnailUrl>
|
||||
</EpisodeInfo>
|
||||
<ComScore>
|
||||
<ns_st_stc></ns_st_stc>
|
||||
<ns_st_pr>點講都係一家人</ns_st_pr>
|
||||
<ns_st_tpr>0</ns_st_tpr>
|
||||
<ns_st_tep>EQ00135</ns_st_tep>
|
||||
<ns_st_ep>點講都係一家人 Episode 46</ns_st_ep>
|
||||
<ns_st_li>1</ns_st_li>
|
||||
<ns_st_tdt>20240913</ns_st_tdt>
|
||||
<ns_st_tm>1130</ns_st_tm>
|
||||
<ns_st_ty>0001</ns_st_ty>
|
||||
<ns_st_cl>3704000</ns_st_cl>
|
||||
</ComScore>
|
||||
</EpgItem>
|
||||
<EpgItem>
|
||||
<EpgStartDateTime>2024-09-13 12:30:00</EpgStartDateTime>
|
||||
<EpgEndDateTime>2024-09-13 13:30:00</EpgEndDateTime>
|
||||
<EpgOtherInfo></EpgOtherInfo>
|
||||
<DisableLive>false</DisableLive>
|
||||
<DisableVod>false</DisableVod>
|
||||
<VODLicPeriod>2024-09-27 12:30:00</VODLicPeriod>
|
||||
<ProgramInfo>
|
||||
<ProgramId>0</ProgramId>
|
||||
<ProgramTitle></ProgramTitle>
|
||||
<ProgramPos>0</ProgramPos>
|
||||
<FirstRunDateTime></FirstRunDateTime>
|
||||
<ProgramThumbnailUrl>http://tv.fantv.hk/images/thumbnail_1920_1080_fantv.jpg</ProgramThumbnailUrl>
|
||||
</ProgramInfo>
|
||||
<EpisodeInfo>
|
||||
<EpisodeId>ED00311</EpisodeId>
|
||||
<EpisodeIndex>0</EpisodeIndex>
|
||||
<EpisodeShortDescription>麝香之路</EpisodeShortDescription>
|
||||
<EpisodeLongDescription>Ep. 2 .The Secret of disappeared kingdom.shows the mysterious disappearance of the ancient Tibetan kingdom which gained world</EpisodeLongDescription>
|
||||
<EpisodeThumbnailUrl>http://tv.fantv.hk/images/nosuchthumbnail.jpg</EpisodeThumbnailUrl>
|
||||
</EpisodeInfo>
|
||||
<ComScore>
|
||||
<ns_st_stc></ns_st_stc>
|
||||
<ns_st_pr>麝香之路</ns_st_pr>
|
||||
<ns_st_tpr>0</ns_st_tpr>
|
||||
<ns_st_tep>ED00311</ns_st_tep>
|
||||
<ns_st_ep>麝香之路 2024-09-13</ns_st_ep>
|
||||
<ns_st_li>1</ns_st_li>
|
||||
<ns_st_tdt>20240913</ns_st_tdt>
|
||||
<ns_st_tm>1230</ns_st_tm>
|
||||
<ns_st_ty>0001</ns_st_ty>
|
||||
<ns_st_cl>3704000</ns_st_cl>
|
||||
</ComScore>
|
||||
</EpgItem>
|
||||
</Channel>
|
||||
</ProgramGuide>`
|
||||
|
||||
it('can generate valid url', () => {
|
||||
expect(url({ channel, date })).toBe(
|
||||
'https://epg-file.hoy.tv/hoy/OTT7620240913.xml'
|
||||
)
|
||||
})
|
||||
|
||||
it('can parse response', () => {
|
||||
const result = parser({ content, channel, date }).map(p => {
|
||||
p.start = p.start.toJSON()
|
||||
p.stop = p.stop.toJSON()
|
||||
return p
|
||||
})
|
||||
|
||||
expect(result).toMatchObject([
|
||||
{
|
||||
start: '2024-09-13T03:30:00.000Z',
|
||||
stop: '2024-09-13T04:30:00.000Z',
|
||||
title: '點講都係一家人[PG]',
|
||||
sub_title: '第46集',
|
||||
},
|
||||
{
|
||||
start: '2024-09-13T04:30:00.000Z',
|
||||
stop: '2024-09-13T05:30:00.000Z',
|
||||
title: '麝香之路',
|
||||
description: 'Ep. 2 .The Secret of disappeared kingdom.shows the mysterious disappearance of the ancient Tibetan kingdom which gained world',
|
||||
}
|
||||
])
|
||||
})
|
21
sites/hoy.tv/readme.md
Normal file
21
sites/hoy.tv/readme.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
# hoy.tv
|
||||
|
||||
https://hoy.tv/
|
||||
|
||||
### Download the guide
|
||||
|
||||
```sh
|
||||
npm run grab -- --site=hoy.tv
|
||||
```
|
||||
|
||||
### Update channel list
|
||||
|
||||
```sh
|
||||
npm run channels:parse -- --config=./sites/hoy.tv/hoy.tv.config.js --output=./sites/hoy.tv/hoy.tv.channels.xml
|
||||
```
|
||||
|
||||
### Test
|
||||
|
||||
```sh
|
||||
npm test -- hoy.tv
|
||||
```
|
Loading…
Add table
Add a link
Reference in a new issue