From 8be9d5d71f50afb4fab1a5c56126eaf4ab1b20a5 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 20 Apr 2022 02:16:18 +0300 Subject: [PATCH 1/4] Create tvmi.mt.test.js --- sites/tvmi.mt/tvmi.mt.test.js | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 sites/tvmi.mt/tvmi.mt.test.js diff --git a/sites/tvmi.mt/tvmi.mt.test.js b/sites/tvmi.mt/tvmi.mt.test.js new file mode 100644 index 00000000..966a546d --- /dev/null +++ b/sites/tvmi.mt/tvmi.mt.test.js @@ -0,0 +1,54 @@ +// npx epg-grabber --config=sites/tvmi.mt/tvmi.mt.config.js --channels=sites/tvmi.mt/tvmi.mt_mt.channels.xml --output=guide.xml --days=2 + +const { parser, url } = require('./tvmi.mt.config.js') +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('2022-04-21', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: '1', + xmltv_id: 'TVM.mt' +} + +it('can generate valid url', () => { + expect(url({ date })).toBe('https://www.tvmi.mt/mt/tvmi/skeda/?sd-date=2022-04-21') +}) + +it('can parse response', () => { + const content = `

Sorelle – It-Tielet Staġun

06:30 - 07:00

Fit-tielet staġun ta’ Sorelle se naraw lill-aħwa, flimkien ma’ dawk kollha li sofrew taħt idejn Leo, inklużi martu Bella u bintu Janice, ikomplu jagħmlu minn kollox biex jeħilsu darba għal dejjem minnu. Il-fatti se juruna li dan mhu se jkun faċli xejn għax Leo għandu għeruq fil-fond u għalhekk għad baqagħlu ħafna sorpriżi għalihom ilkoll. Dan waqt li flimkien ikomplu jaraw kif jesponu lil dawk li b’xi mod jew ieħor ikun qed jirnexxilhom jaħarbu mill-awtoritajiet.

Ta’ Filgħodu

07:00 - 09:00

Ta' Filgħodu se jkun qed jibda jum ġdid fuq nota pożittiva; b'informazzjoni u aġġornamenti regolari dwar it-traffiku, it-temp u l-ewwel faċċati tal-gazzetti mal-ewwel tazza cafè. Dan iwassalna biex flimkien ma’ Ray Attard niltaqgħu mal-protagonisti li minn wara l-kwinti jkunu qed jagħmlu l-ġurnata ta’ kulħadd waħda isbaħ fl-oqsma rispettivi tagħhom. Ta' Filgħodu se jkun kurrenti imma din id-darba minn angoli oħra ta’ interess, li bis-sewwa se jkunu qed jgħarrfu lit-telespettaturi b'dak kollu li jkun qed jiġri madwarna. Preżentazzjoni ta’ Ray Attard.

` + const result = parser({ content, channel, date }).map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + return p + }) + + expect(result).toMatchObject([ + { + start: '2022-04-21T04:30:00.000Z', + stop: '2022-04-21T05:00:00.000Z', + title: 'Sorelle – It-Tielet Staġun', + description: + 'Fit-tielet staġun ta’ Sorelle se naraw lill-aħwa, flimkien ma’ dawk kollha li sofrew taħt idejn Leo, inklużi martu Bella u bintu Janice, ikomplu jagħmlu minn kollox biex jeħilsu darba għal dejjem minnu. Il-fatti se juruna li dan mhu se jkun faċli xejn għax Leo għandu għeruq fil-fond u għalhekk għad baqagħlu ħafna sorpriżi għalihom ilkoll. Dan waqt li flimkien ikomplu jaraw kif jesponu lil dawk li b’xi mod jew ieħor ikun qed jirnexxilhom jaħarbu mill-awtoritajiet.', + icon: 'https://www.tvmi.mt/mt/wp-content/uploads/sites/1/2019/09/pink-leather-11-for-Airing.png' + }, + { + start: '2022-04-21T05:00:00.000Z', + stop: '2022-04-21T07:00:00.000Z', + title: 'Ta’ Filgħodu', + description: + "Ta' Filgħodu se jkun qed jibda jum ġdid fuq nota pożittiva; b'informazzjoni u aġġornamenti regolari dwar it-traffiku, it-temp u l-ewwel faċċati tal-gazzetti mal-ewwel tazza cafè. Dan iwassalna biex flimkien ma’ Ray Attard niltaqgħu mal-protagonisti li minn wara l-kwinti jkunu qed jagħmlu l-ġurnata ta’ kulħadd waħda isbaħ fl-oqsma rispettivi tagħhom. Ta' Filgħodu se jkun kurrenti imma din id-darba minn angoli oħra ta’ interess, li bis-sewwa se jkunu qed jgħarrfu lit-telespettaturi b'dak kollu li jkun qed jiġri madwarna. Preżentazzjoni ta’ Ray Attard.", + icon: 'https://www.tvmi.mt/mt/wp-content/uploads/sites/1/2021/09/ta-Filghodu-02.jpeg' + } + ]) +}) + +it('can handle empty guide', () => { + const result = parser({ + content: ``, + channel + }) + expect(result).toMatchObject([]) +}) From 80e74f0cfb3ad440df84f41d62e913ab29da1609 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 20 Apr 2022 02:16:22 +0300 Subject: [PATCH 2/4] Create tvmi.mt.config.js --- sites/tvmi.mt/tvmi.mt.config.js | 70 +++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 sites/tvmi.mt/tvmi.mt.config.js diff --git a/sites/tvmi.mt/tvmi.mt.config.js b/sites/tvmi.mt/tvmi.mt.config.js new file mode 100644 index 00000000..561deb15 --- /dev/null +++ b/sites/tvmi.mt/tvmi.mt.config.js @@ -0,0 +1,70 @@ +const cheerio = require('cheerio') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') + +dayjs.extend(utc) +dayjs.extend(timezone) + +module.exports = { + site: 'tvmi.mt', + url: function ({ date }) { + return `https://www.tvmi.mt/mt/tvmi/skeda/?sd-date=${date.format('YYYY-MM-DD')}` + }, + parser: function ({ content, channel, date }) { + let programs = [] + const items = parseItems(content, channel) + items.forEach(item => { + const $item = cheerio.load(item) + programs.push({ + title: parseTitle($item), + description: parseDescription($item), + icon: parseIcon($item), + start: parseStart($item, date), + stop: parseStop($item, date) + }) + }) + + return programs + } +} + +function parseTitle($item) { + return $item('.programme-title').text().trim() +} + +function parseDescription($item) { + return $item('.description').text().trim() +} + +function parseIcon($item) { + return $item('.image').attr('src') +} + +function parseStart($item, date) { + const times = $item('.title-time > .times').text().trim() + const [_, HH, mm] = times.match(/^(\d{2}):(\d{2}) \-/) || [null, null, null] + if (!HH || !mm) return null + + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${HH}:${mm}`, 'YYYY-MM-DD HH:mm', 'Europe/Malta') +} + +function parseStop($item, date) { + const times = $item('.title-time > .times').text().trim() + const [_, HH, mm] = times.match(/\- (\d{2}):(\d{2})$/) || [null, null, null] + if (!HH || !mm) return null + + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${HH}:${mm}`, 'YYYY-MM-DD HH:mm', 'Europe/Malta') +} + +function parseItems(content, channel) { + const $ = cheerio.load(content) + const channelSchedules = $( + '#content > div.schedule > div.content > div.schedule-bottom > div.schedules > .channel-schedule' + ).toArray() + if (!Array.isArray(channelSchedules)) return [] + const index = parseInt(channel.site_id) - 1 + if (!channelSchedules[index]) return [] + + return $(channelSchedules[index], '.programmes').find('.remodal').toArray() +} From 3060963875ef83c8256917fa9f235f8d37df6145 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 20 Apr 2022 02:16:40 +0300 Subject: [PATCH 3/4] Create tvmi.mt_mt.channels.xml --- sites/tvmi.mt/tvmi.mt_mt.channels.xml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 sites/tvmi.mt/tvmi.mt_mt.channels.xml diff --git a/sites/tvmi.mt/tvmi.mt_mt.channels.xml b/sites/tvmi.mt/tvmi.mt_mt.channels.xml new file mode 100644 index 00000000..97d83be8 --- /dev/null +++ b/sites/tvmi.mt/tvmi.mt_mt.channels.xml @@ -0,0 +1,7 @@ + + + + TVM + TVMNews+ + + From 438f5b54ead18f7c91d4b880b8829e9087fd9126 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 20 Apr 2022 02:17:19 +0300 Subject: [PATCH 4/4] Create tvmi.mt.yml --- .github/workflows/tvmi.mt.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/tvmi.mt.yml diff --git a/.github/workflows/tvmi.mt.yml b/.github/workflows/tvmi.mt.yml new file mode 100644 index 00000000..d48726db --- /dev/null +++ b/.github/workflows/tvmi.mt.yml @@ -0,0 +1,17 @@ +name: tvmi.mt +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + workflow_run: + workflows: [_trigger] + types: + - completed +jobs: + load: + uses: ./.github/workflows/_load.yml + with: + site: ${{github.workflow}} + secrets: + APP_ID: ${{ secrets.APP_ID }} + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}