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 a5c0a82c..fa14ab5b 100644 --- a/sites/mediaset.it/mediaset.it.config.js +++ b/sites/mediaset.it/mediaset.it.config.js @@ -1,49 +1,59 @@ -const dayjs = require('dayjs') -const utc = require('dayjs/plugin/utc') -const customParseFormat = require('dayjs/plugin/customParseFormat') - -dayjs.extend(utc) -dayjs.extend(customParseFormat) - -module.exports = { - site: 'mediaset.it', - days: 2, - url: function ({ date, channel }) { - return `http://www.mediaset.it/guidatv/inc/canali/${date.format('YYYYMM')}/${date.format( - 'YYYYMMDD' - )}_${channel.site_id}.sjson` - }, - parser: function ({ content, date }) { - const programs = [] - const data = JSON.parse(content) - 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() - - programs.push({ - title: item.displayTitle || item.title, - description: item.description, - category: item.genere, - start, - stop - }) - } - }) - - return programs - } -} +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', + days: 2, + url: function ({ date, channel }) { + return `http://www.mediaset.it/guidatv/inc/canali/${date.format('YYYYMM')}/${date.format( + 'YYYYMMDD' + )}_${channel.site_id}.sjson` + }, + parser: function ({ content, date }) { + const programs = [] + const items = getItems(content) + + items.forEach(item => { + 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, + description: item.description, + category: item.genere, + start, + stop + }) + } + }) + + return programs + } +} + +function parseStart(item, date) { + 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([]) +})