diff --git a/sites/tvplus.com.tr/__data__/build.html b/sites/tvplus.com.tr/__data__/build.html new file mode 100644 index 00000000..4301b2ce --- /dev/null +++ b/sites/tvplus.com.tr/__data__/build.html @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/sites/tvplus.com.tr/tvplus.com.tr.channels.xml b/sites/tvplus.com.tr/tvplus.com.tr.channels.xml index fa270dc2..ce490790 100644 --- a/sites/tvplus.com.tr/tvplus.com.tr.channels.xml +++ b/sites/tvplus.com.tr/tvplus.com.tr.channels.xml @@ -1,147 +1,146 @@ - BluTV Play 1 - BluTV Play 2 - EKOL TV - GZT TV - KIBRIS ADA TV - tabii spor - tabii TV - TRT EBA - TV 2020 - TV+ Ekstra UFC - 24 - 360 - A2 - A HABER - AKİT TV - AL JAZEERA ARABIC - AL JAZEERA ENGLISH - A NEWS - A PARA - A SPOR - ATV - BABYTV - BBC News - BENGÜTÜRK - BEYAZ TV - BİZİM EV TV - BLOOMBERG HT - Bloomberg - BRT 1 - BRT 2 - CARTOONITO - CARTOON NETWORK - ÇİFTÇİ TV - CNBC-E - CNN International - CNN TÜRK - DA VINCI - DISCOVERY CHANNEL - DISNEY JUNIOR - DİYANET TV - DMAX - DREAM TÜRK - DUCK TV - DEUTSCHE WELLE ENGLISH - EKOTÜRK - ENGLISH CLUB TV - EPIC DRAMA - EURONEWS - EUROSPORT 1 - EUROSPORT 2 - FB TV - FLASH TV - FM TV - FRANCE 24 ARABIC - FRANCE 24 ENGLISH - FX - HABER GLOBAL - HABERTÜRK - HALK TV - HT SPOR - KADIRGA TV - KANAL 7 - KANAL 23 - KANAL 26 - KANAL 33 - KANAL D - KANAL V - KIBRIS GENC TV - KANAL T - KIBRIS TV - KONTV - KRT TV - LOVE NATURE - MELTEM TV - MİNİKA ÇOCUK - MİNİKA GO - MOONBUG KIDS TV - NATIONAL GEOGRAPHIC - NATIONAL GEOGRAPHIC WILD - NBA TV - Nick JR - NICKTOONS - NOW - NTV - NR1 DAMAR - NUMBER1 TURK - NUMBER1 TV - ON6 - POWER TURK - POWER TV - SEMERKAND - SHOW TV - SİNEMA TV 2 - SİNEMA TV 1001 - SİNEMA 1002 - SİNEMA AİLE 2 - SİNEMA AİLE - SİNEMA AKSİYON 2 - SİNEMA TV AKSİYON - SİNEMA KOMEDİ - SİNEMA TV - SİNEMA YERLİ 2 - SİNEMA YERLİ - SKY NEWS ARABIA - SÖZCÜ TV - SPORTS TV - S SPORT 2 - S SPORT - STAR TV - TARIH TV - TARIM TV - TELE1 - TEVE2 - TGRT HABER - TLC - TMB TV - TRT1 - TRT 2 - TRT 3 - TRT ARABI - TRT AVAZ - TRT BELGESEL - TRT ÇOCUK - TRT DIYANET COCUK - TRT HABER - TRT KURDİ - TRT MÜZİK - TRT SPOR - TRT SPOR YILDIZ - TRT TÜRK - TRT World - TURKHABER - TV 4 - TV5 - TV5 MONDE - TV8 - TV8,5 - TV100 - TVNET - ÜLKE TV - ULUSAL KANAL - VAV TV - VIASAT EXPLORE - VIASAT HISTORY + BluTV Play 1 + BluTV Play 2 + EKOL TV + GZT TV + KIBRIS ADA TV + tabii spor + tabii TV + TRT EBA + TV 2020 + 24 + 360 + A2 + A HABER + AKİT TV + AL JAZEERA ARABIC + AL JAZEERA ENGLISH + A NEWS + A PARA + A SPOR + ATV + BABYTV + BBC News + BENGÜTÜRK + BEYAZ TV + BİZİM EV TV + BLOOMBERG HT + Bloomberg + BRT 1 + BRT 2 + CARTOONITO + CARTOON NETWORK + ÇİFTÇİ TV + CNBC-E + CNN International + CNN TÜRK + DA VINCI + DISCOVERY CHANNEL + DISNEY JUNIOR + DİYANET TV + DMAX + DREAM TÜRK + DUCK TV + DEUTSCHE WELLE ENGLISH + EKOTÜRK + ENGLISH CLUB TV + EPIC DRAMA + EURONEWS + EUROSPORT 1 + EUROSPORT 2 + FB TV + FLASH TV + FM TV + FRANCE 24 ARABIC + FRANCE 24 ENGLISH + FX + HABER GLOBAL + HABERTÜRK + HALK TV + HT SPOR + KADIRGA TV + KANAL 7 + KANAL 23 + KANAL 26 + KANAL 33 + KANAL D + KANAL V + KIBRIS GENC TV + KANAL T + KIBRIS TV + KONTV + KRT TV + LOVE NATURE + MELTEM TV + MİNİKA ÇOCUK + MİNİKA GO + MOONBUG KIDS TV + NATIONAL GEOGRAPHIC + NATIONAL GEOGRAPHIC WILD + NBA TV + Nick JR + NICKTOONS + NOW + NTV + NR1 DAMAR + NUMBER1 TURK + NUMBER1 TV + ON6 + POWER TURK + POWER TV + SEMERKAND + SHOW TV + SİNEMA TV 2 + SİNEMA TV 1001 + SİNEMA 1002 + SİNEMA AİLE 2 + SİNEMA AİLE + SİNEMA AKSİYON 2 + SİNEMA TV AKSİYON + SİNEMA KOMEDİ + SİNEMA TV + SİNEMA YERLİ 2 + SİNEMA YERLİ + SKY NEWS ARABIA + SÖZCÜ TV + SPORTS TV + S SPORT 2 + S SPORT + STAR TV + TARIH TV + TARIM TV + TELE1 + TEVE2 + TGRT HABER + TLC + TMB TV + TRT1 + TRT 2 + TRT 3 + TRT ARABI + TRT AVAZ + TRT BELGESEL + TRT ÇOCUK + TRT DIYANET COCUK + TRT HABER + TRT KURDİ + TRT MÜZİK + TRT SPOR + TRT SPOR YILDIZ + TRT TÜRK + TRT World + TURKHABER + TV 4 + TV5 + TV5 MONDE + TV8 + TV8,5 + TV100 + TVNET + ÜLKE TV + ULUSAL KANAL + VAV TV + VIASAT EXPLORE + VIASAT HISTORY diff --git a/sites/tvplus.com.tr/tvplus.com.tr.config.js b/sites/tvplus.com.tr/tvplus.com.tr.config.js index 812bab00..391f3929 100644 --- a/sites/tvplus.com.tr/tvplus.com.tr.config.js +++ b/sites/tvplus.com.tr/tvplus.com.tr.config.js @@ -1,10 +1,15 @@ +const cheerio = require('cheerio') +const axios = require('axios') const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') const customParseFormat = require('dayjs/plugin/customParseFormat') +const debug = require('debug')('site:tvplus.com.tr') dayjs.extend(utc) dayjs.extend(customParseFormat) +const channelsUrl = 'https://tvplus.com.tr/canli-tv/yayin-akisi' + module.exports = { site: 'tvplus.com.tr', days: 2, @@ -13,11 +18,14 @@ module.exports = { ttl: 24 * 60 * 60 * 1000 // 1 day } }, - url({ channel }) { - const [buildId, slug, nr] = channel.site_id.split('/') - const channelId = [slug, nr].join('--') + async url({ channel }) { + if (module.exports.buildId === undefined) { + module.exports.buildId = await module.exports.fetchBuildId() + debug('Got build id', module.exports.buildId) + } + const channelId = channel.site_id.replace('/', '--') return `https://tvplus.com.tr/_next/data/${ - buildId + module.exports.buildId }/${ channel.lang }/canli-tv/yayin-akisi/${ @@ -54,31 +62,39 @@ module.exports = { return programs }, async channels() { - const cheerio = require('cheerio') - const axios = require('axios') const channels = [] const data = await axios - .get(`https://tvplus.com.tr/canli-tv/yayin-akisi`) + .get(channelsUrl) .then(r => r.data) .catch(console.error) const $ = cheerio.load(data) - const nextData = JSON.parse($('#__NEXT_DATA__').text()) $('.channel-list-item a').toArray() .forEach(el => { const a = $(el) channels.push({ lang: 'tr', name: a.attr('title').replace(/Yayın Akışı/, '').trim(), - site_id: [ - nextData.buildId, - ...a.attr('href') - .replace(/\/canli\-tv\/yayin\-akisi\//, '') - .split('--') - ].join('/') + site_id: a.attr('href') + .replace(/\/canli\-tv\/yayin\-akisi\//, '') + .replace('--', '/') // change -- to / as it used in xml comment }) }) return channels + }, + async fetchBuildId() { + const data = await axios + .get(channelsUrl) + .then(r => r.data) + .catch(console.error) + + if (data) { + const $ = cheerio.load(data) + const nextData = JSON.parse($('#__NEXT_DATA__').text()) + return nextData?.buildId || null + } else { + return null + } } } diff --git a/sites/tvplus.com.tr/tvplus.com.tr.test.js b/sites/tvplus.com.tr/tvplus.com.tr.test.js index ec7f28dc..c0f5c13e 100644 --- a/sites/tvplus.com.tr/tvplus.com.tr.test.js +++ b/sites/tvplus.com.tr/tvplus.com.tr.test.js @@ -1,6 +1,7 @@ const { parser, url } = require('./tvplus.com.tr.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') @@ -8,15 +9,25 @@ const customParseFormat = require('dayjs/plugin/customParseFormat') dayjs.extend(customParseFormat) dayjs.extend(utc) +jest.mock('axios') + const date = dayjs.utc('2024-12-15', 'YYYY-MM-DD').startOf('d') const channel = { lang: 'tr', - site_id: 'wOhzpck_jO2kKrDfRHmHs/nick-jr/4353', + site_id: 'nick-jr/4353', xmltv_id: 'NickJr.tr' } -it('can generate valid url', () => { - expect(url({ channel })).toBe('https://tvplus.com.tr/_next/data/wOhzpck_jO2kKrDfRHmHs/tr/canli-tv/yayin-akisi/nick-jr--4353.json?title=nick-jr--4353') +axios.get.mockImplementation((url, opts) => { + if (url === 'https://tvplus.com.tr/canli-tv/yayin-akisi') { + return Promise.resolve({ + data: fs.readFileSync(path.join(__dirname, '__data__', 'build.html')).toString() + }) + } +}) + +it('can generate valid url', async () => { + expect(await url({ channel })).toBe('https://tvplus.com.tr/_next/data/kUzvz_bbQJNaShlFUkrR3/tr/canli-tv/yayin-akisi/nick-jr--4353.json?title=nick-jr--4353') }) it('can parse response', () => {