Merge branch 'master' into patch-2025.01.3

This commit is contained in:
freearhey 2025-01-16 16:11:41 +03:00
commit a66a06b4ea
11 changed files with 3257 additions and 3 deletions

View file

@ -30,7 +30,6 @@
<tr><td><a href="sites/chada.ma">chada.ma</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/chaines-tv.orange.fr">chaines-tv.orange.fr</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/clickthecity.com">clickthecity.com</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/comteco.com.bo">comteco.com.bo</a></td><td>🔴</td><td>https://github.com/iptv-org/epg/issues/2239</td></tr>
<tr><td><a href="sites/content.astro.com.my">content.astro.com.my</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/cosmotetv.gr">cosmotetv.gr</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/cubmu.com">cubmu.com</a></td><td>🟢</td><td></td></tr>
@ -41,6 +40,7 @@
<tr><td><a href="sites/directv.com.ar">directv.com.ar</a></td><td>🔴</td><td>https://github.com/iptv-org/epg/issues/2339</td></tr>
<tr><td><a href="sites/directv.com.uy">directv.com.uy</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/dishtv.in">dishtv.in</a></td><td>🔴</td><td>https://github.com/iptv-org/epg/issues/2445</td></tr>
<tr><td><a href="sites/dna.fi">dna.fi</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/dsmart.com.tr">dsmart.com.tr</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/dstv.com">dstv.com</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/elcinema.com">elcinema.com</a></td><td>🟢</td><td></td></tr>
@ -59,7 +59,6 @@
<tr><td><a href="sites/gigatv.3bbtv.co.th">gigatv.3bbtv.co.th</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/guida.tv">guida.tv</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/guidatv.sky.it">guidatv.sky.it</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/hd-plus.de">hd-plus.de</a></td><td>🔴</td><td>https://github.com/iptv-org/epg/issues/2173</td></tr>
<tr><td><a href="sites/horizon.tv">horizon.tv</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/hoy.tv">hoy.tv</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/i.mjh.nz">i.mjh.nz</a></td><td>🟢</td><td></td></tr>
@ -124,7 +123,6 @@
<tr><td><a href="sites/programtv.onet.pl">programtv.onet.pl</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/raiplay.it">raiplay.it</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/reportv.com.ar">reportv.com.ar</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/rev.bs">rev.bs</a></td><td>🔴</td><td>https://github.com/iptv-org/epg/issues/2255</td></tr>
<tr><td><a href="sites/rotana.net">rotana.net</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/rtb.gov.bn">rtb.gov.bn</a></td><td>🔴</td><td>https://github.com/iptv-org/epg/issues/2257</td></tr>
<tr><td><a href="sites/rthk.hk">rthk.hk</a></td><td>🟢</td><td></td></tr>
@ -151,6 +149,7 @@
<tr><td><a href="sites/superguidatv.it">superguidatv.it</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/taiwanplus.com">taiwanplus.com</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tapdmv.com">tapdmv.com</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/telebilbao.es">telebilbao.es</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/telenet.tv">telenet.tv</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/teliatv.ee">teliatv.ee</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/telkussa.fi">telkussa.fi</a></td><td>🟢</td><td></td></tr>
@ -160,6 +159,7 @@
<tr><td><a href="sites/toonamiaftermath.com">toonamiaftermath.com</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/turksatkablo.com.tr">turksatkablo.com.tr</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tv-programme.telecablesat.fr">tv-programme.telecablesat.fr</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tv-spored.siol.net">tv-spored.siol.net</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tv.blue.ch">tv.blue.ch</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tv.cctv.com">tv.cctv.com</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tv.dir.bg">tv.dir.bg</a></td><td>🟢</td><td></td></tr>
@ -189,6 +189,7 @@
<tr><td><a href="sites/tvireland.ie">tvireland.ie</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvmi.mt">tvmi.mt</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvmusor.hu">tvmusor.hu</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvmustra.hu">tvmustra.hu</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvpassport.com">tvpassport.com</a></td><td>🟡</td><td>https://github.com/iptv-org/epg/issues/2272</td></tr>
<tr><td><a href="sites/tvplus.com.tr">tvplus.com.tr</a></td><td>🟢</td><td></td></tr>
<tr><td><a href="sites/tvprofil.com">tvprofil.com</a></td><td>🟡</td><td>https://github.com/iptv-org/epg/issues/2399</td></tr>

View file

@ -89,6 +89,7 @@
"node-cleanup": "^2.1.2",
"node-gzip": "^1.1.2",
"numeral": "^2.0.6",
"pako": "^2.1.0",
"parse-duration": "^1.0.0",
"pdf-parse": "^1.1.1",
"run-script-os": "^1.1.6",

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,64 @@
const axios = require('axios')
const iconv = require('iconv-lite')
const parser = require('epg-parser')
const { ungzip } = require('pako')
let cachedContent
module.exports = {
site: 'epg.iptvx.one',
days: 2,
url: 'https://iptvx.one/epg/epg_noarch.xml.gz',
request: {
maxContentLength: 500000000, // 500 MB
cache: {
ttl: 24 * 60 * 60 * 1000 // 1 day
}
},
parser: function ({ buffer, channel, date, cached }) {
if (!cached) cachedContent = undefined
let programs = []
const items = parseItems(buffer, channel, date)
items.forEach(item => {
programs.push({
title: item.title?.[0]?.value,
description: item.desc?.[0]?.value,
start: item.start,
stop: item.stop
})
})
return programs
},
async channels() {
const data = await axios
.get('https://epg.iptvx.one/api/channels.json')
.then(r => r.data)
.catch(console.log)
return data.channels.map(channel => {
const [name] = channel.chan_names.split(' • ')
return {
lang: 'ru',
site_id: channel.chan_id,
name
}
})
}
}
function parseItems(buffer, channel, date) {
if (!buffer) return []
if (!cachedContent) {
const content = ungzip(buffer)
const encoded = iconv.decode(content, 'utf8')
cachedContent = parser.parse(encoded)
}
const { programs } = cachedContent
return programs.filter(p => p.channel === channel.site_id && date.isSame(p.start, 'day'))
}

View file

@ -0,0 +1,46 @@
const { parser, url } = require('./epg.iptvx.one.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const fs = require('fs')
const path = require('path')
dayjs.extend(utc)
dayjs.extend(timezone)
const date = dayjs.utc('2025-01-13', 'YYYY-MM-DD').startOf('d')
const channel = { site_id: '12-omsk', xmltv_id: 'Channel12.ru' }
it('can generate valid url', () => {
expect(url).toBe('https://iptvx.one/epg/epg_noarch.xml.gz')
})
it('can parse response', () => {
const buffer = fs.readFileSync(path.resolve(__dirname, '__data__/content.xml.gz'))
const results = parser({ date, buffer, channel })
expect(results.length).toBe(29)
expect(results[0]).toMatchObject({
start: '2025-01-13T00:00:00.000Z',
stop: '2025-01-13T00:55:00.000Z',
title: 'Акценты недели',
description:
'Программа расскажет зрителям о том, как развивались самые яркие события недели, поможет расставить акценты над самыми обсуждаемыми новостями. Россия, ток-шоу'
})
expect(results[28]).toMatchObject({
start: '2025-01-13T22:15:00.000Z',
stop: '2025-01-14T00:00:00.000Z',
title: 'д/с Необыкновенные люди',
description:
'Герои цикла врачи, спортсмены, представители творческих профессий, волонтеры и многие-многие другие. Их деятельность связана с жизнью особенных людей. Россия, док. сериал'
})
})
it('can handle empty guide', () => {
const result = parser({
date,
channel,
buffer: ''
})
expect(result).toMatchObject([])
})

View file

@ -0,0 +1,35 @@
# epg.iptvx.one
https://epg.iptvx.one/
### Download the guide
Windows (Command Prompt):
```sh
SET "NODE_OPTIONS=--max-old-space-size=5000" && npm run grab --- --site=epg.iptvx.one
```
Windows (PowerShell):
```sh
$env:NODE_OPTIONS="--max-old-space-size=5000"; npm run grab --- --site=epg.iptvx.one
```
Linux and macOS:
```sh
NODE_OPTIONS=--max-old-space-size=5000 npm run grab --- --site=epg.iptvx.one
```
### Update channel list
```sh
npm run channels:parse --- --config=./sites/epg.iptvx.one/epg.iptvx.one.config.js --output=./sites/epg.iptvx.one/epg.iptvx.one.channels.xml
```
### Test
```sh
npm test --- epg.iptvx.one
```

21
sites/rikstv.no/readme.md Normal file
View file

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

View file

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="12">BBC News</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="21">Discovery</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="22">TLC</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="23">Disney Channel</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="26">Eurosport 1</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="27">FEM</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="29">Frikanalen</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="43">REX</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="45">National Geographic</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="46">NRK Super/3</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="47">NRK1</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="48">NRK1 Tegnspråk</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="49">NRK2</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="55">SVT1</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="58">TV 2 Livsstil</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="60">TV 2 Direkte</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="61">TV 2 Nyheter</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="68">TV 2 Zebra</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="69">TV3</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="70">TVNorge</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="71">TV3+</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="72">Visjon Norge</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="73">VOX</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="74">Animal Planet</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="75">BBC Nordic</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="76">TV6</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="77">History Channel</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="121">Eurosport Norge</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="142">Nick Jr.</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="143">Nickelodeon</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="201">TV 2 Danmark</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="202">DR2</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="203">DR1</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="204">SVT2</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="205">TV4</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="241">CNN</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="281">Discovery Science</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="282">Investigation Discovery</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="283">Norway Live</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="361">V Sport +</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="362">V Sport 1</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="363">V Sport 2</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="364">V Sport 3</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="441">Hits</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="461">Stars</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="462">SF-kanalen</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="481">TV 2 Sport 1</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="501">TV 2 Sport 2</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="522">Sky News</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="524">CNBC</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="525">Deutsche Welle</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="526">France 24</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="561">NRK1 Sørlandet</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="562">NRK1 Nordland</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="563">NRK1 Midtnytt</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="564">NRK1 Vestfold og Telemark</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="565">NRK1 Vestlandsrevyen</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="567">NRK1 Nordnytt</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="581">NRK1 Innlandet</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="601">MTV00s</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="602">TV Nord</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="619">Travel Channel</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="620">Food Network</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="621">Euronews</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="622">Auto Motor og Sport TV</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="628">Rikstoto Direkte</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="629">TV Øst</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="630">NRK1 Rogaland</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="631">NRK1 Møre og Romsdal</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="632">NRK1 Lydtekst</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="633">NRK2 Lydtekst</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="634">NRK3 Super Lydtekst</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="635">Heim TV</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="642">V sport golf</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="643">NRK1 Underteksting</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="644">NRK2 Underteksting</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="650">Naturkanal1</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="651">V Film Action</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="652">V Film Premiere</channel>
<channel site="rikstv.no" lang="no" xmltv_id="" site_id="653">V Series</channel>
</channels>

View file

@ -0,0 +1,72 @@
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const axios = require('axios')
dayjs.extend(utc)
module.exports = {
site: 'rikstv.no',
days: 3,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url({ channel, date }) {
return `https://play.rikstv.no/api/content-search/1/channel/${channel.site_id}/epg/${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.broadcastedTime)
//const stop = dayjs.utc(item.broadcastedTimeEnd)
programs.push({
title: item.seriesName,
sub_title: item.name,
description: item.description || item.synopsis,
season: item.season || null,
episode: item.episode || null,
category: item.genres,
actors: item.actors,
directors: item.director || item.directors,
icon: item.imagePackUri,
start: item.broadcastedTime,
stop: item.broadcastedTimeEnd
})
})
}
return programs
},
async channels() {
try {
const response = await axios.get('https://play.rikstv.no/api/content-search/1/channel?includePrograms=false')
if (!response.data || !Array.isArray(response.data)) {
console.error('Error: No channels data found')
return []
}
return response.data.map(item => {
return {
lang: 'no',
site_id: item.channelId,
name: item.serviceName
}
})
} catch (error) {
console.error('Error fetching channels:', error)
return []
}
}
}

View file

@ -0,0 +1,66 @@
const { parser, url } = require('./rikstv.no.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('2025-01-14', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '47',
xmltv_id: 'NRK1.no'
}
describe('rikstv.no Module Tests', () => {
it('can generate valid url', () => {
expect(url({ date, channel })).toBe(`https://play.rikstv.no/api/content-search/1/channel/${channel.site_id}/epg/${date.format('YYYY-MM-DD')}`)
})
it('can parse response', () => {
const content = JSON.stringify([
{
seriesName: 'Vakre og ville Oman',
name: 'Vakre og ville Oman',
description: 'Oman er eit arabisk skattkammer av unike habitat og variert dyreliv. Rev, kvalhai, reptil og skjelpadder er blant skapningane du finn her.',
season: 1,
episode: 1,
genres: ['Dokumentar', 'Fakta', 'Natur'],
actors: ['Gergana Muskalla'],
director: 'Stefania Muller',
imagePackUri: 'https://imageservice.rikstv.no/hash/EC206C374F42287C0BDF850A7D3CB4D3.jpg',
broadcastedTime: '2025-01-13T23:00:00Z',
broadcastedTimeEnd: '2025-01-13T23:55:00Z'
}
])
const result = parser({ content }).map(p => {
p.start = dayjs(p.start).toISOString()
p.stop = dayjs(p.stop).toISOString()
return p
})
expect(result).toMatchObject([
{
title: 'Vakre og ville Oman',
sub_title: 'Vakre og ville Oman',
description: 'Oman er eit arabisk skattkammer av unike habitat og variert dyreliv. Rev, kvalhai, reptil og skjelpadder er blant skapningane du finn her.',
season: 1,
episode: 1,
category: ['Dokumentar', 'Fakta', 'Natur'],
actors: ['Gergana Muskalla'],
directors: 'Stefania Muller',
icon: 'https://imageservice.rikstv.no/hash/EC206C374F42287C0BDF850A7D3CB4D3.jpg',
start: '2025-01-13T23:00:00.000Z',
stop: '2025-01-13T23:55:00.000Z'
}
])
})
it('can handle empty guide', () => {
const result = parser({
content: '[]'
})
expect(result).toMatchObject([])
})
})