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:
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.