Files
xstreamDownloader/xstream/sites/__pycache__/tmdb_browser.cpython-311.pyc
T

189 lines
32 KiB
Plaintext
Raw Normal View History

2026-07-06 14:27:51 +02:00
§
ˆJj_pãóddlZddlZddlmZddlZddlmZddlmZddl m
Z
ddl m Z ddl
mZddlmZd Zd
Zd Zd Zd
ZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'd „Z(d!„Z)d"„Z*d#„Z+d$„Z,d%„Z-d'd&„Z.dS)(éN)Ú
quote_plus)ÚParameterHandler)Úlogger)ÚcTMDB)Ú cGuiElement)ÚcConfig)ÚcGuiÚ tmdb_browserz TMDB Browserztmdb_browser.pngFTcó6tjdtz¦«tjd¦« d¦«t
¦«}t|dd¦«t|dd¦«t|dd ¦«| ¦«d
S) Top-Menue: Filme / Serien / Schauspieler.
Kein Suche-Eintrag — die globale Suche existiert eine Ebene drueber im
xStream-Hauptmenue.
clearProperty fuer personQuery bleibt als Safety-Cleanup drin — die
Property wird seit dem Cache-Refactor nirgends mehr aktiv gesetzt
(zwang User vorher den alten Suchbegriff bei jedem 'Schauspieler'-Klick
erneut zu nehmen statt neuer Eingabe).
zLoad %sé'ú xstream.tmdb_browser.personQueryÚFilmeÚshowMoviesMenuÚSerienÚshowTVShowsMenuÚ SchauspielerÚshowPersonsMenuN) rÚinfoÚ SITE_NAMEÚxbmcguiÚWindowÚ
clearPropertyr Ú _addNavEntryÚsetEndOfDirectory)ÚoGuis úV/home/matthiasberner/Schreibtisch/kodi/xstreamDownloader/xstream/sites/tmdb_browser.pyÚloadr.sõ „K  „NÔ×'Ð(JÑ ‰6Œ6€DÝwÐ 0ÑxÐ!2Ñ~Ð'8Ñ×ÒÑÔÐÐÐócóÚtjdtz¦«t¦«}t |ddd¦«t |ddd¦«t ¦«}| dd¦«t¦«}| d¦«|  t¦«|  d ¦«|  ||¦«t |d
dd ¦«t |d dd
¦«t|dd¦«t|dd¦«t |ddd¦«t |ddd¦«t |ddd¦«| ¦«dS)u%10 Browse-Kategorien fuer Filme — analog xShip navigator.
Reihenfolge: Pinned (Neu/Im Kino) → Streaming-Anbieter → Aktuell-Tier
(Heute im Trend/Beliebt) → Browse-Tier (Genres/Jahr) → Bestenlisten-Tier
(Bestes Einspielergebnis/Am besten bewertet/Meiste Bewertungen).
z%s: showMoviesMenuÚNeuÚmovieÚkinozIm KinoÚ kinotheaterÚ
media_typeúStreaming-AnbieterÚshowStreamingProvidersúHeute im TrendÚ__trending_day__ÚBeliebtÚpopularÚGenresÚshowGenresMoviesÚJahrÚshowYearsMovieszBestes Einspielergebnisz/production_status=released&sort_by=revenue.descúAm besten bewertetÚtopratedúMeiste Bewertungenz2production_status=released&sort_by=vote_count.descN©rrrr Ú_addListingEntryrÚsetParamrÚsetTitleÚ setSiteNameÚSITE_IDENTIFIERÚ setFunctionÚ addFolderrr©rÚparamsÚels rrrHsrõ „KÐ$¥yÑ ‰6Œ6€DõT˜5 '¨6ÑT˜9 g¨}ÑÑ
Ô
€FØ
‡OOL Œ€B؇K‚KЇN‚N•?чN‚NЇN‚N2ÔÐõ+¨WÐ6HÑT˜9 g¨yÑxÐ!3Ñ4°gÐ?pѸ*ÑÐ:nÑ×ÒÑÔÐÐÐrcóÚtjdtz¦«t¦«}t |ddd¦«t |ddd¦«t |ddd¦«t ¦«}| d d¦«t¦«}| d
¦«|  t¦«|  d ¦«|  ||¦«t |d dd
¦«t|dd¦«t|dd¦«t |ddd¦«t |ddd¦«t |ddd¦«| ¦«dS)u10 Browse-Kategorien fuer Serien — analog xShip navigator.
Reihenfolge: Pinned (Neu/Laufend/Abgeschlossen) → Streaming-Anbieter →
Aktuell-Tier (Heute im Trend) → Browse-Tier (Genres/Jahr) → Bestenlisten-Tier
(Beliebt/Am besten bewertet/Meiste Bewertungen).
z%s: showTVShowsMenur ÚtvÚtvneuÚLaufendz%with_status=0&sort_by=popularity.descÚ
Abgeschlossenz%with_status=3&sort_by=vote_count.descr$r%r&r'r(r+Ú showGenresTVr-Ú showYearsTVr)zsort_by=popularity.descr/zsort_by=vote_average.descr1zsort_by=vote_count.descNr2r:s rrrssrõ „KÐ%­ Ñ ‰6Œ6€DõT˜5 $¨ÑT˜9 dÐ,SÑT˜?¨DÐ2YÑÑ
Ô
€FØ
‡OOL Œ€B؇K‚KЇN‚N•?чN‚NЇN‚N2ÔÐõ+¨TÐ3EÑx Ñv˜T˜9 dÐ,EÑÐ7RÑÐ7PÑ×ÒÑÔÐÐÐrcó\tjdtz¦«td¦«dS)u$Genre-Liste fuer Filme — TMDB-API.z%s: showGenresMoviesr!rrrÚ
_renderGenres©rrr,r,žs,å
„KÐ&­ÑÔÐÐÐrcó\tjdtz¦«td¦«dS)u%Genre-Liste fuer Serien — TMDB-API.z%s: showGenresTVr>NrErGrrrBrB¤s,å
„KÐ"¥YÑÔÐÐÐrc ó´t¦«}t|¦«}|D]#}t||d|d|dz¦«Œ$| ¦«dS)namez&with_genres=%s&sort_by=popularity.descÚid)r Ú
_getGenresr3r)r$rÚgenresÚgs rrFrFªsrÝ ‰6Œ6€DÝ
˜
Ñ
#€FØ
ðMðMˆÝ˜˜q œy¨*ØAÀAÀdÄGÑ Mô Mð Mð Mà×ÒÑÔÐÐÐrcóìd|z} t¦« |¦«}|rd|vr|dr|dSn5#t$r(}tjt
d|¦«Yd}~nd}~wwxYwgS)zøTMDB-Genre-Liste via API.
media_type: 'movie' oder 'tv'
Returns: list[dict] mit 'id' + 'name'
Bei API-Fehler/Outage: leere Liste (User sieht leeres Menue statt
eines kuratierten Fallback der beim Klick eh wieder API braucht).
z
genre/%s/listrMz: Genre-API fehlgeschlagen: N)rÚ_callÚ ExceptionrÚwarningr)r$ÚactionÚdataÚes rrLrL³ð˜zÑ
)€FðL݉wŒw}Š}˜$ˆØ ð "H Ð¨h¬Ð˜”>Ð !øøÝ ðLðLðLÝŒ½Y¸Y¸YÈÈÐKøøøøðLøøøà
€Is‡6?¿
A1Á A,Á,A1có"d|z} t¦« |d¬¦«}|r-d|vr)|dr!|d}| d¬¦«|Sn5#t$r(}t jt d|¦«Yd}~nd}~wwxYwgS) aTMDB-Watch-Provider-Liste fuer DE-Region via API.
media_type: 'movie' oder 'tv'
Returns: list[dict] mit 'provider_id', 'provider_name', 'display_priority'
sortiert nach display_priority (TMDBs eigene Reihenfolge)
Bei API-Fehler/Outage: leere Liste.
zwatch/providers/%szwatch_region=DE)Úappend_to_responseÚresultscóV| di¦« dd¦«S)display_prioritiesÚDEiç©Úget)Úps rú<lambda>z$_getWatchProviders.<locals>.<lambda>Ùs&¨¯ªÐ/CÀRÑ)HÔ)H×)LÒ)LÈTÐSVÑ)WÔ)W€r)Úkeyz%: Watch-Provider-API fehlgeschlagen: N)rrPÚsortrQrrRr)r$rSrTÚ providersrUs rÚ_getWatchProvidersrcÊð" 
.€FðU݉wŒw}Š}˜VÐ8IˆJˆØ ð Ð%¨$¨y¬/ИYœˆIØ NŠNÐWˆNÑ Ð øøÝ ðUðUðUÝŒÅiÀiÀiÐQRÐQRÐTøøøøðUøøøà
€Is‡AAÁ
B Á$BÂB có¸t¦«}| d¦«}|s>tjdtz¦«t ¦« ¦«dStjtd|d¦«t ¦«}t|¦«D]%}d|dz}t||d||¦«Œ&| ¦«dS) z•Submenu mit DE-Watch-Providern via TMDB-API.
Klick auf einen Provider fuehrt zu Listings mit
with_watch_providers=<id>&watch_region=DE.
r$z*%s: showStreamingProviders ohne media_typeNz: showStreamingProviders (ú)z?with_watch_providers=%d&watch_region=DE&sort_by=popularity.descÚ provider_idÚ
provider_name)
rÚgetValuerrRrr rrrcr3)r^r$rÚprovÚurls rr&r&àõ ÑÔ€AؘLÑ)€JØ ðÝŒÐCÅiÑ Œ× Ò ÑˆÝ
„KµY°Y°YÀ
À
À
Ð ‰6Œ6€DÝ" GðGˆØOÐRVÐWdÔReÑݘ˜t 4°jÀ#Ñ×ÒÑÔÐÐÐrcó\tjdtz¦«td¦«dS)u2Jahr-Liste fuer Filme — aktuelles Jahr bis 1910.z%s: showYearsMoviesr!rrrÚ _renderYearsrGrrr.r.øs,å
„KÐ%­ ÑÑÔÐÐÐrcó\tjdtz¦«td¦«dS)u3Jahr-Liste fuer Serien — aktuelles Jahr bis 1950.z%s: showYearsTVr>NrlrGrrrCrCþs,å
„KÐ!¥IÑÑÔÐÐÐrcó t¦«}tj ¦«j}|dkrd}d}nd}d}t ||dz
d¦«D]$}t |t
|¦«|||z¦«Œ%| ¦«dS)Nr!z/primary_release_year=%s&sort_by=vote_count.descivz.first_air_date_year=%s&sort_by=vote_count.descižééÿÿÿÿ)r ÚdatetimeÚtodayÚyearÚranger3Ústrr)r$rÚ current_yearÚparamÚ
start_yearrts rrmrmsÝ ‰6Œ6€DÝÔ1€LØÐØØˆ
ˆ
à@ˆØˆ
Ýl J°¡N°BÑDðDˆÝ˜s 4™yœy¨*°e¸d±lÑ×ÒÑÔÐÐÐrcóºt¦«}| d¦«}| d¦«}t| d¦«pd¦«}|r|s>tjdt
z¦«t
¦« ¦«dS|dkr*d|z}t¦«  ||d ¬
¦«}n9t||¦«}d |z}t¦«  |||¬
¦«}|r d |vs|d sBtj d
t
|||fz¦«t
¦« ¦«dSt
¦«}|d D]}t|||¦«Œt| 
dd¦«¦«} || kr|dkrt||||dz| ¦«| ¦«dS)zùGenerischer TMDB-discover-Renderer.
URL-Params (via ParameterHandler):
media_type: 'movie' oder 'tv'
url: TMDB-discover-Parameter ODER Keyword (kino/kinotheater/popular/toprated/tvneu)
page: Seitenzahl (default '1')
r$Útmdb_urlÚ tmdb_pageÚ1z)%s: showListings ohne media_type/tmdb_urlNr(ztrending/%s/dayÚ)ÚpageÚtermz discover/%srXz$%s: keine Treffer fuer %s/%s page %dÚ total_pagesrpéô)rrhÚintrrRrr rrÚgetUrlÚ_resolveListingUrlrÚ_renderListingItemr]Ú_addPaginationEntry)
r^r$Úraw_urlrrSrTÚ discover_urlrÚitemrs
rÚ showListingsrõ ÑÔ€AؘLÑ)€JØjŠj˜Ñ$€GÝ ˆqzŠz˜-¨#Ñ .€Dà ð˜WðÝŒÐBÅYÑ Œ× Ò ÑˆðÐ" /ˆÝ‰wŒw~Š~˜f¨4°bˆ~Ñ9ˆˆõ*¨'°:Ñ>ˆ Ø Ñ+ˆÝ‰wŒw~Š~˜f¨4°lˆ~Ñà ð9 DаY´ÐŒ Ð:½iÈÐU\Ð^bÐ=cÑ Œ× Ò Ñˆå ‰6Œ6€DØY”ðݘ4  zÑd—hh˜}¨aÑ1€KØ ˆkÒИd Sšj˜jݘD *¨g°t¸a±xÀÑ×ÒÑÔÐÐÐrcó
tj ¦«}| d¦«}|dkr5|tjd¬¦«z
 d¦«}d|d|d}n¼|dkr5|tjd ¬¦«z
 d¦«}d|d|d
}n|d kr5|tjd ¬¦«z
 d¦«}d|d|d
}nF|dkrd}n=|dkr5|tjd¬¦«z
 d¦«}d|d|d}n|}g}t ¦« d¦«dkrd|vrd|vr| d¦«d|vr| d¦«|dkrd|vr| d¦«d|vr| d¦«|dkr d |vrd!|vr| d"|z¦«|r|d#zd# |¦«zS|S)$aKeyword (kino/kinotheater/popular/toprated/tvneu) zu echter Discover-URL.
Andere URLs sind direkte TMDB-discover-Parameter und werden durchgereicht.
Plus: ergaenzt fehlende Quality-Filter (analog xShip listings.py L191) damit
keine russischen No-Name-Filme oder Adult-Content auftauchen:
- region=DE (nur wenn tmdb_lang=de)
- include_adult=false
- include_video=false (movie only)
- vote_count.gte=20 (mindestens 20 Bewertungen)
- release_date.lte=heute (movie + with_release_type)
z%Y-%m-%dr"é)Údayszrelease_date.gte=z&release_date.lte=z2&with_release_type=4|5|6&sort_by=release_date.descr#é<z.&with_release_type=2|3&sort_by=popularity.descr*éZz0&with_release_type=4|5|6&sort_by=popularity.descr0zDwith_release_type=4|5|6&vote_count.gte=250&sort_by=vote_average.descr?zfirst_air_date.gte=z&first_air_date.lte=z&sort_by=first_air_date.descÚ tmdb_langÚdez
watch_region=zregion=z region=DEzinclude_adult=zinclude_adult=falser!zinclude_video=zinclude_video=falsezvote_count.gte=zvote_count.gte=20Úwith_release_typezrelease_date.ltezrelease_date.lte=%sú&)rrrsÚstrftimeÚ timedeltarÚ
getSettingÚappendÚjoin)rˆr$rsÚ today_strÚagoÚbaseÚextrass rr…r…Cs‡õ
Ô × %€Eؘ*€IðÐØ•xÔ)¨rÐ2×<¸HˆˆØnqÐnqÐnqÐs|Ðs|Ðs|Ð}ˆˆØ MÒ !Ð !Ø•xÔ)¨rÐ2×<¸HˆˆØjmÐjmÐjmÐoxÐoxÐoxÐyˆˆØ Ð Ø•xÔ)¨rÐ2×<¸HˆˆØloÐloÐloÐqzÐqzÐqzÐ{ˆˆØ Ð ØˆØ Ð Ø•xÔ)¨rÐ2×<¸HˆˆØ\_Ð\_Ð\_ÐajÐajÐajÐkˆˆàˆð€Fõy„y×Ò˜KÑ(¨DÒ0°_ÈDÐ5PÐ5PÐU^ÐfjÐUjÐUjØ
Š
˜
Š
ÐÐÐ!1¸Ð!=Ð!=Ø
Š
РÐ
Š
ÐÐÐ!4¸Ð!<Ð!<ÐASÐ[_ÐA_ÐA_Ø
Š
Ð+¨iÑ
ðc‰z˜CŸHšH  €Krcó<|dkr/| dd¦«}| dd¦«}d}n.| dd¦«}| dd¦«}d}|sdS|r
|dd …nd}t|¦«}|sdSt¦«}| |r|d
|d n|¦«| t
¦«| d ¦«| |¦«|r| |¦«| d
d¦«} | r|  | ¦«| d¦«r| 
d|dz¦«| d¦«r|  d|dz¦«|t| dd¦«¦«|dœ}
| 
|
¦«t¦«} |  d|¦«| || d¬¦«dS)TMDB-Result als GuiElement rendern.
Klick fuehrt direkt zu xStream's 'searchAlter' (Weitere Quellen) — das ist
die existierende System-Funktion die durch alle aktivierten Plugins sucht.
searchAlter cuttet selbst Klammer-Jahr + S0/E0/Staffel-Tokens. Wir cleanen
vorher Doppelpunkt + Em-Dash (das macht searchAlter nicht).
setMediaType triggert xStream's __createContextMenu fuer Trailer + Erweiterte Info.
r!Útitler~Ú release_daterJÚfirst_air_dateÚtvshowNéz (reÚ searchAlterÚoverviewÚ poster_pathú!https://image.tmdb.org/t/p/w500%sÚ
backdrop_pathz"https://image.tmdb.org/t/p/w1280%srK)Útmdb_idrtÚ searchTitleT©Ú bIsFolder)r]Ú_cleanTitleForSearchrr5r6r7r8Ú setMediaTypeÚsetYearÚsetDescriptionÚ setThumbnailÚ setFanartrvÚ
setItemValuesrr4r9) rr$ÚdateÚgui_media_typertÚ sCleanTitler<Ú
itemValuesr^s rr†r†ysBðÐØ˜ "ÑØxŠx˜¨ÑØ ˆˆà˜ ÑØxŠxÐ(¨"ÑØà ð؈àÐ #ˆ4Œ8ˆ8 €Dõ' -€KØ ðØˆå Œ€B؇K‚K¨TÐ<˜U˜U˜U D D )°uчN‚N•?чN‚N‡O‚O ðØ
Š
ÔÐðxŠx˜
 '€HØð
×Ò˜(Ñ ‡x‚x
ÑÔðSØ
ŠÐ;¸dÀ=Ô>QÑ ‡x‚xÑ Ô ðSØ
Š Ð9¸Ô<QÑÝt—x’x  bÑðð€Jð
×Ò Ô Ð õ ÑÔ€A؇J‚Jˆ}˜kчNN2q D€NÑ)rcóšt¦«}| d||fz¦«| t¦«| d¦«t ¦«}| d|¦«| d|¦«| dt|¦«¦«| ||¦«dS)z%Naechste-Seite-Eintrag am Listenende.õNächste Seite (%d / %d)rr$r{r|N© rr5r6r7r8rr4rvr9)rr$rˆÚ next_pagerr<r^s rr‡r‡¸å Œ€B؇K‚KÐ*¨i¸Ð-EчN‚N•?чNNÑÔ€A؇J‚Jˆ|˜ZчJ‚Jˆz˜7чJ‚Jˆ{C  ™NœNчN‚N2ÔÐÐÐrcó\t¦«}| d¦«}t| d¦«pd¦«}tjd¦«}|su| d¦«}|r"|}t
jtd|d¦«n<t¦« 
d¬ ¦«}|sd
S|  d|¦«t
jd t||fz¦«t¦« 
d d
t|¦«|fz¦«}|r d|vs|dsVt
jtd|d¦«| d¦«t¦« ¦«d
St¦«}d}|dD]1}| d¦«dkrŒt%||¦«|dz
}Œ2t| dd¦«¦«} || kr|dkrt'|||dz| ¦«| ¦«d
S)uBSchauspieler-Suche -> Personen-Liste -> Filmography -> searchAlter.
Pagination via URL-Param 'query' (Naechste-Seite-Eintrag traegt das mit).
Direkter Klick auf 'Schauspieler' im Top-Menue: Cache pruefen — wenn
vorhanden, cached Begriff nutzen (Detail-Zurueck zeigt direkt Treffer).
Sonst Tastatur.
Úqueryr|r}r r
z!: showPersonsMenu Cache-Treffer "ú"zSchauspieler-Suche)ÚsHeadingNz&%s: showPersonsMenu query="%s" page=%dz
search/personzquery=%s&page=%drXz: keine Personen-Treffer fuer "rÚknown_for_departmentÚActingrprr)rrhrrÚ getPropertyrrrr Ú showKeyBoardÚ setPropertyrrPrrrr]Ú_renderPersonItemÚ_addPersonPaginationEntry)
r^ÚsQueryrÚwinÚcachedrTrÚrenderedÚpersonrs
rrrÉs>õ ÑÔ€AØ
ZŠZ˜Ñ
Ô