diff --git a/sites/transvision.co.id/transvision.co.id.config.js b/sites/transvision.co.id/transvision.co.id.config.js new file mode 100644 index 00000000..bd642041 --- /dev/null +++ b/sites/transvision.co.id/transvision.co.id.config.js @@ -0,0 +1,102 @@ +const axios = require('axios') +const cheerio = require('cheerio') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +const customParseFormat = require('dayjs/plugin/customParseFormat') + +dayjs.extend(utc) +dayjs.extend(timezone) +dayjs.extend(customParseFormat) + +module.exports = { + site: 'transvision.co.id', + url: `https://www.transvision.co.id/jadwalacara/epg`, + request: { + method: 'POST', + data: function ({ channel, date }) { + const formData = new URLSearchParams() + formData.append('ValidateEPG[channel_name]', channel.site_id) + formData.append('ValidateEPG[tanggal]', date.format('YYYY-MM-DD')) + formData.append('ValidateEPG[sinopsis]', '') + formData.append('yt0', 'PROSES') + + return formData + }, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }, + parser({ content, date }) { + const programs = [] + const items = parseItems(content) + for (const item of items) { + const prev = programs[programs.length - 1] + const start = parseStart(item, date) + if (prev) prev.stop = start + const stop = start.add(30, 'm') + programs.push({ + title: parseTitle(item), + description: parseDescription(item), + start, + stop + }) + } + + return programs + }, + async channels() { + const data = await axios + .get('https://www.transvision.co.id/jadwalacara/epg') + .then(response => response.data) + .catch(console.log) + + const $ = cheerio.load(data) + const items = $('#ValidateEPG_channel_name option').toArray() + const channels = items.map(item => { + const $item = cheerio.load(item) + + return { + lang: 'id', + site_id: $item('*').attr('value'), + name: $item('*').text() + } + }) + + return channels + } +} + +function parseDescription(item) { + return cheerio.load(item)('td:last-child').text() +} + +function parseDuration(item) { + const $ = cheerio.load(item) + let duration = $('th').text() + const match = duration.match(/(\d{2}):(\d{2}):\d{2}/) + const hours = parseInt(match[1]) + const minutes = parseInt(match[2]) + + return hours * 60 + minutes +} + +function parseStart(item, date) { + const $ = cheerio.load(item) + let time = $('th').text() + time = `${date.format('DD/MM/YYYY')} ${time}` + + return dayjs.tz(time, 'DD/MM/YYYY HH:mm', 'Asia/Jakarta') +} + +function parseTitle(item) { + const $ = cheerio.load(item) + + return $('td:first-of-type').text() +} + +function parseItems(content) { + const $ = cheerio.load(content) + + return $('table tbody tr').toArray() +} diff --git a/sites/transvision.co.id/transvision.co.id.test.js b/sites/transvision.co.id/transvision.co.id.test.js new file mode 100644 index 00000000..55792d85 --- /dev/null +++ b/sites/transvision.co.id/transvision.co.id.test.js @@ -0,0 +1,81 @@ +// npx epg-grabber --config=sites/transvision.co.id/transvision.co.id.config.js --channels=sites/transvision.co.id/transvision.co.id_id.channels.xml --output=guide.xml --days=2 + +const { parser, url, request } = require('./transvision.co.id.config.js') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +dayjs.extend(utc) + +const date = dayjs.utc('2022-03-10', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: 'TRIS', + xmltv_id: 'nsert.id' +} +const content = `
00:00:00 Insert TodayInsert adalah program infotainment yang menceritakan berita-berita kehidupan selebriti serta gosip-gosipnya dan disajikan secara aktual dan faktual dengan suasana yang santai.
01:00:00 BrownisBrownis atau obrolan manis merupakan program talkshow segar yang dipandu oleh Ruben Onsu bersama Ivan Gunawan.
01:30:00 Warga +62Warga +62 menghadirkan trend penyebaran video/momen lucu yang juga dikenal sebagai video lucu Indonesia yang tersebar di media sosial.
23:00:00 InsertInsert adalah program infotainment yang menceritakan berita-berita kehidupan selebriti serta gosip-gosipnya dan disajikan secara aktual dan faktual dengan suasana yang santai.
` + +it('can generate valid url', () => { + expect(url).toBe('https://www.transvision.co.id/jadwalacara/epg') +}) + +it('can generate valid request method', () => { + expect(request.method).toBe('POST') +}) + +it('can generate valid request headers', () => { + expect(request.headers).toMatchObject({ + 'Content-Type': 'application/x-www-form-urlencoded' + }) +}) + +it('can generate valid request data', () => { + const result = request.data({ channel, date }) + expect(result.get('ValidateEPG[channel_name]')).toBe('TRIS') + expect(result.get('ValidateEPG[tanggal]')).toBe('2022-03-10') + expect(result.get('ValidateEPG[sinopsis]')).toBe('') + expect(result.get('yt0')).toBe('PROSES') +}) + +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([ + { + title: 'Insert Today', + description: + 'Insert adalah program infotainment yang menceritakan berita-berita kehidupan selebriti serta gosip-gosipnya dan disajikan secara aktual dan faktual dengan suasana yang santai.', + start: '2022-03-09T17:00:00.000Z', + stop: '2022-03-09T18:00:00.000Z' + }, + { + title: 'Brownis', + description: + 'Brownis atau obrolan manis merupakan program talkshow segar yang dipandu oleh Ruben Onsu bersama Ivan Gunawan.', + start: '2022-03-09T18:00:00.000Z', + stop: '2022-03-09T18:30:00.000Z' + }, + { + title: 'Warga +62', + description: + 'Warga +62 menghadirkan trend penyebaran video/momen lucu yang juga dikenal sebagai video lucu Indonesia yang tersebar di media sosial.', + start: '2022-03-09T18:30:00.000Z', + stop: '2022-03-10T16:00:00.000Z' + }, + { + title: 'Insert', + description: + 'Insert adalah program infotainment yang menceritakan berita-berita kehidupan selebriti serta gosip-gosipnya dan disajikan secara aktual dan faktual dengan suasana yang santai.', + start: '2022-03-10T16:00:00.000Z', + stop: '2022-03-10T16:30:00.000Z' + } + ]) +}) + +it('can handle empty guide', () => { + const result = parser({ + content: `` + }) + expect(result).toMatchObject([]) +}) diff --git a/sites/transvision.co.id/transvision.co.id_id.channels.xml b/sites/transvision.co.id/transvision.co.id_id.channels.xml new file mode 100644 index 00000000..d3195a6b --- /dev/null +++ b/sites/transvision.co.id/transvision.co.id_id.channels.xml @@ -0,0 +1,83 @@ + + + + !nsert + ABC Australia + AFN HD + Al Jazeera + Al Quran Al Kareem + Animax + AniPlus + ANTV + Arirang + AXN HD + Baby First + BeritaSatu + Bioskop Indonesia + Bloomberg TV + Boomerang HD + Cartoon Network HD + CCTV 4 + Celestial Movies + CGTN + CGTN Documentary + Channel NewsAsia + Cinema World HD + CINEMAX HD + CNBC Asia + CNN Indonesia HD + CNN International HD + Crime & Investigation HD + Da Vinci + DAAI TV + Duck TV + Dunia Anak + Dunia Lain + DW + Eat N Go + Euronews + Fashion One HD + Fashion TV HD + Fight Sports HD + France 24 + GEM HD + GLOBAL TV + HBO Family HD + HBO HD + HBO Hits HD + HBO Signature HD + History HD + HISTORY2 HD + Indosiar + JakTV + Jendela + KBS World HD + Khazanah + KIX HD + Kompas TV + Lifetime HD + Lingua Channel HD + Metro TV + MNCTV + MTV Live + NHK World Premium + Nick Jr. + Nickelodeon + ONE HD + RCTI + Rock Entertainment HD + RTV + Russia Today + SCTV + T-Music + Thrill + Trans7 HD + TransTV HD + TV 5 Monde + tvN HD + tvOne + TVRI + Warner TV HD + Zee Bioskop + +