Dies ist eine mobil optimierte Seite, die schnell lädt. Wenn Sie die Seite ohne Optimierung laden möchten, dann klicken Sie auf diesen Text.

Python Proxy Lokal

salidos

Teammitglied
Registriert
17. Februar 2008
Beiträge
15.145
Lösungen
4
Reaktionspunkte
10.984
Punkte
3.755
Ich will mal nicht so sein.
Hier ein Python Proxy für lokal.
Starten.
Laufen lassen.
M3U nutzen. (wird im Scriptverzeichnis gespeichert)
Ich geb da keinen Support und werde das auch nicht weiter ausbauen. (ich brauche den Kram nicht)
Das ist euer Part.

Python:
###############################################################
PORT = 4323

LANGUAGE = "de"
REGION = "DE"

###############################################################

import json
import gzip
import requests
from io import BytesIO
import uuid
from flask import Flask, request, Response, abort
import time
import os
import socket

GEOIP_URL = "https://www.vavoo.tv/geoip"
PING_URL = "https://www.vavoo.tv/api/app/ping"
CATALOG_URL = "https://vavoo.to/mediahubmx-catalog.json"
RESOLVE_URL = "https://vavoo.to/mediahubmx-resolve.json"

HEADERS = {
    "accept": "*/*",
    "user-agent": "electron-fetch/1.0 electron (+https://github.com/arantes555/electron-fetch)",
    "Accept-Language": LANGUAGE,
    "Accept-Encoding": "gzip, deflate",
    "Connection": "close",
}

def decode_response(resp):
    if resp.content[:2] == b'\x1f\x8b':
        return json.loads(gzip.decompress(resp.content))
    else:
        return resp.json()

session = requests.Session()
session.headers.update(HEADERS)

r_geo = session.get(GEOIP_URL)
r_geo.raise_for_status()
geo_data = decode_response(r_geo)

unique_id = str(uuid.uuid4())

current_timestamp = int(time.time() * 1000)

initial_payload = {
    "reason": "app-focus",
    "locale": LANGUAGE,
    "theme": "dark",
    "metadata": {
        "device": {"type": "desktop", "uniqueId": unique_id},
        "os": {"name": "win32", "version": "Windows 10 Pro", "abis": ["x64"], "host": "Lenovo"},
        "app": {"platform": "electron"},
        "version": {"package": "tv.vavoo.app", "binary": "3.1.8", "js": "3.1.8"},
    },
    "appFocusTime": 0,
    "playerActive": False,
    "playDuration": 0,
    "devMode": False,
    "hasAddon": True,
    "castConnected": False,
    "package": "tv.vavoo.app",
    "version": "3.1.8",
    "process": "app",
    "firstAppStart": current_timestamp,
    "lastAppStart": current_timestamp,
    "ipLocation": None,
    "adblockEnabled": True,
    "proxy": {"supported": ["ss"], "engine": "Mu", "enabled": False, "autoServer": True},
    "iap": {"supported": False},
}

r1 = session.post(PING_URL, json=initial_payload)
r1.raise_for_status()
data1 = decode_response(r1)

initial_token = data1.get("token")
initial_addon_sig = data1.get("addonSig")

#print(f"[+] Initial token received: {initial_token}")
#print(f"[+] Initial addonSig received: {initial_addon_sig}")

catalog_headers = {
    "content-type": "application/json; charset=utf-8",
    "mediahubmx-signature": initial_addon_sig,
    "user-agent": "MediaHubMX/2",
    "accept": "*/*",
    "Accept-Language": LANGUAGE,
    "Accept-Encoding": "gzip, deflate",
    "Connection": "close",
}

all_filtered_items = []
cursor = None
while True:
    catalog_payload = {
        "language": LANGUAGE,
        "region": REGION,
        "catalogId": "iptv",
        "id": "iptv",
        "adult": False,
        "search": "",
        "sort": "",
        "filter": {},
        "cursor": cursor,
        "clientVersion": "3.0.2"
    }
 
    r_catalog = session.post(CATALOG_URL, json=catalog_payload, headers=catalog_headers)
    r_catalog.raise_for_status()
    catalog_data = decode_response(r_catalog)
 
    for item in catalog_data.get("items", []):
        if item.get("type") == "iptv":
            filtered_item = {
                "id": item["ids"]["id"],
                "url": item["url"],
                "name": item["name"],
                "group": item["group"],
                "logo": item["logo"]
            }
            all_filtered_items.append(filtered_item)
 
    cursor = catalog_data.get("nextCursor")
    if cursor is None:
        break

def save_m3u_file():
    hostname = socket.gethostname()
    local_ip = socket.gethostbyname(hostname)
    if local_ip.startswith("127."):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        try:
            s.connect(("8.8.8.8", 80))
            local_ip = s.getsockname()[0]
        except Exception:
            local_ip = "127.0.0.1"
        finally:
            s.close()
 
    m3u_content = "#EXTM3U\n"
    for item in all_filtered_items:
        m3u_content += f'#EXTINF:-1 tvg-id="{item["id"]}" tvg-name="{item["name"]}" tvg-logo="{item["logo"]}" group-title="{item["group"]}",{item["name"]}\n'
        m3u_content += f'http://{local_ip}:{PORT}/vavoo?channel={item["id"]}\n'
 
    with open("vavoo_playlist.m3u", "w", encoding="utf-8") as f:
        f.write(m3u_content)
 
    print("[✓] Local M3U playlist saved to vavoo_playlist.m3u")

save_m3u_file()

app = Flask(__name__)

@app.route('/vavoo')
def stream_proxy():
    channel_id = request.args.get('channel')
    if not channel_id:
        abort(400)
 
    channel = next((item for item in all_filtered_items if item["id"] == channel_id), None)
    if not channel:
        abort(404)
 
    resolve_headers = {
        "content-type": "application/json; charset=utf-8",
        "mediahubmx-signature": initial_addon_sig,
        "user-agent": "MediaHubMX/2",
        "accept": "*/*",
        "Accept-Language": LANGUAGE,
        "Accept-Encoding": "gzip, deflate",
        "Connection": "close",
    }
 
    resolve_payload = {
        "language": LANGUAGE,
        "region": REGION,
        "url": channel["url"],
        "clientVersion": "3.0.2"
    }
 
    r_resolve = session.post(RESOLVE_URL, json=resolve_payload, headers=resolve_headers)
    r_resolve.raise_for_status()
    resolve_result = decode_response(r_resolve)
 
    if resolve_result and len(resolve_result) > 0:
        stream_url = resolve_result[0]["url"]
        return Response(status=302, headers={"Location": stream_url})
    else:
        abort(404)

@app.route('/playlist.m3u')
def playlist():
    hostname = socket.gethostname()
    local_ip = socket.gethostbyname(hostname)
    if local_ip.startswith("127."):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        try:
            s.connect(("8.8.8.8", 80))
            local_ip = s.getsockname()[0]
        except Exception:
            local_ip = "127.0.0.1"
        finally:
            s.close()
 
    m3u_content = "#EXTM3U\n"
    for item in all_filtered_items:
        m3u_content += f'#EXTINF:-1 tvg-id="{item["id"]}" tvg-name="{item["name"]}" tvg-logo="{item["logo"]}" group-title="{item["group"]}",{item["name"]}\n'
        m3u_content += f'http://{local_ip}:{PORT}/vavoo?channel={item["id"]}\n'
 
    return Response(m3u_content, mimetype='application/x-mpegURL')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=PORT)

requests==2.31.0
flask==2.3.3

Für eure E2 Kisten müsst ihr das halt umbauen.
 
Bei mir funktioniert es, aber schlecht, darf ich auch mal pissig werden und andere beleidigen

jungs, kommt mal runter, es ist Freitag, mal einfach SKY und andere vergesen, es gibt auch ein Leben ohne werbung

genist das Leben, anstad euch wegen ein ilegalen iptv zugang zu streiten
 
So. Hier noch mit Movies (dauert aber ewig die zu builden, deshalb hab ich auch nicht wirklich getestet ob die m3u auch geht)
kann oben im Script ausgeschaltet werden.




..aber echt die letzte Aktion für Vavoo.


Edit:

hab movies wieder rausgeworfen, da Vavoo sowieso keine eigenen Quellen hat und ich keinen Bock hab auch noch Resolver für den Mist zu schreiben.
 
Zuletzt bearbeitet:
koennte mal jemand erklaeren wie man das einbindet?
danke...
 
jo hab ich aber irgendwie laeuft das exportierte Bouquet sehr bescheiden.
 
Zur Info:
Über Tivimate und Konsorten wird das nicht funktionieren.
Die brauchen absolute Pfade in der index.m3u8
VLC etc. ist da "unproblematischer".
Der Proxy patched das NICHT.
Wenn ich Lust und Zeit habe, implementiere ich das vielleicht noch.
 
Zuletzt bearbeitet:
Über Tivimate und Konsorten
Moin,
getestet habe ich über das iPhone mit Cloud Stream und Smarter IPTV und damit läuft das sehr gut und stabil. Greife über Wireguard auf die vom script erstellte vavoo_playlist.m3u zu. Wenn ich die nächsten Tage Zeit habe probiere die m3u mit bouquetmakerxtream auf e2 zu erstellen.
 

Anhänge

Du musst angemeldet sein, um die Anhangsliste zu sehen.
Grundsätzlich sollte es auf allen Playern laufen, denen die relativen Pfade in der m3u8 egal sind und die nicht der Request URL (die URL vom Proxy Script) für die ts Segmente folgen sondern der real gesendeten URL.
Da Tivimate immer zuerst der url aus der m3u folgt, landet er wieder beim Proxy und der sendet halt keine Segmente zurück.
 
Zuletzt bearbeitet:
Ich musste in deinem Script nur eine Zeile ändern damit es läuft
von
Code:
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
auf meine VPN Subip

Code:
hostname = socket.gethostname()
local_ip = "10.213.86.1"
 
Hab hier etwas für E2 erstellt mit dem script vom @salidos und das m3u2e2.sh von @clever999 mit ein paar Anpassungen.
install_vavoo.sh
Code:
opkg update
opkg install python3 python3-trio python3-xmlrpc python3-isodate python3-pycountry python3-pycryptodomex
wget https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py
python3 /tmp/get-pip.py
wait
pip3 install --upgrade pip
pip3 install requests==2.31.0 flask==2.3.3
cd /home
wget https://instinto.mooo.com/tv/vavoo_E2.py
wget https://instinto.mooo.com/osprey/m3u2e2.sh
chmod 755 m3u2e2.sh
nohup python3 vavoo_E2.py > /home/vavoo_E2.log 2>&1 &
sleep 5
./m3u2e2.sh vavoo_playlist.m3u vavoo-de
exit 0

Hier auch als Einzeiler
Code:
wget -O - -q https://neutrinobox.de/install-vavoo-e2.sh | bash

Bei einem reboot, müsst ihr es neu starten oder ein cronjob einbauen


Edit:
Hab noch ein sleep 10 eingestellt vom erstellen der m3u zum e2 Bouquet da es sonst die m3u nicht findet.
Danke für die Info.
 

Anhänge

Du musst angemeldet sein, um die Anhangsliste zu sehen.
Zuletzt bearbeitet:
@Osprey
Ich würde gerne dein Script testen allerdings gibt es Python 3 auf der DM900 mit DreamOS leider nicht. Danke für deine Arbeit.
 
Kann dir leider nicht helfen da ich keine Dreambox habe um es mit DreamOS testen zu können.
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…