Opa,
Você sabe o que são plugins? Não sabe?
Um plugin é um programa que você instala em algum outro programa e executa uma determinada tarefa especifica, por exemplo o plugin Arte de Capa do player de musica do Ubuntu, Rhythmbox. Esse plugin busca a capa do album do qual a musica que está sendo tocada pertence e o mostra do lado esquerdo no player.
Esse post tem duas funções. A primeira é destrinchar códigos de algum plugin que já foi criado para esse player, e ensinar com isso como fazer um plugin para o Rhythmbox, mostrando assim a API do rb e do rhythmdb (bibliotecas para criar os tais plugins para o Rhythmbox). A segunda é fazer um plugin parte a parte testar e por pra funfar (funcionar).
Para a primeira parte deste post, o destrinchamento de um plugin, peguei o twitter_plugin do Ryuzo Yamamoto. Vou explicar apenas a classe TwitterPlugin. Então vamos ao código:
CODE
import rhythmdb, rb #a parte que realmente nos interessa, por hora, a lib do rhythmbox
import gobject
import gtk, gtk.glade
import gconf, gnomevfs, gnome
import twitter
import os
gconf_keys = { 'username': '/apps/rhythmbox/plugins/twitter-plugin/username',
'password': '/apps/rhythmbox/plugins/twitter-plugin/password'
}
class TwitterPlugin(rb.Plugin):
def __init__(self):
rb.Plugin.__init__(self)
def activate(self, shell):
self.shell = shell
player = shell.get_player()
self.psc_id = player.connect ('playing-song-changed', self.song_change)
self.lastStatus = ""
if player.get_playing_entry():
self.song_change (player, player.get_playing_entry())
self.db = None
def deactivate(self, shell):
self.shell.get_player().disconnect (self.psc_id)
del self.psc_id
if self.db:
del self.db
del self.shell
del self.lastStatus
def get_twitter_api(self):
username = gconf.client_get_default().get_string(gconf_keys['username'])
password = gconf.client_get_default().get_string(gconf_keys['password'])
api = twitter.Api(username, password);
api.SetSource('rhythmboxtwitterplugin')
api.SetXTwitterHeaders('Rhythmbox twitter-plugin', 'http://trac.codecheck.in/share/browser/platform/rhythmbox/twitter-plugin', '0.1')
return api
def song_change(self, player, entry):
artist = None
album = None
title = None
if entry:
artist = self.get_song_info(entry)[0]
album = self.get_song_info(entry)[1]
title = self.get_song_info(entry)[2]
response = ""
if artist != None:
response = artist
if album != None:
if response:
response += " - " + album
else:
response = album
elif title != None:
if response:
response += " - " + title
else:
response = title
newStatus = 'Listening to '+response
if response and newStatus != self.lastStatus:
self.get_twitter_api().PostUpdate(newStatus)
self.lastStatus = newStatus
def get_song_info(self, entry):
self.db = self.shell.get_property('db')
artist = self.db.entry_get (entry, rhythmdb.PROP_ARTIST) or None
album = self.db.entry_get (entry, rhythmdb.PROP_ALBUM) or None
title = self.db.entry_get(entry,rhythmdb.PROP_TITLE) or None
return (artist,album,title)
def create_configure_dialog(self, dialog=None):
if not dialog:
glade_file = self.find_file("twitter-plugin-prefes.glade")
dialog = TwitterConfigureDialog (glade_file).get_dialog()
dialog.present()
return dialog
Depois dessa porrada de código, vamos as explicações:
O primeiro e mais importante é importar os módulos necessários, no nosso caso vamos prender a atenção apenas nos módulos rb e rhythmdb. Estes dois modulos nos dão a API para manusear o Rhythmbox. Na definição da classe temos TwitterPlugin(rb.Plugin), assim nossa classe herda de rb.Plugin tudo que nós precisamos. E no contrutor dessa classe,__init__(self):, é chamado o construdor da classe herdada rb.Plugin.__init__(self):.
Antes de entrar em detalhes no código é preciso esclarecer algumas pontos importantes sobre a criação de plugins no Rhythmbox.
Todo plugin do RBOX tem sempre os dois métodos activate e deactivate. O método activate é o método que define o que o plugin faz quando ele for ativado. Já o deactivate é o método que é executado quando o plugin é desativado. Além disso a janela que você vê no RBOX é chamada de shell, e sempre que um plugin é iniciado com a classe rb.Plugin, ele cria uma instância para shell. Em shell é encontrado tudo que você precisa para manipular o RBOX e fazer o seu plugin, desde manipular se uma musica toca ou não, ou manipular alguma coisa da interface gráfica. É por isso que quando criamos o método activate o shell é passado junto como parametro, afinal ele é a peça mais importante da API. O shell é como um mural onde agente vai colar tudo que o player tem e faz.
Método activate
Quando fazemos shell.get_player(), capturamos o player e seus métodos, Logo depois em self.psc_id = player.connect(‘signal’, função), conectamos ao player a função song_change, que será chamada quando houver mudança de faixa. Há nove tipos de sinais que podem ser passados, para mais detalhes consulte: RBShellPlayer. Em seguida é checado com o player.playing_get_entry() se tem alguma musica sendo tocada ou pausada. Esse método retorna um objeto RhythmbDBEntry em caso positivo e None em caso negativo. Com o objeto RhythmDBEntry é possível usar o metodo get_playback_uri() e recuperar a uri da faixa que está sendo tocada. Muito bem, no if ele verifica se alguma musica está sendo tocada, se sim ele chama a função song_change() passando o player e o objeto RhythmDBEntry para ser manipulado mais à frente. Antes de encerrar sobre o método activate, repare que temos duas variaveis uma é lasStatus e a outra é db, mas a frente será explicado para que elas servem, mas a essa altura do campeonato já deve dá para perceber o que esse plugin faz, né?
Método deactivate
Como foi falado antes esse método é acionado quando o plugin é desativado, logo ele é o responsável pela ‘limpeza’, ou seja, ele disconecta o que tiver sido conectado, no nosso caso self.shell.get_player().disconnect (self.psc_id), e deleta os objetos que não serão mais usados.
Por enquanto eu vou dar uma pausa, e nos próximos posts irei explicar os outros métodos e falar um pouco mais da API. Quem quiser se divertir com o RBOX pode usar o Python Console no próprio player, Ferramentas > Python Console. Com isso você pode usar o dir() e conhecer por si só a API e vê como ele funciona. Se você quiser ler a documentação checa abaixo as referências. Então é isso, até o próximo post.
continua…
Referências:
Rhythmbox Plugins/Escrevendo
Rhythmbox Development Reference Manual
Read Full Post »