Merge pull request 'Use API All domains as search sources' (#8) from DAP-86-hinzuf-gen-weiterer-streaming-domains into main

Reviewed-on: #8
This commit was merged in pull request #8.
This commit is contained in:
2026-08-26 17:35:12 +00:00

View File

@@ -8,6 +8,7 @@
import re import re
import xbmcgui import xbmcgui
from concurrent.futures import ThreadPoolExecutor, as_completed
from urllib.parse import urlparse from urllib.parse import urlparse
from resources.lib.handler.ParameterHandler import ParameterHandler from resources.lib.handler.ParameterHandler import ParameterHandler
@@ -60,6 +61,42 @@ def _get_configured_domain():
return _get_default_domain() return _get_default_domain()
def _get_search_domains():
domains = []
configured = _get_configured_domain()
if configured:
domains.append(configured)
for entry in API_ALL_DOMAINS:
domain = entry['domain']
if domain not in domains:
domains.append(domain)
return domains
def _fetch_movies_for_domain(domain, sLang):
oRequest = cRequestHandler(
'https://' + domain + '/data/browse/?lang=%s&order_by=%s&page=%s&limit=0' % (sLang, 'new', '1'),
caching=True
)
oRequest.addHeaderEntry('Referer', 'https://' + domain + '/')
oRequest.addHeaderEntry('Origin', 'https://' + domain + '/')
oRequest.cacheTime = 60 * 60 * 48
sJson = oRequest.request()
aJson = loads(sJson)
movies = aJson.get('movies', [])
return movies if isinstance(movies, list) else []
def _movie_signature(movie):
return (
str(movie.get('_id', '')).strip(),
str(movie.get('title', '')).strip().lower(),
str(movie.get('year', '')).strip(),
)
SITE_NAME = 'API Suchmaschine' SITE_NAME = 'API Suchmaschine'
SITE_ICON = 'api.png' SITE_ICON = 'api.png'
SITE_IDENTIFIER = 'api_all' SITE_IDENTIFIER = 'api_all'
@@ -623,13 +660,30 @@ def loadMoviesData():
sLang = '3' sLang = '3'
try: try:
oRequest = cRequestHandler(URL_SEARCH % (sLang, 'new', '1'), caching=True) merged_movies = {}
oRequest.addHeaderEntry('Referer', REFERER) domains = _get_search_domains()
oRequest.addHeaderEntry('Origin', ORIGIN)
oRequest.cacheTime = 60 * 60 * 48 # HTML Cache Zeit 2 Tage with ThreadPoolExecutor(max_workers=min(8, len(domains) or 1)) as executor:
sJson = oRequest.request() futures = {
apiJson = loads(sJson) executor.submit(_fetch_movies_for_domain, domain, sLang): domain
logger.info('API-Daten erfolgreich geladen') for domain in domains
}
for future in as_completed(futures):
domain = futures[future]
try:
movies = future.result()
except Exception:
logger.info('API-Daten konnten von %s nicht geladen werden' % domain)
continue
for movie in movies:
if not isinstance(movie, dict) or '_id' not in movie:
continue
merged_movies.setdefault(_movie_signature(movie), movie)
apiJson = {'movies': list(merged_movies.values())}
logger.info('API-Daten erfolgreich aus %d Domains geladen' % len(domains))
except: except:
logger.error('Fehler beim Laden der API-Daten') logger.error('Fehler beim Laden der API-Daten')
apiJson = {'movies': []} apiJson = {'movies': []}