def servers_menu(item): # from core.support import dbg; dbg() from core import servertools from core.item import Item from platformcode import config, platformtools from specials import setting names = [] ids = [] if item.type == 'debriders': action = 'server_debrid_config' server_list = list(servertools.get_debriders_list().keys()) for server in server_list: server_parameters = servertools.get_server_parameters(server) if server_parameters['has_settings']: names.append(server_parameters['name']) ids.append(server) select = platformtools.dialog_select( config.get_localized_string(60552), names) if select != -1: ID = ids[select] it = Item(channel='settings', action=action, config=ID) setting.server_debrid_config(it) else: action = 'server_config' server_list = list(servertools.get_servers_list().keys()) for server in sorted(server_list): server_parameters = servertools.get_server_parameters(server) if server_parameters["has_settings"] and [ x for x in server_parameters["settings"] if x["id"] not in ["black_list", "white_list"] ]: names.append(server_parameters['name']) ids.append(server) select = platformtools.dialog_select( config.get_localized_string(60538), names) if select != -1: ID = ids[select] it = Item(channel='settings', action=action, config=ID) setting.server_config(it) if select != -1: servers_menu(item)
def thumbnail_type(item): #logger.info() # Se comprueba que tipo de thumbnail se utilizara en findvideos, # Poster o Logo del servidor thumb_type = config.get_setting('video_thumbnail_type') info = item.infoLabels if not item.contentThumbnail: item.contentThumbnail = item.thumbnail if info: if info['thumbnail'] != '': item.contentThumbnail = info['thumbnail'] if item.action == 'play': if thumb_type == 0: if info['thumbnail'] != '': item.thumbnail = info['thumbnail'] elif thumb_type == 1: from core.servertools import get_server_parameters #logger.debug('item.server: %s'%item.server) server_parameters = get_server_parameters(item.server.lower()) item.thumbnail = server_parameters.get("thumbnail", item.contentThumbnail) return item.thumbnail
def thumbnail_type(item): # logger.info() # Check what type of thumbnail will be used in findvideos, Poster or Logo of the server thumb_type = config.get_setting('video_thumbnail_type') info = item.infoLabels if not item.contentThumbnail: item.contentThumbnail = item.thumbnail if info: if info['thumbnail'] != '': item.contentThumbnail = info['thumbnail'] if item.action == 'play': if thumb_type == 0: if info['thumbnail'] != '': item.thumbnail = info['thumbnail'] elif thumb_type == 1: from core.servertools import get_server_parameters # logger.debug('item.server: %s'%item.server) server_parameters = get_server_parameters(item.server.lower()) item.thumbnail = server_parameters.get("thumbnail", item.contentThumbnail) return item.thumbnail
def menu_servers(item): logger.info() itemlist = list() itemlist.append(Item(channel=CHANNELNAME, title="Sevidores bloqueados", action="servers_blacklist", folder=False, thumbnail=get_thumbnail_path("thumb_configuracion_0.png"))) itemlist.append(Item(channel=CHANNELNAME, title="Servidores favoritos", action="servers_favorites", folder=False, thumbnail=get_thumbnail_path("thumb_configuracion_0.png"))) itemlist.append(Item(channel=CHANNELNAME, title="Ajustes de debriders:", action="", folder=False, thumbnail=get_thumbnail_path("thumb_configuracion_0.png"))) # Inicio - Servidores configurables server_list = servertools.get_debriders_list().keys() for server in server_list: server_parameters = servertools.get_server_parameters(server) if server_parameters["has_settings"]: itemlist.append(Item(channel=CHANNELNAME, title=" Configuración del servidor '%s'" % server_parameters["name"], action="server_config", config=server, folder=False, thumbnail="")) itemlist.append(Item(channel=CHANNELNAME, title="Ajustes de servidores", action="", folder=False, thumbnail=get_thumbnail_path("thumb_configuracion_0.png"))) server_list = servertools.get_servers_list().keys() for server in sorted(server_list): server_parameters = servertools.get_server_parameters(server) logger.info(server_parameters) if server_parameters["has_settings"] and filter(lambda x: x["id"] not in ["black_list", "white_list"], server_parameters["settings"]): itemlist.append(Item(channel=CHANNELNAME, title=" Configuración del servidor '%s'" % server_parameters["name"], action="server_config", config=server, folder=False, thumbnail="")) # Fin - Servidores configurables return itemlist
def test_get_video_url(self): module = __import__('servers.%s' % self.name, fromlist=["servers.%s" % self.name]) page_url = self.server.url print('testing ' + page_url) self.assert_(hasattr(module, 'test_video_exists'), self.name + ' has no test_video_exists') try: if module.test_video_exists(page_url)[0]: urls = module.get_video_url(page_url) server_parameters = servertools.get_server_parameters( self.name) self.assertTrue( urls or server_parameters.get("premium"), self.name + ' scraper did not return direct urls for ' + page_url) print(urls) for u in urls: spl = u[1].split('|') if len(spl) == 2: directUrl, headersUrl = spl else: directUrl, headersUrl = spl[0], '' headers = {} if headersUrl: for name in headersUrl.split('&'): h, v = name.split('=') h = str(h) headers[h] = str(v) print(headers) if 'magnet:?' in directUrl: # check of magnet links not supported continue page = downloadpage(directUrl, headers=headers, only_headers=True, use_requests=True) self.assertTrue( page.success, self.name + ' scraper returned an invalid link') self.assertLess( page.code, 400, self.name + ' scraper returned a ' + str(page.code) + ' link') contentType = page.headers['Content-Type'] self.assert_( contentType.startswith('video') or 'mpegurl' in contentType or 'octet-stream' in contentType or 'dash+xml' in contentType, self.name + ' scraper did not return valid url for link ' + page_url + '<br>Direct url: ' + directUrl + '<br>Content-Type: ' + contentType) except: import traceback logger.error(traceback.format_exc())
def menu_servers(item): logger.info() itemlist = list() itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60550), action="servers_blacklist", folder=False, thumbnail=get_thumb("setting_0.png"))) itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60551), action="servers_favorites", folder=False, thumbnail=get_thumb("setting_0.png"))) itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60552), action="", folder=False, text_bold = True, thumbnail=get_thumb("setting_0.png"))) # Inicio - Servidores configurables server_list = servertools.get_debriders_list().keys() for server in server_list: server_parameters = servertools.get_server_parameters(server) if server_parameters["has_settings"]: itemlist.append( Item(channel=CHANNELNAME, title = ". " + config.get_localized_string(60553) % server_parameters["name"], action="server_debrid_config", config=server, folder=False, thumbnail="")) itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60554), action="", folder=False, text_bold = True, thumbnail=get_thumb("setting_0.png"))) server_list = servertools.get_servers_list().keys() for server in sorted(server_list): server_parameters = servertools.get_server_parameters(server) logger.info(server_parameters) if server_parameters["has_settings"] and filter(lambda x: x["id"] not in ["black_list", "white_list"], server_parameters["settings"]): itemlist.append( Item(channel=CHANNELNAME, title=". " + config.get_localized_string(60553) % server_parameters["name"], action="server_config", config=server, folder=False, thumbnail="")) # Fin - Servidores configurables return itemlist
def makeItem(self, item): logger.debug() thumb = item.thumbnail if item.thumbnail else 'Infoplus/' + item.contentType.replace('show','') + 'png' logger.info('THUMB', thumb) it = xbmcgui.ListItem(item.title) it.setProperty('thumb', thumb) it.setProperty('fanart', item.fanart) it.setProperty('plot', item.plot) it.setProperty('verified', item.verified) if item.server: color = scrapertools.find_single_match(item.alive, r'(FF[^\]]+)') it.setProperty('channel', channeltools.get_channel_parameters(item.channel).get('title','')) it.setProperty('thumb', "https://raw.githubusercontent.com/kodiondemand/media/master/resources/servers/%s.png" % item.server.lower()) it.setProperty('servername', servertools.get_server_parameters(item.server.lower()).get('name',item.server)) it.setProperty('color', color if color else 'FF0082C2') return it
def makeItem(self, url): item = Item().fromurl(url) channelParams = channeltools.get_channel_parameters(item.channel) thumb = item.thumbnail if item.thumbnail else 'Infoplus/' + item.contentType.replace( 'show', '') + '.png' logger.info('THUMB', thumb) it = xbmcgui.ListItem(item.title) year = str(item.year if item.year else item.infoLabels.get('year', '')) rating = str(item.infoLabels.get('rating', '')) it.setProperties({ 'thumb': thumb, 'fanart': item.fanart, 'plot': item.plot, 'year': ' [' + year + ']' if year else '', 'rating': ' [' + rating + ']' if rating else '', 'item': url, 'verified': item.verified, 'channel': channelParams['title'], 'channelthumb': channelParams['thumbnail'] if item.verified else '' }) if item.server: color = scrapertools.find_single_match(item.alive, r'(FF[^\]]+)') it.setProperties({ 'channel': channeltools.get_channel_parameters(item.channel).get( 'title', ''), 'thumb': "https://raw.githubusercontent.com/kodiondemand/media/master/resources/servers/%s.png" % item.server.lower(), 'servername': servertools.get_server_parameters(item.server.lower()).get( 'name', item.server), 'color': color if color else 'FF0082C2' }) return it
def test_get_video_url(self): module = __import__('servers.%s' % self.name, fromlist=["servers.%s" % self.name]) page_url = self.server.url # httptools.default_headers['Referer'] = self.server.referer print('testing ' + page_url) print('Found on ' + self.server.foundOn) print() self.assert_(hasattr(module, 'test_video_exists'), self.name + ' has no test_video_exists') if module.test_video_exists(page_url)[0]: urls = module.get_video_url(page_url) server_parameters = servertools.get_server_parameters(self.name) self.assertTrue(urls or server_parameters.get("premium"), self.name + ' scraper did not return direct urls for ' + page_url) print(urls) for u in urls: spl = u[1].split('|') if len(spl) == 2: directUrl, headersUrl = spl else: directUrl, headersUrl = spl[0], '' headers = {} if headersUrl: for name in headersUrl.split('&'): h, v = name.split('=') h = str(h) headers[h] = str(v) print(headers) if 'magnet:?' in directUrl: # check of magnet links not supported continue page = downloadpage(directUrl, headers=headers, only_headers=True, use_requests=True, verify=False) if not page.success and directUrl.split('.')[-1] == 'm3u8': # m3u8 is a text file and HEAD may be forbidden page = downloadpage(directUrl, headers=headers, use_requests=True, verify=False) self.assertTrue(page.success, self.name + ' scraper returned an invalid link') self.assertLess(page.code, 400, self.name + ' scraper returned a ' + str(page.code) + ' link') contentType = page.headers['Content-Type'] self.assert_(contentType.startswith( 'video') or 'mpegurl' in contentType or 'octet-stream' in contentType or 'dash+xml' in contentType, self.name + ' scraper did not return valid url for link ' + page_url + '<br>Direct url: ' + directUrl + '<br>Content-Type: ' + contentType) print('test passed')
def findvideos(item): logger.info() itemlist = [] data = httptools.downloadpage(item.url).data if item.extra != "dd" and item.extra != "descarga": if item.contentType != "movie": bloque_links = scrapertools.find_single_match( data, '<div class="links">(.*?)<\/i>Selecciona un') if bloque_links == "": bloque_links = scrapertools.find_single_match( data, '<div class="links">(.*?)<div class="enlaces">') else: bloque_links = scrapertools.find_single_match( data, '<div class="links">(.*?)<\/i>Descargar') if bloque_links == "": bloque_links = scrapertools.find_single_match( data, '<div class="links">(.*?)<div class="enlaces">') patron = '<a class="goto" rel="nofollow".*?data-id="([^<]+)".*?' patron += 'src="([^"]+)">' patron += '([^<]+)<.*?' patron += 'src="([^"]+)' patron += '">([^<]+).*?' patron += '<span>([^<]+)' links = scrapertools.find_multiple_matches(bloque_links, patron) for id, thumb, server, idiomapng, idioma, calidad in links: idioma = idioma.strip() calidad = calidad.lower() calidad = re.sub(r' ', '-', calidad) if calidad == "ts": calidad = re.sub(r'ts', 'ts-hq', calidad) url = host + "/goto/" url_post = urllib.urlencode({'id': id}) server_name = scrapertools.get_match(server, '(\w+)\.').replace( "waaw", "netutv") server_parameters = servertools.get_server_parameters(server_name) icon_server = server_parameters.get("thumbnail", "") extra = "online" title = server_name + " (" + calidad + ") (" + idioma + ")" itemlist.append( item.clone(title=title, url=url, action="play", thumbnail=icon_server, folder=True, id=url_post, language=idioma, quality=calidad, server=server_name)) else: bloque_dd = scrapertools.find_single_match( data, '<\/i>Descargar(.*?)<div class="enlaces">') links_dd = scrapertools.find_multiple_matches( bloque_dd, '<a class="low".*?data-id="(.*?)".*?src="([^"]+)">([^<]+)<.*?src[^<]+>([^<]+).*?<span>([^<]+)' ) for id, thumb, server, idioma, calidad in links_dd: idioma = idioma.strip() calidad = calidad.lower() calidad = re.sub(r' ', '-', calidad) if calidad == "ts": calidad = re.sub(r'ts', 'ts-hq', calidad) if CALIDADES.get(calidad): calidad = CALIDADES.get(calidad) else: calidad = "[COLOR brown]" + calidad + "[/COLOR]" if IDIOMAS.get(idioma): idioma = IDIOMAS.get(idioma) else: idioma = "[COLOR brown]" + idioma + "[/COLOR]" url = host + "/goto/" data_post = urllib.urlencode({'id': id}) server_name = scrapertools.get_match(server, '(.*?)\.').strip() icon_server = os.path.join(config.get_runtime_path(), "resources", "images", "servers", "server_" + server_name + ".png") icon_server = icon_server.replace('streamin', 'streaminto') icon_server = icon_server.replace('ul', 'uploadedto') if not os.path.exists(icon_server): icon_server = thumb extra = "descarga" itemlist.append( item.clone(title="[COLOR floralwhite][B]" + server + "[/B][/COLOR] " + calidad + " " + idioma, url=url, action="play", thumbnail=icon_server, id=data_post)) if item.infoLabels["year"]: tmdb.set_infoLabels(itemlist) if item.contentType == "movie" and item.extra != "descarga" and item.extra != "online": if config.get_videolibrary_support() and len(itemlist) > 0: itemlist.append( Item(channel=item.channel, title="Añadir película a la videoteca", action="add_pelicula_to_library", url=item.url, text_color="green", infoLabels={'title': item.fulltitle}, thumbnail="http://imgur.com/xjrGmVM.png", fulltitle=item.fulltitle, extra=extra)) if item.extra != "dd" and item.extra != "descarga" and item.extra != "online": bloque_dd = scrapertools.find_single_match( data, '<\/i>Descargar(.*?)<div class="enlaces">') if bloque_dd: itemlist.append( item.clone( title="[COLOR aqua][B]Ver enlaces Descarga[/B][/COLOR] ", action="findvideos", thumbnail=thumb, fanart="", contentType=item.contentType, bloque_dd=bloque_dd, extra="dd")) return itemlist
def onInit(self): #### Compatibility with Kodi 18 #### if config.get_platform(True)['num_version'] < 18: self.setCoordinateResolution(2) if len(self.items) == 0: if Info.action == 'new_search' and Info.mode: from specials.search import new_search itemlist = new_search(Info) elif Info.action == 'channel_search': from specials.search import channel_search itemlist = channel_search(Info) else: self.channel = __import__('channels.%s' % Info.channel, fromlist=["channels.%s" % Info.channel]) if Info.action == 'search': itemlist = getattr(self.channel, 'search')(Info, Info.search_text) else: itemlist = getattr(self.channel, Info.action)(Info) if not itemlist: if platformtools.dialog_yesno(config.get_localized_string(60473), config.get_localized_string(70820) % Info.channel): remove() self.close() return Search(Info.clone(mode=Info.infoLabels['mediatype'])) else: remove() self.close() modal() for item in itemlist: if item.action not in ['save_download', 'add_pelicula_to_library', 'add_serie_to_library', ''] and item.infoLabels['title']: if item.action == 'findvideos' and item.contentType in ['episode', 'tvshow']: it = xbmcgui.ListItem(re.sub(r'\[[^\]]+\]', '', item.title)) self.getControl(NUMBER).setText(support.typo(config.get_localized_string(70362),'uppercase bold')) else: it = xbmcgui.ListItem(item.infoLabels['title']) it.setProperty('channelname', channeltools.get_channel_parameters(item.channel).get('title','')) it.setProperty('channel', item.channel) it.setProperty('action', item.action) it.setProperty('server', servertools.get_server_parameters(item.server.lower()).get('name',item.server)) it.setProperty('url', item.url) for key, value in item.infoLabels.items(): it.setProperty(key, str(value)) if item.action == 'play': it.setProperty('thumbnail', "https://raw.githubusercontent.com/kodiondemand/media/master/resources/servers/%s.png" % item.server.lower()) self.items.append(it) self.itemlist.append(item) if itemlist[0].contentType == 'movie': if not itemlist[0].server: self.commands.append(itemlist[0].clone(action='add_pelicula_to_library', thumbnail=support.thumb('add_to_videolibrary'))) self.commands.append(itemlist[0].clone(channel='downloads', action='save_download', from_channel=itemlist[0].channel, from_action=itemlist[0].action, thumbnail=support.thumb('downloads'))) else: self.commands.append(Info.clone(channel='downloads', action='save_download', from_channel=Info.channel, from_action=Info.action, thumbnail=support.thumb('downloads'))) if itemlist[0].contentType in ['tvshow', 'episode']: if not itemlist[0].server: self.commands.append(itemlist[0].clone(action='add_serie_to_library', thumbnail=support.thumb('add_to_videolibrary'))) self.commands.append(itemlist[0].clone(channel='downloads', action='save_download', from_channel=itemlist[0].channel, from_action=itemlist[0].action, thumbnail=support.thumb('downloads'))) else: self.commands.append(Info.clone(channel='downloads', action='save_download', from_channel=Info.channel, from_action=Info.action, thumbnail=support.thumb('downloads'))) if self.commands: commands = [] for command in self.commands: it = xbmcgui.ListItem(command.title) path = filetools.join(config.get_runtime_path(),'resources','skins','Default','media','Infoplus',command.thumbnail.split('/')[-1].replace('thumb_','')) it.setProperty('thumbnail',path) commands.append(it) self.getControl(COMMANDS).addItems(commands) if self.items: self.getControl(FANART).setImage(self.items[0].getProperty('fanart')) self.getControl(RECOMANDED).addItems(self.items) self.getControl(LOADING).setVisible(False) getFocus(self)
def start(self, list_controls=None, dict_values=None, caption="", callback=None, item=None, custom_button=None, channelpath=None): info() # Media Path self.mediapath = os.path.join(config.get_runtime_path(), 'resources', 'skins', 'Default', 'media') # Params self.list_controls = list_controls self.values = dict_values self.caption = caption self.callback = callback self.item = item if isinstance(custom_button, dict): self.custom_button = {} self.custom_button["label"] = custom_button.get("label", "") self.custom_button["function"] = custom_button.get("function", "") self.custom_button["visible"] = bool( custom_button.get("visible", True)) self.custom_button["close"] = bool( custom_button.get("close", False)) else: self.custom_button = None # Load Channel Settings if not channelpath: channelpath = inspect.currentframe( ).f_back.f_back.f_code.co_filename self.channel = os.path.basename(channelpath).replace(".py", "") self.ch_type = os.path.basename(os.path.dirname(channelpath)) # If list_controls does not exist, it is removed from the channel json if not self.list_controls: # If the channel path is in the "channels" folder, we get the controls and values using chaneltools if os.path.join(config.get_runtime_path(), "channels") in channelpath or os.path.join( config.get_runtime_path(), "specials") in channelpath: # The call is made from a channel self.list_controls, default_values = channeltools.get_channel_controls_settings( self.channel) self.kwargs = {"channel": self.channel} self.channelName = channeltools.get_channel_json( self.channel)['name'] # If the channel path is in the "servers" folder, we get the controls and values through servertools elif os.path.join(config.get_runtime_path(), "servers") in channelpath: # The call is made from a channel self.list_controls, default_values = servertools.get_server_controls_settings( self.channel) self.kwargs = {"server": self.channel} self.channelName = servertools.get_server_parameters( self.channel)['name'] # Else Exit else: return None # If dict_values are not passed, create a blank dict if self.values is None: self.values = {} # Make title if self.caption == "": self.caption = str( config.get_localized_string(30100)) + ' - ' + self.channelName matches = match(self.caption, patron=r'@(\d+)').matches if matches: for m in matches: self.caption = self.caption.replace( '@' + match, config.get_localized_string(int(m))) # Show Window self.return_value = None self.doModal() return self.return_value