#!/usr/bin/env python# -*- coding: utf-8 -*-################################################################################ Gejengel Remote Control for XChat# Controla y muestra información sobre la pista en reproducción en Gejengel.# Requisitos: Plugin DBus de Gejengel activado.# Copyright (C) 2009 Juan Riquelme a.k.a Soulchainer (J.R.G)# <soulchainer@soulchainer.net>############################################################################################################################################################### ChangeLog:# * Version 0.1 creada el 2009-09-19# * Version 0.2# - Corregido problema con tags con contenido no ASCII.# - Corregida función duración###############################################################################import xchatimport dbus__module_name__ = 'Gejengel Remote Control'__module_version__ = '0.1'__module_description__ = 'Control remoto de Gejengel para XChat. Con opción ''\"Reproduciendo ahora\".'__module_autor__ = 'Juan Riquelme a.k.a Soulchainer (J.R.G) ''<soulchainer@soulchainer.net>'def estado(): """ Devuelve el estado actual del reproductor: tupla (valor, 'mensaje estado') valor: 2 detenido, 1 pausado, 0 reproduciendo, None no está ejecutándose. """ global reproductor if reproductor == None: return (None, 'Gejengel no está ejecutándose') else: status = reproductor.GetStatus()[0] if status == 0: return (0, 'Gejengel está reproduciendo') elif status == 1: return (1, 'Gejengel está pausado') else: return (2, 'Gejengel está detenido')def player(): """ Conecta con el bus de la sesión y, si existe, obtiene la interfaz del reproductor """ global reproductor bus = dbus.SessionBus() try: # Creamos un objeto proxy para el objeto /Player en org.mpris.gejengel obj = bus.get_object('org.mpris.gejengel', '/Player') # Obtenemos un objeto dbus.Interface para llamar a sus metodos desde el reproductor = dbus.Interface(obj,'org.freedesktop.MediaPlayer') except dbus.exceptions.DBusException: # El reproductor no está ejecutándose reproductor = Nonedef titulo(): """ Devuelve el título de la canción en reproducción. """ global tags return tags['title'].encode('utf-8')def artista(): """ Devuelve el nombre del artista/grupo autor de la canción en reproducción """ global tags return tags['artist'].encode('utf-8')def album(): """ Devuelve el nombre del album de la canción en reproducción """ global tags return tags['album'].encode('utf-8')def duracion(segundos): """ Devuelve una cadena '(hh:)mm:ss' con la duración de la pista en reproducción """ minutos, segundos = divmod(segundos, 60) horas, minutos = divmod(minutos, 60) time = '%02d:%02d' % (minutos, segundos) if horas: time = '%02d:%s' % (horas, time) return timedef posicion(): """ Devuelve la posición actual del reproductor sobre la canción en reproducción """ global reproductor # Obtenemos la duración en milisegundos y le damos formato con duracion() return duracion(reproductor.PositionGet() / 1000)def calidad(): """ Devuelve la tasa de bits del fichero de audio en reproducción """ global tags return '{0} {1}'.format((tags['audio-bitrate'] / 1000), 'kb/s')def reproduciendo(word, word_eol, userdata): """ Devuelve una cadena con info sobre lo que está reproduciendo Gejengel. """ global reproductor, tags player() status = estado() if status[0] in (0, 1): # Extraemos metadatos de la pista. Un diccionario con parejas tag: valor tags = reproductor.GetMetadata() # Armamos la cadena que usaremos en XChat para mostrar lo que oimos xchat.command('me esta escuchando {0} de {1} [Album: {2} | Duración: {3}' ' | Posición: {4} | Calidad : {5}]'.format(titulo(), artista(), album(), duracion(tags['time']), posicion(), calidad())) else: print status[1] return xchat.EAT_ALLdef play(word, word_eol, userdata): """ Inicia la reproducción. Si no es posible muestra mensaje de estado. """ global reproductor player() status = estado() if status[0] in (1, 2): reproductor.Play() else: print status[1] return xchat.EAT_ALLdef pause(word, word_eol, userdata): """ Pausa/Reanuda la reproducción. Si no es posible muestra mensaje de estado. """ global reproductor player() status = estado() if status[0] == 0: reproductor.Pause() elif status[0] == 1: reproductor.Play() else: print status[1] return xchat.EAT_ALLdef stop(word, word_eol, userdata): """ Detiene la reproducción. Si no es posible muestra mensaje de estado. """ global reproductor player() status = estado() if status[0] in (0, 1): reproductor.Stop() else: print status[1] return xchat.EAT_ALLdef next(word, word_eol, userdata): """ Avanza en la playlist. Si no es posible muestra un mensaje de estado. """ global reproductor player() status = estado() if status[0] in (0, 1): reproductor.Next() else: print status[1] return xchat.EAT_ALLdef vol(word, word_eol, userdata): """ Establece el volumen. Recibe una cifra entre 0 (mínimo) y 100 (máximo). """ global reproductor player() status = estado() if status[0] != -1: # Establece el volumen dado si está entre 1 y 100, sino no hace nada if 0 <= word[1] <= 100: reproductor.VolumeSet(word[1]) else: print status[1] return xchat.EAT_ALL# Creamos los comandos de XChat y los enlazamos con las funcionesxchat.hook_command('playing', reproduciendo, help="/playing Muestra lo que estamos reproduciendo en Gejengel")xchat.hook_command('play', play, help="/play Continua o inicia la reproducción en Gejengel")xchat.hook_command('pause', pause, help="/pause Pausa (o continua) la reproducción de la pista actual en Gejengel")xchat.hook_command('stop', stop, help="/stop Detiene la reproducción de la pista actual en Gejengel")xchat.hook_command('next', next, help="/next Salta al siguiente elemento de la lista de reproduccion de Gejengel")xchat.hook_command('vol', vol, help="/vol 0-100 Establece el volumen de Gejengel entre 0 (sin sonido) y 100 (volumen máximo)'")