streamxstream / plugin.video.xstream

GNU General Public License v3.0
112 stars 61 forks source link

Feature Anfrage CineClix #157

Closed TimeLance89 closed 11 months ago

TimeLance89 commented 11 months ago

Hallo ist es möglich den Streamanbieter CineClix zu integrieren? Es ist der Anbieter von movie-stream.eu mit seinem neuen Projekt, es bedarf also nicht sehr viele Änderungen des Codes von movie-stream.eu

Hier die URL des Projekts: https://cineclix.de/

kasi45 commented 11 months ago

Eine "DE" domain - da kommen bei mir Fragen auf! mit vielen "!!!!!" Nicht nur das die Seite sehr nach "stumbleupon.tv" aussieht auch: Name: vwp2781.webpack.hosteurope.de Address: 87.230.43.35

kasi45 commented 11 months ago

cineclick.de

Diese Webpräsenz befindet sich noch im Aufbau. Bitte versuchen Sie es zu einem späteren Zeitpunkt noch einmal. This site is currently under construction. Please try again later.

TimeLance89 commented 11 months ago

stumbleupon.tv ist ein ABKLATSCH von movie-stream.eu ebenfalls ein Abklatsch ist https://moflix-stream.xyz/ es gab damals nur ein Portal in dem Stil und das war immer movie-stream.eu

Das Original ist und war schon immer movie-stream.eu gab es meines Wissens deutlich länger als stumbleupon.tv

MartinX3 commented 11 months ago

Bei mir ist "movie-stream.eu" tot und von einer Werbeseite ersetzt bzw. durch uBlock origin blockiert.

TimeLance89 commented 11 months ago

Ja das Projekt wurde damals eingestellt, der betreiber von cineclix ist der alte Betreiber von movie-stream.eu

Es war mal in xstream vorhanden weil die Qualität echt gut war. Daher meine Frage dazu

kasi45 commented 11 months ago

was ich an den Aussagen von @TimeLance89 bestätigen kann - cineclick.de, stumbleupon.tv und moflix-stream.xyz nutzen fast vollständig die gleichen Funktionen intern und den gleichen Seitenaufbau. moflix-stream.xyz hat zusätzliche Schutzfunktion hinzugefügt. (debug)

TimeLance89 commented 11 months ago

Ich habe noch eine alte Version von xStream gefunden wo MovieStream enthalten war, vielleicht hilft das ja weiter:

`# -- coding: utf-8 -- from resources.lib import logger from resources.lib.gui.gui import cGui from resources.lib.gui.guiElement import cGuiElement from resources.lib.handler.ParameterHandler import ParameterHandler from resources.lib.handler.requestHandler import cRequestHandler from resources.lib.parser import cParser

SITE_IDENTIFIER = 'moviestream' SITE_NAME = 'MovieStream' SITE_ICON = 'moviestream.png' URL_MAIN = 'https://movie-stream.eu/' URL_FILME = 'https://movie-stream.eu/secure/titles?type=movie&onlyStreamable=true' URL_SERIE = 'https://movie-stream.eu/secure/titles?type=series&onlyStreamable=true' URL_HOSTER = URL_MAIN + 'secure/titles/%s?titleId=%s' URL_SEARCH = URL_MAIN + 'secure/search/%s?type=&limit=20' URL_GENRES_LIST = {'Drama' : 'drama', 'Action' : 'action', 'Thriller' : 'thriller', 'Science Fiction' : 'science fiction', 'Horror' : 'horror', 'Mystery' : 'mystery', 'Komoedie' : 'komoedie', 'Liebesfilm' : 'liebesfilm', 'Disney' : 'disney', 'Bollywood' : 'bollywood', 'Kino' : 'kino'} URL_GENRES_FILME = 'https://movie-stream.eu/secure/titles?type=movie&genre=%s' URL_GENRES_SERIE = 'https://movie-stream.eu/secure/titles?type=series&genre=%s'

def load(): logger.info("Load %s" % SITE_NAME) params = ParameterHandler() params.setParam('page', (1)) params.setParam('sUrl', URL_FILME) cGui().addFolder(cGuiElement('Filme', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('Genre', URL_GENRES_FILME) cGui().addFolder(cGuiElement('Film Genre', SITE_IDENTIFIER, 'showGenre'), params) params.setParam('sUrl', URL_SERIE) cGui().addFolder(cGuiElement('Serien', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('Genre', URL_GENRES_SERIE) cGui().addFolder(cGuiElement('Serien Genre', SITE_IDENTIFIER, 'showGenre'), params) cGui().addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch')) cGui().setEndOfDirectory()

def showGenre(): params = ParameterHandler() Genre = params.getValue('Genre') for key in sorted(URL_GENRES_LIST): params.setParam('sUrl', (Genre % URL_GENRES_LIST[key])) cGui().addFolder(cGuiElement(key, SITE_IDENTIFIER, 'showEntries'), params) cGui().setEndOfDirectory()

def showEntries(entryUrl=False, sGui=False): oGui = sGui if sGui else cGui() params = ParameterHandler() if not entryUrl: entryUrl = params.getValue('sUrl') iPage = int(params.getValue('page')) if iPage > 0: entryUrl = entryUrl + ('&' if '?' in entryUrl else '?') + 'page=' + str(iPage) oRequest = cRequestHandler(entryUrl, ignoreErrors=(sGui is not False)) oRequest.addHeaderEntry('Referer', params.getValue('sUrl')) sHtmlContent = oRequest.request() pattern = '"id":([\d]+).?"name":"([^"]+).?year":([\d]+).?description":"([^"]+).?poster":"([^"]+).?backdrop":"([^"]+)","runtime":([\d]+).?is_series":([^"]+)' isMatch, aResult = cParser().parse(sHtmlContent, pattern)

if not isMatch:
    if not sGui: oGui.showInfo()
    return

total = len(aResult)
for sUrl, sName, sYear, sDesc, sThumbnail, sFanart, runtime, isserie in aResult:
    isTvshow = True if "true" in isserie else False
    oGuiElement = cGuiElement(sName, SITE_IDENTIFIER, 'showSeasons' if isTvshow else 'showHosters')
    oGuiElement.setThumbnail(sThumbnail)
    oGuiElement.setFanart(sFanart)
    oGuiElement.setYear(sYear)
    oGuiElement.setDescription(sDesc)
    oGuiElement.addItemValue('duration', int(runtime) * 60)
    oGuiElement.setMediaType('tvshow' if isTvshow else 'movie')
    params.setParam('entryUrl', URL_HOSTER % (sUrl, sUrl))
    params.setParam('sThumbnail', sThumbnail)
    params.setParam('sName', sName)
    oGui.addFolder(oGuiElement, params, isTvshow, total)
if not sGui:
    isMatch, strPage = cParser().parseSingleResult(sHtmlContent, 'last_page":([\d]+)')
    if isMatch:
        if float(int(strPage)) > iPage:
            params.setParam('page', (iPage + 1))
            oGui.addNextPage(SITE_IDENTIFIER, 'showEntries', params)
    oGui.setView('tvshows' if 'true' in isserie else 'movies')
    oGui.setEndOfDirectory()

def showSeasons(): params = ParameterHandler() sUrl = params.getValue('entryUrl') sThumbnail = params.getValue('sThumbnail') sTVShowTitle = params.getValue('sName') sHtmlContent = cRequestHandler(sUrl).request() pattern = 'number":([\d]+)' isMatch, aResult = cParser().parse(sHtmlContent, pattern)

if not isMatch:
    cGui().showInfo()
    return

isDesc, sDesc = cParser.parse(sHtmlContent, 'description","content":"([^"]+)')
total = len(aResult)
for sSeasonNr in aResult:
    oGuiElement = cGuiElement('Staffel ' + sSeasonNr, SITE_IDENTIFIER, 'showEpisodes')
    oGuiElement.setMediaType('season')
    oGuiElement.setTVShowTitle(sTVShowTitle)
    oGuiElement.setSeason(sSeasonNr)
    oGuiElement.setThumbnail(sThumbnail)
    oGuiElement.setFanart(sThumbnail)
    if isDesc:
        oGuiElement.setDescription(sDesc[0])
    params.setParam('sSeasonNr', sUrl + '&seasonNumber=' + sSeasonNr)
    cGui().addFolder(oGuiElement, params, True, total)
cGui().setView('seasons')
cGui().setEndOfDirectory()

def showEpisodes(): params = ParameterHandler() sSeasonNr = params.getValue('sSeasonNr') sHtmlContent = cRequestHandler(sSeasonNr).request() pattern = 'id":\d+,"name":"([^"]+)","description":"([^"]+).?poster":"([^"]+).?episode_number":([\d]+)' isMatch, aResult = cParser().parse(sHtmlContent, pattern)

if not isMatch:
    cGui().showInfo()
    return

total = len(aResult)
for sName, sDesc, sThumbnail, sEpisodeNr in aResult:
    oGuiElement = cGuiElement(sName, SITE_IDENTIFIER, 'showHosters')
    oGuiElement.setMediaType('sEpisodeNr')
    oGuiElement.setThumbnail(sThumbnail)
    oGuiElement.setFanart(sThumbnail)
    oGuiElement.setDescription(sDesc)
    params.setParam('entryUrl', sSeasonNr + '&episodeNumber=' + sEpisodeNr)
    cGui().addFolder(oGuiElement, params, False, total)
cGui().setView('episodes')
cGui().setEndOfDirectory()

def showSearchEntries(entryUrl=False, sGui=False, sSearchText=False): oGui = sGui if sGui else cGui() params = ParameterHandler() if not entryUrl: entryUrl = params.getValue('sUrl') oRequest = cRequestHandler(entryUrl, ignoreErrors=(sGui is not False)) oRequest.addHeaderEntry('Referer', params.getValue('sUrl')) sHtmlContent = oRequest.request() pattern = '"id":([^,]+),"name":"([^"]+)","year":([\d,]+),"description":"([^"]+)","poster":"([^"]+)","is_series":([^,]+).*?type":"title' isMatch, aResult = cParser().parse(sHtmlContent, pattern)

if not isMatch:
    if not sGui: oGui.showInfo()
    return

total = len(aResult)
for sUrl, sName, sYear, sDesc, sThumbnail, isserie in aResult:
    if sSearchText and not cParser().search(sSearchText, sName):
        continue
    isTvshow = True if "true" in isserie else False
    oGuiElement = cGuiElement(sName, SITE_IDENTIFIER, 'showSeasons' if isTvshow else 'showHosters')
    oGuiElement.setThumbnail(sThumbnail)
    oGuiElement.setFanart(sThumbnail)
    oGuiElement.setYear(sYear)
    oGuiElement.setDescription(sDesc)
    oGuiElement.setMediaType('tvshow' if isTvshow else 'movie')
    params.setParam('entryUrl', URL_HOSTER % (sUrl, sUrl))
    params.setParam('sThumbnail', sThumbnail)
    params.setParam('sName', sName)
    oGui.addFolder(oGuiElement, params, isTvshow, total)
if not sGui:
    isMatch, strPage = cParser().parseSingleResult(sHtmlContent, 'last_page":([\d]+)')
    if isMatch:
        if float(int(strPage)) > iPage:
            params.setParam('page', (iPage + 1))
            oGui.addNextPage(SITE_IDENTIFIER, 'showEntries', params)
    oGui.setView('tvshows' if 'true' in isserie else 'movies')
    oGui.setEndOfDirectory()

def showHosters(): sUrl = ParameterHandler().getValue('entryUrl') sHtmlContent = cRequestHandler(sUrl).request() pattern = 'id":\d+,"name":"([^"]+)","thumbnail.*?url":"([^"]+)' isMatch, aResult = cParser().parse(sHtmlContent, pattern) hosters = [] if isMatch: for sName, sUrl in aResult: if not 'youtube' in sUrl: hoster = {'link': sUrl, 'name': sName} hosters.append(hoster) if hosters: hosters.append('getHosterUrl') return hosters

def getHosterUrl(sUrl=False): return [{'streamUrl': sUrl, 'resolved': False}]

def showSearch(): sSearchText = cGui().showKeyBoard() if not sSearchText: return _search(False, sSearchText) cGui().setEndOfDirectory()

def _search(oGui, sSearchText): showSearchEntries(URL_SEARCH % sSearchText, oGui, sSearchText) `

Heptamer commented 11 months ago

Danke für den Hinweis. Wir warten erst mal ab ob sich die Seite mit einer .de Domain überhaupt länger als ein paar Tage halten wird. Dann kann man weiter sehen.

DWH-WFC commented 11 months ago

Ich experimentiere auch schon mit Stumbleupon und Moflix.

DWH-WFC commented 11 months ago

Also den Scraper für CineClix habe ich fertig genauso wie Stumbleupon werde jetzt noch Moflix machen und dann schauen wir mal ob wir das veröffentlichen.

kasi45 commented 11 months ago

also https://cineclix.de ist seit gestern Abend offline kurz davor war zu sehen das ein Umbau auf der Seite stattfand und etwas später -> Off

TimeLance89 commented 11 months ago

Also bei mir ist die Webseite wieder online, sieht aus als wäre sie komplett neu gestaltet worden

kasi45 commented 11 months ago

Ja, Seite geht wieder, aber mit vielen Fehlern. ich habe noch keine Serie gefunden wo ein stream ging - es kommt immer interner server error 500 da sind also noch einige baustellen

TimeLance89 commented 11 months ago

Ist mir auch aufgefallen, liegt aber an supervideo also am streamanbieter die voe links sind alles astrein

kasi45 commented 11 months ago

https://github.com/streamxstream/plugin.video.xstream/assets/18262216/22080811-147f-40f8-94ef-a31946bd9d21

im video funzt supervideo

DWH-WFC commented 11 months ago

Nach der Änderung der Seite bleibt es erstmal nur auf der ToDo Liste und wir sehen ob sich die Seite entwickelt oder offline geht

TimeLance89 commented 11 months ago

Ich habe gestern im Kontakt mit der Webseite gestanden von cineclix um zu erfragen ob dies der entgültige Entwurf ist, hier die Antwort:

"Vielen Dank für Ihre Anfrage. Um unsere Marktposition weiterhin zu festigen und uns von der Konkurrenz abzuheben, haben wir eine strategische Umstrukturierung vorgenommen. Des Weiteren wurden das Frontend und Backend sowohl zur internen Optimierung als auch zur Steigerung der Benutzererfahrung überarbeitet. Die positiven Rückmeldungen bestätigen unsere Entscheidung, sodass dieses Design als unser finale Version festgelegt wurde.

Wir hoffen, dass es Ihnen gefällt und wünschen Ihnen eine angenehme Nutzung."

DWH-WFC commented 11 months ago

In der xStream 4.0.7 Nightly 3 enthalten. Das SitePlugin ist experimentell und muss selbst aktiviert werden.

TimeLance89 commented 11 months ago

IMG_20230816_184325

Bei jedem Titel den ich versuche abzuspielen mit cineclix

DWH-WFC commented 11 months ago

Wenn die Idioten bei dem Webseiten Theme geblieben wären würde es auch laufen.

TimeLance89 commented 11 months ago

Bei mir sieht es tatsächlich unverändert aus, hm na gut vielleicht kriegt man das nochmal hin?

DWH-WFC commented 11 months ago

https://cineclix.de/api/v1/titles/2273?load=images,genres,productionCountries,keywords,videos,primaryVideo,seasons,compactCredits

der zugriff wurde gesperrt

TimeLance89 commented 11 months ago

Achso okay, ja schade dann geht das wohl nicht. Vielen Dank aber dennoch für die Arbeit die investiert wurde!

DWH-WFC commented 11 months ago

Ist leider immer bei neuen Seiten der Fall deswegen nehmen wir sowas erst nach paar Monaten Recherche auf. Vielleicht hat jemand anderes eine Lösung und Zeit es zu fixen bzw ein Schlupfloch zu finden

DWH-WFC commented 11 months ago

cineclix.zip

Teste die mal bitte durch und berichte bitte via Element https://matrix.to/#/#streamxstream_community:gitter.im

Vergesse bitte nicht vor dem Test den HTML Cache zu leeren!

DWH-WFC commented 11 months ago

cineclix.zip

Jetzt sollte aber alles passen bitte mal alles durchtesten.

TimeLance89 commented 11 months ago

Gerade alles durch getestet, läuft alles super! Eine Genre Funktion kann man nicht zufällig mit drin haben oder? Also ich meine für die Zukunft oder dergleichen

DWH-WFC commented 11 months ago

Ein richtiges Genre Menü gibt es ja nicht deswegen eher nein. Es gibt zwar Animation, Horror, Action und Komödie aber sonst weiter nichts. Wir werden erstmal abwarten wie sich die Seite entwickelt. Will da ehrlich gesagt nicht so viel Zeit verschwenden wenn sie in 2 Monaten wieder Offline ist.

Deswegen abwarten und beobachten.

TimeLance89 commented 11 months ago

Nutze es jetzt seit Tagen läuft echt super stabil und bin ein super Fan.

Ich habe mal etwas recherchiert die Genre sind so unterteilt:

https://cineclix.de/genre/horror https://cineclix.de/genre/familie https://cineclix.de/genre/action https://cineclix.de/genre/fantasy https://cineclix.de/genre/liebesfilme

Usw.

Genre wäre echt ein absoluter Traum via xStream

TimeLance89 commented 10 months ago

Ich habe ein kleines Problem entdeckt, wenn man nach der Serie "American Horror Storys" sucht wird nur von Staffel 5 ab an gezeigt leider

TimeLance89 commented 10 months ago

Webseite hat ein Update bekommen, das addon müsste angepasst werden wie beim letzten Mal :(