mercoledì 9 dicembre 2009
Inserire punti di interesse nelle mappe Tom Tom
Ottenere coordinate GPS da google maps
sabato 21 novembre 2009
Creare un plugin per XBMC parte 3
lunedì 16 novembre 2009
Lotus notes e gli allegati lnk
Alcune versioni di notes "soffrono" però, di un inconveniente fastidioso:
quando si allega un documento ad un messaggio di posta elettronica, nella finestra "Crea allegati" se si apre un collegamento ad una cartella, non si entra in questa, ma viene allegato il collegamento stesso (es. Documenti.lnk).
Per rimediare occorre inserire nel file notes.ini la seguente riga:
Shell_Links=1
e concludere il file con un ritorno a capo.
Riferimenti si possono trovare qui.
giovedì 12 novembre 2009
Il calcio è un gioco maschio
Un nuovo astro nascente, Elizabeth Lambert che gioca nel New Mexico Lobos si stava facendo strada.
Stava perchè sembra sia stata squalificata a tempo indeterminato.
giovedì 22 ottobre 2009
Chiusura di patchmate.net
Non sarà una notizia di prima mano, ma oggi mi sono accorto che il sito di patchmate.net che preparava dei cd con tutti gli aggiornamenti di Windows XP pronti per l'installazione, è stato chiuso!
mercoledì 21 ottobre 2009
Incorporare sottotitoli a video avi
Per poter seguire le mie serie preferite (Big Bang Theory, Legend of Seeker, ed altro) ho dovuto collegare un portatile alla tv, e la cosa è molto scomoda da fare in continuazione. Visto che ho un lettore DVD-Divx posso sempre farmi dei dvd (abitudine tra l'altro abbandonata) per vedere i filmati senza sbattimenti. Un problema però c'è: ho bisogno dei sottotitoli in quanto le mie serie tv preferite o non sono ancora trasmesse in Italia (Legend of the Seeker, consigliatissimo) oppure hanno un doppiaggio da far rizzare i capelli (Big Bag Theory), ed il mio lettore dvd non li supporta.
La soluzione è quella, in attesa di ripristinare la freevobox, di incorporare i sottotitoli nei file avi così da evitare continui collegamenti e scollegamenti del portatile alla tv.
Ho provato vari software, ma il più pratico e veloce mi è sembrato mencoder.
Ecco un esempio di come ottenere il risultato voluto:
mencoder -oac copy -ovc xvid -xvidencopts fixed_quant=3 -sub Legend.Of.The.Seeker.s01e13.srt -subfont-text-scale 3 -subalign 2 -o test.avi Legend.of.the.Seeker.S01E13.avi
in sintesi i parametri passati a mencoder:
-oac copy (copia il flusso audio)
-ovc xvid -xvidencopts fixed_quant=3 (converti il video in xvid con qualità da 1 a 5)
-sub file dei sottotitoli da inserire
-subfont-text-scale la dimensione dei font da 1 a 5
-subalign dove posizionare il sottotitolo 0 in alto, 1 al centro, 2 in basso
-o file di destinazione
il file sorgente
Da notare che dalle prove che ho fatto non è possibile passare -ovc copy (che avrebbe risparmiato tempo) in quanto il filmato finale non incorpora i sottotitoli.
Per alcuni, il fatto di essere un programma a linea di comando può rappresentare un limite.
Per utilizzare un programma ad interfaccia grafica si può andare su avidemux, a mio parere più lento di mencoder.
Dimenticavo, sia mencoder che avidemux sono disponibili per Linux, Mac e Windows, e qui tutto lo scibile sulle opzioni di mencoder sui sottotitoli
martedì 6 ottobre 2009
sudo: timestamp too far in the future!
venerdì 25 settembre 2009
XP e il refresh del contenuto di cartelle condivise
Un client xp aveva problemi con il ridisegno delle finestre con alcune cartelle condivise.
Se l'utente creava un file nella cartella condivisa questo non appariva finchè la finestra non era chiusa e riaperta. E non c'era alcun F5 che tenesse.
A quanto pare è un problema noto e Microsoft ha anche rilasciato un hotfix che però va richiesto e non è disponibile liberamente.
Fortunatamente c'è anche un altro rimedio più semplice:
- creare una DWORD in HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoSimpleNetIDList
- assegnarli il valore 1
- riavviare
Modificare l'intervallo di tempo delle presentazioni del visualizzatore immagini e fax di Windows
Il mio naso mi dice che l'intervallo di default di rotazione delle immagini non andrà bene agli organizzatori che mi chiederanno di cambiarlo, quindi meglio portarsi avanti.
Non c'è un menu, un qualcosa per modificare le preferenze di default dall'interno del programma, mi sa che bisogna intervenire nel registro.
Una rapida ricerca con google fornisce il modo:
- modificare una chiave di registro, la HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/ShellImageView
- creare una DWORD di nome Timeout con base Decimale
- inserire come valore un intervallo di tempo in millisecondi che regolerà la transizione tra un'immagine e l'altra. (10.000 = 10 secondi).
- Confermare le modifiche
- riavviare il sistema.
Grazie a twisterspace.blogspot.com
mercoledì 26 agosto 2009
Stampante samba e cpu al 100%
eliminare il file tdb dalla cache di samba.
Nel mio caso la stampante che faceva i capricci si chiamava PDF e quindi ho eliminato
/var/cache/samba/printing/PDF.tdb
venerdì 7 agosto 2009
Capricci dhcp
Nei log del server dhcp risultava il mac address, ma l'indirizzo non era mai quello voluto.
Ho messo mano per la prima volta in vita mia al file /etc/dhclient.conf.
Inserendo la stringa:
send dhcp-client-identifier xx:xx:xx:xx:xx:xx:xx;
(dove le xx rappresentavano il mac address) il server dhcp finalmente assegnava l'ip desiderato.
Devo ammettere che dhclient.conf contiene anche altre cosette interessanti.
sabato 27 giugno 2009
Firefox ed il tasto backspace
Per impostare il tasto come piace a me occorre:
- aprire una finestra di firefox
- digitare nell'indirizzo about:config
- permere il pulsante "ok so cosa sto facendo"
- nella barra del filtro inserire back e premere invio
- modificare con un doppio clic la voce browser.backspace_action
- inserire il valore 0
- chiudere la finestra.
MacBook Pro Ubuntu: NetworkManager - wifi -dhcp
Tra le varie prove che ho fatto per porre rimedio una ha funzionato: disattivare apparmor (croce e delizia di questa distribuzione).
Le soluzioni a questo punto erano due: disattivare apparmor o cercare un fix.
Una rapida ricerca ha portato al bug #342235 in cui è indicata la soluzione.
Con i permessi di root occorre:
- modificare il file /etc/apparmor.d/sbin.dhclient3
- posizionarsi nella sezione dove si trova "/usr/lib/NetworkManager/nm-dhcp-client.action"
- inserire sopra a "/usr/lib/NetworkManager/nm-dhcp-client.action mr," la stringa "/var/run/dbus/system_bus_socket w,"
- salvare e chiudere il file,
- riavviare apparmor (/etc/init.d/apparmor restart) o riavviare il computer.
/usr/lib/NetworkManager/nm-dhcp-client.action {
#include <abstractions/base>
#include <abstractions/dbus>
/var/run/dbus/system_bus_socket w,
/usr/lib/NetworkManager/nm-dhcp-client.action mr,
}
Ora la scheda wireless funziona senza problemi con NetworkManager.
mercoledì 24 giugno 2009
Formattare in fat32 da winxp
format (lettera unità) /FS:FAT32
es: format e: /FS:FAT32
Pur con le limitazioni di fat32, ci garantiamo la portabilità con tutti i sistemi operativi del disco esterno.
Attenzione: non formatta volumi superiori a 32 GB. Per farlo si può ricorrere a utility esterne:
Fat32Format o SwissKnife.
Se però hai a disposizione un mac o un linux (che non hanno questi limiti di capienza) l'operazione è velocissima ed il disco viene riconosciuto da XP.
giovedì 11 giugno 2009
Drivers e aggionamenti per Windows XP
Queste me le devo assolutamente segnare:
dove posso trovare una grossa collezione di drivers per windows?
Basta recarsi presso nodevice.com.
Come faccio a capire quali periferiche non sono state riconosciute?
Seguo il metodo indicato qui
Ovvero apro Gestione Periferiche, seleziono la periferica con il punto di domanda, con il tasto destro scelgo proprietà e alla voce dettagli cerco l'id ed il vendor della periferica (il vendor dovrebbe trovarsi dopo la stringa VEN e l'id del device dopo la string DEV)
Una volta ottenute le informazioni vado su pcidatabase.com e consulto il loro database.
Trovato modello e produttore, cerco di scaricare dal sito del produttore i drivers aggiornati (procedura consigliata), oppure vado sul sito di nodevice.com e li cerco lì.
(grazie a spippolazione.net)
Voglio un cd con tutti gli aggiornamenti di Windows XP ed installarli automaticamente?
La risposta l'ho trovata da tuttovolume.net.
Quei benefattori di patchmate.net preparano dei cd pronti al bisogno.
Aggiornamento: il sito è stato chiuso!
domenica 31 maggio 2009
rsync di cartelle windows su linux
Ho avuto bisogno di fare delle copie sincronizzate e periodiche di un server nt su un server linux (red hat) ed ho messo in crontab questo script:
#!/bin/sh
if df | grep -q -w /mnt/nt
then
echo "nt C$ gia' montato"
else
mount -t smbfs -o username=nt\\administrator,password=password,ro //nt/c\$ /mnt/nt &> /dev/null
echo "nt C$ montato ora"
fi
#ricontrolliamo prima di iniziare rsync
if df | grep -q -w /mnt/nt
then
echo "inizio backup "
rsync -avz --delete /mnt/nt/Program\ Files/IBM/* /home/nt/IBM/
echo "smonto le condivisioni...."
umount /mnt/nt
echo "terminato"
else
echo "errore nel montare nt C$"
fi
umount /mntnt
Particolarmente interessante è:
if df | grep -q -w (punto di mount)
che restituisce true o false a seconda che la condivisione sia montata o meno....
venerdì 22 maggio 2009
Un pulsante vale più di mille spiegazioni
Nella prima riga ho inserito le intestazioni di colonna:
Title, LastName, FirstName, MiddleInitial, MailAddress, AltFullName, AltFullNameLanguage, PhoneNumber, CellPhoneNumber, HomeFAXPhoneNumber, HomeAddress, StreetAddress, City, JobTitle, OfficePhoneNumber, OfficeFAXPhoneNumber, CompanyName, OfficeStreetAddress , OfficeCity , OfficeState , OfficeZIP, State, AreaCodeFromLoc, Suffix, PhoneNumber_6, WebSite, BusinessAddress, Zip, OfficeCountry, country, Location, Spouse, Department, Children, Manager, Assistant, Birthday, FullName, Categories.
Ho creato poi una routine in vba come segue:
Sub Importa_Rubrica_Notes()
Dim DomDir As NotesDatabase
Dim DomContacts As NotesView
Dim DomDoc As NotesDocument
Dim StrName As String
Dim myRange As Range
Dim DomSession As NotesSession
Dim StrTestDomSession As String
Set DomSession = CreateObject("Lotus.NotesSession")
DomSession.Initialize
Set DomDir = DomSession.GetDatabase("", "names.nsf")
Set DomContacts = DomDir.GetView("Contatti")
Set DomDoc = DomContacts.GetFirstDocument
Dim tot As Integer
tot = 2
While Not (DomDoc Is Nothing)
Cells(tot, 1).Value = DomDoc.GetItemValue("Title")(0)
Cells(tot, 2).Value = DomDoc.GetItemValue("LastName")(0)
Cells(tot, 3).Value = DomDoc.GetItemValue("FirstName")(0)
Cells(tot, 4).Value = DomDoc.GetItemValue("MiddleInitial")(0)
Cells(tot, 5).Value = DomDoc.GetItemValue("MailAddress")(0)
Cells(tot, 6).Value = DomDoc.GetItemValue("AltFullName")(0)
Cells(tot, 7).Value = DomDoc.GetItemValue("AltFullNameLanguage")(0)
Cells(tot, 8).Value = DomDoc.GetItemValue("PhoneNumber")(0)
Cells(tot, 9).Value = DomDoc.GetItemValue("CellPhoneNumber")(0)
Cells(tot, 10).Value = DomDoc.GetItemValue("HomeFAXPhoneNumber")(0)
Cells(tot, 11).Value = DomDoc.GetItemValue("HomeAddress")(0)
Cells(tot, 12).Value = DomDoc.GetItemValue("StreetAddress")(0)
Cells(tot, 13).Value = DomDoc.GetItemValue("City")(0)
Cells(tot, 14).Value = DomDoc.GetItemValue("JobTitle")(0)
Cells(tot, 15).Value = DomDoc.GetItemValue("OfficePhoneNumber")(0)
Cells(tot, 16).Value = DomDoc.GetItemValue("OfficeFAXPhoneNumber")(0)
Cells(tot, 17).Value = DomDoc.GetItemValue("CompanyName")(0)
Cells(tot, 18).Value = DomDoc.GetItemValue("OfficeStreetAddress ")(0)
Cells(tot, 19).Value = DomDoc.GetItemValue("OfficeCity ")(0)
Cells(tot, 20).Value = DomDoc.GetItemValue("OfficeState ")(0)
Cells(tot, 21).Value = DomDoc.GetItemValue("OfficeZIP")(0)
Cells(tot, 22).Value = DomDoc.GetItemValue("State")(0)
Cells(tot, 23).Value = DomDoc.GetItemValue("AreaCodeFromLoc")(0)
Cells(tot, 24).Value = DomDoc.GetItemValue("Suffix")(0)
Cells(tot, 25).Value = DomDoc.GetItemValue("PhoneNumber_6")(0)
Cells(tot, 26).Value = DomDoc.GetItemValue("WebSite")(0)
Cells(tot, 27).Value = DomDoc.GetItemValue("BusinessAddress")(0)
Cells(tot, 28).Value = DomDoc.GetItemValue("Zip")(0)
Cells(tot, 29).Value = DomDoc.GetItemValue("OfficeCountry")(0)
Cells(tot, 30).Value = DomDoc.GetItemValue("country")(0)
Cells(tot, 31).Value = DomDoc.GetItemValue("Location")(0)
Cells(tot, 32).Value = DomDoc.GetItemValue("Spouse")(0)
Cells(tot, 33).Value = DomDoc.GetItemValue("Department")(0)
Cells(tot, 34).Value = DomDoc.GetItemValue("Children")(0)
Cells(tot, 35).Value = DomDoc.GetItemValue("Manager")(0)
Cells(tot, 36).Value = DomDoc.GetItemValue("Assistant")(0)
Cells(tot, 37).Value = DomDoc.GetItemValue("Birthday")(0)
Cells(tot, 38).Value = DomDoc.GetItemValue("FullName")(0)
Cells(tot, 39).Value = DomDoc.GetItemValue("Categories")(0)
Set DomDoc = DomContacts.GetNextDocument(DomDoc)
tot = tot + 1
Wend
End Sub
Ho collegato la funzione al pulsante, salvato e voilà:
adesso mi basta inviare il file a chi me lo chiede....
OpenPMA e altoparlante interno
Dopo l'installazione di openPMA nel mio Archos PMA400 mi ero trovato con l'altoparlante interno disattivato. Non l'ho mai utilizzato, ma desideravo comunque fosse attivo.
giovedì 21 maggio 2009
Installazione openPMA
La procedura è stata abbastanza semplice ed indolore:
basta seguire le istruzioni contenute nell'official openPMA installation guide per installare ed integrare con le applicazioni già presenti openPMA.
Per prima è necessario scaricare ed installare il bootloader alternativo qui.
Avvenuta l'installazione del package nel PMA400 del boothack si lancia l'applicazione dal tab Impostazioni e si preme OK (è possibile anche fare il restore del bootloader ufficiale successivamente).
Si scarica e scompatta su un computer l'ultima versione di openPMA (giraffe).
Si spegne il palmare, lo si collega spento al computer tramite il cavo usb e finalmente lo si accende.
Si può procedere ora in due direzioni.
la prima, avendo sufficientemente spazio libero (6 GB):
- si esegue il chkdsk del disco
- lo si deframmenta
- ci si reca nella cartella System
- si rinomina aimage.img (il s.o.) ad esempio in aimage.archos
- si copiano i files aimage.img e openpma.img scaricati da opempma.org in questa cartella.
- backup completo dei dati presenti sul palmare
- formattazione in fat32 del palmare
- si scompatta e si copia nel palmare formattato il PMA400 recovery già presente nell'archos ma comunque scaricabile dal sito di Archos
- ci si reca nella cartella System
- si rinomina aimage.img (il s.o.) ad esempio in aimage.archos
- si copiano i files aimage.img e openpma.img scaricati da opempma.org in questa cartella.
- se si vuole mantenere eventuali programmi installati precedentemente sul palmare copiare in questa cartella il file progfs.img dal backup effettuato.
Solo a questo punto si deve:
- smontare correttamente il PMA400 dal computer e senza staccare il cavo con una graffetta effettuare lo spegnimento del palmare agendo nell'apposito buco alla base (reset pin hole).
- a palmare spento scollegare il cavo usb e procedere all'accensione.
Se tutto va a buon fine avremo il nostro nuovo sistema operativo funzionante.
Purtroppo, nonostante avessi 12 GB liberi, ho dovuto optare per la seconda scelta in quanto avevo sempre un errore durante la creazione della partizione nascosta. E' stato un procedimento più lungo, ma che mi ha anche consentito di fare un po' di pulizia.
Impressioni: il sistema mi sembra migliore e più stabile di quello fornito di fabbrica, ho a disposizione tramite terminale molte più funzioni e programmi, e se per qualche motivo volessi tornare indietro potrei farlo seguendo le istruzioni a ritroso della prima direzione, rinominando aimage.img in aimage.openpma e aimage.archos in aimage.img, verificando la presenza del file progfs.img (il file immagine contente le applicazioni installate di default da Archos), resettando e accendendo il palmare. Se volessi invece eliminare anche la partizione nascosta dovrei a questo punto tramite un pc eliminarla, formattare l'unità in fat32, copiare il PAM recovery, resettare e accendere il palmare.
L'unico difetto per ora ho riscontrato è stato la disattivazione dell'altoparlante interno, ma onestamente non ho ancora verificato se ci sono dei work-around.
Devo anche verificare se funziona il collegamento al televisore, la registrazione audio - video ed il telecomando.
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.
sabato 16 maggio 2009
The Big Bang Theory 2
sabato 2 maggio 2009
The Big Bang Theory
Il campi dell'Abruzzo
domenica 26 aprile 2009
Primo Post
Di sicuro non riprenderò troppo notizie già pubblicate da troppe fonti, in fin dei conti non mi piace trovare troppe ripetizioni nei blog.
E' un primo tentativo di utilizzare un blog, ed ho iniziato con blogspot per poi magari passare a qualcosa di più strutturato.
Spero che questo post non lo legga nessuno ;-).... è solo un modo per iniziare.
Buon inizio!