diff --git a/.github/workflows/sjonvarp.is.yml b/.github/workflows/sjonvarp.is.yml new file mode 100644 index 00000000..3a389636 --- /dev/null +++ b/.github/workflows/sjonvarp.is.yml @@ -0,0 +1,17 @@ +name: sjonvarp.is +on: + schedule: + - cron: '0 3 * * *' + 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 }} diff --git a/sites/sjonvarp.is/__data__/content.html b/sites/sjonvarp.is/__data__/content.html new file mode 100644 index 00000000..735300b0 --- /dev/null +++ b/sites/sjonvarp.is/__data__/content.html @@ -0,0 +1,231 @@ + + + + + + + + + + + sjonvarp.is - Sjónvarpsdagskráin + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+
+ + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + +
+ + + + + + diff --git a/sites/sjonvarp.is/__data__/no_content.html b/sites/sjonvarp.is/__data__/no_content.html new file mode 100644 index 00000000..7b3de225 --- /dev/null +++ b/sites/sjonvarp.is/__data__/no_content.html @@ -0,0 +1,231 @@ + + + + + + + + + + + sjonvarp.is - Sjónvarpsdagskráin + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+
+ + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + +
+ + + + + + diff --git a/sites/sjonvarp.is/sjonvarp.is.config.js b/sites/sjonvarp.is/sjonvarp.is.config.js new file mode 100644 index 00000000..e4321b50 --- /dev/null +++ b/sites/sjonvarp.is/sjonvarp.is.config.js @@ -0,0 +1,63 @@ +const dayjs = require('dayjs') +const cheerio = require('cheerio') +const utc = require('dayjs/plugin/utc') +const customParseFormat = require('dayjs/plugin/customParseFormat') + +dayjs.extend(utc) +dayjs.extend(customParseFormat) + +module.exports = { + site: 'sjonvarp.is', + url: function ({ channel, date }) { + return `http://www.sjonvarp.is/index.php?Tm=%3F&p=idag&c=${channel.site_id}&y=${date.format( + 'YYYY' + )}&m=${date.format('MM')}&d=${date.format('DD')}` + }, + parser: function ({ content, date }) { + let programs = [] + const items = parseItems(content) + items.forEach(item => { + const prev = programs[programs.length - 1] + const $item = cheerio.load(item) + let start = parseStart($item, date) + if (prev) { + if (start.isBefore(prev.start)) { + start = start.add(1, 'd') + date = date.add(1, 'd') + } + prev.stop = start + } + const stop = start.add(30, 'm') + programs.push({ + title: parseTitle($item), + description: parseDescription($item), + start, + stop + }) + }) + + return programs + } +} + +function parseTitle($item) { + return $item('.day-listing-title').text() +} + +function parseDescription($item) { + return $item('.day-listing-description').text() +} + +function parseStart($item, date) { + const time = $item('.day-listing-time') + + return dayjs.utc(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm') +} + +function parseItems(content) { + const $ = cheerio.load(content) + + return $( + 'body > div.container.nano-container > div > ul > div.day-listing > div:not(.day-listing-channel)' + ).toArray() +} diff --git a/sites/sjonvarp.is/sjonvarp.is.test.js b/sites/sjonvarp.is/sjonvarp.is.test.js new file mode 100644 index 00000000..3a655e70 --- /dev/null +++ b/sites/sjonvarp.is/sjonvarp.is.test.js @@ -0,0 +1,50 @@ +// npx epg-grabber --config=sites/sjonvarp.is/sjonvarp.is.config.js --channels=sites/sjonvarp.is/sjonvarp.is_is.channels.xml --output=guide.xml --days=2 + +const { parser, url } = require('./sjonvarp.is.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('2022-08-28', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: 'RUV', + xmltv_id: 'RUV.is' +} + +it('can generate valid url', () => { + expect(url({ channel, date })).toBe( + 'http://www.sjonvarp.is/index.php?Tm=%3F&p=idag&c=RUV&y=2022&m=08&d=28' + ) +}) + +it('can parse response', () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html')) + const results = parser({ content, date }).map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + return p + }) + + expect(results[0]).toMatchObject({ + start: '2022-08-28T07:15:00.000Z', + stop: '2022-08-28T07:16:00.000Z', + title: 'KrakkaRÚV' + }) + + expect(results[1]).toMatchObject({ + start: '2022-08-28T07:16:00.000Z', + stop: '2022-08-28T07:21:00.000Z', + title: 'Tölukubbar', + description: 'Lærið um tölustafina með Tölukubbunum! e.' + }) +}) + +it('can handle empty guide', () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html')) + const result = parser({ content, date }) + expect(result).toMatchObject([]) +}) diff --git a/sites/sjonvarp.is/sjonvarp.is_is.channels.xml b/sites/sjonvarp.is/sjonvarp.is_is.channels.xml new file mode 100644 index 00000000..c184039b --- /dev/null +++ b/sites/sjonvarp.is/sjonvarp.is_is.channels.xml @@ -0,0 +1,22 @@ + + + + Hringbraut + N4 + Omega + RÚV + RÚV 2 + Síminn Sport + Síminn Sport 2 + Sjónvarp Símans + Stöð 2 + Stöð 2 Bíó + Stöð 2 Esport + Stöð 2 Fjölskylda + Stöð 2 Golf + Stöð 2 Sport + Stöð 2 Sport 2 + Stöð 2 Sport 3 + Stöð 2 Sport 4 + +