Página 3 de 6

Re: Item

Publicado: 23 Nov 2015, 09:35
por robalo
No, no veo fantasmas aunque sí me suelo inventar las cosas :lol: :lol: :lol: pero este no es el caso

Aunque no se escriba json, en esta nueva revolución tecnológica, la palabra json está intrísica (que mal suena esta palabra, creo que es la primera vez que la uso :lol: :lol: :lol: ) esá en todas las conversaciones relacionadas con arrays, así que el str() y exec "" + str es una forma fácil y sin quebraderos de cabezas

Re: Item

Publicado: 23 Nov 2015, 10:53
por SeiTaN
Hombre.. todo es igual hasta cierta punto, pero es mucho más cómodo tratar con una estructura, porque es eso lo que se le pasa, a tener que usar un string, porque tienes que estar magreando la cadena de texto para hacer exactamente lo mismo.

Si existe ese tipo de datos es por que ha surgido una necesidad y por tanto se usa:
- str, int, list, dict, tuple...


Cada uno tiene su utilidad, que el string sea el comodín no quiere decir que el resto de tipos de datos no sea igual de válido ;)

Y paro ya de venderte la moto xD

Re: Item

Publicado: 23 Nov 2015, 11:23
por robalo
Eso depende de como quieras enredar las cosas, puedemos asosciar las palabras que queramos a lo que queramos pero nunca dejará de ser lo que es.

Re: Item

Publicado: 23 Nov 2015, 12:19
por SeiTaN
robalo escribió:Eso depende de como quieras enredar las cosas, puedemos asosciar las palabras que queramos a lo que queramos pero nunca dejará de ser lo que es.
Me acabas de dar la razón inconscientemente jajajaja, un diccionario es un diccionario, si lo quieres vestir como un string puro y duro es otra cosa.

Si nos ponemos exquisitos en java todo hereda de Object, para que usar otra cosa xD

Re: Item

Publicado: 23 Nov 2015, 12:21
por divadr
En mi opinión el principal "problema" no está en el Ítem, ni en las diferentes campos que contiene y me explico:

La clase Ítem tiene una serie de campos que con unos valores por defecto, pero eso no quita que tu no puedas añadir el que quieras y que no puedas cambiarle el tipo de contenido es decir:

Código: Seleccionar todo

ítem = Ítem(title="titulo", url="http://..:", extra={"id":1, "categoria": "Series"})
tu puedes hacer esto y el ítem se generará correctamente, También puedes añadir un campo nuevo, aunque no cuando lo creas, ya que la función __init__ del ítem tal como está echa no lo permite... aunque yo la cambiaria para que si q lo permita, pero puedes añadirlo después:

Código: Seleccionar todo

ítem = Ítem(title="titulo", url="http://..:")
ítem.id = 1
ítem.categoria= "series
El Problema está en que el ítem hay que pasarlo a una cadena de texto para formar la url para llamar de un ítem a otro, en Kodi es del tipo "plugin://plugin.video.pelisalacarta/?" + ítem y para las demás plataformas, algo parecido
actualmente la forma de crear esa cadena de texto se la siguiente:

Código: Seleccionar todo

    itemurl = '%s?fanart=%s&channel=%s&action=%s&category=%s&title=%s&fulltitle=%s&url=%s&thumbnail=%s&plot=%s&extradata=%s&Serie=%s&show=%s' % ( sys.argv[ 0 ] , fanart, canal , accion , urllib.quote_plus( category ) , urllib.quote_plus(title) , urllib.quote_plus(fulltitle) , urllib.quote_plus( url ) , urllib.quote_plus( thumbnail ) , urllib.quote_plus( plot ) , urllib.quote_plus( extradata ) , Serie, urllib.quote_plus( show ))
Lo cual deja muchos campos de los existentes que no se pasan, y los que tu pudieras añadir tampoco (es decir, cuando el usuario abra un ítem, llamara a la función del canal, pero el ítem que llegara solo tendrá los campos que hay arriba), y además todo los que no sea un string tengo dudas de que se pasaran correctamente, es por eso yo propongo modificar el ítem para dejarlo asi:

Código: Seleccionar todo

class Item(object):
    #Yo solo dejaría los campos imprescindibles para el launcher, ya que cada uno puede añadir los que quiera
    channel = ""
    title = ""
    url = ""
    thumbnail = ""
    plot = ""
    fanart = ""
    folder = True
    action = ""
    server = "directo"
    extra = ""
    show = ""
    category = ""
    language = ""
    type = ""
    context = ""
    subtitle = ""
    totalItems =0
    fulltitle = ""
    viewmode = "list"
    
   #Función de inicialización que permite añadir tantos campos como quieras
    def __init__(self,  **kwargs):   
      for arg in kwargs:
        exec "self."+arg+"=kwargs[arg]"

          
    #Devuelve el ítem en un string con todos los campos, para ver en el log
    def tostring(self):
      devuelve=""
      for property, value in sorted(vars(self).iteritems()):
        if not devuelve:
          devuelve = property + "=["+str(value)+"]"
        else:
          devuelve = devuelve + ", " + property + "=["+str(value)+"]"

      return devuelve
    
    #Serializa todas las propiedades. para crear una url, en base64 y urllib.quote para que no hayan caracteres raros que den problemas en la url
    def tourl(self):
        import json
        import base64
        import urllib
        JSONItem = {}
        for property, value in vars(self).iteritems():
          JSONItem[property]= value
        return urllib.quote(base64.b64encode(json.dumps(JSONItem)))
      
    #Deserializa todas las propiedades. y vuelve a generar el ítem completo desde la url
    def fromurl(self,cadena): 
        import base64
        import json
        import urllib
        JSONItem = json.loads(base64.b64decode(urllib.unquote(cadena)))
        for key in JSONItem:
          if type(JSONItem[key]) == unicode:
            value = JSONItem[key].encode("utf8")
          else:
            value = JSONItem[key]
          
          exec "self."+key+" = value"
Luego habría que cambiar en el xmbctools:

Código: Seleccionar todo

    itemurl = '%s?fanart=%s&channel=%s&action=%s&category=%s&title=%s&fulltitle=%s&url=%s&thumbnail=%s&plot=%s&extradata=%s&Serie=%s&show=%s' % ( sys.argv[ 0 ] , fanart, canal , accion , urllib.quote_plus( category ) , urllib.quote_plus(title) , urllib.quote_plus(fulltitle) , urllib.quote_plus( url ) , urllib.quote_plus( thumbnail ) , urllib.quote_plus( plot ) , urllib.quote_plus( extradata ) , Serie, urllib.quote_plus( show ))
por:

Código: Seleccionar todo

 itemurl = sys.argv[ 0 ]  + "?" + ítem.tourl()
y en el launcher la función extract_parametres dejarlo algo asi..:

Código: Seleccionar todo

def extract_parameters()
  ítem = Ítem()
  ítem.fromurl(sys.argv[2].replace("?",""))
  retrun ítem 
En Resumen, de esta manera tu puedes crear un Ítem, con los campos que te de la gana, y con el contenido que quieras, y siempre te llegara correcto a la siguiente función, solo hay que respetar los campos estándares como title, action, channel, etc.. para que el launcher los lea correctamente, pero para los demás el programador tiene total libertad para hacer lo que quiera.

Re: Item

Publicado: 23 Nov 2015, 13:13
por super_berny
Completamente de acuerdo con divadr.
Si tubiese q poner algun pero seria q yo reduciria aun mas la lista de campos propuesta para el Item y me miraria con lupa la codificacion base64, ahora no recuerdo muy bien pero diria q me dio problema con la biblioteca de kodi.

Por otro lado cuidado con utilizar campos del Item para otra cosa. En el ejemplo de item.extra, el launcher espera una cadena (y posiblemente varias subcadenas separadas mediante '|')

Re: Item

Publicado: 23 Nov 2015, 13:21
por divadr
Por eso mismo... los que usa el launcher los dejaria para ese uso... y para cosas internas del canal que cada uno añada los que quiera.. lo de arriba era dolo un ejemplo



el tema de base64 yo lo estoy usando en mis versiones hace mucho tiempo y nunca he tenido ningun problema pero para la url tiene q ser base64 y loego urllib.quote porque hay caracteres de base64 en concreto "=" que no es compatible con las url

Re: Item

Publicado: 23 Nov 2015, 14:35
por robalo
Muy bien encaminado el tema divadr, como siempre, muchas gracias

Re: Item

Publicado: 23 Nov 2015, 18:04
por SeiTaN
Muy limpio de ese modo, entonces @divadr, para confirmar..
¿No tendría que estar seteando el valor por cada lugar que pase el objeto? Como se hace hasta ahora

defino en la clase A y metodo 1

Código: Seleccionar todo

item.fromurl("vengo de la clase A, metodo 1")
Y voy llamando de un metodo a otro pasandole el objeto Item.
clase A --> clase b --> clase C

En C si muestro fromurl

Código: Seleccionar todo

print item.fromurl -->  "vengo de la clase A, metodo 1"
¿Es así?

Re: Item

Publicado: 23 Nov 2015, 18:09
por divadr
No... de eso se encarga el launcher... desde los canales todo sigue igual... lo unico es q yodos los campos q tenga el item llegarian de una funcion a otra sin problema...

La unica modificacion es en el launcher y xbmctools lo demas se sigue usando como hasta ahora pero con la posibilidad de añadir el campo que cada cual mecesite