Initial Commit

This commit is contained in:
2023-09-10 21:48:48 +02:00
commit 227cca7d31
791 changed files with 165200 additions and 0 deletions

122
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,122 @@
# Contributing Guide
### How do I add a program guide for the channel?
First, open the [/sites](/sites) folder and select the source that you know has the guide for the channel you want.
Then in the selected folder open the file `*.channels.xml` and add to it:
```xml
<channel lang="LANGUAGE_CODE" xmltv_id="CHANNEL_ID" site_id="SITE_ID">CHANNEL_NAME</channel>
```
| Attribute | Description | Example |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- |
| LANGUAGE_CODE | Language of the guide ([ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) code). | `en` |
| CHANNEL_ID | Channel ID from [iptv-org/database](https://github.com/iptv-org/database). A complete list of supported channels can also be found at https://iptv-org.github.io/. | `BBCOne.uk` |
| SITE_ID | Unique ID of the channel used in the source. | `bbc1` |
| CHANNEL_NAME | Name of the channel used in the source. | `BBC 1` |
After that just commit all changes and send a pull request.
### How to add a new source to the repository?
To do this, you must create a new folder in the [/sites](/sites) with at least 3 files:
<details>
<summary>example.com.config.js</summary>
<br>
This file describes what kind of request we need to send to get the guide for a particular channel on a certain date. It also describes how to parse the response.
```js
module.exports = {
site: 'example.com',
url: function ({ channel, date }) {
return `https://example.com/api/${channel.site_id}/${date.format('YYYY-MM-DD')}`
},
parser: function ({ content }) {
return JSON.parse(content)
}
}
```
More detailed instructions for this file can be found here: https://github.com/freearhey/epg-grabber#site-config
</details>
<details>
<summary>example.com.test.js</summary>
<br>
With this file we can test the previously created config and make sure it works as you expect.
```js
const { url, parser } = require('./example.com.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
const date = dayjs.utc('2022-11-18', 'YYYY-MM-DD').startOf('d')
const channel = { site_id: 'bbc1', xmltv_id: 'BBCOne.uk', lang: 'en' }
it('can generate valid url', () => {
expect(url({ channel, date })).toBe('https://example.com/api/bbc1/2022-11-18')
})
it('can parse response', () => {
const content = `[{"start":"2022-11-18T01:30:00.000Z","stop":"2022-11-18T02:00:00.000Z","title":"Program 1"}]`
const results = parser({ content })
expect(results).toMatchObject([
{
start: '2022-11-18T01:30:00.000Z',
stop: '2022-11-18T02:00:00.000Z',
title: 'Program 1'
}
])
})
it('can handle empty guide', () => {
const results = parser({ content: '' })
expect(results).toMatchObject([])
})
```
To run the tests you can use the following command:
```sh
npm test -- example.com
```
Detailed documentation for the tests can be found here: https://jestjs.io/docs/using-matchers
</details>
<details>
<summary>example.com.channels.xml</summary>
<br>
This file contains a list of channels available at the source.
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<site site="example.com">
<channels>
<channel lang="en" xmltv_id="BBCOne.uk" site_id="bbc1">BBC 1</channel>
</channels>
</site>
```
</details>
After creating all the files we can make sure that the guide loads correctly and has no errors using the command:
```sh
npx epg-grabber --config=sites/example.com/example.com.config.js --channels=sites/example.com/example.com.channels.xml --output=guide.xml --days=2
```
If the download is successful, the `guide.xml` file with the ready to use program should appear in the root directory.
After that, all that remains is to commit all the changes and send a pull request.

24
LICENSE Normal file
View File

@@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>

986
README.md Normal file
View File

@@ -0,0 +1,986 @@
# EPG
[![_update](https://github.com/iptv-org/epg/actions/workflows/_update.yml/badge.svg)](https://github.com/iptv-org/epg/actions/workflows/_update.yml)
EPG (Electronic Program Guide) for thousands of TV channels collected from different sources.
## Table of contents
- 🚀 [How to use?](#how-to-use)
- 🗓 [Guides](#guides)
- 📺 [Playlists](#playlists)
- 🗄 [Database](#database)
- 👨‍💻 [API](#api)
- 📚 [Resources](#resources)
- 💬 [Discussions](#discussions)
- 🛠 [Contribution](#contribution)
- © [License](#license)
## How to use?
To load a program guide, all you need to do is copy the link to one or more of the guides from the list below and paste it into your favorite player.
You can also find the link to the guide by the name of the channel via https://iptv-org.github.io.
## Guides
<details>
<summary>Expand</summary>
<!-- prettier-ignore -->
### Albanian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>17</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sq/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvim.tv">tvim.tv</a></td><td align="right" nowrap>51</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sq/tvim.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvim.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvim.tv.yml/badge.svg" alt="tvim.tv" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Arabic
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://artonline.tv">artonline.tv</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ar/artonline.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/artonline.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/artonline.tv.yml/badge.svg" alt="artonline.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://bein.com">bein.com</a></td><td align="right" nowrap>76</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ar/bein.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/bein.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/bein.com.yml/badge.svg" alt="bein.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://beinsports.com">beinsports.com</a></td><td align="right" nowrap>25</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ar/beinsports.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/beinsports.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/beinsports.com.yml/badge.svg" alt="beinsports.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://i24news.tv">i24news.tv</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ar/i24news.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/i24news.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/i24news.tv.yml/badge.svg" alt="i24news.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ar/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Armenian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.mail.ru">tv.mail.ru</a></td><td align="right" nowrap>15</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hy/tv.mail.ru.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml/badge.svg" alt="tv.mail.ru" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Azerbaijani
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.mail.ru">tv.mail.ru</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/az/tv.mail.ru.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml/badge.svg" alt="tv.mail.ru" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Belarusian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.mail.ru">tv.mail.ru</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/be/tv.mail.ru.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml/badge.svg" alt="tv.mail.ru" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Bengali
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://sky.com">sky.com</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bn/sky.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml/badge.svg" alt="sky.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvpassport.com">tvpassport.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bn/tvpassport.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml/badge.svg" alt="tvpassport.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Bosnian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bs/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bs/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mtel.ba">mtel.ba</a></td><td align="right" nowrap>134</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bs/mtel.ba.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mtel.ba.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mtel.ba.yml/badge.svg" alt="mtel.ba" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bs/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Bulgarian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.dir.bg">tv.dir.bg</a></td><td align="right" nowrap>94</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bg/tv.dir.bg.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.dir.bg.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.dir.bg.yml/badge.svg" alt="tv.dir.bg" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvprofil.com">tvprofil.com</a></td><td align="right" nowrap>67</td><td nowrap><code>https://iptv-org.github.io/epg/guides/bg/tvprofil.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvprofil.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvprofil.com.yml/badge.svg" alt="tvprofil.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Burmese
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://unifi.com.my">unifi.com.my</a></td><td align="right" nowrap>18</td><td nowrap><code>https://iptv-org.github.io/epg/guides/my/unifi.com.my.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/unifi.com.my.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/unifi.com.my.yml/badge.svg" alt="unifi.com.my" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Catalan
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://andorradifusio.ad">andorradifusio.ad</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ca/andorradifusio.ad.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/andorradifusio.ad.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/andorradifusio.ad.yml/badge.svg" alt="andorradifusio.ad" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Chinese
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://epg.i-cable.com">epg.i-cable.com</a></td><td align="right" nowrap>66</td><td nowrap><code>https://iptv-org.github.io/epg/guides/zh/epg.i-cable.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml/badge.svg" alt="epg.i-cable.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mytvsuper.com">mytvsuper.com</a></td><td align="right" nowrap>47</td><td nowrap><code>https://iptv-org.github.io/epg/guides/zh/mytvsuper.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mytvsuper.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mytvsuper.com.yml/badge.svg" alt="mytvsuper.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://nowplayer.now.com">nowplayer.now.com</a></td><td align="right" nowrap>115</td><td nowrap><code>https://iptv-org.github.io/epg/guides/zh/nowplayer.now.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml/badge.svg" alt="nowplayer.now.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://rthk.hk">rthk.hk</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/zh/rthk.hk.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/rthk.hk.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/rthk.hk.yml/badge.svg" alt="rthk.hk" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://singtel.com">singtel.com</a></td><td align="right" nowrap>22</td><td nowrap><code>https://iptv-org.github.io/epg/guides/zh/singtel.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml/badge.svg" alt="singtel.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.cctv.com">tv.cctv.com</a></td><td align="right" nowrap>94</td><td nowrap><code>https://iptv-org.github.io/epg/guides/zh/tv.cctv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.cctv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.cctv.com.yml/badge.svg" alt="tv.cctv.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Croatian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://ipko.com">ipko.com</a></td><td align="right" nowrap>34</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hr/ipko.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ipko.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ipko.com.yml/badge.svg" alt="ipko.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hr/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hr/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://maxtv.hrvatskitelekom.hr">maxtv.hrvatskitelekom.hr</a></td><td align="right" nowrap>118</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hr/maxtv.hrvatskitelekom.hr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml/badge.svg" alt="maxtv.hrvatskitelekom.hr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hr/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvprofil.com">tvprofil.com</a></td><td align="right" nowrap>493</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hr/tvprofil.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvprofil.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvprofil.com.yml/badge.svg" alt="tvprofil.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Czech
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>370</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cs/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mujtvprogram.cz">mujtvprogram.cz</a></td><td align="right" nowrap>146</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cs/mujtvprogram.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml/badge.svg" alt="mujtvprogram.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/cs/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Danish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://allente.se">allente.se</a></td><td align="right" nowrap>57</td><td nowrap><code>https://iptv-org.github.io/epg/guides/da/allente.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Dutch
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://delta.nl">delta.nl</a></td><td align="right" nowrap>198</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/delta.nl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/delta.nl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/delta.nl.yml/badge.svg" alt="delta.nl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://melita.com">melita.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/melita.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml/badge.svg" alt="melita.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programtv.onet.pl">programtv.onet.pl</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/programtv.onet.pl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml/badge.svg" alt="programtv.onet.pl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telecablesat.fr">telecablesat.fr</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/telecablesat.fr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml/badge.svg" alt="telecablesat.fr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telenet.tv">telenet.tv</a></td><td align="right" nowrap>55</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/telenet.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml/badge.svg" alt="telenet.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvgids.nl">tvgids.nl</a></td><td align="right" nowrap>106</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/tvgids.nl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvgids.nl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvgids.nl.yml/badge.svg" alt="tvgids.nl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://vtm.be">vtm.be</a></td><td align="right" nowrap>7</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/vtm.be.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/vtm.be.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/vtm.be.yml/badge.svg" alt="vtm.be" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ziggogo.tv">ziggogo.tv</a></td><td align="right" nowrap>103</td><td nowrap><code>https://iptv-org.github.io/epg/guides/nl/ziggogo.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml/badge.svg" alt="ziggogo.tv" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### English
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://abc.net.au">abc.net.au</a></td><td align="right" nowrap>27</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/abc.net.au.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/abc.net.au.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/abc.net.au.yml/badge.svg" alt="abc.net.au" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://allente.se">allente.se</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/allente.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://arianaafgtv.com">arianaafgtv.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/arianaafgtv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/arianaafgtv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/arianaafgtv.com.yml/badge.svg" alt="arianaafgtv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://arianatelevision.com">arianatelevision.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/arianatelevision.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/arianatelevision.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/arianatelevision.com.yml/badge.svg" alt="arianatelevision.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://bein.com">bein.com</a></td><td align="right" nowrap>77</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/bein.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/bein.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/bein.com.yml/badge.svg" alt="bein.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://beinsports.com">beinsports.com</a></td><td align="right" nowrap>38</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/beinsports.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/beinsports.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/beinsports.com.yml/badge.svg" alt="beinsports.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://bt.com">bt.com</a></td><td align="right" nowrap>163</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/bt.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/bt.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/bt.com.yml/badge.svg" alt="bt.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://canalplus.com">canalplus.com</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/canalplus.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus.com.yml/badge.svg" alt="canalplus.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://cgates.lt">cgates.lt</a></td><td align="right" nowrap>38</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/cgates.lt.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/cgates.lt.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/cgates.lt.yml/badge.svg" alt="cgates.lt" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://delta.nl">delta.nl</a></td><td align="right" nowrap>19</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/delta.nl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/delta.nl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/delta.nl.yml/badge.svg" alt="delta.nl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://digiturk.com.tr">digiturk.com.tr</a></td><td align="right" nowrap>11</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/digiturk.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/digiturk.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/digiturk.com.tr.yml/badge.svg" alt="digiturk.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://directv.com">directv.com</a></td><td align="right" nowrap>432</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/directv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/directv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/directv.com.yml/badge.svg" alt="directv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://dishtv.in">dishtv.in</a></td><td align="right" nowrap>359</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/dishtv.in.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/dishtv.in.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dishtv.in.yml/badge.svg" alt="dishtv.in" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://dsmart.com.tr">dsmart.com.tr</a></td><td align="right" nowrap>7</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/dsmart.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/dsmart.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dsmart.com.tr.yml/badge.svg" alt="dsmart.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://dstv.com">dstv.com</a></td><td align="right" nowrap>206</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/dstv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://epg.i-cable.com">epg.i-cable.com</a></td><td align="right" nowrap>94</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/epg.i-cable.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml/badge.svg" alt="epg.i-cable.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://flixed.io">flixed.io</a></td><td align="right" nowrap>315</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/flixed.io.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/flixed.io.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/flixed.io.yml/badge.svg" alt="flixed.io" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://foxsports.com.au">foxsports.com.au</a></td><td align="right" nowrap>8</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/foxsports.com.au.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/foxsports.com.au.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/foxsports.com.au.yml/badge.svg" alt="foxsports.com.au" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://getafteritmedia.com">getafteritmedia.com</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/getafteritmedia.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/getafteritmedia.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/getafteritmedia.com.yml/badge.svg" alt="getafteritmedia.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://horizon.tv">horizon.tv</a></td><td align="right" nowrap>26</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/horizon.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml/badge.svg" alt="horizon.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://i.mjh.nz">i.mjh.nz</a></td><td align="right" nowrap>677</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/i.mjh.nz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/i.mjh.nz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/i.mjh.nz.yml/badge.svg" alt="i.mjh.nz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://i24news.tv">i24news.tv</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/i24news.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/i24news.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/i24news.tv.yml/badge.svg" alt="i24news.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ionplustv.com">ionplustv.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/ionplustv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ionplustv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ionplustv.com.yml/badge.svg" alt="ionplustv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>110</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>16</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magticom.ge">magticom.ge</a></td><td align="right" nowrap>10</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/magticom.ge.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magticom.ge.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magticom.ge.yml/badge.svg" alt="magticom.ge" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://maxtv.hrvatskitelekom.hr">maxtv.hrvatskitelekom.hr</a></td><td align="right" nowrap>24</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/maxtv.hrvatskitelekom.hr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml/badge.svg" alt="maxtv.hrvatskitelekom.hr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://melita.com">melita.com</a></td><td align="right" nowrap>82</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/melita.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml/badge.svg" alt="melita.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://meo.pt">meo.pt</a></td><td align="right" nowrap>9</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/meo.pt.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/meo.pt.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/meo.pt.yml/badge.svg" alt="meo.pt" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mewatch.sg">mewatch.sg</a></td><td align="right" nowrap>17</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/mewatch.sg.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mewatch.sg.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mewatch.sg.yml/badge.svg" alt="mewatch.sg" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mncvision.id">mncvision.id</a></td><td align="right" nowrap>97</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/mncvision.id.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml/badge.svg" alt="mncvision.id" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mtel.ba">mtel.ba</a></td><td align="right" nowrap>32</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/mtel.ba.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mtel.ba.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mtel.ba.yml/badge.svg" alt="mtel.ba" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mujtvprogram.cz">mujtvprogram.cz</a></td><td align="right" nowrap>45</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/mujtvprogram.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml/badge.svg" alt="mujtvprogram.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://musor.tv">musor.tv</a></td><td align="right" nowrap>18</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/musor.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/musor.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/musor.tv.yml/badge.svg" alt="musor.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://myafn.dodmedia.osd.mil">myafn.dodmedia.osd.mil</a></td><td align="right" nowrap>8</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/myafn.dodmedia.osd.mil.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/myafn.dodmedia.osd.mil.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/myafn.dodmedia.osd.mil.yml/badge.svg" alt="myafn.dodmedia.osd.mil" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mysky.com.ph">mysky.com.ph</a></td><td align="right" nowrap>46</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/mysky.com.ph.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mysky.com.ph.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mysky.com.ph.yml/badge.svg" alt="mysky.com.ph" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mytvsuper.com">mytvsuper.com</a></td><td align="right" nowrap>57</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/mytvsuper.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mytvsuper.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mytvsuper.com.yml/badge.svg" alt="mytvsuper.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://nowplayer.now.com">nowplayer.now.com</a></td><td align="right" nowrap>127</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/nowplayer.now.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml/badge.svg" alt="nowplayer.now.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ontvtonight.com">ontvtonight.com</a></td><td align="right" nowrap>180</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/ontvtonight.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ontvtonight.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ontvtonight.com.yml/badge.svg" alt="ontvtonight.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://pbsguam.org">pbsguam.org</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/pbsguam.org.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/pbsguam.org.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/pbsguam.org.yml/badge.svg" alt="pbsguam.org" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://plex.tv">plex.tv</a></td><td align="right" nowrap>314</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/plex.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/plex.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/plex.tv.yml/badge.svg" alt="plex.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programtv.onet.pl">programtv.onet.pl</a></td><td align="right" nowrap>42</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/programtv.onet.pl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml/badge.svg" alt="programtv.onet.pl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://rev.bs">rev.bs</a></td><td align="right" nowrap>179</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/rev.bs.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/rev.bs.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/rev.bs.yml/badge.svg" alt="rev.bs" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://rthk.hk">rthk.hk</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/rthk.hk.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/rthk.hk.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/rthk.hk.yml/badge.svg" alt="rthk.hk" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://singtel.com">singtel.com</a></td><td align="right" nowrap>96</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/singtel.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml/badge.svg" alt="singtel.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://sky.co.nz">sky.co.nz</a></td><td align="right" nowrap>93</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/sky.co.nz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/sky.co.nz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sky.co.nz.yml/badge.svg" alt="sky.co.nz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://sky.com">sky.com</a></td><td align="right" nowrap>325</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/sky.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml/badge.svg" alt="sky.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://sportsnet.ca">sportsnet.ca</a></td><td align="right" nowrap>8</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/sportsnet.ca.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/sportsnet.ca.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sportsnet.ca.yml/badge.svg" alt="sportsnet.ca" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://starhubtvplus.com">starhubtvplus.com</a></td><td align="right" nowrap>128</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/starhubtvplus.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/starhubtvplus.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/starhubtvplus.com.yml/badge.svg" alt="starhubtvplus.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://startimestv.com">startimestv.com</a></td><td align="right" nowrap>338</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/startimestv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/startimestv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/startimestv.com.yml/badge.svg" alt="startimestv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://superguidatv.it">superguidatv.it</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/superguidatv.it.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/superguidatv.it.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/superguidatv.it.yml/badge.svg" alt="superguidatv.it" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tapdmv.com">tapdmv.com</a></td><td align="right" nowrap>15</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tapdmv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tapdmv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tapdmv.com.yml/badge.svg" alt="tapdmv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telecablesat.fr">telecablesat.fr</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/telecablesat.fr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml/badge.svg" alt="telecablesat.fr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telenet.tv">telenet.tv</a></td><td align="right" nowrap>20</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/telenet.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml/badge.svg" alt="telenet.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>76</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://toonamiaftermath.com">toonamiaftermath.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/toonamiaftermath.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/toonamiaftermath.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/toonamiaftermath.com.yml/badge.svg" alt="toonamiaftermath.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>84</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.dir.bg">tv.dir.bg</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tv.dir.bg.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.dir.bg.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.dir.bg.yml/badge.svg" alt="tv.dir.bg" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>31</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.yettel.hu">tv.yettel.hu</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tv.yettel.hu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.yettel.hu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.yettel.hu.yml/badge.svg" alt="tv.yettel.hu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv24.co.uk">tv24.co.uk</a></td><td align="right" nowrap>58</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tv24.co.uk.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv24.co.uk.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv24.co.uk.yml/badge.svg" alt="tv24.co.uk" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv24.se">tv24.se</a></td><td align="right" nowrap>26</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tv24.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml/badge.svg" alt="tv24.se" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvguide.com">tvguide.com</a></td><td align="right" nowrap>85</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tvguide.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvguide.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvguide.com.yml/badge.svg" alt="tvguide.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvhebdo.com">tvhebdo.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tvhebdo.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvhebdo.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvhebdo.com.yml/badge.svg" alt="tvhebdo.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvmusor.hu">tvmusor.hu</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tvmusor.hu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvmusor.hu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvmusor.hu.yml/badge.svg" alt="tvmusor.hu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvpassport.com">tvpassport.com</a></td><td align="right" nowrap>824</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tvpassport.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml/badge.svg" alt="tvpassport.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvplus.com.tr">tvplus.com.tr</a></td><td align="right" nowrap>10</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tvplus.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvplus.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvplus.com.tr.yml/badge.svg" alt="tvplus.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvprofil.com">tvprofil.com</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/tvprofil.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvprofil.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvprofil.com.yml/badge.svg" alt="tvprofil.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://unifi.com.my">unifi.com.my</a></td><td align="right" nowrap>45</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/unifi.com.my.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/unifi.com.my.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/unifi.com.my.yml/badge.svg" alt="unifi.com.my" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://virginmedia.com">virginmedia.com</a></td><td align="right" nowrap>194</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/virginmedia.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/virginmedia.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/virginmedia.com.yml/badge.svg" alt="virginmedia.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://virginmediatelevision.ie">virginmediatelevision.ie</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/virginmediatelevision.ie.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/virginmediatelevision.ie.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/virginmediatelevision.ie.yml/badge.svg" alt="virginmediatelevision.ie" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://watchyour.tv">watchyour.tv</a></td><td align="right" nowrap>24</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/watchyour.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/watchyour.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/watchyour.tv.yml/badge.svg" alt="watchyour.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://wavve.com">wavve.com</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/wavve.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/wavve.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/wavve.com.yml/badge.svg" alt="wavve.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://worldfishingnetwork.com">worldfishingnetwork.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/worldfishingnetwork.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/worldfishingnetwork.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/worldfishingnetwork.com.yml/badge.svg" alt="worldfishingnetwork.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://xumo.tv">xumo.tv</a></td><td align="right" nowrap>150</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/xumo.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/xumo.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/xumo.tv.yml/badge.svg" alt="xumo.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ziggogo.tv">ziggogo.tv</a></td><td align="right" nowrap>23</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/ziggogo.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml/badge.svg" alt="ziggogo.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://znbc.co.zm">znbc.co.zm</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/en/znbc.co.zm.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/znbc.co.zm.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/znbc.co.zm.yml/badge.svg" alt="znbc.co.zm" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Estonian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>65</td><td nowrap><code>https://iptv-org.github.io/epg/guides/et/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telkku.com">telkku.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/et/telkku.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telkku.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telkku.com.yml/badge.svg" alt="telkku.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telsu.fi">telsu.fi</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/et/telsu.fi.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telsu.fi.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telsu.fi.yml/badge.svg" alt="telsu.fi" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Faroese
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://kvf.fo">kvf.fo</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fo/kvf.fo.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/kvf.fo.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/kvf.fo.yml/badge.svg" alt="kvf.fo" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Finnish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://allente.se">allente.se</a></td><td align="right" nowrap>35</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fi/allente.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fi/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telkku.com">telkku.com</a></td><td align="right" nowrap>51</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fi/telkku.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telkku.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telkku.com.yml/badge.svg" alt="telkku.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telkussa.fi">telkussa.fi</a></td><td align="right" nowrap>41</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fi/telkussa.fi.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telkussa.fi.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telkussa.fi.yml/badge.svg" alt="telkussa.fi" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telsu.fi">telsu.fi</a></td><td align="right" nowrap>20</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fi/telsu.fi.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telsu.fi.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telsu.fi.yml/badge.svg" alt="telsu.fi" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### French
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://beinsports.com">beinsports.com</a></td><td align="right" nowrap>13</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/beinsports.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/beinsports.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/beinsports.com.yml/badge.svg" alt="beinsports.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://canalplus-caraibes.com">canalplus-caraibes.com</a></td><td align="right" nowrap>126</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/canalplus-caraibes.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-caraibes.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-caraibes.com.yml/badge.svg" alt="canalplus-caraibes.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://canalplus-haiti.com">canalplus-haiti.com</a></td><td align="right" nowrap>111</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/canalplus-haiti.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-haiti.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-haiti.com.yml/badge.svg" alt="canalplus-haiti.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://canalplus-reunion.com">canalplus-reunion.com</a></td><td align="right" nowrap>118</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/canalplus-reunion.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus-reunion.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus-reunion.com.yml/badge.svg" alt="canalplus-reunion.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://canalplus.com">canalplus.com</a></td><td align="right" nowrap>221</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/canalplus.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/canalplus.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/canalplus.com.yml/badge.svg" alt="canalplus.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://chaines-tv.orange.fr">chaines-tv.orange.fr</a></td><td align="right" nowrap>194</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/chaines-tv.orange.fr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/chaines-tv.orange.fr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/chaines-tv.orange.fr.yml/badge.svg" alt="chaines-tv.orange.fr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://delta.nl">delta.nl</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/delta.nl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/delta.nl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/delta.nl.yml/badge.svg" alt="delta.nl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://digiturk.com.tr">digiturk.com.tr</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/digiturk.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/digiturk.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/digiturk.com.tr.yml/badge.svg" alt="digiturk.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://dstv.com">dstv.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/dstv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://epg.i-cable.com">epg.i-cable.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/epg.i-cable.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml/badge.svg" alt="epg.i-cable.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://horizon.tv">horizon.tv</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/horizon.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml/badge.svg" alt="horizon.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://i24news.tv">i24news.tv</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/i24news.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/i24news.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/i24news.tv.yml/badge.svg" alt="i24news.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://maxtv.hrvatskitelekom.hr">maxtv.hrvatskitelekom.hr</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/maxtv.hrvatskitelekom.hr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml/badge.svg" alt="maxtv.hrvatskitelekom.hr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://melita.com">melita.com</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/melita.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml/badge.svg" alt="melita.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mon-programme-tv.be">mon-programme-tv.be</a></td><td align="right" nowrap>102</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/mon-programme-tv.be.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mon-programme-tv.be.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mon-programme-tv.be.yml/badge.svg" alt="mon-programme-tv.be" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mujtvprogram.cz">mujtvprogram.cz</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/mujtvprogram.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml/badge.svg" alt="mujtvprogram.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programme-tv.net">programme-tv.net</a></td><td align="right" nowrap>210</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/programme-tv.net.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programme-tv.net.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programme-tv.net.yml/badge.svg" alt="programme-tv.net" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programme-tv.vini.pf">programme-tv.vini.pf</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/programme-tv.vini.pf.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programme-tv.vini.pf.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programme-tv.vini.pf.yml/badge.svg" alt="programme-tv.vini.pf" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programtv.onet.pl">programtv.onet.pl</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/programtv.onet.pl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml/badge.svg" alt="programtv.onet.pl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://singtel.com">singtel.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/singtel.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml/badge.svg" alt="singtel.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://startimestv.com">startimestv.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/startimestv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/startimestv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/startimestv.com.yml/badge.svg" alt="startimestv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://superguidatv.it">superguidatv.it</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/superguidatv.it.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/superguidatv.it.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/superguidatv.it.yml/badge.svg" alt="superguidatv.it" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telecablesat.fr">telecablesat.fr</a></td><td align="right" nowrap>266</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/telecablesat.fr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml/badge.svg" alt="telecablesat.fr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telenet.tv">telenet.tv</a></td><td align="right" nowrap>31</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/telenet.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml/badge.svg" alt="telenet.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>162</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>71</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv24.se">tv24.se</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/tv24.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml/badge.svg" alt="tv24.se" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvhebdo.com">tvhebdo.com</a></td><td align="right" nowrap>231</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/tvhebdo.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvhebdo.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvhebdo.com.yml/badge.svg" alt="tvhebdo.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvpassport.com">tvpassport.com</a></td><td align="right" nowrap>45</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/tvpassport.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml/badge.svg" alt="tvpassport.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvplus.com.tr">tvplus.com.tr</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/tvplus.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvplus.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvplus.com.tr.yml/badge.svg" alt="tvplus.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvprofil.com">tvprofil.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/fr/tvprofil.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvprofil.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvprofil.com.yml/badge.svg" alt="tvprofil.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Galician
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/gl/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Georgian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://magticom.ge">magticom.ge</a></td><td align="right" nowrap>36</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ka/magticom.ge.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magticom.ge.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magticom.ge.yml/badge.svg" alt="magticom.ge" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### German
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://delta.nl">delta.nl</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/delta.nl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/delta.nl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/delta.nl.yml/badge.svg" alt="delta.nl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://epg.i-cable.com">epg.i-cable.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/epg.i-cable.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml/badge.svg" alt="epg.i-cable.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://hd-plus.de">hd-plus.de</a></td><td align="right" nowrap>120</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/hd-plus.de.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/hd-plus.de.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/hd-plus.de.yml/badge.svg" alt="hd-plus.de" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://horizon.tv">horizon.tv</a></td><td align="right" nowrap>12</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/horizon.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml/badge.svg" alt="horizon.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>14</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>179</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://maxtv.hrvatskitelekom.hr">maxtv.hrvatskitelekom.hr</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/maxtv.hrvatskitelekom.hr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml/badge.svg" alt="maxtv.hrvatskitelekom.hr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://melita.com">melita.com</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/melita.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml/badge.svg" alt="melita.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mujtvprogram.cz">mujtvprogram.cz</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/mujtvprogram.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml/badge.svg" alt="mujtvprogram.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://nowplayer.now.com">nowplayer.now.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/nowplayer.now.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/nowplayer.now.com.yml/badge.svg" alt="nowplayer.now.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programme-tv.net">programme-tv.net</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/programme-tv.net.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programme-tv.net.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programme-tv.net.yml/badge.svg" alt="programme-tv.net" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programtv.onet.pl">programtv.onet.pl</a></td><td align="right" nowrap>34</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/programtv.onet.pl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml/badge.svg" alt="programtv.onet.pl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://sky.de">sky.de</a></td><td align="right" nowrap>79</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/sky.de.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/sky.de.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sky.de.yml/badge.svg" alt="sky.de" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telecablesat.fr">telecablesat.fr</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/telecablesat.fr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml/badge.svg" alt="telecablesat.fr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telenet.tv">telenet.tv</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/telenet.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml/badge.svg" alt="telenet.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>187</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>117</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv24.se">tv24.se</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/tv24.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml/badge.svg" alt="tv24.se" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvheute.at">tvheute.at</a></td><td align="right" nowrap>52</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/tvheute.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvheute.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvheute.at.yml/badge.svg" alt="tvheute.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvplus.com.tr">tvplus.com.tr</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/tvplus.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvplus.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvplus.com.tr.yml/badge.svg" alt="tvplus.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ziggogo.tv">ziggogo.tv</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/de/ziggogo.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml/badge.svg" alt="ziggogo.tv" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Greek
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://cosmote.gr">cosmote.gr</a></td><td align="right" nowrap>85</td><td nowrap><code>https://iptv-org.github.io/epg/guides/el/cosmote.gr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/cosmote.gr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/cosmote.gr.yml/badge.svg" alt="cosmote.gr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://novacyprus.com">novacyprus.com</a></td><td align="right" nowrap>29</td><td nowrap><code>https://iptv-org.github.io/epg/guides/el/novacyprus.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/novacyprus.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/novacyprus.com.yml/badge.svg" alt="novacyprus.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://novasports.gr">novasports.gr</a></td><td align="right" nowrap>16</td><td nowrap><code>https://iptv-org.github.io/epg/guides/el/novasports.gr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/novasports.gr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/novasports.gr.yml/badge.svg" alt="novasports.gr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/el/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvpassport.com">tvpassport.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/el/tvpassport.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml/badge.svg" alt="tvpassport.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Hebrew
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://mako.co.il">mako.co.il</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/he/mako.co.il.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mako.co.il.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mako.co.il.yml/badge.svg" alt="mako.co.il" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/he/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Hindi
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://epg.i-cable.com">epg.i-cable.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hi/epg.i-cable.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/epg.i-cable.com.yml/badge.svg" alt="epg.i-cable.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://sky.com">sky.com</a></td><td align="right" nowrap>24</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hi/sky.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml/badge.svg" alt="sky.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hi/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://unifi.com.my">unifi.com.my</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hi/unifi.com.my.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/unifi.com.my.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/unifi.com.my.yml/badge.svg" alt="unifi.com.my" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Hungarian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mediaklikk.hu">mediaklikk.hu</a></td><td align="right" nowrap>8</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/mediaklikk.hu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mediaklikk.hu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mediaklikk.hu.yml/badge.svg" alt="mediaklikk.hu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mujtvprogram.cz">mujtvprogram.cz</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/mujtvprogram.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml/badge.svg" alt="mujtvprogram.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://musor.tv">musor.tv</a></td><td align="right" nowrap>147</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/musor.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/musor.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/musor.tv.yml/badge.svg" alt="musor.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.yettel.hu">tv.yettel.hu</a></td><td align="right" nowrap>68</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/tv.yettel.hu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.yettel.hu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.yettel.hu.yml/badge.svg" alt="tv.yettel.hu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvmusor.hu">tvmusor.hu</a></td><td align="right" nowrap>85</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/tvmusor.hu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvmusor.hu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvmusor.hu.yml/badge.svg" alt="tvmusor.hu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvpassport.com">tvpassport.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/hu/tvpassport.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml/badge.svg" alt="tvpassport.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Icelandic
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://ruv.is">ruv.is</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/is/ruv.is.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ruv.is.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ruv.is.yml/badge.svg" alt="ruv.is" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Indonesian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://indihometv.com">indihometv.com</a></td><td align="right" nowrap>124</td><td nowrap><code>https://iptv-org.github.io/epg/guides/id/indihometv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/indihometv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/indihometv.com.yml/badge.svg" alt="indihometv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mncvision.id">mncvision.id</a></td><td align="right" nowrap>97</td><td nowrap><code>https://iptv-org.github.io/epg/guides/id/mncvision.id.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mncvision.id.yml/badge.svg" alt="mncvision.id" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://transvision.co.id">transvision.co.id</a></td><td align="right" nowrap>78</td><td nowrap><code>https://iptv-org.github.io/epg/guides/id/transvision.co.id.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/transvision.co.id.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/transvision.co.id.yml/badge.svg" alt="transvision.co.id" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://vidio.com">vidio.com</a></td><td align="right" nowrap>67</td><td nowrap><code>https://iptv-org.github.io/epg/guides/id/vidio.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/vidio.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/vidio.com.yml/badge.svg" alt="vidio.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Interlingua
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://unifi.com.my">unifi.com.my</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ia/unifi.com.my.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/unifi.com.my.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/unifi.com.my.yml/badge.svg" alt="unifi.com.my" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Irish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://sky.com">sky.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ga/sky.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/sky.com.yml/badge.svg" alt="sky.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Italian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://guidatv.sky.it">guidatv.sky.it</a></td><td align="right" nowrap>163</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/guidatv.sky.it.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/guidatv.sky.it.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/guidatv.sky.it.yml/badge.svg" alt="guidatv.sky.it" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://maxtv.hrvatskitelekom.hr">maxtv.hrvatskitelekom.hr</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/maxtv.hrvatskitelekom.hr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/maxtv.hrvatskitelekom.hr.yml/badge.svg" alt="maxtv.hrvatskitelekom.hr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mediaset.it">mediaset.it</a></td><td align="right" nowrap>15</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/mediaset.it.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mediaset.it.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mediaset.it.yml/badge.svg" alt="mediaset.it" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://melita.com">melita.com</a></td><td align="right" nowrap>22</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/melita.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml/badge.svg" alt="melita.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://raiplay.it">raiplay.it</a></td><td align="right" nowrap>14</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/raiplay.it.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/raiplay.it.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/raiplay.it.yml/badge.svg" alt="raiplay.it" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://superguidatv.it">superguidatv.it</a></td><td align="right" nowrap>159</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/superguidatv.it.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/superguidatv.it.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/superguidatv.it.yml/badge.svg" alt="superguidatv.it" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telecablesat.fr">telecablesat.fr</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/telecablesat.fr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telecablesat.fr.yml/badge.svg" alt="telecablesat.fr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://telenet.tv">telenet.tv</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/telenet.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telenet.tv.yml/badge.svg" alt="telenet.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tivu.tv">tivu.tv</a></td><td align="right" nowrap>71</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/tivu.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tivu.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tivu.tv.yml/badge.svg" alt="tivu.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>83</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>7</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv24.se">tv24.se</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/tv24.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml/badge.svg" alt="tv24.se" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvpassport.com">tvpassport.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/tvpassport.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml/badge.svg" alt="tvpassport.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ziggogo.tv">ziggogo.tv</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/it/ziggogo.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml/badge.svg" alt="ziggogo.tv" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Japanese
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tvguide.myjcom.jp">tvguide.myjcom.jp</a></td><td align="right" nowrap>134</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ja/tvguide.myjcom.jp.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvguide.myjcom.jp.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvguide.myjcom.jp.yml/badge.svg" alt="tvguide.myjcom.jp" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Kalaallisut
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://knr.gl">knr.gl</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/kl/knr.gl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/knr.gl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/knr.gl.yml/badge.svg" alt="knr.gl" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Korean
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://berrymedia.co.kr">berrymedia.co.kr</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ko/berrymedia.co.kr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/berrymedia.co.kr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/berrymedia.co.kr.yml/badge.svg" alt="berrymedia.co.kr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ena.skylifetv.co.kr">ena.skylifetv.co.kr</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ko/ena.skylifetv.co.kr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ena.skylifetv.co.kr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ena.skylifetv.co.kr.yml/badge.svg" alt="ena.skylifetv.co.kr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tving.com">tving.com</a></td><td align="right" nowrap>26</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ko/tving.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tving.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tving.com.yml/badge.svg" alt="tving.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://wavve.com">wavve.com</a></td><td align="right" nowrap>75</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ko/wavve.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/wavve.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/wavve.com.yml/badge.svg" alt="wavve.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Kurdish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ku/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Latvian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.lv">tv.lv</a></td><td align="right" nowrap>20</td><td nowrap><code>https://iptv-org.github.io/epg/guides/lv/tv.lv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.lv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.lv.yml/badge.svg" alt="tv.lv" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Lithuanian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://cgates.lt">cgates.lt</a></td><td align="right" nowrap>42</td><td nowrap><code>https://iptv-org.github.io/epg/guides/lt/cgates.lt.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/cgates.lt.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/cgates.lt.yml/badge.svg" alt="cgates.lt" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Luxembourgish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/lb/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Macedonian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://maxtvgo.mk">maxtvgo.mk</a></td><td align="right" nowrap>51</td><td nowrap><code>https://iptv-org.github.io/epg/guides/mk/maxtvgo.mk.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/maxtvgo.mk.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/maxtvgo.mk.yml/badge.svg" alt="maxtvgo.mk" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Malay
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://astro.com.my">astro.com.my</a></td><td align="right" nowrap>137</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ms/astro.com.my.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/astro.com.my.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/astro.com.my.yml/badge.svg" alt="astro.com.my" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://rtmklik.rtm.gov.my">rtmklik.rtm.gov.my</a></td><td align="right" nowrap>6</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ms/rtmklik.rtm.gov.my.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/rtmklik.rtm.gov.my.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/rtmklik.rtm.gov.my.yml/badge.svg" alt="rtmklik.rtm.gov.my" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://singtel.com">singtel.com</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ms/singtel.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml/badge.svg" alt="singtel.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Maltese
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://melita.com">melita.com</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/mt/melita.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml/badge.svg" alt="melita.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvmi.mt">tvmi.mt</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/mt/tvmi.mt.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvmi.mt.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvmi.mt.yml/badge.svg" alt="tvmi.mt" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Mongolian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://zuragt.mn">zuragt.mn</a></td><td align="right" nowrap>31</td><td nowrap><code>https://iptv-org.github.io/epg/guides/mn/zuragt.mn.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/zuragt.mn.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/zuragt.mn.yml/badge.svg" alt="zuragt.mn" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Northern Sami
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://telsu.fi">telsu.fi</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/se/telsu.fi.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/telsu.fi.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/telsu.fi.yml/badge.svg" alt="telsu.fi" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Norwegian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://allente.se">allente.se</a></td><td align="right" nowrap>70</td><td nowrap><code>https://iptv-org.github.io/epg/guides/no/allente.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://frikanalen.no">frikanalen.no</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/no/frikanalen.no.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/frikanalen.no.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/frikanalen.no.yml/badge.svg" alt="frikanalen.no" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Polish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>7</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pl/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pl/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programtv.onet.pl">programtv.onet.pl</a></td><td align="right" nowrap>256</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pl/programtv.onet.pl.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programtv.onet.pl.yml/badge.svg" alt="programtv.onet.pl" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pl/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Portuguese
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://dstv.com">dstv.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/dstv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dstv.com.yml/badge.svg" alt="dstv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://meo.pt">meo.pt</a></td><td align="right" nowrap>192</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/meo.pt.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/meo.pt.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/meo.pt.yml/badge.svg" alt="meo.pt" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mi.tv">mi.tv</a></td><td align="right" nowrap>254</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/mi.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml/badge.svg" alt="mi.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://nos.pt">nos.pt</a></td><td align="right" nowrap>133</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/nos.pt.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/nos.pt.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/nos.pt.yml/badge.svg" alt="nos.pt" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://plex.tv">plex.tv</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/plex.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/plex.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/plex.tv.yml/badge.svg" alt="plex.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://rtp.pt">rtp.pt</a></td><td align="right" nowrap>10</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/rtp.pt.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/rtp.pt.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/rtp.pt.yml/badge.svg" alt="rtp.pt" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>8</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>12</td><td nowrap><code>https://iptv-org.github.io/epg/guides/pt/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Romanian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://programetv.ro">programetv.ro</a></td><td align="right" nowrap>227</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ro/programetv.ro.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programetv.ro.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programetv.ro.yml/badge.svg" alt="programetv.ro" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ro/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Russian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://9tv.co.il">9tv.co.il</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ru/9tv.co.il.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/9tv.co.il.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/9tv.co.il.yml/badge.svg" alt="9tv.co.il" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ru/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magticom.ge">magticom.ge</a></td><td align="right" nowrap>67</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ru/magticom.ge.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magticom.ge.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magticom.ge.yml/badge.svg" alt="magticom.ge" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>80</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ru/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ru/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.mail.ru">tv.mail.ru</a></td><td align="right" nowrap>19</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ru/tv.mail.ru.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.mail.ru.yml/badge.svg" alt="tv.mail.ru" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ru/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.yandex.ru">tv.yandex.ru</a></td><td align="right" nowrap>288</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ru/tv.yandex.ru.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.yandex.ru.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.yandex.ru.yml/badge.svg" alt="tv.yandex.ru" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Serbian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>7</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sr/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mts.rs">mts.rs</a></td><td align="right" nowrap>346</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sr/mts.rs.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mts.rs.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mts.rs.yml/badge.svg" alt="mts.rs" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>15</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sr/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvarenasport.com">tvarenasport.com</a></td><td align="right" nowrap>12</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sr/tvarenasport.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvarenasport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvarenasport.com.yml/badge.svg" alt="tvarenasport.com" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Slovak
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://horizon.tv">horizon.tv</a></td><td align="right" nowrap>134</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sk/horizon.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/horizon.tv.yml/badge.svg" alt="horizon.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>7</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sk/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mujtvprogram.cz">mujtvprogram.cz</a></td><td align="right" nowrap>23</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sk/mujtvprogram.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mujtvprogram.cz.yml/badge.svg" alt="mujtvprogram.cz" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Slovene
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv2go.t-2.net">tv2go.t-2.net</a></td><td align="right" nowrap>274</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sl/tv2go.t-2.net.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv2go.t-2.net.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv2go.t-2.net.yml/badge.svg" alt="tv2go.t-2.net" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Spanish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://beinsports.com">beinsports.com</a></td><td align="right" nowrap>10</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/beinsports.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/beinsports.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/beinsports.com.yml/badge.svg" alt="beinsports.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://cablego.com.pe">cablego.com.pe</a></td><td align="right" nowrap>24</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/cablego.com.pe.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/cablego.com.pe.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/cablego.com.pe.yml/badge.svg" alt="cablego.com.pe" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://cableplus.com.uy">cableplus.com.uy</a></td><td align="right" nowrap>47</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/cableplus.com.uy.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/cableplus.com.uy.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/cableplus.com.uy.yml/badge.svg" alt="cableplus.com.uy" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://compulms.com">compulms.com</a></td><td align="right" nowrap>4</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/compulms.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/compulms.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/compulms.com.yml/badge.svg" alt="compulms.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://comteco.com.bo">comteco.com.bo</a></td><td align="right" nowrap>74</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/comteco.com.bo.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/comteco.com.bo.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/comteco.com.bo.yml/badge.svg" alt="comteco.com.bo" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://directv.com">directv.com</a></td><td align="right" nowrap>40</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/directv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/directv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/directv.com.yml/badge.svg" alt="directv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://directv.com.ar">directv.com.ar</a></td><td align="right" nowrap>178</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/directv.com.ar.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/directv.com.ar.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/directv.com.ar.yml/badge.svg" alt="directv.com.ar" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://directv.com.uy">directv.com.uy</a></td><td align="right" nowrap>142</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/directv.com.uy.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/directv.com.uy.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/directv.com.uy.yml/badge.svg" alt="directv.com.uy" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://flixed.io">flixed.io</a></td><td align="right" nowrap>28</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/flixed.io.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/flixed.io.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/flixed.io.yml/badge.svg" alt="flixed.io" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://gatotv.com">gatotv.com</a></td><td align="right" nowrap>359</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/gatotv.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/gatotv.com.yml/badge.svg" alt="gatotv.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://i.mjh.nz">i.mjh.nz</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/i.mjh.nz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/i.mjh.nz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/i.mjh.nz.yml/badge.svg" alt="i.mjh.nz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://m.tv.sms.cz">m.tv.sms.cz</a></td><td align="right" nowrap>3</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/m.tv.sms.cz.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/m.tv.sms.cz.yml/badge.svg" alt="m.tv.sms.cz" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://melita.com">melita.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/melita.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml/badge.svg" alt="melita.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://mi.tv">mi.tv</a></td><td align="right" nowrap>360</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/mi.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/mi.tv.yml/badge.svg" alt="mi.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://movistarplus.es">movistarplus.es</a></td><td align="right" nowrap>182</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/movistarplus.es.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/movistarplus.es.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/movistarplus.es.yml/badge.svg" alt="movistarplus.es" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://nuevosiglo.com.uy">nuevosiglo.com.uy</a></td><td align="right" nowrap>47</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/nuevosiglo.com.uy.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/nuevosiglo.com.uy.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/nuevosiglo.com.uy.yml/badge.svg" alt="nuevosiglo.com.uy" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ontvtonight.com">ontvtonight.com</a></td><td align="right" nowrap>5</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/ontvtonight.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ontvtonight.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ontvtonight.com.yml/badge.svg" alt="ontvtonight.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://plex.tv">plex.tv</a></td><td align="right" nowrap>25</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/plex.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/plex.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/plex.tv.yml/badge.svg" alt="plex.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programacion-tv.elpais.com">programacion-tv.elpais.com</a></td><td align="right" nowrap>108</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/programacion-tv.elpais.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programacion-tv.elpais.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programacion-tv.elpais.com.yml/badge.svg" alt="programacion-tv.elpais.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://programacion.tcc.com.uy">programacion.tcc.com.uy</a></td><td align="right" nowrap>58</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/programacion.tcc.com.uy.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/programacion.tcc.com.uy.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/programacion.tcc.com.uy.yml/badge.svg" alt="programacion.tcc.com.uy" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://reportv.com.ar">reportv.com.ar</a></td><td align="right" nowrap>97</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/reportv.com.ar.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/reportv.com.ar.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/reportv.com.ar.yml/badge.svg" alt="reportv.com.ar" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://siba.com.co">siba.com.co</a></td><td align="right" nowrap>97</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/siba.com.co.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/siba.com.co.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/siba.com.co.yml/badge.svg" alt="siba.com.co" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>15</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.movistar.com.pe">tv.movistar.com.pe</a></td><td align="right" nowrap>43</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/tv.movistar.com.pe.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.movistar.com.pe.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.movistar.com.pe.yml/badge.svg" alt="tv.movistar.com.pe" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvcubana.icrt.cu">tvcubana.icrt.cu</a></td><td align="right" nowrap>10</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/tvcubana.icrt.cu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvcubana.icrt.cu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvcubana.icrt.cu.yml/badge.svg" alt="tvcubana.icrt.cu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvpassport.com">tvpassport.com</a></td><td align="right" nowrap>23</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/tvpassport.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvpassport.com.yml/badge.svg" alt="tvpassport.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://xumo.tv">xumo.tv</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/xumo.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/xumo.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/xumo.tv.yml/badge.svg" alt="xumo.tv" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ziggogo.tv">ziggogo.tv</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/es/ziggogo.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml/badge.svg" alt="ziggogo.tv" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Swedish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://allente.se">allente.se</a></td><td align="right" nowrap>109</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sv/allente.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/allente.se.yml/badge.svg" alt="allente.se" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://teliatv.ee">teliatv.ee</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sv/teliatv.ee.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/teliatv.ee.yml/badge.svg" alt="teliatv.ee" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.nu">tv.nu</a></td><td align="right" nowrap>178</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sv/tv.nu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.nu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.nu.yml/badge.svg" alt="tv.nu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv24.se">tv24.se</a></td><td align="right" nowrap>154</td><td nowrap><code>https://iptv-org.github.io/epg/guides/sv/tv24.se.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv24.se.yml/badge.svg" alt="tv24.se" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Tamil
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://singtel.com">singtel.com</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ta/singtel.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/singtel.com.yml/badge.svg" alt="singtel.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/ta/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Thai
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/th/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.trueid.net">tv.trueid.net</a></td><td align="right" nowrap>90</td><td nowrap><code>https://iptv-org.github.io/epg/guides/th/tv.trueid.net.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.trueid.net.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.trueid.net.yml/badge.svg" alt="tv.trueid.net" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Turkish
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://digiturk.com.tr">digiturk.com.tr</a></td><td align="right" nowrap>103</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tr/digiturk.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/digiturk.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/digiturk.com.tr.yml/badge.svg" alt="digiturk.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://dsmart.com.tr">dsmart.com.tr</a></td><td align="right" nowrap>97</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tr/dsmart.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/dsmart.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/dsmart.com.tr.yml/badge.svg" alt="dsmart.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://magentatv.at">magentatv.at</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tr/magentatv.at.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/magentatv.at.yml/badge.svg" alt="magentatv.at" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://melita.com">melita.com</a></td><td align="right" nowrap>2</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tr/melita.com.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/melita.com.yml/badge.svg" alt="melita.com" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>15</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tr/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tv.post.lu">tv.post.lu</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tr/tv.post.lu.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.post.lu.yml/badge.svg" alt="tv.post.lu" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://tvplus.com.tr">tvplus.com.tr</a></td><td align="right" nowrap>132</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tr/tvplus.com.tr.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tvplus.com.tr.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tvplus.com.tr.yml/badge.svg" alt="tvplus.com.tr" style="max-width: 100%;"></a></td></tr>
<tr><td valign="top" rowspan="1"><a href="https://ziggogo.tv">ziggogo.tv</a></td><td align="right" nowrap>8</td><td nowrap><code>https://iptv-org.github.io/epg/guides/tr/ziggogo.tv.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/ziggogo.tv.yml/badge.svg" alt="ziggogo.tv" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
### Ukrainian
<table>
<thead>
<tr><th align="left">Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Channels</th><th align="left">EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th align="left">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>
</thead>
<tbody>
<tr><td valign="top" rowspan="1"><a href="https://tv.blue.ch">tv.blue.ch</a></td><td align="right" nowrap>1</td><td nowrap><code>https://iptv-org.github.io/epg/guides/uk/tv.blue.ch.xml</code></td><td nowrap><a href="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/tv.blue.ch.yml/badge.svg" alt="tv.blue.ch" style="max-width: 100%;"></a></td></tr>
</tbody>
</table>
</details>
<br>
To load the compressed version of the guide, just change the extension from `.xml` to `.xml.gz`.
## Playlists
Playlists with already linked guides can be found in the [iptv-org/iptv](https://github.com/iptv-org/iptv) repository.
## Database
All channel data is taken from the [iptv-org/database](https://github.com/iptv-org/database) repository. If you find any errors please open a new [issue](https://github.com/iptv-org/database/issues) there.
## API
The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository.
## Resources
Links to other useful IPTV-related resources can be found in the [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv) repository.
## Discussions
If you have a question or an idea, you can post it in the [Discussions](https://github.com/orgs/iptv-org/discussions) tab.
## Contribution
Please make sure to read the [Contributing Guide](https://github.com/iptv-org/epg/blob/master/CONTRIBUTING.md) before sending [issue](https://github.com/iptv-org/epg/issues) or a [pull request](https://github.com/iptv-org/epg/pulls).
And thank you to everyone who has already contributed!
### Backers
<a href="https://opencollective.com/iptv-org"><img src="https://opencollective.com/iptv-org/backers.svg?width=890" /></a>
### Contributors
<a href="https://github.com/iptv-org/epg/graphs/contributors"><img src="https://opencollective.com/iptv-org/contributors.svg?width=890" /></a>
## License
[![CC0](http://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg)](LICENSE)

8
docker-compose.yml Normal file
View File

@@ -0,0 +1,8 @@
version: "3.3"
services:
epg:
image: "ramspopoo/epg"
container_name: "epg"
restart: "unless-stopped"
volumes:
- ./:/usr/src/app

1
epg_create.sh Normal file
View File

@@ -0,0 +1 @@
npx epg-grabber --config=/home/hilfiker/epg/sites/tv.blue.ch/tv.blue.ch.config.js --channels=/home/hilfiker/epg/sites/tv.blue.ch/tv.blue.ch.channels.xml --output=/home/hilfiker/epg/guide.xml --days=7 --lang=de --delay=1000 --log=/home/hilfiker/epg/epg_log.log

0
epg_log.log Normal file
View File

0
guide.xml Normal file
View File

5031
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

73
package.json Normal file
View File

@@ -0,0 +1,73 @@
{
"name": "epg",
"scripts": {
"channels:validate": "node scripts/commands/channels/validate.js",
"channels:lint": "node scripts/commands/channels/lint.js",
"channels:parse": "node scripts/commands/channels/parse.js",
"channels:editor": "node scripts/commands/channels/editor.js",
"queue:create": "node scripts/commands/queue/create.js",
"cluster:load": "node scripts/commands/cluster/load.js",
"db:load": "node scripts/commands/database/load.js",
"programs:save": "node scripts/commands/programs/save.js",
"guides:update": "NODE_OPTIONS=--max-old-space-size=5120 node scripts/commands/guides/update.js",
"api:load": "./scripts/commands/api/load.sh",
"api:update": "node scripts/commands/api/update.js",
"readme:update": "node scripts/commands/readme/update.js",
"lint": "npx eslint ./scripts/**/*.js",
"test": "TZ=Pacific/Nauru npx jest --runInBand",
"test:commands": "npx jest --runInBand -- commands",
"test:sites": "TZ=Pacific/Nauru npx jest --runInBand -- sites",
"act:test": "act workflow_dispatch -W .github/workflows/_test.yml",
"act:check": "act workflow_dispatch -W .github/workflows/_check.yml",
"act:update-readme": "act workflow_dispatch -W .github/workflows/_update-readme.yml",
"act:update-status": "act workflow_dispatch -W .github/workflows/_update-status.yml",
"act:update-api": "act workflow_dispatch -W .github/workflows/_update-api.yml"
},
"private": true,
"author": "Arhey",
"license": "MIT",
"jest": {
"testRegex": "(sites|tests)/(.*?/)?.*test.js$",
"setupFilesAfterEnv": [
"@alex_neo/jest-expect-message"
]
},
"dependencies": {
"@alex_neo/jest-expect-message": "^1.0.5",
"@octokit/core": "^4.2.0",
"axios": "^0.21.1",
"chalk": "^4.1.2",
"cheerio": "^1.0.0-rc.10",
"commander": "^8.2.0",
"csv-parser": "^3.0.0",
"dayjs": "^1.11.7",
"epg-grabber": "^0.29.8",
"epg-parser": "^0.2.0",
"form-data": "^4.0.0",
"fs-extra": "^10.0.1",
"glob": "^7.2.3",
"iconv-lite": "^0.4.24",
"inquirer": "^8.2.5",
"jest": "^27.3.1",
"langs": "^2.0.0",
"libxmljs2": "^0.30.1",
"lodash": "^4.17.21",
"markdown-include": "^0.4.3",
"mockdate": "^3.0.5",
"nedb-promises": "^6.2.1",
"node-cleanup": "^2.1.2",
"node-gzip": "^1.1.2",
"parse-duration": "^1.0.0",
"pdf-parse": "^1.1.1",
"signale": "^1.4.0",
"srcset": "^4.0.0",
"table2array": "^0.0.2",
"tabletojson": "^2.0.7",
"transliteration": "^2.3.5",
"unzipit": "^1.4.0",
"wildcard-match": "^5.1.2"
},
"devDependencies": {
"eslint": "^8.34.0"
}
}

3
scripts/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
/database/
/logs/
/data/

View File

@@ -0,0 +1,7 @@
#!/bin/bash
mkdir -p scripts/data
curl -L -o scripts/data/channels.json https://iptv-org.github.io/api/channels.json
curl -L -o scripts/data/countries.json https://iptv-org.github.io/api/countries.json
curl -L -o scripts/data/regions.json https://iptv-org.github.io/api/regions.json
curl -L -o scripts/data/subdivisions.json https://iptv-org.github.io/api/subdivisions.json

View File

@@ -0,0 +1,31 @@
const { file, parser, logger } = require('../../core')
const { program } = require('commander')
const _ = require('lodash')
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
const OUTPUT_DIR = process.env.OUTPUT_DIR || '.api'
async function main() {
let guides = []
const logPath = `${LOGS_DIR}/guides/update.log`
const results = await parser.parseLogs(logPath)
for (const result of results) {
guides.push({
channel: result.channel,
site: result.site,
lang: result.lang,
days: result.days,
url: `https://iptv-org.github.io/epg/guides/${result.filename}.xml`
})
}
guides = _.sortBy(guides, 'channel')
const outputFilepath = `${OUTPUT_DIR}/guides.json`
await file.create(outputFilepath, JSON.stringify(guides))
logger.info(`saved to "${outputFilepath}"...`)
}
main()

View File

@@ -0,0 +1,116 @@
const { api, parser, xml, file, logger } = require('../../core')
const { transliterate } = require('transliteration')
const nodeCleanup = require('node-cleanup')
const { program } = require('commander')
const inquirer = require('inquirer')
program
.requiredOption('-i, --input <file>', 'Load channels from the file')
.option('-c, --country <name>', 'Source country', 'us')
.parse(process.argv)
const options = program.opts()
const defaultCountry = options.country
const newLabel = ` [new]`
let site
let channels = []
async function main() {
let result = await parser.parseChannels(options.input)
site = result.site
channels = result.channels
channels = channels.map(c => {
c.xmltv_id = c.id
return c
})
await api.channels.load()
for (const channel of channels) {
if (channel.xmltv_id) continue
let choices = await getOptions(channel)
const question = {
name: 'option',
message: `Choose an option:`,
type: 'list',
choices,
pageSize: 10
}
await inquirer.prompt(question).then(async selected => {
switch (selected.option) {
case 'Overwrite...':
const input = await getInput(channel)
channel.xmltv_id = input.xmltv_id
break
case 'Skip...':
channel.xmltv_id = '-'
break
default:
const [name, xmltv_id] = selected.option
.replace(/ \[.*\]/, '')
.split('|')
.map(i => i.trim().replace(newLabel, ''))
channel.xmltv_id = xmltv_id
break
}
})
}
}
main()
function save() {
const output = xml.create(channels, site)
file.writeSync(options.input, output)
logger.info(`\nFile '${options.input}' successfully saved`)
}
nodeCleanup(() => {
save()
})
async function getInput(channel) {
const name = channel.name.trim()
const input = await inquirer.prompt([
{
name: 'xmltv_id',
message: ' ID:',
type: 'input',
default: generateCode(name, defaultCountry)
}
])
return { name, xmltv_id: input['xmltv_id'] }
}
async function getOptions(channel) {
const channels = await api.channels.all()
const channelId = generateCode(channel.name, defaultCountry)
const similar = await getSimilar(channels, channelId)
let variants = []
variants.push(`${channel.name.trim()} | ${channelId}${newLabel}`)
similar.forEach(i => {
let alt_names = i.alt_names.length ? ` (${i.alt_names.join(',')})` : ''
let closed = i.closed ? `[closed:${i.closed}]` : ``
let replaced_by = i.replaced_by ? `[replaced_by:${i.replaced_by}]` : ''
variants.push(`${i.name}${alt_names} | ${i.id} ${closed}${replaced_by}[api]`)
})
variants.push(`Overwrite...`)
variants.push(`Skip...`)
return variants
}
async function getSimilar(list, channelId) {
const normChannelId = channelId.split('.')[0].slice(0, 8).toLowerCase()
return list.filter(i => i.id.split('.')[0].toLowerCase().startsWith(normChannelId))
}
function generateCode(name, country) {
const id = transliterate(name)
.replace(/\+/gi, 'Plus')
.replace(/[^a-z\d]+/gi, '')
return `${id}.${country}`
}

View File

@@ -0,0 +1,76 @@
const chalk = require('chalk')
const libxml = require('libxmljs2')
const { program } = require('commander')
const { logger, file } = require('../../core')
const xsd = `<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="site">
<xs:complexType>
<xs:sequence>
<xs:element ref="channels"/>
</xs:sequence>
<xs:attribute name="site" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="channels">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="channel"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="channel">
<xs:complexType mixed="true">
<xs:attribute name="lang" use="required" type="xs:string"/>
<xs:attribute name="site_id" use="required" type="xs:string"/>
<xs:attribute name="xmltv_id" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>`
program.argument('<filepath>', 'Path to file to validate').parse(process.argv)
async function main() {
if (!program.args.length) {
logger.error('required argument "filepath" not specified')
}
let errors = []
for (const filepath of program.args) {
if (!filepath.endsWith('.xml')) continue
const xml = await file.read(filepath)
let localErrors = []
try {
const xsdDoc = libxml.parseXml(xsd)
const doc = libxml.parseXml(xml)
if (!doc.validate(xsdDoc)) {
localErrors = doc.validationErrors
}
} catch (error) {
localErrors.push(error)
}
if (localErrors.length) {
logger.info(`\n${chalk.underline(filepath)}`)
localErrors.forEach(error => {
const position = `${error.line}:${error.column}`
logger.error(` ${chalk.gray(position.padEnd(4, ' '))} ${error.message.trim()}`)
})
errors = errors.concat(localErrors)
}
}
if (errors.length) {
logger.error(chalk.red(`\n${errors.length} error(s)`))
process.exit(1)
}
}
main()

View File

@@ -0,0 +1,48 @@
const { logger, file, xml } = require('../../core')
const { Command } = require('commander')
const path = require('path')
const _ = require('lodash')
const program = new Command()
program
.requiredOption('-c, --config <config>', 'Config file')
.option('-s, --set [args...]', 'Set custom arguments', [])
.option('-o, --output <output>', 'Output file')
.parse(process.argv)
const options = program.opts()
async function main() {
const config = require(path.resolve(options.config))
const args = {}
options.set.forEach(arg => {
const [key, value] = arg.split(':')
args[key] = value
})
let channels = config.channels(args)
if (isPromise(channels)) {
channels = await channels
}
channels = channels.map(c => {
c.lang = c.lang || 'en'
return c
})
channels = _.sortBy(channels, ['lang', 'xmltv_id'])
const dir = file.dirname(options.config)
const outputFilepath = options.output || `${dir}/${config.site}.channels.xml`
const output = xml.create(channels, config.site)
await file.write(outputFilepath, output)
logger.info(`File '${outputFilepath}' successfully saved`)
}
main()
function isPromise(promise) {
return !!promise && typeof promise.then === 'function'
}

View File

@@ -0,0 +1,68 @@
const { parser, logger, api } = require('../../core')
const { program } = require('commander')
const chalk = require('chalk')
const langs = require('langs')
program.argument('<filepath>', 'Path to file to validate').parse(process.argv)
async function main() {
await api.channels.load()
const stats = {
files: 0,
errors: 0
}
if (!program.args.length) {
logger.error('required argument "filepath" not specified')
}
for (const filepath of program.args) {
if (!filepath.endsWith('.xml')) continue
const { site, channels } = await parser.parseChannels(filepath)
const bufferById = {}
const bufferBySiteId = {}
const errors = []
for (const channel of channels) {
if (!bufferById[channel.id + channel.lang]) {
bufferById[channel.id + channel.lang] = channel
} else {
errors.push({ type: 'duplicate', xmltv_id: channel.id, ...channel })
stats.errors++
}
if (!bufferBySiteId[channel.site_id + channel.lang]) {
bufferBySiteId[channel.site_id + channel.lang] = channel
} else {
errors.push({ type: 'duplicate', xmltv_id: channel.id, ...channel })
stats.errors++
}
if (!api.channels.find({ id: channel.id })) {
errors.push({ type: 'wrong_xmltv_id', xmltv_id: channel.id, ...channel })
stats.errors++
}
if (!langs.where('1', channel.lang)) {
errors.push({ type: 'wrong_lang', xmltv_id: channel.id, ...channel })
stats.errors++
}
}
if (errors.length) {
logger.info(chalk.underline(filepath))
console.table(errors, ['type', 'lang', 'xmltv_id', 'site_id', 'name'])
console.log()
stats.files++
}
}
if (stats.errors > 0) {
logger.error(chalk.red(`${stats.errors} error(s) in ${stats.files} file(s)`))
process.exit(1)
}
}
main()

View File

@@ -0,0 +1,89 @@
const _ = require('lodash')
const { EPGGrabber, Channel } = require('epg-grabber')
const { program } = require('commander')
const { db, logger, timer, file, parser } = require('../../core')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
const options = program
.requiredOption('-c, --cluster-id <cluster-id>', 'The ID of cluster to load', parser.parseNumber)
.option('--delay <delay>', 'Delay between requests (in mileseconds)', parser.parseNumber)
.option(
'-t, --timeout <timeout>',
'Set a timeout for each request (in mileseconds)',
parser.parseNumber
)
.option('--debug', 'Enable debug mode', false)
.parse(process.argv)
.opts()
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
const CLUSTER_PATH = `${LOGS_DIR}/cluster/load/cluster_${options.clusterId}.log`
async function main() {
logger.info('Starting...')
timer.start()
logger.info(`Loading cluster: ${options.clusterId}`)
logger.info(`Creating '${CLUSTER_PATH}'...`)
await file.create(CLUSTER_PATH)
await db.queue.load()
let items = await db.queue.find({ cluster_id: options.clusterId })
items = _.orderBy(items, [i => i.channel.id.toLowerCase(), 'date'])
const total = items.length
logger.info('Loading...')
let i = 1
let totalPrograms = 0
let config = require(file.resolve(items[0].configPath))
config = _.merge(config, {
debug: options.debug,
delay: options.delay,
request: {
timeout: options.timeout
}
})
const grabber = new EPGGrabber(config)
for (const item of items) {
const channel = new Channel(item.channel)
await new Promise(resolve => {
grabber.grab(channel, item.date, async (data, err) => {
logger.info(
`[${i}/${total}] ${channel.site} (${channel.lang}) - ${channel.id} - ${dayjs
.utc(data.date)
.format('MMM D, YYYY')} (${data.programs.length} programs)`
)
if (err) logger.error(err.message)
const result = {
_qid: item._id,
programs: data.programs,
error: err ? err.message : null
}
await file.append(CLUSTER_PATH, JSON.stringify(result) + '\n')
totalPrograms += data.programs.length
if (i < total) i++
resolve()
})
})
}
db.queue.compact()
logger.info(`Done in ${timer.format('HH[h] mm[m] ss[s]')}`)
if (totalPrograms === 0) {
logger.error('\nError: No programs found')
process.exit(1)
}
}
main()

View File

@@ -0,0 +1,115 @@
const { Octokit } = require('@octokit/core')
const dayjs = require('dayjs')
const isToday = require('dayjs/plugin/isToday')
const utc = require('dayjs/plugin/utc')
const unzipit = require('unzipit')
const { file, logger } = require('../../core')
dayjs.extend(isToday)
dayjs.extend(utc)
const DB_DIR = process.env.DB_DIR || './scripts/database'
const programsPath = `${DB_DIR}/programs.db`
const queuePath = `${DB_DIR}/queue.db`
const octokit = new Octokit({
auth: process.env.GITHUB_TOKEN
})
async function main() {
try {
let workflows = await getWorkflows()
logger.info(`found ${workflows.length} workflows\r\n`)
await file.create(programsPath)
await file.create(queuePath)
const total = workflows.length
for (let [i, workflow] of workflows.entries()) {
logger.info(`[${i + 1}/${total}] ${workflow.name}`)
const run = await getWorkflowRun(workflow)
if (!run) continue
let artifact = await getRunArtifacts(run)
const programsBuffer = await downloadArtifact(artifact, 'programs.db')
await file.append(programsPath, programsBuffer)
const queueBuffer = await downloadArtifact(artifact, 'queue.db')
await file.append(queuePath, queueBuffer)
}
} catch (err) {
console.log(err.message)
}
}
main()
async function downloadArtifact(artifact, filename) {
let results = await octokit.request(
'GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}',
{
owner: 'iptv-org',
repo: 'epg',
artifact_id: artifact.id,
archive_format: 'zip'
}
)
const { entries } = await unzipit.unzip(results.data)
const arrayBuffer = await entries[filename].arrayBuffer()
return toString(arrayBuffer)
}
async function getRunArtifacts(run) {
let results = await octokit.request('GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts', {
owner: 'iptv-org',
repo: 'epg',
run_id: run.id
})
return results.data.artifacts.find(a => a.name === 'database')
}
async function getWorkflowRun(workflow) {
let today = dayjs.utc().subtract(1, 'd').format('YYYY-MM-DD')
let results = await octokit.request(
'GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs',
{
owner: 'iptv-org',
repo: 'epg',
workflow_id: workflow.id,
status: 'success',
created: `>=${today}`
}
)
return results.data.workflow_runs.find(
r => r.event === 'schedule' || r.event === 'workflow_dispatch'
)
}
async function getWorkflows() {
let workflows = []
for (let page of [1, 2, 3]) {
try {
let results = await octokit.request('GET /repos/{owner}/{repo}/actions/workflows', {
owner: 'iptv-org',
repo: 'epg',
per_page: 100,
page
})
workflows = workflows.concat(results.data.workflows)
} catch (err) {
console.log(err.message)
}
}
return workflows.filter(w => !/^_/.test(w.name) && w.name !== 'pages-build-deployment')
}
function toString(arrayBuffer) {
return new TextDecoder().decode(arrayBuffer)
}

View File

@@ -0,0 +1,117 @@
const { db, api, logger, file, zip } = require('../../core')
const { generateXMLTV, Program, Channel } = require('epg-grabber')
const _ = require('lodash')
const PUBLIC_DIR = process.env.PUBLIC_DIR || '.gh-pages'
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
const CURR_DATE = process.env.CURR_DATE || new Date()
const logPath = `${LOGS_DIR}/guides/update.log`
let api_channels = {}
let db_queue = []
let db_programs = []
let guides = []
async function main() {
logger.info(`starting...`)
logger.info('loading data/channels.json...')
await api.channels.load()
api.channels.all().forEach(channel => {
api_channels[channel.id] = channel
})
logger.info('loading database/queue.db...')
await db.queue.load()
db_queue = await db.queue.find({})
logger.info(`found ${db_queue.length} items`)
logger.info('loading database/programs.db...')
await db.programs.load()
db_programs = await db.programs.find({})
logger.info(`found ${db_programs.length} programs`)
await generate()
logger.info(`creating ${logPath}...`)
await file.create(logPath, guides.map(g => JSON.stringify(g)).join('\r\n'))
logger.info('finished')
}
main()
async function generate() {
let queue = _.uniqBy(db_queue, i => i.channel.lang + i.channel.id + i.channel.site)
queue = _.groupBy(queue, i => (i.channel ? `${i.channel.lang}/${i.channel.site}` : `_`))
delete queue['_']
let programs = _.groupBy(db_programs, p =>
p.titles.length ? `${p.titles[0].lang}/${p.site}` : `_`
)
delete programs['_']
for (let filename in queue) {
if (!queue[filename]) continue
const channels = queue[filename].map(i => {
const channelData = api_channels[i.channel.id]
channelData.site = i.channel.site
channelData.site_id = i.channel.site_id
channelData.lang = i.channel.lang
return new Channel(channelData)
})
await save(filename, channels, programs[filename])
for (let channel of channels) {
const configPath = `sites/${channel.site}/${channel.site}.config.js`
const config = require(file.resolve(configPath))
guides.push({
site: channel.site,
lang: channel.lang,
days: config.days,
channel: channel.id,
filename
})
}
}
}
async function save(filepath, channels, programs = []) {
let output = {
channels,
programs: [],
date: CURR_DATE
}
for (let programData of programs) {
let channel = channels.find(c => c.id === programData.channel)
if (!channel) continue
let program = new Program(programData, channel)
output.programs.push(program)
}
output.channels = _.sortBy(output.channels, 'id')
output.channels = _.uniqBy(output.channels, 'id')
output.programs = _.sortBy(output.programs, ['channel', 'start'])
output.programs = _.uniqBy(output.programs, p => p.channel + p.start)
const xmlFilepath = `${PUBLIC_DIR}/guides/${filepath}.xml`
const gzFilepath = `${PUBLIC_DIR}/guides/${filepath}.xml.gz`
logger.info(`creating ${xmlFilepath}...`)
const xmltv = generateXMLTV(output)
await file.create(xmlFilepath, xmltv)
logger.info(`creating ${gzFilepath}...`)
const compressed = await zip.compress(xmltv)
await file.create(gzFilepath, compressed)
return output
}

View File

@@ -0,0 +1,35 @@
const { db, logger, file, parser } = require('../../core')
const { Program, Channel } = require('epg-grabber')
const _ = require('lodash')
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
async function main() {
await db.queue.load()
await db.programs.load()
await db.programs.reset()
const files = await file.list(`${LOGS_DIR}/cluster/load/cluster_*.log`)
for (const filepath of files) {
logger.info(`Parsing "${filepath}"...`)
const results = await parser.parseLogs(filepath)
for (const result of results) {
const queue = await db.queue.find({ _id: result._qid }).limit(1)
if (!queue.length) continue
const item = queue[0]
const c = new Channel(item.channel)
const programs = result.programs.map(p => {
p = new Program(p, c)
p._qid = result._qid
return p
})
await db.programs.insert(programs)
await db.queue.update({ _id: result._qid }, { $set: { error: result.error } })
}
}
await db.queue.compact()
}
main()

View File

@@ -0,0 +1,103 @@
const { db, file, parser, logger, date, api } = require('../../core')
const { program } = require('commander')
const _ = require('lodash')
const options = program
.option(
'--max-clusters <max-clusters>',
'Set maximum number of clusters',
parser.parseNumber,
256
)
.parse(process.argv)
.opts()
const CHANNELS_PATH = process.env.CHANNELS_PATH || 'sites/**/*.channels.xml'
const CURR_DATE = process.env.CURR_DATE || new Date()
async function main() {
logger.info('Starting...')
logger.info(`Number of clusters: ${options.maxClusters}`)
await saveToDatabase(await createQueue())
logger.info('Done')
}
main()
async function createQueue() {
logger.info(`Create queue...`)
let queue = {}
await api.channels.load().catch(console.error)
const files = await file.list(CHANNELS_PATH).catch(console.error)
const utcDate = date.getUTC(CURR_DATE)
for (const filepath of files) {
try {
const dir = file.dirname(filepath)
const { site, channels } = await parser.parseChannels(filepath)
if (!site) continue
const configPath = `${dir}/${site}.config.js`
const config = require(file.resolve(configPath))
if (config.skip) continue
const filename = file.basename(filepath)
const days = config.days || 1
const dates = Array.from({ length: days }, (_, i) => utcDate.add(i, 'd'))
for (const channel of channels) {
if (!channel.site || !channel.id) continue
const found = api.channels.find({ id: channel.id })
if (!found) continue
channel.logo = found.logo
for (const d of dates) {
const dString = d.toJSON()
const key = `${channel.site}:${channel.lang}:${channel.id}:${dString}`
if (!queue[key]) {
queue[key] = {
channel,
date: dString,
configPath,
error: null
}
}
}
}
} catch (err) {
console.error(err)
continue
}
}
queue = Object.values(queue)
logger.info(`Added ${queue.length} items`)
return queue
}
async function saveToDatabase(items = []) {
logger.info('Saving to the database...')
await db.queue.load()
await db.queue.reset()
let queue = []
const chunks = split(_.shuffle(items), options.maxClusters)
for (const [i, chunk] of chunks.entries()) {
for (const item of chunk) {
item.cluster_id = i + 1
queue.push(item)
}
}
queue = _.sortBy(queue, ['channel.lang', 'channel.xmltv_id', 'date'])
await db.queue.insert(queue)
}
function split(arr, n) {
let result = []
for (let i = n; i > 0; i--) {
result.push(arr.splice(0, Math.ceil(arr.length / i)))
}
return result
}

View File

@@ -0,0 +1,86 @@
const { file, markdown, parser, logger, api, table } = require('../../core')
const { program } = require('commander')
const langs = require('langs')
const _ = require('lodash')
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs'
const options = program
.option('-c, --config <config>', 'Set path to config file', '.readme/readme.json')
.parse(process.argv)
.opts()
async function main() {
await api.countries.load().catch(console.error)
const logPath = `${LOGS_DIR}/guides/update.log`
let log = await parser.parseLogs(logPath)
await createTable(log)
await updateReadme()
}
main()
async function createTable(log) {
let files = log.reduce((acc, curr) => {
if (!acc[curr.filename]) {
acc[curr.filename] = {
site: curr.site,
lang: curr.lang,
channels: 0,
filename: curr.filename
}
}
acc[curr.filename].channels++
return acc
}, {})
let groups = {}
for (const filename in files) {
const item = files[filename]
const lang = langs.where('1', item.lang)
if (!lang) continue
if (!groups[lang.name]) groups[lang.name] = { lang: lang.name, data: [] }
groups[lang.name].data.push([
`<a href="https://${item.site}">${item.site}</a>`,
item.channels,
`<code>https://iptv-org.github.io/epg/guides/${filename}.xml</code>`,
`<a href="https://github.com/iptv-org/epg/actions/workflows/${item.site}.yml"><img src="https://github.com/iptv-org/epg/actions/workflows/${item.site}.yml/badge.svg" alt="${item.site}" style="max-width: 100%;"></a>`
])
}
groups = _.sortBy(Object.values(groups), 'lang')
let guides = ''
for (let group of groups) {
let lang = group.lang
let data = group.data
data = _.orderBy(data, [item => item[0], item => item[1]], ['asc', 'desc'])
data = Object.values(_.groupBy(data, item => item[0]))
guides += `### ${lang}\r\n\r\n`
guides += table.create(data, [
'Site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',
'Channels',
'EPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',
'Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
])
guides += `\r\n\r\n`
}
await file.create('./.readme/_guides.md', guides)
}
async function updateReadme() {
logger.info('updating readme.md...')
const config = require(file.resolve(options.config))
await file.createDir(file.dirname(config.build))
await markdown.compile(options.config)
}

32
scripts/core/api.js Normal file
View File

@@ -0,0 +1,32 @@
const _ = require('lodash')
const file = require('./file')
const DATA_DIR = process.env.DATA_DIR || './scripts/data'
class API {
constructor(filepath) {
this.filepath = file.resolve(filepath)
}
async load() {
const data = await file.read(this.filepath)
this.collection = JSON.parse(data)
}
find(query) {
return _.find(this.collection, query)
}
all() {
return this.collection
}
}
const api = {}
api.channels = new API(`${DATA_DIR}/channels.json`)
api.regions = new API(`${DATA_DIR}/regions.json`)
api.countries = new API(`${DATA_DIR}/countries.json`)
api.subdivisions = new API(`${DATA_DIR}/subdivisions.json`)
module.exports = api

13
scripts/core/date.js Normal file
View File

@@ -0,0 +1,13 @@
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
const date = {}
date.getUTC = function (d = null) {
if (typeof d === 'string') return dayjs.utc(d).startOf('d')
return dayjs.utc().startOf('d')
}
module.exports = date

76
scripts/core/db.js Normal file
View File

@@ -0,0 +1,76 @@
const nedb = require('nedb-promises')
const file = require('./file')
const DB_DIR = process.env.DB_DIR || './scripts/database'
class Database {
constructor(filepath) {
this.filepath = filepath
}
load() {
this.db = nedb.create({
filename: file.resolve(this.filepath),
autoload: true,
onload: err => {
if (err) console.error(err)
},
compareStrings: (a, b) => {
a = a.replace(/\s/g, '_')
b = b.replace(/\s/g, '_')
return a.localeCompare(b, undefined, {
sensitivity: 'accent',
numeric: true
})
}
})
}
removeIndex(field) {
return this.db.removeIndex(field)
}
addIndex(options) {
return this.db.ensureIndex(options)
}
compact() {
return this.db.persistence.compactDatafile()
}
stopAutocompact() {
return this.db.persistence.stopAutocompaction()
}
reset() {
return file.clear(this.filepath)
}
count(query) {
return this.db.count(query)
}
insert(doc) {
return this.db.insert(doc)
}
update(query, update) {
return this.db.update(query, update)
}
find(query) {
return this.db.find(query)
}
remove(query, options) {
return this.db.remove(query, options)
}
}
const db = {}
db.queue = new Database(`${DB_DIR}/queue.db`)
db.programs = new Database(`${DB_DIR}/programs.db`)
module.exports = db

72
scripts/core/file.js Normal file
View File

@@ -0,0 +1,72 @@
const path = require('path')
const glob = require('glob')
const fs = require('fs-extra')
const file = {}
file.list = function (pattern) {
return new Promise(resolve => {
glob(pattern, function (err, files) {
resolve(files)
})
})
}
file.getFilename = function (filepath) {
return path.parse(filepath).name
}
file.createDir = async function (dir) {
if (await file.exists(dir)) return
return fs.mkdir(dir, { recursive: true }).catch(console.error)
}
file.exists = function (filepath) {
return fs.exists(path.resolve(filepath))
}
file.read = function (filepath) {
return fs.readFile(path.resolve(filepath), { encoding: 'utf8' }).catch(console.error)
}
file.append = function (filepath, data) {
return fs.appendFile(path.resolve(filepath), data).catch(console.error)
}
file.create = function (filepath, data = '') {
filepath = path.resolve(filepath)
const dir = path.dirname(filepath)
return file
.createDir(dir)
.then(() => file.write(filepath, data))
.catch(console.error)
}
file.write = function (filepath, data = '') {
return fs.writeFile(path.resolve(filepath), data, { encoding: 'utf8' }).catch(console.error)
}
file.writeSync = function (filepath, data = '') {
return fs.writeFileSync(path.resolve(filepath), data, { encoding: 'utf8' })
}
file.clear = async function (filepath) {
if (await file.exists(filepath)) return file.write(filepath, '')
return true
}
file.resolve = function (filepath) {
return path.resolve(filepath)
}
file.dirname = function (filepath) {
return path.dirname(filepath)
}
file.basename = function (filepath) {
return path.basename(filepath)
}
module.exports = file

11
scripts/core/index.js Normal file
View File

@@ -0,0 +1,11 @@
exports.db = require('./db')
exports.logger = require('./logger')
exports.file = require('./file')
exports.parser = require('./parser')
exports.timer = require('./timer')
exports.markdown = require('./markdown')
exports.api = require('./api')
exports.date = require('./date')
exports.table = require('./table')
exports.xml = require('./xml')
exports.zip = require('./zip')

19
scripts/core/logger.js Normal file
View File

@@ -0,0 +1,19 @@
const { Signale } = require('signale')
const options = {}
const logger = new Signale(options)
logger.config({
displayLabel: false,
displayScope: false,
displayBadge: false
})
logger.memoryUsage = function () {
const used = process.memoryUsage().heapUsed / 1024 / 1024
logger.info(`memory: ${Math.round(used * 100) / 100} MB`)
}
module.exports = logger

10
scripts/core/markdown.js Normal file
View File

@@ -0,0 +1,10 @@
const markdownInclude = require('markdown-include')
const file = require('./file')
const markdown = {}
markdown.compile = function (filepath) {
markdownInclude.compileFiles(file.resolve(filepath))
}
module.exports = markdown

29
scripts/core/parser.js Normal file
View File

@@ -0,0 +1,29 @@
const file = require('./file')
const grabber = require('epg-grabber')
const parser = {}
parser.parseChannels = async function (filepath) {
const content = await file.read(filepath)
return grabber.parseChannels(content)
}
parser.parseLogs = async function (filepath) {
const content = await file.read(filepath)
if (!content) return []
const lines = content.split('\n')
return lines.map(line => (line ? JSON.parse(line) : null)).filter(l => l)
}
parser.parseNumber = function (string) {
const parsed = parseInt(string)
if (isNaN(parsed)) {
throw new Error('scripts/core/parser.js:parseNumber() Input value is not a number')
}
return parsed
}
module.exports = parser

47
scripts/core/table.js Normal file
View File

@@ -0,0 +1,47 @@
const table = {}
table.create = function (data, cols) {
let output = '<table>\r\n'
output += ' <thead>\r\n <tr>'
for (let column of cols) {
output += `<th align="left">${column}</th>`
}
output += '</tr>\r\n </thead>\r\n'
output += ' <tbody>\r\n'
output += getHTMLRows(data)
output += ' </tbody>\r\n'
output += '</table>'
return output
}
function getHTMLRows(data) {
let output = ''
for (let group of data) {
let rowspan = group.length
for (let [j, row] of group.entries()) {
output += ' <tr>'
for (let [i, value] of row.entries()) {
if (i === 0 && j === 0) {
output += `<td valign="top" rowspan="${rowspan}">${value}</td>`
} else if (i > 0) {
if (typeof value === 'number') {
output += `<td align="right" nowrap>${value}</td>`
} else {
output += `<td nowrap>${value}</td>`
}
}
}
output += '</tr>\r\n'
}
}
return output
}
function getSpan() {}
module.exports = table

29
scripts/core/timer.js Normal file
View File

@@ -0,0 +1,29 @@
const { performance } = require('perf_hooks')
const dayjs = require('dayjs')
const duration = require('dayjs/plugin/duration')
const relativeTime = require('dayjs/plugin/relativeTime')
dayjs.extend(relativeTime)
dayjs.extend(duration)
const timer = {}
let t0 = 0
timer.start = function () {
t0 = performance.now()
}
timer.format = function (f) {
let t1 = performance.now()
return dayjs.duration(t1 - t0).format(f)
}
timer.humanize = function (suffix = true) {
let t1 = performance.now()
return dayjs.duration(t1 - t0).humanize(suffix)
}
module.exports = timer

49
scripts/core/xml.js Normal file
View File

@@ -0,0 +1,49 @@
const xml = {}
xml.create = function (items, site) {
let output = `<?xml version="1.0" encoding="UTF-8"?>\r\n<site site="${site}">\r\n <channels>\r\n`
items.forEach(channel => {
const logo = channel.logo ? ` logo="${channel.logo}"` : ''
const xmltv_id = channel.xmltv_id || ''
const lang = channel.lang || ''
const site_id = channel.site_id || ''
output += ` <channel lang="${lang}" xmltv_id="${escapeString(
xmltv_id
)}" site_id="${site_id}"${logo}>${escapeString(channel.name)}</channel>\r\n`
})
output += ` </channels>\r\n</site>\r\n`
return output
}
function escapeString(string, defaultValue = '') {
if (!string) return defaultValue
const regex = new RegExp(
'((?:[\0-\x08\x0B\f\x0E-\x1F\uFFFD\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))|([\\x7F-\\x84]|[\\x86-\\x9F]|[\\uFDD0-\\uFDEF]|(?:\\uD83F[\\uDFFE\\uDFFF])|(?:\\uD87F[\\uDF' +
'FE\\uDFFF])|(?:\\uD8BF[\\uDFFE\\uDFFF])|(?:\\uD8FF[\\uDFFE\\uDFFF])|(?:\\uD93F[\\uDFFE\\uD' +
'FFF])|(?:\\uD97F[\\uDFFE\\uDFFF])|(?:\\uD9BF[\\uDFFE\\uDFFF])|(?:\\uD9FF[\\uDFFE\\uDFFF])' +
'|(?:\\uDA3F[\\uDFFE\\uDFFF])|(?:\\uDA7F[\\uDFFE\\uDFFF])|(?:\\uDABF[\\uDFFE\\uDFFF])|(?:\\' +
'uDAFF[\\uDFFE\\uDFFF])|(?:\\uDB3F[\\uDFFE\\uDFFF])|(?:\\uDB7F[\\uDFFE\\uDFFF])|(?:\\uDBBF' +
'[\\uDFFE\\uDFFF])|(?:\\uDBFF[\\uDFFE\\uDFFF])(?:[\\0-\\t\\x0B\\f\\x0E-\\u2027\\u202A-\\uD7FF\\' +
'uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|' +
'(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]))',
'g'
)
string = String(string || '').replace(regex, '')
return string
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;')
.replace(/\n|\r/g, ' ')
.replace(/ +/g, ' ')
.trim()
}
module.exports = xml

13
scripts/core/zip.js Normal file
View File

@@ -0,0 +1,13 @@
const { gzip, ungzip } = require('node-gzip')
const zip = {}
zip.compress = async function (string) {
return gzip(string)
}
zip.decompress = async function (string) {
return ungzip(string)
}
module.exports = zip

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="9tv.co.il">
<channels>
<channel lang="ru" xmltv_id="Channel9.il" site_id="#">9 канал</channel>
</channels>
</site>

View File

@@ -0,0 +1,69 @@
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: '9tv.co.il',
days: 2,
url: function ({ date }) {
return `https://www.9tv.co.il/BroadcastSchedule/getBrodcastSchedule?date=${date.format(
'DD/MM/YYYY 00:00:00'
)}`
},
parser: function ({ content, date }) {
const programs = []
const items = parseItems(content)
items.forEach(item => {
const prev = programs[programs.length - 1]
const $item = cheerio.load(item)
const start = parseStart($item, date)
if (prev) prev.stop = start
const stop = start.add(1, 'h')
programs.push({
title: parseTitle($item),
icon: parseIcon($item),
description: parseDescription($item),
start,
stop
})
})
return programs
}
}
function parseStart($item, date) {
let time = $item('a > div.guide_list_time').text().trim()
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'Asia/Jerusalem')
}
function parseIcon($item) {
const backgroundImage = $item('a > div.guide_info_group > div.guide_info_pict').css(
'background-image'
)
if (!backgroundImage) return null
const [_, relativePath] = backgroundImage.match(/url\((.*)\)/) || [null, null]
return relativePath ? `https://www.9tv.co.il${relativePath}` : null
}
function parseDescription($item) {
return $item('a > div.guide_info_group > div.guide_txt_group > div').text().trim()
}
function parseTitle($item) {
return $item('a > div.guide_info_group > div.guide_txt_group > h3').text().trim()
}
function parseItems(content) {
const $ = cheerio.load(content)
return $('li').toArray()
}

View File

@@ -0,0 +1,56 @@
// npx epg-grabber --config=sites/9tv.co.il/9tv.co.il.config.js --channels=sites/9tv.co.il/9tv.co.il.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./9tv.co.il.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-06', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '#',
xmltv_id: 'Channel9.il'
}
it('can generate valid url', () => {
expect(url({ date })).toBe(
'https://www.9tv.co.il/BroadcastSchedule/getBrodcastSchedule?date=06/03/2022 00:00:00'
)
})
it('can parse response', () => {
const content = `<li> <a href="#" class="guide_list_link w-inline-block"> <div class="guide_list_time">06:30</div><div class="guide_info_group"> <div class="guide_info_pict" style="background-image: url(/download/pictures/img_id=8484.jpg);"></div><div class="guide_txt_group"> <h3 class="guide_info_title">Слепая</h3> <div>Она не очень любит говорить о себе или о том, кто и зачем к ней обращается. Живет уединенно, в глуши. Но тех, кто приходит -принимает. Она видит судьбы.&#160;</div></div></div></a></li><li> <a href="#" class="guide_list_link even w-inline-block"> <div class="guide_list_time">09:10</div><div class="guide_info_group"> <div class="guide_info_pict" style="background-image: url(/download/pictures/img_id=23694.jpg);"></div><div class="guide_txt_group"> <h3 class="guide_info_title">Орел и решка. Морской сезон</h3> <div>Орел и решка. Морской сезон. Ведущие -Алина Астровская и Коля Серга.</div></div></div></a></li>`
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-06T04:30:00.000Z',
stop: '2022-03-06T07:10:00.000Z',
title: `Слепая`,
icon: 'https://www.9tv.co.il/download/pictures/img_id=8484.jpg',
description:
'Она не очень любит говорить о себе или о том, кто и зачем к ней обращается. Живет уединенно, в глуши. Но тех, кто приходит -принимает. Она видит судьбы.'
},
{
start: '2022-03-06T07:10:00.000Z',
stop: '2022-03-06T08:10:00.000Z',
icon: 'https://www.9tv.co.il/download/pictures/img_id=23694.jpg',
title: `Орел и решка. Морской сезон`,
description: 'Орел и решка. Морской сезон. Ведущие -Алина Астровская и Коля Серга.'
}
])
})
it('can handle empty guide', () => {
const result = parser({
date,
channel,
content: `<!DOCTYPE html><html><head></head><body></body></html>`
})
expect(result).toMatchObject([])
})

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="abc.net.au">
<channels>
<channel lang="en" xmltv_id="10Bold.au" site_id="ONE">10 Bold</channel>
<channel lang="en" xmltv_id="10Peach.au" site_id="11">10 Peach</channel>
<channel lang="en" xmltv_id="10Shake.au" site_id="SHAKE">10 Shake</channel>
<channel lang="en" xmltv_id="7flix.au" site_id="7flix">7flix</channel>
<channel lang="en" xmltv_id="7mate.au" site_id="7MATE">7mate</channel>
<channel lang="en" xmltv_id="7two.au" site_id="7TWO">7two</channel>
<channel lang="en" xmltv_id="9Gem.au" site_id="GEM">9 Gem</channel>
<channel lang="en" xmltv_id="9Go.au" site_id="GO">9 Go!</channel>
<channel lang="en" xmltv_id="9Life.au" site_id="9Life">9 Life</channel>
<channel lang="en" xmltv_id="9Rush.au" site_id="9Rush">9 Rush</channel>
<channel lang="en" xmltv_id="ABCKids.au" site_id="ABC4KIDS">ABC Kids</channel>
<channel lang="en" xmltv_id="ABCMe.au" site_id="ABC3">ABC ME</channel>
<channel lang="en" xmltv_id="ABCNewsAustralia.au" site_id="ABCN">ABC News</channel>
<channel lang="en" xmltv_id="ABCTV.au" site_id="ABC1">ABC TV</channel>
<channel lang="en" xmltv_id="ABCTVPlus.au" site_id="ABC2">ABC TV Plus</channel>
<channel lang="en" xmltv_id="Channel10.au" site_id="10">Channel 10</channel>
<channel lang="en" xmltv_id="Channel7.au" site_id="7">Channel 7</channel>
<channel lang="en" xmltv_id="Channel9.au" site_id="9">Channel 9</channel>
<channel lang="en" xmltv_id="NITV.au" site_id="NITV">NITV</channel>
<channel lang="en" xmltv_id="Racingcom.au" site_id="RTV">Racing.com</channel>
<channel lang="en" xmltv_id="SBS.au" site_id="SBS">SBS One</channel>
<channel lang="en" xmltv_id="SBSFood.au" site_id="SBS3">SBS Food</channel>
<channel lang="en" xmltv_id="SBSViceland.au" site_id="VICHD">SBS Viceland</channel>
<channel lang="en" xmltv_id="SBSWorldMovies.au" site_id="SBS2">SBS World Movies</channel>
<channel lang="en" xmltv_id="SBSWorldWatch.au" site_id="SBSWW">SBS World Watch</channel>
<channel lang="en" xmltv_id="SpreeTV.au" site_id="SPREE">Spree TV</channel>
<channel lang="en" xmltv_id="TVSN.au" site_id="TVSN">TSVN</channel>
<!-- <channel lang="en" xmltv_id="ABCTV.au" site_id="ABCHD">ABC TV HD</channel> -->
<!-- <channel lang="en" xmltv_id="Channel10.au" site_id="TENHD">Channel 10 HD</channel> -->
<!-- <channel lang="en" xmltv_id="Channel7.au" site_id="7HD">Channel 7 HD</channel> -->
<!-- <channel lang="en" xmltv_id="Channel9.au" site_id="9HD">Channel 9 HD</channel> -->
<!-- <channel lang="en" xmltv_id="SBS.au" site_id="SBSHD">SBS HD</channel> -->
</channels>
</site>

View File

@@ -0,0 +1,77 @@
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: 'abc.net.au',
days: 3,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url({ date }) {
return `https://epg.abctv.net.au/processed/Sydney_${date.format('YYYY-MM-DD')}.json`
},
parser({ content, channel }) {
let programs = []
const items = parseItems(content, channel)
items.forEach(item => {
programs.push({
title: item.title,
sub_title: item.episode_title,
category: item.genres,
description: item.description,
season: parseSeason(item),
episode: parseEpisode(item),
rating: parseRating(item),
icon: parseIcon(item),
start: parseTime(item.start_time),
stop: parseTime(item.end_time)
})
})
return programs
}
}
function parseItems(content, channel) {
try {
const data = JSON.parse(content)
if (!data) return []
if (!Array.isArray(data.schedule)) return []
const channelData = data.schedule.find(i => i.channel == channel.site_id)
return channelData.listing && Array.isArray(channelData.listing) ? channelData.listing : []
} catch (err) {
return []
}
}
function parseSeason(item) {
return item.series_num || null
}
function parseEpisode(item) {
return item.episode_num || null
}
function parseTime(time) {
return dayjs.tz(time, 'YYYY-MM-DD HH:mm', 'Australia/Sydney')
}
function parseIcon(item) {
return item.image_file
? `https://www.abc.net.au/tv/common/images/publicity/${item.image_file}`
: null
}
function parseRating(item) {
return item.rating
? {
system: 'ACB',
value: item.rating
}
: null
}

View File

@@ -0,0 +1,53 @@
// npx epg-grabber --config=sites/abc.net.au/abc.net.au.config.js --channels=sites/abc.net.au/abc.net.au.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./abc.net.au.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
const date = dayjs.utc('2022-12-22', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'ABC1',
xmltv_id: 'ABCTV.au'
}
it('can generate valid url', () => {
expect(url({ date })).toBe('https://epg.abctv.net.au/processed/Sydney_2022-12-22.json')
})
it('can parse response', () => {
const content = `{"date":"2022-12-22","region":"Sydney","schedule":[{"channel":"ABC1","listing":[{"consumer_advice":"Adult Themes, Drug Use, Violence","rating":"M","show_id":912747,"repeat":true,"description":"When tragedy strikes close to home, it puts head teacher Noah Taylor on a collision course with the criminals responsible. Can the Lyell team help him stop the cycle of violence?","title":"Silent Witness","crid":"ZW2178A004S00","start_time":"2022-12-22T00:46:00","series-crid":"ZW2178A","live":false,"captioning":true,"show_type":"Episode","series_num":22,"episode_title":"Lift Up Your Hearts (part Two)","length":58,"onair_title":"Silent Witness","end_time":"2022-12-22T01:44:00","genres":["Entertainment"],"image_file":"ZW2178A004S00_460.jpg","prog_slug":"silent-witness","episode_num":4}]}]}`
const result = parser({ content, channel }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
title: 'Silent Witness',
sub_title: 'Lift Up Your Hearts (part Two)',
description: `When tragedy strikes close to home, it puts head teacher Noah Taylor on a collision course with the criminals responsible. Can the Lyell team help him stop the cycle of violence?`,
category: ['Entertainment'],
rating: {
system: 'ACB',
value: 'M'
},
season: 22,
episode: 4,
icon: 'https://www.abc.net.au/tv/common/images/publicity/ZW2178A004S00_460.jpg',
start: '2022-12-21T13:46:00.000Z',
stop: '2022-12-21T14:44:00.000Z'
}
])
})
it('can handle empty guide', () => {
const result = parser(
{
content: `<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Key>processed/Sydney_2023-01-17.json</Key><RequestId>6MRHX5TJ12X39B3Y</RequestId><HostId>59rH6XRMrmkFywg8Kv58iqpI6O1fuOCuEbKa1HRRYa4buByXMBTvAhz8zuAK7X5D+ZN9ZuWxyGs=</HostId></Error>`
},
channel
)
expect(result).toMatchObject([])
})

View File

@@ -0,0 +1,63 @@
const axios = require('axios')
const dayjs = require('dayjs')
module.exports = {
site: 'allente.se',
days: 2,
url({ date, channel }) {
const [country] = channel.site_id.split('#')
return `https://cs-vcb.allente.${country}/epg/events?date=${date.format('YYYY-MM-DD')}`
},
parser({ content, channel }) {
let programs = []
const items = parseItems(content, channel)
items.forEach(item => {
if (!item.details) return
const start = dayjs(item.time)
const stop = start.add(item.details.duration, 'm')
programs.push({
title: item.title,
category: item.details.categories,
description: item.details.description,
icon: item.details.image,
season: parseSeason(item),
episode: parseEpisode(item),
start,
stop
})
})
return programs
},
async channels({ country, lang }) {
const data = await axios
.get(`https://cs-vcb.allente.${country}/epg/events?date=2021-11-17`)
.then(r => r.data)
.catch(console.log)
return data.channels.map(item => {
return {
lang,
site_id: `${country}#${item.id}`,
name: item.name
}
})
}
}
function parseItems(content, channel) {
const [_, channelId] = channel.site_id.split('#')
const data = JSON.parse(content)
if (!data || !Array.isArray(data.channels)) return []
const channelData = data.channels.find(i => i.id === channelId)
return channelData && Array.isArray(channelData.events) ? channelData.events : []
}
function parseSeason(item) {
return item.details.season || null
}
function parseEpisode(item) {
return item.details.episode || null
}

View File

@@ -0,0 +1,60 @@
// node ./scripts/channels.js --config=./sites/allente.se/allente.se.config.js --output=./sites/allente.se/allente.se_se.channels.xml --set=country:se --set=lang:sv
// node ./scripts/channels.js --config=./sites/allente.se/allente.se.config.js --output=./sites/allente.se/allente.se_fi.channels.xml --set=country:fi --set=lang:fi
// node ./scripts/channels.js --config=./sites/allente.se/allente.se.config.js --output=./sites/allente.se/allente.se_no.channels.xml --set=country:no --set=lang:no
// node ./scripts/channels.js --config=./sites/allente.se/allente.se.config.js --output=./sites/allente.se/allente.se_dk.channels.xml --set=country:dk --set=lang:da
// npx epg-grabber --config=sites/allente.se/allente.se.config.js --channels=sites/allente.se/allente.se_se.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./allente.se.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('2021-11-17', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'se#0148',
xmltv_id: 'SVT1.se'
}
it('can generate valid url', () => {
expect(url({ date, channel })).toBe('https://cs-vcb.allente.se/epg/events?date=2021-11-17')
})
it('can generate valid url for different country', () => {
const dkChannel = { site_id: 'dk#0148' }
expect(url({ date, channel: dkChannel })).toBe(
'https://cs-vcb.allente.dk/epg/events?date=2021-11-17'
)
})
it('can parse response', () => {
const content = `{"channels":[{"id":"0148","icon":"//images.ctfassets.net/989y85n5kcxs/5uT9g9pdQWRZeDPQXVI9g6/9cc44da567f591822ed645c99ecdcb64/SVT_1_black_new__2_.png","name":"SVT1 HD (T)","events":[{"id":"0086202208220710","live":false,"time":"2022-08-22T07:10:00Z","title":"Hemmagympa med Sofia","details":{"title":"Hemmagympa med Sofia","image":"https://viasatps.api.comspace.se/PS/channeldate/image/viasat.ps/21/2022-08-22/se.cs.svt1.event.A_41214031600.jpg?size=2560x1440","description":"Svenskt träningsprogram från 2021. Styrka. Sofia Åhman leder SVT:s hemmagympapass. Denna gång fokuserar vi på styrka.","season":4,"episode":1,"categories":["other"],"duration":"20"}}]}]}`
const result = parser({ content, channel }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2022-08-22T07:10:00.000Z',
stop: '2022-08-22T07:30:00.000Z',
title: `Hemmagympa med Sofia`,
category: ['other'],
description: `Svenskt träningsprogram från 2021. Styrka. Sofia Åhman leder SVT:s hemmagympapass. Denna gång fokuserar vi på styrka.`,
icon: 'https://viasatps.api.comspace.se/PS/channeldate/image/viasat.ps/21/2022-08-22/se.cs.svt1.event.A_41214031600.jpg?size=2560x1440',
season: 4,
episode: 1
}
])
})
it('can handle empty guide', () => {
const result = parser({
date,
channel,
content: `{"date":"2001-11-17","categories":[],"channels":[]}`
})
expect(result).toMatchObject([])
})

View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="allente.se">
<channels>
<channel lang="da" xmltv_id="6eren.dk" site_id="dk#568">6&apos;eren</channel>
<channel lang="da" xmltv_id="BoomerangNordic.uk" site_id="dk#0017">Boomerang Nordic</channel>
<channel lang="da" xmltv_id="Canal9.dk" site_id="dk#0368">Canal 9</channel>
<channel lang="da" xmltv_id="CartoonNetworkScandinavia.uk" site_id="dk#0028">Cartoon Network Nordic</channel>
<channel lang="da" xmltv_id="CMoreFirst.se" site_id="dk#968">C More First</channel>
<channel lang="da" xmltv_id="CMoreHits.se" site_id="dk#969">C More Hits</channel>
<channel lang="da" xmltv_id="CMoreSeries.se" site_id="dk#971">C More Series</channel>
<channel lang="da" xmltv_id="CMoreStars.se" site_id="dk#970">C More Stars</channel>
<channel lang="da" xmltv_id="DisneyChannelScandinavia.uk" site_id="dk#0037">Disney Channel Scandinavia</channel>
<channel lang="da" xmltv_id="DisneyJuniorScandinavia.uk" site_id="dk#0307">Disney Junior Scandinavia</channel>
<channel lang="da" xmltv_id="dk4.dk" site_id="dk#0376">DK 4</channel>
<channel lang="da" xmltv_id="DR1.dk" site_id="dk#452">DR 1</channel>
<channel lang="da" xmltv_id="DR2.dk" site_id="dk#0051">DR 2</channel>
<channel lang="da" xmltv_id="DRRamasjang.dk" site_id="dk#0048">DR Ramasjang</channel>
<channel lang="da" xmltv_id="EEurope.us" site_id="dk#0052">E! Europe</channel>
<channel lang="da" xmltv_id="EuronewsEnglish.fr" site_id="dk#0281">EuroNews English</channel>
<channel lang="da" xmltv_id="Eurosport2Danmark.dk" site_id="dk#0367">Eurosport 2 Danmark</channel>
<channel lang="da" xmltv_id="GodTV.uk" site_id="dk#0058">God TV Scandinavia</channel>
<channel lang="da" xmltv_id="Kanal4.dk" site_id="dk#0064">Kanal 4</channel>
<channel lang="da" xmltv_id="Kanal5.dk" site_id="dk#0065">Kanal 5</channel>
<channel lang="da" xmltv_id="MTV00s.uk" site_id="dk#0246">MTV 00s</channel>
<channel lang="da" xmltv_id="MTV80s.uk" site_id="dk#604">MTV 80s</channel>
<channel lang="da" xmltv_id="MTVGlobal.uk" site_id="dk#0076">MTV Nordic</channel>
<channel lang="da" xmltv_id="MTVHitsEurope.uk" site_id="dk#0077">MTV Hits Europe</channel>
<channel lang="da" xmltv_id="NationalGeographicDenmark.dk" site_id="dk#0317">National Geographic Danmark</channel>
<channel lang="da" xmltv_id="NationalGeographicWildDenmark.dk" site_id="dk#0082">National Geographic Wild Europe</channel>
<channel lang="da" xmltv_id="NickelodeonDenmark.dk" site_id="dk#0087">Nickelodeon Danmark</channel>
<channel lang="da" xmltv_id="NickJrScandinavia.nl" site_id="dk#0088">Nick Jr Scandinavia</channel>
<channel lang="da" xmltv_id="NicktoonsScandinavia.nl" site_id="dk#570">Nicktoons Scandinavia</channel>
<channel lang="da" xmltv_id="NRK1.no" site_id="dk#0090">NRK1</channel>
<channel lang="da" xmltv_id="ParamountNetworkDenmark.dk" site_id="dk#450">Paramount Network Danmark</channel>
<channel lang="da" xmltv_id="SFkanalen.se" site_id="dk#972">SF-kanalen</channel>
<channel lang="da" xmltv_id="SkyNewsInternational.uk" site_id="dk#0008">Sky News International</channel>
<channel lang="da" xmltv_id="SVT1.se" site_id="dk#0121">SVT 1</channel>
<channel lang="da" xmltv_id="TV2.dk" site_id="dk#0297">TV 2</channel>
<channel lang="da" xmltv_id="TV2Charlie.dk" site_id="dk#0180">TV 2 Charlie</channel>
<channel lang="da" xmltv_id="TV2Fri.dk" site_id="dk#0378">TV 2 Fri</channel>
<channel lang="da" xmltv_id="TV2News.dk" site_id="dk#0190">TV 2 News</channel>
<channel lang="da" xmltv_id="TV2Sport.dk" site_id="dk#454">TV 2 Sport</channel>
<channel lang="da" xmltv_id="TV2Zulu.dk" site_id="dk#0209">TV 2 Zulu</channel>
<channel lang="da" xmltv_id="TV3Danmark.dk" site_id="dk#0359">TV 3 Danmark</channel>
<channel lang="da" xmltv_id="TV3Max.dk" site_id="dk#0374">TV 3 Max</channel>
<channel lang="da" xmltv_id="TV3Plus.dk" site_id="dk#0248">TV3+</channel>
<channel lang="da" xmltv_id="TV3Puls.dk" site_id="dk#665">TV 3 Puls</channel>
<channel lang="da" xmltv_id="TV3SportDenmark.dk" site_id="dk#0200">TV 3 Sport</channel>
<channel lang="da" xmltv_id="TV4.se" site_id="dk#0227">TV 4</channel>
<channel lang="da" xmltv_id="VFilmAction.se" site_id="dk#0299">V Film Action</channel>
<channel lang="da" xmltv_id="VFilmFamily.se" site_id="dk#0308">V Film Family</channel>
<channel lang="da" xmltv_id="VFilmHits.se" site_id="dk#0322">V Film Hits</channel>
<channel lang="da" xmltv_id="VFilmPremiere.se" site_id="dk#0321">V Film Premiere</channel>
<channel lang="da" xmltv_id="ViasatExplore.se" site_id="dk#0358">Viasat Explore</channel>
<channel lang="da" xmltv_id="ViasatHistory.se" site_id="dk#0357">Viasat History HD</channel>
<channel lang="da" xmltv_id="ViasatNature.se" site_id="dk#0250">Viasat Nature</channel>
<channel lang="da" xmltv_id="VSeries.se" site_id="dk#0320">V Series</channel>
<channel lang="da" xmltv_id="VSportGolf.se" site_id="dk#0364">V Sport Golf</channel>
<channel lang="da" xmltv_id="VSportUltraHD.se" site_id="dk#418">V Sport Ultra HD</channel>
<channel lang="da" xmltv_id="Xee.dk" site_id="dk#707">Xee</channel>
<channel lang="en" xmltv_id="AlJazeeraEnglish.qa" site_id="dk#0344">Aljazeera English</channel>
<channel lang="en" xmltv_id="BBCWorldNewsEurope.uk" site_id="dk#0016">BBC World News Europe</channel>
<channel lang="en" xmltv_id="CNBCEurope.uk" site_id="dk#0032">CNBC Europe</channel>
<channel lang="en" xmltv_id="CNNInternationalEurope.us" site_id="dk#0033">CNN International Europe</channel>
</channels>
</site>

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="allente.se">
<channels>
<channel lang="fi" xmltv_id="BoomerangNordic.uk" site_id="fi#0017">Boomerang</channel>
<channel lang="fi" xmltv_id="CartoonNetworkScandinavia.uk" site_id="fi#0028">Cartoon Network</channel>
<channel lang="fi" xmltv_id="CNBCEurope.uk" site_id="fi#0032">CNBC</channel>
<channel lang="fi" xmltv_id="CNNInternationalEurope.us" site_id="fi#0033">CNN</channel>
<channel lang="fi" xmltv_id="DisneyChannelScandinavia.uk" site_id="fi#0037">Disney Channel</channel>
<channel lang="fi" xmltv_id="DisneyJuniorScandinavia.uk" site_id="fi#0307">Disney Junior</channel>
<channel lang="fi" xmltv_id="EEurope.us" site_id="fi#0052">E!</channel>
<channel lang="fi" xmltv_id="MTV00s.uk" site_id="fi#0246">MTV 00s</channel>
<channel lang="fi" xmltv_id="MTVGlobal.uk" site_id="fi#0080">MTV</channel>
<channel lang="fi" xmltv_id="NationalGeographicFinland.fi" site_id="fi#0084">National Geographic</channel>
<channel lang="fi" xmltv_id="NationalGeographicWildFinland.fi" site_id="fi#558">National Geographic Wild</channel>
<channel lang="fi" xmltv_id="NickJrScandinavia.nl" site_id="fi#0088">Nick Jr</channel>
<channel lang="fi" xmltv_id="TV3.se" site_id="fi#0290">TV 3 Sverige</channel>
<channel lang="fi" xmltv_id="TV6Sweden.se" site_id="fi#0360">TV 6 Sverige</channel>
<channel lang="fi" xmltv_id="VFilmAction.se" site_id="fi#0299">V Film Action</channel>
<channel lang="fi" xmltv_id="VFilmFamily.se" site_id="fi#0308">V Film Family</channel>
<channel lang="fi" xmltv_id="VFilmHits.se" site_id="fi#0322">V Film Hits</channel>
<channel lang="fi" xmltv_id="VFilmPremiere.se" site_id="fi#0321">V Film Premiere</channel>
<channel lang="fi" xmltv_id="ViasatExplore.se" site_id="fi#0252">Viasat Explore</channel>
<channel lang="fi" xmltv_id="ViasatHistory.se" site_id="fi#0263">Viasat History HD</channel>
<channel lang="fi" xmltv_id="ViasatNature.se" site_id="fi#0250">Viasat Nature</channel>
<channel lang="fi" xmltv_id="VSport1Finland.fi" site_id="fi#0159">V Sport 1 Suomi</channel>
<channel lang="fi" xmltv_id="VSport1Sweden.se" site_id="fi#0362">V Sport 1 Sverige</channel>
<channel lang="fi" xmltv_id="VSport2Finland.fi" site_id="fi#488">V Sport 2 Suomi</channel>
<channel lang="fi" xmltv_id="VSportFootball.se" site_id="fi#0269">V Sport Football</channel>
<channel lang="fi" xmltv_id="VSportGolf.se" site_id="fi#0364">V Sport Golf</channel>
<channel lang="fi" xmltv_id="VSportLive1.se" site_id="fi#0255">V Sport Live 1</channel>
<channel lang="fi" xmltv_id="VSportLive2.se" site_id="fi#0256">V Sport Live 2</channel>
<channel lang="fi" xmltv_id="VSportLive3.se" site_id="fi#0257">V Sport Live 3</channel>
<channel lang="fi" xmltv_id="VSportLive4.se" site_id="fi#0258">V Sport Live 4</channel>
<channel lang="fi" xmltv_id="VSportLive5.se" site_id="fi#0259">V Sport Live 5</channel>
<channel lang="fi" xmltv_id="VSportPlusFinland.fi" site_id="fi#0369">V Sport + Suomi</channel>
<channel lang="fi" xmltv_id="VSportPremium.se" site_id="fi#527">V Sport Premium</channel>
<channel lang="fi" xmltv_id="VSportUltraHD.se" site_id="fi#418">V Sport Ultra HD</channel>
<channel lang="fi" xmltv_id="VSportVinter.se" site_id="fi#0363">V Sport Vinter</channel>
</channels>
</site>

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="allente.se">
<channels>
<channel lang="no" xmltv_id="AlJazeeraEnglish.qa" site_id="no#0344">Aljazeera</channel>
<channel lang="no" xmltv_id="BBCWorldNewsEurope.uk" site_id="no#0016">BBC World News</channel>
<channel lang="no" xmltv_id="CartoonNetworkScandinavia.uk" site_id="no#0028">Cartoon Network</channel>
<channel lang="no" xmltv_id="CNBCEurope.uk" site_id="no#0032">CNBC</channel>
<channel lang="no" xmltv_id="CNNInternationalEurope.us" site_id="no#0033">CNN</channel>
<channel lang="no" xmltv_id="DiscoveryChannelNorway.no" site_id="no#532">Discovery Channel</channel>
<channel lang="no" xmltv_id="DisneyChannelScandinavia.uk" site_id="no#0037">Disney Channel</channel>
<channel lang="no" xmltv_id="DisneyJuniorScandinavia.uk" site_id="no#0307">Disney Junior</channel>
<channel lang="no" xmltv_id="DR2.dk" site_id="no#0051">DR 2</channel>
<channel lang="no" xmltv_id="EEurope.us" site_id="no#0052">E!</channel>
<channel lang="no" xmltv_id="EuronewsEnglish.fr" site_id="no#0281">EuroNews</channel>
<channel lang="no" xmltv_id="Eurosport1Norway.no" site_id="no#531">Eurosport 1</channel>
<channel lang="no" xmltv_id="EurosportNorway.no" site_id="no#530">Eurosport</channel>
<channel lang="no" xmltv_id="FEM.no" site_id="no#0056">FEM</channel>
<channel lang="no" xmltv_id="Kunskapskanalen.se" site_id="no#0149">Kunskapskanalen</channel>
<channel lang="no" xmltv_id="Matkanalen.no" site_id="no#565">Matkanalen</channel>
<channel lang="no" xmltv_id="MAX.no" site_id="no#533">Max</channel>
<channel lang="no" xmltv_id="MTV00s.uk" site_id="no#0246">MTV 00s</channel>
<channel lang="no" xmltv_id="MTV80s.uk" site_id="no#604">MTV 80s</channel>
<channel lang="no" xmltv_id="MTVHitsEurope.uk" site_id="no#0077">MTV Hits</channel>
<channel lang="no" xmltv_id="MTVGlobal.uk" site_id="no#0080">MTV Nordic</channel>
<channel lang="no" xmltv_id="NationalGeographicNorway.no" site_id="no#0316">National Geographic</channel>
<channel lang="no" xmltv_id="NationalGeographicWildNorway.no" site_id="no#558">National Geographic Wild</channel>
<channel lang="no" xmltv_id="NFLNetwork.us" site_id="no#556">NFL Network</channel>
<channel lang="no" xmltv_id="NickelodeonNorway.no" site_id="no#0087">Nickelodeon</channel>
<channel lang="no" xmltv_id="NickJrScandinavia.nl" site_id="no#0088">Nick Jr</channel>
<channel lang="no" xmltv_id="NicktoonsScandinavia.nl" site_id="no#570">Nicktoons</channel>
<channel lang="no" xmltv_id="NRK1.no" site_id="no#0090">NRK1</channel>
<channel lang="no" xmltv_id="NRK2.no" site_id="no#0288">NRK2</channel>
<channel lang="no" xmltv_id="NRK3.no" site_id="no#0289">NRK3</channel>
<channel lang="no" xmltv_id="SkyNewsInternational.uk" site_id="no#0008">Sky News International</channel>
<channel lang="no" xmltv_id="SVT1.se" site_id="no#0121">SVT 1</channel>
<channel lang="no" xmltv_id="SVT2.se" site_id="no#0141">SVT 2</channel>
<channel lang="no" xmltv_id="SVT24.se" site_id="no#598">SVT 24</channel>
<channel lang="no" xmltv_id="SVTBarn.se" site_id="no#0147">SVT Barn</channel>
<channel lang="no" xmltv_id="TV2.dk" site_id="no#0188">TV 2</channel>
<channel lang="no" xmltv_id="TV2.no" site_id="no#0187">TV 2</channel>
<channel lang="no" xmltv_id="TV2Livsstil.no" site_id="no#0277">TV 2 Livsstil</channel>
<channel lang="no" xmltv_id="TV2Nyhetskanalen.no" site_id="no#457">TV 2 Nyhetskanalen</channel>
<channel lang="no" xmltv_id="TV2Sport1.no" site_id="no#0199">TV 2 Sport 1</channel>
<channel lang="no" xmltv_id="TV2Sport2.no" site_id="no#0406">TV 2 Sport 2</channel>
<channel lang="no" xmltv_id="TV2SportPremium.no" site_id="no#0197">TV 2 Sport Premium</channel>
<channel lang="no" xmltv_id="TV2Zebra.no" site_id="no#0405">TV 2 Zebra</channel>
<channel lang="no" xmltv_id="TV3Danmark.dk" site_id="no#0359">TV 3 Danmark</channel>
<channel lang="no" xmltv_id="TV3Norway.no" site_id="no#0298">TV 3 Norge</channel>
<channel lang="no" xmltv_id="TV3.se" site_id="no#0222">TV 3 Sverige</channel>
<channel lang="no" xmltv_id="TV6Norway.no" site_id="no#0206">TV 6 Norge</channel>
<channel lang="no" xmltv_id="TV6Sweden.se" site_id="no#0360">TV 6 Sverige</channel>
<channel lang="no" xmltv_id="TVNorge.no" site_id="no#534">TV Norge</channel>
<channel lang="no" xmltv_id="V4.no" site_id="no#0361">V 4</channel>
<channel lang="no" xmltv_id="VFilmAction.se" site_id="no#0299">V Film Action</channel>
<channel lang="no" xmltv_id="VFilmFamily.se" site_id="no#0308">V Film Family</channel>
<channel lang="no" xmltv_id="VFilmHits.se" site_id="no#0322">V Film Hits</channel>
<channel lang="no" xmltv_id="VFilmPremiere.se" site_id="no#0321">V Film Premiere</channel>
<channel lang="no" xmltv_id="ViasatExplore.se" site_id="no#0358">Viasat Explore</channel>
<channel lang="no" xmltv_id="ViasatHistory.se" site_id="no#0357">Viasat History HD</channel>
<channel lang="no" xmltv_id="ViasatNature.se" site_id="no#0250">Viasat Nature</channel>
<channel lang="no" xmltv_id="VOX.no" site_id="no#535">Vox</channel>
<channel lang="no" xmltv_id="VSeries.se" site_id="no#0320">V Series</channel>
<channel lang="no" xmltv_id="VSport1Norway.no" site_id="no#0365">V Sport 1</channel>
<channel lang="no" xmltv_id="VSport2.no" site_id="no#608">V Sport 2</channel>
<channel lang="no" xmltv_id="VSport3.no" site_id="no#609">V Sport 3</channel>
<channel lang="no" xmltv_id="VSportGolf.se" site_id="no#0364">V Sport Golf</channel>
<channel lang="no" xmltv_id="VSportLive1.se" site_id="no#0255">V Sport Live 1</channel>
<channel lang="no" xmltv_id="VSportLive2.se" site_id="no#0256">V Sport Live 2</channel>
<channel lang="no" xmltv_id="VSportLive3.se" site_id="no#0257">V Sport Live 3</channel>
<channel lang="no" xmltv_id="VSportLive4.se" site_id="no#0258">V Sport Live 4</channel>
<channel lang="no" xmltv_id="VSportLive5.se" site_id="no#0259">V Sport Live 5</channel>
<channel lang="no" xmltv_id="VSportPlus.no" site_id="no#0271">V Sport +</channel>
<channel lang="no" xmltv_id="VSportUltraHD.se" site_id="no#418">V Sport Ultra HD</channel>
</channels>
</site>

View File

@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="allente.se">
<channels>
<channel lang="sv" xmltv_id="AlJazeeraEnglish.qa" site_id="se#0344">Aljazeera</channel>
<channel lang="sv" xmltv_id="AnimalPlanetSweden.se" site_id="se#1005">Animal Planet Sverige</channel>
<channel lang="sv" xmltv_id="ATGLive.se" site_id="se#1000">ATG Live</channel>
<channel lang="sv" xmltv_id="BBCEarthNordic.uk" site_id="se#1018">BBC Earth HD</channel>
<channel lang="sv" xmltv_id="BBCBritNordic.uk" site_id="se#1016">BBC Brit HD</channel>
<channel lang="sv" xmltv_id="BBCWorldNewsEurope.uk" site_id="se#0016">BBC World News</channel>
<channel lang="sv" xmltv_id="BloombergTVEurope.uk" site_id="se#1008">Bloomberg TV</channel>
<channel lang="sv" xmltv_id="BoomerangNordic.uk" site_id="se#0017">Boomerang</channel>
<channel lang="sv" xmltv_id="CartoonNetworkScandinavia.uk" site_id="se#0028">Cartoon Network</channel>
<channel lang="sv" xmltv_id="CMoreFirst.se" site_id="se#968">C More First</channel>
<channel lang="sv" xmltv_id="CMoreFotboll.se" site_id="se#657">C More Fotboll</channel>
<channel lang="sv" xmltv_id="CMoreHits.se" site_id="se#969">C More Hits</channel>
<channel lang="sv" xmltv_id="CMoreHockey.se" site_id="se#656">C More Hockey</channel>
<channel lang="sv" xmltv_id="CMoreLive.se" site_id="se#659">C More Live</channel>
<channel lang="sv" xmltv_id="CMoreLive2.se" site_id="se#660">C More Live 2</channel>
<channel lang="sv" xmltv_id="CMoreLive3.se" site_id="se#661">C More Live 3</channel>
<channel lang="sv" xmltv_id="CMoreLive4.se" site_id="se#662">C More Live 4</channel>
<channel lang="sv" xmltv_id="CMoreLive5.se" site_id="se#663">C More Live 5</channel>
<channel lang="sv" xmltv_id="CMoreMix.se" site_id="se#658">C More Mix</channel>
<channel lang="sv" xmltv_id="CMoreSeries.se" site_id="se#971">C More Series</channel>
<channel lang="sv" xmltv_id="CMoreStars.se" site_id="se#970">C More Stars</channel>
<channel lang="sv" xmltv_id="CNBCEurope.uk" site_id="se#0032">CNBC</channel>
<channel lang="sv" xmltv_id="CNNInternationalEurope.us" site_id="se#0033">CNN</channel>
<channel lang="sv" xmltv_id="DiscoveryChannelSweden.se" site_id="se#493">Discovery Channel Sverige</channel>
<channel lang="sv" xmltv_id="DiscoveryScienceSweden.se" site_id="se#1006">Discovery Science Sverige</channel>
<channel lang="sv" xmltv_id="DisneyChannelScandinavia.uk" site_id="se#0037">Disney Channel</channel>
<channel lang="sv" xmltv_id="DisneyJuniorScandinavia.uk" site_id="se#0307">Disney Junior</channel>
<channel lang="sv" xmltv_id="DiscoveryPlusExtra1.se" site_id="se#637">Discovery+ Extra 1</channel>
<channel lang="sv" xmltv_id="DiscoveryPlusExtra2.se" site_id="se#638">Discovery+ Extra 2</channel>
<channel lang="sv" xmltv_id="DiscoveryPlusExtra3.se" site_id="se#639">Discovery+ Extra 3</channel>
<channel lang="sv" xmltv_id="DiscoveryPlusExtra4.se" site_id="se#640">Discovery+ Extra 4</channel>
<channel lang="sv" xmltv_id="DiscoveryPlusExtra5.se" site_id="se#641">Discovery+ Extra 5</channel>
<channel lang="sv" xmltv_id="DiscoveryPlusExtra6.se" site_id="se#642">Discovery+ Extra 6</channel>
<channel lang="sv" xmltv_id="DiscoveryPlusExtra7.se" site_id="se#643">Discovery+ Extra 7</channel>
<channel lang="sv" xmltv_id="DiscoveryPlusExtra8.se" site_id="se#644">Discovery+ Extra 8</channel>
<channel lang="sv" xmltv_id="DR1.dk" site_id="se#452">DR 1</channel>
<channel lang="sv" xmltv_id="DR2.dk" site_id="se#0051">DR 2</channel>
<channel lang="sv" xmltv_id="DRRamasjang.dk" site_id="se#0048">DR Ramasjang</channel>
<channel lang="sv" xmltv_id="EEurope.us" site_id="se#0052">E!</channel>
<channel lang="sv" xmltv_id="EuronewsEnglish.fr" site_id="se#0281">EuroNews</channel>
<channel lang="sv" xmltv_id="Eurosport1.fr" site_id="se#1023">Eurosport 1</channel>
<channel lang="sv" xmltv_id="Eurosport2.fr" site_id="se#1024">Eurosport 2</channel>
<channel lang="sv" xmltv_id="Godare.se" site_id="se#722">Godare</channel>
<channel lang="sv" xmltv_id="GodTV.uk" site_id="se#0058">God TV</channel>
<channel lang="sv" xmltv_id="HistorySweden.se" site_id="se#652">History</channel>
<channel lang="sv" xmltv_id="History2Nordic.us" site_id="se#1004">H2</channel>
<channel lang="sv" xmltv_id="HorseCountryTV.uk" site_id="se#668">Horse &amp; Country TV</channel>
<channel lang="sv" xmltv_id="InvestigationDiscoverySweden.se" site_id="se#1039">Investigation Discovery Sverige</channel>
<channel lang="sv" xmltv_id="Kanal5.se" site_id="se#0279">Kanal 5</channel>
<channel lang="sv" xmltv_id="Kanal9.se" site_id="se#474">Kanal 9</channel>
<channel lang="sv" xmltv_id="Kanal11.se" site_id="se#0235">Kanal 11</channel>
<channel lang="sv" xmltv_id="Kunskapskanalen.se" site_id="se#0149">Kunskapskanalen</channel>
<channel lang="sv" xmltv_id="MTV00s.uk" site_id="se#0246">MTV 00s</channel>
<channel lang="sv" xmltv_id="MTV80s.uk" site_id="se#0099">MTV 80s</channel>
<channel lang="sv" xmltv_id="MTVHitsEurope.uk" site_id="se#0077">MTV Hits</channel>
<channel lang="sv" xmltv_id="MTVGlobal.uk" site_id="se#0080">MTV Nordic</channel>
<channel lang="sv" xmltv_id="MotorvisionTV.de" site_id="se#1009">Motorvision</channel>
<channel lang="sv" xmltv_id="NationalGeographicSweden.se" site_id="se#0084">National Geographic</channel>
<channel lang="sv" xmltv_id="NationalGeographicWildSweden.se" site_id="se#0082">National Geographic Wild</channel>
<channel lang="sv" xmltv_id="NFLNetwork.us" site_id="se#569">NFL Network</channel>
<channel lang="sv" xmltv_id="NickelodeonScandinavia.nl" site_id="se#0086">Nickelodeon</channel>
<channel lang="sv" xmltv_id="NickJrScandinavia.nl" site_id="se#0088">Nick Jr</channel>
<channel lang="sv" xmltv_id="NicktoonsScandinavia.nl" site_id="se#570">Nicktoons</channel>
<channel lang="sv" xmltv_id="NRK1.no" site_id="se#0090">NRK1</channel>
<channel lang="sv" xmltv_id="NRK2.no" site_id="se#0288">NRK2</channel>
<channel lang="sv" xmltv_id="NRK3.no" site_id="se#0289">NRK3</channel>
<channel lang="sv" xmltv_id="ParamountNetworkSweden.se" site_id="se#0034">Paramount Network</channel>
<channel lang="sv" xmltv_id="ParamountPlusMovies.se" site_id="se#1001">Paramount+ Movies</channel>
<channel lang="sv" xmltv_id="ParamountPlusSeries.se" site_id="se#1002">Paramount+ Series</channel>
<channel lang="sv" xmltv_id="SFkanalen.se" site_id="se#972">SF-kanalen</channel>
<channel lang="sv" xmltv_id="Sjuan.se" site_id="se#0232">Sjuan</channel>
<channel lang="sv" xmltv_id="SkyNewsInternational.uk" site_id="se#596">Sky News International</channel>
<channel lang="sv" xmltv_id="Sportkanalen.se" site_id="se#0325">Sportkanalen</channel>
<channel lang="sv" xmltv_id="SVT1.se" site_id="se#0148">SVT 1</channel>
<channel lang="sv" xmltv_id="SVT2.se" site_id="se#0282">SVT 2</channel>
<channel lang="sv" xmltv_id="SVT24.se" site_id="se#146">SVT 24</channel>
<channel lang="sv" xmltv_id="SVTBarn.se" site_id="se#0147">SVT Barn</channel>
<channel lang="sv" xmltv_id="TLCSweden.se" site_id="se#1038">TLC Sverige</channel>
<channel lang="sv" xmltv_id="TV2.dk" site_id="se#0297">TV 2</channel>
<channel lang="sv" xmltv_id="TV3.se" site_id="se#0290">TV 3</channel>
<channel lang="sv" xmltv_id="TV4.se" site_id="se#0227">TV 4</channel>
<channel lang="sv" xmltv_id="TV4Fakta.se" site_id="se#0228">TV 4 Fakta</channel>
<channel lang="sv" xmltv_id="TV4Film.se" site_id="se#0229">TV 4 Film</channel>
<channel lang="sv" xmltv_id="TV4Guld.se" site_id="se#0230">TV 4 Guld</channel>
<channel lang="sv" xmltv_id="TV6Sweden.se" site_id="se#0360">TV 6</channel>
<channel lang="sv" xmltv_id="TV8Sweden.se" site_id="se#666">TV 8</channel>
<channel lang="sv" xmltv_id="TV10.se" site_id="se#667">TV 10</channel>
<channel lang="sv" xmltv_id="TV12.se" site_id="se#664">TV 12</channel>
<channel lang="sv" xmltv_id="VFilmAction.se" site_id="se#0299">V Film Action</channel>
<channel lang="sv" xmltv_id="VFilmFamily.se" site_id="se#0308">V Film Family</channel>
<channel lang="sv" xmltv_id="VFilmHits.se" site_id="se#0322">V Film Hits</channel>
<channel lang="sv" xmltv_id="VFilmPremiere.se" site_id="se#0321">V Film Premiere</channel>
<channel lang="sv" xmltv_id="ViasatExplore.se" site_id="se#0358">Viasat Explore</channel>
<channel lang="sv" xmltv_id="ViasatHistory.se" site_id="se#0357">Viasat History HD</channel>
<channel lang="sv" xmltv_id="ViasatNature.se" site_id="se#0356">Viasat Nature</channel>
<channel lang="sv" xmltv_id="VSeries.se" site_id="se#0320">V Series</channel>
<channel lang="sv" xmltv_id="VSport1Sweden.se" site_id="se#0362">V Sport 1</channel>
<channel lang="sv" xmltv_id="VSportExtra.se" site_id="se#715">V Sport Extra</channel>
<channel lang="sv" xmltv_id="VSportFootball.se" site_id="se#0269">V Sport Football</channel>
<channel lang="sv" xmltv_id="VSportGolf.se" site_id="se#0364">V Sport Golf</channel>
<channel lang="sv" xmltv_id="VSportLive1.se" site_id="se#0255">V Sport Live 1</channel>
<channel lang="sv" xmltv_id="VSportLive2.se" site_id="se#0256">V Sport Live 2</channel>
<channel lang="sv" xmltv_id="VSportLive3.se" site_id="se#0257">V Sport Live 3</channel>
<channel lang="sv" xmltv_id="VSportLive4.se" site_id="se#0258">V Sport Live 4</channel>
<channel lang="sv" xmltv_id="VSportLive5.se" site_id="se#0259">V Sport Live 5</channel>
<channel lang="sv" xmltv_id="VSportMotor.se" site_id="se#0292">V Sport Motor</channel>
<channel lang="sv" xmltv_id="VSportPremium.se" site_id="se#527">V Sport Premium</channel>
<channel lang="sv" xmltv_id="VSportUltraHD.se" site_id="se#418">V Sport Ultra HD</channel>
<channel lang="sv" xmltv_id="VSportVinter.se" site_id="se#0363">V Sport Vinter</channel>
</channels>
</site>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="andorradifusio.ad">
<channels>
<channel lang="ca" xmltv_id="AndorraTV.ad" site_id="atv">Andorra TV</channel>
</channels>
</site>

View File

@@ -0,0 +1,66 @@
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
require('dayjs/locale/ca')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: 'andorradifusio.ad',
days: 2,
url({ channel }) {
return `https://www.andorradifusio.ad/programacio/${channel.site_id}`
},
parser({ content, date }) {
const programs = []
const items = parseItems(content, date)
items.forEach(item => {
const prev = programs[programs.length - 1]
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(1, 'h')
programs.push({
title: item.title,
start,
stop
})
})
return programs
}
}
function parseStart(item, date) {
const dateString = `${date.format('MM/DD/YYYY')} ${item.time}`
return dayjs.tz(dateString, 'MM/DD/YYYY HH:mm', 'Europe/Madrid')
}
function parseItems(content, date) {
const $ = cheerio.load(content)
const dayOfWeek = dayjs(date).locale('ca').format('dddd').toLowerCase()
const column = $('.programacio-dia > h3')
.filter((i, el) => $(el).text().startsWith(dayOfWeek))
.first()
.parent()
const items = []
const titles = column.find(`p`).toArray()
column.find(`h4`).each((i, time) => {
items.push({
time: $(time).text(),
title: $(titles[i]).text()
})
})
return items
}

View File

@@ -0,0 +1,54 @@
// npx epg-grabber --config=sites/andorradifusio.ad/andorradifusio.ad.config.js --channels=sites/andorradifusio.ad/andorradifusio.ad.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./andorradifusio.ad.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('2021-11-24', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'atv',
xmltv_id: 'AndorraTV.ad'
}
it('can generate valid url', () => {
expect(url({ channel })).toBe('https://www.andorradifusio.ad/programacio/atv')
})
it('can parse response', () => {
const content = `<!DOCTYPE html><html lang="ca"> <head></head> <body id="rtvabody"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div class="programacio-dia"> <h3>dimecres <span class="dia">24 nov.</span></h3> <h4>07:00</h4> <p>Club Piolet</p><h4>23:30</h4> <p>Informatiu vespre</p><h4>01:00</h4> <p>&#192;rea Andorra Difusi&#243;</p></div><div class="programacio-dia"> <h3>dijous <span class="dia">25 nov.</span></h3> <h4>07:00</h4> <p>Club Piolet</p></div></div></div></div></body></html>`
const result = parser({ content, date }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2021-11-24T06:00:00.000Z',
stop: '2021-11-24T22:30:00.000Z',
title: `Club Piolet`
},
{
start: '2021-11-24T22:30:00.000Z',
stop: '2021-11-25T00:00:00.000Z',
title: `Informatiu vespre`
},
{
start: '2021-11-25T00:00:00.000Z',
stop: '2021-11-25T01:00:00.000Z',
title: `Àrea Andorra Difusió`
}
])
})
it('can handle empty guide', () => {
const result = parser({
date,
channel,
content: `<!DOCTYPE html><html><head></head><body></body></html>`
})
expect(result).toMatchObject([])
})

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="arianaafgtv.com">
<channels>
<channel lang="en" xmltv_id="ArianaAfghanistanInternationalTV.us" site_id="#">Ariana Afghanistan International TV</channel>
</channels>
</site>

View File

@@ -0,0 +1,84 @@
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: 'arianaafgtv.com',
days: 2,
url() {
return `https://www.arianaafgtv.com/index.html`
},
parser({ content, date }) {
const programs = []
const items = parseItems(content, date)
items.forEach(item => {
const title = item.title
const start = parseStart(item, date)
const stop = parseStop(item, date)
programs.push({
title,
start,
stop
})
})
return programs
}
}
function parseStop(item, date) {
const time = `${date.format('MM/DD/YYYY')} ${item.end.toUpperCase()}`
return dayjs.tz(time, 'MM/DD/YYYY hh:mm A', 'Asia/Kabul')
}
function parseStart(item, date) {
const time = `${date.format('MM/DD/YYYY')} ${item.start.toUpperCase()}`
return dayjs.tz(time, 'MM/DD/YYYY hh:mm A', 'Asia/Kabul')
}
function parseItems(content, date) {
const $ = cheerio.load(content)
const dayOfWeek = date.format('dddd')
const column = $('.H4')
.filter((i, el) => {
return $(el).text() === dayOfWeek
})
.first()
.parent()
const rows = column
.find('.Paragraph')
.map((i, el) => {
return $(el).html()
})
.toArray()
.map(r => (r === '&nbsp;' ? '|' : r))
.join(' ')
.split('|')
const items = []
rows.forEach(row => {
row = row.trim()
if (row) {
const found = row.match(/(\d+(|:\d+)(a|p)m-\d+(|:\d+)(a|p)m)/gi)
if (!found) return
const time = found[0]
let start = time.match(/(\d+(|:\d+)(a|p)m)-/i)[1]
start = dayjs(start.toUpperCase(), ['hh:mmA', 'h:mmA', 'hA']).format('hh:mm A')
let end = time.match(/-(\d+(|:\d+)(a|p)m)/i)[1]
end = dayjs(end.toUpperCase(), ['hh:mmA', 'h:mmA', 'hA']).format('hh:mm A')
const title = row.replace(time, '').replace('&nbsp;', '').trim()
items.push({ start, end, title })
}
})
return items
}

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="arianatelevision.com">
<channels>
<channel lang="en" xmltv_id="ArianaTVNational.af" site_id="#">Ariana TV National</channel>
</channels>
</site>

View File

@@ -0,0 +1,69 @@
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: 'arianatelevision.com',
days: 2,
url: `https://www.arianatelevision.com/program-schedule/`,
parser({ content, date }) {
const programs = []
const items = parseItems(content, date)
items.forEach(item => {
const prev = programs[programs.length - 1]
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: item.title,
start,
stop
})
})
return programs
}
}
function parseStart(item, date) {
const time = `${date.format('YYYY-MM-DD')} ${item.start}`
return dayjs.tz(time, 'YYYY-MM-DD H:mm', 'Asia/Kabul')
}
function parseItems(content, date) {
const items = []
const col = date.day()
const $ = cheerio.load(content)
const settings = $('#jtrt_table_settings_508').text()
if (!settings) return []
const data = JSON.parse(settings)
if (!data || !Array.isArray(data)) return []
let rows = data[0]
rows.shift()
const output = []
rows.forEach(row => {
let day = date.day() + 2
if (day > 7) day = 1
if (!row[0] || !row[day]) return
output.push({
start: row[0].trim(),
title: row[day].trim()
})
})
return output
}

View File

@@ -0,0 +1,59 @@
// npx epg-grabber --config=sites/arianatelevision.com/arianatelevision.com.config.js --channels=sites/arianatelevision.com/arianatelevision.com.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./arianatelevision.com.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('2021-11-27', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '#',
xmltv_id: 'ArianaTVNational.af'
}
it('can generate valid url', () => {
expect(url).toBe('https://www.arianatelevision.com/program-schedule/')
})
it('can parse response', () => {
const content = `<!DOCTYPE html><html><head></head><body><textarea data-jtrt-table-id="508" id="jtrt_table_settings_508" cols="30" rows="10">[[["Start","Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","",""],["7:00","City Report","ICC T20 Highlights","ICC T20 Highlights","ICC T20 Highlights","ICC T20 Highlights","ICC T20 Highlights","ICC T20 Highlights","",""],["7:30","ICC T20 Highlights","Sport ","Sport ","Sport ","Sport ","Sport ","Sport ","",""],["15:00","ICC T20 World Cup","ICC T20 World Cup","ICC T20 World Cup","ICC T20 World Cup","ICC T20 World Cup","ICC T20 World Cup","ICC T20 World Cup","",""],["6:30","Quran and Hadis ","Falah","Falah","Falah","Falah","Falah","Falah","",""],["","\\n","","","","","","","",""]]]</textarea></body></html>`
const result = parser({ content, date }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2021-11-27T02:30:00.000Z',
stop: '2021-11-27T03:00:00.000Z',
title: `City Report`
},
{
start: '2021-11-27T03:00:00.000Z',
stop: '2021-11-27T10:30:00.000Z',
title: `ICC T20 Highlights`
},
{
start: '2021-11-27T10:30:00.000Z',
stop: '2021-11-28T02:00:00.000Z',
title: `ICC T20 World Cup`
},
{
start: '2021-11-28T02:00:00.000Z',
stop: '2021-11-28T02:30:00.000Z',
title: `Quran and Hadis`
}
])
})
it('can handle empty guide', () => {
const result = parser({
date,
channel,
content: `<!DOCTYPE html><html><head></head><body><textarea data-jtrt-table-id="508" id="jtrt_table_settings_508" cols="30" rows="10"></textarea></body></html>`
})
expect(result).toMatchObject([])
})

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="artonline.tv">
<channels>
<channel lang="ar" xmltv_id="ARTAflam1.sa" site_id="">ART Aflam 1</channel>
<channel lang="ar" xmltv_id="ARTAflam2.sa" site_id="Aflam2">ART Aflam 2</channel>
<channel lang="ar" xmltv_id="ARTCinema.sa" site_id="Cinema">ART Cinema</channel>
<channel lang="ar" xmltv_id="ARTHekayat.sa" site_id="Hekayat">ART Hekayat</channel>
<channel lang="ar" xmltv_id="ARTHekayat2.sa" site_id="Hekayat2">ART Hekayat 2</channel>
</channels>
</site>

View File

@@ -0,0 +1,68 @@
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0
const customParseFormat = require('dayjs/plugin/customParseFormat')
const timezone = require('dayjs/plugin/timezone')
const utc = require('dayjs/plugin/utc')
const dayjs = require('dayjs')
dayjs.extend(customParseFormat)
dayjs.extend(timezone)
dayjs.extend(utc)
module.exports = {
site: 'artonline.tv',
days: 2,
url: function ({ channel }) {
return `https://www.artonline.tv/Home/Tvlist${channel.site_id}`
},
request: {
method: 'POST',
headers: {
'content-type': 'application/x-www-form-urlencoded'
},
data: function ({ date }) {
const diff = date.diff(dayjs.utc().startOf('d'), 'd')
const params = new URLSearchParams()
params.append('objId', diff)
return params
}
},
parser: function ({ content }) {
const programs = []
if (!content) return programs
const items = JSON.parse(content)
items.forEach(item => {
const icon = parseIcon(item)
const start = parseStart(item)
const duration = parseDuration(item)
const stop = start.add(duration, 's')
programs.push({
title: item.title,
description: item.description,
icon,
start,
stop
})
})
return programs
}
}
function parseStart(item) {
const [_, M, D, YYYY] = item.adddate.match(/(\d+)\/(\d+)\/(\d+) /)
const [HH, mm] = item.start_Time.split(':')
return dayjs.tz(`${YYYY}-${M}-${D}T${HH}:${mm}:00`, 'YYYY-M-DTHH:mm:ss', 'Asia/Riyadh')
}
function parseDuration(item) {
const [__, HH, mm, ss] = item.duration.match(/(\d+):(\d+):(\d+)/)
return parseInt(HH) * 3600 + parseInt(mm) * 60 + parseInt(ss)
}
function parseIcon(item) {
return item.thumbnail ? `https://www.artonline.tv${item.thumbnail}` : null
}

View File

@@ -0,0 +1,66 @@
// npx epg-grabber --config=sites/artonline.tv/artonline.tv.config.js --channels=sites/artonline.tv/artonline.tv.channels.xml --output=guide.xml --days=2
const { parser, url, request } = require('./artonline.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 channel = {
site_id: 'Aflam2',
xmltv_id: 'ARTAflam2.sa'
}
it('can generate valid url', () => {
expect(url({ channel })).toBe('https://www.artonline.tv/Home/TvlistAflam2')
})
it('can generate valid request method', () => {
expect(request.method).toBe('POST')
})
it('can generate valid request headers', () => {
expect(request.headers).toMatchObject({
'content-type': 'application/x-www-form-urlencoded'
})
})
it('can generate valid request data for today', () => {
const date = dayjs.utc().startOf('d')
const data = request.data({ date })
expect(data.get('objId')).toBe('0')
})
it('can generate valid request data for tomorrow', () => {
const date = dayjs.utc().startOf('d').add(1, 'd')
const data = request.data({ date })
expect(data.get('objId')).toBe('1')
})
it('can parse response', () => {
const content = `[{"id":158963,"eventid":null,"duration":"01:34:00","lang":"Arabic","title":"الراقصه و السياسي","description":"تقرر الراقصه سونيا انشاء دار حضانه للأطفال اليتامى و عندما تتقدم بمشورعها للمسئول يرفض فتتحداه ، تلجأ للوزير عبد الحميد رأفت تربطه بها علاقة قديمة ، يخشى على مركزه و يرفض مساعدتها فتقرر كتابة مذكراتها بمساعدة أحد الصحفيين ، يتخوف عبد الحميد و المسئولين ثم يفاجأ عبد الحميد بحصول سونيا على الموافقه للمشورع و البدء في تنفيذه و ذلك لعلاقتها بأحد كبار المسئولين .","thumbnail":"/UploadImages/Channel/ARTAFLAM1/03/AlRaqesaWaAlSeyasi.jpg","image":"0","start_Time":"00:30","adddate":"3/4/2022 12:00:00 AM","repeat1":null,"iD_genre":0,"iD_Show_Type":0,"iD_Channel":77,"iD_country":0,"iD_rating":0,"end_time":"02:04","season_Number":0,"epoisode_Number":0,"hasCatchup":0,"cmsid":0,"containerID":0,"imagePath":"../../UploadImages/Channel/ARTAFLAM1/3/","youtube":"0","published_at":"0","directed_by":"0","composition":"0","cast":"0","timeShow":null,"short_description":"تقرر الراقصه سونيا انشاء دار حضانه للأطفال اليتامى و عندما تتقدم بمشورعها للمسئول يرفض فتتحداه ، تلجأ للوزير عبد الحميد رأفت تربطه بها علاقة قديمة ، يخشى على مركزه و يرفض مساعدتها فتقرر كتابة مذكراتها بمساعدة أحد الصحفيين ، يتخوف عبد الحميد و المسئولين ثم يفاجأ عبد الحميد بحصول سونيا على الموافقه للمشورع و البدء في تنفيذه و ذلك لعلاقتها بأحد كبار المسئولين .","seOdescription":null,"tagseo":null,"channel_name":null,"pathimage":null,"pathThumbnail":null}]`
const result = parser({ content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
start: '2022-03-03T21:30:00.000Z',
stop: '2022-03-03T23:04:00.000Z',
title: 'الراقصه و السياسي',
description:
'تقرر الراقصه سونيا انشاء دار حضانه للأطفال اليتامى و عندما تتقدم بمشورعها للمسئول يرفض فتتحداه ، تلجأ للوزير عبد الحميد رأفت تربطه بها علاقة قديمة ، يخشى على مركزه و يرفض مساعدتها فتقرر كتابة مذكراتها بمساعدة أحد الصحفيين ، يتخوف عبد الحميد و المسئولين ثم يفاجأ عبد الحميد بحصول سونيا على الموافقه للمشورع و البدء في تنفيذه و ذلك لعلاقتها بأحد كبار المسئولين .',
icon: 'https://www.artonline.tv/UploadImages/Channel/ARTAFLAM1/03/AlRaqesaWaAlSeyasi.jpg'
}
])
})
it('can handle empty guide', () => {
const result = parser({
content: ''
})
expect(result).toMatchObject([])
})

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>PYWWJ0TM0RSWSX09</RequestId><HostId>WU2+m2j4IPZtj2j5k2C9NB41iM2QaK+LqVlBk2kLCNDrddFBXPkjCFLBiALXw8xTPF4xIPTZOWs=</HostId></Error>

View File

@@ -0,0 +1,27 @@
{
"responseCode": 200,
"responseMessage": "Linear Asset Detail",
"response": {
"eventId": "40609678",
"channelId": 425,
"channelStbNumber": "305",
"isHd": true,
"imageUrl": "https://s3-ap-southeast-1.amazonaws.com/ams-astro/production/images/1035X328883.jpg",
"title": "Triumph in the Skies Ep06",
"programmeId": "328827",
"episodeId": "328883",
"datetime": "2022-10-31 00:10:00.0",
"datetimeInUtc": "2022-10-30 16:10:00.0",
"duration": "00:52:00",
"siTrafficKey": "1:10000526:47979653",
"certification": "U",
"shortSynopsis": "This classic drama depicts the many aspects of two complicated relationships set against an airline company. Will those involved ever find true love?",
"longSynopsis": null,
"cast": "Francis Ng Chun Yu,Joe Ma Tak Chung,Flora Chan Wai San",
"director": "Joe Ma Tak Chung",
"filter": "Filter/71",
"subFilter": [
"Filter/24"
]
}
}

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="astro.com.my">
<channels>
<channel lang="ms" xmltv_id="8TV.my" site_id="115">8TV</channel>
<!-- <channel lang="ms" xmltv_id="" site_id="461">ABC</channel> -->
<channel lang="ms" xmltv_id="AdithyaTV.in" site_id="67">Adithya TV</channel>
<channel lang="ms" xmltv_id="AlJazeeraEnglish.qa" site_id="374">Aljazeera</channel>
<channel lang="ms" xmltv_id="AnimalPlanetMalaysia.my" site_id="377">Animal Planet</channel>
<channel lang="ms" xmltv_id="AsianFoodNetwork.sg" site_id="91">Asian Food Network</channel>
<channel lang="ms" xmltv_id="AstroAEC.my" site_id="182">Astro AEC</channel>
<channel lang="ms" xmltv_id="AstroAOD311.my" site_id="172">Astro AOD 311</channel>
<channel lang="ms" xmltv_id="AstroAOD352.my" site_id="87">Astro AOD 352</channel>
<channel lang="ms" xmltv_id="AstroAOD353.my" site_id="114">Astro AOD 353</channel>
<channel lang="ms" xmltv_id="AstroAOD354.my" site_id="65">Astro AOD 354</channel>
<channel lang="ms" xmltv_id="AstroAOD355.my" site_id="66">Astro AOD 355</channel>
<channel lang="ms" xmltv_id="AstroArena.my" site_id="235">Astro Arena</channel>
<channel lang="ms" xmltv_id="AstroArena2.my" site_id="457">Astro Arena 2</channel>
<channel lang="ms" xmltv_id="AstroAura.my" site_id="400">Astro Aura</channel>
<channel lang="ms" xmltv_id="AstroAwani.my" site_id="436">Astro Awani</channel>
<channel lang="ms" xmltv_id="AstroBollyOneHD.my" site_id="178">Astro BollyOne HD</channel>
<channel lang="ms" xmltv_id="AstroBoxOfficeTayanganHebat.my" site_id="176">Astro Box Office Tayangan Hebat</channel>
<channel lang="ms" xmltv_id="AstroBoxOfficeThangathirai.my" site_id="177">Astro Box Office Thangathirai</channel>
<channel lang="ms" xmltv_id="AstroCeria.my" site_id="386">Astro Ceria</channel>
<channel lang="ms" xmltv_id="AstroCh100.my" site_id="471">Gemilang</channel>
<channel lang="ms" xmltv_id="AstroCitra.my" site_id="301">Astro Citra</channel>
<channel lang="ms" xmltv_id="AstroCricket.my" site_id="197">Astro Cricket</channel>
<channel lang="ms" xmltv_id="AstroHuaHeeDai.my" site_id="162">Astro Hua Hee Dai</channel>
<channel lang="ms" xmltv_id="AstroOasis.my" site_id="315">Astro Oasis</channel>
<channel lang="ms" xmltv_id="AstroPrima.my" site_id="316">Astro Prima</channel>
<channel lang="ms" xmltv_id="AstroQuanJiaHD.my" site_id="158">Astro Quan Jia HD</channel>
<channel lang="ms" xmltv_id="AstroRania.my" site_id="401">Astro Rania</channel>
<channel lang="ms" xmltv_id="AstroRia.my" site_id="193">Astro Ria</channel>
<channel lang="ms" xmltv_id="AstroShuangXing.my" site_id="183">Astro Shuang Xing</channel>
<channel lang="ms" xmltv_id="AstroSuperSport.my" site_id="154">Astro SuperSport</channel>
<channel lang="ms" xmltv_id="AstroSuperSport2.my" site_id="138">Astro SuperSport 2</channel>
<channel lang="ms" xmltv_id="AstroSuperSport3.my" site_id="164">Astro SuperSport 3</channel>
<channel lang="ms" xmltv_id="AstroSuperSport4.my" site_id="241">Astro SuperSport 4</channel>
<channel lang="ms" xmltv_id="AstroSuperSport5.my" site_id="455">Astro SuperSport 5</channel>
<channel lang="ms" xmltv_id="AstroTutorTVPT3.my" site_id="410">Astro Tutor TV PT3</channel>
<channel lang="ms" xmltv_id="AstroTutorTVSPM.my" site_id="411">Astro Tutor TV SPM</channel>
<channel lang="ms" xmltv_id="AstroTutorTVUPSR.my" site_id="412">Astro Tutor TV UPSR</channel>
<channel lang="ms" xmltv_id="AstroUHD.my" site_id="308">Astro UHD</channel>
<channel lang="ms" xmltv_id="AstroVaanavil.my" site_id="397">Astro Vaanavil</channel>
<channel lang="ms" xmltv_id="AstroVellithirai.my" site_id="399">Astro Vellithirai</channel>
<channel lang="ms" xmltv_id="AstroVinmeenHD.my" site_id="167">Astro Vinmeen HD</channel>
<channel lang="ms" xmltv_id="AstroWahLaiToi.my" site_id="129">Astro Wah Lai Toi</channel>
<channel lang="ms" xmltv_id="AstroWarna.my" site_id="272">Astro Warna</channel>
<channel lang="ms" xmltv_id="AstroXiaoTaiYang.my" site_id="387">Astro Xiao Tai Yang</channel>
<channel lang="ms" xmltv_id="AwesomeTV.my" site_id="433">Awesome TV</channel>
<channel lang="ms" xmltv_id="AXNMalaysia.my" site_id="131">AXN</channel>
<channel lang="ms" xmltv_id="BBCEarthAsia.uk" site_id="452">BBC Earth</channel>
<channel lang="ms" xmltv_id="BBCFirstAsia.uk" site_id="458">BBC First</channel>
<channel lang="ms" xmltv_id="BBCLifestyleAsia.uk" site_id="451">BBC Lifestyle</channel>
<channel lang="ms" xmltv_id="BBCWorldNewsAsiaPacific.uk" site_id="366">BBC World News</channel>
<channel lang="ms" xmltv_id="beINSports.qa" site_id="236">beIN Sports HD</channel>
<channel lang="ms" xmltv_id="beINSports2.qa" site_id="466">beIN Sports 2</channel>
<channel lang="ms" xmltv_id="beINSports3.qa" site_id="313">beIN Sports 3</channel>
<channel lang="ms" xmltv_id="BernamaTV.my" site_id="160">Bernama TV</channel>
<channel lang="ms" xmltv_id="BloombergTVAsia.hk" site_id="422">Bloomberg TV</channel>
<channel lang="ms" xmltv_id="Boo.my" site_id="251">Boo</channel>
<channel lang="ms" xmltv_id="BoomerangSoutheastAsia.us" site_id="430">Boomerang</channel>
<channel lang="ms" xmltv_id="CartoonNetworkAsia.sg" site_id="371">Cartoon Network HD</channel>
<channel lang="ms" xmltv_id="CCTV4Asia.cn" site_id="385">CCTV 4</channel>
<channel lang="ms" xmltv_id="CCM.hk" site_id="187">Celestial Classic Movies</channel>
<channel lang="ms" xmltv_id="CelestialMoviesMalaysia.my" site_id="134">Celestial Movies</channel>
<channel lang="ms" xmltv_id="CGTN.cn" site_id="426">CGTN</channel>
<channel lang="ms" xmltv_id="ChuttiTVMalaysia.my" site_id="51">Chutti TV</channel>
<channel lang="ms" xmltv_id="CinemaxAsia.sg" site_id="337">Cinemax</channel>
<channel lang="ms" xmltv_id="CNA.sg" site_id="295">CNA</channel>
<channel lang="ms" xmltv_id="CNBCAsia.sg" site_id="423">CNBC Asia-Pacific</channel>
<channel lang="ms" xmltv_id="CNNInternationalAsiaPacific.hk" site_id="336">CNN</channel>
<channel lang="ms" xmltv_id="Colors.in" site_id="365">Colors</channel>
<channel lang="ms" xmltv_id="ColorsTamil.in" site_id="298">Colors Tamil</channel>
<channel lang="ms" xmltv_id="CrimePlusInvestigationAsia.sg" site_id="369">Crime + Investigation</channel>
<channel lang="ms" xmltv_id="CTiAsia.tw" site_id="424">CTI TV</channel>
<channel lang="ms" xmltv_id="DiscoveryAsia.sg" site_id="136">Discovery Asia</channel>
<channel lang="ms" xmltv_id="DiscoveryChannelIndonesia.id" site_id="376">Discovery Channel</channel>
<channel lang="ms" xmltv_id="DMAXSoutheastAsia.sg" site_id="367">DMAX</channel>
<channel lang="ms" xmltv_id="DWEnglish.de" site_id="287">DW English</channel>
<channel lang="ms" xmltv_id="eGGNetwork.my" site_id="206">Egg Network</channel>
<channel lang="ms" xmltv_id="EurosportAsia.fr" site_id="339">Eurosport</channel>
<channel lang="ms" xmltv_id="FoodNetworkAsia.sg" site_id="153">Food Network</channel>
<channel lang="ms" xmltv_id="France24English.fr" site_id="289">France 24 English</channel>
<channel lang="ms" xmltv_id="GolfChannelMalaysia.my" site_id="189">Golf Channel</channel>
<channel lang="ms" xmltv_id="GoShopChinese.my" site_id="202">Go Shop Chinese</channel>
<channel lang="ms" xmltv_id="GoShopMalay111.my" site_id="403">Go Shop Malay 111</channel>
<channel lang="ms" xmltv_id="GoShopMalay118.my" site_id="192">Go Shop Malay 118</channel>
<channel lang="ms" xmltv_id="GoShopMalay120.my" site_id="294">Go Shop Malay 120</channel>
<channel lang="ms" xmltv_id="HBOAsia.sg" site_id="143">HBO</channel>
<channel lang="ms" xmltv_id="HBOFamilyAsia.sg" site_id="450">HBO Family</channel>
<channel lang="ms" xmltv_id="HBOHitsAsia.sg" site_id="449">HBO Hits</channel>
<channel lang="ms" xmltv_id="HGTVAsia.us" site_id="198">HGTV</channel>
<channel lang="ms" xmltv_id="HistoryAsia.us" site_id="144">History</channel>
<channel lang="ms" xmltv_id="HITS.sg" site_id="179">Hits</channel>
<channel lang="ms" xmltv_id="HITSMovies.sg" site_id="391">Hits Movies</channel>
<channel lang="ms" xmltv_id="iQIYI.cn" site_id="355">Iqiyi</channel>
<channel lang="ms" xmltv_id="KBSWorld.kr" site_id="161">KBS World</channel>
<channel lang="ms" xmltv_id="KIX.hk" site_id="157">Kix</channel>
<channel lang="ms" xmltv_id="KPlus.sg" site_id="266">K+</channel>
<channel lang="ms" xmltv_id="LifetimeAsia.us" site_id="447">Lifetime</channel>
<channel lang="ms" xmltv_id="MoonbugKids.uk" site_id="465">Moonbug Kids</channel>
<channel lang="ms" xmltv_id="MTVAsia.sg" site_id="420">MTV</channel>
<channel lang="ms" xmltv_id="NatGeoPeopleMalaysia.my" site_id="199">Nat Geo People</channel>
<channel lang="ms" xmltv_id="NationalGeographicMalaysia.my" site_id="140">National Geographic</channel>
<channel lang="ms" xmltv_id="NationalGeographicWildMalaysia.my" site_id="322">National Geographic Wild</channel>
<channel lang="ms" xmltv_id="NHKWorldPremium.jp" site_id="428">NHK World Premium</channel>
<channel lang="ms" xmltv_id="NickelodeonAsia.sg" site_id="370">Nickelodeon</channel>
<channel lang="ms" xmltv_id="NickJrAsia.sg" site_id="392">Nick Jr</channel>
<channel lang="ms" xmltv_id="NjoiTV.my" site_id="302">Njoi TV</channel>
<channel lang="ms" xmltv_id="NTV7.my" site_id="93">NTV 7</channel>
<channel lang="ms" xmltv_id="OneTVAsia.sg" site_id="133">One</channel>
<channel lang="ms" xmltv_id="ParamountNetworkMalaysia.my" site_id="448">Paramount Network</channel>
<channel lang="ms" xmltv_id="PhoenixChineseChannel.hk" site_id="382">Phoenix Chinese Channel</channel>
<channel lang="ms" xmltv_id="PhoenixInfoNewsChannel.hk" site_id="43">Phoenix InfoNews Channel</channel>
<channel lang="ms" xmltv_id="PremierSports1Asia.ie" site_id="393">Premier Sports</channel>
<channel lang="ms" xmltv_id="PRIMEtime.my" site_id="453">PRIMEtime</channel>
<channel lang="ms" xmltv_id="TV1.my" site_id="395">RTM TV 1</channel>
<channel lang="ms" xmltv_id="TV2.my" site_id="396">RTM TV2</channel>
<channel lang="ms" xmltv_id="Okey.my" site_id="97">RTM TV Okey</channel>
<channel lang="ms" xmltv_id="ShowcaseMovies.my" site_id="454">Showcase Movies</channel>
<channel lang="ms" xmltv_id="SkyNews.uk" site_id="155">Sky News UK</channel>
<channel lang="ms" xmltv_id="SPOTV.kr" site_id="456">SPOTV</channel>
<channel lang="ms" xmltv_id="StarVijay.in" site_id="357">Star Vijay</channel>
<channel lang="ms" xmltv_id="SunMusic.in" site_id="417">Sun Music</channel>
<channel lang="ms" xmltv_id="SunTVMalaysia.my" site_id="358">Sun TV</channel>
<channel lang="ms" xmltv_id="TADAA.my" site_id="432">Ta-Daa!</channel>
<channel lang="ms" xmltv_id="TLCSoutheastAsia.sg" site_id="338">TLC</channel>
<channel lang="ms" xmltv_id="TV3.my" site_id="106">TV 3</channel>
<channel lang="ms" xmltv_id="TV9.my" site_id="48">TV 9</channel>
<channel lang="ms" xmltv_id="TVAlhijrah.my" site_id="149">TV Alhijrah</channel>
<channel lang="ms" xmltv_id="TVBClassic.hk" site_id="425">TVB Classic</channel>
<channel lang="ms" xmltv_id="EntertainmentNews.hk" site_id="427">TVB Entertainment News</channel>
<channel lang="ms" xmltv_id="Jade.hk" site_id="203">TVB Jade</channel>
<channel lang="ms" xmltv_id="TVBSAsia.tw" site_id="384">TVBS Asia</channel>
<channel lang="ms" xmltv_id="TVBXingHe.hk" site_id="383">TVB Xing He</channel>
<channel lang="ms" xmltv_id="tvNAsia.hk" site_id="190">TVN HD</channel>
<channel lang="ms" xmltv_id="tvNMoviesAsia.hk" site_id="274">TVN Movies</channel>
<channel lang="ms" xmltv_id="TVS.my" site_id="429">TVS</channel>
<channel lang="ms" xmltv_id="WarnerTVAsia.us" site_id="270">Warner TV</channel>
<channel lang="ms" xmltv_id="WWENetwork.us" site_id="194">WWE Network</channel>
<channel lang="ms" xmltv_id="ZeeTamil.in" site_id="297">Zee Tamil</channel>
</channels>
</site>

View File

@@ -0,0 +1,116 @@
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
const API_ENDPOINT = `https://contenthub-api.eco.astro.com.my`
module.exports = {
site: 'astro.com.my',
days: 2,
url: function ({ channel }) {
return `${API_ENDPOINT}/channel/${channel.site_id}.json`
},
async parser({ content, date }) {
const programs = []
const items = parseItems(content, date)
for (let item of items) {
const start = dayjs.utc(item.datetimeInUtc)
const duration = parseDuration(item.duration)
const stop = start.add(duration, 's')
const details = await loadProgramDetails(item)
programs.push({
title: item.title,
sub_title: item.subtitles,
description: details.longSynopsis || details.shortSynopsis,
actors: parseList(details.cast),
directors: parseList(details.director),
icon: details.imageUrl,
rating: parseRating(details),
categories: parseCategories(details),
episode: parseEpisode(item),
start: start,
stop: stop
})
}
return programs
}
}
function parseEpisode(item) {
const [_, number] = item.title.match(/Ep(\d+)$/) || [null, null]
return number ? parseInt(number) : null
}
function parseList(list) {
return typeof list === 'string' ? list.split(',') : []
}
function parseRating(details) {
return details.certification
? {
system: 'LPF',
value: details.certification
}
: null
}
function parseItems(content, date) {
try {
const data = JSON.parse(content)
const schedules = data.response.schedule
return schedules[date.format('YYYY-MM-DD')] || []
} catch (e) {
return []
}
}
function parseDuration(duration) {
const match = duration.match(/(\d{2}):(\d{2}):(\d{2})/)
const hours = parseInt(match[1])
const minutes = parseInt(match[2])
const seconds = parseInt(match[3])
return hours * 3600 + minutes * 60 + seconds
}
function parseCategories(details) {
const genres = {
'filter/2': 'Action',
'filter/4': 'Anime',
'filter/12': 'Cartoons',
'filter/16': 'Comedy',
'filter/19': 'Crime',
'filter/24': 'Drama',
'filter/25': 'Educational',
'filter/36': 'Horror',
'filter/39': 'Live Action',
'filter/55': 'Pre-school',
'filter/56': 'Reality',
'filter/60': 'Romance',
'filter/68': 'Talk Show',
'filter/69': 'Thriller',
'filter/72': 'Variety',
'filter/75': 'Series',
'filter/100': 'Others (Children)'
}
return Array.isArray(details.subFilter)
? details.subFilter.map(g => genres[g.toLowerCase()]).filter(Boolean)
: []
}
async function loadProgramDetails(item) {
const url = `${API_ENDPOINT}/api/v1/linear-detail?siTrafficKey=${item.siTrafficKey}`
const data = await axios
.get(url)
.then(r => r.data)
.catch(err => {})
if (!data) return {}
return data.response || {}
}

View File

@@ -0,0 +1,72 @@
// npx epg-grabber --config=sites/astro.com.my/astro.com.my.config.js --channels=sites/astro.com.my/astro.com.my.channels.xml --output=guide.xml --timeout=30000 --days=2
const { parser, url } = require('./astro.com.my.config.js')
const fs = require('fs')
const path = require('path')
const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
jest.mock('axios')
const date = dayjs.utc('2022-10-31', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '425',
xmltv_id: 'TVBClassic.hk'
}
it('can generate valid url', () => {
expect(url({ channel })).toBe('https://contenthub-api.eco.astro.com.my/channel/425.json')
})
it('can parse response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
axios.get.mockImplementation(url => {
if (
url ===
'https://contenthub-api.eco.astro.com.my/api/v1/linear-detail?siTrafficKey=1:10000526:47979653'
) {
return Promise.resolve({
data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/program.json')))
})
} else {
return Promise.resolve({ data: '' })
}
})
let results = await parser({ content, channel, date })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results.length).toBe(31)
expect(results[0]).toMatchObject({
start: '2022-10-30T16:10:00.000Z',
stop: '2022-10-30T17:02:00.000Z',
title: 'Triumph in the Skies Ep06',
description:
'This classic drama depicts the many aspects of two complicated relationships set against an airline company. Will those involved ever find true love?',
actors: ['Francis Ng Chun Yu', 'Joe Ma Tak Chung', 'Flora Chan Wai San'],
directors: ['Joe Ma Tak Chung'],
icon: 'https://s3-ap-southeast-1.amazonaws.com/ams-astro/production/images/1035X328883.jpg',
rating: {
system: 'LPF',
value: 'U'
},
episode: 6,
categories: ['Drama']
})
})
it('can handle empty guide', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'))
const results = await parser({ date, content })
expect(results).toMatchObject([])
})

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,19 @@
<script type=text/javascript>var max_sports=-1;var max_entertainment=-1;</script>
<script>currenthour='21'</script><div class='container container-tvguide categoryheadercss'><div class='row no-gutter' style='margin-top:20px'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<div id='sports' style='width:50%' class=category_item onclick=setparams('2023-01-19','0','00','sports','bein.net')>Sports</div><div id='entertainment' style='width:50%' class=category_item_selected>Entertainment</div></div></div><div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<table width=100% border=0 class=day_table><tr><td><span id=day1t1 style=width:100% class=day_item><a href=javascript:selectday('day1');setparams('2023-01-18','0','00','entertainment','bein.net')>Wed</a></span><span id=day1t2 style=width:100% class=day_item1><a href=javascript:selectday('day1');setparams('2023-01-18','0','00','entertainment','bein.net')>18</a></div></td><script language=javascript>lastday='day2';</script><td><div id=day2t1 style=width:100% class=day_item_selected><a href=javascript:setparams('2023-01-19','0','00','entertainment','bein.net')>Thu</a></div><div id=day2t2 style=width:100% class=day_item1_selected><a href=javascript:setparams('2023-01-19','0','00','entertainment','bein.net')>19</a></div></td><td><span id=day3t1 style=width:100% class=day_item><a href=javascript:selectday('day3');setparams('2023-01-20','0','00','entertainment','bein.net')>Fri</a></span><span id=day3t2 style=width:100% class=day_item1><a href=javascript:selectday('day3');setparams('2023-01-20','0','00','entertainment','bein.net')>20</a></div></td><td><span id=day4t1 style=width:100% class=day_item><a href=javascript:selectday('day4');setparams('2023-01-21','0','00','entertainment','bein.net')>Sat</a></span><span id=day4t2 style=width:100% class=day_item1><a href=javascript:selectday('day4');setparams('2023-01-21','0','00','entertainment','bein.net')>21</a></div></td></table></div>
</div><div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<div style='background-color:#d1d0de;margin:0px auto;text-align:center;display:flex;width:100%'><div id=left style=width:25px;background-color:red;height:50px;padding-top:13px;background-color:#d1d0de;><img src=https://www.bein.com/mena/wp-content/uploads/sites/4/2015/06/left.png onclick=ptime()></div><div id='slider_timer' class='slider_time'>
<ul id='timer'></ul></div><div id=left style=width:25px;background-color:red;height:50px;padding-top:13px;background-color:#d1d0de><img src=https://www.bein.com/mena/wp-content/uploads/sites/4/2015/06/right.png onclick=ntime()></div></div>
</div>
</div><div class='row no-gutter' style='height:15px'></div>
</div><div class='container container-tvguide contentheadercss_entertainment'></div>
</div>

View File

@@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="bein.com">
<channels>
<!-- If updating, note that the English and Arabic channels are in a different order so have different IDs -->
<channel lang="en" xmltv_id="beINSportsNews.qa" site_id="sports#1">BeIn Sports News</channel>
<channel lang="en" xmltv_id="beINSports.qa" site_id="sports#2">BeIn Sports</channel>
<channel lang="en" xmltv_id="beINSports1.qa" site_id="sports#3">BeIn Sports 1</channel>
<channel lang="en" xmltv_id="beINSports2.qa" site_id="sports#4">BeIn Sports 2</channel>
<channel lang="en" xmltv_id="beINSports3.qa" site_id="sports#5">BeIn Sports 3</channel>
<channel lang="en" xmltv_id="beINSports4.qa" site_id="sports#6">BeIn Sports 4</channel>
<channel lang="en" xmltv_id="beINSports5.qa" site_id="sports#7">BeIn Sports 5</channel>
<channel lang="en" xmltv_id="beINSports6.qa" site_id="sports#8">BeIn Sports 6</channel>
<channel lang="en" xmltv_id="beINSports7.qa" site_id="sports#9">BeIn Sports 7</channel>
<channel lang="en" xmltv_id="beINSportsPremium1.qa" site_id="sports#10">BeIn Sports Premium 1</channel>
<channel lang="en" xmltv_id="beINSportsPremium2.qa" site_id="sports#11">BeIn Sports Premium 2</channel>
<channel lang="en" xmltv_id="beINSportsPremium3.qa" site_id="sports#12">BeIn Sports Premium 3</channel>
<channel lang="en" xmltv_id="beINSportsXtra1.qa" site_id="sports#13">BeIn Sports Xtra 1</channel>
<channel lang="en" xmltv_id="beINSportsXtra2.qa" site_id="sports#14">BeIn Sports Xtra 2</channel>
<channel lang="en" xmltv_id="beIN4K.qa" site_id="sports#15">BeIn 4K</channel>
<channel lang="en" xmltv_id="beINSportsAFC.qa" site_id="sports#16">BeIN Sports AFC</channel>
<channel lang="en" xmltv_id="beINSportsAFC1.qa" site_id="sports#17">BeIN Sports AFC 1</channel>
<channel lang="en" xmltv_id="beINSportsAFC2.qa" site_id="sports#18">BeIN Sports AFC 2</channel>
<channel lang="en" xmltv_id="beINSportsAFC3.qa" site_id="sports#19">BeIN Sports AFC 3</channel>
<channel lang="en" xmltv_id="beINSportsEnglish1.qa" site_id="sports#20">BeIn Sports English 1</channel>
<channel lang="en" xmltv_id="beINSportsEnglish2.qa" site_id="sports#21">BeIn Sports English 2</channel>
<channel lang="en" xmltv_id="beINSportsEnglish3.qa" site_id="sports#22">BeIn Sports English 3</channel>
<channel lang="en" xmltv_id="beINSportsNBA.qa" site_id="sports#23">BeIn NBA</channel>
<channel lang="en" xmltv_id="beINSportsFrench1.qa" site_id="sports#24">BeIn Sports French 1</channel>
<channel lang="en" xmltv_id="beINSportsFrench2.qa" site_id="sports#25">BeIn Sports French 2</channel>
<channel lang="en" xmltv_id="beINSportsFrench3.qa" site_id="sports#26">BeIn Sports French 3</channel>
<channel lang="en" xmltv_id="beINSportsMax1.qa" site_id="sports#27">beIN Sports Max 1</channel>
<channel lang="en" xmltv_id="beINSportsMax2.qa" site_id="sports#28">beIN Sports Max 2</channel>
<channel lang="en" xmltv_id="beINSportsMax3.qa" site_id="sports#29">beIN Sports Max 3</channel>
<channel lang="en" xmltv_id="beINSportsMax4.qa" site_id="sports#30">beIN Sports Max 4</channel>
<channel lang="en" xmltv_id="beINSportsMax5.qa" site_id="sports#31">beIN Sports Max 5</channel>
<channel lang="en" xmltv_id="beINSportsMax6.qa" site_id="sports#32">beIN Sports Max 6</channel>
<channel lang="en" xmltv_id="AlkassOne.qa" site_id="sports#33">Alkass One</channel>
<channel lang="en" xmltv_id="AlkassTwo.qa" site_id="sports#34">Alkass Two</channel>
<channel lang="en" xmltv_id="AlkassThree.qa" site_id="sports#35">Alkass Three</channel>
<channel lang="en" xmltv_id="AlkassFour.qa" site_id="sports#36">Alkass Four</channel>
<channel lang="en" xmltv_id="AlkassFive.qa" site_id="sports#37">Alkass Five</channel>
<channel lang="en" xmltv_id="AlkassSix.qa" site_id="sports#38">Alkass Six</channel>
<channel lang="en" xmltv_id="AlkassSeven.qa" site_id="sports#39">Alkass Seven</channel>
<channel lang="en" xmltv_id="AlkassEight.qa" site_id="sports#40">Alkass Eight</channel>
<channel lang="ar" xmltv_id="beINSportsNews.qa" site_id="sports#1">BeIn Sports News</channel>
<channel lang="ar" xmltv_id="beINSports.qa" site_id="sports#2">BeIn Sports</channel>
<channel lang="ar" xmltv_id="beINSports1.qa" site_id="sports#3">BeIn Sports 1</channel>
<channel lang="ar" xmltv_id="beINSports2.qa" site_id="sports#4">BeIn Sports 2</channel>
<channel lang="ar" xmltv_id="beINSports3.qa" site_id="sports#5">BeIn Sports 3</channel>
<channel lang="ar" xmltv_id="beINSports4.qa" site_id="sports#6">BeIn Sports 4</channel>
<channel lang="ar" xmltv_id="beINSports5.qa" site_id="sports#7">BeIn Sports 5</channel>
<channel lang="ar" xmltv_id="beINSports6.qa" site_id="sports#8">BeIn Sports 6</channel>
<channel lang="ar" xmltv_id="beINSports7.qa" site_id="sports#9">BeIn Sports 7</channel>
<channel lang="ar" xmltv_id="beINSportsPremium1.qa" site_id="sports#10">BeIn Sports Premium 1</channel>
<channel lang="ar" xmltv_id="beINSportsPremium2.qa" site_id="sports#11">BeIn Sports Premium 2</channel>
<channel lang="ar" xmltv_id="beINSportsPremium3.qa" site_id="sports#12">BeIn Sports Premium 3</channel>
<channel lang="ar" xmltv_id="beINSportsXtra1.qa" site_id="sports#13">BeIn Sports Xtra 1</channel>
<channel lang="ar" xmltv_id="beINSportsXtra2.qa" site_id="sports#14">BeIn Sports Xtra 2</channel>
<channel lang="ar" xmltv_id="beIN4K.qa" site_id="sports#15">BeIn 4K</channel>
<channel lang="ar" xmltv_id="beINSportsAFC.qa" site_id="sports#16">BeIN Sports AFC</channel>
<channel lang="ar" xmltv_id="beINSportsAFC1.qa" site_id="sports#17">BeIN Sports AFC 1</channel>
<channel lang="ar" xmltv_id="beINSportsAFC2.qa" site_id="sports#18">BeIN Sports AFC 2</channel>
<channel lang="ar" xmltv_id="beINSportsAFC3.qa" site_id="sports#19">BeIN Sports AFC 3</channel>
<channel lang="ar" xmltv_id="beINSportsEnglish1.qa" site_id="sports#20">BeIn Sports English 1</channel>
<channel lang="ar" xmltv_id="beINSportsEnglish2.qa" site_id="sports#21">BeIn Sports English 2</channel>
<channel lang="ar" xmltv_id="beINSportsEnglish3.qa" site_id="sports#22">BeIn Sports English 3</channel>
<channel lang="ar" xmltv_id="beINSportsNBA.qa" site_id="sports#23">BeIn NBA</channel>
<channel lang="ar" xmltv_id="beINSportsFrench1.qa" site_id="sports#24">BeIn Sports French 1</channel>
<channel lang="ar" xmltv_id="beINSportsFrench2.qa" site_id="sports#25">BeIn Sports French 2</channel>
<channel lang="ar" xmltv_id="beINSportsFrench3.qa" site_id="sports#26">BeIn Sports French 3</channel>
<channel lang="ar" xmltv_id="beINSportsMax1.qa" site_id="sports#27">beIN Sports Max 1</channel>
<channel lang="ar" xmltv_id="beINSportsMax2.qa" site_id="sports#28">beIN Sports Max 2</channel>
<channel lang="ar" xmltv_id="beINSportsMax3.qa" site_id="sports#29">beIN Sports Max 3</channel>
<channel lang="ar" xmltv_id="beINSportsMax4.qa" site_id="sports#30">beIN Sports Max 4</channel>
<channel lang="ar" xmltv_id="beINSportsMax5.qa" site_id="sports#31">beIN Sports Max 5</channel>
<channel lang="ar" xmltv_id="beINSportsMax6.qa" site_id="sports#32">beIN Sports Max 6</channel>
<channel lang="ar" xmltv_id="AlkassThree.qa" site_id="sports#33">Alkass Three</channel>
<channel lang="ar" xmltv_id="AlkassOne.qa" site_id="sports#34">Alkass One</channel>
<channel lang="ar" xmltv_id="AlkassTwo.qa" site_id="sports#35">Alkass Two</channel>
<channel lang="ar" xmltv_id="AlkassFour.qa" site_id="sports#36">Alkass Four</channel>
<channel lang="ar" xmltv_id="AlkassFive.qa" site_id="sports#37">Alkass Five</channel>
<channel lang="ar" xmltv_id="AlkassSix.qa" site_id="sports#38">Alkass Six</channel>
<channel lang="ar" xmltv_id="AlkassSeven.qa" site_id="sports#39">Alkass Seven</channel>
<channel lang="ar" xmltv_id="AlkassEight.qa" site_id="sports#40">Alkass Eight</channel>
<channel lang="en" xmltv_id="beINMovies1Premiere.qa" site_id="entertainment#1">beIN Movies Premiere</channel>
<channel lang="en" xmltv_id="beINMovies2Action.qa" site_id="entertainment#2">beIN Movies Action</channel>
<channel lang="en" xmltv_id="beINMovies3Drama.qa" site_id="entertainment#3">bein Movies Drama</channel>
<channel lang="en" xmltv_id="beINMovies4Family.qa" site_id="entertainment#4">beIN Movies Family</channel>
<channel lang="en" xmltv_id="FoxMoviesMiddleEast.us" site_id="entertainment#5">FOX Movies</channel>
<channel lang="en" xmltv_id="FoxActionMoviesMiddleEast.hk" site_id="entertainment#6">FOX Action Movies</channel>
<channel lang="en" xmltv_id="StarMoviesMiddleEast.ae" site_id="entertainment#7">Star Movies</channel>
<channel lang="en" xmltv_id="beINSeries1.qa" site_id="entertainment#8">beIN Series 1</channel>
<channel lang="en" xmltv_id="beINSeries2.qa" site_id="entertainment#9">beIN Series 2</channel>
<channel lang="en" xmltv_id="beINDrama1.qa" site_id="entertainment#10">beIN Drama 1</channel>
<channel lang="en" xmltv_id="beINGourmet.qa" site_id="entertainment#11">beIN Gourmet</channel>
<channel lang="en" xmltv_id="TravelChannelEMEA.uk" site_id="entertainment#12">Travel Channel</channel>
<channel lang="en" xmltv_id="FoxArabia.ae" site_id="entertainment#13">FOX</channel>
<channel lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="entertainment#14">Food Network</channel>
<channel lang="en" xmltv_id="HGTVArabia.us" site_id="entertainment#15">HGTV</channel>
<channel lang="en" xmltv_id="StarWorldMiddleEast.ae" site_id="entertainment#16">Star World</channel>
<channel lang="en" xmltv_id="Fatafeat.ae" site_id="entertainment#17">Fatafeat</channel>
<channel lang="en" xmltv_id="FoxLifeMiddleEast.ae" site_id="entertainment#18">FOX Life</channel>
<channel lang="en" xmltv_id="MTV80s.uk" site_id="entertainment#19">MTV 80s</channel>
<channel lang="en" xmltv_id="MTV90s.uk" site_id="entertainment#20">MTV 90s</channel>
<channel lang="en" xmltv_id="ClubMTVEurope.uk" site_id="entertainment#21">Club MTV</channel>
<channel lang="en" xmltv_id="BloombergTVMiddleEast.ae" site_id="entertainment#22">Bloomberg TV</channel>
<channel lang="en" xmltv_id="NationalGeographicMiddleEast.uk" site_id="entertainment#23">National Geographic</channel>
<channel lang="en" xmltv_id="NationalGeographicWildMiddleEast.uk" site_id="entertainment#24">National Geographic Wild</channel>
<channel lang="en" xmltv_id="BBCEarthMiddleEast.uk" site_id="entertainment#25">BBC Earth</channel>
<channel lang="en" xmltv_id="CNNArabic.ae" site_id="entertainment#26">CNN</channel>
<channel lang="en" xmltv_id="EuronewsEnglish.fr" site_id="entertainment#27">EuroNews</channel>
<channel lang="en" xmltv_id="DiscoveryChannelMiddleEastAfrica.us" site_id="entertainment#28">Discovery</channel>
<channel lang="en" xmltv_id="BeJunior.qa" site_id="entertainment#29">be Junior</channel>
<channel lang="en" xmltv_id="JeemTV.qa" site_id="entertainment#30">Jeem</channel>
<channel lang="en" xmltv_id="Baraem.qa" site_id="entertainment#31">Baraem</channel>
<channel lang="en" xmltv_id="CartoonNetworkMENA.uk" site_id="entertainment#32">Cartoon Network</channel>
<channel lang="en" xmltv_id="CartoonNetworkArabic.ae" site_id="entertainment#33">Cartoon Network Arabic</channel>
<channel lang="en" xmltv_id="CartoonNetworkHindi.in" site_id="entertainment#34">Cartoon Network Hindi</channel>
<channel lang="en" xmltv_id="BabyTV.uk" site_id="entertainment#35">Baby TV</channel>
<channel lang="en" xmltv_id="CBeebiesMiddleEast.uk" site_id="entertainment#36">CBeebies</channel>
<channel lang="en" xmltv_id="DreamWorksChannelMiddleEast.us" site_id="entertainment#37">DreamWorks</channel>
<channel lang="ar" xmltv_id="beINMovies1Premiere.qa" site_id="entertainment#1">beIN Movies Premiere</channel>
<channel lang="ar" xmltv_id="beINMovies2Action.qa" site_id="entertainment#2">beIN Movies Action</channel>
<channel lang="ar" xmltv_id="beINMovies3Drama.qa" site_id="entertainment#3">bein Movies Drama</channel>
<channel lang="ar" xmltv_id="beINMovies4Family.qa" site_id="entertainment#4">beIN Movies Family</channel>
<channel lang="ar" xmltv_id="FoxMoviesMiddleEast.us" site_id="entertainment#5">FOX Movies</channel>
<channel lang="ar" xmltv_id="FoxActionMoviesMiddleEast.hk" site_id="entertainment#6">FOX Action Movies</channel>
<channel lang="ar" xmltv_id="StarMoviesMiddleEast.ae" site_id="entertainment#7">Star Movies</channel>
<channel lang="ar" xmltv_id="beINSeries1.qa" site_id="entertainment#8">beIN Series 1</channel>
<channel lang="ar" xmltv_id="beINSeries2.qa" site_id="entertainment#9">beIN Series 2</channel>
<channel lang="ar" xmltv_id="beINDrama1.qa" site_id="entertainment#10">beIN Drama 1</channel>
<channel lang="ar" xmltv_id="beINGourmet.qa" site_id="entertainment#11">beIN Gourmet</channel>
<channel lang="ar" xmltv_id="TravelChannelEMEA.uk" site_id="entertainment#12">Travel Channel</channel>
<channel lang="ar" xmltv_id="FoxArabia.ae" site_id="entertainment#13">FOX</channel>
<channel lang="ar" xmltv_id="FoodNetworkEMEA.us" site_id="entertainment#14">Food Network</channel>
<channel lang="ar" xmltv_id="HGTVArabia.us" site_id="entertainment#15">HGTV</channel>
<channel lang="ar" xmltv_id="StarWorldMiddleEast.ae" site_id="entertainment#16">Star World</channel>
<channel lang="ar" xmltv_id="Fatafeat.ae" site_id="entertainment#17">Fatafeat</channel>
<channel lang="ar" xmltv_id="MTV80s.uk" site_id="entertainment#18">MTV 80s</channel>
<channel lang="ar" xmltv_id="MTV90s.uk" site_id="entertainment#19">MTV 90s</channel>
<channel lang="ar" xmltv_id="ClubMTVEurope.uk" site_id="entertainment#20">Club MTV</channel>
<channel lang="ar" xmltv_id="BeJunior.qa" site_id="entertainment#21">be Junior</channel>
<channel lang="ar" xmltv_id="BloombergTVMiddleEast.ae" site_id="entertainment#22">Bloomberg TV</channel>
<channel lang="ar" xmltv_id="NationalGeographicMiddleEast.uk" site_id="entertainment#23">National Geographic</channel>
<channel lang="ar" xmltv_id="NationalGeographicWildMiddleEast.uk" site_id="entertainment#24">National Geographic Wild</channel>
<channel lang="ar" xmltv_id="BBCEarthMiddleEast.uk" site_id="entertainment#25">BBC Earth</channel>
<channel lang="ar" xmltv_id="AlJazeeraDocumentary.qa" site_id="entertainment#26">Al Jazeera Documentary</channel>
<channel lang="ar" xmltv_id="CNNArabic.ae" site_id="entertainment#27">CNN</channel>
<channel lang="ar" xmltv_id="EuronewsEnglish.fr" site_id="entertainment#28">EuroNews</channel>
<channel lang="ar" xmltv_id="JeemTV.qa" site_id="entertainment#29">Jeem</channel>
<channel lang="ar" xmltv_id="Baraem.qa" site_id="entertainment#30">Baraem</channel>
<channel lang="ar" xmltv_id="CBeebiesMiddleEast.uk" site_id="entertainment#31">CBeebies</channel>
<channel lang="ar" xmltv_id="BabyTV.uk" site_id="entertainment#32">Baby TV</channel>
<channel lang="ar" xmltv_id="CartoonNetworkMENA.uk" site_id="entertainment#33">Cartoon Network</channel>
<channel lang="ar" xmltv_id="CartoonNetworkArabic.ae" site_id="entertainment#34">Cartoon Network Arabic</channel>
<channel lang="ar" xmltv_id="CartoonNetworkHindi.in" site_id="entertainment#35">Cartoon Network Hindi</channel>
<channel lang="ar" xmltv_id="DreamWorksChannelMiddleEast.us" site_id="entertainment#36">DreamWorks</channel>
</channels>
</site>

View File

@@ -0,0 +1,84 @@
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: 'bein.com',
days: 2,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url: function ({ date, channel }) {
const [category] = channel.site_id.split('#')
const postid = (channel.lang === 'ar') ? '25344' : '25356'
return `https://www.bein.com/${channel.lang}/epg-ajax-template/?action=epg_fetch&category=${category}&cdate=${date.format(
'YYYY-MM-DD'
)}&language=${channel.lang.toUpperCase()}&loadindex=0&mins=00&offset=0&postid=${postid}&serviceidentity=bein.net`
},
parser: function ({ content, channel, date }) {
let programs = []
const items = parseItems(content, channel)
date = date.subtract(1, 'd')
items.forEach(item => {
const $item = cheerio.load(item)
const title = parseTitle($item)
if (!title) return
const category = parseCategory($item)
const prev = programs[programs.length - 1]
let start = parseTime($item, date)
if (prev) {
if (start.isBefore(prev.start)) {
start = start.add(1, 'd')
date = date.add(1, 'd')
}
prev.stop = start
}
let stop = parseTime($item, start)
if (stop.isBefore(start)) {
stop = stop.add(1, 'd')
}
programs.push({
title,
category,
start,
stop
})
})
return programs
}
}
function parseTitle($item) {
return $item('.title').text()
}
function parseCategory($item) {
return $item('.format').text()
}
function parseTime($item, date) {
let [_, time] = $item('.time')
.text()
.match(/^(\d{2}:\d{2})/) || [null, null]
if (!time) return null
time = `${date.format('YYYY-MM-DD')} ${time}`
return dayjs.tz(time, 'YYYY-MM-DD HH:mm', 'Asia/Qatar')
}
function parseItems(content, channel) {
const [_, channelId] = channel.site_id.split('#')
const $ = cheerio.load(content)
return $(`#channels_${channelId} .slider > ul:first-child > li`).toArray()
}

View File

@@ -0,0 +1,60 @@
// npx epg-grabber --config=sites/bein.com/bein.com.config.js --channels=sites/bein.com/bein.com.channels.xml --output=guide.xml --timeout=30000 --days=2
const fs = require('fs')
const path = require('path')
const { parser, url } = require('./bein.com.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('2023-01-19', 'YYYY-MM-DD').startOf('d')
const channel = { site_id: 'entertainment#1', xmltv_id: 'beINMovies1Premiere.qa', lang: 'en' }
it('can generate valid url', () => {
const result = url({ date, channel })
expect(result).toBe(
'https://www.bein.com/en/epg-ajax-template/?action=epg_fetch&category=entertainment&cdate=2023-01-19&language=EN&loadindex=0&mins=00&offset=0&postid=25356&serviceidentity=bein.net'
)
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve('sites/bein.com/__data__/content.html'))
const results = parser({ date, channel, content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2023-01-18T20:15:00.000Z',
stop: '2023-01-18T22:15:00.000Z',
title: 'The Walk',
category: 'Movies'
})
expect(results[1]).toMatchObject({
start: '2023-01-18T22:15:00.000Z',
stop: '2023-01-19T00:00:00.000Z',
title: 'Resident Evil: Welcome To Raccoon City',
category: 'Movies'
})
expect(results[10]).toMatchObject({
start: '2023-01-19T15:30:00.000Z',
stop: '2023-01-19T18:00:00.000Z',
title: 'Spider-Man: No Way Home',
category: 'Movies'
})
})
it('can handle empty guide', () => {
const noContent = fs.readFileSync(path.resolve('sites/bein.com/__data__/no-content.html'))
const result = parser({
date,
channel,
content: noContent
})
expect(result).toMatchObject([])
})

View File

@@ -0,0 +1,297 @@
<script>
currenthour=10;
</script>
<div class=containertop>
<div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<table width=100% border=0 class=day_table><tr><script language=javascript>lastday='day1';</script><td><div id=day1t1 style=width:100% class=day_item_selected><a href=javascript:loaders('utctime_hk.php?cdate=2022-05-10&offset=0&mins=00&category=sports',2)>Tue</a></div><div id=day1t2 style=width:100% class=day_item1_selected><a href=javascript:loaders('utctime_hk.php?cdate=2022-05-10&offset=0&mins=00&category=sports',2)>10</a></div></td><td><span id=day2t1 style=width:100% class=day_item><a href=javascript:selectday('day2');loaders('utctime_hk.php?cdate=2022-05-11&offset=0&mins=00&category=sports',2)>Wed</a></span><span id=day2t2 style=width:100% class=day_item1><a href=javascript:selectday('day2');loaders('utctime_hk.php?cdate=2022-05-11&offset=0&mins=00&category=sports',2)>11</a></div></td><td><span id=day3t1 style=width:100% class=day_item><a href=javascript:selectday('day3');loaders('utctime_hk.php?cdate=2022-05-12&offset=0&mins=00&category=sports',2)>Thu</a></span><span id=day3t2 style=width:100% class=day_item1><a href=javascript:selectday('day3');loaders('utctime_hk.php?cdate=2022-05-12&offset=0&mins=00&category=sports',2)>12</a></div></td><td><span id=day4t1 style=width:100% class=day_item><a href=javascript:selectday('day4');loaders('utctime_hk.php?cdate=2022-05-13&offset=0&mins=00&category=sports',2)>Fri</a></span><span id=day4t2 style=width:100% class=day_item1><a href=javascript:selectday('day4');loaders('utctime_hk.php?cdate=2022-05-13&offset=0&mins=00&category=sports',2)>13</a></div></td><td><span id=day5t1 style=width:100% class=day_item><a href=javascript:selectday('day5');loaders('utctime_hk.php?cdate=2022-05-14&offset=0&mins=00&category=sports',2)>Sat</a></span><span id=day5t2 style=width:100% class=day_item1><a href=javascript:selectday('day5');loaders('utctime_hk.php?cdate=2022-05-14&offset=0&mins=00&category=sports',2)>14</a></div></td><td><span id=day6t1 style=width:100% class=day_item><a href=javascript:selectday('day6');loaders('utctime_hk.php?cdate=2022-05-15&offset=0&mins=00&category=sports',2)>Sun</a></span><span id=day6t2 style=width:100% class=day_item1><a href=javascript:selectday('day6');loaders('utctime_hk.php?cdate=2022-05-15&offset=0&mins=00&category=sports',2)>15</a></div></td><td><span id=day7t1 style=width:100% class=day_item><a href=javascript:selectday('day7');loaders('utctime_hk.php?cdate=2022-05-16&offset=0&mins=00&category=sports',2)>Mon</a></span><span id=day7t2 style=width:100% class=day_item1><a href=javascript:selectday('day7');loaders('utctime_hk.php?cdate=2022-05-16&offset=0&mins=00&category=sports',2)>16</a></div></td></table></div>
</div><div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<div style='background-color:#d1d0de;margin:0px auto;text-align:center;display:flex;width:100%'><div id=left style=width:25px;background-color:red;height:50px;padding-top:13px;background-color:#d1d0de;><img src=ico/left.png onclick=ptime()></div><div id='slider_timer' class='slider_time'>
<ul id='timer'></ul></div><div id=left style=width:25px;background-color:red;height:50px;padding-top:13px;background-color:#d1d0de><img src=ico/right.png onclick=ntime()></div></div>
</div>
</div><div class='row no-gutter' style='height:15px'></div>
<div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<div id='loader_inner' style='display:none;margin:0 auto;width:100%;margin-top:5px;margin-bottom:5px;text-align:center'>
<div style='text-align:center;margin:auto 0'><img align=center src='images/ajax-loader.gif'></div>
</div>
</div>
</div>
</div><div class='container'><div class='row no-gutter' >
<div style='display:none;min-height:1000px' class='col-xs-12 col-sm-12 col-md-12 col-lg-12' id='category_div'>
</div>
</div>
<div id='epg_div'><div class='row no-gutter' id=channels_1>
<div class='col-xs-3 col-sm-2 col-md-2 col-lg-1'>
<div style='width:100%;text-align:center;'>
<div class=channel>
<div class=centered>
<img align=center style='width:60%;height:auto' src='hk_sports/BS1.svg'>
</div>
</div>
</div>
</div>
<div class='col-xs-8 col-sm-9 col-md-9 col-lg-10'>
<div id='slider_1' class=slider><ul id='ul_slider_1'>
<li id='slider_1_item1' data-id='slider_1_item1' data-index='1' data-start='0' data-start-m='0' data-end='00 data-end-m='10' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Lazio vs Sampdoria</p>
<p class=format>Serie A 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>22:20&nbsp;-&nbsp;00:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item2' data-id='slider_1_item2' data-index='2' data-start='00' data-start-m='10' data-end='02' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Super Lig 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Alanyaspor vs Konyaspor</p>
<p class=format>Super Lig 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>00:10&nbsp;-&nbsp;02:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item3' data-id='slider_1_item3' data-index='3' data-start='02' data-start-m='00' data-end='04' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Liverpool TV 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Liverpool vs Tottenham</p>
<p class=format>Liverpool TV 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>02:00&nbsp;-&nbsp;04:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item4' data-id='slider_1_item4' data-index='4' data-start='04' data-start-m='00' data-end='04' data-end-m='30' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='LFC Trending 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Episode Number 41</p>
<p class=format>LFC Trending 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>04:00&nbsp;-&nbsp;04:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item5' data-id='slider_1_item5' data-index='5' data-start='04' data-start-m='30' data-end='05' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='LFC TV Specials 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Villarreal vs Liverpool</p>
<p class=format>LFC TV Specials 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>04:30&nbsp;-&nbsp;05:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item6' data-id='slider_1_item6' data-index='6' data-start='05' data-start-m='00' data-end='06' data-end-m='50' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Fiorentina vs Roma</p>
<p class=format>Serie A 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>05:00&nbsp;-&nbsp;06:50</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item7' data-id='slider_1_item7' data-index='7' data-start='06' data-start-m='50' data-end='07' data-end-m='20' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='International Tour of Hellas 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Day 5</p>
<p class=format>International Tour of Hellas 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>06:50&nbsp;-&nbsp;07:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item8' data-id='slider_1_item8' data-index='8' data-start='07' data-start-m='20' data-end='08' data-end-m='20' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Ligue 1 Highlights 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>MD 36</p>
<p class=format>Ligue 1 Highlights 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>07:20&nbsp;-&nbsp;08:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item9' data-id='slider_1_item9' data-index='9' data-start='08' data-start-m='20' data-end='10' data-end-m='10' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='TotalEnergies CAF Champions League 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Petro de Luanda vs WAC</p>
<p class=format>TotalEnergies CAF Champions League 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>08:20&nbsp;-&nbsp;10:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item10' data-id='slider_1_item10' data-index='10' data-start='10' data-start-m='10' data-end='12' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Genoa vs Juventus</p>
<p class=format>Serie A 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>10:10&nbsp;-&nbsp;12:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ><p></td></tr><tr><td ><div class='progress' currents=true><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='24' aria-valuemin='0' aria-valuemax='100' style='width:24.545454545455%'></div></div></tr></table> </li>
<li id='slider_1_item11' data-id='slider_1_item11' data-index='11' data-start='12' data-start-m='00' data-end='12' data-end-m='30' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Chelsea TV: Premier League Years 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Premier League Years 92/93 93/94</p>
<p class=format>Chelsea TV: Premier League Years 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>12:00&nbsp;-&nbsp;12:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item12' data-id='slider_1_item12' data-index='12' data-start='12' data-start-m='30' data-end='13' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Inside Chelsea 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Episode Number 38</p>
<p class=format>Inside Chelsea 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>12:30&nbsp;-&nbsp;13:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item13' data-id='slider_1_item13' data-index='13' data-start='13' data-start-m='00' data-end='15' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Chelsea TV 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Chelsea vs Wolves</p>
<p class=format>Chelsea TV 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>13:00&nbsp;-&nbsp;15:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item14' data-id='slider_1_item14' data-index='14' data-start='15' data-start-m='00' data-end='16' data-end-m='50' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Fiorentina vs Roma</p>
<p class=format>Serie A 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>15:00&nbsp;-&nbsp;16:50</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item15' data-id='slider_1_item15' data-index='15' data-start='16' data-start-m='50' data-end='18' data-end-m='45' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Coupe de France 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Nice vs Nantes</p>
<p class=format>Coupe de France 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>16:50&nbsp;-&nbsp;18:45</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item16' data-id='slider_1_item16' data-index='16' data-start='18' data-start-m='45' data-end='20' data-end-m='35' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='TotalEnergies CAF Confederation Cup 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>TP Mazembe vs RS Berkane</p>
<p class=format>TotalEnergies CAF Confederation Cup 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>18:45&nbsp;-&nbsp;20:35</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item17' data-id='slider_1_item17' data-index='17' data-start='20' data-start-m='35' data-end='22' data-end-m='20' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Angers vs Bordeaux</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>20:35&nbsp;-&nbsp;22:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item18' data-id='slider_1_item18' data-index='18' data-start='22' data-start-m='20' data-end='00' data-end-m='10' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Genoa vs Juventus</p>
<p class=format>Serie A 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>22:20&nbsp;-&nbsp;00:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<div><ul><li class=item_normal></li><li class=item_normal></li></ul> </ul></div>
</div>
<div class='col-xs-1 nextarrow col-sm-1 nextarrow col-md-1 nextarrow col-lg-1 nextarrow'>
<div class='centered'>
<img align=center width=15 height=15 src=images/nextarrow_en.svg style=cursor:pointer onclick=action('slider_1')>
</div>
</div>
</div>
<div class='row no-gutter' style='height:15px' id='ruler_channels_1'></div>
<div class='row no-gutter' id=channels_2>
<div class='col-xs-3 col-sm-2 col-md-2 col-lg-1'>
<div style='width:100%;text-align:center;'>
<div class=channel>
<div class=centered>
<img align=center style='width:60%;height:auto' src='hk_sports/BS2.svg'>
</div>
</div>
</div>
</div>
<div class='col-xs-8 col-sm-9 col-md-9 col-lg-10'>
<div id='slider_2' class=slider><ul id='ul_slider_2'>
<li id='slider_2_item1' data-id='slider_2_item1' data-index='1' data-start='0' data-start-m='0' data-end='00 data-end-m='20' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Lorient vs Marseille</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>22:30&nbsp;-&nbsp;00:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item2' data-id='slider_2_item2' data-index='2' data-start='00' data-start-m='20' data-end='02' data-end-m='10' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Major League Soccer 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>LAFC vs Philadelphia</p>
<p class=format>Major League Soccer 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>00:20&nbsp;-&nbsp;02:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item3' data-id='slider_2_item3' data-index='3' data-start='02' data-start-m='10' data-end='04' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Major League Soccer 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Dallas vs Seattle</p>
<p class=format>Major League Soccer 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>02:10&nbsp;-&nbsp;04:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item4' data-id='slider_2_item4' data-index='4' data-start='04' data-start-m='00' data-end='05' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Supercars Championship Highlights 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Bunnings Trade Perth Supernight Sat</p>
<p class=format>Supercars Championship Highlights 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>04:00&nbsp;-&nbsp;05:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item5' data-id='slider_2_item5' data-index='5' data-start='05' data-start-m='00' data-end='06' data-end-m='50' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Challenge Cup 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Edinburgh vs Wasps</p>
<p class=format>Challenge Cup 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>05:00&nbsp;-&nbsp;06:50</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item6' data-id='slider_2_item6' data-index='6' data-start='06' data-start-m='50' data-end='08' data-end-m='20' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='DTM Race 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Portimao Race 1</p>
<p class=format>DTM Race 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>06:50&nbsp;-&nbsp;08:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item7' data-id='slider_2_item7' data-index='7' data-start='08' data-start-m='20' data-end='10' data-end-m='10' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Challenge Cup 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Lyon vs Glasgow</p>
<p class=format>Challenge Cup 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>08:20&nbsp;-&nbsp;10:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item8' data-id='slider_2_item8' data-index='8' data-start='10' data-start-m='10' data-end='12' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>PSG vs Troyes</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>10:10&nbsp;-&nbsp;12:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ><p></td></tr><tr><td ><div class='progress' currents=true><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='24' aria-valuemin='0' aria-valuemax='100' style='width:24.545454545455%'></div></div></tr></table> </li>
<li id='slider_2_item9' data-id='slider_2_item9' data-index='9' data-start='12' data-start-m='00' data-end='12' data-end-m='30' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='This Is Paris 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Episode Number 37</p>
<p class=format>This Is Paris 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>12:00&nbsp;-&nbsp;12:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item10' data-id='slider_2_item10' data-index='10' data-start='12' data-start-m='30' data-end='13' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='MLS Show 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>RD 10</p>
<p class=format>MLS Show 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>12:30&nbsp;-&nbsp;13:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item11' data-id='slider_2_item11' data-index='11' data-start='13' data-start-m='00' data-end='14' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ferrari Challenge Highlights 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Portimao</p>
<p class=format>Ferrari Challenge Highlights 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>13:00&nbsp;-&nbsp;14:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item12' data-id='slider_2_item12' data-index='12' data-start='14' data-start-m='00' data-end='14' data-end-m='15' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='SPFL Highlights 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>MD 36</p>
<p class=format>SPFL Highlights 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>14:00&nbsp;-&nbsp;14:15</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item13' data-id='slider_2_item13' data-index='13' data-start='14' data-start-m='15' data-end='16' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='SPFL Premiership 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Celtic vs Hearts</p>
<p class=format>SPFL Premiership 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>14:15&nbsp;-&nbsp;16:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item14' data-id='slider_2_item14' data-index='14' data-start='16' data-start-m='00' data-end='17' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='British Superbike Championship Highlights 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Oulton Park</p>
<p class=format>British Superbike Championship Highlights 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>16:00&nbsp;-&nbsp;17:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item15' data-id='slider_2_item15' data-index='15' data-start='17' data-start-m='00' data-end='17' data-end-m='50' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='FIM Speedway GP Highlights 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Gorican</p>
<p class=format>FIM Speedway GP Highlights 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>17:00&nbsp;-&nbsp;17:50</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item16' data-id='slider_2_item16' data-index='16' data-start='17' data-start-m='50' data-end='18' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 Club Classic 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>PSG vs Lyon</p>
<p class=format>Ligue 1 Club Classic 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>17:50&nbsp;-&nbsp;18:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item17' data-id='slider_2_item17' data-index='17' data-start='18' data-start-m='00' data-end='20' data-end-m='10' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='SPFL Premiership 2021/22' live='1'invalid=false>
<div class=onecontent>
<p class=title>Inverness CT vs Arbroath</p>
<p class=format>SPFL Premiership 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>18:00&nbsp;-&nbsp;20:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/live.svg' class=image_live_css ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item18' data-id='slider_2_item18' data-index='18' data-start='20' data-start-m='10' data-end='20' data-end-m='40' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='MLS Show 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>RD 10</p>
<p class=format>MLS Show 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>20:10&nbsp;-&nbsp;20:40</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item19' data-id='slider_2_item19' data-index='19' data-start='20' data-start-m='40' data-end='22' data-end-m='30' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Champions Cup 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Racing 92 vs Sale</p>
<p class=format>Champions Cup 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>20:40&nbsp;-&nbsp;22:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item20' data-id='slider_2_item20' data-index='20' data-start='22' data-start-m='30' data-end='00' data-end-m='20' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Metz vs Lyon</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>22:30&nbsp;-&nbsp;00:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<div><ul><li class=item_normal></li><li class=item_normal></li></ul> </ul></div>
</div>
<div class='col-xs-1 nextarrow col-sm-1 nextarrow col-md-1 nextarrow col-lg-1 nextarrow'>
<div class='centered'>
<img align=center width=15 height=15 src=images/nextarrow_en.svg style=cursor:pointer onclick=action('slider_2')>
</div>
</div>
</div>
<div class='row no-gutter' style='height:15px' id='ruler_channels_2'></div>
</div>
</div></div></div>
<div id="immobile" style="display:'none'"></div><div id="imtablet" style="display:'none'"></div><div id="imdesktop" style="display:'none'"></div>

View File

@@ -0,0 +1,297 @@
<script>
currenthour=10;
</script>
<div class=containertop>
<div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<table width=100% border=0 class=day_table><tr><td><span id=day1t1 style=width:100% class=day_item><a href=javascript:selectday('day1');loaders('utctime_hk.php?cdate=2022-05-10&offset=0&mins=00&category=sports',2)>Tue</a></span><span id=day1t2 style=width:100% class=day_item1><a href=javascript:selectday('day1');loaders('utctime_hk.php?cdate=2022-05-10&offset=0&mins=00&category=sports',2)>10</a></div></td><script language=javascript>lastday='day2';</script><td><div id=day2t1 style=width:100% class=day_item_selected><a href=javascript:loaders('utctime_hk.php?cdate=2022-05-11&offset=0&mins=00&category=sports',2)>Wed</a></div><div id=day2t2 style=width:100% class=day_item1_selected><a href=javascript:loaders('utctime_hk.php?cdate=2022-05-11&offset=0&mins=00&category=sports',2)>11</a></div></td><td><span id=day3t1 style=width:100% class=day_item><a href=javascript:selectday('day3');loaders('utctime_hk.php?cdate=2022-05-12&offset=0&mins=00&category=sports',2)>Thu</a></span><span id=day3t2 style=width:100% class=day_item1><a href=javascript:selectday('day3');loaders('utctime_hk.php?cdate=2022-05-12&offset=0&mins=00&category=sports',2)>12</a></div></td><td><span id=day4t1 style=width:100% class=day_item><a href=javascript:selectday('day4');loaders('utctime_hk.php?cdate=2022-05-13&offset=0&mins=00&category=sports',2)>Fri</a></span><span id=day4t2 style=width:100% class=day_item1><a href=javascript:selectday('day4');loaders('utctime_hk.php?cdate=2022-05-13&offset=0&mins=00&category=sports',2)>13</a></div></td><td><span id=day5t1 style=width:100% class=day_item><a href=javascript:selectday('day5');loaders('utctime_hk.php?cdate=2022-05-14&offset=0&mins=00&category=sports',2)>Sat</a></span><span id=day5t2 style=width:100% class=day_item1><a href=javascript:selectday('day5');loaders('utctime_hk.php?cdate=2022-05-14&offset=0&mins=00&category=sports',2)>14</a></div></td><td><span id=day6t1 style=width:100% class=day_item><a href=javascript:selectday('day6');loaders('utctime_hk.php?cdate=2022-05-15&offset=0&mins=00&category=sports',2)>Sun</a></span><span id=day6t2 style=width:100% class=day_item1><a href=javascript:selectday('day6');loaders('utctime_hk.php?cdate=2022-05-15&offset=0&mins=00&category=sports',2)>15</a></div></td><td><span id=day7t1 style=width:100% class=day_item><a href=javascript:selectday('day7');loaders('utctime_hk.php?cdate=2022-05-16&offset=0&mins=00&category=sports',2)>Mon</a></span><span id=day7t2 style=width:100% class=day_item1><a href=javascript:selectday('day7');loaders('utctime_hk.php?cdate=2022-05-16&offset=0&mins=00&category=sports',2)>16</a></div></td></table></div>
</div><div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<div style='background-color:#d1d0de;margin:0px auto;text-align:center;display:flex;width:100%'><div id=left style=width:25px;background-color:red;height:50px;padding-top:13px;background-color:#d1d0de;><img src=ico/left.png onclick=ptime()></div><div id='slider_timer' class='slider_time'>
<ul id='timer'></ul></div><div id=left style=width:25px;background-color:red;height:50px;padding-top:13px;background-color:#d1d0de><img src=ico/right.png onclick=ntime()></div></div>
</div>
</div><div class='row no-gutter' style='height:15px'></div>
<div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<div id='loader_inner' style='display:none;margin:0 auto;width:100%;margin-top:5px;margin-bottom:5px;text-align:center'>
<div style='text-align:center;margin:auto 0'><img align=center src='images/ajax-loader.gif'></div>
</div>
</div>
</div>
</div><div class='container'><div class='row no-gutter' >
<div style='display:none;min-height:1000px' class='col-xs-12 col-sm-12 col-md-12 col-lg-12' id='category_div'>
</div>
</div>
<div id='epg_div'><div class='row no-gutter' id=channels_1>
<div class='col-xs-3 col-sm-2 col-md-2 col-lg-1'>
<div style='width:100%;text-align:center;'>
<div class=channel>
<div class=centered>
<img align=center style='width:60%;height:auto' src='hk_sports/BS1.svg'>
</div>
</div>
</div>
</div>
<div class='col-xs-8 col-sm-9 col-md-9 col-lg-10'>
<div id='slider_1' class=slider><ul id='ul_slider_1'>
<li id='slider_1_item1' data-id='slider_1_item1' data-index='1' data-start='00' data-start-m='10' data-end='02' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Super Lig 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Besiktas vs Fenerbahce</p>
<p class=format>Super Lig 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>00:10&nbsp;-&nbsp;02:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item2' data-id='slider_1_item2' data-index='2' data-start='02' data-start-m='00' data-end='02' data-end-m='30' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Chelsea TV: Premier League Years 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Premier League Years 92/93 93/94</p>
<p class=format>Chelsea TV: Premier League Years 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>02:00&nbsp;-&nbsp;02:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item3' data-id='slider_1_item3' data-index='3' data-start='02' data-start-m='30' data-end='03' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Inside Chelsea 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Episode Number 38</p>
<p class=format>Inside Chelsea 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>02:30&nbsp;-&nbsp;03:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item4' data-id='slider_1_item4' data-index='4' data-start='03' data-start-m='00' data-end='05' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Chelsea TV 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Chelsea vs Wolves</p>
<p class=format>Chelsea TV 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>03:00&nbsp;-&nbsp;05:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item5' data-id='slider_1_item5' data-index='5' data-start='05' data-start-m='00' data-end='06' data-end-m='50' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Sassuolo vs Udinese</p>
<p class=format>Serie A 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>05:00&nbsp;-&nbsp;06:50</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item6' data-id='slider_1_item6' data-index='6' data-start='06' data-start-m='50' data-end='08' data-end-m='40' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='TotalEnergies CAF Champions League 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Al Ahly FC vs ES Setif</p>
<p class=format>TotalEnergies CAF Champions League 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>06:50&nbsp;-&nbsp;08:40</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item7' data-id='slider_1_item7' data-index='7' data-start='08' data-start-m='40' data-end='09' data-end-m='40' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Ligue 1 Highlights 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>MD 36</p>
<p class=format>Ligue 1 Highlights 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>08:40&nbsp;-&nbsp;09:40</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item8' data-id='slider_1_item8' data-index='8' data-start='09' data-start-m='40' data-end='11' data-end-m='30' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Torino vs Napoli</p>
<p class=format>Serie A 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>09:40&nbsp;-&nbsp;11:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item9' data-id='slider_1_item9' data-index='9' data-start='11' data-start-m='30' data-end='12' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A Full Impact 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>MD 36</p>
<p class=format>Serie A Full Impact 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>11:30&nbsp;-&nbsp;12:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item10' data-id='slider_1_item10' data-index='10' data-start='12' data-start-m='00' data-end='12' data-end-m='30' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Arsenal World 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Episode Number 39</p>
<p class=format>Arsenal World 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>12:00&nbsp;-&nbsp;12:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item11' data-id='slider_1_item11' data-index='11' data-start='12' data-start-m='30' data-end='13' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Arsenal 360 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Episode Number 39</p>
<p class=format>Arsenal 360 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>12:30&nbsp;-&nbsp;13:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item12' data-id='slider_1_item12' data-index='12' data-start='13' data-start-m='00' data-end='15' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Arsenal TV 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Arsenal vs Leeds</p>
<p class=format>Arsenal TV 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>13:00&nbsp;-&nbsp;15:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item13' data-id='slider_1_item13' data-index='13' data-start='15' data-start-m='00' data-end='17' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Liverpool TV 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Aston Villa vs Liverpool</p>
<p class=format>Liverpool TV 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>15:00&nbsp;-&nbsp;17:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item14' data-id='slider_1_item14' data-index='14' data-start='17' data-start-m='00' data-end='17' data-end-m='30' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='LFC Trending 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Episode Number 41</p>
<p class=format>LFC Trending 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>17:00&nbsp;-&nbsp;17:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item15' data-id='slider_1_item15' data-index='15' data-start='17' data-start-m='30' data-end='18' data-end-m='00' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='LFC TV Specials 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Villarreal vs Liverpool</p>
<p class=format>LFC TV Specials 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>17:30&nbsp;-&nbsp;18:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item16' data-id='slider_1_item16' data-index='16' data-start='18' data-start-m='00' data-end='18' data-end-m='10' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A Highlights 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Genoa vs Napoli</p>
<p class=format>Serie A Highlights 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>18:00&nbsp;-&nbsp;18:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item17' data-id='slider_1_item17' data-index='17' data-start='18' data-start-m='10' data-end='18' data-end-m='25' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='SPFL Highlights 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>MD 36</p>
<p class=format>SPFL Highlights 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>18:10&nbsp;-&nbsp;18:25</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item18' data-id='slider_1_item18' data-index='18' data-start='18' data-start-m='25' data-end='20' data-end-m='30' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='SPFL Premiership 2021/22' live='1'invalid=false>
<div class=onecontent>
<p class=title>Dundee Utd vs Celtic</p>
<p class=format>SPFL Premiership 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>18:25&nbsp;-&nbsp;20:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/live.svg' class=image_live_css ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item19' data-id='slider_1_item19' data-index='19' data-start='20' data-start-m='30' data-end='22' data-end-m='20' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Brest vs Strasbourg</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>20:30&nbsp;-&nbsp;22:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_1_item20' data-id='slider_1_item20' data-index='20' data-start='22' data-start-m='20' data-end='00' data-end-m='10' data-img='hk_sports/BS1.svg' data-desc='' parent='slider_1' category='Serie A 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Fiorentina vs Roma</p>
<p class=format>Serie A 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>22:20&nbsp;-&nbsp;00:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<div><ul><li class=item_normal></li><li class=item_normal></li></ul> </ul></div>
</div>
<div class='col-xs-1 nextarrow col-sm-1 nextarrow col-md-1 nextarrow col-lg-1 nextarrow'>
<div class='centered'>
<img align=center width=15 height=15 src=images/nextarrow_en.svg style=cursor:pointer onclick=action('slider_1')>
</div>
</div>
</div>
<div class='row no-gutter' style='height:15px' id='ruler_channels_1'></div>
<div class='row no-gutter' id=channels_2>
<div class='col-xs-3 col-sm-2 col-md-2 col-lg-1'>
<div style='width:100%;text-align:center;'>
<div class=channel>
<div class=centered>
<img align=center style='width:60%;height:auto' src='hk_sports/BS2.svg'>
</div>
</div>
</div>
</div>
<div class='col-xs-8 col-sm-9 col-md-9 col-lg-10'>
<div id='slider_2' class=slider><ul id='ul_slider_2'>
<li id='slider_2_item1' data-id='slider_2_item1' data-index='1' data-start='00' data-start-m='20' data-end='02' data-end-m='10' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='SPFL Premiership 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Celtic vs Hearts</p>
<p class=format>SPFL Premiership 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>00:20&nbsp;-&nbsp;02:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item2' data-id='slider_2_item2' data-index='2' data-start='02' data-start-m='10' data-end='04' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='SPFL Premiership 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Inverness CT vs Arbroath</p>
<p class=format>SPFL Premiership 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>02:10&nbsp;-&nbsp;04:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item3' data-id='slider_2_item3' data-index='3' data-start='04' data-start-m='00' data-end='05' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Supercars Championship Highlights 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Bunnings Trade Perth Supernight Sun</p>
<p class=format>Supercars Championship Highlights 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>04:00&nbsp;-&nbsp;05:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item4' data-id='slider_2_item4' data-index='4' data-start='05' data-start-m='00' data-end='06' data-end-m='50' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Brest vs Strasbourg</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>05:00&nbsp;-&nbsp;06:50</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item5' data-id='slider_2_item5' data-index='5' data-start='06' data-start-m='50' data-end='08' data-end-m='20' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='DTM Race 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Portimao Race 2</p>
<p class=format>DTM Race 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>06:50&nbsp;-&nbsp;08:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item6' data-id='slider_2_item6' data-index='6' data-start='08' data-start-m='20' data-end='10' data-end-m='10' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Champions Cup 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Leicester vs Leinster</p>
<p class=format>Champions Cup 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>08:20&nbsp;-&nbsp;10:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item7' data-id='slider_2_item7' data-index='7' data-start='10' data-start-m='10' data-end='12' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Lorient vs Marseille</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>10:10&nbsp;-&nbsp;12:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item8' data-id='slider_2_item8' data-index='8' data-start='12' data-start-m='00' data-end='12' data-end-m='50' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Porsche Carrera Cup Germany 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Spa Race 1</p>
<p class=format>Porsche Carrera Cup Germany 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>12:00&nbsp;-&nbsp;12:50</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item9' data-id='slider_2_item9' data-index='9' data-start='12' data-start-m='50' data-end='13' data-end-m='40' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Porsche Carrera Cup Germany 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Spa Race 2</p>
<p class=format>Porsche Carrera Cup Germany 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>12:50&nbsp;-&nbsp;13:40</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item10' data-id='slider_2_item10' data-index='10' data-start='13' data-start-m='40' data-end='14' data-end-m='10' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='UIM X-Cat World Championship 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Fujairah</p>
<p class=format>UIM X-Cat World Championship 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>13:40&nbsp;-&nbsp;14:10</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item11' data-id='slider_2_item11' data-index='11' data-start='14' data-start-m='10' data-end='15' data-end-m='55' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Lille vs Monaco</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>14:10&nbsp;-&nbsp;15:55</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item12' data-id='slider_2_item12' data-index='12' data-start='15' data-start-m='55' data-end='16' data-end-m='25' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='MLS Show 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>RD 10</p>
<p class=format>MLS Show 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>15:55&nbsp;-&nbsp;16:25</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item13' data-id='slider_2_item13' data-index='13' data-start='16' data-start-m='25' data-end='16' data-end-m='55' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Mini Match - Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>PSG vs Troyes</p>
<p class=format>Mini Match - Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>16:25&nbsp;-&nbsp;16:55</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item14' data-id='slider_2_item14' data-index='14' data-start='16' data-start-m='55' data-end='18' data-end-m='55' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live='1'invalid=false>
<div class=onecontent>
<p class=title>Nice vs St Etienne</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>16:55&nbsp;-&nbsp;18:55</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/live.svg' class=image_live_css ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item15' data-id='slider_2_item15' data-index='15' data-start='18' data-start-m='55' data-end='21' data-end-m='00' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live='1'invalid=false>
<div class=onecontent>
<p class=title>Nantes vs Rennes</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>18:55&nbsp;-&nbsp;21:00</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/live.svg' class=image_live_css ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item16' data-id='slider_2_item16' data-index='16' data-start='21' data-start-m='00' data-end='21' data-end-m='30' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Mini Match - Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>Lorient vs Marseille</p>
<p class=format>Mini Match - Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>21:00&nbsp;-&nbsp;21:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item17' data-id='slider_2_item17' data-index='17' data-start='21' data-start-m='30' data-end='22' data-end-m='30' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Supercars Championship Highlights 2022' live=''invalid=false>
<div class=onecontent>
<p class=title>Bunnings Trade Perth Supernight Sat</p>
<p class=format>Supercars Championship Highlights 2022</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>21:30&nbsp;-&nbsp;22:30</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<li id='slider_2_item18' data-id='slider_2_item18' data-index='18' data-start='22' data-start-m='30' data-end='00' data-end-m='20' data-img='hk_sports/BS2.svg' data-desc='' parent='slider_2' category='Ligue 1 2021/22' live=''invalid=false>
<div class=onecontent>
<p class=title>PSG vs Troyes</p>
<p class=format>Ligue 1 2021/22</p>
</div>
<div class=timer><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td style=width:80%><p class=time>22:30&nbsp;-&nbsp;00:20</td><td style=width:20% rowspan=2 valign=top class=showornot><img src='images/transparent.png' width=80 height=27 ></p></td></tr><tr><td><div class='progress'><div class='progress-bar progress-bar-custom' role='progressbar' aria-valuenow='0' aria-valuemin='0' aria-valuemax='100'></div></div></tr></table> </li>
<div><ul><li class=item_normal></li><li class=item_normal></li></ul> </ul></div>
</div>
<div class='col-xs-1 nextarrow col-sm-1 nextarrow col-md-1 nextarrow col-lg-1 nextarrow'>
<div class='centered'>
<img align=center width=15 height=15 src=images/nextarrow_en.svg style=cursor:pointer onclick=action('slider_2')>
</div>
</div>
</div>
<div class='row no-gutter' style='height:15px' id='ruler_channels_2'></div>
</div>
</div></div></div>
<div id="immobile" style="display:'none'"></div><div id="imtablet" style="display:'none'"></div><div id="imdesktop" style="display:'none'"></div>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
<script>
currenthour="13";
</script>
<div class=container>
<div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
</div></div><div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<table width=100% border=0 class=day_table><tr><td><span id=day1t1 style=width:100% class=day_item><a href=javascript:selectday('day1');loaders('utctime.php?cdate=2022-05-08&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>Sun</a></span><span id=day1t2 style=width:100% class=day_item1><a href=javascript:selectday('day1');loaders('utctime.php?cdate=2022-05-08&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>08</a></div></td><td><span id=day2t1 style=width:100% class=day_item><a href=javascript:selectday('day2');loaders('utctime.php?cdate=2022-05-09&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>Mon</a></span><span id=day2t2 style=width:100% class=day_item1><a href=javascript:selectday('day2');loaders('utctime.php?cdate=2022-05-09&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>09</a></div></td><td><span id=day3t1 style=width:100% class=day_item><a href=javascript:selectday('day3');loaders('utctime.php?cdate=2022-05-10&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>Tue</a></span><span id=day3t2 style=width:100% class=day_item1><a href=javascript:selectday('day3');loaders('utctime.php?cdate=2022-05-10&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>10</a></div></td><td><span id=day4t1 style=width:100% class=day_item><a href=javascript:selectday('day4');loaders('utctime.php?cdate=2022-05-11&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>Wed</a></span><span id=day4t2 style=width:100% class=day_item1><a href=javascript:selectday('day4');loaders('utctime.php?cdate=2022-05-11&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>11</a></div></td><td><span id=day5t1 style=width:100% class=day_item><a href=javascript:selectday('day5');loaders('utctime.php?cdate=2022-05-12&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>Thu</a></span><span id=day5t2 style=width:100% class=day_item1><a href=javascript:selectday('day5');loaders('utctime.php?cdate=2022-05-12&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>12</a></div></td><td><span id=day6t1 style=width:100% class=day_item><a href=javascript:selectday('day6');loaders('utctime.php?cdate=2022-05-13&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>Fri</a></span><span id=day6t2 style=width:100% class=day_item1><a href=javascript:selectday('day6');loaders('utctime.php?cdate=2022-05-13&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>13</a></div></td><td><span id=day7t1 style=width:100% class=day_item><a href=javascript:selectday('day7');loaders('utctime.php?cdate=2022-05-14&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>Sat</a></span><span id=day7t2 style=width:100% class=day_item1><a href=javascript:selectday('day7');loaders('utctime.php?cdate=2022-05-14&offset=0&mins=00&category=sports&serviceidentity=beinsports.com',2)>14</a></div></td></table></div>
</div><div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<div style='background-color:#d1d0de;margin:0px auto;text-align:center;display:flex;width:100%'><div id=left style=width:25px;background-color:red;height:50px;padding-top:13px;background-color:#d1d0de;><img src=ico/left.png onclick=ptime()></div><div id='slider_timer' class='slider_time'>
<ul id='timer'></ul></div><div id=left style=width:25px;background-color:red;height:50px;padding-top:13px;background-color:#d1d0de><img src=ico/right.png onclick=ntime()></div></div>
</div>
</div><div class='row no-gutter' style='height:10px'></div>
<div class='row no-gutter'>
<div class='col-xs-7 col-xs-offset-5 col-sm-4 col-sm-offset-8 col-md-2 col-md-offset-10 col-lg-2 col-lg-offset-10'>
<div style='position:absolute;font-size:18px;margin-top:5px'>Live Events</div><div class="onoffswitch" style='left:120px'><input onchange=showhides() type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch" tabindex="0"><label class="onoffswitch-label" for="myonoffswitch"><span class="onoffswitch-inner"></span><span class="onoffswitch-switch"></span></label></div></div></div><div class='row no-gutter' style='height:10px'></div>
<div class='row no-gutter'>
<div class='col-xs-12 col-sm-12 col-md-12 col-lg-12'>
<div id='loader_inner' style='display:none;margin:0 auto;width:100%;margin-top:5px;margin-bottom:5px;text-align:center'>
<div style='text-align:center;margin:auto 0;'><img src='images/ajax-loader.gif'></div>
</div>
</div>
</div>
</div><div class='container'><div class='row no-gutter' id='cta_row'><div id='cta' class='col-xs-12 col-sm-12 col-md-12 col-lg-12'><img style=cursor:pointer onclick=gobein('entertainment','e') class='img-responsive' src=images/entertain_cta_en.png></div><div></div>
</div>
<div id="immobile" style="display:'none'"></div><div id="imtablet" style="display:'none'"></div><div id="imdesktop" style="display:'none'"></div>

View File

@@ -0,0 +1,130 @@
const axios = require('axios')
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: 'beinsports.com',
days: 2,
request: {
cache: {
ttl: 60 * 60 * 1000, // 1h
interpretHeader: false
}
},
url: function ({ date, channel }) {
let [region] = channel.site_id.split('#')
region = region ? `_${region}` : ''
return `https://epg.beinsports.com/utctime${region}.php?mins=00&serviceidentity=beinsports.com&cdate=${date.format(
'YYYY-MM-DD'
)}`
},
parser: function ({ content, channel, date, cached }) {
let programs = []
const items = parseItems(content, channel)
let i = 0
items.forEach(item => {
const $item = cheerio.load(item)
const title = parseTitle($item)
if (!title) return
const category = parseCategory($item)
const prev = programs[programs.length - 1]
let start = parseStart($item, date)
if (i === 0 && start.hour() > 18) {
date = date.subtract(1, 'd')
start = start.subtract(1, 'd')
}
if (prev) {
if (start.isBefore(prev.start)) {
start = start.add(1, 'd')
date = date.add(1, 'd')
}
prev.stop = start
}
let stop = parseStop($item, start)
if (stop.isBefore(start)) {
stop = stop.add(1, 'd')
}
programs.push({ title, category, start, stop })
i++
})
return programs
},
async channels({ region, lang }) {
const suffix = region ? `_${region}` : ''
const content = await axios
.get(
`https://epg.beinsports.com/utctime${suffix}.php?mins=00&serviceidentity=beinsports.com&cdate=2022-05-08`
)
.then(r => r.data)
.catch(console.log)
const $ = cheerio.load(content)
const items = $(`.container > div, #epg_div > div`).toArray()
return items
.map(item => {
const $item = cheerio.load(item)
const id = $item('*').attr('id')
if (!/^channels\_[0-9]+$/.test(id)) return null
const channelId = id.replace('channels_', '')
const imgSrc = $item('img').attr('src')
const [_, __, name] = imgSrc.match(/(\/|)([a-z0-9-_.]+)(.png|.svg)$/i) || [null, null, '']
return {
lang,
site_id: `${region}#${channelId}`,
name
}
})
.filter(i => i)
}
}
function parseTitle($item) {
return $item('.title').text()
}
function parseCategory($item) {
return $item('.format')
.map(function () {
return $item(this).text()
})
.get()
}
function parseStart($item, date) {
let time = $item('.time').text()
if (!time) return null
let [_, start, period] = time.match(/^(\d{2}:\d{2})( AM| PM|)/) || [null, null, null]
if (!start) return null
start = `${date.format('YYYY-MM-DD')} ${start}${period}`
const format = period ? 'YYYY-MM-DD hh:mm A' : 'YYYY-MM-DD HH:mm'
return dayjs.tz(start, format, 'Asia/Qatar')
}
function parseStop($item, date) {
let time = $item('.time').text()
if (!time) return null
let [_, stop, period] = time.match(/(\d{2}:\d{2})( AM| PM|)$/) || [null, null, null]
if (!stop) return null
stop = `${date.format('YYYY-MM-DD')} ${stop}${period}`
const format = period ? 'YYYY-MM-DD hh:mm A' : 'YYYY-MM-DD HH:mm'
return dayjs.tz(stop, format, 'Asia/Qatar')
}
function parseItems(content, channel) {
const [_, channelId] = channel.site_id.split('#')
const $ = cheerio.load(content)
return $(`#channels_${channelId} .slider > ul:first-child > li`).toArray()
}

View File

@@ -0,0 +1,91 @@
// npm run channels:parse -- --config=./sites/beinsports.com/beinsports.com.config.js --output=./sites/beinsports.com/beinsports.com_qa-ar.channels.xml --set=lang:ar --set=region:ar
// npx epg-grabber --config=sites/beinsports.com/beinsports.com.config.js --channels=sites/beinsports.com/beinsports.com_qa-en.channels.xml --output=guide.xml --timeout=30000 --days=2
// npx epg-grabber --config=sites/beinsports.com/beinsports.com.config.js --channels=sites/beinsports.com/beinsports.com_us-en.channels.xml --output=guide.xml --timeout=30000 --days=2
const { parser, url } = require('./beinsports.com.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-05-08', 'YYYY-MM-DD').startOf('d')
const channel = { site_id: '#2', xmltv_id: 'BeINSports.qa' }
it('can generate valid url', () => {
const result = url({ date, channel })
expect(result).toBe(
'https://epg.beinsports.com/utctime.php?mins=00&serviceidentity=beinsports.com&cdate=2022-05-08'
)
})
it('can generate valid url for arabic guide', () => {
const channel = { site_id: 'ar#1', xmltv_id: 'BeINSports.qa' }
const result = url({ date, channel })
expect(result).toBe(
'https://epg.beinsports.com/utctime_ar.php?mins=00&serviceidentity=beinsports.com&cdate=2022-05-08'
)
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve('sites/beinsports.com/__data__/content.html'))
const results = parser({ date, channel, content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2022-05-07T19:30:00.000Z',
stop: '2022-05-07T21:20:00.000Z',
title: 'Lorient vs Marseille',
category: ['Ligue 1 2021/22']
})
})
it('can parse response for tomorrow', () => {
const date = dayjs.utc('2022-05-09', 'YYYY-MM-DD').startOf('d')
const content = fs.readFileSync(
path.resolve('sites/beinsports.com/__data__/content_tomorrow.html')
)
const results = parser({ date, channel, content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2022-05-08T21:20:00.000Z',
stop: '2022-05-08T23:10:00.000Z',
title: 'Celtic vs Hearts',
category: ['SPFL Premiership 2021/22']
})
})
it('can parse US response', () => {
const content = fs.readFileSync(path.resolve('sites/beinsports.com/__data__/content_us.html'))
const results = parser({ date, channel, content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2022-05-07T20:00:00.000Z',
stop: '2022-05-07T22:00:00.000Z',
title: 'Basaksehir vs. Galatasaray',
category: ['Fútbol Turco Superliga', 'Soccer']
})
})
it('can handle empty guide', () => {
const noContent = fs.readFileSync(path.resolve('sites/beinsports.com/__data__/no-content.html'))
const result = parser({
date,
channel,
content: noContent
})
expect(result).toMatchObject([])
})

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="en" xmltv_id="beINSports1Australia.au" site_id="au#1">BeIn Sports 1 Australia</channel>
<channel lang="en" xmltv_id="beINSports2Australia.au" site_id="au#2">BeIn Sports 2 Australia</channel>
<channel lang="en" xmltv_id="beINSports3Australia.au" site_id="au#3">BeIn Sports 3 Australia</channel>
</channels>
</site>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="fr" xmltv_id="beINSports1France.fr" site_id="france#1">BeIN Sports 1 HD France</channel>
<channel lang="fr" xmltv_id="beINSports2France.fr" site_id="france#2">BeIN Sports 2 HD France</channel>
<channel lang="fr" xmltv_id="beINSports3France.fr" site_id="france#3">BeIN Sports 3 France</channel>
<channel lang="fr" xmltv_id="beINSportsMax4France.fr" site_id="france#4">BeIN Sports Max 4 France</channel>
<channel lang="fr" xmltv_id="beINSportsMax5France.fr" site_id="france#5">BeIN Sports Max 5 France</channel>
<channel lang="fr" xmltv_id="beINSportsMax6France.fr" site_id="france#6">BeIN Sports Max 6 France</channel>
<channel lang="fr" xmltv_id="beINSportsMax7France.fr" site_id="france#7">BeIN Sports Max 7 France</channel>
<channel lang="fr" xmltv_id="beINSportsMax8France.fr" site_id="france#8">BeIN Sports Max 8 France</channel>
<channel lang="fr" xmltv_id="beINSportsMax9France.fr" site_id="france#9">BeIN Sports Max 9 France</channel>
<channel lang="fr" xmltv_id="beINSportsMax10France.fr" site_id="france#10">BeIN Sports Max 10 France</channel>
</channels>
</site>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="en" xmltv_id="beINSports1HongKong.hk" site_id="hk#1">BeIN Sports 1 Hong Kong</channel>
<channel lang="en" xmltv_id="beINSports2HongKong.hk" site_id="hk#2">BeIN Sports 2 Hong Kong</channel>
</channels>
</site>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="en" xmltv_id="beINSports1Indonesia.id" site_id="id#1">BeIN Sports 1 Indonesia</channel>
<channel lang="en" xmltv_id="beINSports3Indonesia.id" site_id="id#2">BeIN Sports 3 Indonesia</channel>
</channels>
</site>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="en" xmltv_id="beINSports1MalaysiaSingapore.my" site_id="my#1">BeIN Sports 1 Malaysia &amp; Singapore</channel>
</channels>
</site>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="en" xmltv_id="beINSports1Philippines.ph" site_id="id#1">BeIN Sports 1 Philippines</channel>
<channel lang="en" xmltv_id="beINSports3Philippines.ph" site_id="id#2">BeIN Sports 3 Philippines</channel>
</channels>
</site>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="ar" xmltv_id="beINSports.qa" site_id="ar#1">beIN SPORTS FTA</channel>
<channel lang="ar" xmltv_id="beINSportsNews.qa" site_id="ar#2">beIN SPORTS News</channel>
<channel lang="ar" xmltv_id="beINSports2.qa" site_id="ar#3">beIN SPORTS2</channel>
<channel lang="ar" xmltv_id="beINSports3.qa" site_id="ar#4">beIN SPORTS3</channel>
<channel lang="ar" xmltv_id="beINSports4.qa" site_id="ar#5">beIN SPORTS4</channel>
<channel lang="ar" xmltv_id="beINSports5.qa" site_id="ar#6">beIN SPORTS5</channel>
<channel lang="ar" xmltv_id="beINSports6.qa" site_id="ar#7">beIN SPORTS6</channel>
<channel lang="ar" xmltv_id="beINSports7.qa" site_id="ar#8">beIN SPORTS7</channel>
<channel lang="ar" xmltv_id="beINSportsPremium3.qa" site_id="ar#9">beIN SPORTS3 PREMIUM</channel>
<channel lang="ar" xmltv_id="beINSportsXtra1.qa" site_id="ar#10">beIN SPORTS XTRA1</channel>
<channel lang="ar" xmltv_id="beINSportsXtra2.qa" site_id="ar#11">beIN SPORTS XTRA2</channel>
<channel lang="ar" xmltv_id="beIN4K.qa" site_id="ar#12">beIN 4k</channel>
<channel lang="ar" xmltv_id="beINSportsAFC.qa" site_id="ar#13">beIN SPORTS AFC</channel>
<channel lang="ar" xmltv_id="beINSportsAFC1.qa" site_id="ar#14">beIN SPORTS AFC1</channel>
<channel lang="ar" xmltv_id="beINSportsAFC2.qa" site_id="ar#15">beIN SPORTS AFC2</channel>
<channel lang="ar" xmltv_id="beINSportsAFC3.qa" site_id="ar#16">beIN SPORTS AFC3</channel>
<channel lang="ar" xmltv_id="beINSportsNBA.qa" site_id="ar#17">beIN SPORTS NBA</channel>
<channel lang="ar" xmltv_id="beINSportsEnglish1.qa" site_id="ar#18">beIN SPORTS1 ENGLISH</channel>
<channel lang="ar" xmltv_id="beINSportsEnglish2.qa" site_id="ar#19">beIN SPORTS2 ENGLISH</channel>
<channel lang="ar" xmltv_id="beINSportsEnglish3.qa" site_id="ar#20">beIN SPORTS3 ENGLISH</channel>
<channel lang="ar" xmltv_id="beINSportsFrench1.qa" site_id="ar#21">beIN SPORTS1 FRENCH</channel>
<channel lang="ar" xmltv_id="beINSportsFrench2.qa" site_id="ar#22">beIN SPORTS2 FRENCH</channel>
<channel lang="ar" xmltv_id="beINSportsFrench3.qa" site_id="ar#23">beIN SPORTS3 FRENCH</channel>
<channel lang="ar" xmltv_id="beINSportsMax1.qa" site_id="ar#24">beIN SPORTS MAX 1</channel>
<channel lang="ar" xmltv_id="beINSportsMax2.qa" site_id="ar#25">beIN SPORTS MAX 2</channel>
</channels>
</site>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="en" xmltv_id="beINSports.qa" site_id="#1">BeIn Sports</channel>
<channel lang="en" xmltv_id="beINSportsNews.qa" site_id="#2">BeIn Sports News</channel>
<channel lang="en" xmltv_id="beINSports2.qa" site_id="#3">BeIn Sports 2</channel>
<channel lang="en" xmltv_id="beINSports3.qa" site_id="#4">BeIn Sports 3</channel>
<channel lang="en" xmltv_id="beINSports4.qa" site_id="#5">BeIn Sports 4</channel>
<channel lang="en" xmltv_id="beINSports5.qa" site_id="#6">BeIn Sports 5</channel>
<channel lang="en" xmltv_id="beINSports6.qa" site_id="#7">BeIn Sports 6</channel>
<channel lang="en" xmltv_id="beINSports7.qa" site_id="#8">BeIn Sports 7</channel>
<channel lang="en" xmltv_id="beINSportsPremium3.qa" site_id="#9">BeIn Sports Premium 3</channel>
<channel lang="en" xmltv_id="beINSportsXtra1.qa" site_id="#10">BeIn Sports Xtra 1</channel>
<channel lang="en" xmltv_id="beINSportsXtra2.qa" site_id="#11">BeIn Sports Xtra 2</channel>
<channel lang="en" xmltv_id="beIN4K.qa" site_id="#12">BeIn 4K</channel>
<channel lang="en" xmltv_id="beINSportsNBA.qa" site_id="#13">BeIn NBA</channel>
<channel lang="en" xmltv_id="beINSportsEnglish1.qa" site_id="#14">BeIn Sports English 1</channel>
<channel lang="en" xmltv_id="beINSportsEnglish2.qa" site_id="#15">BeIn Sports English 2</channel>
<channel lang="en" xmltv_id="beINSportsEnglish3.qa" site_id="#16">BeIn Sports English 3</channel>
<channel lang="fr" xmltv_id="beINSportsFrench1.qa" site_id="#17">BeIn Sports French 1</channel>
<channel lang="fr" xmltv_id="beINSportsFrench2.qa" site_id="#18">BeIn Sports French 2</channel>
<channel lang="fr" xmltv_id="beINSportsFrench3.qa" site_id="#19">BeIn Sports French 3</channel>
</channels>
</site>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="en" xmltv_id="beINSports1Thailand.th" site_id="th#1">BeIN Sports 1 Thailand</channel>
<channel lang="en" xmltv_id="beINSports3Thailand.th" site_id="th#2">BeIN Sports 3 Thailand</channel>
</channels>
</site>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="en" xmltv_id="beINSportsUSA.us" site_id="us#1">BeIN Sports USA</channel>
<channel lang="en" xmltv_id="beINSportsenEspanol.us" site_id="us#2">BeIN Sports en Español</channel>
<channel lang="en" xmltv_id="beINSPORTSXTRA.us" site_id="us#3">BeIN Sports Xtra USA</channel>
<channel lang="en" xmltv_id="beINSPORTSXTRAenEspanol.us" site_id="us#4">BeIN Sports Xtra en Español</channel>
<channel lang="en" xmltv_id="beINSports3USA.us" site_id="us#5">BeIN Sports 3 USA</channel>
<channel lang="en" xmltv_id="beINSports4USA.us" site_id="us#6">BeIN Sports 4 USA</channel>
<channel lang="en" xmltv_id="beINSports5USA.us" site_id="us#7">BeIN Sports 5 USA</channel>
<channel lang="en" xmltv_id="beINSports6USA.us" site_id="us#8">BeIN Sports 6 USA</channel>
<channel lang="en" xmltv_id="beINSports7USA.us" site_id="us#9">BeIN Sports 7 USA</channel>
<channel lang="en" xmltv_id="beINSports8USA.us" site_id="us#10">BeIN Sports 8 USA</channel>
</channels>
</site>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="beinsports.com">
<channels>
<channel lang="es" xmltv_id="beINSportsUSA.us" site_id="us_es#1">BeIN Sports USA</channel>
<channel lang="es" xmltv_id="beINSportsenEspanol.us" site_id="us_es#2">BeIN Sports en Español</channel>
<channel lang="es" xmltv_id="beINSPORTSXTRA.us" site_id="us_es#3">BeIN Sports Xtra USA</channel>
<channel lang="es" xmltv_id="beINSPORTSXTRAenEspanol.us" site_id="us_es#4">BeIN Sports Xtra en Español</channel>
<channel lang="es" xmltv_id="beINSports3USA.us" site_id="us_es#5">BeIN Sports 3 USA</channel>
<channel lang="es" xmltv_id="beINSports4USA.us" site_id="us_es#6">BeIN Sports 4 USA</channel>
<channel lang="es" xmltv_id="beINSports5USA.us" site_id="us_es#7">BeIN Sports 5 USA</channel>
<channel lang="es" xmltv_id="beINSports6USA.us" site_id="us_es#8">BeIN Sports 6 USA</channel>
<channel lang="es" xmltv_id="beINSports7USA.us" site_id="us_es#9">BeIN Sports 7 USA</channel>
<channel lang="es" xmltv_id="beINSports8USA.us" site_id="us_es#10">BeIN Sports 8 USA</channel>
</channels>
</site>

View File

@@ -0,0 +1,386 @@
<ul class="sc_day">
<li onclick="setWeek('prev');"> < </li>
<li onclick="setDay('2023-01-23');" class="">
<span>01.23</span>
<p></p>
</li>
<li onclick="setDay('2023-01-24');" class=""><!-- 선택된 편성표 요일에 클래스 부여 -->
<span>01.24</span>
<p></p>
</li>
<li onclick="setDay('2023-01-25');" class="">
<span>01.25</span>
<p></p>
</li>
<li onclick="setDay('2023-01-26');" class="on">
<span>01.26</span>
<p></p>
</li>
<li onclick="setDay('2023-01-27');" class="">
<span>01.27</span>
<p></p>
</li>
<li onclick="setDay('2023-01-28');" class="">
<span>01.28</span>
<p></p>
</li>
<li onclick="setDay('2023-01-29');" class="">
<span>01.29</span>
<p></p>
</li>
<li onclick="setWeek('next');"> > </li>
</ul>
<dl class="sc_time">
<dt>
<span>시간</span>
<span>장르</span>
<span>프로그램</span>
<span>회차</span>
<span>세부정보</span>
<span>방송시간</span>
</dt>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>00:00</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
더트롯쇼 </span>
<span>36회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>60분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>01:00</span>
<span><p class="sc_col2">교양</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
특종세상 </span>
<span>21회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>70분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>02:10</span>
<span><p class="sc_col2">교양</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
특종세상 </span>
<span>22회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>70분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>03:20</span>
<span><p class="sc_col2">교양</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
나는 자연인이다 </span>
<span>124회</span>
<span>
<p class="sc_year1">
ALL </p>
<p class="on">HD</p><!-- 화질 -->
<p ></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>70분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>04:30</span>
<span><p >패션/뷰티</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
탑시크릿란제리HD </span>
<span>1회</span>
<span>
<p class="sc_year4">
19 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p class="on">Original</p><!-- 자체 -->
</span>
<span>30분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>05:00</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
SALON INTERNATIONAL DE LA LINGERIE </span>
<span>7회</span>
<span>
<p class="sc_year4">
19 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p class="on">Original</p><!-- 자체 -->
</span>
<span>30분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>05:30</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
노컷 란제리 페스티벌 </span>
<span>14회</span>
<span>
<p class="sc_year4">
19 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>60분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>06:30</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
요가에 빠지다 </span>
<span>7회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p class="on">Original</p><!-- 자체 -->
</span>
<span>40분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>07:10</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
이제 만나러 갑니다 </span>
<span>20회</span>
<span>
<p class="sc_year2">
12 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>70분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>08:20</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
미스터트롯 영웅들의 탄생 </span>
<span>5회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p ></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>100분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>10:00</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
미스터트롯 영웅들의 탄생 </span>
<span>6회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p ></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>100분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>11:40</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
불타는 트롯맨 5 </span>
<span>3회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p ></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>80분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>13:00</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
화요일은 밤이 좋아 </span>
<span>17회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>130분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>15:10</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
불타는 트롯맨 6 </span>
<span>3회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p ></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>110분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>17:00</span>
<span><p class="sc_col2">교양</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
행복한 힐링 메이트 </span>
<span>41회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p ></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>60분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>18:00</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
내일은 미스트롯 2 </span>
<span>7회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>180분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>21:00</span>
<span><p >연예/오락</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
불타는 트롯맨 3 </span>
<span>2회</span>
<span>
<p class="sc_year3">
15 </p>
<p class="on">HD</p><!-- 화질 -->
<p ></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>110분</span>
</dd>
<dd class=""><!-- onair 시 class="on" 추가 -->
<span>22:50</span>
<span><p class="sc_col2">교양</p></span>
<span class="sdfsdf">
<script>
document.writeln($('.sc_time').val("outerWidth : " + $(".sdfsdf").outerWidth()););
</script>
나는 자연인이다 </span>
<span>154회</span>
<span>
<p class="sc_year1">
ALL </p>
<p class="on">HD</p><!-- 화질 -->
<p class="on"></p><!-- 본/재방 -->
<p ></p><!-- 생방송 -->
<p >Original</p><!-- 자체 -->
</span>
<span>70분</span>
</dd>
</dl>

View File

@@ -0,0 +1,44 @@
<ul class="sc_day">
<li onclick="setWeek('prev');"> < </li>
<li onclick="setDay('2023-01-23');" class="">
<span>01.23</span>
<p></p>
</li>
<li onclick="setDay('2023-01-24');" class=""><!-- 선택된 편성표 요일에 클래스 부여 -->
<span>01.24</span>
<p></p>
</li>
<li onclick="setDay('2023-01-25');" class="">
<span>01.25</span>
<p></p>
</li>
<li onclick="setDay('2023-01-26');" class="on">
<span>01.26</span>
<p></p>
</li>
<li onclick="setDay('2023-01-27');" class="">
<span>01.27</span>
<p></p>
</li>
<li onclick="setDay('2023-01-28');" class="">
<span>01.28</span>
<p></p>
</li>
<li onclick="setDay('2023-01-29');" class="">
<span>01.29</span>
<p></p>
</li>
<li onclick="setWeek('next');"> > </li>
</ul>
<dl class="sc_time">
<dt>
<span>시간</span>
<span>장르</span>
<span>프로그램</span>
<span>회차</span>
<span>세부정보</span>
<span>방송시간</span>
</dt>
<div><img src="/img/noschedule.jpg"></div></dl>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="berrymedia.co.kr">
<channels>
<channel lang="ko" xmltv_id="BallTV.kr" site_id="6">BallTV</channel>
<channel lang="ko" xmltv_id="CookTV.kr" site_id="2">CookTV</channel>
<channel lang="ko" xmltv_id="GMTV.kr" site_id="4">GMTV</channel>
<channel lang="ko" xmltv_id="GTV.kr" site_id="">GTV</channel>
<channel lang="ko" xmltv_id="LifeSportsTV.kr" site_id="3">생활체육TV</channel>
<channel lang="ko" xmltv_id="UHDDreamTV.kr" site_id="5">UHDDreamTV</channel>
</channels>
</site>

View File

@@ -0,0 +1,93 @@
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
dayjs.Ls.en.weekStart = 1
module.exports = {
site: 'berrymedia.co.kr',
days: 2,
url({ channel }) {
return `http://www.berrymedia.co.kr/schedule_proc${channel.site_id}.php`
},
request: {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
data({ date }) {
let params = new URLSearchParams()
let startOfWeek = date.startOf('week').format('YYYY-MM-DD')
let endOfWeek = date.endOf('week').format('YYYY-MM-DD')
params.append('week', `${startOfWeek}~${endOfWeek}`)
params.append('day', date.format('YYYY-MM-DD'))
return params
}
},
parser({ content, date }) {
const programs = []
const items = parseItems(content)
items.forEach(item => {
const $item = cheerio.load(item)
const prev = programs[programs.length - 1]
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),
category: parseCategory($item),
rating: parseRating($item),
start,
stop
})
})
return programs
}
}
function parseStart($item, date) {
const time = $item('span:nth-child(1)').text().trim()
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'Asia/Seoul')
}
function parseTitle($item) {
return $item('span.sdfsdf').clone().children().remove().end().text().trim()
}
function parseCategory($item) {
return $item('span:nth-child(2) > p').text().trim()
}
function parseRating($item) {
const rating = $item('span:nth-child(5) > p:nth-child(1)').text().trim()
return rating
? {
system: 'KMRB',
value: rating
}
: null
}
function parseItems(content, channel, date) {
const $ = cheerio.load(content)
return $('.sc_time dd').toArray()
}

View File

@@ -0,0 +1,79 @@
// npx epg-grabber --config=sites/berrymedia.co.kr/berrymedia.co.kr.config.js --channels=sites/berrymedia.co.kr/berrymedia.co.kr.channels.xml --output=guide.xml --days=2
const { parser, url, request } = require('./berrymedia.co.kr.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('2023-01-26', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '',
xmltv_id: 'GTV.kr'
}
it('can generate valid url', () => {
expect(url({ channel })).toBe('http://www.berrymedia.co.kr/schedule_proc.php')
})
it('can generate request method', () => {
expect(request.method).toBe('POST')
})
it('can generate valid request headers', () => {
expect(request.headers).toMatchObject({
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
})
})
it('can generate valid request data', () => {
let params = request.data({ date })
expect(params.get('week')).toBe('2023-01-23~2023-01-29')
expect(params.get('day')).toBe('2023-01-26')
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'), 'utf8')
let results = parser({ content, date })
results = results.map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2023-01-25T15:00:00.000Z',
stop: '2023-01-25T16:00:00.000Z',
title: `더트롯쇼`,
category: '연예/오락',
rating: {
system: 'KMRB',
value: '15'
}
})
expect(results[17]).toMatchObject({
start: '2023-01-26T13:50:00.000Z',
stop: '2023-01-26T14:20:00.000Z',
title: `나는 자연인이다`,
category: '교양',
rating: {
system: 'KMRB',
value: 'ALL'
}
})
})
it('can handle empty guide', () => {
const results = parser({
date,
content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'), 'utf8')
})
expect(results).toMatchObject([])
})

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="bt.com">
<channels>
<channel lang="en" xmltv_id="4seven.uk" site_id="hswj">4seven</channel>
<channel lang="en" xmltv_id="5Action.uk" site_id="hsvx">5 Action</channel>
<channel lang="en" xmltv_id="5Select.uk" site_id="ht94">5 Select</channel>
<channel lang="en" xmltv_id="5Star.uk" site_id="hsvw">5 Star</channel>
<channel lang="en" xmltv_id="5USA.uk" site_id="hsvk">5 USA</channel>
<channel lang="en" xmltv_id="AlJazeeraEnglish.qa" site_id="hsyp">Al Jazeera English</channel>
<channel lang="en" xmltv_id="BBCAlba.uk" site_id="hs6q">BBC Alba</channel>
<channel lang="en" xmltv_id="BBCFour.uk" site_id="hst5">BBC Four</channel>
<channel lang="en" xmltv_id="BBCNews.uk" site_id="hsx4">BBC News</channel>
<channel lang="en" xmltv_id="BBCOneEngland.uk" site_id="hsxv">BBC One HD</channel>
<channel lang="en" xmltv_id="BBCOneCambridgeshire.uk" site_id="hs56">BBC One Cambridgeshire</channel>
<channel lang="en" xmltv_id="BBCOneChannelIslands.uk" site_id="hs5y">BBC One Channel Islands</channel>
<channel lang="en" xmltv_id="BBCOneEastMidlands.uk" site_id="hs6h">BBC One East Midlands</channel>
<channel lang="en" xmltv_id="BBCOneLondon.uk" site_id="hs44">BBC One London</channel>
<channel lang="en" xmltv_id="BBCOneNorthEastCumbria.uk" site_id="hs2t">BBC One North East &amp; Cumbria</channel>
<channel lang="en" xmltv_id="BBCOneNorthWest.uk" site_id="hs5k">BBC One North West</channel>
<channel lang="en" xmltv_id="BBCOneOxfordshire.uk" site_id="hstv">BBC One Oxford</channel>
<channel lang="en" xmltv_id="BBCOneScotland.uk" site_id="hs6n">BBC One Scotland</channel>
<channel lang="en" xmltv_id="BBCOneSouth.uk" site_id="hs5v">BBC One South</channel>
<channel lang="en" xmltv_id="BBCOneSouthEast.uk" site_id="hsz7">BBC One South East</channel>
<channel lang="en" xmltv_id="BBCOneSouthWest.uk" site_id="hs48">BBC One South West</channel>
<channel lang="en" xmltv_id="BBCOneWales.uk" site_id="hs4j">BBC One Wales</channel>
<channel lang="en" xmltv_id="BBCOneWest.uk" site_id="hs7x">BBC One West</channel>
<channel lang="en" xmltv_id="BBCOneWestMidlands.uk" site_id="hs4c">BBC One West Midlands</channel>
<channel lang="en" xmltv_id="BBCOneYorksLincs.uk" site_id="hs24">BBC One Yorks</channel>
<channel lang="en" xmltv_id="BBCParliament.uk" site_id="hsyk">BBC Parliament</channel>
<channel lang="en" xmltv_id="BBCScotland.uk" site_id="hs6s">BBC Scotland</channel>
<channel lang="en" xmltv_id="BBCTwoEngland.uk" site_id="hstw">BBC Two England</channel>
<channel lang="en" xmltv_id="BBCTwoWales.uk" site_id="hs4k">BBC Two Wales</channel>
<channel lang="en" xmltv_id="Blaze.uk" site_id="hswv">Blaze UK</channel>
<channel lang="en" xmltv_id="BoomerangUK.uk" site_id="hstb">Boomerang UK</channel>
<channel lang="en" xmltv_id="BTSport1.uk" site_id="hspc">BT Sport 1</channel>
<channel lang="en" xmltv_id="BTSport10.uk" site_id="hsp6">BT Sport 10</channel>
<channel lang="en" xmltv_id="BTSport2.uk" site_id="hspd">BT Sport 2</channel>
<channel lang="en" xmltv_id="BTSport3.uk" site_id="hspf">BT Sport 3</channel>
<channel lang="en" xmltv_id="BTSport4.uk" site_id="hspg">BT Sport 4</channel>
<channel lang="en" xmltv_id="BTSport5.uk" site_id="hspy">BT Sport 5</channel>
<channel lang="en" xmltv_id="BTSport6.uk" site_id="hspz">BT Sport 6</channel>
<channel lang="en" xmltv_id="BTSport7.uk" site_id="hsp2">BT Sport 7</channel>
<channel lang="en" xmltv_id="BTSport8.uk" site_id="hsp4">BT Sport 8</channel>
<channel lang="en" xmltv_id="BTSport9.uk" site_id="hsp5">BT Sport 9</channel>
<channel lang="en" xmltv_id="BTSportBoxOffice.uk" site_id="hsqs">BT Sport Box Office UK</channel>
<channel lang="en" xmltv_id="BTSportBoxOffice2.uk" site_id="hsqt">BT Sport Box Office 2 UK</channel>
<channel lang="en" xmltv_id="BTSportUltimate.uk" site_id="hspr">BT Sport Ultimate</channel>
<channel lang="en" xmltv_id="CartoonitoUK.uk" site_id="hss8">Cartoonito UK</channel>
<channel lang="en" xmltv_id="CartoonNetworkUK.uk" site_id="hss2">Cartoon Network UK</channel>
<channel lang="en" xmltv_id="CBBC.uk" site_id="hsyd">CBBC</channel>
<channel lang="en" xmltv_id="CBeebies.uk" site_id="hsyf">CBeebies UK</channel>
<channel lang="en" xmltv_id="CBSDramaUK.uk" site_id="hswz">CBS Drama UK</channel>
<channel lang="en" xmltv_id="CBSJusticeUK.uk" site_id="hsv8">CBS Justice UK</channel>
<channel lang="en" xmltv_id="CBSRealityUK.uk" site_id="hswy">CBS Reality UK</channel>
<channel lang="en" xmltv_id="Challenge.uk" site_id="hswh">Challenge UK</channel>
<channel lang="en" xmltv_id="Channel4.uk" site_id="hsxy">Channel 4</channel>
<channel lang="en" xmltv_id="Channel5.uk" site_id="hsxz">Channel 5</channel>
<channel lang="en" xmltv_id="Channel5Plus1.uk" site_id="hswf">Channel 5 +1</channel>
<channel lang="en" xmltv_id="CITV.uk" site_id="hsyc">CITV</channel>
<channel lang="en" xmltv_id="ClublandTV.uk" site_id="hs8s">Clubland TV</channel>
<channel lang="en" xmltv_id="ComedyCentralUK.uk" site_id="hsrs">Comedy Central UK</channel>
<!-- <channel lang="en" xmltv_id="" site_id="hsxg">Craft Store TV</channel> -->
<channel lang="en" xmltv_id="CreateandCraft.uk" site_id="hsxr">Create and Craft</channel>
<channel lang="en" xmltv_id="Davejavu.uk" site_id="hsxb">Dave ja vu</channel>
<channel lang="en" xmltv_id="Dave.uk" site_id="hsvh">Dave UK</channel>
<channel lang="en" xmltv_id="DMAXUK.uk" site_id="hsv6">DMAX UK</channel>
<channel lang="en" xmltv_id="Drama.uk" site_id="hsvj">Drama UK</channel>
<channel lang="en" xmltv_id="E4Extra.uk" site_id="hsvv">E4 Extra</channel>
<channel lang="en" xmltv_id="E4.uk" site_id="hs4s">E4 UK</channel>
<channel lang="en" xmltv_id="E4Plus1.uk" site_id="hsvt">E4+1</channel>
<channel lang="en" xmltv_id="Eurosport1UK.uk" site_id="hspt">Eurosport 1 UK</channel>
<channel lang="en" xmltv_id="Eurosport2UK.uk" site_id="hspv">Eurosport 2 UK</channel>
<channel lang="en" xmltv_id="Film4.uk" site_id="hsvb">Film 4 UK</channel>
<channel lang="en" xmltv_id="Film4Plus1.uk" site_id="hswg">Film 4 UK +1</channel>
<channel lang="en" xmltv_id="FoodNetworkUK.uk" site_id="hswb">Food Network UK</channel>
<channel lang="en" xmltv_id="ViaplayXtra.uk" site_id="hsww">Viaplay Xtra</channel>
<channel lang="en" xmltv_id="GBNews.uk" site_id="ht7w">GB News</channel>
<channel lang="en" xmltv_id="GemsTV.uk" site_id="hswd">Gems TV</channel>
<channel lang="en" xmltv_id="Gold.uk" site_id="hsrr">Gold HD</channel>
<channel lang="en" xmltv_id="GreatMovies.uk" site_id="hsvy">Great! Movies</channel>
<channel lang="en" xmltv_id="GreatMoviesAction.uk" site_id="hsv9">Great! Movies Action</channel>
<channel lang="en" xmltv_id="GreatMoviesActionPlus1.uk" site_id="hswt">Great! Movies Action + 1</channel>
<channel lang="en" xmltv_id="GreatMoviesClassic.uk" site_id="hswn">Great! Movies Classic</channel>
<channel lang="en" xmltv_id="GreatMoviesClassicPlus1.uk" site_id="hs8q">Great! Movies Classic +1</channel>
<channel lang="en" xmltv_id="GreatTV.uk" site_id="hswk">Great! TV</channel>
<channel lang="en" xmltv_id="GreatTVPlus1.uk" site_id="hs8p">Great! TV +1</channel>
<channel lang="en" xmltv_id="HGTVUK.uk" site_id="hswc">HGTV UK</channel>
<channel lang="en" xmltv_id="Legend.uk" site_id="hsw2">Horror Channel UK</channel>
<!-- <channel lang="en" xmltv_id="" site_id="hsxq">Ideal Extra</channel> -->
<channel lang="en" xmltv_id="IdealWorldTV.uk" site_id="hsvm">Ideal World</channel>
<channel lang="en" xmltv_id="ITV1.uk" site_id="hs2m">ITV</channel>
<channel lang="en" xmltv_id="ITV2.uk" site_id="hst2">ITV 2</channel>
<channel lang="en" xmltv_id="ITV2Plus1.uk" site_id="hsvs">ITV 2 +1</channel>
<channel lang="en" xmltv_id="ITV3.uk" site_id="hst6">ITV 3</channel>
<channel lang="en" xmltv_id="ITV3Plus1.uk" site_id="hswr">ITV 3 +1</channel>
<channel lang="en" xmltv_id="ITV4.uk" site_id="hsvp">ITV 4</channel>
<channel lang="en" xmltv_id="ITV4Plus1.uk" site_id="hsws">ITV 4 +1</channel>
<channel lang="en" xmltv_id="ITVBe.uk" site_id="hs52">ITV Be</channel>
<channel lang="en" xmltv_id="JewelleryMaker.uk" site_id="hsw5">Jewellery Maker</channel>
<channel lang="en" xmltv_id="LFCTV.uk" site_id="hs8k">LFC TV</channel>
<channel lang="en" xmltv_id="More4.uk" site_id="hsvg">More 4 UK</channel>
<channel lang="en" xmltv_id="More4Plus1.uk" site_id="hsxh">More4+1</channel>
<channel lang="en" xmltv_id="MTVUK.uk" site_id="hsrh">MTV UK</channel>
<channel lang="en" xmltv_id="NationalGeographicUK.uk" site_id="hsr4">National Geographic UK</channel>
<channel lang="en" xmltv_id="NickelodeonUK.uk" site_id="hstc">Nickelodeon</channel>
<channel lang="en" xmltv_id="NickJrUK.uk" site_id="hstd">Nick Jr UK</channel>
<channel lang="en" xmltv_id="NicktoonsUK.uk" site_id="hss6">NickToons UK</channel>
<channel lang="en" xmltv_id="Now70s.uk" site_id="hs8r">Now 70&apos;s</channel>
<channel lang="en" xmltv_id="Now80s.uk" site_id="hsxf">Now 80&apos;s</channel>
<channel lang="en" xmltv_id="Now90s.uk" site_id="hs8t">Now 90&apos;s</channel>
<channel lang="en" xmltv_id="PBSAmerica.uk" site_id="hsxm">PBS America</channel>
<channel lang="en" xmltv_id="Pick.uk" site_id="hst7">Pick UK</channel>
<channel lang="en" xmltv_id="Pop.uk" site_id="hsyg">Pop</channel>
<channel lang="en" xmltv_id="PopMax.uk" site_id="hs8x">Pop Max</channel>
<channel lang="en" xmltv_id="QuestRedUK.uk" site_id="hsv7">Quest Red UK</channel>
<channel lang="en" xmltv_id="QuestRedUKPlus1.uk" site_id="hsw4">Quest Red UK +1</channel>
<channel lang="en" xmltv_id="QuestUK.uk" site_id="hsx8">Quest</channel>
<channel lang="en" xmltv_id="QuestUKPlus1.uk" site_id="hsw8">Quest UK +1</channel>
<channel lang="en" xmltv_id="QVCBeautyUK.uk" site_id="hsx6">QVC UK Beauty</channel>
<channel lang="en" xmltv_id="QVCStyleUK.uk" site_id="hsv5">QVC Style UK</channel>
<channel lang="en" xmltv_id="QVCUK.uk" site_id="hsx5">QVC UK</channel>
<channel lang="en" xmltv_id="Really.uk" site_id="hsvf">Really UK</channel>
<channel lang="en" xmltv_id="S4C.uk" site_id="hs4n">S4C</channel>
<channel lang="en" xmltv_id="SkyArts.uk" site_id="hsrx">Sky Arts HD</channel>
<channel lang="en" xmltv_id="SkyCinemaAction.uk" site_id="hstp">Sky Cinema Action HD</channel>
<channel lang="en" xmltv_id="SkyCinemaAnimation.uk" site_id="hstf">Sky Cinema Animation HD</channel>
<channel lang="en" xmltv_id="SkyCinemaComedy.uk" site_id="hstq">Sky Cinema Comedy HD</channel>
<channel lang="en" xmltv_id="SkyCinemaDrama.uk" site_id="hsts">Sky Cinema Drama HD</channel>
<channel lang="en" xmltv_id="SkyCinemaFamily.uk" site_id="hstn">Sky Cinema Family HD</channel>
<channel lang="en" xmltv_id="SkyCinemaGreats.uk" site_id="hstk">Sky Cinema Greats HD</channel>
<channel lang="en" xmltv_id="SkyCinemaHits.uk" site_id="hstj">Sky Cinema Hits HD</channel>
<channel lang="en" xmltv_id="SkyCinemaPremiere.uk" site_id="hstg">Sky Cinema Premiere HD</channel>
<channel lang="en" xmltv_id="SkyCinemaSciFiHorror.uk" site_id="hstt">Sky Cinema Sci-Fi Horror HD</channel>
<channel lang="en" xmltv_id="SkyCinemaSelect.uk" site_id="hsth">Sky Cinema Select</channel>
<channel lang="en" xmltv_id="SkyCinemaThriller.uk" site_id="hstr">Sky Cinema Thriller HD</channel>
<channel lang="en" xmltv_id="SkyComedy.uk" site_id="hsq9">Sky Comedy</channel>
<channel lang="en" xmltv_id="SkyCrime.uk" site_id="hsrc">Sky Crime</channel>
<channel lang="en" xmltv_id="SkyDocumentaries.uk" site_id="hsrk">Sky Documentaries</channel>
<channel lang="en" xmltv_id="SkyHistory.uk" site_id="hsr6">Sky History HD</channel>
<channel lang="en" xmltv_id="SkyMax.uk" site_id="hsrn">Sky Max HD</channel>
<channel lang="en" xmltv_id="SkyNature.uk" site_id="hsq2">Sky Nature</channel>
<channel lang="en" xmltv_id="SkyNews.uk" site_id="htdm">Sky News HD</channel>
<channel lang="en" xmltv_id="SkySciFi.uk" site_id="hsrv">Sky Sci-Fi</channel>
<channel lang="en" xmltv_id="SkyShowcase.uk" site_id="hvpg">Sky Showcase HD</channel>
<channel lang="en" xmltv_id="SkySportsAction.uk" site_id="hssw">Sky Sports Action</channel>
<channel lang="en" xmltv_id="SkySportsArena.uk" site_id="hssx">Sky Sports Arena</channel>
<channel lang="en" xmltv_id="SkySportsBoxOffice.uk" site_id="hsqv">Sky Sports Box Office</channel>
<channel lang="en" xmltv_id="SkySportsCricket.uk" site_id="hsss">Sky Sports Cricket</channel>
<channel lang="en" xmltv_id="SkySportsF1.uk" site_id="hssv">Sky Sports F1</channel>
<channel lang="en" xmltv_id="SkySportsFootball.uk" site_id="hssr">Sky Sports Football</channel>
<channel lang="en" xmltv_id="SkySportsGolf.uk" site_id="hsst">Sky Sports Golf</channel>
<channel lang="en" xmltv_id="SkySportsMainEvent.uk" site_id="hssp">Sky Sports Main Event</channel>
<channel lang="en" xmltv_id="SkySportsMix.uk" site_id="hssz">Sky Sports Mix</channel>
<channel lang="en" xmltv_id="SkySportsNews.uk" site_id="hssn">Sky Sports News UK</channel>
<channel lang="en" xmltv_id="SkySportsPremierLeague.uk" site_id="hssq">Sky Sports Premier League</channel>
<channel lang="en" xmltv_id="SkySportsRacing.uk" site_id="hssy">Sky Sports Racing</channel>
<channel lang="en" xmltv_id="SkyWitness.uk" site_id="hsq5">Sky Witness</channel>
<channel lang="en" xmltv_id="SmithsonianChannelUK.uk" site_id="hswq">Smithsonian Channel UK</channel>
<channel lang="en" xmltv_id="STV.uk" site_id="hs6w">STV</channel>
<channel lang="en" xmltv_id="STVPlus1.uk" site_id="hs8h">STV+1</channel>
<channel lang="en" xmltv_id="TalkingPicturesTV.uk" site_id="hsxd">Talking Pictures TV</channel>
<channel lang="en" xmltv_id="TBNUK.uk" site_id="hswx">TBN UK</channel>
<channel lang="en" xmltv_id="TinyPop.uk" site_id="hsyh">Tiny Pop</channel>
<channel lang="en" xmltv_id="TJC.uk" site_id="hswm">TJC</channel>
<channel lang="en" xmltv_id="TogetherTV.uk" site_id="hsxj">Together TV</channel>
<channel lang="en" xmltv_id="XpandedTV.uk" site_id="hsyv">Xpanded TV</channel>
<channel lang="en" xmltv_id="Yesterday.uk" site_id="hsvq">Yesterday</channel>
<channel lang="en" xmltv_id="YesterdayPlus1.uk" site_id="hsw7">Yesterday+1</channel>
</channels>
</site>

View File

@@ -0,0 +1,54 @@
const dayjs = require('dayjs')
module.exports = {
site: 'bt.com',
days: 2,
url: function ({ date, channel }) {
return `https://voila.metabroadcast.com/4/schedules/${
channel.site_id
}.json?key=b4d2edb68da14dfb9e47b5465e99b1b1&from=${date.utc().format()}&to=${date
.add(1, 'd')
.utc()
.format()}&source=api.youview.tv&annotations=content.description`
},
parser: function ({ content }) {
const programs = []
const items = parseItems(content)
items.forEach(item => {
programs.push({
title: item.item.title,
description: item.item.description,
icon: parseIcon(item),
season: parseSeason(item),
episode: parseEpisode(item),
start: parseStart(item),
stop: parseStop(item)
})
})
return programs
}
}
function parseItems(content) {
const data = JSON.parse(content)
return data && data.schedule.entries ? data.schedule.entries : []
}
function parseSeason(item) {
if (item.item.type !== 'episode') return null
return item.item.series_number || null
}
function parseEpisode(item) {
if (item.item.type !== 'episode') return null
return item.item.episode_number || null
}
function parseIcon(item) {
return item.item.image || null
}
function parseStart(item) {
return dayjs(item.broadcast.transmission_time)
}
function parseStop(item) {
return dayjs(item.broadcast.transmission_end_time)
}

View File

@@ -0,0 +1,50 @@
// npx epg-grabber --config=sites/bt.com/bt.com.config.js --channels=sites/bt.com/bt.com.channels.xml --output=guide.xml --days=2
const { parser, url } = require('./bt.com.config.js')
const axios = require('axios')
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-20', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: 'hsxv',
xmltv_id: 'BBCOneHD.uk'
}
it('can generate valid url', () => {
expect(url({ date, channel })).toBe(
'https://voila.metabroadcast.com/4/schedules/hsxv.json?key=b4d2edb68da14dfb9e47b5465e99b1b1&from=2022-03-20T00:00:00Z&to=2022-03-21T00:00:00Z&source=api.youview.tv&annotations=content.description'
)
})
it('can parse response', () => {
const content = `{"schedule":{"channel":{"title":"BBC One HD","id":"hsxv","uri":"http://api.youview.tv/channels/dvb://233a..4484","images":[{"uri":"https://images.metabroadcast.com?source=http%3A%2F%2Fimages-live.youview.tv%2Fimages%2Fentity%2F8c4c0357-d7ee-5d8a-8bc4-b177b6875128%2Fident%2F1_1024x532.png%3Fdefaultimg%3D0&ETag=r5vyecG6of%2BhCbHeEClx0Q%3D%3D","mime_type":"image/png","type":null,"color":"monochrome","theme":"light_monochrome","aspect_ratio":null,"availability_start":null,"availability_end":null,"width":1024,"height":532,"hasTitleArt":null,"source":null}],"available_from":[{"key":"api.youview.tv","name":"YouView JSON","country":"GB"}],"source":{"key":"api.youview.tv","name":"YouView JSON","country":"GB"},"same_as":[],"media_type":"video","broadcaster":null,"aliases":[{"namespace":"youview:serviceLocator","value":"dvb://233a..4484"},{"namespace":"youview:channel:id","value":"8c4c0357-d7ee-5d8a-8bc4-b177b6875128"}],"genres":[],"high_definition":true,"timeshifted":null,"regional":null,"related_links":[],"start_date":null,"advertised_from":null,"advertised_to":null,"short_description":null,"medium_description":null,"long_description":null,"region":null,"target_regions":[],"channel_type":"CHANNEL","interactive":false,"transmission_types":["DTT"],"quality":"HD","hdr":false},"source":"api.youview.tv","entries":[{"broadcast":{"aliases":[{"namespace":"api.youview.tv:slot","value":"dvb://233a..4484;76bc"},{"namespace":"dvb:event-locator","value":"dvb://233a..4484;76bc"},{"namespace":"dvb:pcrid","value":"crid://fp.bbc.co.uk/b/3Q30S2"},{"namespace":"youview:schedule_event:id","value":"79d318f3-b41a-582d-b089-7b0172538b42"}],"transmission_time":"2022-03-19T23:30:00.000Z","transmission_end_time":"2022-03-20T01:20:00.000Z","broadcast_duration":6600,"broadcast_on":"hsxv","schedule_date":null,"repeat":null,"subtitled":true,"signed":null,"audio_described":false,"high_definition":null,"widescreen":null,"surround":null,"live":null,"premiere":null,"continuation":null,"new_series":null,"new_episode":null,"new_one_off":null,"revised_repeat":null,"blackout_restriction":{"all":false}},"item":{"id":"n72nsw","type":"item","display_title":{"title":"The Finest Hours (2016)","subtitle":null},"year":null,"media_type":"video","specialization":"tv","source":{"key":"api.youview.tv","name":"YouView JSON","country":"GB"},"title":"The Finest Hours (2016)","description":"Drama based on a true story, recounting one of history's most daring coastguard rescue attempts. Stranded on a sinking oil tanker along with 30 other sailors, engineer Ray Sybert battles to buy his crew more time as Captain Bernie Webber and three of his colleagues tackle gigantic waves and gale-force winds in their astonishing bid to save the seamen.","image":"https://images.metabroadcast.com?source=http%3A%2F%2Fimages-live.youview.tv%2Fimages%2Fentity%2F52172983%2Fprimary%2F1_1024x576.jpg%3Fdefaultimg%3D0&ETag=z7ucT5kdAq7HuNQf%2FGTEJg%3D%3D","thumbnail":null,"duration":null,"container":null}}]},"terms_and_conditions":{"text":"Specific terms and conditions in your agreement with MetaBroadcast, and with any data provider, apply to your use of this data, and associated systems."},"results":1,"request":{"path":"/4/schedules/hsxv.json","parameters":{"annotations":"content.description","from":"2022-03-20T00:00:00Z","to":"2022-03-21T00:00:00Z","source":"api.youview.tv","key":"b4d2edb68da14dfb9e47b5465e99b1b1"}}}`
const result = parser({ content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(result).toMatchObject([
{
title: 'The Finest Hours (2016)',
description: `Drama based on a true story, recounting one of history's most daring coastguard rescue attempts. Stranded on a sinking oil tanker along with 30 other sailors, engineer Ray Sybert battles to buy his crew more time as Captain Bernie Webber and three of his colleagues tackle gigantic waves and gale-force winds in their astonishing bid to save the seamen.`,
icon: 'https://images.metabroadcast.com?source=http%3A%2F%2Fimages-live.youview.tv%2Fimages%2Fentity%2F52172983%2Fprimary%2F1_1024x576.jpg%3Fdefaultimg%3D0&ETag=z7ucT5kdAq7HuNQf%2FGTEJg%3D%3D',
season: null,
episode: null,
start: '2022-03-19T23:30:00.000Z',
stop: '2022-03-20T01:20:00.000Z'
}
])
})
it('can handle empty guide', () => {
const result = parser({
content: `{"schedule":{"channel":{"title":"BBC One HD","id":"hsxv","uri":"http://api.youview.tv/channels/dvb://233a..4484","images":[{"uri":"https://images.metabroadcast.com?source=http%3A%2F%2Fimages-live.youview.tv%2Fimages%2Fentity%2F8c4c0357-d7ee-5d8a-8bc4-b177b6875128%2Fident%2F1_1024x532.png%3Fdefaultimg%3D0&ETag=r5vyecG6of%2BhCbHeEClx0Q%3D%3D","mime_type":"image/png","type":null,"color":"monochrome","theme":"light_monochrome","aspect_ratio":null,"availability_start":null,"availability_end":null,"width":1024,"height":532,"hasTitleArt":null,"source":null}],"available_from":[{"key":"api.youview.tv","name":"YouView JSON","country":"GB"}],"source":{"key":"api.youview.tv","name":"YouView JSON","country":"GB"},"same_as":[],"media_type":"video","broadcaster":null,"aliases":[{"namespace":"youview:serviceLocator","value":"dvb://233a..4484"},{"namespace":"youview:channel:id","value":"8c4c0357-d7ee-5d8a-8bc4-b177b6875128"}],"genres":[],"high_definition":true,"timeshifted":null,"regional":null,"related_links":[],"start_date":null,"advertised_from":null,"advertised_to":null,"short_description":null,"medium_description":null,"long_description":null,"region":null,"target_regions":[],"channel_type":"CHANNEL","interactive":false,"transmission_types":["DTT"],"quality":"HD","hdr":false},"source":"api.youview.tv","entries":[]},"terms_and_conditions":{"text":"Specific terms and conditions in your agreement with MetaBroadcast, and with any data provider, apply to your use of this data, and associated systems."},"results":1,"request":{"path":"/4/schedules/hsxv.json","parameters":{"annotations":"content.description","from":"2022-03-20T00:00:00Z","to":"2022-03-21T00:00:00Z","source":"api.youview.tv","key":"b4d2edb68da14dfb9e47b5465e99b1b1"}}}`
})
expect(result).toMatchObject([])
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="cablego.com.pe">
<channels>
<channel lang="es" xmltv_id="AmericaTelevision.pe" site_id="0#AMERICATV">AMERICA TV</channel>
<channel lang="es" xmltv_id="ATV.pe" site_id="0#ATVHD">ATV</channel>
<channel lang="es" xmltv_id="ATVPlus.pe" site_id="0#ATVMAS">ATV+</channel>
<channel lang="es" xmltv_id="BHTV.pe" site_id="0#BHTV">BHTV</channel>
<channel lang="es" xmltv_id="Conecta2TV.pe" site_id="0#CONECTA2">CONECTA2 TV</channel>
<channel lang="es" xmltv_id="CongresoTV.pe" site_id="0#CANALCONGRESO">CONGRESO TV</channel>
<channel lang="es" xmltv_id="DePeliculaLatinAmerica.mx" site_id="1#DEPELICULA">DE PELICULA</channel>
<channel lang="es" xmltv_id="DistritoComedia.mx" site_id="3#DISTRITOCOMEDIA">DISTRITO COMEDIA</channel>
<channel lang="es" xmltv_id="EcuadorTV.ec" site_id="4#ECUADORTV">ECUADOR TV</channel>
<channel lang="es" xmltv_id="EuropaEuropa.ar" site_id="1#EUROPAEUROPA">EUROPA EUROPA</channel>
<channel lang="es" xmltv_id="ExitosaTV.pe" site_id="0#EXITOSATV">EXITOSA TV</channel>
<channel lang="es" xmltv_id="GlobalTV.pe" site_id="0#GLOBAL">GLOBAL</channel>
<channel lang="es" xmltv_id="GoldenEdgePanregional.mx" site_id="1#GOLDENEDGE">GOLDEN EDGE</channel>
<channel lang="es" xmltv_id="Karibena.pe" site_id="4#KARIBENA">KARIBEÑA</channel>
<channel lang="es" xmltv_id="Latina.pe" site_id="0#LATINA">LATINA</channel>
<channel lang="es" xmltv_id="Nativa.pe" site_id="0#NATIVA">NATIVA</channel>
<channel lang="es" xmltv_id="OvacionTV.pe" site_id="3#OVACION">OVACION</channel>
<channel lang="es" xmltv_id="PanamericanaTV.pe" site_id="0#PANAMERICANATV">PANAMERICANA TV</channel>
<channel lang="es" xmltv_id="PasionesLatinAmerica.us" site_id="2#PASIONES">PASIONES</channel>
<channel lang="es" xmltv_id="PBO.pe" site_id="0#PBO">PBO</channel>
<channel lang="es" xmltv_id="TVPeru.pe" site_id="0#TVPERU">TV PERU</channel>
<channel lang="es" xmltv_id="USMPTV.pe" site_id="0#USMPTV">USMP TV</channel>
<channel lang="es" xmltv_id="Venus.ar" site_id="4#VENUS">VENUS</channel>
<channel lang="es" xmltv_id="WillaxTV.pe" site_id="0#WILLAX">WILLAX</channel>
<!-- <channel lang="es" xmltv_id="" site_id="0#AMC">AMC</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="0#CloverCH">CLOVER CHANNEL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="0#FOXCHANNEL">STAR CHANNEL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="0#FX">FX</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="0#ID">ID</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="0#PARAMOUNTCH">PARAMOUNT CHANNEL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#ANIMALPLANET">ANIMAL PLANET</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#AZCINEMA">CINEMA INOLVIDABLE</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#AZCORAZON">CORAZON</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#CHESTRELLAS">CANAL DE LAS ESTRELLAS</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#CINECANAL">CINECANAL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#DISCOVERYCHANNEL">DISCOVERY CHANNEL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#DISCOVERYSCIENCE">DISCOVERY SCIENCE</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#DISCOVERYTHEATER">DISCOVERY THEATER</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#DISCOVERYTURBO">DISCOVERY TURBO</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#DISCOVERYWORLD">DISCOVERY WORLD</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#FILMSandARTS">FILMS &amp; ARTS</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#GOLDENLATINO">GOLDEN LATINO</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#NATGEO">NATGEO</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#SONYMOVIES">SONY MOVIES</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#TELEMUNDO">TELEMUNDO</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="1#UNIVISION">UNIVISION</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#AZMUNDO">MUNDO</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#BITME">BITME</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#DISCOVERYKIDS">DISCOVERY KIDS</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#DISNEYCHANNEL">DISNEY CHANNEL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#DISNEYJUNIOR">DISNEY JUNIOR</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#DREAMWORKS">DREAMWORKS</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#ESPN">ESPN</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#ESPN2">ESPN2</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#FOODNETWORK">FOOD NETWORK</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#GOURMET">GOURMET</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#HGTV">HGTV</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#HOMEANDHEALTH">HOME &amp; HEALTH</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#KANALD">KANAL D</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#MASCHIC">MAS CHIC</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#NICKELODEON">NICKELODEON</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#NICKJR">NICK JR</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#TELENOVELAS">TELENOVELAS</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#TRAVELANDLIVING">TLC</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="2#ZOOMOO">ZOOMOO</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#ANTENA3">ANTENA 3</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#BANDAMAX">BANDAMAX</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#CGTN">CGTN</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#ESPN3">ESPN3</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#ESPNMAS">ESPN EXTRA</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#FOXSPORTS">ESPN4</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#FOXSPORTS2">FOX SPORTS 2</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#FOXSPORTS3">FOX SPORTS 3</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#IVCNETWORKS">IVC NETWORKS</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#LANACIONAL">LA NACIONAL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#MTV">MTV</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#NICKMUSIC">NICKMUSIC</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#NOTICIASCARACOL">NOTICIAS CARACOL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#SBTBRASIL">SBT Brasil</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#TELEFE">TELEFE</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#TELEHITLATINO">TELEHIT LATINO</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#TELEHITMUSICA">TELEHIT MUSICA</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="3#TRECEARGENTINA">TRECE ARGENTINA</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#AandEMUNDO">A&amp;E</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#AXN">AXN</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#DW">DW</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#ECH">E!</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#HISTORY2">HISTORY 2</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#HISTORYCHANNEL">HISTORY CHANNEL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#LIFETIME">LIFE TIME</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#PLAYBOY">PLAYBOY</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#SONY">SONY</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#STUDIOUNIVERSAL">STUDIO UNIVERSAL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#SYFY">SYFY</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#UNIVERSAL">UNIVERSAL</channel> -->
<!-- <channel lang="es" xmltv_id="" site_id="4#WARNERCHANNEL">WARNER CH</channel> -->
</channels>
</site>

View File

@@ -0,0 +1,109 @@
const dayjs = require('dayjs')
const axios = require('axios')
const cheerio = require('cheerio')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
module.exports = {
site: 'cablego.com.pe',
days: 2,
request: {
method: 'POST',
headers: {
'x-requested-with': 'XMLHttpRequest'
},
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url({ channel, date }) {
const [page] = channel.site_id.split('#')
return `https://cablego.com.pe/epg/default/${date.format(
'YYYY-MM-DD'
)}?page=${page}&do=loadPage`
},
parser: function ({ content, channel, date }) {
let programs = []
const items = parseItems(content, channel)
items.forEach(item => {
const $item = cheerio.load(item)
const prev = programs[programs.length - 1]
let start = parseStart($item, date)
if (!start) return
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),
start,
stop
})
})
return programs
},
async channels() {
const promises = [0, 1, 2, 3, 4].map(page => {
return axios.post(
`https://cablego.com.pe/epg/default/2022-11-28?page=${page}&do=loadPage`,
null,
{
headers: {
'x-requested-with': 'XMLHttpRequest'
}
}
)
})
const channels = []
await Promise.allSettled(promises).then(results => {
results.forEach((r, page) => {
if (r.status === 'fulfilled') {
const html = r.value.data.snippets['snippet--channelGrid']
const $ = cheerio.load(html)
$('.epg-channel-strip').each((i, el) => {
const channelId = $(el).find('.epg-channel-logo').attr('id')
channels.push({
lang: 'es',
site_id: `${page}#${channelId}`,
name: $(el).find('img').attr('alt')
})
})
}
})
})
return channels
}
}
function parseTitle($item) {
return $item('span:nth-child(2) > a').text().trim()
}
function parseStart($item, date) {
const time = $item('.epg-show-start').text().trim()
return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'America/Lima')
}
function parseItems(content, channel) {
const [, channelId] = channel.site_id.split('#')
const data = JSON.parse(content)
if (!data || !data.snippets || !data.snippets['snippet--channelGrid']) return []
const html = data.snippets['snippet--channelGrid']
const $ = cheerio.load(html)
return $(`#${channelId}`).parent().find('.epg-show').toArray()
}

View File

@@ -0,0 +1,54 @@
// npm run channels:parse -- --config=./sites/cablego.com.pe/cablego.com.pe.config.js --output=./sites/cablego.com.pe/cablego.com.pe.channels.xml
// npx epg-grabber --config=sites/cablego.com.pe/cablego.com.pe.config.js --channels=sites/cablego.com.pe/cablego.com.pe.channels.xml --output=guide.xml --days=2
const { parser, url, request } = require('./cablego.com.pe.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-11-28', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '0#LATINA',
xmltv_id: 'Latina.pe'
}
it('can generate valid url', () => {
expect(url({ channel, date })).toBe(
'https://cablego.com.pe/epg/default/2022-11-28?page=0&do=loadPage'
)
})
it('can generate valid request method', () => {
expect(request.method).toBe('POST')
})
it('can generate valid request headers', () => {
expect(request.headers).toMatchObject({
'x-requested-with': 'XMLHttpRequest'
})
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
let results = parser({ content, channel, date }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2022-11-28T05:00:00.000Z',
stop: '2022-11-28T06:30:00.000Z',
title: 'Especiales Qatar'
})
})
it('can handle empty guide', () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json'))
const result = parser({ content, channel, date })
expect(result).toMatchObject([])
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More