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]))
Grande Fabrizio!
RispondiEliminaHo utilizzato la tua guida per creare un plugin per i contenuti on demand (gli unici visualizzabili dall'estero).
Se hai tempo dai un'occhiata qui:
http://www.xbmczone.com/plugin_details.asp?id=111
Ogni suggerimento su come migliorare e' ben accetto.
Saluti,
--Chris
salve... ho da poco scoperto questo nuovo modo di utilizzare xbmc sulla mia xbox... volevo sapere se è possibile in qualche modo con il tuo script vedere lo sttreaming che va in onda dal sito http://www.rai.tv/dl/RaiTV/diretta.html?cid=ContentSet-83df82fc-2179-40ed-9199-bcb3dc381e0d&channel=Rai4+Diretta direttamente sulla mia xbox.. grazie mille
RispondiEliminaChris, perdona il ritardissimo!
RispondiEliminaSei stato troppo gentile.
Ho scaricato subito il tuo plugin, e lo ho trovato veramente ben fatto.
Ho fatto anch'io un plugin analogo per freevo, ma il mio è spaghetti-code.
Complimenti.
Ciao Alessandro, per vedere Rai4 basta aggiungere la stringa
RispondiEliminaaddDir('Rai4','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=75708',2,'http://www.rai.it/dl/images/124949355986510090805-3.jpg')
In realtà non volevo scrivere un plugin, ma solo segnarmi i passi fondamentali.
I link degli streaming sono ricavabili da un file xml con estensione html, e con una piccolo routine si possono ricavare tutti.
La routine l'ho scritta, basterebbe inserirla nel plugin ed integrarlo con l'ottimo lavoro fatto da Chris.
Una pecca che sto trovando in xbmc (io lo uso su un mac, magari con windows -linux è diverso) è non riesco a gestire i timeout anche se li inserisco nel codice (ho messo 2 minuti) e a volte lo streaming non arriva. Devo tornare indietro di un livello del menu e riprovare. Al secondo-terzo tentativo lo streaming arriva.
Ciao
RispondiEliminapremetto che non conosco python (quindi, l'indentazione l'ho sicuramente sbagliata) e nemmeno so se il tuo plugin funzionerebbe con le build più recenti di XBMC
Ho anche letto che non era tua intenzione creare un vero e proprio plugin
tuttavia,
posso chiederti se hai modo di creare quantomeno il default.py scaricabile ?
o se preferisci, inviandomelo via mail.
Mi faresti un gran favore...
Ciao,
RispondiEliminaho messo il plugin qui:
http://code.google.com/p/fabrintosh-raitv-diretta/
l'ho provato con l'ultima build 9.11.alpha2 (mac) e funziona. Penso giri su qualunque piattaforma.
A volte il player non apre lo streaming perchè va in time out e bisogna tornare indietro di un livello e riaprirlo.
Fammi sapere se non funziona.