Creación de Plugins para Freevo

En esta recetilla cuento los pasos que he seguido para crear un pequeño plugin para Freevo, con el que poder lanzar el juego Stepmania. Como tengo la intención de incorporar más juegos al menú de Freevo, he intentado no hacer el plugin demasiado específico.

Lo básico

Es bastante sencillo crear un plugin. Veamos los elementos mínimos. Si atendemos a la documentación oficial un plugin es una subclase que hereda de PluginInterface y que debe tener al menos dos funciones.

  • actions: que devuelve una lista de las posibles acciones del plugin (o una lista vacía)
        def actions(self,item): 
            if SOMECONDITION:
                return [ (self.COMMAND,'Name of menu entry')] 
            return [] 
    
  • Uno o varios comandos que deben estar disponibles.
        def COMMAND(self,arg=None, menuw=None):
            item = self.item 
            os.system('command') 
            menuw.delete_menu(arg, menuw) 
    

Aunque se supone que eso es lo básico que hay que saber, resulta que siguiendo estos sencillos pasos no he sido capaz de hacer funcionar mi plugin correctamente. Así que como siempre que ocurre esto el procedimiento a seguir es:

  • Busca un plugin que funcione,
  • destrípalo
  • y adáptalo a tus necesidades.
Plugin Stepmania

A continuación un paseo comentado por mi sencillo plugin para lanzar Stepmania.

En primer lugar una cabecera con las inclusiones de rigor.


#python modules
import os, time, stat, re, copy

#freevo modules
import config, menu, rc, plugin, skin, osd, util
from gui.PopupBox import PopupBox
from item import Item

Después accedo a los objetos skin y osd

#get the singletons so we get skin info and access the osd
skin = skin.get_singleton()
osd = osd.get_singleton()

skin.register(‘Stepmania’, (‘screen’, ‘title’, ‘info’, ‘plugin’))

Realmente solo se necesita el objeto skin, pero bueno.

Clase PluginInterface


class PluginInterface(plugin.MainMenuPlugin): “”“ A plugin to launch Stepmania Game To activate, put the following lines in local_conf.py:

plugin.activate(‘stepmania’, level=45) “”“ # make an init func that creates the cache dir if it don’t exist def init(self): plugin.MainMenuPlugin.init(self) def items(self, parent): return [ GameMainMenuItem(parent) ]

Como puede verse, en el constructor se invoca el constructor de la clase madre MainMenuPlugin. Existen otros tipos de plugins. Este plugin podría ser del tipo ItemPlugin para incorporarse como una acción más dentro de la categoría video, image o tv.

También puede verse que en vez de implementar una función actions creo una función items. Mi interpretación es que al crearse el plugin de tipo MainMenuPlugin, se obtiene una lista de items disponibles. Cada item retornado es una clase que sí que debe implementar los métodos actions y los comandos asociados.

En mi caso, la función items solo devuelve un elemento, que se corresponde con la clase GameMainMenuItem.

Clase GameMainMenuItem


class GameMainMenuItem(Item):

def init(self, parent): Item.init(self, parent, skin_type=‘Stepmania’) self.name = _(‘Stepmania’) def actions(self): “”“ return a list of actions for this item “”“ items = [ ( self.launch_game , _(‘Stepmania’ )) ] return items def launch_game(self, arg=None, menuw=None): popup_string=_(“Starting Stepmania…”) pop = PopupBox(text=popup_string) pop.show() os.system(‘stepmania’) pop.destroy() menuw.delete_menu(arg, menuw) menuw.refresh()

En su constructor se invoca el constructor del elemento en el menú principal de Freevo.

La lista de acciones solo devuelve una única acción que se corresponde con el método launch_game.

El método launch_game se limita a mostrar un popup y lanzar el comando del juego. A la vuelta del juego se destruye el popup y se refresca el menú.

Todo junto

A continuación todo el código del plugin para quien lo quiera utilizar:


#python modules
import os, time, stat, re, copy

#freevo modules
import config, menu, rc, plugin, skin, osd, util
from gui.PopupBox import PopupBox
from item import Item

#get the singletons so we get skin info and access the osd
skin = skin.get_singleton()
osd = osd.get_singleton()

skin.register(‘Stepmania’, (‘screen’, ‘title’, ‘info’, ‘plugin’))

class PluginInterface(plugin.MainMenuPlugin): “”“ A plugin to launch Stepmania Game

To activate, put the following lines in local_conf.py: plugin.activate(‘stepmania’, level=45) “”“ # make an init func that creates the cache dir if it don’t exist def init(self): plugin.MainMenuPlugin.init(self) def items(self, parent): return [ GameMainMenuItem(parent) ]

class GameMainMenuItem(Item):

def init(self, parent): Item.init(self, parent, skin_type=‘Stepmania’) self.name = _(‘Stepmania’) def actions(self): “”“ return a list of actions for this item “”“ items = [ ( self.launch_game , _(‘Stepmania’ )) ] return items def launch_game(self, arg=None, menuw=None): popup_string=_(“Starting Stepmania…”) pop = PopupBox(text=popup_string) pop.show() os.system(‘stepmania’) pop.destroy() menuw.delete_menu(arg, menuw) menuw.refresh()

Tan solo hay que guardar el contenido con el nombre stepmania.py y copiarlo en el directorio /usr/share/python-support/python-freevo/freevo/plugins. Y ejecutar el comando.

# update-python-modules -i /usr/share/python-support/python-freevo

Para invocarlo, tal y como se explica en los comentarios del código, hay que incluir lo siguiente en el fichero /etc/freevo/local_conf.py

plugin.activate('stepmania', level=45)
Referencias