Merge pull request #2439 from aarubui/master

add hoy.tv
This commit is contained in:
Ismaël Moret
2024-09-29 18:00:41 +02:00
committed by GitHub
12 changed files with 207 additions and 370 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -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
}

View File

@@ -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([])
})

View File

@@ -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 Intl 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>

View File

@@ -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>

View File

@@ -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
```

View 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>

View 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
View 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
View 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
```