def getSeries(self, url, thumb): url_content = client.request("%s%s" % (base_url, url)) info = client.parseDOM(url_content, 'div', attrs={'class': 'info'})[0] title = py2_encode( client.replaceHTMLCodes(client.parseDOM(info, 'h1')[0])).strip() plot = py2_encode(client.parseDOM(info, 'p')[0]).strip() tab = client.parseDOM(info, 'div', attrs={'class': 'tab'})[0] matches = re.search( r'^(.*)<div class="tags">(.*)hossz:</div><p>([0-9]*) Perc(.*)$', tab, re.S) if matches: duration = int(matches.group(3).strip()) * 60 season = client.parseDOM(url_content, 'div', attrs={'class': 'season'})[0] seasons = season.replace('</a>', '</a>\n') for season in seasons.splitlines(): matches = re.search( r'^<a(.*)class="evad"(.*)href="(.*)">(.*)</a>$', season.strip()) if matches: self.addDirectoryItem( u'%s. évad' % matches.group(4), 'episodes&url=%s&thumb=%s' % (quote_plus(matches.group(3)), quote_plus(thumb)), "%s/%s" % (base_url, thumb), 'DefaultMovies.png', meta={ 'title': title, 'plot': plot, 'duration': duration }) self.endDirectory('tvshows')
def programs(self, id): query = base_url + prog_link programs = net.request(query % id) prgs = {} for i in json.loads(programs): prg = {} title = py2_encode(i['title']) try: thumb = img_link % [ x['external_key'] for x in i['images'] if x['role'] == 'logo' ][0] except: thumb = '' try: fanart = img_link % [ x['external_key'] for x in i['images'] if x['role'] == 'mea' ][0] except: fanart = None id = str(i['id']) plot = py2_encode(i['description']) extraInfo = "" if xbmcaddon.Addon().getSetting('show_content_summary') == 'true': try: if (i['count']['vi'] > 0): extraInfo = " (%d %s)" % ( i['count']['vi'], py2_encode(i['program_type_wording']['plural']) if i['program_type_wording'] != None else 'Teljes adás') else: extraInfo = " (%d előzetes és részletek)" % ( i['count']['vc']) except: pass prg = { 'extraInfo': extraInfo, 'id': id, 'fanart': fanart, 'thumb': thumb, 'plot': plot } prgs[title] = prg prgTitles = list(prgs.keys()) if (xbmcaddon.Addon().getSetting('sort_programs') == 'true'): prgTitles.sort(key=locale.strxfrm) for prg in prgTitles: #self.addDirectoryItem("%s[I][COLOR silver]%s[/COLOR][/I]" % (title, extraInfo), 'episodes&url=%s&fanart=%s' % (id, fanart), thumb, 'DefaultTVShows.png', Fanart=fanart, meta={'plot': plot}) self.addDirectoryItem("%s[I][COLOR silver]%s[/COLOR][/I]" % (prg, prgs[prg]['extraInfo']), 'episodes&url=%s&fanart=%s' % (prgs[prg]['id'], prgs[prg]['fanart']), prgs[prg]['thumb'], 'DefaultTVShows.png', Fanart=prgs[prg]['fanart'], meta={'plot': prgs[prg]['plot']}) self.endDirectory(type='tvshows')
def getInfo(self, sm8, searchStr): result = "0" rows = client.parseDOM(sm8, 'div', attrs={'class': 'row'}) for row in rows: divs = client.parseDOM(row, 'div') if searchStr in py2_encode(divs[0]): result = py2_encode(divs[1]).strip() return result
def get(function, timeout, *args, **table): try: response = None f = repr(function) f = re.sub('.+\smethod\s|.+function\s|\sat\s.+|\sof\s.+', '', f) a = hashlib.md5() for i in args: a.update(str(i)) a = str(a.hexdigest()) except: pass try: table = table['table'] except: table = 'rel_list' try: control.makeFile(dataPath) dbcon = database.connect(cacheFile) dbcur = dbcon.cursor() dbcur.execute("SELECT * FROM %s WHERE func = '%s' AND args = '%s'" % (table, f, a)) match = dbcur.fetchone() response = eval(py2_encode(match[2])) t1 = int(match[3]) t2 = int(time.time()) update = (abs(t2 - t1) / 3600) >= int(timeout) if update == False: return response except: pass try: r = function(*args) if (r == None or r == []) and not response == None: return response elif (r == None or r == []): return r except: return try: r = repr(r) t = int(time.time()) dbcur.execute("CREATE TABLE IF NOT EXISTS %s (""func TEXT, ""args TEXT, ""response TEXT, ""added TEXT, ""UNIQUE(func, args)"");" % table) dbcur.execute("DELETE FROM %s WHERE func = '%s' AND args = '%s'" % (table, f, a)) dbcur.execute("INSERT INTO %s Values (?, ?, ?, ?)" % table, (f, a, r, t)) dbcon.commit() except: pass try: return eval(py2_encode(r)) except: pass
def isInCategory(group, classes): if group == "mind": return True else: if py2_encode(group) in allCategories: for value in allCategories[group]: if value in py2_encode(classes): return True else: if group in py2_encode(classes): return True return False
def playmovie(self, url): url_content = client.request(url) filmbeagyazas = client.parseDOM(url_content, 'div', attrs={'class': 'filmbeagyazas'}) if len(filmbeagyazas) > 0: filmbeagyazas = filmbeagyazas[0] else: filmbeagyazas = client.parseDOM(url_content, 'div', attrs={'class': 'beagyazas'})[0] source = client.parseDOM(filmbeagyazas, 'iframe', ret='src')[0] xbmc.log('Dmdamedia: resolving url: %s' % source, xbmc.LOGINFO) try: direct_url = urlresolver.resolve(source) if direct_url: direct_url = py2_encode(direct_url) except Exception as e: xbmcgui.Dialog().notification( urlparse.urlparse(url).hostname, str(e)) return if direct_url: xbmc.log('Dmdamedia: playing URL: %s' % direct_url, xbmc.LOGINFO) play_item = xbmcgui.ListItem(path=direct_url) xbmcplugin.setResolvedUrl(syshandle, True, listitem=play_item)
def getResults(self, search_text): url_content = client.request(base_url, error=True) searchDiv = client.parseDOM(url_content, 'div', attrs={'id': 'search'}) innerFrameDiv = client.parseDOM(searchDiv, 'div', attrs={'class': 'inner_frame'}) searchURL = client.parseDOM(innerFrameDiv, 'form', ret='action')[0] uid = client.parseDOM(innerFrameDiv, 'input', attrs={'id': 'uid'}, ret='value')[0] url_content = client.request(searchURL, post="uid=%s&key=%s" % (uid, quote_plus(search_text)), error=True) searchResult = client.parseDOM(url_content, 'div', attrs={'class': 'search-results'}) resultsUser = client.parseDOM(searchResult, 'div', attrs={'class': 'results-user'}) ul = client.parseDOM(resultsUser, 'ul') if len(ul) > 0: lis = client.parseDOM(ul, 'li') for li in lis: href = client.parseDOM(li, 'a', ret='href')[0].replace( 'http://', 'https://').replace(base_url, '') if "filmkeres-es-hibas-link-jelentese.html" not in href: title = py2_encode(client.parseDOM(li, 'a')[0]) self.addDirectoryItem(title, 'movie&url=%s' % quote_plus(href), '', 'DefaultMovies.png') self.endDirectory('movies') else: xbmcgui.Dialog().ok("OnlineFilmvilág2", "Nincs találat!")
def playmovie(self, url): self.Login() xbmc.log('NetMozi: Try to play from URL: %s' % url, xbmc.LOGINFO) final_url = client.request(url, cookie=self.logincookie, output="geturl") xbmc.log('NetMozi: final URL: %s' % final_url, xbmc.LOGINFO) try: direct_url = urlresolver.resolve(final_url) if direct_url: xbmc.log('NetMozi: URLResolver resolved URL: %s' % direct_url, xbmc.LOGINFO) direct_url = py2_encode(direct_url) else: xbmc.log( 'NetMozi: URLResolver could not resolve url: %s' % final_url, xbmc.LOGINFO) xbmcgui.Dialog().notification( "URL feloldás hiba", "URL feloldása sikertelen a %s host-on" % urlparse.urlparse(final_url).hostname) except Exception as e: xbmc.log('NetMozi: URLResolver resolved URL: %s' % final_url, xbmc.LOGINFO) xbmcgui.Dialog().notification( urlparse.urlparse(url).hostname, str(e)) return if direct_url: xbmc.log('NetMozi: playing URL: %s' % direct_url, xbmc.LOGINFO) play_item = xbmcgui.ListItem(path=direct_url) xbmcplugin.setResolvedUrl(syshandle, True, listitem=play_item)
def addDirectoryItem(self, name, query, thumb, icon, context=None, queue=False, isAction=True, isFolder=True, Fanart=None, meta=None): url = '%s?action=%s' % (sysaddon, query) if isAction == True else query if thumb == '': thumb = icon cm = [] if queue == True: cm.append((queueMenu, 'RunPlugin(%s?action=queueItem)' % sysaddon)) if not context == None: cm.append((py2_encode(context[0]), 'RunPlugin(%s?action=%s)' % (sysaddon, context[1]))) item = xbmcgui.ListItem(label=name) item.addContextMenuItems(cm) item.setArt({'icon': thumb, 'thumb': thumb, 'poster': thumb}) if Fanart == None: Fanart = addonFanart item.setProperty('Fanart_Image', Fanart) if isFolder == False: item.setProperty('IsPlayable', 'true') if not meta == None: item.setInfo(type='Video', infoLabels=meta) xbmcplugin.addDirectoryItem(handle=syshandle, url=url, listitem=item, isFolder=isFolder)
def getEpisodes(self, url, serie): url_content = client.request(url) self.Login() url_content = client.request('%s%s' % (base_url, url), cookie=self.logincookie) container = client.parseDOM(url_content, 'div', attrs={'class': 'container'})[0] temp = client.parseDOM(container, 'h3')[0] title = py2_encode( client.replaceHTMLCodes(client.parseDOM(temp, 'a')[0])).strip() temp = client.parseDOM(container, 'div', attrs={'class': 'col-sm-8'})[0] plot = self.getInfo(temp, 'Leírás') duration = int(self.getInfo(temp, 'Játékidő:').replace(' perc', '')) * 60 temp = client.parseDOM(container, 'div', attrs={'class': 'col-sm-4'})[0] thumb = 'https:' + client.parseDOM(temp, 'img', ret='src')[0] episodes = client.parseDOM(url_content, 'ul', attrs={'id': 'seasonUl%s' % serie}) episodes = client.parseDOM(episodes, 'a') for episode in episodes: self.addDirectoryItem('%s. rész' % py2_encode(episode), 'movie&url=%s/s%s/e%s' % (url, serie, episode), thumb, 'DefaultTVShows.png', meta={ 'title': '%s - %s. évad %s. rész' % (title, serie, py2_encode(episode)), 'plot': plot, 'duration': duration, 'fanart': thumb }) self.endDirectory(type="movies")
def root(self): query = base_url + cat_link categories = net.request(query) self.addDirectoryItem('Élő adás', 'liveChannels', '', 'DefaultTVShows.png') for i in json.loads(categories): self.addDirectoryItem(py2_encode(i['name']), 'programs&url=%s' % str(i['id']), '', 'DefaultTVShows.png') self.endDirectory()
def liveChannels(self): liveChannels = { 'rtlhu_rtl_klub': 'RTL Klub', 'rtlhu_rtl_ii': 'RTL II', 'rtlhu_cool': 'Cool TV', 'rtlhu_rtl_gold': 'RTL Gold', 'rtlhu_rtl_plus': 'RTL+', 'rtlhu_film_plus': 'Film+', 'rtlhu_sorozat_plus': 'Sorozat+', 'rtlhu_muzsika_tv': 'Muzsika TV' } query = base_url + livechannels_link lives = net.request(query) for (i, j) in json.loads(lives, object_pairs_hook=OrderedDict).items(): self.addDirectoryItem( "[B]" + liveChannels[i] + "[/B] - " + py2_encode(j[0]['title']) + " [COLOR gold][" + py2_encode(j[0]['diffusion_start_date'])[11:-3] + " - " + py2_encode(j[0]['diffusion_end_date'])[11:-3] + "][/COLOR]", 'liveChannel&url=%s' % i, '', 'DefaultTVShows.png') self.endDirectory()
def getEpisodes(self, url, thumb): url_content = client.request("%s%s" % (base_url, url)) info = client.parseDOM(url_content, 'div', attrs={'class': 'info'})[0] title = py2_encode( client.replaceHTMLCodes(client.parseDOM(info, 'h1')[0])).strip() plot = py2_encode(client.parseDOM(info, 'p')[0]).strip() tab = client.parseDOM(info, 'div', attrs={'class': 'tab'})[0] matches = re.search( r'^(.*)<div class="tags">(.*)hossz:</div><p>([0-9]*) Perc(.*)$', tab, re.S) if matches: duration = int(matches.group(3).strip()) * 60 controls = client.parseDOM(url_content, 'div', attrs={'class': 'controls'})[0] episodes = client.parseDOM(controls, 'div', attrs={'class': 'reszek' })[0].replace('</a>', '</a>\n') for episode in episodes.splitlines(): matches = re.search( r'(.*)<a(.*)class="(.*)episode"(.*)href="(.*)">(.*)</a>$', episode.strip()) if matches: self.addDirectoryItem( u'%s. rész %s' % (matches.group(6), "| [COLOR limegreen]Feliratos[/COLOR]" if "sub " in matches.group(3) else ""), 'movie&url=%s&thumb=%s&plot=%s' % (quote_plus(matches.group(5)), quote_plus(thumb), quote_plus(plot)), "%s/%s" % (base_url, thumb), 'DefaultMovies.png', isFolder=True, meta={ 'title': title, 'plot': plot, 'duration': duration }) self.endDirectory('episodes')
def getItems(self, url, group, search): url = "" if url == None else url if search != None: search = py2_encode(search.lower()) else: if group == "mind": self.addDirectoryItem('Keresés', 'basesearch&url=%s&group=mind' % url, '', 'DefaultFolder.png') else: self.addDirectoryItem('Keresés', 'search&url=%s&group=%s' % (url, group), '', 'DefaultFolder.png') url_content = client.request('%s/%s' % (base_url, url)) items = re.findall(r'<div class="wrap"><div class="[^"]*".*?</div>', url_content) for item in items: matches = re.search( r'^<div class="wrap"><div class="([^"]*)"(.*)data-cim="([^"]*)"(.*)data-cim_en="([^"]*)"(.*)<h1>(.*)</h1>(.*)<a href="([^"]*)"(.*)<img(.*)data-src="([^"]*)(.*)', item) if matches: if isInCategory(group, matches.group(1).replace(',', '')): itemUrl = matches.group(9) thumb = matches.group(12) title = py2_encode(matches.group(7)) data_cim = py2_encode(matches.group(3)).lower() data_cim_en = py2_encode(matches.group(5)).lower() isOK = True if search != None: lowerTitle = title.lower() if search not in lowerTitle and search not in data_cim and search not in data_cim_en: isOK = False if isOK: self.addDirectoryItem( title, '%s&url=%s&thumb=%s' % ("movie" if url != "" else "series", itemUrl, thumb), "%s/%s" % (base_url, thumb), 'DefaultMovies.png' if url != "" else 'DefaultTVShows.png') self.endDirectory('movies' if url != "" else 'tvshows')
def getSources(self, url): url_content = client.request(url) title = client.parseDOM(url_content, 'h1')[0] thumb = client.parseDOM(url_content, 'img', attrs={'class': 'kep_meret'}, ret='src')[0] plot = py2_encode( client.replaceHTMLCodes( client.parseDOM(url_content, 'div', attrs={'class': 'leiras' })[1])).replace("<h3>Leirás</h3>", "") sourceCnt = 0 linkektables = client.parseDOM(url_content, 'table', attrs={'id': 'linkek'}) for linkektable in linkektables: tbody = client.parseDOM(linkektable, 'tbody')[0] sorok = client.parseDOM(tbody, 'tr') for sor in sorok: oszlopok = client.parseDOM(sor, 'td') srcHost = oszlopok[1].replace('<b>', '').replace('</b>', '') matches = re.search(r'<div class="([^"]*)"></div>(.*)$', oszlopok[0]) url = client.parseDOM(sor, 'a', ret='href')[0] minoseg = "" szinkron = "" if matches: minoseg = " | [I]%s[/I]" % matches.group(2) if "feirat" in matches.group(1): szinkron = " | [I]feliratos[/I]" else: if "eredeti" in matches.group(1): szinkron = " | [I]eredeti nyelv[/I]" egyeb = "" if oszlopok[2] != "": egyeb = "[I] (%s)[/I]" % oszlopok[2] sourceCnt += 1 self.addDirectoryItem('%s | [B]%s[/B]%s%s%s' % (format( sourceCnt, '02'), srcHost, minoseg, szinkron, egyeb), 'playmovie&url=%s&host=%s' % (url, srcHost), thumb, 'DefaultMovies.png', isFolder=False, meta={ 'title': title, 'plot': plot, 'banner': thumb }) self.endDirectory('movies')
def getCategories(self): url_content = client.request(base_url, error=True) mainMenu = client.parseDOM(url_content, 'menu')[0].strip() menuItems = client.parseDOM(mainMenu, 'li') self.addDirectoryItem('Keresés', 'search', '', 'DefaultFolder.png') for menuItem in menuItems: text = py2_encode( client.replaceHTMLCodes(client.parseDOM(menuItem, 'a')[0])) url = client.parseDOM(menuItem, 'a', ret='href')[0] if not text.startswith(('Kezdőlap', 'Kérjél', 'Támogatás', 'CHAT', 'Jogi nyilatkozat')): self.addDirectoryItem(text, 'articles&url=%s' % url, '', 'DefaultFolder.png') self.endDirectory()
def getMovie(self, url, thumb): url_content = client.request(url) info = client.parseDOM(url_content, 'div', attrs={'class': 'info'})[0] title = py2_encode( client.replaceHTMLCodes(client.parseDOM(info, 'h1')[0])).strip() plot = py2_encode(client.parseDOM(info, 'p')[0]).strip() tab = client.parseDOM(info, 'div', attrs={'class': 'tab'})[0] matches = re.search( r'^(.*)<div class="tags">(.*)hossz:</div><p>([0-9]*) Perc(.*)$', tab, re.S) if matches: duration = int(matches.group(3).strip()) * 60 servers = client.parseDOM(url_content, 'div', attrs={'class': 'servers'})[0] lista = client.parseDOM(servers, 'div', attrs={'class': 'lista'})[0] sources = lista.replace("<a>", "\n<a>").replace("</a>", "</a>\n") sourceCnt = 0 for source in sources.splitlines(): matches = re.search(r'^<a(.*)href="(.*)">(.*)</a>$', source.strip()) if matches: sourceCnt += 1 self.addDirectoryItem( '%s | [B]%s[/B]' % (format(sourceCnt, '02'), matches.group(3)), 'playmovie&url=%s%s' % (url, quote_plus(matches.group(2))), "%s/%s" % (base_url, thumb), 'DefaultMovies.png', isFolder=False, meta={ 'title': title, 'plot': plot, 'duration': duration }, banner="") self.endDirectory('movies')
def getCategories(self, url): url = "" if url == None else url self.addDirectoryItem('Keresés', 'basesearch&url=%s&group=mind' % url, '', 'DefaultFolder.png') self.addDirectoryItem('Mind', 'items&url=%s&group=mind' % url, '', 'DefaultFolder.png') url_content = client.request('%s/%s' % (base_url, url)) categories = [] allItems = re.findall(r'<div class="wrap"><div class="[^"]*', url_content) for item in allItems: for cat in item.replace('<div class="wrap"><div class="', '').replace(',', '').split(' '): if cat != 'topseries' and cat != 'vege' and len( cat.replace(' ', '')) > 0: if py2_encode( getCategoryKeyByValue(cat)) not in categories: categories.append( py2_encode(getCategoryKeyByValue(cat))) categories.sort(key=locale.strxfrm) for cat in categories: self.addDirectoryItem(cat, 'items&url=%s&group=%s' % (url, cat), '', 'DefaultFolder.png') self.endDirectory()
def playmovie(self, url): if "http" not in url: url = ("https:%s" % url) xbmc.log('filmvilag: resolving url: %s' % url, xbmc.LOGINFO) try: direct_url = urlresolver.resolve(url) if direct_url: direct_url = py2_encode(direct_url) else: direct_url = url except Exception as e: xbmcgui.Dialog().notification( urlparse.urlparse(url).hostname, str(e)) return if direct_url: xbmc.log('filmvilag: playing URL: %s' % direct_url, xbmc.LOGINFO) play_item = xbmcgui.ListItem(path=direct_url) xbmcplugin.setResolvedUrl(syshandle, True, listitem=play_item)
def getMovies(self, url): url_content = client.request(url) movies = client.parseDOM(url_content, 'div', attrs={'class': 'thumbnail-container'}) for movie in movies: url = client.parseDOM(movie, 'a', ret='href')[0] thumb = client.parseDOM(movie, 'img', attrs={'loading': 'lazy'}, ret='src')[0] title = client.parseDOM(movie, 'span', attrs={'class': 'title-text'})[0] self.addDirectoryItem(title, ('movie&url=%s' % url) if "sorozat" not in url else ('sorozat&url=%s' % url), thumb, 'DefaultMovies.png', meta={ 'title': title, 'fanart': thumb }) buttons = client.parseDOM(url_content, 'div', attrs={'class': 'buttons'}) if len(buttons) > 1: pages = buttons[1].replace('</a>', '</a>\n').splitlines() if "következő oldal" in py2_encode(pages[len(pages) - 1]): matches = re.search(r'<a href="([^"]*)"(.*)$', pages[len(pages) - 1]) if matches: self.addDirectoryItem("[I]Következő oldal >>[/I]", 'movies&url=%s' % (matches.group(1)), '', 'DefaultFolder.png') self.endDirectory()
def playmovie(self, url, host): xbmc.log('onlinefilmek.me: resolving onlinefilmek.me url: %s' % url, xbmc.LOGINFO) url_content = client.request(url) mainContainer = client.parseDOM(url_content, 'div', attrs={'id': 'main_container'})[0] script = (u'%s' % client.parseDOM(mainContainer, 'script')[0]) matches = re.search(r"var(.*)=\['([^']*)(.*)$", script) if matches: encoded = matches.group(2) replaces = re.findall( "_0x418837=_0x418837\['replace'\]\(([^\)]*)\)", script, re.S) for replace in replaces: encoded = encoded.replace(replace[1], replace[6]) iFrame = base64.b64decode(encoded.encode('ascii')).decode('ascii') url = client.parseDOM(iFrame, 'iframe', ret='src')[0] xbmc.log( 'onlinefilmek.me: founded url: %s, trying to resolve' % url, xbmc.LOGINFO) try: direct_url = urlresolver.resolve(url) if direct_url: direct_url = py2_encode(direct_url) else: direct_url = url except Exception as e: xbmcgui.Dialog().notification(host, str(e)) return if direct_url: xbmc.log('onlinefilmek.me: playing URL: %s' % direct_url, xbmc.LOGINFO) play_item = xbmcgui.ListItem(path=direct_url) xbmcplugin.setResolvedUrl(syshandle, True, listitem=play_item) else: xbmcgui.Dialog().notification(host, "Script not founded")
def getMovie(self, url): self.Login() url_content = client.request('%s%s' % (base_url, url), cookie=self.logincookie) if "regeljbe.png" in url_content: xbmcgui.Dialog().ok( 'NetMozi', 'Lista lekérés sikertelen. A hozzáféréshez regisztráció szükséges.' ) xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xbmcgui.ListItem()) else: movieURL = 'https:%s' % client.parseDOM( url_content, 'a', attrs={'class': 'details_links_btn'}, ret='href')[0] container = client.parseDOM(url_content, 'div', attrs={'class': 'container'})[0] temp = client.parseDOM(container, 'h3')[0] title = py2_encode( client.replaceHTMLCodes(client.parseDOM(temp, 'a')[0])).strip() temp = client.parseDOM(container, 'div', attrs={'class': 'col-sm-4'})[0] thumb = 'https:' + client.parseDOM(temp, 'img', ret='src')[0] temp = client.parseDOM(container, 'div', attrs={'class': 'col-sm-8'})[0] plot = self.getInfo(temp, 'Leírás') duration = int( self.getInfo(temp, 'Játékidő:').replace(' perc', '')) * 60 serieInfo = client.parseDOM(url_content, 'h4') if serieInfo: serieInfo = ' - %s' % py2_encode(serieInfo[0]) else: serieInfo = '' url_content = client.request(movieURL) table = client.parseDOM(url_content, 'table', attrs={'class': 'table table-responsive'}) if table: rows = client.parseDOM(table, 'tr') sourceCnt = 0 for row in rows: sourceCnt += 1 cols = client.parseDOM(row, 'td') if 'hungary.gif' in cols[0]: nyelv = 'Szinkron' elif 'usa.gif' in cols[0]: nyelv = 'Külfüldi' elif 'uk-hu.png' in cols[0]: nyelv = 'Felirat' else: nyelv = 'Ismeretlen' valid = '' if 'red_mark.png' in cols[1]: valid = '| [COLOR red]Érvénytelen[/COLOR]' mURL = urlparse.urlsplit(movieURL) url = urlparse.urljoin( '%s://%s' % (mURL.scheme, mURL.netloc), py2_encode( client.parseDOM( cols[3], 'a', attrs={ 'class': 'btn btn-outline-primary btn-sm' }, ret='href')[0])) quality = py2_encode(cols[4]) site = py2_encode(cols[5]) self.addDirectoryItem( '%s | [B]%s[/B] | [COLOR limegreen]%s[/COLOR] | [COLOR blue]%s[/COLOR] %s' % (format(sourceCnt, '02'), site, nyelv, quality, valid), 'playmovie&url=%s' % url, thumb, 'DefaultMovies.png', isFolder=False, meta={ 'title': title + serieInfo, 'plot': plot, 'duration': duration, 'fanart': thumb }) self.endDirectory(type="movies")
def getArticles(self, url): url = "" if url == None else url url_content = client.request('%s/%s' % (base_url, url), error=True) articlesDiv = client.parseDOM(url_content, 'div', attrs={'id': 'articles'})[0] articles = client.parseDOM(articlesDiv, 'div', attrs={'class': 'article'}) for article in articles: preview = client.parseDOM(article, 'div', attrs={'class': 'preview'})[0] href = client.parseDOM(article, 'a', ret='href')[0] thumb = '%s%s' % (base_url, client.parseDOM(article, 'img', ret='src')[0]) heading3 = client.parseDOM(article, 'h3')[0] title = py2_encode(client.parseDOM(heading3, 'a')[0]) editorArea = py2_encode( client.replaceHTMLCodes( client.parseDOM(article, 'div', attrs={'class': 'editor-area'})[0])).strip() matches = re.search( r'^(.*)>(.*), ([0-9]*) perc,(.*)([1-2][0-9]{3})(.*)$', editorArea, re.S) xtraInfo = re.search( r'^(.*)color: rgb\(255, 0, 0\)(.*)>(.*)</span>(.*)$', editorArea, re.S) extraInfo = "" if xtraInfo != None: extraInfo = " | [COLOR red]%s[/COLOR]" % xtraInfo.group(3) if matches != None: self.addDirectoryItem( '%s (%s) | [COLOR limegreen]%s[/COLOR]%s' % (title, matches.group(5), matches.group(2), extraInfo), 'movie&url=%s&thumb=%s&duration=%s' % (href, quote_plus(thumb), quote_plus(matches.group(3))), thumb, 'DefaultMovies.png', meta={ 'title': title, 'duration': int(matches.group(3)) * 60, 'fanart': thumb }) else: matches = re.search(r'^(.*)>(.*),(.*)([1-2][0-9]{3})(.*)$', editorArea, re.S) if matches != None: self.addDirectoryItem( '%s (%s) | [COLOR limegreen]%s[/COLOR]%s' % (title, matches.group(4), matches.group(2), extraInfo), 'movie&url=%s&thumb=%s&duration=%s' % (href, quote_plus(thumb), "0"), thumb, 'DefaultMovies.png', meta={ 'title': title, 'duration': 0, 'fanart': thumb }) else: self.addDirectoryItem('%s | %s' % (title, extraInfo), 'movie&url=%s&thumb=%s&duration=%s' % (href, quote_plus(thumb), "0"), thumb, 'DefaultMovies.png', meta={ 'title': title, 'duration': 0, 'fanart': thumb }) listOfPages = client.parseDOM(articlesDiv, 'div', attrs={'class': 'list-of-pages'}) if len(listOfPages) > 0: next = client.parseDOM(listOfPages, 'p', attrs={'class': 'next'}) if len(next) > 0: nextPage = client.parseDOM(next, 'a', ret='href') if len(nextPage) > 0: self.addDirectoryItem( u'[I]K\u00F6vetkez\u0151 oldal >>[/I]', 'articles&url=%s' % quote_plus(nextPage[0]), '', 'DefaultFolder.png') self.endDirectory('movies')
def play(self, id, streams, image, meta): streams = sorted(streams) #dash_url = [i for i in streams if 'drmnp.ism/Manifest.mpd' in i] dash_url = [ i for i in streams if re.match(r'(.*)drm(.*)Manifest.mpd(.*)', i) ] hls_url = [i for i in streams if 'unpnp.ism/Manifest.m3u8' in i] live_url = [i for i in streams if 'stream.m3u8' in i] li = None if dash_url != []: # Inputstream and DRM #manifest_url = net.request(dash_url[0], redirect=False) #stream_url = os.path.dirname(manifest_url) + '/Manifest.mpd' stream_url = dash_url[0] headers = { 'x-auth-gigya-uid': self.uid, 'x-auth-gigya-signature': xbmcaddon.Addon().getSetting('signature'), 'x-auth-gigya-signature-timestamp': xbmcaddon.Addon().getSetting('s.timestamp'), 'Origin': 'https://www.rtlmost.hu' } token_source = net.request(token_url % (self.uid, id), headers=headers) token_source = json.loads(token_source) x_dt_auth_token = py2_encode(token_source['token']) license_headers = 'x-dt-auth-token=' + x_dt_auth_token + '&Origin=https://www.rtlmost.hu&Content-Type=' license_key = 'https://lic.drmtoday.com/license-proxy-widevine/cenc/' + '|' + license_headers + '|R{SSM}|JBlicense' DRM = 'com.widevine.alpha' PROTOCOL = 'mpd' from inputstreamhelper import Helper is_helper = Helper(PROTOCOL, drm=DRM) if is_helper.check_inputstream(): li = xbmcgui.ListItem(path=stream_url) if sys.version_info < ( 3, 0 ): # if python version < 3 is safe to assume we are running on Kodi 18 li.setProperty( 'inputstreamaddon', 'inputstream.adaptive') # compatible with Kodi 18 API else: li.setProperty( 'inputstream', 'inputstream.adaptive' ) # compatible with recent builds Kodi 19 API li.setProperty('inputstreamaddon', 'inputstream.adaptive') li.setProperty('inputstream.adaptive.manifest_type', PROTOCOL) li.setProperty('inputstream.adaptive.license_type', DRM) li.setProperty('inputstream.adaptive.license_key', license_key) li.setMimeType('application/dash+xml') li.setContentLookup(False) elif hls_url != []: stream_url = hls_url[0] manifest_url = net.request(stream_url, redirect=False) manifest = net.request(manifest_url) sources = m3u8_parser.parse(manifest) if len(sources) == 0: manifest_url = stream_url manifest = net.request(manifest_url) sources = m3u8_parser.parse(manifest) root = os.path.dirname(manifest_url) sources = sorted(sources, key=lambda x: x['resolution'])[::-1] auto_pick = xbmcaddon.Addon().getSetting('hls_quality') == '0' if len(sources) == 1 or auto_pick == True: source = sources[0]['uri'] else: result = xbmcgui.Dialog().select(u'Min\u0151s\u00E9g', [ str(source['resolution']) if 'resolution' in source else 'Unknown' for source in sources ]) if result == -1: return else: source = sources[result]['uri'] stream_url = root + '/' + source li = xbmcgui.ListItem(path=stream_url) elif live_url != []: live_url.sort(reverse=True) sources = [] for i in live_url: stream_url = i try: manifest = net.request(stream_url, timeout=30) sources_temp = m3u8_parser.parse(manifest) root = os.path.dirname(stream_url) for j in sources_temp: j['root'] = root sources.extend(sources_temp) if len(sources) > 0: break except: pass sources = sorted(sources, key=lambda x: x['resolution'], reverse=False) auto_pick = xbmcaddon.Addon().getSetting('hls_quality') == '0' if len(sources) > 0: if len(sources) == 1 or auto_pick == True: source = sources[0]['uri'] else: result = xbmcgui.Dialog().select(u'Min\u0151s\u00E9g', [ str(source['resolution']) if 'resolution' in source else 'Unknown' for source in sources ]) if result == -1: return else: source = sources[result]['uri'] stream_url = root + '/' + source else: stream_url = live_url[0] li = xbmcgui.ListItem(path=stream_url) meta = json.loads(meta) li.setInfo(type='Video', infoLabels=meta) xbmc.Player().play(stream_url, li) return if li is None: xbmcgui.Dialog().notification( u'Lej\u00E1tsz\u00E1s sikertelen. DRM v\u00E9dett m\u0171sor.', 'RTL Most', time=8000) xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xbmcgui.ListItem()) return stream_url_content = net.request(stream_url) meta = json.loads(meta) li.setArt({ 'icon': image, 'thumb': image, 'poster': image, 'tvshow.poster': image }) li.setInfo(type='Video', infoLabels=meta) xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, li)
def getCategoryKeyByValue(val): for key, value in allCategories.items(): if py2_encode(val) in value: return key return val
def getMovies(self, tipus, page, order, search): if search == None: search = '' url_content = client.request( '%s?page=%s&type=%s&order=%s&search=%s' % (base_url, page, tipus, order, quote_plus(search))) movies = client.parseDOM(url_content, 'div', attrs={'class': 'col-sm-4 col_main'}) if len(movies) > 0: for movie in movies: tempTitle = client.parseDOM(movie, 'div', attrs={'class': 'col_name'})[0] title = py2_encode(client.replaceHTMLCodes(tempTitle)).replace( '<small>(sorozat)</small>', '') isSorozat = "(sorozat)" in tempTitle sorozatLabel = '' if isSorozat and tipus != "2": sorozatLabel = ' [COLOR yellow][I]sorozat[/I][/COLOR]' url = client.parseDOM(movie, 'a', attrs={'class': 'col_a'}, ret='href')[0] thumbDiv = client.parseDOM(movie, 'div', attrs={'class': 'col-sm-6'})[0] thumb = 'https:' + client.parseDOM(thumbDiv, 'img', ret='src')[0] infoDiv = client.parseDOM(movie, 'div', attrs={'class': 'col-sm-6'})[1] infoRows = client.parseDOM(infoDiv, 'div', attrs={'class': 'row'}) year = re.sub('<.*>', '', py2_encode(client.replaceHTMLCodes( infoRows[0]))).strip() duration = int( re.sub('<.*>', '', py2_encode(client.replaceHTMLCodes( infoRows[1]))).strip().replace(' perc', '')) * 60 linkcount = re.sub( '<.*>', '', py2_encode(client.replaceHTMLCodes( infoRows[2]))).strip().replace('db', '') action = 'series' if isSorozat else 'movie' self.addDirectoryItem( '%s (%s)%s | [COLOR limegreen]%s link[/COLOR]' % (title, year, sorozatLabel, linkcount), '%s&url=%s' % (action, url), thumb, 'DefaultMovies.png' if isSorozat else 'DefaultTVShows.png', meta={ 'title': title, 'duration': duration, 'fanart': thumb }) pager = client.parseDOM(url_content, 'select', attrs={'name': 'page'})[0] options = client.parseDOM(pager, 'option', ret='value') if (int(options[-1]) > int(page)): self.addDirectoryItem( u'[I]K\u00F6vetkez\u0151 oldal (%d/%s)>>[/I]' % (int(page) + 1, options[-1]), 'movies&page=%d&type=%s&order=%s&search=%s' % (int(page) + 1, tipus, order, search), '', 'DefaultFolder.png') self.endDirectory(type="movies") else: xbmcgui.Dialog().ok('NetMozi', 'Nem található forrás!') xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xbmcgui.ListItem())
def episodes(self, id, fanart, subcats=None): try: myfreemiumcodes = json.loads( xbmcaddon.Addon().getSetting('myfreemiumcodes')) except: myfreemiumcodes = {} class title_sorter: PATTERNS_IN_PRIORITY_ORDER = [ re.compile( r'^(?P<YEAR>\d{2,4})-(?P<MONTH>\d{2})-(?P<DAY>\d{2})$' ), # Date-only re.compile(r'^(?P<SEASON>\d+)\. évad (?P<EPISODE>\d+)\. rész$' ), # Only Season + Episode re.compile(r'^(?P<EPISODE>\d+)\. rész$'), # Only Episode re.compile( r'.* (?P<YEAR>\d{2,4})-(?P<MONTH>\d{2})-(?P<DAY>\d{2})$' ), # Title + Date re.compile( r'.* \((?P<YEAR>\d{2,4})-(?P<MONTH>\d{2})-(?P<DAY>\d{2})\)$' ), # Title + (Date) re.compile( r'^(?P<YEAR>\d{2,4})-(?P<MONTH>\d{2})-(?P<DAY>\d{2}) .*' ), # Date + Title re.compile( r'.* (?P<SEASON>\d+)\. évad (?P<EPISODE>\d+)\. rész$' ), # Title + Season + Episode re.compile(r'.* (?P<EPISODE>\d+)\. rész$') # Title + Episode ] @classmethod def find_first_common_pattern(cls, episodes): for pattern in cls.PATTERNS_IN_PRIORITY_ORDER: if all([ pattern.match(ep.get('title', '')) is not None for ep in episodes ]): return pattern return None @classmethod def all_match_same_pattern(cls, episodes): return cls.find_first_common_pattern(episodes) is not None @classmethod def sorted(cls, episodes, reverse): def key(episode): m = pattern.match(episode.get('title', '')) return tuple(int(i) for i in m.groups()) pattern = cls.find_first_common_pattern(episodes) return sorted(episodes, key=lambda ep: key(ep), reverse=reverse) def getClipID(item): return int(item['clips'][0]['id']) def getEpisode(item): return int(item['clips'][0]['product']['episode']) def allEpisodeFilled(episodes): allFilled = True for item in episodes: if (item['clips'][0]['product']['episode'] is None): allFilled = False return allFilled def episodeIsMostPlus(episode): return (('freemium_products' in item) and (len(item['freemium_products']) > 0)) def userIsEligibleToPlayEpisode(episode): if not episodeIsMostPlus(episode): return True for product in item['freemium_products']: code = product["code"] id = product["id"] if code in myfreemiumcodes and id in myfreemiumcodes[code]: return True return False try: subcats = json.loads(subcats) except: pass if subcats == None: query = base_url + episode_subcat_link subcats = net.request(query % id) subcats = [ i for i in json.loads(subcats)['program_subcats'] if 'id' in i ] if len(subcats) > 1: # the show has multiple seasons or subcategories, list these, and let the user to choose one for item in subcats: str(item['id']) self.addDirectoryItem( py2_encode(item['title']), 'episodes&url=%s&fanart=%s&subcats=%s' % (id, fanart, quote_plus(json.dumps([item]))), '', 'DefaultFolder.png', Fanart=fanart) self.endDirectory(type='seasons') return query = base_url + episode_link episodes = net.request(query % (id, str(subcats[0]['id']))) episodes = json.loads(episodes) hidePlus = xbmcaddon.Addon().getSetting('hide_plus') == 'true' sortedEpisodes = episodes if (xbmcaddon.Addon().getSetting('sort_episodes') == 'true'): reverseSorting = False if (xbmcaddon.Addon().getSetting('sort_reverse') == 'true'): reverseSorting = True if (allEpisodeFilled(episodes)): sortedEpisodes = sorted(episodes, key=getEpisode, reverse=reverseSorting) elif title_sorter.all_match_same_pattern(episodes): sortedEpisodes = title_sorter.sorted(episodes, reverse=reverseSorting) else: sortedEpisodes = sorted(episodes, key=getClipID, reverse=reverseSorting) hasItemsListed = False for item in sortedEpisodes: try: eligible = userIsEligibleToPlayEpisode(item) if (not hidePlus) or eligible: title = py2_encode(item['title']) if not eligible: title = '[COLOR red]' + title + ' [B](Most+)[/B][/COLOR]' plot = py2_encode(item['description']) duration = str(item['duration']) try: thumb = img_link % [ i['external_key'] for i in item['images'] if i['role'] == 'vignette' ][0] except: thumb = img_link % item['display_image']['external_key'] thumb = thumb assets = item['clips'][0].get('assets') clip_id = py2_encode(item['id']) meta = {'title': title, 'plot': plot, 'duration': duration} self.addDirectoryItem( title, 'play&url=%s&meta=%s&image=%s' % (quote_plus(clip_id), quote_plus( json.dumps(meta)), thumb), thumb, 'DefaultTVShows.png', meta=meta, isFolder=False, Fanart=fanart) hasItemsListed = True except: pass self.endDirectory(type='episodes') if hidePlus and not hasItemsListed and len(sortedEpisodes) > 0: xbmcgui.Dialog().ok('RTL Most', freemium_subscription_needed_errormsg) xbmc.executebuiltin("XBMC.Action(Back)")