From a4b23c5f5d32ab3a1d22f65197a46acc05d0c31a Mon Sep 17 00:00:00 2001 From: ubuntu Date: Mon, 3 Aug 2026 13:14:43 +0000 Subject: [PATCH] Commit initial du projet serverIPTV --- .gitignore | 17 + Dockerfile | 27 + docker-compose.yml | 37 + download_logo/download_logo.py | 60 + epg/download_epg.py | 21 + server.py | 1488 ++++++++++++++ static/IPTV.py | 1344 +++++++++++++ static/code.js | 584 ++++++ static/cog-wheel-silhouette.png | Bin 0 -> 7288 bytes static/cog-wheel.png | Bin 0 -> 19626 bytes static/index.html | 3255 +++++++++++++++++++++++++++++++ static/setup.sh | 73 + static/tv.png | Bin 0 -> 1127290 bytes 13 files changed, 6906 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 download_logo/download_logo.py create mode 100644 epg/download_epg.py create mode 100644 server.py create mode 100644 static/IPTV.py create mode 100644 static/code.js create mode 100644 static/cog-wheel-silhouette.png create mode 100644 static/cog-wheel.png create mode 100644 static/index.html create mode 100644 static/setup.sh create mode 100644 static/tv.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5379e3f --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +.DS_Store +__pycache__/ +*.pyc +.venv/ +venv/ + +# Contenu téléchargé / généré, pas du code source +playlists/ +playlists_download/ +logos/ +letsencrypt/ +epg/epg.xml +static/config_init.db +static/device_snapshots/ + +# Config locale spécifique à cette machine +.claude/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e54818e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM python +RUN apt-get update -y +ENV LANG C.UTF-8 +ENV LC_ALL C.UTF-8 + +RUN apt-get -y install python3-pip +RUN apt-get install --reinstall ca-certificates + +RUN pip3 install aiohttp +RUN pip3 install aiohttp-session +RUN pip3 install aiomcache +RUN pip3 install python-socketio +RUN pip3 install pyOpenSSL +RUN pip3 install tornado +RUN pip3 install aiohttp-cors +RUN pip3 install requests +RUN pip3 install pillow +RUN pip3 install pymongo +RUN pip3 install aiofiles +RUN pip3 install wikipedia-api +RUN pip3 install beautifulsoup4 + +EXPOSE 443 + +WORKDIR "/home" + +CMD ["python3", "server.py"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c137195 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,37 @@ +version: "3.8" + +services: + mongodb: + image: mongo:latest + container_name: mongodb + ports: + - "27017:27017" + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: example + volumes: + - mongodb_data:/data/db + networks: + - app-network + + python-app: + build: . + container_name: serverIPTV-container + depends_on: + - mongodb + environment: + - MONGO_URI=mongodb://root:example@mongodb:27017/?authSource=admin + networks: + - app-network + volumes: + - /etc/letsencrypt/:/home/letsencrypt/:rw + - /home/ubuntu/serverIPTV/:/home/:rw + ports: + - "5023:5023" + - "443:443" + +networks: + app-network: + +volumes: + mongodb_data: diff --git a/download_logo/download_logo.py b/download_logo/download_logo.py new file mode 100644 index 0000000..6e1d37f --- /dev/null +++ b/download_logo/download_logo.py @@ -0,0 +1,60 @@ + + +# Generic functions +def findInfo(tag, s): + end = '"' + if (s.find(tag)>-1): + t = s[s.find(tag)+len(tag)+2:s.rfind(end)] + return t[0:t.find(end)] + else: + return "" + + + + +def download_logo(): + + path_filename = 'source.m3u' + + # Process the m3u file + f = open(path_filename, "r", encoding="utf8") + Lines = f.readlines() + print('ouverture fichier', flush=True) + channel = {} + separator = '--------' + topic = '' + num_channel = 0 + for line in Lines: + #print(line,flush=True) + + if separator in line: + topic = line[10:] + topic = topic.replace(separator,'') + + if len(channel)>0 and line[0:4]=="http": + + print ('download ' + channel['urlLogo']) + #new_channels.append(channel) + #print(channel, flush=True) + + if line[0:4] == "#EXT": + channel = {} + + # DEFINE CHANNEL NAME + name_channel = line[line.rfind(',')+1:].strip('\n') + + channel_exist = False + if len(name_channel)>0: + channel = {"Name":name_channel, "Topic":topic, "urlLogo" : findInfo('tvg-logo', line)} + num_channel += 1 + channel_exist = True + + if channel_exist == False: + name_channel = line[line.rfind('|')+2:].strip('\n') + if len(name_channel) > 0: + channel = {"Name":name_channel, "Topic":topic, "urlLogo" : findInfo('tvg-logo', line)} + + + result = {'num_channel': num_channel} + + return result \ No newline at end of file diff --git a/epg/download_epg.py b/epg/download_epg.py new file mode 100644 index 0000000..704f3b1 --- /dev/null +++ b/epg/download_epg.py @@ -0,0 +1,21 @@ +import requests + +url = "http://xfvjwqjn.duperab.xyz/xmltv.php?username=VQNRZG7N&password=W3NFBDXY" + +headers = { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", + "Accept-Language": "en-US,en;q=0.9,fr;q=0.8,fr-FR;q=0.7", + "Cache-Control": "max-age=0", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0" +} + +response = requests.get(url, headers=headers, verify=False) + +if response.status_code == 200 and response.content: + with open("epg.xml", "wb") as f: + f.write(response.content) + print("Download successful: epg.xml") +else: + print(f"Failed to download. Status code: {response.status_code}, Content length: {len(response.content)}") diff --git a/server.py b/server.py new file mode 100644 index 0000000..813adab --- /dev/null +++ b/server.py @@ -0,0 +1,1488 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=W0613, C0116 +# type: ignore[union-attr] + +from pymongo import MongoClient +from aiohttp import web +import socketio +import os, glob +import time +import json +import ssl +import sys +import uuid +import logging +from aiohttp_session import setup, get_session, new_session +from aiohttp_session.cookie_storage import EncryptedCookieStorage +from tornado.template import Loader +from bson.json_util import dumps +from urllib.parse import unquote +import aiohttp_cors +import aiofiles +import urllib.parse +import requests +from PIL import Image +import io, re +import xml.etree.ElementTree as ET +from bs4 import BeautifulSoup +import pathlib +from datetime import datetime +from bson import ObjectId +import urllib.request + + + +from pymongo import MongoClient + + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s %(levelname)s %(message)s", + handlers=[logging.StreamHandler(sys.stdout)], +) +logger = logging.getLogger(__name__) + +# Connexion Database +MONGO_URI = os.getenv("MONGO_URI", "mongodb://root:example@mongodb:27017/?authSource=admin") + + +def connect_mongo(): + for attempt in range(1, 6): + try: + client = MongoClient(MONGO_URI, serverSelectionTimeoutMS=5000, connectTimeoutMS=5000) + client.admin.command("ping") + logger.info("Connected to MongoDB") + return client + except Exception as exc: # retry if Mongo is not ready yet + logger.warning("Mongo connection failed (attempt %s/5): %s", attempt, exc) + time.sleep(5) + raise RuntimeError("MongoDB is unreachable after retries") + + +client = connect_mongo() + +# Connect to the database and collection +db_iptv = client["db_iptv"] +channels = db_iptv['channels'] +channels.create_index("id_playlist") +playlists = db_iptv['playlists'] +logos = db_iptv['logos'] +recents = db_iptv['recents'] +settings_collection = db_iptv['settings'] + +devices_db = db_iptv['devices'] +devices = [] +active_xtream_imports = {} + +# Configure Socket IO +sio = socketio.AsyncServer(logger=True, engineio_logger=True, cors_allowed_origins='*') +app = web.Application() +sio.attach(app) + +# Variables +path = os.path.dirname(os.path.realpath(__file__))+'/' +ssl_cert_path = '/home/letsencrypt/live/iptv.mrk.ovh/cert.pem' +ssl_key_path = '/home/letsencrypt/live/iptv.mrk.ovh/privkey.pem' +UPLOAD_PLAYLIST_DIR = "playlists" +DOWNLOAD_EPG_DIR = "epg" +LOGO_DIR = "/home/logos" +M3U_LOGO_SOURCE = '/home/playlists_download/tv_channels_2a7e1ba958_plus.m3u' +URL_SERVER = 'https://iptv.mrk.ovh/' +DEVICE_SNAPSHOT_DIR = pathlib.Path(__file__).parent / 'static' / 'device_snapshots' +DEVICE_SNAPSHOT_DIR.mkdir(parents=True, exist_ok=True) + +# Set up Tornado template loader +loader = Loader('') + +# SSL context setup +ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) +ssl_context.load_cert_chain(certfile=ssl_cert_path, keyfile=ssl_key_path) + + +# Generic functions +def findInfo(tag, s): + end = '"' + if (s.find(tag)>-1): + t = s[s.find(tag)+len(tag)+2:s.rfind(end)] + return t[0:t.find(end)] + else: + return "" + +# Helper function to convert MongoDB documents to JSON-serializable format +def serialize_doc(doc): + doc["_id"] = str(doc["_id"]) # Convert ObjectId to string + return doc + +def clean_name_channel(name_channel): + new_name_channel = re.sub(r'\b\w{2}\b', '', name_channel) + new_name_channel = re.sub(r'\s+', ' ', new_name_channel).strip() + new_name_channel = new_name_channel.replace('- ','') + new_name_channel = new_name_channel.replace('| ','') + new_name_channel = new_name_channel.replace(' UHD','') + new_name_channel = new_name_channel.replace(' FHD','') + new_name_channel = new_name_channel.replace(' -','') + new_name_channel = new_name_channel.replace(' /','') + new_name_channel = new_name_channel.replace('','') + pattern = r".{2}\|" + new_name_channel = re.sub(pattern, "", new_name_channel) + new_name_channel = re.sub(r"[\(\{\[].*?[\)\}\]]", "", new_name_channel) + new_name_channel = new_name_channel.strip() + return new_name_channel + + +def get_playlist_collection(id_playlist): + return db_iptv['channels_' + id_playlist] + + +async def emit_analysis_progress(payload, sid_client=None): + if not sid_client: + return + data = {'typeCommand': 'progress_analysis', 'payload': payload} + await sio.emit('communication', data, room=sid_client, callback=messageReceived) + + +def get_existing_playlist(id_playlist): + return playlists.find_one({"id_playlist": id_playlist}) or {} + + +def find_existing_xtream_playlist(server_url, username, password): + return playlists.find_one({ + "playlist_type": "xtream_codes", + "xtream_server": normalize_xtream_server(server_url), + "xtream_username": (username or '').strip(), + "xtream_password": (password or '').strip(), + }) or {} + + +def build_playlist_document(id_playlist, title_playlist, date_end_playlist, selected_color, extra_fields=None): + existing_playlist = get_existing_playlist(id_playlist) + playlist_doc = { + 'id_playlist': id_playlist, + 'title_playlist': title_playlist, + 'date_end_playlist': date_end_playlist, + 'selectedColor': selected_color, + 'activation': existing_playlist.get('activation', 1), + } + if extra_fields: + playlist_doc.update(extra_fields) + return playlist_doc + + +def save_playlist_document(playlist_doc): + playlists.update_one( + {"id_playlist": playlist_doc["id_playlist"]}, + {"$set": playlist_doc}, + upsert=True + ) + + +def delete_playlist_resources(id_playlist): + db_iptv.drop_collection("channels_" + id_playlist) + + result = playlists.delete_one({"id_playlist": id_playlist}) + + file_path = os.path.join(UPLOAD_PLAYLIST_DIR, id_playlist + '.m3u') + if os.path.exists(file_path): + os.remove(file_path) + print(f"File {file_path} deleted.") + + return result.deleted_count + + +def bulk_insert_channels(collection_channels, new_channels, num_channel): + if not new_channels: + return + collection_channels.insert_many(new_channels) + print("Save channels ", num_channel, flush=True) + + +def normalize_xtream_server(server_url): + server_url = (server_url or '').strip() + if not server_url: + return '' + if not re.match(r'^https?://', server_url, re.IGNORECASE): + server_url = 'http://' + server_url + return server_url.rstrip('/') + + +def build_xtream_playlist_url(server_url, username, password): + base = normalize_xtream_server(server_url) + if not base or not username or not password: + return '' + return f"{base}/get.php?username={username}&password={password}&type=m3u_plus&output=ts" + + +def build_xtream_api_url(server_url, username, password, action, **extra_params): + base = normalize_xtream_server(server_url) + query = { + 'username': username, + 'password': password, + 'action': action, + } + query.update(extra_params) + return f"{base}/player_api.php?{urllib.parse.urlencode(query)}" + + +def fetch_xtream_json(server_url, username, password, action, **extra_params): + url = build_xtream_api_url(server_url, username, password, action, **extra_params) + response = requests.get(url, timeout=60) + response.raise_for_status() + return response.json() + + +def parse_xtream_category_map(items, id_key='category_id', name_key='category_name'): + category_map = {} + for item in items or []: + category_id = str(item.get(id_key, '')).strip() + if category_id: + category_map[category_id] = item.get(name_key, '') or '' + return category_map + + +def make_xtream_live_channel(id_playlist, item, category_map, username, password, server_url): + stream_id = item.get('stream_id') + if not stream_id: + return None + container_extension = item.get('container_extension') or 'ts' + return { + "id_playlist": id_playlist, + "id_channel": str(uuid.uuid4()), + "Name": item.get('name') or f"Live {stream_id}", + "Language": item.get('stream_type') or 'live', + "Topic": category_map.get(str(item.get('category_id', '')), ''), + "urlLogo": item.get('stream_icon', '') or '', + "url": f"{normalize_xtream_server(server_url)}/live/{username}/{password}/{stream_id}.{container_extension}", + "media_type": "live", + "stream_type": item.get('stream_type', 'live'), + "stream_id": stream_id, + "category_id": item.get('category_id'), + "epg_channel_id": item.get('epg_channel_id', ''), + } + + +def make_xtream_vod_channel(id_playlist, item, category_map, username, password, server_url): + stream_id = item.get('stream_id') + if not stream_id: + return None + container_extension = item.get('container_extension') or 'mp4' + return { + "id_playlist": id_playlist, + "id_channel": str(uuid.uuid4()), + "Name": item.get('name') or f"Movie {stream_id}", + "Language": item.get('stream_type') or 'movie', + "Topic": category_map.get(str(item.get('category_id', '')), ''), + "urlLogo": item.get('stream_icon', '') or item.get('cover', '') or '', + "url": f"{normalize_xtream_server(server_url)}/movie/{username}/{password}/{stream_id}.{container_extension}", + "media_type": "movie", + "stream_type": item.get('stream_type', 'movie'), + "stream_id": stream_id, + "category_id": item.get('category_id'), + "rating": item.get('rating', ''), + } + + +def flatten_xtream_episodes(episodes_payload): + episodes = [] + if isinstance(episodes_payload, dict): + for season_episodes in episodes_payload.values(): + if isinstance(season_episodes, list): + episodes.extend(season_episodes) + elif isinstance(episodes_payload, list): + episodes.extend(episodes_payload) + return episodes + + +def make_xtream_series_channels(id_playlist, series_item, series_info, category_map, username, password, server_url): + topic = category_map.get(str(series_item.get('category_id', '')), '') + series_name = series_item.get('name') or f"Series {series_item.get('series_id')}" + series_logo = series_item.get('cover') or series_item.get('cover_big') or series_item.get('stream_icon') or '' + channels_to_insert = [] + + for episode in flatten_xtream_episodes(series_info.get('episodes')): + episode_id = episode.get('id') or episode.get('episode_id') + if not episode_id: + continue + container_extension = episode.get('container_extension') or 'mp4' + episode_title = episode.get('title') or episode.get('name') or f"Episode {episode_id}" + episode_num = episode.get('episode_num') + season_num = episode.get('season') + episode_label = episode_title + try: + if season_num is not None and episode_num is not None: + episode_label = f"{series_name} - S{int(season_num):02d}E{int(episode_num):02d} - {episode_title}" + else: + episode_label = f"{series_name} - {episode_title}" + except (TypeError, ValueError): + episode_label = f"{series_name} - {episode_title}" + + channels_to_insert.append({ + "id_playlist": id_playlist, + "id_channel": str(uuid.uuid4()), + "Name": episode_label, + "Language": "series", + "Topic": topic, + "urlLogo": episode.get('info', {}).get('movie_image', '') or series_logo, + "url": f"{normalize_xtream_server(server_url)}/series/{username}/{password}/{episode_id}.{container_extension}", + "media_type": "series", + "stream_type": "series", + "series_id": series_item.get('series_id'), + "episode_id": episode_id, + "category_id": series_item.get('category_id'), + "series_name": series_name, + "season": season_num, + "episode_num": episode_num, + }) + + if channels_to_insert: + return channels_to_insert + + return [{ + "id_playlist": id_playlist, + "id_channel": str(uuid.uuid4()), + "Name": series_name, + "Language": "series", + "Topic": topic, + "urlLogo": series_logo, + "url": "", + "media_type": "series", + "stream_type": "series", + "series_id": series_item.get('series_id'), + "category_id": series_item.get('category_id'), + "series_name": series_name, + }] + + +def save_image_from_url(url, save_path): + try: + # Send a GET request to the URL + response = requests.get(url) + response.raise_for_status() # Raise an error for unsuccessful status codes + + # Write the content of the response to a file + with open(save_path, 'wb') as file: + file.write(response.content) + print(f"Image saved to {save_path}") + except requests.exceptions.RequestException as e: + print(f"Error downloading the image: {e}") + + +def load_epg_root(): + """ + Load EPG XML either from the URL stored in settings or from a local fallback file. + Returns an ElementTree root or None if nothing can be loaded. + """ + xml_content = None + + # Try remote URL first (if configured) + doc = settings_collection.find_one({'key': 'epg_url'}) + epg_url = doc.get('value') if doc else None + + if epg_url: + try: + resp = requests.get(epg_url, timeout=10) + if resp.status_code == 200 and resp.content: + xml_content = resp.content + except requests.RequestException as exc: + logger.warning("Unable to fetch remote EPG (%s): %s", epg_url, exc) + + # Fallback to local file + if xml_content is None: + local_path = os.path.join(DOWNLOAD_EPG_DIR, 'epg.xml') + if os.path.exists(local_path): + with open(local_path, 'rb') as f: + xml_content = f.read() + + if not xml_content: + return None + + try: + return ET.fromstring(xml_content) + except ET.ParseError as exc: + logger.error("Failed to parse EPG XML: %s", exc) + return None + + +# AIOHTTP functions + +# INDEX +async def index(request): + template = loader.load('static/index.html') + return web.Response(text=template.generate().decode('utf-8'), content_type='text/html') + +# Access to playlist file from the web +async def playlist_download(request): + data = dict(request.query) + file_path = '/home/playlists_download/'+data['filename'] + if os.path.exists(file_path): + return web.FileResponse(file_path) + else: + raise web.HTTPNotFound(text='File not found') + +async def init_db(request): + + db_iptv.drop_collection("channels") + db_iptv.drop_collection("playlists") + + return web.Response(text=str(res),content_type='text/html') + + + +async def analyse_m3u_file(request): + + NUM_MAX_CHANNEL = 300000 + data = await request.post() + id_playlist = data['id_playlist'] + title_playlist = data['title'] + url_playlist = data['url'] + date_end_playlist = data['date_end'] + filename = data['filename'] + sidClient = data['sidClient'] + selectedColor = data['selectedColor'] + playlist_comment = data.get('comment', '').strip() + + + new_path_filename = "./" + UPLOAD_PLAYLIST_DIR + '/' + id_playlist + '.m3u' + old_path_filename = "./" + UPLOAD_PLAYLIST_DIR + '/' +filename + os.rename(old_path_filename,new_path_filename) + + collection_channels = get_playlist_collection(id_playlist) + collection_channels.drop() + new_playlist = build_playlist_document( + id_playlist, + title_playlist, + date_end_playlist, + selectedColor, + { + 'playlist_type': 'm3u', + 'url_playlist': url_playlist, + 'comment': playlist_comment, + 'xtream_server': '', + 'xtream_username': '', + 'xtream_password': '', + } + ) + save_playlist_document(new_playlist) + + # Process the m3u file + + new_channels =[] + f = open(new_path_filename, "r", encoding="utf8") + Lines = f.readlines() + print('ouverture fichier', flush=True) + channel = {} + separator = '--------' + topic = '' + num_channel = 0 + TypeLangChannel = ['EN','FR','US','CA', 'UK' ] + + total_lines = len(Lines) + number_line = 0 + + for line in Lines: + + number_line += 1 + + if separator in line: + topic = line[10:] + topic = topic.replace(separator,'') + + # PROCESS URL LINE + if len(channel)>0 and line[0:4]=="http": + channel["url"] = line.strip('\n') + new_channels.append(channel) + #print(channel, flush=True) + if num_channel % 1000 == 0: + collection_channels.insert_many(new_channels) + new_channels = [] + print("Save channels ", num_channel, flush=True) + print('%d / %d' % (number_line, total_lines), flush=True) + await emit_analysis_progress({'percentage': number_line / total_lines}, sidClient) + + # PROCESS CHANNEL LINE + if line[0:4] == "#EXT": + channel = {} + + # ID CHANNEL + id_channel = str(uuid.uuid4()) + + # DEFINE LANGUAGE + LanguageChannel = next((lang for lang in TypeLangChannel if lang in line), '') + + # deternine url logo + url_logo = findInfo('tvg-logo', line) + + channel_exist = False + # case separator is | + name_channel = line[line.rfind(',')+1:].strip('\n') + if len(name_channel)>0: + channel = {"id_playlist":id_playlist, "id_channel":id_channel, "Name":name_channel, "Language":LanguageChannel, "Topic":topic, "urlLogo" : url_logo} + num_channel += 1 + channel_exist = True + + # case separator is , + if channel_exist == False: + name_channel = line[line.rfind('|')+2:].strip('\n') + if len(name_channel) > 0: + channel = {"id_playlist":id_playlist, "id_channel":id_channel, "Name":name_channel, "Language":LanguageChannel, "Topic":topic, "urlLogo" : url_logo} + channel_exist = True + num_channel += 1 + + + bulk_insert_channels(collection_channels, new_channels, num_channel) + print("Save final channels ", num_channel, flush=True) + number_channels = collection_channels.count_documents({"id_playlist":id_playlist}) + playlists.update_many({'id_playlist':id_playlist}, { "$set": { "num_channels": number_channels } } ) + result = {'num_channel': number_channels} + + return web.json_response(result) + + + + +async def analyse_m3u_file2(request): + + NUM_MAX_CHANNEL = 300000 + data = await request.post() + id_playlist = data['id_playlist'] + title_playlist = data['title'] + url_playlist = data['url'] + date_end_playlist = data['date_end'] + filename = data['filename'] + sidClient = data['sidClient'] + playlist_comment = data.get('comment', '').strip() + + + new_path_filename = "./" + UPLOAD_PLAYLIST_DIR + '/' + id_playlist + '.m3u' + old_path_filename = "./" + UPLOAD_PLAYLIST_DIR + '/' +filename + os.rename(old_path_filename,new_path_filename) + + collection_channels = get_playlist_collection(id_playlist) + collection_channels.drop() + new_playlist = build_playlist_document( + id_playlist, + title_playlist, + date_end_playlist, + '', + { + 'playlist_type': 'm3u', + 'url_playlist': url_playlist, + 'comment': playlist_comment, + 'xtream_server': '', + 'xtream_username': '', + 'xtream_password': '', + } + ) + save_playlist_document(new_playlist) + + # Process the m3u file + TypeLangChannel = ['EN','FR','US','CA', 'UK' ] + new_channels =[] + f = open(new_path_filename, "r", encoding="utf8") + Lines = f.readlines() + print('ouverture fichier', flush=True) + channel = {} + separator = '--------' + topic = '' + num_channel = 0 + + total_lines = len(Lines) + number_line = 0 + + for line in Lines: + + number_line += 1 + + if separator in line: + topic = line[10:] + topic = topic.replace(separator,'') + + if len(channel)>0 and line[0:4]=="http": + channel["url"] = line.strip('\n') + if len(LanguageChannel) > 0: + + new_channels.append(channel) + print(num_channel, flush=True) + if num_channel % 1000 == 0: + bulk_insert_channels(collection_channels, new_channels, num_channel) + new_channels = [] + print('%d / %d' % (number_line, total_lines), flush=True) + + + if line[0:4] == "#EXT": + channel = {} + + # DEFINE CHANNEL NAME + name_channel = line[line.rfind(',')+1:].strip('\n') + id_channel = str(uuid.uuid4()) + LanguageChannel ='' + for langChannel in TypeLangChannel: + if langChannel in line: + LanguageChannel = langChannel + + # deternine url logo + url_logo = findInfo('tvg-logo', line) + #if len(url_logo) == 0: + # cleaned_channel_name = clean_name_channel(name_channel) + # logo_data = logos.find({ 'logo_name': { '$regex': cleaned_channel_name, '$options': "i" } }) + # for l in logo_data: + # url_logo = l['logo_url'] + # break + + channel_exist = False + if len(name_channel)>0: + channel = {"id_playlist":id_playlist, "id_channel":id_channel, "Name":name_channel, "Language":LanguageChannel, "Topic":topic, "urlLogo" : url_logo} + num_channel += 1 + channel_exist = True + + if channel_exist == False: + name_channel = line[line.rfind('|')+2:].strip('\n') + if len(name_channel) > 0: + channel = {"id_playlist":id_playlist, "id_channel":id_channel, "Name":name_channel, "Language":LanguageChannel, "Topic":topic, "urlLogo" : url_logo} + + + bulk_insert_channels(collection_channels, new_channels, num_channel) + print("Save final channels ", num_channel, flush=True) + number_channels = collection_channels.count_documents({"id_playlist":id_playlist}) + playlists.update_many({'id_playlist':id_playlist}, { "$set": { "num_channels": number_channels } } ) + result = {'num_channel': number_channels} + + return web.json_response(result) + + + + +async def import_xtream_codes(request): + data = await request.post() + id_playlist = data.get('id_playlist', '').strip() + title_playlist = data['title'].strip() + date_end_playlist = data['date_end'] + selectedColor = data.get('selectedColor', '') + playlist_comment = data.get('comment', '').strip() + sidClient = data.get('sidClient', '') + xtream_server = normalize_xtream_server(data.get('xtream_server', '')) + xtream_username = data.get('xtream_username', '').strip() + xtream_password = data.get('xtream_password', '').strip() + + if not xtream_server or not xtream_username or not xtream_password: + return web.json_response({'error': 'Xtream server, username and password are required.'}, status=400) + + if not id_playlist: + existing_playlist = find_existing_xtream_playlist(xtream_server, xtream_username, xtream_password) + if existing_playlist: + id_playlist = existing_playlist['id_playlist'] + logger.info("Reusing existing Xtream playlist id=%s for %s", id_playlist, xtream_server) + else: + id_playlist = str(uuid.uuid4()) + + import_key = sidClient.strip() or id_playlist + if active_xtream_imports.get(import_key): + logger.warning("Xtream import already running for key=%s", import_key) + running_import = active_xtream_imports.get(import_key) or {} + return web.json_response({ + 'status': 'already_running', + 'message': 'An Xtream import is already running for this client. Please wait for it to finish.', + 'id_playlist': running_import.get('id_playlist', id_playlist), + }, status=202) + + active_xtream_imports[import_key] = { + 'id_playlist': id_playlist, + 'started_at': time.time(), + } + + collection_channels = get_playlist_collection(id_playlist) + collection_channels.drop() + + playlist_doc = build_playlist_document( + id_playlist, + title_playlist, + date_end_playlist, + selectedColor, + { + 'playlist_type': 'xtream_codes', + 'url_playlist': build_xtream_playlist_url(xtream_server, xtream_username, xtream_password), + 'comment': playlist_comment, + 'xtream_server': xtream_server, + 'xtream_username': xtream_username, + 'xtream_password': xtream_password, + } + ) + save_playlist_document(playlist_doc) + + try: + await emit_analysis_progress({'percentage': 0.02}, sidClient) + + live_categories = parse_xtream_category_map( + fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_live_categories') + ) + vod_categories = parse_xtream_category_map( + fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_vod_categories') + ) + series_categories = parse_xtream_category_map( + fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_series_categories') + ) + + live_streams = fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_live_streams') + vod_streams = fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_vod_streams') + series_list = fetch_xtream_json(xtream_server, xtream_username, xtream_password, 'get_series') + + total_steps = max(1, len(live_streams) + len(vod_streams) + len(series_list)) + processed_steps = 0 + pending_channels = [] + inserted_channels = 0 + + for item in live_streams: + channel = make_xtream_live_channel(id_playlist, item, live_categories, xtream_username, xtream_password, xtream_server) + if channel: + pending_channels.append(channel) + inserted_channels += 1 + processed_steps += 1 + if len(pending_channels) >= 1000: + bulk_insert_channels(collection_channels, pending_channels, inserted_channels) + pending_channels = [] + if processed_steps % 250 == 0: + await emit_analysis_progress({'percentage': processed_steps / total_steps}, sidClient) + + for item in vod_streams: + channel = make_xtream_vod_channel(id_playlist, item, vod_categories, xtream_username, xtream_password, xtream_server) + if channel: + pending_channels.append(channel) + inserted_channels += 1 + processed_steps += 1 + if len(pending_channels) >= 1000: + bulk_insert_channels(collection_channels, pending_channels, inserted_channels) + pending_channels = [] + if processed_steps % 250 == 0: + await emit_analysis_progress({'percentage': processed_steps / total_steps}, sidClient) + + for item in series_list: + series_channels = make_xtream_series_channels( + id_playlist, + item, + {}, + series_categories, + xtream_username, + xtream_password, + xtream_server + ) + pending_channels.extend(series_channels) + inserted_channels += len(series_channels) + processed_steps += 1 + if len(pending_channels) >= 1000: + bulk_insert_channels(collection_channels, pending_channels, inserted_channels) + pending_channels = [] + await emit_analysis_progress({'percentage': processed_steps / total_steps}, sidClient) + + bulk_insert_channels(collection_channels, pending_channels, inserted_channels) + number_channels = collection_channels.count_documents({"id_playlist": id_playlist}) + playlists.update_many({'id_playlist': id_playlist}, {"$set": {"num_channels": number_channels}}) + await emit_analysis_progress({'percentage': 1}, sidClient) + return web.json_response({'num_channel': number_channels, 'id_playlist': id_playlist}) + + except requests.RequestException as exc: + logger.exception("Xtream import failed") + return web.json_response({'error': f'Xtream request failed: {exc}'}, status=502) + except Exception as exc: + logger.exception("Xtream import failed") + return web.json_response({'error': f'Xtream import failed: {exc}'}, status=500) + finally: + active_xtream_imports.pop(import_key, None) + + +async def handle_upload(request): + reader = await request.multipart() + id_playlist = None + filename = None + filepath = None + + # Handle both form field and file in one pass + async for part in reader: + if part.name == "id_playlist_to_action": + id_playlist_data = await part.text() + if len(id_playlist_data) == 0: + print('No playlist to update', flush=True) + id_playlist = str(uuid.uuid4()) + else: + id_playlist = id_playlist_data + print('playlist to update :', id_playlist, flush=True) + + elif part.name == "file": + filename = part.filename + if not filename: + return web.Response(text="No file provided.", status=400) + + filepath = os.path.join(UPLOAD_PLAYLIST_DIR, filename) + + with open(filepath, "wb") as f: + while chunk := await part.read_chunk(): + f.write(chunk) + + if filepath: + return web.json_response({'status': 'ok', 'id_playlist': id_playlist}) + + return web.Response(text="No file field found in the request.", status=400) + + +async def upload_snapshot(request): + reader = await request.multipart() + id_device = None + file_bytes = bytearray() + + async for part in reader: + if part.name == 'id_device': + id_device = (await part.text()).strip() + elif part.name == 'file': + while True: + chunk = await part.read_chunk() + if not chunk: + break + file_bytes.extend(chunk) + + if not id_device or not file_bytes: + return web.json_response({'status': 'error', 'message': 'missing id_device or file'}, status=400) + + destination = DEVICE_SNAPSHOT_DIR / f'{id_device}.jpg' + with open(destination, 'wb') as output_file: + output_file.write(file_bytes) + + snapshot_relpath = f'/static/device_snapshots/{id_device}.jpg' + devices_db.update_one( + {'id_device': id_device}, + {'$set': {'snapshot_url': snapshot_relpath, 'snapshot_updated_at': time.time()}}, + upsert=True + ) + return web.json_response({'status': 'ok', 'snapshot_url': snapshot_relpath}) + + + +# COUNT CHANNELS +async def count_channels(request): + data = dict(request.query) + id_playlist = data['id_playlist'] + print('id_playlist : ', id_playlist, flush=True) + collection_channels = db_iptv['channels_'+id_playlist] + number_channels = collection_channels.count_documents({"id_playlist":id_playlist}) + print('number_channels : ', number_channels, flush=True) + return web.json_response({'number_channels': number_channels}) + + +# DELETE PLAYLIST +async def delete_playlist(request): + query_params = request.query + id_playlist = query_params.get("id_playlist") + nb_playlist_deleted = delete_playlist_resources(id_playlist) + + return web.json_response({ + 'nb_playlist_deleted': nb_playlist_deleted + }) + + +async def cleanup_xtream_duplicates(request): + duplicate_groups = {} + for playlist in playlists.find({"playlist_type": "xtream_codes"}): + xtream_server = normalize_xtream_server(playlist.get("xtream_server", "")) + xtream_username = (playlist.get("xtream_username", "") or "").strip() + xtream_password = (playlist.get("xtream_password", "") or "").strip() + if not xtream_server or not xtream_username or not xtream_password: + continue + duplicate_key = (xtream_server, xtream_username, xtream_password) + duplicate_groups.setdefault(duplicate_key, []).append(playlist) + + deleted_ids = [] + kept_ids = [] + + for playlists_group in duplicate_groups.values(): + if len(playlists_group) <= 1: + continue + + playlists_group.sort( + key=lambda playlist: ( + int(playlist.get("num_channels", 0) or 0), + int(playlist.get("activation", 0) or 0), + str(playlist.get("_id", "")), + ), + reverse=True, + ) + + kept_playlist = playlists_group[0] + kept_ids.append(kept_playlist["id_playlist"]) + + for duplicate_playlist in playlists_group[1:]: + duplicate_id = duplicate_playlist["id_playlist"] + if duplicate_id == kept_playlist["id_playlist"]: + continue + if delete_playlist_resources(duplicate_id): + deleted_ids.append(duplicate_id) + + return web.json_response({ + "status": "ok", + "deleted_count": len(deleted_ids), + "deleted_ids": deleted_ids, + "kept_ids": kept_ids, + }) + + +async def update_playlist_comment(request): + data = await request.post() + id_playlist = (data.get('id_playlist') or '').strip() + comment = (data.get('comment') or '').strip() + + if not id_playlist: + return web.json_response({'error': 'id_playlist is required'}, status=400) + + result = playlists.update_one( + {'id_playlist': id_playlist}, + {'$set': {'comment': comment}} + ) + + if result.matched_count == 0: + return web.json_response({'error': 'playlist not found'}, status=404) + + return web.json_response({'status': 'ok', 'id_playlist': id_playlist, 'comment': comment}) + + +# Get List Playlists +async def get_list_playlists(request): + active_count = playlists.count_documents({}) + #for p in playlists.find(): + #id_playlist = p['id_playlist'] + #number_channels = channels.count_documents({"id_playlist":id_playlist}) + #playlists.update_many({'id_playlist':id_playlist}, { "$set": { "num_channels": number_channels } } ) + #print("Document found:", p, flush=True) + #print("Number of channels:", number_channels, flush=True) + + print(str(active_count), flush=True) + if active_count == 0: + return web.json_response({'status':'no data'}) + else: + return web.json_response(dumps(playlists.find())) + + +async def get_source(request): + with open('static/IPTV.py') as f: + return web.Response(text=f.read(), content_type='text/plain') + + + +# List Channels +async def list_channel(request): + MAX_RECORDS = 30 + data = await request.post() + + channel_to_search = unquote(data['keyword']) + current_page = int(data['num_page']) + + logger.info("Search keyword='%s' page=%s", channel_to_search, current_page) + regex_pattern = ".*" + re.escape(channel_to_search) + ".*" + + # First pass: compute totals without pulling all docs into memory + total_records = 0 + active_playlists = list(playlists.find({"activation": 1})) + per_playlist_counts = [] + for playlist in active_playlists: + collection_channels = db_iptv['channels_' + playlist['id_playlist']] + count = collection_channels.count_documents({ + 'id_playlist': playlist['id_playlist'], + 'Name': {'$regex': regex_pattern, '$options': "i"} + }) + per_playlist_counts.append((playlist, count)) + total_records += count + + if total_records == 0: + return web.json_response({'num_total_page': 0, 'current_page': 1, 'data': []}) + + num_total_page = max(1, (total_records + MAX_RECORDS - 1) // MAX_RECORDS) + current_page = max(1, min(current_page, num_total_page)) + begin = (current_page - 1) * MAX_RECORDS + remaining = MAX_RECORDS + + # Second pass: fetch only the page slice + serialized_data = [] + offset = 0 + for playlist, count in per_playlist_counts: + if remaining == 0: + break + if offset + count <= begin: + offset += count + continue + + local_skip = max(0, begin - offset) + fetch_limit = min(remaining, count - local_skip) + collection_channels = db_iptv['channels_' + playlist['id_playlist']] + cursor = collection_channels.find({ + 'id_playlist': playlist['id_playlist'], + 'Name': {'$regex': regex_pattern, '$options': "i"} + }).skip(local_skip).limit(fetch_limit) + + serialized_data.extend(serialize_doc(doc) for doc in cursor) + remaining = MAX_RECORDS - len(serialized_data) + offset += count + + return web.json_response({'num_total_page': num_total_page, 'current_page': current_page, 'data': serialized_data}) + + + +def get_image_urls(keyword, max_results=10): + search_url = f"https://duckduckgo.com/?q={keyword}&iax=images&ia=images" + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" + } + + # Send the search request + response = requests.get(search_url, headers=headers) + soup = BeautifulSoup(response.text, 'html.parser') + + # Find image containers + image_urls = [] + for img in soup.find_all('img', {'class': 'tile--img__img'}): + src = img.get('src') + if src and src.startswith('http'): + image_urls.append(src) + if len(image_urls) >= max_results: + break + + return image_urls + +async def get_logo(request): + data = dict(request.query) + id_channel = data['id_channel'] + id_playlist = data['id_playlist'] + logo_channel_file_path = LOGO_DIR+'/'+id_channel+'.jpg' + collection_channels = db_iptv['channels_'+id_playlist] + d = collection_channels.find_one({ 'id_channel':id_channel}) + url_logo = d['urlLogo'] + name_channel = d['Name'] + cleaned_channel_name = clean_name_channel(name_channel) + + if not os.path.exists(logo_channel_file_path): + print(d['Name']+' :::: ' + id_channel + ' :::: ' + url_logo) + if len(url_logo) == 0: + print('Recherche url pour : ' + cleaned_channel_name, flush=True) + #words = cleaned_channel_name.split() + first_two_words = " ".join(cleaned_channel_name.split()[:3]) + regex_pattern = ".*" + ".*".join(first_two_words.split()) + ".*" + #regex_pattern = ".*" + ".*".join(words) + ".*" + l = logos.find_one({ 'logo_name': { '$regex': regex_pattern, '$options': "i" } }) + if l : + url_logo = l['logo_url'] + print('url trouvée : ' + url_logo, flush=True) + save_image_from_url(url_logo, logo_channel_file_path) + query = { 'id_channel':id_channel} + update = { "$set": { "urlLogo": url_logo } } + collection_channels.update_one(query, update) + else: + print('url identifiee et sauvegarde du fichier : ' + url_logo, flush=True) + if len(url_logo) > 0: + save_image_from_url(url_logo, logo_channel_file_path) + + image_data = None + if not os.path.exists(logo_channel_file_path): + with open(LOGO_DIR+'/none.jpg', "rb") as file: + image_data = file.read() + else: + with open(logo_channel_file_path, "rb") as file: + image_data = file.read() + print('image found '+logo_channel_file_path, flush=True) + + # Return the image as a response + return web.Response(body=image_data, content_type="image/jpeg") + + +async def proxy_image(request): + url = request.query.get("url") + if not url: + return web.Response(status=400, text="Missing URL") + + async with aiohttp.ClientSession() as session: + async with session.get(url) as resp: + if resp.status == 200: + headers = {"Content-Type": resp.headers["Content-Type"]} + return web.Response(body=await resp.read(), headers=headers) + else: + return web.Response(status=resp.status) + +async def list_logo(request): + result = logos.find({}).limit(1000) + search_string = "harry potter" + words = search_string.split() + regex_pattern = ".*" + ".*".join(words) + ".*" + logo_data = logos.find({ 'logo_name': { '$regex': regex_pattern, '$options': "i" } }) + html = '' + for r in logo_data: + html += '

' + r['logo_name'] + ' :::: ' + r['original_name'] + ' :::: ' + r['logo_url'] + return web.Response(text=html,content_type='text/html') + + +async def list_devices(request): + json_devices = json.dumps(devices) + #return web.json_response(json_devices) + return web.json_response(dumps(devices_db.find({}).limit(50))) + + +async def clean_recents(request): + recents.delete_many({}) + return web.json_response({'status':'ok'}) + + +async def get_recents(request): + # Step 1: Get the IDs of the 50 most recent documents + top_50 = list(recents.find({}, {"_id": 1}).sort("datetime", -1).limit(50)) + top_50_ids = [doc["_id"] for doc in top_50] + + # Step 2: Delete all documents that are NOT in the top 50 + result = recents.delete_many({ + "_id": {"$nin": top_50_ids} + }) + return web.json_response(dumps(recents.find({}).sort("datetime", -1))) + +async def most_recents(request): + pipeline = [ + { + "$sort": {"datetime": -1} + }, + { + "$limit": 50 + }, + { + "$group": { + "_id": "$id_channel", + "id_channel": {"$first": "$id_channel"}, + "id_playlist": {"$first": "$id_playlist"}, + "name": {"$first": "$name_channel"}, + "url": {"$first": "$url_channel"}, + "datetime": {"$first": "$datetime"}, + "count": {"$sum": 1} + } + }, + { + "$sort": {"count": -1, "datetime": -1, "name": 1} + } + ] + + # Run the aggregation + results = recents.aggregate(pipeline) + return web.json_response(dumps(results)) + +async def activation_playlist(request): + data = dict(request.query) + id_playlist = data['id_playlist'] + activation = int(data['activation']) + print('activation : ', activation, flush=True) + print(id_playlist,activation, flush=True ) + playlists.update_many({'id_playlist':id_playlist}, { "$set": { "activation": activation } } ) + return web.json_response({'id_playlist':id_playlist,'status':'ok'}) + + +async def delete_device(request): + data = dict(request.query) + id_device = data.get('id_device') # Use .get() to avoid KeyError + print(" ID device to delete : ",id_device,flush=True) + if not id_device: + return web.json_response({'error': 'id_device is required'}, status=400) + + result = devices_db.delete_many({"id_device": id_device}) + return web.json_response({'deleted_count': result.deleted_count}) + +async def delete_recent(request): + data = await request.post() + oid = data.get('oid') + + if not oid: + return web.json_response({'error': 'Missing oid'}, status=400) + + result = recents.delete_one({'_id': ObjectId(oid)}) + if result.deleted_count == 1: + return web.json_response({'status': 'success'}) + +async def get_epg_url(request): + doc = settings_collection.find_one({'key': 'epg_url'}) + epg_url = doc.get('value', '') if doc else '' + return web.json_response({'epg_url': epg_url}) + + +async def set_epg_url(request): + data = await request.post() + epg_url = data.get('epg_url', '').strip() + + if not epg_url: + return web.json_response({'error': 'epg_url is required'}, status=400) + + settings_collection.update_one( + {'key': 'epg_url'}, + {'$set': {'value': epg_url, 'updated_at': datetime.utcnow()}}, + upsert=True, + ) + return web.json_response({'status': 'ok', 'epg_url': epg_url}) + + +async def get_gemini_key(request): + doc = settings_collection.find_one({'key': 'gemini_key'}) + key = doc.get('value', '') if doc else '' + return web.json_response({'gemini_key': key}) + + +async def set_gemini_key(request): + data = await request.post() + key = data.get('gemini_key', '').strip() + if not key: + return web.json_response({'error': 'gemini_key is required'}, status=400) + settings_collection.update_one( + {'key': 'gemini_key'}, + {'$set': {'value': key, 'updated_at': datetime.utcnow()}}, + upsert=True, + ) + return web.json_response({'status': 'ok'}) + + +async def gemini_search(request): + data = await request.post() + query = data.get('query', '').strip() + if not query: + return web.json_response({'error': 'query is required'}, status=400) + + doc = settings_collection.find_one({'key': 'gemini_key'}) + api_key = doc.get('value', '') if doc else '' + if not api_key: + return web.json_response({'error': 'Gemini API key not configured. Go to Settings > Gemini API Key.'}, status=400) + + url = f'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={api_key}' + payload = { + 'contents': [{'parts': [{'text': query}]}], + 'tools': [{'google_search': {}}] + } + try: + resp = requests.post(url, json=payload, timeout=20) + resp.raise_for_status() + result = resp.json() + + answer = '' + sources = [] + candidates = result.get('candidates', []) + if candidates: + for part in candidates[0].get('content', {}).get('parts', []): + if 'text' in part: + answer += part['text'] + grounding = candidates[0].get('groundingMetadata', {}) + for chunk in grounding.get('groundingChunks', []): + web_info = chunk.get('web', {}) + if web_info.get('uri'): + sources.append({'uri': web_info['uri'], 'title': web_info.get('title', '')}) + + return web.json_response({'answer': answer, 'sources': sources}) + except requests.exceptions.HTTPError as e: + try: + err_msg = e.response.json().get('error', {}).get('message', str(e)) + except Exception: + err_msg = str(e) + return web.json_response({'error': err_msg}, status=502) + except Exception as e: + return web.json_response({'error': str(e)}, status=502) + + +async def channels_epg(request): + root = load_epg_root() + if root is None: + return web.json_response({'error': 'No EPG data available'}, status=503) + + channels_list = [] + for channel in root.findall('channel'): + channel_id = channel.attrib.get('id', '') + display_name = '' + name_node = channel.find('display-name') + if name_node is not None and name_node.text: + display_name = name_node.text + if display_name: + channels_list.append({'id': channel_id, 'name': display_name}) + + return web.json_response({'channels': channels_list}) + + +def parse_epg_datetime(raw_value: str) -> datetime: + ts = raw_value[:14] + return datetime.strptime(ts, "%Y%m%d%H%M%S") + + +async def epg_programs(request): + channel = request.query.get('channel') + if not channel: + return web.json_response({'error': 'channel is required'}, status=400) + + root = load_epg_root() + if root is None: + return web.json_response({'error': 'No EPG data available'}, status=503) + + programs = [] + for programme in root.findall('programme'): + if programme.attrib.get('channel') != channel: + continue + + start_raw = programme.attrib.get('start', '') + stop_raw = programme.attrib.get('stop', '') + title_node = programme.find('title') + desc_node = programme.find('desc') + + try: + start_dt = parse_epg_datetime(start_raw) + stop_dt = parse_epg_datetime(stop_raw) + except Exception: + continue + + programs.append({ + 'title': title_node.text if title_node is not None else 'No title', + 'desc': desc_node.text if desc_node is not None else '', + 'start': start_dt.isoformat(), + 'stop': stop_dt.isoformat() + }) + + programs.sort(key=lambda p: p['start']) + return web.json_response({'programs': programs}) + +async def download_epg(request): + data = dict(request.query) + url = data['url'] + filename = data['filename'] + filepath = os.path.join(DOWNLOAD_EPG_DIR, filename) + print('download file :', url, flush=True) + response = requests.get(url) + with open(filepath, 'wb') as f: + f.write(response.content) + return web.json_response({'status':'ok'}) + + +# Routage +BASE_DIR = pathlib.Path(__file__).parent +app.router.add_static('/static/', path=BASE_DIR / 'static', name='static') +app.router.add_static('/logos/', LOGO_DIR) +app.router.add_get('/', index) +app.router.add_get('/playlists', playlist_download) +app.router.add_get('/init_db', init_db) +app.router.add_get('/get_list_playlists', get_list_playlists) +app.router.add_post('/upload', handle_upload) +app.router.add_post('/upload_snapshot', upload_snapshot) +app.router.add_post('/analyse_m3u_file', analyse_m3u_file) +app.router.add_post('/import_xtream_codes', import_xtream_codes) +app.router.add_post('/update_playlist_comment', update_playlist_comment) +app.router.add_get('/delete_playlist', delete_playlist) +app.router.add_get('/cleanup_xtream_duplicates', cleanup_xtream_duplicates) +app.router.add_post('/list_channel', list_channel) +app.router.add_get('/get_logo', get_logo) +app.router.add_get('/list_logo', list_logo) +app.router.add_get('/list_devices', list_devices) +app.router.add_get('/recents', get_recents) +app.router.add_get('/clean_recents', clean_recents) +app.router.add_get('/activation_playlist', activation_playlist) +app.router.add_get('/delete_device', delete_device) +app.router.add_get('/count_channels', count_channels) +app.router.add_post('/delete_recent', delete_recent) +app.router.add_get('/get_source', get_source) +app.router.add_get('/most_recents', most_recents) +app.router.add_get('/epg_url', get_epg_url) +app.router.add_post('/epg_url', set_epg_url) +app.router.add_get('/gemini_key', get_gemini_key) +app.router.add_post('/gemini_key', set_gemini_key) +app.router.add_post('/gemini_search', gemini_search) +app.router.add_get('/channels_epg', channels_epg) +app.router.add_get('/epg', epg_programs) + +# SIO FUNCTIONS + +def messageReceived(): + print('messageReceived') + +@sio.event +def connect(sid, environ): + print("connect ", sid, flush=True) + + +@sio.event +async def communication(fromSid, data): + print("search request from ", fromSid, flush=True) + toSidDevice = data['toSidDevice'] + print("send signal to ", toSidDevice, flush=True) + await sio.emit('communication', data, room=toSidDevice ,callback=messageReceived) + + +@sio.event +def disconnect(sid): + print('disconnect ', sid, flush=True) + + +@sio.event +async def polling(sid, data): + global devices + device_name = data['name'] + IdDevice = data['IdDevice'] + mediaRunning = data['mediaRunning'] + device_last_datetime = time.time() + data_running = data['data_running'] + auto_snapshot_enabled = data.get('auto_snapshot_enabled', True) + snapshot_interval_seconds = data.get('snapshot_interval_seconds', 10) + print('polling from device :', IdDevice, flush=True) + print('data_running :', data_running, flush=True) + try: + vpn_status = data['vpn_status'] + except: + vpn_status = 'unknown' + device_data = devices_db.find_one({ 'id_device':IdDevice}) + if device_data: + query = { 'id_device':IdDevice} + update = { "$set": { "last_datetime": device_last_datetime ,"name": device_name, "sid":sid, "mediaRunning":mediaRunning, 'vpn_status':vpn_status, 'data_running':data_running, 'auto_snapshot_enabled': auto_snapshot_enabled, 'snapshot_interval_seconds': snapshot_interval_seconds} } + devices_db.update_one(query, update) + else: + new_device = { 'id_device': IdDevice, 'name' : device_name, 'last_datetime' : device_last_datetime, 'sid':sid ,'mediaRunning' : mediaRunning, 'vpn_status':vpn_status, 'data_running':data_running, 'auto_snapshot_enabled': auto_snapshot_enabled, 'snapshot_interval_seconds': snapshot_interval_seconds} + devices_db.insert_one(new_device) + + if data_running: + new_record = { + "id_device": IdDevice, + "id_channel": data_running['id_channel'], + "id_playlist": data_running['id_playlist'], + "datetime": datetime.utcnow(), + "name_channel": data_running['name_channel'], + "url_channel":data_running['url_channel'], + "progress": data_running['progress'], + "percentage": data_running['percentage'] + } + latest_recent_record = recents.find_one( + {"id_device": IdDevice}, + sort=[("datetime", -1)] + ) + if latest_recent_record: + same_channel = ( + latest_recent_record.get("id_channel") == data_running['id_channel'] + and latest_recent_record.get("id_playlist") == data_running['id_playlist'] + ) + if same_channel: + recents.find_one_and_replace( + {"_id": latest_recent_record["_id"]}, + new_record, + return_document=True + ) + else: + recents.insert_one(new_record) + else: + recents.insert_one(new_record) + + test_exist_device = False + for device in devices: + if device['IdDevice'] == IdDevice: + test_exist_device = True + device['last_datetime'] = device_last_datetime + device['name'] = device_name + device['sid'] = sid + device['mediaRunning'] = mediaRunning + try: + device['vpn_status'] = vpn_status + except: + device['vpn_status'] = 'unknown' + + if not test_exist_device: + new_device = { 'IdDevice': IdDevice, 'name' : device_name, 'last_datetime' : device_last_datetime, 'sid':sid ,'mediaRunning' : mediaRunning, 'vpn_status':vpn_status} + devices.append(new_device) + + + +# Main +if __name__ == '__main__': + logger.info('Starting server on port 443') + web.run_app(app, ssl_context=ssl_context, port=443) diff --git a/static/IPTV.py b/static/IPTV.py new file mode 100644 index 0000000..90ee051 --- /dev/null +++ b/static/IPTV.py @@ -0,0 +1,1344 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# pylint: disable=W0613, C0116 +# type: ignore[union-attr] + + +import logging +import vlc +import os +import re +import sys +import json +import queue +import psutil +import logging +import requests +import time +import threading +import tempfile +import socketio +import uuid +import subprocess +import tkinter as tk +from io import BytesIO +from wifi import Cell, Scheme +import sqlite3 as lite +from PIL import Image +from datetime import datetime +import urllib3 + +try: + from PIL import ImageTk + PIL_IMAGETK_AVAILABLE = True +except Exception: + ImageTk = None + PIL_IMAGETK_AVAILABLE = False + +sio = socketio.Client( + ssl_verify=False, + reconnection=True, + reconnection_attempts=0, + reconnection_delay=2, + reconnection_delay_max=15, +) +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + +class IdleScreenManager: + def __init__(self): + self.root = None + self.thread = None + self.command_queue = queue.Queue() + self.started = False + self.visible = False + self.enabled = True + self.clock_var = None + self.subtitle_var = None + self.footer_var = None + self.cards_frame = None + self.empty_var = None + self.empty_label = None + self.logo_refs = [] + + def start(self): + if self.started or not self.enabled or not idle_screen_supported(): + return + self.thread = threading.Thread(target=self._run, daemon=True) + self.thread.start() + self.started = True + + def show(self): + if not idle_screen_supported(): + return + self.start() + self.command_queue.put(("show", None)) + + def hide(self): + if not self.started: + return + self.command_queue.put(("hide", None)) + + def refresh(self): + if not self.started: + return + self.command_queue.put(("refresh", None)) + + def _run(self): + try: + self.root = tk.Tk() + self.root.configure(bg="#08111d") + self.root.title("IPTV Idle Screen") + self.root.attributes("-fullscreen", True) + self.root.attributes("-topmost", True) + self.root.bind("", lambda event: self.root.attributes("-fullscreen", False)) + + header = tk.Frame(self.root, bg="#08111d") + header.pack(fill="x", padx=60, pady=(45, 20)) + + title = tk.Label( + header, + text="Latest Channels", + fg="#f7fbff", + bg="#08111d", + font=("Helvetica", 34, "bold"), + anchor="w", + ) + title.pack(fill="x") + + self.subtitle_var = tk.StringVar(value="No channel running") + subtitle = tk.Label( + header, + textvariable=self.subtitle_var, + fg="#9ab4c8", + bg="#08111d", + font=("Helvetica", 18), + anchor="w", + ) + subtitle.pack(fill="x", pady=(8, 0)) + + self.clock_var = tk.StringVar(value="") + clock_label = tk.Label( + header, + textvariable=self.clock_var, + fg="#6ee7b7", + bg="#08111d", + font=("Helvetica", 18, "bold"), + anchor="e", + ) + clock_label.pack(fill="x", pady=(12, 0)) + + recent_frame = tk.Frame(self.root, bg="#0f1b2d", highlightbackground="#16324b", highlightthickness=1) + recent_frame.pack(fill="both", expand=True, padx=60, pady=(10, 20)) + + self.empty_var = tk.StringVar(value="Loading recent channels...") + self.empty_label = tk.Label( + recent_frame, + textvariable=self.empty_var, + fg="#f7fbff", + bg="#0f1b2d", + font=("Helvetica", 20), + justify="center", + anchor="center", + padx=28, + pady=28, + ) + self.empty_label.pack(fill="both", expand=True) + + self.cards_frame = tk.Frame(recent_frame, bg="#0f1b2d") + self.cards_frame.pack(fill="both", expand=True, padx=18, pady=18) + for column_index in range(IDLE_SCREEN_CARD_COLUMNS): + self.cards_frame.grid_columnconfigure(column_index, weight=1, uniform="idle_cards") + + self.footer_var = tk.StringVar(value="Waiting for a channel selection") + footer = tk.Label( + self.root, + textvariable=self.footer_var, + fg="#7b95aa", + bg="#08111d", + font=("Helvetica", 14), + anchor="w", + ) + footer.pack(fill="x", padx=60, pady=(0, 30)) + + self.root.withdraw() + self.root.after(250, self._process_commands) + self.root.after(1000, self._tick_clock) + self.root.after(IDLE_SCREEN_REFRESH_INTERVAL_MS, self._refresh_recent_data) + self.root.mainloop() + except Exception as exc: + print("Unable to start idle screen:", exc, flush=True) + self.enabled = False + + def _process_commands(self): + if self.root is None: + return + + while True: + try: + action, payload = self.command_queue.get_nowait() + except queue.Empty: + break + + if action == "show": + self.visible = True + self._render_recent_channels() + self.root.deiconify() + self.root.attributes("-fullscreen", True) + self.root.attributes("-topmost", True) + self.root.lift() + elif action == "hide": + self.visible = False + self.root.withdraw() + elif action == "refresh": + self._render_recent_channels() + + self.root.after(250, self._process_commands) + + def _tick_clock(self): + if self.root is None: + return + + self.clock_var.set(datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + self.root.after(1000, self._tick_clock) + + def _refresh_recent_data(self): + if self.root is None: + return + + if self.visible: + sync_recent_channels_from_server() + self._render_recent_channels() + + self.root.after(IDLE_SCREEN_REFRESH_INTERVAL_MS, self._refresh_recent_data) + + def _render_recent_channels(self): + items = recent[:MAX_RECENT_CHANNELS] + if self.cards_frame is None or self.empty_label is None: + return + + self.logo_refs = [] + for child in self.cards_frame.winfo_children(): + child.destroy() + + if not items: + self.empty_var.set("No recent channel history available.") + self.empty_label.lift() + self.footer_var.set("The screen will update when the server sends history or a channel is played locally.") + return + + self.empty_label.lower() + for index, item in enumerate(items, start=1): + card = tk.Frame( + self.cards_frame, + bg="#13253a", + highlightbackground="#21425f", + highlightthickness=1, + padx=18, + pady=18, + ) + row_index = (index - 1) // IDLE_SCREEN_CARD_COLUMNS + column_index = (index - 1) % IDLE_SCREEN_CARD_COLUMNS + card.grid(row=row_index, column=column_index, sticky="nsew", padx=12, pady=12) + + logo_image, logo_status = fetch_channel_logo_photo(item) + logo_label = tk.Label(card, bg="#13253a") + logo_label.pack(pady=(0, 16)) + if logo_image is not None: + logo_label.configure(image=logo_image) + self.logo_refs.append(logo_image) + else: + logo_label.configure( + text="No Logo", + fg="#9ab4c8", + font=("Helvetica", 16, "bold"), + ) + + name = item.get("name_channel") or item.get("name") or "Unknown channel" + name_label = tk.Label( + card, + text=name, + fg="#f7fbff", + bg="#13253a", + font=("Helvetica", 18, "bold"), + wraplength=240, + justify="center", + ) + name_label.pack(fill="x") + + last_played_at = format_recent_timestamp(item.get("last_played_at")) + meta_label = tk.Label( + card, + text=f"Last played: {last_played_at}", + fg="#89a5ba", + bg="#13253a", + font=("Helvetica", 13), + justify="center", + ) + meta_label.pack(fill="x", pady=(10, 0)) + + self.footer_var.set(f"Showing {len(items)} recent channels cached locally and refreshed from the server") + + +def idle_screen_supported(): + if sys.platform.startswith("linux"): + return bool(os.environ.get("DISPLAY", "").strip()) + return True + + +def format_recent_timestamp(timestamp_value): + if not timestamp_value: + return "-" + + normalized_value = str(timestamp_value).replace("Z", "+00:00") + for parser in (datetime.fromisoformat,): + try: + return parser(normalized_value).strftime("%Y-%m-%d %H:%M") + except ValueError: + pass + + for pattern in ("%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S"): + try: + return datetime.strptime(str(timestamp_value), pattern).strftime("%Y-%m-%d %H:%M") + except ValueError: + pass + + return str(timestamp_value) + + +def build_logo_urls(item): + id_channel = item.get("id_channel", "").strip() + if not id_channel: + return [] + + return [url_update_server + f"logos/{id_channel}.jpg"] + + +def create_placeholder_logo(): + return Image.new("RGB", IDLE_SCREEN_LOGO_SIZE, color="#20364d") + + +def fetch_channel_logo_photo(item): + if not server_connection_ready: + return None, "Logo skipped: server connection not ready" + + if not PIL_IMAGETK_AVAILABLE: + return None, "Logo skipped: PIL ImageTk unavailable" + + cache_key = f"{item.get('id_channel', '')}:{item.get('id_playlist', '')}" + cached_logo = logo_cache.get(cache_key) + if cached_logo is not None: + return cached_logo, "Logo loaded from cache" + + image_obj = None + last_error = "Logo fetch failed" + for logo_url in build_logo_urls(item): + try: + response = requests.get(logo_url, timeout=LOGO_REQUEST_TIMEOUT_SECONDS, verify=False) + if not response.ok: + last_error = f"HTTP error {response.status_code}" + continue + + image_obj = Image.open(BytesIO(response.content)).convert("RGB") + last_error = f"HTTP {response.status_code}, {len(response.content)} bytes" + break + except Exception as exc: + last_error = f"Request/decode error: {exc}" + image_obj = None + + if image_obj is None: + return None, last_error + + image_obj.thumbnail(IDLE_SCREEN_LOGO_SIZE, IMAGE_RESAMPLING_LANCZOS) + background = Image.new("RGB", IDLE_SCREEN_LOGO_SIZE, color="#0c1827") + offset_x = max((IDLE_SCREEN_LOGO_SIZE[0] - image_obj.width) // 2, 0) + offset_y = max((IDLE_SCREEN_LOGO_SIZE[1] - image_obj.height) // 2, 0) + background.paste(image_obj, (offset_x, offset_y)) + + try: + photo_image = ImageTk.PhotoImage(background) + except Exception as exc: + print("Unable to create Tk logo image:", exc, flush=True) + return None, f"Tk image creation failed: {exc}" + + logo_cache[cache_key] = photo_image + return photo_image, last_error + + +def normalize_recent_channel(item): + return { + "id_channel": str(item.get("id_channel") or item.get("_id") or ""), + "id_playlist": str(item.get("id_playlist") or ""), + "name_channel": str(item.get("name_channel") or item.get("name") or "Unknown channel"), + "url_channel": str(item.get("url_channel") or item.get("url") or ""), + "last_played_at": str(item.get("last_played_at") or item.get("datetime") or datetime.now().isoformat(timespec="seconds")), + } + + +def load_recent_channels_from_db(): + global recent + + with db_lock: + cur_ = con.cursor() + cur_.execute( + """ + SELECT id_channel, id_playlist, name_channel, url_channel, last_played_at + FROM recent_channels_cache + ORDER BY position ASC + """ + ) + rows = cur_.fetchall() + + recent = [ + { + "id_channel": str(row[0] or ""), + "id_playlist": str(row[1] or ""), + "name_channel": str(row[2] or ""), + "url_channel": str(row[3] or ""), + "last_played_at": str(row[4] or ""), + } + for row in rows + ] + return recent + + +def save_recent_channels_to_db(items): + global recent + + normalized_items = [normalize_recent_channel(item) for item in items[:MAX_RECENT_CHANNELS]] + + with db_lock: + cur_ = con.cursor() + cur_.execute("DELETE FROM recent_channels_cache") + for position, item in enumerate(normalized_items): + cur_.execute( + """ + INSERT INTO recent_channels_cache ( + position, id_channel, id_playlist, name_channel, url_channel, last_played_at + ) VALUES (?, ?, ?, ?, ?, ?) + """, + ( + position, + item["id_channel"], + item["id_playlist"], + item["name_channel"], + item["url_channel"], + item["last_played_at"], + ), + ) + con.commit() + + recent = normalized_items + idle_screen_manager.refresh() + return normalized_items + + +def prepend_recent_channel(id_channel, url_channel, name_channel, id_playlist): + current_items = load_recent_channels_from_db() + new_item = normalize_recent_channel( + { + "id_channel": id_channel, + "id_playlist": id_playlist, + "name_channel": name_channel, + "url_channel": url_channel, + "last_played_at": datetime.now().isoformat(timespec="seconds"), + } + ) + + filtered_items = [ + item for item in current_items + if not ( + item.get("id_channel") == new_item["id_channel"] + and item.get("url_channel") == new_item["url_channel"] + ) + ] + save_recent_channels_to_db([new_item] + filtered_items) + + +def parse_server_json_payload(response): + payload = response.json() + if isinstance(payload, str): + payload = json.loads(payload) + return payload + + +def sync_recent_channels_from_server(): + if not server_connection_ready: + return recent + + try: + response = requests.get( + url_update_server + "recents", + headers={"Cache-Control": "no-cache"}, + timeout=10, + verify=False, + ) + response.raise_for_status() + payload = parse_server_json_payload(response) + if not isinstance(payload, list): + return recent + + normalized_items = [normalize_recent_channel(item) for item in payload[:MAX_RECENT_CHANNELS]] + if normalized_items: + return save_recent_channels_to_db(normalized_items) + except Exception as exc: + print("Unable to refresh recent channels from server:", exc, flush=True) + + return recent + + +def focus_vlc_player(): + global media_principal + + idle_screen_manager.hide() + try: + media_principal.set_fullscreen(True) + except Exception as exc: + print("Unable to focus VLC player:", exc, flush=True) + + +def wait_for_vlc_playback_start(): + global media_principal + + deadline = time.time() + VLC_PLAYBACK_START_TIMEOUT_SECONDS + while time.time() < deadline: + try: + if media_principal.is_playing(): + focus_vlc_player() + return True + except Exception as exc: + print("Unable to determine VLC playback state:", exc, flush=True) + break + time.sleep(VLC_PLAYBACK_POLL_INTERVAL_SECONDS) + + print("VLC did not report playback start before timeout", flush=True) + return False + + +def start_playback_transition(): + threading.Thread(target=wait_for_vlc_playback_start, daemon=True).start() + + +def show_idle_screen(): + if mediaRunning == '': + idle_screen_manager.show() + + +def hide_idle_screen(): + idle_screen_manager.hide() + + +def pulse_audio_available(): + pulse_server = os.environ.get("PULSE_SERVER", "").strip() + if pulse_server: + return True + + runtime_dir = os.environ.get("XDG_RUNTIME_DIR", "").strip() + pulse_candidates = [] + if runtime_dir: + pulse_candidates.append(os.path.join(runtime_dir, "pulse", "native")) + + pulse_candidates.append(f"/run/user/{os.getuid()}/pulse/native") + return any(os.path.exists(candidate) for candidate in pulse_candidates) + + +def ensure_runtime_environment(): + runtime_dir = os.environ.get("XDG_RUNTIME_DIR", "").strip() + if not runtime_dir: + fallback_runtime = f"/tmp/iptv-runtime-{os.getuid()}" + os.makedirs(fallback_runtime, exist_ok=True) + os.environ["XDG_RUNTIME_DIR"] = fallback_runtime + + +def default_vlc_vout(): + forced_vout = os.environ.get("IPTV_VLC_VOUT", "").strip() + if forced_vout: + return forced_vout + + platform = sys.platform.lower() + if platform.startswith("linux"): + if os.environ.get("DISPLAY", "").strip(): + return "xcb_x11" + return "fb" + + return "" + +def build_vlc_instance(): + vlc_options = [ + "--intf=dummy", + "--fullscreen", + "--no-osd", + "--no-video-title-show", + "--no-snapshot-preview", + + # network/live buffering + "--network-caching=3000", + "--live-caching=3000", + "--file-caching=1000", + + # late-frame handling + "--drop-late-frames", + "--skip-frames", + + # reduce timing pressure on live streams + "--clock-jitter=0", + "--clock-synchro=0", + + # troubleshooting + "--verbose=2", + ] + + forced_aout = os.environ.get("IPTV_VLC_AOUT", "").strip() + if forced_aout: + vlc_options.append(f"--aout={forced_aout}") + elif not pulse_audio_available(): + vlc_options.append("--aout=alsa") + + forced_vout = os.environ.get("IPTV_VLC_VOUT", "").strip() + if forced_vout: + vlc_options.append(f"--vout={forced_vout}") + + return vlc.Instance(*vlc_options) + + +def new_media_player(url): + player = vlc_instance.media_player_new() + media = vlc_instance.media_new(url) + + media.add_option(":network-caching=3000") + media.add_option(":live-caching=3000") + media.add_option(":drop-late-frames") + media.add_option(":skip-frames") + media.add_option(":clock-jitter=0") + media.add_option(":clock-synchro=0") + + forced_vout = os.environ.get("IPTV_VLC_VOUT", "").strip() + if forced_vout: + media.add_option(f":vout={forced_vout}") + + player.set_media(media) + return player + + +def get_snapshot_filepath(): + return os.path.join(tempfile.gettempdir(), f"iptv_snapshot_{IdDevice}.jpg") + + +def upload_snapshot_file(snapshot_path): + if not os.path.exists(snapshot_path): + return False + + with open(snapshot_path, "rb") as snapshot_file: + response = requests.post( + url_update_server + 'upload_snapshot', + data={'id_device': IdDevice}, + files={'file': (os.path.basename(snapshot_path), snapshot_file, 'image/jpeg')}, + timeout=10, + verify=False + ) + response.raise_for_status() + return True + + +def capture_and_upload_snapshot(): + global media_principal + global data_running + + if not data_running: + return False + + snapshot_path = get_snapshot_filepath() + snapshot_status = media_principal.video_take_snapshot(0, snapshot_path, 0, 0) + if snapshot_status != 0: + print('snapshot capture failed', flush=True) + return False + + upload_snapshot_file(snapshot_path) + return True + + +def snapshot_loop(): + while True: + try: + if auto_snapshot_enabled and data_running: + capture_and_upload_snapshot() + except Exception as exc: + print('snapshot loop error', exc, flush=True) + time.sleep(SNAPSHOT_INTERVAL_SECONDS) + +def RepresentsInt(s): + try: + int(s) + return True + except ValueError: + return False + +def convertMillis(millis): + seconds=(millis/1000)%60 + minutes=(millis/(1000*60))%60 + hours=(millis/(1000*60*60))%24 + print(str(seconds)+" "+str(minutes)+" "+ str(hours)) + return seconds, minutes, hours + +def is_vpn_connected(): + try: + output = subprocess.check_output("ip a | grep tun0", shell=True) + return "tun0" in output.decode() + except subprocess.CalledProcessError: + return False + +def connect_vpn(): + global vpn_process + + if is_vpn_connected(): + return "VPN already connected" + + subprocess.call("sudo pkill openvpn", shell=True) + subprocess.call("sudo ip link delete tun0", shell=True) + + time.sleep(1) + vpn_process = subprocess.Popen( + ["sudo", "openvpn", "--config", vpn_config, "--auth-user-pass", auth_file], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True + ) + + # Wait for connection confirmation + for _ in range(30): + if is_vpn_connected(): + return "VPN connected" + time.sleep(1) + + return "VPN connection failed" + +def disconnect_vpn(): + global vpn_process + subprocess.call("sudo pkill openvpn", shell=True) + subprocess.call("sudo ip link delete tun0", shell=True) + vpn_process = None + return "VPN disconnected" + +def findInfo(tag, s): + end = '"' + if (s.find(tag)>-1): + t = s[s.find(tag)+len(tag)+2:s.rfind(end)] + return t[0:t.find(end)] + else: + return "" + + +def restart_process(): + try: + print('restart new process') + p = psutil.Process(os.getpid()) + for handler in p.get_open_files() + p.connections(): + os.close(handler.fd) + except Exception as e: + logging.error(e) + + python = sys.executable + os.execl(python, python, *sys.argv) + + +def restart_main_iptv_process(): + python = sys.executable + main_script = os.path.join(path, 'IPTV.py') + os.execl(python, python, main_script) + + +def stop(): + global media_principal + global mediaRunning + global data_running + data_running = {} + mediaRunning = '' + media_principal.stop() + sync_recent_channels_from_server() + show_idle_screen() + + +def display_overlay_message(message, duration_ms=10000): + global media_principal + + try: + media_principal.video_set_marquee_int(vlc.VideoMarqueeOption.Enable, 1) + media_principal.video_set_marquee_string(vlc.VideoMarqueeOption.Text, message) + media_principal.video_set_marquee_int(vlc.VideoMarqueeOption.Size, 42) + media_principal.video_set_marquee_int(vlc.VideoMarqueeOption.Timeout, duration_ms) + media_principal.video_set_marquee_int(vlc.VideoMarqueeOption.Position, 8) + except Exception as exc: + print('Unable to display overlay message:', exc, flush=True) + + +def playMedia(id_channel, url_channel, name_channel, id_playlist): + global media_principal + global mediaRunning + global recent + global data_running + + try: + media_principal.stop() + media_principal.release() + except Exception as e: + print("Unable to reset VLC player:", e, flush=True) + + media_principal = new_media_player(url_channel) + try: + media_principal.set_fullscreen(True) + except Exception as e: + print("Unable to enable fullscreen:", e, flush=True) + media_principal.audio_set_volume(200) + media_principal.play() + start_playback_transition() + mediaRunning = name_channel + data_running = {'name_channel':name_channel, 'id_channel':id_channel, 'id_playlist':id_playlist, 'url_channel': url_channel, 'progress':0} + prepend_recent_channel(id_channel, url_channel, name_channel, id_playlist) + print(' DATA : ', data_running, flush=True) + + media_principal.video_set_marquee_int(vlc.VideoMarqueeOption.Enable, 1) + media_principal.video_set_marquee_string(vlc.VideoMarqueeOption.Text, name_channel) + media_principal.video_set_marquee_int(vlc.VideoMarqueeOption.Size, 48) # Font size + media_principal.video_set_marquee_int(vlc.VideoMarqueeOption.Timeout, 7000) # Duration in milliseconds + media_principal.video_set_marquee_int(vlc.VideoMarqueeOption.Position, 8) # Position on screen + + +def update_source(): + global path + r = requests.get(url_update_server+'get_source', headers={'Cache-Control': 'no-cache'}, verify=False) + r.raise_for_status() + temp_path = path + 'IPTV.py.tmp' + try: + with open(temp_path, 'wb') as updated_file: + updated_file.write(r.content) + os.replace(temp_path, path + 'IPTV.py') + except Exception as exc: + print('error update_source', exc, flush=True) + if os.path.exists(temp_path): + os.remove(temp_path) + raise + + +def wait_for_internet_connection(): + while True: + print("Checking connexion ...", flush=True) + for check_url, verify_ssl in CONNECTIVITY_CHECK_TARGETS: + try: + requests.get(check_url, timeout=CONNECTIVITY_CHECK_TIMEOUT_SECONDS, verify=verify_ssl) + print(f"Connectivity check succeeded with {check_url}", flush=True) + return + except requests.RequestException as exc: + print(f"Connectivity check failed for {check_url}: {exc}", flush=True) + + time.sleep(CONNECTIVITY_CHECK_RETRY_SECONDS) + + +def ensure_socket_connection(force_reset=False): + global last_connect_attempt_ts + global server_connection_ready + + with socket_connect_lock: + if sio.connected and not force_reset: + server_connection_ready = True + return True + + now = time.time() + if not force_reset and (now - last_connect_attempt_ts) < SOCKET_RETRY_MIN_INTERVAL: + return sio.connected + + last_connect_attempt_ts = now + + try: + if force_reset: + try: + sio.disconnect() + except Exception: + pass + + wait_for_internet_connection() + print('Attempting socket connection...', flush=True) + sio.connect( + url_update_server, + wait=True, + wait_timeout=SOCKET_CONNECT_TIMEOUT, + transports=['websocket', 'polling'] + ) + print('Socket connection ready', flush=True) + server_connection_ready = True + return True + except Exception as exc: + print('Socket reconnection failed', exc, flush=True) + server_connection_ready = False + return False + + +def polling_server(): + global media_principal + global data_running + global status_vpn + print('polling_server') + while True: + try: + if not sio.connected: + ensure_socket_connection() + time.sleep(POLLING_INTERVAL_SECONDS) + continue + + #r = requests.get(url_update_server+'ping?name=hirondelle&', allow_redirects=True) + data_running_tmp = data_running + milli = media_principal.get_time() + percentage = media_principal.get_position()*100 + + if data_running: + print(data_running_tmp) + data_running = {'name_channel':data_running_tmp['name_channel'], 'id_channel':data_running_tmp['id_channel'], 'id_playlist':data_running_tmp['id_playlist'], 'url_channel':data_running_tmp['url_channel'], 'progress':milli, 'percentage':percentage} + sio.emit('polling', { + 'name': name_device, + 'IdDevice': IdDevice, + 'mediaRunning': mediaRunning, + 'vpn_status': is_vpn_connected(), + 'data_running': data_running, + 'auto_snapshot_enabled': auto_snapshot_enabled, + 'snapshot_interval_seconds': SNAPSHOT_INTERVAL_SECONDS + }) + except Exception as exc: + print('Polling failed, will reconnect', exc, flush=True) + ensure_socket_connection(force_reset=True) + time.sleep(POLLING_INTERVAL_SECONDS) + + + + +def sendMessage(fromSidDevice, toSidDevice, typeCommand, payload, num_packet): + new_data = {'fromSidDevice': fromSidDevice, 'toSidDevice': toSidDevice, 'typeCommand': typeCommand, 'payload': payload, 'packet':num_packet} + print(new_data) + if sio.connected or ensure_socket_connection(): + sio.emit('communication', new_data) + else: + print('Socket disconnected, unable to send message', flush=True) + + +@sio.event +def connect(): + global server_connection_ready + server_connection_ready = True + print('connection established') + + +@sio.event +def connect_error(data): + print('connection error', data, flush=True) + + +@sio.event +def communication(data): + + toSidDevice = data['toSidDevice'] + fromSidDevice = data['fromSidDevice'] + typeCommand = data['typeCommand'] + + global recent + global media_principal + global mediaRunning + global data_running + + # -------------------------------- + # OFF + # -------------------------------- + if typeCommand == "off": + stop() + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Off', 0) + sendMessage(toSidDevice, fromSidDevice, 'playing', 'no channel', 0) + + # -------------------------------- + # VPN MANAGEMENT + # -------------------------------- + if typeCommand == "vpn": + command_vpn = data['payload'] + if command_vpn == "connect": + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Start VPN Connexion', 0) + result = connect_vpn() + elif command_vpn == "status": + result = "connected" if is_vpn_connected() else "disconnected" + elif command_vpn == "disconnect": + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Start VPN Disconnexion', 0) + result = disconnect_vpn() + else: + result = "Unknown command" + sendMessage(toSidDevice, fromSidDevice, 'warning', result, 0) + + + + # -------------------------------- + # PLAY A CHANNEL ON + # -------------------------------- + if typeCommand == "on": + print ("switch on") + data_channel = data['payload'] + name_channel = data_channel['name'] + url_channel = data_channel['url'] + id_channel = data_channel['id_channel'] + id_playlist = data_channel['id_playlist'] + + print(id_channel, name_channel, url_channel, flush=True) + playMedia(id_channel, url_channel, name_channel, id_playlist) + sendMessage(toSidDevice, fromSidDevice, 'playing', name_channel, 0) + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Starting media', 0) + + + # -------------------------------- + # GET IP ADDRESS + # -------------------------------- + if typeCommand == "getIP": + my_IP = requests.get("https://api.ipify.org").text + sendMessage(toSidDevice, fromSidDevice, 'warning', 'IP : ' + my_IP, 0) + + # -------------------------------- + # GET CHANNEL RUNNING + # -------------------------------- + if typeCommand == "getChannelRunning": + new_data ={} + if mediaRunning == '': + mr = 'no channel' + percentage = 0 + milli = 0 + id_channel = '' + else: + mr = mediaRunning + percentage = media_principal.get_position()*100 + milli = media_principal.get_time() + id_channel = data_running['id_channel'] + + new_data = {'name': mr, 'percentage':percentage, 'millisec':milli, 'id_channel': id_channel} + sendMessage(toSidDevice, fromSidDevice, 'playing', new_data, 0) + + # -------------------------------- + # SET SUBTITLE + # -------------------------------- + if typeCommand == "subtitle": + track = data['payload'] + media_principal.video_set_spu(track) + sendMessage(data['toSidDevice'], data['fromSidDevice'], 'warning', 'Track Num ' + str(track), 0) + + # -------------------------------- + # RESUME + # -------------------------------- + if typeCommand == "resume": + media_principal.set_pause(0) + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Resume done', 0) + + # -------------------------------- + # PAUSE + # -------------------------------- + if typeCommand == "pause": + media_principal.set_pause(1) + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Pause done', 0) + + # -------------------------------- + # GET SOFTWARE VERSION + # -------------------------------- + if typeCommand == "version": + version_message = 'Version ' + str(num_version) + sendMessage(toSidDevice, fromSidDevice, 'warning', version_message, 0) + display_overlay_message(version_message, 10000) + + # -------------------------------- + # AUTO SNAPSHOT TOGGLE + # -------------------------------- + if typeCommand == "toggleAutoSnapshot": + global auto_snapshot_enabled + auto_snapshot_enabled = bool(data['payload']) + state_label = 'enabled' if auto_snapshot_enabled else 'disabled' + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Auto snapshot ' + state_label, 0) + + # -------------------------------- + # SNAPSHOT INTERVAL + # -------------------------------- + if typeCommand == "setSnapshotInterval": + global SNAPSHOT_INTERVAL_SECONDS + try: + interval_seconds = int(data['payload']) + except (TypeError, ValueError): + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Invalid snapshot interval', 0) + else: + if interval_seconds < 2: + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Snapshot interval must be at least 2 seconds', 0) + else: + SNAPSHOT_INTERVAL_SECONDS = interval_seconds + sendMessage( + toSidDevice, + fromSidDevice, + 'warning', + 'Snapshot interval set to ' + str(SNAPSHOT_INTERVAL_SECONDS) + ' seconds', + 0 + ) + + # -------------------------------- + # MOVETO + # -------------------------------- + if typeCommand == "moveto": + percentage = data['payload'] + new_position_value = float(percentage) / 100 + media_principal.set_position(new_position_value) + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Moved to ' + str(percentage), 0) + + # -------------------------------- + # UPDATE SOFTWARE + # -------------------------------- + if typeCommand == "update_source": + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Updating source and restarting client', 0) + time.sleep(1) + update_source() + restart_main_iptv_process() + + # -------------------------------- + # REBOOT + # -------------------------------- + if typeCommand == "reboot": + os.system('sudo reboot') + sendMessage(toSidDevice, fromSidDevice, 'warning', 'start rebooting ...', 0) + + + # -------------------------------- + # CHANGE DEVICE NAME AND REBUILD CONFIG FILE + # -------------------------------- + if typeCommand == "changeDeviceName": + global name_device + name_device = data['payload'] + print(name_device) + query = "UPDATE settings SET valueParameter = '" + name_device + "' WHERE nameParameter = 'deviceName'" + cur_ = con.cursor() + cur_.execute(query) + con.commit() + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Configuration saved', 0) + + # -------------------------------- + # GET LIST OF WIFI NETWORKS + # -------------------------------- + if typeCommand == "listSSID": + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Retreiving Wifi data', 0) + cells = Cell.all('wlan0') + resWifi = [] + for c in cells: + item = [] + item.append(c.ssid) + item.append(str(c.signal)) + item.append(str(c.quality)) + item.append(str(c.encrypted)) + resWifi.append(item) + sendMessage(toSidDevice, fromSidDevice, 'wifiupdate', resWifi, 0) + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Wifi data received', 0) + + # -------------------------------- + # TAKE SNAPSHOT + # -------------------------------- + if typeCommand == "takeSnapshot": + try: + print('take snapshot') + time.sleep(1) + capture_and_upload_snapshot() + except Exception as e: + sendMessage(toSidDevice, fromSidDevice, 'warning', e, 0) + + # -------------------------------- + # GET NUMBER OF CHANNELS + # -------------------------------- + if typeCommand == "numberOfChannels": + numberOfChannels = len(channels) + sendMessage(toSidDevice, fromSidDevice, 'warning', 'Number of channels : ' + str(numberOfChannels), 0) + + + # -------------------------------- + # Command line + # -------------------------------- + if typeCommand == "command_line": + records = re.split(r' ', data['payload']) + #result = subprocess.run(records, capture_output=True, text=True) + process = subprocess.Popen(records, stdout=subprocess.PIPE, text=True) + for line in process.stdout: + print(line, end="") + sendMessage(toSidDevice, fromSidDevice, 'display_command_result', line, 0) + + + #print(result.stdout) + + +@sio.event +def disconnect(): + global server_connection_ready + server_connection_ready = False + print('Disconnected from server', flush=True) + + + +# -------------------------------- +# INITIALIZATION DATABASE +# -------------------------------- +def initDB(): + global con + try: + con = lite.connect(path+db_file, check_same_thread=False) + cur = con.cursor() + cur.execute('SELECT SQLITE_VERSION()') + data = cur.fetchone() + print ("Connexion succeed : SQLite version: %s" % data) + cur.execute( + """ + CREATE TABLE IF NOT EXISTS recent_channels_cache ( + position INTEGER PRIMARY KEY, + id_channel TEXT, + id_playlist TEXT, + name_channel TEXT NOT NULL, + url_channel TEXT NOT NULL, + last_played_at TEXT NOT NULL + ) + """ + ) + con.commit() + + except (lite.Error, e): + print ("Error %s:" % e.args[0]) + sys.exit(1) + + +def initIPTV(): + global token_telegram + global name_device + global channels + global playlists + global con + global IdDevice + global recent + + # GET ID UNIQUE DEVICE OR CREATE IT + query = "SELECT valueParameter FROM settings WHERE nameParameter = 'IdDevice'" + cur_ = con.cursor() + cur_.execute(query) + record = cur_.fetchone() + if record: + IdDevice = record[0] + print(IdDevice) + else: + print("No ID device found") + IdDevice = str(uuid.uuid4()) + query = "INSERT INTO settings (nameParameter, valueParameter) VALUES ('IdDevice', '"+IdDevice+"')" + cur_ = con.cursor() + cur_.execute(query) + con.commit() + + + # GET DEVICE NAME + query = "SELECT valueParameter FROM settings WHERE nameParameter = 'deviceName'" + cur_ = con.cursor() + cur_.execute(query) + valueParameter = cur_.fetchone() + if valueParameter is not None: + name_device = valueParameter + print('Update device name : ' + str(name_device)) + + + # SAVE PID + query = "DELETE FROM settings WHERE nameParameter = 'pid'" + cur_ = con.cursor() + cur_.execute(query) + con.commit() + pid = os.getpid() + query = "INSERT INTO settings (nameParameter, valueParameter) VALUES ('pid', '"+str(pid)+"')" + cur_ = con.cursor() + cur_.execute(query) + con.commit() + + + +# ---------------------------------------------------------------- +# ---------------------------------------------------------------- +num_version='5.0.4' +# ---------------------------------------------------------------- +# ---------------------------------------------------------------- + + +# ---------------------------------------------------------------- +# VARIABLES GLOBAL +# ---------------------------------------------------------------- +url_update_server = 'https://iptv.mrk.ovh/' +#url_update_server = 'https://tv.mrk.ovh:5011/' +db_file = 'config.db' +path = os.path.dirname(os.path.realpath(__file__))+'/' +con = None +pid = os.getppid() +print('PID : ', pid) + +channels = [] +playlists = [] +IdDevice = "0" +NUM_MAX_CHANNEL = 500000 + +recent = [] +mediaRunning = '' +status_vpn = 'disconnected' +data_running = {} +auto_snapshot_enabled = True +SNAPSHOT_INTERVAL_SECONDS = 10 +POLLING_INTERVAL_SECONDS = 10 +SOCKET_CONNECT_TIMEOUT = 10 +SOCKET_RETRY_MIN_INTERVAL = 3 +CONNECTIVITY_CHECK_TIMEOUT_SECONDS = 3 +CONNECTIVITY_CHECK_RETRY_SECONDS = 2 +CONNECTIVITY_CHECK_TARGETS = [ + (url_update_server, False), + ("https://www.google.com/generate_204", True), + ("http://clients3.google.com/generate_204", False), +] +last_connect_attempt_ts = 0 +server_connection_ready = False +socket_connect_lock = threading.Lock() +db_lock = threading.Lock() +MAX_RECENT_CHANNELS = 12 +IDLE_SCREEN_REFRESH_INTERVAL_MS = 60000 +idle_screen_manager = IdleScreenManager() +VLC_PLAYBACK_START_TIMEOUT_SECONDS = 8 +VLC_PLAYBACK_POLL_INTERVAL_SECONDS = 0.2 +IDLE_SCREEN_CARD_COLUMNS = 3 +IDLE_SCREEN_LOGO_SIZE = (220, 124) +LOGO_REQUEST_TIMEOUT_SECONDS = 5 +logo_cache = {} +IMAGE_RESAMPLING_LANCZOS = getattr(getattr(Image, "Resampling", Image), "LANCZOS") + + +ensure_runtime_environment() +vlc_instance = build_vlc_instance() +media_principal = new_media_player("http://mag.hi-ott.com:80/120643/NS3MV8YZTS/51648") + +token_telegram = "token" +name_device = '' +vpn_process = None +vpn_config = "/home/pi/Documents/ca1629.nordvpn.com.tcp.ovpn" +auth_file = "/home/pi/Documents/auth.txt" + + +# ---------------------------------------------------------------- +# ---------------------------------------------------------------- + +logging.basicConfig( + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO +) +logger = logging.getLogger(__name__) + +# ---------------------------------------------------------------- +# LOOP PRINCIPAL +# ---------------------------------------------------------------- +if __name__ == '__main__': + + initDB() + initIPTV() + + wait_for_internet_connection() + load_recent_channels_from_db() + show_idle_screen() + + threading.Thread(target=snapshot_loop, daemon=True).start() + ensure_socket_connection(force_reset=True) + sync_recent_channels_from_server() + idle_screen_manager.refresh() + + polling_server() diff --git a/static/code.js b/static/code.js new file mode 100644 index 0000000..f9d0e97 --- /dev/null +++ b/static/code.js @@ -0,0 +1,584 @@ + + var quote = String.fromCharCode(39) + var list_playlist = [] + var result_search = [] + + + + var socket = io('https://iptv.mrk.ovh', { + secure: true, + rejectUnauthorized: false // Only for self-signed certificates + }); + + socket.on('connect', function() { + $('#sidClient').val(socket.id) + console.log("client connected sid = " + $('#sidClient').val()) + }); + + + socket.on('communication', function(data) { + console.log('communication', data) + // RECEPTION RETURN WARNING + if (data['typeCommand'] == 'warning') { + $('#warning').html(data['payload']) + $('#warning').show('slow') + setTimeout(() => { $('#warning').hide('slow') }, 5000); + } + }) + + + $(window).on('scroll resize', lazyLoad); + + // INITIALISAITON DES TABS + $('#tab_home').show() + update_list_playlist() + //get_search_channel() + $('#tab_search').hide() + $('#tab_playlist').hide() + $('#tab_devices').hide() + + + // CLICK TAB HOME + $('#display_tab_home').click(function(){ + var triggerTab = new bootstrap.Tab($('#display_tab_home')); + triggerTab.show(); + $('#tab_home').show() + $('#tab_search').hide() + $('#tab_playlist').hide() + $('#tab_devices').hide() + get_search_channel() + }) + + + // CLICK TAB PLAYLIST + $('#display_tab_playlist').click(function(){ + var triggerTab = new bootstrap.Tab($('#display_tab_playlist')); + triggerTab.show(); + $('#tab_home').hide() + $('#tab_search').hide() + $('#tab_playlist').show() + $('#tab_devices').hide() + }) + + // CLICK TAB DEVICES + $('#display_tab_devices').click(function(){ + var triggerTab = new bootstrap.Tab($('#display_tab_devices')); + triggerTab.show(); + $('#tab_home').hide() + $('#tab_search').hide() + $('#tab_playlist').hide() + $('#tab_devices').show() + + }) + + // CLICK TAB SEARCH + $('#display_tab_search').click(function(){ + var triggerTab = new bootstrap.Tab($('#display_tab_devices')); + triggerTab.show(); + $('#tab_home').hide() + $('#tab_search').show() + $('#tab_playlist').hide() + $('#tab_devices').hide() + + }) + + // UPDATE TAB DEVICES + updateListDevices() + setInterval(updateListDevices, 10000) + + + $('#btn_search').click(function(){ + get_search_channel($('#input_search').val()) + }) + + $('#btn_initdb').click(function(){ + $.get('init_db').done(function(data){ + window.location.href = "/" + }) + }) + + + function isInViewport(element) { + const rect = element[0].getBoundingClientRect(); + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && + rect.right <= (window.innerWidth || document.documentElement.clientWidth) + ); + } + + function lazyLoad() { + $('.lazy').each(function () { + const img = $(this); + if (isInViewport(img) && !img.hasClass('loaded')) { + img.attr('src', img.data('src')); // Load the image + img.on('load', function () { + img.addClass('loaded'); // Add loaded class for fade-in + }); + } + }); + } + + // DISPLAY CHANNELS + function displayResult() { + + $('#listChannels').show() + + if ($('#typeDisplay').val() == 'list') html = '

' + else html += '' + $('#listChannels').html(html) + + $('.btn_play_media').click(function(){ + var name = $(this).data('name_channel') + var url = $(this).data('url_channel') + console.log('play media', name, url) + socket.emit('communication', {fromSidDevice : $('#sidClient').val(), toSidDevice: $('#sidDevice').val(), typeCommand : "on", payload: {name:name, url:url}, "packet":0}); + }) + $('.btn_display_url').click(function() { + var url = $(this).data('display_url') + alert(url) + }) + + } + + // GET RESULT SEARCH + function get_search_channel() { + var keyword = $('#input_search').val() + if (keyword.length>0) { + $.post('list_channel', {keyword:encodeURIComponent(keyword)}).done(function(data){ + $('#list_channels').html('') + var html ='' + console.log(data) + result_search = JSON.parse(data) + displayResult() + lazyLoad(); + }) + } + } + + // UPDATE LIST PLAYLIST + function update_list_playlist() { + + $.get('get_list_playlists').done(function(data){ + console.log(data) + $('#list_playlist').html('') + var html = ' \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + ' + + + var dataJSON = JSON.parse(data) + //list_playlist = dataJSON + + for (var i=0;i\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + ` + + } + html += '
#TitleEnd DateNum channels
${i.toString()}${dataJSON[i].title_playlist}${dataJSON[i].date_end_playlist}${dataJSON[i].num_channels}
Delete
' + $('#list_playlist').html(html) + + + for (var i=0;i' + var media = ''+dataJSON[i].mediaRunning+'' + if (delta < 60) { + status = 'Online' + status2 = '#ebfaeb' + } + if (delta > 86400) { + status = 'Offline' + status2 = '#e6e6ff' + } + if ((delta > 60) && (delta <= 86400)) { + status = '' + Math.floor(delta / 60).toString() + ' min' + status2 = '#ffe6e6' + } + + html += `\ + ${i.toString()}\ + ${dataJSON[i].name}\ + ${status}\ + ${media}\ + \ + ` + + html2 += '
  • '+dataJSON[i].name+'
  • ' + + html3 += '
    \ +
    \ +

    \ +
    '+dataJSON[i].name+'
    \ +

    \ +

    '+status+'

    \ +

    '+media+'

    \ +
    \ +
    ' + } + html += ' ' + $('#listDevices').html(html) + //$('#list_device_home').html(html2) + //$('#zone_device_main').html(html3) + + function configure_current_device(element) { + const id_device = $(element).data('param1'); + const name_device = $(element).data('param2'); + const sid = $(element).data('param3'); + console.log(id_device, name_device) + $('#id_device').val(id_device) + $('#sidDevice').val(sid) + $('#btn_select_device').html(name_device) + } + + for (var i=0;iPlease select a file') + return; + } + + const formData = new FormData(); + formData.append("file", file); + + const xhr = new XMLHttpRequest(); + xhr.open("POST", "/upload", true); + + // Update progress bar + xhr.upload.onprogress = function (event) { + if (event.lengthComputable) { + const percentComplete = Math.round((event.loaded / event.total) * 100); + $("#progress-bar").val(percentComplete); + $("#progress-text").text(percentComplete + "%"); + } + }; + + xhr.onloadstart = function () { + $("#progress-container").show(); + }; + + xhr.onload = function () { + if (xhr.status === 200) { + $('#add_playlist_alert').html('') + var response =JSON.parse(xhr.response) + id_playlist = response['id_playlist'] + if (response.status == 'ok') { + + $.post('analyse_m3u_file', {'id_playlist':id_playlist, + 'title':$('#playlist_title').val(), + 'url':$('#playlist_url').val(), + 'date_end':$('#playlist_end_date').val(), + 'filename':$("#fileName").val()}).done(function(data){ + + var num_channel = data.num_channel + if (num_channel>0) { + $('#add_playlist_alert').html('') + } else { + $('#add_playlist_alert').html('') + } + update_list_playlist() + $('#modal_add_playlist').modal('hide') + + }) + } + + } else { + $('#add_playlist_alert').html('') + } + $("#progress-container").hide(); + }; + + xhr.onerror = function () { + alert("An error occurred while uploading."); + $("#progress-container").hide(); + }; + + xhr.send(formData); + } + + }); + + + $("#typeDisplay").change(function(){ + console.log($("#typeDisplay").val()) + displayResult() + }) + + $('#btn_display_player').click(function () { + if($('#player').css('display') == 'none'){ + $('#player').show('slow'); + $('#valRange').html='0' + $('#Range').val(0) + } else { + $('#player').hide('slow'); + } + }) + + $(".dropdown-submenu .dropdown-toggle").on("click", function (e) { + e.preventDefault(); // Prevent link from navigating + e.stopPropagation(); // Prevent closing the whole dropdown + + let $submenu = $(this).next(".dropdown-menu"); + + // Toggle the submenu visibility + $(".dropdown-submenu .dropdown-menu").not($submenu).removeClass("show"); // Close other submenus + $submenu.toggleClass("show"); + }); + + // Close submenus when clicking outside + $(document).on("click", function (e) { + if (!$(e.target).closest(".dropdown-submenu").length) { + $(".dropdown-submenu .dropdown-menu").removeClass("show"); + } + }); + + function off(){ + console.log('OFF ',$('#sidDevice').val(), $('#sidClient').val()) + socket.emit('communication', {fromSidDevice : $('#sidClient').val(), toSidDevice: $('#sidDevice').val(), typeCommand : "off", payload: 0, "packet":0}); + } + + + \ No newline at end of file diff --git a/static/cog-wheel-silhouette.png b/static/cog-wheel-silhouette.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbe82141a6a7952ee41c63db316138989f3079c GIT binary patch literal 7288 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 YS*e(mH6yWxfByIA=@@G_XgbCG2eL99IsgCw literal 0 HcmV?d00001 diff --git a/static/cog-wheel.png b/static/cog-wheel.png new file mode 100644 index 0000000000000000000000000000000000000000..d2367b2ecf0d1256aa742223d8fad626afc66516 GIT binary patch literal 19626 zcmce;_ghm<)GnM5iu5kMNEMNep`$+ZuAl-UT|gl8-h&{$2uN=#2ucmod!$O2j)W4L zNDn8fTTdrR*G8c$B>Sa?aQYu0er}s7?NJ^yFMXCS~k0HAmBonNI zkip!G=0|=(z7XXX1XBNVK^i0OU>B(W{QU*ai&4L$rdk}O&x?-Tsdk#8U%(M2#=d1zBV&(DL|v zrh;o$?0E@(L_UM^gafUMtvBB%WXKv+=X);?2%lu26w(tlx%CJbVx?Hjjz!zeC>1m{ zRp};g!8O_2SI*o}3#2sP$bCSntAE-2@XyqF9{($)h!%eHEkX6|8=(Az6r`>dLgiI5 zfq{3QOc82~W$1c;V-$b=*%fa=FuaBHn=Mf=7b7TY{o=-l_^&Z68Pew$4PF+Ez z>+=(pI*R=x-^0(tle##HVKP|j8WrK1?p%^rg>8NTO0)>4FoK}#1<`AM5R$d8~l zZ&lk`z&+XMRSpSvYS#bAySSOHAK=Z~Ca||l{Z)&Zwm~t)_0R^bq-dTn{K0B^-+;;Q zSWTXP$r~3Ut@^y6j{zVat#1(S)Qs82-G0PgSp5D|+{8B^mGpm8RVpaD@#Z%h49V&s zRXRhUG5LqcD1DFgZxD3)3}tw%zDMj&PeA!v4nes68p+^)^~^wF#*b*V9syvz+oJFe zU_XUk#uX~uneZ<~P>Sk5>Hg!ZuxO)KwDRzs{MCv7lWKbxk#6+L?($~2S9rt>+?}^d zm*P4Fe!r2}!)YNYUO+8cZF-slw7-Dkn><_GB8mt9g$kYkN+PTxwug9y6Cu-(&B)P< z)E7<`Dzou$w*1vNZwO*eNHm1_jRhNm+?V>{yTwVbnjoChZUI+{h!4=aH*+N-Lzkq+ z1kQHawx;H~_>FnZyGL7L*UjKU$tFJe6@D4UR);I$SwT4Di0`SYCksiQmRBO?KH6N4 z&J37Y@mNJ%2S=W-!E$#gMM=^4p!!}!y0O$o5GTSWsV7deV)4yxWoM(iKo0M(!o zj7T@@$@h7#PR}_$**!ZcW?51bZRd@v`x{lxJQL9pbKR}e#Giwjh)e{b7hgOHm8sjm zAhmxup4Ul+a=>}tPFe^!+Z4tr4qhn2NOWkw#q8Cnyli7#vqS2hTq9)g(FQEbO!*i> zPGsr*(O7+dtzGJ2|tbi}F`txn0x|4O%gu<6m;#?G}k5>|VHgV>*WF?FtY z-HB@wyN_0)r>@eF)EJ@uO~gi|-7K+UvO#tpYu*_TOWel8&Gr!a(~d?pGH1$NP(~i5 zs`1xj!EiH-Q1`NipyH=^Ou4a-^t+}zc=f7qWzraip9MYC7w1g&-~;{aEdtheE@3-Q zLkn-|2Wb~}mFi}IY$GNMP#ym(LvZzFxGv_zjRtDe7=cUt&uxX>%KtNtX`~99j$#7@ zCvq{unT;f+N|~RKLdCfo4}T#T%-(%`PQb%b5yP>a(t76&-;~|jNBTpd>gGAg>M|2> zR(qrvQFrSvO1X^daf1cLt{B9Qhbfn2OzG z3=b6mne#uh2l0_}^j94PS0!!_o}H#4t*oe&?Vj~EE>y1=L7%g6Y)w2^FTA>eJs5s` zOrV2;7~dGX9Kl#szW1OMp1*)~xA!rj$3gzn%A zH}^4da@k+C?_`h896Y!-^EZ;Dg`-fitc#P>j_c?^YyqB6EW{%+&#aIwd_IyV|7;}#NvbmGxlChS}c>zc}&d78leqajKfyQ z%*9SPNyKC=#T6gIVv;{|%m6ds$1&O#Mp5`(9+(9X@ppMR#Dm+p-i(X>BV9=|B4v+}4anJWro(|_F%_@({ms}9(>f-<-E?Xi zi~QKA7!Yhe$>Ud}N7$J; ztjcUv2gyo`3jbzL3~O$`l^0DZm7F}JUFbP-WC<71a(QO9i4V25VhvM!Amc^nIIoHJ zTy^b;uK9HRqAgs}jAj$Zhah%mhXy!laXFsc$|c?qDjm@>i;55Lv<)I!&oQVGec@1a zkQV*sdMT9mY=HY-W!Ps~j-ZtLee|u6IZK2}Br(sXVE9*-qjIY>?rPqB>4vQ-TatR; zRcOZ+=q6n6Z7zF?+!5tPVLviiyWrL<`m8@Ya1V%Xt)`G3-#enqa*|SVq%MKlca}Xiqfbje^Gp2~*;w3!f#i1lKHq`3UO}&&< zd!!y z!cq^fgHvR@PD65|LFh4t1Jz!lXKRX)>WSRGGXcDxAWZ~wg?-BDl-=7FNi9by#1or# z{Ajn)fWIOO2K6#ssjOxZO){gChb;5388$@r&+)`n7vyDovEzM=R$NF)*F&~@i%vpE zhmDhnbgp*2GBfIOuko$G_cIO`)IBt?EoW6uF71#`Ap?K#GfelyA=Z@9>tPN( zH)9Q*JN1@Z4iUo+cXrXhu@-t0*~{RT)mir$%emGC8N66ErSrO1W>`vh(Z6Mr2DRFF z?PIw@HF5tpgO=-kcls^2R7WK7;{d1LH%Aq8cXj3}Pd|&aEB&;*QKO^PfL6)dD>N&u;7|d{DaM+b6%oQhh6U&r~XGGg=EyZkIvV zmka3+MLNSGODu|s9wHkj8Uxo|Od0pmkWzCG7CDtphCXuae9R{Ue2B|Q#?T0n?DDkp zRkJ9;egVtk0Jk5F6UznWkCCEt-zWLkzv&!@+Zs94 z!HK~@z6@0KpGU=NOIP?#G3dp+8h(k=yT0!PYbXOth}ZRODv5#<=L`tXjjHe9_ivb% zzqdVrUhq_+*p>(J+^6hBAU5drgDqCa_Ptphh3W*d`vT_eEpVHIjlv0TSXY5Vz&=L~ zBnAAY8_)fbI`Yp)|2AXNVd4(*3fgQ^p$`vg4hFpdV*}6>kJQsg(P-4!qUwXpM>_BJ zVh{8%G^ZRye^(E+&;c;t@A}MXqPB>G6NtIK$>trrs0uv#(B&%nq4xDlc;bEtYx}96A7O{fVy8`-*s2>-uv?sl(7{ur5M`e{ zp?t80AxrFZ&EsZz!$&IN{TP=WU&@hiO`fps^S-Z_7OOmlq8e+cK69qr;1utM{_{Wn zWXzm75ZaUiN=N~+F%cypO~Mm<&A80Ao;9}~A9M287Te$=f1+{EK_S>JwRHS0JZAj? z1?oRktxJ&E8!FYeuihOb8uqKGs}{>9bvNp@-UB+%qoMcQK7iN-#>*2x(T{ik(irvU z5#Jmmc1gUySHM!05D`M7i25!Jw1Cb{*h(l=W`rF1^%r}L=3?UdbS`f|q|7@YLz>QE zyN5DIZZPe)<}oxX%A6HI9lQj`-$nlYCv2YBr9XYL3xfR{0K=kv=fsyV*pXUsiE^|X z%EtqEJVMbeKZP^Zc#Wv38nQszA}w3%8T@Sl++?df!9f#+$$A|zQ^T1Ums-&{y$($e z7=bt1Pih3IFHBE+2)&(^bb!L&26{*+Yk3V-bYu9hc!7=tH#475;4#j@Hdq5}PeA{l z7dOvy87emGli;i6`+y3GPR)XYW-McY;-4+d9=a5TvH{pv=V<^qa>(L;=$}{K8t$tO z*#<%X_0W&}csJ^+otgorlsI|P<%X>VK>ZBMfk+#i>-T1)Hh>|eEIS5(LuVBMWdG13 zhdrw^06@n)8}`Gvq>Tb~X$DlptAkaGnO_iF^queFef}ZOE?h&c-RS>A&ZFPgC~_G9 zJPtbCL(p{Qx+)`_UK6VppS<{Sz86M|&<8Z5y`cE?fdOyM# ztm^*(H?1TX?gqpw|G`*DKHLj01UiOR=-cF>OHe2~(9R<>hzWdIuL)$L1n9yLy0ka? zAIu^xMtY!CFf{NVlGkk-oYQ||>hAV7HhoKBp-GuApmoT1`F90_u^VqdI77)ZcU)yzG@=K=2jvMEMGha^^Z<&IIzv_BXu% zo%#OnA4JR7I)C&HjUL8o$_@J@9lWl)vit^Q5Pb;llkX2`^a|!Nq&k=Hm!WblQtkO2 zjWMsPrTF_u!8dklItOWpL#0y_|9MROQN)j+_)a;*Zv}rAcE=s=m1jsnU&CJ@?0a>7 z*GhFWjB7yHOY62xzkWmrT@HC$-K$@_`%W#)b3<~Y*>mfwrFmEaNqLW4%{50ie?!L_vFZ%hZVz-~32 zKvd9&?`xw=ykS@jL~4W|*L<2{WpyP@sr>RzM^-Jbxx z!tV23aEkUN^oDY~5m-yC690ZF{_R*PYAxhWics-V6Qk-#p1+gw#0V2+6wJ)bnH`&h zqHGGsQID0q3$vvc;P1POdq_0g-@tV{g%d}Hk1}fY=$)f#io#J3mPLoz6bYv;g<>r` zy@0|E>8ktjt*DDna$igJ!aLvNf0#77%RxK;n`mKP-kAZzSb)`(u8D4$%?0Wk^S)RD zjG7bZwV)(ReAkQ2Miz%wrPsOYSy6S&?p6O=Uz(IKZtV55VXP5w+i}(#o_CoDk!aLa zlj}sw+F_^tQgm+Y2Sc_S=WaJ5Vh#Jx0#FrtTpari5o}>+I_(7|c)#cT>ZARg3ocKxkZ3ie7V;Nob#a|j5H7QBpB{kr))C_Rv3m$Lc2%=$4{y6$IG^eO8?fbL8SKMtGKX>*pE(_ah(eU( zLY9PDPHXH^jjbHV%tIHudAtk#v3wn~8^jfQAFNmd9Y@LL%+5?I1QlDP61H%1RmYt^ zc;Il0c}Ze1^gvFLT%1xt&gE$sUS(@s6ZUozFd-%!m3`m;I*<<=9m~zjNJJ{Lu}3EQ zGj8a{Swf<%IT#$5#L=O+^V7oUk*C>{7hZon@#pMTFE$T0@1I{~=i^uKZyNCK>LWX9;PX71|xd zA1hYi8QLvNOYijP;yPYXTX{Y3w$eKw2II*UHF2k=x7f3k1TIc|Fxc|P=WLJSd=n_Cx7hD&XHg?JHyh|%sP=moAp>_Zu!UH_N=o3mnlwi z>%(f(Kv}ek*}bhxc|v@*?j>0~oa?<`s@ZQnP^jka5(URs`d<~i1IwHlBEe-}Qma1R zdGp<}c7-Lbm9Hj-iu>%2CmSZ}ecrUniNvrD+%I~)f;GxULFA7s(-1?!m-+HZ){^Yv zk?1v`hQRsUCbt`}aD$Jep+XdWOF0$-e_o2J(nE3&O^+Jm?a0e4k&f$~G?)UuhRV@P zN-Wb>_4z55YxTLBB~O@wX~~nFNg**oJked9CIUUt9RoHA1+9XpC|vw&A~eN><+)dp z5x6xH(?j&iZ2-NKM1_Mj-Shoq{99nQ}j2Cawb#8`{6sUE0<0ethob zzlXwBY=p|R9-kZD@3-AaHu5K)BU1RGGw5K8z6T34EF6G=`^SBmICST^HsWDmHi~L{_**#P9XoF9S z?D_6O32yI89v70g35j#j*(yv_Qei!302gyrk!&yMhhwJAT!OS9 z&Ifcw^hd>JPc7#da{Kc!!S*&o@b<4@o6R1(V*#A2V&za(;p4f4-~;twmIuojwF1go zIW1n0`ERvJRLE*77skA^`)z0V1Ejsac6;z!X-X_LU@Dn@nTKMte(Gx8(d{~OI{f;O zi&8)6c4v1f!ZlgH>2)KWqkz|SS`I}gsnw?JtN1Xb9Q~YWVndkUno*dO$4t)}mSN`G zIBDi?=-aTOYYM=v5GbY*00xj{p*~VdsDl;DrG^P#OA4V{1GuX`b z1v?im?W0Xku(PpFUU$81rz;!o^|JNmC0o{r1N2T)c!Oh)M+ zG7M4#2WlK7=r={?65dB1i0oQO9~!XAF#Cf#FJ-t)fJ1=P?hfo!X69%5f}G9UNN1u_ z^VI;cfk0!}(HDZHXg7|jiOFp0dRWEi8v>7N|uNX?dhr9$rHtu~JdaSBzbaI6K=RI;Ybn8OcfE4h3VbmF!` zOa0plvP0swLH>KKRaB4aDZBL(PCO+8uQF$RKo8v$+`_EB+6EgcT5!PMH@n*HfczP& z7$!N9%%x2h1fg3DnNzdBk@5N-i7K0rXZf>I_tp{LW2hdniT4VL`hd#zxci$%yY&6( zSz-cA1d;JCil61q-aVbi?nk61ZgLJ-xJ4T(^1_?3Q)yq2Ej0s~WPp0ig&ZK=wrOJF ziq!47dGa;1ydaBZ$$}rQoZm{!!&CG<%pr>F44FS6$mRT1Ry{T9AX-p~t(jJk<_*h7 zT@JWL-fD`?{Gvovp?n`dfp11E(^!jW@7ifanJNi#=L%1+f2b+Z-Yry+8Lk7wTem## zgnDV8xyNb54eXfKml!Fw$NdFWtTH4gfvc(#F*|o}X!UOB!;axYd8;qkMxK6?taeDB zt*te-+XgA_F(fl2&!Qe8FOocBz5NPoUtLl>F$dH&owvI69H>y3o)!GHs!_gIim9nf zNHk@`JSvgUA5(S=D0Qstc|IVOEf30pJkfK(?xloM`dWR^Bs<2KQ6k!n6b%(G34e*) zqyrJ-TaO-8QtNug?RWx_?!dL@{Q~rLsNBfoT@YW0dg(r>B9bFT_6Y~Fmg-RRub5bWexGN)aPsRb~`y$eydvdu#wyeYy60wr#tEq5l~gg)}L}3dr`R z_1<9j;@c>$7~J_0OpJ1OKmC~xm%~mab^~+%)Q2H-li({ydDLEw-RJnjkUx8D*`#jK zt7goL-Pgz(>>iic;Y@e6GK?Y5_gl5zVR@sGZJKCO6!?H-pL@}3zuUT53r#q|sB4@> zl=pTy8$!1U3f@M(vdO56gHJ!GP7^+-(r=|$mkKCUJ@bE)lzS z;7Ws_c4u@KbmzNNeBy1CzuMd_#F?VLxCQV6MB`l;pqp!=u$$jYJxNf3kf@ST&8o)l ziQ!TRN|ugz=)&E5)qMsWpx6>%N>xJg680Wl@g9vxXt&^$d`QsaJ%{HG>=-TBPxW$= zxc>6P*5!X?E1?<2o|XFdXw1THuEGth#@^>~4&cs7Ub9UYq`rYJL{M%eXlJ=?Epx-V zDUzLAEZpbSpgpDgqL1iJyx53>37ax;W2GD2Go;7)uh`tVF34+2#p&5rO$AN&zlfEi zy*L!$pME$pu_T48o_y^V29~Gc79=&o;qm_FQ-c+Yd*U`BG#BLGJ4t@>BT?TTS!c$~ zzI4i`6KYmWG~k%wyzMa$Uxe$_G(0>%F0FRA`Yd_tT=~W$L77OZ_j4V zB6Gfbihd*7D0-PSAH&K@$*$s|QJhKLscS?LPyw$TA2a`&7?nNu>wSkv>G4DCD`5`s z{bn3dp?sUAcbD_)5Li)@>3Ud|G^=P=L3a8?)W}bwt0L{w z4_}^z{=+4AyJJ3lu_iO(Gxf0_wN&`pS8T040mc;Vam3^=wW18WrBz509L!p{a}@D6 zGT!_0j2IX*v)L*H^?Q84xUN5YkU+-edZ&H8?aonkj~moQHH$JYR$!lEYV)v} z(=t)NNwd^#)hPNQeLg16lnIp^Mto67JrbE)(;XRwWzuSf!9z*|vT;mb#t{rVZR|0X zj+uXgSqgVBz5l8_D(kk4)AuK;vkf}7{IA)9n+dcDG6V8mB=#m@Ln3iZW!V@SUs=_j z6^-Yg8U=+~0ZIeMO`vy|4vfNGw&9c6zHetXM%tZ6e7s%t-q(skl0R03B+xUl)WHi* zWxJ|_($t|+%(w1kfc!vOsnHyLL2|{UrPM}srHJ;q@qN}r6~g&j4RR?|A z?I6t~*B#7%PdwaRppv|XYPBcL|pq1^{y1hxKGd8pahqp-d$?)`EkH7 zPCXkbb~a7I-1c`i-ef_O&v8L^!QgR6&>(W^6l_F+q7e`+W8ejheZVyHiU=W>+}&!%B#O8EV{v;P=i-#8IlbBo z;bM-tTpJhBy2lgjOelNohn2N|1)ne|`!tQRMZ4(U`1-R{!}dC4PD3Ti-zCDitQF2T zD!dOg^T!Fy7z-s|y?sHT*=CJx*Q{U%xFWwJ+FUT~yY!J%e&wGQuC&9%1E}Ji#SzSf zp05M}vQ~9Buqu3Bq90OLEoeBmhGlim)L!f;Pf4(u4KKOLG(A3hK3{`{k#xkkX(WT!kYx(yhq;P2He>< zRxWYdaZ2ES@}RHj>L{Gcmt&(YdVjafWlv2WX2*D%!H&rLouxkheq`o8|D|L85M>1` zMAtEm4u%K(>2$Bng757ajgyLHogU^+n{6sF^3AAYr&0A0lNQort42vEHNiHr z6Vi_llI419=}tqvLT)KA{fJ-%#U26FvOiA_3_uZZfcvGi&0tXZ74j>`p~emdd5{%Y ztzsUx%%|f6;u~zxKU{d%-aa#}8hrN1n*QZ zTwyRU4X6(p`)C&;@|5JGkAZA&ZGn-Zoe!|*?-cQ7@VD1vPyt8F`iCFVXD!I&sf*RN zL3N|fOsy?$Hpd42O}<_UI>mym3Vj=<=R-etHu`t$DtxEFZ}Qba!3)V8iMu~)J#KHs z8gm3uqI$G51;*4+bdG@(iqgRR`PRrJeUItuJuYd2_xbXm%Aj9D z1ubC&pr#q20tqB4f0fR3NdXSnTmjP;-<`UvA?WGb@zO939262OOH=d{+FN};j0M=Z zlb2VG4J?`R&OVzmc7Ct8(!MufMI+8tNVZ#F)ili6U3wod>LMmZr)3CGP5nhl`sDgS zw0m#^)6sqhvGA7@g76t1v`nlISdQC?wQ=7JL?9i~se0ESa+{f`MA9}w|AFbLaRUX#kJr(yobCUfc*IP<4$U5Zl&7YDc?!!YI1=S6|H&a&Mk zE_;k`v4WXpt1bSL0q(3v`fo`f9@jv4283O!&$X zt48wK95AJ(Ut7_Jx>@>t9<7pgrE#YYJ$1W-FnmK5w*&B@wg|kBN*Q`au+O$10@DdO z+FK2_h&m&B-xm-vvqQGoBhdM)3R$Y_76bF;(y-gZ^GqfL4YA4)DsLTlr)d4Z{~UDA)}mrWeF?> z2q@Y&m~Gv8Jn~UMr7wCJJ5!%KKGC`F+Ee=KAPE2&Hi|6u6a)7WmA3yp>ur2$5#@4l zZ(^|@Q|%B0M9t^=tX*<7nhR+2d{aW(NjjrcNTS+4Q|2D-{1zW0oJjy&`1xlrf+`1& zE5Fyo+Gr4N@T?uMz_w;tvClD+0I$)zbqyse2Dyn+CW@)N=%m75*6X|$&_+5(db4b| z>HMG|4vn=WI+wTls$JFFnQ{YrLscBp5fj#a>HLOjaK!>Qcy9crxsIVn9G#4Xa&!Eh z`?cZnE|g zF--1ZR0hNJ_#iS3J6kHnEA^DlNNZBv0+Nt46!lYB05qFcVk5SbU}@pPh!b=cfmC&M z5a}pU^!51e5b&QuIK zOo4DTaqZFBmKo_RGQ~qASnx$1L1a2LX`E`TXO6hWs$HR1$_v}`Hv;;!8 zfoD+$Uv-HHG;u9+Rzs`X$b|wzc{Gj9ekjKGxVcE22Xv;|EGh z!P-x2bD4&VH@uT(@{dz})Ja*Qw?d={m*``uXd^7UV>OBn&1>D9V$Y#{DW_0KHKZ3p zK_tpuvZn;$fQSwqDvvf+V}?dM1#jjt53_4ZF)k<9jhe)eW!`HaywZ#Qo@E;JE1P+= z?ouj!7P;Y-*KayA zwZh;FCeT#gb$lLs=qy$B?PYg`Egh&QyzY#7m06UJ3k zXv{~&0p~saVRii>#B&bk$n~FcG5^E0?U+8v4Ry%A-R*wk#`2U>`g& zO{z%B%#qR@#|jCK&T_k6$*aC+P{W}&-1B*Vg#}G> zV)~I~Z;lOH+hb8qb%GK5E|cmTzghJ$vxzKLe$=>IW5ZqC!;7FLx-}d!t}Yqk2stBg z<-NJQ|3lu%5XSa-tZCw-->0?Uje05`S0Cijiak32EAKCJHiS&WZ~Y|a?=-U90iwO} zN%R?^9P0Dk)-7){-hY_f?+G^A6#*p|H2kb*uaUD+fjfwN6OXjGdWUiK1ZY@gCkx7lpkY-{_t<`^*buGBy9QZy(BUU$PGzT-W-2+`#ZDovySKDIa#&b8K3qR$SXNy z6SLwzM(~x{QAm{Df&#Q`e6*gG`5o&HBQtRBfjgB48&;Z5^idGfc))!(<}{|oi}mHW zk!%FKHuf8+voERYgOg+T8CPLA640!Lk`-bJzNo;MlJ3+Jfe{}#b9Wb5vb zr(jJ|hx=L^9CsGAY=#xyU{*>AckcE@Cww*j@=(8N*f~YeDy^hJ3+I;sE(CYvV-GZI zCXwC0rt0PCi_Ty!h0N0X6tkOc_sk zboqU3x9ZY;+<&26u`-9S85g*9?<9D+;J<-r``(eDnBS*ftO)%l1y0Un5?7DLx|2RK zZ0#o^!+zr58~v4AAZY8DEf@5uXFB^W>~kGNkj0wz<&s5zIOCH%srIELp_yow7n}9F z*`?aT;=E%9zP_ZMg<3z`v3nk8&nGMuIW~n8UlL*EdgrFAsy;!?=$btr&T12`Cehz$ zKa1M7VQ5fzIT(M&hj{uds#tRA)+>#hXzRtU<#G2;X*XN6(8SCL3t-cfUuy>a-~`W5 z4kbPt7wuu!H9U7$aJPz>RV@}Y3MbJrGdNEi)a3|{@MhBPzlh6(?)Hgwt^D_#yb&B^ zwBN2%ENjRmSP>Dyew`=Hv_%Z7rKdG;nY)+TnTr2mdglHBp%93P@BGkDiU+p5^mBTg z*!!g8^jmJA(1=Qdv1@S=9g|3omM?C&)R$#zkz)zNs?+)KgWe1Jmt}Wq1Z+=DTFK5h zIs2inCOWR^9Phf{>F~KQ0%GJ%E|_-Ne&9@ey>q^XG@`TbY-8;D*9gZSP-hnv>x6jc z`VndH&go3eKy?EYt&9^LHTrv3W5A8joyHy9aP@jW+T)o&i!2wGOPWsbf|8`5uR3%& zS-y5ZsjHDzUI5^#g|H?n(S*hAX{B7<+2bfc{yExBp3&5)38q+X34I1T+OZ~VFe-G2 zkd_9hOo=E8SzEC9fom*g?U`He+Fqy5_=%=`)1un=;e+EbF zhXE_t`QQkgGQ7U!-85n#sz4qg^F^cOT~JN!FRpFe0gs&|LwRetLT@7oWrvX~#ik0Q zwoJ!tYD=j-;@rqE;N3^GDUzmd^%B~vqwx&{zK=##t>_w722^2hJY}nO;T)(7uNRwR z7bd)Ck{CK@0{*|v&O#LqyKfmPm>?`9PbZf1#;%?e!O(dp*Kv-v8n|FaEo{Y$v=~dF z^3Hmd6_2@g^?Cy^rBwNfcn?FOUeV;@0{@3;R|-!7ND8zm?CM~Eum_&ICr#3|fwe%2 z^#H6tRY|O5$5_%sfB^_vN;puQi&f*D|*(UQ8823}R?xg55C9fI%u zV~X(zwNv6Zdvby2_DlK>rnA7oM!lm)iQtAGqh-q!93S`$8N1;lH9bv44I>w_AW$ zoFRU;NQ+fwlSgFo3B5nYwEq;d3i@h1@We_6R<9z3vbxE*Y=02*VcG;8%-Y$>)jc1% z_;u;$GT-if@-c^QH-L{r`5T01DR7AT!<`sA7p~FSeos6 zt2oAlk2VeNJ7AURZ(9rg)CT8=AN1~j%%fMDAxbX~89Ds{wZd*NhE$~wOmRYkqz#;FrFa|CMVgt4q2OUsBz@#e>m0;sPUyFg+IeG`9pFOesSvdY%=zwkx|P~dpGYVf{*w**{Sgx z-E?SqG$Bm%g=^X&7ilN~Kx!g&T>ODGKC*oG2U%y!#t}l_R6cN`P8dQ(Gf;X9xPsVa zZjyUyUqKmvh7y=WY5Kdpp?dvj9?piTCJZ7e4&g&QbcbSs-zxf(BofB-2yb_XU0~Q} zGWMeDUB2yQa#PDZ=}cVFc5{Z^E_YD#XU%%gU0Dv%0B3@a^C#J9_X%d)#TaR~26B*# z>zxO=lz@A?uURp2+`xmW@XAqu%Lr(e6Uvg~wQ)M7buI}ZQms_@FZblSCZ}wTB~tRB zU`|2&^*-%>-wRQfPek+6!A9qNR7($j6Ba$XZZKn19N+A9g zdHA{X6DZF_6XfpZ=8qR$iZJ?G+wkXXcXJt3@IweG!s7M$nh3ErVGXx(f|i4>&GrW# zrd@`xb8%XhCfmcpv1b_woNJ^~$URMo6U!({bn#<1o)OAAYVkPFLVdfC{k7N+ffSv0I2wGMWW;u8+A-NCeJxI-SX&*;^d5gB z;+dtDb9VlLxGMR>@S8HJpa$5Ag;n>BSV|0N2ke)M@2Ir(rwDqXNwoL)hU~?xI5}Gt zeag~aY~uYt9hN(+JkX%Dgi+owe&LrUbSHlDaIsGTV4fjol8*lt3b>!12WNM=UAAi* z2ByV6RH}|yQL_liF^L7DY{M=$rUB&>og!wrt^VieP z`a|%MaTEKBHSFz>C=$IfSWKB)&y}7*60R52tjyz6!-AplIA7dq^Chg}FthRFX;>Ha zQ%L7+tKJ;qeSS)EWZW`kP3z9skmSEdJhZVBzLg7MpSNmJE&Fo|ZMVALSS^!PRn@Lr z)iwWqVb5gS{b|Go52GY0Dpb;MLLm;|=6Jk&@@dFadBF-x=qXVZ0;9 zfN&w1;ci2wLK{5l#@X5O$oNsRIA!bObAlJ{_i~G37DIOBq#?#-ZZf;*imz8rLKu(I zI_fT}eL2!5L2+uK?r?oOUj9?FBjYZ6U}AA04~xw$@tt!^Hz|qJEN|AhzZImI2r7Ng zH_@DTL$O)8{CaqIv+S+q6;teok+`0-pJtS`;mfx4%)AC)=VP&pR0kRk?m9j&h~lGN zC22^jUy(OQu&?sWiw#$?D{_PJxo}rQNUPy+H$DN=)fdGPAk^k}p)SwS(AA;! z|8RdE#Hg~6z0$>9d$J{Rd}4DXM<1J@Zr6`LwOlcCtQEGaBXFlbO!we)Cv}(YEhK%& z+VmDHDX+le#gjC8=SI2t?dpMTCz(6*j9iXJFw0`3#oc129c$-FBjYXyME?01v3lhC z@EFZRUd5c{oD`6a>g>+Vjcod?>;7|ZUIY|#zd}#fT-^%+wJ0{`;?~<}<-oG~j(Rh8 zICBvU3s!}<3JI9;KzxNg&U=H=5qFxk%Q>9cI*D=7(srjmz7A_P=l?(oqy9sSAtjI> z=GLQsv-+nt^|@YW!D8!RysP`sf`}kQT#1#-X5pb}T(CM2P9G*7e<_Go+eIyh&w;so z#95k>vWO4fe^iXE+ZMOke-~zTZo!f8V}1%i)$sfKCGAW}ytLiJOUuq6u7-fgsf0^T4MKTD;?;U1z&XVAL~P z7uf2cH~KbOyCQXZkq5Se4g)iOJz^|%q|h9ipI4-zRnxunCMan3PDiabidjb_8#RfaKJ;PAfq ztjS2x;yg(+8MtyhHRBD$BA+s9jg(gfE-L)5Byj(HD$&?{`WBoIxOZG!LIu3agAB>G zL7GmNgxo$w2LJyHEBJlO_$_$M)RH(%P%8PsxbVMoyXWPrjpS$yx=ttY4dElhm-KJE zVjRGjHWfu4+JfFu1lL!n6=gIK&n^ZEUw;sJA$z9IXGp9QE(k=t9Y9*Zg?lY6deE0D zY1$`bKtT2Xdf^3i2w2<6%lrKoC{C<{LIAYITRxy-4DqHu{8^4Vh}e}0?QZ2@^+JaV=C0}*Ue6tS zhu}fCmq1iXmAH(=8@zsUz-H^ zf`kc6l}b~PO6y^7f}(f6&6Yq_YFc)l`p%O-O8v$6NXstHNYTL7?Xl0Hh*kGOtfmzk zdZ(G5_RSqAS9e4Pfi@k`A@^Q_f3?X#G&b~A|LZ3}ZR)FX?-6mo1Ny9Z^#Q??Oh%AO zc;Wxo%k}>=wg2%mlbM>eOk7_xO1etjD`MB=noNrHMQ-x7D7BcljH%7{;m(&^k#Fr& zCaGjfrm!tEiO4D~WkzL`%_!Hf<{tNt`22K!IOn|H@5k%?Jdelwyq{nEWR&}+fj=E6 zsZKiv-;nA5S+HkzHu-F=H%xNpaNGnnsUC`BVo`3bU+#fNzi^P&(68qdJEv%f)+xzy zyrwgR><(TOw_Cs!2le}fhe6V0M|#8cWs668>uzmJ8ngy%>{nj9pmDla+JK@xerKYL zm*cI#dC*_?X{rVb3gA8z7NTM6g}C~Ge*N`;F|rw*ch=-$#7+q66j&DBDpsEY9#oEP zDRbj5&wO$D{`KbB&+bPOAODAAZ#~FUkgNDRjk`QQy-UJ)q~`~`2h3ko(lb_I;tj&Y z&6LKiL#8+-Vst)z6^R#)u#$j-0bq}G$^cPIg2eXAL%WOAJ)sf8Vyp%Hv>jk$3r=~J z4Dzz2ipClD!9!$#Nf{OepU|VBi&w_NLB13BOUl8qLPx5Ttw$!o8-tP$@WQ=9x7{vF z@a;oRedV+VsWYPc55Px--rK@aL700W&l&b@>k?gUS zsu4qpCqFnpcKpBA2)0j+jyC+0^jXqa6R#aLI1qy_&G}3OdZ#Udpa_^}B&OlWjLoI$ z(_%Uu{b5mQPySZh$6|N$<5lLDnT%e%9hXMs2D6+ic@8QE$}v}v2*m7vr_U6~)e{-k z@enn#d-=d$ZQo%~j)ch@@c;{ED{L+WRq1VebJL49b`HeYky3!Xmd%T+@TMUld6gf} zdE9PfZRQ*YqaJj;Oo5r3EH{^B<*iFNqO|pf6RNq(sjr(g8GwHk3}6nfrglgv(xvoQvU5lkFE0^z?-6;!E2bR> zCrg)1i%JQgbn4ki+N-S?;pHf$eL_s0Pjl4{Q6O_ZoxLWeqejA@9pU4UPIe{Nz$-2izi@+T>^r59X;-y_j5Y)29{J;m4D13hz^ zwyhw>GqQbvH`BdLS!s231Z}LgFB>=qO|f@t^_=;Vp8Py~J?Uf`*%jXEC2Kl2@T%Ct6TR_W5nx6i^P zd3-@%ESKIUD<1Ytl~#WIP#A8K@p=sy8p0CF+of3PwE?&}ZL1=1QRHG`Senx*W>6Pw zH60keoq#OUm%BoF&60e&67+WY;n7`xc?xVMj6fDXQsX^L5_w5uVyb$w8wQl7QKJj2M_YlPcZ@meo4P4^h~0&URz3C;g^?OTtv&1`mlG!Houn;goh& zQ2%o;>|*A*w)e$2O8xmMKsX$Db-&9X+4m{;1f^tTATsWzS)x>RMVgsDF(PYM6hLOjVDwtJ#``*~3R$dwHR7|hnd z0u|!Kyuy~`oRC)WwquU1Ia!f?C1{vchEJj&S{zE{KwLGhc^CGjX8c(>yBRY!t~=|P z?~-YqY92~?##zj2HfplwB@W@sa_Bvx_zj#1MapDX}8-Ae2n=1Dn7#RoK1FD>)7~} zEx)B**d$8l_LsWudNLBMO%xKY`+taJz1#b!e)^Lodv4KH;4|41gfvDRUCSE-b9KT# zHiSL@z=(JdW|ojV?8&Y^6XdTEOi;{oMe*JKZ%bzEMx?ZyVYT3x=u3J}PDqm!6>U8& zHo#yIKS5RbD#rNk_8>kd)pa9%DIu4aeSxJpZ;Cbkop#Di?k4soVlpBpfm;$8#>L7-!^)7m(tJD;Kg=Z)>zi zor(ErbV39%wNifcZ9f0Ucb9i;c@`AZ{y2Zu_HOVw@8`=!qhi5-nbpKiDe^4GE%Bk2 z7D5ikuU>cT_o-mf>+4f^{N580;NgJBtYc?wM=j37f3+)Sd2X+1B%}togS}EpC)gmM zVkD>v$#U`_qhE|g3kab`3-y7yitP!cK>|m(4pmD_2sI#HwIDW1|@WM;d6gAU_sy4P6vb@e7-M_PWb4rsoP~VQSoh+xYD_5=XcyJP8lOGTfD>S zyG5t3={+pjMVt+V#UgX_ptJr*OV%ZtmV{nf!0GN=$wZ+m1L3>YP-wOrhTTtSHKq6o z15B@aJ^t!wj#V#ooF<3hS?2}7a(Z1qbsaCe>!AHt*Y;~lGh>w|X*~%Tssmf)?*Pq* z-Gi(j7;7 + + + Supervision 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + +
    + +
    +
    + + +
    +
    +

    Selected device

    +
    +
    +
    +
    +
    No device
    +
    +
    No channel
    + +
    +
    + +
    + + + + +
    + + + +
    + + +
    + + +
    + +
    +
    + +
    Preview
    +
    +
    +
    + + +
    +
    + +
    +

    Channel selector

    + +
    + +
    + +
    + +
    + + + + + + + + + + + +
    + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +

    EPG Viewer

    +
    + +
    + + +
    + + Tip: leave empty to show the first 5 channels. +
    +
    + +
    +
    +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/setup.sh b/static/setup.sh new file mode 100644 index 0000000..8eba104 --- /dev/null +++ b/static/setup.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +set -e # Stop script on error + +IPTV_SOURCE_URL="${IPTV_SOURCE_URL:-https://iptv.mrk.ovh/get_source}" +IPTV_DEST="/home/pi/Documents/IPTV.py" +CONFIG_DB_SOURCE_URL="${CONFIG_DB_SOURCE_URL:-https://iptv.mrk.ovh/static/config_init.db}" +CONFIG_DB_DEST="/home/pi/Documents/config.db" +RC_LOCAL="/etc/rc.local" +RC_LOCAL_CMD='sudo -u pi DISPLAY=:0 python3 /home/pi/Documents/IPTV.py &' +CURL_CMD=(curl -fsSL) + +if [ "${CURL_INSECURE:-0}" = "1" ]; then + CURL_CMD+=( -k ) +fi + +echo "Updating system" +sudo apt update + +echo "Installing packages" +sudo apt -y install vim openvpn vsftpd curl ca-certificates python3-pil.imagetk python3-tk +sudo update-ca-certificates + +echo "Configuring vsftpd" +VSFTPD_CONF="/etc/vsftpd.conf" + +sudo sed -i 's/^#write_enable=YES/write_enable=YES/' $VSFTPD_CONF + +echo "Restarting vsftpd service" +sudo systemctl restart vsftpd + +PYTHON_STDLIB_DIR="$(python3 -c 'import sysconfig; print(sysconfig.get_path("stdlib"))')" + +echo "Fixing Python externally-managed restriction" +sudo rm -f "$PYTHON_STDLIB_DIR/EXTERNALLY-MANAGED" + +echo "Installing Python packages" +sudo pip3 install python-vlc python-socketio wifi aiohttp websocket-client + +echo "Downloading IPTV.py" +sudo mkdir -p /home/pi/Documents +sudo "${CURL_CMD[@]}" "$IPTV_SOURCE_URL" -o "$IPTV_DEST" +sudo chown pi:pi "$IPTV_DEST" +sudo chmod 755 "$IPTV_DEST" + +echo "Downloading config database" +sudo "${CURL_CMD[@]}" "$CONFIG_DB_SOURCE_URL" -o "$CONFIG_DB_DEST" +sudo chown pi:pi "$CONFIG_DB_DEST" +sudo chmod 644 "$CONFIG_DB_DEST" + +echo "Configuring rc.local" +if [ ! -f "$RC_LOCAL" ]; then + sudo tee "$RC_LOCAL" >/dev/null <<'EOF' +#!/bin/sh -e + +exit 0 +EOF +fi + +if ! sudo grep -Fq "$RC_LOCAL_CMD" "$RC_LOCAL"; then + sudo sed -i "\$i\\ +$RC_LOCAL_CMD +" "$RC_LOCAL" +fi + +if ! sudo tail -n 1 "$RC_LOCAL" | grep -Fxq "exit 0"; then + echo "rc.local must end with 'exit 0'" >&2 + exit 1 +fi + +sudo chmod 755 "$RC_LOCAL" + +echo "All tasks completed successfully!" diff --git a/static/tv.png b/static/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..95fa24f789220bff9cf6baa44363bbcf566f710c GIT binary patch literal 1127290 zcmeEvc|4Te`|v$>Qj)!5l!Sz_FJVGLo24RJG{)Gs?1Zs|qDZ9$nIsXFR1z(UkTyz| zwAi!n+hCUW%#1xfJ>T!|_rC8x`Fwh2?m6dN=Q`JZu5+FHIc2m*Z#mm)HVA^28|ZH{ zfglF(l>uU*10Ms}r=KC{!xS2&eSq@m;N@%ueij0s)@V656vPRw42GagNG0(YJ@p3& zQs$cOrAO=Kys(#-yNep7ry2?+Ya@$LQI^7}*w{!Zpp+G)RL~06QcB7;);89v^42J8 zRWKK1p};H-Io}EruLThmIDKz&uGvo#TG^T zF*MbN_RWccrZn0egYv{!JA1g=c>18+FGs?x@26REAoNR48>`-!wO4byJ2ZRfSPONB3(!rk}#e8WJ+jq{Da5pF-oF#3N zexhn++c+EA4P~uQnUnSh`#FuO7!_4Hw9~KrLOY@CooU>H0s{y&~rg!47T}h z_H}ksv$wZav$9f>MJdXwNU2&QtfUk$*78y+K%AsdHYgiqYikunl(MWR6_zF7BE}u% z>FRE2?_%Rh_`8jZ4-rcm9|-NObUt)MC`Pqz24w{<~zdbwkKcY9!* zY(%J((2${YllhP2nmR;!7M%OEkXgNe-R!aFf#R{&sYDj7R!T(|sCTi9f-e6^?1JB4V8T&!qn-mz@kg z{*dQhalzT$e!TqRXKKaFw~x0Syk}>PR`ay?bi&x%JELqd(rzxc^CSa;e2r3VlUx%U({e>!2#{PH?%BmcTkb9!Y&D7`!)ly1#6dO8>#9kMau|%A5kl;cU5(&pqTkOz&(3LvvC^T)(O$qsdly?B zE!pLWWt6sM>$ z5b{b2N*3TzY4%ak0%5wKyDSI5g$j*{rkOL~m$5TX%bDy3#Cl2>diFKb6ADxC5Z2jc zAZ+gv^2R&7}X%g!{#_>Q<1>4Ex$)Y~w&KDsZbEZM82o=Ed1D0ifWR3Jj$A=m*D zf?O~dnSl-gA>foJ5e9w)Z!ot7+|j1$Li;_fu)rkt_JU79l%r_qD;f4^T z%qPmgi{PGtL(ee#Z3C@&1p_Yw_nRYJ(wo;PUU#OBo&!jpJ z+*IZ}-=A{C_7#WD4e#>(!UjwYIjhekiZ+FqBX77CFfWNUR%;EfppP18! zPpw;~81EFP;^u~tO2ZWNm0qio?!Wu&uEut@XO;{+BVq|F`xCaMJ3{Tyqb9a>>|n`kTU{I z&(37x>gxGlsf(Hb6b`uCy? zW5uhdFJ-xV%1v-3CQd#vCw{Io+x7ZRf66g_#acN3Z3>tbrc*LL1baf1A1J0H<=?yDKTQhF@<{Bt*x{8eqG;emGiFX`^P z($T{pSSlKULU7FLIwOJ}sLcX(KTt4uYiN19E)&~5iFAugh%PaWW%CqpNozncnX?KA zi0pqTN`yZjr}ltZ0MorEKHs;T34dc>(yC=4e|nvN#4)UHZ*;)k%FK4z z#~w(Zy{Ky_+|51VUBd&fHNKv1KWoNw&oUrR34Q*SooT0Tnc)^O?x>`5j_0mYO;4zOv6

    E311RdeK)7Tq5&+6oCj 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

    hArbgd`$z<<`bfU%*4B9} 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

    5c`mv_PUoR6c&W>v8|kCs9RC65hg7pN9y@L&e*i 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