From 47b06eb9f364e8a879c928df6543bdc4bbb737b0 Mon Sep 17 00:00:00 2001 From: Sicilykill <95044302+Sicilykill@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:37:03 -0500 Subject: [PATCH 1/4] Set timezone offset Fixes issue 2184 --- sites/mediaset.it/mediaset.it.config.js | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/sites/mediaset.it/mediaset.it.config.js b/sites/mediaset.it/mediaset.it.config.js index 40a84876..40fe6935 100644 --- a/sites/mediaset.it/mediaset.it.config.js +++ b/sites/mediaset.it/mediaset.it.config.js @@ -1,9 +1,11 @@ const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') const customParseFormat = require('dayjs/plugin/customParseFormat') +const timezone = require('dayjs/plugin/timezone') dayjs.extend(utc) dayjs.extend(customParseFormat) +dayjs.extend(timezone) module.exports = { site: 'mediaset.it', @@ -19,20 +21,10 @@ module.exports = { if (!data.events) return programs data.events.forEach(item => { - if (item.title && item.startTime && item.endTime) { - const start = dayjs - .utc(item.startTime, 'HH:mm') - .set('D', date.get('D')) - .set('M', date.get('M')) - .set('y', date.get('y')) - .toString() - - const stop = dayjs - .utc(item.endTime, 'HH:mm') - .set('D', date.get('D')) - .set('M', date.get('M')) - .set('y', date.get('y')) - .toString() + if (item.title && item.startTime && item.duration) { + const start = parseStart(item, date) + const duration = parseInt(item.duration) + const stop = start.add(duration, 'm') programs.push({ title: item.displayTitle || item.title, @@ -47,3 +39,7 @@ module.exports = { return programs } } + +function parseStart(item, date) { + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${item.startTime}`, 'YYYY-MM-DD HH:mm', 'Europe/Rome') +} From a32f80a0ffd71ad89aa5779347b15a969f180c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Moret?= Date: Mon, 16 Oct 2023 15:30:56 +0200 Subject: [PATCH 2/4] Update mediaset.it.config.js --- sites/mediaset.it/mediaset.it.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sites/mediaset.it/mediaset.it.config.js b/sites/mediaset.it/mediaset.it.config.js index b6bcbed8..e7c3837e 100644 --- a/sites/mediaset.it/mediaset.it.config.js +++ b/sites/mediaset.it/mediaset.it.config.js @@ -1,6 +1,7 @@ const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') const customParseFormat = require('dayjs/plugin/customParseFormat') +const timezone = require('dayjs/plugin/timezone') dayjs.extend(utc) dayjs.extend(customParseFormat) @@ -51,4 +52,4 @@ module.exports = { function parseStart(item, date) { return dayjs.tz(`${date.format('YYYY-MM-DD')} ${item.startTime}`, 'YYYY-MM-DD HH:mm', 'Europe/Rome') -} \ No newline at end of file +} From d3649ee1a8f3219f007dd0bfd6168fc0c5280289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Moret?= Date: Mon, 16 Oct 2023 15:32:25 +0200 Subject: [PATCH 3/4] Reinstate what was PR made for --- sites/mediaset.it/mediaset.it.config.js | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/sites/mediaset.it/mediaset.it.config.js b/sites/mediaset.it/mediaset.it.config.js index e7c3837e..40fe6935 100644 --- a/sites/mediaset.it/mediaset.it.config.js +++ b/sites/mediaset.it/mediaset.it.config.js @@ -21,20 +21,10 @@ module.exports = { if (!data.events) return programs data.events.forEach(item => { - if (item.title && item.startTime && item.endTime) { - const start = dayjs - .utc(item.startTime, 'HH:mm') - .set('D', date.get('D')) - .set('M', date.get('M')) - .set('y', date.get('y')) - .toString() - - const stop = dayjs - .utc(item.endTime, 'HH:mm') - .set('D', date.get('D')) - .set('M', date.get('M')) - .set('y', date.get('y')) - .toString() + if (item.title && item.startTime && item.duration) { + const start = parseStart(item, date) + const duration = parseInt(item.duration) + const stop = start.add(duration, 'm') programs.push({ title: item.displayTitle || item.title, From 9f811c9497ebc0d624e584854f1750149992750b Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Thu, 19 Oct 2023 19:34:04 +0300 Subject: [PATCH 4/4] Add a test --- sites/mediaset.it/__data__/content.json | 2 + sites/mediaset.it/__data__/no_content.html | 10 +++++ sites/mediaset.it/mediaset.it.config.js | 22 +++++++++-- sites/mediaset.it/mediaset.it.test.js | 46 ++++++++++++++++++++++ 4 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 sites/mediaset.it/__data__/content.json create mode 100644 sites/mediaset.it/__data__/no_content.html create mode 100644 sites/mediaset.it/mediaset.it.test.js diff --git a/sites/mediaset.it/__data__/content.json b/sites/mediaset.it/__data__/content.json new file mode 100644 index 00000000..074782d1 --- /dev/null +++ b/sites/mediaset.it/__data__/content.json @@ -0,0 +1,2 @@ + + {"events":[{"codiceProgramma":"F312297901001001","channel":"LB","displayTitle":"Showreel","title":"SHOW REEL SERIE RETE 20","description":"INTRATTENIMENTO 15 - Italia, 2023","genere":"INTRATTENIMENTO","sottogenere":"RUBRICA AUTOPROMOZIONALE","startTime":"06:10","endTime":"07:07","duration":"57"},{"codiceProgramma":"F302373101000103","channel":"LB","displayTitle":"Chuck","title":"CHUCK VS. IL LICENZIAMENTO - CHUCK III","description":"S3 Ep1 Chuck vs. il licenziamento","genere":"SERIE","sottogenere":"AZIONE","startTime":"07:07","endTime":"08:04","duration":"57"},{"codiceProgramma":"F302373101000203","channel":"LB","displayTitle":"Chuck","title":"CHUCK VS. LE TRE PAROLE - CHUCK III","description":"S3 Ep2 Chuck vs. le tre parole","genere":"SERIE","sottogenere":"AZIONE","startTime":"08:04","endTime":"08:56","duration":"52"},{"codiceProgramma":"F307718501001803","channel":"LB","displayTitle":"Lethal Weapon","title":"L' INIZIO - LETHAL WEAPON","description":"S1 Ep18 L' inizio","genere":"SERIE","sottogenere":"AZIONE","startTime":"08:56","endTime":"09:50","duration":"54"},{"codiceProgramma":"F308627401000104","channel":"LB","displayTitle":"Lethal Weapon","title":"GRINGO LOCO (EL) - LETHAL WEAPON II","description":"S2 Ep1 El gringo loco","genere":"SERIE","sottogenere":"AZIONE","startTime":"09:50","endTime":"10:42","duration":"52"},{"codiceProgramma":"F305550001002203","channel":"LB","displayTitle":"Big Bang Theory","title":"LA TRASMUTAZIONE DI PROTON - THE BIG BANG THEORY VII","description":"S7 Ep22 La trasmutazione di Proton","genere":"SITCOM","sottogenere":"COMMEDIA","startTime":"10:42","endTime":"11:11","duration":"29"},{"codiceProgramma":"F305550001002303","channel":"LB","displayTitle":"Big Bang Theory","title":"LA DISSOLUZIONE DEL GORILLA - THE BIG BANG THEORY VII","description":"S7 Ep23 La dissoluzione del gorilla","genere":"SITCOM","sottogenere":"COMMEDIA","startTime":"11:11","endTime":"11:38","duration":"27"},{"codiceProgramma":"F310098901000905","channel":"LB","displayTitle":"Supergirl","title":"CRISI SULLE TERRE INFINITE - I PARTE - SUPERGIRL V","description":"S5 Ep9 Crisi sulle terre infinite - I parte","genere":"SERIE","sottogenere":"AZIONE","startTime":"11:38","endTime":"12:31","duration":"53"},{"codiceProgramma":"F310098901001005","channel":"LB","displayTitle":"Supergirl","title":"MONDI IMPRIGIONATI - SUPERGIRL V","description":"S5 Ep10 Mondi imprigionati","genere":"SERIE","sottogenere":"AZIONE","startTime":"12:31","endTime":"13:21","duration":"50"},{"codiceProgramma":"F304307201002003","channel":"LB","displayTitle":"Person of Interest","title":"LA LEGGE DEL PIU' FORTE - PERSON OF INTEREST","description":"S1 Ep20 La legge del piu' forte","genere":"SERIE","sottogenere":"THRILLER","startTime":"13:21","endTime":"14:14","duration":"53"},{"codiceProgramma":"F307718501001803","channel":"LB","displayTitle":"Lethal Weapon","title":"L' INIZIO - LETHAL WEAPON","description":"S1 Ep18 L' inizio","genere":"SERIE","sottogenere":"AZIONE","startTime":"14:14","endTime":"14:59","duration":"45"},{"codiceProgramma":"F308627401000104","channel":"LB","displayTitle":"Lethal Weapon","title":"GRINGO LOCO (EL) - LETHAL WEAPON II","description":"S2 Ep1 El gringo loco","genere":"SERIE","sottogenere":"AZIONE","startTime":"14:59","endTime":"15:45","duration":"46"},{"codiceProgramma":"F302373101000103","channel":"LB","displayTitle":"Chuck","title":"CHUCK VS. IL LICENZIAMENTO - CHUCK III","description":"S3 Ep1 Chuck vs. il licenziamento","genere":"SERIE","sottogenere":"AZIONE","startTime":"15:45","endTime":"16:39","duration":"54"},{"codiceProgramma":"F302373101000203","channel":"LB","displayTitle":"Chuck","title":"CHUCK VS. LE TRE PAROLE - CHUCK III","description":"S3 Ep2 Chuck vs. le tre parole","genere":"SERIE","sottogenere":"AZIONE","startTime":"16:39","endTime":"17:32","duration":"53"},{"codiceProgramma":"F310098901000905","channel":"LB","displayTitle":"Supergirl","title":"CRISI SULLE TERRE INFINITE - I PARTE - SUPERGIRL V","description":"S5 Ep9 Crisi sulle terre infinite - I parte","genere":"SERIE","sottogenere":"AZIONE","startTime":"17:32","endTime":"18:27","duration":"55"},{"codiceProgramma":"F310098901001005","channel":"LB","displayTitle":"Supergirl","title":"MONDI IMPRIGIONATI - SUPERGIRL V","description":"S5 Ep10 Mondi imprigionati","genere":"SERIE","sottogenere":"AZIONE","startTime":"18:27","endTime":"19:22","duration":"55"},{"codiceProgramma":"F304307201002003","channel":"LB","displayTitle":"Person of Interest","title":"LA LEGGE DEL PIU' FORTE - PERSON OF INTEREST","description":"S1 Ep20 La legge del piu' forte","genere":"SERIE","sottogenere":"THRILLER","startTime":"19:22","endTime":"20:13","duration":"51"},{"codiceProgramma":"F305550001002203","channel":"LB","displayTitle":"Big Bang Theory","title":"LA TRASMUTAZIONE DI PROTON - THE BIG BANG THEORY VII","description":"S7 Ep22 La trasmutazione di Proton","genere":"SITCOM","sottogenere":"COMMEDIA","startTime":"20:13","endTime":"20:36","duration":"23"},{"codiceProgramma":"F305550001002303","channel":"LB","displayTitle":"Big Bang Theory","title":"LA DISSOLUZIONE DEL GORILLA - THE BIG BANG THEORY VII","description":"S7 Ep23 La dissoluzione del gorilla","genere":"SITCOM","sottogenere":"COMMEDIA","startTime":"20:36","endTime":"21:04","duration":"28"},{"codiceProgramma":"F306359601000102","channel":"LB","displayTitle":"Interstellar","title":"INTERSTELLAR - CICLO SCI-FI ZONE","description":"Regia di C. Nolan; USA 2014","genere":"FILM","sottogenere":"AZIONE","startTime":"21:04","endTime":"00:24","duration":"200"},{"codiceProgramma":"F307675101000102","channel":"LB","displayTitle":"Mine","title":"MINE - CICLO 20 SUSPENSE","description":"Regia di F. Guaglione; USA 2016","genere":"FILM","sottogenere":"AZIONE","startTime":"00:24","endTime":"02:29","duration":"125"},{"codiceProgramma":"F309365101001304","channel":"LB","displayTitle":"The Flash","title":"GOLDFACE - THE FLASH V","description":"S5 Ep13 Goldface","genere":"SERIE","sottogenere":"AZIONE","startTime":"02:29","endTime":"03:09","duration":"40"},{"codiceProgramma":"F309365101001404","channel":"LB","displayTitle":"The Flash","title":"CAUSA ED ECCESSO - THE FLASH V","description":"S5 Ep14 Causa ed eccesso","genere":"SERIE","sottogenere":"AZIONE","startTime":"03:09","endTime":"03:49","duration":"40"},{"codiceProgramma":"F312297901001001","channel":"LB","displayTitle":"Showreel","title":"SHOW REEL SERIE RETE 20","description":"INTRATTENIMENTO 15 - Italia, 2023","genere":"INTRATTENIMENTO","sottogenere":"RUBRICA AUTOPROMOZIONALE","startTime":"03:49","endTime":"04:34","duration":"45"},{"codiceProgramma":"F308629801001904","channel":"LB","displayTitle":"Arrow","title":"IL DRAGO - ARROW VI","description":"S6 Ep19 Il drago","genere":"SERIE","sottogenere":"AZIONE","startTime":"04:34","endTime":"05:14","duration":"40"},{"codiceProgramma":"F308629801002004","channel":"LB","displayTitle":"Arrow","title":"NELLE MANI DELLA GIUSTIZIA - ARROW VI","description":"S6 Ep20 Nelle mani della giustizia","genere":"SERIE","sottogenere":"AZIONE","startTime":"05:14","endTime":"06:10","duration":"56"}]} \ No newline at end of file diff --git a/sites/mediaset.it/__data__/no_content.html b/sites/mediaset.it/__data__/no_content.html new file mode 100644 index 00000000..bd8fe508 --- /dev/null +++ b/sites/mediaset.it/__data__/no_content.html @@ -0,0 +1,10 @@ + + + + 301 Moved Permanently + + +

Moved Permanently

+

The document has moved here.

+ + diff --git a/sites/mediaset.it/mediaset.it.config.js b/sites/mediaset.it/mediaset.it.config.js index 40fe6935..fa14ab5b 100644 --- a/sites/mediaset.it/mediaset.it.config.js +++ b/sites/mediaset.it/mediaset.it.config.js @@ -17,10 +17,9 @@ module.exports = { }, parser: function ({ content, date }) { const programs = [] - const data = JSON.parse(content) - if (!data.events) return programs + const items = getItems(content) - data.events.forEach(item => { + items.forEach(item => { if (item.title && item.startTime && item.duration) { const start = parseStart(item, date) const duration = parseInt(item.duration) @@ -41,5 +40,20 @@ module.exports = { } function parseStart(item, date) { - return dayjs.tz(`${date.format('YYYY-MM-DD')} ${item.startTime}`, 'YYYY-MM-DD HH:mm', 'Europe/Rome') + return dayjs.tz( + `${date.format('YYYY-MM-DD')} ${item.startTime}`, + 'YYYY-MM-DD HH:mm', + 'Europe/Rome' + ) +} + +function getItems(content) { + let data + try { + data = JSON.parse(content) + } catch (err) { + return [] + } + + return data && Array.isArray(data.events) ? data.events : [] } diff --git a/sites/mediaset.it/mediaset.it.test.js b/sites/mediaset.it/mediaset.it.test.js new file mode 100644 index 00000000..ef0078f9 --- /dev/null +++ b/sites/mediaset.it/mediaset.it.test.js @@ -0,0 +1,46 @@ +// npm run grab -- --site=mediaset.it + +const { parser, url } = require('./mediaset.it.config.js') +const fs = require('fs') +const path = require('path') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const customParseFormat = require('dayjs/plugin/customParseFormat') +dayjs.extend(customParseFormat) +dayjs.extend(utc) + +const date = dayjs.utc('2023-10-20', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: 'LB', + xmltv_id: '20.it' +} + +it('can generate valid url', () => { + expect(url({ channel, date })).toBe( + 'http://www.mediaset.it/guidatv/inc/canali/202310/20231020_LB.sjson' + ) +}) + +it('can parse response', () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'), 'utf8') + const results = parser({ content, date }).map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + return p + }) + + expect(results[0]).toMatchObject({ + start: '2023-10-20T04:10:00.000Z', + stop: '2023-10-20T05:07:00.000Z', + title: 'Showreel', + description: 'INTRATTENIMENTO 15 - Italia, 2023', + category: 'INTRATTENIMENTO' + }) +}) + +it('can handle empty guide', () => { + const result = parser({ + content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'), 'utf8') + }) + expect(result).toMatchObject([]) +})