mirror of
https://github.com/iptv-org/epg.git
synced 2025-05-10 09:00:07 -04:00
Merge pull request #2114 from iptv-org/add-visionplus.id
Add visionplus.id
This commit is contained in:
commit
b280669910
5 changed files with 292 additions and 0 deletions
1
sites/visionplus.id/__data__/content.json
Normal file
1
sites/visionplus.id/__data__/content.json
Normal file
File diff suppressed because one or more lines are too long
1
sites/visionplus.id/__data__/no_content.json
Normal file
1
sites/visionplus.id/__data__/no_content.json
Normal file
|
@ -0,0 +1 @@
|
|||
{"data":null,"meta":{},"success":false,"code":400,"message":"Invalid epg date 2024-06-30","status":{"code":0,"message_client":"Invalid epg date 2024-06-30","message_server":"Invalid epg date 2024-06-30"}}
|
134
sites/visionplus.id/visionplus.id.channels.xml
Normal file
134
sites/visionplus.id/visionplus.id.channels.xml
Normal file
|
@ -0,0 +1,134 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<site site="visionplus.id">
|
||||
<channels>
|
||||
<channel lang="en" xmltv_id="ABCAustralia.au" site_id="63">ABC Australia</channel>
|
||||
<channel lang="en" xmltv_id="AlJazeeraEnglish.qa" site_id="64">Al Jazeera English</channel>
|
||||
<channel lang="en" xmltv_id="AlQuranAlKareemTV.sa" site_id="6545">Al Quran Al Kareem</channel>
|
||||
<channel lang="en" xmltv_id="AnhuiTV.cn" site_id="7435">Anhui TV</channel>
|
||||
<channel lang="en" xmltv_id="ANTV.id" site_id="12">ANTV</channel>
|
||||
<channel lang="en" xmltv_id="ArirangTV.kr" site_id="41862">Arirang</channel>
|
||||
<channel lang="en" xmltv_id="AXNIndonesia.id" site_id="70">AXN</channel>
|
||||
<channel lang="en" xmltv_id="BabyTV.uk" site_id="26">Baby TV</channel>
|
||||
<channel lang="en" xmltv_id="BaliTV.id" site_id="2839">Bali TV</channel>
|
||||
<channel lang="en" xmltv_id="BandungTV.id" site_id="35132">Bandung TV</channel>
|
||||
<channel lang="en" xmltv_id="Besmart.id" site_id="2794">BeSmart</channel>
|
||||
<channel lang="en" xmltv_id="BTV.id" site_id="2746">BTV</channel>
|
||||
<channel lang="en" xmltv_id="CelestialMoviesIndonesia.id" site_id="2443">Celestial Movies</channel>
|
||||
<channel lang="en" xmltv_id="CGTNDocumentary.cn" site_id="35122">CGTN Documentary</channel>
|
||||
<channel lang="en" xmltv_id="Cinemachi.uk" site_id="63343">Cinemachi</channel>
|
||||
<channel lang="en" xmltv_id="CinemachiAction.uk" site_id="63354">Cinemachi Action</channel>
|
||||
<channel lang="en" xmltv_id="CinemachiKids.uk" site_id="63350">Cinemachi Kids</channel>
|
||||
<channel lang="en" xmltv_id="CinemachiMax.uk" site_id="63357">Cinemachi Max</channel>
|
||||
<channel lang="en" xmltv_id="CinemachiXtra.uk" site_id="63358">Cinemachi Xtra</channel>
|
||||
<channel lang="en" xmltv_id="CinemaWorld.my" site_id="2803">Cinema World</channel>
|
||||
<channel lang="en" xmltv_id="CNBCIndonesia.id" site_id="45">CNBC</channel>
|
||||
<channel lang="en" xmltv_id="DAAITV.id" site_id="2827">DAAI TV</channel>
|
||||
<channel lang="en" xmltv_id="DreamWorksChannelAsia.us" site_id="62877">Dreamworks</channel>
|
||||
<channel lang="en" xmltv_id="Entertainment.id" site_id="17">Entertainment</channel>
|
||||
<channel lang="en" xmltv_id="FightSports.us" site_id="21">Fight Sports</channel>
|
||||
<channel lang="en" xmltv_id="FMN.id" site_id="25">FMN</channel>
|
||||
<channel lang="en" xmltv_id="FoxNewsChannel.us" site_id="1082">Fox News Channel</channel>
|
||||
<channel lang="en" xmltv_id="Galaxy.id" site_id="42046">Galaxy</channel>
|
||||
<channel lang="en" xmltv_id="GalaxyPremium.id" site_id="42039">Galaxy Premium</channel>
|
||||
<channel lang="en" xmltv_id="GlobalTrekker.sg" site_id="62834">Global Trekker</channel>
|
||||
<channel lang="en" xmltv_id="GTV.id" site_id="3">GTV</channel>
|
||||
<channel lang="en" xmltv_id="HITS.sg" site_id="48">HITS</channel>
|
||||
<channel lang="en" xmltv_id="HITSMovies.sg" site_id="6537">Hits Movies</channel>
|
||||
<channel lang="en" xmltv_id="IDXChannel.id" site_id="62">IDX Channel</channel>
|
||||
<channel lang="en" xmltv_id="IMC.id" site_id="42050">IMC</channel>
|
||||
<channel lang="en" xmltv_id="INews.id" site_id="5">iNews</channel>
|
||||
<channel lang="en" xmltv_id="JakTV.id" site_id="2767">Jak TV</channel>
|
||||
<channel lang="en" xmltv_id="JTV.id" site_id="2836">JTV</channel>
|
||||
<channel lang="en" xmltv_id="KidsTV.id" site_id="38">Kids TV</channel>
|
||||
<channel lang="en" xmltv_id="KIX.hk" site_id="2770">KIX</channel>
|
||||
<channel lang="en" xmltv_id="KompasTV.id" site_id="2909">Kompas TV</channel>
|
||||
<channel lang="en" xmltv_id="KompasTV.id" site_id="41841">Kompas TV</channel>
|
||||
<channel lang="en" xmltv_id="Life.id" site_id="46">Life</channel>
|
||||
<channel lang="en" xmltv_id="LifestyleFashion.id" site_id="6569">Lifestyle & Fashion</channel>
|
||||
<channel lang="en" xmltv_id="MetroTV.id" site_id="10">Metro TV</channel>
|
||||
<channel lang="en" xmltv_id="MetroTV.id" site_id="41834">Metro TV</channel>
|
||||
<channel lang="en" xmltv_id="MiaoMi.hk" site_id="15">Miao Mi</channel>
|
||||
<channel lang="en" xmltv_id="MNCNews.id" site_id="57">MNC News</channel>
|
||||
<channel lang="en" xmltv_id="MNCSports.id" site_id="60">MNC Sports</channel>
|
||||
<channel lang="en" xmltv_id="MNCSports2.id" site_id="20746">MNC Sports 2</channel>
|
||||
<channel lang="en" xmltv_id="MNCSports3.id" site_id="38850">MNC Sports 3</channel>
|
||||
<channel lang="en" xmltv_id="MNCTV.id" site_id="4">MNC TV</channel>
|
||||
<channel lang="en" xmltv_id="MTV90s.uk" site_id="63371">MTV 90s</channel>
|
||||
<channel lang="en" xmltv_id="MTVLive.uk" site_id="63367">MTV Live</channel>
|
||||
<channel lang="en" xmltv_id="MusicTV.id" site_id="41849">Music TV</channel>
|
||||
<channel lang="en" xmltv_id="MusicTV.id" site_id="55">Music TV</channel>
|
||||
<channel lang="en" xmltv_id="MuslimTV.id" site_id="52">Muslim TV</channel>
|
||||
<channel lang="en" xmltv_id="MyCinema.id" site_id="61925">My Cinema</channel>
|
||||
<channel lang="en" xmltv_id="MyCinemaAsia.id" site_id="61928">My Cinema Asia</channel>
|
||||
<channel lang="en" xmltv_id="MyFamily.id" site_id="61934">My Family</channel>
|
||||
<channel lang="en" xmltv_id="MyKidz.id" site_id="61938">My Kidz</channel>
|
||||
<channel lang="en" xmltv_id="NationalGeographicIndonesia.id" site_id="42">National Geographic</channel>
|
||||
<channel lang="en" xmltv_id="NET.id" site_id="2830">Net.</channel>
|
||||
<channel lang="en" xmltv_id="NHKWorldJapan.jp" site_id="2925">NHK World Japan</channel>
|
||||
<channel lang="en" xmltv_id="NHKWorldPremium.jp" site_id="2776">NHK World Premium</channel>
|
||||
<channel lang="en" xmltv_id="OKTV.id" site_id="2374">OK TV</channel>
|
||||
<channel lang="en" xmltv_id="ParamountNetworkIndonesia.id" site_id="63366">Paramount Network</channel>
|
||||
<channel lang="en" xmltv_id="RCTI.id" site_id="2">RCTI</channel>
|
||||
<channel lang="en" xmltv_id="Reformed21.id" site_id="27984">Reformed 21</channel>
|
||||
<channel lang="en" xmltv_id="ROCKAction.sg" site_id="62821">Rock Action</channel>
|
||||
<channel lang="en" xmltv_id="ROCKEntertainment.sg" site_id="62813">Rock Entertainment</channel>
|
||||
<channel lang="en" xmltv_id="SEAToday.id" site_id="37614">SEA Today</channel>
|
||||
<channel lang="en" xmltv_id="SoccerChannel.id" site_id="517">Soccer Channel</channel>
|
||||
<channel lang="en" xmltv_id="SPOTV.kr" site_id="41788">SPOTV</channel>
|
||||
<channel lang="en" xmltv_id="SPOTV2.kr" site_id="41792">SPOTV 2</channel>
|
||||
<channel lang="en" xmltv_id="TawafTV.id" site_id="19613">Tawaf TV</channel>
|
||||
<channel lang="en" xmltv_id="Thrill.hk" site_id="2440">Thrill</channel>
|
||||
<channel lang="en" xmltv_id="Trans7.id" site_id="11">Trans 7</channel>
|
||||
<channel lang="en" xmltv_id="TransTV.id" site_id="6">Trans TV</channel>
|
||||
<channel lang="en" xmltv_id="TRTWorld.tr" site_id="2854">TRT World</channel>
|
||||
<channel lang="en" xmltv_id="TVMu.id" site_id="7438">TVMu</channel>
|
||||
<channel lang="en" xmltv_id="tvN.kr" site_id="6549">tvN</channel>
|
||||
<channel lang="en" xmltv_id="tvNMoviesAsia.hk" site_id="6553">tvN Movies</channel>
|
||||
<channel lang="en" xmltv_id="tvOne.id" site_id="41846">TV One</channel>
|
||||
<channel lang="en" xmltv_id="tvOne.id" site_id="8">TV One</channel>
|
||||
<channel lang="en" xmltv_id="VisionPrime.id" site_id="19881">Vision Prime</channel>
|
||||
<channel lang="en" xmltv_id="ZeeBioskop.id" site_id="2449">Zee Bioskop</channel>
|
||||
<channel lang="en" xmltv_id="ZooMoo.sg" site_id="62822">Zoomoo</channel>
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="13">TVRI</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="14">Nick Jr.</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="22">Infotainment</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2446">Arirang</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2452">DW</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2737">BBC Earth</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2740">BBC World News</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2749">Bloomberg</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2752">Cbeebies</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2755">Celestial Classic Movie</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2797">Euronews</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2833">EWTN</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="28685">TV5 Monde</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2881">RT English</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="2901">RTV</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="35112">CGTN</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="3738">TV9</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="40">Nick</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="41858">DW</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="41868">Lifetime</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="41881">Infotainment</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="48830">LIV Golf League : Valderrama - Final Round</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="51">Crime Investigation</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="52872">LIV golf League : Valderrama - Round 2</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="61215">Soccer Channel Indihome</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="61218">MNC Sports Indihome</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="61221">MNC Sports 2 Indihome</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="61229">MNC Sports 3 Indihome</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="61231">SPOTV Indihome</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="61232">SPOTV 2 Indihome</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="67">Channel News Asia</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="68">Lifetime</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="71">Animax</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="74">One</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="7414">Jiangsu TV</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="7420">Hunan TV</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="7426">Shanghai Dragon TV</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="7432">Xing Kong TV</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="79">Nat Geo Wild</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="83">France 24</channel> -->
|
||||
<!-- <channel lang="en" xmltv_id="" site_id="89">History</channel> -->
|
||||
</channels>
|
||||
</site>
|
91
sites/visionplus.id/visionplus.id.config.js
Normal file
91
sites/visionplus.id/visionplus.id.config.js
Normal file
|
@ -0,0 +1,91 @@
|
|||
const axios = require('axios')
|
||||
const dayjs = require('dayjs')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
const timezone = require('dayjs/plugin/timezone')
|
||||
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
||||
const cheerio = require('cheerio')
|
||||
|
||||
dayjs.extend(utc)
|
||||
dayjs.extend(timezone)
|
||||
dayjs.extend(customParseFormat)
|
||||
|
||||
module.exports = {
|
||||
site: 'visionplus.id',
|
||||
days: 2,
|
||||
request: {
|
||||
headers: {
|
||||
Authorization:
|
||||
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE5NDY0NTE4OTcsInVpZCI6MCwicGwiOiJ3ZWIiLCJndWVzdF90b2tlbiI6ImNhNGNjMjdiNzc3MjBjODEwNzQ2YzY3MTY4NzNjMDI3NGU4NWYxMWQifQ.tt08jLZ3HiNadUeSgc9O-nhIzEi7WMYRjxMb05lEZ74'
|
||||
}
|
||||
},
|
||||
url({ date, channel }) {
|
||||
return `https://epg-api.visionplus.id/api/v1/epg?isLive=false&start_time_from=${date.format(
|
||||
'YYYY-MM-DD'
|
||||
)}&channel_ids=${channel.site_id}`
|
||||
},
|
||||
parser({ content, channel, date }) {
|
||||
let programs = []
|
||||
const items = parseItems(content, channel, date)
|
||||
items.forEach(item => {
|
||||
let prev = programs[programs.length - 1]
|
||||
let start = parseStart(item, date)
|
||||
let stop = parseStop(item, date)
|
||||
if (prev) {
|
||||
if (start.isBefore(prev.start)) {
|
||||
start = start.add(1, 'd')
|
||||
}
|
||||
if (stop.isBefore(prev.stop)) {
|
||||
stop = stop.add(1, 'd')
|
||||
}
|
||||
}
|
||||
|
||||
programs.push({
|
||||
title: item.t,
|
||||
description: item.synopsis,
|
||||
start,
|
||||
stop
|
||||
})
|
||||
})
|
||||
|
||||
return programs
|
||||
},
|
||||
async channels() {
|
||||
const xml = await axios
|
||||
.get(`https://www.visionplus.id/sitemap-channels.xml`)
|
||||
.then(r => r.data)
|
||||
.catch(console.log)
|
||||
|
||||
const $ = cheerio.load(xml)
|
||||
const items = $('url').toArray()
|
||||
|
||||
return items.map(item => {
|
||||
const $item = cheerio.load(item)
|
||||
const loc = $item('loc').text()
|
||||
const [, site_id] = loc.match(/channel\/(\d+)\//) || [null, null]
|
||||
|
||||
return {
|
||||
site_id,
|
||||
name: $item('video\\:title').text().trim()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function parseStart(item, date) {
|
||||
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${item.s}`, 'YYYY-MM-DD HH:mm', 'Asia/Jakarta')
|
||||
}
|
||||
|
||||
function parseStop(item, date) {
|
||||
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${item.e}`, 'YYYY-MM-DD HH:mm', 'Asia/Jakarta')
|
||||
}
|
||||
|
||||
function parseItems(content, channel, date) {
|
||||
const data = JSON.parse(content)
|
||||
if (!data || !Array.isArray(data.data)) return []
|
||||
const channelData = data.data.find(c => c.id === channel.site_id)
|
||||
if (!channelData || !Array.isArray(channelData.schedules)) return []
|
||||
const daySchedule = channelData.schedules.find(d => d.date === date.format('YYYY-MM-DD'))
|
||||
if (!daySchedule || !Array.isArray(daySchedule.items)) return []
|
||||
|
||||
return daySchedule.items
|
||||
}
|
65
sites/visionplus.id/visionplus.id.test.js
Normal file
65
sites/visionplus.id/visionplus.id.test.js
Normal file
|
@ -0,0 +1,65 @@
|
|||
// npm run channels:parse -- --config=./sites/visionplus.id/visionplus.id.config.js --output=./sites/visionplus.id/visionplus.id.channels.xml
|
||||
// npx epg-grabber --config=sites/visionplus.id/visionplus.id.config.js --channels=sites/visionplus.id/visionplus.id.channels.xml --output=guide.xml
|
||||
|
||||
const { parser, url, request } = require('./visionplus.id.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-06-30', 'YYYY-MM-DD').startOf('d')
|
||||
const channel = {
|
||||
site_id: '2',
|
||||
xmltv_id: 'RCTI.id'
|
||||
}
|
||||
|
||||
it('can generate valid url', () => {
|
||||
expect(url({ channel, date })).toBe(
|
||||
'https://epg-api.visionplus.id/api/v1/epg?isLive=false&start_time_from=2023-06-30&channel_ids=2'
|
||||
)
|
||||
})
|
||||
|
||||
it('can generate valid request headers', () => {
|
||||
expect(request.headers).toMatchObject({
|
||||
Authorization:
|
||||
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE5NDY0NTE4OTcsInVpZCI6MCwicGwiOiJ3ZWIiLCJndWVzdF90b2tlbiI6ImNhNGNjMjdiNzc3MjBjODEwNzQ2YzY3MTY4NzNjMDI3NGU4NWYxMWQifQ.tt08jLZ3HiNadUeSgc9O-nhIzEi7WMYRjxMb05lEZ74'
|
||||
})
|
||||
})
|
||||
|
||||
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.length).toBe(18)
|
||||
expect(results[0]).toMatchObject({
|
||||
start: '2023-06-29T18:15:00.000Z',
|
||||
stop: '2023-06-29T19:00:00.000Z',
|
||||
title: 'Hafalan Shalat Delisa',
|
||||
description: ``
|
||||
})
|
||||
|
||||
expect(results[17]).toMatchObject({
|
||||
start: '2023-06-30T16:15:00.000Z',
|
||||
stop: '2023-06-30T18:15:00.000Z',
|
||||
title: 'Tukang Bubur Pulang Haji',
|
||||
description: ''
|
||||
})
|
||||
})
|
||||
|
||||
it('can handle empty guide', () => {
|
||||
const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json'))
|
||||
const results = parser({ content, channel })
|
||||
|
||||
expect(results).toMatchObject([])
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue