From a62afcb8558b5dc618f68c344318e2a83563d0c7 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Fri, 1 Oct 2021 23:56:50 +0300 Subject: [PATCH 1/3] Install srcset package --- package-lock.json | 17 +++++++++++++++++ package.json | 1 + 2 files changed, 18 insertions(+) diff --git a/package-lock.json b/package-lock.json index bd0ded38..ad8e8999 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "jsdom": "^16.5.0", "lodash": "^4.17.21", "parse-duration": "^1.0.0", + "srcset": "^4.0.0", "tabletojson": "^2.0.7", "xml-js": "^1.6.11" } @@ -1361,6 +1362,17 @@ "node": ">=0.10.0" } }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -2649,6 +2661,11 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true }, + "srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==" + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", diff --git a/package.json b/package.json index 434ab566..0e8a6966 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "jsdom": "^16.5.0", "lodash": "^4.17.21", "parse-duration": "^1.0.0", + "srcset": "^4.0.0", "tabletojson": "^2.0.7", "xml-js": "^1.6.11" } From 79940e28459a0314294ff6f3659f1e8513045f78 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Fri, 1 Oct 2021 23:56:59 +0300 Subject: [PATCH 2/3] Update programme-tv.net.config.js --- sites/programme-tv.net.config.js | 109 ++++++++++++++++--------------- 1 file changed, 56 insertions(+), 53 deletions(-) diff --git a/sites/programme-tv.net.config.js b/sites/programme-tv.net.config.js index 51a9d31a..57862d8c 100644 --- a/sites/programme-tv.net.config.js +++ b/sites/programme-tv.net.config.js @@ -1,17 +1,18 @@ -const jsdom = require('jsdom') -const { JSDOM } = jsdom -const parseDuration = require('parse-duration') +const durationParser = require('parse-duration') +const cheerio = require('cheerio') +const srcset = require('srcset') const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') -const duration = require('dayjs/plugin/duration') +const timezone = require('dayjs/plugin/timezone') const customParseFormat = require('dayjs/plugin/customParseFormat') dayjs.extend(utc) -dayjs.extend(duration) +dayjs.extend(timezone) dayjs.extend(customParseFormat) module.exports = { lang: 'fr', + days: 3, site: 'programme-tv.net', channels: 'programme-tv.net.channels.xml', output: '.gh-pages/guides/programme-tv.net.guide.xml', @@ -21,61 +22,63 @@ module.exports = { }.html` }, logo: function ({ content }) { - const dom = new JSDOM(content) - const img = dom.window.document.querySelector( - '#corps > div > div.page.channel > div.gridChannel > div.gridChannel-leftColumn > div.gridChannel-epgGrid > div.gridChannel-header > div > div > div > img' - ) + const $ = cheerio.load(content) + const img = $('.gridChannel-logo').first().find('img') + const value = img.attr('srcset') || img.data('srcset') + const obj = value ? srcset.parse(value).find(i => i.width === 80) : {} - return img ? img.dataset.src : null + return obj.url }, parser: function ({ content, date }) { const programs = [] - const dom = new JSDOM(content) - const broadcastCards = dom.window.document.querySelectorAll('.mainBroadcastCard') - broadcastCards.forEach(card => { - const hour = ( - card.getElementsByClassName('mainBroadcastCard-startingHour')[0] || { textContent: '' } - ).textContent - .toString() - .trim() - const durationContent = ( - card.getElementsByClassName('mainBroadcastCard-durationContent')[0] || { textContent: '' } - ).textContent - .toString() - .trim() - const title = ( - card.getElementsByClassName('mainBroadcastCard-title')[0] || { textContent: '' } - ).textContent - .toString() - .trim() - const category = ( - card.getElementsByClassName('mainBroadcastCard-genre')[0] || { textContent: '' } - ).textContent - .toString() - .trim() + const items = parseItems(content) + items.forEach(item => { + const $item = cheerio.load(item) + const title = parseTitle($item) + const icon = parseIcon($item) + const category = parseCategory($item) + const start = parseStart($item, date) + const duration = parseDuration($item) + const stop = start.add(duration, 'ms') - if (hour && title) { - const start = dayjs - .utc(hour.replace('h', '-'), 'HH-mm') - .set('D', date.get('D')) - .set('M', date.get('M')) - .set('y', date.get('y')) - - let stop = null - if (durationContent) { - const durationInMilliseconds = parseDuration(durationContent) - stop = start.add(dayjs.duration(durationInMilliseconds)).toString() - } - - programs.push({ - title, - category, - start: start.toString(), - stop - }) - } + programs.push({ title, icon, category, start, stop }) }) return programs } } + +function parseStart($item, date) { + let time = $item('.mainBroadcastCard-startingHour').first().text().trim() + time = `${date.format('MM/DD/YYYY')} ${time.replace('h', ':')}` + + return dayjs.tz(time, 'MM/DD/YYYY HH:mm', 'Europe/Paris') +} + +function parseDuration($item) { + const duration = $item('.mainBroadcastCard-durationContent').first().text().trim() + + return durationParser(duration) +} + +function parseIcon($item) { + const img = $item('.mainBroadcastCard-imageContent').first().find('img') + const value = img.attr('srcset') || img.data('srcset') + const obj = value ? srcset.parse(value).find(i => i.width === 128) : {} + + return obj.url +} + +function parseCategory($item) { + return $item('.mainBroadcastCard-genre').first().text().trim() +} + +function parseTitle($item) { + return $item('.mainBroadcastCard-title').first().text().trim() +} + +function parseItems(content) { + const $ = cheerio.load(content) + + return $('.mainBroadcastCard').toArray() +} From 450483fa9814cb8a6fb04c71651d1eaca4968469 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Fri, 1 Oct 2021 23:57:06 +0300 Subject: [PATCH 3/3] Update programme-tv.net.channels.xml --- sites/programme-tv.net.channels.xml | 82 ++++++++++++++--------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/sites/programme-tv.net.channels.xml b/sites/programme-tv.net.channels.xml index e65a44ac..ea84ce42 100755 --- a/sites/programme-tv.net.channels.xml +++ b/sites/programme-tv.net.channels.xml @@ -1,33 +1,33 @@ - 13ème Rue 6ter - A+ - AB 1 + 13ème Rue AB 3 + AB 1 Action Aljazeera English Altice Studio Animaux + A+ ARTE Français Automoto la chaîne B-One TV Baby TV Europe - BBC Entertainment Europe - BBC Four - BBC One BBC Two - BeIn Sports 1 - BeIn Sports 2 + BBC One + BBC Four + BBC Entertainment Europe BeIn Sports 3 + BeIn Sports 2 + BeIn Sports 1 BeIn Sports Max 10 France - BeIn Sports Max 4 France - BeIn Sports Max 5 France - BeIn Sports Max 6 France - BeIn Sports Max 7 France - BeIn Sports Max 8 France BeIn Sports Max 9 France + BeIn Sports Max 8 France + BeIn Sports Max 7 France + BeIn Sports Max 6 France + BeIn Sports Max 5 France + BeIn Sports Max 4 France BET France BFM Business BFM Lyon @@ -35,31 +35,31 @@ BFM TV Boing France Boomerang France - C News - C Star C8 + Canal J + Canal + France Canal + Cinéma France Canal + Décalé Canal + Family France - Canal + France - Canal + Sport France Canal + Séries France - Canal J + Canal + Sport France Canvas Cartoon Network France Chasse & Pêche Chérie 25 Cine + Classic Cine + Club + Cine + Émotion Cine + Famiz Cine + Frisson Cine + Premier - Cine + Émotion Club RTL + C News CNN International Europe - Comedy Central France Comédie + + Comedy Central France Crime District + C Star Das Erste Discovery Channel France Discovery Family @@ -67,14 +67,16 @@ Disney Channel France Disney Junior France E! France + Één Equidia Eurochannel EuroNews Français - Eurosport 1 France Eurosport 2 France + Eurosport 1 France FashionTV Europe - France 2 France 24 Français + France 5 + France 4 France 3 France 3 Alpes France 3 Alsace @@ -100,13 +102,11 @@ France 3 Poitou-Charentes France 3 Provence-Alpes France 3 Rhône-Alpes - France 4 - France 5 + France 2 Game One Ginx eSports TV International - Golf + Golf Channel France - Gospel Music TV + Golf + Gulli Histoire TV I24 News Français @@ -114,10 +114,11 @@ J-One Ketnet KTO - L'Équipe La Chaîne Météo - LCI LCP Assemblée Nationale + RTBF La Une + LCI + L'Équipe M6 M6 Music Mangas @@ -130,8 +131,8 @@ MTV Hits Europe MTV Hits France MyZen TV - National Geographic France National Geographic Wild France + National Geographic France Nautical Channel Nickelodeon France Nickelodeon Junior France @@ -154,32 +155,30 @@ Piwi + Planète + Planète + CI - Play 4 - Play 5 Plug RTL Polar + Rai 1 RFM TV RMC Découverte - RMC Sport 1 RMC Sport 2 + RMC Sport 1 RMC Story RT France - RTBF La Trois - RTBF La Une - RTL RTL 9 + RTL RTL TVI RTP Internacional Europa - RTS 1 RTS 2 + RTS 1 Science & Vie TV Seasons + Série Club Stingray Djazz Stingray IConcerts Syfy France - Série Club TCM Cinéma + TéléToon + + Téva TF 1 TF 1 Séries Films TFX @@ -192,20 +191,19 @@ Trace Sport Stars Trace Urban Trek - TV Breizh TV5Monde France Belgique Suisse + TV Breizh TVE Internacional Europa - TéléToon + - Téva Ushuaïa TV VH1 Europe + Play 4 + Play 5 VTM - VTM 2 VTM 3 + VTM 2 W9 Warner TV France XXL ZDF - Één \ No newline at end of file