Merge branch 'master' into freearhey-patch-5

This commit is contained in:
freearhey 2025-01-04 20:43:51 +03:00
commit 8b0952b915
9 changed files with 5929 additions and 0 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="1945">CNN</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2001">Sky News</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2221">Vergina TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2266">Cartoonito</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2374">Cartoon Network</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2394">Disney Channel</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2491">Motorvision</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2498">Nickelodeon</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2743">Baby TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2755">FOX HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2767">History HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2831">National Geographic Wild HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="2926">Disney Junior</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="206750">4E</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="211368">Al Jazeera</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="213706">BBC News</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="213719">Bloomberg</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="213775">Deutsche Welle</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="213814">E! Entertainment</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="213835">NBA TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="213889">France 24 (French)</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="213936">TV 5 Monde</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="216382">Fashion TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="216389">MTV 80s</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="216415">Novasports PrimeHD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="216459">National Geographic HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="216501">Novacinema 2 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="216582">Novacinema 1 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="216595">FOX life HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="216630">Βουλή Ελλήνων</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="218874">TLC</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="218883">Novasports 2HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="289530">SIGMA TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="289542">ANT1 TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="289555">OMEGA</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="289568">PLUS TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="289607">Alpha Cyprus</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="349455">Euronews ENG</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="561066">RIK 1</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="561078">RIK 2</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="561166">Capital TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="561178">One Channel</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="561210">Smile TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="573851">Greek Cınema</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="573950">MAD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="573974">Euronews Ελληνικό</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="574035">MAD Viral</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="574094">Euronews (Russıan)</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="574124">MAD Greekζ</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="574264">ERT World</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="604956">Cytavision Sports1 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="607141">Movies Best HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="608096">RIK HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="4185119">Eurosport 1 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="5183085">Eurosport 2 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="6260715">Nova Christmas</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="8242808">Cytavision Sports3 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="8242848">Cytavision Sports2 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="8242862">Cytavision Sports4 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="8242886">Cytavision Sports5 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="8243873">Cytavision Sports6 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="9744271">Novacinema 4 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="9745267">Novacinema 3 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="9821917">BBC Earth HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="9821930">TCM HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="10963625">Novalife HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="10965536">Novasports 3 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="10965554">Novasports 4 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="10973069">Novasports 5 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="11762362">Mezzo Live HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="12253994">MTV Live SD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="13132700">Food Network HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="24654412">Cytavision Sports7 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="24745114">Cablenet Sports 1 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="24746908">Cablenet Sports 2 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="35973256">HGTV HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="38335692">Discovery Channel HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="38335714">Animal Planet HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="38335725">Investigation Discovery HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="39337317">Alpha Cyprus HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="46137467">Novasports 6 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="46137848">Novasports Start HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52027167">Novasportsextra1HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52027180">Novasportsextra4HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52027399">Novasportsextra2HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52027412">Novasportsextra3HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52098866">Cytavision Sports2 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52101919">Cytavision Sports1 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52101930">Cytavision Sports3 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52103938">Cytavision Sports4 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52103947">Cytavision Sports6 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52105043">Cytavision Sports5 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52105052">Cytavision Sports7 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52187736">Cablenet Sports 1 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52187749">Cablenet Sports 2 HD CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52196563">PPV1 CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52196572">PPV3 CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52196581">PPV5 CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52196745">PPV2 CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52196754">PPV4 CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="52196763">PPV6 CMAF</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="53005467">Cablenet Sports 3 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="54111184">OMEGA HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="54111209">CVSPORTS UHD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="54111722">Premier League</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="54184415">ANT1 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="55844755">Current Time HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="56063885">CCTV 4E</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="56064497">CGTN</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="57944046">CGTN Documentary</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="66620028">CVSPORTS Multiview</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="71037984">Bloomberg TV+</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="71037999">Bloomberg Original</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="74516237">Cytavision Sports8 HD</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="75835625">OMONOIA TV</channel>
<channel site="cyta.com.cy" lang="el" xmltv_id="" site_id="77956035">Cytavision Sports8 HD CMAF</channel>
</channels>

View file

@ -0,0 +1,60 @@
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
const cheerio = require('cheerio')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: 'cyta.com.cy',
days: 7,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url: function ({date, channel}) {
// Get the epoch timestamp
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()
return `https://epg.cyta.com.cy/api/mediacatalog/fetchEpg?startTimeEpoch=${todayEpoch}&endTimeEpoch=${nextDayEpoch}&language=1&channelIds=${channel.site_id}`
},
parser: function ({content}) {
const data = JSON.parse(content)
const programs = []
data.channelEpgs.forEach(channel => {
channel.epgPlayables.forEach(epg => {
const start = new Date(epg.startTime).toISOString();
const stop = new Date(epg.endTime).toISOString();
programs.push({
title: epg.name,
start,
stop
})
})
})
return programs
},
async channels() {
const axios = require('axios')
const data = await axios
.get(`https://epg.cyta.com.cy/api/mediacatalog/fetchChannels?language=1`)
.then(r => r.data)
.catch(console.log)
return data.channels.map(item => {
return {
lang: 'el',
site_id: item.id,
name: item.name
}
})
}
}

View file

@ -0,0 +1,53 @@
const { url, parser } = require('./cyta.com.cy.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(customParseFormat)
const date = dayjs.utc('2025-01-03', 'YYYY-MM-DD').startOf('day')
const channel = {
site_id: '561066',
xmltv_id: 'RIK1.cy'
}
it('can generate valid url', () => {
const generatedUrl = url({ date, channel })
expect(generatedUrl).toBe(
'https://epg.cyta.com.cy/api/mediacatalog/fetchEpg?startTimeEpoch=1735862400000&endTimeEpoch=1735948800000&language=1&channelIds=561066'
)
})
it('can parse response', () => {
const content = `
{
"channelEpgs": [
{
"epgPlayables": [
{ "name": "Πρώτη Ενημέρωση", "startTime": 1735879500000, "endTime": 1735889400000 }
]
}
]
}`
const result = parser({ content }).map(p => {
p.start = p.start
p.stop = p.stop
return p
})
expect(result).toMatchObject([
{
title: 'Πρώτη Ενημέρωση',
start: '2025-01-03T04:45:00.000Z',
stop: '2025-01-03T07:30:00.000Z'
}
])
})
it('can handle empty guide', () => {
const result = parser({
content: '{"channelEpgs":[]}'
})
expect(result).toMatchObject([])
})

View file

@ -0,0 +1,21 @@
# cyta.com.cy
https://epg.cyta.com.cy/tv-guide/el
### Download the guide
```sh
npm run grab --- --site=cyta.com.cy
```
### Update channel list
```sh
npm run channels:parse --- --config=./sites/cyta.com.cy/cyta.com.cy.config.js --output=./sites/cyta.com.cy/cyta.com.cy.channels.xml
```
### Test
```sh
npm test --- cyta.com.cy
```

21
sites/stod2.is/readme.md Normal file
View file

@ -0,0 +1,21 @@
# stod2.is
https://stod2.is/dagskra/
### Download the guide
```sh
npm run grab --- --site=stod2.is
```
### Update channel list
```sh
npm run channels:parse --- --config=./sites/stod2.is/stod2.is.config.js --output=./sites/stod2.is/stod2.is.channels.xml
```
### Test
```sh
npm test --- stod2.is
```

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="stod2.is" lang="is" xmltv_id="Stod2.is" site_id="stod2">Stöð 2</channel>
<channel site="stod2.is" lang="is" xmltv_id="Stod2Fjolskylda.is" site_id="stod3">Stöð 2 Fjölskylda</channel>
<channel site="stod2.is" lang="is" xmltv_id="Stod2Sport.is" site_id="sport">Stöð 2 Sport</channel>
<channel site="stod2.is" lang="is" xmltv_id="Stod2Sport2.is" site_id="sport2">Stöð 2 Sport 2</channel>
<channel site="stod2.is" lang="is" xmltv_id="Stod2Sport3.is" site_id="sport3">Stöð 2 Sport 3</channel>
<channel site="stod2.is" lang="is" xmltv_id="Stod2Sport4.is" site_id="sport4">Stöð 2 Sport 4</channel>
<channel site="stod2.is" lang="is" xmltv_id="Stod2Sport5.is" site_id="golfstodin">Stöð 2 Sport 5</channel>
<channel site="stod2.is" lang="is" xmltv_id="Stod2Sport6.is" site_id="sport6">Stöð 2 Sport 6</channel>
<channel site="stod2.is" lang="is" xmltv_id="" site_id="besta01">Besta01</channel>
<channel site="stod2.is" lang="is" xmltv_id="" site_id="besta02">Besta02</channel>
<channel site="stod2.is" lang="is" xmltv_id="" site_id="besta03">Besta03</channel>
<channel site="stod2.is" lang="is" xmltv_id="VodafoneSport.is" site_id="vodasport">Vodafone Sport</channel>
</channels>

View file

@ -0,0 +1,68 @@
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const axios = require('axios')
dayjs.extend(utc)
module.exports = {
site: 'stod2.is',
channels: 'stod2.is.channels.xml',
days: 7,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url({ channel, date }) {
return `https://api.stod2.is/dagskra/api/${channel.site_id}/${date.format('YYYY-MM-DD')}`
},
parser: function ({ content }) {
let data
try {
data = JSON.parse(content)
} catch (error) {
console.error('Error parsing JSON:', error)
return []
}
const programs = []
if (data && Array.isArray(data)) {
data.forEach(item => {
if (!item) return
const start = dayjs.utc(item.upphaf)
const stop = start.add(item.slott, 'm')
programs.push({
title: item.isltitill,
sub_title: item.undirtitill,
description: item.lysing,
actors: item.adalhlutverk,
directors: item.leikstjori,
start,
stop
})
})
}
return programs
},
async channels() {
try {
const response = await axios.get('https://api.stod2.is/dagskra/api')
if (!response.data || !Array.isArray(response.data)) {
console.error('Error: No channels data found')
return []
}
return response.data.map(item => {
return {
lang: 'is',
site_id: item
}
})
} catch (error) {
console.error('Error fetching channels:', error)
return []
}
}
}

View file

@ -0,0 +1,83 @@
const { parser, url } = require('./stod2.is.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
const timezone = require('dayjs/plugin/timezone')
const axios = require('axios')
dayjs.extend(utc)
dayjs.extend(customParseFormat)
dayjs.extend(timezone)
jest.mock('axios')
const date = dayjs.utc('2025-01-03', 'YYYY-MM-DD').startOf('day')
const channel = { site_id: 'stod2', xmltv_id: 'Stod2.is' }
const mockEpgData = JSON.stringify([
{
midill: 'STOD2',
midill_heiti: 'Stöð 2',
dagsetning: '2025-01-03T00:00:00Z',
upphaf: '2025-01-03T08:00:00Z',
titill: 'Telma Borgþórsdóttir',
isltitill: 'Heimsókn',
undirtitill: 'Telma Borgþórsdóttir',
seria: 8,
thattur: 5,
thattafjoldi: 10,
birta_thatt: 1,
opin: 0,
beint: 0,
frumsyning: 0,
framundan_i_beinni: 0,
tegund: 'SER',
flokkur: 'Icelandic',
adalhlutverk: '',
leikstjori: '',
ar: '2019',
bannad: 'Green',
recidefni: 592645105,
recidlidur: 592645184,
recidsyning: null,
refno: null,
frelsi: 0,
netdagar: 0,
lysing:
'Frábærir þættir með Sindra Sindrasyni sem lítur inn hjá íslenskum fagurkerum. Heimilin eru jafn ólík og þau eru mörg en eiga það þó eitt sameiginlegt að vera sett saman af alúð og smekklegheitum. Sindri hefur líka einstakt lag á að ná fram því besta í viðmælendum sínum.',
slott: 15,
slotlengd: '00:15'
}
])
it('can generate valid url', () => {
const generatedUrl = url({ date, channel })
expect(generatedUrl).toBe('https://api.stod2.is/dagskra/api/stod2/2025-01-03')
})
it('can parse response', () => {
const content = mockEpgData
const result = parser({ content }).map(p => {
p.start = p.start.toISOString()
p.stop = p.stop.toISOString()
return p
})
expect(result).toMatchObject([
{
title: 'Heimsókn',
sub_title: 'Telma Borgþórsdóttir',
description:
'Frábærir þættir með Sindra Sindrasyni sem lítur inn hjá íslenskum fagurkerum. Heimilin eru jafn ólík og þau eru mörg en eiga það þó eitt sameiginlegt að vera sett saman af alúð og smekklegheitum. Sindri hefur líka einstakt lag á að ná fram því besta í viðmælendum sínum.',
actors: '',
directors: '',
start: '2025-01-03T08:00:00.000Z',
stop: '2025-01-03T08:15:00.000Z'
}
])
})
it('can handle empty guide', () => {
const result = parser({ content: '[]' })
expect(result).toMatchObject([])
})