From 1f31b7cc20b1dfa2c783c78ad4550d444d5a6b30 Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Fri, 24 May 2019 11:27:17 +0200 Subject: [PATCH 01/12] exeption on raname and fix for help section --- default.py | 4 ++-- {platformcode => specials}/help.json | 0 {platformcode => specials}/help.py | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename {platformcode => specials}/help.json (100%) rename {platformcode => specials}/help.py (100%) diff --git a/default.py b/default.py index bd7fd3e0..26a058fd 100644 --- a/default.py +++ b/default.py @@ -11,9 +11,9 @@ import xbmc from platformcode import config, logger logger.info("init...") -if os.path.isfile(os.path.join(config.get_data_path(), 'alfavorites-default.json')): +if os.path.isfile(os.path.join(config.get_data_path(), 'alfavorites-default.json')) == True and os.path.isfile(os.path.join(config.get_data_path(), 'kodfavorites-default.json')) == False: os.rename(os.path.join(config.get_data_path(), 'alfavorites-default.json'), os.path.join(config.get_data_path(), 'kodfavorites-default.json')) -if os.path.isfile(os.path.join(config.get_data_path(), 'alfa_db.sqlite')): +if os.path.isfile(os.path.join(config.get_data_path(), 'alfa_db.sqlite')) == True and os.path.isfile(os.path.join(config.get_data_path(), 'kod_db.sqlite')) == False: os.rename(os.path.join(config.get_data_path(), 'alfa_db.sqlite'), os.path.join(config.get_data_path(), 'kod_db.sqlite')) librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib')) diff --git a/platformcode/help.json b/specials/help.json similarity index 100% rename from platformcode/help.json rename to specials/help.json diff --git a/platformcode/help.py b/specials/help.py similarity index 100% rename from platformcode/help.py rename to specials/help.py From b4fb980ef66d57949d1f7ec30330ef817e85800f Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Fri, 24 May 2019 16:01:32 +0200 Subject: [PATCH 02/12] Moved to specials --- channels/cloudvideo.py | 36 - specials/autorenumber.py | 1 + {channels => specials}/community.json | 0 {channels => specials}/community.py | 0 specials/renumbertools.py | 1001 ++++++++++++++++++++++++ {channels => specials}/trailertools.py | 0 6 files changed, 1002 insertions(+), 36 deletions(-) delete mode 100644 channels/cloudvideo.py rename {channels => specials}/community.json (100%) rename {channels => specials}/community.py (100%) create mode 100644 specials/renumbertools.py rename {channels => specials}/trailertools.py (100%) diff --git a/channels/cloudvideo.py b/channels/cloudvideo.py deleted file mode 100644 index e8652eeb..00000000 --- a/channels/cloudvideo.py +++ /dev/null @@ -1,36 +0,0 @@ -# Conector Cloudvideo By Alfa development Group -# -------------------------------------------------------- - -import re -from core import httptools -from core import scrapertools -from lib import jsunpack -from platformcode import logger - - -def test_video_exists(page_url): - logger.info("(page_url='%s')" % page_url) - data = httptools.downloadpage(page_url) - if data.code == 404: - return False, "[Cloud] El archivo no existe o ha sido borrado" - return True, "" - - -def get_video_url(page_url, premium=False, user="", password="", video_password=""): - logger.info("url=" + page_url) - video_urls = [] - data = httptools.downloadpage(page_url).data - enc_data = scrapertools.find_single_match(data, "type='text/javascript'>(.*?)") - dec_data = jsunpack.unpack(enc_data) - sources = scrapertools.find_single_match(data, "= S: if E == 0: epList.append([0, SP]) diff --git a/channels/community.json b/specials/community.json similarity index 100% rename from channels/community.json rename to specials/community.json diff --git a/channels/community.py b/specials/community.py similarity index 100% rename from channels/community.py rename to specials/community.py diff --git a/specials/renumbertools.py b/specials/renumbertools.py new file mode 100644 index 00000000..89a391ac --- /dev/null +++ b/specials/renumbertools.py @@ -0,0 +1,1001 @@ +# -*- coding: utf-8 -*- +# -------------------------------------------------------------------------------- +# renumeratetools - se encarga de renumerar episodios +# -------------------------------------------------------------------------------- + +import os + +try: + import xbmcgui +except: + xbmcgui = None + +from platformcode import config, logger +from core import jsontools +from core.item import Item +from platformcode import platformtools + +TAG_TVSHOW_RENUMERATE = "TVSHOW_RENUMBER" +TAG_SEASON_EPISODE = "season_episode" +__channel__ = "renumbertools" + + +def access(): + """ + Devuelve si se puede usar o no renumbertools + """ + allow = False + + if config.is_xbmc(): + allow = True + + return allow + + +def context(item): + """ + Para xbmc/kodi que pueden mostrar el menú contextual, se añade un menu para configuración + la opción de renumerar, sólo si es para series. + + @param item: elemento para obtener la información y ver que contexto añadir + @type item: item + @return: lista de opciones a mostrar en el menú contextual + @rtype: list + """ + + # Dependiendo de como sea el contexto lo guardamos y añadimos las opciones de filtertools. + if type(item.context) == str: + _context = item.context.split("|") + elif type(item.context) == list: + _context = item.context + else: + _context = [] + + if access(): + dict_data = {"title": config.get_localized_string(70585), "action": "config_item", "channel": "renumbertools"} + _context.append(dict_data) + + return _context + + +def show_option(channel, itemlist): + if access(): + itemlist.append(Item(channel=__channel__, title="[COLOR yellow]" + config.get_localized_string(70586)+ "[/COLOR]", + action="load", from_channel=channel)) + + return itemlist + + +def load(item): + return mainlist(channel=item.from_channel) + + +def mainlist(channel): + """ + Muestra una lista de las series renumeradas + + :param channel: nombre del canal para obtener las series renumeradas + :type channel: str + :return: lista de Item + :rtype: list[Item] + """ + logger.info() + itemlist = [] + dict_series = jsontools.get_node_from_file(channel, TAG_TVSHOW_RENUMERATE) + + idx = 0 + for tvshow in sorted(dict_series): + tag_color = "0xff008000" + if idx % 2 == 0: + tag_color = "blue" + + idx += 1 + name = tvshow + title = config.get_localized_string(70587)+" [COLOR %s][%s][/COLOR]" % (tag_color, name) + + itemlist.append(Item(channel=__channel__, action="config_item", title=title, show=name, from_channel=channel)) + + if len(itemlist) == 0: + itemlist.append(Item(channel=channel, action="mainlist", + title=config.get_localized_string(70588) + ' ' + config.get_localized_string(70585))) + + return itemlist + + +def config_item(item): + """ + muestra una serie renumerada para su configuración + + :param item: item + :type item: Item + """ + logger.info("item %s" % item.tostring("\n")) + + dict_series = jsontools.get_node_from_file(item.from_channel, TAG_TVSHOW_RENUMERATE) + data = dict_series.get(item.show, {}) + + if data: + data = data.get(TAG_SEASON_EPISODE, []) + + ventana = RenumberWindow(show=item.show, channel=item.from_channel, data=data) + del ventana + else: + # tenemos información y devolvemos los datos añadidos para que se muestre en la ventana + if data: + return add_season(data) + # es la primera vez que se añaden datos (usando menú contextual) por lo que no devolvemos nada + # para evitar error al listar los items + else: + data = add_season(data) + write_data(item.from_channel, item.show, data) + + +def numbered_for_tratk(channel, show, season, episode): + """ + Devuelve la temporada y episodio convertido para que se marque correctamente en tratk.tv + + @param channel: Nombre del canal + @type channel: str + @param show: Nombre de la serie a comprobar + @type show: str + @param season: Temporada que devuelve el scrapper + @type season: int + @param episode: Episodio que devuelve el scrapper + @type episode: int + @return: season, episode + @rtype: int, int + """ + logger.info() + + if access(): + show = show.lower() + + new_season = season + new_episode = episode + dict_series = jsontools.get_node_from_file(channel, TAG_TVSHOW_RENUMERATE) + + # ponemos en minusculas el key, ya que previamente hemos hecho lo mismo con show. + for key in dict_series.keys(): + new_key = key.lower() + if new_key != key: + dict_series[new_key] = dict_series[key] + del dict_series[key] + + if show in dict_series: + logger.debug(config.get_localized_string(70589) + " %s" % dict_series[show]) + + if len(dict_series[show]['season_episode']) > 1: + for row in dict_series[show]['season_episode']: + + if new_episode > row[1]: + new_episode -= row[1] + new_season = row[0] + break + + else: + new_season = dict_series[show]['season_episode'][0][0] + new_episode += dict_series[show]['season_episode'][0][1] + + logger.debug("%s:%s" % (new_season, new_episode)) + else: + # no se tiene acceso se devuelven los datos. + new_season = season + new_episode = episode + + return new_season, new_episode + + +def borrar(channel, show): + logger.info() + heading = config.get_localized_string(70590) + line1 = config.get_localized_string(70591) + ' [COLOR blue]' + show.strip() + '[/COLOR], ' + config.get_localized_string(70592) + + if platformtools.dialog_yesno(heading, line1) == 1: + dict_series = jsontools.get_node_from_file(channel, TAG_TVSHOW_RENUMERATE) + dict_series.pop(show, None) + + result, json_data = jsontools.update_node(dict_series, channel, TAG_TVSHOW_RENUMERATE) + + if result: + message = config.get_localized_string(60444) + else: + message = config.get_localized_string(70593) + + heading = show.strip() + platformtools.dialog_notification(heading, message) + + +def add_season(data=None): + logger.debug("data %s" % data) + heading = config.get_localized_string(70594) + # default = 2 + # se reordena la lista + list_season_episode = data + if list_season_episode: + list_season_episode.sort(key=lambda el: int(el[0]), reverse=False) + + # if list_season_episode: + # # mostrar temporada + 1 de la lista + # # TODO buscar la primera posicion libre + # default = list_season_episode[0][0]+1 + + season = platformtools.dialog_numeric(0, heading) # , str(default)) + for element in list_season_episode: + if int(season) == element[0]: + platformtools.dialog_notification(config.get_localized_string(70595), config.get_localized_string(70596)) + return + + # si hemos insertado un valor en la temporada + if season != "" and int(season) > 0: + heading = config.get_localized_string(70597) + # default = 0 + # if list_season_episode: + # for e in list_season_episode: + # # mostrar suma episodios de la lista + # # sumar hasta el indice del primer libre encontrado + # default += e[1] + episode = platformtools.dialog_numeric(0, heading) # , str(default)) + + # si hemos insertado un valor en el episodio + if episode != "": + if list_season_episode: + list_season_episode.insert(0, [int(season), int(episode)]) + new_list_season_episode = list_season_episode[:] + return new_list_season_episode + else: + return [[int(season), int(episode)]] + + +def write_data(channel, show, data): + # OBTENEMOS LOS DATOS DEL JSON + dict_series = jsontools.get_node_from_file(channel, TAG_TVSHOW_RENUMERATE) + tvshow = show.strip() + list_season_episode = dict_series.get(tvshow, {}).get(TAG_SEASON_EPISODE, []) + logger.debug("data %s" % list_season_episode) + + if data: + # cambiamos el orden para que se vea en orden descendente y usarse bien en el _data.json + data.sort(key=lambda el: int(el[0]), reverse=True) + dict_renumerate = {TAG_SEASON_EPISODE: data} + + dict_series[tvshow] = dict_renumerate + else: + # hemos borrado todos los elementos, por lo que se borra la serie del fichero + dict_series.pop(tvshow, None) + + result, json_data = jsontools.update_node(dict_series, channel, TAG_TVSHOW_RENUMERATE) + + if result: + if data: + message = config.get_localized_string(60446) + else: + message = config.get_localized_string(60444) + else: + message = config.get_localized_string(70593) + + heading = show.strip() + platformtools.dialog_notification(heading, message) + + +if xbmcgui: + + # Align + ALIGN_LEFT = 0 + ALIGN_RIGHT = 1 + ALIGN_CENTER_X = 2 + ALIGN_CENTER_Y = 4 + ALIGN_CENTER = 6 + ALIGN_TRUNCATED = 8 + ALIGN_JUSTIFY = 10 + + # button ids + ID_BUTTON_CLOSE = 3003 + ID_BUTTON_ADD_SEASON = 3008 + ID_BUTTON_INFO = 3009 + ID_CHECK_UPDATE_INTERNET = 3010 + ID_BUTTON_OK = 3012 + ID_BUTTON_CANCEL = 3013 + ID_BUTTON_DELETE = 3014 + + + class RenumberWindow(xbmcgui.WindowDialog): + def __init__(self, *args, **kwargs): + logger.debug() + + #### Compatibilidad con Kodi 18 #### + if config.get_platform(True)['num_version'] < 18: + if xbmcgui.__version__ == "1.2": + self.setCoordinateResolution(1) + else: + self.setCoordinateResolution(5) + + self.show = kwargs.get("show") + self.channel = kwargs.get("channel") + self.data = kwargs.get("data") + self.init = True + + self.mediapath = os.path.join(config.get_runtime_path(), 'resources', 'skins', 'Default', 'media') + self.font = "font12" + + window_bg = xbmcgui.ControlImage(320, 130, 600, 440, + os.path.join(self.mediapath, 'Windows', 'DialogBack.png')) + self.addControl(window_bg) + + header_bg = xbmcgui.ControlImage(window_bg.getX(), window_bg.getY() + 8, window_bg.getWidth(), 35, + os.path.join(self.mediapath, 'Windows', 'dialogheader.png')) + self.addControl(header_bg) + + btn_close_w = 64 + self.btn_close = xbmcgui.ControlButton(window_bg.getX() + window_bg.getWidth() - btn_close_w - 13, + header_bg.getY() + 6, btn_close_w, 30, '', + focusTexture=os.path.join(self.mediapath, 'Controls', + 'DialogCloseButton-focus.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'DialogCloseButton.png')) + self.addControl(self.btn_close) + + header_title_x = window_bg.getX() + 20 + header_title = xbmcgui.ControlFadeLabel(header_title_x, header_bg.getY() + 5, self.btn_close.getX() - + header_title_x, 30, font="font12_title", textColor="0xFFFFA500", + _alignment=ALIGN_CENTER) + self.addControl(header_title) + header_title.addLabel(self.show) + + self.controls_bg = xbmcgui.ControlImage(window_bg.getX() + 20, header_bg.getY() + header_bg.getHeight() + 6, + 562, 260, + os.path.join(self.mediapath, 'Windows', 'BackControls.png')) + self.addControl(self.controls_bg) + + self.scroll_bg = xbmcgui.ControlImage(window_bg.getX() + window_bg.getWidth() - 25, self.controls_bg.getY(), + 10, + self.controls_bg.getHeight(), os.path.join(self.mediapath, 'Controls', + 'ScrollBack.png')) + self.addControl(self.scroll_bg) + self.scroll_bg.setVisible(False) + + self.scroll2_bg = xbmcgui.ControlImage(window_bg.getX() + window_bg.getWidth() - 25, + self.controls_bg.getY(), + 10, self.controls_bg.getHeight(), os.path.join(self.mediapath, + 'Controls', + 'ScrollBar.png')) + self.addControl(self.scroll2_bg) + self.scroll2_bg.setVisible(False) + + btn_add_season = xbmcgui.ControlButton(window_bg.getX() + 20, self.controls_bg.getY() + + self.controls_bg.getHeight() + 14, 165, 30, config.get_localized_string(70600), + font=self.font, focusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKey.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKeyNF.png'), + alignment=ALIGN_CENTER) + self.addControl(btn_add_season) + + self.btn_info = xbmcgui.ControlButton(window_bg.getX() + 210, btn_add_season.getY(), 120, 30, config.get_localized_string(60348), + font=self.font, focusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKey.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKeyNF.png'), + alignment=ALIGN_CENTER) + self.addControl(self.btn_info) + + check_update_internet_w = 235 + # Versiones antiguas no admite algunas texturas + if xbmcgui.__version__ in ["1.2", "2.0"]: + self.check_update_internet = xbmcgui.ControlRadioButton( + window_bg.getX() + window_bg.getWidth() - check_update_internet_w - 20, btn_add_season.getY() - 3, + check_update_internet_w, 34, config.get_localized_string(70601), font=self.font, + focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png')) + else: + self.check_update_internet = xbmcgui.ControlRadioButton( + window_bg.getX() + window_bg.getWidth() - check_update_internet_w - 20, btn_add_season.getY() - 3, + check_update_internet_w, 34, config.get_localized_string(70601), font=self.font, + focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'), + focusOnTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-focus.png'), + noFocusOnTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-focus.png'), + focusOffTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-nofocus.png'), + noFocusOffTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-nofocus.png')) + + self.addControl(self.check_update_internet) + self.check_update_internet.setEnabled(False) + + hb_bg = xbmcgui.ControlImage(window_bg.getX() + 20, btn_add_season.getY() + btn_add_season.getHeight() + 13, + window_bg.getWidth() - 40, 2, + os.path.join(self.mediapath, 'Controls', 'ScrollBack.png')) + self.addControl(hb_bg) + + self.btn_ok = xbmcgui.ControlButton(window_bg.getX() + 68, hb_bg.getY() + hb_bg.getHeight() + 13, 120, 30, + 'OK', font=self.font, + focusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKey.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKeyNF.png'), + alignment=ALIGN_CENTER) + self.addControl(self.btn_ok) + + self.btn_cancel = xbmcgui.ControlButton(self.btn_info.getX() + 30, self.btn_ok.getY(), 120, 30, config.get_localized_string(70002), + font=self.font, + focusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKey.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKeyNF.png'), + alignment=ALIGN_CENTER) + self.addControl(self.btn_cancel) + + self.btn_delete = xbmcgui.ControlButton(self.btn_cancel.getX() + self.btn_cancel.getWidth() + 50, + self.btn_ok.getY(), 120, 30, config.get_localized_string(60437), font=self.font, + focusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKey.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKeyNF.png'), + alignment=ALIGN_CENTER) + self.addControl(self.btn_delete) + + self.controls = [] + self.onInit() + self.setFocus(self.controls[0].edit_season) + self.doModal() + + def onInit(self, *args, **kwargs): + try: + # listado temporada / episodios + pos_y = self.controls_bg.getY() + 10 + + # eliminamos los componentes al repintar la ventana + for linea in self.controls: + self.removeControls(linea.list_elements()) + + # mostramos el scroll si hay más de 5 elementos + if len(self.data) > 5: + self.controls_bg.setWidth(545) + self.scroll_bg.setVisible(True) + self.scroll2_bg.setVisible(True) + else: + self.controls_bg.setWidth(562) + self.scroll_bg.setVisible(False) + self.scroll2_bg.setVisible(False) + + self.controls = [] + # cambiamos el orden para que se vea en orden ascendente + self.data.sort(key=lambda el: int(el[0]), reverse=False) + + for index, e in enumerate(self.data): + pos_x = self.controls_bg.getX() + 15 + label_season_w = 100 + label_season = xbmcgui.ControlLabel(pos_x, pos_y + 3, label_season_w, 34, + config.get_localized_string(60385), font=self.font, textColor="0xFF2E64FE") + self.addControl(label_season) + label_season.setVisible(False) + + pos_x += label_season_w + 5 + + # TODO mirar retro-compatilibidad + # if xbmcgui.ControlEdit == ControlEdit: + # edit_season = xbmcgui.ControlEdit(0, 0, 0, 0, '', font=self.font, isPassword=False, + # textColor='', + # focusTexture=os.path.join(self.mediapath, 'Controls', + # 'MenuItemFO.png'), + # noFocusTexture=os.path.join(self.mediapath, 'Controls', + # 'MenuItemNF.png'), window=self) + # else: + + # control bugeado se tiene que usar metodos sets para que se cree correctamente. + edit_season = xbmcgui.ControlEdit(0, 0, 0, 0, "", self.font, "", '', 4, isPassword=False, + focusTexture=os.path.join(self.mediapath, 'Controls', + 'MenuItemFO.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'MenuItemNF.png')) + self.addControl(edit_season) + edit_season.setText(str(e[0])) + # edit_season.setLabel("Temporada:", font=self.font, textColor="0xFF2E64FE") + edit_season.setPosition(pos_x, pos_y - 2) + edit_season.setWidth(25) + edit_season.setHeight(35) + edit_season.setVisible(False) + + label_episode_w = 90 + pos_x += edit_season.getWidth() + 60 + label_episode = xbmcgui.ControlLabel(pos_x, pos_y + 3, label_episode_w, 34, config.get_localized_string(70598), + font=self.font, textColor="0xFF2E64FE") + self.addControl(label_episode) + label_episode.setVisible(False) + + pos_x += label_episode_w + 5 + # control bugeado se tiene que usar metodos sets para que se cree correctamente. + edit_episode = xbmcgui.ControlEdit(0, 0, 0, 0, "", self.font, "", '', 4, isPassword=False, + focusTexture=os.path.join(self.mediapath, 'Controls', + 'MenuItemFO.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'MenuItemNF.png')) + self.addControl(edit_episode) + edit_episode.setText(str(e[1])) + # edit_episode.setLabel("Episodios:", font=self.font, textColor="0xFF2E64FE") + edit_episode.setPosition(pos_x, pos_y - 2) + edit_episode.setWidth(40) + edit_episode.setHeight(35) + edit_episode.setVisible(False) + + btn_delete_season_w = 120 + btn_delete_season = xbmcgui.ControlButton(self.controls_bg.getX() + self.controls_bg.getWidth() - + btn_delete_season_w - 14, pos_y, btn_delete_season_w, 30, + config.get_localized_string(70599), font=self.font, + focusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKey.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', + 'KeyboardKeyNF.png'), + alignment=ALIGN_CENTER) + self.addControl(btn_delete_season) + btn_delete_season.setVisible(False) + + hb_bg = xbmcgui.ControlImage(self.controls_bg.getX() + 10, pos_y + 40, + self.controls_bg.getWidth() - 20, + 2, os.path.join(self.mediapath, 'Controls', 'ScrollBack.png')) + self.addControl(hb_bg) + hb_bg.setVisible(False) + + group = ControlGroup(label_season=label_season, edit_season=edit_season, + label_episode=label_episode, + edit_episode=edit_episode, btn_delete_season=btn_delete_season, hb=hb_bg) + + pos_y += 50 + + if index < 5: + group.set_visible(True) + + self.controls.append(group) + + if len(self.data) > 5: + self.move_scroll() + + except Exception, Ex: + logger.error("HA HABIDO UNA HOSTIA %s" % Ex) + + # def onClick(self, control_id): + # pass + # + # def onFocus(self, control_id): + # pass + + def onControl(self, control): + # logger.debug("%s" % control.getId()) + control_id = control.getId() + + if control_id == ID_BUTTON_OK: + write_data(self.channel, self.show, self.data) + self.close() + if control_id in [ID_BUTTON_CLOSE, ID_BUTTON_CANCEL]: + self.close() + elif control_id == ID_BUTTON_DELETE: + self.close() + borrar(self.channel, self.show) + elif control_id == ID_BUTTON_ADD_SEASON: + # logger.debug("data que enviamos: {}".format(self.data)) + data = add_season(self.data) + if data: + self.data = data + # logger.debug("data que recibimos: {}".format(self.data)) + self.onInit() + + # si hay más de 5 elementos movemos el scroll + if len(self.data) > 5: + self.scroll(len(self.data) - 2, 1) + self.move_scroll() + + elif control_id == ID_BUTTON_INFO: + self.method_info() + else: + for x, grupo in enumerate(self.controls): + if control_id == self.controls[x].btn_delete_season.getId(): + # logger.debug("A data %s" % self.data) + self.removeControls(self.controls[x].list_elements()) + del self.controls[x] + del self.data[x] + # logger.debug("D data %s" % self.data) + self.onInit() + + return + + def onAction(self, action): + # logger.debug("%s" % action.getId()) + # logger.debug("focus %s" % self.getFocusId()) + # Obtenemos el foco + focus = self.getFocusId() + + action = action.getId() + # Flecha izquierda + if action == xbmcgui.ACTION_MOVE_LEFT: + # Si el foco no está en ninguno de los 6 botones inferiores, y esta en un "list" cambiamos el valor + if focus not in [ID_BUTTON_ADD_SEASON, ID_BUTTON_INFO, ID_CHECK_UPDATE_INTERNET, + ID_BUTTON_OK, ID_BUTTON_CANCEL, ID_BUTTON_DELETE]: + + # Localizamos en el listado de controles el control que tiene el focus + # todo mirar tema del cursor en el valor al desplazar lateralmente + for x, linea in enumerate(self.controls): + if focus == linea.edit_season.getId(): + return self.setFocus(self.controls[x].btn_delete_season) + elif focus == linea.edit_episode.getId(): + return self.setFocus(self.controls[x].edit_season) + elif focus == linea.btn_delete_season.getId(): + return self.setFocus(self.controls[x].edit_episode) + + # Si el foco está en alguno de los 6 botones inferiores, movemos al siguiente + else: + if focus in [ID_BUTTON_ADD_SEASON, ID_BUTTON_INFO, ID_CHECK_UPDATE_INTERNET]: + if focus == ID_BUTTON_ADD_SEASON: + self.setFocusId(ID_BUTTON_INFO) + # TODO cambiar cuando se habilite la opcion de actualizar por internet + # self.setFocusId(ID_CHECK_UPDATE_INTERNET) + elif focus == ID_BUTTON_INFO: + self.setFocusId(ID_BUTTON_ADD_SEASON) + elif focus == ID_CHECK_UPDATE_INTERNET: + self.setFocusId(ID_BUTTON_INFO) + + elif focus in [ID_BUTTON_OK, ID_BUTTON_CANCEL, ID_BUTTON_DELETE]: + if focus == ID_BUTTON_OK: + self.setFocusId(ID_BUTTON_DELETE) + elif focus == ID_BUTTON_CANCEL: + self.setFocusId(ID_BUTTON_OK) + elif focus == ID_BUTTON_DELETE: + self.setFocusId(ID_BUTTON_CANCEL) + + # Flecha derecha + elif action == xbmcgui.ACTION_MOVE_RIGHT: + # Si el foco no está en ninguno de los 6 botones inferiores, y esta en un "list" cambiamos el valor + if focus not in [ID_BUTTON_ADD_SEASON, ID_BUTTON_INFO, ID_CHECK_UPDATE_INTERNET, + ID_BUTTON_OK, ID_BUTTON_CANCEL, ID_BUTTON_DELETE]: + + # Localizamos en el listado de controles el control que tiene el focus + # todo mirar tema del cursor en el valor al desplazar lateralmente + for x, linea in enumerate(self.controls): + if focus == linea.edit_season.getId(): + return self.setFocus(self.controls[x].edit_episode) + elif focus == linea.edit_episode.getId(): + return self.setFocus(self.controls[x].btn_delete_season) + elif focus == linea.btn_delete_season.getId(): + return self.setFocus(self.controls[x].edit_season) + + # Si el foco está en alguno de los 6 botones inferiores, movemos al siguiente + else: + if focus in [ID_BUTTON_ADD_SEASON, ID_BUTTON_INFO, ID_CHECK_UPDATE_INTERNET]: + if focus == ID_BUTTON_ADD_SEASON: + self.setFocusId(ID_BUTTON_INFO) + if focus == ID_BUTTON_INFO: + self.setFocusId(ID_BUTTON_ADD_SEASON) + # TODO cambiar cuando se habilite la opcion de actualizar por internet + # self.setFocusId(ID_CHECK_UPDATE_INTERNET) + if focus == ID_CHECK_UPDATE_INTERNET: + self.setFocusId(ID_BUTTON_OK) + + elif focus in [ID_BUTTON_OK, ID_BUTTON_CANCEL, ID_BUTTON_DELETE]: + if focus == ID_BUTTON_OK: + self.setFocusId(ID_BUTTON_CANCEL) + if focus == ID_BUTTON_CANCEL: + self.setFocusId(ID_BUTTON_DELETE) + if focus == ID_BUTTON_DELETE: + self.setFocusId(ID_BUTTON_OK) + + # Flecha arriba + elif action == xbmcgui.ACTION_MOVE_UP: + self.move_up(focus) + # Flecha abajo + elif action == xbmcgui.ACTION_MOVE_DOWN: + self.move_down(focus) + # scroll up + elif action == xbmcgui.ACTION_MOUSE_WHEEL_UP: + self.move_up(focus) + # scroll down + elif action == xbmcgui.ACTION_MOUSE_WHEEL_DOWN: + self.move_down(focus) + + # ACTION_PAGE_DOWN = 6 + # ACTION_PAGE_UP = 5 + + # Menú previo o Atrás + elif action in [xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]: + self.close() + + def move_down(self, focus): + # logger.debug("focus " + str(focus)) + # Si el foco está en uno de los tres botones medios, bajamos el foco a la otra linea de botones + if focus in [ID_BUTTON_ADD_SEASON, ID_BUTTON_INFO, ID_CHECK_UPDATE_INTERNET]: + if focus == ID_BUTTON_ADD_SEASON: + self.setFocusId(ID_BUTTON_OK) + elif focus == ID_BUTTON_INFO: + self.setFocusId(ID_BUTTON_CANCEL) + elif focus == ID_CHECK_UPDATE_INTERNET: + self.setFocusId(ID_BUTTON_DELETE) + # Si el foco está en uno de los tres botones inferiores, subimos el foco al primer control del listado + elif focus in [ID_BUTTON_OK, ID_BUTTON_CANCEL, ID_BUTTON_DELETE]: + first_visible = 0 + for x, linea in enumerate(self.controls): + if linea.get_visible(): + first_visible = x + break + + if focus == ID_BUTTON_OK: + self.setFocus(self.controls[first_visible].edit_season) + elif focus == ID_BUTTON_CANCEL: + self.setFocus(self.controls[first_visible].edit_episode) + elif focus == ID_BUTTON_DELETE: + self.setFocus(self.controls[first_visible].btn_delete_season) + # nos movemos entre los elementos del listado + else: + # Localizamos en el listado de controles el control que tiene el focus + for x, linea in enumerate(self.controls): + if focus == linea.edit_season.getId(): + if x + 1 < len(self.controls): + if not self.controls[x + 1].get_visible(): + self.scroll(x, 1) + + return self.setFocus(self.controls[x + 1].edit_season) + else: + return self.setFocusId(ID_BUTTON_ADD_SEASON) + elif focus == linea.edit_episode.getId(): + if x + 1 < len(self.controls): + if not self.controls[x + 1].get_visible(): + self.scroll(x, 1) + + return self.setFocus(self.controls[x + 1].edit_episode) + else: + self.setFocusId(ID_BUTTON_INFO) + elif focus == linea.btn_delete_season.getId(): + if x + 1 < len(self.controls): + if not self.controls[x + 1].get_visible(): + self.scroll(x, 1) + + return self.setFocus(self.controls[x + 1].btn_delete_season) + else: + return self.setFocusId(ID_BUTTON_INFO) + # TODO cambiar cuando se habilite la opcion de actualizar por internet + # return self.setFocusId(ID_CHECK_UPDATE_INTERNET) + + def move_up(self, focus): + # Si el foco está en uno de los tres botones medios, subimos el foco al último control del listado + if focus in [ID_BUTTON_ADD_SEASON, ID_BUTTON_INFO, ID_CHECK_UPDATE_INTERNET]: + last_visible = 0 + for x, linea in reversed(list(enumerate(self.controls))): + if linea.get_visible(): + last_visible = x + break + + if focus == ID_BUTTON_ADD_SEASON: + self.setFocus(self.controls[last_visible].edit_season) + elif focus == ID_BUTTON_INFO: + self.setFocus(self.controls[last_visible].edit_episode) + elif focus == ID_CHECK_UPDATE_INTERNET: + self.setFocus(self.controls[last_visible].btn_delete_season) + # Si el foco está en uno de los tres botones inferiores, subimos el foco a la otra linea de botones + elif focus in [ID_BUTTON_OK, ID_BUTTON_CANCEL, ID_BUTTON_DELETE]: + if focus == ID_BUTTON_OK: + self.setFocusId(ID_BUTTON_ADD_SEASON) + elif focus == ID_BUTTON_CANCEL: + self.setFocusId(ID_BUTTON_INFO) + elif focus == ID_BUTTON_DELETE: + self.setFocusId(ID_BUTTON_INFO) + # TODO cambiar cuando se habilite la opcion de actualizar por internet + # self.setFocusId(ID_CHECK_UPDATE_INTERNET) + # nos movemos entre los elementos del listado + else: + # Localizamos en el listado de controles el control que tiene el focus + for x, linea in enumerate(self.controls): + if focus == linea.edit_season.getId(): + if x > 0: + if not self.controls[x - 1].get_visible(): + self.scroll(x, -1) + + return self.setFocus(self.controls[x - 1].edit_season) + else: + return self.setFocusId(ID_BUTTON_OK) + elif focus == linea.edit_episode.getId(): + if x > 0: + if not self.controls[x - 1].get_visible(): + self.scroll(x, -1) + + return self.setFocus(self.controls[x - 1].edit_episode) + else: + self.setFocusId(ID_BUTTON_CANCEL) + elif focus == linea.btn_delete_season.getId(): + if x > 0: + if not self.controls[x - 1].get_visible(): + self.scroll(x, -1) + + return self.setFocus(self.controls[x - 1].btn_delete_season) + else: + return self.setFocusId(ID_BUTTON_DELETE) + # TODO cambiar cuando se habilite la opcion de actualizar por internet + # return self.setFocusId(ID_CHECK_UPDATE_INTERNET) + + def scroll(self, position, movement): + try: + for index, group in enumerate(self.controls): + # ponemos todos los elementos como no visibles + group.set_visible(False) + + if movement > 0: + pos_fin = position + movement + 1 + pos_inicio = pos_fin - 5 + else: + pos_inicio = position + movement + pos_fin = pos_inicio + 5 + + # logger.debug("position {}, movement {}, pos_inicio{}, pos_fin{}, self.data.length{}". + # format(position, movement, pos_inicio, pos_fin, len(self.data))) + pos_y = self.controls_bg.getY() + 10 + for i in range(pos_inicio, pos_fin): + pos_x = self.controls_bg.getX() + 15 + + self.controls[i].label_season.setPosition(pos_x, pos_y + 3) + + pos_x += self.controls[i].label_season.getWidth() + 5 + self.controls[i].edit_season.setPosition(pos_x, pos_y - 2) + + pos_x += self.controls[i].edit_season.getWidth() + 60 + self.controls[i].label_episode.setPosition(pos_x, pos_y + 3) + + pos_x += self.controls[i].label_episode.getWidth() + 5 + self.controls[i].edit_episode.setPosition(pos_x, pos_y - 2) + + self.controls[i].btn_delete_season.setPosition( + self.controls_bg.getX() + self.controls_bg.getWidth() - + self.controls[i].btn_delete_season.getWidth() - 14, + pos_y) + + self.controls[i].hb.setPosition(self.controls_bg.getX() + 10, pos_y + 40) + + pos_y += 50 + + # logger.debug("ponemos como True %s" % i) + self.controls[i].set_visible(True) + + self.move_scroll() + + except Exception, Ex: + logger.error("HA HABIDO UNA HOSTIA %s" % Ex) + + def move_scroll(self): + visible_controls = [group for group in self.controls if group.get_visible() == True] + hidden_controls = [group for group in self.controls if group.get_visible() == False] + scroll_position = self.controls.index(visible_controls[0]) + scrollbar_height = self.scroll_bg.getHeight() - (len(hidden_controls) * 10) + scrollbar_y = self.scroll_bg.getPosition()[1] + (scroll_position * 10) + self.scroll2_bg.setPosition(self.scroll_bg.getPosition()[0], scrollbar_y) + self.scroll2_bg.setHeight(scrollbar_height) + + @staticmethod + def method_info(): + title = config.get_localized_string(60348) + # text = "La primera temporada que se añade siempre empieza en \"0\" episodios, la segunda temporada que se " + # text += "añade empieza en el número total de episodios de la primera temporada, la tercera temporada será " + # text += "la suma de los episodios de las temporadas previas y así sucesivamente.\n" + # text += "[COLOR blue]\nEjemplo de serie divida en varias temporadas:\n" + # text += "\nFairy Tail:\n" + # text += " - SEASON 1: EPISODE 48 --> [season 1, episode: 0]\n" + # text += " - SEASON 2: EPISODE 48 --> [season 2, episode: 48]\n" + # text += " - SEASON 3: EPISODE 54 --> [season 3, episode: 96 ([48=season2] + [48=season1])]\n" + # text += " - SEASON 4: EPISODE 175 --> [season 4: episode: 150 ([54=season3] + [48=season2] + [48=season3" \ + # "])][/COLOR]\n" + # text += "[COLOR green]\nEjemplo de serie que continua en la temporada de la original:\n" + # text += "\nFate/Zero 2nd Season:\n" + # text += " - SEASON 1: EPISODE 12 --> [season 1, episode: 13][/COLOR]\n" + + # text += "[COLOR blue]\nEjemplo de serie que es la segunda temporada de la original:\n" + # text += "\nFate/kaleid liner Prisma☆Illya 2wei!:\n" + # text += " - SEASON 1: EPISODE 12 --> [season 2, episode: 0][/COLOR]\n" + text = config.get_localized_string(70602) + + return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) + + + class ControlGroup: + """ + conjunto de controles, son los elementos que se muestra por línea de una lista. + """ + + def __init__(self, label_season, edit_season, label_episode, edit_episode, btn_delete_season, hb): + self.visible = False + self.label_season = label_season + self.edit_season = edit_season + self.label_episode = label_episode + self.edit_episode = edit_episode + self.btn_delete_season = btn_delete_season + self.hb = hb + + def list_elements(self): + return [self.label_season, self.edit_season, self.label_episode, self.edit_episode, self.btn_delete_season, + self.hb] + + def get_visible(self): + return self.visible + + def set_visible(self, visible): + self.visible = visible + self.label_season.setVisible(visible) + self.edit_season.setVisible(visible) + self.label_episode.setVisible(visible) + self.edit_episode.setVisible(visible) + self.btn_delete_season.setVisible(visible) + self.hb.setVisible(visible) + + + class TextBox(xbmcgui.WindowXMLDialog): + """ Create a skinned textbox window """ + + def __init__(self, *args, **kwargs): + self.title = kwargs.get('title') + self.text = kwargs.get('text') + self.doModal() + + def onInit(self): + try: + self.getControl(5).setText(self.text) + self.getControl(1).setLabel(self.title) + except: + pass + + def onClick(self, control_id): + pass + + def onFocus(self, control_id): + pass + + def onAction(self, action): + self.close() + + # TODO mirar retro-compatiblidad + # class ControlEdit(xbmcgui.ControlButton): + # def __new__(self, *args, **kwargs): + # del kwargs["isPassword"] + # del kwargs["window"] + # args = list(args) + # return xbmcgui.ControlButton.__new__(self, *args, **kwargs) + # + # def __init__(self, *args, **kwargs): + # self.isPassword = kwargs["isPassword"] + # self.window = kwargs["window"] + # self.label = "" + # self.text = "" + # self.textControl = xbmcgui.ControlLabel(self.getX(), self.getY(), self.getWidth(), self.getHeight(), + # self.text, + # font=kwargs["font"], textColor=kwargs["textColor"], alignment=4 | 1) + # self.window.addControl(self.textControl) + # + # def setLabel(self, val): + # self.label = val + # xbmcgui.ControlButton.setLabel(self, val) + # + # def getX(self): + # return xbmcgui.ControlButton.getPosition(self)[0] + # + # def getY(self): + # return xbmcgui.ControlButton.getPosition(self)[1] + # + # def setEnabled(self, e): + # xbmcgui.ControlButton.setEnabled(self, e) + # self.textControl.setEnabled(e) + # + # def setWidth(self, w): + # xbmcgui.ControlButton.setWidth(self, w) + # self.textControl.setWidth(w / 2) + # + # def setHeight(self, w): + # xbmcgui.ControlButton.setHeight(self, w) + # self.textControl.setHeight(w) + # + # def setPosition(self, x, y): + # xbmcgui.ControlButton.setPosition(self, x, y) + # self.textControl.setPosition(x + self.getWidth() / 2, y) + # + # def setText(self, text): + # self.text = text + # if self.isPassword: + # self.textControl.setLabel("*" * len(self.text)) + # else: + # self.textControl.setLabel(self.text) + # + # def getText(self): + # return self.text + # + # + # if not hasattr(xbmcgui, "ControlEdit"): + # xbmcgui.ControlEdit = ControlEdit diff --git a/channels/trailertools.py b/specials/trailertools.py similarity index 100% rename from channels/trailertools.py rename to specials/trailertools.py From f584cbdcf81d0ba942b86135d5e1b9d9108e9d16 Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Fri, 24 May 2019 17:07:06 +0200 Subject: [PATCH 03/12] link check enabled by settings --- channels/casacinema.py | 35 +- channels/support.py | 534 -------------------------- core/support.py | 14 +- resources/language/English/strings.po | 8 + resources/language/Italian/strings.po | 8 + resources/settings.xml | 2 + 6 files changed, 32 insertions(+), 569 deletions(-) delete mode 100644 channels/support.py diff --git a/channels/casacinema.py b/channels/casacinema.py index fa0c794a..b68b7797 100644 --- a/channels/casacinema.py +++ b/channels/casacinema.py @@ -335,37 +335,6 @@ def findvideos(item): data = data else: continue - - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - server = re.sub(r'[-\[\]\s]+', '', videoitem.title).capitalize() - videoitem.title = "".join(["[%s] " % support.color(server, 'orange'), item.title]) - videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.thumbnail - videoitem.show = item.show - videoitem.plot = item.plot - videoitem.channel = item.channel - videoitem.contentType = item.contentType - videoitem.language = IDIOMAS['Italiano'] - - # Requerido para Filtrar enlaces - - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) - - # Requerido para FilterTools - - # itemlist = filtertools.get_links(itemlist, item, list_language) - - # Requerido para AutoPlay - - autoplay.start(itemlist, item) - - if item.contentType != 'episode': - if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findvideos': - itemlist.append( - Item(channel=item.channel, title='[COLOR yellow][B]Aggiungi alla videoteca[/B][/COLOR]', url=item.url, - action="add_pelicula_to_library", extra="findvideos", contentTitle=item.contentTitle)) - - return itemlist + + return support.server(item, data=data) diff --git a/channels/support.py b/channels/support.py deleted file mode 100644 index 4a00dee6..00000000 --- a/channels/support.py +++ /dev/null @@ -1,534 +0,0 @@ -# support functions that are needed by many channels, to no repeat the same code -import base64, urlparse, re, os, inspect -from core import httptools, scrapertoolsV2, servertools, tmdb -from core.item import Item -import urllib - -from lib import unshortenit -from platformcode import logger, config -from channelselector import thumb -from specials import autoplay - - -def hdpass_get_servers(item): - # Carica la pagina - data = httptools.downloadpage(item.url).data.replace('\n', '') - patron = r']+><\/iframe>' - url = scrapertoolsV2.find_single_match(data, patron).replace("?alta", "") - url = url.replace("&download=1", "") - if 'https' not in url: - url = 'https:' + url - - if 'hdpass' or 'hdplayer' in url: - data = httptools.downloadpage(url).data - - start = data.find('
') - end = data.find('
', start) - data = data[start:end] - - patron_res = '
(.*?)
' - patron_mir = '
(.*?)
' - patron_media = r'' - - res = scrapertoolsV2.find_single_match(data, patron_res) - - itemlist = [] - - for res_url, res_video in scrapertoolsV2.find_multiple_matches(res, '([^<]+?)'): - - data = httptools.downloadpage(urlparse.urljoin(url, res_url)).data.replace('\n', '') - - mir = scrapertoolsV2.find_single_match(data, patron_mir) - - for mir_url, server in scrapertoolsV2.find_multiple_matches(mir, '([^<]+?)'): - - data = httptools.downloadpage(urlparse.urljoin(url, mir_url)).data.replace('\n', '') - for media_label, media_url in scrapertoolsV2.find_multiple_matches(data, patron_media): - itemlist.append(Item(channel=item.channel, - action="play", - title=item.title+" ["+color(server, 'orange')+"]"+" - "+color(res_video, 'limegreen'), - fulltitle=item.fulltitle, - quality=res_video, - show=item.show, - thumbnail=item.thumbnail, - contentType=item.contentType, - server=server, - url=url_decode(media_url))) - log("video -> ", res_video) - - return itemlist - - -def url_decode(url_enc): - lenght = len(url_enc) - if lenght % 2 == 0: - len2 = lenght / 2 - first = url_enc[0:len2] - last = url_enc[len2:lenght] - url_enc = last + first - reverse = url_enc[::-1] - return base64.b64decode(reverse) - - last_car = url_enc[lenght - 1] - url_enc[lenght - 1] = ' ' - url_enc = url_enc.strip() - len1 = len(url_enc) - len2 = len1 / 2 - first = url_enc[0:len2] - last = url_enc[len2:len1] - url_enc = last + first - reverse = url_enc[::-1] - reverse = reverse + last_car - return base64.b64decode(reverse) - - -def color(text, color): - return "[COLOR " + color + "]" + text + "[/COLOR]" - - -def scrape(item, patron = '', listGroups = [], headers="", blacklist="", data="", patron_block="", - patronNext="", action="findvideos", addVideolibrary = True): - # patron: the patron to use for scraping page, all capturing group must match with listGroups - # listGroups: a list containing the scraping info obtained by your patron, in order - # accepted values are: url, title, thumb, quality, year, plot, duration, genre, rating - - # header: values to pass to request header - # blacklist: titles that you want to exclude(service articles for example) - # data: if you want to pass data manually, maybe because you need some custom replacement - # patron_block: patron to get parts of the page (to scrape with patron attribute), - # if you need a "block inside another block" you can create a list, please note that all matches - # will be packed as string - # patronNext: patron for scraping next page link - # action: if you want results perform an action different from "findvideos", useful when scraping film by genres - # url_host: string to prepend to scrapedurl, useful when url don't contain host - # example usage: - # import support - # itemlist = [] - # patron = 'blablabla' - # headers = [['Referer', host]] - # blacklist = 'Request a TV serie!' - # return support.scrape(item, itemlist, patron, ['thumb', 'quality', 'url', 'title', 'year', 'plot'], - # headers=headers, blacklist=blacklist) - - itemlist = [] - - if not data: - data = httptools.downloadpage(item.url, headers=headers).data.replace("'", '"') - data = re.sub('\n|\t', ' ', data) - # replace all ' with " and eliminate newline, so we don't need to worry about - log('DATA =', data) - - block = data - - if patron_block: - if type(patron_block) == str: - patron_block = [patron_block] - - for n, regex in enumerate(patron_block): - blocks = scrapertoolsV2.find_multiple_matches(block, regex) - block = "" - for b in blocks: - block += "\n" + b - log('BLOCK ', n, '=', block) - else: - block = data - if patron and listGroups: - matches = scrapertoolsV2.find_multiple_matches(block, patron) - log('MATCHES =', matches) - - known_keys = ['url', 'title', 'episode', 'thumb', 'quality', 'year', 'plot', 'duration', 'genere', 'rating'] #by greko aggiunto episode - for match in matches: - if len(listGroups) > len(match): # to fix a bug - match = list(match) - match.extend([''] * (len(listGroups) - len(match))) - - scraped = {} - for kk in known_keys: - val = match[listGroups.index(kk)] if kk in listGroups else '' - if val and (kk == "url" or kk == 'thumb') and 'http' not in val: - val = scrapertoolsV2.find_single_match(item.url, 'https?://[a-z0-9.-]+') + val - scraped[kk] = val - - title = scrapertoolsV2.decodeHtmlentities(scraped["title"]).strip() - plot = scrapertoolsV2.htmlclean(scrapertoolsV2.decodeHtmlentities(scraped["plot"])) - - if scraped["quality"] and scraped["episode"]: # by greko aggiunto episode - longtitle = '[B]' + title + '[/B] - [B]' + scraped["episode"] + '[/B][COLOR blue][' + scraped["quality"] + '][/COLOR]' # by greko aggiunto episode - elif scraped["episode"]: # by greko aggiunto episode - longtitle = '[B]' + title + '[/B] - [B]' + scraped["episode"] + '[/B]' # by greko aggiunto episode - else: - longtitle = '[B]' + title + '[/B]' - - if item.infoLabels["title"] or item.fulltitle: # if title is set, probably this is a list of episodes or video sources - infolabels = item.infoLabels - else: - infolabels = {} - if scraped["year"]: - infolabels['year'] = scraped["year"] - if scraped["plot"]: - infolabels['plot'] = plot - if scraped["duration"]: - matches = scrapertoolsV2.find_multiple_matches(scraped["duration"],r'([0-9])\s*?(?:[hH]|:|\.|,|\\|\/|\||\s)\s*?([0-9]+)') - for h, m in matches: - scraped["duration"] = int(h) * 60 + int(m) - if not matches: - scraped["duration"] = scrapertoolsV2.find_single_match(scraped["duration"], r'(\d+)') - infolabels['duration'] = int(scraped["duration"]) * 60 - if scraped["genere"]: - genres = scrapertoolsV2.find_multiple_matches(scraped["genere"], '[A-Za-z]+') - infolabels['genere'] = ", ".join(genres) - if scraped["rating"]: - infolabels['rating'] = scrapertoolsV2.decodeHtmlentities(scraped["rating"]) - - if scraped["title"] not in blacklist: - it = Item( - channel=item.channel, - action=action, - contentType=item.contentType, - title=longtitle, - fulltitle=title, - show=title, - quality=scraped["quality"], - url=scraped["url"], - infoLabels=infolabels, - thumbnail=scraped["thumb"], - args=item.args - ) - - for lg in list(set(listGroups).difference(known_keys)): - it.__setattr__(lg, match[listGroups.index(lg)]) - - itemlist.append(it) - - if (item.contentType == "episode" and (action != "findvideos" and action != "play")) \ - or (item.contentType == "movie" and action != "play"): - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - else: - for it in itemlist: - it.infoLabels = item.infoLabels - - if patronNext: - nextPage(itemlist, item, data, patronNext, 2) - - if addVideolibrary and (item.infoLabels["title"] or item.fulltitle): - item.fulltitle = item.infoLabels["title"] - videolibrary(itemlist, item) - - return itemlist - - -def dooplay_get_links(item, host): - # get links from websites using dooplay theme and dooplay_player - # return a list of dict containing these values: url, title and server - - data = httptools.downloadpage(item.url).data.replace("'", '"') - patron = r'
  • ([^<>]+)(?:([^<>]+))?' - matches = scrapertoolsV2.find_multiple_matches(data, patron) - - ret = [] - - for type, post, nume, title, server in matches: - postData = urllib.urlencode({ - "action": "doo_player_ajax", - "post": post, - "nume": nume, - "type": type - }) - dataAdmin = httptools.downloadpage(host + 'wp-admin/admin-ajax.php', post=postData,headers={'Referer': item.url}).data - link = scrapertoolsV2.find_single_match(dataAdmin, "([^<>]+).*?([^<>]+).*?([0-9]{4}).*?

    ([^<>]+)' - patronNext = '') if not match else match - - if not match: - from lib import jsunpack - - try: - data = scrapertoolsV2.find_single_match(data.replace('\n', ''), r"(eval\s?\(function\(p,a,c,k,e,d.*?)") - data = jsunpack.unpack(data) - - logger.debug("##### play /link/ unpack ##\n%s\n##" % data) - except: - logger.debug("##### The content is yet unpacked ##\n%s\n##" % data) - - data = scrapertoolsV2.find_single_match(data, r'var link(?:\s)?=(?:\s)?"([^"]+)";') - data, c = unshortenit.unwrap_30x_only(data) - else: - data = match - if data.startswith('/'): - data = urlparse.urljoin("http://swzz.xyz", data) - if not "vcrypt" in data: - data = httptools.downloadpage(data).data - logger.debug("##### play /link/ data ##\n%s\n##" % data) - else: - data = item.url - - return data - - -def menu(itemlist, title='', action='', url='', contentType='movie', args=[]): - # Function to simplify menu creation - - frame = inspect.stack()[1] - filename = frame[0].f_code.co_filename - filename = os.path.basename(filename).replace('.py','') - - # Call typo function - title = typo(title) - - if contentType == 'movie': extra = 'movie' - else: extra = 'tvshow' - - itemlist.append(Item( - channel = filename, - title = title, - action = action, - url = url, - extra = extra, - args = args, - contentType = contentType - )) - - # Apply auto Thumbnails at the menus - from channelselector import thumb - thumb(itemlist) - - return itemlist - - -def typo(string, typography=''): - - kod_color = '0xFF65B3DA' #'0xFF0081C2' - - - # Check if the typographic attributes are in the string or outside - if typography: - string = string + ' ' + typography - if config.get_localized_string(30992) in string: - string = string + ' >' - - # If there are no attributes, it applies the default ones - attribute = ['[]','()','{}','submenu','color','bold','italic','_','--','[B]','[I]','[COLOR]'] - - movie_word_list = ['film', 'serie', 'tv', 'anime', 'cinema', 'sala'] - search_word_list = ['cerca'] - categories_word_list = ['genere', 'categoria', 'categorie', 'ordine', 'lettera', 'anno', 'alfabetico', 'a-z', 'menu'] - - if not any(word in string for word in attribute): - if any(word in string.lower() for word in search_word_list): - string = '[COLOR '+ kod_color +']' + string + '[/COLOR]' - elif any(word in string.lower() for word in categories_word_list): - string = ' > ' + string - elif any(word in string.lower() for word in movie_word_list): - string = '[B]' + string + '[/B]' - - # Otherwise it uses the typographical attributes of the string - else: - if '[]' in string: - string = '[' + re.sub(r'\s\[\]','',string) + ']' - if '()' in string: - string = '(' + re.sub(r'\s\(\)','',string) + ')' - if '{}' in string: - string = '{' + re.sub(r'\s\{\}','',string) + '}' - if 'submenu' in string: - string = ' > ' + re.sub(r'\ssubmenu','',string) - if 'color' in string: - color = scrapertoolsV2.find_single_match(string,'color ([a-z]+)') - if color == 'kod' or '': color = kod_color - string = '[COLOR '+ color +']' + re.sub(r'\scolor\s([a-z]+)','',string) + '[/COLOR]' - if 'bold' in string: - string = '[B]' + re.sub(r'\sbold','',string) + '[/B]' - if 'italic' in string: - string = '[I]' + re.sub(r'\sitalic','',string) + '[/I]' - if '_' in string: - string = ' ' + re.sub(r'\s_','',string) - if '--' in string: - string = ' - ' + re.sub(r'\s--','',string) - - return string - - -def match(item, patron='', patron_block='', headers='', url=''): - matches = [] - url = url if url else item.url - data = httptools.downloadpage(url, headers=headers).data.replace("'", '"') - data = re.sub('\n|\t', '', data) - log('DATA= ', data) - - if patron_block: - block = scrapertoolsV2.find_single_match(data, patron_block) - log('BLOCK= ',block) - else: - block = data - - if patron: - matches = scrapertoolsV2.find_multiple_matches(block, patron) - log('MATCHES= ',matches) - - return matches, data - - -def videolibrary(itemlist, item, typography=''): - if item.contentType != 'episode': - action = 'add_pelicula_to_library' - extra = 'findvideos' - contentType = 'movie' - else: - action = 'add_serie_to_library' - extra = 'episodios' - contentType = 'tvshow' - if not typography: typography = 'color kod bold' - title = typo(config.get_localized_string(30161) + ' ' + typography) - if inspect.stack()[1][3] == 'findvideos' and contentType == 'movie' or inspect.stack()[1][3] != 'findvideos' and contentType != 'movie': - if config.get_videolibrary_support() and len(itemlist) > 0: - itemlist.append( - Item(channel=item.channel, - title=title, - contentType=contentType, - contentSerieName=item.fulltitle if contentType == 'tvshow' else '', - url=item.url, - action=action, - extra=extra, - contentTitle=item.fulltitle)) - - -def nextPage(itemlist, item, data, patron, function_level=1): - # Function_level is useful if the function is called by another function. - # If the call is direct, leave it blank - - next_page = scrapertoolsV2.find_single_match(data, patron) - if 'http' not in next_page: - next_page = scrapertoolsV2.find_single_match(item.url, 'https?://[a-z0-9.-]+') + next_page - log('NEXT= ', next_page) - - if next_page != "": - itemlist.append( - Item(channel=item.channel, - action=inspect.stack()[function_level][3], - contentType=item.contentType, - title=typo(config.get_localized_string(30992), 'color kod bold'), - url=next_page, - args=item.args, - thumbnail=thumb())) - - return itemlist - -def server(item, data='', headers='', AutoPlay=True, CheckLinks=True): - - __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', item.channel) - log(__comprueba_enlaces__ ) - __comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', item.channel) - log(__comprueba_enlaces_num__ ) - - if not data: - data = httptools.downloadpage(item.url, headers=headers).data - - itemlist = servertools.find_video_items(data=str(data)) - - for videoitem in itemlist: - videoitem.title = "".join([item.title, ' ', typo(videoitem.title, 'color kod []')]) - videoitem.fulltitle = item.fulltitle - videoitem.show = item.show - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - videoitem.contentType = item.contentType - - if __comprueba_enlaces__ and CheckLinks: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) - - if AutoPlay == True: - autoplay.start(itemlist, item) - - return itemlist - - -def aplay(item, itemlist, list_servers='', list_quality=''): - if inspect.stack()[1][3] == 'mainlist': - autoplay.init(item.channel, list_servers, list_quality) - autoplay.show_option(item.channel, itemlist) - else: - autoplay.start(itemlist, item) - - -def log(stringa1="", stringa2="", stringa3="", stringa4="", stringa5=""): - # Function to simplify the log - # Automatically returns File Name and Function Name - - frame = inspect.stack()[1] - filename = frame[0].f_code.co_filename - filename = os.path.basename(filename) - logger.info("[" + filename + "] - [" + inspect.stack()[1][3] + "] " + str(stringa1) + str(stringa2) + str(stringa3) + str(stringa4) + str(stringa5)) diff --git a/core/support.py b/core/support.py index bff31475..3fe8aa82 100644 --- a/core/support.py +++ b/core/support.py @@ -1,5 +1,5 @@ # support functions that are needed by many channels, to no repeat the same code -import base64, urlparse, re, os, inspect +import base64, urlparse, re, os, inspect, xbmcaddon from core import httptools, scrapertoolsV2, servertools, tmdb from core.item import Item import urllib @@ -56,6 +56,14 @@ def hdpass_get_servers(item): url=url_decode(media_url))) log("video -> ", res_video) + __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', item.channel) + __comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', item.channel) + + if __comprueba_enlaces__: + itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if xbmcaddon.Addon('plugin.video.kod').getSetting('checklinks'): + itemlist = servertools.check_list_links(itemlist, xbmcaddon.Addon('plugin.video.kod').getSetting('checklinks_number')) + return itemlist @@ -509,7 +517,9 @@ def server(item, data='', headers='', AutoPlay=True, CheckLinks=True): if __comprueba_enlaces__ and CheckLinks: itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) - + if xbmcaddon.Addon('plugin.video.kod').getSetting('checklinks'): + itemlist = servertools.check_list_links(itemlist, xbmcaddon.Addon('plugin.video.kod').getSetting('checklinks_number')) + if AutoPlay == True: autoplay.start(itemlist, item) diff --git a/resources/language/English/strings.po b/resources/language/English/strings.po index 6beeefb8..3096032d 100644 --- a/resources/language/English/strings.po +++ b/resources/language/English/strings.po @@ -85,6 +85,14 @@ msgctxt "#30019" msgid "Filter channels by language:" msgstr "" +msgctxt "#30020" +msgid "Check if the links exist" +msgstr "" + +msgctxt "#30021" +msgid "Number of links to check" +msgstr "" + msgctxt "#30043" msgid "Force view mode:" msgstr "" diff --git a/resources/language/Italian/strings.po b/resources/language/Italian/strings.po index 11d24000..ab71e87f 100644 --- a/resources/language/Italian/strings.po +++ b/resources/language/Italian/strings.po @@ -85,6 +85,14 @@ msgctxt "#30019" msgid "Filter channels by language:" msgstr "Filtra canale per lingua:" +msgctxt "#30020" +msgid "Check if the links exist" +msgstr "Controlla se i link esistono" + +msgctxt "#30021" +msgid "Number of links to check" +msgstr "Numero di link da verificare" + msgctxt "#30043" msgid "Force view mode:" msgstr "Forza modalità di visualizzazione:" diff --git a/resources/settings.xml b/resources/settings.xml index de8acc5f..3b1c9059 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -4,6 +4,8 @@ + + From 9f22426b56f8924f5a44cc0e6af61cfe36cc3c16 Mon Sep 17 00:00:00 2001 From: mac12m99 Date: Fri, 24 May 2019 19:24:06 +0200 Subject: [PATCH 04/12] fixes --- resources/language/English/strings.po | 2 +- specials/search.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/language/English/strings.po b/resources/language/English/strings.po index 3096032d..7c5d7869 100644 --- a/resources/language/English/strings.po +++ b/resources/language/English/strings.po @@ -1874,7 +1874,7 @@ msgid "KOD - FAQ - %s" msgstr "" msgctxt "#60462" -msgid "You may not have written the library path correctly in 'Settings>Preferences'.\nIl The specified path must be exactly the same as the 'source' entered in 'Archive' of the Kodi library.\nAVANZATO: This path is also found in 'sources.xml'.\nThere can be problems using some Kodi forks and paths with 'special://'. SPMC, for example, has problems with this, and there doesn't seem to be a solution, as it is an external problem to KOD that has existed for a long time.\nYou can try solving these problems in 'Settings>Library Settings' by changing the 'Search in' setting from 'The folder of each series' to 'All library'." +msgid "You may not have written the library path correctly in 'Settings>Preferences'.\nIl The specified path must be exactly the same as the 'source' entered in 'Archive' of the Kodi library.\nAVANZATO: This path is also found in 'sources.xml'.\nThere can be problems using some Kodi forks and paths with 'special://'. SPMC, for example, has problems with this, and there doesn't seem to be a solution, as it is an external problem to Kodi on Demand that has existed for a long time.\nYou can try solving these problems in 'Settings>Library Settings' by changing the 'Search in' setting from 'The folder of each series' to 'All library'." msgstr "" msgctxt "#60463" diff --git a/specials/search.py b/specials/search.py index 199ed090..e225b042 100644 --- a/specials/search.py +++ b/specials/search.py @@ -436,7 +436,7 @@ def show_result(item): def channel_search(search_results, channel_parameters, tecleado): try: - exec("from specials import " + channel_parameters["channel"] + " as module") + exec("from channels import " + channel_parameters["channel"] + " as module") mainlist = module.mainlist(Item(channel=channel_parameters["channel"])) search_items = [item for item in mainlist if item.action == "search"] if not search_items: From 37af0233519a335d5770fc8e2a309147c05aaa6c Mon Sep 17 00:00:00 2001 From: mac12m99 Date: Fri, 24 May 2019 23:19:40 +0200 Subject: [PATCH 05/12] optmize imports by pycharm :) --- channels/LIKUOO.py | 13 +++++++------ channels/TXXX.py | 13 +++++++------ channels/absoluporn.py | 10 +++++----- channels/alsoporn.py | 10 +++++----- channels/altadefinizione01.py | 4 +--- channels/altadefinizione01_club.py | 2 +- channels/altadefinizione01_link.py | 4 ++-- channels/altadefinizioneclick.py | 2 +- channels/altadefinizionehd.py | 9 ++++----- channels/analdin.py | 11 +++++------ channels/animeforce.py | 6 +++--- channels/animeleggendari.py | 8 ++++---- channels/animesaturn.py | 10 +++++----- channels/animespace.py | 4 +--- channels/animesubita.py | 10 +++++----- channels/animetubeita.py | 7 +++---- channels/animeworld.py | 11 +++++------ channels/bleachportal.py | 4 +--- channels/bravoporn.py | 10 +++++----- channels/camwhoresbay.py | 10 +++++----- channels/casacinema.py | 10 +++++----- channels/casacinemaInfo.py | 4 +--- channels/cat3plus.py | 3 +-- channels/cb01anime.py | 2 -- channels/cineblog01.py | 3 +-- channels/cinemalibero.py | 8 +++----- channels/cinemastreaming.py | 4 ++-- channels/cinetecadibologna.py | 4 +--- channels/cinetemagay.py | 3 +-- channels/cliphunter.py | 11 +++++------ channels/coomelonitas.py | 12 +++++------- channels/cumlouder.py | 1 + channels/czechvideo.py | 9 +++++---- channels/documentaristreamingda.py | 9 ++++----- channels/dreamsub.py | 5 ++--- channels/elreyx.py | 13 +++++++------ channels/eporner.py | 1 + channels/eroticage.py | 9 +++++---- channels/eroticasonlinetv.py | 13 +++++++------ channels/erotik.py | 1 + channels/eurostreaming.py | 5 ++--- channels/fapality.py | 10 +++++----- channels/fastsubita.py | 6 +++--- channels/fetishshrine.py | 10 +++++----- channels/filmigratis.py | 7 ++----- channels/filmoviXXX.py | 10 ++++++---- channels/filmpertutti.py | 6 ++---- channels/filmpornoita.py | 12 ++++++------ channels/filmsenzalimiti.py | 8 ++------ channels/filmsenzalimiticc.py | 9 ++++----- channels/foxtube.py | 10 +++++----- channels/freeporn.py | 10 +++++----- channels/freepornstreams.py | 9 +++++---- channels/guardarefilm.py | 2 +- channels/guardaseriecc.py | 3 +-- channels/guardaserieclick.py | 5 ++--- channels/guardogratis.py | 7 ++++--- channels/hclips.py | 11 ++++++----- channels/hdblog.py | 7 +++---- channels/hdzog.py | 11 ++++++----- channels/hellporno.py | 10 +++++----- channels/hentaiid.py | 1 + channels/hotmovs.py | 11 ++++++----- channels/ilgeniodellostreaming.py | 10 +++++----- channels/ilgiramondo.py | 7 +++---- channels/istitutoluce.py | 5 ++--- channels/italiafilm.py | 5 ++--- channels/italiafilmhd.py | 5 ++--- channels/italiaserie.py | 2 +- channels/itastreaming.py | 6 +----- channels/javlin.py | 12 ++++++------ channels/javwhores.py | 11 +++++------ channels/jizzbunker.py | 10 +++++----- channels/justporn.py | 12 ++++++------ channels/mondolunatico.py | 7 ++++--- channels/mondoserietv.py | 6 ++---- channels/mporno.py | 12 ++++++------ channels/muchoporno.py | 10 +++++----- channels/nuvid.py | 1 + channels/pandamovie.py | 15 ++++++--------- channels/peliculaseroticas.py | 3 ++- channels/perfectgirls.py | 10 +++++----- channels/piratestreaming.py | 6 +++--- channels/playpornx.py | 1 + channels/porn300.py | 10 +++++----- channels/pornboss.py | 10 ++++------ channels/porneq.py | 13 ++++--------- channels/pornhive.py | 7 +++---- channels/pornhub.py | 2 ++ channels/pornrewind.py | 10 +++++----- channels/porntrex.py | 1 + channels/programmazione.py | 4 +--- channels/qwertty.py | 13 +++++++------ channels/redtube.py | 2 ++ channels/ricettevideo.py | 7 +++---- channels/seriehd.py | 10 +++++----- channels/serietvonline.py | 2 +- channels/serietvsubita.py | 6 +++--- channels/serietvu.py | 5 +++-- channels/serviporno.py | 1 + channels/sexgalaxy.py | 2 ++ channels/sexkino.py | 2 ++ channels/sexofilm.py | 9 +++++---- channels/siska.py | 10 +++++----- channels/sleazemovies.py | 1 + channels/spankbang.py | 10 +++++----- channels/spankwire.py | 10 +++++----- channels/streamingaltadefinizione.py | 2 +- channels/streamingporn.py | 13 +++++++------ channels/streamking.py | 5 ++--- channels/streamporno.py | 10 +++++----- channels/submityouflicks.py | 1 + channels/sunporno.py | 10 +++++----- channels/tabooshare.py | 8 ++++---- channels/tantifilm.py | 7 ++++--- channels/thumbzilla.py | 4 ++-- channels/tnaflix.py | 12 +++++------- channels/toonitalia.py | 7 +++---- channels/tryboobs.py | 10 +++++----- channels/tubedupe.py | 10 +++++----- channels/tubehentai.py | 1 + channels/vedohd.py | 8 ++------ channels/videosXYZ.py | 9 +++++---- channels/vidz7.py | 1 + channels/vintagetube.py | 12 ++++++------ channels/vintagexxxsex.py | 12 ++++++------ channels/vporn.py | 14 ++++++-------- channels/watchpornfree.py | 12 ++++++------ channels/webpeliculasporno.py | 15 ++++++--------- channels/woodrocket.py | 12 ++++++------ channels/x18hentai.py | 2 +- channels/xhamster.py | 4 ++-- channels/xms.py | 1 + channels/xozilla.py | 12 ++++-------- channels/xtapes.py | 13 +++++++------ channels/xxxdan.py | 9 ++++----- channels/xxxfreeinhd.py | 13 +++++++------ channels/xxxparodyhd.py | 12 ++++++------ channels/xxxstreams.py | 12 ++++++------ channels/yespornplease.py | 7 +++---- channels/youjizz.py | 13 +++++-------- channels/youporn.py | 10 +++++----- channels/youtube_channel.py | 1 - channels/yuuk.py | 12 ++++++------ core/channeltools.py | 1 + core/cloudflare.py | 2 +- core/downloader.py | 3 ++- core/downloadtools.py | 1 + core/item.py | 1 + core/scrapertoolsV2.py | 1 + core/servertools.py | 5 ++--- core/support.py | 13 +++++++++---- core/tmdb.py | 6 ++---- core/trakt_tools.py | 3 ++- core/tvdb.py | 3 ++- core/videolibrarytools.py | 4 +--- platformcode/custom_code.py | 8 ++++---- platformcode/download_and_play.py | 3 ++- platformcode/infoplus.py | 3 ++- platformcode/keymaptools.py | 1 + platformcode/launcher.py | 7 ++++--- platformcode/logger.py | 1 + platformcode/mct.py | 1 + platformcode/platformtools.py | 7 ++++--- platformcode/recaptcha.py | 1 + platformcode/subtitletools.py | 1 + platformcode/unify.py | 7 ++----- platformcode/updater.py | 19 +++++++------------ platformcode/xbmc_config_menu.py | 1 + platformcode/xbmc_info_window.py | 1 + platformcode/xbmc_videolibrary.py | 3 ++- servers/backin.py | 4 +--- servers/bitshare.py | 3 --- servers/cinemaupload.py | 1 + servers/cloudvideo.py | 1 - servers/datoporn.py | 1 - servers/debriders/realdebrid.py | 3 +-- servers/decrypters/zcrypt.py | 5 ++--- servers/deltabit.py | 3 ++- servers/estream.py | 1 + servers/fembed.py | 1 - servers/filebebo.py | 1 + servers/flix555.py | 3 ++- servers/freakshare.py | 3 --- servers/gigasize.py | 1 - servers/googlevideo.py | 1 - servers/gounlimited.py | 3 ++- servers/mp4upload.py | 1 + servers/mystream.py | 1 + servers/netutv.py | 3 ++- servers/openload.py | 3 ++- servers/powvideo.py | 4 ---- servers/rutube.py | 4 ++-- servers/sendvid.py | 1 - servers/streamcherry.py | 2 -- servers/streamplay.py | 2 -- servers/thevideome.py | 3 ++- servers/thevimeo.py | 3 +-- servers/tiwikiwi.py | 1 + servers/upvid.py | 4 +++- servers/uqload.py | 1 + servers/verystream.py | 2 +- servers/vevio.py | 3 ++- servers/vidcloud.py | 2 +- servers/videobb.py | 2 +- servers/vidoza.py | 2 +- servers/vivo.py | 2 +- servers/vshare.py | 2 +- servers/wstream.py | 2 +- servers/xstreamcdn.py | 5 +++-- servers/youtube.py | 1 + specials/autoplay.py | 3 +-- specials/autorenumber.py | 7 ++----- specials/community.py | 13 +++---------- specials/downloads.py | 1 - specials/filtertools.py | 2 +- specials/help.py | 2 +- specials/kodfavorites.py | 6 +++--- specials/news.py | 3 +-- specials/search.py | 6 ++++-- specials/searchall.py | 4 ++-- specials/side_menu.py | 9 ++++++--- specials/trailertools.py | 4 ++-- specials/tvmoviedb.py | 11 ++++++----- specials/url.py | 1 - specials/videolibrary.py | 5 +++-- 226 files changed, 655 insertions(+), 702 deletions(-) diff --git a/channels/LIKUOO.py b/channels/LIKUOO.py index 660cd916..fbeb3023 100644 --- a/channels/LIKUOO.py +++ b/channels/LIKUOO.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools +import re +import urlparse + from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import logger host = 'http://www.likuoo.video' diff --git a/channels/TXXX.py b/channels/TXXX.py index 32a360b2..26c8137a 100644 --- a/channels/TXXX.py +++ b/channels/TXXX.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urllib +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://www.txxx.com' diff --git a/channels/absoluporn.py b/channels/absoluporn.py index dcdf6757..f5fce909 100644 --- a/channels/absoluporn.py +++ b/channels/absoluporn.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://www.absoluporn.es' diff --git a/channels/alsoporn.py b/channels/alsoporn.py index fb3b0288..1ada8f96 100644 --- a/channels/alsoporn.py +++ b/channels/alsoporn.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://www.alsoporn.com' diff --git a/channels/altadefinizione01.py b/channels/altadefinizione01.py index 962297e1..d97eefd8 100644 --- a/channels/altadefinizione01.py +++ b/channels/altadefinizione01.py @@ -2,13 +2,11 @@ # ------------------------------------------------------------ # Canale per altadefinizione01 # ------------------------------------------------------------ -import re -import urlparse -from specials import filtertools, autoplay from core import servertools, httptools, tmdb, scrapertoolsV2, support from core.item import Item from platformcode import logger, config +from specials import autoplay #URL che reindirizza sempre al dominio corrente host = "https://altadefinizione01.team" diff --git a/channels/altadefinizione01_club.py b/channels/altadefinizione01_club.py index e54d3179..4f0ebf42 100644 --- a/channels/altadefinizione01_club.py +++ b/channels/altadefinizione01_club.py @@ -5,11 +5,11 @@ # -*- last change: 04/05/2019 -from specials import autoplay, filtertools from channelselector import get_thumb from core import httptools, channeltools, scrapertools, servertools, tmdb, support from core.item import Item from platformcode import config, logger +from specials import autoplay, filtertools __channel__ = "altadefinizione01_club" diff --git a/channels/altadefinizione01_link.py b/channels/altadefinizione01_link.py index 3626719b..22ad517d 100644 --- a/channels/altadefinizione01_link.py +++ b/channels/altadefinizione01_link.py @@ -6,11 +6,11 @@ # -*- last change: 04/05/2019 -from specials import autoplay, filtertools from channelselector import get_thumb -from core import httptools, channeltools, scrapertools, servertools, tmdb, support +from core import httptools, scrapertools, servertools, tmdb, support from core.item import Item from platformcode import config, logger +from specials import autoplay, filtertools __channel__ = "altadefinizione01_link" diff --git a/channels/altadefinizioneclick.py b/channels/altadefinizioneclick.py index 8cdeaa69..3037f154 100644 --- a/channels/altadefinizioneclick.py +++ b/channels/altadefinizioneclick.py @@ -5,10 +5,10 @@ import re -from specials import autoplay, filtertools from core import servertools, support from core.item import Item from platformcode import logger, config +from specials import autoplay host = "https://altadefinizione.center" ### <- cambio Host da .fm a .center diff --git a/channels/altadefinizionehd.py b/channels/altadefinizionehd.py index 2187c1a4..33693d4f 100644 --- a/channels/altadefinizionehd.py +++ b/channels/altadefinizionehd.py @@ -4,12 +4,11 @@ # ---------------------------------------------------------- import re -from core import httptools, scrapertools, servertools, tmdb -from platformcode import logger, config -from core.item import Item -from specials import autoplay from channelselector import thumb - +from core import httptools, scrapertools, servertools, tmdb +from core.item import Item +from platformcode import logger, config +from specials import autoplay host = "https://altadefinizione.doctor" diff --git a/channels/analdin.py b/channels/analdin.py index a8a63576..9520d314 100644 --- a/channels/analdin.py +++ b/channels/analdin.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools - +from platformcode import logger host = 'https://www.analdin.com/es' diff --git a/channels/animeforce.py b/channels/animeforce.py index 10d1d40a..4113f6c5 100644 --- a/channels/animeforce.py +++ b/channels/animeforce.py @@ -3,15 +3,15 @@ # Ringraziamo Icarus crew # Canale per http://animeinstreaming.net/ # ------------------------------------------------------------ -import re, urllib, urlparse +import re +import urllib +import urlparse from core import httptools, scrapertools, servertools, tmdb from core.item import Item from platformcode import config, logger from servers.decrypters import adfly - - host = "https://ww1.animeforce.org" IDIOMAS = {'Italiano': 'IT'} diff --git a/channels/animeleggendari.py b/channels/animeleggendari.py index 853aadf7..285f3393 100644 --- a/channels/animeleggendari.py +++ b/channels/animeleggendari.py @@ -5,12 +5,12 @@ import re -from specials import filtertools, autoplay, autorenumber -from core.support import log, menu -from core import servertools, httptools, scrapertoolsV2, scrapertools, tmdb, support -from platformcode import logger, config +from core import servertools, httptools, scrapertoolsV2, tmdb, support from core.item import Item +from core.support import log, menu from lib.js2py.host import jsfunctions +from platformcode import logger, config +from specials import autoplay, autorenumber host = "https://animepertutti.com" diff --git a/channels/animesaturn.py b/channels/animesaturn.py index 5d461240..7f88cef5 100644 --- a/channels/animesaturn.py +++ b/channels/animesaturn.py @@ -3,16 +3,16 @@ # Canale per AnimeSaturn # Thanks to me # ---------------------------------------------------------- -import inspect import re -import time + import urlparse -import channelselector, filtertools -from core import httptools, tmdb, scrapertools, servertools, support -from specials import autoplay +import channelselector +from core import httptools, tmdb, scrapertools, support from core.item import Item from platformcode import logger, config +from specials import autoplay + __channel__ = "animesaturn" host = config.get_setting("channel_host", __channel__) headers = [['Referer', host]] diff --git a/channels/animespace.py b/channels/animespace.py index e19fdfac..7634a5fd 100644 --- a/channels/animespace.py +++ b/channels/animespace.py @@ -4,17 +4,15 @@ # -*- By the Alfa Develop Group -*- import re -import urllib +from channelselector import get_thumb from core import httptools from core import scrapertools from core import servertools -from channelselector import get_thumb from core import tmdb from core.item import Item from platformcode import logger, config from specials import autoplay -from specials import filtertools from specials import renumbertools host = "https://animespace.tv/" diff --git a/channels/animesubita.py b/channels/animesubita.py index cb77da59..5559f58b 100644 --- a/channels/animesubita.py +++ b/channels/animesubita.py @@ -5,13 +5,13 @@ # Canale per AnimeSubIta # ------------------------------------------------------------ -import re, urllib, urlparse +import re +import urllib +import urlparse -from core import servertools, httptools, scrapertools, tmdb, support -from platformcode import logger, config +from core import httptools, scrapertools, tmdb, support from core.item import Item - - +from platformcode import logger, config host = "http://www.animesubita.org" diff --git a/channels/animetubeita.py b/channels/animetubeita.py index d3bd044d..817d77d7 100644 --- a/channels/animetubeita.py +++ b/channels/animetubeita.py @@ -3,13 +3,12 @@ # Ringraziamo Icarus crew # Canale per animetubeita # ---------------------------------------------------------- -import re, urllib +import re +import urllib from core import httptools, scrapertools, tmdb -from platformcode import logger, config from core.item import Item - - +from platformcode import logger, config host = "http://www.animetubeita.com" hostlista = host + "/lista-anime/" diff --git a/channels/animeworld.py b/channels/animeworld.py index 7ee895d2..ff56efef 100644 --- a/channels/animeworld.py +++ b/channels/animeworld.py @@ -2,15 +2,14 @@ # ------------------------------------------------------------ # Canale per animeworld # ---------------------------------------------------------- -import re, urlparse +import re +import urlparse -from core import httptools, scrapertoolsV2, servertools, tmdb, tvdb, support +from channelselector import thumb +from core import httptools, scrapertoolsV2, servertools, tmdb, support from core.item import Item from platformcode import logger, config -from specials import autoplay, filtertools, autorenumber -from channelselector import thumb - - +from specials import autoplay, autorenumber host = "https://www.animeworld.it" diff --git a/channels/bleachportal.py b/channels/bleachportal.py index 209b83a6..f06aa116 100644 --- a/channels/bleachportal.py +++ b/channels/bleachportal.py @@ -8,10 +8,8 @@ import re from core import scrapertools, httptools -from platformcode import logger from core.item import Item - - +from platformcode import logger host = "http://www.bleachportal.it" diff --git a/channels/bravoporn.py b/channels/bravoporn.py index 740dd779..c3521363 100644 --- a/channels/bravoporn.py +++ b/channels/bravoporn.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://www.bravoporn.com' diff --git a/channels/camwhoresbay.py b/channels/camwhoresbay.py index 2267e6c1..a55af776 100644 --- a/channels/camwhoresbay.py +++ b/channels/camwhoresbay.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.camwhoresbay.com' diff --git a/channels/casacinema.py b/channels/casacinema.py index b68b7797..07d889de 100644 --- a/channels/casacinema.py +++ b/channels/casacinema.py @@ -3,14 +3,14 @@ # Kodi on Demand - Kodi Addon # Canale per casacinema # ------------------------------------------------------------ -import re, urlparse +import re +import urlparse -from core import scrapertools, scrapertoolsV2, httptools, servertools, tmdb, support -from specials import autoplay, filtertools +from channelselector import thumb, get_thumb +from core import scrapertools, scrapertoolsV2, httptools, tmdb, support from core.item import Item from platformcode import logger, config -from channelselector import thumb, get_thumb - +from specials import autoplay host = 'https://www.casacinema.site' diff --git a/channels/casacinemaInfo.py b/channels/casacinemaInfo.py index 38fa29d3..a371b392 100644 --- a/channels/casacinemaInfo.py +++ b/channels/casacinemaInfo.py @@ -2,13 +2,11 @@ # ------------------------------------------------------------ # Canale per casacinema # ------------------------------------------------------------ -import re, urlparse, base64 from core import scrapertoolsV2, httptools, servertools, tmdb, support -from specials import autoplay from core.item import Item from platformcode import logger, config - +from specials import autoplay host = 'https://casacinema.info' diff --git a/channels/cat3plus.py b/channels/cat3plus.py index ea0a7234..140056b3 100644 --- a/channels/cat3plus.py +++ b/channels/cat3plus.py @@ -5,8 +5,7 @@ import re -import urllib -import urlparse + from channelselector import get_thumb from core import httptools from core import scrapertools diff --git a/channels/cb01anime.py b/channels/cb01anime.py index 9cccfdc8..f68fbe6f 100644 --- a/channels/cb01anime.py +++ b/channels/cb01anime.py @@ -10,8 +10,6 @@ from core import httptools, scrapertools, servertools, tmdb from core.item import Item from platformcode import logger, config - - host = "https://www.cineblog01.pink" #esclusione degli articoli 'di servizio' diff --git a/channels/cineblog01.py b/channels/cineblog01.py index 3ded6e1f..8000c555 100644 --- a/channels/cineblog01.py +++ b/channels/cineblog01.py @@ -4,13 +4,12 @@ # ------------------------------------------------------------ import re -import urlparse -from specials import autoplay, filtertools from core import scrapertoolsV2, httptools, servertools, tmdb, support from core.item import Item from lib import unshortenit from platformcode import logger, config +from specials import autoplay #impostati dinamicamente da getUrl() host = "" diff --git a/channels/cinemalibero.py b/channels/cinemalibero.py index c00f9709..1b0c0670 100644 --- a/channels/cinemalibero.py +++ b/channels/cinemalibero.py @@ -2,17 +2,15 @@ # ------------------------------------------------------------ # Canale per CinemaLibero - First Version # ------------------------------------------------------------ -import base64 import re -import urlparse -from specials import autoplay, filtertools from core import scrapertools, servertools, httptools, support -from platformcode import logger, config +from core import tmdb from core.item import Item from lib import unshortenit from platformcode import config -from core import tmdb +from platformcode import logger +from specials import autoplay # Necessario per Autoplay IDIOMAS = {'Italiano': 'IT'} diff --git a/channels/cinemastreaming.py b/channels/cinemastreaming.py index 0120d3e6..23df9ca4 100644 --- a/channels/cinemastreaming.py +++ b/channels/cinemastreaming.py @@ -4,9 +4,9 @@ # ------------------------------------------------------------ import re -from specials import filtertools, autoplay -from core import scrapertools, servertools, httptools, scrapertoolsV2, support +from core import scrapertools, httptools, scrapertoolsV2, support from core.item import Item +from specials import autoplay host = 'https://cinemastreaming.icu' diff --git a/channels/cinetecadibologna.py b/channels/cinetecadibologna.py index eab59e07..f5c1d088 100644 --- a/channels/cinetecadibologna.py +++ b/channels/cinetecadibologna.py @@ -5,15 +5,13 @@ # ------------------------------------------------------------ import re + import urlparse from core import httptools, scrapertools from core.item import Item from platformcode import logger, config - - - host = "http://cinestore.cinetecadibologna.it" headers = [['Referer', host]] diff --git a/channels/cinetemagay.py b/channels/cinetemagay.py index ad5f5a6d..ad575f68 100644 --- a/channels/cinetemagay.py +++ b/channels/cinetemagay.py @@ -3,9 +3,8 @@ import os import re -from core import scrapertools -from core import servertools from core import httptools +from core import servertools from core.item import Item from platformcode import config, logger diff --git a/channels/cliphunter.py b/channels/cliphunter.py index 60784647..cf044a34 100644 --- a/channels/cliphunter.py +++ b/channels/cliphunter.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools - +from platformcode import logger host = 'https://www.cliphunter.com' diff --git a/channels/coomelonitas.py b/channels/coomelonitas.py index 42b88afd..05d9164e 100644 --- a/channels/coomelonitas.py +++ b/channels/coomelonitas.py @@ -1,13 +1,11 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools +import re +from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host ='http://www.coomelonitas.com' diff --git a/channels/cumlouder.py b/channels/cumlouder.py index abbeeba8..1bc5568c 100644 --- a/channels/cumlouder.py +++ b/channels/cumlouder.py @@ -2,6 +2,7 @@ import re import urllib + import urlparse from core import httptools diff --git a/channels/czechvideo.py b/channels/czechvideo.py index b914d462..3dd4bbb8 100644 --- a/channels/czechvideo.py +++ b/channels/czechvideo.py @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys +import re +import urlparse + +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools +from platformcode import logger host = 'http://czechvideo.org' diff --git a/channels/documentaristreamingda.py b/channels/documentaristreamingda.py index 4dd43d76..bfed21b3 100644 --- a/channels/documentaristreamingda.py +++ b/channels/documentaristreamingda.py @@ -3,13 +3,12 @@ # Ringraziamo Icarus crew # Canale per documentaristreamingda # ------------------------------------------------------------ -import re, urlparse +import re +import urlparse -from platformcode import logger, config -from core import httptools, scrapertools, servertools +from core import httptools, scrapertools, servertools from core.item import Item - - +from platformcode import logger, config host = "https://documentari-streaming-da.com" diff --git a/channels/dreamsub.py b/channels/dreamsub.py index e575ee3f..c5516fae 100644 --- a/channels/dreamsub.py +++ b/channels/dreamsub.py @@ -3,14 +3,13 @@ # Ringraziamo Icarus crew # Canale per dreamsub # ------------------------------------------------------------ -import re, urlparse +import re +import urlparse from core import scrapertools, httptools, servertools, tmdb from core.item import Item from platformcode import logger, config - - host = "https://www.dreamsub.co" diff --git a/channels/elreyx.py b/channels/elreyx.py index 2be4cb35..33f78914 100644 --- a/channels/elreyx.py +++ b/channels/elreyx.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools +import re +import urlparse + from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import logger host = 'http://www.elreyx.com' diff --git a/channels/eporner.py b/channels/eporner.py index edbb3f67..7cb78df8 100644 --- a/channels/eporner.py +++ b/channels/eporner.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import httptools diff --git a/channels/eroticage.py b/channels/eroticage.py index fab51da2..eb42dd31 100644 --- a/channels/eroticage.py +++ b/channels/eroticage.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys +import re +import urlparse + +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools +from platformcode import logger host = 'http://www.eroticage.net' diff --git a/channels/eroticasonlinetv.py b/channels/eroticasonlinetv.py index 42e4e885..6f6c6017 100644 --- a/channels/eroticasonlinetv.py +++ b/channels/eroticasonlinetv.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools +import re +import urlparse + from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import logger host = 'http://www.peliculaseroticasonline.tv' diff --git a/channels/erotik.py b/channels/erotik.py index 25250305..fb8168f1 100644 --- a/channels/erotik.py +++ b/channels/erotik.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import httptools diff --git a/channels/eurostreaming.py b/channels/eurostreaming.py index 70ebc4ee..d2687933 100644 --- a/channels/eurostreaming.py +++ b/channels/eurostreaming.py @@ -17,11 +17,10 @@ import re -from specials import autoplay, filtertools -from core import scrapertoolsV2, httptools, servertools, tmdb, support +from core import scrapertoolsV2, httptools, tmdb, support from core.item import Item from platformcode import logger, config - +from specials import autoplay host = "https://eurostreaming.cafe/" headers = ['Referer', host] diff --git a/channels/fapality.py b/channels/fapality.py index f8ec9cbc..780f9796 100644 --- a/channels/fapality.py +++ b/channels/fapality.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://fapality.com' diff --git a/channels/fastsubita.py b/channels/fastsubita.py index 97e75997..f2bba2a5 100644 --- a/channels/fastsubita.py +++ b/channels/fastsubita.py @@ -4,12 +4,12 @@ # Canale per fastsubita # ------------------------------------------------------------ -import re, urlparse +import re -from specials import autoplay, filtertools -from core import scrapertools, servertools, httptools, tmdb +from core import scrapertools, httptools, tmdb from core.item import Item from platformcode import config, logger +from specials import autoplay __channel__ = 'fastsubita' host = config.get_setting("channel_host", __channel__) diff --git a/channels/fetishshrine.py b/channels/fetishshrine.py index a0a3971d..ddd0ac14 100644 --- a/channels/fetishshrine.py +++ b/channels/fetishshrine.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.fetishshrine.com' diff --git a/channels/filmigratis.py b/channels/filmigratis.py index 82e9bca8..1a1a28b3 100644 --- a/channels/filmigratis.py +++ b/channels/filmigratis.py @@ -2,15 +2,12 @@ # ------------------------------------------------------------ # Canale per Filmi Gratis # ------------------------------------------------------------ -import base64 import re -import urlparse -from channelselector import get_thumb -from specials import filtertools, autoplay from core import scrapertools, servertools, httptools, tmdb, support -from platformcode import logger, config from core.item import Item +from platformcode import logger, config +from specials import autoplay channel = 'filmigratis' diff --git a/channels/filmoviXXX.py b/channels/filmoviXXX.py index f61b0e84..b378e4d5 100644 --- a/channels/filmoviXXX.py +++ b/channels/filmoviXXX.py @@ -1,12 +1,14 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys +import re +import urlparse + +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools +from platformcode import logger + # BLOQUEO ESET INTERNET SECURITY def mainlist(item): diff --git a/channels/filmpertutti.py b/channels/filmpertutti.py index bca50d7e..6a936109 100644 --- a/channels/filmpertutti.py +++ b/channels/filmpertutti.py @@ -3,14 +3,12 @@ # Canale per filmpertutti.co # ------------------------------------------------------------ import re -import urlparse -from specials import autoplay +from channelselector import thumb from core import scrapertoolsV2, servertools, httptools, tmdb, support from core.item import Item -from lib import unshortenit from platformcode import config, logger -from channelselector import thumb +from specials import autoplay host = "https://www.filmpertutti.club" headers = [['Referer', host]] diff --git a/channels/filmpornoita.py b/channels/filmpornoita.py index 2287c3ed..880f1e1d 100644 --- a/channels/filmpornoita.py +++ b/channels/filmpornoita.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://www.streamxxxx.com' diff --git a/channels/filmsenzalimiti.py b/channels/filmsenzalimiti.py index a0103af7..de62f0c4 100644 --- a/channels/filmsenzalimiti.py +++ b/channels/filmsenzalimiti.py @@ -2,17 +2,13 @@ # ------------------------------------------------------------ # Canale per Filmsenzalimiti # ------------------------------------------------------------ -import base64 import re -import urlparse -from channelselector import get_thumb -from specials import filtertools, autoplay from core import scrapertools, servertools, httptools, support -from platformcode import logger, config from core.item import Item from platformcode import config -from core import tmdb +from platformcode import logger +from specials import autoplay __channel__ = 'filmsenzalimiti' diff --git a/channels/filmsenzalimiticc.py b/channels/filmsenzalimiticc.py index d54afbdd..7db3b9b5 100644 --- a/channels/filmsenzalimiticc.py +++ b/channels/filmsenzalimiticc.py @@ -2,17 +2,16 @@ # ------------------------------------------------------------ # Canale per Filmsenzalimiti CC # ------------------------------------------------------------ -import base64 import re + import urlparse -from specials import autoplay -from specials import filtertools from core import scrapertools, servertools, httptools -from platformcode import logger, config +from core import tmdb from core.item import Item from platformcode import config -from core import tmdb +from platformcode import logger +from specials import autoplay # Necessario per Autoplay __channel__ = 'filmsenzalimiticc' diff --git a/channels/foxtube.py b/channels/foxtube.py index 353d0bdb..4b45a898 100644 --- a/channels/foxtube.py +++ b/channels/foxtube.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://es.foxtube.com' diff --git a/channels/freeporn.py b/channels/freeporn.py index ee856614..3103651f 100644 --- a/channels/freeporn.py +++ b/channels/freeporn.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://frprn.com' diff --git a/channels/freepornstreams.py b/channels/freepornstreams.py index b56db321..c436dec8 100644 --- a/channels/freepornstreams.py +++ b/channels/freepornstreams.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys +import re +import urlparse + +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools +from platformcode import logger host = 'http://freepornstreams.org' diff --git a/channels/guardarefilm.py b/channels/guardarefilm.py index 3e1403b0..b3a5fb0d 100644 --- a/channels/guardarefilm.py +++ b/channels/guardarefilm.py @@ -4,13 +4,13 @@ # Canale per guardarefilm # ---------------------------------------------------------- import re + import urlparse from core import httptools from core import scrapertools from core import servertools from core.item import Item -from core import tmdb from platformcode import logger, config host = "https://www.guardarefilm.video" diff --git a/channels/guardaseriecc.py b/channels/guardaseriecc.py index 4e65e832..41fe6102 100644 --- a/channels/guardaseriecc.py +++ b/channels/guardaseriecc.py @@ -7,12 +7,11 @@ import re from core import httptools, scrapertools, servertools -from core.item import Item from core import tmdb +from core.item import Item from lib import unshortenit from platformcode import logger, config - host = 'https://guardaserie.site' headers = [['Referer', host]] diff --git a/channels/guardaserieclick.py b/channels/guardaserieclick.py index 71915f5d..a7387fef 100644 --- a/channels/guardaserieclick.py +++ b/channels/guardaserieclick.py @@ -6,12 +6,11 @@ import re -from core import httptools, scrapertools, servertools, support -from core.item import Item +from core import httptools, scrapertools, servertools, support from core import tmdb +from core.item import Item from platformcode import logger, config - host = "http://www.guardaserie.watch" headers = [['Referer', host]] diff --git a/channels/guardogratis.py b/channels/guardogratis.py index f5808ef4..03583c41 100644 --- a/channels/guardogratis.py +++ b/channels/guardogratis.py @@ -4,15 +4,16 @@ # Canale per guardogratis # # ---------------------------------------------------------- -import re +import re + import urlparse from core import httptools -from platformcode import logger, config from core import scrapertools from core import servertools -from core.item import Item from core import tmdb +from core.item import Item +from platformcode import logger, config __channel__ = "guardogratis" diff --git a/channels/hclips.py b/channels/hclips.py index 9ae7ce89..785ba47e 100644 --- a/channels/hclips.py +++ b/channels/hclips.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urllib +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://www.hclips.com' diff --git a/channels/hdblog.py b/channels/hdblog.py index f98f1b18..805e3d84 100644 --- a/channels/hdblog.py +++ b/channels/hdblog.py @@ -3,13 +3,12 @@ # Ringraziamo Icarus crew # Canale hdblog # ------------------------------------------------------------ -import re, urlparse +import re +import urlparse from core import httptools, scrapertools -from platformcode import logger, config from core.item import Item - - +from platformcode import logger host = "https://www.hdblog.it" diff --git a/channels/hdzog.py b/channels/hdzog.py index 09ef0158..7fb08179 100644 --- a/channels/hdzog.py +++ b/channels/hdzog.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urllib +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://www.hdzog.com' diff --git a/channels/hellporno.py b/channels/hellporno.py index d1e21273..e6407aa0 100644 --- a/channels/hellporno.py +++ b/channels/hellporno.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://hellporno.com' diff --git a/channels/hentaiid.py b/channels/hentaiid.py index 22430fef..f1c69f7b 100644 --- a/channels/hentaiid.py +++ b/channels/hentaiid.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import httptools diff --git a/channels/hotmovs.py b/channels/hotmovs.py index 37ec2078..78ebcb6a 100644 --- a/channels/hotmovs.py +++ b/channels/hotmovs.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urllib +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://hotmovs.com' diff --git a/channels/ilgeniodellostreaming.py b/channels/ilgeniodellostreaming.py index 77bcc496..a88dafe4 100644 --- a/channels/ilgeniodellostreaming.py +++ b/channels/ilgeniodellostreaming.py @@ -3,14 +3,14 @@ # Ringraziamo Icarus crew # Canale per ilgeniodellostreaming # ------------------------------------------------------------ -import re, urlparse +import re +import urlparse -from platformcode import config, logger from core import scrapertools, servertools, httptools -from core.item import Item -from specials import autoplay -from specials import filtertools from core import tmdb +from core.item import Item +from platformcode import config, logger +from specials import autoplay __channel__ = "ilgeniodellostreaming" diff --git a/channels/ilgiramondo.py b/channels/ilgiramondo.py index 07130391..e6b9116d 100644 --- a/channels/ilgiramondo.py +++ b/channels/ilgiramondo.py @@ -3,13 +3,12 @@ # Ringraziamo Icarus crew # Canale ilgiramondo # ------------------------------------------------------------ -import re, urlparse +import re +import urlparse from core import httptools, scrapertools -from platformcode import logger, config from core.item import Item - - +from platformcode import logger host = "http://www.ilgiramondo.net" diff --git a/channels/istitutoluce.py b/channels/istitutoluce.py index acf8249a..e859bfd5 100644 --- a/channels/istitutoluce.py +++ b/channels/istitutoluce.py @@ -4,14 +4,13 @@ # Canale istitutoluce # ------------------------------------------------------------ -import re, urlparse +import re +import urlparse from core import httptools, scrapertools, servertools from core.item import Item from platformcode import logger, config - - host = "https://patrimonio.archivioluce.com" host2 = "https://www.archivioluce.com" diff --git a/channels/italiafilm.py b/channels/italiafilm.py index a9b6c296..fa437435 100644 --- a/channels/italiafilm.py +++ b/channels/italiafilm.py @@ -4,15 +4,14 @@ # Canale per italiafilm # ---------------------------------------------------------- import re -import time + import urlparse from core import httptools from core import scrapertools from core import servertools -from core.item import Item from core import tmdb -from lib.unshortenit import unshorten_only +from core.item import Item from platformcode import logger, config host = "https://www.italia-film.pro" diff --git a/channels/italiafilmhd.py b/channels/italiafilmhd.py index ba41d390..9ab4a0ab 100644 --- a/channels/italiafilmhd.py +++ b/channels/italiafilmhd.py @@ -3,15 +3,14 @@ # Ringraziamo Icarus crew # Canale per italiafilmhd # ---------------------------------------------------------- -import base64 import re + import urlparse -from specials import autoplay -from specials import filtertools from core import scrapertools, servertools, httptools, tmdb, support from core.item import Item from platformcode import logger, config +from specials import autoplay IDIOMAS = {'Italiano': 'IT'} list_language = IDIOMAS.values() diff --git a/channels/italiaserie.py b/channels/italiaserie.py index af216988..0c1e46bf 100644 --- a/channels/italiaserie.py +++ b/channels/italiaserie.py @@ -5,8 +5,8 @@ import re import autoplay -import filtertools import support + from core import httptools, scrapertools from core import tmdb from core.item import Item diff --git a/channels/itastreaming.py b/channels/itastreaming.py index 79a5318c..9c9cf2e4 100644 --- a/channels/itastreaming.py +++ b/channels/itastreaming.py @@ -3,16 +3,12 @@ # Ringraziamo Icarus crew # Canale per itastreaming # ---------------------------------------------------------- -import base64 import re -import urlparse -from core import scrapertools, httptools, servertools, tmdb, support +from core import scrapertools, httptools, tmdb, support from core.item import Item from platformcode import logger, config - - host = "https://itastreaming.film" headers = [['Referer', host]] diff --git a/channels/javlin.py b/channels/javlin.py index f73e27a8..39d12d60 100644 --- a/channels/javlin.py +++ b/channels/javlin.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://javl.in' diff --git a/channels/javwhores.py b/channels/javwhores.py index e0c901c4..26105d9f 100644 --- a/channels/javwhores.py +++ b/channels/javwhores.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools - +from platformcode import logger host = 'https://www.javwhores.com/' diff --git a/channels/jizzbunker.py b/channels/jizzbunker.py index a7c6e0e2..4e148b76 100644 --- a/channels/jizzbunker.py +++ b/channels/jizzbunker.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://jizzbunker.com/es' diff --git a/channels/justporn.py b/channels/justporn.py index accfe7ae..e44e5388 100644 --- a/channels/justporn.py +++ b/channels/justporn.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://xxx.justporno.tv' diff --git a/channels/mondolunatico.py b/channels/mondolunatico.py index 1a6c5f46..864cc419 100644 --- a/channels/mondolunatico.py +++ b/channels/mondolunatico.py @@ -7,15 +7,16 @@ import os import re import time import urllib + import urlparse from core import httptools -from platformcode import config -from platformcode import logger from core import scrapertools from core import servertools -from core.item import Item from core import tmdb +from core.item import Item +from platformcode import config +from platformcode import logger __channel__ = "mondolunatico" diff --git a/channels/mondoserietv.py b/channels/mondoserietv.py index a7649b10..fc8e1498 100644 --- a/channels/mondoserietv.py +++ b/channels/mondoserietv.py @@ -5,15 +5,13 @@ # # ---------------------------------------------------------- import re -import urllib -from specials import autoplay -from specials import filtertools from core import scrapertools, servertools, httptools, scrapertoolsV2 -from core.item import Item from core import tmdb +from core.item import Item from lib.unshortenit import unshorten from platformcode import logger, config +from specials import autoplay host = "https://mondoserietv.com" IDIOMAS = {'Italiano': 'IT'} diff --git a/channels/mporno.py b/channels/mporno.py index 6b48d298..a9501fa5 100644 --- a/channels/mporno.py +++ b/channels/mporno.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://mporno.tv' diff --git a/channels/muchoporno.py b/channels/muchoporno.py index 5f3acbca..7841a745 100644 --- a/channels/muchoporno.py +++ b/channels/muchoporno.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.pornburst.xxx' diff --git a/channels/nuvid.py b/channels/nuvid.py index cddd53ad..36c0d630 100644 --- a/channels/nuvid.py +++ b/channels/nuvid.py @@ -2,6 +2,7 @@ import base64 import hashlib + import urlparse from core import httptools diff --git a/channels/pandamovie.py b/channels/pandamovie.py index 8cec78c5..febd0f7a 100644 --- a/channels/pandamovie.py +++ b/channels/pandamovie.py @@ -1,16 +1,13 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------ -import urlparse -import urllib2 -import urllib import re -import os -import sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger + +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'https://pandamovies.pw' diff --git a/channels/peliculaseroticas.py b/channels/peliculaseroticas.py index bfe7f065..07557dc8 100644 --- a/channels/peliculaseroticas.py +++ b/channels/peliculaseroticas.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- import re + import urlparse +from core import httptools from core import scrapertools from core.item import Item from platformcode import logger -from core import httptools def mainlist(item): diff --git a/channels/perfectgirls.py b/channels/perfectgirls.py index 43503f3c..bd9ab819 100644 --- a/channels/perfectgirls.py +++ b/channels/perfectgirls.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://www.perfectgirls.net' diff --git a/channels/piratestreaming.py b/channels/piratestreaming.py index d7b3c11f..a3598e2a 100644 --- a/channels/piratestreaming.py +++ b/channels/piratestreaming.py @@ -4,15 +4,15 @@ # Canale per piratestreaming # ---------------------------------------------------------- import re + import urlparse -from specials import autoplay -from specials import filtertools from core import httptools, scrapertools, servertools -from core.item import Item from core import tmdb +from core.item import Item from lib import unshortenit from platformcode import logger, config +from specials import autoplay __channel__ = "piratestreaming" diff --git a/channels/playpornx.py b/channels/playpornx.py index 6d78f45c..a95d2d77 100644 --- a/channels/playpornx.py +++ b/channels/playpornx.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import httptools diff --git a/channels/porn300.py b/channels/porn300.py index 98336141..e68dbc69 100644 --- a/channels/porn300.py +++ b/channels/porn300.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.porn300.com' diff --git a/channels/pornboss.py b/channels/pornboss.py index fff3c45e..3a8f00b2 100644 --- a/channels/pornboss.py +++ b/channels/pornboss.py @@ -1,14 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import jsontools as json +import re + +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools -from core import tmdb +from platformcode import logger host = 'http://pornboss.org' diff --git a/channels/porneq.py b/channels/porneq.py index b99e176d..e7ecd0dc 100644 --- a/channels/porneq.py +++ b/channels/porneq.py @@ -1,16 +1,11 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------ -import urlparse -import urllib2 -import urllib import re -import os -import sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://porneq.com' diff --git a/channels/pornhive.py b/channels/pornhive.py index be3ff00b..42c23f84 100644 --- a/channels/pornhive.py +++ b/channels/pornhive.py @@ -1,14 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys import base64 +import re +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools +from platformcode import logger host = 'http://www.pornhive.tv/en' diff --git a/channels/pornhub.py b/channels/pornhub.py index 1ba72460..55fafe6c 100644 --- a/channels/pornhub.py +++ b/channels/pornhub.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- import re + import urlparse + from core import httptools from core import scrapertools from core.item import Item diff --git a/channels/pornrewind.py b/channels/pornrewind.py index 16af24f4..918bead8 100644 --- a/channels/pornrewind.py +++ b/channels/pornrewind.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.pornrewind.com' diff --git a/channels/porntrex.py b/channels/porntrex.py index 6888e620..e11ac968 100644 --- a/channels/porntrex.py +++ b/channels/porntrex.py @@ -2,6 +2,7 @@ import re import urllib + import urlparse from core import httptools diff --git a/channels/programmazione.py b/channels/programmazione.py index 39d28aae..7ad79e71 100644 --- a/channels/programmazione.py +++ b/channels/programmazione.py @@ -8,10 +8,8 @@ import re from core import httptools, scrapertools -from platformcode import logger, config from core.item import Item - - +from platformcode import logger site = "https://www.youtube.com" diff --git a/channels/qwertty.py b/channels/qwertty.py index c15fb750..bfcfef78 100644 --- a/channels/qwertty.py +++ b/channels/qwertty.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urllib +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://qwertty.net' diff --git a/channels/redtube.py b/channels/redtube.py index 9aaf9a61..c6ad55aa 100644 --- a/channels/redtube.py +++ b/channels/redtube.py @@ -2,7 +2,9 @@ #------------------------------------------------------------ import re + import urlparse + from core import httptools from core import scrapertools from core.item import Item diff --git a/channels/ricettevideo.py b/channels/ricettevideo.py index 66f746e0..f304eef1 100644 --- a/channels/ricettevideo.py +++ b/channels/ricettevideo.py @@ -3,13 +3,12 @@ # Ringraziamo Icarus crew # Canale ricettevideo # ------------------------------------------------------------ -import re, urlparse +import re +import urlparse from core import httptools, scrapertools -from platformcode import logger, config from core.item import Item - - +from platformcode import logger host = "http://ricettevideo.net" diff --git a/channels/seriehd.py b/channels/seriehd.py index 2f167ac6..7a1e5974 100644 --- a/channels/seriehd.py +++ b/channels/seriehd.py @@ -4,12 +4,12 @@ # ------------------------------------------------------------ import urlparse -from specials import autoplay, filtertools -from core.support import menu, log -from core import scrapertoolsV2, servertools, httptools, tmdb, support -from core.item import Item -from platformcode import logger, config from channelselector import thumb +from core import scrapertoolsV2, servertools, httptools, support +from core.item import Item +from core.support import menu, log +from platformcode import logger, config +from specials import autoplay host = "https://seriehd.casa" diff --git a/channels/serietvonline.py b/channels/serietvonline.py index adc05134..120e4152 100644 --- a/channels/serietvonline.py +++ b/channels/serietvonline.py @@ -4,12 +4,12 @@ # ---------------------------------------------------------- import re +from channelselector import thumb from core import httptools, scrapertoolsV2, servertools, tmdb, support from core.item import Item from lib import unshortenit from platformcode import logger, config from specials import autoplay -from channelselector import thumb host = "https://serietvonline.live" headers = [['Referer', host]] diff --git a/channels/serietvsubita.py b/channels/serietvsubita.py index 7716cedc..0e587acc 100644 --- a/channels/serietvsubita.py +++ b/channels/serietvsubita.py @@ -3,15 +3,15 @@ # Canale per Serie Tv Sub ITA # Thanks to Icarus crew & Alfa addon # ---------------------------------------------------------- -import inspect import re import time import channelselector -from specials import autoplay, filtertools -from core import httptools, tmdb, scrapertools, servertools, support +from core import httptools, tmdb, scrapertools, support from core.item import Item from platformcode import logger, config +from specials import autoplay + __channel__ = "serietvsubita" host = config.get_setting("channel_host", __channel__) headers = [['Referer', host]] diff --git a/channels/serietvu.py b/channels/serietvu.py index c4dedb4f..80fb13c9 100644 --- a/channels/serietvu.py +++ b/channels/serietvu.py @@ -6,10 +6,11 @@ import re import channelselector -from specials import autoplay, filtertools -from core import httptools, tmdb, scrapertools, servertools, support +from core import httptools, tmdb, scrapertools, support from core.item import Item from platformcode import logger, config +from specials import autoplay + __channel__ = 'serietvu' host = config.get_setting("channel_host", __channel__) headers = [['Referer', host]] diff --git a/channels/serviporno.py b/channels/serviporno.py index e1491070..704b1496 100644 --- a/channels/serviporno.py +++ b/channels/serviporno.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import httptools diff --git a/channels/sexgalaxy.py b/channels/sexgalaxy.py index c8b68f16..9cc93f00 100644 --- a/channels/sexgalaxy.py +++ b/channels/sexgalaxy.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- import re + import urlparse + from core import httptools from core import scrapertools from core import servertools diff --git a/channels/sexkino.py b/channels/sexkino.py index efb4d5c3..8eb31482 100644 --- a/channels/sexkino.py +++ b/channels/sexkino.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- import re + import urlparse + from core import httptools from core import scrapertools from core import servertools diff --git a/channels/sexofilm.py b/channels/sexofilm.py index 305bd899..1d7012dd 100644 --- a/channels/sexofilm.py +++ b/channels/sexofilm.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys +import re +import urlparse + +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools +from platformcode import logger host = 'http://sexofilm.com' diff --git a/channels/siska.py b/channels/siska.py index 2ef0d1a2..4fce0a75 100644 --- a/channels/siska.py +++ b/channels/siska.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://www.siska.tv/' diff --git a/channels/sleazemovies.py b/channels/sleazemovies.py index 10b81e6f..1f7d8744 100644 --- a/channels/sleazemovies.py +++ b/channels/sleazemovies.py @@ -4,6 +4,7 @@ # -*- By Sculkurt -*- import re + from channelselector import get_thumb from core import httptools from core import scrapertools diff --git a/channels/spankbang.py b/channels/spankbang.py index 538eabe8..f6c25fcf 100644 --- a/channels/spankbang.py +++ b/channels/spankbang.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://es.spankbang.com' diff --git a/channels/spankwire.py b/channels/spankwire.py index f0271f58..38522cd6 100644 --- a/channels/spankwire.py +++ b/channels/spankwire.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.spankwire.com' diff --git a/channels/streamingaltadefinizione.py b/channels/streamingaltadefinizione.py index 5e190e68..8dceedac 100644 --- a/channels/streamingaltadefinizione.py +++ b/channels/streamingaltadefinizione.py @@ -4,8 +4,8 @@ # ------------------------------------------------------------ from core import support -from specials import autoplay from core.item import Item +from specials import autoplay host = 'https://www.streamingaltadefinizione.space' diff --git a/channels/streamingporn.py b/channels/streamingporn.py index 027fc9e9..15357d7f 100644 --- a/channels/streamingporn.py +++ b/channels/streamingporn.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools +import re +import urlparse + from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import logger host = 'http://streamingporn.xyz' diff --git a/channels/streamking.py b/channels/streamking.py index 7a49541c..71aecbfe 100644 --- a/channels/streamking.py +++ b/channels/streamking.py @@ -7,10 +7,9 @@ import re import urllib -from core import scrapertools, servertools, httptools -from platformcode import logger, config +from core import scrapertools, httptools from core.item import Item -from platformcode import config +from platformcode import logger host = "http://streamking.cc" diff --git a/channels/streamporno.py b/channels/streamporno.py index 04bf6b28..1625ee2e 100644 --- a/channels/streamporno.py +++ b/channels/streamporno.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://streamporno.eu' diff --git a/channels/submityouflicks.py b/channels/submityouflicks.py index cdc15fce..4d013109 100644 --- a/channels/submityouflicks.py +++ b/channels/submityouflicks.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import httptools diff --git a/channels/sunporno.py b/channels/sunporno.py index 2711a09b..65438323 100644 --- a/channels/sunporno.py +++ b/channels/sunporno.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.sunporno.com' diff --git a/channels/tabooshare.py b/channels/tabooshare.py index 628bc5b1..0ce7976d 100644 --- a/channels/tabooshare.py +++ b/channels/tabooshare.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys +import re + +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools +from platformcode import logger host = 'http://tabooshare.com' diff --git a/channels/tantifilm.py b/channels/tantifilm.py index c82d92e5..aa88d6b6 100644 --- a/channels/tantifilm.py +++ b/channels/tantifilm.py @@ -4,13 +4,14 @@ # ------------------------------------------------------------ import re + import urlparse -from specials import autorenumber -from core.support import menu, log, aplay from core import scrapertoolsV2, httptools, tmdb, support from core.item import Item -from platformcode import config, logger +from core.support import menu, log, aplay +from platformcode import logger +from specials import autorenumber IDIOMAS = {'Italiano': 'IT'} list_language = IDIOMAS.values() diff --git a/channels/thumbzilla.py b/channels/thumbzilla.py index d0273b3c..e68fa3b5 100644 --- a/channels/thumbzilla.py +++ b/channels/thumbzilla.py @@ -1,15 +1,15 @@ # -*- coding: utf-8 -*- import re + import urlparse +from channelselector import get_thumb from core import channeltools from core import httptools from core import scrapertools -from core import servertools from core.item import Item from platformcode import config, logger -from channelselector import get_thumb __channel__ = "thumbzilla" diff --git a/channels/tnaflix.py b/channels/tnaflix.py index 37127033..5ed50378 100644 --- a/channels/tnaflix.py +++ b/channels/tnaflix.py @@ -1,14 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools -from core import tmdb -from core import jsontools +from platformcode import logger host = 'https://www.tnaflix.com' diff --git a/channels/toonitalia.py b/channels/toonitalia.py index 6b881f03..36cc0dfb 100644 --- a/channels/toonitalia.py +++ b/channels/toonitalia.py @@ -5,12 +5,11 @@ # ------------------------------------------------------------ import re -import urlparse -from specials import autoplay, filtertool -from core import scrapertools, scrapertoolsV2, httptools, tmdb, servertoolss, support +from core import scrapertools, httptools, tmdb, support from core.item import Item -from platformcode import logger, config +from platformcode import logger +from specials import autoplay channel = "toonitalia" host = "https://toonitalia.org" diff --git a/channels/tryboobs.py b/channels/tryboobs.py index 5d8b01bb..24d326e0 100644 --- a/channels/tryboobs.py +++ b/channels/tryboobs.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://www.tryboobs.com' diff --git a/channels/tubedupe.py b/channels/tubedupe.py index ae014ad6..c3fd7404 100644 --- a/channels/tubedupe.py +++ b/channels/tubedupe.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://tubedupe.com' diff --git a/channels/tubehentai.py b/channels/tubehentai.py index e679a5d7..baf45d1d 100644 --- a/channels/tubehentai.py +++ b/channels/tubehentai.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import scrapertools diff --git a/channels/vedohd.py b/channels/vedohd.py index 2e21ae8e..9e459c63 100644 --- a/channels/vedohd.py +++ b/channels/vedohd.py @@ -3,14 +3,10 @@ # Canale per vedohd # ------------------------------------------------------------ -import re -import urlparse - -from specials import autoplay -from core import scrapertoolsV2, httptools, servertools, support +from core import scrapertoolsV2, httptools, support from core.item import Item from platformcode import logger -from channelselector import thumb +from specials import autoplay headers = "" host = "" diff --git a/channels/videosXYZ.py b/channels/videosXYZ.py index 489efdc5..6801942b 100644 --- a/channels/videosXYZ.py +++ b/channels/videosXYZ.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys +import re +import urlparse + +from core import httptools from core import scrapertools from core import servertools from core.item import Item -from platformcode import config, logger -from core import httptools +from platformcode import logger host = 'http://free-porn-videos.xyz' diff --git a/channels/vidz7.py b/channels/vidz7.py index 35a1cfe7..5621f1eb 100644 --- a/channels/vidz7.py +++ b/channels/vidz7.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import httptools diff --git a/channels/vintagetube.py b/channels/vintagetube.py index 1bd20636..87ca480d 100644 --- a/channels/vintagetube.py +++ b/channels/vintagetube.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://www.vintagetube.club' diff --git a/channels/vintagexxxsex.py b/channels/vintagexxxsex.py index 3e1650f9..7c732c7a 100644 --- a/channels/vintagexxxsex.py +++ b/channels/vintagexxxsex.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://www.vintagexxxsex.com' diff --git a/channels/vporn.py b/channels/vporn.py index 048ba1bd..810b6414 100644 --- a/channels/vporn.py +++ b/channels/vporn.py @@ -1,14 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import jsontools as json -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools -from core import tmdb +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'https://www.vporn.com' diff --git a/channels/watchpornfree.py b/channels/watchpornfree.py index 2115bc58..6760feb7 100644 --- a/channels/watchpornfree.py +++ b/channels/watchpornfree.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger # https://playpornfree.org/ https://mangoporn.net/ https://watchfreexxx.net/ https://losporn.org/ https://xxxstreams.me/ https://speedporn.net/ diff --git a/channels/webpeliculasporno.py b/channels/webpeliculasporno.py index 9b1d474d..d9510a03 100644 --- a/channels/webpeliculasporno.py +++ b/channels/webpeliculasporno.py @@ -1,16 +1,13 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------ -import urlparse -import urllib2 -import urllib import re -import os -import sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger + +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://www.webpeliculasporno.com' diff --git a/channels/woodrocket.py b/channels/woodrocket.py index 7bf2dee1..c4e1ec74 100644 --- a/channels/woodrocket.py +++ b/channels/woodrocket.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://woodrocket.com' diff --git a/channels/x18hentai.py b/channels/x18hentai.py index 66f15a18..21c84558 100644 --- a/channels/x18hentai.py +++ b/channels/x18hentai.py @@ -4,9 +4,9 @@ import re from core import httptools from core import scrapertools +from core import servertools from core.item import Item from platformcode import logger -from core import servertools host = 'http://www.18hentaionline.net/' headers = [['User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], diff --git a/channels/xhamster.py b/channels/xhamster.py index e56481eb..fb528002 100644 --- a/channels/xhamster.py +++ b/channels/xhamster.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- import re -import sys + import urlparse -from platformcode import logger from core import scrapertools, httptools from core.item import Item +from platformcode import logger HOST = "http://es.xhamster.com/" diff --git a/channels/xms.py b/channels/xms.py index 3f4440c4..ad360a8c 100644 --- a/channels/xms.py +++ b/channels/xms.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import re + import urlparse from core import channeltools diff --git a/channels/xozilla.py b/channels/xozilla.py index 4b5640ed..e9ded5f6 100644 --- a/channels/xozilla.py +++ b/channels/xozilla.py @@ -1,17 +1,13 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------ -import urlparse -import urllib2 -import urllib import re -import os -import sys -from platformcode import config, logger +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.xozilla.com' diff --git a/channels/xtapes.py b/channels/xtapes.py index c0ce25b6..0ca05421 100644 --- a/channels/xtapes.py +++ b/channels/xtapes.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools +import re +import urlparse + from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import logger host = 'http://hd.xtapes.to' diff --git a/channels/xxxdan.py b/channels/xxxdan.py index dc9c7926..6d369df1 100644 --- a/channels/xxxdan.py +++ b/channels/xxxdan.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys +import re +import urlparse -from platformcode import config, logger +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'http://xxxdan.com' diff --git a/channels/xxxfreeinhd.py b/channels/xxxfreeinhd.py index 4562cf84..c5551afa 100644 --- a/channels/xxxfreeinhd.py +++ b/channels/xxxfreeinhd.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools +import re +import urlparse + from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import logger host = 'https://watchxxxfreeinhd.com' diff --git a/channels/xxxparodyhd.py b/channels/xxxparodyhd.py index 6daaf8d3..36695cc6 100644 --- a/channels/xxxparodyhd.py +++ b/channels/xxxparodyhd.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools from core import tmdb +from core.item import Item +from platformcode import logger host = 'https://xxxparodyhd.net' diff --git a/channels/xxxstreams.py b/channels/xxxstreams.py index 4d96439e..e8091c3c 100644 --- a/channels/xxxstreams.py +++ b/channels/xxxstreams.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://xxxstreams.org' diff --git a/channels/yespornplease.py b/channels/yespornplease.py index b63a61dd..89f48334 100644 --- a/channels/yespornplease.py +++ b/channels/yespornplease.py @@ -2,12 +2,11 @@ import re -from core import httptools -from core.item import Item -from platformcode import logger from urlparse import urljoin -from core import servertools +from core import httptools +from core import servertools +from platformcode import logger HOST="http://yespornplease.com" diff --git a/channels/youjizz.py b/channels/youjizz.py index eeec28cb..c7b799ae 100644 --- a/channels/youjizz.py +++ b/channels/youjizz.py @@ -1,16 +1,13 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------ -import urlparse -import urllib2 -import urllib import re -import os -import sys -from platformcode import config, logger + +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.youjizz.com' diff --git a/channels/youporn.py b/channels/youporn.py index f015a01b..1f952da0 100644 --- a/channels/youporn.py +++ b/channels/youporn.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger +import re +import urlparse + +from core import httptools from core import scrapertools from core.item import Item -from core import servertools -from core import httptools +from platformcode import logger host = 'https://www.youporn.com' diff --git a/channels/youtube_channel.py b/channels/youtube_channel.py index 0cd437be..343fd332 100644 --- a/channels/youtube_channel.py +++ b/channels/youtube_channel.py @@ -3,7 +3,6 @@ import urllib from core import jsontools -from core import scrapertools from core.item import Item from platformcode import logger diff --git a/channels/yuuk.py b/channels/yuuk.py index 8e9435cc..63d83ba7 100644 --- a/channels/yuuk.py +++ b/channels/yuuk.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- #------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger +import re +import urlparse + from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import logger host = 'http://yuuk.net' diff --git a/core/channeltools.py b/core/channeltools.py index 39d6b60b..d17fc86e 100644 --- a/core/channeltools.py +++ b/core/channeltools.py @@ -6,6 +6,7 @@ import os import jsontools + from platformcode import config, logger DEFAULT_UPDATE_URL = "/channels/" diff --git a/core/cloudflare.py b/core/cloudflare.py index b7a021c6..529e65c6 100644 --- a/core/cloudflare.py +++ b/core/cloudflare.py @@ -6,10 +6,10 @@ import re import time import urllib + import urlparse from platformcode import logger -from decimal import Decimal class Cloudflare: diff --git a/core/downloader.py b/core/downloader.py index e54ccb20..ea918462 100644 --- a/core/downloader.py +++ b/core/downloader.py @@ -24,9 +24,10 @@ import sys import threading import time import urllib +from threading import Thread, Lock + import urllib2 import urlparse -from threading import Thread, Lock from core import filetools from platformcode import logger, config diff --git a/core/downloadtools.py b/core/downloadtools.py index 36dc3350..260312e0 100644 --- a/core/downloadtools.py +++ b/core/downloadtools.py @@ -9,6 +9,7 @@ import socket import sys import time import urllib + import urllib2 from platformcode import config, logger diff --git a/core/item.py b/core/item.py index f07c8219..10d1a83c 100644 --- a/core/item.py +++ b/core/item.py @@ -7,6 +7,7 @@ import base64 import copy import os import urllib + from HTMLParser import HTMLParser from core import jsontools as json diff --git a/core/scrapertoolsV2.py b/core/scrapertoolsV2.py index 15f457bb..9fa26d28 100644 --- a/core/scrapertoolsV2.py +++ b/core/scrapertoolsV2.py @@ -5,6 +5,7 @@ import re import time + import urlparse from core.entities import html5 diff --git a/core/servertools.py b/core/servertools.py index 40dbdbf3..8ecea6fd 100644 --- a/core/servertools.py +++ b/core/servertools.py @@ -3,12 +3,11 @@ # Server management # -------------------------------------------------------------------------------- -import datetime import os import re -import time -import urlparse + import filetools +import urlparse from core import httptools from core import jsontools diff --git a/core/support.py b/core/support.py index 3fe8aa82..9da6dacb 100644 --- a/core/support.py +++ b/core/support.py @@ -1,12 +1,17 @@ # support functions that are needed by many channels, to no repeat the same code -import base64, urlparse, re, os, inspect, xbmcaddon +import base64 +import inspect +import os +import re +import urllib +import urlparse +import xbmcaddon + +from channelselector import thumb from core import httptools, scrapertoolsV2, servertools, tmdb from core.item import Item -import urllib - from lib import unshortenit from platformcode import logger, config -from channelselector import thumb from specials import autoplay diff --git a/core/tmdb.py b/core/tmdb.py index 7e5b8589..d71371b1 100644 --- a/core/tmdb.py +++ b/core/tmdb.py @@ -5,6 +5,8 @@ import re import sqlite3 import time +import xbmcaddon + from core import filetools from core import httptools from core import jsontools @@ -13,7 +15,6 @@ from core.item import InfoLabels from platformcode import config from platformcode import logger -import xbmc, xbmcaddon addon = xbmcaddon.Addon('metadata.themoviedb.org') def_lang = addon.getSetting('language') @@ -541,9 +542,6 @@ def completar_codigos(item): def discovery(item): - from core.item import Item - from platformcode import unify - if item.search_type == 'discover': listado = Tmdb(discover={'url':'discover/%s' % item.type, 'with_genres':item.list_type, 'language':def_lang, 'page':item.page}) diff --git a/core/trakt_tools.py b/core/trakt_tools.py index 95b6752b..0669e89a 100644 --- a/core/trakt_tools.py +++ b/core/trakt_tools.py @@ -4,14 +4,15 @@ # -*- By the Alfa Develop Group -* import os +from threading import Thread import xbmc + from core import httptools from core import jsontools from core.item import Item from platformcode import config from platformcode import logger -from threading import Thread client_id = "c40ba210716aee87f6a9ddcafafc56246909e5377b623b72c15909024448e89d" client_secret = "999164f25832341f0214453bb11c915adb18e9490d6b5e9a707963a5a1bee43e" diff --git a/core/tvdb.py b/core/tvdb.py index e0ad1c25..328fdce5 100644 --- a/core/tvdb.py +++ b/core/tvdb.py @@ -8,6 +8,7 @@ # ------------------------------------------------------------ import re + import urllib2 from core import jsontools @@ -19,7 +20,7 @@ from platformcode import platformtools HOST = "https://api.thetvdb.com" HOST_IMAGE = "http://thetvdb.com/banners/" -import xbmc, xbmcaddon +import xbmcaddon addon = xbmcaddon.Addon('metadata.tvdb.com') TOKEN = config.get_setting("tvdb_token", default="") diff --git a/core/videolibrarytools.py b/core/videolibrarytools.py index 6c7b532f..381e1bd5 100644 --- a/core/videolibrarytools.py +++ b/core/videolibrarytools.py @@ -11,9 +11,9 @@ from core import filetools from core import scraper from core import scrapertools from core.item import Item +from lib import generictools from platformcode import config, logger from platformcode import platformtools -from lib import generictools FOLDER_MOVIES = config.get_setting("folder_movies") FOLDER_TVSHOWS = config.get_setting("folder_tvshows") @@ -807,8 +807,6 @@ def caching_torrents(url, referer=None, post=None, torrents_path=None, timeout=1 logger.info() if referer and post: logger.info('REFERER: ' + referer) - import urllib - import re from core import httptools torrent_file = '' headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Referer': referer} #Necesario para el Post del .Torrent diff --git a/platformcode/custom_code.py b/platformcode/custom_code.py index 5ccb5ea1..bcfa6319 100644 --- a/platformcode/custom_code.py +++ b/platformcode/custom_code.py @@ -3,16 +3,16 @@ # Updater (kodi) # -------------------------------------------------------------------------------- -import os import json +import os import traceback + import xbmc import xbmcaddon -from platformcode import config, logger, platformtools - -from core import jsontools from core import filetools +from core import jsontools +from platformcode import config, logger, platformtools json_data_file_name = 'custom_code.json' diff --git a/platformcode/download_and_play.py b/platformcode/download_and_play.py index f8f9faab..39e3babf 100644 --- a/platformcode/download_and_play.py +++ b/platformcode/download_and_play.py @@ -11,10 +11,11 @@ import socket import threading import time import urllib -import urllib2 +import urllib2 import xbmc import xbmcgui + from core import downloadtools from platformcode import config, logger diff --git a/platformcode/infoplus.py b/platformcode/infoplus.py index 75ea411c..aeb4ef7f 100644 --- a/platformcode/infoplus.py +++ b/platformcode/infoplus.py @@ -7,7 +7,9 @@ import re from threading import Thread import xbmc +import xbmcaddon import xbmcgui + from core import httptools from core import scrapertools from core import tmdb @@ -16,7 +18,6 @@ from core.scrapertools import decodeHtmlentities as dhe from platformcode import config, logger from platformcode import platformtools -import xbmcaddon addon = xbmcaddon.Addon('metadata.themoviedb.org') def_lang = addon.getSetting('language') diff --git a/platformcode/keymaptools.py b/platformcode/keymaptools.py index 9594fa3b..66270a50 100644 --- a/platformcode/keymaptools.py +++ b/platformcode/keymaptools.py @@ -5,6 +5,7 @@ from threading import Timer import xbmc import xbmcaddon import xbmcgui + from channelselector import get_thumb from platformcode import config diff --git a/platformcode/launcher.py b/platformcode/launcher.py index 55da26c5..df7e000b 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -5,14 +5,15 @@ import os import sys -import urllib2 -import time + import updater +import urllib2 + from core import channeltools from core import scrapertools from core import servertools -from core import videolibrarytools from core import trakt_tools +from core import videolibrarytools from core.item import Item from platformcode import config, logger from platformcode import platformtools diff --git a/platformcode/logger.py b/platformcode/logger.py index 0812c964..447fe8a1 100644 --- a/platformcode/logger.py +++ b/platformcode/logger.py @@ -6,6 +6,7 @@ import inspect import xbmc + from platformcode import config loggeractive = (config.get_setting("debug") == True) diff --git a/platformcode/mct.py b/platformcode/mct.py index 38a5085a..2c2fe21d 100644 --- a/platformcode/mct.py +++ b/platformcode/mct.py @@ -7,6 +7,7 @@ import os import shutil import tempfile import urllib + import urllib2 try: diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 3304149d..7c17e473 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -14,15 +14,17 @@ import urllib import config import xbmc +import xbmcaddon import xbmcgui import xbmcplugin + from channelselector import get_thumb -from platformcode import unify from core import channeltools from core import trakt_tools, scrapertoolsV2 from core.item import Item from platformcode import logger -import xbmcaddon +from platformcode import unify + addon = xbmcaddon.Addon('plugin.video.kod') downloadenabled = addon.getSetting('downloadenabled') @@ -1128,7 +1130,6 @@ def play_torrent(item, xlistitem, mediaurl): logger.info() import time from core import filetools - from core import httptools from core import videolibrarytools # Opciones disponibles para Reproducir torrents diff --git a/platformcode/recaptcha.py b/platformcode/recaptcha.py index fa541856..57f4a68b 100644 --- a/platformcode/recaptcha.py +++ b/platformcode/recaptcha.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import xbmcgui + from core import httptools from core import scrapertools from platformcode import config diff --git a/platformcode/subtitletools.py b/platformcode/subtitletools.py index 5e49fdc8..fa55ddb7 100644 --- a/platformcode/subtitletools.py +++ b/platformcode/subtitletools.py @@ -8,6 +8,7 @@ from unicodedata import normalize import xbmc import xbmcgui + from platformcode import config, logger allchars = string.maketrans('', '') diff --git a/platformcode/unify.py b/platformcode/unify.py index 657df0d6..b93c1e84 100644 --- a/platformcode/unify.py +++ b/platformcode/unify.py @@ -6,14 +6,11 @@ # datos obtenidos de las paginas # ---------------------------------------------------------- -import os -import sys -import urllib -import unicodedata import re +import unicodedata import config -from core.item import Item + from core import scrapertools from platformcode import logger diff --git a/platformcode/updater.py b/platformcode/updater.py index ecb9d184..995c76ee 100644 --- a/platformcode/updater.py +++ b/platformcode/updater.py @@ -3,22 +3,17 @@ # Updater (kodi) # -------------------------------------------------------------------------------- -import os, sys -import time -import threading -import traceback -import urllib import json +import os +import sys +import threading +import time +import urllib + import xbmc -import shutil -from platformcode import config, logger, platformtools - -from core import httptools -from core import jsontools -from core import downloadtools from core import ziptools -from core import filetools +from platformcode import config, logger REMOTE_FILE = "https://github.com/kodiondemand/addon/archive/master.zip" DESTINATION_FOLDER = xbmc.translatePath("special://home/addons") + "/plugin.video.kod" diff --git a/platformcode/xbmc_config_menu.py b/platformcode/xbmc_config_menu.py index da728191..c31be558 100644 --- a/platformcode/xbmc_config_menu.py +++ b/platformcode/xbmc_config_menu.py @@ -7,6 +7,7 @@ import inspect import os import xbmcgui + from core import channeltools from core import servertools from platformcode import config, logger diff --git a/platformcode/xbmc_info_window.py b/platformcode/xbmc_info_window.py index 45a2c47a..fea52fa2 100644 --- a/platformcode/xbmc_info_window.py +++ b/platformcode/xbmc_info_window.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import xbmcgui + from core.tmdb import Tmdb from platformcode import config, logger diff --git a/platformcode/xbmc_videolibrary.py b/platformcode/xbmc_videolibrary.py index adc5c1a3..ecf46d27 100644 --- a/platformcode/xbmc_videolibrary.py +++ b/platformcode/xbmc_videolibrary.py @@ -6,9 +6,10 @@ import os import threading import time -import urllib2 +import urllib2 import xbmc + from core import filetools from core import jsontools from platformcode import config, logger diff --git a/servers/backin.py b/servers/backin.py index b30c3436..8bf5b7cb 100644 --- a/servers/backin.py +++ b/servers/backin.py @@ -2,11 +2,9 @@ import urllib -import xbmc - -from platformcode import logger from core import httptools from core import scrapertools +from platformcode import logger def test_video_exists(page_url): diff --git a/servers/bitshare.py b/servers/bitshare.py index 443a68b5..08acfe94 100644 --- a/servers/bitshare.py +++ b/servers/bitshare.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- -import re - from core import httptools -from core import scrapertools from platformcode import logger diff --git a/servers/cinemaupload.py b/servers/cinemaupload.py index 31c166ea..f06165d9 100644 --- a/servers/cinemaupload.py +++ b/servers/cinemaupload.py @@ -3,6 +3,7 @@ # Conector Cinemaupload By Alfa development Group # -------------------------------------------------------- import re + from core import httptools from core import scrapertools from platformcode import logger diff --git a/servers/cloudvideo.py b/servers/cloudvideo.py index e8652eeb..84b5b21e 100644 --- a/servers/cloudvideo.py +++ b/servers/cloudvideo.py @@ -1,7 +1,6 @@ # Conector Cloudvideo By Alfa development Group # -------------------------------------------------------- -import re from core import httptools from core import scrapertools from lib import jsunpack diff --git a/servers/datoporn.py b/servers/datoporn.py index 8f2de9f8..ca5076c8 100644 --- a/servers/datoporn.py +++ b/servers/datoporn.py @@ -2,7 +2,6 @@ from core import httptools from core import scrapertools -from lib import jsunpack from platformcode import logger diff --git a/servers/debriders/realdebrid.py b/servers/debriders/realdebrid.py index e947111e..97b516e1 100644 --- a/servers/debriders/realdebrid.py +++ b/servers/debriders/realdebrid.py @@ -3,9 +3,8 @@ import time import urllib -from core import jsontools from core import httptools -from core import scrapertools +from core import jsontools from platformcode import config, logger from platformcode import platformtools diff --git a/servers/decrypters/zcrypt.py b/servers/decrypters/zcrypt.py index 935450b3..c1d93724 100644 --- a/servers/decrypters/zcrypt.py +++ b/servers/decrypters/zcrypt.py @@ -2,10 +2,9 @@ # Ringraziamo errmax e dr-z3r0 import re -from core import httptools, scrapertools, scrapertoolsV2 - -from servers.decrypters import expurl +from core import httptools, scrapertoolsV2 from platformcode import logger +from servers.decrypters import expurl def get_video_url(page_url, premium=False, user="", password="", video_password=""): diff --git a/servers/deltabit.py b/servers/deltabit.py index d3229782..ab20f44c 100644 --- a/servers/deltabit.py +++ b/servers/deltabit.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- +import time import urllib + from core import httptools from core import scrapertools from platformcode import logger -import time def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) diff --git a/servers/estream.py b/servers/estream.py index 6ff87af2..fe5ae6eb 100644 --- a/servers/estream.py +++ b/servers/estream.py @@ -4,6 +4,7 @@ # -------------------------------------------------------- import re + from core import httptools from platformcode import logger diff --git a/servers/fembed.py b/servers/fembed.py index d7b63911..e407a55f 100644 --- a/servers/fembed.py +++ b/servers/fembed.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from core import httptools -from core import scrapertools from core import jsontools from platformcode import logger diff --git a/servers/filebebo.py b/servers/filebebo.py index 4ee3f98a..d32a513d 100644 --- a/servers/filebebo.py +++ b/servers/filebebo.py @@ -4,6 +4,7 @@ # -*- By the Alfa Develop Group -*- import re + from core import httptools from core import scrapertools from platformcode import logger diff --git a/servers/flix555.py b/servers/flix555.py index 23c50f64..50f59973 100644 --- a/servers/flix555.py +++ b/servers/flix555.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -import re, base64, urllib, time +import time +import urllib from core import httptools, scrapertools from lib import jsunpack diff --git a/servers/freakshare.py b/servers/freakshare.py index 239d65a4..92f9f92f 100644 --- a/servers/freakshare.py +++ b/servers/freakshare.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- -import re - from core import httptools -from core import scrapertools from platformcode import logger diff --git a/servers/gigasize.py b/servers/gigasize.py index b21cc610..85faa514 100644 --- a/servers/gigasize.py +++ b/servers/gigasize.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from core import httptools -from core import scrapertools from platformcode import logger diff --git a/servers/googlevideo.py b/servers/googlevideo.py index 9348cc85..3a411e80 100644 --- a/servers/googlevideo.py +++ b/servers/googlevideo.py @@ -3,7 +3,6 @@ import re from core import httptools -from core import scrapertools from platformcode import logger diff --git a/servers/gounlimited.py b/servers/gounlimited.py index ed02a6f5..a03c1a96 100644 --- a/servers/gounlimited.py +++ b/servers/gounlimited.py @@ -4,10 +4,11 @@ # -------------------------------------------------------- import re + from core import httptools -from platformcode import logger from core import scrapertools from lib import jsunpack +from platformcode import logger def test_video_exists(page_url): diff --git a/servers/mp4upload.py b/servers/mp4upload.py index e215a2c6..211e0b13 100644 --- a/servers/mp4upload.py +++ b/servers/mp4upload.py @@ -7,6 +7,7 @@ from core import scrapertools from lib import jsunpack from platformcode import logger + def test_video_exists(page_url): data = httptools.downloadpage(page_url).data if data == "File was deleted" or data == '': diff --git a/servers/mystream.py b/servers/mystream.py index eca5feaf..bfabfbdf 100644 --- a/servers/mystream.py +++ b/servers/mystream.py @@ -4,6 +4,7 @@ # -------------------------------------------------------- import re + from core import httptools from core import scrapertools from lib.aadecode import decode as aadecode diff --git a/servers/netutv.py b/servers/netutv.py index 0e0dec1b..116f5ce0 100644 --- a/servers/netutv.py +++ b/servers/netutv.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- +import random import re -import urllib, random, base64 +import urllib from core import httptools from core import jsontools diff --git a/servers/openload.py b/servers/openload.py index 4fef49a5..4f42c8d4 100644 --- a/servers/openload.py +++ b/servers/openload.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- from core import httptools +from core import jsontools from core import scrapertools from platformcode import config, logger -from core import jsontools + def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) diff --git a/servers/powvideo.py b/servers/powvideo.py index bcaa7f1b..b5a7b1a4 100644 --- a/servers/powvideo.py +++ b/servers/powvideo.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -import re -import base64 -import urllib - from core import httptools from core import scrapertools from lib import jsunpack diff --git a/servers/rutube.py b/servers/rutube.py index b0d23fcc..ea6740b9 100644 --- a/servers/rutube.py +++ b/servers/rutube.py @@ -4,10 +4,10 @@ # -*- By the Alfa Develop Group -*- import re + from core import httptools -from core import scrapertools -from platformcode import logger from core import jsontools +from platformcode import logger def get_source(url): diff --git a/servers/sendvid.py b/servers/sendvid.py index 72100c9b..ed11f426 100644 --- a/servers/sendvid.py +++ b/servers/sendvid.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -from core import httptools from core import scrapertools from platformcode import logger diff --git a/servers/streamcherry.py b/servers/streamcherry.py index 0e26da50..ef5a99f9 100644 --- a/servers/streamcherry.py +++ b/servers/streamcherry.py @@ -3,8 +3,6 @@ # Conector para streamcherry # -------------------------------------------------------- -import re - from core import httptools from core import scrapertools from platformcode import logger diff --git a/servers/streamplay.py b/servers/streamplay.py index 44e5dfbf..f47b3d83 100644 --- a/servers/streamplay.py +++ b/servers/streamplay.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- import re -import base64 -import urllib from core import httptools from core import scrapertools diff --git a/servers/thevideome.py b/servers/thevideome.py index f9b66ebd..dd6a8f75 100644 --- a/servers/thevideome.py +++ b/servers/thevideome.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- import urllib + from core import httptools from core import scrapertools -from platformcode import logger, config +from platformcode import logger def test_video_exists(page_url): diff --git a/servers/thevimeo.py b/servers/thevimeo.py index e6ffa265..e9a22d0c 100644 --- a/servers/thevimeo.py +++ b/servers/thevimeo.py @@ -2,9 +2,8 @@ # -*- Server Thevimeo -*- import re + from core import httptools -from core import scrapertools -from platformcode import logger def get_source(url): diff --git a/servers/tiwikiwi.py b/servers/tiwikiwi.py index 4fd1f918..771ef91e 100644 --- a/servers/tiwikiwi.py +++ b/servers/tiwikiwi.py @@ -2,6 +2,7 @@ # -------------------------------------------------------- import re + from core import httptools from core import scrapertools from lib import jsunpack diff --git a/servers/upvid.py b/servers/upvid.py index 2a13afa8..c0f30f9c 100644 --- a/servers/upvid.py +++ b/servers/upvid.py @@ -3,7 +3,9 @@ # Conector UpVID By Alfa development Group # -------------------------------------------------------- -import re, base64 +import base64 +import re + from core import httptools from core import scrapertools from lib.aadecode import decode as aadecode diff --git a/servers/uqload.py b/servers/uqload.py index fed3bf31..5b352c4f 100644 --- a/servers/uqload.py +++ b/servers/uqload.py @@ -4,6 +4,7 @@ # -------------------------------------------------------- import re + from core import httptools from platformcode import logger diff --git a/servers/verystream.py b/servers/verystream.py index 3e0fd881..92a3510b 100644 --- a/servers/verystream.py +++ b/servers/verystream.py @@ -6,7 +6,7 @@ from core import httptools from core import scrapertools from platformcode import config, logger -from core import jsontools + def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) diff --git a/servers/vevio.py b/servers/vevio.py index 3f74f993..7dab36ce 100644 --- a/servers/vevio.py +++ b/servers/vevio.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- import urllib + from core import httptools from core import scrapertools -from platformcode import logger, config +from platformcode import logger def test_video_exists(page_url): diff --git a/servers/vidcloud.py b/servers/vidcloud.py index dd2e684d..41d5959d 100644 --- a/servers/vidcloud.py +++ b/servers/vidcloud.py @@ -2,8 +2,8 @@ # -------------------------------------------------------- import re + from core import httptools -from core import scrapertools from platformcode import logger diff --git a/servers/videobb.py b/servers/videobb.py index 44794fe9..b36ab915 100644 --- a/servers/videobb.py +++ b/servers/videobb.py @@ -4,8 +4,8 @@ # -------------------------------------------------------- from core import httptools -from core import scrapertools from core import jsontools +from core import scrapertools from platformcode import logger diff --git a/servers/vidoza.py b/servers/vidoza.py index e38641be..3d84a70b 100644 --- a/servers/vidoza.py +++ b/servers/vidoza.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from core import httptools +from core import jsontools from core import scrapertools from platformcode import logger -from core import jsontools def test_video_exists(page_url): diff --git a/servers/vivo.py b/servers/vivo.py index abd77c5c..168813ea 100644 --- a/servers/vivo.py +++ b/servers/vivo.py @@ -1,8 +1,8 @@ # Conector Vivo By Alfa development Group # -------------------------------------------------------- -import re import base64 + from core import httptools from core import scrapertools from platformcode import logger diff --git a/servers/vshare.py b/servers/vshare.py index 06e79ade..fc1ce18d 100644 --- a/servers/vshare.py +++ b/servers/vshare.py @@ -4,8 +4,8 @@ import re from core import httptools from core import scrapertools -from platformcode import logger from lib import jsunpack +from platformcode import logger def test_video_exists(page_url): diff --git a/servers/wstream.py b/servers/wstream.py index a64a354e..15114a7f 100644 --- a/servers/wstream.py +++ b/servers/wstream.py @@ -6,7 +6,7 @@ import re import urllib from core import httptools, scrapertools -from platformcode import logger, config +from platformcode import logger headers = [['User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0']] diff --git a/servers/xstreamcdn.py b/servers/xstreamcdn.py index 12dde5e2..9acf6682 100644 --- a/servers/xstreamcdn.py +++ b/servers/xstreamcdn.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import urllib + from core import httptools -from core import scrapertools from core import jsontools -from platformcode import logger, config +from core import scrapertools +from platformcode import logger def test_video_exists(page_url): diff --git a/servers/youtube.py b/servers/youtube.py index 52610cc2..aa28acbe 100644 --- a/servers/youtube.py +++ b/servers/youtube.py @@ -2,6 +2,7 @@ import re import urllib + import urlparse from core import httptools diff --git a/specials/autoplay.py b/specials/autoplay.py index 80d5d33f..e7d11048 100644 --- a/specials/autoplay.py +++ b/specials/autoplay.py @@ -1,14 +1,13 @@ # -*- coding: utf-8 -*- import os +from time import sleep from core import channeltools from core import jsontools from core.item import Item from platformcode import config, logger from platformcode import platformtools -from platformcode import launcher -from time import sleep from platformcode.config import get_setting __channel__ = "autoplay" diff --git a/specials/autorenumber.py b/specials/autorenumber.py index 0df6a733..43ec65ef 100644 --- a/specials/autorenumber.py +++ b/specials/autorenumber.py @@ -3,18 +3,15 @@ # autorenumber - Rinomina Automaticamente gli Episodi # -------------------------------------------------------------------------------- -import os - try: import xbmcgui except: xbmcgui = None -from platformcode import config from core import jsontools, tvdb -from core.item import Item -from platformcode import platformtools from core.support import typo, log +from platformcode import config +from platformcode import platformtools TAG_TVSHOW_RENUMERATE = "TVSHOW_AUTORENUMBER" TAG_SEASON_EPISODE = "season_episode" diff --git a/specials/community.py b/specials/community.py index 5ab15928..864eec29 100644 --- a/specials/community.py +++ b/specials/community.py @@ -3,20 +3,16 @@ # -*- Created for Alfa-addon -*- # -*- By the Alfa Develop Group -*- -import re -import urllib import os -from core import httptools -from core import scrapertools -from core import servertools -from core import jsontools from channelselector import get_thumb +from core import httptools +from core import jsontools +from core import servertools from core import tmdb from core.item import Item from platformcode import logger, config, platformtools from specials import autoplay -from specials import filtertools list_data = {} @@ -199,7 +195,6 @@ def findvideos(item): def add_channel(item): logger.info() - import xbmc import xbmcgui channel_to_add = {} json_file = '' @@ -245,8 +240,6 @@ def add_channel(item): def remove_channel(item): logger.info() - import xbmc - import xbmcgui path = os.path.join(config.get_data_path(), 'community_channels.json') community_json = open(path, "r") diff --git a/specials/downloads.py b/specials/downloads.py index 46d8a264..2646f199 100644 --- a/specials/downloads.py +++ b/specials/downloads.py @@ -8,7 +8,6 @@ import re import time import unicodedata - from core import filetools, jsontools, scraper, scrapertools, servertools, videolibrarytools, support from core.downloader import Downloader from core.item import Item diff --git a/specials/filtertools.py b/specials/filtertools.py index 0195e728..df4f4c8d 100644 --- a/specials/filtertools.py +++ b/specials/filtertools.py @@ -3,11 +3,11 @@ # filtertools - se encarga de filtrar resultados # ------------------------------------------------------------ +from core import channeltools from core import jsontools from core.item import Item from platformcode import config, logger from platformcode import platformtools -from core import channeltools TAG_TVSHOW_FILTER = "TVSHOW_FILTER" TAG_NAME = "name" diff --git a/specials/help.py b/specials/help.py index 5061b6f5..723a7fa9 100644 --- a/specials/help.py +++ b/specials/help.py @@ -2,9 +2,9 @@ import os +from channelselector import get_thumb from core.item import Item from platformcode import config, logger, platformtools -from channelselector import get_thumb if config.is_xbmc(): diff --git a/specials/kodfavorites.py b/specials/kodfavorites.py index 709a17b7..945cd98d 100644 --- a/specials/kodfavorites.py +++ b/specials/kodfavorites.py @@ -15,14 +15,14 @@ # - Modificar platformtools.py para controlar el menú contextual y añadir "Guardar enlace" en set_context_commands # ------------------------------------------------------------ -import os, re +import os +import re from datetime import datetime +from core import filetools, jsontools from core.item import Item from platformcode import config, logger, platformtools -from core import filetools, jsontools - def fechahora_actual(): return datetime.now().strftime('%Y-%m-%d %H:%M') diff --git a/specials/news.py b/specials/news.py index 453b69c6..dddc19ff 100644 --- a/specials/news.py +++ b/specials/news.py @@ -11,12 +11,11 @@ from threading import Thread from channelselector import get_thumb, auto_filter from core import channeltools +from core import jsontools from core import scrapertools from core.item import Item from platformcode import config, logger from platformcode import platformtools -from core import jsontools - THUMBNAILS = {'0': 'posters', '1': 'banners', '2': 'squares'} diff --git a/specials/search.py b/specials/search.py index e225b042..024642b0 100644 --- a/specials/search.py +++ b/specials/search.py @@ -6,14 +6,16 @@ import re import time from threading import Thread +import xbmcaddon + from channelselector import get_thumb, auto_filter from core import channeltools from core import scrapertools +from core import tmdb from core.item import Item from platformcode import config, logger from platformcode import platformtools -from core import tmdb -import xbmc, xbmcaddon + addon = xbmcaddon.Addon('metadata.themoviedb.org') def_lang = addon.getSetting('language') diff --git a/specials/searchall.py b/specials/searchall.py index 9192ab61..de795570 100644 --- a/specials/searchall.py +++ b/specials/searchall.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -import Queue import datetime import glob import os @@ -11,10 +10,11 @@ import urllib from threading import Thread from unicodedata import normalize +import Queue import xbmc +from lib.fuzzywuzzy import fuzz from core import channeltools, httptools, tmdb, servertools -from lib.fuzzywuzzy import fuzz from platformcode import platformtools try: diff --git a/specials/side_menu.py b/specials/side_menu.py index cac9860a..1de8ef50 100644 --- a/specials/side_menu.py +++ b/specials/side_menu.py @@ -2,13 +2,16 @@ # ------------------------------------------------------------ import os -from core.item import Item + +import xbmc +import xbmcaddon +import xbmcgui + from core import jsontools +from core.item import Item from platformcode import config, logger from platformcode import launcher -import xbmc, xbmcgui, xbmcplugin, xbmcaddon, channelselector -import xbmc, xbmcaddon addon = xbmcaddon.Addon('metadata.themoviedb.org') def_lang = addon.getSetting('language') diff --git a/specials/trailertools.py b/specials/trailertools.py index aa76dad7..9f4ed207 100644 --- a/specials/trailertools.py +++ b/specials/trailertools.py @@ -5,17 +5,17 @@ import re import urllib + import urlparse +import xbmcaddon from core import httptools -from core import jsontools from core import scrapertools from core import servertools from core.item import Item from platformcode import config, logger from platformcode import platformtools -import xbmc, xbmcaddon addon = xbmcaddon.Addon('metadata.themoviedb.org') def_lang = addon.getSetting('language') diff --git a/specials/tvmoviedb.py b/specials/tvmoviedb.py index fdd9c084..ad69b8b8 100644 --- a/specials/tvmoviedb.py +++ b/specials/tvmoviedb.py @@ -4,18 +4,19 @@ import re import urllib from base64 import b64decode as bdec +import xbmcaddon + +from channelselector import get_thumb from core import filetools from core import httptools from core import jsontools from core import scrapertools -from core.item import Item -from core.tmdb import Tmdb from core import trakt_tools +from core.item import Item +from core.support import typo, thumb +from core.tmdb import Tmdb from platformcode import config, logger from platformcode import platformtools -import xbmc, xbmcaddon -from channelselector import get_thumb -from core.support import typo, thumb addon = xbmcaddon.Addon('metadata.themoviedb.org') def_lang = addon.getSetting('language') diff --git a/specials/url.py b/specials/url.py index 73cc8e1f..c1210f48 100644 --- a/specials/url.py +++ b/specials/url.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from core import httptools -from core import scrapertools from core import servertools from core.item import Item from platformcode import config, logger diff --git a/specials/videolibrary.py b/specials/videolibrary.py index aef75da2..b8876ee1 100644 --- a/specials/videolibrary.py +++ b/specials/videolibrary.py @@ -1,15 +1,16 @@ # -*- coding: utf-8 -*- -import os, traceback +import os +import traceback from channelselector import get_thumb from core import filetools from core import scrapertools from core import videolibrarytools from core.item import Item +from lib import generictools from platformcode import config, logger from platformcode import platformtools -from lib import generictools def mainlist(item): From adc3b9efd5a7a5dfbe574b3c51c03c3c8f728aaf Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Sat, 25 May 2019 10:36:15 +0200 Subject: [PATCH 06/12] Fix for News settings with auto language --- specials/news.py | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/specials/news.py b/specials/news.py index dddc19ff..179fb422 100644 --- a/specials/news.py +++ b/specials/news.py @@ -44,7 +44,9 @@ def mainlist(item): itemlist = [] list_canales, any_active = get_channels_list() - channel_language = config.get_setting("channel_language", default="all") + channel_language = config.get_setting("channel_language", default="auto") + if channel_language == 'auto': + channel_language = auto_filter() #if list_canales['peliculas']: thumbnail = get_thumb("channels_movie.png") @@ -88,20 +90,6 @@ def mainlist(item): set_category_context(new_item) itemlist.append(new_item) - if channel_language == "all" or channel_language == "esp": - # if list_canales['Castellano']: - thumbnail = get_thumb("channels_spanish.png") - new_item = Item(channel=item.channel, action="novedades", extra="castellano", title=config.get_localized_string(70014), - thumbnail=thumbnail) - set_category_context(new_item) - itemlist.append(new_item) - - # if list_canales['Latino']: - thumbnail = get_thumb("channels_latino.png") - new_item = Item(channel=item.channel, action="novedades", extra="latino", title=config.get_localized_string(59976), - thumbnail=thumbnail) - set_category_context(new_item) - itemlist.append(new_item) if channel_language == "all": # if list_canales['Italiano']: thumbnail = get_thumb("channels_italian.png") @@ -586,7 +574,10 @@ def settings(item): def setting_channel(item): channels_path = os.path.join(config.get_runtime_path(), "channels", '*.json') - channel_language = config.get_setting("channel_language", default="all") + channel_language = config.get_setting("channel_language", default="auto") + if channel_language == 'auto': + channel_language = auto_filter() + list_controls = [] for infile in sorted(glob.glob(channels_path)): From 84dae6f6f442290ea99779de32f472bbabd30cbf Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Sat, 25 May 2019 16:00:13 +0200 Subject: [PATCH 07/12] Check links in support --- channels/altadefinizione01.json | 4 +-- channels/altadefinizione01.py | 8 +++--- channels/altadefinizione01_club.json | 4 +-- channels/altadefinizione01_club.py | 8 +++--- channels/altadefinizione01_link.json | 4 +-- channels/altadefinizione01_link.py | 8 +++--- channels/altadefinizioneclick.json | 4 +-- channels/altadefinizioneclick.py | 8 +++--- channels/altadefinizionehd.json | 4 +-- channels/animeleggendari.json | 4 +-- channels/animeleggendari.py | 8 +++--- channels/animesaturn.json | 4 +-- channels/animesaturn.py | 8 +++--- channels/animespace.json | 2 +- channels/animespace.py | 8 +++--- channels/animeworld.json | 4 +-- channels/animeworld.py | 8 +++--- channels/casacinema.json | 4 +-- channels/casacinemaInfo.py | 8 +++--- channels/cineblog01.json | 4 +-- channels/cineblog01.py | 8 +++--- channels/cinemalibero.json | 4 +-- channels/cinemalibero.py | 8 +++--- channels/cinemastreaming.json | 4 +-- channels/eurostreaming.json | 4 +-- channels/eurostreaming.py | 4 +-- channels/fastsubita.json | 4 +-- channels/fastsubita.py | 8 +++--- channels/filmigratis.json | 4 +-- channels/filmigratis.py | 4 +-- channels/filmsenzalimiti.json | 4 +-- channels/filmsenzalimiti.py | 8 +++--- channels/filmsenzalimiticc.json | 4 +-- channels/filmsenzalimiticc.py | 8 +++--- channels/ilgeniodellostreaming.json | 4 +-- channels/ilgeniodellostreaming.py | 8 +++--- channels/italiafilmhd.json | 4 +-- channels/italiafilmhd.py | 8 +++--- channels/mondoserietv.json | 4 +-- channels/mondoserietv.py | 8 +++--- channels/piratestreaming.py | 8 +++--- channels/seriehd.json | 4 +-- channels/seriehd.py | 8 +++--- channels/serietvsubita.json | 4 +-- channels/serietvsubita.py | 8 +++--- channels/serietvu.json | 4 +-- channels/serietvu.py | 12 ++++----- channels/tantifilm.json | 4 +-- channels/toonitalia.json | 4 +-- core/channeltools.py | 6 ++--- core/support.py | 40 +++++++++++++++------------- 51 files changed, 164 insertions(+), 164 deletions(-) diff --git a/channels/altadefinizione01.json b/channels/altadefinizione01.json index 0596d45d..ed51566e 100644 --- a/channels/altadefinizione01.json +++ b/channels/altadefinizione01.json @@ -33,7 +33,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero di link da verificare", "default": 1, diff --git a/channels/altadefinizione01.py b/channels/altadefinizione01.py index d97eefd8..8fdd4a12 100644 --- a/channels/altadefinizione01.py +++ b/channels/altadefinizione01.py @@ -16,8 +16,8 @@ list_language = IDIOMAS.values() list_servers = ['openload', 'streamango', 'rapidvideo', 'streamcherry', 'megadrive'] list_quality = ['default'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'altadefinizione01') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'altadefinizione01') +checklinks = config.get_setting('checklinks', 'altadefinizione01') +checklinks_number = config.get_setting('checklinks_number', 'altadefinizione01') headers = [['Referer', host]] blacklist_categorie = ['Altadefinizione01', 'Altadefinizione.to'] @@ -147,8 +147,8 @@ def findvideos(item): itemlist = support.server(item, headers=headers) # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools # itemlist = filtertools.get_links(itemlist, item, list_language) diff --git a/channels/altadefinizione01_club.json b/channels/altadefinizione01_club.json index 19890b5b..7dc55b71 100644 --- a/channels/altadefinizione01_club.json +++ b/channels/altadefinizione01_club.json @@ -44,7 +44,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": true, @@ -52,7 +52,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/altadefinizione01_club.py b/channels/altadefinizione01_club.py index 4f0ebf42..3185eaa4 100644 --- a/channels/altadefinizione01_club.py +++ b/channels/altadefinizione01_club.py @@ -19,8 +19,8 @@ host = "https://www.altadefinizione01.vision/" #aggiornato al 30-04-209 # ======== Funzionalità ============================= -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', __channel__) -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', __channel__) +checklinks = config.get_setting('checklinks', __channel__) +checklinks_number = config.get_setting('checklinks_number', __channel__) headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], ['Referer', host]] @@ -216,8 +216,8 @@ def findvideos(item): logger.error("data doesn't contain expected URL") # Controlla se i link sono validi - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools itemlist = filtertools.get_links(itemlist, item, list_language) diff --git a/channels/altadefinizione01_link.json b/channels/altadefinizione01_link.json index e56d2b1a..47cb3ac3 100644 --- a/channels/altadefinizione01_link.json +++ b/channels/altadefinizione01_link.json @@ -46,7 +46,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": true, @@ -54,7 +54,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/altadefinizione01_link.py b/channels/altadefinizione01_link.py index 22ad517d..7e690035 100644 --- a/channels/altadefinizione01_link.py +++ b/channels/altadefinizione01_link.py @@ -22,8 +22,8 @@ host = "https://altadefinizione01.voto/" #aggiornato al 3 maggio 2019 # ======== def per utility INIZIO ============================ -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', __channel__) -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', __channel__) +checklinks = config.get_setting('checklinks', __channel__) +checklinks_number = config.get_setting('checklinks_number', __channel__) headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], ['Referer', host]]#,['Accept-Language','it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3']] @@ -176,8 +176,8 @@ def findvideos(item): logger.error("data doesn't contain expected URL") # Controlla se i link sono validi - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools itemlist = filtertools.get_links(itemlist, item, list_language) diff --git a/channels/altadefinizioneclick.json b/channels/altadefinizioneclick.json index 05339015..bacbb3c0 100644 --- a/channels/altadefinizioneclick.json +++ b/channels/altadefinizioneclick.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/altadefinizioneclick.py b/channels/altadefinizioneclick.py index 3037f154..b4f3858a 100644 --- a/channels/altadefinizioneclick.py +++ b/channels/altadefinizioneclick.py @@ -17,8 +17,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'openload', 'streamango', "vidoza", "thevideo", "okru", 'youtube'] list_quality = ['1080p'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'altadefinizioneclick') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'altadefinizioneclick') +checklinks = config.get_setting('checklinks', 'altadefinizioneclick') +checklinks_number = config.get_setting('checklinks_number', 'altadefinizioneclick') headers = [['Referer', host]] @@ -98,8 +98,8 @@ def findvideos(item): itemlist = support.hdpass_get_servers(item) - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # itemlist = filtertools.get_links(itemlist, item, list_language) diff --git a/channels/altadefinizionehd.json b/channels/altadefinizionehd.json index b410f36c..3efdad33 100644 --- a/channels/altadefinizionehd.json +++ b/channels/altadefinizionehd.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/animeleggendari.json b/channels/animeleggendari.json index 2306345e..ac5a6b52 100644 --- a/channels/animeleggendari.json +++ b/channels/animeleggendari.json @@ -33,7 +33,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/animeleggendari.py b/channels/animeleggendari.py index 285f3393..8ac1b391 100644 --- a/channels/animeleggendari.py +++ b/channels/animeleggendari.py @@ -20,8 +20,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'openload', 'streamango'] list_quality = ['default'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'animeleggendari') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'animeleggendari') +checklinks = config.get_setting('checklinks', 'animeleggendari') +checklinks_number = config.get_setting('checklinks_number', 'animeleggendari') def mainlist(item): log() @@ -176,8 +176,8 @@ def findvideos(item): itemlist = support.server(item,data) - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # itemlist = filtertools.get_links(itemlist, item, list_language) autoplay.start(itemlist, item) diff --git a/channels/animesaturn.json b/channels/animesaturn.json index 627d4fe0..3bd40f70 100644 --- a/channels/animesaturn.json +++ b/channels/animesaturn.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/animesaturn.py b/channels/animesaturn.py index 7f88cef5..c48377c8 100644 --- a/channels/animesaturn.py +++ b/channels/animesaturn.py @@ -22,8 +22,8 @@ list_language = IDIOMAS.values() list_servers = ['openload','fembed'] list_quality = ['default'] -# __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', __channel__) -# __comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', __channel__) +# checklinks = config.get_setting('checklinks', __channel__) +# checklinks_number = config.get_setting('checklinks_number', __channel__) def mainlist(item): @@ -263,8 +263,8 @@ def findvideos(item): # Controlla se i link sono validi - # if __comprueba_enlaces__: - # itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + # if checklinks: + # itemlist = servertools.check_list_links(itemlist, checklinks_number) # # autoplay.start(itemlist, item) diff --git a/channels/animespace.json b/channels/animespace.json index fc66d0bd..4a7f4084 100644 --- a/channels/animespace.json +++ b/channels/animespace.json @@ -32,7 +32,7 @@ ] }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Número de enlaces a verificar", "default": 1, diff --git a/channels/animespace.py b/channels/animespace.py index 7634a5fd..aa910a86 100644 --- a/channels/animespace.py +++ b/channels/animespace.py @@ -17,8 +17,8 @@ from specials import renumbertools host = "https://animespace.tv/" -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'animespace') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'animespace') +checklinks = config.get_setting('checklinks', 'animespace') +checklinks_number = config.get_setting('checklinks_number', 'animespace') IDIOMAS = {'VOSE': 'VOSE'} list_language = IDIOMAS.values() @@ -240,8 +240,8 @@ def findvideos(item): itemlist = servertools.get_servers_itemlist(itemlist, lambda x: x.title % x.server.capitalize()) - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools diff --git a/channels/animeworld.json b/channels/animeworld.json index 3293a0bb..dfcee138 100644 --- a/channels/animeworld.json +++ b/channels/animeworld.json @@ -32,7 +32,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -40,7 +40,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/animeworld.py b/channels/animeworld.py index ff56efef..4a1586be 100644 --- a/channels/animeworld.py +++ b/channels/animeworld.py @@ -20,8 +20,8 @@ list_language = IDIOMAS.values() list_servers = ['diretto'] list_quality = [] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'animeworld') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'animeworld') +checklinks = config.get_setting('checklinks', 'animeworld') +checklinks_number = config.get_setting('checklinks_number', 'animeworld') def mainlist(item): @@ -398,8 +398,8 @@ def findvideos(item): # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools diff --git a/channels/casacinema.json b/channels/casacinema.json index dc407caf..c964ad15 100644 --- a/channels/casacinema.json +++ b/channels/casacinema.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/casacinemaInfo.py b/channels/casacinemaInfo.py index a371b392..c9c969ed 100644 --- a/channels/casacinemaInfo.py +++ b/channels/casacinemaInfo.py @@ -15,8 +15,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'openload', 'wstream', 'speedvideo'] list_quality = ['1080p', '720', '480p', '360p'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'casacinema') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'casacinema') +checklinks = config.get_setting('checklinks', 'casacinema') +checklinks_number = config.get_setting('checklinks_number', 'casacinema') def mainlist(item): @@ -142,8 +142,8 @@ def findvideos(item): # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para AutoPlay diff --git a/channels/cineblog01.json b/channels/cineblog01.json index c4b1c672..b2110524 100644 --- a/channels/cineblog01.json +++ b/channels/cineblog01.json @@ -33,7 +33,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero di link da verificare", "default": 1, diff --git a/channels/cineblog01.py b/channels/cineblog01.py index 8000c555..b6859b2d 100644 --- a/channels/cineblog01.py +++ b/channels/cineblog01.py @@ -27,8 +27,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'openload', 'streamango', 'wstream'] list_quality = ['HD', 'default'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'cineblog01') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'cineblog01') +checklinks = config.get_setting('checklinks', 'cineblog01') +checklinks_number = config.get_setting('checklinks_number', 'cineblog01') # esclusione degli articoli 'di servizio' blacklist = ['BENVENUTI', 'Richieste Serie TV', 'CB01.UNO ▶ TROVA L’INDIRIZZO UFFICIALE ', @@ -280,8 +280,8 @@ def findvideos(item): # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools diff --git a/channels/cinemalibero.json b/channels/cinemalibero.json index d55e578d..18dfce52 100644 --- a/channels/cinemalibero.json +++ b/channels/cinemalibero.json @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -57,7 +57,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/cinemalibero.py b/channels/cinemalibero.py index 1b0c0670..2709560f 100644 --- a/channels/cinemalibero.py +++ b/channels/cinemalibero.py @@ -19,8 +19,8 @@ list_servers = ['akstream', 'wstream', 'openload', 'streamango'] list_quality = ['default'] # Necessario per Verifica Link -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'cinemalibero') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'cinemalibero') +checklinks = config.get_setting('checklinks', 'cinemalibero') +checklinks_number = config.get_setting('checklinks_number', 'cinemalibero') host = 'https://www.cinemalibero.icu' @@ -219,8 +219,8 @@ def findvideos(item): # Questa def. deve sempre essere nominata findvideos action='add_pelicula_to_library', extra='findservers', contentTitle=item.contentTitle)) # Necessario per filtrare i Link - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Necessario per FilterTools # itemlist = filtertools.get_links(itemlist, item, list_language) diff --git a/channels/cinemastreaming.json b/channels/cinemastreaming.json index d229b77b..261f294b 100644 --- a/channels/cinemastreaming.json +++ b/channels/cinemastreaming.json @@ -42,7 +42,7 @@ }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -50,7 +50,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/eurostreaming.json b/channels/eurostreaming.json index e4641e02..07ad271e 100644 --- a/channels/eurostreaming.json +++ b/channels/eurostreaming.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": true, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/eurostreaming.py b/channels/eurostreaming.py index d2687933..3197c73a 100644 --- a/channels/eurostreaming.py +++ b/channels/eurostreaming.py @@ -30,8 +30,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'wstream', 'speedvideo', 'flashx', 'nowvideo', 'streamango', 'deltabit', 'openload'] list_quality = ['default'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'eurostreaming') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'eurostreaming') +checklinks = config.get_setting('checklinks', 'eurostreaming') +checklinks_number = config.get_setting('checklinks_number', 'eurostreaming') def mainlist(item): support.log() diff --git a/channels/fastsubita.json b/channels/fastsubita.json index a18c5eeb..dead1163 100644 --- a/channels/fastsubita.json +++ b/channels/fastsubita.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/fastsubita.py b/channels/fastsubita.py index f2bba2a5..9318a714 100644 --- a/channels/fastsubita.py +++ b/channels/fastsubita.py @@ -18,8 +18,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'openload', 'speedvideo', 'wstream', 'flashx', 'vidoza', 'vidtome'] list_quality = ['default'] -# __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'fastsubita') -# __comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'fastsubita') +# checklinks = config.get_setting('checklinks', 'fastsubita') +# checklinks_number = config.get_setting('checklinks_number', 'fastsubita') headers = [ ['Host', 'fastsubita.com'], @@ -277,8 +277,8 @@ def findvideos(item): # # # Requerido para Filtrar enlaces # - # if __comprueba_enlaces__: - # itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + # if checklinks: + # itemlist = servertools.check_list_links(itemlist, checklinks_number) # # # Requerido para FilterTools # diff --git a/channels/filmigratis.json b/channels/filmigratis.json index 53f6e70f..b6f56db2 100644 --- a/channels/filmigratis.json +++ b/channels/filmigratis.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/filmigratis.py b/channels/filmigratis.py index 1a1a28b3..a7bc6a09 100644 --- a/channels/filmigratis.py +++ b/channels/filmigratis.py @@ -18,8 +18,8 @@ list_language = IDIOMAS.values() list_servers = ['openload', 'streamango', 'vidoza', 'okru'] list_quality = ['1080p', '720p', '480p', '360'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'filmigratis') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'filmigratis') +checklinks = config.get_setting('checklinks', 'filmigratis') +checklinks_number = config.get_setting('checklinks_number', 'filmigratis') headers = [['Referer', host]] diff --git a/channels/filmsenzalimiti.json b/channels/filmsenzalimiti.json index 698e2f2a..db57b0c2 100644 --- a/channels/filmsenzalimiti.json +++ b/channels/filmsenzalimiti.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/filmsenzalimiti.py b/channels/filmsenzalimiti.py index de62f0c4..5723a1cd 100644 --- a/channels/filmsenzalimiti.py +++ b/channels/filmsenzalimiti.py @@ -19,8 +19,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'openload', 'streamango', 'vidoza', 'okru'] list_quality = ['1080p', '720p', '480p', '360'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'filmsenzalimiti') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'filmsenzalimiti') +checklinks = config.get_setting('checklinks', 'filmsenzalimiti') +checklinks_number = config.get_setting('checklinks_number', 'filmsenzalimiti') headers = [['Referer', host]] @@ -174,8 +174,8 @@ def findvideos(item): action="add_pelicula_to_library", extra="findservers", contentTitle=item.contentTitle)) #Necessario per filtrare i Link - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Necessario per FilterTools # itemlist = filtertools.get_links(itemlist, item, list_language) diff --git a/channels/filmsenzalimiticc.json b/channels/filmsenzalimiticc.json index 2bbe1ec3..81f21615 100644 --- a/channels/filmsenzalimiticc.json +++ b/channels/filmsenzalimiticc.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/filmsenzalimiticc.py b/channels/filmsenzalimiticc.py index 7db3b9b5..e4029d77 100644 --- a/channels/filmsenzalimiticc.py +++ b/channels/filmsenzalimiticc.py @@ -22,8 +22,8 @@ list_servers = ['verystream', 'openload', 'vidlox', 'youtube'] list_quality = ['default'] # Necessario per Verifica Link -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'filmsenzalimiticc') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'filmsenzalimiticc') +checklinks = config.get_setting('checklinks', 'filmsenzalimiticc') +checklinks_number = config.get_setting('checklinks_number', 'filmsenzalimiticc') host = 'https://filmsenzalimiti.pw' @@ -239,8 +239,8 @@ def findvideos(item): # Questa def. deve sempre essere nominata findvideos action='add_pelicula_to_library', extra='findservers', contentTitle=item.contentTitle)) # Necessario per filtrare i Link - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Necessario per FilterTools # itemlist = filtertools.get_links(itemlist, item, list_language) diff --git a/channels/ilgeniodellostreaming.json b/channels/ilgeniodellostreaming.json index 1d1afbcc..d9a6cbaf 100644 --- a/channels/ilgeniodellostreaming.json +++ b/channels/ilgeniodellostreaming.json @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -57,7 +57,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/ilgeniodellostreaming.py b/channels/ilgeniodellostreaming.py index a88dafe4..92b4aff1 100644 --- a/channels/ilgeniodellostreaming.py +++ b/channels/ilgeniodellostreaming.py @@ -22,8 +22,8 @@ list_servers = ['verystream', 'openload', 'streamango', 'youtube'] list_quality = ['default'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'ilgeniodellostreaming') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'ilgeniodellostreaming') +checklinks = config.get_setting('checklinks', 'ilgeniodellostreaming') +checklinks_number = config.get_setting('checklinks_number', 'ilgeniodellostreaming') headers = [['Referer', host]] @@ -372,8 +372,8 @@ def findvideos(item): # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools diff --git a/channels/italiafilmhd.json b/channels/italiafilmhd.json index cfae73d3..f64aa115 100644 --- a/channels/italiafilmhd.json +++ b/channels/italiafilmhd.json @@ -34,7 +34,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -42,7 +42,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero di link da verificare", "default": 1, diff --git a/channels/italiafilmhd.py b/channels/italiafilmhd.py index 9ab4a0ab..0aeeb189 100644 --- a/channels/italiafilmhd.py +++ b/channels/italiafilmhd.py @@ -17,8 +17,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'openload', 'youtube'] list_quality = ['default'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'italiafilmhd') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'italiafilmhd') +checklinks = config.get_setting('checklinks', 'italiafilmhd') +checklinks_number = config.get_setting('checklinks_number', 'italiafilmhd') host = "https://italiafilm.network" @@ -296,8 +296,8 @@ def findvideos(item): # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools diff --git a/channels/mondoserietv.json b/channels/mondoserietv.json index 74a150ed..cae7032d 100644 --- a/channels/mondoserietv.json +++ b/channels/mondoserietv.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/mondoserietv.py b/channels/mondoserietv.py index fc8e1498..7ca2e916 100644 --- a/channels/mondoserietv.py +++ b/channels/mondoserietv.py @@ -19,8 +19,8 @@ list_language = IDIOMAS.values() list_servers = ['akstream'] list_quality = ['default'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'mondoserietv') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'mondoserietv') +checklinks = config.get_setting('checklinks', 'mondoserietv') +checklinks_number = config.get_setting('checklinks_number', 'mondoserietv') headers = {'Referer': host} @@ -308,8 +308,8 @@ def findvideos(item): # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools diff --git a/channels/piratestreaming.py b/channels/piratestreaming.py index a3598e2a..f00b0b9d 100644 --- a/channels/piratestreaming.py +++ b/channels/piratestreaming.py @@ -24,8 +24,8 @@ list_servers = ['speedvideo', 'openload', 'youtube'] list_quality = ['default'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'piratestreaming') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'piratestreaming') +checklinks = config.get_setting('checklinks', 'piratestreaming') +checklinks_number = config.get_setting('checklinks_number', 'piratestreaming') headers = [['Referer', host]] @@ -243,8 +243,8 @@ def findvideos(item): # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools diff --git a/channels/seriehd.json b/channels/seriehd.json index e2a505ec..2d5a19b2 100644 --- a/channels/seriehd.json +++ b/channels/seriehd.json @@ -33,7 +33,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/seriehd.py b/channels/seriehd.py index 7a1e5974..5059cf5e 100644 --- a/channels/seriehd.py +++ b/channels/seriehd.py @@ -18,8 +18,8 @@ list_language = IDIOMAS.values() list_servers = ['verystream', 'openload', 'streamango', 'thevideome'] list_quality = ['1080p', '720p', '480p', '360'] -__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'seriehd') -__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'seriehd') +checklinks = config.get_setting('checklinks', 'seriehd') +checklinks_number = config.get_setting('checklinks_number', 'seriehd') headers = [['Referer', host]] @@ -137,8 +137,8 @@ def findvideos(item): # Requerido para Filtrar enlaces - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + if checklinks: + itemlist = servertools.check_list_links(itemlist, checklinks_number) # Requerido para FilterTools diff --git a/channels/serietvsubita.json b/channels/serietvsubita.json index 7a4eafad..2c2daf83 100644 --- a/channels/serietvsubita.json +++ b/channels/serietvsubita.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/serietvsubita.py b/channels/serietvsubita.py index 0e587acc..1b43e617 100644 --- a/channels/serietvsubita.py +++ b/channels/serietvsubita.py @@ -21,8 +21,8 @@ list_language = IDIOMAS.values() list_servers = ['gounlimited','verystream','streamango','openload'] list_quality = ['default'] -# __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', __channel__) -# __comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', __channel__) +# checklinks = config.get_setting('checklinks', __channel__) +# checklinks_number = config.get_setting('checklinks_number', __channel__) def mainlist(item): @@ -264,8 +264,8 @@ def findvideos(item): # Controlla se i link sono validi - # if __comprueba_enlaces__: - # itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + # if checklinks: + # itemlist = servertools.check_list_links(itemlist, checklinks_number) # # autoplay.start(itemlist, item) diff --git a/channels/serietvu.json b/channels/serietvu.json index 16d2e1fe..a7612fde 100644 --- a/channels/serietvu.json +++ b/channels/serietvu.json @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -49,7 +49,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero de link da verificare", "default": 1, diff --git a/channels/serietvu.py b/channels/serietvu.py index 80fb13c9..b25a7bec 100644 --- a/channels/serietvu.py +++ b/channels/serietvu.py @@ -20,8 +20,8 @@ list_language = IDIOMAS.values() list_servers = ['speedvideo'] list_quality = ['default'] -# __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', __channel__) -# __comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', __channel__) +# checklinks = config.get_setting('checklinks', __channel__) +# checklinks_number = config.get_setting('checklinks_number', __channel__) @@ -148,8 +148,8 @@ def findvideos(item): # itemlist = filtertools.get_links(itemlist, item, list_language) # Controlla se i link sono validi - # if __comprueba_enlaces__: - # itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + # if checklinks: + # itemlist = servertools.check_list_links(itemlist, checklinks_number) # # autoplay.start(itemlist, item) @@ -177,8 +177,8 @@ def findepisodevideo(item): # itemlist = filtertools.get_links(itemlist, item, list_language) # Controlla se i link sono validi - # if __comprueba_enlaces__: - # itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) + # if checklinks: + # itemlist = servertools.check_list_links(itemlist, checklinks_number) # # autoplay.start(itemlist, item) diff --git a/channels/tantifilm.json b/channels/tantifilm.json index e181261f..ceadbfe6 100644 --- a/channels/tantifilm.json +++ b/channels/tantifilm.json @@ -34,7 +34,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -42,7 +42,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero di link da verificare", "default": 1, diff --git a/channels/toonitalia.json b/channels/toonitalia.json index 23a3892b..1ba2b01d 100644 --- a/channels/toonitalia.json +++ b/channels/toonitalia.json @@ -33,7 +33,7 @@ "visible": true }, { - "id": "comprueba_enlaces", + "id": "checklinks", "type": "bool", "label": "Verifica se i link esistono", "default": false, @@ -41,7 +41,7 @@ "visible": true }, { - "id": "comprueba_enlaces_num", + "id": "checklinks_number", "type": "list", "label": "Numero di link da verificare", "default": 1, diff --git a/core/channeltools.py b/core/channeltools.py index d17fc86e..af001487 100644 --- a/core/channeltools.py +++ b/core/channeltools.py @@ -42,8 +42,7 @@ def get_channel_parameters(channel_name): channel_parameters["language"] = channel_parameters.get("language", ["all"]) channel_parameters["adult"] = channel_parameters.get("adult", False) channel_parameters["active"] = channel_parameters.get("active", False) - channel_parameters["include_in_global_search"] = channel_parameters.get("include_in_global_search", - False) + channel_parameters["include_in_global_search"] = channel_parameters.get("include_in_global_search", False) channel_parameters["categories"] = channel_parameters.get("categories", list()) channel_parameters["thumbnail"] = channel_parameters.get("thumbnail", "") @@ -87,8 +86,7 @@ def get_channel_parameters(channel_name): channel_parameters["include_in_global_search"] = True elif s['id'] == "filter_languages": channel_parameters["filter_languages"] = s.get('lvalues',[]) - elif not s['id'].startswith("include_in_") and \ - (s.get('enabled', False) or s.get('visible', False)): + elif s['id'].startswith("include_in_"): channel_parameters["has_settings"] = True del channel_parameters['settings'] diff --git a/core/support.py b/core/support.py index 9da6dacb..0da326ec 100644 --- a/core/support.py +++ b/core/support.py @@ -61,15 +61,7 @@ def hdpass_get_servers(item): url=url_decode(media_url))) log("video -> ", res_video) - __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', item.channel) - __comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', item.channel) - - if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) - if xbmcaddon.Addon('plugin.video.kod').getSetting('checklinks'): - itemlist = servertools.check_list_links(itemlist, xbmcaddon.Addon('plugin.video.kod').getSetting('checklinks_number')) - - return itemlist + return controls(itemlist, item, AutoPlay, CheckLinks) def url_decode(url_enc): @@ -501,11 +493,6 @@ def nextPage(itemlist, item, data, patron, function_level=1): return itemlist def server(item, data='', headers='', AutoPlay=True, CheckLinks=True): - - __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', item.channel) - log(__comprueba_enlaces__ ) - __comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', item.channel) - log(__comprueba_enlaces_num__ ) if not data: data = httptools.downloadpage(item.url, headers=headers).data @@ -520,14 +507,29 @@ def server(item, data='', headers='', AutoPlay=True, CheckLinks=True): videoitem.channel = item.channel videoitem.contentType = item.contentType - if __comprueba_enlaces__ and CheckLinks: - itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) - if xbmcaddon.Addon('plugin.video.kod').getSetting('checklinks'): - itemlist = servertools.check_list_links(itemlist, xbmcaddon.Addon('plugin.video.kod').getSetting('checklinks_number')) + return controls(itemlist, item, AutoPlay, CheckLinks) + +def controls(itemlist, item, AutoPlay=True, CheckLinks=True): + from core import jsontools + from platformcode.config import get_setting + CL = get_setting('checklinks') or get_setting('checklinks', item.channel) + autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') + channel_node = autoplay_node.get(item.channel, {}) + settings_node = channel_node.get('settings', {}) + AP = get_setting('autoplay') or settings_node['active'] + if CL and not AP: + if get_setting('checklinks', item.channel): + checklinks = get_setting('checklinks', item.channel) + else: + checklinks = get_setting('checklinks') + if get_setting('checklinks_number', item.channel): + checklinks_number = get_setting('checklinks_number', item.channel) + else: + checklinks_number = get_setting('checklinks_number') + itemlist = servertools.check_list_links(itemlist, checklinks_number) if AutoPlay == True: autoplay.start(itemlist, item) - return itemlist From 459dc13a34fabab59b2980e61725d5b6a86a2210 Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Sat, 25 May 2019 16:10:11 +0200 Subject: [PATCH 08/12] Little fix :p --- core/support.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/support.py b/core/support.py index 0da326ec..800a880a 100644 --- a/core/support.py +++ b/core/support.py @@ -61,7 +61,7 @@ def hdpass_get_servers(item): url=url_decode(media_url))) log("video -> ", res_video) - return controls(itemlist, item, AutoPlay, CheckLinks) + return controls(itemlist, item, AutoPlay=True, CheckLinks=True) def url_decode(url_enc): From b2704088fa88520b846d91f8917c75c1a1c0c419 Mon Sep 17 00:00:00 2001 From: 4l3x87 <50104109+4l3x87@users.noreply.github.com> Date: Sat, 25 May 2019 16:32:22 +0200 Subject: [PATCH 09/12] Fix AnimeSaturn + varie (#36) * Refactor channel Fastsubita e fix channel Serie tv sub ita * Channel Fastsubita fix serie tv list * Channel Fastsubita fix serie tv list * Channel Animesaturn fix and activated * Channel Fastsubita fix remove duplicate episode * Fix channel AnimeSaturn Fix support.nextPage * Fix support.nextPage * Fix Cb01 newest * Channel SerieHD banner & thumb Improvements channel SerieTVU + banner & thumb Improvements channel Serie Tv Sub Ita + banner & thumb Improvements channel Fastsubita + banner & thumb Add news sub ita in title if contentSerieName is valid Fix tmdb overlap serch episode info Fix get_season_and_episode for tv show like 9-1-1 * Fix get_season_and_episode for tv show like 9-1-1 * Channel Anime Saturn, change search and migrate to scrapertoolsV2 --- channels/animesaturn.py | 176 +++++++++--------- channels/cineblog01.py | 1 + channels/fastsubita.json | 4 +- channels/fastsubita.py | 20 +- channels/seriehd.json | 4 +- channels/serietvsubita.json | 4 +- channels/serietvsubita.py | 14 +- channels/serietvu.json | 4 +- channels/serietvu.py | 75 +++++++- core/scrapertools.py | 6 +- core/tmdb.py | 18 +- .../media/channels/banner/fastsubita.png | Bin 0 -> 115349 bytes resources/media/channels/banner/seriehd.png | Bin 0 -> 12960 bytes .../media/channels/banner/serietvsubita.png | Bin 0 -> 8182 bytes resources/media/channels/banner/serietvu.png | Bin 0 -> 8291 bytes resources/media/channels/thumb/fastsubita.png | Bin 0 -> 30662 bytes resources/media/channels/thumb/seriehd.png | Bin 0 -> 9301 bytes .../media/channels/thumb/serietvsubita.png | Bin 0 -> 4227 bytes resources/media/channels/thumb/serietvu.png | Bin 0 -> 6077 bytes specials/news.py | 4 + 20 files changed, 207 insertions(+), 123 deletions(-) create mode 100644 resources/media/channels/banner/fastsubita.png create mode 100644 resources/media/channels/banner/seriehd.png create mode 100644 resources/media/channels/banner/serietvsubita.png create mode 100644 resources/media/channels/banner/serietvu.png create mode 100644 resources/media/channels/thumb/fastsubita.png create mode 100644 resources/media/channels/thumb/seriehd.png create mode 100644 resources/media/channels/thumb/serietvsubita.png create mode 100644 resources/media/channels/thumb/serietvu.png diff --git a/channels/animesaturn.py b/channels/animesaturn.py index c48377c8..560ecedc 100644 --- a/channels/animesaturn.py +++ b/channels/animesaturn.py @@ -8,10 +8,10 @@ import re import urlparse import channelselector -from core import httptools, tmdb, scrapertools, support +from core import httptools, tmdb, support, scrapertools, jsontools from core.item import Item from platformcode import logger, config -from specials import autoplay +from specials import autoplay, autorenumber __channel__ = "animesaturn" host = config.get_setting("channel_host", __channel__) @@ -22,45 +22,14 @@ list_language = IDIOMAS.values() list_servers = ['openload','fembed'] list_quality = ['default'] -# checklinks = config.get_setting('checklinks', __channel__) -# checklinks_number = config.get_setting('checklinks_number', __channel__) - def mainlist(item): support.log(item.channel + 'mainlist') itemlist = [] - support.menu(itemlist, 'Anime bold', 'lista_anime', "%s/animelist?load_all=1" % host,'anime') - itemlist.append( - Item(channel=item.channel, - action="ultimiep", - url="%s/fetch_pages.php?request=episodios" % host, - title=support.typo("Novità submenu"), - extra="", - contentType='anime', - folder=True, - thumbnail=support.thumb()) - ) - # itemlist.append( - # Item(channel=item.channel, - # action="lista_anime", - # url="%s/animeincorso" % host, - # title=support.typo("In corso submenu"), - # extra="anime", - # contentType='anime', - # folder=True, - # thumbnail=channelselector.get_thumb('on_the_air.png')) - # ) - itemlist.append( - Item(channel=item.channel, - action="list_az", - url="%s/animelist?load_all=1" % host, - title=support.typo("Archivio A-Z submenu"), - extra="anime", - contentType='anime', - folder=True, - thumbnail=channelselector.get_thumb('channels_tvshow_az.png')) - ) - support.menu(itemlist, 'Cerca', 'search', host,'anime') + support.menu(itemlist, 'Anime bold', 'lista_anime', "%s/animelist?load_all=1" % host) + support.menu(itemlist, 'Novità submenu', 'ultimiep', "%s/fetch_pages.php?request=episodes" % host,'tvshow') + support.menu(itemlist, 'Archivio A-Z submenu', 'list_az', '%s/animelist?load_all=1' % host,args=['tvshow','alfabetico']) + support.menu(itemlist, 'Cerca', 'search', host) autoplay.init(item.channel, list_servers, list_quality) @@ -131,9 +100,14 @@ def lista_anime(item): title += ' '+support.typo(' (ITA)') infoLabels = {} - # if 'Akira' in title: - # movie = True - # infoLabels['year']= 1988 + if 'Akira' in title: + movie = True + infoLabels['year']= 1988 + + if 'Dragon Ball Super Movie' in title: + movie = True + infoLabels['year'] = 2019 + itemlist.append( Item(channel=item.channel, @@ -213,7 +187,7 @@ def episodios(item): fanart=item.thumbnail, thumbnail=item.thumbnail)) - if((len(itemlist) == 1 and 'Movie' in itemlist[0].title) or movie): + if(((len(itemlist) == 1 and 'Movie' in itemlist[0].title) or movie) and item.contentType!='movie'): item.url = itemlist[0].url item.contentType = 'movie' return findvideos(item) @@ -235,6 +209,7 @@ def findvideos(item): if(item.contentType == 'movie'): episodes = episodios(item) + if(len(episodes)>0): item.url = episodes[0].url @@ -245,23 +220,11 @@ def findvideos(item): url = scrapertools.find_single_match(data, patron) data = httptools.downloadpage(url).data - # patron = r"""""" - # matches = re.compile(patron, re.DOTALL).findall(data) - # for video in matches: - # itemlist.append( - # Item( - # channel=item.channel, - # action="play", - # fulltitle=item.fulltitle, - # title="".join([item.title, ' ', support.typo(video.title, 'color kod []')]), - # url=video, - # contentType=item.contentType, - # folder=False)) itemlist = support.server(item, data=data) - # itemlist = filtertools.get_links(itemlist, item, list_language) - + if item.contentType == 'movie': + support.videolibrary(itemlist, item, 'color kod') # Controlla se i link sono validi # if checklinks: # itemlist = servertools.check_list_links(itemlist, checklinks_number) @@ -279,16 +242,13 @@ def ultimiep(item): logger.info(item.channel + "ultimiep") itemlist = [] - post = "page=%s" % item.extra if item.extra else None - logger.debug(post) - logger.debug(item.url) + post = "page=%s" % item.args['page'] if item.args and item.args['page'] else None + data = httptools.downloadpage( item.url, post=post, headers={ 'X-Requested-With': 'XMLHttpRequest' }).data - logger.debug(data) - patron = r"""

    [^
    \s*""" patron += r"""
    (.+?)
    \s*""" patron += r"""
    (.+?)
    """ @@ -298,6 +258,7 @@ def ultimiep(item): scrapedtitle1 = cleantitle(scrapedtitle1) scrapedtitle2 = cleantitle(scrapedtitle2) scrapedtitle = scrapedtitle1 + ' - ' + scrapedtitle2 + '' + itemlist.append( Item(channel=item.channel, contentType="tvshow", @@ -313,16 +274,15 @@ def ultimiep(item): # Pagine patronvideos = r'data-page="(\d+)" title="Next">Pagina Successiva' next_page = scrapertools.find_single_match(data, patronvideos) - if next_page: itemlist.append( Item( channel=item.channel, action="ultimiep", title=support.typo(config.get_localized_string(30992), 'color kod bold'), - url=host + "/fetch_pages?request=episodios", + url=item.url, thumbnail= support.thumb(), - extra=next_page, + args={'page':next_page}, folder=True)) return itemlist @@ -362,42 +322,73 @@ def newest(categoria): # ================================================================================================================ # ---------------------------------------------------------------------------------------------------------------- -def search_anime(item): - logger.info(item.channel + " search_anime") +def search_anime(item, texto): + logger.info(item.channel + " search_anime: "+texto) itemlist = [] - data = httptools.downloadpage(host + "/animelist?load_all=1").data - data = scrapertools.decodeHtmlentities(data) + # data = httptools.downloadpage(host + "/animelist?load_all=1").data + # data = scrapertools.decodeHtmlentities(data) + # + # texto = texto.lower().split('+') + # + # patron = r']*?>[^>]*?>(.+?)<' + # matches = re.compile(patron, re.DOTALL).findall(data) + # + # for scrapedurl, scrapedtitle in [(scrapedurl, scrapedtitle) + # for scrapedurl, scrapedtitle in matches + # if all(t in scrapedtitle.lower() + # for t in texto)]: + # + # title = cleantitle(scrapedtitle).replace('(ita)','(ITA)') + # showtitle = title + # if '(ITA)' in title: + # title = title.replace('(ITA)','').strip() + # showtitle = title + # title += ' '+support.typo(' [ITA] color kod') + # + # itemlist.append( + # Item( + # channel=item.channel, + # contentType="episode", + # action="episodios", + # title=title, + # url=scrapedurl, + # fulltitle=title, + # show=showtitle, + # thumbnail="")) + # + # tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) - texto = item.url.lower().split('+') + data = httptools.downloadpage(host + "/index.php?search=1&key=%s" % texto).data + jsondata = jsontools.load(data) - patron = r']*?>[^>]*?>(.+?)<' - matches = re.compile(patron, re.DOTALL).findall(data) + for title in jsondata: + data = str(httptools.downloadpage("%s/templates/header?check=1" % host, post="typeahead=%s" % title).data) - for scrapedurl, scrapedtitle in [(scrapedurl, scrapedtitle) - for scrapedurl, scrapedtitle in matches - if all(t in scrapedtitle.lower() - for t in texto)]: - - title = cleantitle(scrapedtitle).replace('(ita)','(ITA)') - showtitle = title - if '(ITA)' in title: - title = title.replace('(ITA)','').strip() + if 'Anime non esistente' in data: + continue + else: + title = title.replace('(ita)','(ITA)') showtitle = title - title += ' '+support.typo(' [ITA] color kod') + if '(ITA)' in title: + title = title.replace('(ITA)', '').strip() + showtitle = title + title += ' ' + support.typo(' (ITA)') - itemlist.append( - Item( - channel=item.channel, - contentType="episode", - action="episodios", - title=title, - url=scrapedurl, - fulltitle=title, - show=showtitle, - thumbnail="")) + url = "%s/anime/%s" % (host, data) + logger.debug(title) + logger.debug(url) - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + itemlist.append( + Item( + channel=item.channel, + contentType="episode", + action="episodios", + title=title, + url=url, + fulltitle=title, + show=showtitle, + thumbnail="")) return itemlist @@ -408,10 +399,9 @@ def search_anime(item): def search(item, texto): logger.info(item.channel + " search") itemlist = [] - item.url = texto try: - return search_anime(item) + return search_anime(item, texto) except: import sys diff --git a/channels/cineblog01.py b/channels/cineblog01.py index b6859b2d..a2cb2401 100644 --- a/channels/cineblog01.py +++ b/channels/cineblog01.py @@ -105,6 +105,7 @@ def newest(categoria): findhost() itemlist = [] item = Item() + item.contentType = 'movie' item.url = host + '/lista-film-ultimi-100-film-aggiunti/' return support.scrape(item, r']+)>([^<([]+)(?:\[([A-Z]+)\])?\s\(([0-9]{4})\)<\/a>', ['url', 'title', 'quality', 'year'], diff --git a/channels/fastsubita.json b/channels/fastsubita.json index dead1163..2db8f206 100644 --- a/channels/fastsubita.json +++ b/channels/fastsubita.json @@ -4,8 +4,8 @@ "language": ["ita"], "active": true, "adult": false, - "thumbnail": "http://fastsubita.com/wp-content/uploads/2017/10/Untitled-222255xxx.jpg", - "banner": "http://fastsubita.com/wp-content/uploads/2017/10/Untitled-222255xxx.jpg", + "thumbnail": "fastsubita.png", + "banner": "fastsubita.png", "categories": ["tvshow", "vosi"], "settings": [ { diff --git a/channels/fastsubita.py b/channels/fastsubita.py index 9318a714..c8f575f7 100644 --- a/channels/fastsubita.py +++ b/channels/fastsubita.py @@ -6,7 +6,8 @@ import re -from core import scrapertools, httptools, tmdb +import channelselector +from core import scrapertools, httptools, tmdb, support from core.item import Item from platformcode import config, logger from specials import autoplay @@ -44,8 +45,8 @@ def mainlist(item): support.menu(itemlist, 'Serie TV bold', 'lista_serie', host,'tvshow') support.menu(itemlist, 'Novità submenu', 'pelicuals_tv', host,'tvshow') support.menu(itemlist, 'Archivio A-Z submenu', 'list_az', host,'tvshow',args=['serie']) - support.menu(itemlist, 'Cerca', 'search', host,'tvshow') + autoplay.init(item.channel, list_servers, list_quality) autoplay.show_option(item.channel, itemlist) @@ -113,24 +114,31 @@ def pelicuals_tv(item): episode = scrapertools.find_multiple_matches(scrapedtitle, r'((\d*)x(\d*))')[0] scrapedtitle = scrapedtitle.replace(scraped_1, "") + infoLabels = {} + infoLabels['season'] = episode[1] + infoLabels['episode'] = episode[2] if "http:" in scrapedurl: scrapedurl = scrapedurl else: scrapedurl = "http:" + scrapedurl + title = scraped_1+" - "+infoLabels['season']+"x"+infoLabels['episode']+" Sub-ITA" + itemlist.append( Item(channel=item.channel, action="findvideos", contentTpye="tvshow", - title=scraped_1 + " " + scrapedtitle, - fulltitle=scraped_1 + " " + scrapedtitle, + title=title, + fulltitle=title, url=scrapedurl, thumbnail=scrapedthumbnail, plot=scrapedplot, show=scraped_1, extra=item.extra, - contentSerieName=scraped_1+" ("+episode[0]+" Sub-Ita)", + contentSerieName=scraped_1, + contentLanguage='Sub-ITA', + infoLabels=infoLabels, folder=True)) tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) @@ -380,7 +388,7 @@ def episodios(item,itemlist = []): infoLabels = {} infoLabels['season'] = season infoLabels['episode'] = episode[2] - title = infoLabels['season']+'x'+infoLabels['episode'] + title = infoLabels['season']+'x'+infoLabels['episode']+" Sub-ITA" if "http:" not in scrapedurl: scrapedurl = "http:" + scrapedurl diff --git a/channels/seriehd.json b/channels/seriehd.json index 2d5a19b2..ecd59d5c 100644 --- a/channels/seriehd.json +++ b/channels/seriehd.json @@ -4,8 +4,8 @@ "active": true, "adult": false, "language": ["ita"], - "thumbnail": "https://raw.githubusercontent.com/Zanzibar82/images/master/posters/seriehd.png", - "banner": "https://raw.githubusercontent.com/Zanzibar82/images/master/posters/seriehd.png", + "thumbnail": "seriehd.png", + "banner": "seriehd.png", "categories": ["tvshow"], "settings": [ { diff --git a/channels/serietvsubita.json b/channels/serietvsubita.json index 2c2daf83..fe08633c 100644 --- a/channels/serietvsubita.json +++ b/channels/serietvsubita.json @@ -4,8 +4,8 @@ "active": true, "adult": false, "language": ["ita"], - "thumbnail": "http://serietvsubita.xyz/wp-content/uploads/2012/07/logo.jpg", - "banner": "http://serietvsubita.xyz/wp-content/uploads/2012/07/logo.jpg", + "thumbnail": "serietvsubita.png", + "banner": "serietvsubita.png", "categories": ["tvshow"], "settings": [ { diff --git a/channels/serietvsubita.py b/channels/serietvsubita.py index 1b43e617..3ce72d6b 100644 --- a/channels/serietvsubita.py +++ b/channels/serietvsubita.py @@ -52,7 +52,7 @@ def mainlist(item): # ---------------------------------------------------------------------------------------------------------------- def cleantitle(scrapedtitle): scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle.strip()) - scrapedtitle = scrapedtitle.replace('[HD]', '').replace('’', '\'').replace('×','x').replace('Game of Thrones –','') + scrapedtitle = scrapedtitle.replace('[HD]', '').replace('’', '\'').replace('×','x').replace('Game of Thrones –','').replace('In The Dark 2019','In The Dark (2019)').strip() year = scrapertools.find_single_match(scrapedtitle, '\((\d{4})\)') if year: scrapedtitle = scrapedtitle.replace('(' + year + ')', '') @@ -195,7 +195,7 @@ def episodios(item, itemlist=[]): infoLabels = {} infoLabels['season'] = season infoLabels['episode'] = episode - + fullepisode+=' Sub-ITA' itemlist.append( Item(channel=item.channel, extra=item.extra, @@ -293,23 +293,27 @@ def peliculas_tv(item): scrapedthumbnail = "" scrapedplot = "" scrapedtitle = cleantitle(scrapedtitle) + infoLabels = {} episode = scrapertools.find_multiple_matches(scrapedtitle, r'((\d*)x(\d*))')[0] title = scrapedtitle.split(" S0")[0].strip() title = title.split(" S1")[0].strip() title = title.split(" S2")[0].strip() - + infoLabels['season'] = episode[1] + infoLabels['episode'] = episode[2] itemlist.append( Item(channel=item.channel, action="findvideos", fulltitle=scrapedtitle, show=scrapedtitle, - title=scrapedtitle, + title=title+" - "+episode[0]+" Sub-ITA", url=scrapedurl, thumbnail=scrapedthumbnail, - contentSerieName=title+" ("+episode[0]+" Sub-Ita)", + contentSerieName=title, + contentLanguage='Sub-ITA', plot=scrapedplot, + infoLabels=infoLabels, folder=True)) tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) diff --git a/channels/serietvu.json b/channels/serietvu.json index a7612fde..abb5dbd5 100644 --- a/channels/serietvu.json +++ b/channels/serietvu.json @@ -4,8 +4,8 @@ "active": true, "adult": false, "language": ["ita"], - "thumbnail": "https://www.serietvu.club/wp-content/themes/gurarjbar/images/logo.png", - "banner": "https://www.serietvu.club/wp-content/themes/gurarjbar/images/logo.png", + "thumbnail": "serietvu.png", + "banner": "serietvu.png", "categories": ["tvshow"], "settings": [ { diff --git a/channels/serietvu.py b/channels/serietvu.py index b25a7bec..d13b3451 100644 --- a/channels/serietvu.py +++ b/channels/serietvu.py @@ -52,7 +52,7 @@ def mainlist(item): # ---------------------------------------------------------------------------------------------------------------- def cleantitle(scrapedtitle): scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle.strip()) - scrapedtitle = scrapedtitle.replace('[HD]', '').replace('’', '\'').replace('Game of Thrones –','').replace('Flash 2014','Flash') + scrapedtitle = scrapedtitle.replace('[HD]', '').replace('’', '\'').replace('– Il Trono di Spade','').replace('Flash 2014','Flash') year = scrapertools.find_single_match(scrapedtitle, '\((\d{4})\)') if year: scrapedtitle = scrapedtitle.replace('(' + year + ')', '') @@ -121,10 +121,14 @@ def episodios(item): matches = re.compile(patron, re.DOTALL).findall(blocco) for scrapedextra, scrapedurl, scrapedimg, scrapedtitle in matches: number = scrapertools.decodeHtmlentities(scrapedtitle.replace("Episodio", "")).strip() + + title = value + "x" + number.zfill(2) + + itemlist.append( Item(channel=item.channel, action="findvideos", - title=value + "x" + number.zfill(2), + title=title, fulltitle=scrapedtitle, contentType="episode", url=scrapedurl, @@ -145,6 +149,7 @@ def findvideos(item): support.log(item.channel + " findvideos") itemlist = support.server(item, data=item.url) + # itemlist = filtertools.get_links(itemlist, item, list_language) # Controlla se i link sono validi @@ -192,6 +197,45 @@ def findepisodevideo(item): def latestep(item): support.log(item.channel + " latestep") itemlist = [] + titles = [] + + #recupero gli episodi in home nella sezione Ultimi episodi aggiunti + data = httptools.downloadpage(host, headers=headers).data + + block = scrapertools.find_single_match(data,r"Ultimi episodi aggiunti.*?

    ") + regex = r'(.*?)\((\d*?)x(\d*?)\s(Sub-Ita|Ita)' + matches = re.compile(regex, re.DOTALL).findall(block) + + for scrapedurl, scrapedimg, scrapedtitle, scrapedseason, scrapedepisode, scrapedlanguage in matches: + infoLabels = {} + year = scrapertools.find_single_match(scrapedtitle, '\((\d{4})\)') + if year: + infoLabels['year'] = year + infoLabels['episode'] = scrapedepisode + infoLabels['season'] = scrapedseason + episode = scrapedseason+"x"+scrapedepisode + + scrapedtitle = cleantitle(scrapedtitle) + title = scrapedtitle+" - "+episode + contentlanguage = "" + if scrapedlanguage.strip().lower() != 'ita': + title +=" Sub-ITA" + contentlanguage = 'Sub-ITA' + + titles.append(title) + itemlist.append( + Item(channel=item.channel, + action="findepisodevideo", + title=title, + fulltitle=title, + url=scrapedurl, + extra=[[scrapedseason,scrapedepisode]], + thumbnail=scrapedimg, + contentSerieName=scrapedtitle, + contentLanguage=contentlanguage, + contentType='episode', + infoLabels=infoLabels, + folder=True)) data = httptools.downloadpage(item.url, headers=headers).data @@ -209,23 +253,38 @@ def latestep(item): infoLabels['tvshowtitle'] = scrapedtitle episodio = re.compile(r'(\d+)x(\d+)', re.DOTALL).findall(scrapedinfo) - title = "%s %s" % (scrapedtitle, scrapedinfo) + infoLabels['episode'] = episodio[0][1] + infoLabels['season'] = episodio[0][0] + + episode = infoLabels['season'] + "x" + infoLabels['episode'] + title = "%s - %s" % (scrapedtitle, episode) + title = title.strip() + contentlanguage = "" + if 'sub-ita' in scrapedinfo.lower(): + title+=" Sub-ITA" + contentlanguage = 'Sub-ITA' + + if title in titles: continue itemlist.append( Item(channel=item.channel, action="findepisodevideo", title=title, - fulltitle=scrapedtitle, + fulltitle=title, url=scrapedurl, extra=episodio, thumbnail=scrapedimg, - show=scrapedtitle, - contentTitle=scrapedtitle, - contentSerieName=title, + contentSerieName=scrapedtitle, + contentLanguage=contentlanguage, infoLabels=infoLabels, + contentType='episode', folder=True)) + + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + # logger.debug("".join(map(str,itemlist))) + return itemlist @@ -290,7 +349,7 @@ def categorie(item): Item(channel=item.channel, action="lista_serie", title=scrapedtitle, - contentType="tv", + contentType="tvshow", url="%s%s" % (host, scrapedurl), thumbnail=item.thumbnail, folder=True)) diff --git a/core/scrapertools.py b/core/scrapertools.py index 58dd8ea6..d5691a20 100644 --- a/core/scrapertools.py +++ b/core/scrapertools.py @@ -365,6 +365,9 @@ def get_season_and_episode(title): @return: Numero de temporada y episodio en formato "1x01" o cadena vacia si no se han encontrado """ filename = "" + # 4l3x87 - fix for series example 9-1-1 + original_title = title + title = title.replace('9-1-1','') patrons = ["(\d+)\s*[x-]\s*(\d+)", "(\d+)\s*×\s*(\d+)", "(?:s|t)(\d+)e(\d+)", "(?:season|temp|stagione\w*)\s*(\d+)\s*(?:capitulo|epi|episode|episodio\w*)\s*(\d+)"] @@ -372,6 +375,7 @@ def get_season_and_episode(title): for patron in patrons: try: matches = re.compile(patron, re.I).search(title) + if matches: if len(matches.group(1)) == 1: filename = matches.group(1) + "x" + matches.group(2).zfill(2) @@ -381,6 +385,6 @@ def get_season_and_episode(title): except: pass - logger.info("'" + title + "' -> '" + filename + "'") + logger.info("'" + original_title + "' -> '" + filename + "'") return filename diff --git a/core/tmdb.py b/core/tmdb.py index d71371b1..c57b1df1 100644 --- a/core/tmdb.py +++ b/core/tmdb.py @@ -324,8 +324,9 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda=def_lang, lock=None __leer_datos(otmdb_global) - if lock and lock.locked(): - lock.release() + # 4l3x87 - fix for overlap infoLabels if there is episode or season + # if lock and lock.locked(): + # lock.release() if item.infoLabels['episode']: try: @@ -354,6 +355,10 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda=def_lang, lock=None item.infoLabels['rating'] = episodio['episodio_vote_average'] item.infoLabels['votes'] = episodio['episodio_vote_count'] + # 4l3x87 - fix for overlap infoLabels if there is episode or season + if lock and lock.locked(): + lock.release() + return len(item.infoLabels) else: @@ -374,8 +379,17 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda=def_lang, lock=None if temporada['poster_path']: item.infoLabels['poster_path'] = 'http://image.tmdb.org/t/p/original' + temporada['poster_path'] item.thumbnail = item.infoLabels['poster_path'] + + # 4l3x87 - fix for overlap infoLabels if there is episode or season + if lock and lock.locked(): + lock.release() + return len(item.infoLabels) + # 4l3x87 - fix for overlap infoLabels if there is episode or season + if lock and lock.locked(): + lock.release() + # Buscar... else: otmdb = copy.copy(otmdb_global) diff --git a/resources/media/channels/banner/fastsubita.png b/resources/media/channels/banner/fastsubita.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2267182f6315ea0133cebab8f57a09881b3601 GIT binary patch literal 115349 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 JmG4Xf{|6LWk*ELw literal 0 HcmV?d00001 diff --git a/resources/media/channels/banner/seriehd.png b/resources/media/channels/banner/seriehd.png new file mode 100644 index 0000000000000000000000000000000000000000..027c0a1508f8aece2980c0085dd8c9bdeaded2d5 GIT binary patch literal 12960 zcmd^lWmuHm8m5dtRu<-FMJvd~&uPKK%S$UH#KkKhC?v$oLCeR(%g4kS~XZL@b2^fsq+suWV zmx~9zqg4pFyWKrBt^VhH|FFv7)*y%me0b3v;2B)e@p*(Y157gn7BM{(Zlys;H8)yN8*xg_V+=1U+~I zmz|xZsDQ8tpNIetpRkMoFE6jWh>Y+vJ_SA*KIvz2(!${1KhMg+EIgg8oIU<|*7AQo z%l}`WMZ1EN3m93>%FXVzm8F6k%!&5zC5zhq_qp)=*Z2MVSzLhiZb~oVGu4I_aw{CG0D#=M}d(Z65WBO~$Fa7mrIzbhG z^ZuO>TH25T7FDct%!oHr>X2XYvg#}Q-4A?y7k+fPVnxsrLmsxey>rpzWWjnF4`HEq zd10H8EgYv>eQBeNz0%b0{P@n&K581jvGJQQY^`bf%HMjSk&N!|DE$BOixFHvR~*yT z)z!G+_3l)8)}^qdq$CFihk$?pJNx$K`H{`Q_vtFT(GueZO>k*xNhlR-WGNIIz(=-E z1P2CNgE3=hq)JGi#_x{(i0?ClhZ7PJed}L)_wJ5(g6H8)rLLC(<;A3r*d=0=s4!lEL%-5YEMQ(uaCwB-f!2oTLY<wmf8@~2 zBEj_XHO``HhJbY2DMp3^OO+&2$|WM8=0{zpK8a=3izKOoQ zl$6x^bz@`W@$s?y`an0fb-CWz>V4o98@9C^^z`((kd%uqh8SD8!6~m5KWY}%lJd-T z>Fr(2xhhRjuf0aIpBU5ig{mc%%GdSVC582-)`!b6Qh^7pm`$qcLM6o9CgKhgMOt|f zA|fIm@3EdQ?E8&J0|h8deCkH?c5JxN!k^{NtjtV%A5+Ue?DhOIri7nLS>$?rwJgPV z?ILE>Ke;Gu6wHyhM?ahBS`bU`+V`RlgiqE9lSJYa%3aH7G%D%2hZg5Iw`h<@Ia-(o zU7c8Td?XWcOhid?Pj96P!xos+{OMsvW@Z^R>-NK$?TBk+jdg!gU5s_*^h&tpMV?w3 zL`iA7)-}r!xxT(WnSP`E36d8tpD?}_&YW7i-;C-JBOzQ}St&AU@ zhGu_}ai%4x#avWP;^gxT9e2xRMKKpH<+C#S;f?dmP}RjJs5+9<*&zjyPixQ&r*vQK z9k$gh@yn;gks$&E7cT>#J0CuL7?ipZ7ZaN`FZT{?wOSd?Q|lFDH{3~0E0hk#`1b9a zU~S8x-{()C%6*R35LbI%aPGsCNzBH<@*b?+zh zTy|)Y_g>xlojZ3LCBXjCG%kiw5XxFHs0tlzWj~Q~RewI3t7@el6+gaxQeIvTMnzQG zsBKRab9aXB&cGc~vY!wVYM=X#DRsuZ+;vZ`l`MfWkCTPcLFJlRl5!$H)Px8vRZQ6X z3@>;uN2LW_`*g+9;gJjEzm6S{|0-P=6&ab#Ytgaz^Zk2#n!QDh?(Xi?#`df;32c1) zuW+lAt?`N!(x7w0N`pv+CAyR$WjYNupJ^YL?daXh7oygVLYUqDm85}5TtP6 z9nNBQ6q>DbU+3Cp1y%>Kva`P*xWj}gc)@hE?HYT#=k8P>lA)-xh~~Q z--R*zUBo@r|FF9|p1ITjzV$2oiKn1x$~tgr_rsO$-hhPK+S;HS6hhZ5v`mkKq*TBIJNeVt1l zQW}jJNHShh+(=?hY&<;ACyLNXSo8VX#&Fj9VA|l|AU-bc$LMJ1;Y@i%bHIF&3|rwv zwo-gG4AE@ePY!d}(bm@X8PHyjd-UMJ15U$g5B?7d307eLwlLs~w=>U>0fo?|;-@0l#*lq3u*Ig8LTZaTe(wp5MP=15M&(O|DoqT`!7 z5p|(1W|c&jgWs)lb4Jr9nhy7=MBL-NObs_{CO07A){rCtC80wie0&_7cuxjq=1x^?%!iaNN0~#wIz%y= zet($x_}pfy?DoF;+98^olIhh_M8~gW9_K+)lK8A5Q1_uvo;)%2S^d)FcbcS<+tcaG zmx^|WTU=jKQi`V}eb!UF#6^s1P_ZSjQPcfXm=GnR-) zUp;n)4m~f{gM1j9Xv@APRyhce8MCi$2N@}!bHn@McoR5mZeAW3UqL|uWW5+_iGm4o z8mU14`DU%ygoHI~YDGBQB1$2vsKb7hlZ}mB(*I0LO=9)j@A+ZFWiNNjoLes^*!fw2 zEW+?8R?@T$!KB_qW9--JM-BG(ZcV$e=krKEr=-m1D1SX#AM{K7{PFy~)McxAIZIfz{Wu#FQ?4_2U*9+W z$cPBS;CJud5uSSO&56*_N%MBu!=ouhMpR)*4TdX;{TYg26@JK~8#~k6U@n(iV&rqU z3Z#<$wKG3Q95PxR%4>a^mdLrzzUbDQS~jMWlb7SrLvi2m&Cr|oA<@ta?CO)?VDE6Ojr79|J8d5n68 z0yoTadm@TLcrU5(7r=gCC|=vuo-f+1y}b$C6{cEvf=0T*PfvUUKtdn{E>xmFINTh7 z8he){VE34SKx5rg(>2K1*?BxAMa&DTZ1d{_L1<{`7#|qs)|c_^nUl1jl6vj8rKS6z zOjwE)gG6B;JQ9>s|9ZE8SOB&lUhv!ME5D(h4ioF~wpQ>laH-|>^*qw!c`w8`M~uF{ zKFA!pI8GzkN>nB>6UBx#_Tw*kZD*^Ubi9yTyjq&`-MEW#%d6O4G(+$W}RvR&KBR>7h)6{)m0$nkAPtrFz~63 zoT@@`NFa$kt)p^RsPGW&!3M?>TSeJVWoy_3KOSXA7D@Zo%(+Dxs5?#A&Q(}}4R3!;!am4iJ`zI^`d{iW9NUXKcN;mPC2afyjj z8M5zzzrp1hk$dxomHKxbXooUpY=6GTKh4Z)y?$YYV*jy1Y}QSfS*Iy+=LbLWPl1ycL)akO`9jITRlX~tgO;$duOQrA31J{14$Wg*UpoN z5z=I2Wbp2+aeJL@+k@=nBDWRg+=Pz+bw)(EjqZG1zv`5_{-Zg9nJ)1LmY|6kPF)H&DC8}qGvi8#(tmSlr298_a-%0^0MMAfM5g3Nd0^(Mo{aD;?af^qegO(fS6cAf~Tz0RJ3j(WaH!_JF@-P zui76|huKe+4V-wMllo#EF^DB6g|h&^k$pQReU zz881##eZABh@Sa?(H_c^0zg<}lic<7b$_z(`Z^le)e0GvPwrUZtOF?4v>YuaRlejmMyLqbGX%=Ar!-4>+CZQ)}Cc9$^O=W}+ zG*+C&xV>RomgFRwn!^jzQ4rsB`J)7Rq zH4Qic@LuZRue*cdM=F|{am)@X(bN*YzzQau#ms|l07KZL?yL=_1$|3+8yl6c6wd_c zSpRpC%0OsRzT;$xF~~fnLP@B)D=w>nCu>^N!u?TgiQbIc--NVROKg0Tw$Mlt?t#HUFB+{~BIfmM{D`bqFO`+ITjJ204*>7GerwcN zhU;<%4l&0I2;?=5snGgFi7^EU$@;l^(6=*1ngEY>Wl@kBpv4AJ|L&Cx)n7&rbmmsxU1`u#w@~8@-Ye24H z6Gh)p)0&V}@gKy51Oyq0<)HipW8&BA-y;MQ0^V@40$^_d2>qdqpDW$*sMGy@CToD? z*9TH+oacQ7Em3EGmI1ze9L+oe_816PgOaG7gTb(6FJxlSlX^ zCr(TAvVcoSsJdg?Lo27UqC#9v5!xQptMZL62P8<@FkB6k5ZrnG0=SV^{LDB0f&kt_ zzXIZ?EjXZ9kKSe+Qv?$Nbc)@gJC3nt!M89OsRN*1$y%={$eO|ke=XN5so+)~u#FdK z>IXIKF8M>}1p+-a-pPsW=B}gn6B6}~ey{-YlTYk%dG?2#nVlU?o1E)6bNf_QPvy{c zrr1yz{uA(ZBLjmAhs%d(2T#vh)KrY7RDwXD$sg#LnAX@@DuS-IO~(^%QSw=KMF}sw zSS=)JrZ=y*f3^9EJiFFoQxi@L|4LXuL`F6Z2va+)e&if3`vE#zGN~k{lV*=@5_1}4 zBPSFB1Fxg0#0Z0DYG9?+OlZmDmMD3N=KF_Kz=5@J3s!M&PSVTD4%C7!;>}|fvV4}p zne+WmT3gbFP^_5WqH&Z}$q#xHIJI!LhO-p=E2e*FF~b>|x9q7$0Y_AK`tvCY0EJHj^iPt+*U=@VHfIbm}@Ns%a9<{camj=b ztX$8;cayPw(&yOs3V@I?Ur~@}aue3x+`cuKtzF7)U}zq*Z_)!Oy8YMCV6xl<(fTlkbE!Zpm}SpP*_q z+YC~dLL+Sf%CWW0Hy;8?KagnBYobWs-hC5~T3oMsH2>Y#P^K3GGjw-!@^lGBZXRc9 zGjcqaYh+wH{gA7;n>Iz%=6%G-D|x>11RjDq*UdL@sA!uDBWUR!}l z5WS*R*b7;T;hk(OKg}~ZiDcC7UHW$z5odVx{`RYSAWcG(C4Nm#>Ov16Qi*!UP3Pz5 zg90M#Jg3JCYMdVstvvmFpe05=TVt&4>F;R*pK)-g@Y-HooH!@EA$#WXJ6AQi?dQ)Q z0cc}x!L#UugrLtl4DiVXHacm7E)RRTF>y)LYrR8aVqzTY{jbm02?z)xlyY)&ua8I7 zQqx313K+5QlUW)w)JV`}p`QcgAqDvT7(- z8rC@5+1UYA3td|cD9`6xHgl8D`q4qDZUa!Qm6qFD-#6g>&1XxIYT|!>0R$2w=r94; z#_ZUagoJ8`Nk};vD3%0<#W~s8ECUh3=xsj(SjgSfC2M#iSI%Cw^a^##-VwC*BX0~+ zqa`P%G zS6XrJepkN+pYG)g zbo!gbxFQ;qR#EBe`otg+a|5z-ufo}CuNrVy0I`1{$7(QCm`3>r#j}vq*ZCS*bA4Mu z_t`>B5T&M4)7gy}>2j4j z=#yu9ZLMDQ$kpYgr9b?Hsz;wA0l+y^CxZ|JQJ3F;0e~EM+JMl(v!AZ80)sMOq7*fCuiX9!_hlPc`e~&_;bZ2{GQ&R&0hqwX}@O9rjU)B1@=;lJuO#nRb?b6Z` z+EajJ7yRA^NIlZh(#L=EH4gzJF4MqsD^9H!N=jtn-et)TBkO(da3qI%8X~`c{|;~{ z3kF$K$9rnue8_;C5A~bb5~J0kEG8r=TuC7 z7mtmN%{n(Y0h<5yq^AUkY#?z&NOKxgy--on7CQj+7nIL!fO@pw%M(WvP};{k{HxGO zk5j-JHIiA60YVR0juK9l@PooX*}{p5i6@kx{QUgewe60Ts);<(oF0I?c)BG3vA|f% zb5s*k_LbZM_MaB4PZNrI5I>hRH~Bwi z(O`^0y~ie=@Enix+_TE*oo3!rA^dl`MbK^FRE2xG4p>0HP>Y)fWoK``fhZU-jKVz* z78do7Mb)NBqMr5|8XCK$e=RimvBOJrpb}+--tMYL+K+i3B+H-Vzq1nLc>YI?ew)*E z%h^@Hyo_uIY~ydDCcXi#O#>og;P&mO!as0M*JFEsk3c)9%m z-L2G_{1BZsH3-uiiv5tLIO>7e*x$^ zQ&UrAWjw*H>ciE7$@st<0e1&3z+qI&BPck2^cmK$TMYp9n00>_I*By5mP~H%*Kc!u zTL-}90)-OGI~DUi-Z)(CB@$yQupciNm&KR(92@(Hlr(>IlY>}UTKcV{Uf@x`Fq(yv zpD+0BJ55*QxL^DQ09;j76_wa)4uh(${`?cbT90>Ub#qOZm)2KT`xAL(iTh7#gpBUt zk#tncP|#MrZL=m$P%)cfKa?Vvz~vqhd`nBa|3%hYvzFVUvV}*@SKiv znblG?0paYE33M4B!@o}jcnEmMK8Rux6&2;;f>bYzj*bqdNexD|mL@rNoNkWV45dp0 zk`PBUJ2^QyeXe6pHIP2f4#szhYyKmOlef!hKt@H@a6(ZX(usHZ4Eb?@%u zK#TMi=k~X^#Q+%vm+}&9zW$`Jv^kDKNl6I+n^O06poO@(xuNA}Ft46Zu-Zk8Z-G$g z1km(VnBwO~3w29DSeeGvHP1N{9#J2QdH*jLFG zlt!zJl@4Ga9Bgbh%=7beAdNw;8!Wry0G;TP0NjT`;p2zsXi2w~4|AJ+d0H)jS0MH) zK;;D4qIDF9{5YRSpc=NqO^}1)E-`ARw=5dM2yZJ5u`6`2Ik3%$(NX2xziTGxj2L46 zkdDBKGSS19TWDy5ZgAmWY|9PZmC34v8RCSVH?l~qJj>c$@)jjH^III<8TqNK7JgY5 zeV|9cSO0Ru_0!GUWlbbWpmE6g_bxwEtjd5GH8BF0uU8*Qn!(s?R2Glu)TUbuMPOaH z(_Uu?F5vY!dGgmNq}1KLCmllA_gQD?BcNgfp2-K>TrbrkE`vZsF`plA2_74 zEU-mPJQ%H3=6a9i`(h&*D^h$uC}dYA$D#r2=DMxQ*yt>C2Pr|1tI91Q|3}DmQ8|zj zogLH3-@biYaped%aQebwSY6Z@<)l>+c;#zzZ~C%?oNadN6cH43&I)+<{#;sO;>H}q zEHa{7$a(H8Ztuio;IeLSsoiwJFspMJ`_%=nvFM2=qzMviyHQN$<;5)_o zOu>t0^E^k~hDn!T8O{C*xfK*rTwCDAkTtDp^TG7J8bz$Mg3l0zY5j@1xbZO2L(->7 z$vsOe*v9cM@5gxUP71p1hO4>m4u^CVLS0{t#|X7iw{-I=R!oz4(F#0qEtGfPmjAPw z_GdOU!&tuR_b^dLIXl-&I;1jc;7r2Gi@`{MTc=AlYxmL!9Ub|+SFpT%psd!fCKy`E z`W~(IgEV0QkP#pz6f`uY!?r6BQ&Ur$DiF$P5`NW}`JkurOc>Djp3}tsH6T9$fj|(p za0%2><4S8)C^TV7DWw}U7eHUCyYln?V1Iuxr7BY`3?aGhja>|#t*}x~f#`z#urtML z6M{z}B;Y((3j}YFK(^)^P63T#bIvf~KJ5j-?X~tmT_NYDx{sQ-xA!@6C_@&sg-s;6 zWK(Av9LO&k#TE3dj`SElK4`0HV7Xq{y)C3srL#e)tGT^TZuDw^aE;%JWT}c_RKcva zc_}@XS^oMR+s`L#5iC`K$eUtDB=cq4tDDgwl?_?>4Vus(HP_6n?H|n@ot|==b{f7_ zBjZxr?^*)bbB@v3De_vXP7YX&ctY$neytQHFSEKj7l0pwY|2wM)Nfcgp^L8$VV zipARd2A$l`yIIYybIgN=A%SH7@?+42b&>pu07Pz8;S8|qjXBW4EaPtjMZX~Nonwa> z!)Gr{4%6njx^?cL^GJTkH~}88k_oSe;*RODtzNQkACRd-f1P#}9y4IZ0IDwjaA zC~gb_8GGOgXeOme1~M}5_^bTo(6UR4U!Qg5rPs~%)#?=vGvxb$xm<9E>CkjH)p1o|sC^t10$jlH=TP!_#^0%!@ zY=an9aUZ^xD0+yGfBMH&;zL5z7I2_34(Y=2i_)O0-nx09=lHU;fjXF&l*A^CcJN1! z)SH6d`PsIc;2Eblj_qUfLmGIBXk4gd!4j{5cM z7Z8|AKzR{Of$-+0rJ24U%Nov4NLR?JTYjk9Fe74^O~L2pleB6~Em#)NaJ70~R#sM9 z`)r-s)D!{4o8BnU>+?;XaVTv9he&_`vD6-Ub#>J=pgQ$5WBkD=okkXX~y^TYSYyX=%z^>r*%D)rns7%evB3o-XY^GA7hM)Y7++%M6(L(8HHXkl>GM z;2egr$7JVsg_U!0W1*KUN*;&YhiAh-s2tb5N6=vLc@ z0IKqlN(>o{FG)Ipc7 z>!|=rZftBE(v|`}p|$RfJP=uY^1?fbm|up>Ss++k`f|TXsOnLTJ_(UDo;6&ZZHK!q zQkaR@q>Z*NgbwR(ko%=*E9tLCX0*$rC_WNTuGUKS53o~Cy(+>Am_GTlZE9@uR@G8+ zo!o~&bfIBi`!~;`d&)9jN!jUSK5s(*iC!bzo-VYT_tSf*!@fg)pZ`c|kpzqOy@g#a z3Ns6K<5-T2sFkk-Xj@R>jT?exr%MNaUnUnIS4BetWxuVlAA2*VW@b8G5Rjcg*A3WV z$R3{Ne;DpgufSbW3pKpn3#$Ry_{%3V(|e2Hkc>-oH7U@7AbGw0{Xj2NbBImnh;+B; z`OIqa8gp)EhQ&j?uf{rJM7#5P0J%x(@U!kfZrDU)Nsosw;Cmqv)kWi^l76rC#u!FH z$MAiY9ozsTx$FKDJD!PP>L`iKu5#LZ;I$XQdDHw=gv0yO>%&z>kJhQ(DJqNN+ue-l z#zca1EerWRS>{@dVEROKd4=S@Ewk25V~@%;pHM+BH9f1fX}nOEnTbjAu!~`Ra5l}N zm+1mT9=HDEL(na(%TNK}YFut@AO!^^jAu0r^z;A-7D~Vr6gt2G4x?1Zb2j{iifKns z!YXQPqBt3d_8JPgtyFEdgdP_B9>WW>_R%4_`ORFP-6) zsM#Ba-aTp|u8TBEYb%uyo&4svqbn=4`7^DiCH!~z0c!~f{XonUp&H{`6Kxfb8CgQe zsbEQZ%5s~7Iv2Fj;U9xUA0896;^P>GyIs_!X&c2pF%DV9ZTX0{$cF8~XU8LMy)s%! z$v~iX9S**E^9EpH-Dnpe&>C9-kxE-IbUiIdQbgn&l!Vy+YaseHU2GMOrvk>}q089b z-Yz(BQ=n5KNN7nN7Z(S37TbQ2^kBO(chgGWAdo-6ktgv&!9{wP*sSxJ=SI5P)#hys z(X_=5Y@JCD$hYkMItRQM9Zc_LW-J?(BV%-pI9&>Pj4wOht~T=Qx&`cvKG!a09Q@#p zUn}VY^Yh?x$laE>AE323S$J{w7C-zq9Wn~1LGC)JAlyiELSt#RxTgt=$hUJ0cTHfm zUGV6du_(G-j6(d!%w2Oy-OYD9389Ps@%%4Zg~j413niuQSy%&kEV}g|jq(SosY%hTe05C z?!qYboRD=G{XRrA>jHRhYaSRo;<-Qho%pELzK%uThZx0qOhC8XRJU4QqQe6Y?fGX) z?x}WoPp(92j3ZUgK42-{e9lqNo@bTwq*9aLHgbPH^P^Q!-0R9Zme^U+|L^~5APueSkMvJz$1 z5k-@`6!lvsDId;NHmF9qR+_nss2lUt8y5sELb+c2;wU(qxj?X+OSwC(_v@Ax@f*Qp zZNK@W*8_5r=dV{h;Dm%VICKM~|7p0xWVuD>_akn9(1ZpDh>9qW0KHKwTxq$vDm6$N zlsGj~QVLhd`X*o(hgzirM+t$}p^>__IhvO&=m1@=XavN^x>CPzTtQAwuXqC8y+|NY zOfUzc0kz_(t0yMmex(#=jkS(HcJIP(tY&YSU%xTg7lLg~3hMKvH*jPe%33yKPY&g~ z4F)6IxQ%x$5s-rO5%~`x@$`$|U-Xf<(mZIgkna4BFW;f{wF5U$`)Rh0|B@GW6l{L1 zvN5Qx!?YGP5IXzbz*Z2s8`~*oz93J7NPXEkC3oR%=E~tn=8^Y;n*b)apX8O!T)CF?<2#88FG%(np2$NVW zfu(>A<@$@;04t01qw9GRL4@PO0c4AL2+(K6CR1bG+}%(25&OBnp_p}ay@m_LzvoO% z9&N%WO_Y_CSh>G8C~qPV3t=?|as!rrcWWy$J==B?$9P=cJZeU=-gRt$sWYIl?U-9} zM{IdR?jQhpql}Mpbi*Z)|EkX6XU$g`hB^P9g{g_H5IQJn=8hJ1LMkzdPy|0i`#Av- z|3keaBL)VK+tGF%)~UTtu=EZ? z;prSP(UCCDavJtZn{L)^%0D&un)#Q*qG68DY=WwElH4+Y>m WV@BT1Q`8W8T}tv0xe}RI@BRmq1f^#H literal 0 HcmV?d00001 diff --git a/resources/media/channels/banner/serietvsubita.png b/resources/media/channels/banner/serietvsubita.png new file mode 100644 index 0000000000000000000000000000000000000000..62f21d1cd3d78a946e56a0ee41c4224bdddb7637 GIT binary patch literal 8182 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 W$I&pp+}6{J($O$fFIT;D|NjA1H%op1 literal 0 HcmV?d00001 diff --git a/resources/media/channels/banner/serietvu.png b/resources/media/channels/banner/serietvu.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1c09290667d51e861fd269b453041c45bf9302 GIT binary patch literal 8291 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 H>fHYTi6gU5 literal 0 HcmV?d00001 diff --git a/resources/media/channels/thumb/serietvu.png b/resources/media/channels/thumb/serietvu.png new file mode 100644 index 0000000000000000000000000000000000000000..3835135f2fdad10b13bd8b5a0e43007eddb1f30c GIT binary patch literal 6077 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 p{)1(+pX&eJCf4ZN&fddZ2QT70JBmzW|jtnEU_$ literal 0 HcmV?d00001 diff --git a/specials/news.py b/specials/news.py index 179fb422..734ddef1 100644 --- a/specials/news.py +++ b/specials/news.py @@ -396,6 +396,10 @@ def get_title(item): if not item.contentSeason: item.contentSeason = '1' title = "%s - %sx%s" % (title, item.contentSeason, str(item.contentEpisodeNumber).zfill(2)) + #4l3x87 - fix to add Sub-ITA in newest + if item.contentLanguage: + title+=" "+item.contentLanguage + elif item.contentTitle: # Si es una pelicula con el canal adaptado title = item.contentTitle From 18a2f8b20a1635cb583c699fd12995d76304c075 Mon Sep 17 00:00:00 2001 From: mac12m99 Date: Sat, 25 May 2019 16:36:49 +0200 Subject: [PATCH 10/12] disable fix for 9-1-1 for now --- core/scrapertools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/scrapertools.py b/core/scrapertools.py index d5691a20..422361d2 100644 --- a/core/scrapertools.py +++ b/core/scrapertools.py @@ -366,8 +366,8 @@ def get_season_and_episode(title): """ filename = "" # 4l3x87 - fix for series example 9-1-1 - original_title = title - title = title.replace('9-1-1','') + # original_title = title + # title = title.replace('9-1-1','') patrons = ["(\d+)\s*[x-]\s*(\d+)", "(\d+)\s*×\s*(\d+)", "(?:s|t)(\d+)e(\d+)", "(?:season|temp|stagione\w*)\s*(\d+)\s*(?:capitulo|epi|episode|episodio\w*)\s*(\d+)"] From faac91bd5ffbad48ffa6bc8b2284e60dbc8c7bd2 Mon Sep 17 00:00:00 2001 From: mac12m99 Date: Sat, 25 May 2019 17:35:34 +0200 Subject: [PATCH 11/12] ops --- core/scrapertools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/scrapertools.py b/core/scrapertools.py index 422361d2..a0e5b2a1 100644 --- a/core/scrapertools.py +++ b/core/scrapertools.py @@ -385,6 +385,6 @@ def get_season_and_episode(title): except: pass - logger.info("'" + original_title + "' -> '" + filename + "'") + logger.info("'" + title + "' -> '" + filename + "'") return filename From 98dd7655c5af62dbceba03364310bb40baef8d60 Mon Sep 17 00:00:00 2001 From: mac12m99 Date: Sat, 25 May 2019 23:53:55 +0200 Subject: [PATCH 12/12] add option to force videolibrary configuration --- platformcode/launcher.py | 2 +- platformcode/xbmc_videolibrary.py | 22 +++++++++++++++------- resources/settings.xml | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/platformcode/launcher.py b/platformcode/launcher.py index df7e000b..bc1e52a4 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -65,7 +65,7 @@ def run(item=None): item = Item(channel="channelselector", action="getmainlist", viewmode="movie") if not config.get_setting('show_once'): from platformcode import xbmc_videolibrary - xbmc_videolibrary.ask_set_content(1) + xbmc_videolibrary.ask_set_content(1, config.get_setting('videolibrary_kodi_force')) config.set_setting('show_once', True) logger.info(item.tostring()) diff --git a/platformcode/xbmc_videolibrary.py b/platformcode/xbmc_videolibrary.py index ecf46d27..848bbaf1 100644 --- a/platformcode/xbmc_videolibrary.py +++ b/platformcode/xbmc_videolibrary.py @@ -535,12 +535,17 @@ def set_content(content_type, silent=False): continuar = True msg_text = "" videolibrarypath = config.get_setting("videolibrarypath") + forced = config.get_setting('videolibrary_kodi_force') if content_type == 'movie': scraper = [config.get_localized_string(70093), config.get_localized_string(70096)] - seleccion = platformtools.dialog_select(config.get_localized_string(70094), scraper) + if forced: + seleccion = 0 # tmdb + else: + seleccion = platformtools.dialog_select(config.get_localized_string(70094), scraper) - # Instalar The Movie Database + + # Instalar The Movie Database if seleccion == -1 or seleccion == 0: if not xbmc.getCondVisibility('System.HasAddon(metadata.themoviedb.org)'): if not silent: @@ -560,7 +565,7 @@ def set_content(content_type, silent=False): continuar = (install and xbmc.getCondVisibility('System.HasAddon(metadata.themoviedb.org)')) if not continuar: msg_text = config.get_localized_string(60047) - if continuar: + if continuar and not forced: xbmc.executebuiltin('xbmc.addon.opensettings(metadata.themoviedb.org)', True) # Instalar Universal Movie Scraper @@ -584,12 +589,15 @@ def set_content(content_type, silent=False): continuar = (install and continuar) if not continuar: msg_text = config.get_localized_string(70097) - if continuar: + if continuar and not forced: xbmc.executebuiltin('xbmc.addon.opensettings(metadata.universal)', True) else: # SERIES scraper = [config.get_localized_string(70098), config.get_localized_string(70093)] - seleccion = platformtools.dialog_select(config.get_localized_string(70107), scraper) + if forced: + seleccion = 0 # tvdb + else: + seleccion = platformtools.dialog_select(config.get_localized_string(70107), scraper) # Instalar The TVDB if seleccion == -1 or seleccion == 0: @@ -611,7 +619,7 @@ def set_content(content_type, silent=False): continuar = (install and xbmc.getCondVisibility('System.HasAddon(metadata.tvdb.com)')) if not continuar: msg_text = config.get_localized_string(70099) - if continuar: + if continuar and not forced: xbmc.executebuiltin('xbmc.addon.opensettings(metadata.tvdb.com)', True) # Instalar The Movie Database @@ -636,7 +644,7 @@ def set_content(content_type, silent=False): continuar = (install and continuar) if not continuar: msg_text = config.get_localized_string(60047) - if continuar: + if continuar and not forced: xbmc.executebuiltin('xbmc.addon.opensettings(metadata.tvshows.themoviedb.org)', True) idPath = 0 diff --git a/resources/settings.xml b/resources/settings.xml index 3b1c9059..79ac5830 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -40,6 +40,7 @@ + @@ -145,5 +146,4 @@ - \ No newline at end of file