Skip navigation.
Home

blogs

Rhythmbox, letras de canciones y Python

Quienes usan Rhythmbox, seguramente han utilizado el complemento (plugin) «Lyrics» que busca las letras de canciones en conocidos sitios web que guardan cientos de letras.

El complemento «Lyrics» es una colección de pequeños programas Python que buscan la página web con la letra, que luego se conviert a texto plano y finalmente se muestra una ventana con la letra de la canción, la búsqueda se hace en sitios específicos.

Mi encuentro con este complemento se dió buscando apoyar mi aprendizaje de Portugués, por que pienso que al escuchar música en un idioma y cantarla tiene efectos positivos en la pronunciación y entrenamiento del oído a reconocer sonidos de otro idioma. Para mi mala suerte, el complemento Lyrics no busca letras en sitios de lengua portuguesa, en particular del Brasil. Así que me puse a desempolvar mis oxidadas habilidades para leer y escribir código, y de paso a recordar mis mínimos conocimientos de python. El trabajo me tomó unos días y finalmente tengo casi terminado el código que busca letras de canciones en portugués, estoy usando el sitio de Terra brasilero, que gentilmente proporciones cientos de letras.

Aún queda corregir el siguiente error que se presenta al recuperar algunas letras de canciones:

Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed

No hice una investigación profunda del tema pero hasta donde pude ver el problema se debe al tipo de codificación de la página web. En los próximos días voy a indagar mas el tema y cuando esté resuelto será buena idea limpiar el código y ponerse en contacto con el desarrollador del componentente Lyrics y ver si acepta mi contribución de código.

Para los interesados en como se hizo, aquí van algunas simples notas:

  • En mi Ubuntu Hardy el código del complemento «Lyrics» está en /usr/lib/rhythmbox/plugins/lyrics/
  • LyricsConfigureDialog.py contiene las opciones para habilitar los sitios de letras, en el diálogo de preferencias del componente
  • LyricsParse.py es el código maestro que busca la letra de la canción en cada uno de los sitios de letras.
  • SitioParser.py contiene el código específico que consulta el sitio de letras, analiza la respuesta y prepara el resultado final.
  • Y como siempre: use the force, read the source code

Actualización
(Vierenes 17-Abr-2009 16:39)

Esta tarde me puse a corregir los errores, y a mejorar la conversión de entidades HTML para representar caracteres del alfabeto portugués a su valor correcto en UTF-8. Otra vez San Google(tm) fue de gran ayuda para resolver los problemas.

El error:

Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed

Se debía al uso de caracteres no UTF-8 para mostrar via GtkTextBuffer, esta simple línea corrigió el asunto:

result = result.decode('iso-8859-1').encode('UTF-8')

Para convertir entidades HTML a UTF-8 tomé el método _replace_entity de django/utils/text.py.

Aquí está la versión final del código (perdón por la identación, es culpa del blog).


# -*- Mode: python; coding: utf-8; tab-width: 8; indent-tabs-mode: t; -*-
#
# Copyright (C) 2007 Hardy Beltran Monasterios
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
.
import urllib
import rb
import re
import sys
.
# Deal with html entitys and utf-8
# Code taken from
# django/utils/text.py
.
from htmlentitydefs import name2codepoint
.
pattern = re.compile("&(\w+?);")
.
def _replace_entity(match):
text = match.group(1)
if text[0] == u'#':
text = text[1:]
try:
if text[0] in u'xX':
c = int(text[1:], 16)
else:
c = int(text)
return unichr(c)
except ValueError:
return match.group(0)
else:
try:
return unichr(name2codepoint[text])
except (ValueError, KeyError):
return match.group(0)
.
def unescape_entities(text):
return pattern.sub(_replace_entity, text)
.
.
class TerraParser (object):
def __init__(self, artist, title):
self.artist = artist
self.title = title
.
def search(self, callback, *data):
path = 'http://letras.terra.com.br/'
.
artist = urllib.quote(self.artist)
title = urllib.quote(self.title)
join = urllib.quote(' - ')
.
wurl = 'winamp.php?t=%s%s%s' % (artist, join, title)
print >> sys.stderr, 'Searching Lyric: %s' % path+wurl
.
loader = rb.Loader()
loader.get_url (path + wurl, self.got_lyrics, callback, *data)
.
def got_lyrics(self, result, callback, *data):
if result is None:
callback (None, *data)
return
.
if result is not None:
result = result.decode('iso-8859-1').encode('UTF-8')
if re.search('Música não encontrada', result):
callback (None, *data)
elif re.search('', result):
callback(self.parse_lyrics(result), *data)
else:
callback (None, *data)
else:
callback (None, *data)
.
.
def parse_lyrics(self, source):
source = re.split('', source, 1)[1]
source = re.split('', source, 2)
# Parse artist and title
song = re.sub('', '', source[0])
song = re.split('\n', song)
title = "%s - %s\n\n" % (song[1], song[0])
# Parse lyrics
lyrics = re.split('

Actualizando Ubuntu 6.06 Dapper Drake a 8.04 Hardy Heron

El dia de ayer, aprovechando el feriado del 6 de Agosto, me decidí actualizar mi sistema AMD64 que tiene Ubuntu Dapper Drake 6.06 LTS a Hardy Heron 8.04.

Según la documentación oficial la forma de actualizar es utilizar el "CD Alternate" y lanzar el utilitario de actualización.

Después de varios intentos fallidos, no me quedó otra que realizar una nueva instalación. Pero también tuve problemas con mi chip SATA, un problema bien conocido (Bug #190492), que se debe a un conflicto con el chip SATA VIA VT8251, que está presente en mi tarjeta madre ASUS A8V-MX.

Modificando una imagen ISO (IPCop Firewall)

He estado usando IPCop Firewall por un tiempo y en mis instalaciones generalmente añado módulos adicionales. El CD oficial de IPCop no trae estos módulos, así que uno necesita descargarlos.

Decidí entonces que quería modificar el CD de IPCop para incluir estos módulos, se podría hacer de dos maneras la simple e inmediata y otra más elaborada.

  • La manera simple es añadir un directorio al CD de IPCop y copiar allí los módulos. Para usarlos se tendría que seguir el procedimiento indicado para cada módulo.
  • La manera más elaborada es modificar la distribución de IPCop, esto es hacer una instalación habitual, incluir y configurar los módulos y a partir de allí crear la distribución y hacer un nuevo CD de IPCop.

Desempeño de VMWare y Ubuntu 6.06 LTS

Tengo dos sistemas corriendo Ubuntu 6.06 LTS y en cada uno de ellos uso VMWare 1.0.4

Uno de mis sistemas utiliza un procesador AMD Athlon(tm) 64 Processor 3000+, donde no experimenté ningún problema de desempeño con VMware. Mi otro sistema es un Intel(R) T2080 donde si experimenté problemas.

El sistema Intel muestra una serie de mensajes al usar la orden dmesg en el anfitrión (Ubuntu 6.06 LTS)


[17184331.536000] rtc: lost some interrupts at 2048Hz.
[17184331.556000] rtc: lost some interrupts at 2048Hz.
[17184331.576000] rtc: lost some interrupts at 2048Hz.
[17184331.596000] rtc: lost some interrupts at 2048Hz.

Peleando con VMWare Server 1.0.1 y Debian 4 (Etch) virtual

Estos días estuve peleando con VMware Server 1.0.1 build 29996 y una máquina virtual corriendo Debian 4.

El problema lo tenía al configurar la red. Debian cargaba el módulo pcnet32, y también el módulo vmxnet. Esto resultaba en una interfaz eth1 y no eth0 que es lo correcto.

# cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 560 8 0 0 0 0 0 0 560
8 0 0 0 0 0 0

Se acerca el Congreso de Software Libre 2007

En las siguientes semanas voy a estar preparando mi agenda para viajar a la ciudad de Santa Cruz (Bolivia), para estar presente en el 7mo Congreso Nacional de Software Libre.

Espero tener un par de charlas y uno o dos talleres, todo dependerá que me logre organizar y pueda hacer mis propuestas a los organizadores, que este año es el Grupo de Usuarios Linux de Santa Cruz (GLISC).

Espero ver a mucha gente en el congreso, y también a ti que estás leyendo esto ;-).

No quiero que Evo hable de Software Libre

Muchos se caeran de espaldas luego de leer el título de este texto, no porque diga «Evo» y no Señor presidente Evo Morales, si no porque todo el mundo se imagina que siendo un simpatizante del software libre yo debería estar a favor de que el presidente de Bolivia, Evo Morales se pronuncie a favor, como lo hiceron ya otros presidentes de la región.

Este tema se toca una y otra vez en la lista general@slob y hace poco en un mensaje reciente Dydier Rojas preguntaba ¿ Cuándo Evo Morales se pronunciará al respecto ?.

Flash Player 9 Linux en AMD64 con Ubuntu Dapper Drake

Hace poco más de un mes atrás, en un mensaje que envié a la lista general@slob, mencioné que no podía ver páginas con Flash 9 porque no había una versión para Linux que corriera sobre AMD64.

Un tiempo después (5-Marzo-2007), leí ésta respuesta, donde me sugerían usar nspluginwrapper. Que en términos sencillos es un complemento (plugin) que permite usar otros complementos no construidos para una plataforma específica. En mi caso me permite usar el complemento de Flash Player 9 para Linux Intel x86 en mi plataforma AMD64.

hardy.com.bo con problemas

Este sitio www.hardy.com.bo, estuvo con problemas el día 2 de Marzo. Como me encontraba de viaje no pude atender el problema y recién el sábado 3 por la tarde, cuando me liberé de compromisos laborales pude atender el asunto.

El problema fue solucionado sin mayor dificultad, la razón fue simple "espacio en disco agotado" :-).

Personería Jurídica de la Asociación en marcha

Finalmente hemos llegado al punto en que iniciamos los trámites con un abogado. La semana pasada dejé los borradores de nuestro estatuto y desde la semana que viene empezamos a trabajar en el asunto a toda máquina.

Debo agradecer a varias personas de la comunidad boliviana de Software Libre, por su apoyo en esta tarea (en particular para financiar los trámites).

Dydier Rojas
Pablo Azero
Rodolfo Alcazar
Ruben Valverde
Erick Choque Navia
Alberto Coronado
Alfonso Fernandez
Rodrigo Siles
Rolando Espinoza
Esteban Lima
Leonardo Cavero
Eloy Espozo
Rodrigo Rodriguez (Abogado)

XML feed