diff --git a/.github/workflows/musor.tv.yml b/.github/workflows/musor.tv.yml
new file mode 100644
index 00000000..c5ce40c9
--- /dev/null
+++ b/.github/workflows/musor.tv.yml
@@ -0,0 +1,17 @@
+name: musor.tv
+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 }}
diff --git a/sites/musor.tv/musor.tv.config.js b/sites/musor.tv/musor.tv.config.js
new file mode 100644
index 00000000..28cdf115
--- /dev/null
+++ b/sites/musor.tv/musor.tv.config.js
@@ -0,0 +1,88 @@
+const cheerio = require('cheerio')
+const dayjs = require('dayjs')
+const axios = require('axios')
+const utc = require('dayjs/plugin/utc')
+const customParseFormat = require('dayjs/plugin/customParseFormat')
+
+dayjs.extend(utc)
+dayjs.extend(customParseFormat)
+
+module.exports = {
+ site: 'musor.tv',
+ url({ channel, date }) {
+ const diff = date.diff(dayjs.utc().startOf('d'), 'd')
+
+ return diff === 0
+ ? `https://musor.tv/mai/tvmusor/${channel.site_id}`
+ : `https://musor.tv/napi/tvmusor/${channel.site_id}/${date.format('YYYY.MM.DD')}`
+ },
+ parser({ content }) {
+ const programs = []
+ const items = parseItems(content)
+ items.forEach(item => {
+ const prev = programs[programs.length - 1]
+ const $item = cheerio.load(item)
+ let start = parseStart($item)
+ if (prev) prev.stop = start
+ const stop = start.add(30, 'm')
+ programs.push({
+ title: parseTitle($item),
+ description: parseDescription($item),
+ icon: parseIcon($item),
+ start,
+ stop
+ })
+ })
+
+ return programs
+ },
+ async channels() {
+ const html = await axios
+ .get(`https://musor.tv/`)
+ .then(r => r.data)
+ .catch(console.log)
+
+ const $ = cheerio.load(html)
+ const channels = $('body > div.big_content > div > nav > table > tbody > tr > td > a').toArray()
+ return channels
+ .map(item => {
+ const $item = cheerio.load(item)
+ const url = $item('*').attr('href')
+ if (!url.startsWith('//musor.tv/mai/tvmusor/')) return null
+ const site_id = url.replace('//musor.tv/mai/tvmusor/', '')
+ return {
+ lang: 'hu',
+ site_id,
+ name: $item('*').text()
+ }
+ })
+ .filter(i => i)
+ }
+}
+
+function parseIcon($item) {
+ const imgSrc = $item('div.smartpe_screenshot > img').attr('src')
+
+ return imgSrc ? `https:${imgSrc}` : null
+}
+
+function parseTitle($item) {
+ return $item('div:nth-child(2) > div > h3 > a').text().trim()
+}
+
+function parseDescription($item) {
+ return $item('div:nth-child(5) > div > div').text().trim()
+}
+
+function parseStart($item) {
+ let datetime = $item('div:nth-child(1) > div > div > div > div > time').attr('content')
+ if (!datetime) return null
+
+ return dayjs.utc(datetime.replace('GMT', 'T'), 'YYYY-MM-DDTHH:mm:ss')
+}
+
+function parseItems(content) {
+ const $ = cheerio.load(content)
+
+ return $('div.multicolumndayprogarea > div.smartpe_progentry').toArray()
+}
diff --git a/sites/musor.tv/musor.tv.test.js b/sites/musor.tv/musor.tv.test.js
new file mode 100644
index 00000000..b9fa192c
--- /dev/null
+++ b/sites/musor.tv/musor.tv.test.js
@@ -0,0 +1,54 @@
+// npm run channels:parse -- --config=./sites/musor.tv/musor.tv.config.js --output=./sites/musor.tv/musor.tv_hu.channels.xml
+// npx epg-grabber --config=sites/musor.tv/musor.tv.config.js --channels=sites/musor.tv/musor.tv_hu.channels.xml --output=guide.xml --days=2
+
+const { parser, url } = require('./musor.tv.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-03-07', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: 'DUNA',
+ xmltv_id: 'DunaTV.hu'
+}
+
+it('can generate valid url', () => {
+ expect(url({ channel, date })).toBe('https://musor.tv/napi/tvmusor/DUNA/2022.03.07')
+})
+
+it('can parse response', () => {
+ const content = `
kubai-francia filmdráma,2014
A Havannai éjszaka az első film, amely teljes egészében Kubában forgott és kendőzetlen őszinteséggel beszél egy elveszett generáció minden illúziójáról és csalódottságáról. Amadeo 16 évig nem találkozott legjobb barátaival, fe
német tévéfilmsorozat,2018
8/1.: Új utakonUlrich Wrangel tengeralattjáró-kapitány és emberei összecsapásba keverednek egy amerikai fregatt-tal. Eközben a megszállt Franciaországban az ifjú Klaus Hoffmann kapitány azon igyekszik, hogy méltó legyen apja hírnevé
`
+ const result = parser({ content, date }).map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result).toMatchObject([
+ {
+ start: '2022-03-06T23:35:00.000Z',
+ stop: '2022-03-07T01:15:00.000Z',
+ title: `Havannai éjszaka`,
+ icon: 'https://musor.tv/img/small/143/14373/Labadrugas.jpg',
+ description:
+ 'A Havannai éjszaka az első film, amely teljes egészében Kubában forgott és kendőzetlen őszinteséggel beszél egy elveszett generáció minden illúziójáról és csalódottságáról. Amadeo 16 évig nem találkozott legjobb barátaival, fe'
+ },
+ {
+ start: '2022-03-07T01:15:00.000Z',
+ stop: '2022-03-07T01:45:00.000Z',
+ title: `A tengeralattjáró 2018 I./1.`,
+ description:
+ '8/1.: Új utakonUlrich Wrangel tengeralattjáró-kapitány és emberei összecsapásba keverednek egy amerikai fregatt-tal. Eközben a megszállt Franciaországban az ifjú Klaus Hoffmann kapitány azon igyekszik, hogy méltó legyen apja hírnevé'
+ }
+ ])
+})
+
+it('can handle empty guide', () => {
+ const result = parser({
+ date,
+ content: ``
+ })
+ expect(result).toMatchObject([])
+})
diff --git a/sites/musor.tv/musor.tv_hu.channels.xml b/sites/musor.tv/musor.tv_hu.channels.xml
new file mode 100644
index 00000000..c20e15a4
--- /dev/null
+++ b/sites/musor.tv/musor.tv_hu.channels.xml
@@ -0,0 +1,175 @@
+
+
+
+ 7.TV
+ AMC (HD)
+ Animal Planet (HD)
+ Apostol TV
+ Arena 4 (HD)
+ ATV (HD)
+ ATV Spirit (HD)
+ Auto Motor Sport (HD)
+ AXN (HD)
+ Baby TV
+ Balaton TV
+ BBC Earth (HD)
+ BBC World News
+ EWTN / Bonum TV
+ Boomerang
+ Cartoon Network
+ CBS Reality
+ Cinemax 2 (HD)
+ Cinemax (HD)
+ club MTV
+ CNBC
+ CNN
+ Comedy Central Family
+ Comedy Central (HD)
+ Cool (HD)
+ D1 Televízió
+ Da Vinci
+ DIGI Animal World (HD)
+ DIGI Life (HD)
+ DIGI Sport 1 (HD)
+ DIGI Sport 2 (HD)
+ DIGI Sport 3 (HD)
+ DIGI World (HD)
+ Dikh TV (HD)
+ Direct One TV
+ Discovery Channel (HD)
+ Discovery Science (HD)
+ Disney Channel
+ Docubox HD
+ Discovery Turbo Xtra (DTX) (HD)
+ Duck TV
+ Duck TV HD
+ Duna TV (HD)
+ Duna World (HD)
+ E! Entertainment (HD)
+ English Club TV
+ Epic Drama (HD)
+ Erdély TV
+ Euronews (HD)
+ Eurosport 1 (HD)
+ Eurosport 2 (HD)
+ Eurosport 4K
+ Extreme Sports Channel
+ Fashion TV HD
+ Fehérvár TV
+ FEM3
+ Fightbox HD
+ Film 4 (HD)
+ Filmbox Arthouse
+ Filmbox
+ Filmbox Extra HD
+ Filmbox Family
+ Filmbox Premium
+ Filmbox Stars
+ Film Café (HD)
+ Film Mánia (HD)
+ Film Now
+ film+ (HD)
+ Fishing & Hunting Channel (HD)
+ Fit HD
+ FIX TV (HD)
+ Food Network (HD)
+ Funbox UltraHD 4K
+ Galaxy 4 (HD)
+ Gametoon HD
+ Hatoscsatorna
+ HBO 2 (HD)
+ HBO 3 (HD)
+ HBO (HD)
+ Hegyvidék TV
+ Heti TV
+ HGTV
+ Hír TV (HD)
+ History (HD)
+ H!T Music
+ ID (HD)
+ Izaura TV
+ JimJam
+ Jocky TV
+ Kapos TV
+ Kölcsey TV
+ Life TV (HD)
+ Love Nature (HD / 4K)
+ Love Nature (HD / 4K)
+ M1 (HD)
+ M2 / Petőfi (HD)
+ M4 Sport (HD)
+ M4 Sport+ (HD)
+ M5 (HD)
+ Mezzo
+ Mezzo Live HD
+ Minimax
+ Mozi+ (HD)
+ Moziverzum (HD)
+ MTV 00s
+ MTV 80s
+ MTV 90s
+ MTV European
+ MTV Hits
+ MTV Hungary
+ MTV Live HD
+ 1 Music Channel (HD)
+ Muzsika TV
+ National Geographic (HD)
+ National Geographic Wild (HD)
+ Nautical Channel (HD)
+ Nickelodeon
+ Nick Jr
+ Nicktoons
+ Ozone TV (HD)
+ Pannon TV (Vajdaság)
+ Paramount Network (HD)
+ PAX TV
+ Pesti TV
+ Prime (HD)
+ RTL Gold
+ RTL II (HD)
+ RTL Klub (HD)
+ RTL+
+ Sky News
+ Sláger TV (HD)
+ Sony Max
+ Sony Movie Channel
+ Sorozat+
+ Spektrum (HD)
+ Spektrum Home (HD)
+ Spíler1 TV (HD)
+ Spíler2 TV (HD)
+ Sport 1 (HD)
+ Sport 2 (HD)
+ Stingray Classica HD
+ Stingray C Music
+ Stingray iConcerts HD
+ Story 4 (HD)
+ Super TV2 (HD)
+ Szeged TV
+ TeenNick
+ TLC (HD)
+ Total Dance TV (HD)
+ Trace Sports HD
+ Trace Urban (HD)
+ Travel Channel (HD)
+ Travel XP (HD / 4K)
+ Travel XP (HD / 4K)
+ TV2 (HD)
+ TV21 Ungvár (Kárpátalja)
+ TV2 Comedy
+ TV2 Kids
+ TV2 Séf
+ TV 4 (HD)
+ TV Eger
+ TV Paprika (HD)
+ Újbuda TV
+ Viasat 3 (HD)
+ Viasat 6
+ Viasat Explore (HD)
+ Viasat History (HD)
+ Viasat Nature (HD)
+ Zalaegerszegi TV
+ Zenebutik TV
+
+