Merge pull request 'Extract API domain registry' (#7) from DAP-86-hinzuf-gen-weiterer-streaming-domains into main

Reviewed-on: #7
This commit was merged in pull request #7.
This commit is contained in:
2026-08-26 17:18:36 +00:00
3 changed files with 165 additions and 4 deletions

View File

@@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@@ -0,0 +1,122 @@
# -*- coding: utf-8 -*-
# Python 3
API_ALL_DOMAINS = (
{
'label': 'BS.to',
'domain': 'bs.to',
'url': 'https://bs.to/',
},
{
'label': 'Cine.to',
'domain': 'cine.to',
'url': 'https://cine.to/',
},
{
'label': 'Filmpalast.to',
'domain': 'filmpalast.to',
'url': 'http://filmpalast.to/',
},
{
'label': 'HDFilme.tv',
'domain': 'hdfilme.tv',
'url': 'http://hdfilme.tv/',
},
{
'label': 'HDFilme',
'domain': 'hdfilme.me',
'url': 'https://hdfilme.me/',
},
{
'label': 'KinoDogs.to',
'domain': 'kinodogs.to',
'url': 'https://kinodogs.to/',
},
{
'label': 'Kinokiste',
'domain': 'kinokiste.eu',
'url': 'https://kinokiste.eu/',
},
{
'label': 'Kinoz',
'domain': 'kinoz.org',
'url': 'https://kinoz.org/',
},
{
'label': 'KinoGer.com',
'domain': 'kinoger.com',
'url': 'https://kinoger.com/',
},
{
'label': 'KinoX.to',
'domain': 'kinox.to',
'url': 'https://kinox.to/',
},
{
'label': 'KKiste',
'domain': 'kkiste.eu',
'url': 'https://kkiste.eu/',
},
{
'label': 'KKiste.ag',
'domain': 'kkiste.ag',
'url': 'http://www.kkiste.ag/',
},
{
'label': 'Movie2k',
'domain': 'movie2k.ch',
'url': 'https://movie2k.ch/',
},
{
'label': 'Movie4k',
'domain': 'movie4k.sx',
'url': 'https://movie4k.sx/',
},
{
'label': 'Movie4k.org',
'domain': 'movie4k.org',
'url': 'http://movie4k.org/',
},
{
'label': 'MovieTown.org',
'domain': 'movietown.org',
'url': 'https://movietown.org/',
},
{
'label': 'MovieDream.co',
'domain': 'moviedream.co',
'url': 'https://moviedream.co/',
},
{
'label': 'S.to',
'domain': 's.to',
'url': 'https://s.to/',
},
{
'label': 'Stream.to',
'domain': 'stream.to',
'url': 'https://stream.to/de',
},
{
'label': 'StreamWorld.to',
'domain': 'streamworld.to',
'url': 'http://streamworld.to/',
},
{
'label': 'Streamcloud',
'domain': 'streamcloud.sx',
'url': 'https://streamcloud.sx/',
},
{
'label': 'StreamKiste',
'domain': 'streamkiste.sx',
'url': 'https://streamkiste.sx/',
},
{
'label': 'XCine',
'domain': 'xcine.io',
'url': 'https://xcine.io/',
},
)
API_ALL_DEFAULT_DOMAIN = 'kinokiste.eu'

View File

@@ -8,6 +8,8 @@
import re
import xbmcgui
from urllib.parse import urlparse
from resources.lib.handler.ParameterHandler import ParameterHandler
from resources.lib.handler.requestHandler import cRequestHandler
from resources.lib.tools import logger, cParser, cUtil
@@ -16,17 +18,53 @@ from resources.lib.config import cConfig
from resources.lib.gui.gui import cGui
from json import loads
from datetime import datetime
from resources.lib.data.api_all_domains import API_ALL_DOMAINS, API_ALL_DEFAULT_DOMAIN
# Globale Variable für die JSON-Daten
apiJson = None
# Domain Abfrage ###
def _normalize_domain(value):
if not value:
return ''
parsed = urlparse(value)
if parsed.hostname:
return parsed.hostname.lower()
return value.strip().lower()
def _get_default_domain():
registry = _get_domain_registry()
if API_ALL_DEFAULT_DOMAIN in registry:
return API_ALL_DEFAULT_DOMAIN
if API_ALL_DOMAINS:
return API_ALL_DOMAINS[0]['domain']
return API_ALL_DEFAULT_DOMAIN
def _get_domain_registry():
return {entry['domain']: entry for entry in API_ALL_DOMAINS}
def _get_configured_domain():
registry = _get_domain_registry()
configured = _normalize_domain(
cConfig().getSetting('plugin_' + SITE_IDENTIFIER + '.domain', _get_default_domain())
)
if configured in registry:
return configured
return _get_default_domain()
SITE_NAME = 'API Suchmaschine'
SITE_ICON = 'api.png'
SITE_IDENTIFIER = 'api_all'
DOMAIN = cConfig().getSetting('plugin_' + SITE_IDENTIFIER + '.domain', 'movie4k.sx')
DOMAIN = _get_configured_domain()
STATUS = cConfig().getSetting('plugin_' + SITE_IDENTIFIER + '_status') # Status Code Abfrage der Domain
ACTIVE = cConfig().getSetting('plugin_' + SITE_IDENTIFIER) # Ob Plugin aktiviert ist oder nicht
ORIGIN = 'https://' + DOMAIN + '/'
@@ -367,7 +405,7 @@ def showEntries(entryUrl=False, sGui=False, sSearchText=False):
oGuiElement.setLanguage('EN')
oGuiElement.setMediaType('tvshow' if isTvshow else 'movie')
if 'runtime' in movie:
isMatch, sRuntime = cParser.parseSingleResult(movie['runtime'], '\d+')
isMatch, sRuntime = cParser.parseSingleResult(movie['runtime'], r'\d+')
if isMatch:
oGuiElement.addItemValue('duration', sRuntime)
params.setParam('entryUrl', URL_WATCH % str(movie['_id']))
@@ -564,7 +602,7 @@ def SSsearch(sGui=False, sSearchText=False):
oGuiElement.setLanguage('EN')
oGuiElement.setMediaType('tvshow' if isTvshow else 'movie')
if 'runtime' in movie:
isMatch, sRuntime = cParser.parseSingleResult(movie['runtime'], '\d+')
isMatch, sRuntime = cParser.parseSingleResult(movie['runtime'], r'\d+')
if isMatch:
oGuiElement.addItemValue('duration', sRuntime)
params.setParam('entryUrl', URL_WATCH % str(movie['_id']))
@@ -598,4 +636,4 @@ def loadMoviesData():
# Daten werden lazy beim ersten Zugriff geladen (siehe SSsearch)
# loadMoviesData() - entfernt: beschleunigt den Import/Start erheblich
# loadMoviesData() - entfernt: beschleunigt den Import/Start erheblich