diff --git a/channels/altadefinizione01_link.json b/channels/altadefinizione01_link.json index 47cb3ac3..a60ab421 100644 --- a/channels/altadefinizione01_link.json +++ b/channels/altadefinizione01_link.json @@ -4,15 +4,23 @@ "active": true, "adult": false, "language": ["ita"], - "fanart": "", - "thumbnail": "", - "banner": "http://altadefinizione01.link/templates/Dark/img/logonyy.png", + "fanart": "https://altadefinizione01.estate/templates/Dark/img/nlogo.png", + "thumbnail": "https://altadefinizione01.estate/templates/Dark/img/nlogo.png", + "banner": "https://altadefinizione01.estate/templates/Dark/img/nlogo.png", "fix" : "reimpostato url e modificato file per KOD", "change_date": "2019-30-04", "categories": [ "movie" ], "settings": [ + { + "id": "channel_host", + "type": "text", + "label": "Host del canale", + "default": "https://altadefinizione01.estate/", + "enabled": true, + "visible": true + }, { "id": "modo_grafico", "type": "bool", diff --git a/channels/altadefinizione01_link.py b/channels/altadefinizione01_link.py index 7e690035..55f4f1c5 100644 --- a/channels/altadefinizione01_link.py +++ b/channels/altadefinizione01_link.py @@ -3,14 +3,13 @@ # -*- Creato per Alfa-addon -*- # -*- e adattato for KOD -*- # -*- By Greko -*- -# -*- last change: 04/05/2019 +# -*- last change: 26/05/2019 - -from channelselector import get_thumb -from core import httptools, scrapertools, servertools, tmdb, support +import channelselector +from specials import autoplay +from core import servertools, support, jsontools from core.item import Item from platformcode import config, logger -from specials import autoplay, filtertools __channel__ = "altadefinizione01_link" @@ -18,21 +17,19 @@ __channel__ = "altadefinizione01_link" #host = "http://altadefinizione01.art/" # aggiornato al 22 marzo 2019 #host = "https://altadefinizione01.network/" #aggiornato al 22 marzo 2019 #host = "http://altadefinizione01.date/" #aggiornato al 3 maggio 2019 -host = "https://altadefinizione01.voto/" #aggiornato al 3 maggio 2019 +#host = "https://altadefinizione01.voto/" #aggiornato al 3 maggio 2019 +#host = "https://altadefinizione01.estate/" # aggiornato al 23 maggio 2019 # ======== def per utility INIZIO ============================ - + +list_servers = ['supervideo', 'streamcherry','rapidvideo', 'streamango', 'openload'] +list_quality = ['default'] + +host = config.get_setting("channel_host", __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']] - -IDIOMAS = {'Italiano': 'IT'} -list_language = IDIOMAS.values() -list_servers = ['openload', 'streamcherry','rapidvideo', 'streamango', 'supervideo'] -list_quality = ['default'] - +headers = [['Referer', host]] # =========== home menu =================== def mainlist(item): @@ -41,164 +38,88 @@ def mainlist(item): :param item: :return: itemlist [] """ - logger.info("%s mainlist log: %s" % (__channel__, item)) + support.log() itemlist = [] - autoplay.init(item.channel, list_servers, list_quality) # Menu Principale - support.menu(itemlist, 'Film Ultimi Arrivi bold', 'peliculas', host)#, args='film') - support.menu(itemlist, 'Genere', 'categorie', host, args=['','genres']) - support.menu(itemlist, 'Per anno submenu', 'categorie', host, args=['Film per Anno','years']) - support.menu(itemlist, 'Per qualità submenu', 'categorie', host, args=['Film per qualità','quality']) + support.menu(itemlist, 'Novità bold', 'peliculas', host) + support.menu(itemlist, 'Film per Genere', 'genres', host, args='genres') + support.menu(itemlist, 'Film per Anno submenu', 'genres', host, args='years') + support.menu(itemlist, 'Film per Qualità submenu', 'genres', host, args='quality') support.menu(itemlist, 'Al Cinema bold', 'peliculas', host+'film-del-cinema') - support.menu(itemlist, 'Popolari bold', 'categorie', host+'piu-visti.html', args=['popular','']) - support.menu(itemlist, 'Mi sento fortunato bold', 'categorie', host, args=['fortunato','lucky']) + support.menu(itemlist, 'Popolari bold', 'peliculas', host+'piu-visti.html') + support.menu(itemlist, 'Mi sento fortunato bold', 'genres', host, args='lucky') support.menu(itemlist, 'Sub-ITA bold', 'peliculas', host+'film-sub-ita/') support.menu(itemlist, 'Cerca film submenu', 'search', host) + # per autoplay + autoplay.init(item.channel, list_servers, list_quality) autoplay.show_option(item.channel, itemlist) + + itemlist.append( + Item(channel='setting', + action="channel_config", + title=support.typo("Configurazione Canale color lime"), + config=item.channel, + folder=False, + thumbnail=channelselector.get_thumb('setting_0.png')) + ) return itemlist -# ======== def in ordine di menu =========================== +# ======== def in ordine di action dal menu =========================== def peliculas(item): - logger.info("%s mainlist peliculas log: %s" % (__channel__, item)) + support.log itemlist = [] - # scarico la pagina - data = httptools.downloadpage(item.url, headers=headers).data - # da qui fare le opportuni modifiche - patron = 'class="innerImage">.*?href="([^"]+)".*?src="([^"]+)".*?'\ - 'class="ml-item-title">([^"]+)'\ - '(.*?)<.*?class="ml-item-label">.*?class="ml-item-label">(.*?).*?href="([^"]+)".*?src="([^"]+)"'\ + '.*?class="ml-item-title">([^<]+) (\d{4}) <'\ + '.*?class="ml-item-label">.*?class="ml-item-label ml-item-label-.+?"> '\ + '(.+?) .*?class="ml-item-label"> (.+?) \d ') - + patronNext = '\d ' + + itemlist = support.scrape(item, patron=patron, listGroups=listGroups, + headers= headers, patronNext=patronNext, + action='findvideos') + return itemlist # =========== def pagina categorie ====================================== -def categorie(item): - logger.info("%s mainlist categorie log: %s" % (__channel__, item)) +def genres(item): + support.log itemlist = [] - # scarico la pagina - data = httptools.downloadpage(item.url, headers=headers).data + #data = httptools.downloadpage(item.url, headers=headers).data + action = 'peliculas' + if item.args == 'genres': + bloque = r'' + elif item.args == 'years': + bloque = r'' + elif item.args == 'quality': + bloque = r'' + elif item.args == 'lucky': # sono i titoli random nella pagina, cambiano 1 volta al dì + bloque = r'FILM RANDOM.*?class="listSubCat">(.*?)' + action = 'findvideos' + + patron = r'
  • (.*?)<' - # da qui fare le opportuni modifiche - if item.args[1] == 'genres': - bloque = scrapertools.find_single_match(data, '') - elif item.args[1] == 'years': - bloque = scrapertools.find_single_match(data, '') - elif item.args[1] == 'quality': - bloque = scrapertools.find_single_match(data, '') - elif item.args[1] == 'lucky': # sono i titoli random nella pagina, alcuni rimandano solo a server a pagamento - bloque = scrapertools.find_single_match(data, 'FILM RANDOM.*?class="listSubCat">(.*?)') - patron = '
  • (.*?)<' - matches = scrapertools.find_multiple_matches(bloque, patron) - - if item.args[1] == 'lucky': - bloque = scrapertools.find_single_match(data, 'FILM RANDOM.*?class="listSubCat">(.*?)') - patron = '
  • (.*?)<' - matches = scrapertools.find_multiple_matches(bloque, patron) - - for scrapurl, scraptitle in sorted(matches): - if item.args[1] != 'lucky': - url = host+scrapurl - action="peliculas" - else: - url = scrapurl - action = "findvideos_film" - itemlist.append(Item( - channel=item.channel, - action=action, - title = scraptitle, - url=url, - thumbnail=get_thumb(scraptitle, auto = True), - Folder = True, - )) - - return itemlist - - -# =========== def pagina del film con i server per verderlo ============= -# da sistemare che ne da solo 1 come risultato - -def findvideos(item): - logger.info("%s mainlist findvideos_film log: %s" % (__channel__, item)) - itemlist = [] - # scarico la pagina - #data = scrapertools.cache_page(item.url) #non funziona più? - data = httptools.downloadpage(item.url, headers=headers).data - # da qui fare le opportuni modifiche - patron = '' - matches = scrapertools.find_multiple_matches(data, patron) - #logger.info("altadefinizione01_linkMATCHES: %s " % matches) - for scrapedurl in matches: - - try: - itemlist = servertools.find_video_items(data=data) - - for videoitem in itemlist: - logger.info("Videoitemlist2: %s" % videoitem) - videoitem.title = "%s [%s]" % (item.contentTitle, videoitem.title)#"[%s] %s" % (videoitem.server, item.title) #"[%s]" % (videoitem.title) - videoitem.show = item.show - videoitem.contentTitle = item.contentTitle - videoitem.contentType = item.contentType - videoitem.channel = item.channel - videoitem.year = item.infoLabels['year'] - videoitem.infoLabels['plot'] = item.infoLabels['plot'] - except AttributeError: - logger.error("data doesn't contain expected URL") - - # Controlla se i link sono validi - if checklinks: - itemlist = servertools.check_list_links(itemlist, checklinks_number) - - # Requerido para FilterTools - itemlist = filtertools.get_links(itemlist, item, list_language) - - # Requerido para AutoPlay - autoplay.start(itemlist, item) - - # Aggiunge alla videoteca - if item.extra != 'findvideos' and item.extra != "library" and config.get_videolibrary_support() and len(itemlist) != 0 : - support.videolibrary(itemlist, item) + listGroups = ['url','title'] + itemlist = support.scrape(item, patron=patron, listGroups=listGroups, + headers= headers, patron_block = bloque, + action=action) return itemlist # =========== def per cercare film/serietv ============= #host+/index.php?do=search&story=avatar&subaction=search def search(item, text): - logger.info("%s mainlist search log: %s %s" % (__channel__, item, text)) + support.log() itemlist = [] text = text.replace(" ", "+") item.url = host+"/index.php?do=search&story=%s&subaction=search" % (text) - #item.extra = "search" try: return peliculas(item) # Se captura la excepciÛn, para no interrumpir al buscador global si un canal falla @@ -211,20 +132,18 @@ def search(item, text): # =========== def per le novità nel menu principale ============= def newest(categoria): - logger.info("%s mainlist search log: %s" % (__channel__, categoria)) + support.log(categoria) itemlist = [] item = Item() - #item.extra = 'film' try: - if categoria == "film": + if categoria == "peliculas": item.url = host item.action = "peliculas" itemlist = peliculas(item) if itemlist[-1].action == "peliculas": itemlist.pop() - - # Continua la ricerca in caso di errore + # Continua la ricerca in caso di errore except: import sys for line in sys.exc_info(): @@ -232,3 +151,18 @@ def newest(categoria): return [] return itemlist + +def findvideos(item): + support.log() + + itemlist = support.server(item, headers=headers) + + # Requerido para FilterTools + # itemlist = filtertools.get_links(itemlist, item, list_language) + + # Requerido para AutoPlay + autoplay.start(itemlist, item) + + support.videolibrary(itemlist, item, 'color kod') + + return itemlist diff --git a/channels/animeworld.json b/channels/animeworld.json index dfcee138..9ebf73f3 100644 --- a/channels/animeworld.json +++ b/channels/animeworld.json @@ -4,9 +4,18 @@ "active": true, "adult": false, "language": ["ita"], - "thumbnail": "https://cdn.animeworld.it/static/images/general/logoaw.png", - "categories": ["anime"], + "thumbnail": "animeworld.png", + "banner": "animeworld.png", + "categories": ["anime"], "settings": [ + { + "id": "channel_host", + "type": "text", + "label": "Host del canale", + "default": "https://www.animeworld.it", + "enabled": true, + "visible": true + }, { "id": "include_in_global_search", "type": "bool", diff --git a/channels/animeworld.py b/channels/animeworld.py index 4a1586be..ee8d71cf 100644 --- a/channels/animeworld.py +++ b/channels/animeworld.py @@ -3,16 +3,20 @@ # Canale per animeworld # ---------------------------------------------------------- import re +import time +import urllib + import urlparse +import channelselector from channelselector import thumb -from core import httptools, scrapertoolsV2, servertools, tmdb, support +from core import httptools, scrapertoolsV2, servertools, tmdb, support, jsontools from core.item import Item from platformcode import logger, config from specials import autoplay, autorenumber -host = "https://www.animeworld.it" - +__channel__ = 'animeworld' +host = config.get_setting("channel_host", __channel__) headers = [['Referer', host]] IDIOMAS = {'Italiano': 'Italiano'} @@ -25,21 +29,51 @@ checklinks_number = config.get_setting('checklinks_number', 'animeworld') def mainlist(item): - logger.info("[animeworld.py] mainlist") + logger.info(__channel__+" mainlist") itemlist =[] - support.menu(itemlist, 'Anime ITA submenu bold', 'build_menu', host+'/filter?language[]=1') - support.menu(itemlist, 'Anime SUB submenu bold', 'build_menu', host+'/filter?language[]=0') - support.menu(itemlist, 'Anime A-Z sub', 'alfabetico', host+'/az-list') - support.menu(itemlist, 'Anime - Ultimi Aggiunti', 'alfabetico', host+'/newest') - support.menu(itemlist, 'Anime - Ultimi Episodi', 'alfabetico', host+'/newest') + support.menu(itemlist, 'Anime bold', 'lista_anime', host+'/az-list') + support.menu(itemlist, 'ITA submenu', 'build_menu', host+'/filter?language[]=1', args=["anime"]) + support.menu(itemlist, 'Sub-ITA submenu', 'build_menu', host+'/filter?language[]=0', args=["anime"]) + support.menu(itemlist, 'Archivio A-Z submenu', 'alfabetico', host+'/az-list', args=["tvshow","a-z"]) + support.menu(itemlist, 'In corso submenu', 'video', host+'/', args=["in sala"]) + support.menu(itemlist, 'Generi submenu', 'generi', host+'/') + support.menu(itemlist, 'Ultimi Aggiunti bold', 'video', host+'/newest', args=["anime"]) + support.menu(itemlist, 'Ultimi Episodi bold', 'video', host+'/updated', args=["novita'"]) support.menu(itemlist, 'Cerca...', 'search') autoplay.init(item.channel, list_servers, list_quality) autoplay.show_option(item.channel, itemlist) + itemlist.append( + Item(channel='setting', + action="channel_config", + title=support.typo("Configurazione Canale color lime"), + config=item.channel, + folder=False, + thumbnail=channelselector.get_thumb('setting_0.png')) + ) + + return itemlist + +# Crea menu dei generi ================================================= + +def generi(item): + support.log(item.channel+" generi") + itemlist = [] + patron_block = r'\sGeneri\s*' + patron = r'' + matches = support.match(item,patron, patron_block, headers)[0] + + for scrapedurl, scrapedtitle in matches: + itemlist.append(Item( + channel=item.channel, + action="video", + title=scrapedtitle, + url="%s%s" % (host,scrapedurl))) + return itemlist @@ -103,7 +137,7 @@ def build_sub_menu(item): # Novità ====================================================== def newest(categoria): - logger.info("[animeworld.py] newest") + logger.info(__channel__+" newest") itemlist = [] item = Item() try: @@ -144,7 +178,7 @@ def search(item, texto): # Lista A-Z ==================================================== def alfabetico(item): - logger.info("[animeworld.py] alfabetico") + logger.info(__channel__+" alfabetico") itemlist = [] data = httptools.downloadpage(item.url).data @@ -170,7 +204,7 @@ def alfabetico(item): return itemlist def lista_anime(item): - logger.info("[animeworld.py] lista_anime") + logger.info(__channel__+" lista_anime") itemlist = [] @@ -202,7 +236,7 @@ def lista_anime(item): itemlist.append( Item(channel=item.channel, extra=item.extra, - contentType="tvshow", + contentType="episode", action="episodios", text_color="azure", title=title, @@ -217,23 +251,24 @@ def lista_anime(item): autorenumber.renumber(itemlist) # Next page - next_page = scrapertoolsV2.find_single_match(data, '
  • ' - matches = re.compile(patron, re.DOTALL).findall(blocco) + matches = support.match(item, r'
  • \s*]+>([^<]+)
  • ', r'(.*?)', headers)[0] for scrapedurl, scrapedtitle in matches: itemlist.append( Item(channel=item.channel, action="lista_serie", title=scrapedtitle, - contentType="tv", + contentType="tvshow", url="".join([host, scrapedurl]), thumbnail=item.thumbnail, extra="tv", @@ -188,66 +220,93 @@ def categorie(item): # ---------------------------------------------------------------------------------------------------------------- def lista_serie(item): - logger.info("[GuardaSerieClick.py]==> lista_serie") + support.log(item.channel+" lista_serie") itemlist = [] - data = httptools.downloadpage(item.url, headers=headers).data + # data = httptools.downloadpage(item.url, headers=headers).data + # + # patron = r'\s*[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)

    ' + # blocco = scrapertools.find_single_match(data, + # r'(.*?)') + # matches = re.compile(patron, re.DOTALL).findall(blocco) + patron_block = r'(.*?)' patron = r'\s*[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)

    ' - blocco = scrapertools.find_single_match(data, - r'(.*?)') - matches = re.compile(patron, re.DOTALL).findall(blocco) + + matches, data = support.match(item, patron, patron_block, headers) + for scrapedurl, scrapedimg, scrapedtitle in matches: - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle).strip() - itemlist.append( - Item(channel=item.channel, - action="episodi", - title=scrapedtitle, - fulltitle=scrapedtitle, - url=scrapedurl, - thumbnail=scrapedimg, - extra=item.extra, - show=scrapedtitle, - folder=True)) + scrapedtitle = cleantitle(scrapedtitle) + + if scrapedtitle not in ['DMCA','Contatti','Lista di tutte le serie tv']: + itemlist.append( + Item(channel=item.channel, + action="episodios", + contentType="episode", + title=scrapedtitle, + fulltitle=scrapedtitle, + url=scrapedurl, + thumbnail=scrapedimg, + extra=item.extra, + show=scrapedtitle, + folder=True)) + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + + support.nextPage(itemlist,item,data,r" episodi") +def episodios(item): + support.log(item.channel+" episodios") itemlist = [] - data = httptools.downloadpage(item.url, headers=headers).data + # data = httptools.downloadpage(item.url, headers=headers).data - patron = r'([^<]+)<\/div>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>' - patron += r'[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*' - patron += r']+>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedtitle, scrapedurl, scrapedthumbnail in matches: - scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle).strip() - itemlist.append( - Item(channel=item.channel, - action="findvideos", - title=scrapedtitle, - fulltitle=scrapedtitle, - url=scrapedurl, - contentType="episode", - thumbnail=scrapedthumbnail, - folder=True)) + patron = r'\s*([^<]+)<\/div>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)?[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>]+>([^<]+)<[^>]+>[^>]+>[^>]+>' + patron += r'[^<]+[^"]+".*?serie="([^"]+)".*?stag="([0-9]*)".*?ep="([0-9]*)"\s*' + patron += r'.*?embed="([^"]+)"\s*.*?embed2="([^"]+)?"\s*.*?embed3="([^"]+)?"?[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*' + patron += r'(?:]+>|]+>)?' + # matches = re.compile(patron, re.DOTALL).findall(data) - if config.get_videolibrary_support() and len(itemlist) != 0: + # logger.debug(matches) + + matches = support.match(item, patron, headers=headers)[0] + + + for scrapedtitle, scrapedepisodetitle, scrapedplot, scrapedserie, scrapedseason, scrapedepisode, scrapedurl, scrapedurl2,scrapedurl3,scrapedthumbnail,scrapedthumbnail2 in matches: + scrapedtitle = cleantitle(scrapedtitle) + scrapedepisode = scrapedepisode.zfill(2) + scrapedepisodetitle = cleantitle(scrapedepisodetitle) + title = str("%sx%s %s" % (scrapedseason, scrapedepisode, scrapedepisodetitle)).strip() + if 'SUB-ITA' in scrapedtitle: + title +=" Sub-ITA" + + infoLabels = {} + infoLabels['season'] = scrapedseason + infoLabels['episode'] = scrapedepisode itemlist.append( - Item(channel=item.channel, - title="[COLOR lightblue]%s[/COLOR]" % config.get_localized_string(30161), - url=item.url, - action="add_serie_to_library", - extra="episodi", - show=item.show)) + Item(channel=item.channel, + action="findvideos", + title=title, + fulltitle=scrapedtitle, + url=scrapedurl+"\r\n"+scrapedurl2+"\r\n"+scrapedurl3, + contentType="episode", + plot=scrapedplot, + contentSerieName=scrapedserie, + contentLanguage='Sub-ITA' if 'Sub-ITA' in title else '', + infoLabels=infoLabels, + thumbnail=scrapedthumbnail2 if scrapedthumbnail2 != '' else scrapedthumbnail, + folder=True)) + + tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) + + support.videolibrary(itemlist, item) return itemlist @@ -256,20 +315,12 @@ def episodi(item): # ---------------------------------------------------------------------------------------------------------------- def findepvideos(item): - logger.info("[GuardaSerieClick.py]==> findepvideos") - + support.log(item.channel+" findepvideos") data = httptools.downloadpage(item.url, headers=headers).data - data = scrapertools.find_single_match(data, item.extra) - 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.capitalize(), 'orange'), item.title]) - videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.thumbnail - videoitem.show = item.show - videoitem.plot = item.plot - videoitem.channel = item.channel + matches = scrapertools.find_multiple_matches(data, item.extra) + data = "\r\n".join(matches[0]) + item.contentType = 'movie' + itemlist = support.server(item, data=data) return itemlist @@ -278,17 +329,8 @@ def findepvideos(item): # ---------------------------------------------------------------------------------------------------------------- def findvideos(item): - logger.info("[GuardaSerieClick.py]==> findvideos") - - itemlist = servertools.find_video_items(data=item.url) - - for videoitem in itemlist: - server = re.sub(r'[-\[\]\s]+', '', videoitem.title).capitalize() - videoitem.title = "".join(["[%s] " % support.color(server.capitalize(), 'orange'), item.title]) - videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.thumbnail - videoitem.show = item.show - videoitem.plot = item.plot - videoitem.channel = item.channel + support.log(item.channel+" findvideos") + logger.debug(item.url) + itemlist = support.server(item, data=item.url) return itemlist diff --git a/channelselector.py b/channelselector.py index 66c09c56..7c0c7e44 100644 --- a/channelselector.py +++ b/channelselector.py @@ -383,7 +383,11 @@ def thumb(itemlist=[]): item.thumbnail = get_thumb(thumb + '.png') else: thumb = item.thumbnails - # REmove args from title + + if item.thumbnail != '': + break + + # Remove args from title if item.args: item.title = item.title.replace(' || ' + str(item.args), '') return itemlist else: diff --git a/core/support.py b/core/support.py index 3aa022a2..c91e8cdc 100644 --- a/core/support.py +++ b/core/support.py @@ -95,7 +95,7 @@ def scrape(item, patron = '', listGroups = [], headers="", blacklist="", data="" patronNext="", action="findvideos", addVideolibrary = True, type_content_dict={}, type_action_dict={}): # 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 + # accepted values are: url, title, thumb, quality, year, plot, duration, genre, rating, episode, lang # header: values to pass to request header # blacklist: titles that you want to exclude(service articles for example) @@ -112,7 +112,7 @@ def scrape(item, patron = '', listGroups = [], headers="", blacklist="", data="" # patron = 'blablabla' # headers = [['Referer', host]] # blacklist = 'Request a TV serie!' - # return support.scrape(item, itemlist, patron, ['thumb', 'quality', 'url', 'title', 'year', 'plot'], + # return support.scrape(item, itemlist, patron, ['thumb', 'quality', 'url', 'title', 'year', 'plot', 'episode', 'lang'], # headers=headers, blacklist=blacklist) # 'type' is a check for typologies of content e.g. Film or TV Series # 'episode' is a key to grab episode numbers if it is separated from the title @@ -136,7 +136,7 @@ def scrape(item, patron = '', listGroups = [], headers="", blacklist="", data="" blocks = scrapertoolsV2.find_multiple_matches(block, regex) block = "" for b in blocks: - block += "\n" + b + block += "\n" + str(b) log('BLOCK ', n, '=', block) else: block = data @@ -144,7 +144,8 @@ def scrape(item, patron = '', listGroups = [], headers="", blacklist="", data="" matches = scrapertoolsV2.find_multiple_matches(block, patron) log('MATCHES =', matches) - known_keys = ['url', 'title', 'title2', 'episode', 'thumb', 'quality', 'year', 'plot', 'duration', 'genere', 'rating', 'type'] #by greko aggiunto episode + known_keys = ['url', 'title', 'title2', 'episode', 'thumb', 'quality', 'year', 'plot', 'duration', 'genere', 'rating', 'type', 'lang'] #by greko aggiunto episode + for match in matches: if len(listGroups) > len(match): # to fix a bug match = list(match) @@ -157,7 +158,7 @@ def scrape(item, patron = '', listGroups = [], headers="", blacklist="", data="" val = scrapertoolsV2.find_single_match(item.url, 'https?://[a-z0-9.-]+') + val scraped[kk] = val - title = scrapertoolsV2.decodeHtmlentities(scraped["title"]).strip() + title = scrapertoolsV2.decodeHtmlentities(scraped["title"]).replace('"', "'").strip() # fix by greko da " a ' plot = scrapertoolsV2.htmlclean(scrapertoolsV2.decodeHtmlentities(scraped["plot"])) longtitle = typo(title, 'bold') @@ -168,6 +169,12 @@ def scrape(item, patron = '', listGroups = [], headers="", blacklist="", data="" if scraped['title2']: title2 = scrapertoolsV2.decodeHtmlentities(scraped["title2"]).strip() longtitle = longtitle + typo(title2, 'bold _ -- _') + if scraped["lang"]: + if 'sub' in scraped["lang"].lower(): + lang = 'Sub-ITA' + else: + lang = 'ITA' + longtitle += typo(lang, '_ [] color kod') if item.infoLabels["title"] or item.fulltitle: # if title is set, probably this is a list of episodes or video sources infolabels = item.infoLabels diff --git a/platformcode/keymaptools.py b/platformcode/keymaptools.py index 66270a50..5997427c 100644 --- a/platformcode/keymaptools.py +++ b/platformcode/keymaptools.py @@ -7,7 +7,7 @@ import xbmcaddon import xbmcgui from channelselector import get_thumb -from platformcode import config +from platformcode import config, logger class KeyListener(xbmcgui.WindowXMLDialog): @@ -168,6 +168,9 @@ class Main(xbmcgui.WindowXMLDialog): def open_shortcut_menu(): - main = Main('ShortCutMenu.xml', config.get_runtime_path()) + XML = 'ShortCutMenu.xml' + if config.get_setting('icon_set') == 'dark': + XML = 'Dark' + XML + main = Main(XML, config.get_runtime_path()) main.doModal() del main diff --git a/platformcode/xbmc_config_menu.py b/platformcode/xbmc_config_menu.py index c31be558..b3e87a25 100644 --- a/platformcode/xbmc_config_menu.py +++ b/platformcode/xbmc_config_menu.py @@ -354,7 +354,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): return ok def add_control_label(self, c): - control = xbmcgui.ControlLabel(0, -100, self.controls_width, 30, "", alignment=4, font=self.font, + control = xbmcgui.ControlLabel(0, -100, self.controls_width, 40, "", alignment=4, font=self.font, textColor=c["color"]) self.addControl(control) @@ -366,20 +366,20 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): c["control"] = control def add_control_list(self, c): - control = xbmcgui.ControlButton(0, -100, self.controls_width, self.height_control, + control = xbmcgui.ControlButton(0, -100, self.controls_width + 20, self.height_control, c["label"], os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'), - 0, textColor=c["color"], + 10, textColor=c["color"], font=self.font) - label = xbmcgui.ControlLabel(0, -100, self.controls_width - 30, self.height_control, - "", font=self.font, textColor=c["color"], alignment=4 | 1) + label = xbmcgui.ControlLabel(0, -100, self.controls_width - 80, self.height_control, + "", font=self.font, textColor=c["color"], alignment= 1 | 4) - upBtn = xbmcgui.ControlButton(0, -100, 20, 15, "", + upBtn = xbmcgui.ControlButton(0, -100, 15, 7, "", focusTexture=os.path.join(self.mediapath, 'Controls', 'spinUp-Focus.png'), noFocusTexture=os.path.join(self.mediapath, 'Controls', 'spinUp-noFocus.png')) - downBtn = xbmcgui.ControlButton(0, -100 + 15, 20, 15, "", + downBtn = xbmcgui.ControlButton(0, -100 + 15, 15, 7, "", focusTexture=os.path.join(self.mediapath, 'Controls', 'spinDown-Focus.png'), noFocusTexture=os.path.join(self.mediapath, 'Controls', 'spinDown-noFocus.png')) @@ -431,14 +431,14 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): def add_control_bool(self, c): # Versiones antiguas no admite algunas texturas if xbmcgui.__version__ in ["1.2", "2.0"]: - control = xbmcgui.ControlRadioButton(0 - 10, -100, self.controls_width + 10, self.height_control, + control = xbmcgui.ControlRadioButton(0, -100, self.controls_width + 20, self.height_control, label=c["label"], font=self.font, textColor=c["color"], focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png')) else: - control = xbmcgui.ControlRadioButton(0 - 10, -100, self.controls_width + 10, + control = xbmcgui.ControlRadioButton(0, -100, self.controls_width + 20, self.height_control, label=c["label"], font=self.font, textColor=c["color"], focusTexture=os.path.join(self.mediapath, 'Controls', @@ -491,11 +491,11 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.getControl(10005).getPosition()[1]) # Obtenemos las dimensiones del area de controles - self.controls_width = self.getControl(10007).getWidth() - 20 - self.controls_height = self.getControl(10007).getHeight() + self.controls_width = self.getControl(10007).getWidth() - 30 + self.controls_height = self.getControl(10007).getHeight() -100 self.controls_pos_x = self.getControl(10007).getPosition()[0] + self.getControl(10001).getPosition()[0] + 10 self.controls_pos_y = self.getControl(10007).getPosition()[1] + self.getControl(10001).getPosition()[1] - self.height_control = 35 + self.height_control = 40 self.font = "font12" # En versiones antiguas: creamos 5 controles, de lo conrtario al hacer click al segundo control, @@ -619,7 +619,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): if c["type"] != "list": if c["type"] == "bool": - c["control"].setPosition(self.controls_pos_x - 10, c["y"]) + c["control"].setPosition(self.controls_pos_x, c["y"]) else: c["control"].setPosition(self.controls_pos_x, c["y"]) @@ -629,8 +629,8 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): c["label"].setPosition(self.controls_pos_x + self.controls_width - 30, c["y"]) else: c["label"].setPosition(self.controls_pos_x, c["y"]) - c["upBtn"].setPosition(self.controls_pos_x + c["control"].getWidth() - 25, c["y"] + 3) - c["downBtn"].setPosition(self.controls_pos_x + c["control"].getWidth() - 25, c["y"] + 18) + c["upBtn"].setPosition(self.controls_pos_x + c["control"].getWidth() - 40, c["y"] + 15) + c["downBtn"].setPosition(self.controls_pos_x + c["control"].getWidth() - 25, c["y"] + 15) self.set_visible(c, True) @@ -962,7 +962,7 @@ class ControlEdit(xbmcgui.ControlButton): 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) + font=kwargs["font"], textColor=kwargs["textColor"], alignment= 4 | 1) self.window.addControl(self.textControl) def setLabel(self, val): diff --git a/resources/media/channels/banner/animeworld.png b/resources/media/channels/banner/animeworld.png new file mode 100644 index 00000000..7f727b4f Binary files /dev/null and b/resources/media/channels/banner/animeworld.png differ diff --git a/resources/media/channels/banner/guardaserieclick.png b/resources/media/channels/banner/guardaserieclick.png new file mode 100644 index 00000000..027c3c32 Binary files /dev/null and b/resources/media/channels/banner/guardaserieclick.png differ diff --git a/resources/media/channels/thumb/animeworld.png b/resources/media/channels/thumb/animeworld.png new file mode 100644 index 00000000..d0b57098 Binary files /dev/null and b/resources/media/channels/thumb/animeworld.png differ diff --git a/resources/media/channels/thumb/guardaserieclick.png b/resources/media/channels/thumb/guardaserieclick.png new file mode 100644 index 00000000..58ae6dca Binary files /dev/null and b/resources/media/channels/thumb/guardaserieclick.png differ diff --git a/resources/skins/Default/720p/ChannelSettings.xml b/resources/skins/Default/720p/ChannelSettings.xml index 4f3c8e4e..06c64a8d 100644 --- a/resources/skins/Default/720p/ChannelSettings.xml +++ b/resources/skins/Default/720p/ChannelSettings.xml @@ -1,6 +1,14 @@ - false + false + + + + + + + + 240 @@ -10,16 +18,11 @@ 800 500 - Windows/DialogBack.png - - - 40 - 800 - Windows/dialogheader.png + Shortcut/dialog-bg-solid.png - 10 - 10 + 15 + 50 34 725 font12_title @@ -29,18 +32,18 @@ - 735 - 15 - 50 - 30 + 745 + 25 + 20 + 20 Controls/DialogCloseButton-focus.png Controls/DialogCloseButton.png - 155 - 445 - 120 - 30 + 40 + 410 + 200 + 50 110 Controls/KeyboardKey.png Controls/KeyboardKeyNF.png @@ -49,10 +52,10 @@ - 325 - 445 - 120 - 30 + 300 + 410 + 200 + 50 110 Controls/KeyboardKey.png Controls/KeyboardKeyNF.png @@ -61,10 +64,10 @@ - 495 - 445 - 120 - 30 + 560 + 410 + 200 + 50 110 Controls/KeyboardKey.png Controls/KeyboardKeyNF.png @@ -73,20 +76,15 @@ - 45 + 80 20 745 387 - - 745 - 387 - Windows/BackControls.png - - 0 + 30 0 745 - 387 + 300 font16 0xFFFFFFFF center @@ -95,17 +93,18 @@ - 45 - 770 + 80 + 780 10 - 387 + 300 + 0xFFFFFFFF Controls/ScrollBack.png - 45 - 770 + 80 + 780 10 - 387 + 300 Controls/ScrollBar.png diff --git a/resources/skins/Default/720p/DarkShortCutMenu.xml b/resources/skins/Default/720p/DarkShortCutMenu.xml new file mode 100644 index 00000000..fb98c257 --- /dev/null +++ b/resources/skins/Default/720p/DarkShortCutMenu.xml @@ -0,0 +1,163 @@ + + + 0.52 + + 200 + 250 + + 32500 + + + + + + + + + + + -200 + -250 + 1280 + 720 + Shortcut/white.png + Shortcut/white.png + Action(close) + + + 0 + 0 + 880 + 220 + Shortcut/white.png + + + + + -21 + 0 + 1011 + 220 + Shortcut/dialogbutton-nofo.png + + + -130 + 0 + 880 + 220 + 32501 + 61 + horizontal + 200 + 61 + Conditional + Conditional + + + + 0 + 0 + 220 + 220 + Shortcut/button-nofo.png + + + 30 + 149 + 306 + 75 + Shortcut/black.png + + + 35 + 35 + 150 + 150 + $INFO[ListItem.Property(thumb)] + keep + center + + + 329 + 24 + 50 + 50 + keep + $INFO[ListItem.Overlay] + + + + + 0.10 + + 220 + 220 + Shortcut/button-nofo.png + Unfocus + Focus + + + 220 + 220 + Shortcut/button-fo.png + Unfocus + + + 5 + 24 + 50 + 50 + keep + $INFO[ListItem.Overlay] + + + 23 + 149 + 298 + 75 + Shortcut/black.png + + + 35 + 35 + 150 + 150 + $INFO[ListItem.Property(thumb)] + keep + center + + + 0 + 146 + 220 + 74 + font12 + + center + center + + + + + + -120 + 220 + 880 + 10 + Shortcut/white.png + Shortcut/white.png + Shortcut/white.png + - + - + false + horizontal + 32500 + 32500 + 32500 + 32500 + Conditional + + + + + diff --git a/resources/skins/Default/720p/ShortCutMenu.xml b/resources/skins/Default/720p/ShortCutMenu.xml index 6ccd86ca..6f8b50d0 100644 --- a/resources/skins/Default/720p/ShortCutMenu.xml +++ b/resources/skins/Default/720p/ShortCutMenu.xml @@ -2,96 +2,48 @@ 0.52 - 147 - 180 + 200 + 250 32500 - + - + - - 0 - 0 - 969 - 283 - Shortcut/dialog-bg-solid.png + + -200 + -250 + 1280 + 720 + Shortcut/white.png + Shortcut/white.png + Action(close) 0 0 - 969 - 70 - Shortcut/white70.png - - - - -1920 - -1080 - 5760 - 3240 - - - - - Action(close) - - - button overlay to avoid closing in dialog area - 0 - 0 - 969 - 283 - - - - - noop - - - 969 - 11 - 48 - 48 - 48 - 48 - - - - - - Conditional - Shortcut/close.png - Shortcut/close.png - Shortcut/close.png - Shortcut/logo.png - Action(close) - 32500 - 32500 + 880 + 220 + Shortcut/white.png -21 - 50 + 0 1011 - 253 - Shortcut/dialogbutton-nofo.png + 220 + Shortcut/dialogbutton-nofo.png - -139 - 55 - 980 + -130 + 0 + 880 220 32501 61 @@ -100,14 +52,14 @@ 61 Conditional Conditional - - 2 + + - 5 - 10 - 347 - 260 - Shortcut/button-nofo.png + 0 + 0 + 220 + 220 + Shortcut/button-nofo.png 30 @@ -117,10 +69,10 @@ Shortcut/black.png - 95 - 23 - 160 - 130 + 35 + 35 + 150 + 150 $INFO[ListItem.Property(thumb)] keep center @@ -133,39 +85,21 @@ keep $INFO[ListItem.Overlay] - - 25 - 146 - 300 - 74 - - text_shadow - font12 - center - center - - + 0.10 - - - - - - - 2 - 340 - 245 - Shortcut/button-nofo.png + 220 + 220 + Shortcut/button-nofo.png Unfocus Focus - 340 - 237 - Shortcut/button-fo.png + 220 + 220 + Shortcut/button-fo.png Unfocus @@ -184,18 +118,18 @@ Shortcut/black.png - 95 - 23 - 160 - 130 + 35 + 35 + 150 + 150 $INFO[ListItem.Property(thumb)] keep center - 25 + 0 146 - 300 + 220 74 font12 @@ -206,13 +140,13 @@ - -122 - 280 - 972 - 15 - Shortcut/white.png - Shortcut/white.png - Shortcut/white.png + -120 + 220 + 880 + 10 + Shortcut/white.png + Shortcut/white.png + Shortcut/white.png - - false diff --git a/resources/skins/Default/720p/side_menu.xml b/resources/skins/Default/720p/side_menu.xml index 8403b14f..97e646c6 100644 --- a/resources/skins/Default/720p/side_menu.xml +++ b/resources/skins/Default/720p/side_menu.xml @@ -7,8 +7,8 @@ 1 - - + + 0 0 diff --git a/resources/skins/Default/media/Controls/DialogCloseButton-focus.png b/resources/skins/Default/media/Controls/DialogCloseButton-focus.png index c4e57d66..0eb9e133 100644 Binary files a/resources/skins/Default/media/Controls/DialogCloseButton-focus.png and b/resources/skins/Default/media/Controls/DialogCloseButton-focus.png differ diff --git a/resources/skins/Default/media/Controls/DialogCloseButton.png b/resources/skins/Default/media/Controls/DialogCloseButton.png index fff67ae1..cd9e52f0 100644 Binary files a/resources/skins/Default/media/Controls/DialogCloseButton.png and b/resources/skins/Default/media/Controls/DialogCloseButton.png differ diff --git a/resources/skins/Default/media/Controls/ScrollBack.png b/resources/skins/Default/media/Controls/ScrollBack.png index af69f805..07f88c5c 100644 Binary files a/resources/skins/Default/media/Controls/ScrollBack.png and b/resources/skins/Default/media/Controls/ScrollBack.png differ diff --git a/resources/skins/Default/media/Controls/check_mark.png b/resources/skins/Default/media/Controls/check_mark.png index dce6caf7..76b618bd 100644 Binary files a/resources/skins/Default/media/Controls/check_mark.png and b/resources/skins/Default/media/Controls/check_mark.png differ diff --git a/resources/skins/Default/media/Controls/radiobutton-focus.png b/resources/skins/Default/media/Controls/radiobutton-focus.png index d471e1e3..286e09f8 100644 Binary files a/resources/skins/Default/media/Controls/radiobutton-focus.png and b/resources/skins/Default/media/Controls/radiobutton-focus.png differ diff --git a/resources/skins/Default/media/Controls/radiobutton-nofocus.png b/resources/skins/Default/media/Controls/radiobutton-nofocus.png index f64180f3..d8e60822 100644 Binary files a/resources/skins/Default/media/Controls/radiobutton-nofocus.png and b/resources/skins/Default/media/Controls/radiobutton-nofocus.png differ diff --git a/resources/skins/Default/media/Controls/spinDown-Focus.png b/resources/skins/Default/media/Controls/spinDown-Focus.png index 8f510325..31d02dae 100644 Binary files a/resources/skins/Default/media/Controls/spinDown-Focus.png and b/resources/skins/Default/media/Controls/spinDown-Focus.png differ diff --git a/resources/skins/Default/media/Controls/spinDown-noFocus.png b/resources/skins/Default/media/Controls/spinDown-noFocus.png index bfbb20f7..4987fbbc 100644 Binary files a/resources/skins/Default/media/Controls/spinDown-noFocus.png and b/resources/skins/Default/media/Controls/spinDown-noFocus.png differ diff --git a/resources/skins/Default/media/Controls/spinUp-Focus.png b/resources/skins/Default/media/Controls/spinUp-Focus.png index c6a8f523..0ce1fcc5 100644 Binary files a/resources/skins/Default/media/Controls/spinUp-Focus.png and b/resources/skins/Default/media/Controls/spinUp-Focus.png differ diff --git a/resources/skins/Default/media/Controls/spinUp-noFocus.png b/resources/skins/Default/media/Controls/spinUp-noFocus.png index 084ff22d..cbbc1b70 100644 Binary files a/resources/skins/Default/media/Controls/spinUp-noFocus.png and b/resources/skins/Default/media/Controls/spinUp-noFocus.png differ diff --git a/resources/skins/Default/media/Shortcut/button-fo.png b/resources/skins/Default/media/Shortcut/button-fo.png index a161d6ef..f6368603 100644 Binary files a/resources/skins/Default/media/Shortcut/button-fo.png and b/resources/skins/Default/media/Shortcut/button-fo.png differ diff --git a/platformcode/infoplus.py b/specials/infoplus.py similarity index 100% rename from platformcode/infoplus.py rename to specials/infoplus.py