From 793c74ca397504fc2afc8fbfa998e0b8e4ca45d9 Mon Sep 17 00:00:00 2001 From: Marco Migozzi Date: Thu, 1 Aug 2024 14:09:16 +0200 Subject: [PATCH 1/3] Refined program data extraction by adding parsing for season, episode, and high-resolution thumbnails. Enhanced data object to include category and optional description, thus improving data completeness and accuracy. --- .../mediasetinfinity.mediaset.it.config.js | 81 ++++++++++++++----- .../mediasetinfinity.mediaset.it.test.js | 29 ++++--- 2 files changed, 79 insertions(+), 31 deletions(-) diff --git a/sites/mediasetinfinity.mediaset.it/mediasetinfinity.mediaset.it.config.js b/sites/mediasetinfinity.mediaset.it/mediasetinfinity.mediaset.it.config.js index 731bc8e8..9997eda8 100644 --- a/sites/mediasetinfinity.mediaset.it/mediasetinfinity.mediaset.it.config.js +++ b/sites/mediasetinfinity.mediaset.it/mediasetinfinity.mediaset.it.config.js @@ -10,41 +10,84 @@ dayjs.extend(timezone) module.exports = { site: 'mediasetinfinity.mediaset.it', days: 2, - url: function ({ date, channel }) { + url: function ({date, channel}) { // Get the epoch timestamp - const todayEpoch = date.startOf('day').utc().valueOf(); + const todayEpoch = date.startOf('day').utc().valueOf() // Get the epoch timestamp for the next day - const nextDayEpoch = date.add(1, 'day').startOf('day').utc().valueOf(); + const nextDayEpoch = date.add(1, 'day').startOf('day').utc().valueOf() return `https://api-ott-prod-fe.mediaset.net/PROD/play/feed/allListingFeedEpg/v2.0?byListingTime=${todayEpoch}~${nextDayEpoch}&byCallSign=${channel.site_id}` }, - parser: function ({ content, date }) { - const programs = []; - const data = JSON.parse(content); + parser: function ({content}) { + const programs = [] + const data = JSON.parse(content) if (!data.response || !data.response.entries || !data.response.entries[0] || !data.response.entries[0].listings) { // If the structure is not as expected, return an empty array - return programs; + return programs } - const listings = data.response.entries[0].listings; + const listings = data.response.entries[0].listings listings.forEach((listing) => { - if (listing.program.title && listing.startTime && listing.endTime) { - const start = parseTime(listing.startTime); - const stop = parseTime(listing.endTime); + const title = listing.mediasetlisting$epgTitle + const subTitle = listing.program.title + const season = parseSeason(listing) + const episode = parseEpisode(listing) + + if (listing.program.title && listing.startTime && listing.endTime) { programs.push({ - title: listing.program.title, - description: listing.program.description, - start, - stop - }); + title: title || subTitle, + sub_title: title && title != subTitle ? subTitle : null, + description: listing.program.description || null, + category: listing.program.mediasetprogram$skyGenre || null, + season: episode && !season ? '0' : season, + episode: episode, + start: parseTime(listing.startTime), + stop: parseTime(listing.endTime), + image: getMaxResolutionThumbnails(listing) + }) } - }); - return programs; + }) + + return programs } } + function parseTime(timestamp) { - return dayjs(timestamp).utc().format('YYYY-MM-DD HH:mm'); + return dayjs(timestamp).utc().format('YYYY-MM-DD HH:mm') +} + +function parseSeason(item) { + if (!item.mediasetlisting$shortDescription) return null + const season = item.mediasetlisting$shortDescription.match(/S(\d+)\s/) + return season ? season[1] : null +} + +function parseEpisode(item) { + if (!item.mediasetlisting$shortDescription) return null + const episode = item.mediasetlisting$shortDescription.match(/Ep(\d+)\s/) + return episode ? episode[1] : null +} + +function getMaxResolutionThumbnails(item) { + const thumbnails = item.program.thumbnails || null + const maxResolutionThumbnails = {} + + for (const key in thumbnails) { + const type = key.split('-')[0] // Estrarre il tipo di thumbnail + const {width, height, url, title} = thumbnails[key] + + if (!maxResolutionThumbnails[type] || + (width * height > maxResolutionThumbnails[type].width * maxResolutionThumbnails[type].height)) { + maxResolutionThumbnails[type] = {width, height, url, title} + } + } + if (maxResolutionThumbnails.image_keyframe_poster) + return maxResolutionThumbnails.image_keyframe_poster.url + else if (maxResolutionThumbnails.image_header_poster) + return maxResolutionThumbnails.image_header_poster.url + else + return null } diff --git a/sites/mediasetinfinity.mediaset.it/mediasetinfinity.mediaset.it.test.js b/sites/mediasetinfinity.mediaset.it/mediasetinfinity.mediaset.it.test.js index 83b64e6c..528d9200 100644 --- a/sites/mediasetinfinity.mediaset.it/mediasetinfinity.mediaset.it.test.js +++ b/sites/mediasetinfinity.mediaset.it/mediasetinfinity.mediaset.it.test.js @@ -1,4 +1,4 @@ -const { parser, url } = require('./mediasetinfinity.mediaset.it.config.js') +const {parser, url} = require('./mediasetinfinity.mediaset.it.config.js') const fs = require('fs') const path = require('path') const dayjs = require('dayjs') @@ -9,27 +9,32 @@ dayjs.extend(utc) const date = dayjs.utc('2024-01-20', 'YYYY-MM-DD').startOf('d') const channel = { - site_id: 'LB', - xmltv_id: '20.it' + site_id: 'LB', xmltv_id: '20.it' } it('can generate valid url', () => { - expect(url({ channel, date })).toBe( - 'https://api-ott-prod-fe.mediaset.net/PROD/play/feed/allListingFeedEpg/v2.0?byListingTime=1705708800000~1705795200000&byCallSign=LB' - ) + expect(url({ + channel, + date + })).toBe('https://api-ott-prod-fe.mediaset.net/PROD/play/feed/allListingFeedEpg/v2.0?byListingTime=1705708800000~1705795200000&byCallSign=LB') }) it('can parse response', () => { const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'), 'utf8') - const results = parser({ content, date }).map(p => { + const results = parser({content, date}).map(p => { return p }) - expect(results[0]).toMatchObject({ - start: '2024-01-19 22:37', - stop: '2024-01-20 00:54', - title: 'Independence day: Rigenerazione', - description: 'Sequel del film di fantascienza Independence Day, con L. Hemsworth e B. Pullman. Dopo 20 anni la Terra si prepara a subire un secondo, terrificante attacco alieno.', + expect(results[3]).toMatchObject({ + start: '2024-01-20 02:14', + stop: '2024-01-20 02:54', + title: 'Chicago Fire', + sub_title: 'Ep. 22 - Io non ti lascio', + description: 'Severide e Kidd continuano a indagare su un vecchio caso doloso di Benny. Notizie inaspettate portano Brett a meditare su una grande decisione.', + category: 'Intrattenimento', + season: '7', + episode: '22', + image: 'https://static2.mediasetplay.mediaset.it/Mediaset_Italia_Production_-_Main/F309370301002204/media/0/0/1ef76b73-3173-43bd-9c16-73986a0ec131/46896726-11e7-4438-b947-d2ae53f58c0b.jpg' }) }) From 9d3623294e4d2e0d92190063fcbe1003ffe253ab Mon Sep 17 00:00:00 2001 From: Marco Migozzi Date: Fri, 2 Aug 2024 15:48:27 +0200 Subject: [PATCH 2/3] Add .dockerignore file and Dockerfile, update .gitignore in /output directory --- .dockerignore | 133 ++++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 5 ++ output/.gitignore | 0 3 files changed, 138 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 output/.gitignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..46411170 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,133 @@ +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +Dockerfile + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..4e55ce04 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM node:lts-slim +LABEL authors="torvalds" +WORKDIR /app +COPY . . +RUN npm install diff --git a/output/.gitignore b/output/.gitignore new file mode 100644 index 00000000..e69de29b From 1a7c1cac4cc9eb7a456f2090e0ff9b87f8825e02 Mon Sep 17 00:00:00 2001 From: Marco Migozzi Date: Mon, 12 Aug 2024 14:04:06 +0200 Subject: [PATCH 3/3] Revert "Add .dockerignore file and Dockerfile, update .gitignore in /output directory" This reverts commit 9d3623294e4d2e0d92190063fcbe1003ffe253ab. --- .dockerignore | 133 ---------------------------------------------- Dockerfile | 5 -- output/.gitignore | 0 3 files changed, 138 deletions(-) delete mode 100644 .dockerignore delete mode 100644 Dockerfile delete mode 100644 output/.gitignore diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 46411170..00000000 --- a/.dockerignore +++ /dev/null @@ -1,133 +0,0 @@ -### Node template -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* -Dockerfile - diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 4e55ce04..00000000 --- a/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM node:lts-slim -LABEL authors="torvalds" -WORKDIR /app -COPY . . -RUN npm install diff --git a/output/.gitignore b/output/.gitignore deleted file mode 100644 index e69de29b..00000000