build: push tvapp v2 docker files

This commit is contained in:
2025-02-20 13:10:51 -07:00
parent bee45668cc
commit 9e79e42d09
536 changed files with 142093 additions and 5531 deletions

View File

@@ -0,0 +1,18 @@
#!/bin/bash
# #
# @project tvapp2
# @usage docker image which allows you to download a m3u playlist and EPG guide data for the
# IPTV service TheTvApp.
# @file plugins
# @repo https://github.com/Aetherinox/docker-base-alpine
# https://git.binaryninja.net/pub_projects/tvapp2
# #
PLUGINS_PATH="/config/www/plugins"
# #
# Plugins > Start
# #
echo -e " Loader : Checking tvapp2-plugins"

View File

@@ -1,12 +1,13 @@
# #
# @project thetvapp-docker
# @about Nginx site-configs default configuration file
# @file /root/defaults/nginx/nginx.conf.sample
# @repo https://github.com/Aetherinox/thetvapp-docker
# @generated 2024-11-30
# @project tvapp2
# @usage docker image which allows you to download a m3u playlist and EPG guide data for the
# IPTV service TheTvApp.
# @file nginx.conf.sample
# @repo https://github.com/Aetherinox/docker-base-alpine
# https://git.binaryninja.net/pub_projects/tvapp2
# #
user abc;
user dockerx;
# Set number of worker processes automatically based on number of CPU cores.
include /config/nginx/worker_processes.conf;
@@ -39,7 +40,7 @@ http
# Name servers used to resolve names of upstream servers into addresses.
# It's also needed when using tcpsocket and udpsocket in Lua modules.
#resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001;
# resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001;
include /config/nginx/resolver.conf;
# Don't tell nginx version to the clients. Default is 'on'.
@@ -63,7 +64,7 @@ http
# included in server blocks where listen 443 is defined
# Enable gzipping of responses.
#gzip on;
# gzip on;
# Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'.
gzip_vary on;

View File

@@ -1,9 +1,10 @@
# #
# @project thetvapp-docker
# @about Nginx site-configs default configuration file
# @file /root/defaults/nginx/site-confs/default.conf
# @repo https://github.com/Aetherinox/thetvapp-docker
# @generated 2024-11-30
# @project tvapp2
# @usage docker image which allows you to download a m3u playlist and EPG guide data for the
# IPTV service TheTvApp.
# @file nginx.conf.sample
# @repo https://github.com/Aetherinox/docker-base-alpine
# https://git.binaryninja.net/pub_projects/tvapp2
# #
server
@@ -29,39 +30,35 @@ server
location /
{
# enable for basic auth
# auth_basic "Restricted";
# auth_basic_user_file /config/nginx/.htpasswd;
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# index > fancy
fancyindex on;
fancyindex_header "/theme/header.html";
fancyindex_footer "/theme/footer.html";
fancyindex_ignore "theme";
fancyindex_time_format "%m-%d-%Y %l:%M:%S %P";
fancyindex_directories_first on;
fancyindex_localtime on;
fancyindex_name_length 255;
fancyindex_show_path off;
fancyindex_show_dotfiles off;
fancyindex_hide_symlinks on;
fancyindex_hide_parent_dir on;
fancyindex_default_sort name;
fancyindex on;
fancyindex_header "/theme/header.html";
fancyindex_footer "/theme/footer.html";
fancyindex_ignore "theme";
fancyindex_time_format "%m-%d-%Y %T";
fancyindex_name_length 255;
fancyindex_show_dotfiles off;
fancyindex_hide_symlinks on;
fancyindex_default_sort name;
# index > auto
autoindex_exact_size off;
autoindex_format html;
autoindex_localtime on;
autoindex_exact_size off;
autoindex_format html;
autoindex_localtime on;
gzip on;
gzip_vary on;
gzip_types text/css text/javascript text/xml application/atom+xml application/rss+xml text/markdown text/mathml text/plain text/vnd.sun.j2me.app-descriptor text/vnd.wap.wml text/x-component application/json application/xhtml+xml application/xspf+xml font/woff font/woff2 image/avif image/bmp image/png image/svg+xml image/tiff image/vnd.wap.wbmp image/webp image/x-icon image/x-jng audio/midi audio/mpeg audio/ogg audio/x-m4a audio/x-realaudio;
gzip_proxied any;
gzip_comp_level 1;
gzip_http_version 1.0;
gunzip on;
gzip_static on;
gzip on;
gzip_vary on;
gzip_types text/css text/javascript text/xml application/atom+xml application/rss+xml text/markdown text/mathml text/plain text/vnd.sun.j2me.app-descriptor text/vnd.wap.wml text/x-component application/json application/xhtml+xml application/xspf+xml font/woff font/woff2 image/avif image/bmp image/png image/svg+xml image/tiff image/vnd.wap.wbmp image/webp image/x-icon image/x-jng audio/midi audio/mpeg audio/ogg audio/x-m4a audio/x-realaudio;
gzip_proxied any;
gzip_comp_level 1;
gzip_http_version 1.0;
gunzip on;
gzip_static on;
try_files $uri $uri/ /index.html /index.htm /index.php$is_args$args;
try_files $uri $uri/ /index.html /index.htm /index.php$is_args$args;
}
location ~ ^(.+\.php)(.*)$

View File

@@ -1,45 +1,67 @@
# #
# @project thetvapp-docker
# @about Nginx site-configs default configuration file
# @file /root/defaults/nginx/ssl.conf.sample
# @repo https://github.com/Aetherinox/thetvapp-docker
# @generated 2024-11-30
# @project tvapp2
# @usage docker image which allows you to download a m3u playlist and EPG guide data for the
# IPTV service TheTvApp.
# @file nginx.conf.sample
# @repo https://github.com/Aetherinox/docker-base-alpine
# https://git.binaryninja.net/pub_projects/tvapp2
# #
### Mozilla Recommendations
# generated 2023-06-25, Mozilla Guideline v5.7, nginx 1.24.0, OpenSSL 3.1.1, intermediate configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.24.0&config=intermediate&openssl=3.1.1&guideline=5.7
# #
# generated 2023-06-25, Mozilla Guideline v5.7, nginx 1.24.0, OpenSSL 3.1.1, intermediate configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.24.0&config=intermediate&openssl=3.1.1&guideline=5.7
# #
ssl_certificate /config/keys/cert.crt;
ssl_certificate_key /config/keys/cert.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_certificate /config/keys/cert.crt;
ssl_certificate_key /config/keys/cert.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /config/nginx/dhparams.pem;
# #
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
# #
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_dhparam /config/nginx/dhparams.pem;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
#add_header Strict-Transport-Security "max-age=63072000" always;
# #
# intermediate configuration
# #
# OCSP stapling
#ssl_stapling on;
#ssl_stapling_verify on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# verify chain of trust of OCSP response using Root CA and Intermediate certs
#ssl_trusted_certificate /config/keys/cert.crt;
# #
# OCSP stapling
# #
# Optional additional headers
#add_header Cache-Control "no-transform" always;
#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'" always;
#add_header Permissions-Policy "interest-cohort=()" always;
#add_header Referrer-Policy "same-origin" always;
#add_header X-Content-Type-Options "nosniff" always;
#add_header X-Frame-Options "SAMEORIGIN" always;
#add_header X-UA-Compatible "IE=Edge" always;
#add_header X-XSS-Protection "1; mode=block" always;
# ssl_stapling on;
# ssl_stapling_verify on;
# #
# verify chain of trust of OCSP response using Root CA and Intermediate certs
# #
# ssl_trusted_certificate /config/keys/cert.crt;
# #
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
# #
add_header X-Content-Type-Options nosniff;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains" always;
# #
# Optional additional headers
# #
# add_header Cache-Control "no-transform" always;
# add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'" always;
# add_header Permissions-Policy "interest-cohort=()" always;
# add_header Referrer-Policy "same-origin" always;
# add_header X-Content-Type-Options "nosniff" always;
# add_header X-Frame-Options "SAMEORIGIN" always;
# add_header X-UA-Compatible "IE=Edge" always;
# add_header X-XSS-Protection "1; mode=block" always;

View File

@@ -1,34 +0,0 @@
<html>
<head>
<title>Welcome to our server</title>
<style>
body{
font-family: Helvetica, Arial, sans-serif;
}
.message{
width:330px;
padding:20px 40px;
margin:0 auto;
background-color:#f9f9f9;
border:1px solid #ddd;
}
center{
margin:40px 0;
}
h1{
font-size: 18px;
line-height: 26px;
}
p{
font-size: 12px;
}
</style>
</head>
<body>
<div class="message">
<h1>Welcome to our server</h1>
<p>The website is currently being setup under this address.</p>
<p>For help and support, please contact: <a href="me@example.com">me@example.com</a></p>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -1,21 +0,0 @@
</div>
</div>
</div>
<footer class="footer navbar">
<div class="container">
<div class="col text-center text-muted text-small text-nowrap">
<small>Developed by Aetherinox - <a href="https://github.com/Aetherinox/thetvapp-docker">TheTVApp Grabber</a></small><br />
<small>Lists generated by <a href="https://github.com/dtankdempse/thetvapp-m3u">dtankdempse</a></small>
</div>
</div>
</footer>
<script type="text/javascript">
CreateBreadcrumbs();
GenerateFileIcons();
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.10.0/js/lightbox-plus-jquery.min.js"></script>
</body>
</html>

View File

@@ -1,38 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>TheTvApp for Docker</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.10.0/css/lightbox.min.css">
<link rel="stylesheet" href="/theme/css/ui.min.css">
<link rel="stylesheet" href="/theme/theme.css">
<script type="text/javascript" src="/theme/js/interface.min.js"></script>
<script type="text/javascript" src="/theme/js/breadcrumbs.js"></script>
<script type="text/javascript" src="/theme/js/fileicons.js"></script>
</head>
<body>
<div class="header">
<nav class="navbar sticky-top container">
<div class="navbar-brand">
<i class="fa-sharp-duotone fa-regular fa-tv" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i>
<a href="https://github.com/Aetherinox/thetvapp-docker">TheTvApp for Docker</a>
</div>
</nav>
</div>
<div class="container">
<nav aria-label="breadcrumb">
<ol class="breadcrumb" id="breadcrumbs"/>
</nav>
<div class="row">
<div class="col">
<div class="about">This page displays your most recent copies of TheTvApp's <code>.m3u8</code> playlist and <code>.xml</code> EPG guide data. Right-click each file, select <span class="text-accent">Copy Link</span> and paste the URLs within your IPTV apps such as Jellyfin. The <code>.m3u8</code> and <code>.m3u8.gz</code> are identical guide lists, but the <code>.xml.gz</code> is compressed and will import into your IPTV application much faster.</div>

View File

@@ -1,10 +0,0 @@
/*
@app thetvapp grabber
@author Aetherinox
@url https://github.com/Aetherinox/thetvapp-docker
https://hub.docker.com/repository/docker/aetherinox/thetvapp
Generate breadcrumbs for header
*/
function CreateBreadcrumbs(){for(var e,a,n,r=window.location.pathname.replace(/\/$/,"").split("/"),t="",c="",o=0;o<r.length;o++)c+=r[o]+"/",t+=(e=0==o?"Home":decodeURIComponent(r[o]),a=c,'<li class="breadcrumb-item'+((n=o==r.length-1)?' active aria-current="page':"")+'">'+(n?"":'<a href="'+a+'">')+e+(n?"":"</a>"));document.getElementById("breadcrumbs").innerHTML=t}

View File

@@ -1,203 +0,0 @@
/*
@app thetvapp grabber
@author Aetherinox
@url https://github.com/Aetherinox/thetvapp-docker
https://hub.docker.com/repository/docker/aetherinox/thetvapp
Generate icons for each file shown in list
*/
function GenerateFileIcons()
{
function e(e)
{
return '<i class="fa fa-fw ' + e + '" aria-hidden="true"></i>'
}
var a = document.getElementById("list");
a.removeAttribute("cellpadding"), a.removeAttribute("cellspacing"), a.classList.add("table", "table-sm", "table-hover", "text-nowrap"), a.tHead.children[0].classList.add("d-none", "d-md-table-row"), "/" != window.location.pathname && a.deleteRow(1);
for (var s, c = 0; s = a.rows[c]; c++) filetype = function(e)
{
if (e.endsWith("/"))
return "fa-duotone fa-solid fa-folder";
switch (e.split(".").pop().toLowerCase())
{
case "txt":
return "fa-solid fa-file-lines";
case "pdf":
return "fa-solid fa-file-pdf";
case "bmp":
return "fa-solid fa-file-image";
case "gif":
return "fa-solid fa-file-gif";
case "jpeg":
return "fa-solid fa-file-jpg";
case "jpg":
return "fa-solid fa-file-jpg";
case "png":
return "fa-solid fa-file-png";
case "tif":
return "fa-solid fa-file-image";
case "tiff":
return "fa-solid fa-file-image";
case "aac":
return "fa-solid fa-file-music";
case "aiff":
return "fa-solid fa-file-audio";
case "m4a":
return "fa-solid fa-file-audio";
case "mp3":
return "fa-solid fa-file-mp3";
case "ogg":
return "fa-solid fa-file-music";
case "opus":
return "fa-solid fa-file-music";
case "m3u":
return "fa-solid fa-file-lines";
case "m3u8":
return "fa-solid fa-file-lines";
case "wav":
return "fa-solid fa-file-audio";
case "amv":
return "fa-solid fa-file-video";
case "avi":
return "fa-solid fa-file-video";
case "flv":
return "fa-solid fa-file-video";
case "m4v":
return "fa-solid fa-file-video";
case "mkv":
return "fa-solid fa-file-video";
case "mov":
return "fa-solid fa-file-mov";
case "mp4":
return "fa-solid fa-file-mp4";
case "m4p":
return "fa-solid fa-file-audio";
case "mpeg":
return "fa-solid fa-file-mp4"
case "mpg":
return "fa-solid fa-file-video";
case "ogv":
return "fa-solid fa-file-video";
case "vob":
return "fa-duotone fa-solid fa-photo-film";
case "webm":
return "fa-solid fa-file-video";
case "wmv":
return "fa-solid fa-file-video";
case "7z":
return "fa-solid fa-file-zipper";
case "a":
return "fa-solid fa-file-binary";
case "apk":
return "fa-solid fa-box-archive";
case "ar":
return "fa-solid fa-file-binary";
case "bin":
return "fa-solid fa-file-binary";
case "bz2":
return "fa-solid fa-file-zipper";
case "cab":
return "fa-solid fa-cabinet-filing";
case "dmg":
return "fa-solid fa-tablet-button";
case "gz":
return "fa-solid fa-file-zipper"
case "xml":
return "fa-solid fa-file-xml"
case "iso":
return "fa-duotone fa-regular fa-compact-disc";
case "jar":
return "fa-solid fa-jar";
case "lz":
return "fa-solid fa-file-zipper"
case "lzma":
return "fa-solid fa-file-zipper"
case "lzo":
return "fa-solid fa-file-zipper"
case "pak":
return "fa-solid fa-file-zipper"
case "partimg":
return "fa-solid fa-file-zipper"
case "rar":
return "fa-solid fa-file-zipper"
case "s7z":
return "fa-solid fa-file-zipper"
case "tar":
return "fa-solid fa-file-zipper"
case "tbz2":
return "fa-solid fa-file-zipper"
case "tgz":
return "fa-solid fa-file-zipper"
case "tlz":
return "fa-solid fa-file-zipper"
case "txz":
return "fa-solid fa-file-zipper"
case "xz":
return "fa-solid fa-file-zipper"
case "zip":
return "fa-solid fa-file-zip";
case "doc":
return "fa-solid fa-file-doc";
case "docx":
return "fa-solid fa-file-doc";
case "odt":
return "fa-solid fa-file-lines";
case "rtf":
return "fa-solid fa-file-word";
case "csv":
return "fa-solid fa-file-csv";
case "ods":
return "fa-solid fa-file-spreadsheet";
case "xls":
return "fa-solid fa-file-xls";
case "xlsx":
return "fa-solid fa-file-xls";
case "odp":
return "fa-solid fa-file-powerpoint";
case "ppt":
return "fa-solid fa-file-ppt";
case "pptx":
return "fa-solid fa-file-powerpoint";
case "c":
return "fa-solid fa-file-binary";
case "class":
return "fa-solid fa-file-binary";
case "cpp":
return "fa-solid fa-file-binary";
case "cs":
return "fa-solid fa-file-binary";
case "h":
return "fa-solid fa-file-binary";
case "hpp":
return "fa-solid fa-file-binary";
case "hxx":
return "fa-solid fa-file-binary";
case "java":
return "fa-solid fa-file-binary";
case "py":
return "fa-solid fa-file-code";
case "sh":
return "fa-solid fa-file-code";
case "swift":
return "fa-solid fa-file-code";
case "vb":
return "fa-solid fa-file-code";
case "svg":
return "fa-solid fa-file-svg";
case "pem":
return "fa-solid fa-file-lock";
case "key":
return "fa-solid fa-file-lock";
case "eps":
return "fa-solid fa-file-eps";
case "cad":
return "fa-solid fa-file-cad";
default:
return "fa-solid fa-file"
}
}(s.cells[0].children[0].innerHTML), s.insertCell(0).innerHTML = 0 < c ? e(filetype) : "", s.cells[0].classList.add("col-auto"), s.cells[1].classList.add("col", "filename"), s.cells[2].classList.add("col-auto", "d-none", "d-md-table-cell"), s.cells[3].classList.add("col-auto", "d-none", "d-md-table-cell"), "image" == filetype && s.cells[1].children[0].setAttribute("data-lightbox", "roadtrip")
}

File diff suppressed because one or more lines are too long

View File

@@ -1,195 +0,0 @@
/*
@app thetvapp grabber
@author Aetherinox
@url https://github.com/Aetherinox/thetvapp-docker
https://hub.docker.com/repository/docker/aetherinox/thetvapp
Primary theme CSS
*/
body
{
background-color: #f8f9fa;
padding-bottom: 20px;
}
@media (prefers-color-scheme: dark)
{
body
{
background-color: #262626;
color: #fff;
}
}
.container nav
{
margin-left: -8px;
}
.container .about
{
padding-left: 8px;
padding-bottom: 40px;
font-size: 9.3pt;
}
.breadcrumb
{
background-color: transparent;
padding: 0rem 1rem;
}
.breadcrumb .breadcrumb-item a
{
color: #4caf50;
}
html
{
position: relative;
min-height: 100%;
}
.footer
{
position: absolute;
bottom: 0;
width: 100%;
margin-bottom: 0;
padding-bottom: 20px;
padding-top: 20px;
background-color: #151515;
}
.footer a,
.footer a:focus,
.footer a:hover
{
color: #FFFFFF;
}
.footer a
{
color: #f7296c;
}
.navbar
{
padding: 15px 1rem;
}
.header
{
background-color: #a82147;
color: #fff;
height: 55px;
}
.header .navbar-brand
{
padding: 0 8px;
font-size: 16px;
line-height: 24px;
height: 24px;
}
.header a
{
color: #FFF;
text-decoration: none;
padding-left: 7px;
}
#breadcrumbs::before
{
margin-top: 4px;
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512' fill='white' width='19px' height='19px'%3E%3Cdefs%3E%3Cstyle%3E.fa-secondary%7Bopacity:.4%7D%3C/style%3E%3C/defs%3E%3Cpath class='fa-primary' d='M160 384H512c35.3 0 64-28.7 64-64V160c0-35.3-28.7-64-64-64H394.5c-17 0-33.3-6.7-45.3-18.7L322.7 50.7c-12-12-28.3-18.7-45.3-18.7H160c-35.3 0-64 28.7-64 64V320c0 35.3 28.7 64 64 64z'%3E%3C/path%3E%3Cpath class='fa-secondary' d='M24 96c13.3 0 24 10.7 24 24V344c0 48.6 39.4 88 88 88H456c13.3 0 24 10.7 24 24s-10.7 24-24 24H136C60.9 480 0 419.1 0 344V120c0-13.3 10.7-24 24-24z'%3E%3C/path%3E%3C/svg%3E");
}
.breadcrumb-item.active
{
color: #6c757d;
padding-left: 10px;
}
.breadcrumb
{
padding-top: 30px;
}
#list a,
#list a:focus
{
color: #FFF !important;
}
#list a:hover
{
color: #ff275d !important;
}
#list colgroup
{
display: none;
}
#list .filename
{
word-break: break-all;
white-space: normal;
}
.table thead th a
{
color: #9b9b9b !important;
font-weight: normal;
}
.table td, .table th
{
padding: .75rem;
vertical-align: top;
border-top: 0px solid #dee2e6;
}
.table thead tr
{
border-bottom: 2px solid #575757;
background-color: #181818;
}
.table thead th
{
vertical-align: bottom;
border-bottom: 0px solid #575757;
}
.table-hover tbody tr:hover
{
background-color: rgba(155, 155, 155, 0.075);
}
.text-accent
{
font-weight: bold;
color: #d0c273;
}
code
{
font-size: 96%;
color: #ff4985;
word-break: break-word;
padding-right: 5px;
padding-left: 4px;
}
@media (prefers-color-scheme: dark)
{
#list a,
#list a:focus,
#list a:hover {
color: #fff;
}
}

View File

@@ -10,5 +10,5 @@
postrotate
s6-svc -1 /run/service/svc-nginx
endscript
su abc abc
su dockerx dockerx
}

View File

@@ -10,5 +10,5 @@
postrotate
s6-svc -t /run/service/svc-php-fpm
endscript
su abc abc
su dockerx dockerx
}

View File

@@ -1,9 +1,19 @@
───────────────────────────────────────────────────────────────
TheTvApp Docker Container
───────────────────────────────────────────────────────────────
This container automatically downloads the m3u8 and xml
guide data from
- https://github.com/dtankdempse/thetvapp-m3u
──────────────────────────────────────────────────────────────────────────────────────────
TVApp2 Docker Image
──────────────────────────────────────────────────────────────────────────────────────────
The TvApp2 image allows you to fetch m3u playlist and EPG data for numerous
IPTV services online.
Once the data is downloaded, you can access the files from
the container's webserver.
Once the files are fetched by the image, you can visit the self-hosted webpage,
copy the links to the m3u and EPG files; and add them to your favorite IPTV app
such as Jellyfin, Plex, or Emby.
For more information about this project; visit the links below:
TVApp2 Repo https://git.binaryninja.net/pub_projects/tvapp2
Base Alpine Image https://github.com/Aetherinox/docker-base-alpine
If you are making this container available on a public-facing domain,
please consider using Traefik and Authentik to protect this container from
outside access. Your M3U and EPG files will be available for the public to
download and use.

View File

@@ -4,34 +4,29 @@
PUID=${PUID:-911}
PGID=${PGID:-911}
if [[ -z ${AETHERX_READ_ONLY_FS} ]] && [[ -z ${AETHERX_NON_ROOT_USER} ]]; then
groupmod -o -g "$PGID" abc
usermod -o -u "$PUID" abc
if [[ -z ${TVAPP_READ_ONLY_FS} ]] && [[ -z ${TVAPP_NON_ROOT_USER} ]]; then
groupmod -o -g "$PGID" dockerx
usermod -o -u "$PUID" dockerx
fi
if { [[ -z ${AETHERX_READ_ONLY_FS} ]] && [[ -z ${AETHERX_NON_ROOT_USER} ]]; } || [[ ! ${LSIO_FIRST_PARTY} = "true" ]]; then
if { [[ -z ${TVAPP_READ_ONLY_FS} ]] && [[ -z ${TVAPP_NON_ROOT_USER} ]]; } || [[ ! ${TVAPP_FIRST_PARTY} = "true" ]]; then
cat /etc/s6-overlay/s6-rc.d/init-adduser/branding
else
cat /run/branding
fi
if [[ -z ${AETHERX_NON_ROOT_USER} ]]; then
echo "
User ID ........... $(id -u abc)
Group ID .......... $(id -g abc)"
if [[ -z ${TVAPP_NON_ROOT_USER} ]]; then
echo ""
echo " User:Group $(id -u dockerx):$(id -g dockerx)"
else
echo "
User ID ........... $(stat /run -c %u)
Group ID .......... $(stat /run -c %g)"
echo " User:Group $(stat /run -c %u):$(stat /run -c %g)"
fi
echo "
Port HTTP ......... $(echo $PORT_HTTP)
Port HTTPS ........ $(echo $PORT_HTTPS)"
echo " (Ports) HTTP/HTTPS $(echo $PORT_HTTP)"
echo ""
echo '──────────────────────────────────────────────────────────────────────────────────────────'
echo '───────────────────────────────────────────────────────────────'
if [[ -z ${AETHERX_READ_ONLY_FS} ]] && [[ -z ${AETHERX_NON_ROOT_USER} ]]; then
lsiown abc:abc /app
lsiown abc:abc /config
lsiown abc:abc /defaults
if [[ -z ${TVAPP_READ_ONLY_FS} ]] && [[ -z ${TVAPP_NON_ROOT_USER} ]]; then
aetherxown dockerx:dockerx /app
aetherxown dockerx:dockerx /config
aetherxown dockerx:dockerx /defaults
fi

View File

@@ -1,10 +1,10 @@
#!/usr/bin/with-contenv bash
# shellcheck shell=bash
for cron_user in abc root; do
if [[ -z ${AETHERX_READ_ONLY_FS} ]] && [[ -z ${AETHERX_NON_ROOT_USER} ]]; then
for cron_user in dockerx root; do
if [[ -z ${TVAPP_READ_ONLY_FS} ]] && [[ -z ${TVAPP_NON_ROOT_USER} ]]; then
if [[ -f "/etc/crontabs/${cron_user}" ]]; then
lsiown "${cron_user}":"${cron_user}" "/etc/crontabs/${cron_user}"
aetherxown "${cron_user}":"${cron_user}" "/etc/crontabs/${cron_user}"
crontab -u "${cron_user}" "/etc/crontabs/${cron_user}"
fi
fi
@@ -38,7 +38,8 @@ for cron_user in abc root; do
# set perms and import user crontabs
# #
lsiown "${cron_user}":"${cron_user}" "/config/crontabs/${cron_user}"
aetherxown "${cron_user}":"${cron_user}" "/config/crontabs/${cron_user}"
crontab -u "${cron_user}" "/config/crontabs/${cron_user}"
fi
done

View File

@@ -6,17 +6,17 @@ SCRIPTS_DIR="/custom-cont-init.d"
# Make sure custom init directory exists and has files in it
if [[ -e "${SCRIPTS_DIR}" ]] && [[ -n "$(/bin/ls -A ${SCRIPTS_DIR} 2>/dev/null)" ]]; then
echo -e " Loader : Custom files found, loading them ..."
echo -e " Loader : Plugins found, loading them ..."
for SCRIPT in "${SCRIPTS_DIR}"/*; do
NAME="$(basename "${SCRIPT}")"
if [[ -f "${SCRIPT}" ]]; then
echo -e " Loader : Executing ..."
/bin/bash "${SCRIPT}"
echo -e " Loader : ${NAME}: Exited $?"
echo -e " Loader : ${NAME}: Ran Successfully with code [$?]"
elif [[ ! -f "${SCRIPT}" ]]; then
echo -e " Loader : ${NAME}: Not a valid file"
fi
done
else
echo -e " Loader : No custom files found, skipping..."
echo -e " Loader : No Plugins found, skipping..."
fi

View File

@@ -2,13 +2,15 @@
# shellcheck shell=bash
# #
# @project thetvapp-docker
# @about Manages self-signed ssl certificates
# @file /root/etc/s6-overlay/s6-rc.d/init-keygen/run
# @repo https://github.com/Aetherinox/thetvapp-docker
# @project tvapp2
# @usage docker image which allows you to download a m3u playlist and EPG guide data for the
# IPTV service TheTvApp.
# @file nginx.conf.sample
# @repo https://github.com/Aetherinox/docker-base-alpine
# https://git.binaryninja.net/pub_projects/tvapp2
# #
SUBJECT="/C=NA/ST=NA/L=NA/O=thetvapp-docker/OU=Aetherinox TheTvApp/CN=*"
SUBJECT="/C=NA/ST=NA/L=NA/O=BinaryNinja/OU=TVApp2 Docker Image/CN=*"
if [[ -f /config/keys/cert.key && -f /config/keys/cert.crt ]]; then
echo -e " SSL : Using existing keys found in /config/keys"
else

View File

@@ -1 +1 @@
# This file doesn't do anything, it's just the end of the mod init process
# Empty placeholder for end of mod init process

View File

@@ -1,108 +1,2 @@
#!/usr/bin/with-contenv bash
# shellcheck shell=bash
# #
# precreate log files
# #
for file in /config/log/nginx/access.log /config/log/nginx/error.log; do
if [[ ! -f "${file}" ]]; then
touch "${file}"
fi
done
# #
# copy default config files if they don't exist
# #
if [[ ! -f /config/nginx/nginx.conf ]]; then
cp /defaults/nginx/nginx.conf.sample /config/nginx/nginx.conf
fi
if [[ ! -f /config/nginx/ssl.conf ]]; then
cp /defaults/nginx/ssl.conf.sample /config/nginx/ssl.conf
fi
if [[ ! -f /config/nginx/site-confs/default.conf ]]; then
cp /defaults/nginx/site-confs/default.conf.sample /config/nginx/site-confs/default.conf
fi
# #
# force nginx.conf to include site-confs/*.conf instead of site-confs/*
# #
sed -i -E "s#^(\s*)include /config/nginx/site-confs/\*;#\1include /config/nginx/site-confs/\*.conf;#" /config/nginx/nginx.conf
# #
# copy index.html if no index file exists
# #
INDEX_EXISTS=false
for file in /config/www/index.*; do
if [[ -e "${file}" ]]; then
INDEX_EXISTS=true
break
fi
done
THEME_EXISTS=false
for file in /config/www/theme/*; do
if [[ -e "${file}" ]]; then
THEME_EXISTS=true
break
fi
done
# dont add an index, we want fancy indexing
# if [[ ${INDEX_EXISTS} == false ]] && grep -Eq '^\s*index[^#]*index\.html' /config/nginx/**/*.conf; then
# cp /defaults/www/index.html /config/www/index.html
# fi
if [[ ${THEME_EXISTS} == false ]]; then
cp -r /defaults/www/theme /config/www/
fi
# #
# copy pre-generated dhparams or generate if needed
# #
if [[ ! -f /config/nginx/dhparams.pem ]]; then
cp /defaults/nginx/dhparams.pem /config/nginx/dhparams.pem
fi
if ! grep -q 'PARAMETERS' "/config/nginx/dhparams.pem"; then
curl -o /config/nginx/dhparams.pem -L "https://ssl-config.mozilla.org/ffdhe4096.txt"
fi
# #
# Set resolver, ignore ipv6 addresses
# #
touch /config/nginx/resolver.conf
if ! grep -q 'resolver' /config/nginx/resolver.conf; then
RESOLVERRAW=$(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf)
for i in ${RESOLVERRAW}; do
if [[ "$(awk -F ':' '{print NF-1}' <<<"${i}")" -le 2 ]]; then
RESOLVER="${RESOLVER} ${i}"
fi
done
if [[ -z "${RESOLVER}" ]]; then
RESOLVER="127.0.0.11"
fi
echo "[ Resolver ]: Setting to ${RESOLVER}"
RESOLVEROUTPUT="# This file is auto-generated only on first start, based on the container's /etc/resolv.conf file. Feel free to modify it as you wish.\n\nresolver ${RESOLVER} valid=30s;"
echo -e "${RESOLVEROUTPUT}" >/config/nginx/resolver.conf
fi
# #
# Set worker_processes
# #
touch /config/nginx/worker_processes.conf
if ! grep -q 'worker_processes' /config/nginx/worker_processes.conf; then
WORKER_PROCESSES=$(nproc)
echo "[ Worker ]: Setting worker_processes to ${WORKER_PROCESSES}"
echo -e "# This file is auto-generated only on first start, based on the cpu cores detected. Feel free to change it to any other number or to auto to let nginx handle it automatically.\n\nworker_processes ${WORKER_PROCESSES};" >/config/nginx/worker_processes.conf
fi

View File

@@ -2,17 +2,17 @@
# shellcheck shell=bash
# permissions
lsiown -R abc:abc \
aetherxown -R dockerx:dockerx \
/var/lib/nginx \
/var/tmp/nginx
lsiown -R abc:abc \
aetherxown -R dockerx:dockerx \
/config/keys \
/config/log \
/config/nginx \
/config/php
lsiown abc:abc \
aetherxown dockerx:dockerx \
/config/www
chmod -R g+w \

View File

@@ -2,27 +2,10 @@
# shellcheck shell=bash
# #
# @project thetvapp-docker
# @about Manages sample files such as nginx
# @file /root/etc/s6-overlay/s6-rc.d/init-samples/run
# @repo https://github.com/Aetherinox/thetvapp-docker
# @project tvapp2
# @usage docker image which allows you to download a m3u playlist and EPG guide data for the
# IPTV service TheTvApp.
# @file nginx.conf.sample
# @repo https://github.com/Aetherinox/docker-base-alpine
# https://git.binaryninja.net/pub_projects/tvapp2
# #
# remove old samples
find /config/nginx/ \
-name "*.conf.sample" \
-type f \
-delete
# copy new samples
find /defaults/nginx/ \
-maxdepth 3 \
-name "*.conf.sample" \
-type f \
-exec cp "{}" /config/nginx/ \;
find /defaults/nginx/site-confs/ \
-maxdepth 1 \
-name "*.conf.sample" \
-type f \
-exec cp "{}" /config/nginx/site-confs/ \;

View File

@@ -1,7 +1,7 @@
#!/usr/bin/with-contenv bash
# shellcheck shell=bash
if builtin command -v crontab >/dev/null 2>&1 && [[ -n "$(crontab -l -u abc 2>/dev/null || true)" || -n "$(crontab -l -u root 2>/dev/null || true)" ]]; then
if builtin command -v crontab >/dev/null 2>&1 && [[ -n "$(crontab -l -u dockerx 2>/dev/null || true)" || -n "$(crontab -l -u root 2>/dev/null || true)" ]]; then
if builtin command -v busybox >/dev/null 2>&1 && [[ $(busybox || true) =~ [[:space:]](crond)([,]|$) ]]; then
exec busybox crond -f -S -l 5
elif [[ -f /usr/bin/apt ]] && [[ -f /usr/sbin/cron ]]; then

View File

@@ -13,4 +13,4 @@ if pgrep -f "[n]ginx:" >/dev/null; then
sleep 1
fi
exec /usr/sbin/nginx
# exec /usr/sbin/nginx

View File

@@ -17,4 +17,4 @@ migrate() {
}
# rename default to default.conf
migrate "/config/nginx/site-confs/default" "/config/nginx/site-confs/default.conf"
# migrate "/config/nginx/site-confs/default" "/config/nginx/site-confs/default.conf"