def searchGlobal(): oGui = cGui() sSearchText = oGui.showKeyBoard() if (sSearchText != False and sSearchText != ''): aPlugins = [] aPlugins = cPluginHandler().getAvailablePlugins() oGui.dialog = xbmcgui.DialogProgress() oGui.dialog.create('xStream',"Searching...") numPlugins = len(aPlugins) count = 0 for pluginEntry in aPlugins: pluginName = str(pluginEntry['name']) pluginSiteName = pluginEntry['id'] oGui.dialog.update(count*100/numPlugins,'Searching: '+pluginName+'...') count += 1 logger.info('Searching for "'+sSearchText+'" at '+pluginName) try: plugin = __import__(pluginSiteName, globals(), locals()) function = getattr(plugin, '_search') oGuiElement = cGuiElement('[B][COLOR yellow]----'+pluginName+'----[/COLOR][/B]',pluginSiteName,'spacer') if len(pluginEntry)>2: oGuiElement.setThumbnail(pluginEntry['icon']) oGui.addFolder(oGuiElement) function(oGui, sSearchText) except: logger.info(pluginName+': search failed') import traceback print traceback.format_exc() oGui.dialog.close() oGui.setView() oGui.setEndOfDirectory() return True
def showSeasons(): oGui = cGui() params = ParameterHandler() sTitle = params.getValue('Title') seriesId = params.getValue('seriesID') sImdb = params.getValue('imdbID') logger.info("%s: show seasons of '%s' " % (SITE_NAME, sTitle)) data = _getJsonContent("series/%s/1" % seriesId) rangeStart = not int(data["series"]["movies"]) total = int(data["series"]["seasons"]) for i in range(rangeStart, total + 1): seasonNum = str(i) if i is 0: seasonTitle = 'Film(e)' dialogType = 'showCinemaMovies' else: seasonTitle = '%s - Staffel %s' %(sTitle, seasonNum) if params.getValue('specific') == 'Episode': dialogType = 'randomEpisode' else: dialogType = 'showEpisodes' guiElement = cGuiElement(seasonTitle, SITE_IDENTIFIER, dialogType) guiElement.setMediaType('season') guiElement.setSeason(seasonNum) guiElement.setTVShowTitle(sTitle) params.setParam('Season', seasonNum) guiElement.setThumbnail(URL_COVER % data["series"]["id"]) oGui.addFolder(guiElement, params, iTotal = total) oGui.setView('seasons') oGui.setEndOfDirectory()
def __getHtmlContent(sUrl = None, sSecurityValue=None): params = ParameterHandler() # Test if a url is available and set it if sUrl is None and not params.exist('siteUrl'): logger.info("There is no url we can request.") return False else: if sUrl is None: sUrl = params.getValue('siteUrl') # Test if a security value is available if sSecurityValue is None: if params.exist('securityCookie'): sSecurityValue = params.getValue('securityCookie') else : sSecurityValue = '' # Make the request oRequest = cRequestHandler(sUrl) #oRequest.addHeaderEntry('Cookie', sSecurityValue) #oRequest.addHeaderEntry('Accept', '*/*') #oRequest.addHeaderEntry('Host', 'gstream.to') return oRequest.request()
def _search(oGui, sSearchText): # Create the request with the search value sFullSearchUrl = URL_SEARCH + ("?q=%s" % sSearchText) logger.info("Search URL: %s" % sFullSearchUrl) sHtmlContent = __getHtmlContent(sFullSearchUrl) # Display all items returned... __displayItems(oGui, sHtmlContent)
def showEpisodes(): oGui = cGui() oParams = ParameterHandler() sShowTitle = oParams.getValue('Title') seriesId = oParams.getValue('seriesID') sImdb = oParams.getValue('imdbID') sSeason = oParams.getValue('Season') logger.info("%s: show episodes of '%s' season '%s' " % (SITE_NAME, sShowTitle, sSeason)) data = _getJsonContent("series/%s/%s" % (seriesId, sSeason)) total = len(data['epi']) for episode in data['epi']: title = "%d - " % int(episode['epi']) if episode['german']: title += episode['german'].encode('utf-8') else: title += episode['english'].encode('utf-8') guiElement = cGuiElement(title, SITE_IDENTIFIER, 'showHosters') guiElement.setMediaType('episode') guiElement.setSeason(data['season']) guiElement.setEpisode(episode['epi']) guiElement.setTVShowTitle(sShowTitle) guiElement.setThumbnail(URL_COVER % data["series"]["id"]) oParams.setParam('EpisodeNr', episode['epi']) oGui.addFolder(guiElement, oParams, bIsFolder = False, iTotal = total) oGui.setView('episodes') oGui.setEndOfDirectory()
def load(): logger.info("Load %s" % SITE_NAME) sSecurityValue = __getSecurityCookieValue() oParams = ParameterHandler() if sSecurityValue: oParams.setParam('securityCookie', sSecurityValue) # Create all main menu entries oGui = cGui() oParams.setParam('sUrl', URL_NEWS) oParams.setParam('page', 1) oParams.setParam('mediaType', 'news') oGui.addFolder(cGuiElement('Neues von Heute', SITE_IDENTIFIER, 'showNews'), oParams) oParams.setParam('sUrl', URL_MOVIE_PAGE) oParams.setParam('mediaType', 'movie') oGui.addFolder(cGuiElement('Filme', SITE_IDENTIFIER, 'showMovieMenu'), oParams) oParams.setParam('sUrl', URL_SERIE_PAGE) oParams.setParam('mediaType', 'series') oGui.addFolder(cGuiElement('Serien', SITE_IDENTIFIER, 'showSeriesMenu'), oParams) oParams.setParam('sUrl', URL_DOCU_PAGE) oParams.setParam('mediaType', 'documentation') oGui.addFolder(cGuiElement('Dokumentationen', SITE_IDENTIFIER, 'showDocuMenu'), oParams) oParams.setParam('sUrl', URL_SEARCH) oParams.setParam('mediaType', '') oGui.addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch'), oParams) oGui.setEndOfDirectory()
def showCharacters(): logger.info('load showCharacters') oGui = cGui() oParams = ParameterHandler() sSecurityValue = oParams.getValue('securityCookie') if oParams.exist('sUrl') and oParams.exist('page') and oParams.exist('mediaType'): siteUrl = oParams.getValue('sUrl') # iPage = oParams.getValue('page') # sMediaType = oParams.getValue('mediaType') # request sHtmlContent = __getHtmlContent(siteUrl, sSecurityValue) # parse content sPattern = 'class="LetterMode.*?>([^>]+)</a>' oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if aResult[0]: for aEntry in aResult[1]: oGuiElement = cGuiElement(aEntry, SITE_IDENTIFIER, 'ajaxCall') # oOutputParameterHandler = ParameterHandler() oParams.setParam('character', aEntry[0]) # oOutputParameterHandler.addParameter('page', iPage) # oOutputParameterHandler.addParameter('mediaType', sMediaType) # oOutputParameterHandler.addParameter('securityCookie', sSecurityValue) if oParams.exist('mediaTypePageId'): sMediaTypePageId = oParams.getValue('mediaTypePageId') oParams.setParam('mediaTypePageId', sMediaTypePageId) oGui.addFolder(oGuiElement, oParams) oGui.setEndOfDirectory()
def parseMovieEntrySite(): oParams = ParameterHandler() sSecurityValue = oParams.getValue('securityCookie') if oParams.exist('sUrl'): sUrl = oParams.getValue('sUrl') # get movieEntrySite content sHtmlContent = __getHtmlContent(sUrl, sSecurityValue) sMovieTitle = __createMovieTitle(sHtmlContent) # get thumbnail result = cParser().parse(sHtmlContent, '<div class="Grahpics">.*?<img src="([^"]+)"') thumbnail = URL_MAIN + str(result[1][0]) if result[0] else False bIsSerie = __isSerie(sHtmlContent) if bIsSerie: oGui = cGui() aSeriesItems = parseSerieSite(sHtmlContent) if not aSeriesItems[0]: return total = len(aSeriesItems) for aEntry in aSeriesItems[1]: seasonNum = str(aEntry) guiElement = cGuiElement('%s - Staffel %s' % (sMovieTitle, seasonNum), SITE_IDENTIFIER, 'showEpisodes') guiElement.setMediaType('season') guiElement.setSeason(seasonNum) guiElement.setTVShowTitle(sMovieTitle) oParams.setParam('Season', seasonNum) if thumbnail: guiElement.setThumbnail(thumbnail) oGui.addFolder(guiElement, oParams, iTotal=total) oGui.setView('seasons') oGui.setEndOfDirectory() else: logger.info('Movie') result = showHosters(sHtmlContent, sMovieTitle) return result
def __addPluginsToSettings(self, data): """ data (dict): containing plugininformations """ import xml.etree.ElementTree as ET tree = ET.parse(self.settingsFile) # find Element for plugin Settings pluginElem = False for elem in tree.findall("category"): if elem.attrib["label"] == "30022": pluginElem = elem break if not pluginElem: logger.info("pluginElement not found") return False # add plugins to settings for pluginID in data: plugin = data[pluginID] attrib = {"default": "false", "type": "bool"} attrib["id"] = "plugin_%s" % pluginID attrib["label"] = plugin["name"] newPlugin = ET.Element() ET.SubElement(pluginElem, "setting", attrib) tree.write(self.settingsFile)
def parseSerieEpisodes(sHtmlContent, seasonNum): aSeriesItems = [] sPattern = 'id="SeasonSelection" rel="([^"]+)"' oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if aResult[0]: aSeriesUrls = aResult[1][0].split("&") sSeriesUrl = '&' + str(aSeriesUrls[0]) + '&' + str(aSeriesUrls[1]) sPattern = '<option.*?value="%d" rel="([^"]+)".*?>Staffel.*?</option>' % int(seasonNum) aResult = oParser.parse(sHtmlContent, sPattern) logger.info(aResult[1]) if aResult[0]: aSeriesIds = aResult[1][0].split(",") for iSeriesIds in aSeriesIds: aSeries = {} iEpisodeNum = iSeriesIds sTitel = 'Folge ' + str(iEpisodeNum) sUrl = URL_EPISODE_URL + sSeriesUrl + '&Season=' + str(seasonNum) + '&Episode=' + str(iEpisodeNum) aSeries['title'] = sTitel aSeries['url'] = sUrl aSeries['season'] = seasonNum aSeries['episode'] = iEpisodeNum aSeriesItems.append(aSeries) return aSeriesItems
def __callRequest(self): cookieJar = mechanize.LWPCookieJar() try: #TODO ohne try evtl. cookieJar.load(self._cookiePath, self.__bIgnoreDiscard, self.__bIgnoreExpired) except Exception as e: logger.info(e) sParameters = urllib.urlencode(self.__aParameters) opener = mechanize.build_opener(SmartRedirectHandler, mechanize.HTTPEquivProcessor, mechanize.HTTPRefreshProcessor) if (len(sParameters) > 0): oRequest = mechanize.Request(self.__sUrl, sParameters) else: oRequest = mechanize.Request(self.__sUrl) for aHeader in self.__aHeaderEntries: for sHeaderKey, sHeaderValue in aHeader.items(): oRequest.add_header(sHeaderKey, sHeaderValue) cookieJar.add_cookie_header(oRequest) if self.caching and self.cacheTime > 0: sContent = self.readCache(self.getRequestUri()) if sContent: return sContent try: oResponse = opener.open(oRequest,timeout = 60) except mechanize.HTTPError, e: if not self.ignoreErrors: xbmcgui.Dialog().ok('xStream','Fehler beim Abrufen der Url:',self.__sUrl, str(e)) logger.error("HTTPError "+str(e)+" Url: "+self.__sUrl) return '' else: oResponse = e
def getHosters(): oParams = ParameterHandler() sChannelUrl = oParams.getValue('channelUrl') sChannelName = oParams.getValue('channelName') logger.info('get stream url for URL: ' + sChannelUrl) oRequestHandler = cRequestHandler(sChannelUrl) oRequestHandler.addHeaderEntry('Referer', URL_MAIN) sHtmlContent = oRequestHandler.request(); hosters = [] sPattern = "'file': '(.*?)'," oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if aResult[0]: sUrl = str(aResult[1])[2:-2] logger.info('load channel ' + sChannelName + ' with url ' + sUrl) hoster = {} hoster['link'] = sUrl hoster['name'] = 'streamcloud' # dummy hosters.append(hoster) hosters.append('getHosterUrl') return hosters
def showSeries(sUrl=False): logger.info('load showSeries') oParams = ParameterHandler() if not sUrl: sUrl = oParams.getValue('sUrl') sPagePattern = '<a href="' + sUrl + '(\d+).html">' # request sHtmlContent = __getHtmlContent(sUrl) # parse content oParser = cParser() aResult = oParser.parse(sHtmlContent, sPagePattern) pages = 1 if aResult[0]: if representsInt(aResult[1][-1]): pages = aResult[1][-1] oGui = cGui() # because sometimes 2 pages have the same content dupeCheck = [] for x in range(1, int(pages) + 1): dupeCheck = showSeriesPage(oGui, sUrl, x, dupeCheck) oGui.setView('tvshows') oGui.setEndOfDirectory()
def showSeasons(): logger.info('load showSeasons') oParams = ParameterHandler() sTitle = oParams.getValue('Title') sPattern = '<a href="#season-(.*?)" data-parent=".*?>(.*?)</a>' # request sHtmlContent = __getHtmlContent() # parse content oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) oGui = cGui() if aResult[0]: for sId, seasonNum in aResult[1]: guiElement = cGuiElement('%s - Staffel %s' % (sTitle, seasonNum), SITE_IDENTIFIER, 'showEpisodes') guiElement.setMediaType('season') guiElement.setSeason(seasonNum) guiElement.setTVShowTitle(sTitle) oParams.setParam('Season', seasonNum) oGui.addFolder(guiElement, oParams) oGui.setView('seasons') oGui.setEndOfDirectory()
def searchGlobal(): import threading oGui = cGui() oGui.globalSearch = True oGui._collectMode = True sSearchText = oGui.showKeyBoard() if not sSearchText: return True aPlugins = [] aPlugins = cPluginHandler().getAvailablePlugins() dialog = xbmcgui.DialogProgress() dialog.create('xStream',"Searching...") numPlugins = len(aPlugins) threads = [] for count, pluginEntry in enumerate(aPlugins): dialog.update((count+1)*50/numPlugins,'Searching: '+str(pluginEntry['name'])+'...') logger.info('Searching for %s at %s' % (sSearchText, pluginEntry['id'])) t = threading.Thread(target=_pluginSearch, args=(pluginEntry,sSearchText,oGui), name =pluginEntry['name']) threads += [t] t.start() for count, t in enumerate(threads): t.join() dialog.update((count+1)*50/numPlugins+50, t.getName()+' returned') dialog.close() # deactivate collectMode attribute because now we want the elements really added oGui._collectMode = False total=len(oGui.searchResults) for result in sorted(oGui.searchResults, key=lambda k: k['guiElement'].getSiteName()): oGui.addFolder(result['guiElement'],result['params'],bIsFolder=result['isFolder'],iTotal=total) oGui.setView() oGui.setEndOfDirectory() return True
def searchAlter(params): searchText = params.getValue('searchTitle') searchImdbId = params.getValue('searchImdbID') import threading oGui = cGui() aPlugins = [] aPlugins = cPluginHandler().getAvailablePlugins() dialog = xbmcgui.DialogProgress() dialog.create('xStream',"Searching...") numPlugins = len(aPlugins) count = 0 threads = [] for pluginEntry in aPlugins: dialog.update(count*100/numPlugins,'Searching: '+str(pluginEntry['name'])+'...') count += 1 logger.info('Searching for "'+searchText+'" at '+pluginEntry['id']) t = threading.Thread(target=pluginSearch, args=(pluginEntry,searchText)) threads += [t] t.start() for t in threads: t.join() dialog.close() oGui.setView() oGui.setEndOfDirectory() #xbmc.executebuiltin('Container.Update') return True
def showEpisodes(): logger.info('load showEpisodes') oParams = ParameterHandler() sTitle = oParams.getValue('Title') sSeason = oParams.getValue('Season') sPattern = 'class="list-group-item".*?<span itemprop="name">Staffel ' + sSeason + ' Episode(?:[\s]*)(.*?)</span>.*?<a class="episode-name" href="(.*?)" title="(.*?)"' # request sHtmlContent = __getHtmlContent() # parse content oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) oGui = cGui() if (aResult[0] == True): for eNr, link, title in aResult[1]: guiElement = cGuiElement('Episode %s - %s' % (eNr, title), SITE_IDENTIFIER, 'showHosters') guiElement.setMediaType('episode') guiElement.setSeason(sSeason) # Special fix for non-int episode numbers (like Attack on Titan 13.5) # Can't even check this on thetvdb.com, because AOT 13.5 for example is Season 0 Episode 1 # May I can use "<airsbefore_episode>" and "<airsbefore_season>" for metadata if representsInt(eNr): guiElement.setEpisode(eNr) guiElement.setTVShowTitle(sTitle) oParams.setParam('sUrl', link) oGui.addFolder(guiElement, oParams, bIsFolder=False) oGui.setView('episodes') oGui.setEndOfDirectory()
def load(): logger.info("Load %s" % SITE_NAME) oGui = cGui() oGui.addFolder(cGuiElement('Alle Serien', SITE_IDENTIFIER, 'showSeries')) oGui.addFolder(cGuiElement('A-Z', SITE_IDENTIFIER, 'showCharacters')) oGui.addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch')) oGui.setEndOfDirectory()
def resolveLinkcrypt(sUrl, hosters): oRequest = cRequestHandler(sUrl) sHtmlContent = oRequest.request() pattern = '<form action="http://linkcrypt.ws/out.html"[^>]*?>.*?' pattern += '<input[^>]*?value="(.+?)"[^>]*?name="file"' aResult = cParser().parse(sHtmlContent, pattern) if not aResult[0]: return for idx, weblink_id in enumerate(aResult[1]): try: oRequest = cRequestHandler("http://linkcrypt.ws/out.html") oRequest.addParameters('file', weblink_id) data = oRequest.request() link = re.compile("top.location.href=doNotTrack\('(.+?)'\)").findall(data)[0] hname = getHosterName(link) hname = "Part %d - %s" % (idx + 1, hname) logger.info("Resolved LinkCrypt link: %s" % link) hoster = dict() hoster['link'] = link hoster['name'] = hname hoster['displayedName'] = hname hosters.append(hoster) except Exception, detail: logger.info(detail) pass
def getAvailablePlugins(self): pluginDB = self.__getPluginDB() # default plugins update = False fileNames = self.__getFileNamesFromFolder(self.defaultFolder) for fileName in fileNames: try: modTime = os.path.getmtime( os.path.join(self.defaultFolder,fileName+'.py')) except OSError: modTime = 0 if fileName not in pluginDB or modTime > pluginDB[fileName]['modified']: logger.info('load plugin: '+ str(fileName)) # try to import plugin aPlugin = self.__getPluginData(fileName) aPlugin['modified'] = modTime if aPlugin: pluginDB[fileName] = aPlugin update = True # check pluginDB for obsolete entries deletions = [] for pluginID in pluginDB: if pluginID not in fileNames: deletions.append(pluginID) for id in deletions: del pluginDB[id] if update or deletions: self.__updateSettings(pluginDB) self.__updatePluginDB(pluginDB) return self.getAvailablePluginsFromDB()
def _getHostFromUrl(sUrl, sServername): # Seite abrufen sHtmlContent = cRequestHandler(sUrl).request() # JSon mit den Links ermitteln pattern = '(\[{".*?}\])' aResult = cParser().parse(sHtmlContent, pattern) # Nichts gefunden? => Raus hier if not aResult[0] or not aResult[1][0]: logger.info("hoster pattern did not match") return False # hosterliste initialisieren hosters = [] # Alle Einträge durchlaufen und Hostereintrag erstellen for entry in json.loads(aResult[1][0]): if 'file' not in entry or 'label' not in entry: continue sLabel = sServername + ' - ' + entry['label'].encode('utf-8') hoster = dict() hoster['link'] = entry['file'] if entry['label'].encode('utf-8')[:-1] in QUALITY_ENUM: hoster['quality'] = QUALITY_ENUM[entry['label'].encode('utf-8')[:-1]] hoster['name'] = sLabel hoster['resolveable'] = True hosters.append(hoster) # Hoster zurückgeben return hosters
def load(): logger.info("Load %s" % SITE_NAME) oGui = cGui() oGui.addFolder(cGuiElement('Filme', SITE_IDENTIFIER, 'showMovieMenu')) oGui.addFolder(cGuiElement('Serien', SITE_IDENTIFIER, 'showTvShowMenu')) oGui.addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch')) oGui.setEndOfDirectory()
def showSeasons(): oGui = cGui() params = ParameterHandler() sTitle = params.getValue('Title') seriesId = params.getValue('seriesID') sImdb = params.getValue('imdbID') logger.info("%s: show seasons of '%s' " % (SITE_NAME, sTitle)) sHtmlContent = _getContent("series/%s/1" % seriesId) data = json.loads(sHtmlContent) total = int(data["series"]["seasons"]) for i in range(1,total+1): seasonNum = str(i) guiElement = cGuiElement('%s - Staffel %s' %(sTitle,seasonNum), SITE_IDENTIFIER, 'showEpisodes') guiElement.setMediaType('season') guiElement.setSeason(seasonNum) guiElement.setTVShowTitle(sTitle) params.setParam('Season', seasonNum) guiElement.setThumbnail(URL_COVER % data["series"]["id"]) oGui.addFolder(guiElement, params, iTotal = total) oGui.setView('seasons') oGui.setEndOfDirectory()
def searchGlobal(): import threading oGui = cGui() sSearchText = oGui.showKeyBoard() if (sSearchText != False and sSearchText != ''): aPlugins = [] aPlugins = cPluginHandler().getAvailablePlugins() dialog = xbmcgui.DialogProgress() dialog.create('xStream',"Searching...") numPlugins = len(aPlugins) count = 0 threads = [] for pluginEntry in aPlugins: dialog.update(count*100/numPlugins,'Searching: '+str(pluginEntry['name'])+'...') count += 1 logger.info('Searching for %s at %s' % (sSearchText, pluginEntry['id'])) t = threading.Thread(target=_pluginSearch, args=(pluginEntry,sSearchText,oGui)) threads += [t] t.start() for t in threads: t.join() dialog.close() oGui.setView() oGui.setEndOfDirectory() return True
def showEpisodes(): oGui = cGui() oParams = ParameterHandler() sShowTitle = oParams.getValue('Title') sUrl = oParams.getValue('siteUrl') sImdb = oParams.getValue('imdbID') sSeason = oParams.getValue('Season') logger.info("%s: show episodes of '%s' season '%s' " % (SITE_NAME, sShowTitle, sSeason)) oRequestHandler = cRequestHandler(sUrl+"/"+sSeason) sHtmlContent = oRequestHandler.request(); data = json.loads(sHtmlContent) total = len(data['epi']) for episode in data['epi']: if episode['german']: title = episode['german'].encode('utf-8') else: title = episode['english'].encode('utf-8') guiElement = cGuiElement(str(episode['epi'])+" - "+title, SITE_IDENTIFIER, 'showHosters') guiElement.setMediaType('episode') guiElement.setSeason(data['season']) guiElement.setEpisode(episode['epi']) guiElement.setTVShowTitle(sShowTitle) guiElement.setThumbnail(URL_COVER % data["series"]["id"]) #oParams.setParam('EpisodeNr', episode['epi']) oParams.setParam('siteUrl',sUrl+"/"+sSeason+"/"+episode['epi']) oGui.addFolder(guiElement, oParams, bIsFolder = False, iTotal = total) oGui.setView('episodes') oGui.setEndOfDirectory()
def writeCache(self, url, content): h = hashlib.md5(url).hexdigest() cacheFile = os.path.join(self.__cachePath, h) try: fhdl = file(cacheFile,'w') fhdl.write(content) except: logger.info('Could not write Cache')
def getHosterUrl(sUrl): logger.info("getHosterUrl with url %s" % (sUrl)) results = [] result = {} result['streamUrl'] = sUrl result['resolved'] = True results.append(result) return results
def _mediaIsASerie(sUrl): logger.info('check if %s is a serie' % (sUrl)) oRequestHandler = cRequestHandler(sUrl) sHtmlContent = oRequestHandler.request() oParser = cParser() aResult = oParser.parse(sHtmlContent, '<select class="seasonselect"') return aResult[0]
def _pluginSearch(pluginEntry, sSearchText, oGui): try: plugin = __import__(pluginEntry['id'], globals(), locals()) function = getattr(plugin, '_search') function(oGui, sSearchText) except: logger.info(pluginEntry['name']+': search failed') import traceback print traceback.format_exc()
def showSearch(): logger.info('load showSearch') oGui = cGui() sSearchText = oGui.showKeyBoard() if (sSearchText != False and sSearchText != ''): _search(oGui, sSearchText) else: return oGui.setEndOfDirectory()
def showValueList(): oGui = cGui() params = ParameterHandler() entryUrl = params.getValue('sUrl') valueType = params.getValue('valueType') sHtmlContent = cRequestHandler(entryUrl).request() sPattern = '<select[^>]*name="%s\[\]"[^>]*>(.*?)</select>' % valueType # container# logger.info("sPattern %s" % sPattern) isMatch, strContainer = cParser.parseSingleResult(sHtmlContent, sPattern) if isMatch: sPattern = '<option[^>]*value="(.*?)"[^>]*>(.*?)</option>' # container isMatch, aResult = cParser.parse(strContainer, sPattern) if not isMatch: return for sID, sName in aResult: params.setParam('sUrl', entryUrl + '&' + valueType + '[]=' + sID) oGui.addFolder( cGuiElement(sName.strip(), SITE_IDENTIFIER, 'showEntries'), params) oGui.setEndOfDirectory()
def showGenresMenu(): logger.info('load displayGenreSite') oParams = ParameterHandler() sPattern = '<a href="' + URL_GENRE + '(.*?).html".*?>(.*?)</a>' # request sHtmlContent = __getHtmlContent(URL_MAIN) # parse content oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) oGui = cGui() if (aResult[0] == True): for aEntry in aResult[1]: guiElement = cGuiElement(aEntry[1], SITE_IDENTIFIER, 'showSeries') #guiElement.setMediaType('fGenre') #not necessary oParams.addParams({ 'sUrl': URL_GENRE + aEntry[0] + '/', 'iPage': 1 }) oGui.addFolder(guiElement, oParams) oGui.setEndOfDirectory()
def showMovie(): logger.info('load showMovie') oParams = ParameterHandler() sPattern = 'class="list-group-item".*?<img.*?src="(.*?)".*?itemprop="image".*?<span itemprop="name">(.*?)</span>.*?class="episode-name".*?href="(.*?)".*?title="(.*?)"' # request sHtmlContent = __getHtmlContent() # parse content oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) oGui = cGui() if (aResult[0] == True): for img, eNr, link, title in aResult[1]: guiElement = cGuiElement('Film %s - %s' % (eNr, title), SITE_IDENTIFIER, 'showHosters') guiElement.setThumbnail(img) guiElement.setMediaType('movie') guiElement.setTVShowTitle(title) oParams.addParams({'sUrl': link, 'from_moviesever': True}) oGui.addFolder(guiElement, oParams, bIsFolder=False) oGui.setView('movies') oGui.setEndOfDirectory()
def load(): logger.info("Load %s" % SITE_NAME) oGui = cGui() params = ParameterHandler() params.setParam('sUrl', URL_KINO) oGui.addFolder( cGuiElement('Aktuelle Kino Filme', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_NEU) oGui.addFolder( cGuiElement('Die Neusten Filme', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_BELIEBT) oGui.addFolder( cGuiElement('Die Beliebtesten Filme', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_BEST) oGui.addFolder( cGuiElement('Die Besten Filme Aller Zeiten', SITE_IDENTIFIER, 'showEntries'), params) oGui.addFolder(cGuiElement('Genre', SITE_IDENTIFIER, 'showGenre')) oGui.addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch')) oGui.setEndOfDirectory()
def showHosters(): logger.info('load showHosters') oParams = ParameterHandler() sPattern = 'a href="(' + oParams.getValue('sUrl') + '.*?/)"' # request sHtmlContent = __getHtmlContent() # parse content oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) hosters = [] hosters = getHoster(sHtmlContent, hosters) if aResult[0]: for link in aResult[1]: sHtmlContentTmp = __getHtmlContent(link) hosters = getHoster(sHtmlContentTmp, hosters) if hosters: hosters.append('getHosterUrl') return hosters
def addToPlaylist(self, siteResult=False): oGui = cGui() logger.info('attempt addToPlaylist') data = self._getInfoAndResolve(siteResult) if not data: return False logger.info('addToPlaylist file link: ' + str(data['link'])) oGuiElement = cGuiElement() oGuiElement.setSiteName(self.SITE_NAME) oGuiElement.setMediaUrl(data['link']) oGuiElement.setTitle(data['title']) if data['thumb']: oGuiElement.setThumbnail(data['thumb']) if data['showTitle']: oGuiElement.setEpisode(data['episode']) oGuiElement.setSeason(data['season']) oGuiElement.setTVShowTitle(data['showTitle']) if self.dialog: self.dialog.close() oPlayer = cPlayer() oPlayer.addItemToPlaylist(oGuiElement) oGui.showInfo('Playlist', 'Stream wurde hinzugefügt', 5) return True
def showGenres(): logger.info('load displayGenreSite') pattern = '<td class="Title"><a.*?href="/Genre/([^"]+)">([^<]+)</a>.*?Tipp-([0-9]+).html">' oParams = ParameterHandler() sSecurityValue = oParams.getValue('securityCookie') # request sHtmlContent = __getHtmlContent(URL_GENRE_PAGE, sSecurityValue) # parse content oParser = cParser() aResult = oParser.parse(sHtmlContent, pattern) oGui = cGui() if aResult[0]: for aEntry in aResult[1]: iGenreId = aEntry[2] __createMenuEntry( oGui, 'showCharacters', aEntry[1], { 'page': 1, 'mediaType': 'fGenre', 'mediaTypePageId': iGenreId, 'securityCookie': sSecurityValue, 'sUrl': URL_MOVIE_PAGE }) oGui.setEndOfDirectory()
def showSeasons(): oGui = cGui() params = ParameterHandler() sTitle = params.getValue('Title') seriesId = params.getValue('seriesID') logger.info("%s: show seasons of '%s' " % (SITE_NAME, sTitle)) data = _getJsonContent("series/%s/1" % seriesId) if not data: oGui.showInfo('xStream', 'Es wurde kein Eintrag gefunden') return rangeStart = not int(data["series"]["movies"]) total = int(data["series"]["seasons"]) for i in range(rangeStart, total + 1): seasonNum = str(i) if i is 0: seasonTitle = 'Film(e)' dialogType = 'showCinemaMovies' else: seasonTitle = '%s - Staffel %s' % (sTitle, seasonNum) if params.getValue('specific') == 'Episode': dialogType = 'randomEpisode' else: dialogType = 'showEpisodes' guiElement = cGuiElement(seasonTitle, SITE_IDENTIFIER, dialogType) guiElement.setMediaType('season') guiElement.setSeason(seasonNum) guiElement.setTVShowTitle(sTitle) guiElement.setDescription(data["series"]["description"]) guiElement.setThumbnail(URL_COVER % data["series"]["id"]) params.setParam('Season', seasonNum) oGui.addFolder(guiElement, params, iTotal=total) oGui.setView('seasons') oGui.setEndOfDirectory()
def parseMovieEntrySite(): oParams = ParameterHandler() sSecurityValue = oParams.getValue('securityCookie') if (oParams.exist('sUrl')): sUrl = oParams.getValue('sUrl') # get movieEntrySite content sHtmlContent = __getHtmlContent(sUrl, sSecurityValue) sMovieTitle = __createMovieTitle(sHtmlContent) # get thumbnail result = cParser().parse(sHtmlContent, '<div class="Grahpics">.*?<img src="([^"]+)"') thumbnail = '' if result[0]: thumbnail = URL_MAIN + str(result[1][0]) bIsSerie = __isSerie(sHtmlContent) if (bIsSerie): oGui = cGui() aSeriesItems = parseSerieSite(sHtmlContent) if (len(aSeriesItems) > 0): imdbID = oParams.getValue('imdbID') for item in aSeriesItems: oGuiElement = cGuiElement(item['title'], SITE_IDENTIFIER, 'showHosters') sShowTitle = sMovieTitle.split('(')[0].split('*')[0] oGuiElement.setThumbnail(thumbnail) oGuiElement.setMediaType('episode') oGuiElement.setSeason(item['season']) oGuiElement.setEpisode(item['episode']) oGuiElement.setTVShowTitle(sShowTitle) oParams.addParams({'sUrl':item['url'], 'episode':item['episode'], 'season':item['season']}) oGui.addFolder(oGuiElement, oParams, bIsFolder = False, iTotal = len(aSeriesItems)) oGui.setView('episodes') oGui.setEndOfDirectory() else: logger.info('Movie') result = showHosters(sHtmlContent, sMovieTitle) return result
def load(): logger.info("Load %s" % SITE_NAME) oGui = cGui() params = ParameterHandler() params.setParam('sUrl', URL_MAIN % 'neu') oGui.addFolder(cGuiElement('Neu', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'actionkino') oGui.addFolder(cGuiElement('Actionkino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'animekino') oGui.addFolder(cGuiElement('Animekino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'arthousekino') oGui.addFolder(cGuiElement('Arthousekino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'asiakino') oGui.addFolder(cGuiElement('Asiakino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'dramakino') oGui.addFolder(cGuiElement('Dramakino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'thrillerkino') oGui.addFolder(cGuiElement('Thrillerkino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'liebesfilmkino') oGui.addFolder(cGuiElement('Liebesfilmkino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'scifikino') oGui.addFolder(cGuiElement('Scifikino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'kinderkino') oGui.addFolder(cGuiElement('Kinderkino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'spasskino') oGui.addFolder(cGuiElement('Spasskino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'queerkino') oGui.addFolder(cGuiElement('Queerkino', SITE_IDENTIFIER, 'showEntries'), params) if showAdult(): params.setParam('sUrl', URL_MAIN % 'horrorkino') oGui.addFolder(cGuiElement('Horrorkino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'prickelkino') oGui.addFolder(cGuiElement('Prickelkino', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sUrl', URL_MAIN % 'kinoab18') oGui.addFolder(cGuiElement('Kino ab 18', SITE_IDENTIFIER, 'showEntries'), params) oGui.addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch')) oGui.setEndOfDirectory()
def parseMovieEntrySite(): oParams = ParameterHandler() sSecurityValue = oParams.getValue('securityCookie') if oParams.exist('sUrl'): sUrl = oParams.getValue('sUrl') # get movieEntrySite content sHtmlContent = __getHtmlContent(sUrl, sSecurityValue) sMovieTitle = __createMovieTitle(sHtmlContent) # get thumbnail result = cParser().parse( sHtmlContent, '<div class="Grahpics">.*?<img src="([^"]+)"') thumbnail = URL_MAIN + str(result[1][0]) if result[0] else False bIsSerie = __isSerie(sHtmlContent) if bIsSerie: oGui = cGui() aSeriesItems = parseSerieSite(sHtmlContent) if not aSeriesItems[0]: return total = len(aSeriesItems) for aEntry in aSeriesItems[1]: seasonNum = str(aEntry) guiElement = cGuiElement( '%s - Staffel %s' % (sMovieTitle, seasonNum), SITE_IDENTIFIER, 'showEpisodes') guiElement.setMediaType('season') guiElement.setSeason(seasonNum) guiElement.setTVShowTitle(sMovieTitle) oParams.setParam('Season', seasonNum) if thumbnail: guiElement.setThumbnail(thumbnail) oGui.addFolder(guiElement, oParams, iTotal=total) oGui.setView('seasons') oGui.setEndOfDirectory() else: logger.info('Movie') result = showHosters(sHtmlContent, sMovieTitle) return result
def load(): logger.info("Load %s" % SITE_NAME) oGui = cGui() params = ParameterHandler() sLanguage = _getPrefLanguage() if sLanguage == '0' or sLanguage == '2': params.setParam('sBaseUrl', URL_MAIN_GER) params.setParam('sUrl', URL_MOVIE_GER) oGui.addFolder(cGuiElement('Deutsche Horrorfilme', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sBaseUrl', URL_MAIN_GER) params.setParam('sUrl', URL_MOVIE_GER) oGui.addFolder(cGuiElement('Genre (DE)', SITE_IDENTIFIER, 'showGenresList'), params) if sLanguage == '1' or sLanguage == '2': params.setParam('sBaseUrl', URL_MAIN_ENG) params.setParam('sUrl', URL_MOVIE_ENG) oGui.addFolder(cGuiElement('English Horror Movie', SITE_IDENTIFIER, 'showEntries'), params) params.setParam('sBaseUrl', URL_MAIN_ENG) params.setParam('sUrl', URL_MOVIE_ENG) oGui.addFolder(cGuiElement('Genre (EN)', SITE_IDENTIFIER, 'showGenresList'), params) oGui.addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch')) oGui.setEndOfDirectory()
def load(): logger.info("Load %s" % SITE_NAME) parms = ParameterHandler() oGui = cGui() oRequest = cRequestHandler(URL_MAIN) sHtmlContent = oRequest.request() parms.setParam('cf', cRequestHandler.createUrl(URL_MAIN, oRequest)) parms.setParam('sUrl', URL_NEWS) parms.setParam('page', 1) parms.setParam('mediaType', 'news') oGui.addFolder(cGuiElement('Neues von Heute', SITE_IDENTIFIER, 'showNews'), parms) parms.setParam('sUrl', URL_MOVIE_PAGE) parms.setParam('mediaType', 'movie') oGui.addFolder(cGuiElement('Filme', SITE_IDENTIFIER, 'showMovieMenu'), parms) parms.setParam('sUrl', URL_SERIE_PAGE) parms.setParam('mediaType', 'series') oGui.addFolder(cGuiElement('Serien', SITE_IDENTIFIER, 'showSeriesMenu'), parms) parms.setParam('sUrl', URL_DOCU_PAGE) parms.setParam('mediaType', 'documentation') oGui.addFolder(cGuiElement('Dokumentationen', SITE_IDENTIFIER, 'showDocuMenu'), parms) parms.setParam('sUrl', URL_SEARCH) parms.setParam('mediaType', '') oGui.addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch'), parms) oGui.setEndOfDirectory()
def onAVStarted(self): if self.enabled: logger.info( "In KodiGroup[{}], onPlaybackStarted. Group enabled: {},startBehavior: {} , isPlayingVideo: {}, isPlayingAudio: {}, self.mediaType: {},self.playbackType(): {}".format( self.kgroupID, self.enabled, self.startBehavior, self.isPlayingVideo(), self.isPlayingAudio(), self.mediaType, self.playbackType())) self.state = STATE_PLAYING settings_storage['lastMediaType'] = self.playbackType() if self.isPlayingVideo() and self.mediaType == VIDEO: # If video group, check video activation. Otherwise it's audio so ignore this and check other conditions. try: self.videoInfoTag = self.getVideoInfoTag() except Exception as exc: logger.debug("Get InfoTag Exception: {}".format(exc)) reporting.process_exception(exc) return logger.debug("InfoTag: {}".format(self.videoInfoTag)) if not self.checkVideoActivation(self.videoInfoTag): return else: self.videoInfoTag = None if (self.checkActiveTime() or self.checkAlreadyActive(self.startScene)) and self.checkKeepLightsOffRule(self.startScene) and self.startBehavior and self.mediaType == self.playbackType(): self.run_play()
def __addPluginsToSettings(self, data): ''' data (dict): containing plugininformations ''' import xml.etree.ElementTree as ET tree = ET.parse(self.settingsFile) #find Element for plugin Settings pluginElem = False for elem in tree.findall('category'): if elem.attrib['label']=='30022': pluginElem = elem break if not pluginElem: logger.info('pluginElement not found') return False # add plugins to settings for pluginID in data: plugin = data[pluginID] attrib = {'default': 'false', 'type': 'bool'} attrib['id'] = 'plugin_%s' % pluginID attrib['label'] = plugin['name'] newPlugin = ET.Element() ET.SubElement(pluginElem, 'setting', attrib) tree.write(self.settingsFile)
def changeWatched(params): if not cConfig().getSetting('metahandler') == 'true': return meta = get_metahandler() if meta: season = '' episode = '' mediaType = params.getValue('mediaType') imdbID = params.getValue('imdbID') name = params.getValue('title') if params.exist('season'): season = params.getValue('season') if params.exist('episode'): episode = params.getValue('episode') if imdbID: meta.change_watched(mediaType, name, imdbID, season=season, episode=episode) xbmc.executebuiltin("XBMC.Container.Refresh") else: META = False logger.info("Could not import package 'metahandler'") return
def __getHtmlContent(sUrl=False, sSecurityValue=False, ignoreErrors=False): params = ParameterHandler() # Test if a url is available and set it if not sUrl: sUrl = params.getValue('siteUrl') if not sUrl: logger.info('no request url given') # Test is a security value is available if not sSecurityValue: sSecurityValue = params.getValue('securityCookie') if not sSecurityValue: sSecurityValue = '' # preferred language sPrefLang = __getPreferredLanguage() # adult Cookie if showAdult(): adultCookie = 'xxx2=ok;' else: adultCookie = '' # Make the request oRequest = cRequestHandler(sUrl, ignoreErrors=ignoreErrors) oRequest.addHeaderEntry('Cookie', sPrefLang + sSecurityValue + adultCookie) return oRequest.request()
def __callRequest(self): cookieJar = mechanize.LWPCookieJar() try: #TODO ohne try evtl. cookieJar.load(self._cookiePath, self.__bIgnoreDiscard, self.__bIgnoreExpired) except Exception as e: logger.info(e) sParameters = urllib.urlencode(self.__aParameters) opener = mechanize.build_opener(SmartRedirectHandler, mechanize.HTTPEquivProcessor, mechanize.HTTPRefreshProcessor) if (len(sParameters) > 0): oRequest = mechanize.Request(self.__sUrl, sParameters) else: oRequest = mechanize.Request(self.__sUrl) for aHeader in self.__aHeaderEntries: for sHeaderKey, sHeaderValue in aHeader.items(): oRequest.add_header(sHeaderKey, sHeaderValue) cookieJar.add_cookie_header(oRequest) if self.caching and self.cacheTime > 0: sContent = self.readCache(self.getRequestUri()) if sContent: return sContent try: oResponse = opener.open(oRequest, timeout=60) except mechanize.HTTPError, e: if not self.ignoreErrors: xbmcgui.Dialog().ok('xStream', 'Fehler beim Abrufen der Url:', self.__sUrl, str(e)) logger.error("HTTPError " + str(e) + " Url: " + self.__sUrl) return '' else: oResponse = e
def load(): oGui = cGui() params = ParameterHandler() logger.info("Load %s" % SITE_NAME) if showAdult(True): #Adult object off params.setParam('entryMode', "a_z") oGui.addFolder(cGuiElement('A BIS Z', SITE_IDENTIFIER, 'showMovies'), params) params.setParam('entryMode', "top_animes") oGui.addFolder(cGuiElement('Top', SITE_IDENTIFIER, 'showMovies'), params) params.setParam('entryMode', "new") oGui.addFolder( cGuiElement('Neuste Animes', SITE_IDENTIFIER, 'showMovies'), params) params.setParam('entryMode', "a_z") oGui.addFolder(cGuiElement('Suche', SITE_IDENTIFIER, 'showSearch'), params) else: oGui.addFolder( cGuiElement( 'Um Inhalte sehen zu können, muss der Adult Content aktiviert werden. \n(Klicke hier, um diese zu öffnen)', SITE_IDENTIFIER, 'getConf'), params) oGui.setEndOfDirectory()
def __init__(self): #TODO pfade in eine common datei verpacken self.addon = common.addon self.rootFolder = common.addonPath self.settingsFile = os.path.join(self.rootFolder, 'resources', 'settings.xml') self.profilePath = common.profilePath self.pluginDBFile = translatePath(os.path.join(self.profilePath,'pluginDB')) logger.info('profile folder: %s' % self.profilePath) logger.info('root folder: %s' % self.rootFolder) self.defaultFolder = translatePath(os.path.join(self.rootFolder, 'sites')) logger.info('default sites folder: %s' % self.defaultFolder)
def __init__(self): self.addon = common.addon self.rootFolder = common.addonPath self.settingsFile = os.path.join(self.rootFolder, 'resources', 'settings.xml') self.profilePath = common.profilePath self.pluginDBFile = os.path.join(self.profilePath, 'pluginDB') logger.info('profile folder: %s' % self.profilePath) logger.info('root folder: %s' % self.rootFolder) self.defaultFolder = os.path.join(self.rootFolder, 'sites') logger.info('default sites folder: %s' % self.defaultFolder)
def menu(): route = sys.argv[0] addon_handle = int(sys.argv[1]) base_url = sys.argv[0] command = sys.argv[2][1:] parsed = parse_qs(command) logger.debug("Menu started. route: {}, handle: {}, command: {}, parsed: {}, Arguments: {}".format(route, addon_handle, command, parsed, sys.argv)) if route == "plugin://script.service.hue/": if not command: build_menu(base_url, addon_handle) elif command == "settings": logger.debug("Opening settings") ADDON.openSettings() elif command == "toggle": if cache.get("script.service.hue.service_enabled") and get_status() != "Disabled by daylight": logger.info("Disable service") cache.set("script.service.hue.service_enabled", False) elif get_status() != "Disabled by daylight": logger.info("Enable service") cache.set("script.service.hue.service_enabled", True) else: logger.info("Disabled by daylight, ignoring") xbmc.executebuiltin('Container.Refresh') elif route == "plugin://script.service.hue/actions": action = parsed['action'][0] kgroupid = parsed['kgroupid'][0] logger.debug("Actions: {}, kgroupid: {}".format(action, kgroupid)) if action == "menu": items = [ (base_url + "?action=play&kgroupid=" + kgroupid, ListItem(_("Play"))), (base_url + "?action=pause&kgroupid=" + kgroupid, ListItem(_("Pause"))), (base_url + "?action=stop&kgroupid=" + kgroupid, ListItem(_("Stop"))), ] xbmcplugin.addDirectoryItems(addon_handle, items, len(items)) xbmcplugin.endOfDirectory(handle=addon_handle, cacheToDisc=True) else: cache.set("script.service.hue.action", (action, kgroupid), expiration=(timedelta(seconds=5))) else: logger.error("Unknown command. Handle: {}, route: {}, Arguments: {}".format(addon_handle, route, sys.argv))
def __updateSettings(self, pluginData): ''' data (dict): containing plugininformations ''' xmlString = '<plugin_settings>%s</plugin_settings>' import xml.etree.ElementTree as ET tree = ET.parse(self.settingsFile) #find Element for plugin Settings pluginElem = False for elem in tree.findall('category'): if elem.attrib['label'] == '30021': pluginElem = elem break if pluginElem is None: logger.info('could not update settings, pluginElement not found') return False pluginElements = pluginElem.findall('setting') for elem in pluginElements: pluginElem.remove(elem) # add plugins to settings for pluginID in sorted(pluginData): plugin = pluginData[pluginID] subEl = ET.SubElement(pluginElem, 'setting', { 'type': 'lsep', 'label': plugin['name'] }) subEl.tail = '\n\t' attrib = {'default': 'true', 'type': 'bool'} attrib['id'] = 'plugin_%s' % pluginID attrib['label'] = '30050' subEl = ET.SubElement(pluginElem, 'setting', attrib) subEl.tail = '\n\t' if 'settings' in plugin: customSettings = [] try: customSettings = ET.XML( xmlString % plugin['settings']).findall('setting') except: logger.info('Parsing of custom settings for % failed.' % plugin['name']) for setting in customSettings: setting.tail = '\n\t' pluginElem.append(setting) pluginElements = pluginElem.findall('setting')[-1].tail = '\n' try: ET.dump(pluginElem) except: logger.info('Settings update failed') return tree.write(self.settingsFile)
def getCookieString(self, content): vars = re.findall('toNumbers\("([^"]+)"', content) if not vars: logger.info('vars not found') return False value = self._decrypt(vars[2], vars[0], vars[1]) if not value: logger.info('value decryption failed') return False pattern = '"%s=".*?";([^"]+)"' % cBFScrape.COOKIE_NAME cookieMeta = re.findall(pattern, content) if not cookieMeta: logger.info('cookie meta not found') cookie = "%s=%s;%s" % (cBFScrape.COOKIE_NAME, value, cookieMeta[0]) return cookie
def setYear(self, year): try: year = int(year) except: logger.info('Year given for %s seems not to be a valid number' % self.getTitle()) return False if len(str(year)) != 4: logger.info('Year given for %s has %s digits, required 4 digits' % (self.getTitle(), len(str(year)))) return False if year > 0: self._sYear = str(year) self.__aItemValues['year'] = year return True else: logger.info('Year given for %s must be greater than 0' % self.getTitle()) return False
def __getSecurityCookieValue(): oRequestHandler = cRequestHandler(URL_NEWS, False) oRequestHandler.removeNewLines(False) oRequestHandler.removeBreakLines(False) sHtmlContent = oRequestHandler.request() sPattern = "var hash=\[(.*?)\]" oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if not aResult[0]: logger.error("Can't find script file for cookie") result = jsunprotect.jsunprotect(sHtmlContent) if not result: logger.error("Not protected or Deactivator not found") return False else: logger.info(result) oRequestHandler = cRequestHandler(URL_MAIN + '/?' + result, False) oRequestHandler.addHeaderEntry('Referer', URL_MAIN) # oRequestHandler.addHeaderEntry('Accept', '*/*') oRequestHandler.addHeaderEntry('Host', domain) oRequestHandler.request() return False sPattern = "escape\(hsh \+ \"([^\"]+)\"\)" oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if not aResult[0]: logger.info("No hash value found for the cookie") return False sHash = aResult[1][0] sHash = sHashSnippet + sHash sSecurityCookieValue = "sitechrx=" + str(sHash) + ";Path=/" oRequestHandler = cRequestHandler(URL_MAIN) oRequestHandler.addHeaderEntry("Cookie", sSecurityCookieValue) oRequestHandler.request() logger.info("Token: %s" % sSecurityCookieValue) return sSecurityCookieValue
def __getSecurityCookieValue(): oRequest = cRequestHandler(URL_MAIN, False, True) oRequest.ignoreDiscard(True) sHtmlContent = oRequest.request() header = oRequest.getResponseHeader() sPattern = '>DDoS protection by CloudFlare<' oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if not aResult[0]: logger.info('No known protection found') return '' logger.info('CF DDos protection active') #Challengeform suchen sPattern = ( 'a\.value = ([0-9\*\+\-]+);.*?<form id="challenge-form" action="([^"]+)".*?' 'name="([^"]+)" value="([^"]+)".*?name="([^"]+)"/>.*?</form>') oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if not aResult[0]: logger.info('ChallengeForm not found') return False aResult = aResult[1][0] constant = len(oRequest.getRealUrl().split('/')[2]) exp = aResult[0] url = aResult[1] valueName1 = aResult[2] value1 = aResult[3] valueName2 = aResult[4] value2 = str(eval(exp) + constant) url = '%s%s?%s=%s&%s=%s&pp=200' % (URL_MAIN, url, valueName1, value1, valueName2, value2) oRequest = cRequestHandler(url, caching=False, ignoreErrors=True) oRequest.addHeaderEntry('Host', 'gstream.to') oRequest.addHeaderEntry('Referer', URL_MAIN) oRequest.addHeaderEntry('Connection', 'keep-alive') oRequest.addHeaderEntry('DNT', '1') oRequest.ignoreDiscard(True) sHtmlContent = oRequest.request() return True
def showAllSeasons(): oGui = cGui() iParams = ParameterHandler() sUrl = iParams.getValue(PARAM_URL_KEY) sMovieTitle = iParams.getValue('sMovieTitle') sHtmlContent = cRequestHandler(sUrl).request() sPattern = '<option value="([0-9]+)">Staffel' oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if aResult[0] == True: logger.info("create season menu") Seasons = sorted([int(i) for i in aResult[1]]) total = len(Seasons) for season in Seasons: oGuiElement = cGuiElement() oGuiElement.setSiteName(SITE_IDENTIFIER) oGuiElement.setFunction('showEpisodes') oGuiElement.setTitle('Staffel ' + str(season)) oGuiElement.setMediaType('season') oGuiElement.setSeason(season) oOutputParameterHandler = ParameterHandler() oOutputParameterHandler.setParam( PARAM_MOVIESEGMENT_KEY, iParams.getValue(PARAM_MOVIESEGMENT_KEY)) oOutputParameterHandler.setParam(PARAM_ROOTURL_KEY, sUrl) oOutputParameterHandler.setParam(PARAM_URL_KEY, sUrl) oOutputParameterHandler.setParam('sMovieTitle', sMovieTitle) oOutputParameterHandler.setParam('season', season) oGui.addFolder(oGuiElement, oOutputParameterHandler, iTotal=total) logger.info('add object for season %s' % (season)) logger.info("done") oGui.setView('seasons') oGui.setEndOfDirectory()
# -*- coding: utf-8 -*- from resources.lib import core, logger, ADDONVERSION, KODIVERSION from resources.lib import reporting logger.info("Starting service.py, version {}, Kodi: {}".format( ADDONVERSION, KODIVERSION)) try: core.core() #Run Hue service except Exception as exc: logger.exception("Core service exception") reporting.process_exception(exc) logger.info("Shutting down service.py, version {}, Kodi: {}".format( ADDONVERSION, KODIVERSION))
def resolve(self, url, cookie_jar, user_agent): headers = {'User-agent': user_agent, 'Referer': url} try: cookie_jar.load(ignore_discard=True) except Exception as e: logger.info(e) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar)) request = urllib2.Request(url) for key in headers: request.add_header(key, headers[key]) try: response = opener.open(request) except urllib2.HTTPError as e: response = e body = response.read() cookie_jar.extract_cookies(response, request) cookie_helper.check_cookies(cookie_jar) pattern = 'xhr\.open\("GET","([^,]+),' match = cParser.parse(body, pattern) if not match[0]: return urlParts = match[1][0].split('"') parsed_url = urlparse(url) sid = '1200' script_url = '%s://%s%s%s%s' % (parsed_url.scheme, parsed_url.netloc, urlParts[0], sid, urlParts[2]) request = urllib2.Request(script_url) for key in headers: request.add_header(key, headers[key]) try: response = opener.open(request) except urllib2.HTTPError as e: response = e body = response.read() cookie_jar.extract_cookies(response, request) cookie_helper.check_cookies(cookie_jar) if not self.checkBFCookie(body): return body # even if its false its probably not the right content, we'll see cookie = self.getCookieString(body) if not cookie: return name, value = cookie.split(';')[0].split('=') cookieData = dict((k.strip(), v.strip()) for k, v in (item.split("=") for item in cookie.split(";"))) cookie = cookie_helper.create_cookie(name, value, domain=cookieData['domain'], expires=sys.maxint, discard=False) cookie_jar.set_cookie(cookie) request = urllib2.Request(url) for key in headers: request.add_header(key, headers[key]) try: response = opener.open(request) except urllib2.HTTPError as e: response = e return response