diff --git a/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.channels.xml b/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.channels.xml index f7476f5d5..fb5505cfc 100644 --- a/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.channels.xml +++ b/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.channels.xml @@ -6,7 +6,7 @@ Nova TV Arenasport 1 MAXtv Promo - Pickbox TV + Pickbox 1 RTL Kockica Viasat Nature History 2 @@ -28,31 +28,27 @@ Baby TV Mini TV Nicktoons - CineStar TV 1 + CineStar 1 STAR Movies Cinemax - Cinestar TV Premiere 2 Sportska Televizija CGTN Documentary Da Vinci Cartoonito STAR Crime STAR - CineStar TV Action & Thriller - Cinestar TV Premiere 1 Doma TV HRT 3 Crime & Investigation - Nick Jr. hrvatski + Nick Jr. STAR Life HBO 2 RTL Passion - Epic Drama + Viasat Epic Drama M1 Gold M1 Film - Cinestar TV Fantasy Klasik - Nickelodeon hrvatski + Nickelodeon Kino TV Arenasport 5 Arenasport 7 @@ -61,7 +57,7 @@ Arenasport 10 Luxe TV Fashion TV - bravo! TV + bravo TV CGTN CNN Europe Arenasport 2 @@ -70,7 +66,6 @@ Arenasport 6 24Kitchen ExtraTV - Al Jazeera E! Entertainment Laudato TV myZen.tv @@ -82,8 +77,6 @@ MAXSport 1 RTL Adria MAXSport 2 - Club MTV - MTV Hits Pink Extra Balkanika France 24 francuski @@ -91,11 +84,9 @@ Pink Music Pink Fashion Pink World - MTV 00s - MTV 80s Euronews Doku TV - TV1000 + Viasat Kino Pink M Pink Folk 1 Sport 1 @@ -112,13 +103,12 @@ Pink Koncert Extreme Sports Nautical Channel - NickMusic Pink Film GP1 Stingray Djazz Toxic TV DW engleski - Mreža TV Zagreb + Blue Televizija TV SLO 1 RTS Svet TV Zapad @@ -137,7 +127,6 @@ TV SLO 2 Disney Channel Disney Junior - Cinestar TV 2 RTL 2 njemački Sky News ZDF @@ -159,9 +148,8 @@ RAI 3 NonStop TV DALMACIJA - Trend TV Happy - Super RTL + RTL Super Zdrava TV OTV FTV @@ -170,16 +158,13 @@ TVE Internacional Z1 TVCG MNE - Cinestar TV Comedy & Family Arena Esport Arena Fight - Nickelodeon engleski - Nick Jr. engleski Radio HR1 Radio HR3 Radio HR2 Radio Extra FM - Radio bravo! + Radio bravo Radio Top Radio Osijek Radio Split @@ -211,19 +196,19 @@ Balkan TV ICTbusiness TV Viasat History - CineStar TV 1 - Cinestar TV Premiere 1 - Cinestar TV Premiere 2 - CineStar TV Action & Thriller - Cinestar TV Fantasy - Cinestar TV 2 - Cinestar TV Comedy & Family + CineStar 1 + Cinestar Premiere 1 + Cinestar Premiere 2 + CineStar Action & Thriller + Cinestar Fantasy + Cinestar 2 + Cinestar Comedy & Family AMC Pop Star - Moba + Restart R&R WWM (World Wide Muzzik) - Tik Tak + Myuzzik MUZZIK mix ZZ TV DocuBox @@ -241,6 +226,26 @@ Muzzik Flashback Hit mjeseca - TV Nakupi HDTV + ADRIA MUSIC TELEVISION + Viasat True Crime + ShiftTV + Hype TV + SK 5 + SK 8 + SK 1 + SK 6 + SK 2 + SK 9 + SK 10 + SK 7 + SK 3 + SK 4 + SK Fight + SK 11 + SK Golf + SK Esports + SK 12 + Daystar + Pickbox 2 diff --git a/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.config.js b/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.config.js index a8da1bcd0..bb7443915 100644 --- a/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.config.js +++ b/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.config.js @@ -8,7 +8,7 @@ const sortBy = require('lodash.sortby') const NATCO_CODE = 'hr' const APP_LANGUAGE = 'hr' const APP_KEY = 'GWaBW4RTloLwpUgYVzOiW5zUxFLmoMj5' -const APP_VERSION = '02.0.1080' +const APP_VERSION = '02.0.1470' const NATCO_KEY = 'l2lyvGVbUm2EKJE96ImQgcc8PKMZWtbE' const SITE_URL = 'mojmaxtv.hrvatskitelekom.hr' @@ -30,27 +30,12 @@ const SESSION_ID = crypto.randomUUID() const cached = {} -const getHeaders = () => ({ - 'app_key': APP_KEY, - 'app_version': APP_VERSION, - 'device-id': DEVICE_ID, - 'tenant': 'tv', - 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', - 'origin': `https://${SITE_URL}`, - 'x-request-session-id': SESSION_ID, - 'x-request-tracking-id': crypto.randomUUID(), - 'x-tv-step': 'EPG_SCHEDULES', - 'x-tv-flow': 'EPG', - 'x-call-type': 'GUEST_USER', - 'x-user-agent': `web|web|Chrome-133|${APP_VERSION}|1` -}) - module.exports = { site: SITE_URL, url({ date }) { return `${API_ENDPOINT}/epg/channel/schedules?date=${date.format( 'YYYY-MM-DD' - )}&hour_offset=0&hour_range=3&channelMap_id&filler=true&app_language=${APP_LANGUAGE}&natco_code=${NATCO_CODE}` + )}&hour_offset=0&hour_range=3&channelMap_id=&filler=true&app_language=${APP_LANGUAGE}&natco_code=${NATCO_CODE}` }, request: { headers: getHeaders(), @@ -90,11 +75,20 @@ module.exports = { // Fetch program details for each item const programs = [] - for (let item of items) { - const detail = await loadProgramDetails(item) - -// detectUnknownRoles(detail) - + const queues = items + .filter(item => item.program_id) + .map(item => ({ + url: `${API_ENDPOINT}/details/series/${item.program_id}?natco_code=${NATCO_CODE}`, + params: { + headers: getHeaders() + }, + item + })) + await doFetch(queues, (queue, res) => { + queue.item.detail = res + }) + items.forEach(item => { + const detail = item.detail || {} programs.push({ title: item.description, sub_title: item.episode_name, @@ -111,7 +105,7 @@ module.exports = { start: item.start_time, stop: item.end_time }) - } + }) return programs }, @@ -132,17 +126,6 @@ module.exports = { } } -async function loadProgramDetails(item) { - if (!item.program_id) return {} - const url = `${API_ENDPOINT}/details/series/${item.program_id}?natco_code=${NATCO_CODE}` - const data = await axios - .get(url, { headers: getHeaders() }) - .then(r => r.data) - .catch(console.log) - - return data || {} -} - function parseData(content) { try { const data = JSON.parse(content) @@ -190,3 +173,32 @@ function parseRoles(item, role_name) { if (!item.roles) return null return item.roles.filter(role => role.role_name === role_name).map(role => role.person_name) } + +function getHeaders() { + const res = { + 'app_key': APP_KEY, + 'app_version': APP_VERSION, + 'device-id': DEVICE_ID, + 'tenant': 'tv', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36', + 'origin': `https://${SITE_URL}`, + 'x-call-type': 'GUEST_USER', + 'x-call-time': new Date().getTime(), + 'x-request-session-id': SESSION_ID, + 'x-request-tracking-id': crypto.randomUUID(), + 'x-tv-step': 'EPG_SCHEDULES', + 'x-tv-flow': 'EPG', + 'x-txn-id': null, + 'x-user-agent': `web|web|Chrome-149|${APP_VERSION}|1` + } + const hash = crypto.createHash('sha256') + hash.update([ + res['x-request-tracking-id'], + res['x-request-session-id'], + res['device-id'], + res['x-call-time'] + ].join('')) + res['x-txn-id'] = hash.digest('hex').substr(0, 32) + + return res +} diff --git a/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.test.js b/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.test.js index c91a7eb92..ce86dfa04 100644 --- a/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.test.js +++ b/sites/mojmaxtv.hrvatskitelekom.hr/mojmaxtv.hrvatskitelekom.hr.test.js @@ -5,6 +5,7 @@ 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) @@ -16,14 +17,14 @@ jest.mock('axios') axios.get.mockImplementation(url => { if ( url === - 'https://tv-hr-prod.yo-digital.com/hr-bifrost/epg/channel/schedules?date=2025-01-24&hour_offset=3&hour_range=3&channelMap_id&filler=true&app_language=hr&natco_code=hr' + 'https://tv-hr-prod.yo-digital.com/hr-bifrost/epg/channel/schedules?date=2025-01-24&hour_offset=3&hour_range=3&channelMap_id=&filler=true&app_language=hr&natco_code=hr' ) { return Promise.resolve({ data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/content_3.json'))) }) } else if ( url === - 'https://tv-hr-prod.yo-digital.com/hr-bifrost/epg/channel/schedules?date=2025-01-24&hour_offset=21&hour_range=3&channelMap_id&filler=true&app_language=hr&natco_code=hr' + 'https://tv-hr-prod.yo-digital.com/hr-bifrost/epg/channel/schedules?date=2025-01-24&hour_offset=21&hour_range=3&channelMap_id=&filler=true&app_language=hr&natco_code=hr' ) { return Promise.resolve({ data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/content_21.json'))) @@ -37,14 +38,14 @@ axios.get.mockImplementation(url => { it('can generate valid url', () => { expect(url({ date })).toBe( - 'https://tv-hr-prod.yo-digital.com/hr-bifrost/epg/channel/schedules?date=2025-01-24&hour_offset=0&hour_range=3&channelMap_id&filler=true&app_language=hr&natco_code=hr' + 'https://tv-hr-prod.yo-digital.com/hr-bifrost/epg/channel/schedules?date=2025-01-24&hour_offset=0&hour_range=3&channelMap_id=&filler=true&app_language=hr&natco_code=hr' ) }) it('can generate valid request headers', () => { expect(request.headers).toMatchObject({ app_key: 'GWaBW4RTloLwpUgYVzOiW5zUxFLmoMj5', - app_version: '02.0.1080', + app_version: '02.0.1470', }) })