All pastes #1575438 Raw Edit

XChat Gejengel Remote Control

public python v1 · immutable
#1575438 ·published 2009-09-22 17:19 UTC
rendered paste body
#!/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.###############################################################################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(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 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)'")