Utilizando Ruby, ruby-dbus e librmpd para exibir “o que estou ouvindo” no Pidgin (Gaim)
Ok, acho que vocês já devem ter percebido que virou moda desde que ressucitei este blog usar uns títulos enormes cheios de nomes estranhos e só falar de Ruby. Bem... a descoberta de uma linguagem nova e seu estudo são sempre fascinantes, ainda mais com algo maravilhoso como o Ruby... é apaixonante.
Pra começo de conversa, esse post se propõe a criar um programa em Ruby que mostre a música que você está ouvindo no MPD (Music Player Daemon) no Pidgin. Não sei se a situação é comum, mas é a minha situação e não tinha encontrado outra solução antes, o que me levou a criar um script rubyano.
Para falar com o Pidgin, precisaremos de DBus. DBus é uma maneira inovadora de fazer dois ou mais programas se comunicarem. O HAL (Hardware Abstraction Layer - você provavelmente usa ele e não sabe) usa para fazer aquelas mágicas de montagem e desmontagem automáticas nas distribuições mais novas (inclusive no Slackware 12, e o Slackware tem fama de malvadão) e o Pidgin (nova versão do Gaim) também, para fazer quase tudo. Para acessar o DBus a partir do Ruby, usamos o ruby-dbus. É um projeto em desenvolvimento, que tem alguns bugs, mas nesse caso funciona como esperado.
Para falar com o MPD, precisaremos da libr(uby)mpd. É uma biblioteca extremamente simples de usar e vale a pena ler o código de sua classe pra descobrir suas várias funções e também conferir seus exemplos.
Instaladas essas duas coisas, lá vamos nós:
#!/usr/bin/ruby # MPD2Pidgin (por Tiago Madeira em 29/11/2007) # http://tiagomadeira.net/mpd2pidgin # # (cc) http://creativecommons.org/licenses/by-nc-sa/2.5/ require "dbus" require "rubygems" require "librmpd" class Pidgin2MPD def initialize @b=DBus::SessionBus.instance @s=@b.service("im.pidgin.purple.PurpleService") @o=@s.object("/im/pidgin/purple/PurpleObject") @o.introspect @i=@o["im.pidgin.purple.PurpleInterface"] end def change(msg) status=@i.PurpleSavedstatusFind("MPD2Pidgin").to_s.to_i if status==0 @i.PurpleSavedstatusNew("MPD2Pidgin", 2) status=@i.PurpleSavedstatusFind("MPD2Pidgin").to_s.to_i end @i.PurpleSavedstatusSetMessage(status, msg) @i.PurpleSavedstatusActivate(status) end end class MPD2Pidgin def initialize(host="localhost", port="6600") @host,@port=host,port @mpd=MPD.new @host, @port @mpd.register_callback(self.method('callback'), MPD::CURRENT_SONG_CALLBACK) end def start @mpd.connect true puts "Ctrl+D para fechar" t=Thread.new do readlines self.stop end t.join end def stop @mpd.disconnect end def callback(c) @current=c msg="♫ #{@current.title} - #{@current.artist}" # Personalize essa linha, é divertido. if !@pidgin @pidgin=Pidgin2MPD.new end @pidgin.change msg end end mpd=MPD2Pidgin.new # "127.0.0.1", "6600" # os argumentos são host e porta, para quem precisar mpd.start
Download: mpd2pidgin.rb
Não é brilhante? Só mandar rodar (salve em /usr/bin/mpd2pidgin pra facilitar) e ele mantém sua mensagem de exibição atualizada em todos os protocolos do Pidgin simultaneamente sem nenhum esforço. Qualquer dúvida, comentem.
Technorati Tags: ruby, programação, dbus, mpd, pidgin, gaim, im, music, ruby-dbus, librmpd
Compare Preços de: iPod, home theater, plasma, lcd, câmeras digitais, games, ps3


Muito maneiro!
Só uma coisa, esse ’status’ do Pidgin não pode ser visto por quem usa MSN né? Se ainda for assim é uma pena, vamos mostrar nossas músicas pra quem? A maioria dos meus contatos deve usar MSN!
Eu não uso o MPD mas pretendo experimentar em breve. Existem alguns plugins para o Listen, player que uso, que fazem isso. Vou dar uma olhada neles.
Esse acho que não consigo (ainda) fazer em Python. Quem sabe no final de semana eu responda!
Hmm… Não sei sobre o MSN. Hoje em dia todos meus contatos usam GTalk, é o único protocolo que tenho certeza que funciona.
O Listen é legal pra caramba também (minha namorada usou uma época), mas eu prefiro o MPD - não só por causa da leveza, mas principalmente porque as minhas músicas ficam todas no meu desktop que só serve como servidor de internet. Aí eu tenho configurado programas em todos os clientes pra conectar ao 192.168.1.1 e assim todos podem ficar por dentro das músicas. Agora todos que vem aqui ou até de fora (a porta 6600 está aberta…) podem mostrar que música está sendo ouvida aqui em casa.
DBus-Python, o MPD eu tive mais dificuldade de encontrar. Acho que você acha um cliente (tem vários em Python) e modifica usando pra callbackear.
Aguardo o pacman!
hehe