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]))


6 commenti:

  1. Grande Fabrizio!
    Ho 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

    RispondiElimina
  2. 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

    RispondiElimina
  3. Chris, perdona il ritardissimo!
    Sei 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.

    RispondiElimina
  4. Ciao Alessandro, per vedere Rai4 basta aggiungere la stringa

    addDir('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.

    RispondiElimina
  5. Ciao

    premetto 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...

    RispondiElimina
  6. Ciao,
    ho 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.

    RispondiElimina