Scrivere service-menu per KDE

Un service menu è in sostanza qualcosa a cui possiamo accedere cliccando col tasto destro (gli utenti di Mac OS no ;-) )su un file e che viene attivato in base al mimetype. Ad esempio, se clicco su di un file mp3 potrebbe attivarsi una voce “Codifica” che mi permette di codificare il file con un qualsiasi codec audio. Immagino di non aggiungere nulla di nuovo,ma con questo post faremo insieme un piccolo cammino che ci porterà a scrivere un nostro service menu. Praticamente la conoscenza di programmazione si limita a mettere insieme una riga di comando bash, quindi dovrebbe risultare semplice ai più e comunque è una possibiltà di imparare qualcosa di nuovo per i non addetti al lavoro.

Un service menu parte da un’idea,qualcosa che vorreste tanto avere e non c’è.Un buon posto per cominciare è il sito kde-apps dove alla voce service menus sono raccolti molti script già creati. Adesso ne creeremo uno insieme passo passo.

Passo 1: La necessità

Di necessità virtù e allora arrotoliamoci le maniche. Mi serviva convertire un’immagine di un cdrom dal formato cue a iso. Cinque secondi di ricerca e trovo il programma che fa per me. Si chiama bchunk. E’ presente nei repository di Ubuntu e dunque nessun problema. Quello che voglio adesso è ottenere questo service menuservicemenufinal.png

Come vedete sono presenti tre opzioni di conversione, tanto per sfruttare appieno le potenzialità di bchunk.

Passo 2: L’idea prende forma

Iniziamo a creare il nostro service menu. Prima di tutto date un’occhiata a quest’indirizzo per un wiki su come creare un service menu scritto, ai tempi, da Aaron Seigo.

Creiamo un file con un nome qualsiasi a patto che finisca per “.desktop”. Questo è lo standard introdotto per le desktop entries e quindi io ho creato un file chiamato convertIso.desktop : lo so, un notevole sforzo di fantasia!

Analizziamo il contenuto insieme. La prima riga

[Desktop Entry]

dice a KDE di cosa stiamo parlando.Adesso dobbiamo dire a kde a quali file si deve applicare il nostro service menu, nel senso che se clicco su un file mp3 l’opzione di conversione non deve apparire!Per farlo inseriamo

ServiceTypes=application/x-cue

Per sapere a cosa corrisponde l’estensione basta aprire kcontrol e, in associazione file, cercare l’estensione e riportare il percorso completo che in questo caso è “application/x-cue”. ecco un’immagine autoesplicativa

choiceextension.png

Se dovete creare un menu per le directory allora inserite “inode/directory”, per crearlo per tutti i file basta “all/all”, se invece deve valere per tutti i file ma non per le directory sarà “all/allfiles” .

Adesso dobbiamo inserire una lista di azioni eseguibili che dovremo esplicitare più avanti. In questo caso la conversione ISO, ISO-PSX e ISO-RAW. Inseriamole separate da un punto e virgola così

Actions=convertSimple;convertPsx;convertRaw

Queste azioni non dicono nulla perchè le svilupperemo a breve.Intanto per pulizia sarebbe più carino raccoglierle tutte in un sottomenù che dica “Converti Immagine” e poi scegliere l’opzione come nell’immagine. Per creare questo sottomenu la riga di codice è “X-KDE-Submenu”. Prima di vedere come scriverla vediamo le possibilità che kde ci offre per la localizzazione. E’ possibile creare voci personalizzate a seconda della lingua del sistema semplicemente inserendo un tag che indica il codice delle lingua. Inserendo queste due righe dunque

X-KDE-Submenu[en]=Convert Image
X-KDE-Submenu[it]=Converti immagine

il sottomenu verrà visualizzato diversamente a seconda della lingua in uso nel sistema.Potremo localizzare il service menu molto facilmente per tutte le lingue che vogliamo.

Adesso viene la parte centrale del service menu,ossia quella che si occupa di far avvenire un’azione.Concentriamoci sulla prima azione (creazione di un ISO normale) e poi le altre saranno una leggera modifica di questa.Prima di tutto dobbiamo creare un riga che indica che tutto quello che viene sotto riguarda l’azione “ISO normale”.Il codice è questo:

[Desktop Action convertSimple]

Come vedete dopo “Desktop Action” ho riportato il nome dell’azione come lo avevo definito nella riga Actions. Questa azione dovrà avere un nome da visualizzare, ad esempio “Converti nel formato ISO” attravero il tag “Name”. Anche qui localizziamo il nostro menu:

Name[it]=Converti nel formato ISO
Name[en]=Convert to ISO format

Un’altra personalizzazione che possiamo dare è quella di associare un’icona al comando attraverso il tag Icon. Per scegliere un’icona riferitevi al nome che ha l’icona ma non mettete l’estensione.Ecco la nostra

Icon=cdimage

Adesso il tag più importante:”Exec”.Questo tag ci permette di avviare un’azione e possiamo metterne quanti ne vogliamo in cascata.Il comando deve essere un comando bash,quindi se per esempio il nostro service menu copiasse il file nella nostra home avremmo

cp %u $HOME

Vediamo cosa abbiamo scritto:cp è il comando classico per la copia. %u invece indica il percorso del file su quale abbiamo cliccato.Potete trovare altri %caratteri speciali in questa pagina. $HOME invece è una variabile di sistema generale che indica il percorso alla cartella home dell’utente attualmente loggato. Un altro consiglio che posso darvi per la scrittura della riga Exec è quella di far man bassa di DCOP. Dcop è il sistema di scambio di messaggi in kde ed è di semplicissimo utilizzo.Ogni applicazione lanciata può avere un’interfaccia dcop con la quale interagire. Per sapere quali applicazioni attualmente avviate hanno quetsa interfaccia basta dare dcop in un terminale o usare il tool grafico kdcop. Mettiamo ad esempio di avere Amarok avviato. Se diamo

dcop

troveremo nella lista amarok. Quindi diamo

dcop amarok

per vedere tutte le possibili opzioni.Alla fine per esempio,per andare alla traccia successiva di Amarok basterà dare

dcop amarok player next

Come vedete dcop è uno strumento dannatamente potente per dare comandi a programmi che rispettano lo standard di KDE. Ultima nota,dcop verrà presto sostituito da dbus che è lo standard odierno,ma il funzionamento resta simile.

kdcop.png

Continuiamo col nostro service menu. Abbiamo detto che dobbiamo trasformare la nostra immagine .cue in .iso attraverso il comando dato in Exec. Qui sorge un problema; siccome dobbiamo avvalerci di bchunk, ma questo accetta il formato dei parametri

bcunk immagine.bin immagine.cue immagine.iso

dobbiamo operare sulla stringa ritornata da %u per togliere ogni volta l’estensione del file e metterci rispettivamente “.cue”, “.bin” e “.iso”. Il proplema è che a quanto pare non riesco a fare un minimo di gestione delle espressioni regolari attraverso Exec. Di cosa sto parlando?Nel bash-scripting, uno dei modi di ottenere il nome del file senza estensione è quello di valutarne il nome così

${NAME%.*}

dove NAME è il nome del file.Ad esempio se diamo questi comandi in una shell

export NAME=Immagine.cue

echo ${NAME%.*}

> Immagine

Ma questo strataggemma non sembra proprio funzionare attraverso Exec..oppure sono stupido io,cosa perfettamente plausibile!Questo però ci da lo spunto per introdurre un nuovo argomento. Per rendere i nostri servicemenu molto più performanti, possiamo far puntare la riga Exec ad uno script bash scritto direttamente da noi. In questa maniera sarà molto più facile scrivere operazioni complesse che vanno oltre poche righe.Così messo di buona lena ho scritto un piccolo script bash che ci permette di scegliere la cartella di destinazione e il nome del file.iso attraverso una comoda interfaccia grafica in stile kde. Lo scripting non è l’obiettivo di questa guida quindi vi mostro il codice ma non lo commenterò,vi basti sapere che risolve il problema della sostituzione delle estensioni e che, a seconda del parametro passato, faccia ognuna delle tre conversioni preventivate.

#!/bin/bash
#version 0.1
#License=GPL3
#Author=Fabrizio "Ramiel" Ruggeri
#Mail=ramiel@cheapnet.it
#Site=ramielinux.wordpress.com
stringa=$1
mode=$2
FIRST=${stringa%.*}.bin
SECOND=${stringa%.*}.cue
DIRECTORY=`kdialog --getexistingdirectory $PWD`
NAME=`kdialog --inputbox "Converter" "Insert here the .iso filename destination"`
echo $stringa
echo $FIRST
echo $SECOND
echo $NAME
if [ $mode = 0 ]
then
	bchunk $FIRST $SECOND $DIRECTORY/$NAME
	kdialog --msgbox "All done,ISO Image created"
fi
if [ $mode = 1 ]
then
	bchunk $FIRST $SECOND $DIRECTORY/$NAME -p
	kdialog --msgbox "All done,ISO-PSX Image Created"
fi
if [ $mode = 2 ]
then
	bchunk $FIRST $SECOND $DIRECTORY/$NAME -r
	kdialog --msgbox "All done,ISO-RAW image created"
fi

Oppure scaricatelo da qui.

Dallo script,per convertire nel formato iso la sintassi che ho scelto è “cue2iso nomefile 0″,quindi la nostra riga Exec sarà

Exec=cue2iso %u 0

Per le altre due voci basterà sostituire 0 con 1 o 2.Ecco il service menu nella sua interezza.

ServiceMenu

Quest’inclusione di uno script esterno però ci obbliga a scriverne uno anche per l’installazione, e visto che ci siamo facciamo in modo che questo copi il service menu nella cartella corretta che, perl’utente corrente è

/home/utente/.kde/share/apps/konqueror/servicemenus/

ma possono anche essere messi in

/opt/kde3/share/apps/konqueror/servicemenus/
/usr/share/apps/konqueror/servicemenus/

Non parleremo qui dello script di installazione, ma potete trovare tutto su kde-apps a questo indirizzo. Sentitevi pure liberi di scaricare il service menu,dargli un’occhiata e migliorarlo,è pur sempre in GPL!Mi raccomando ogni volta che create qualcosa del genere condividetelo con la comunità,sarà di aiuto anche a voi per migliorarvi sempre.

Adesso largo alla fantasia…create,create,CREATE!

Ultima nota:

Per creare degli script semplici ma che si avvalgono di piccole interfacce grafiche in kde basta usare il comando kdialog. Lanciate

kdialog –help

per avere una lista di finestre che potete creare. Se per esempio volete creare una finestra che vi proponga una scelta del tipo si/no basta dare

kdialog –yesno “Scegliete fra il si e il no”

yesno.png

Se poi volete sapere cosa ha scelto l’utente sappiate che si ottiene il valore di ritorno dalla variabile $? .Quindi se scegli si avrete

echo $?

>0

Avrete un 1 in caso abbia scelto no!Semplice no?!

Una risposta a Scrivere service-menu per KDE

  1. [...] da NRG (quello di Nero) a CUE (per cui ho scritto un service menu per la conversione ed una guida su come realizzarlo). In realtà per masterizzare tutte queste immagini il problema non si pone [...]

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s

Iscriviti

Get every new post delivered to your Inbox.