Personal Website

My Web: MindEchoes.com

Thursday, April 22, 2010

Como Crear Plugins para PyTv

Ya que andamos con el Release 2.0 de PyTv, versión que ahora soporta Plugins, vamos a explicar como escribir un Plugin para PyTv.

Para empezar, es necesario que el Plugin a crear extienda de la clase "pluginbase" de PyTv y que nuestro Plugin tenga una Clase de nombre "Plugin" que es con la cual PyTv instanciara el Plugin.

import pluginbase
class Plugin(pluginbase.PluginBase):

El Plugin que se esta creando, hereda una serie de configuraciones de PluginBase que pueden sobreescribirse dependiendo de lo que sea necesario para la funcionalidades que se quieran implementar.
Estas configuraciones son:

  • _name: (String) especifica el nombre del Plugin
  • _description: (String) ofrece una descripción de cual es la funcionalidad del Plugin.
  • _icon: (String) especifica a través de una ruta relativa cual es el icono asociado con este Plugin.
  • _toThread: (Boolean) especifica si el Plugin sera incluido en el hilo principal de PyTv, de esta forma si el Plugin hace uso de notificaciones cada cierto tiempo, no sera necesario que genere ningún hilo, sino que cada vez que se ejecute el hilo de PyTv se llamara al mismo método del Plugin.
  • _toShow: (Boolean) especifica si este Plugin posee una interfaz gráfica con la que el usuario podrá interactuar.
  • _authors: (List-of-Strings) contiene los nombres de los autores del Plugin.
Ejemplo:

class Plugin(pluginbase.PluginBase):
    _name = 'Example Plugin'
    _description = 'This plugin is just for example purpose'
    _icon = 'example/Goomba.png'
    _toThread = True
    _toShow = True
    _authors = ['Diego Sarmentero <diego.sarmentero@gmail.com>']

Métodos de PluginBase:
Dependiendo en la configuración especificada para el Plugin en base a la funcionalidad que se quiera brindar, sera necesario implementar alguno o todos de los 3 métodos que son heredados de PluginBase:

configure(self, db=None, notif=None, dirPlugins=None)
Este método es ejecutado al instanciar el Plugin y en cada ciclo del hilo de PyTv (si dicho Plugin es agregado a este hilo), y este método recibe 3 objetos:
  • db: Instancia de la Clase TvDB para poder interactuar con la Base de Datos y recuperar información de las series, etc.
  • notif: Instancia de la Clase Notificator para poder emitir notificaciones usando el sistema de notificaciones de PyTv.
  • dirPlugins: String especificando la ruta absoluta donde se encuentra el directorio de los Plugins de PyTv para poder armar correctamente los paths de las imágenes o por cualquier otro motivo que se pueda necesitar.
Ejemplo:

def configure(self, d, n, dire):
    self.db = d
    self.notif = n
    self.dir = dire

show(self)
Si el Plugin que se esta creando utiliza alguna interfaz gráfica para interactuar con el usuario, este método retornara una instancia de la interfaz (objeto que debe extender de QWidget) para que PyTv lo cargue en una ventana y el usuario pueda tener acceso.

Ejemplo:

import pluginbase
import example
class Plugin(pluginbase.PluginBase):
    def show(self):
        widget = example.Main()
        return widget

threadMe(self)
Este método contiene el código que sera ejecutado cada vez que se corra el hilo principal de PyTv (si es que este Plugin fue configurado como _toThread=True).

Ejemplo:

def threadMe(self):
    #Do Staff
    image = self.dir + Plugin._icon
    self.notif.show_message('Welcome!', 'Example Plugin', image)

En este caso, el ejemplo toma la ruta de la carpeta Plugins recibida en "configure(...)" la concatena con la ruta del icono del plugin y emite un mensaje conteniendo ese icono mas el texto ingresado usando el sistema de notificaciones de PyTv.

Para instalar Nuevos Plugins, se puede ir al Menu "Complementos" (Plugins) de PyTv, elegir la opción "Gestor de Complementos" (Plugins Manager) y luego presionar el botón "Agregar Complemento" (Add Plugin), y PyTv nos mostrara una lista con los Plugins disponibles via web, los cuales al seleccionarlos y presionar "descargar" se descargaran e instalaran automáticamente en PyTv.


Si lo que queremos hacer es probar el Plugin que estamos desarrollando, solo es necesario copiarlo dentro de la carpeta "plugins" de PyTv que se encuentra en:


/home/[usuario]/.config/pytv/plugins

Uniendo Todo
Ahora vamos a unir todos estos conceptos para crear un Plugin de Ejemplo que va a tener la siguiente estructura:


__init__.py:
from main import Main



main.py:
from PyQt4 import QtGui, QtCore
class Main(QtGui.QWidget):
        def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle('Plugin Example')
        self.setFixedWidth(500)
        v_box = QtGui.QVBoxLayout(self)
        v_box.addWidget(QtGui.QLabel('Example Plugin'))
        self.push = QtGui.QPushButton('Press to Close!')
        v_box.addWidget(self.push)
        self.connect(self.push, QtCore.SIGNAL("clicked()"), self.hide)


example_plugin.py:
import pluginbase
import example
class Plugin(pluginbase.PluginBase):
    _name = 'Example Plugin'
    _description = 'This plugin is just for example purpose'
    _icon = 'example/Goomba.png'
    _toThread = True
    _toShow = True

    _authors = ['Diego Sarmentero <diego.sarmentero@gmail.com>']

    def __init__(self):
        self.notif = None
        self.db = None
        self.dir = None

    def configure(self, d, n, dire):
        self.db = d
        self.notif = n
        self.dir = dire

    def show(self):
        ex = example.Main()
        return ex

    def threadMe(self):
        #Do Staff
        image = self.dir + Plugin._icon
        self.notif.show_message('Welcome!', 'Example Plugin', image)

Y Listo!!
Tenemos un Plugin que participa en el hilo principal de PyTv, emite notificaciones y tiene un interfaz gráfica para interactuar con el usuario.






Para ver un ejemplo donde se hace uso de la Base de Datos y las Notificaciones se puede consultar el código del Plugin: Recommender

El código completo del ejemplo puede descargarse desde el siguiente link: DESCARGAR

No comments: