From 763f519bd6f818fa95c547e840f079830f9cb7d3 Mon Sep 17 00:00:00 2001 From: Bram Kelchtermans Date: Fri, 18 Apr 2025 22:39:32 +0200 Subject: [PATCH] iptv-epg v1 --- Dockers/iptv-epg/Dockerfile | 35 ++++++++++++ Dockers/iptv-epg/entrypoint.sh | 97 ++++++++++++++++++++++++++++++++++ Dockers/iptv-epg/version | 1 + 3 files changed, 133 insertions(+) create mode 100644 Dockers/iptv-epg/Dockerfile create mode 100644 Dockers/iptv-epg/entrypoint.sh create mode 100644 Dockers/iptv-epg/version diff --git a/Dockers/iptv-epg/Dockerfile b/Dockers/iptv-epg/Dockerfile new file mode 100644 index 0000000..176af4c --- /dev/null +++ b/Dockers/iptv-epg/Dockerfile @@ -0,0 +1,35 @@ +FROM node:18-alpine + +# Install required packages +RUN apk add --no-cache git curl unzip coreutils + +# Set working directory +WORKDIR /app + +# Download and extract the EPG repository +RUN curl -L https://github.com/iptv-org/epg/archive/refs/tags/2023.12.1.zip -o epg.zip && \ + unzip epg.zip && \ + mv epg-2023.12.1/* ./ && \ + rm -rf epg.zip epg-2023.12.1 && \ + npm install && \ + npm install pm2 serve -g + +# Copy entrypoint script +COPY entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh + +# Expose port for serving the guide +EXPOSE 3000 + +# Set environment variables with defaults +ENV CRON_SCHEDULE="0 0,12 * * *" \ + SITES="" \ + MAX_CONNECTIONS=1 \ + DAYS="" \ + TIMEOUT=0 \ + DELAY=0 \ + LANG="" \ + GZIP="false" + +# Set entrypoint +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/Dockers/iptv-epg/entrypoint.sh b/Dockers/iptv-epg/entrypoint.sh new file mode 100644 index 0000000..ec2df4d --- /dev/null +++ b/Dockers/iptv-epg/entrypoint.sh @@ -0,0 +1,97 @@ +#!/bin/sh +set -e + +# Function to grab EPG data for a site +grab_epg() { + site=$1 + echo "Grabbing EPG data for site: $site" + + # Build command with optional parameters + cmd="npm run grab -- --site=$site --output=${site}.xml --maxConnections=${MAX_CONNECTIONS}" + + # Add optional parameters if they are set + if [ -n "$DAYS" ]; then + cmd="$cmd --days=${DAYS}" + fi + + if [ -n "$TIMEOUT" ]; then + cmd="$cmd --timeout=${TIMEOUT}" + fi + + if [ -n "$DELAY" ]; then + cmd="$cmd --delay=${DELAY}" + fi + + if [ -n "$LANG" ]; then + cmd="$cmd --lang=${LANG}" + fi + + if [ "$GZIP" = "true" ]; then + cmd="$cmd --gzip" + fi + + # Execute the command + eval $cmd +} + +# Function to grab EPG data for all sites +grab_all_sites() { + # Split the SITES environment variable by comma - POSIX sh compatible + echo "$SITES" | tr ',' '\n' >/tmp/sites.txt + + # Process each site + while read site; do + grab_epg "$site" + done /app/grab-sites.js < { + try { + console.log(\`Grabbing EPG data for site: \${site}\`); + let cmd = \`npm run grab -- --site=\${site} --output=\${site}.xml --maxConnections=\${process.env.MAX_CONNECTIONS || 1}\`; + + // Add optional parameters + if (process.env.DAYS) cmd += \` --days=\${process.env.DAYS}\`; + if (process.env.TIMEOUT) cmd += \` --timeout=\${process.env.TIMEOUT}\`; + if (process.env.DELAY) cmd += \` --delay=\${process.env.DELAY}\`; + if (process.env.LANG) cmd += \` --lang=\${process.env.LANG}\`; + if (process.env.GZIP === 'true') cmd += \` --gzip\`; + + execSync(cmd, { stdio: 'inherit' }); + } catch (error) { + console.error(\`Error grabbing EPG data for site: \${site}\`, error); + } +}); +EOL + chmod +x /app/grab-sites.js + + # Start the cron job + pm2 start --name epg-grabber /app/grab-sites.js --no-autorestart --cron-restart="$CRON_SCHEDULE" +fi + +# Start the server to serve the guide files +cd /app +echo "Starting server on port 3000" +npx serve -p 3000 + +# Keep the container running +tail -f /dev/null diff --git a/Dockers/iptv-epg/version b/Dockers/iptv-epg/version new file mode 100644 index 0000000..5f73c59 --- /dev/null +++ b/Dockers/iptv-epg/version @@ -0,0 +1 @@ +2023.12.1 \ No newline at end of file