# -*- coding: utf-8 -*- # ------------------------------------------------------------ # Canale per 'idcanale nel json' # By: pincopallo! # Eventuali crediti se vuoi aggiungerli # ------------------------------------------------------------ # Rev: 0.2 # Update 12-10-2019 # fix: # 1. aggiunto pagination e sistemate alcune voci # 2. modificato problemi in eccezioni # 3. aggiunta la def select # 4. modifica alla legenda e altre aggiunte # Questo vuole solo essere uno scheletro per velocizzare la scrittura di un canale. # La maggior parte dei canali può essere scritta con il decoratore. # I commenti sono più un promemoria... che una vera e propria spiegazione! # Niente di più. # Ulteriori informazioni sono reperibili nel wiki: # https://github.com/kodiondemand/addon/wiki/decoratori """ Questi sono commenti per i beta-tester. Su questo canale, nella categoria 'Ricerca Globale' non saranno presenti le voci 'Aggiungi alla Videoteca' e 'Scarica Film'/'Scarica Serie', dunque, la loro assenza, nel Test, NON dovrà essere segnalata come ERRORE. Novità. Indicare in quale/i sezione/i è presente il canale: - Nessuna, film, serie, anime... Avvisi: - Eventuali avvisi per i tester Ulteriori info: """ # CANCELLARE Ciò CHE NON SERVE per il canale, lascia il codice commentato ove occorre, # ma fare PULIZIA quando si è finito di testarlo # Qui gli import #import re # per l'uso dei decoratori, per i log, e funzioni per siti particolari from core import support # in caso di necessità #from core import scrapertools, httptools, servertools, tmdb from core.item import Item # per newest #from lib import unshortenit ##### fine import # se il sito ha un link per ottenere l'url corretto in caso di oscuramenti # la funzione deve ritornare l'indirizzo corretto, verrà chiamata solo se necessario (link primario irraggiungibile) def findhost(url): permUrl = httptools.downloadpage(url, follow_redirects=False).headers if 'google' in permUrl['location']: host = permUrl['location'].replace('https://www.google.it/search?q=site:', '') else: host = permUrl['location'] return host # se si usa findhost metti in channels.json l'url del sito che contiene sempre l'ultimo dominio host = config.get_channel_url(findhost) # se non si usa metti direttamente l'url finale in channels.json host = config.get_channel_url() headers = [['Referer', host]] ### fine variabili #### Inizio delle def principali ### @support.menu def mainlist(item): support.info(item) # Ordine delle voci # Voce FILM, puoi solo impostare l'url film = ['', # url per la voce FILM, se possibile la pagina principale con le ultime novità #Voce Menu,['url','action','args',contentType] ('Al Cinema', ['', 'peliculas', '']), ('Generi', ['', 'genres', 'genres']), ('Per Lettera', ['', 'genres', 'letters']), ('Anni', ['', 'genres', 'years']), ('Qualità', ['', 'genres', 'quality']), ('Mi sento fortunato', ['', 'genres', 'lucky']), ('Popolari', ['', 'peliculas', '']), ('Sub-ITA', ['', 'peliculas', '']) ] # Voce SERIE, puoi solo impostare l'url tvshow = ['', # url per la voce Serie, se possibile la pagina con titoli di serie #Voce Menu,['url','action','args',contentType] ('Novità', ['', '', '']), ('Per Lettera', ['', 'genres', 'letters']), ('Per Genere', ['', 'genres', 'genres']), ('Per anno', ['', 'genres', 'years']) ] # Voce ANIME, puoi solo impostare l'url anime = ['', # url per la voce Anime, se possibile la pagina con titoli di anime #Voce Menu,['url','action','args',contentType] ('Novità', ['', '', '']), ('In Corso',['', '', '', '']), ('Ultimi Episodi',['', '', '', '']), ('Ultime Serie',['', '', '', '']) ] """ Eventuali Menu per voci non contemplate! """ # se questa voce non è presente il menu genera una voce # search per ogni voce del menu. Es. Cerca Film... search = '' # se alla funzione search non serve altro # VOCE CHE APPARIRA' come prima voce nel menu di KOD! # [Voce Menu,['url','action','args',contentType] top = [ '' ['', '', '', '']) # Se vuoi creare un menu personalizzato o perchè gli altri non # ti soddisfano # [Voce Menu,['url','action','args',contentType] nome = [( '' ['', '', '', '']) return locals() # Legenda known_keys per i groups nei patron # known_keys = ['url', 'title', 'title2', 'season', 'episode', 'thumb', 'quality', # 'year', 'plot', 'duration', 'genere', 'rating', 'type', 'lang'] # url = link relativo o assoluto alla pagina titolo film/serie # title = titolo Film/Serie/Anime/Altro # title2 = titolo dell'episodio Serie/Anime/Altro # season = stagione in formato numerico # episode = numero episodio, in formato numerico. # thumb = linkrealtivo o assoluto alla locandina Film/Serie/Anime/Altro # quality = qualità indicata del video # year = anno in formato numerico (4 cifre) # duration = durata del Film/Serie/Anime/Altro # genere = genere del Film/Serie/Anime/Altro. Es: avventura, commedia # rating = punteggio/voto in formato numerico # type = tipo del video. Es. movie per film o tvshow per le serie. Di solito sono discrimanti usati dal sito # lang = lingua del video. Es: ITA, Sub-ITA, Sub, SUB ITA. # AVVERTENZE: Se il titolo è trovato nella ricerca TMDB/TVDB/Altro allora le locandine e altre info non saranno quelle recuperate nel sito.!!!! @support.scrape def peliculas(item): support.info(item) #support.dbg() # decommentare per attivare web_pdb action = '' blacklist = [''] patron = r'' patronBlock = r'' patronNext = '' pagination = '' #debug = True # True per testare le regex sul sito return locals() @support.scrape def episodios(item): support.info(item) #support.dbg() action = '' blacklist = [''] patron = r'' patronBlock = r'' patronNext = '' pagination = '' #debug = True return locals() # Questa def è utilizzata per generare i menu del canale # per genere, per anno, per lettera, per qualità ecc ecc @support.scrape def genres(item): support.info(item) #support.dbg() action = '' blacklist = [''] patron = r'' patronBlock = r'' patronNext = '' pagination = '' #debug = True return locals() ############## Fine ordine obbligato ## Def ulteriori # per quei casi dove il sito non differenzia film e/o serie e/o anime # e la ricerca porta i titoli mischiati senza poterli distinguere tra loro # andranno modificate anche le def peliculas e episodios ove occorre def select(item): support.info('select --->', item) #support.dbg() data = httptools.downloadpage(item.url, headers=headers).data # pulizia di data, in caso commentare le prossime 2 righe data = re.sub('\n|\t', ' ', data) data = re.sub(r'>\s+<', '> <', data) block = scrapertools.find_single_match(data, r'') if re.findall('', data, re.IGNORECASE): support.info('select = ### è una serie ###') return episodios(Item(channel=item.channel, title=item.title, fulltitle=item.fulltitle, url=item.url, args='serie', contentType='tvshow', #data1 = data decommentando portiamo data nella def senza doverla riscaricare )) ############## Fondo Pagina # da adattare al canale def search(item, text): support.info('search', item) itemlist = [] text = text.replace(' ', '+') item.url = host + '/index.php?do=search&story=%s&subaction=search' % (text) # bisogna inserire item.contentType per la ricerca globale # se il canale è solo film, si può omettere, altrimenti bisgona aggiungerlo e discriminare. item.contentType = item.contentType try: return peliculas(item) # Se captura la excepcion, para no interrumpir al buscador global si un canal falla except: import sys for line in sys.exc_info(): info('search log:', line) return [] # da adattare al canale # inserire newest solo se il sito ha la pagina con le ultime novità/aggiunte # altrimenti NON inserirlo def newest(categoria): support.info('newest ->', categoria) itemlist = [] item = Item() try: 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 except: import sys for line in sys.exc_info(): support.info('newest log: ', {0}.format(line)) return [] return itemlist # da adattare... # consultare il wiki sia per support.server che ha vari parametri, # sia per i siti con hdpass #support.server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=True) def findvideos(item): support.info('findvideos ->', item) return support.server(item, headers=headers)