diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e7a9210 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +appdata/ +customrun.sh +.env \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 31b1409..fedfdcd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,40 +1,35 @@ FROM alpine:latest -RUN apk update -RUN apk upgrade -RUN apk add --no-cache ca-certificates +LABEL maintainer="taylorbourne taylorbourne@me.com.com" -MAINTAINER taylorbourne taylorbourne@me.com.com +# Install S6 overlay +ARG S6_OVERLAY_RELEASE=https://github.com/just-containers/s6-overlay/releases/latest/download/s6-overlay-amd64.tar.gz +ENV S6_OVERLAY_RELEASE=${S6_OVERLAY_RELEASE} -# Extras -RUN apk add --no-cache curl +ADD ${S6_OVERLAY_RELEASE} /tmp/s6overlay.tar.gz -# Timezone (TZ) -RUN apk update && apk add --no-cache tzdata +RUN tar xzf /tmp/s6overlay.tar.gz -C / \ + && rm /tmp/s6overlay.tar.gz + +# Add packages +RUN apk upgrade --update --no-cache \ + && apk add --no-cache \ + ca-certificates \ + curl \ + tzdata \ + bash \ + coreutils \ + shadow \ + ffmpeg \ + vlc \ + gnutls-utils + +# Update Timezone ENV TZ=America/Los_Angeles RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -# Add Bash shell & dependancies -RUN apk add --no-cache bash busybox-suid su-exec - -# Volumes -VOLUME /config -VOLUME /playlists -VOLUME /guide2go -VOLUME /root/.xteve -VOLUME /tmp/xteve - -# Add ffmpeg and vlc -RUN apk add ffmpeg -RUN apk add vlc -RUN sed -i 's/geteuid/getppid/' /usr/bin/vlc - -# Add GNUtls so we can update certs -RUN apk add --no-cache gnutls-utils - # Add xTeve and guide2go RUN wget https://github.com/xteve-project/xTeVe-Downloads/raw/master/xteve_linux_amd64.zip -O temp.zip; unzip temp.zip -d /usr/bin/; rm temp.zip -ADD guide2go /usr/bin/guide2go # Add lazystream RUN wget https://github.com/tarkah/lazystream/releases/download/v1.9.7/lazystream-v1.9.7-x86_64-unknown-linux-musl.tar.gz -O lazystream.tar.gz; \ @@ -43,20 +38,51 @@ RUN wget https://github.com/tarkah/lazystream/releases/download/v1.9.7/lazystrea rm lazystream.tar.gz; \ rm -rf lazystream/ -ADD cronjob.sh / -ADD entrypoint.sh / -ADD sample_cron.txt / -ADD sample_xteve.txt / +# Add abc user +RUN groupmod -g 1000 users && \ + useradd -u 911 -U -d /home/abc -s /bin/bash abc && \ + usermod -G users abc + +# Copy root folder +COPY root/ / + +# Volumes +VOLUME /config +VOLUME /playlists +VOLUME /guide2go +VOLUME /xteve +VOLUME /tmp/xteve # Set executable permissions -RUN chmod +x /entrypoint.sh -RUN chmod +x /cronjob.sh RUN chmod +x /usr/bin/lazystream RUN chmod +x /usr/bin/xteve RUN chmod +x /usr/bin/guide2go -# Expose Port -EXPOSE 34400 +# Build arg +ARG XTEVE_PORT=34400 -# Entrypoint -ENTRYPOINT ["./entrypoint.sh"] +# Env +ENV PUID=1000 \ + PGID=1000 \ + XTEVE_PORT=${XTEVE_PORT} \ + use_xTeveAPI=yes \ + use_lazystream=yes \ + include_nhl=yes\ + include_mlb=yes \ + use_guide2go=no \ + JsonList="CBLguide.json SATguide.json SATSport.json" \ + use_embyAPI=no \ + embyIP= \ + embyPORT=8096 \ + embyApiKey= \ + embyID= \ + use_plexAPI=no \ + plexIP= \ + plexPORT=32400 \ + plexToken= \ + plexID= + +# Expose Port +EXPOSE ${XTEVE_PORT} + +ENTRYPOINT [ "/init" ] \ No newline at end of file diff --git a/README.md b/README.md index 9aec7fb..c5ed0fd 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,78 @@ # Lazystream Plex/Emby Bundle -This Docker provides a simple solution to get live NHL and MLB games into your Emby or Plex live TV setup. When combined with a comprehensive IPTV package this setup can you rolling with live TV and high quality sports. If you would only like to use this for the available sports, simply disable guide2go (or any other function you would like) from the cronjob. +This Docker provides a simple solution to get live NHL and MLB games into your Emby or Plex live TV setup. When combined with a comprehensive IPTV package this setup can get you rolling with live TV and high quality sports. If you would only like to use this for the available sports, simply disable guide2go (or any other function you would like). -## Run Command +- [Run](#run) +- [Setup](#setup) + - [Env file](#env-file) + - [Cron schedule](#cron-schedule) + - [Sample volume mapping](#sample-volume-mapping) + - [xTeVe](#xteve) + - [guide2go](#guide2go) + - [Testing cronjob function](#testing-cronjob-function) +- [Credits](#credits) + - [guide2go](#guide2go-1) + - [Lazystream](#lazystream) + - [xTeVe](#xteve-1) + +# Run ``` docker run -d \ --name=xteve_lazystream \ + -p 34400:34400 \ + -e TZ="America/Los_Angeles" \ + --env-file=.env \ --log-opt max-size=10m \ --log-opt max-file=3 \ - -e TZ="America/Los_Angeles" \ - -v /mnt/user/appdata/xteve/:/root/.xteve:rw \ - -v /mnt/user/appdata/xteve/_config/:/config:rw \ - -v /mnt/user/appdata/xteve/_guide2go/:/guide2go:rw \ + -v /mnt/user/appdata/xteve/.xteve:/xteve:rw \ + -v /mnt/user/appdata/xteve/config/:/config:rw \ + -v /mnt/user/appdata/xteve/guide2go/:/guide2go:rw \ -v /mnt/user/appdata/xteve/playlists/:/playlists:rw \ -v /tmp/xteve/:/tmp/xteve:rw \ taylorbourne/xteve_lazystream ``` +# Setup + +## Env file + +Defaults & behavior can be changed through environment variables. `sample.env` should be renamed to `.env` and supplied through the `--env-file` docker run option. The `.env` file can also be picked up if using this in a `docker compose` setup. + +## Cron schedule + +By default, the cron job is scheduled to run every hour. A custom cron schedule can be specified by renaming the `sample_cron.txt` file in the `/config` volume to `cron.txt` and editing the schedule. Make sure to restart your container to take effect. + +## Sample volume mapping + +| Container Path | Host Path | +| -------------- | --------------------------------- | +| /xteve | /mnt/user/appdata/xteve/.xteve | +| /config | /mnt/user/appdata/xteve/config | +| /guide2go | /mnt/user/appdata/xteve/guide2go | +| /playlists | /mnt/user/appdata/xteve/playlists | +| /tmp/xteve | /tmp/xteve | + +## xTeVe + +By default, xTeVe is setup with all 200 channels mapped for NHL and MLB games. This can be setup directly with Plex / Emby to work out of the box without any changes. If needed, changes can be made to xTeVe by going to `127.0.0.1:34400/web/`. + +## guide2go + +If you have an existing guide2go setup you may copy the `.json` files into the path mounted at `/guide2go`. Otherwise run the following command and follow the on-screen steps +`docker exec -it dockername guide2go -configure /guide2go/your_epg_name.json` + +## Testing cronjob function + +Simply run the cronjob file inside the Docker container +`docker exec -it dockername ./cronjob.sh` + +# Credits + +[Lazystream](https://github.com/tarkah/lazystream) – [@tarkah](https://github.com/tarkah/) +[xTeVe](https://github.com/xteve-project/xTeVe) and [guide2go](https://github.com/mar-mei/guide2go) – [@marmei](https://github.com/mar-mei) +Original author of the [xTeVe/guide2go Docker](https://github.com/alturismo/xteve_guide2goe) – [@alturismo](https://github.com/alturismo) + ## guide2go XMLTV EPG grabber for Schedules Direct, thanks to @marmei @@ -32,34 +87,4 @@ GitHub: https://github.com/tarkah/lazystream IPTV and EPG proxy server for Plex, Emby, etc – thanks to @marmei Website: http://xteve.de -Discord: https://discordapp.com/channels/465222357754314767/465222357754314773 - -# Setup - -Please note that this Docker is configured to run in host mode. Once the Docker has started, check the configuration folder to complete the setup process. You'll want to edit `config/cronjob.sh` to suit your needs. Read this complete document before starting up the container. - -## Sample volume mapping - -| Container Path | Host Path | -| -------------- | ----------------------------------- | -| /root/.xteve | /mnt/user/appdata/xteve/ | -| /config | /mnt/user/appdata/xteve/\_config/ | -| /guide2go | /mnt/user/appdata/xteve/\_guide2go/ | -| /playlists | /mnt/user/appdata/xteve/playlists/ | -| /tmp/xteve | /tmp/xteve/ | - -## guide2go - -If you have an existing guide2go setup you may copy the `.json` files into the path mounted at `/guide2go`. Otherwise run the following command and follow the on-screen steps -`docker exec -it dockername guide2go -configure /guide2go/your_epg_name.json` - -## Testing cronjob function - -Simply run the cronjob file inside the Docker container -`docker exec -it dockername ./config/cronjob.sh` - -# Credits - -[Lazystream](https://github.com/tarkah/lazystream) – [@tarkah](https://github.com/tarkah/) -[xTeVe](https://github.com/xteve-project/xTeVe) and [guide2go](https://github.com/mar-mei/guide2go) – [@marmei](https://github.com/mar-mei) -Original author of the [xTeVe/guide2go Docker](https://github.com/alturismo/xteve_guide2goe) – [@alturismo](https://github.com/alturismo) +Discord: https://discordapp.com/channels/465222357754314767/465222357754314773 \ No newline at end of file diff --git a/cronjob.sh b/cronjob.sh deleted file mode 100644 index 9fbb59d..0000000 --- a/cronjob.sh +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/bash -echo "Running scripts..." - -##### Config -use_embyAPI="no" -use_guide2go="no" -use_lazystream="no" -use_plexAPI="no" -use_xTeveAPI="yes" - -##### Lazystream Config -include_nhl="no" -include_mlb="no" - -### List of created lineup json files in /guide2go -# Exmaple with 3 lineups -JsonList="CBLguide.json SATguide.json SATSport.json" - -### to create your lineups run the below command and follow the on-screen instructions -# docker exec -it guide2go -configure /guide2go/.json - -### xTeVe -xTeveIP="192.168.1.2" -xTevePORT="34400" - -### Emby -# Only necessary if xTeVe API is active -# API Key, https://github.com/MediaBrowser/Emby/wiki/Api-Key-Authentication -# embyID, settings, scroll down click API, Scheduled Task Service, GET /ScheduledTasks, Try, Execute, look for "Refresh Guide" ID, sample here 9492d30c70f7f1bec3757c9d0a4feb45 -embyIP="192.168.1.2" -embyPORT="8096" -embyApiKey="" -embyID="9492d30c70f7f1bec3757c9d0a4feb45" - -### Plex -# Only necessary if xTeVe API is active -# Finding your Plex token: https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/ -# Finding Plex ID: http://YOUR_IP_HERE:32400/?X-Plex-Token=YOUR_TOKEN_HERE , look for "tv.plex.providers.epg.xmltv: " and enter the value blow. -plexIP="192.168.1.2" -plexPORT="32400" -plexToken="" -plexID="" - -# cronjob, check sample_cron.txt with an editor to adjust time - -### END Config -## -# - -### Generate playlist and XML data from Lazystream -if [ "$use_lazystream" = "yes" ]; then - - if [ "$include_nhl" = "yes" ]; then - echo "Running Lazystream (NHL)..." - mkdir -p /playlists/lazystream - lazystream generate xmltv \ - --channel-prefix Lazystream:\ NHL \ - --start-channel 1000 \ - /playlists/lazystream/lazystream-nhl - fi - if [ "$include_mlb" = "yes" ]; then - echo "Running Lazystream (MLB)..." - mkdir -p /playlists/lazystream - lazystream --sport mlb generate xmltv \ - --channel-prefix Lazystream:\ MLB \ - --start-channel 2000 \ - /playlists/lazystream/lazystream-mlb - fi -fi - -# run guide2go in a loop -if [ "$use_guide2go" = "yes" ]; then - echo "Running guide2Go..." - for jsons in $JsonList - do - jsonefile="${jsons%.*}" - filecache=' "file.cache": "/guide2go/cache_'$jsons'",' - fileoutput=' "file.output": "/guide2go/'$jsonefile'.xml",' - sed -i "/file.cache/c $filecache" /guide2go/$jsons - sed -i "/file.output/c $fileoutput" /guide2go/$jsons - guide2go -config /guide2go/$jsons - done -fi - -sleep 1 - -# update xteve via API -if [ "$use_xTeveAPI" = "yes" ]; then - echo "Updating xTeVe..." - if [ -z "$xTeveIP" ]; then - echo "no xTeve credentials provided" - else - curl -X POST -d '{"cmd":"update.m3u"}' http://$xTeveIP:$xTevePORT/api/ - sleep 1 - curl -X POST -d '{"cmd":"update.xmltv"}' http://$xTeveIP:$xTevePORT/api/ - sleep 1 - curl -X POST -d '{"cmd":"update.xepg"}' http://$xTeveIP:$xTevePORT/api/ - sleep 1 - fi -fi - -# update Emby via API -if [ "$use_embyAPI" = "yes" ]; then - echo "Updating Emby..." - if [ -z "$embyIP" ]; then - echo "no Emby credentials provided" - else - curl -X POST "http://$embyIP:$embyPORT/emby/ScheduledTasks/Running/$embyID?api_key=$embyApiKey" -H "accept: */*" -d "" - sleep 1 - fi -fi - -# update Plex via API -if [ "$use_plexAPI" = "yes" ]; then - echo "Updating Plex..." - if [ -z "$plexIP" ]; then - echo "no Plex credentials provided" - else - curl -X POST "http://$plexIP:$plexPORT/livetv/dvrs/$plexID/reloadGuide?X-Plex-Token=$plexToken" - sleep 1 - fi -fi - -exit diff --git a/entrypoint.sh b/entrypoint.sh deleted file mode 100644 index 748ec46..0000000 --- a/entrypoint.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -crond -l 2 - -# Update hosts file -export IP=$(getent ahostsv4 freegamez.ga | awk '{ print $1 }' | head -1) -echo $IP playback.svcs.mlb.com >> /etc/hosts -echo $IP mf.svc.nhl.com >> /etc/hosts -echo $IP mlb-ws-mf.media.mlb.com >> /etc/hosts -cat /etc/hosts - -# Update certs -rm /root/.gnutls/known_hosts -printf 'y\n' | gnutls-cli --tofu playback.svcs.mlb.com:443 -printf 'y\n' | gnutls-cli --tofu mf.svc.nhl.com:443 -printf 'y\n' | gnutls-cli --tofu mlb-ws-mf.media.mlb.com:443 -cat /root/.gnutls/known_hosts - -CRONJOB_FILE=/config/cronjob.sh - -if [ -f "$CRONJOB_FILE" ]; then - echo "$CRONJOB_FILE already exists – if changes are necessary please edit this file." - chmod +x $CRONJOB_FILE - chmod 777 $CRONJOB_FILE -else - echo "$CRONJOB_FILE does not exist, auto-generating cronjob file. Please edit to complete setup." - cp /cronjob.sh $CRONJOB_FILE - chmod +x $CRONJOB_FILE - chmod 777 $CRONJOB_FILE -fi - -CRON_FILE=/config/cron.txt - -if [ -f "$CRON_FILE" ]; then - . $CRON_FILE -else - echo "No cron definition found..." - echo "By default, cronjob will run every night at midnight unless cron file is configured." - printf '0 0 * * * /config/cronjob.sh' > /etc/crontabs/root - cp /sample_cron.txt /config/sample_cron.txt -fi - -XTEVE_FILE=/config/xteve.txt - -echo "Starting xTeVe..." -if [ -f "$XTEVE_FILE" ]; then - . $XTEVE_FILE -else - echo "Starting xTeVe with default config..." - cp /sample_xteve.txt /config/sample_xteve.txt - xteve -port=34400 -config=/root/.xteve/ -fi - -exit diff --git a/root/cronjob.sh b/root/cronjob.sh new file mode 100755 index 0000000..e50a5be --- /dev/null +++ b/root/cronjob.sh @@ -0,0 +1,84 @@ +#!/usr/bin/with-contenv bash + +function prepend() { + time=`date +"%Y/%m/%d %H:%M:%S"` + while read line; + do echo "${time} ${1}${line}"; + done; +} + +exec 1> >(prepend "[cronjob.sh] ") + +echo "Running scripts..." + +### Generate playlist and XML data from Lazystream +if [ "$use_lazystream" = "yes" ]; then + + if [ "$include_nhl" = "yes" ]; then + echo "Running Lazystream (NHL)..." + mkdir -p /playlists/lazystream + lazystream generate xmltv \ + --channel-prefix Lazystream:\ NHL \ + --start-channel 1000 \ + /playlists/lazystream/lazystream-nhl + fi + if [ "$include_mlb" = "yes" ]; then + echo "Running Lazystream (MLB)..." + mkdir -p /playlists/lazystream + lazystream --sport mlb generate xmltv \ + --channel-prefix Lazystream:\ MLB \ + --start-channel 2000 \ + /playlists/lazystream/lazystream-mlb + fi +fi + +# run guide2go in a loop +if [ "$use_guide2go" = "yes" ]; then + echo "Running guide2Go..." + for jsons in $JsonList + do + jsonefile="${jsons%.*}" + filecache=' "file.cache": "/guide2go/cache_'$jsons'",' + fileoutput=' "file.output": "/guide2go/'$jsonefile'.xml",' + sed -i "/file.cache/c $filecache" /guide2go/$jsons + sed -i "/file.output/c $fileoutput" /guide2go/$jsons + guide2go -config /guide2go/$jsons + done +fi + +sleep 1 + +# update xteve via API +if [ "$use_xTeveAPI" = "yes" ]; then + echo "Updating xTeVe..." + curl -s -X POST -d '{"cmd":"update.m3u"}' http://127.0.0.1:$XTEVE_PORT/api/ + sleep 1 + curl -s -X POST -d '{"cmd":"update.xmltv"}' http://127.0.0.1:$XTEVE_PORT/api/ + sleep 1 + curl -s -X POST -d '{"cmd":"update.xepg"}' http://127.0.0.1:$XTEVE_PORT/api/ + sleep 1 +fi + +# update Emby via API +if [ "$use_embyAPI" = "yes" ]; then + echo "Updating Emby..." + if [ -z "$embyIP" ]; then + echo "no Emby credentials provided" + else + curl -s -X POST "http://$embyIP:$embyPORT/emby/ScheduledTasks/Running/$embyID?api_key=$embyApiKey" -H "accept: */*" -d "" + sleep 1 + fi +fi + +# update Plex via API +if [ "$use_plexAPI" = "yes" ]; then + echo "Updating Plex..." + if [ -z "$plexIP" ]; then + echo "no Plex credentials provided" + else + curl -s -X POST "http://$plexIP:$plexPORT/livetv/dvrs/$plexID/reloadGuide?X-Plex-Token=$plexToken" + sleep 1 + fi +fi + +exit \ No newline at end of file diff --git a/root/defaults/lazystream-mlb.m3u b/root/defaults/lazystream-mlb.m3u new file mode 100644 index 0000000..00c1bde --- /dev/null +++ b/root/defaults/lazystream-mlb.m3u @@ -0,0 +1,201 @@ +#EXTM3U +#EXTINF:-1 CUID="2000" tvg-id="2000" tvg-name="Lazystream: MLB 1",Lazystream: MLB 1 +. +#EXTINF:-1 CUID="2001" tvg-id="2001" tvg-name="Lazystream: MLB 2",Lazystream: MLB 2 +. +#EXTINF:-1 CUID="2002" tvg-id="2002" tvg-name="Lazystream: MLB 3",Lazystream: MLB 3 +. +#EXTINF:-1 CUID="2003" tvg-id="2003" tvg-name="Lazystream: MLB 4",Lazystream: MLB 4 +. +#EXTINF:-1 CUID="2004" tvg-id="2004" tvg-name="Lazystream: MLB 5",Lazystream: MLB 5 +. +#EXTINF:-1 CUID="2005" tvg-id="2005" tvg-name="Lazystream: MLB 6",Lazystream: MLB 6 +. +#EXTINF:-1 CUID="2006" tvg-id="2006" tvg-name="Lazystream: MLB 7",Lazystream: MLB 7 +. +#EXTINF:-1 CUID="2007" tvg-id="2007" tvg-name="Lazystream: MLB 8",Lazystream: MLB 8 +. +#EXTINF:-1 CUID="2008" tvg-id="2008" tvg-name="Lazystream: MLB 9",Lazystream: MLB 9 +. +#EXTINF:-1 CUID="2009" tvg-id="2009" tvg-name="Lazystream: MLB 10",Lazystream: MLB 10 +. +#EXTINF:-1 CUID="2010" tvg-id="2010" tvg-name="Lazystream: MLB 11",Lazystream: MLB 11 +. +#EXTINF:-1 CUID="2011" tvg-id="2011" tvg-name="Lazystream: MLB 12",Lazystream: MLB 12 +. +#EXTINF:-1 CUID="2012" tvg-id="2012" tvg-name="Lazystream: MLB 13",Lazystream: MLB 13 +. +#EXTINF:-1 CUID="2013" tvg-id="2013" tvg-name="Lazystream: MLB 14",Lazystream: MLB 14 +. +#EXTINF:-1 CUID="2014" tvg-id="2014" tvg-name="Lazystream: MLB 15",Lazystream: MLB 15 +. +#EXTINF:-1 CUID="2015" tvg-id="2015" tvg-name="Lazystream: MLB 16",Lazystream: MLB 16 +. +#EXTINF:-1 CUID="2016" tvg-id="2016" tvg-name="Lazystream: MLB 17",Lazystream: MLB 17 +. +#EXTINF:-1 CUID="2017" tvg-id="2017" tvg-name="Lazystream: MLB 18",Lazystream: MLB 18 +. +#EXTINF:-1 CUID="2018" tvg-id="2018" tvg-name="Lazystream: MLB 19",Lazystream: MLB 19 +. +#EXTINF:-1 CUID="2019" tvg-id="2019" tvg-name="Lazystream: MLB 20",Lazystream: MLB 20 +. +#EXTINF:-1 CUID="2020" tvg-id="2020" tvg-name="Lazystream: MLB 21",Lazystream: MLB 21 +. +#EXTINF:-1 CUID="2021" tvg-id="2021" tvg-name="Lazystream: MLB 22",Lazystream: MLB 22 +. +#EXTINF:-1 CUID="2022" tvg-id="2022" tvg-name="Lazystream: MLB 23",Lazystream: MLB 23 +. +#EXTINF:-1 CUID="2023" tvg-id="2023" tvg-name="Lazystream: MLB 24",Lazystream: MLB 24 +. +#EXTINF:-1 CUID="2024" tvg-id="2024" tvg-name="Lazystream: MLB 25",Lazystream: MLB 25 +. +#EXTINF:-1 CUID="2025" tvg-id="2025" tvg-name="Lazystream: MLB 26",Lazystream: MLB 26 +. +#EXTINF:-1 CUID="2026" tvg-id="2026" tvg-name="Lazystream: MLB 27",Lazystream: MLB 27 +. +#EXTINF:-1 CUID="2027" tvg-id="2027" tvg-name="Lazystream: MLB 28",Lazystream: MLB 28 +. +#EXTINF:-1 CUID="2028" tvg-id="2028" tvg-name="Lazystream: MLB 29",Lazystream: MLB 29 +. +#EXTINF:-1 CUID="2029" tvg-id="2029" tvg-name="Lazystream: MLB 30",Lazystream: MLB 30 +. +#EXTINF:-1 CUID="2030" tvg-id="2030" tvg-name="Lazystream: MLB 31",Lazystream: MLB 31 +. +#EXTINF:-1 CUID="2031" tvg-id="2031" tvg-name="Lazystream: MLB 32",Lazystream: MLB 32 +. +#EXTINF:-1 CUID="2032" tvg-id="2032" tvg-name="Lazystream: MLB 33",Lazystream: MLB 33 +. +#EXTINF:-1 CUID="2033" tvg-id="2033" tvg-name="Lazystream: MLB 34",Lazystream: MLB 34 +. +#EXTINF:-1 CUID="2034" tvg-id="2034" tvg-name="Lazystream: MLB 35",Lazystream: MLB 35 +. +#EXTINF:-1 CUID="2035" tvg-id="2035" tvg-name="Lazystream: MLB 36",Lazystream: MLB 36 +. +#EXTINF:-1 CUID="2036" tvg-id="2036" tvg-name="Lazystream: MLB 37",Lazystream: MLB 37 +. +#EXTINF:-1 CUID="2037" tvg-id="2037" tvg-name="Lazystream: MLB 38",Lazystream: MLB 38 +. +#EXTINF:-1 CUID="2038" tvg-id="2038" tvg-name="Lazystream: MLB 39",Lazystream: MLB 39 +. +#EXTINF:-1 CUID="2039" tvg-id="2039" tvg-name="Lazystream: MLB 40",Lazystream: MLB 40 +. +#EXTINF:-1 CUID="2040" tvg-id="2040" tvg-name="Lazystream: MLB 41",Lazystream: MLB 41 +. +#EXTINF:-1 CUID="2041" tvg-id="2041" tvg-name="Lazystream: MLB 42",Lazystream: MLB 42 +. +#EXTINF:-1 CUID="2042" tvg-id="2042" tvg-name="Lazystream: MLB 43",Lazystream: MLB 43 +. +#EXTINF:-1 CUID="2043" tvg-id="2043" tvg-name="Lazystream: MLB 44",Lazystream: MLB 44 +. +#EXTINF:-1 CUID="2044" tvg-id="2044" tvg-name="Lazystream: MLB 45",Lazystream: MLB 45 +. +#EXTINF:-1 CUID="2045" tvg-id="2045" tvg-name="Lazystream: MLB 46",Lazystream: MLB 46 +. +#EXTINF:-1 CUID="2046" tvg-id="2046" tvg-name="Lazystream: MLB 47",Lazystream: MLB 47 +. +#EXTINF:-1 CUID="2047" tvg-id="2047" tvg-name="Lazystream: MLB 48",Lazystream: MLB 48 +. +#EXTINF:-1 CUID="2048" tvg-id="2048" tvg-name="Lazystream: MLB 49",Lazystream: MLB 49 +. +#EXTINF:-1 CUID="2049" tvg-id="2049" tvg-name="Lazystream: MLB 50",Lazystream: MLB 50 +. +#EXTINF:-1 CUID="2050" tvg-id="2050" tvg-name="Lazystream: MLB 51",Lazystream: MLB 51 +. +#EXTINF:-1 CUID="2051" tvg-id="2051" tvg-name="Lazystream: MLB 52",Lazystream: MLB 52 +. +#EXTINF:-1 CUID="2052" tvg-id="2052" tvg-name="Lazystream: MLB 53",Lazystream: MLB 53 +. +#EXTINF:-1 CUID="2053" tvg-id="2053" tvg-name="Lazystream: MLB 54",Lazystream: MLB 54 +. +#EXTINF:-1 CUID="2054" tvg-id="2054" tvg-name="Lazystream: MLB 55",Lazystream: MLB 55 +. +#EXTINF:-1 CUID="2055" tvg-id="2055" tvg-name="Lazystream: MLB 56",Lazystream: MLB 56 +. +#EXTINF:-1 CUID="2056" tvg-id="2056" tvg-name="Lazystream: MLB 57",Lazystream: MLB 57 +. +#EXTINF:-1 CUID="2057" tvg-id="2057" tvg-name="Lazystream: MLB 58",Lazystream: MLB 58 +. +#EXTINF:-1 CUID="2058" tvg-id="2058" tvg-name="Lazystream: MLB 59",Lazystream: MLB 59 +. +#EXTINF:-1 CUID="2059" tvg-id="2059" tvg-name="Lazystream: MLB 60",Lazystream: MLB 60 +. +#EXTINF:-1 CUID="2060" tvg-id="2060" tvg-name="Lazystream: MLB 61",Lazystream: MLB 61 +. +#EXTINF:-1 CUID="2061" tvg-id="2061" tvg-name="Lazystream: MLB 62",Lazystream: MLB 62 +. +#EXTINF:-1 CUID="2062" tvg-id="2062" tvg-name="Lazystream: MLB 63",Lazystream: MLB 63 +. +#EXTINF:-1 CUID="2063" tvg-id="2063" tvg-name="Lazystream: MLB 64",Lazystream: MLB 64 +. +#EXTINF:-1 CUID="2064" tvg-id="2064" tvg-name="Lazystream: MLB 65",Lazystream: MLB 65 +. +#EXTINF:-1 CUID="2065" tvg-id="2065" tvg-name="Lazystream: MLB 66",Lazystream: MLB 66 +. +#EXTINF:-1 CUID="2066" tvg-id="2066" tvg-name="Lazystream: MLB 67",Lazystream: MLB 67 +. +#EXTINF:-1 CUID="2067" tvg-id="2067" tvg-name="Lazystream: MLB 68",Lazystream: MLB 68 +. +#EXTINF:-1 CUID="2068" tvg-id="2068" tvg-name="Lazystream: MLB 69",Lazystream: MLB 69 +. +#EXTINF:-1 CUID="2069" tvg-id="2069" tvg-name="Lazystream: MLB 70",Lazystream: MLB 70 +. +#EXTINF:-1 CUID="2070" tvg-id="2070" tvg-name="Lazystream: MLB 71",Lazystream: MLB 71 +. +#EXTINF:-1 CUID="2071" tvg-id="2071" tvg-name="Lazystream: MLB 72",Lazystream: MLB 72 +. +#EXTINF:-1 CUID="2072" tvg-id="2072" tvg-name="Lazystream: MLB 73",Lazystream: MLB 73 +. +#EXTINF:-1 CUID="2073" tvg-id="2073" tvg-name="Lazystream: MLB 74",Lazystream: MLB 74 +. +#EXTINF:-1 CUID="2074" tvg-id="2074" tvg-name="Lazystream: MLB 75",Lazystream: MLB 75 +. +#EXTINF:-1 CUID="2075" tvg-id="2075" tvg-name="Lazystream: MLB 76",Lazystream: MLB 76 +. +#EXTINF:-1 CUID="2076" tvg-id="2076" tvg-name="Lazystream: MLB 77",Lazystream: MLB 77 +. +#EXTINF:-1 CUID="2077" tvg-id="2077" tvg-name="Lazystream: MLB 78",Lazystream: MLB 78 +. +#EXTINF:-1 CUID="2078" tvg-id="2078" tvg-name="Lazystream: MLB 79",Lazystream: MLB 79 +. +#EXTINF:-1 CUID="2079" tvg-id="2079" tvg-name="Lazystream: MLB 80",Lazystream: MLB 80 +. +#EXTINF:-1 CUID="2080" tvg-id="2080" tvg-name="Lazystream: MLB 81",Lazystream: MLB 81 +. +#EXTINF:-1 CUID="2081" tvg-id="2081" tvg-name="Lazystream: MLB 82",Lazystream: MLB 82 +. +#EXTINF:-1 CUID="2082" tvg-id="2082" tvg-name="Lazystream: MLB 83",Lazystream: MLB 83 +. +#EXTINF:-1 CUID="2083" tvg-id="2083" tvg-name="Lazystream: MLB 84",Lazystream: MLB 84 +. +#EXTINF:-1 CUID="2084" tvg-id="2084" tvg-name="Lazystream: MLB 85",Lazystream: MLB 85 +. +#EXTINF:-1 CUID="2085" tvg-id="2085" tvg-name="Lazystream: MLB 86",Lazystream: MLB 86 +. +#EXTINF:-1 CUID="2086" tvg-id="2086" tvg-name="Lazystream: MLB 87",Lazystream: MLB 87 +. +#EXTINF:-1 CUID="2087" tvg-id="2087" tvg-name="Lazystream: MLB 88",Lazystream: MLB 88 +. +#EXTINF:-1 CUID="2088" tvg-id="2088" tvg-name="Lazystream: MLB 89",Lazystream: MLB 89 +. +#EXTINF:-1 CUID="2089" tvg-id="2089" tvg-name="Lazystream: MLB 90",Lazystream: MLB 90 +. +#EXTINF:-1 CUID="2090" tvg-id="2090" tvg-name="Lazystream: MLB 91",Lazystream: MLB 91 +. +#EXTINF:-1 CUID="2091" tvg-id="2091" tvg-name="Lazystream: MLB 92",Lazystream: MLB 92 +. +#EXTINF:-1 CUID="2092" tvg-id="2092" tvg-name="Lazystream: MLB 93",Lazystream: MLB 93 +. +#EXTINF:-1 CUID="2093" tvg-id="2093" tvg-name="Lazystream: MLB 94",Lazystream: MLB 94 +. +#EXTINF:-1 CUID="2094" tvg-id="2094" tvg-name="Lazystream: MLB 95",Lazystream: MLB 95 +. +#EXTINF:-1 CUID="2095" tvg-id="2095" tvg-name="Lazystream: MLB 96",Lazystream: MLB 96 +. +#EXTINF:-1 CUID="2096" tvg-id="2096" tvg-name="Lazystream: MLB 97",Lazystream: MLB 97 +. +#EXTINF:-1 CUID="2097" tvg-id="2097" tvg-name="Lazystream: MLB 98",Lazystream: MLB 98 +. +#EXTINF:-1 CUID="2098" tvg-id="2098" tvg-name="Lazystream: MLB 99",Lazystream: MLB 99 +. +#EXTINF:-1 CUID="2099" tvg-id="2099" tvg-name="Lazystream: MLB 100",Lazystream: MLB 100 +. diff --git a/root/defaults/lazystream-mlb.xml b/root/defaults/lazystream-mlb.xml new file mode 100644 index 0000000..30a38e2 --- /dev/null +++ b/root/defaults/lazystream-mlb.xml @@ -0,0 +1,405 @@ + + + + + + Lazystream: MLB 1 + + + + Lazystream: MLB 2 + + + + Lazystream: MLB 3 + + + + Lazystream: MLB 4 + + + + Lazystream: MLB 5 + + + + Lazystream: MLB 6 + + + + Lazystream: MLB 7 + + + + Lazystream: MLB 8 + + + + Lazystream: MLB 9 + + + + Lazystream: MLB 10 + + + + Lazystream: MLB 11 + + + + Lazystream: MLB 12 + + + + Lazystream: MLB 13 + + + + Lazystream: MLB 14 + + + + Lazystream: MLB 15 + + + + Lazystream: MLB 16 + + + + Lazystream: MLB 17 + + + + Lazystream: MLB 18 + + + + Lazystream: MLB 19 + + + + Lazystream: MLB 20 + + + + Lazystream: MLB 21 + + + + Lazystream: MLB 22 + + + + Lazystream: MLB 23 + + + + Lazystream: MLB 24 + + + + Lazystream: MLB 25 + + + + Lazystream: MLB 26 + + + + Lazystream: MLB 27 + + + + Lazystream: MLB 28 + + + + Lazystream: MLB 29 + + + + Lazystream: MLB 30 + + + + Lazystream: MLB 31 + + + + Lazystream: MLB 32 + + + + Lazystream: MLB 33 + + + + Lazystream: MLB 34 + + + + Lazystream: MLB 35 + + + + Lazystream: MLB 36 + + + + Lazystream: MLB 37 + + + + Lazystream: MLB 38 + + + + Lazystream: MLB 39 + + + + Lazystream: MLB 40 + + + + Lazystream: MLB 41 + + + + Lazystream: MLB 42 + + + + Lazystream: MLB 43 + + + + Lazystream: MLB 44 + + + + Lazystream: MLB 45 + + + + Lazystream: MLB 46 + + + + Lazystream: MLB 47 + + + + Lazystream: MLB 48 + + + + Lazystream: MLB 49 + + + + Lazystream: MLB 50 + + + + Lazystream: MLB 51 + + + + Lazystream: MLB 52 + + + + Lazystream: MLB 53 + + + + Lazystream: MLB 54 + + + + Lazystream: MLB 55 + + + + Lazystream: MLB 56 + + + + Lazystream: MLB 57 + + + + Lazystream: MLB 58 + + + + Lazystream: MLB 59 + + + + Lazystream: MLB 60 + + + + Lazystream: MLB 61 + + + + Lazystream: MLB 62 + + + + Lazystream: MLB 63 + + + + Lazystream: MLB 64 + + + + Lazystream: MLB 65 + + + + Lazystream: MLB 66 + + + + Lazystream: MLB 67 + + + + Lazystream: MLB 68 + + + + Lazystream: MLB 69 + + + + Lazystream: MLB 70 + + + + Lazystream: MLB 71 + + + + Lazystream: MLB 72 + + + + Lazystream: MLB 73 + + + + Lazystream: MLB 74 + + + + Lazystream: MLB 75 + + + + Lazystream: MLB 76 + + + + Lazystream: MLB 77 + + + + Lazystream: MLB 78 + + + + Lazystream: MLB 79 + + + + Lazystream: MLB 80 + + + + Lazystream: MLB 81 + + + + Lazystream: MLB 82 + + + + Lazystream: MLB 83 + + + + Lazystream: MLB 84 + + + + Lazystream: MLB 85 + + + + Lazystream: MLB 86 + + + + Lazystream: MLB 87 + + + + Lazystream: MLB 88 + + + + Lazystream: MLB 89 + + + + Lazystream: MLB 90 + + + + Lazystream: MLB 91 + + + + Lazystream: MLB 92 + + + + Lazystream: MLB 93 + + + + Lazystream: MLB 94 + + + + Lazystream: MLB 95 + + + + Lazystream: MLB 96 + + + + Lazystream: MLB 97 + + + + Lazystream: MLB 98 + + + + Lazystream: MLB 99 + + + + Lazystream: MLB 100 + + + \ No newline at end of file diff --git a/root/defaults/lazystream-nhl.m3u b/root/defaults/lazystream-nhl.m3u new file mode 100644 index 0000000..d20bf2c --- /dev/null +++ b/root/defaults/lazystream-nhl.m3u @@ -0,0 +1,201 @@ +#EXTM3U +#EXTINF:-1 CUID="1000" tvg-id="1000" tvg-name="Lazystream: NHL 1",Lazystream: NHL 1 +. +#EXTINF:-1 CUID="1001" tvg-id="1001" tvg-name="Lazystream: NHL 2",Lazystream: NHL 2 +. +#EXTINF:-1 CUID="1002" tvg-id="1002" tvg-name="Lazystream: NHL 3",Lazystream: NHL 3 +. +#EXTINF:-1 CUID="1003" tvg-id="1003" tvg-name="Lazystream: NHL 4",Lazystream: NHL 4 +. +#EXTINF:-1 CUID="1004" tvg-id="1004" tvg-name="Lazystream: NHL 5",Lazystream: NHL 5 +. +#EXTINF:-1 CUID="1005" tvg-id="1005" tvg-name="Lazystream: NHL 6",Lazystream: NHL 6 +. +#EXTINF:-1 CUID="1006" tvg-id="1006" tvg-name="Lazystream: NHL 7",Lazystream: NHL 7 +. +#EXTINF:-1 CUID="1007" tvg-id="1007" tvg-name="Lazystream: NHL 8",Lazystream: NHL 8 +. +#EXTINF:-1 CUID="1008" tvg-id="1008" tvg-name="Lazystream: NHL 9",Lazystream: NHL 9 +. +#EXTINF:-1 CUID="1009" tvg-id="1009" tvg-name="Lazystream: NHL 10",Lazystream: NHL 10 +. +#EXTINF:-1 CUID="1010" tvg-id="1010" tvg-name="Lazystream: NHL 11",Lazystream: NHL 11 +. +#EXTINF:-1 CUID="1011" tvg-id="1011" tvg-name="Lazystream: NHL 12",Lazystream: NHL 12 +. +#EXTINF:-1 CUID="1012" tvg-id="1012" tvg-name="Lazystream: NHL 13",Lazystream: NHL 13 +. +#EXTINF:-1 CUID="1013" tvg-id="1013" tvg-name="Lazystream: NHL 14",Lazystream: NHL 14 +. +#EXTINF:-1 CUID="1014" tvg-id="1014" tvg-name="Lazystream: NHL 15",Lazystream: NHL 15 +. +#EXTINF:-1 CUID="1015" tvg-id="1015" tvg-name="Lazystream: NHL 16",Lazystream: NHL 16 +. +#EXTINF:-1 CUID="1016" tvg-id="1016" tvg-name="Lazystream: NHL 17",Lazystream: NHL 17 +. +#EXTINF:-1 CUID="1017" tvg-id="1017" tvg-name="Lazystream: NHL 18",Lazystream: NHL 18 +. +#EXTINF:-1 CUID="1018" tvg-id="1018" tvg-name="Lazystream: NHL 19",Lazystream: NHL 19 +. +#EXTINF:-1 CUID="1019" tvg-id="1019" tvg-name="Lazystream: NHL 20",Lazystream: NHL 20 +. +#EXTINF:-1 CUID="1020" tvg-id="1020" tvg-name="Lazystream: NHL 21",Lazystream: NHL 21 +. +#EXTINF:-1 CUID="1021" tvg-id="1021" tvg-name="Lazystream: NHL 22",Lazystream: NHL 22 +. +#EXTINF:-1 CUID="1022" tvg-id="1022" tvg-name="Lazystream: NHL 23",Lazystream: NHL 23 +. +#EXTINF:-1 CUID="1023" tvg-id="1023" tvg-name="Lazystream: NHL 24",Lazystream: NHL 24 +. +#EXTINF:-1 CUID="1024" tvg-id="1024" tvg-name="Lazystream: NHL 25",Lazystream: NHL 25 +. +#EXTINF:-1 CUID="1025" tvg-id="1025" tvg-name="Lazystream: NHL 26",Lazystream: NHL 26 +. +#EXTINF:-1 CUID="1026" tvg-id="1026" tvg-name="Lazystream: NHL 27",Lazystream: NHL 27 +. +#EXTINF:-1 CUID="1027" tvg-id="1027" tvg-name="Lazystream: NHL 28",Lazystream: NHL 28 +. +#EXTINF:-1 CUID="1028" tvg-id="1028" tvg-name="Lazystream: NHL 29",Lazystream: NHL 29 +. +#EXTINF:-1 CUID="1029" tvg-id="1029" tvg-name="Lazystream: NHL 30",Lazystream: NHL 30 +. +#EXTINF:-1 CUID="1030" tvg-id="1030" tvg-name="Lazystream: NHL 31",Lazystream: NHL 31 +. +#EXTINF:-1 CUID="1031" tvg-id="1031" tvg-name="Lazystream: NHL 32",Lazystream: NHL 32 +. +#EXTINF:-1 CUID="1032" tvg-id="1032" tvg-name="Lazystream: NHL 33",Lazystream: NHL 33 +. +#EXTINF:-1 CUID="1033" tvg-id="1033" tvg-name="Lazystream: NHL 34",Lazystream: NHL 34 +. +#EXTINF:-1 CUID="1034" tvg-id="1034" tvg-name="Lazystream: NHL 35",Lazystream: NHL 35 +. +#EXTINF:-1 CUID="1035" tvg-id="1035" tvg-name="Lazystream: NHL 36",Lazystream: NHL 36 +. +#EXTINF:-1 CUID="1036" tvg-id="1036" tvg-name="Lazystream: NHL 37",Lazystream: NHL 37 +. +#EXTINF:-1 CUID="1037" tvg-id="1037" tvg-name="Lazystream: NHL 38",Lazystream: NHL 38 +. +#EXTINF:-1 CUID="1038" tvg-id="1038" tvg-name="Lazystream: NHL 39",Lazystream: NHL 39 +. +#EXTINF:-1 CUID="1039" tvg-id="1039" tvg-name="Lazystream: NHL 40",Lazystream: NHL 40 +. +#EXTINF:-1 CUID="1040" tvg-id="1040" tvg-name="Lazystream: NHL 41",Lazystream: NHL 41 +. +#EXTINF:-1 CUID="1041" tvg-id="1041" tvg-name="Lazystream: NHL 42",Lazystream: NHL 42 +. +#EXTINF:-1 CUID="1042" tvg-id="1042" tvg-name="Lazystream: NHL 43",Lazystream: NHL 43 +. +#EXTINF:-1 CUID="1043" tvg-id="1043" tvg-name="Lazystream: NHL 44",Lazystream: NHL 44 +. +#EXTINF:-1 CUID="1044" tvg-id="1044" tvg-name="Lazystream: NHL 45",Lazystream: NHL 45 +. +#EXTINF:-1 CUID="1045" tvg-id="1045" tvg-name="Lazystream: NHL 46",Lazystream: NHL 46 +. +#EXTINF:-1 CUID="1046" tvg-id="1046" tvg-name="Lazystream: NHL 47",Lazystream: NHL 47 +. +#EXTINF:-1 CUID="1047" tvg-id="1047" tvg-name="Lazystream: NHL 48",Lazystream: NHL 48 +. +#EXTINF:-1 CUID="1048" tvg-id="1048" tvg-name="Lazystream: NHL 49",Lazystream: NHL 49 +. +#EXTINF:-1 CUID="1049" tvg-id="1049" tvg-name="Lazystream: NHL 50",Lazystream: NHL 50 +. +#EXTINF:-1 CUID="1050" tvg-id="1050" tvg-name="Lazystream: NHL 51",Lazystream: NHL 51 +. +#EXTINF:-1 CUID="1051" tvg-id="1051" tvg-name="Lazystream: NHL 52",Lazystream: NHL 52 +. +#EXTINF:-1 CUID="1052" tvg-id="1052" tvg-name="Lazystream: NHL 53",Lazystream: NHL 53 +. +#EXTINF:-1 CUID="1053" tvg-id="1053" tvg-name="Lazystream: NHL 54",Lazystream: NHL 54 +. +#EXTINF:-1 CUID="1054" tvg-id="1054" tvg-name="Lazystream: NHL 55",Lazystream: NHL 55 +. +#EXTINF:-1 CUID="1055" tvg-id="1055" tvg-name="Lazystream: NHL 56",Lazystream: NHL 56 +. +#EXTINF:-1 CUID="1056" tvg-id="1056" tvg-name="Lazystream: NHL 57",Lazystream: NHL 57 +. +#EXTINF:-1 CUID="1057" tvg-id="1057" tvg-name="Lazystream: NHL 58",Lazystream: NHL 58 +. +#EXTINF:-1 CUID="1058" tvg-id="1058" tvg-name="Lazystream: NHL 59",Lazystream: NHL 59 +. +#EXTINF:-1 CUID="1059" tvg-id="1059" tvg-name="Lazystream: NHL 60",Lazystream: NHL 60 +. +#EXTINF:-1 CUID="1060" tvg-id="1060" tvg-name="Lazystream: NHL 61",Lazystream: NHL 61 +. +#EXTINF:-1 CUID="1061" tvg-id="1061" tvg-name="Lazystream: NHL 62",Lazystream: NHL 62 +. +#EXTINF:-1 CUID="1062" tvg-id="1062" tvg-name="Lazystream: NHL 63",Lazystream: NHL 63 +. +#EXTINF:-1 CUID="1063" tvg-id="1063" tvg-name="Lazystream: NHL 64",Lazystream: NHL 64 +. +#EXTINF:-1 CUID="1064" tvg-id="1064" tvg-name="Lazystream: NHL 65",Lazystream: NHL 65 +. +#EXTINF:-1 CUID="1065" tvg-id="1065" tvg-name="Lazystream: NHL 66",Lazystream: NHL 66 +. +#EXTINF:-1 CUID="1066" tvg-id="1066" tvg-name="Lazystream: NHL 67",Lazystream: NHL 67 +. +#EXTINF:-1 CUID="1067" tvg-id="1067" tvg-name="Lazystream: NHL 68",Lazystream: NHL 68 +. +#EXTINF:-1 CUID="1068" tvg-id="1068" tvg-name="Lazystream: NHL 69",Lazystream: NHL 69 +. +#EXTINF:-1 CUID="1069" tvg-id="1069" tvg-name="Lazystream: NHL 70",Lazystream: NHL 70 +. +#EXTINF:-1 CUID="1070" tvg-id="1070" tvg-name="Lazystream: NHL 71",Lazystream: NHL 71 +. +#EXTINF:-1 CUID="1071" tvg-id="1071" tvg-name="Lazystream: NHL 72",Lazystream: NHL 72 +. +#EXTINF:-1 CUID="1072" tvg-id="1072" tvg-name="Lazystream: NHL 73",Lazystream: NHL 73 +. +#EXTINF:-1 CUID="1073" tvg-id="1073" tvg-name="Lazystream: NHL 74",Lazystream: NHL 74 +. +#EXTINF:-1 CUID="1074" tvg-id="1074" tvg-name="Lazystream: NHL 75",Lazystream: NHL 75 +. +#EXTINF:-1 CUID="1075" tvg-id="1075" tvg-name="Lazystream: NHL 76",Lazystream: NHL 76 +. +#EXTINF:-1 CUID="1076" tvg-id="1076" tvg-name="Lazystream: NHL 77",Lazystream: NHL 77 +. +#EXTINF:-1 CUID="1077" tvg-id="1077" tvg-name="Lazystream: NHL 78",Lazystream: NHL 78 +. +#EXTINF:-1 CUID="1078" tvg-id="1078" tvg-name="Lazystream: NHL 79",Lazystream: NHL 79 +. +#EXTINF:-1 CUID="1079" tvg-id="1079" tvg-name="Lazystream: NHL 80",Lazystream: NHL 80 +. +#EXTINF:-1 CUID="1080" tvg-id="1080" tvg-name="Lazystream: NHL 81",Lazystream: NHL 81 +. +#EXTINF:-1 CUID="1081" tvg-id="1081" tvg-name="Lazystream: NHL 82",Lazystream: NHL 82 +. +#EXTINF:-1 CUID="1082" tvg-id="1082" tvg-name="Lazystream: NHL 83",Lazystream: NHL 83 +. +#EXTINF:-1 CUID="1083" tvg-id="1083" tvg-name="Lazystream: NHL 84",Lazystream: NHL 84 +. +#EXTINF:-1 CUID="1084" tvg-id="1084" tvg-name="Lazystream: NHL 85",Lazystream: NHL 85 +. +#EXTINF:-1 CUID="1085" tvg-id="1085" tvg-name="Lazystream: NHL 86",Lazystream: NHL 86 +. +#EXTINF:-1 CUID="1086" tvg-id="1086" tvg-name="Lazystream: NHL 87",Lazystream: NHL 87 +. +#EXTINF:-1 CUID="1087" tvg-id="1087" tvg-name="Lazystream: NHL 88",Lazystream: NHL 88 +. +#EXTINF:-1 CUID="1088" tvg-id="1088" tvg-name="Lazystream: NHL 89",Lazystream: NHL 89 +. +#EXTINF:-1 CUID="1089" tvg-id="1089" tvg-name="Lazystream: NHL 90",Lazystream: NHL 90 +. +#EXTINF:-1 CUID="1090" tvg-id="1090" tvg-name="Lazystream: NHL 91",Lazystream: NHL 91 +. +#EXTINF:-1 CUID="1091" tvg-id="1091" tvg-name="Lazystream: NHL 92",Lazystream: NHL 92 +. +#EXTINF:-1 CUID="1092" tvg-id="1092" tvg-name="Lazystream: NHL 93",Lazystream: NHL 93 +. +#EXTINF:-1 CUID="1093" tvg-id="1093" tvg-name="Lazystream: NHL 94",Lazystream: NHL 94 +. +#EXTINF:-1 CUID="1094" tvg-id="1094" tvg-name="Lazystream: NHL 95",Lazystream: NHL 95 +. +#EXTINF:-1 CUID="1095" tvg-id="1095" tvg-name="Lazystream: NHL 96",Lazystream: NHL 96 +. +#EXTINF:-1 CUID="1096" tvg-id="1096" tvg-name="Lazystream: NHL 97",Lazystream: NHL 97 +. +#EXTINF:-1 CUID="1097" tvg-id="1097" tvg-name="Lazystream: NHL 98",Lazystream: NHL 98 +. +#EXTINF:-1 CUID="1098" tvg-id="1098" tvg-name="Lazystream: NHL 99",Lazystream: NHL 99 +. +#EXTINF:-1 CUID="1099" tvg-id="1099" tvg-name="Lazystream: NHL 100",Lazystream: NHL 100 +. diff --git a/root/defaults/lazystream-nhl.xml b/root/defaults/lazystream-nhl.xml new file mode 100644 index 0000000..10515d1 --- /dev/null +++ b/root/defaults/lazystream-nhl.xml @@ -0,0 +1,405 @@ + + + + + + Lazystream: NHL 1 + + + + Lazystream: NHL 2 + + + + Lazystream: NHL 3 + + + + Lazystream: NHL 4 + + + + Lazystream: NHL 5 + + + + Lazystream: NHL 6 + + + + Lazystream: NHL 7 + + + + Lazystream: NHL 8 + + + + Lazystream: NHL 9 + + + + Lazystream: NHL 10 + + + + Lazystream: NHL 11 + + + + Lazystream: NHL 12 + + + + Lazystream: NHL 13 + + + + Lazystream: NHL 14 + + + + Lazystream: NHL 15 + + + + Lazystream: NHL 16 + + + + Lazystream: NHL 17 + + + + Lazystream: NHL 18 + + + + Lazystream: NHL 19 + + + + Lazystream: NHL 20 + + + + Lazystream: NHL 21 + + + + Lazystream: NHL 22 + + + + Lazystream: NHL 23 + + + + Lazystream: NHL 24 + + + + Lazystream: NHL 25 + + + + Lazystream: NHL 26 + + + + Lazystream: NHL 27 + + + + Lazystream: NHL 28 + + + + Lazystream: NHL 29 + + + + Lazystream: NHL 30 + + + + Lazystream: NHL 31 + + + + Lazystream: NHL 32 + + + + Lazystream: NHL 33 + + + + Lazystream: NHL 34 + + + + Lazystream: NHL 35 + + + + Lazystream: NHL 36 + + + + Lazystream: NHL 37 + + + + Lazystream: NHL 38 + + + + Lazystream: NHL 39 + + + + Lazystream: NHL 40 + + + + Lazystream: NHL 41 + + + + Lazystream: NHL 42 + + + + Lazystream: NHL 43 + + + + Lazystream: NHL 44 + + + + Lazystream: NHL 45 + + + + Lazystream: NHL 46 + + + + Lazystream: NHL 47 + + + + Lazystream: NHL 48 + + + + Lazystream: NHL 49 + + + + Lazystream: NHL 50 + + + + Lazystream: NHL 51 + + + + Lazystream: NHL 52 + + + + Lazystream: NHL 53 + + + + Lazystream: NHL 54 + + + + Lazystream: NHL 55 + + + + Lazystream: NHL 56 + + + + Lazystream: NHL 57 + + + + Lazystream: NHL 58 + + + + Lazystream: NHL 59 + + + + Lazystream: NHL 60 + + + + Lazystream: NHL 61 + + + + Lazystream: NHL 62 + + + + Lazystream: NHL 63 + + + + Lazystream: NHL 64 + + + + Lazystream: NHL 65 + + + + Lazystream: NHL 66 + + + + Lazystream: NHL 67 + + + + Lazystream: NHL 68 + + + + Lazystream: NHL 69 + + + + Lazystream: NHL 70 + + + + Lazystream: NHL 71 + + + + Lazystream: NHL 72 + + + + Lazystream: NHL 73 + + + + Lazystream: NHL 74 + + + + Lazystream: NHL 75 + + + + Lazystream: NHL 76 + + + + Lazystream: NHL 77 + + + + Lazystream: NHL 78 + + + + Lazystream: NHL 79 + + + + Lazystream: NHL 80 + + + + Lazystream: NHL 81 + + + + Lazystream: NHL 82 + + + + Lazystream: NHL 83 + + + + Lazystream: NHL 84 + + + + Lazystream: NHL 85 + + + + Lazystream: NHL 86 + + + + Lazystream: NHL 87 + + + + Lazystream: NHL 88 + + + + Lazystream: NHL 89 + + + + Lazystream: NHL 90 + + + + Lazystream: NHL 91 + + + + Lazystream: NHL 92 + + + + Lazystream: NHL 93 + + + + Lazystream: NHL 94 + + + + Lazystream: NHL 95 + + + + Lazystream: NHL 96 + + + + Lazystream: NHL 97 + + + + Lazystream: NHL 98 + + + + Lazystream: NHL 99 + + + + Lazystream: NHL 100 + + + \ No newline at end of file diff --git a/sample_cron.txt b/root/defaults/sample_cron.txt similarity index 52% rename from sample_cron.txt rename to root/defaults/sample_cron.txt index 137c225..eef278b 100644 --- a/sample_cron.txt +++ b/root/defaults/sample_cron.txt @@ -1,4 +1,4 @@ -printf '45 04 * * * /config/cronjob.sh' > /etc/crontabs/root +printf '0 * * * * /cronjob.sh' > /etc/crontabs/root ### Remove this line and everything beneath it ### ### Edit the above cron expression, rename this file to cron.txt, and restart the container. -### If no cron.txt is found the cronjob will run daily at 00:00 \ No newline at end of file +### If no cron.txt is found the cronjob will run every hour \ No newline at end of file diff --git a/root/defaults/xteve-settings.json b/root/defaults/xteve-settings.json new file mode 100644 index 0000000..52669b5 --- /dev/null +++ b/root/defaults/xteve-settings.json @@ -0,0 +1,115 @@ +{ + "api": true, + "authentication.api": false, + "authentication.m3u": false, + "authentication.pms": false, + "authentication.web": false, + "authentication.xml": false, + "backup.keep": 10, + "backup.path": "/xteve/backup/", + "git.branch": "master", + "buffer": "ffmpeg", + "buffer.size.kb": 5120, + "buffer.timeout": 500, + "cache.images": false, + "epgSource": "XEPG", + "ffmpeg.options": "-hide_banner -loglevel error -i [URL] -c copy -f mpegts pipe:1", + "ffmpeg.path": "/usr/bin/ffmpeg", + "vlc.options": "-I dummy [URL] --sout #std{mux=ts,access=file,dst=-}", + "vlc.path": "/usr/bin/cvlc", + "files": { + "hdhr": {}, + "m3u": { + "MLXAQ0TBXCTR3TV9D0K8": { + "compatibility": { + "group.title": 0, + "stream.id": 100, + "streams": 100, + "tvg.id": 100 + }, + "counter.download": 98, + "counter.error": 4, + "description": "", + "file.source": "/playlists/lazystream/lazystream-nhl.m3u", + "file.xteve": "MLXAQ0TBXCTR3TV9D0K8.m3u", + "id.provider": "MLXAQ0TBXCTR3TV9D0K8", + "last.update": "2020-03-04 15:29:04", + "name": "nhl", + "provider.availability": 95, + "tuner": 4, + "type": "m3u" + }, + "MT0Y8RELU1MT4Q86IAHO": { + "compatibility": { + "group.title": 0, + "stream.id": 100, + "streams": 100, + "tvg.id": 100 + }, + "counter.download": 94, + "counter.error": 4, + "description": "", + "file.source": "/playlists/lazystream/lazystream-mlb.m3u", + "file.xteve": "MT0Y8RELU1MT4Q86IAHO.m3u", + "id.provider": "MT0Y8RELU1MT4Q86IAHO", + "last.update": "2020-03-04 15:29:04", + "name": "mlb", + "provider.availability": 95, + "tuner": 4, + "type": "m3u" + } + }, + "xmltv": { + "X0M9AR41W0FL06FNRT81": { + "compatibility": { + "xmltv.channels": 100, + "xmltv.programs": 0 + }, + "counter.download": 151, + "counter.error": 4, + "description": "", + "file.source": "/playlists/lazystream/lazystream-nhl.xml", + "file.xteve": "X0M9AR41W0FL06FNRT81.xml", + "id.provider": "X0M9AR41W0FL06FNRT81", + "last.update": "2020-03-04 15:29:05", + "name": "nhl", + "provider.availability": 97, + "type": "xmltv" + }, + "XXDC0UWZB20AXXKCO4G9": { + "compatibility": { + "xmltv.channels": 100, + "xmltv.programs": 11 + }, + "counter.download": 149, + "counter.error": 4, + "description": "", + "file.source": "/playlists/lazystream/lazystream-mlb.xml", + "file.xteve": "XXDC0UWZB20AXXKCO4G9.xml", + "id.provider": "XXDC0UWZB20AXXKCO4G9", + "last.update": "2020-03-04 15:29:05", + "name": "mlb", + "provider.availability": 97, + "type": "xmltv" + } + } + }, + "files.update": true, + "filter": {}, + "language": "en", + "log.entries.ram": 500, + "m3u8.adaptive.bandwidth.mbps": 10, + "mapping.first.channel": 1000, + "port": "34400", + "ssdp": true, + "temp.path": "/tmp/xteve/", + "tuner": 4, + "update": [ + "0000" + ], + "user.agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0", + "uuid": "2020-02-4R8O-BG0O65", + "version": "2.1.0", + "xepg.replace.missing.images": true, + "xteveAutoUpdate": true +} \ No newline at end of file diff --git a/root/etc/cont-init.d/10-adduser b/root/etc/cont-init.d/10-adduser new file mode 100644 index 0000000..f39cd33 --- /dev/null +++ b/root/etc/cont-init.d/10-adduser @@ -0,0 +1,14 @@ +#!/usr/bin/with-contenv bash + +groupmod -o -g "$PGID" abc +usermod -o -u "$PUID" abc + +echo ' +------------------------------------- +GID/UID +-------------------------------------' +echo " +User uid: $(id -u abc) +User gid: $(id -g abc) +------------------------------------- +" diff --git a/root/etc/cont-init.d/40-install-defaults b/root/etc/cont-init.d/40-install-defaults new file mode 100644 index 0000000..c2111dd --- /dev/null +++ b/root/etc/cont-init.d/40-install-defaults @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bash + +cp /defaults/sample_cron.txt /config/sample_cron.txt + +cp -n /defaults/xteve-settings.json /xteve/settings.json + +mkdir -p /playlists/lazystream/ +cp -n /defaults/lazystream-mlb.m3u /playlists/lazystream/lazystream-mlb.m3u +cp -n /defaults/lazystream-mlb.xml /playlists/lazystream/lazystream-mlb.xml +cp -n /defaults/lazystream-nhl.m3u /playlists/lazystream/lazystream-nhl.m3u +cp -n /defaults/lazystream-nhl.xml /playlists/lazystream/lazystream-nhl.xml \ No newline at end of file diff --git a/root/etc/cont-init.d/50-update-hosts b/root/etc/cont-init.d/50-update-hosts new file mode 100644 index 0000000..36ed08c --- /dev/null +++ b/root/etc/cont-init.d/50-update-hosts @@ -0,0 +1,33 @@ +#!/usr/bin/with-contenv bash + +function prepend() { + while read line; + do echo "${1}${line}"; + done; +} + +exec 1> >(prepend "[update-hosts] ") + + +# Update hosts file +export IP=$(getent ahostsv4 freegamez.ga | awk '{ print $1 }' | head -1) + +echo $IP playback.svcs.mlb.com >> /etc/hosts +echo $IP mf.svc.nhl.com >> /etc/hosts +echo $IP mlb-ws-mf.media.mlb.com >> /etc/hosts + +cat /etc/hosts + +# Update certs +rm -f /home/abc/.gnutls/known_hosts +rm -f /root/.gnutls/known_hosts + +printf 'y\n' | gnutls-cli --tofu playback.svcs.mlb.com:443 +printf 'y\n' | gnutls-cli --tofu mf.svc.nhl.com:443 +printf 'y\n' | gnutls-cli --tofu mlb-ws-mf.media.mlb.com:443 + +install -D /root/.gnutls/known_hosts /home/abc/.gnutls/known_hosts + +rm -rf /root/.gnutls + +cat /home/abc/.gnutls/known_hosts \ No newline at end of file diff --git a/root/etc/cont-init.d/60-chown-files b/root/etc/cont-init.d/60-chown-files new file mode 100644 index 0000000..4ae7614 --- /dev/null +++ b/root/etc/cont-init.d/60-chown-files @@ -0,0 +1,9 @@ +#!/usr/bin/with-contenv bash + +chown -R abc:abc /config +chown -R abc:abc /playlists +chown -R abc:abc /guide2go +chown -R abc:abc /xteve +chown -R abc:abc /tmp/xteve + +chown -R abc:abc /home/abc \ No newline at end of file diff --git a/root/etc/crontabs/root b/root/etc/crontabs/root new file mode 100644 index 0000000..8b97ee3 --- /dev/null +++ b/root/etc/crontabs/root @@ -0,0 +1 @@ +0 * * * * /cronjob.sh \ No newline at end of file diff --git a/root/etc/services.d/crond/run b/root/etc/services.d/crond/run new file mode 100644 index 0000000..ae818a2 --- /dev/null +++ b/root/etc/services.d/crond/run @@ -0,0 +1,12 @@ +#!/usr/bin/with-contenv bash + +CRON_FILE=/config/cron.txt + +if [ -f "$CRON_FILE" ]; then + . $CRON_FILE +else + echo "[crond-setup] No cron definition found..." + echo "[crond-setup] By default, cronjob will run every night at midnight unless cron file is configured." +fi + +crond -f \ No newline at end of file diff --git a/root/etc/services.d/xteve/run b/root/etc/services.d/xteve/run new file mode 100644 index 0000000..e4ab0ce --- /dev/null +++ b/root/etc/services.d/xteve/run @@ -0,0 +1,5 @@ +#!/usr/bin/with-contenv bash + +exec \ + s6-setuidgid abc /bin/bash -c \ + 'xteve -port=$XTEVE_PORT -config=/xteve/' \ No newline at end of file diff --git a/guide2go b/root/usr/bin/guide2go similarity index 100% rename from guide2go rename to root/usr/bin/guide2go diff --git a/run.sh b/run.sh index 2b978d2..c00d1ed 100755 --- a/run.sh +++ b/run.sh @@ -2,12 +2,14 @@ docker run -d \ --name=xteve_lazystream \ + -p 34400:34400 \ + -e TZ="America/Los_Angeles" \ + --env-file=.env \ --log-opt max-size=10m \ --log-opt max-file=3 \ - -e TZ="America/Los_Angeles" \ - -v /mnt/user/appdata/xteve/:/root/.xteve:rw \ - -v /mnt/user/appdata/xteve/_config/:/config:rw \ - -v /mnt/user/appdata/xteve/_guide2go/:/guide2go:rw \ + -v /mnt/user/appdata/xteve/.xteve:/xteve:rw \ + -v /mnt/user/appdata/xteve/config/:/config:rw \ + -v /mnt/user/appdata/xteve/guide2go/:/guide2go:rw \ -v /mnt/user/appdata/xteve/playlists/:/playlists:rw \ -v /tmp/xteve/:/tmp/xteve:rw \ taylorbourne/xteve_lazystream diff --git a/sample.env b/sample.env new file mode 100644 index 0000000..6fa88c0 --- /dev/null +++ b/sample.env @@ -0,0 +1,44 @@ +##### Config + +### Set as same user on your machine, run id -u & id -g to get your user / group id +PUID=1000 +PGID=1000 + +### Xteve Config +XTEVE_PORT=34400 +use_xTeveAPI=yes + +### Lazystream Config +use_lazystream=yes +include_nhl=yes +include_mlb=yes + +### Guide2go Config +use_guide2go=no + +## List of created lineup json files in /guide2go +# Exmaple with 3 lineups +JsonList="CBLguide.json SATguide.json SATSport.json" + +## to create your lineups run the below command and follow the on-screen instructions +# docker exec -it guide2go -configure /guide2go/.json + +### Emby +# Only necessary if xTeVe API is active +# API Key, https://github.com/MediaBrowser/Emby/wiki/Api-Key-Authentication +# embyID, settings, scroll down click API, Scheduled Task Service, GET /ScheduledTasks, Try, Execute, look for "Refresh Guide" ID, sample here 9492d30c70f7f1bec3757c9d0a4feb45 +use_embyAPI=no +embyIP= +embyPORT=8096 +embyApiKey= +embyID= + +### Plex +# Only necessary if xTeVe API is active +# Finding your Plex token: https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/ +# Finding Plex ID: http://YOUR_IP_HERE:32400/?X-Plex-Token=YOUR_TOKEN_HERE , look for "tv.plex.providers.epg.xmltv: " and enter the value blow. +use_plexAPI=no +plexIP= +plexPORT=32400 +plexToken= +plexID= \ No newline at end of file diff --git a/sample_xteve.txt b/sample_xteve.txt deleted file mode 100644 index 2045e08..0000000 --- a/sample_xteve.txt +++ /dev/null @@ -1,4 +0,0 @@ -xteve -port=34400 -config=/root/.xteve/test/ -### Remove this line and everything beneath it ### -### Edit the above xteve run command, rename this file to xteve.txt, and restart the container -### If no xteve.txt is found xTeVe will start with default values "-port=34400 -config=/root/.xteve/" \ No newline at end of file