<?xml version="1.0" encoding="utf-8"?>
        <?xml-stylesheet type="text/css" href="http://www.orvtech.com/styles/feed.css"?>
<rss version="2.0"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title>Categorizado como: last_fm | Linux y el NSLU2</title>
<atom:link href="http://www.orvtech.com/archives/last_fm/index-rss.xml" rel="self" type="application/rss+xml" />
<link>http://www.orvtech.com</link>
<description></description>
<dc:language>es-ve</dc:language>
<dc:creator>orvtech</dc:creator>
<dc:date>2010-09-02T18:22:06-04:00</dc:date>
<admin:generatorAgent rdf:resource="http://nanoblogger.sourceforge.net" />
<image><link>http://www.orvtech.com</link><url>http://www.orvtech.com/images/feedicon.png</url><title>Categorizado como: last_fm | Linux y el NSLU2</title></image>
<item>
<link>http://www.orvtech.com/archives/2010/04/12/audio_via_bluetooh_desde_el_nslu2/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2010/04/12/audio_via_bluetooh_desde_el_nslu2/index.html</guid>
<title>Audio via bluetooh desde el NSLU2.</title>
<dc:date>2010-04-12T11:04:43-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts, NSLU2, last_fm</dc:subject>
<description><![CDATA[<p>
<a href="http://twitter.com/POTUSCamacho" rev="Autor de esta guia">@POTUSCamacho</a> tiene un articulo interesante acerca de como usar el NSLU2 en conjunto con un adaptador USB de bluetooh como un servidor de audio. POTUSCamacho explica como hacerlo usando un adaptador con audio 'mono' pero aclara que debería de ser posible lograr lo mismo usando uno estéreo.
</p>
<p>
Echemosle un vistazo a esta guia.
</p>
<blockquote cite="http://potuscamacho-industries.blogspot.com/2010/04/linksys-nslu2-utilizing-bluetooth-audio.html"> 

<p>
Una vez que ya se tenga el firmware de Ubuntu instalado en el NSLU2, podemos hacer login y actualizar nuestros paquetes. 
</p> 
<textarea style="height: 18px" class="bashcode"> sudo -i apt-get update</textarea> 
<p> 
Luego instalamos los siguientes paquetes:
</p> 
<textarea style="height: 35px" class="bashcode">sudo -i apt-get install linux-sound-base bluetooth bluez bluez-alsa bluez-btsco bluez-compat bluez-utils python python-bluez vlc</textarea> 
<p><i> 
Nota: Yo hago bastante desarrollo en mi NSLU2 así que puede ser que falte algún paquete aquí.
</i><br /> 
Ahora que ya tenemos los paquetes que necesitavamos instalados, crearemos el archivo .asoundrc en nuestro directorio home. Aquí un ejemplo:
</p> 
<textarea style="height: 50px" class="bashcode">pcm.bluetooth {
type bluetooth
device 00:00:00:00:00:00
}</textarea> 
<p> 
Editamos la sección del dispositivo para poner el MAC address de nuestros audífonos bluetooh. Para conseguir esta MAC address puedes resetear el adaptador ejecutando el comando: 
</p> 
<textarea style="height: 18px" class="bashcode">hciconfig hci0 reset</textarea> 
<p> 
Luego configura tus audífonos para que estén en modo 'pairing' y ejecuta el siguiente comando: 
</p> 
<textarea style="height: 18px" class="bashcode">sdptool browse</textarea> 
<p> 
Ahora copia el siguiente script hecho en python en un archivo que se llame pair.py 
</p> 
<textarea style="height: 480px" class="bashcode">#!/usr/bin/python

import gobject

import sys
import dbus
import dbus.service
import dbus.mainloop.glib

class Rejected(dbus.DBusException):
_dbus_error_name = "org.bluez.Error.Rejected"

class Agent(dbus.service.Object):
exit_on_release = True

def set_exit_on_release(self, exit_on_release):
self.exit_on_release = exit_on_release

@dbus.service.method("org.bluez.Agent",
in_signature="", out_signature="")
def Release(self):
print "Release"
if self.exit_on_release:
mainloop.quit()

@dbus.service.method("org.bluez.Agent",
in_signature="os", out_signature="")
def Authorize(self, device, uuid):
print "Authorize (%s, %s)" % (device, uuid)
authorize = raw_input("Authorize connection (yes/no): ")
if (authorize == "yes"):
return
raise Rejected("Connection rejected by user")

@dbus.service.method("org.bluez.Agent",
in_signature="o", out_signature="s")
def RequestPinCode(self, device):
print "RequestPinCode (%s)" % (device)
return raw_input("Enter PIN Code: ")

@dbus.service.method("org.bluez.Agent",
in_signature="o", out_signature="u")
def RequestPasskey(self, device):
print "RequestPasskey (%s)" % (device)
passkey = raw_input("Enter passkey: ")
return dbus.UInt32(passkey)

@dbus.service.method("org.bluez.Agent",
in_signature="ou", out_signature="")
def DisplayPasskey(self, device, passkey):
print "DisplayPasskey (%s, %d)" % (device, passkey)

@dbus.service.method("org.bluez.Agent",
in_signature="ou", out_signature="")
def RequestConfirmation(self, device, passkey):
print "RequestConfirmation (%s, %d)" % (device, passkey)
confirm = raw_input("Confirm passkey (yes/no): ")
if (confirm == "yes"):
return
raise Rejected("Passkey doesn't match")

@dbus.service.method("org.bluez.Agent",
in_signature="s", out_signature="")
def ConfirmModeChange(self, mode):
print "ConfirmModeChange (%s)" % (mode)

@dbus.service.method("org.bluez.Agent",
in_signature="", out_signature="")
def Cancel(self):
print "Cancel"

def create_device_reply(device):
print "New device (%s)" % (device)
mainloop.quit()

def create_device_error(error):
print "Creating device failed: %s" % (error)
mainloop.quit()

if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object("org.bluez", "/"),
"org.bluez.Manager")

if len(sys.argv) > 1:
path = manager.FindAdapter(sys.argv[1])
else:
path = manager.DefaultAdapter()

adapter = dbus.Interface(bus.get_object("org.bluez", path),
"org.bluez.Adapter")

path = "/test/agent"
agent = Agent(bus, path)

mainloop = gobject.MainLoop()

if len(sys.argv) > 2:
if len(sys.argv) > 3:
device = adapter.FindDevice(sys.argv[2])
adapter.RemoveDevice(device)

agent.set_exit_on_release(False)
adapter.CreatePairedDevice(sys.argv[2], path, "DisplayYesNo",
reply_handler=create_device_reply,
error_handler=create_device_error)
else:
adapter.RegisterAgent(path, "DisplayYesNo")
print "Agent registered"

mainloop.run()

#adapter.UnregisterAgent(path)
#print "Agent unregistered"</textarea> 

<p> 
Ahora pon tus audífonos en modo 'pairing' de nuevo y ejecuta este comando: 
</p> 
<textarea style="height: 18px" class="bashcode">sudo -i python pair.py hci0 00:00:00:00:00:00</textarea> 

<p> 
Una vez mas, recuerda remplazar el MAC address con el de tus audífonos. 
El ultimo paso involucra editar el vlcrc, para hacer esto puedes ejecutar:
</p> 

<textarea style="height: 18px" class="bashcode">pico .vlc/vlcrc</textarea> 

<p> 
Recorre el archivo y remplaza:
</p> 

<textarea style="height: 18px" class="bashcode">alsadev=(default soundcard) </textarea> 

<p>Por:</p> 

<textarea style="height: 18px" class="bashcode">alsadev=bluetooth</textarea> 

<p> 
Si el archivo no existe, entonces créalo:
</p> 

<p> 
A este punto ya deberías de poder escuchar en tus audífonos. Para escuchar el audio de NASA TV (video online), puedes ejecutar:
</p> 

<textarea style="height: 18px" class="bashcode">cvlc --aout-rate 8000 --novideo http://www.nasa.gov/55644main_NASATV_Windows.asx</textarea> 

<p> 
Si todo esta bien, deberías de escuchar el audio. Cuando ejecutando estos comandos, recuerda el el sample rate debe de ser de 8000Hz ya que esto es lo que los audífonos soportan. 
</p> 

<p> 
Para configurar otros audífonos o re-conectar los actuales, el archivo  /var/lib/bluetooth/&lt;tu MAC address&gt;/linkkeys debe de ser eliminado. Este se re-creara una vez que el dispositivo se vuelva a conectar. Si conectas otros audífonos, también debe de editar el archivo .asoundrc 
</p></blockquote>
<p>
Para mas información, no dudes en visitar el blog de  <a href="http://potuscamacho-industries.blogspot.com/2010/04/linksys-nslu2-utilizing-bluetooth-audio.html">POTUSCamacho Industries</a>. 
</p>]]></description>

</item>
<item>
<link>http://www.orvtech.com/archives/2009/11/30/el_nslu2_como_un_puente_de_last_fm_a_twitter/index.html</link>
<guid isPermaLink="true">http://www.orvtech.com/archives/2009/11/30/el_nslu2_como_un_puente_de_last_fm_a_twitter/index.html</guid>
<title>El NSLU2 como un puente de last.fm a twitter.</title>
<dc:date>2009-11-30T16:57:10-04:00</dc:date>
<dc:creator>orvtech</dc:creator>
<dc:subject> Linux, Scripts, NSLU2, Twitter, last_fm, IRC</dc:subject>
<description><![CDATA[<p>Este script nació de la necesidad (ocio?) de actualizar mi estado en <a href="http://twitter.com/m1n1m3">twitter</a> con la canción que estaba escuchando en mi iPhone. El detalle esta en que solo actualizara mi perfil si la canción esta marcada como 'loved' en last.fm también detecta que día de la semana es y evalúa si es necesario agregar el hash tag <a href="http://twitter.com/#search?q=%23mm"><i>#mm</i></a>.</p>

<!-- <textarea class="bashcode" readonly>twitter_user="<your_twitter_user_here>" //-->
<pre lang="CC">
twitter_passwd=&#34;your_twitter_password_here&#34;&#39;
URL=&#34;http:&#47;&#47;twitter.com&#47;statuses&#47;update.xml&#34;&#39;
tags=&#34;#lastfm&#34;&#39;
lastfm_api=&#34;&lt;your_api_from_lastfm_here&gt;&#34;&#39;
lastfm_user=&#34;&lt;your_lastfm_user_here&gt;&#34;&#39;
bit_ly_user=&#34;&lt;your_bit.ly_user_here&gt;&#34;&#39;
bit_ly_apikey=&#34;&lt;your_bit.ly_api_key_here&gt;&#34;&#39;
&#39;
fmtwitted=`cat &#47;tmp&#47;lastfm2twitter.tmp | \&#39;
sed -e 's&#47;status=Just played: &#47;&#47;g' -e 's&#47;#.*&#47;&#47;g' | \&#39;
grep '&#91;a-z&#93;'|sed -e 's&#47;\ &#47;&#47;g' -e 's&#47;\-&#47;.&#47;g'`&#39;
&#39;
fmcurrent=`curl -s &#34;http:&#47;&#47;ws.audioscrobbler.com&#47;2.0&#47;?method=user.getrecenttracks&limit=1&user=$lastfm_user&api_key=$lastfm_api&#34; | \&#39;
grep -E '&lt;name&gt;|&lt;&#47;name&gt;|&lt;artist\ |&lt;&#47;artist&gt;' |\&#39;
head -n2| sed -e 's&#47;&lt;&#91;^&gt;&#93;*&gt;&#47;&#47;g' | tr '\n' '.' |\&#39;
sed -e 's&#47;\ &#47;&#47;g' -e 's&#47;.$&#47;&#47;g'`&#39;
&#39;
&#39;
lastfm_song_url=`curl -s &#34;http:&#47;&#47;ws.audioscrobbler.com&#47;2.0&#47;?method=user.getrecenttracks&limit=1&user=$lastfm_user&api_key=$lastfm_api&#34; |\&#39;
grep -E '&lt;url&gt;|&lt;&#47;url&gt;' | sed -e 's&#47;&lt;&#91;^&gt;&#93;*&gt;&#47;&#47;g' |\&#39;
head -n1| tr '\n' '.' | sed -e 's&#47;\ &#47;&#47;g' -e 's&#47;.$&#47;&#47;g'`&#39;
bit_ly_url=`curl -s &#34;http:&#47;&#47;api.bit.ly&#47;shorten?version=2.0.1&longUrl=$lastfm_song_url&login=$bit_ly_user&apiKey=$bit_ly_apikey&#34; | \&#39;
grep shortUrl | sed -e 's&#47;\&#34;&#47;\ &#47;g' | awk '{print $3}'`&#39;
&#39;
today_mm=`date +%A`&#39;
if &#91;&#91; $today_mm == &#34;Monday&#34;  &#93;&#93; &#39;
  then tags=&#34;$tags #mm&#34;&#39;
fi&#39;
&#39;
&#39;
if grep $fmcurrent &#47;tmp&#47;lastfm_loved.tmp  &gt; &#47;dev&#47;null&#39;
  then if &#91;&#91; &#34;$fmtwitted&#34; == &#34;$fmcurrent&#34; &#93;&#93;&#39;
      then exit 0&#39;
        else curl -s &#34;http:&#47;&#47;ws.audioscrobbler.com&#47;2.0&#47;?method=user.getrecenttracks&limit=1&user=$lastfm_user&api_key=$lastfm_api&#34; | \&#39;
	grep -E '&lt;name&gt;|&lt;&#47;name&gt;|&lt;artist\ |&lt;&#47;artist&gt;' |\&#39;
	head -n2| sed -e 's&#47;&lt;&#91;^&gt;&#93;*&gt;&#47;&#47;g' | tr '\n' '-' | \&#39;
	sed -e 's&#47;^&#91; \t&#93;*&#47;&#47;' -e 's&#47;-&#47;\ -\ &#47;g' -e 's&#47;- $&#47;&#47;g' -e 's&#47;\ $&#47;&#47;g' |\&#39;
	awk '{print &#34;status=Just played: &#34;$0}' &gt; &#47;tmp&#47;lastfm2twitter.tmp&#39;
	lastfm2twitter=`cat &#47;tmp&#47;lastfm2twitter.tmp; &#39;
	echo $bit_ly_url &#39;
	echo $tags | tr '\n' ' '`&#39;
	echo $lastfm2twitter &gt; &#47;tmp&#47;lastfm2twitter.tmp&#39;
	curl -s -u $twitter_user:$twitter_passwd -d @&#47;tmp&#47;lastfm2twitter.tmp $URL &gt; &#47;dev&#47;null&#39;
	  fi&#39;
	  else exit 0&#39;
fi&#39;
</pre>
<!-- </textarea> //-->
<br />
<p>Como se pueden dar cuenta estoy usando bit.ly para acortar las URLs de last.fm para lo cual tendrán que obtener una API Key. Aun tengo que optimizar el script guardando las peticiones de curl en un archivo y formar algo así como un cache o base de datos local de last.fm a bit.ly.
</p><p>
El script detecta si el mensaje sobrepasa el limite de 140 caracteres permitido por twitter y acorta el mensaje antes de enviarlo. 
</p> ]]></description>

</item>
</channel>
</rss>
