Files
xstreamDownloader/xstream/resources/lib/wrappers/__pycache__/meinecloud.cpython-311.pyc
T

229 lines
18 KiB
Plaintext
Raw Normal View History

2026-07-06 14:27:51 +02:00
§
ˆJjCãóhdZddlZddlZddlmZddlmZddlmZdZ dZ
dd „Z dd
Z dd
Z
ddZdS)Wrapper-Resolver fuer die meinecloud-Plattform.
Mehrere DLE-Family-Sites verstecken Hoster hinter dem meinecloud-Aggregator.
Diese Datei buendelt alle meinecloud-spezifische Resolver-Logik (Filme +
Serien) zentral. Gehoert in resources/lib/wrappers/ — beim Hinzufuegen
einer weiteren Wrapper-Plattform: eigenes File im gleichen Ordner anlegen.
Hinweis: Die Plattform heisst technisch meinecloud. Sites labeln sie
unterschiedlich ('Sirius', 'meinecloud', 'Server 1' etc.) — alles dasselbe.
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
WRAPPER-NUTZER — welche Sites importieren aus diesem File
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
Eine zentrale Stelle fuer alle Sites die meinecloud-Funktionen importieren
— beim Hinzufuegen/Entfernen einer Site nur HIER aktualisieren.
sites/kinoger.py — meinecloud Filme + Serien (Pattern A bzw. E1
hierarchisch mit synthetic hosterBlock)
sites/hdfilme.py — meinecloud Filme + Serien (Pattern A bzw. E2
flach mit meinecloud_url Direct-Path)
sites/fhdfilme.py — meinecloud Filme + Serien (Pattern B 2-Stage
iframe bzw. E1 hierarchisch)
sites/topstreamfilm.py — meinecloud Filme + Serien (Pattern B bzw. E1)
sites/kkiste.py — meinecloud Filme + Serien (Pattern C
(URL, Name)-Tupel mit Hostname-Fallback bzw.
E2 flach). Hat eigenen _isValidHoster-Filter
und nutzt expandHosterList/buildHosterFromUrl
NICHT — bewusst um den Filter zu erhalten.
sites/streamcloud.py — meinecloud Filme + Serien (Pattern D Multi-Mode
konvergent bzw. E2 flach)
Pattern-Legende:
Filme — Pattern A/B/C/D = unterschiedliche Site-HTML-Strukturen die
alle in resolveMeinecloud() / expandHosterList() muenden
Serien — Pattern E1 hierarchisch (showSeasons + showEpisodes +
showEpisodeHosters) bzw. E2 flach (nur showEpisodes ->
showHosters mit meinecloud_url Direct-Path)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
meinecloud (Filme — resolveMeinecloud)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
Pages: meinecloud Wrapper-URLs (Form: /movie/<imdb>)
Liefert <li ... data-link="//host.com/e/ID"> Hoster-Liste.
Erkennung im Site-HTML:
<li data-link="https://<meinecloud-host>/movie/<imdb>">LABEL</li>
Label variiert je nach Site — URL-Pattern bleibt.
Trigger in Site:
from resources.lib.wrappers.meinecloud import resolveMeinecloud, MEINECLOUD_TRIGGER
if MEINECLOUD_TRIGGER in sUrl:
for resolved in resolveMeinecloud(sUrl, referer=URL_MAIN):
...
Pattern A — Standard:
Im Hoster-Loop nach data-link-Match einen Expand-Block einbauen,
meinecloud-URLs durch resolveMeinecloud() expandieren, andere durchreichen.
Beispiel: sites/kinoger.py showHosters().
Pattern B — 2-Stage iframe:
Site fetcht erst iframe-content, dann data-link daraus. Expand-Block
INNERHALB des iframe-Branchs nach dem inneren data-link-Match.
Beispiel: sites/fhdfilme.py showHosters().
Pattern C — (URL, Name)-Tupel:
Site nutzt re.findall mit Tupel-Capture. Resolved URLs haben keinen
Site-Namen — Hostname als Fallback aus URL extrahieren.
Beispiel: sites/kkiste.py showHosters().
Pattern D — Multi-Mode konvergent:
Site hat mehrere Modi (Episode/Movie) die in einer gemeinsamen
Hoster-Loop konvergieren. Expand-Block direkt nach `if isMatch:`,
faengt alle Modi ab.
Beispiel: sites/streamcloud.py showHosters().
Filter im Resolver:
- Leere data-link (Toggle-Buttons "andere Server")
- Self-Refs auf meinecloud selbst (interne /fullhd/-Links sind Fakes,
keine echten Streams)
Adversarial-Cases (alle -> []):
- Leerer Response, Timeout, 403
- HTML ohne data-link
- HTML nur mit Self-Refs / leeren Toggles
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
meinecloud (Serien — resolveMeinecloudSerial)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
Seit ~05/2026 haben mehrere Sites Serien (z.B. Stranger Things) auf ein
DLE-Template umgestellt das die Staffel/Episoden-Daten NICHT mehr im
Detail-HTML rendert, sondern via JavaScript-Fetch von der meinecloud-Plattform
nachlaedt. Manche alte Serien (z.B. Wednesday) haben die Daten weiterhin in
'su-accordion' + 'se-ac-N' im Detail-HTML.
API-Flow:
1. Existence-Check: GET /serials.php?task=check&id_imdb=ttXXXXX
Response (JSON): {"exists":true,"player_url":"...","episode_count":N}
oder {"exists":false}
2. Falls exists=true: GET <player_url> liefert die meinecloud-Serial-Page mit
allen Staffeln/Episoden komplett auf einer Seite.
3. Episoden-Pattern im meinecloud-HTML:
data-link="//host/url" data-label="S<N> E<M> — <Titel>"
Aktueller Stand: meinecloud liefert pro Episode nur EINEN Hoster (default
dropload). Der Browser-Player macht keinen zweiten Call fuer mehr Hoster
— Architektur-bedingt ist das was wir kriegen koennen.
éN)ÚcRequestHandler)Úlogger)ÚcParserÚ
meinecloudcól|sdStjd|¦«}|rd| d¦«zSdS)uAus Site-HTML die aktuelle meinecloud-Base extrahieren.
DLE-Sites haben im Inline-JS:
fetch('https://<host>/serials.php?task=check&id_imdb=' + imdb)
Wenn die TLD wechselt (z.B. .click → .io), passt der Webmaster die
JS-URL an. Pattern bleibt aber gleich — wir extrahieren die aktuelle
Base direkt aus dem Site-HTML, kein Hardcoding noetig.
Args:
sHtml: Site-HTML (z.B. die Detail-Page einer Serie)
Returns:
'https://<host>' oder None wenn Pattern nicht gefunden.
Bei None liefert resolveMeinecloudSerial() leere Liste mit Log-
Eintrag — sauberer Fail statt Crash.
Nz7['\"]https?://([^/'\"]*meinecloud[^/'\"]*)/serials\.phpzhttps://é)ÚreÚsearchÚgroup)ÚsHtmlÚms úe/home/matthiasberner/Schreibtisch/kodi/xstreamDownloader/xstream/resources/lib/wrappers/meinecloud.pyÚ_discoverMeinecloudBasersEð" ð؈
Œ ÐLÈeÑT€AØð˜AŸGšG A™JœJÑ ˆÚcóœ t|d¬¦«}|r| d|¦«| ¦«}|stjd|z¦«gSt j|d¦«\}}|r|stjd|z¦«gSd|D¦«S#t$r$}tjd|d |¦«Yd
}~nd
}~wwxYwgS) Loest meinecloud Wrapper zu Hoster-Liste auf.
Args:
sUrl: meinecloud Wrapper-URL (aktuelle Form siehe Sektion oben)
referer: optional Referer-Header (URL der aufrufenden Site)
Returns:
list[str]: Hoster-URLs (kann leer sein, kein Crash bei Fehler).
URLs koennen protokoll-relativ sein (//host/...) — der
Caller muss Schema-Fix machen (https: prefixen).
WICHTIG fuer Caller — Schema-Fix-Pflicht:
Resolved URLs kommen oft im protokoll-relativen Format (//host/...).
ResolveURL kann mit denen NICHT umgehen — Hoster wird still verworfen
und taucht nicht in der Hoster-Liste auf (Bug-Pattern: 'mixdrop/dropload
fehlen plötzlich aus der Liste').
Caller-Code muss IMMER:
_fixedUrl = ('https:' + url) if url.startswith('//') else url
Und _fixedUrl muss ans System (link-Feld), NICHT die ungefixte URL.
Beispiel korrekt: sites/kinoger.py Z258, sites/streamcloud.py Z445.
ÚcachingÚRefererz*wrappers.meinecloud: leere Response von %szdata-link="([^"]+)"z2wrappers.meinecloud: keine data-link Treffer in %scó(g|]}|¯t|v¯
|ŒS©)ÚMEINECLOUD_TRIGGER)Ú.0Úus rú
<listcomp>z%resolveMeinecloud.<locals>.<listcomp>Æs(ÐHa HÕ,>ÀaÐ,GÐ,GÐ,GÐ,GÐ,Grzwrappers.meinecloud: z bei N) rÚaddHeaderEntryÚrequestrÚinforÚparseÚ ExceptionÚerror)ÚsUrlÚrefererÚoRequestr ÚisMatchÚaResultÚes rÚresolveMeinecloudr(žsð0Cõ
# 4°ÐØ ð × # I¨wÑ × Ò Ñ"ˆØð Ý ŒKÐDÀtÑ ˆ"œ=¨Ð0FшØð ˜gð Ý ŒKÐLÈtÑ ˆIØH˜7ÐHøÝ ðCðCðCÝŒ ˆ ¸¸¸¸D¸DÐBøøøøðCøøøà
€Is$ABÁ4BÂ BÂ
C Â%CÃC có2t¦«}g}|pgD]}|sŒt|vrEt||¬¦«D]2}|r.||vr*| |¦«| |¦«Œ3ŒS||vr*| |¦«| |¦«Œ‚|S)Hoster-Liste expandieren: meinecloud-URLs durch resolveMeinecloud() ersetzen,
andere durchreichen. Mit Dedup ueber alle Treffer.
Args:
aRawUrls: Liste roher data-link URLs aus Site-HTML
referer: optional Referer fuer den meinecloud-Request
Returns:
list[str]: deduplizierte Liste aller realen Hoster-URLs
(kann protokoll-relativ sein — Caller macht Schema-Fix
typischerweise via buildHosterFromUrl()).
)r#)Úsetrr(ÚaddÚappend)ÚaRawUrlsr#ÚseenÚexpandedr"Ú sResolvedUrls rÚexpandHosterListr1Ìõ ‰5Œ5€DØ€HؘBð

Øð Ø Ý  Ð %Ý 1°$ÀÐ HÑ HÔ Hð

2 Øð2 L¸Ð$<Ð$<Ø—HH˜—O’O LÑ1øð
˜Ð
Ð
Ø HŠHT‰NŒNˆ OŠO˜ !øØ €OrÚ720Tcóš|sdSd|vrdS| d¦«rd|z} tj|¦« d¦«d ¦«}n#t
$rd}YnwxYw|sdS ddlm}|¦« |¦«drdSn#t
$rYnwxYw|r |d |d
}n|}||||d œS) uAus einer Hoster-URL ein Standard-Hoster-Dict bauen.
Macht alle Standard-Schritte:
- YouTube-Trailer skippen
- Schema-Fix (//host/... -> https:)
- Hostname-Extract als Name
- Blocked-Hoster-Check (xStream Settings)
- Quality-Suffix optional
Args:
sUrl: Hoster-URL (kann protokoll-relativ sein)
sQuality: Quality-String fuer Anzeige + Hoster-Dict
includeQualitySuffix: True -> 'Name [I][720p][/I]', False -> nur 'Name'
Returns:
dict mit 'link', 'name', 'displayedName', 'quality' — oder None
wenn URL geskippt werden soll (YouTube/Blocked/leer/ungueltig).
youtubez//zhttps:ú.rr)ÚcConfigz [I][zp][/I])ÚlinkÚnameÚ
displayedNameÚquality) Ú
startswithrÚurlparseÚsplitÚstripr Úresources.lib.configr6ÚisBlockedHoster)r"ÚsQualityÚincludeQualitySuffixÚsNamer6r9s rÚbuildHosterFromUrlrDésCð& ð؈tØÐ؈tØ Ôðؘ$‰ˆðÝÔ  Ñ&×,¨SÑ1°!Ô4׈øÝ ðððØˆˆˆðøøøà ð؈tð
Ø ˆ7‰9Œ9× $ UÑ +¨AÔ  Ø øå ð
ð
ð
Ø ˆð
øøøàðØ-2¨U¨U°H°H°HÐ=ˆ
ˆ
àˆ
àØØð  ð ðs#¦?A&Á& A5Á4A5Á=)B)Â)
B6Â5B6c ó‚ |sgS| d¦«r
|dd}| ¦«stjd|z¦«gSt |¦«}|stjd¦«gS|d|}t |d¬¦«}|r| d |¦«| ¦«}|stjd
|z¦«gS tj |¦«}n:#ttf$r&}tjd |d |¦«gcYd}~Sd}~wwxYw|  d
¦«stjd|z¦«gS|  dd¦«} | stjd|z¦«gSt | d¬¦«}|r| d |¦«| ¦«}
|
stjd|z¦«gSd} g} tj| |
¦«D]R\}
}}}}|
sŒ |  t!|¦«t!|¦«| ¦«|
|dœ¦«ŒS| stjd|z¦«gStjdt%| ¦«|fz¦«| S#t&$r$}tjd|d|¦«Yd}~nd}~wwxYwgS)Loest meinecloud Serien-Wrapper zu Episoden-Liste auf.
Args:
sImdbId: IMDB-ID der Serie (Format 'tt1234567', mit oder ohne 'tt' prefix)
referer: optional Referer-Header (URL der aufrufenden Site)
siteHtml: Site-HTML aus dem die aktuelle meinecloud-Base extrahiert
wird (vollstaendig dynamisch, TLD-robust). MUSS gegeben sein —
ohne siteHtml returnt der Resolver leere Liste mit Log-Eintrag
(sauberer Fail statt Crash).