Skip to content

Commit

Permalink
initial commit ...
Browse files Browse the repository at this point in the history
  • Loading branch information
Mastaaa1987 committed Jan 31, 2024
1 parent 7d36c75 commit a47e2a0
Show file tree
Hide file tree
Showing 418 changed files with 5,139 additions and 1,180 deletions.
273 changes: 3 additions & 270 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,272 +1,5 @@
# vavoo-parser (für LiveTV) + xstream-addon (für VoD's & Series) ...
# vxparser/apk

## Next Gen fork - (Beta!) CLI Version

# Update Verlauf:

### Update v1.3.0 -> v.1.3.2:
- epg.xml.gz export bug fixx ... Jetzt läuft's wieder gut ;-)
### Update v1.3.0:
- Xtream Code Api letzte Funktion komplementiert. (get.php m3u/m3u_plus ...)
- added custom_sid: '' to return json, nun laufen alle gängigen Xtream Code App's wie IPTV Smarters, IPTV Extream, IPTV Pro usw.
### Update to v1.2.5:
- Xtream Code Api gefixxt, sodass jetzt xtream code api, livetv + serien + filme mit epg läuft ...
### Update to v1.2.1:
- HLS/TS Stream Source Settings wahl für Xtream api code Live TV ...
- Einstellung für epg Provider, Icon & Rytec ID's xml.gz generation ...
- Automatische erfassung der Internet IP für den Vavoo key, ggf automatische neu generierung dessen ...
- Vavoo Live TV hls Streams hinzugefügt, sodass via SmartIPTV auf Samsung Smart TV's gestreamt werden kann...
- Global Search, Fixxed sodass jetzt auch Filme gesucht und geaddet werden konnen ...
- Signatur Key check integriert, sodass wenn sich internet ip ändert bzw. key sigvalitUntil ausläuft, automatisch ein neuer Key angefordert wird ...
- Main Settings wurden neu gestaltet, jetzt gibts ne kleine Info zur Setting ;-)
- Xtream Code zu 100% integriert. Ab jetzt kann insofern Xtream Code api vom clienten unterstützt wird, den gesamten Kontent darüber bekommen könnt! (Info hier drunter ^^)

# Installation / Start:

```shell
python3 -m pip install vxparser
```

```shell
vxparser
```

# Xtream Codes API Readme:

Xtream ist nun soweit verbaut dass die panel_api.php, player_api.php & xmltv.php zu 100% via GET+POST Callable sind ...

Wie gehabt spielt der username & password keine Rolle, aber um auch Items angezeigt zu bekommen muss zuvor (wie für die m3u8 listen) Get LiveTV Lists (für LiveTV) oder

Get New VoD & Series (für Filme & Serien) zumindest 1x ausgeführt worden sein. Genauer gesagt es sollten auch Datensätze in der Database vorhanden sein ;-)

Aber dann läuft der LiveTV teil komplett ohne das auf die Server IP in den m3u8 Listen geachtet werden muss, zwecks dynamischer Übergabe dessen (und automatischer SigKey

überprüfung, funktioniert selbst Intetnet IP change nahtlos ohne das was eingestellt werden muss! (Solange die Server API von mir local auf dem Client Gerät gestartet ist!)

Z.b. über Android -> Termux -> locale Ausführung meiner API ...

So das erstmal dazu, jetzt gibts noch ne api callable Übersicht (Beispiel Anhand GET Requests, für POST Request müssen die Parameter in body form übertragen werden ...):

(* = kann man eingeben was man will! X = int(id) ... (also eine Zahl ^^))


- GET ACCOUND Info:
```shell
panel_api.php?username=*&password=*
```
- GET VOD Stream Categories:
```shell
player_api.php?username=*&password=*&action=get_vod_categories
```
- GET VOD Streams:
```shell
player_api.php?username=*&password=*&action=get_vod_streams
player_api.php?username=*&password=*&action=get_vod_streams&category_id=X
```
- GET VOD Info:
```shell
player_api.php?username=*&password=*&action=get_vod_info&vod_id=X
```
- GET SERIES Categories:
```shell
player_api.php?username=*&password=*&action=get_series_categories
```
- GET SERIES Streams:
```shell
player_api.php?username=*&password=*&action=get_series
player_api.php?username=*&password=*&action=get_series&category_id=X
```
- GET SERIES Info:
```shell
player_api.php?username=*&password=*&action=get_series_info&series_id=X
```
- GET LIVE Categories:
```shell
player_api.php?username=*&password=*&action=get_live_categories
```
- GET LIVE Streams:
```shell
player_api.php?username=*&password=*&action=get_live_streams
player_api.php?username=*&password=*&action=get_live_streams&category_id=X
```
- GET XMLTV:
```shell
xmltv.php?username=*&password=*
```
- GET EPG:
```shell
player_api.php?username=*&password=*&action=get_simple_data_table&steam_id=X
```
- GET SHORT EPG:
```shell
player_api.php?username=*&password=*&action=get_short_epg&steam_id=X&limit=X
```
- GET m3u:
```shell
get.php?username=*&password=*&type=[m3u|m3u_plus]&output=[hls|ts|mpegts|rtmp]
```

### Verbesserungen in dieser Version:

- API komplett mit Python 3 verwendbar. Alle benötigten Packages via pip installierbar. Keine zusätzlichen Binaries benötigt! (wie lighttpd, php in termux Version z.b...)
- Auf jedem System startbar. Android (via Termux ab Android version 5), Linux, Raspberry Pi, Windows ...
- Effizienz Steigerung im Allgemein verfahren durch multiprocessing bzw. async requests ...

### Erneuerungen in dieser Version:

- CLI Menü
- Settings
- Service Option (LiveTV m3u8 lists & epg.xml.gz)
- Xstream Addon integration (voll automatische Kontent abfrage der aktuell beliebtesten Stream Sites für Filme und Serien ...)
Momentan verfügbare Plugins:
- cinemathek
- dokus4
- filmpalast
- hdfilme
- kinokiste
- kino
- kkiste
- megakino
- movie2k
- movie4k
- movieking
- serienstream (accound benötigt!)
- streamcloud
- streamen
- streampalace
- xcine

### Hintergrund Infos:

1. Menü Information:

Allgemeine Menüpunkt Auswahl (bestätigung) via
- [ENTER]

Im Selection Menü Menüpunkt Auswahl (select) via
- [Leertaste] (an oder abwählen)
- [Rechts] (anwählen eines Menüpunktes)
- [Links] (abwählen eines Menüpunktes)

Bestätigung der getroffenen Auswahl im Selection Menü via
- [ENTER]

Falls das Menü mal nicht Sichtbar sein sollte (zwecks output etc.), bekommt man es wieder Sichtbar indem man [Hoch] oder [Runter] geht.


2. Menü Aufbau:

- Main Menü:

```shell
Settings => #Submenü
Vavoo (LiveTV) => #Submenü
Xstream (VoDs & Series) => #Submenü
Stop Services #Services einschaltbar via Settings
Restart Services #epg_service / m3u8_service:
- Clean Database (Settings) #Löscht aktuelle einstellungen aus der Sqlite Datenbank
- Clear Cache Path #Löscht den aktuellen cache Ordner
<= Shutdown #Exit Programm
```

- Main Settings:

```shell
<= Back #Zurück zum Hauptmenü
[0.0.0.0] #FastAPI Server IP (0.0.0.0 = listen on all ips)
[192.168.2.67] #Server IP for M3U8 List Creation
[8080] #Server Port
[On] #Set Automatic Network IP to Server IP Setting
[Off] #LiveTV m3u8 Listen erstellung Background Service (0=Aus,1=Ein)
[12] #Warte Zeit für m3u8 Listen erstellung in Stunden.
[Info] #Log Level (1=Info,3=Error)
[Off] #Search in TMDB after VoD & Series Infos
[] #Username of S.to User Accound
[] #Password for S.to User Accound
[ts] #Bevorzugter codec für Xtream Codes
```

- Vavoo Menü:

```shell
Get LiveTV Lists #Erstellt Sky LiveTV m3u8 Lists (alle Länder...)
Get epg.xml.gz #Erstellt epg.xml.gz für Germany LiveTV
Delete Signatur Key #Löscht aktuellen Vavoo Signatur Key
Clean Database (LiveTV) #Löscht alle LiveTV Einträge aus der Datenbank.
<= Main Menu #Zurück zum Hauptmenü
```

- Vavoo Settings:

```shell
<= Back
[On] #Generate HLS m3u8
[On] #Vavoo Channel Namen ersetzen
[Magenta] #Provider to get EPG Infos
[Off] #Start epg.xml.gz Creation for LiveTV als Service
[5] #Sleep Time for epg.xml.gz Creation Service in Tagen
[7] #Anzahl an Tagen für epg.xml.gz Erstellung
[On] #Provider IDs mit Rytec ersetzen
[Provider] #Logos bevorzugen
```

- Info:
Wenn sich die Server Ip ändert 1x "Get LiveTV Lists" ausgewählen, damit die aktuelle Netzwerk IP in den LiveTV Listen ersetzt wird.
ggf. "Delete Signatur Key" falls momentaner Signatur Key noch nicht ausgelaufen ist. (neuer key wird automatisch erstellt...)

- Xstream Menü:

```shell
Settings => #Site Einstellungen, an/abschaltung einzelner Sites für Suche/Auto Generation.
Global Search #Site Suche um Movies und/oder Serien zur Datenbank hinzu zu fügen.
Get New VoD & Series #Automatische Suche nach Inhalten in allen Sites (Sites unter Settings ein/abschaltbar)
ReCreate vod+series.m3u8 #Erstellt vod.m3u8 (für Filme) + series.m3u8 (für Serien) aus der Datenbank.
Clean Database (Streams) #Löscht alle Stream's aus der Datenbank.
<= Main Menu #Zurück zum Hauptmenü
```

- Info:
Genereller Ablauf ist wie folgt:
1. "Get New VoD & Series" oder "Global Search" zum befüllen der Datenbank.
2. Gefolgt von "ReCreate vod+series.m3u8" um die neuen Datenbank einträge in die Listen zu schreiben.
- ggf. Wenn sich die Server Ip ändert 1x"ReCreate vod+series.m3u8" ausgewählen, damit die aktuelle Netzwerk IP in den LiveTV Listen ersetzt wird.

- Xstream Settings:

```shell
[X] cinemathek: auto list creation? # Aktiviert Site für die Automatische Suche (Xstream Menü: Get New VoD & Series)
[X] cinemathek: global search? # Aktiviert SIte für die Site Suche (Xstream Menü: Global Search)
...
...
```

### Allgemeiner Ablauf:

Die meisten Programm Daten leiten sich von dem Kodi Plugin Xstream (Special thanks to Xstream Team!) & resolverurl (Special thanks to gujal!) ab.

Das Autoscript durchsucht die Sites bis zu dem link "showHosters" und trägt alle Items inklusive aller relevanten Infos in die Datenbank.

Wenn dann ein Stream vom Clienten angefordert wird, holt der Server alle aktuellen Hoster zu dem Item ein und leitet den 1. Stream an den Clienten weiter. (insofern Online ...)

Fragt man den selben Item nocheinmal an, mekt sich der Server die Position in der Hoster Liste und versucht dann den 2. Stream der List an den Clienten weiter. (insofern mehr als 1 Hoster vorhanden ...)

Dabei spielt es momentan noch keine Rolle ob der vorige Stream Erfolgreich weitergeleitet wurde oder nicht. Das bedeutet will man wieder zur 1. Hoster Url muss das Item so lange angefragt werden bis der Server wieder bei der 1. Url zurück springt ... (Output Infos im Server Terminal ...)


<del>Hidden Features:</del>

- Xtream Codes API faker für VoD's & Series weitesgehend Integriert. Das bedeutet, wenn der Client Xtream Codes API unterstützt, kann man den Server über den selben port wie normal eintragen und alle LiveTV + VoD & Series Inhalte mit allen Infos (wie beschreibung, länge usw.) genießen.

Dabei spielt es keine Rolle was als username & password eingetragen wird, der Server akzeptiert euch immer. Hierfür wird automatisch die tmdb infos zu jedem Item (falls vorhanden) mit in die Datenbank eingetragen.

<del>Dennoch ist momentan noch von der Xtream Codes API ab zu raten! </del>

<del>Weil der Xtream Codes API Client hat scheinbar keine Timeout Zeiten, was schnell zu einer dauer wieder Anfrage des clienten führt, was wiederrum den Server schnell zum überschlagen bringt. </del>

<del>Da dieser bei jeder neuen Anfrage automatisch den nächsten Hoster in der Liste erfragt. Dies führt ganz schnell zum Stau im Client -> Server stream anfrage, bis hin zum Server Absturz! </del>

<del>Die Zeit wird zeigen ob und wie Ich dieses grundlegende Problem in den Griff bekomme ;-) </del>


# Copyright 2023 @Mastaaa1987
### README comming soon ...

### Copyright 2024 @Mastaaa1987
25 changes: 14 additions & 11 deletions vxparser/api.py → api.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import time, os, sys, signal, inquirer, asyncio, uvicorn, re
import time, os, sys, signal, asyncio, uvicorn, re
from concurrent.futures import ProcessPoolExecutor
from typing import Union
from typing_extensions import Annotated
Expand All @@ -20,11 +20,14 @@

import resolveurl as resolver
from helper import sites
import cli, services
#import cli, services

cachepath = common.cp
listpath = common.lp
con = common.con
con0 = common.con0
con1 = common.con1
con2 = common.con2
con3 = common.con3

common.check()

Expand Down Expand Up @@ -134,7 +137,7 @@ async def get_post(username: Annotated[str, Form()] = None, password: Annotated[
async def player_get(username: Union[str, None] = None, password: Union[str, None] = None, action: Union[str, None] = None, vod_id: Union[str, None] = None, series_id: Union[str, None] = None, stream_id: Union[str, None] = None, limit: Union[str, None] = None, category_id: Union[str, None] = None, params: Union[str, None] = None):
if username is None: username = "nobody"
if password is None: password = "pass"

user_data = user.auth(username, password)
if action is None:
return {
Expand Down Expand Up @@ -232,7 +235,7 @@ async def live(username: str, password: str, sid: str, ext: str):
if password is None: password = "pass"

user_data = user.auth(username, password)
cur = con.cursor()
cur = con1.cursor()
cur.execute('SELECT * FROM channel WHERE id="' + sid + '"')
data = cur.fetchone()
if str(common.get_setting('xtream_codec')) == 't':
Expand All @@ -257,7 +260,7 @@ async def vod(typ: str, username: str, password: str, sid: str, ext: str):
if password is None: password = "pass"

user_data = user.auth(username, password)
cur = con.cursor()
cur = con2.cursor()
cur.execute('SELECT * FROM streams WHERE id="' + sid + '"')
data = cur.fetchone()
if not data:
Expand Down Expand Up @@ -343,13 +346,13 @@ async def m3u8(m3u8: str, ext: str):
if os.path.exists(f):
file = open(f, "rb")
return StreamingResponse(file)
else:
else:
raise HTTPException(status_code=404, detail="File not found")


@app.get("/channel/{sid}", response_class=RedirectResponse, status_code=302)
async def channel(sid: str):
cur = con.cursor()
cur = con1.cursor()
cur.execute('SELECT * FROM channel WHERE id="' + sid + '"')
data = cur.fetchone()
sig = vavoo.getAuthSignature()
Expand All @@ -362,7 +365,7 @@ async def channel(sid: str):

@app.get("/hls/{sid}", response_class=RedirectResponse, status_code=302)
async def channel(sid: str):
cur = con.cursor()
cur = con1.cursor()
cur.execute('SELECT * FROM channel WHERE id="' + sid + '"')
data = cur.fetchone()
if data:
Expand All @@ -375,7 +378,7 @@ async def channel(sid: str):

@app.get("/stream/{sid}", response_class=RedirectResponse, status_code=302)
async def stream(sid: str):
cur = con.cursor()
cur = con2.cursor()
cur.execute('SELECT * FROM streams WHERE id="' + sid + '"')
data = cur.fetchone()
if not data:
Expand All @@ -401,7 +404,7 @@ async def stream(sid: str):
except Exception:
link = None
linked[sid] += 1
if link is None:
if link is None:
notify = Notifications("0.0.0.0")
try:
await notify.async_connect()
Expand Down
4 changes: 4 additions & 0 deletions applib/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from .focus import FocusWithColor
from .input import Keyboard
from .main import add_instances, callback_log, callback_callback, callback_echo, start_service, callback, signal_handler, callback_xstream, callback_stat
from .builder import main, settings, database
19 changes: 19 additions & 0 deletions applib/android.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from android.runnable import run_on_ui_thread
from jnius import autoclass, cast, PythonJavaClass, java_method

KeyEvent = autoclass('android.view.KeyEvent')
PythonActivity = autoclass('org.kivy.android.PythonActivity')

class KeyListener(PythonJavaClass):
__javacontext__ = 'app'
__javainterfaces__ = ['android/view/View$OnKeyListener']

def __init__(self, listener):
super().__init__()
self.listener = listener

@java_method('(Landroid/view/View;ILandroid/view/KeyEvent;)Z')
def onKey(self, v, key_code, event):
if event.getAction() == KeyEvent.ACTION_DOWN and\
key_code == KeyEvent.KEYCODE_BACK:
return self.listener()
Loading

0 comments on commit a47e2a0

Please sign in to comment.