Merge pull request #3214 from tohenk/update-nowplayer.now.com

Scrape detailed guide on nowplayer.now.com.
This commit is contained in:
PopeyeTheSai10r
2026-07-27 05:07:21 -07:00
committed by GitHub
7 changed files with 1309 additions and 68 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,55 @@
{
"actualStartTime": 1783785600000,
"programDateTimeForMobile": "Tomorrow 12 Jul\u003Cbr /\u003E12:00 AM-12:30 AM",
"autoProgName": "第2集 - The Beginning Of The Story",
"autoSeriesName": "克拉龍人拉格納",
"autoSynopsis": "翼之血族在各地發動全面進攻, 拉格納運用獲得的力量與新出現的上級龍梅古卜帝戰鬥, 而他在此時所遇見的少女又是何許人物?未來與現在的記憶混亂不清, 為了迴避自己曾經歷過的淒慘未來, 拉格納決定投入與龍族的戰鬥, 並下定決心與某人道別。",
"channelAutoName": "Animax",
"channelChiName": "Animax",
"channelEngName": "Animax",
"channelId": "150",
"channelKey": "201507200000414",
"chiProgName": "第2集 - The Beginning Of The Story",
"chiSeriesName": "克拉龍人拉格納",
"chiSynopsis": "翼之血族在各地發動全面進攻, 拉格納運用獲得的力量與新出現的上級龍梅古卜帝戰鬥, 而他在此時所遇見的少女又是何許人物?未來與現在的記憶混亂不清, 為了迴避自己曾經歷過的淒慘未來, 拉格納決定投入與龍族的戰鬥, 並下定決心與某人道別。",
"cid": "ragna crimsons1e2the beginning of the story",
"createdBy": "keith.sk.hung@pccw.com",
"createdDate": "2026-06-24 12:13:00.0",
"director": "Ken Takakura",
"duration": 30,
"effectiveDay": 7,
"endTime": 1783787400000,
"engProgName": "E2 - The Beginning Of The Story",
"engSeriesName": "Ragna Crimson",
"engSynopsis": "Ragna uses his newly gained power to hunt dragons and makes a resolution to avoid the miserable future that awaits him.",
"episodeName": "Ragna Crimson S1E2 -The Beginning Of The Story",
"episodeNum": 2,
"episodic": "Y",
"expirationDay": 10,
"firstReleaseYear": 2023,
"genre": "Anime",
"hasOtherNonAdult": false,
"hasOtherTime": false,
"isDeleted": "N",
"isKolWatchParty": "N",
"isLive": "N",
"isNpvrOnair": "N",
"isNpvrProg": "Y",
"isRestartTv": "N",
"isRestartOtt": "N",
"modifiedBy": "Npvr Postcut Assetloader",
"modifiedDate": "2026-07-05 00:00:27.0",
"originalLanguage": "Japanese",
"portraitImage": "",
"premier": 0,
"progName": "Ragna Crimson S1E2 -The Beginning Of The Story",
"programId": "202606244351477",
"recordable": "Y",
"seriesName": "Ragna Crimson",
"sid": "ragna crimsons1",
"synopsis": "Ragna uses his newly gained power to hunt dragons and makes a resolution to avoid the miserable future that awaits him.",
"watchPartyPlatform": [],
"withImageTitle": "N",
"isAdultContent": false,
"isInWatchlist": false
}
@@ -0,0 +1,55 @@
{
"actualStartTime": 1783871880000,
"programDateTimeForMobile": "Tomorrow 12 Jul\u003Cbr /\u003E11:58 PM-12:30 AM",
"autoProgName": "第25集 - I'm Different Now",
"autoSeriesName": "魔法水果籃",
"autoSynopsis": "紅野看了小透準備的一個類似灰姑娘的故事, 並希望他能知道亞里紗對自己的感覺。",
"channelAutoName": "Animax",
"channelChiName": "Animax",
"channelEngName": "Animax",
"channelId": "150",
"channelKey": "201507200000414",
"chiProgName": "第25集 - I'm Different Now",
"chiSeriesName": "魔法水果籃",
"chiSynopsis": "紅野看了小透準備的一個類似灰姑娘的故事, 並希望他能知道亞里紗對自己的感覺。",
"cid": "fruits baskets2e25i'm different now",
"createdBy": "keith.sk.hung@pccw.com",
"createdDate": "2026-06-24 12:13:00.0",
"director": "Yoshihide Ibata",
"duration": 32,
"effectiveDay": 7,
"endTime": 1783873800000,
"engProgName": "E25 - I'm Different Now",
"engSeriesName": "Fruits Basket",
"engSynopsis": "Kureno watches a copy of the Cinderella-ish play which Tohru prepared, hoping that he will realize Arisa's feelings for him.",
"episodeName": "Fruits Basket S2E25 -I'm Different Now",
"episodeNum": 25,
"episodic": "Y",
"expirationDay": 10,
"firstReleaseYear": 2020,
"genre": "Anime",
"hasOtherNonAdult": true,
"hasOtherTime": true,
"isDeleted": "N",
"isKolWatchParty": "N",
"isLive": "N",
"isNpvrOnair": "N",
"isNpvrProg": "Y",
"isRestartTv": "N",
"isRestartOtt": "N",
"modifiedBy": "Npvr Postcut Assetloader",
"modifiedDate": "2026-07-06 00:00:24.0",
"originalLanguage": "Japanese",
"portraitImage": "",
"premier": 0,
"progName": "Fruits Basket S2E25 -I'm Different Now",
"programId": "202606244351525",
"recordable": "Y",
"seriesName": "Fruits Basket",
"sid": "fruits baskets2",
"synopsis": "Kureno watches a copy of the Cinderella-ish play which Tohru prepared, hoping that he will realize Arisa's feelings for him.",
"watchPartyPlatform": [],
"withImageTitle": "N",
"isAdultContent": false,
"isInWatchlist": false
}
@@ -2,34 +2,81 @@ const axios = require('axios')
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const doFetch = require('@ntlab/sfetch')
dayjs.extend(utc)
const eventIds = {}
const cookies = {}
const caches = {}
module.exports = {
site: 'nowplayer.now.com',
days: 2,
url: function ({ channel, date }) {
url({ channel, date }) {
const diff = date.diff(dayjs.utc().startOf('d'), 'd') + 1
return `https://nowplayer.now.com/tvguide/epglist?channelIdList[]=${channel.site_id}&day=${diff}`
},
request: {
cache: {
ttl: 24 * 60 * 60 * 1000 // 1 day
},
headers({ channel }) {
return {
Cookie: `LANG=${channel.lang}; Expires=null; Path=/; Domain=nowplayer.now.com`
'user-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 OPR/132.0.0.0',
'cookie': Object.entries({ ...cookies, LANG: channel.lang})
.map(a => `${a[0]}=${a[1]}`)
.join('; ')
}
}
},
parser: function ({ content }) {
let programs = []
async parser({ content, channel, headers }) {
const programs = []
parseCookies(headers)
const items = parseItems(content)
items.forEach(item => {
programs.push({
title: item.name,
start: parseStart(item),
stop: parseStop(item)
if (items.length) {
if (eventIds[channel.lang] === undefined) {
eventIds[channel.lang] = []
}
const queues = items
.filter(item => item.vimProgramId && !eventIds[channel.lang].includes(item.vimProgramId))
.map(item => {
const url = `https://nowplayer.now.com/tvguide/epgprogramdetail?programId=${item.vimProgramId}`
if (caches[url] !== undefined) {
item.detail = caches[url]
} else {
return {
url,
params: { headers: module.exports.request.headers({ channel }) },
item
}
}
})
.filter(Boolean)
const worker = process.env.EPG_DETAILED_GUIDE_WORKER || 10
const delay = process.env.EPG_DETAILED_GUIDE_DELAY || 500
await doFetch(queues, { worker }, async (queue, res, headers) => {
parseCookies(headers)
queue.item.detail = res
caches[queue.url] = res
await new Promise(resolve => setTimeout(resolve, delay))
})
})
items.forEach(item => {
eventIds[channel.lang].push(item.vimProgramId)
programs.push({
title: (channel.lang === 'zh' ? item.detail?.chiProgName : item.detail?.progName) || item.name,
description: channel.lang === 'zh' ? item.detail?.chiSynopsis : item.detail?.synopsis,
categories: [item.detail?.genre, item.detail?.subGenre].filter(Boolean),
actor: item.detail?.actor?.split(',').map(a => a.trim()),
director: item.detail?.director?.split(',').map(a => a.trim()),
year: item.detail?.firstReleaseYear?.toString(),
start: getDate(item.start),
stop: getDate(item.end)
})
})
}
return programs
},
@@ -39,7 +86,7 @@ module.exports = {
.then(r => r.data)
.catch(console.log)
let channels = []
const channels = []
const $ = cheerio.load(html)
$('body > div.container > .tv-guide-s-g > div > div').each((i, el) => {
@@ -54,17 +101,27 @@ module.exports = {
}
}
function parseStart(item) {
return dayjs(item.start)
}
function parseStop(item) {
return dayjs(item.end)
}
function parseItems(content) {
const data = JSON.parse(content)
if (!data || !Array.isArray(data)) return []
return Array.isArray(data[0]) ? data[0] : []
}
function parseCookies(headers) {
if (headers && Array.isArray(headers['set-cookie'])) {
headers['set-cookie']
.map(cookie => cookie.split(';')[0].trim())
.forEach(cookie => {
const [k, v] = [
cookie.substr(0, cookie.indexOf('=')),
cookie.substr(cookie.indexOf('=') + 1),
]
cookies[k] = v
})
}
}
function getDate(dt) {
return dayjs.utc(dt)
}
@@ -1,57 +1,119 @@
const { parser, url, request } = require('./nowplayer.now.com.config.js')
const axios = require('axios')
const fs = require('fs')
const path = require('path')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
process.env.EPG_DETAILED_GUIDE_DELAY = 0
dayjs.extend(customParseFormat)
dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc().startOf('d')
const channel = {
lang: 'zh',
site_id: '096',
xmltv_id: 'ViuTVsix.hk'
lang: 'en',
site_id: '150',
xmltv_id: 'AnimaxAsia.sg@SD'
}
axios.get.mockImplementation(url => {
const urls = {
'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=1': 'content.json',
'https://nowplayer.now.com/tvguide/epgprogramdetail?programId=202606244351477': 'program01.json',
'https://nowplayer.now.com/tvguide/epgprogramdetail?programId=202606244351525': 'program02.json'
}
let data = ''
if (urls[url] !== undefined) {
data = JSON.parse(fs.readFileSync(path.join(__dirname, '__data__', urls[url])))
}
return Promise.resolve({ data })
})
it('can generate valid url for today', () => {
const date = dayjs.utc().startOf('d')
expect(url({ channel, date })).toBe(
'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=096&day=1'
'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=1'
)
})
it('can generate valid url for tomorrow', () => {
const date = dayjs.utc().startOf('d').add(1, 'd')
expect(url({ channel, date })).toBe(
'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=096&day=2'
expect(url({ channel, date: date.add(1, 'd') })).toBe(
'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=2'
)
})
it('can generate valid request headers', () => {
expect(request.headers({ channel })).toMatchObject({
Cookie: 'LANG=zh; Expires=null; Path=/; Domain=nowplayer.now.com'
cookie: 'LANG=en'
})
})
it('can parse response', () => {
it('can parse en response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
const result = parser({ content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
const result = (await parser({ content, channel, date }))
.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2021-11-23T18:00:00.000Z',
stop: '2021-11-24T01:00:00.000Z',
title: 'ViuTVsix Station Closing'
}
])
expect(result.length).toBe(49)
expect(result[0]).toMatchObject({
start: '2026-07-11T16:00:00.000Z',
stop: '2026-07-11T16:30:00.000Z',
title: 'Ragna Crimson S1E2 -The Beginning Of The Story',
description:
'Ragna uses his newly gained power to hunt dragons and makes a resolution to avoid the miserable future that awaits him.',
categories: ['Anime'],
year: '2023'
})
expect(result[48]).toMatchObject({
start: '2026-07-12T15:58:00.000Z',
stop: '2026-07-12T16:30:00.000Z',
title: 'Fruits Basket S2E25 -I\'m Different Now',
description:
'Kureno watches a copy of the Cinderella-ish play which Tohru prepared, hoping that he will realize Arisa\'s feelings for him.',
categories: ['Anime'],
year: '2020'
})
})
it('can handle empty guide', () => {
const result = parser({
it('can parse zh response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
const result = (await parser({ content, channel: { ...channel, lang: 'zh' }, date }))
.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result.length).toBe(49)
expect(result[0]).toMatchObject({
start: '2026-07-11T16:00:00.000Z',
stop: '2026-07-11T16:30:00.000Z',
title: '第2集 - The Beginning Of The Story',
description:
'翼之血族在各地發動全面進攻, 拉格納運用獲得的力量與新出現的上級龍梅古卜帝戰鬥, 而他在此時所遇見的少女又是何許人物?未來與現在的記憶混亂不清, 為了迴避自己曾經歷過的淒慘未來, 拉格納決定投入與龍族的戰鬥, 並下定決心與某人道別。',
categories: ['Anime'],
year: '2023'
})
expect(result[48]).toMatchObject({
start: '2026-07-12T15:58:00.000Z',
stop: '2026-07-12T16:30:00.000Z',
title: '第25集 - I\'m Different Now',
description:
'紅野看了小透準備的一個類似灰姑娘的故事, 並希望他能知道亞里紗對自己的感覺。',
categories: ['Anime'],
year: '2020'
})
})
it('can handle empty guide', async () => {
const result = await parser({
content: '[[]]'
})
expect(result).toMatchObject([])
@@ -1,16 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="nowplayer.now.com" site_id="168" lang="en" xmltv_id="">MOOV Concert/MV</channel>
<channel site="nowplayer.now.com" site_id="400" lang="en" xmltv_id="">Watch N Learn</channel>
<channel site="nowplayer.now.com" site_id="535" lang="en" xmltv_id="">Netflix</channel>
<channel site="nowplayer.now.com" site_id="600" lang="en" xmltv_id="">Sports Schedule Highlights</channel>
<channel site="nowplayer.now.com" site_id="613" lang="en" xmltv_id="">Now Sports 4K 3</channel>
<channel site="nowplayer.now.com" site_id="615" lang="en" xmltv_id="">Now Sports 615</channel>
<channel site="nowplayer.now.com" site_id="627" lang="en" xmltv_id="">Now Sports Premier League 7</channel>
<channel site="nowplayer.now.com" site_id="641" lang="en" xmltv_id="">Now Sports 641</channel>
<channel site="nowplayer.now.com" site_id="647" lang="en" xmltv_id="">Now Sports 647</channel>
<channel site="nowplayer.now.com" site_id="651" lang="en" xmltv_id="">Now Sports 651</channel>
<channel site="nowplayer.now.com" site_id="652" lang="en" xmltv_id="">Now Sports 652</channel>
<channel site="nowplayer.now.com" site_id="900" lang="en" xmltv_id="">Adult Promotional Channel</channel>
<channel site="nowplayer.now.com" site_id="688" lang="en" xmltv_id="">Lucky 688</channel>
<channel site="nowplayer.now.com" site_id="561" lang="en" xmltv_id="ABCAustralia.au@SD">ABC Australia</channel>
<channel site="nowplayer.now.com" site_id="325" lang="en" xmltv_id="AlJazeera.qa@English">Al Jazeera English</channel>
<channel site="nowplayer.now.com" site_id="210" lang="en" xmltv_id="AnimalPlanetSoutheastAsia.sg@SD">Animal Planet</channel>
@@ -34,7 +31,6 @@
<channel site="nowplayer.now.com" site_id="542" lang="en" xmltv_id="CCTV4Asia.cn@SD">CCTV-4</channel>
<channel site="nowplayer.now.com" site_id="545" lang="en" xmltv_id="CCTV13.cn@SD">CCTV-13</channel>
<channel site="nowplayer.now.com" site_id="330" lang="en" xmltv_id="CGTN.cn@SD">CGTN</channel>
<channel site="nowplayer.now.com" site_id="903" lang="en" xmltv_id="ChannelAdult.hk@SD">Channel Adult</channel>
<channel site="nowplayer.now.com" site_id="113" lang="en" xmltv_id="CinemaxAsia.sg@SD">CINEMAX</channel>
<channel site="nowplayer.now.com" site_id="322" lang="en" xmltv_id="CNA.sg@SD">Channel NewsAsia</channel>
<channel site="nowplayer.now.com" site_id="319" lang="en" xmltv_id="CNBCAsia.sg@SD">CNBC</channel>
@@ -42,7 +38,6 @@
<channel site="nowplayer.now.com" site_id="780" lang="en" xmltv_id="ColorsAsiaPacific.in@SD">COLORS</channel>
<channel site="nowplayer.now.com" site_id="222" lang="en" xmltv_id="CrimePlusInvestigationAsia.sg@SD">Crime + Investigation</channel>
<channel site="nowplayer.now.com" site_id="538" lang="en" xmltv_id="CTiAsia.tw@SD">CTI Asia Channel</channel>
<channel site="nowplayer.now.com" site_id="460" lang="en" xmltv_id="DaVinciAsia.de@SD">Da Vinci</channel>
<channel site="nowplayer.now.com" site_id="208" lang="en" xmltv_id="DiscoveryAsia.sg@SD">Discovery Asia</channel>
<channel site="nowplayer.now.com" site_id="209" lang="en" xmltv_id="DiscoveryChannelSoutheastAsia.sg@SD">Discovery Channel</channel>
<channel site="nowplayer.now.com" site_id="211" lang="en" xmltv_id="DiscoveryScienceSoutheastAsia.sg@SD">Discovery Science</channel>
@@ -63,7 +58,6 @@
<channel site="nowplayer.now.com" site_id="223" lang="en" xmltv_id="HistoryAsia.us@SD">HISTORY</channel>
<channel site="nowplayer.now.com" site_id="513" lang="en" xmltv_id="HITS.sg@SD">HITS</channel>
<channel site="nowplayer.now.com" site_id="119" lang="en" xmltv_id="HITSMovies.sg@SD">HITS MOVIES</channel>
<channel site="nowplayer.now.com" site_id="901" lang="en" xmltv_id="IceFire.hk@SD">Ice Fire</channel>
<channel site="nowplayer.now.com" site_id="200" lang="en" xmltv_id="iPanda.cn@SD">Panda TV</channel>
<channel site="nowplayer.now.com" site_id="156" lang="en" xmltv_id="KBSWorld.kr@SD">KBS World</channel>
<channel site="nowplayer.now.com" site_id="525" lang="en" xmltv_id="LifetimeAsia.us@SD">Lifetime</channel>
@@ -102,7 +96,6 @@
<channel site="nowplayer.now.com" site_id="637" lang="en" xmltv_id="nowSports7.hk@SD">Now Sports 7</channel>
<channel site="nowplayer.now.com" site_id="618" lang="en" xmltv_id="nowSports618.hk@SD">Now Sports 618</channel>
<channel site="nowplayer.now.com" site_id="619" lang="en" xmltv_id="nowSports619.hk@SD">Now Sports 619</channel>
<channel site="nowplayer.now.com" site_id="650" lang="en" xmltv_id="nowSports650.hk@SD">Now Sports 650</channel>
<channel site="nowplayer.now.com" site_id="680" lang="en" xmltv_id="nowSportsPlus.hk@SD">Now Sports Plus</channel>
<channel site="nowplayer.now.com" site_id="621" lang="en" xmltv_id="nowSportsPremierLeague1.hk@SD">Now Sports Premier League 1</channel>
<channel site="nowplayer.now.com" site_id="622" lang="en" xmltv_id="nowSportsPremierLeague2.hk@SD">Now Sports Premier League 2</channel>
@@ -112,7 +105,6 @@
<channel site="nowplayer.now.com" site_id="626" lang="en" xmltv_id="nowSportsPremierLeague6.hk@SD">Now Sports Premier League 6</channel>
<channel site="nowplayer.now.com" site_id="620" lang="en" xmltv_id="nowSportsPremierLeagueTV.hk@SD">Now Sports Premier League TV</channel>
<channel site="nowplayer.now.com" site_id="630" lang="en" xmltv_id="nowSportsPrime.hk@SD">Now Sports Prime</channel>
<channel site="nowplayer.now.com" site_id="106" lang="en" xmltv_id="nowVideoExpress.hk@SD">Now Video Express</channel>
<channel site="nowplayer.now.com" site_id="221" lang="en" xmltv_id="OutdoorChannelInternational.us@SD">Outdoor Channel</channel>
<channel site="nowplayer.now.com" site_id="548" lang="en" xmltv_id="PhoenixChineseChannel.hk@SD">Phoenix Chinese Channel</channel>
<channel site="nowplayer.now.com" site_id="366" lang="en" xmltv_id="PhoenixInfoNewsChannel.hk@SD">Phoenix InfoNews Channel</channel>
@@ -135,8 +127,6 @@
<channel site="nowplayer.now.com" site_id="155" lang="en" xmltv_id="tvNAsia.hk@SD">tvN</channel>
<channel site="nowplayer.now.com" site_id="543" lang="en" xmltv_id="TVS2SouthernTV.cn@SD">GBA Satellite TV</channel>
<channel site="nowplayer.now.com" site_id="102" lang="en" xmltv_id="ViuChannel.hk@SD">Viu channel</channel>
<channel site="nowplayer.now.com" site_id="099" lang="en" xmltv_id="ViuTV.hk@SD">ViuTV</channel>
<channel site="nowplayer.now.com" site_id="096" lang="en" xmltv_id="ViuTVsix.hk@SD">ViuTVsix</channel>
<channel site="nowplayer.now.com" site_id="781" lang="en" xmltv_id="ZeeCinema.in@APAC">Zee Cinema International</channel>
<channel site="nowplayer.now.com" site_id="785" lang="en" xmltv_id="ZeeNews.in@SD">Zee News</channel>
<channel site="nowplayer.now.com" site_id="782" lang="en" xmltv_id="ZeeTVAsiaPacific.sg@SD">Zee TV</channel>
@@ -1,16 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="nowplayer.now.com" site_id="168" lang="zh" xmltv_id="">MOOV Concert/MV</channel>
<channel site="nowplayer.now.com" site_id="400" lang="zh" xmltv_id="">Watch N Learn</channel>
<channel site="nowplayer.now.com" site_id="535" lang="zh" xmltv_id="">Netflix</channel>
<channel site="nowplayer.now.com" site_id="600" lang="zh" xmltv_id="">Sports Schedule Highlights</channel>
<channel site="nowplayer.now.com" site_id="613" lang="zh" xmltv_id="">Now Sports 4K 3</channel>
<channel site="nowplayer.now.com" site_id="615" lang="zh" xmltv_id="">Now Sports 615</channel>
<channel site="nowplayer.now.com" site_id="627" lang="zh" xmltv_id="">Now Sports Premier League 7</channel>
<channel site="nowplayer.now.com" site_id="641" lang="zh" xmltv_id="">Now Sports 641</channel>
<channel site="nowplayer.now.com" site_id="647" lang="zh" xmltv_id="">Now Sports 647</channel>
<channel site="nowplayer.now.com" site_id="651" lang="zh" xmltv_id="">Now Sports 651</channel>
<channel site="nowplayer.now.com" site_id="652" lang="zh" xmltv_id="">Now Sports 652</channel>
<channel site="nowplayer.now.com" site_id="900" lang="zh" xmltv_id="">Adult Promotional Channel</channel>
<channel site="nowplayer.now.com" site_id="688" lang="zh" xmltv_id="">Lucky 688</channel>
<channel site="nowplayer.now.com" site_id="561" lang="zh" xmltv_id="ABCAustralia.au@SD">ABC Australia</channel>
<channel site="nowplayer.now.com" site_id="325" lang="zh" xmltv_id="AlJazeera.qa@English">Al Jazeera English</channel>
<channel site="nowplayer.now.com" site_id="210" lang="zh" xmltv_id="AnimalPlanetSoutheastAsia.sg@SD">Animal Planet</channel>
@@ -34,7 +31,6 @@
<channel site="nowplayer.now.com" site_id="542" lang="zh" xmltv_id="CCTV4Asia.cn@SD">CCTV-4</channel>
<channel site="nowplayer.now.com" site_id="545" lang="zh" xmltv_id="CCTV13.cn@SD">CCTV-13</channel>
<channel site="nowplayer.now.com" site_id="330" lang="zh" xmltv_id="CGTN.cn@SD">CGTN</channel>
<channel site="nowplayer.now.com" site_id="903" lang="zh" xmltv_id="ChannelAdult.hk@SD">Channel Adult</channel>
<channel site="nowplayer.now.com" site_id="113" lang="zh" xmltv_id="CinemaxAsia.sg@SD">CINEMAX</channel>
<channel site="nowplayer.now.com" site_id="322" lang="zh" xmltv_id="CNA.sg@SD">Channel NewsAsia</channel>
<channel site="nowplayer.now.com" site_id="319" lang="zh" xmltv_id="CNBCAsia.sg@SD">CNBC</channel>
@@ -42,7 +38,6 @@
<channel site="nowplayer.now.com" site_id="780" lang="zh" xmltv_id="ColorsAsiaPacific.in@SD">COLORS</channel>
<channel site="nowplayer.now.com" site_id="222" lang="zh" xmltv_id="CrimePlusInvestigationAsia.sg@SD">Crime + Investigation</channel>
<channel site="nowplayer.now.com" site_id="538" lang="zh" xmltv_id="CTiAsia.tw@SD">CTI Asia Channel</channel>
<channel site="nowplayer.now.com" site_id="460" lang="zh" xmltv_id="DaVinciAsia.de@SD">Da Vinci</channel>
<channel site="nowplayer.now.com" site_id="208" lang="zh" xmltv_id="DiscoveryAsia.sg@SD">Discovery Asia</channel>
<channel site="nowplayer.now.com" site_id="209" lang="zh" xmltv_id="DiscoveryChannelSoutheastAsia.sg@SD">Discovery Channel</channel>
<channel site="nowplayer.now.com" site_id="211" lang="zh" xmltv_id="DiscoveryScienceSoutheastAsia.sg@SD">Discovery Science</channel>
@@ -63,7 +58,6 @@
<channel site="nowplayer.now.com" site_id="223" lang="zh" xmltv_id="HistoryAsia.us@SD">HISTORY</channel>
<channel site="nowplayer.now.com" site_id="513" lang="zh" xmltv_id="HITS.sg@SD">HITS</channel>
<channel site="nowplayer.now.com" site_id="119" lang="zh" xmltv_id="HITSMovies.sg@SD">HITS MOVIES</channel>
<channel site="nowplayer.now.com" site_id="901" lang="zh" xmltv_id="IceFire.hk@SD">Ice Fire</channel>
<channel site="nowplayer.now.com" site_id="200" lang="zh" xmltv_id="iPanda.cn@SD">Panda TV</channel>
<channel site="nowplayer.now.com" site_id="156" lang="zh" xmltv_id="KBSWorld.kr@SD">KBS World</channel>
<channel site="nowplayer.now.com" site_id="525" lang="zh" xmltv_id="LifetimeAsia.us@SD">Lifetime</channel>
@@ -102,7 +96,6 @@
<channel site="nowplayer.now.com" site_id="637" lang="zh" xmltv_id="nowSports7.hk@SD">Now Sports 7</channel>
<channel site="nowplayer.now.com" site_id="618" lang="zh" xmltv_id="nowSports618.hk@SD">Now Sports 618</channel>
<channel site="nowplayer.now.com" site_id="619" lang="zh" xmltv_id="nowSports619.hk@SD">Now Sports 619</channel>
<channel site="nowplayer.now.com" site_id="650" lang="zh" xmltv_id="nowSports650.hk@SD">Now Sports 650</channel>
<channel site="nowplayer.now.com" site_id="680" lang="zh" xmltv_id="nowSportsPlus.hk@SD">Now Sports Plus</channel>
<channel site="nowplayer.now.com" site_id="621" lang="zh" xmltv_id="nowSportsPremierLeague1.hk@SD">Now Sports Premier League 1</channel>
<channel site="nowplayer.now.com" site_id="622" lang="zh" xmltv_id="nowSportsPremierLeague2.hk@SD">Now Sports Premier League 2</channel>
@@ -112,7 +105,6 @@
<channel site="nowplayer.now.com" site_id="626" lang="zh" xmltv_id="nowSportsPremierLeague6.hk@SD">Now Sports Premier League 6</channel>
<channel site="nowplayer.now.com" site_id="620" lang="zh" xmltv_id="nowSportsPremierLeagueTV.hk@SD">Now Sports Premier League TV</channel>
<channel site="nowplayer.now.com" site_id="630" lang="zh" xmltv_id="nowSportsPrime.hk@SD">Now Sports Prime</channel>
<channel site="nowplayer.now.com" site_id="106" lang="zh" xmltv_id="nowVideoExpress.hk@SD">Now Video Express</channel>
<channel site="nowplayer.now.com" site_id="221" lang="zh" xmltv_id="OutdoorChannelInternational.us@SD">Outdoor Channel</channel>
<channel site="nowplayer.now.com" site_id="548" lang="zh" xmltv_id="PhoenixChineseChannel.hk@SD">Phoenix Chinese Channel</channel>
<channel site="nowplayer.now.com" site_id="366" lang="zh" xmltv_id="PhoenixInfoNewsChannel.hk@SD">Phoenix InfoNews Channel</channel>
@@ -135,8 +127,6 @@
<channel site="nowplayer.now.com" site_id="155" lang="zh" xmltv_id="tvNAsia.hk@SD">tvN</channel>
<channel site="nowplayer.now.com" site_id="543" lang="zh" xmltv_id="TVS2SouthernTV.cn@SD">GBA Satellite TV</channel>
<channel site="nowplayer.now.com" site_id="102" lang="zh" xmltv_id="ViuChannel.hk@SD">Viu channel</channel>
<channel site="nowplayer.now.com" site_id="099" lang="zh" xmltv_id="ViuTV.hk@SD">ViuTV</channel>
<channel site="nowplayer.now.com" site_id="096" lang="zh" xmltv_id="ViuTVsix.hk@SD">ViuTVsix</channel>
<channel site="nowplayer.now.com" site_id="781" lang="zh" xmltv_id="ZeeCinema.in@APAC">Zee Cinema International</channel>
<channel site="nowplayer.now.com" site_id="785" lang="zh" xmltv_id="ZeeNews.in@SD">Zee News</channel>
<channel site="nowplayer.now.com" site_id="782" lang="zh" xmltv_id="ZeeTVAsiaPacific.sg@SD">Zee TV</channel>