Compare commits

...

4 Commits

Author SHA1 Message Date
6543f2ce6c update readme + add option to customize api endpoint
All checks were successful
Build docker container / build (push) Successful in 4m43s
2024-11-26 12:27:04 +01:00
e7b49898df fixes movistar plus
All checks were successful
Build docker container / build (push) Successful in 4m32s
2024-11-22 20:49:52 +01:00
99c7d0e2c6 change custom fix for movistarplus.es
All checks were successful
Build docker container / build (push) Successful in 4m58s
2024-11-22 15:46:57 +01:00
a46995b833 update readme for fixes autor attributions 2024-11-15 13:37:30 +01:00
4 changed files with 72 additions and 53 deletions

View File

@ -2,6 +2,7 @@ FROM node:21-alpine
ARG GIT_REPO=https://github.com/iptv-org/epg.git ARG GIT_REPO=https://github.com/iptv-org/epg.git
ARG GIT_BRANCH=master ARG GIT_BRANCH=master
ENV CRON_SCHEDULE="0 0,12 * * *" ENV CRON_SCHEDULE="0 0,12 * * *"
ENV API_URL="https://iptv-org.github.io/api"
ENV DAYS=14 ENV DAYS=14
ENV MAX_CONNECTIONS=10 ENV MAX_CONNECTIONS=10
ENV ENABLE_FIXES=false ENV ENABLE_FIXES=false
@ -49,5 +50,5 @@ RUN chmod +x "$START_SCRIPT" \
&& apk del git curl \ && apk del git curl \
&& rm -rf /var/cache/apk/* && rm -rf /var/cache/apk/*
SHELL ["/bin/bash", "-c"] SHELL ["/bin/bash", "-c"]
ENTRYPOINT bash $START_SCRIPT chron-schedule="$CRON_SCHEDULE" work-dir="$WORKDIR" days="$DAYS" max_connections="$MAX_CONNECTIONS" enable_fixes="$ENABLE_FIXES" ENTRYPOINT bash $START_SCRIPT chron-schedule="$CRON_SCHEDULE" work-dir="$WORKDIR" days="$DAYS" max_connections="$MAX_CONNECTIONS" enable_fixes="$ENABLE_FIXES" api_url="$API_URL"
EXPOSE 3000 EXPOSE 3000

View File

@ -32,19 +32,32 @@ You can do this by creating a mapping in the `/config` folder.
#### Custom fixes #### Custom fixes
Through the `ENABLE_FIXES` variable custom provider fixes can be applied to the container. Through the `ENABLE_FIXES` variable custom provider fixes can be applied to the container.
By default some fixes are available. If you have suggestions or a problem with them please submit an issue. By default some fixes are available. These fixes have been validated before being added to this repo.
However this option is disabled by default since you might only want to run the unmodified source.
If you have suggestions or a problem with them please submit an issue.
This the list of the provided custom fixes :
| Provider | Author | Status |
|------------------|---------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| movistarplus.es | [davidclaeysquinones](https://github.com/davidclaeysquinones) | [PR](https://github.com/iptv-org/epg/pull/2440) pending approval |
| pickx.be | [davidclaeysquinones](https://github.com/davidclaeysquinones) | [PR](https://github.com/iptv-org/epg/pull/2430) merged since commit [d159110](https://github.com/iptv-org/epg/commit/d15911006e163262c0c7f267deae28160c0d7a8f) |
| telenet.tv | [davidclaeysquinones](https://github.com/davidclaeysquinones) | [PR](https://github.com/iptv-org/epg/pull/2429) merged since commit [fd382db](https://github.com/iptv-org/epg/commit/fd382db08da7a96150928b8dcfef115e29e661d3) |
| web.magentatv.de | [klausellus-wallace](https://github.com/klausellus-wallace) | [PR](https://github.com/iptv-org/epg/pull/2458) pending approval |
If for some reason you want to include your own provider fixes this is possible by creation a mapping in the `/fixes` folder.<br> If for some reason you want to include your own provider fixes this is possible by creation a mapping in the `/fixes` folder.<br>
The expected structure is */fixes/`provider_name`/`provider_name`.config.js*.<br> The expected structure is */fixes/`provider_name`/`provider_name`.config.js*.<br>
It is recommended that you take existing provider code as a base for your customisations. It is recommended that you take existing provider code as a base for your customisations.
### Environment Variables ### Environment Variables
| Variable | Description | Default | | Variable | Description | Default |
|-------------------------------|----------------------------------------------------------------------------|------------------| |-------------------------------|----------------------------------------------------------------------------|----------------------------------|
| CRON_SCHEDULE | CRON expression describing the recurrence for epg retrieval. | `0 0,12 * * *` | | CRON_SCHEDULE | CRON expression describing the recurrence for epg retrieval. | `0 0,12 * * *` |
| DAYS | Describes the desired amount of days in the future for for epg retrieval. | 14 | | DAYS | Describes the desired amount of days in the future for for epg retrieval. | 14 |
| MAX_CONNECTIONS | The maximum amount of parallel connections that can be established | 10 | | MAX_CONNECTIONS | The maximum amount of parallel connections that can be established | 10 |
| ENABLE_FIXES | Some fixes to providers take a long time to be merged into the main branch.<br>When this option is enabled some of these fixes will also be included.<br>The source code for these fixes can be seen under the `fixes` folder.<br> Recreate the container when changing this variable in order for it to take effect | false | | ENABLE_FIXES | Some fixes to providers take a long time to be merged into the main branch.<br>When this option is enabled some of these fixes will also be included.<br>The source code for these fixes can be seen under the `fixes` folder.<br> Recreate the container when changing this variable in order for it to take effect | false |
| API_URL | The endpoint where channel information will be grabbed | `https://iptv-org.github.io/api` |
### Compose file ### Compose file
@ -103,4 +116,8 @@ Sometimes a new version of this image will be bound to the same source commit. T
- 1.0.12 - 1.0.12
[10-14-2024](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c)<br>Fix Pickx.be url [10-14-2024](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c)<br>Fix Pickx.be url
- 1.0.13 - 1.0.13
[10-14-2024](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c)<br>Add custom fix for web.magentatv.de [10-14-2024](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c)<br>Add custom fix for web.magentatv.de
- 1.0.14
[10-14-2024](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c)<br>Change fix for movistarplus.es in order to work with new API
- 1.0.15
[11-26-2024](https://github.com/iptv-org/epg/commit/d15911006e163262c0c7f267deae28160c0d7a8f)<br>Add option to customize channel endpoint

View File

@ -1,76 +1,73 @@
// credit for this fix goes to davidclaeysquinones for his PR on https://github.com/iptv-org/epg/pull/2440
const { DateTime } = require('luxon') const { DateTime } = require('luxon')
const API_PROD_ENDPOINT = 'https://www.movistarplus.es/programacion-tv' const API_PROGRAM_ENDPOINT = 'https://comunicacion.movistarplus.es'
const API_IMAGE_ENDPOINT = 'https://www.movistarplus.es/recorte/n/caratulaH/'; const API_IMAGE_ENDPOINT = 'https://www.movistarplus.es/recorte/n/caratulaH/';
module.exports = { module.exports = {
site: 'movistarplus.es', site: 'movistarplus.es',
days: 2, days: 2,
url: function ({ date }) { url: function ({ channel, date }) {
return `${API_PROD_ENDPOINT}/${date.format('YYYY-MM-DD')}?v=json` return `${API_PROGRAM_ENDPOINT}/wp-admin/admin-ajax.php`
},
request: {
method: 'POST',
headers: {
Origin: API_PROGRAM_ENDPOINT,
Referer: `${API_PROGRAM_ENDPOINT}/programacion/`,
"Content-Type" : 'application/x-www-form-urlencoded; charset=UTF-8',
},
data: function ({ channel, date }) {
return {
action: 'getProgramation',
day: date.format('YYYY-MM-DD'),
"channels[]": channel.site_id,
};
},
}, },
parser({ content, channel, date }) { parser({ content, channel, date }) {
let programs = [] let programs = []
let items = parseItems(content, channel) let items = parseItems(content, channel);
if (!items.length) return programs if (!items.length) return programs;
let guideDate = date
items.forEach(item => { items.forEach(item => {
let startTime = DateTime.fromFormat( let startTime = DateTime.fromFormat(
`${guideDate.format('YYYY-MM-DD')} ${item.HORA_INICIO}`, `${item.f_evento_rejilla}`,
'yyyy-MM-dd HH:mm', 'yyyy-MM-dd HH:mm:ss',
{ { zone: 'Europe/Madrid' }
zone: 'Europe/Madrid' ).toUTC();
}
).toUTC()
let stopTime = DateTime.fromFormat( let stopTime = DateTime.fromFormat(
`${guideDate.format('YYYY-MM-DD')} ${item.HORA_FIN}`, `${item.f_fin_evento_rejilla}`,
'yyyy-MM-dd HH:mm', 'yyyy-MM-dd HH:mm:ss',
{ { zone: 'Europe/Madrid' }
zone: 'Europe/Madrid'
}
).toUTC() ).toUTC()
// Adjust stop time if it's on the next day
if (stopTime < startTime) { if (stopTime < startTime) {
guideDate = guideDate.add(1, 'd') stopTime = stopTime.plus({ days: 1 });
stopTime = stopTime.plus({ days: 1 })
} }
programs.push({ programs.push({
title: item.TITULO, title: item.des_evento_rejilla,
icon: parseIcon(item, channel), icon: parseIcon(item, channel),
category: item.GENERO, category: item.des_genero,
start: startTime, start: startTime,
stop: stopTime stop: stopTime,
}) })
}) })
return programs return programs
}, },
async channels() {
const axios = require('axios')
const dayjs = require('dayjs')
const data = await axios
.get(`${API_PROD_ENDPOINT}/${dayjs().format('YYYY-MM-DD')}?v=json`)
.then(r => r.data)
.catch(console.log)
return Object.values(data.data).map(item => {
return {
lang: 'es',
site_id: item.DATOS_CADENA.CODIGO,
name: item.DATOS_CADENA.NOMBRE
}
})
}
} }
function parseIcon(item, channel) { function parseIcon(item, channel) {
return `${API_IMAGE_ENDPOINT}/M${channel.site_id}P${item.ELEMENTO}`; return `${API_IMAGE_ENDPOINT}/M${channel.site_id}P${item.cod_evento_rejilla}`;
} }
function parseItems(content, channel) { function parseItems(content, channel) {
const json = typeof content === 'string' ? JSON.parse(content) : content const json = typeof content === 'string' ? JSON.parse(content) : content;
if (!(`${channel.site_id}-CODE` in json.data)) return [] const data = json.channelsProgram;
const data = json.data[`${channel.site_id}-CODE`]
return data ? data.PROGRAMAS : [] if (data.length !== 1) return [];
return data[0];
} }

View File

@ -8,6 +8,7 @@ for arg in "$@"; do
days=*) days="${arg#*=}" ;; days=*) days="${arg#*=}" ;;
max_connections=*) max_connections="${arg#*=}" ;; max_connections=*) max_connections="${arg#*=}" ;;
enable_fixes=*) enable_fixes="${arg#*=}" ;; enable_fixes=*) enable_fixes="${arg#*=}" ;;
api_url=*) api_url="${arg#*=}" ;;
esac esac
done done
@ -17,11 +18,14 @@ echo "working dir : " $(pwd)
echo "days : ${days}" echo "days : ${days}"
echo "max_connections : ${max_connections}" echo "max_connections : ${max_connections}"
echo "enable_fixes : ${enable_fixes}" echo "enable_fixes : ${enable_fixes}"
echo "api url : ${api_url}"
if [ "$enable_fixes" = true ] ; then if [ "$enable_fixes" = true ] ; then
cp -R /fixes/* /bin/epg/sites/ cp -R /fixes/* /bin/epg/sites/
fi fi
sed -i -E "s/(https:\x2f\x2fiptv-org.github.io\x2fapi)/$api_url/g" $work_dir/scripts/core/apiClient.ts
pm2 --name epg start npm -- run serve pm2 --name epg start npm -- run serve
npm run grab -- --channels=channels.xml --maxConnections=$max_connections --days=$days --gzip npm run grab -- --channels=channels.xml --maxConnections=$max_connections --days=$days --gzip
ln -s $work_dir/guide.xml /public/guide.xml ln -s $work_dir/guide.xml /public/guide.xml