Página 1 de 2

Como hacer mis canales compatibles con la biblioteca

Publicado: 13 Oct 2016, 13:37
por Hernan_Ar_c
Buenas saludos a todos.
Veo que hay mucho movimiento estos días con el tema de la biblioteca y la verdad me intereso poder agregar la opción a los canales que tengo hechos, mire código de los canales que usan la biblioteca en la versión beta de super_berny, pero la verdad no logro comprender del todo el funcionamiento. por ejemplo utilizando la función add_series_to_library... intenta agregar la serie pero, me dice que no se pudo agregar a la biblioteca (subiria el log, pero la verdad no creo que ayude, todavía no me detalla los errores).
Con todo esto me gustaría saber cuales son los requisitos que se deben cumplir en el canal para que sea compatible con la biblioteca.

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 13 Oct 2016, 20:25
por super_berny
Lo mas sencillo es guardar series, para ello tu canal debe tener una funcion (normalmente llamada episodios) que devuelva todos los episodios de una serie (sin importar la temporada).

Ahora en un listado de tu serie (puede ser en el listado de temporadas o en el de episodios) añade un item al final de la lista con:

Código: Seleccionar todo

itemlist.append(Item(channel=item.channel, title="Añadir esta serie a la biblioteca de XBMC", url=item.url,
                             action="add_serie_to_library", extra="episodios", contentSerieName=[b]titulo_serie[/b]))
El title lo puedes cambiar si quieres (antes debia de ser siempre el mismo, pero ya no).
En extra debes poner la funcion que te comentaba al principio del mensaje, episodios.
En url debes poner la url del item q le pasas a la funcion episodios para q busque los episodios de esta serie y no de otra.
En contentSerieName debes poner el nombre de la serie lo mas claro posible, es decir, sin etiquetas de formato tipo COLOR, sin datos extras como el año, la calidad etc...
Antes en lugar de contentSerieName se usaba el campo show y aun se mantiene por compatibilidad, pero es mejor utilizar los campos content... creados para estos casos.


Si quieres un canal sencillo donde ver esto podrias mirar seriesflv por ejemplo

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 20 Oct 2016, 18:58
por super_berny
Hernan_Ar_c se puso en contacto conmigo en privado sobre un error q tenia en su canal metaserie con la version q hay ahora mismo en develop (y con mi beta).
El extracto del log q me paso es este:

Código: Seleccionar todo

DEBUG:     [launcher.run] pelisalacarta.platformcode.launcher Traceback (most recent call last):
                                              File "/home/hernan/.kodi/addons/plugin.video.pelisalacarta-betaSB/platformcode/launcher.py", line 232, in run
                                                platformtools.render_items(itemlist, item)
                                              File "/home/hernan/.kodi/addons/plugin.video.pelisalacarta-betaSB/platformcode/platformtools.py", line 174, in render_items
                                                totalItems=item.totalItems if item.totalItems else 0)
                                            TypeError: an integer is required
Hernan_Ar_c, Te respondo en abierto por si a alguien mas le puede servir la explicacion, q intentare q sea didactica:

Segun el log parece q hay un problema con item.totalItems, asi q hay q ver q tiene tu item en ese campo. Para ello vamos a insertar justo antes de la L#174 la siguiente instruccion para ver tu item al completo:

Código: Seleccionar todo

logger.debug(item.tostring('\n')) # Ya no es necesario if (DEBUG): para llamar al logger
Lo q nos da:

Código: Seleccionar todo

19:28:41 T:1544  NOTICE: ######## DEBUG #########
19:28:41 T:1544  NOTICE:     [pelisalacarta.platformcode.platformtools.render_items] action= 'findvideos'
                                            category= 'MetaSerie (Latino)'
                                            channel= 'metaserie'
                                            contentType= 'movie'
                                            fanart= 'http://image.tmdb.org/t/p/w780/jM31AtkE5QEfateaLXjc0gkY8Ih.jpg'
                                            folder= 'true'
                                            infoLabels= {'mediatype': 'movie'}
                                            thumbnail= 'https://s31.postimg.org/k5kpwyrgb/anterior.png'
                                            title= 'Capitulo Anterior'
                                            url= 'http://metaserie.com/luke-cage-01x09/'
Seguido del mismo error (aun no hemos hecho nada para corregirlo).
Curioso no esta el campo totalItems por ningun lado, con lo cual esa asignacion no puede fallar. Pero si podemos ver q el item concreto q falla (recordar q aqui llega un listado de items) es title= 'Capitulo Anterior'
Asi que ahora nos vamos a la creacion de ese item, en metaserie.findvideos. Algo debe haber en la creacion de ese item q nos jode todo.
Para asegurarnos el tiro comentamos el trozo de codigo:

Código: Seleccionar todo

'''
    if anterior !='':
        itemlist.append( Item(channel=item.channel, action="findvideos" , title='Capitulo Anterior' , url=anterior, thumbnail='https://s31.postimg.org/k5kpwyrgb/anterior.png', folder="true" ))
    if siguiente !='':
        itemlist.append( Item(channel=item.channel, action="findvideos" , title='Capitulo Siguiente' , url=siguiente, thumbnail='https://s32.postimg.org/4zppxf5j9/siguiente.png', folder="true" ))
    '''
Con eso comentado ya nos devuelve el listado de enlaces, aunq faltan esos dos. ¿q hay de diferente ahi?
La respuesta es folder="true" q es un str y si volvemos a platformtools: xbmcplugin.addDirectoryItem espera un boleano en isFolder.

La solucion es pues:

Código: Seleccionar todo

if anterior !='':
        itemlist.append( Item(channel=item.channel, action="findvideos" , title='Capitulo Anterior' , url=anterior, thumbnail='https://s31.postimg.org/k5kpwyrgb/anterior.png', folder=True ))
    if siguiente !='':
        itemlist.append( Item(channel=item.channel, action="findvideos" , title='Capitulo Siguiente' , url=siguiente, thumbnail='https://s32.postimg.org/4zppxf5j9/siguiente.png', folder=True ))
    
Podria haberte puesto directamente la solucion, pero como me has comentado q estas comenzando con todo esto, me ha parecido mejor enseñarte a liar q darte porros... o no era asi? :lol: :lol: :lol:

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 20 Oct 2016, 21:08
por Hernan_Ar_c
Muchisimas gracias Super_Berny, no si la intencion era aprender obviamente, pero ahora porque en la version 1.4.2 no daba problema?

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 20 Oct 2016, 22:47
por super_berny
Hernan_Ar_c escribió:Muchisimas gracias Super_Berny, no si la intencion era aprender obviamente, pero ahora porque en la version 1.4.2 no daba problema?
Tu lo q quieres es pillar al profe :lol: :lol: :lol:
Veamos supongo q te refieres a la 4.1.2.
En todas las versiones anteriores a la beta 4.1.3 la funcion q se encarga de mostrar el item en la pantalla de kodi es xbmctools.renderItems y concretamente en esta seccion de codigo se decidia si era una item mas de menu o era un video:

Código: Seleccionar todo

           if item.folder:
                add_new_folder(item, totalItems = len(itemlist))
            else:
                if config.get_setting("player_mode")=="1": # SetResolvedUrl debe ser siempre "isPlayable = true"
                    item.isPlayable = 'true'
                
                add_new_video( item, IsPlayable=item.isPlayable, totalItems = len(itemlist))
Ahora bien, el if no funciona como se supone, ya q siempre se cumplira (sera verdadero) mientras item.folder no sea None, es decir mientras no este vacio.

Veamos la prueba:

Código: Seleccionar todo

item.folder = "false"
    if item.folder:
        logger.debug("Verdadero")
    else:
        logger.debug("Falso")


23:36:54 T:4348  NOTICE: ######## DEBUG #########
23:36:54 T:4348  NOTICE:     [pelisalacarta.channels.test.test2] inicio test2
23:36:54 T:4348  NOTICE: ######## DEBUG #########
23:36:54 T:4348  NOTICE:     [pelisalacarta.channels.test.test2] Verdadero

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 21 Oct 2016, 13:49
por Hernan_Ar_c
Me dejaste todo mucho mas claro, te agradezco que te hayas tomado el tiempo de explicar con tantos detalles, ya tengo encaminados algunos canales con el tema de la biblioteca, hubo que adaptar algunas cosas según lo que me explicaste, pero va bastante bien.
Pido disculpas si resulto molesto con tantas preguntas, pero la intención es aportar y creo que con este tipo de ayuda mas gente tiene la posibilidad de empezar a crear sus canales, yo mismo cuando empece me pareció casi imposible, pero mirando código de otros canales y haciendo preguntas cuando no podía seguir logre hacer los que aporte.

Saludos y enserio muchas gracias.

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 21 Oct 2016, 15:04
por super_berny
Celebro haberte aclarado algo y no te preocupes por preguntar. Todos fuimos novatos alguna vez y de eso no hace tanto :lol:

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 02 Ene 2017, 15:53
por Hernan_Ar_c
Buenas y feliz año nuevo para todos!
Estoy teniendo nuevas dudas con respecto a la biblioteca, espero super_berny o alguien mas pueda aclarar estas dudas, ya que me di cuenta ,gracias a un aviso por pelisplus, de que todos mis canales fallan a la hora de actualizar los episodios de las series.
Con esto las dudas que tengo son:

1.- Que informacion deberia enviarse a la hora de añadir una serie a la biblioteca

2.- Que informacion contiene una serie guardada en la biblioteca (o sea cuando llama a la funcion episodios por ej. el item que recibe la funcion que es lo que contiene?)

3.- es conveniente tener una funcion dedicada solamente a añadir los episodios a la biblioteca?

Hago estas preguntas porque en mi caso utilizo una 'palabra clave' que se envia como extra dentro de item y dependiendo de esa 'palabra clave' se realiza un listado normal (temporada -> episodios) para el canal o un listado completo de episodios en caso de la biblioteca, el caso es que si no me equivoco al llamar a la funcion fijada para actualizar episodios al parecer no contiene el extra.

por ejemplo este es el codigo de metaserie, el cual no actualiza como comente y ademas contiene el ejemplo de como se utiliza palabra clave

Código: Seleccionar todo

def temporadas(item):
    logger.debug("pelisalacarta.channels.metaserie temporadas")
    itemlist = []
    templist = []
    data = scrapertools.cache_page(item.url)
    
    patron = '<li class=".*?="([^"]+)".*?>([^<]+)</a>'
    matches = re.compile(patron,re.DOTALL).findall(data)

    for scrapedurl,scrapedtitle in matches:
        url = urlparse.urljoin(item.url,scrapedurl)
        title = scrapedtitle
        title = title.replace("&","x");
        thumbnail = item.thumbnail
        plot = item.plot
        fanart = scrapertools.find_single_match(data,'<img src="([^"]+)"/>.*?</a>')
        if (DEBUG): logger.info("title=["+title+"], url=["+url+"], thumbnail=["+thumbnail+"])")
        itemlist.append( Item(channel=item.channel, action="episodios" , title=title ,fulltitle = item.title, url=url, thumbnail=thumbnail, plot=plot, fanart = fanart, contentSerieName=item.contentSerieName))
    
    if item.extra == 'temporadas':
        for tempitem in itemlist:
            templist += episodios(tempitem)
       
    if config.get_library_support() and len(itemlist) > 0:
        itemlist.append(Item(channel=item.channel, title='[COLOR yellow]Añadir esta serie a la biblioteca[/COLOR]', url=item.url,
                             action="add_serie_to_library", extra="temporadas", contentSerieName=item.contentSerieName))
    if item.extra == 'temporadas':
        return templist
    else:
        return itemlist
    

def episodios(item):
    logger.debug("pelisalacarta.channels.metaserie episodios")
    itemlist = []
    data = scrapertools.cache_page(item.url)
    
    patron = '<td><h3 class=".*?href="([^"]+)".*?">([^<]+).*?td>'
    matches = re.compile(patron,re.DOTALL).findall(data)

    for scrapedurl,scrapedtitle in matches:
        url = urlparse.urljoin(item.url,scrapedurl)
        title = scrapedtitle
        title = title.replace ("&#215;","x")
        title = title.replace ("×","x")
        thumbnail = item.thumbnail
        plot = item.plot
        fanart=item.fanart
        if (DEBUG): logger.info("title=["+title+"], url=["+url+"], thumbnail=["+thumbnail+"])")
        itemlist.append( Item(channel=item.channel, action="findvideos" , title=title, fulltitle=item.fulltitle, url=url, thumbnail=item.thumbnail, plot=plot, contentSerieName=item.contentSerieName))
        
    return itemlist
Gracias desde ya si pueden ayudarme

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 03 Ene 2017, 17:52
por super_berny
Hernan_Ar_c escribió:Con esto las dudas que tengo son:
1.- Que informacion deberia enviarse a la hora de añadir una serie a la biblioteca
2.- Que informacion contiene una serie guardada en la biblioteca (o sea cuando llama a la funcion episodios por ej. el item que recibe la funcion que es lo que contiene?)
3.- es conveniente tener una funcion dedicada solamente a añadir los episodios a la biblioteca?
Bueno, espero no equivocarme:
  1. Para añadir una serie el item debe tener:
    • action="add_serie_to_library", para q el launcher llame a library.add_serie_to_library(item, channel)
    • show o contentSerieName= Nombre de la serie sin etiquetas de color, formato, idioma, calidad, etc..
    • extra=Nombre de la funcion dentro del canal q nos devuelve el listado de todos los capitulos para añadirlos a la biblioteca. Puede ser cualquier nombre, aqui no importa (en las actualizaciones ya veremos q si) y si es necesario se puede pasar otro valor extra concateneandolo mediante "###", por ejemplo: "episodios###todos". En este caso a la funcion 'epìsodios' le llegara un item cuyo campo extra sera 'todos'. Esto es una herencia de cuando el item tenia un numero limitado de atributos y se mantiene por retrocompatibilidad.
  2. Realmente guardamos informacion duplicada sobre una serie en algunos de os archivos q componen la biblioteca y el la BD de Kodi (si esta es la plataforma). Esto es asi por q queriamos hacer una biblioteca compatible con otras plataformas (por eso guardamos la informacion en archivos json), pero q a la vez se integrara con la biblioteca existente en sistemas xbmc/kodi.
    Pero creo q lo q a ti te interesa saber es q contiene el item q le llega a la funcion episodios ¿no? En primer lugar, para el q no lo sepa decir q todo canal q quiera que se actualice sus series en la bilbioteca necesita tener una funcion episodios(item). Esta funcion devolvera el listado de todos los capitulos de la serie a la que señale su url. Es decir, no importa el resto de campos del item, lo unico q ha de hacer la funcion es dada una url devolver el listado completo de capitulos. Y estos capitulos solo es necesario q contengan un titulo que incluya el numero de temporada y episodio y la url donde obtener los enlaces a los servidores. Si por curiosidad quieres saber q contiene el item q hace las llamadas cuando actualizamos puedes sustituir la linea 98 de metaseries por: logger.debug(item) Aunq ya te digo q mucha informacion no es necesaria.
  3. No es cuestion de conveniencia, es cuestion de q la funcion episodios ha de ser capaz, como dije antes, de obtener el listado de capitulo solo pasandole una url y nada mas.
Si necesitas pasar esa palabra clave puedes hacer como en newpct1 que existe un metodo 'episodios' exclusivo para actualizar las series que a su vez llama al metodo generico 'completo' pasandole una palabra extra (es un canal bastante antiguo, pero creo q el caso es parecido al tuyo)

Re: Como hacer mis canales compatibles con la biblioteca

Publicado: 03 Ene 2017, 23:46
por SeiTaN
extra=Nombre de la funcion dentro del canal q nos devuelve el listado de todos los capitulos para añadirlos a la biblioteca. Puede ser cualquier nombre, aqui no importa (en las actualizaciones ya veremos q si) y si es necesario se puede pasar otro valor extra concateneandolo mediante "###", por ejemplo: "episodios###todos". En este caso a la funcion 'epìsodios' le llegara un item cuyo campo extra sera 'todos'. Esto es una herencia de cuando el item tenia un numero limitado de atributos y se mantiene por retrocompatibilidad.
Extra no hace falta en los nuevos canales, en mi opinión que se mantenga por retrocompatiblidad para antiguos canales es un motivo diferente.