#!/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) # ############################################################################### ############################################################################### # ChangeLog: # * Version 0.1 creada el 2009-09-19 # * Version 0.2 # - Corregido problema con tags con contenido no ASCII. ############################################################################### import xchat import 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) ' '' 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 = None def 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(tiempo): """ Devuelve una cadena 'hh:mm:ss' con la duración de la canción en reproducción """ # Obtiene la parte de los minutos y los segundos time = '{0:0=2}:{1:0=2}'.format((tiempo / 60), (tiempo % 60)) # Si hay horas, las añade if tiempo / 3600: time = '{0}:{1}'.format((tiempo/ 3600), time) return time def 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_ALL def 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_ALL def 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_ALL def 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_ALL def 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_ALL def 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 funciones xchat.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)'")