def showEntries(entryUrl=False, sGui=False): oGui = sGui if sGui else cGui() params = ParameterHandler() if not entryUrl: entryUrl = params.getValue('sUrl') request = cRequestHandler(entryUrl) sHtmlContent = request.request() pattern = '6">.*?<a href="([^"]+)" title="([^"]+).*?<img src="([^"]+)' isMatch, aResult = cParser().parse(sHtmlContent, pattern) if not isMatch: if not sGui: oGui.showInfo('xStream', 'Es wurde kein Eintrag gefunden') return total = len(aResult) for sUrl, sName, sThumbnail in aResult: isTvshow = True if 'folge' in sUrl else False sThumbnail = cCFScrape.createUrl(sThumbnail, request) oGuiElement = cGuiElement(sName, SITE_IDENTIFIER, 'showSeasons' if isTvshow else 'showHosters') oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sThumbnail) oGuiElement.setMediaType('tvshow' if isTvshow else 'movie') params.setParam('sThumbnail', sThumbnail) params.setParam('sName', sName) params.setParam('entryUrl', sUrl) oGui.addFolder(oGuiElement, params, isTvshow, total) if not sGui: oGui.setView('tvshows' if 'folge' in entryUrl else 'movies') oGui.setEndOfDirectory()
def showEntries(entryUrl=False, sGui=False): oGui = sGui if sGui else cGui() params = ParameterHandler() if not entryUrl: entryUrl = params.getValue('sUrl') oRequest = _getRequestHandler(entryUrl, ignoreErrors=(sGui is not False)) sHtmlContent = oRequest.request() pattern = '<div[^>]*class="ml-item-content"[^>]*>.*?' # start element pattern += '<a[^>]*href="([^"]*)"[^>]*>.*?' # url pattern += '(?:<span[^>]*class="quality-label (\w+)"[^>]*>.*?)?' # quality pattern += '<img[^>]*src="([^"]*)"[^>]*>.*?' # thumbnail pattern += '(?:<span[^>]*class="season-label"[^>]*>.*?<span[^>]*class="el-num"[^>]*>\s+(\d+)\s+</span>.*?)?' # season pattern += '</a>.*?' # end link pattern += '<h\d+>(.*?)</h\d+>.*?' # title pattern += '(?:<span[^>]*class="[^"]*glyphicon-time[^"]*"[^>]*></span>[^\d]*(\d+) min[^<]*</li>.*?)?' # duration pattern += '(?:<span[^>]*class="[^"]*glyphicon-calendar[^"]*"[^>]*></span>(.*?)</li>.*?)' # year pattern += '(?:<p>IMDb:</p>([^<]*)</li>.*?)' # imdb pattern += '(?:<div[^>]*class="caption-description"[^>]*>(.*?)</div>.*?)' # description isMatch, aResult = cParser.parse(sHtmlContent, pattern) if not isMatch: if not sGui: oGui.showInfo('streamon', 'Es wurde kein Eintrag gefunden') return total = len(aResult) for sUrl, sQuality, sThumbnail, sSeason, sName, sDuration, sYear, sImdb, sDesc in aResult: isTvshow = True if sSeason else False sName = sName.strip() sThumbnail = cCFScrape.createUrl(sThumbnail, oRequest) oGuiElement = cGuiElement(sName, SITE_IDENTIFIER, 'showHosters') res = re.search('(.*?)\s(?:staf+el|s)\s*(\d+)', sName, re.I) if res: sName = res.group(1) sSeason = res.group(2) isTvshow = True oGuiElement.setTVShowTitle(sName) oGuiElement.setFunction('showEpisodes') oGuiElement.setTitle('%s - Staffel %s' % (sName, sSeason)) params.setParam('sSeason', sSeason) oGuiElement.setYear(sYear) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setMediaType('tvshow' if isTvshow else 'movie') oGuiElement.setDescription(sDesc) oGuiElement.addItemValue('rating', sImdb) if sDuration: oGuiElement.addItemValue('duration', int(sDuration) * 60) params.setParam('sUrl', sUrl) params.setParam('sName', sName) params.setParam('sThumbnail', sThumbnail) oGui.addFolder(oGuiElement, params, isTvshow, total) if not sGui: sPattern = '<li[^>]*class="active".*?<a[^>]*href="([^"]*)"[^>]*>\d+</a>' isMatch, sPageUrl = cParser.parseSingleResult(sHtmlContent, sPattern) if isMatch: params.setParam('sUrl', sPageUrl) oGui.addNextPage(SITE_IDENTIFIER, 'showEntries', params) oGui.setView('tvshows' if '/tv' in entryUrl else 'movies') oGui.setEndOfDirectory()
def showEntries(entryUrl=False, sGui=False, sSearchText=None): import time oGui = sGui if sGui else cGui() params = ParameterHandler() if not entryUrl: entryUrl = params.getValue('sUrl') sortBy = params.getValue('sortBy') page = params.getValue('page') type = params.getValue('type') sHtmlContent = cRequestHandler(entryUrl).request() isMatch, url = cParser.parseSingleResult(sHtmlContent, "url : '([^']+)") isMatch, token = cParser.parseSingleResult(sHtmlContent, "token':'([^']+)") oRequest = cRequestHandler(url) if sSearchText: oRequest.addParameters('search', sSearchText) page = '1' type = 'Alle' sortBy = 'latest' oRequest.addHeaderEntry('X-Requested-With', 'XMLHttpRequest') oRequest.addParameters('_token', token) oRequest.addParameters('from', 1900) oRequest.addParameters('page', page) oRequest.addParameters('rating', 0) oRequest.addParameters('sortBy', sortBy) oRequest.addParameters('to', time.strftime("%Y", time.localtime())) oRequest.addParameters('type', type) oRequest.setRequestType(1) sHtmlContent = oRequest.request() pattern = '<a title=[^>]"(.*?)" href=[^>]"([^"]+).*?src=[^>]"([^"]+)' isMatch, aResult = cParser.parse(sHtmlContent, pattern) if not isMatch: if not sGui: oGui.showInfo('xStream', 'Es wurde kein Eintrag gefunden') return total = len(aResult) for sName, sUrl, sThumbnail in aResult: isTvshow = True if 'folge' in sUrl else False sThumbnail = sThumbnail.replace('\/', '/') sThumbnail = cCFScrape.createUrl(sThumbnail, oRequest) oGuiElement = cGuiElement(sName[:-1], SITE_IDENTIFIER, 'showSeasons' if isTvshow else 'showHosters') oGuiElement.setThumbnail(sThumbnail[:-1]) oGuiElement.setFanart(sThumbnail[:-1]) oGuiElement.setMediaType('tvshow' if isTvshow else 'movie') params.setParam('sThumbnail', sThumbnail) params.setParam('sName', sName) params.setParam('entryUrl', sUrl.replace('\/', '/')[:-1]) oGui.addFolder(oGuiElement, params, isTvshow, total) if not sGui: pattern = 'Next.*?data-p=[^>]"([\d]+).*?d-flex' isMatch, sUrl = cParser.parseSingleResult(sHtmlContent, pattern) if isMatch: params.setParam('page', sUrl) oGui.addNextPage(SITE_IDENTIFIER, 'showEntries', params) oGui.setView('tvshows' if 'folge' in entryUrl else 'movies') oGui.setEndOfDirectory()
def showHosters(): sUrl = ParameterHandler().getValue('entryUrl') sHtmlContent = cRequestHandler(sUrl).request() pattern = 'src="([^"]+)"[^>]*frameborder' aResult = cParser().parse(sHtmlContent, pattern) hosters = [] for hUrl in aResult[1]: if not hUrl.startswith('http'): hUrl = 'https:' + hUrl if 'view.php' in hUrl: oRequest = cRequestHandler(hUrl) oRequest.addHeaderEntry('Referer', hUrl) sHtmlContent = oRequest.request() aResult = cParser().parse( sHtmlContent, "(?:jbdaskgs|m3u8File)[^>]=[^>]'([^']+)") cf = cCFScrape.createUrl(sUrl, oRequest) for sUrl in aResult[1]: if 'downloaded.' in sUrl: sUrl = 'https://fast.streamservice.online/public/dist/index.html?id=' + sUrl hoster = {'link': sUrl, 'name': 'play'} hosters.append(hoster) continue import base64 sUrl = base64.b64decode(sUrl) isMatch, aResult = cParser.parse( sUrl, '"file":"([^"]+).*?label":"([^"]+)') for sUrl, sQuality in aResult: if 'google' in sUrl: hoster = { 'link': sUrl, 'name': sQuality, 'quality': QUALITY_ENUM[sQuality] } else: hoster = { 'link': sUrl + cf, 'name': sQuality, 'quality': QUALITY_ENUM[sQuality] } hosters.append(hoster) if 'wp-embed.php' in hUrl: oRequest = cRequestHandler(hUrl) oRequest.addHeaderEntry('Referer', hUrl) sHtmlContent = oRequest.request() aResult = cParser.parse(sHtmlContent, '<iframe[^>]src="([^"]+)') for sUrl in aResult[1]: isMatch, hname = cParser().parseSingleResult( sUrl, '^(?:https?://)?(?:[^@\n]+@)?([^:/\n]+)') hoster = {'link': sUrl, 'name': hname} hosters.append(hoster) if hosters: hosters.append('getHosterUrl') return hosters
def showEntries(entryUrl=False, sGui=False): oGui = sGui if sGui else cGui() params = ParameterHandler() if not entryUrl: entryUrl = params.getValue('sUrl') oRequest = cRequestHandler(entryUrl, ignoreErrors=(sGui is not False)) sHtmlContent = oRequest.request() pattern = '<div[^>]*class="poster"><img[^>]src="([^"]+)"[^>]alt="([^"]+).*?(.*?)<a[^>]href="([^"]+).*?<span>([\d]+)</span>.*?<div[^>]class="texto">([^"]+)</div>' isMatch, aResult = cParser.parse(sHtmlContent, pattern) if not isMatch: if not sGui: oGui.showInfo('xStream', 'Es wurde kein Eintrag gefunden') return total = len(aResult) for sThumbnail, sName, sDummy, sUrl, sYear, sDesc in aResult: isTvshow = True if "serie" in sUrl else False if sThumbnail.startswith('//'): sThumbnail = 'https:' + sThumbnail sThumbnail = cCFScrape.createUrl(sThumbnail, oRequest) if sUrl.startswith('//'): sUrl = 'https:' + sUrl oGuiElement = cGuiElement(sName, SITE_IDENTIFIER, 'showSeasons' if isTvshow else 'showHosters') oGuiElement.setMediaType('tvshow' if isTvshow else 'movie') oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sThumbnail) if 'German' in sDummy: oGuiElement.setLanguage('Deutsch') if 'English' in sDummy: oGuiElement.setLanguage('Englisch') oGuiElement.setYear(sYear) oGuiElement.setDescription(sDesc) params.setParam('entryUrl', sUrl) params.setParam('sName', sName) params.setParam('sThumbnail', sThumbnail) oGui.addFolder(oGuiElement, params, isTvshow, total) if not sGui: pattern = '"next"[^>]*href="([^"]+)' isMatchNextPage, sNextUrl = cParser.parseSingleResult( sHtmlContent, pattern) if isMatchNextPage: if sNextUrl.startswith('//'): sNextUrl = 'https:' + sNextUrl params.setParam('sUrl', sNextUrl) oGui.addNextPage(SITE_IDENTIFIER, 'showEntries', params) oGui.setView('tvshows' if 'serie' in sUrl else 'movies') oGui.setEndOfDirectory()
def showEntries(entryUrl=False, sGui=False): oGui = sGui if sGui else cGui() params = ParameterHandler() if not entryUrl: entryUrl = params.getValue('sUrl') oRequest = cRequestHandler(entryUrl, ignoreErrors=(sGui is not False)) sHtmlContent = oRequest.request() pattern = '"><a[^>]href="([^"]+)"[^>]title="([^"]+)"><img[^>]src="([^"]+)' isMatch, aResult = cParser.parse(sHtmlContent, pattern) if not isMatch: pattern = '</div><a[^>]href="([^"]+)"[^>]title="([^"]+)">.*?src="([^"]+)' isMatch, aResult = cParser.parse(sHtmlContent, pattern) if not isMatch: if not sGui: oGui.showInfo('xStream', 'Es wurde kein Eintrag gefunden') return total = len(aResult) for sUrl, sName, sThumbnail in aResult: isTvshow, aResult = cParser.parse(sName, 'S\d\dE\d\d') if sThumbnail.startswith('/'): sThumbnail = URL_MAIN + sThumbnail sThumbnail = cCFScrape.createUrl(sThumbnail, oRequest) oGuiElement = cGuiElement(sName, SITE_IDENTIFIER, 'showSeasons' if isTvshow else 'showHosters') oGuiElement.setMediaType('tvshow' if isTvshow else 'movie') oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sThumbnail) if sUrl.startswith('//'): params.setParam('entryUrl', 'https:' + sUrl) else: params.setParam('entryUrl', sUrl) params.setParam('sName', sName) params.setParam('sThumbnail', sThumbnail) oGui.addFolder(oGuiElement, params, isTvshow, total) if not sGui: pattern = '<a[^>]class="pageing.*?href=([^>]+)>[^>]v' isMatchNextPage, sNextUrl = cParser.parseSingleResult(sHtmlContent, pattern) if isMatchNextPage: if sNextUrl.startswith('/'): sNextUrl = URL_MAIN + sNextUrl params.setParam('sUrl', sNextUrl.replace("'", "").replace('"', '')) oGui.addNextPage(SITE_IDENTIFIER, 'showEntries', params) oGui.setView('tvshow' if isTvshow else 'movie') oGui.setEndOfDirectory()
def showEntries(entryUrl=False, sGui=False): # GUI-Element erzeugen wenn nötig oGui = sGui if sGui else cGui() # ParameterHandler erzeugen params = ParameterHandler() # URL ermitteln falls nicht übergeben if not entryUrl: entryUrl = params.getValue('sUrl') # Aktuelle Seite ermitteln und ggf. URL anpassen iPage = int(params.getValue('page')) # Daten ermitteln oRequest = cRequestHandler(entryUrl + '&page=' + str(iPage) if iPage > 0 else entryUrl, ignoreErrors=(sGui is not False)) sHtmlContent = oRequest.request() # Filter out the main section pattern = '<ul class="products row">(.*?)</ul>' isMatch, aMainContents = cParser.parse(sHtmlContent, pattern) # Funktion verlassen falls keine Daten ermittelt werden konnten if not isMatch: if not sGui: oGui.showInfo('streamon', 'Es wurde kein Eintrag gefunden') return # Gefundenen Bereiche zusammenführen (tritt z.b bei der Suche auf) sMainContent = '' for content in aMainContents: sMainContent += content # Funktion verlassen falls keine Daten ermittelt werden konnten if not sMainContent: if not sGui: oGui.showInfo('streamon', 'Es wurde kein Eintrag gefunden') return # URL ermitteln pattern = '<div[^>]*class="box-product clearfix"[^>]*>\s*?' pattern += '<a[^>]*href="([^"]*)"[^>]*>.*?' # Thumbnail ermitteln pattern += '<img[^>]*src="([^"]*)"[^>]*>.*?' # Prüfung auf Episoden-Einträge pattern += '(?:<div[^>]*class="episode"[^>]*>([^"]*)</div>.*?)?' # Name ermitteln pattern += '<div[^>]*class="popover-title"[^>]*>.*?' pattern += '<span[^>]*class="name"[^>]*>([^<>]*)</span>.*?' # Beschreibung ermitteln pattern += '<div[^>]*class="popover-content"[^>]*>.*?<p>([^<]+)</p>' # HTML parsen isMatch, aResult = cParser.parse(sMainContent, pattern) # Kein Einträge gefunden? => Raus hier if not isMatch: if not sGui: oGui.showInfo('streamon', 'Es wurde kein Eintrag gefunden') return # Listengröße ermitteln total = len(aResult) # Alle Ergebnisse durchlaufen for sUrl, sThumbnail, sEpisodeNrs, sName, sDesc in aResult: # Bei Filmen das Jahr vom Title trennen aYear = re.compile("(.*?)\((\d*)\)").findall(sName) iYear = False for name, year in aYear: sName = name iYear = year break # prüfen ob der Eintrag ein Serie/Staffel ist isTvshow = True if sEpisodeNrs else False # Listen-Eintrag erzeugen sUIElementName = sName if URL_PARMS_ORDER_YEAR in entryUrl: sUIElementName += ' (' + str(iYear) + ')' oGuiElement = cGuiElement(sUIElementName, SITE_IDENTIFIER, 'showHosters') # Bei Serien Title anpassen res = re.search('(.*?)\s(?:staf+el|s)\s*(\d+)', sName, re.I) if res: oGuiElement.setTVShowTitle(res.group(1)) oGuiElement.setTitle('%s - Staffel %s' % (res.group(1), int(res.group(2)))) params.setParam('sSeason', int(res.group(2))) elif not res and isTvshow: oGuiElement.setTVShowTitle(sName) oGuiElement.setTitle('%s - Staffel %s' % (sName, "1")) params.setParam('sSeason', "1") # Thumbnail und Beschreibung für Anzeige anpassen sThumbnail = sThumbnail.replace('_thumb', '') sThumbnail = cCFScrape.createUrl(sThumbnail, oRequest) # Falls vorhanden Jahr ergänzen if iYear: oGuiElement.setYear(iYear) # Eigenschaften setzen und Listeneintrag hinzufügen oGuiElement.setThumbnail(sThumbnail) oGuiElement.setMediaType('tvshow' if isTvshow else 'movie') oGuiElement.setDescription(sDesc) params.setParam('entryUrl', sUrl) params.setParam('sName', sName) params.setParam('sThumbnail', sThumbnail) params.setParam('isTvshow', isTvshow) oGui.addFolder(oGuiElement, params, isTvshow, total) # Nur ausführen wenn das Gui-Element Plugin intern ist if not sGui: # Pattern um die Aktuelle Seite zu ermitteln # pattern = '<ul[^>]*class="pagination[^>]*>.*?' # pattern += '<li[^>]*class="\s*active\s*"[^>]*>.*?</li>.*?<a[^>]*>(\d*)</a>.*?</ul>' # Seite parsen # isMatch, sPageNr = cParser.parse(sHtmlContent, pattern) sPageNr = int(params.getValue('page')) if sPageNr == 0: sPageNr = 2 else: sPageNr += 1 # TODO: Fallunterscheidung entfernt, weil hdfilme die pagination unzuverlässig anzeigt # Falls ein Ergebniss gefunden wurden "Next-Page" ergänzen # if isMatch: params = ParameterHandler() params.setParam('page', int(sPageNr)) params.setParam('sUrl', entryUrl) oGui.addNextPage(SITE_IDENTIFIER, 'showEntries', params) # Liste abschließen und View setzen oGui.setView('tvshows' if URL_SHOWS in entryUrl else 'movies') oGui.setEndOfDirectory()