domenica 29 gennaio 2012
Plugin rai.tv per XBMC
Da parecchio aggiungerei...
Una possibilità di vedere le dirette Rai senza Silverlight è quella di usare RaiSmth https://addons.mozilla.org/it/firefox/addon/raismth/ (sorry only for linux).
martedì 6 aprile 2010
Aggiornamento del plugin rai.tv per XBMC

Ho aggiunto anche le dirette di Euronews e Rai International.
L'ho provato e ora funziona su mac, windows e ubuntu 10.4. Chi è interessato lo può trovare qui
P.S.
Da quanto riporta Flavio Tordini i signori di rainet hanno dichiarato guerra agli "hackers" e utilizzeranno il DRM di microsoft.
Ho paura che la visione degli streaming diventerà sempre più complicata.
Il plugin non funziona più.
Una possibilità di vedere le dirette Rai senza Silverlight è quella di usare RaiSmth https://addons.mozilla.org/it/firefox/addon/raismth/ (sorry only for linux).
domenica 28 marzo 2010
Aggiornamento del plugin rai.tv per XBMC

Basandomi sulle indicazioni di Flavio Tordini (a cui vanno tutti i miei ringraziamenti), ho aggiornato il plugin per XBMC per visualizzare le dirette Rai. Mi piacerebbe a questo punto inserire anche il titolo del programma in onda, non dovrebbe essere difficile.
domenica 17 gennaio 2010
Aggiornamento del plugin rai.tv per XBMC

Ho aggiornato in seguito ai cambiamenti effettuati nello streaming dei contenuti, il plugin per XBMC per visualizzare le dirette Rai. Lo si può trovare qui
sabato 21 novembre 2009
Creare un plugin per XBMC parte 3

lunedì 18 maggio 2009
Creare un plugin per XBMC parte 2

Scriviamo ora il plugin di XBMC per vedere le dirette web del sito rai.tv.
Abbiamo bisogno di:
i link degli streaming,
le icone della Rai e dei canali trasmessi,
le regex per l'estrazione degli url dai files asx.
I link degli streaming li abbiamo, le icone dei canali trasmessi le recuperiamo dal file xml scaricato (è il valore di <imageUnit name="nome canale - logo videowall" type="RaiTv RollOver Image"><image>/dl/images/nome icona.png</image>), mentre l'immagine della Rai la recuperiamo dal sorgente del sito (http://www.rai.tv/dl/RaiTV/images/logo_raitv.png).
Procediamo scaricando l'immagine della Rai nella directory del plugin rinominandola in default.tbn.
Editiamo il file default.py
nella routine CATEGORIES() inseriamo:
addDir('Rai1','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983',2,'http://www.rai.it/dl/images/1233832365974RaiUno_02.png')
addDir('Rai2','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=984',2,'http://www.rai.it/dl/images/1233832404832RaiDue02.png')
addDir('Rai3','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=986',2,'http://www.rai.it/dl/images/1233832447578RaiTre_02.png')
addDir('RaiNews24','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=1',2,'http://www.rai.it/dl/images/1233841893415RaiNews24_02.png')
addDir('RaiSport+','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=4145',2,'http://www.rai.it/dl/images/1233856927849raisport_.png')
addDir('RaiStoria','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=24269',2,'http://www.rai.it/dl/images/1233857018728raistoria.png')
addDir('RaiEdu','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=24268',2,'http://www.rai.it/dl/images/1233837355373RaiEdu1_02.png')
ovvero aggiungi un menu directory, con il nome Rai1, imposta il link http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983, imposta il mode 2, utilizza la funzione VIDEOLINKS() per l'elaborazione della regex e la creazione del menu con il link allo streaming, utilizza questa immagine come logo.
Nella routine VIDEOLINKS(url,name) inseriamo:
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')
response = urllib2.urlopen(req)
link=response.read()
response.close()
match=re.compile('<ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX>').findall(link)
for url in match:
addLink(name,url,'')
ovvero apri una connessione all'url specificato, modifica lo User-Agent con quello di Mozilla di Ubuntu, calcola la regex, e crea il menu con l'url ricavato e il nome passato alla funzione.
Il nostro plugin è pronto e funzionante.
Lanciamo XBMC nella sezione Video scegliamo Plugin Video e successivamente Rai.tv e godiamoci la diretta!
Per completezza ecco il sorgente completo (trattandosi di python bisogna fare attenzione all'indentazione):
import urllib,urllib2,re,xbmcplugin,xbmcgui
__scriptname__ = "XBMC Video Plugin"
__author__ = 'fabrintosh [http://fabrintosh.blogspot.com]'
__date__ = '18-05-2009'
__version__ = "r001"
def CATEGORIES():
addDir('Rai1','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983',2,'http://www.rai.it/dl/images/1233832365974RaiUno_02.png')
addDir('Rai2','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=984',2,'http://www.rai.it/dl/images/1233832404832RaiDue02.png')
addDir('Rai3','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=986',2,'http://www.rai.it/dl/images/1233832447578RaiTre_02.png')
addDir('RaiNews24','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=1',2,'http://www.rai.it/dl/images/1233841893415RaiNews24_02.png')
addDir('RaiSport+','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=4145',2,'http://www.rai.it/dl/images/1233856927849raisport_.png')
addDir('RaiStoria','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=24269',2,'http://www.rai.it/dl/images/1233857018728raistoria.png')
addDir('RaiEdu','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=24268',2,'http://www.rai.it/dl/images/1233837355373RaiEdu1_02.png')
def INDEX(url):
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')
response = urllib2.urlopen(req)
link=response.read()
response.close()
match=re.compile('').findall(link)
for thumbnail,url,name in match:
addDir(name,url,2,thumbnail)
def VIDEOLINKS(url,name):
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')
response = urllib2.urlopen(req)
link=response.read()
response.close()
match=re.compile('<ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX>').findall(link)
for url in match:
addLink(name,url,'')
def get_params():
param=[]
paramstring=sys.argv[2]
if len(paramstring)>=2:
params=sys.argv[2]
cleanedparams=params.replace('?','')
if (params[len(params)-1]=='/'):
params=params[0:len(params)-2]
pairsofparams=cleanedparams.split('&')
param={}
for i in range(len(pairsofparams)):
splitparams={}
splitparams=pairsofparams[i].split('=')
if (len(splitparams))==2:
param[splitparams[0]]=splitparams[1]
return param
def addLink(name,url,iconimage):
ok=True
liz=xbmcgui.ListItem(name, iconImage="DefaultVideo.png", thumbnailImage=iconimage)
liz.setInfo( type="Video", infoLabels={ "Title": name } )
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=url,listitem=liz)
return ok
def addDir(name,url,mode,iconimage):
u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)
ok=True
liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage)
liz.setInfo( type="Video", infoLabels={ "Title": name } )
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
return ok
params=get_params()
url=None
name=None
mode=None
try:
url=urllib.unquote_plus(params["url"])
except:
pass
try:
name=urllib.unquote_plus(params["name"])
except:
pass
try:
mode=int(params["mode"])
except:
pass
print "Mode: "+str(mode)
print "URL: "+str(url)
print "Name: "+str(name)
if mode==None or url==None or len(url)<1:
print ""
CATEGORIES()
elif mode==1:
print ""+url
INDEX(url)
elif mode==2:
print ""+url
VIDEOLINKS(url,name)
xbmcplugin.endOfDirectory(int(sys.argv[1]))
domenica 17 maggio 2009
Creare un plugin per XBMC parte 1

Creare un plugin per XBMC come avevo spiegato (male) è semplice. Scendiamo nel pratico:
voglio vedere la diretta web dei canali rai con XBMC.
Dopo avere scaricato il tutorial dal sito di XBMC lo scompattiamo e creiamo una cartella dal nome Rai.tv in:
~/.xbmc/plugins/video/ (Linux)
~/Library/Application Support/XBMC/plugins/video/ (Mac)
c:\Program Files\XBMC\plugins\video\ (Windows).
copiamo il file default.py ed il file test.py presenti nel tutorial nella cartella che abbiamo creato.
Come già indicato in numerosi post come ad esempio qui recuperiamo la lista dei link che ci occorrono.
Se non vogliamo correre rischi ed utilizzare la lista più recente, si può, spulciando il sorgente della pagina www.rai.tv, cercare la variabile channelXmlPath che ci fornirà il link del file xml che contiene gli indirizzi delle dirette (sottochiave <url> di <videoUnit name="nome del canale - full" type="RaiTv Diretta Full Video">).
Per verificare il collegamento apriamo con un editor il file test.py.
Alla variabile url assegnamo un link (ad esempio Rai1) http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983 e aggiungiamo dopo la riga response.close() la riga print link affinchè test.py sia così:
import urllib2,urllib,re
url='http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983'
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')
response = urllib2.urlopen(req)
link=response.read()
response.close()
print link
match=re.compile('Regular expression here').findall(link)
print match
Salviamo, apriamo il terminale (o il prompt dei comandi) ci rechiamo nella directory del plugin (cd ~/Library/Application Support/XBMC/plugins/video/Rai.tv)
digitiamo python test.py e vediamo cosa stampa su schermo la nostra print:
<ASX VERSION="3.0"> <ENTRY> <REF HREF="http://www.banneradmin.rai.it/ads/siparietti/buona_visioneMed_Progautopromo.wmv" /> </ENTRY> </ASX>
Se proviamo ad aprire con vlc il link ottenuto (http://www.banneradmin.rai.it/ads/siparietti/buona_visioneMed_Progautopromo.wmv) vedremo solo un banner di buona visione e null'altro. Questo perchè dobbiamo anche modificare lo User Agent inviato al sito della rai utilizzando quello di Mozilla di una qualsiasi distribuzione linux:
req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')
Otterremo questa risposta:
<ASX VERSION="3.0"> <ENTRY><REF HREF="mms://livestream.rai.it.edgestreams.net/reflector:64084?auth=daEcyc4agdPaTcNbSaGbAdPcKb6d4aldjdV-bkecTK-b4-ElxuxHo&aifp=V001" /> </ENTRY> </ASX>
Abbiamo ottenuto un link mms!
Per estrarre il link mms della diretta da comunicare al plugin di XBMC dobbiamo utilizzare una regex, ma prima solitamente elimino spazi, tabulatori, ritorni a capo superflui per potermi concentrare sulla espressione più agevolmente. Quindi procediamo a sostituire la riga link=response.read() con:
link = ''
for line in response.read().split( '\n' ):
link += line.lstrip().rstrip()
link = link.replace( '\r', '' ).replace( '\t', '' ).replace( '\n', '' )
Otterremo così:
<ASX VERSION="3.0"><ENTRY><REF HREF="mms://livestream.rai.it.edgestreams.net/reflector:64084?auth=daEcfd4cgdEatbAblddaQbEb8azdhdqaVae-bkec_a-b4-FmxwxHn&aifp=V001" /></ENTRY></ASX> che è molto più leggibile.
L'espressione che fa al caso nostro è <ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX> e la inseriamo nella funzione re.compile('expr').findall(link)
match=re.compile('<ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX>').findall(link) e estraiamo il link trovato.
if match:
for url in match:
print url + '\r'
eliminiamo le righe print link e print match. test.py dovrebbe ora avere la seguente fisionomia:
#!/usr/bin/python
import urllib2,urllib,re
url='http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983'
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')
response = urllib2.urlopen(req)
link = ''
for line in response.read().split( '\n' ):
link += line.lstrip().rstrip()
link = link.replace( '\r', '' ).replace( '\t', '' ).replace( '\n', '' )
response.close()
match=re.compile('<ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX>').findall(link)
if match:
for url in match:
print url + '\r'
(in grassetto le parti modificate del file test.py originale).
python test.py stamperà sullo schermo mms://livestream.rai.it.edgestreams.net/reflector:64084?auth=daEcfd4cgdEatbAblddaQbEb8azdhdqaVae-bkec_a-b4-FmxwxHn&aifp=V001 che possiamo provare ad aprire con vlc per verificare il collegamento.
Ora che abbiamo link e regex possiamo passare alla sviluppo del plugin vero e proprio.....
XBMC ed i plugins

A casa ho due vecchi computer che svolgono la funzione di HTPC.
Hanno installato Freevo che è a mio parere il migliore software HTPC open source esistente.
Freevo è scritto in python, utilizza massivamente mplayer (anche se supporta vlc e xine), gira principalmente su Linux e non ha particolari richieste hardware, consentendo quindi di avere un ottimo sistema di home theatre a costi contenuti.
Nel mio caso utilizzo un PIII ed un PIV.
E' estensibile grazie a numerosi plugins. Ne ho scritto qualcuno anch'io e uno di questi è nella distribuzione ufficiale, per la precisione quello di wwitv.
Installare freevo sul mio MacBook con Mac OS X è una operazione fattibile anche se non semplicissima, e per ora non ho abbastanza tempo libero per farlo.
Ho provato quindi XBMC, finalmente in versione Intel e PPC, bello pronto da installare con il suo file dmg.
Le richieste hardware sono decisamente più elevate, rendendolo inutilizzabile sui due htpc che ho in casa, ma la grafica è decisamente carina, si interfaccia agevolmente con i server UPnP (il sistema che utilizzo per condividere musica, film foto e quant'altro) e fa lui stesso da server UPnP.
E' estensibile tramite plugins, e indovinate un po' in che linguaggio? Python!
Ho provato subito a scriverne uno di prova, e sono rimasto piacevolmente colpito dalla presenza di:
un soddisfacente tutorial, una maggiore documentazione, uno scheletro di plugin con cui partire, poche routines chiare ed accessibili.
Creare un plugin video in XBMC può addirittura consistere nel trovare la giusta regex in una pagina web ed passare i risultati a
addDir(name,url,mode,thumbnail)o addLink(name,url,tumbnail)
Quindi come spiegato nell'ottimo tutorial, inserendo in CATEGORIES()
addDir("MOVIES","http://www.tvdash.com/movies.html",1," http://reggiebibbs.files.wordpress.com/2007/12/the-movies360-crop.jpg")
avremo un menu di tipo cartella "Movies" il cui clic invocherà la routine INDEX() passando come argomento l'url http://www.tvdash.com/movies.html.
Compito della funzione INDEX sarà quello di scaricare la pagina web ed applicare la regex desiderata per poi passare a addLink(name,url) i links dei video trovati, creando dei sotto menu "links" che avranno il compito di lanciare il player collegandosi all'url del video specificato.
Decisamente veloce e semplice.