Página 1 de 1

Ideas para limpiar el codigo

Publicado: 07 Dic 2011, 14:34
por CGarces
Hola!

He estado desarrollando un canal nuevo y he visto cosas que me han llamado la atención.

-Sistema de logs.

Por un lado tenemos el logger con su fichero de configuración donde puedes definir el nivel de detalle.
Por otro lado tenemos la variable de debug booleana que tiene el fichero de configuración de pelisalacarta.

¿No deberían unificarse criterios?

Me gustaría proponer lo siguiente:
-Mensajes de log, información, ect.. con el logger
-Partes de código que estén en prueba con un if config.get_setting("debug")

Identificación de las plataformas.

Para, por ejemplo, mostrar la opción de guardar en la biblioteca he visto cosas como

Código: Seleccionar todo

if config.get_platform().startswith("xbmc") or config.get_platform().startswith("boxee"): 
o

Código: Seleccionar todo

if config.get_platform().startswith("xbmc")
Supongo que se debería estar usando get_library_support() ¿no?, pero aun mejor seria mover esto a los ficheros config.py de cada plataforma.
Algo así:

En /core/config.py

Código: Seleccionar todo

def get_support(property):
    try:
        exec "import platform."+PLATFORM_NAME+".config as platformconfig"
    except:
        exec "import "+PLATFORM_NAME+"config as platformconfig"
    return platformconfig.get_support(property)
Y en el config.py de cada plataforma

Código: Seleccionar todo

def get_support(property):
    return aquí tiraría de un hasmap, un xml, o lo que sea que indique que cosas soporta. Por defecto devolvería nulo.
Así en caso de que se añada una plataforma nueva o que una plataforma nueva empiece a soportar algo, no hay que tocar el core.

La función get_support() de momento solo se usaría con la propiedad "library" pero seguro que se os ocurren muchos mas usos.

Algo parecido se puede hacer con los canales, se me ocurren unos cuantos atributos, que ademas dejarían mas limpio el código de channelselector.py:

-working. Indica si funciona. Si no funciona porque se ha quedado obsoleto, o esta en desarrollo no se pinta en el listado de canales. En modo debug se pintan todos
-title
-language
-category
-type
-adult. Booleano que indica si se bloquea cuando enableadultmode=true
-version. Por si las moscas
-date. Fecha de la ultima versión

Tengo mucho tiempo libre en diciembre, si se me da acceso al SVN puedo hacer limpieza de los canales por el tema de logger y los atributos de canal para limpiar el channelselector.py

Re: Ideas para limpiar el codigo

Publicado: 09 Dic 2011, 14:12
por CGarces
Aquí os dejo una idea de las mejoras para limpiar channelselector.py
El nuevo código se recorre la carpeta de canales e identifica los pugins.

La carga e identificación de los ficheros no se hace con import, para no cargar cosas en memoria. La idea la he pillado del sistema de plugins de pyLoad.

Simplemente sera necesario añadir unas variables a los plugins

Código: Seleccionar todo

__category__ = "P"
__type__ = "generic"
__title__ = "Tube8"
__channel__ = "tube8"
__language__ = "ES"
Si os gusta la idea puedo tenerla implementada para el lunes, simplemente faltaría:

-Actualizar todos los canales
-Limpiar del todo channelselector
-Ordenar los canales por orden alfabético segun el campo __title__

Y a partir de aquí, todas las mejoras que se os ocurran...

Re: Ideas para limpiar el codigo

Publicado: 09 Dic 2011, 20:59
por jesus
Me parecen unas sugerencias muy acertadas :)

Este fin de semana es mala idea hacer un cambio así, porque pensaba publicar la 3.2.4 final y después del tiempo que llevamos con betas estas cosas siempre traen efectos secundarios.

Si te es posible retomarlo después de publicar la 3.2.4 por mi ok, y en cualquier caso te doy acceso al SVN cuando quieras. Mándame una dirección de correo de gmail y te doy de alta en el proyecto de Google Code.

El único cambio que no me encaja realmente es el del channelselector, porque va a desaparecer en la próxima versión :)

Voy a recopilar algunas de las mejoras que quería hacer, incluyendo algunas de las que tú apuntas y no había pensado, y sustituir el channelselector.py por un fichero XML que tenga la lista de canales. Estará subido al SVN, será leído por el channelselector.py, y tendrá como bien indicas atributos adicionales.

La idea que obliga al cambio es que un demonio revisará periódicamente (cada día?) que los canales funcionan, y si uno falla cambiará el atributo "working" para que el plugin pueda avisar al usuario de que ese canal no funciona. Luego en el plugin podemos hacer que ese canal se muestre con la advertencia, o simplemente no se muestre, por configuración.

Re: Ideas para limpiar el codigo

Publicado: 09 Dic 2011, 21:07
por jesus
Es interesante lo de la carga dinámica de los .py del directorio channels...

Recuerdo que el script XOT-UZG (la rama 1.X de pelisalacarta estaba basado en él) hacía algo parecido, pero más retorcido porque obligaba a que los canales tuvieran una función para que fuera invocada por el "framework" durante la inicialización. Muy complicado.

¿Qué opinas de tener un XML con la lista de canales? Probablemente será más o menos igual de rápido que esta carga dinámica, pero tiene otras ventajas. Por ejemplo poniendo la fecha de incorporación del canal, o incluso de modificación, podemos tener una lista de "Los nuevos", "Los últimos actualizados", etc...

Lo de la actualización del estado lo tengo más o menos claro, pero no lo pensaré en serio hasta que no esté la 3.2.4 publicada. Aunque me gustaría evitar modificar el fichero XML maestro. Creo que lo mejor es tener una segunda lista de canales con los que no funcionan, de forma que el plugin lea el xml maestro (channels.xml por ejemplo), y luego cuando elijas un canal lea el segundo xml (channels-broken.xml) para averiguar si el ID del canal está entre los rotos.

Piensa que el plugin no tiene estado, al menos en XBMC / Plex / Boxee, por lo que la lista de canales rotos habría que verificarla cada vez al seleccionar el canal.

Re: Ideas para limpiar el codigo

Publicado: 09 Dic 2011, 21:50
por CGarces
Hola!
¿Qué opinas de tener un XML con la lista de canales? Probablemente será más o menos igual de rápido que esta carga dinámica, pero tiene otras ventajas. Por ejemplo poniendo la fecha de incorporación del canal, o incluso de modificación, podemos tener una lista de "Los nuevos", "Los últimos actualizados", etc...
No me termina de convencer. Casi todos los sistemas de plugin que he visto hacen la carga dinámica recorriendo el directorio. Así el proceso de actualización automática de canales es mucho mas sencillo. Con respecto a lo de las fechas, pueden ponerse como atributos del canal. De todos esto me puedo encargar yo actualizando los canales.
Lo de la actualización del estado lo tengo más o menos claro, pero no lo pensaré en serio hasta que no esté la 3.2.4 publicada. Aunque me gustaría evitar modificar el fichero XML maestro. Creo que lo mejor es tener una segunda lista de canales con los que no funcionan, de forma que el plugin lea el xml maestro (channels.xml por ejemplo), y luego cuando elijas un canal lea el segundo xml (channels-broken.xml) para averiguar si el ID del canal está entre los rotos.
Me gusta mas la idea de hacerlo dentro de cada canal, con un atributo working=true. No veo la necesidad de una XML adicional si el propio canal puede contener sus propios datos. Con el XML sigues necesitando modificar el programa para añadir un canal. Es mucho mas sencillo para todos que unicamente necesites copiar el canal a un directorio.
La idea que obliga al cambio es que un demonio revisará periódicamente (cada día?) que los canales funcionan, y si uno falla cambiará el atributo "working" para que el plugin pueda avisar al usuario de que ese canal no funciona. Luego en el plugin podemos hacer que ese canal se muestre con la advertencia, o simplemente no se muestre, por configuración.
Demonio? Con hacerlo al arranque solucionado. Si el proceso que lee del XML va a controlar el atributo working... ¿por que no cambias directamente el atributo working en el SVN?. Te cuesta lo mismo mantener un XML que mantener directamente los atributos de los canales y el codigo te queda mucho mas sencillo.
Piensa que el plugin no tiene estado, al menos en XBMC / Plex / Boxee, por lo que la lista de canales rotos habría que verificarla cada vez al seleccionar el canal.
No, no tiene estado, seria un atributo fijo del canal, parte del código fuente.

Fíjate en como funciona la actualización de plugins y su carga en proyecto como JDonwloader o pyLoad. Manejan un buen puñado de host con su sistema de plugins, si cada vez que se añade/modifica un plugin tuvieran que modificar un listado se volverían locos.

En cuanto vea la nueva versión pico unas lineas para que veas como queda, seguro que viéndolo funcionar te convence.

Re: Ideas para limpiar el codigo

Publicado: 09 Dic 2011, 23:11
por CGarces
Fíjate en como funciona la actualización de plugins y su carga en proyecto como JDonwloader o pyLoad. Manejan un buen puñado de host con su sistema de plugins, si cada vez que se añade/modifica un plugin tuvieran que modificar un listado se volverían locos.
Zas en toda la boca...

http://get.pyload.org/plugins/check/

pyLoad si que usa una lista, pero solo para los updates (asi pueden subir cosas al svn sin preocuparte que los usuarios se lo descarquen por error. Pero la carga de puglins es dinamina, todos los atributos de los plugins los contiene el propio plugin. Solo es necesario copiar el .py donde toque.

El fichero de configuración esta en el servidor y se usa solo para los updates, no es necesario para la correcta ejecución del programa.

Re: Ideas para limpiar el codigo

Publicado: 10 Dic 2011, 00:14
por jesus
Vale, has plantado la semilla de la duda en mi cabeza :)

Cuando termine de publicar la versión lo vemos.

De todas formas hay algo que igual no me he explicado. La idea es que un demonio verifique y mantenga una lista de los canales que funcionan y los que no, para que luego el plugin pueda explotarla.

Eso no se puede hacer en el arranque, es un proceso muy largo para todos los canales (en el modulo tester.py tienes un par de pruebas cutres que hice). Y hacerlo cada vez que entras a un canal tampoco es inmediato, además de que pierdes la opción de que el usuario no vea los canales que fallan que sí puedes tener con el XML.

Si esta información está en el código fuente del canal el demonio tendría que "modificar el canal", algo que me resulta raro... Es mejor que cree un XML con el resultado de la verificación y lo suba si hay cambios, sin tocar el código. Es mi opinión.

También pensaba extenderlo a los conectores, de forma que cuando quieras ver un video en megaupload (ha fallado hace poco) veas un mensaje del tipo "Lo siento pero megaupload no funciona por el momento, prueba otro servidor". También podríamos hacer actualización automática de esos conectores... es algo que acabaremos teniendo.

Re: Ideas para limpiar el codigo

Publicado: 10 Dic 2011, 13:49
por CGarces
Hola!

Creo que te entendí mal y que tu me has entendido mal, lo bueno de esto es que creo que los dos tenemos razón.
Si esta información está en el código fuente del canal el demonio tendría que "modificar el canal", algo que me resulta raro... Es mejor que cree un XML con el resultado de la verificación y lo suba si hay cambios, sin tocar el código. Es mi opinión.
Lo que digo es que si un canal no funciona el propio desarrollador, manualmente suba una modificación poniendo __working__=false. Si un canal no funciona y de momento no puede arreglarse, por mucho que se chequee no va a funcionar hasta que no se arregle el código y se ponga __working__= true. Un ejemplo claro es el canal de tube8, no funciona de momento pero es bueno mantener el código en el svn para poder testealo cuando encuentre la solución.

Resumiendo
- Sigo pensando que la idea de poner todos los atributos del canal dentro del propio canal es la mejor idea, instalar un pugin sera tan fácil como copiar un fichero.
- La idea del demonio es buena y puede implementarse de forma independiente a estos atributos, construyendo en local un xml con los canales que no funcionan. Así no hay ninguna dependencia para instalar canales, simplemente un xml con los que no funcionan.

Ambas ideas se pueden desarrollar por separado y (casi) sin ninguna dependencia (aunque en el futuro el demonio podría ignorar los canales con __working__=false).

-Yo puedo encargarme de leer el directorio de plugins, añadir los atributos y construir en tiempo real menús y categorías manteniendo la misma funcionalidad que la versión que salga este fin de semana.
-Tu puedes encargarte del thead separado que verifica canales/servidores.

Así trabajamos los dos a la vez, el único punto común seria el if que determina si un canal se lista o no. Para que un canal se pinte se tiene que estar en modo debug o que ni el verificador ni el atributo __working__ den false.

Código: Seleccionar todo

if (( verificador && working) || DEBUG==true) {
...
}

Re: Ideas para limpiar el codigo

Publicado: 12 Dic 2011, 02:09
por jesus
El problema es que el desarrollador del canal no va a entrar todos los días a mirar que su canal funcione :)

De hecho hay varios casos de canales de pelisalacarta que yo no he hecho pero que mantengo porque sus autores originales han dejado de hacerlo. Así que tampoco es viable pensar que voy a entrar todos los días a verificar todos los canales y subir al SVN los que funcionen y los que no.

El demonio sí que lo hará. Cada día, o con la frecuencia que le digamos, verificará que el canal está operativo gracias a una función "test_working" o algo así en el propio canal. Y si falla lo pondrá en cuarentena, avisando a los usuarios, e incluso podríamos hacer que si falla durante varios días sea ocultado de la lista.

Lo que es cierto es que si el canal tiene el atributo working, y también lo tiene el XML, no tienen por qué ser excluyentes. Me gusta la idea de que añadir un nuevo canal sea tan fácil como copiar el .py en el directorio "channels" sin necesidad de editar el módulo del channelselector.