From e6423d135cb319ab8ede6b89ef0981801b71710c Mon Sep 17 00:00:00 2001 From: alfa-addon Date: Mon, 31 Jul 2017 12:03:08 -0400 Subject: [PATCH] deleted --- plugin.video.alfa/channels/txibitsoft.json | 43 - plugin.video.alfa/channels/txibitsoft.py | 1479 ----------------- .../media/channels/banner/txibitsoft.png | Bin 26285 -> 0 bytes 3 files changed, 1522 deletions(-) delete mode 100755 plugin.video.alfa/channels/txibitsoft.json delete mode 100755 plugin.video.alfa/channels/txibitsoft.py delete mode 100755 plugin.video.alfa/resources/media/channels/banner/txibitsoft.png diff --git a/plugin.video.alfa/channels/txibitsoft.json b/plugin.video.alfa/channels/txibitsoft.json deleted file mode 100755 index 0bd81b94..00000000 --- a/plugin.video.alfa/channels/txibitsoft.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "id": "txibitsoft", - "name": "Txibitsoft", - "active": true, - "adult": false, - "language": "es", - "banner": "txibitsoft.png", - "thumbnail": "http://s27.postimg.org/hx5ohryxf/tblogo.jpg", - "version": 1, - "changes": [ - { - "date": "07/12/2016", - "description": "Correciones código. Adaptación a Infoplus" - }, - { - "date": "04/04/2017", - "description": "Migración a Httptools.Algunas mejoras código" - }, - { - "date": "08/05/2017", - "description": "Workaround en error certificado ssl en algunos OS. Mejoras secciones de peliculas" - }, - { - "date": "28/06/2017", - "description": "Corrección código y algunas mejoras" - } - ], - "categories": [ - "torrent", - "tvshow", - "movie" - ], - "settings": [ - { - "label": "Incluir en busqueda global", - "type": "bool", - "id": "include_in_global_search", - "default": true, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/plugin.video.alfa/channels/txibitsoft.py b/plugin.video.alfa/channels/txibitsoft.py deleted file mode 100755 index 1732546b..00000000 --- a/plugin.video.alfa/channels/txibitsoft.py +++ /dev/null @@ -1,1479 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import re -import unicodedata -import urllib - -import xbmc -import xbmcgui -from core import config -from core import httptools -from core import logger -from core import scrapertools -from core.item import Item -from core.scrapertools import decodeHtmlentities as dhe - -ACTION_SHOW_FULLSCREEN = 36 -ACTION_GESTURE_SWIPE_LEFT = 511 -ACTION_SELECT_ITEM = 7 -ACTION_PREVIOUS_MENU = 10 -ACTION_MOVE_LEFT = 1 -ACTION_MOVE_RIGHT = 2 -ACTION_MOVE_DOWN = 4 -ACTION_MOVE_UP = 3 -OPTION_PANEL = 6 -OPTIONS_OK = 5 - -api_key = "2e2160006592024ba87ccdf78c28f49f" -api_fankey = "dffe90fba4d02c199ae7a9e71330c987" - -host = "http://www.txibitsoft.com/" - - -def mainlist(item): - logger.info() - - itemlist = [] - - itemlist.append(Item(channel=item.channel, title="[COLOR white][B]Peliculas[/B][/COLOR]", action="peliculas", - url="http://www.txibitsoft.com/torrents.php?procesar=1&categorias=%27Otras%20Peliculas%27&subcategoria=peliculas&pagina=1", - thumbnail="http://imgur.com/v6iC6Er.jpg", fanart="http://imgur.com/tJUbfeC.jpg")) - itemlist.append(Item(channel=item.channel, title="[COLOR orange][B]Alta Calidad[/B][/COLOR]", action="", url="", - thumbnail="http://imgur.com/KXhvWIc.jpg", fanart="http://imgur.com/4kTqOKE.jpg")) - - itemlist.append(Item(channel=item.channel, title=" [COLOR white][B]1080[/B][/COLOR]", action="peliculas", - url="http://www.txibitsoft.com/torrents.php?procesar=1&categorias='Cine%20Alta%20Definicion%20HD'&subcategoria=1080p&pagina=1", - thumbnail="http://imgur.com/KXhvWIc.jpg", fanart="http://imgur.com/4kTqOKE.jpg")) - itemlist.append(Item(channel=item.channel, title=" [COLOR white][B]720[/B][/COLOR]", action="peliculas", - url="http://www.txibitsoft.com/torrents.php?procesar=1&categorias=%27Peliculas%20x264%20MKV%27&pagina=1", - thumbnail="http://imgur.com/KXhvWIc.jpg", fanart="http://imgur.com/4kTqOKE.jpg")) - itemlist.append(Item(channel=item.channel, title=" [COLOR white][B]4k[/B][/COLOR]", action="peliculas", - url="http://www.txibitsoft.com/torrents.php?procesar=1&categorias=%27Cine%20Alta%20Definicion%20HD%27&subcategoria=4KULTRAHD&pagina=1", - thumbnail="http://imgur.com/KXhvWIc.jpg", fanart="http://imgur.com/4kTqOKE.jpg")) - title = "[COLOR white][B]Series[/B][/COLOR]" - itemlist.append( - Item(channel=item.channel, title=" [COLOR white][B]BdRemux[/B][/COLOR]", action="peliculas", - url="http://www.txibitsoft.com/torrents.php?procesar=1&categorias=%27Cine%20Alta%20Definicion%20HD%27&subcategoria=BdRemux%201080p&pagina=1", - thumbnail="http://imgur.com/KXhvWIc.jpg", fanart="http://imgur.com/4kTqOKE.jpg")) - - itemlist.append( - Item(channel=item.channel, title=" [COLOR white][B]FullBluRay[/B][/COLOR]", action="peliculas", - url="http://www.txibitsoft.com/torrents.php?procesar=1&categorias=%27Cine%20Alta%20Definicion%20HD%27&subcategoria=FULLBluRay&pagina=1", - thumbnail="http://imgur.com/KXhvWIc.jpg", fanart="http://imgur.com/4kTqOKE.jpg")) - - itemlist.append(Item(channel=item.channel, title="[COLOR white][B]Series[/B][/COLOR]", action="peliculas", - url="http://www.txibitsoft.com/torrents.php?procesar=1&categorias='Series'&pagina=1", - thumbnail="http://imgur.com/qTqX9nU.jpg", fanart="http://imgur.com/rwjtkYj.jpg")) - title = "[COLOR white][B]Buscar...[/B][/COLOR]" - itemlist.append( - Item(channel=item.channel, title=title, action="search", url="", fanart="http://imgur.com/wmkgcCC.jpg", - thumbnail="http://imgur.com/b9xCys8.png")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - - item.url = "http://www.txibitsoft.com/torrents.php?procesar=1&texto=%s" % (texto) - item.extra = "1" - try: - return buscador(item) - # Se captura la excepciÛn, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def buscador(item): - logger.info() - itemlist = [] - - # Descarga la página - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| |&", "", data) - item.url = re.sub(r"&", "", item.url) - # corrige la falta de imagen - data = re.sub(r'

', data) - - #

Imagen de Presentación
- - patron = '
' - patron += '.*?href=".*?>(\d)') - if float(next_page) > float(item.extra): - if next_page: - url = item.url + "&pagina=" + next_page - title = "siguiente>>" - title = title.replace(title, "[COLOR orange]" + title + "[/COLOR]") - extra = next_page - itemlist.append(Item(channel=item.channel, action="buscador", title=title, url=url, - thumbnail="http://s18.postimg.org/4l9172cqx/tbsiguiente.png", - fanart="http://s21.postimg.org/w0lgvyud3/tbfanartgeneral2.jpg", extra=extra, - folder=True)) - except: - pass - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - - # Descar
.*?>(.*?)') - except: - year = "" - - if sinopsis == "": - sinopsis = scrapertools.find_single_match(data, '
(.*?)
') - sinopsis = sinopsis.replace("

", "\n") - sinopsis = re.sub(r"\(FILMAFFINITY\)
", "", sinopsis) - try: - rating_filma = scrapertools.get_match(data, 'itemprop="ratingValue" content="(.*?)">') - except: - rating_filma = "Sin puntuacion" - print "lobeznito" - print rating_filma - - critica = "" - patron = '
(.*?)
.*?itemprop="author">(.*?)\s*(.*?)h="ID.*?.*?TV Series') - except: - pass - - try: - imdb_id = scrapertools.get_match(subdata_imdb, '
(.*?)<') - except: - ratintg_tvdb = "" - try: - rating = scrapertools.get_match(data, '"vote_average":(.*?),') - except: - - rating = "Sin puntuación" - - id_scraper = id_tmdb + "|" + "serie" + "|" + rating_filma + "|" + critica + "|" + rating + "|" + status # +"|"+emision - posterdb = scrapertools.find_single_match(data_tmdb, '"poster_path":(.*?)","popularity"') - - if "null" in posterdb: - posterdb = item.thumbnail - else: - posterdb = re.sub(r'\\|"', '', posterdb) - posterdb = "https://image.tmdb.org/t/p/original" + posterdb - if "null" in fan: - fanart = "http://imgur.com/21Oty9A.jpg" - else: - fanart = "https://image.tmdb.org/t/p/original" + fan - - item.extra = fanart - - url = "http://api.themoviedb.org/3/tv/" + id_tmdb + "/images?api_key=" + api_key - data = httptools.downloadpage(url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - - patron = '"backdrops".*?"file_path":".*?",.*?"file_path":"(.*?)",.*?"file_path":"(.*?)",.*?"file_path":"(.*?)"' - matches = re.compile(patron, re.DOTALL).findall(data) - - if len(matches) == 0: - patron = '"backdrops".*?"file_path":"(.*?)",.*?"file_path":"(.*?)",.*?"file_path":"(.*?)"' - matches = re.compile(patron, re.DOTALL).findall(data) - if len(matches) == 0: - fanart_info = item.extra - fanart_3 = "" - fanart_2 = item.extra - for fanart_info, fanart_3, fanart_2 in matches: - fanart_info = "https://image.tmdb.org/t/p/original" + fanart_info - fanart_3 = "https://image.tmdb.org/t/p/original" + fanart_3 - fanart_2 = "https://image.tmdb.org/t/p/original" + fanart_2 - if fanart == "http://imgur.com/21Oty9A.jpg": - fanart = fanart_info - url = "http://webservice.fanart.tv/v3/tv/" + id + "?api_key=" + api_fankey - data = httptools.downloadpage(url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = '"clearlogo":.*?"url": "([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - if '"tvbanner"' in data: - tvbanner = scrapertools.get_match(data, '"tvbanner":.*?"url": "([^"]+)"') - tfv = tvbanner - elif '"tvposter"' in data: - tvposter = scrapertools.get_match(data, '"tvposter":.*?"url": "([^"]+)"') - tfv = tvposter - else: - tfv = posterdb - if '"tvthumb"' in data: - tvthumb = scrapertools.get_match(data, '"tvthumb":.*?"url": "([^"]+)"') - if '"hdtvlogo"' in data: - hdtvlogo = scrapertools.get_match(data, '"hdtvlogo":.*?"url": "([^"]+)"') - if '"hdclearart"' in data: - hdtvclear = scrapertools.get_match(data, '"hdclearart":.*?"url": "([^"]+)"') - if len(matches) == 0: - if '"hdtvlogo"' in data: - if "showbackground" in data: - - if '"hdclearart"' in data: - thumbnail = hdtvlogo - extra = hdtvclear + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - else: - thumbnail = hdtvlogo - extra = thumbnail + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - itemlist.append(Item(channel=item.channel, title=item.title, action="findvideos", url=item.url, - server="torrent", thumbnail=thumbnail, fanart=item.extra, - category=category, extra=extra, show=show, folder=True)) - - - else: - if '"hdclearart"' in data: - thumbnail = hdtvlogo - extra = hdtvclear + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - else: - thumbnail = hdtvlogo - extra = thumbnail + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - itemlist.append(Item(channel=item.channel, title=item.title, action="findvideos", url=item.url, - server="torrent", thumbnail=thumbnail, fanart=item.extra, extra=extra, - show=show, category=category, folder=True)) - else: - extra = "" + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - itemlist.append(Item(channel=item.channel, title=item.title, action="findvideos", url=item.url, - server="torrent", thumbnail=posterdb, fanart=fanart, extra=extra, show=show, - category=category, folder=True)) - - for logo in matches: - if '"hdtvlogo"' in data: - thumbnail = hdtvlogo - elif not '"hdtvlogo"' in data: - if '"clearlogo"' in data: - thumbnail = logo - else: - thumbnail = item.thumbnail - if '"clearart"' in data: - clear = scrapertools.get_match(data, '"clearart":.*?"url": "([^"]+)"') - if "showbackground" in data: - - extra = clear + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - itemlist.append(Item(channel=item.channel, title=item.title, action="findvideos", url=item.url, - server="torrent", thumbnail=thumbnail, fanart=item.extra, extra=extra, - show=show, category=category, folder=True)) - else: - extra = clear + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - itemlist.append(Item(channel=item.channel, title=item.title, action="findvideos", url=item.url, - server="torrent", thumbnail=thumbnail, fanart=item.extra, extra=extra, - show=show, category=category, folder=True)) - - if "showbackground" in data: - - if '"clearart"' in data: - clear = scrapertools.get_match(data, '"clearart":.*?"url": "([^"]+)"') - extra = clear + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - else: - extra = logo + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - itemlist.append(Item(channel=item.channel, title=item.title, action="findvideos", url=item.url, - server="torrent", thumbnail=thumbnail, fanart=item.extra, extra=extra, - show=show, category=category, folder=True)) - - if not '"clearart"' in data and not '"showbackground"' in data: - if '"hdclearart"' in data: - extra = hdtvclear + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - else: - extra = thumbnail + "|" + year - show = fanart_2 + "|" + fanart_3 + "|" + sinopsis + "|" + title_fan + "|" + tfv + "|" + id_tmdb - itemlist.append(Item(channel=item.channel, title=item.title, action="findvideos", url=item.url, - server="torrent", thumbnail=thumbnail, fanart=item.extra, extra=extra, - show=show, category=category, folder=True)) - - title_info = "[COLOR turquoise]Info[/COLOR]" - if not "series" in item.url: - thumbnail = posterdb - title_info = "[COLOR khaki]Info[/COLOR]" - if "series" in item.url: - title_info = "[COLOR skyblue]Info[/COLOR]" - if '"tvposter"' in data: - thumbnail = scrapertools.get_match(data, '"tvposter":.*?"url": "([^"]+)"') - else: - thumbnail = posterdb - - if "tvbanner" in data: - category = tvbanner - else: - category = show - if '"tvthumb"' in data: - plot = item.plot + "|" + tvthumb - else: - plot = item.plot + "|" + item.thumbnail - if '"tvbanner"' in data: - plot = plot + "|" + tvbanner - elif '"tvthumb"' in data: - plot = plot + "|" + tvthumb - else: - plot = plot + "|" + item.thumbnail - else: - if '"moviethumb"' in data: - plot = item.plot + "|" + thumb - else: - plot = item.plot + "|" + posterdb - - if '"moviebanner"' in data: - plot = plot + "|" + banner - else: - if '"hdmovieclearart"' in data: - plot = plot + "|" + clear - - else: - plot = plot + "|" + posterdb - - id = id_scraper - - extra = extra + "|" + id + "|" + title.encode('utf8') - - itemlist.append( - Item(channel=item.channel, action="info", title=title_info, plot=plot, url=item.url, thumbnail=thumbnail, - fanart=fanart_info, extra=extra, category=category, show=show, viewmode="movie_with_plot", folder=False)) - - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - - if not "serie" in item.url: - thumbnail = item.category - else: - thumbnail = item.show.split("|")[4] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - - patron = '
.*?' - patron += 'alt="([^<]+)".*?' - patron += '

= 5 and int(check_rat_tmdba) < 8: - rating = "[COLOR springgreen][B]" + rating_tmdba_tvdb + "[/B][/COLOR]" - elif int(check_rat_tmdba) >= 8 or rating_tmdba_tvdb == 10: - rating = "[COLOR yellow][B]" + rating_tmdba_tvdb + "[/B][/COLOR]" - else: - rating = "[COLOR crimson][B]" + rating_tmdba_tvdb + "[/B][/COLOR]" - print "lolaymaue" - except: - rating = "[COLOR crimson][B]" + rating_tmdba_tvdb + "[/B][/COLOR]" - if "10." in rating: - rating = re.sub(r'10\.\d+', '10', rating) - try: - check_rat_filma = scrapertools.get_match(rating_filma, '(\d)') - print "paco" - print check_rat_filma - if int(check_rat_filma) >= 5 and int(check_rat_filma) < 8: - print "dios" - print check_rat_filma - rating_filma = "[COLOR springgreen][B]" + rating_filma + "[/B][/COLOR]" - elif int(check_rat_filma) >= 8: - - print check_rat_filma - rating_filma = "[COLOR yellow][B]" + rating_filma + "[/B][/COLOR]" - else: - rating_filma = "[COLOR crimson][B]" + rating_filma + "[/B][/COLOR]" - print "rojo??" - print check_rat_filma - except: - rating_filma = "[COLOR crimson][B]" + rating_filma + "[/B][/COLOR]" - - try: - if not "serie" in item.url: - url_plot = "http://api.themoviedb.org/3/movie/" + item.extra.split("|")[ - 1] + "?api_key=" + api_key + "&append_to_response=credits&language=es" - data_plot = scrapertools.cache_page(url_plot) - plot, tagline = scrapertools.find_single_match(data_plot, '"overview":"(.*?)",.*?"tagline":(".*?")') - if plot == "": - plot = item.show.split("|")[2] - - plot = "[COLOR moccasin][B]" + plot + "[/B][/COLOR]" - plot = re.sub(r"\\", "", plot) - - else: - plot = item.show.split("|")[2] - plot = "[COLOR moccasin][B]" + plot + "[/B][/COLOR]" - plot = re.sub(r"\\", "", plot) - - if item.extra.split("|")[7] != "": - tagline = item.extra.split("|")[7] - # tagline= re.sub(r',','.',tagline) - else: - tagline = "" - except: - title = "[COLOR red][B]LO SENTIMOS...[/B][/COLOR]" - plot = "Esta pelicula no tiene informacion..." - plot = plot.replace(plot, "[COLOR yellow][B]" + plot + "[/B][/COLOR]") - photo = "http://s6.postimg.org/nm3gk1xox/noinfosup2.png" - foto = "http://s6.postimg.org/ub7pb76c1/noinfo.png" - info = "" - - if "serie" in item.url: - check2 = "serie" - icon = "http://s6.postimg.org/hzcjag975/tvdb.png" - foto = item.show.split("|")[1] - if item.extra.split("|")[5] != "": - critica = item.extra.split("|")[5] - else: - critica = "Esta serie no tiene críticas..." - - photo = item.extra.split("|")[0].replace(" ", "%20") - try: - tagline = "[COLOR aquamarine][B]" + tagline + "[/B][/COLOR]" - except: - tagline = "" - - else: - critica = item.extra.split("|")[5] - if "%20" in critica: - critica = "No hay críticas" - icon = "http://imgur.com/SenkyxF.png" - photo = item.extra.split("|")[0].replace(" ", "%20") - foto = item.show.split("|")[1] - if foto == item.thumbnail: - foto = "" - - try: - if tagline == "\"\"": - tagline = " " - except: - tagline = " " - tagline = "[COLOR aquamarine][B]" + tagline + "[/B][/COLOR]" - check2 = "pelicula" - # Tambien te puede interesar - peliculas = [] - if "serie" in item.url: - - url_tpi = "http://api.themoviedb.org/3/tv/" + item.show.split("|")[ - 5] + "/recommendations?api_key=" + api_key + "&language=es" - data_tpi = scrapertools.cachePage(url_tpi) - tpi = scrapertools.find_multiple_matches(data_tpi, - 'id":(.*?),.*?"original_name":"(.*?)",.*?"poster_path":(.*?),"popularity"') - - else: - url_tpi = "http://api.themoviedb.org/3/movie/" + item.extra.split("|")[ - 1] + "/recommendations?api_key=" + api_key + "&language=es" - data_tpi = scrapertools.cachePage(url_tpi) - tpi = scrapertools.find_multiple_matches(data_tpi, - 'id":(.*?),.*?"original_title":"(.*?)",.*?"poster_path":(.*?),"popularity"') - - for idp, peli, thumb in tpi: - - thumb = re.sub(r'"|}', '', thumb) - if "null" in thumb: - thumb = "http://s6.postimg.org/tw1vhymj5/noposter.png" - else: - thumb = "https://image.tmdb.org/t/p/original" + thumb - peliculas.append([idp, peli, thumb]) - - check2 = check2.replace("pelicula", "movie").replace("serie", "tvshow") - infoLabels = {'title': title, 'plot': plot, 'thumbnail': photo, 'fanart': foto, 'tagline': tagline, - 'rating': rating} - item_info = item.clone(info=infoLabels, icon=icon, extra=id, rating=rating, rating_filma=rating_filma, - critica=critica, contentType=check2, thumb_busqueda="http://imgur.com/jProvTt.png") - from channels import infoplus - infoplus.start(item_info, peliculas) - - -def info_capitulos(item): - logger.info() - - url = "https://api.themoviedb.org/3/tv/" + item.show.split("|")[5] + "/season/" + item.extra.split("|")[ - 2] + "/episode/" + item.extra.split("|")[3] + "?api_key=" + api_key + "&language=es" - - if "/0" in url: - url = url.replace("/0", "/") - - data = httptools.downloadpage(url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - - patron = '],"name":"(.*?)","overview":"(.*?)".*?"still_path":(.*?),"vote_average":(\d+\.\d).*?,"' - matches = re.compile(patron, re.DOTALL).findall(data) - - if len(matches) == 0: - - url = "http://thetvdb.com/api/1D62F2F90030C444/series/" + item.category + "/default/" + item.extra.split("|")[ - 2] + "/" + item.extra.split("|")[3] + "/es.xml" - if "/0" in url: - url = url.replace("/0", "/") - data = httptools.downloadpage(url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - - patron = '.*?([^<]+).*?(.*?).*?(.*?)' - - matches = re.compile(patron, re.DOTALL).findall(data) - - if len(matches) == 0: - - title = "[COLOR red][B]LO SENTIMOS...[/B][/COLOR]" - plot = "Este capitulo no tiene informacion..." - plot = "[COLOR yellow][B]" + plot + "[/B][/COLOR]" - image = "http://s6.postimg.org/ub7pb76c1/noinfo.png" - foto = "http://s6.postimg.org/nm3gk1xox/noinfosup2.png" - rating = "" - - - else: - - for name_epi, info, rating in matches: - if "episodes" in data: - foto = scrapertools.get_match(data, '.*?(.*?)') - fanart = "http://thetvdb.com/banners/" + foto - else: - fanart = "http://imgur.com/ZiEAVOD.png" - plot = info - plot = "[COLOR peachpuff][B]" + plot + "[/B][/COLOR]" - title = name_epi.upper() - title = "[COLOR bisque][B]" + title + "[/B][/COLOR]" - image = fanart - foto = item.extra.split("|")[0] - if not ".png" in foto: - foto = "http://imgur.com/PXJEqBn.png" - foto = re.sub(r'\(.*?\)|" "|" "', '', foto) - foto = re.sub(r' ', '', foto) - try: - - check_rating = scrapertools.get_match(rating, '(\d+).') - - if int(check_rating) >= 5 and int(check_rating) < 8: - rating = "Puntuación " + "[COLOR springgreen][B]" + rating + "[/B][/COLOR]" - elif int(check_rating) >= 8 and int(check_rating) < 10: - rating = "Puntuación " + "[COLOR yellow][B]" + rating + "[/B][/COLOR]" - elif int(check_rating) == 10: - rating = "Puntuación " + "[COLOR orangered][B]" + rating + "[/B][/COLOR]" - else: - rating = "Puntuación " + "[COLOR crimson][B]" + rating + "[/B][/COLOR]" - - except: - rating = "Puntuación " + "[COLOR crimson][B]" + rating + "[/B][/COLOR]" - if "10." in rating: - rating = re.sub(r'10\.\d+', '10', rating) - else: - for name_epi, info, fanart, rating in matches: - if info == "" or info == "\\": - info = "Sin informacion del capítulo aún..." - plot = info - plot = re.sub(r'/n', '', plot) - plot = "[COLOR peachpuff][B]" + plot + "[/B][/COLOR]" - title = name_epi.upper() - title = "[COLOR bisque][B]" + title + "[/B][/COLOR]" - image = fanart - image = re.sub(r'"|}', '', image) - if "null" in image: - image = "http://imgur.com/ZiEAVOD.png" - else: - image = "https://image.tmdb.org/t/p/original" + image - foto = item.extra.split("|")[0] - if not ".png" in foto: - foto = "http://imgur.com/PXJEqBn.png" - foto = re.sub(r'\(.*?\)|" "|" "', '', foto) - foto = re.sub(r' ', '', foto) - try: - - check_rating = scrapertools.get_match(rating, '(\d+).') - - if int(check_rating) >= 5 and int(check_rating) < 8: - rating = "Puntuación " + "[COLOR springgreen][B]" + rating + "[/B][/COLOR]" - elif int(check_rating) >= 8 and int(check_rating) < 10: - rating = "Puntuación " + "[COLOR yellow][B]" + rating + "[/B][/COLOR]" - elif int(check_rating) == 10: - rating = "Puntuación " + "[COLOR orangered][B]" + rating + "[/B][/COLOR]" - else: - rating = "Puntuación " + "[COLOR crimson][B]" + rating + "[/B][/COLOR]" - - except: - rating = "Puntuación " + "[COLOR crimson][B]" + rating + "[/B][/COLOR]" - if "10." in rating: - rating = re.sub(r'10\.\d+', '10', rating) - ventana = TextBox2(title=title, plot=plot, thumbnail=image, fanart=foto, rating=rating) - ventana.doModal() - - -class TextBox2(xbmcgui.WindowDialog): - """ Create a skinned textbox window """ - - def __init__(self, *args, **kwargs): - self.getTitle = kwargs.get('title') - self.getPlot = kwargs.get('plot') - self.getThumbnail = kwargs.get('thumbnail') - self.getFanart = kwargs.get('fanart') - self.getRating = kwargs.get('rating') - - self.background = xbmcgui.ControlImage(70, 20, 1150, 630, 'http://imgur.com/H2hMPTP.jpg') - self.title = xbmcgui.ControlTextBox(120, 60, 430, 50) - self.rating = xbmcgui.ControlTextBox(145, 112, 1030, 45) - self.plot = xbmcgui.ControlTextBox(120, 150, 1056, 100) - self.thumbnail = xbmcgui.ControlImage(120, 300, 1056, 300, self.getThumbnail) - self.fanart = xbmcgui.ControlImage(780, 43, 390, 100, self.getFanart) - - self.addControl(self.background) - self.background.setAnimations( - [('conditional', 'effect=slide start=1000% end=0% time=1500 condition=true tween=bounce',), - ('WindowClose', 'effect=slide delay=800 start=0% end=1000% time=800 condition=true',)]) - self.addControl(self.thumbnail) - self.thumbnail.setAnimations([('conditional', - 'effect=zoom start=0% end=100% delay=2700 time=1500 condition=true tween=elastic easing=inout',), - ('WindowClose', 'effect=slide end=0,700% time=300 condition=true',)]) - self.addControl(self.plot) - self.plot.setAnimations( - [('conditional', 'effect=zoom delay=2000 center=auto start=0 end=100 time=800 condition=true ',), ( - 'conditional', - 'effect=rotate delay=2000 center=auto aceleration=6000 start=0% end=360% time=800 condition=true',), - ('WindowClose', 'effect=zoom center=auto start=100% end=-0% time=600 condition=true',)]) - self.addControl(self.fanart) - self.fanart.setAnimations( - [('WindowOpen', 'effect=slide start=0,-700 delay=1000 time=2500 tween=bounce condition=true',), ( - 'conditional', - 'effect=rotate center=auto start=0% end=360% delay=3000 time=2500 tween=bounce condition=true',), - ('WindowClose', 'effect=slide end=0,-700% time=1000 condition=true',)]) - self.addControl(self.title) - self.title.setText(self.getTitle) - self.title.setAnimations( - [('conditional', 'effect=slide start=-1500% end=0% delay=1000 time=2000 condition=true tween=elastic',), - ('WindowClose', 'effect=slide start=0% end=-1500% time=800 condition=true',)]) - self.addControl(self.rating) - self.rating.setText(self.getRating) - self.rating.setAnimations( - [('conditional', 'effect=fade start=0% end=100% delay=3000 time=1500 condition=true',), - ('WindowClose', 'effect=slide end=0,-700% time=600 condition=true',)]) - xbmc.sleep(200) - - try: - self.plot.autoScroll(7000, 6000, 30000) - except: - - xbmc.executebuiltin( - 'Notification([COLOR red][B]Actualiza Kodi a su última versión[/B][/COLOR], [COLOR skyblue]para mejor info[/COLOR],8000,"https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/kodi-icon.png")') - self.plot.setText(self.getPlot) - - def get(self): - self.show() - - def onAction(self, action): - if action == ACTION_PREVIOUS_MENU or action.getId() == ACTION_GESTURE_SWIPE_LEFT or action == 110 or action == 92: - self.close() - - -def test(): - return True - - -def browser(url): - import mechanize - - # Utilizamos Browser mechanize para saltar problemas con la busqueda en bing - br = mechanize.Browser() - # Browser options - br.set_handle_equiv(False) - br.set_handle_gzip(True) - br.set_handle_redirect(True) - br.set_handle_referer(False) - br.set_handle_robots(False) - # Follows refresh 0 but not hangs on refresh > 0 - br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) - # Want debugging messages? - # br.set_debug_http(True) - # br.set_debug_redirects(True) - # br.set_debug_responses(True) - - # User-Agent (this is cheating, ok?) - br.addheaders = [('User-agent', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/7.1.7 Safari/537.85.16')] - # br.addheaders =[('Cookie','SRCHD=AF=QBRE; domain=.bing.com; expires=25 de febrero de 2018 13:00:28 GMT+1; MUIDB=3B942052D204686335322894D3086911; domain=www.bing.com;expires=24 de febrero de 2018 13:00:28 GMT+1')] - # Open some site, let's pick a random one, the first that pops in mind - r = br.open(url) - response = r.read() - print response - if "img,divreturn" in response: - r = br.open("http://ssl-proxy.my-addr.org/myaddrproxy.php/" + url) - print "prooooxy" - response = r.read() - - return response - - -def tokenize(text, match=re.compile("([idel])|(\d+):|(-?\d+)").match): - i = 0 - while i < len(text): - m = match(text, i) - s = m.group(m.lastindex) - i = m.end() - if m.lastindex == 2: - yield "s" - yield text[i:i + int(s)] - i = i + int(s) - else: - yield s - - -def decode_item(next, token): - if token == "i": - # integer: "i" value "e" - data = int(next()) - if next() != "e": - raise ValueError - elif token == "s": - # string: "s" value (virtual tokens) - data = next() - elif token == "l" or token == "d": - # container: "l" (or "d") values "e" - data = [] - tok = next() - while tok != "e": - data.append(decode_item(next, tok)) - tok = next() - if token == "d": - data = dict(zip(data[0::2], data[1::2])) - else: - raise ValueError - return data - - -def decode(text): - try: - src = tokenize(text) - data = decode_item(src.next, src.next()) - for token in src: # look for more tokens - raise SyntaxError("trailing junk") - except (AttributeError, ValueError, StopIteration): - try: - data = data - except: - data = src - - return data - - -def convert_size(size): - import math - if (size == 0): - return '0B' - size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") - i = int(math.floor(math.log(size, 1024))) - p = math.pow(1024, i) - s = round(size / p, 2) - return '%s %s' % (s, size_name[i]) diff --git a/plugin.video.alfa/resources/media/channels/banner/txibitsoft.png b/plugin.video.alfa/resources/media/channels/banner/txibitsoft.png deleted file mode 100755 index e92949efa724382c509bb56473dd5d0b29497841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26285 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