martedì 26 luglio 2011

Riorganizzare o rinominare i files immagine e MP3 con i dati EXIF e ID3 (e, ovviamente, leggere i dati EXIF e ID3) - Parte 1 - Lo Scriptomane - livello MEDIO

Qualche giorno fa, mi è stata fatta un'obiezione (peraltro legittima) da un amico: ma che c@#[o mi metti in copia conoscenza dei tuoi post sul blog, che io sono un grafico (per farla breve) ... posso apprezzare, capire il concetto, ma....

Caro Tiz, hai ragione!

Per questo ho deciso di pubblicare qualche script che abbia utilità comune, in modo da interessare anche chi non fa il sistemista di mestiere... .... e siccome ho tanti amici grafici e/o appassionati di fotografia....

Oggi parliamo di come leggere i dati EXIF delle immagini in una cartella e spostarle / rinominarle in base a questi dati.

I dati EXIF sono messi nelle proprietà delle immagini da TUTTE le fotocamere digitali oggi in commercio ed includono dati MOLTO interessanti, come il tempo di posa, l'apertura del diaframma e addirittura possono contenere  la GEOLOCALIZZAZIONE dell'immagine, se la fotocamera o il telefono sono stati correttamente impostati.

Per visualizzarli in windows potete cliccare con il destro su una immagine e scegliere proprietà. Nella scheda Dettagli troverete le informazioni di cui vi ho parlato.

Pubblicherò qui TRE script (nella parte 1, parte 2 e parte 3 di questo multi-articolo succulento): uno che ottiene tutte le info di un file che abbiano qualche dato dalla "info 0" alla "info 500"***, uno che sposta le immagini in cartelle in base alla proprietà "DATA DI ESPOSIZIONE", l'ultimo le rinomina, includendo i dati di "tempo di esposizione" ed "apertura del diaframma". Sentitevi liberi di chiedere per qualsiasi modifica che vi è necessaria per le vostre esigenze....


*** lo script può facilmente essere reiterato per tutti i files di una cartella con un semplice batch con il comando FOR, che includerò qui.



Veniamo a noi, facendo l'elenco degli oggetti e delle funzioni che andremo ad utilizzare:

Utilizzerò il metodo PIU' SEMPLICE che c'è: leggerò i dettagli dall'oggetto nella sua cartella, usando il metodo GetDetailsOf di un oggetto Folder nella shell. Esistono metodi più strutturati, ma ho visto che, alla fine, il risultato è praticamente identico...
Inoltre, utilizzando questo metodo, è possibile anche riorganizzare tipi di files differenti, come gli MP3!!!!! Come sapete, anche questi files includono informazioni più o meno dettagliate che possono essere impostate o meno dai nostri lettori di MP3 od essere già contenute all'interno dei files.

Ad esempio, se scaricate musica da uno store MP3 online (ad esempio OVI Store di Nokia che, per inciso, ha scelto di rimuovere i fastidiosi DRM dai suoi files, quindi è mio piacere segnalarvelo come store preferito per acquistare musica senza dannarsi quando dovete cambiare dispositivo su cui riprodurli), troverete molte informazioni già popolate, come GENERE, ARTISTA, ALBUM, ANNO DI PUBBLICAZIONE, e così via.
Le informazioni presenti nei files MP3 si chiamano ID3, ed il bello del mio metodo è che possono essere letti nella medesima modalità (occupano però posizioni diverse nelle "righe" di dettaglio dei files).
Unico limite del mio metodo è che NON vi dice il nome della proprietà che va ad ottenere. Di seguito riporto degli elenchi delle proprietà di immagini e files MP3 che ho rilevato da alcuni files di esempio, paragonandoli manualmente con le proprietà dei files.




PER TUTTI I FILES:
  1. Nome del File
  2. Dimensione del file
  3. Tipo del File (es. Audio formato MP3)
  4. data di ultima MODIFICA DEL FILE
  5. Data di CREAZIONE DEL FILE
  6. Data di CREAZIONE DEL FILE (ancora??)
  7. Attributo Archivio

PER FILES MP3:
9- Tipo di file (es. Audio)
10- Nome utente Proprietario del file
11- Musica
13- Artisti partecipanti
14- Album
15- Anno di pubblicazione
16- GENERE (es Speech, Grunge, metal, ...)
17- Elenco dei conduttori separato da ";"
19- Classificazione (es 5 stelle)
20- Artisti partecipanti
21- Titolo del brano
24- Commenti (opzione multiriga)
26- Numero Traccia
27- Durata nel formato (HH:mm:ss)
28- BitStream (Kbps)
29- Protetto (Si o No)
53- Computer (dove si trova il file?)
155- Nome del File
173- BOOOOOH (valore nel mio esempio: No)
176- Nome della cartella dove si trova il file
177- PERCROSO COMPLETO della cartella dove si trova il file
178- Nome cartella (percorso\cartella\)
180- percorso COMPLETO del FILE
182- Tipo (es. Audio formato MP3)
188- BOOOH (Non risolto)
193- Autore della Codifica
217- Artista Album
219- Battute al minuto
220- Elenco di compositori separato da ";"
221- Chiave Iniziale
269- Condiviso (es Non Condiviso)


PER IMMAGINI TIFF O JPG:
9- Tipo di File (es Immagine)
10- Utente proprietario della copia del file
11- Tipo di file (es Immagine)
12- DATA DI ESPOSIZIONE (es ?06/?04/?2001 ??11:51, non so perchè dei punti di domanda)
18- Tag; separati; da punto e virgola
19- Classificazione (es 5 stelle)
20- Autori; separati; da punto e virgola
21- Titolo
22- Oggetto
24- Commenti
25- CopyRight Notice
30- Modello Fotocamera (es E950)
31- DIMENSIONE (es ?800 x 600?)
32- Produttore Fotocamera (es NIKON)
35- Nome del programma (es v981-79, che nel mio caso è la versione del firmware)
53- Nome del Computer (questo computer)
128- Data del TRASFERIMENTO (es ?18/?11/?2011 ??14:57)
155- Nome del file (es nikon-e950.jpg)
160- Profondità di colore in bit (es 24)
161- Risoluzione in dpi (es ?300 dpi)
162- Larghezza in Pixels (es ?800 pixels)
163- Risoluzione in dpi (es ?300 dpi)
164- Altezza in Pixels (es ?600 pixels)
173- BOOOH (es Si/No)
176- Nome della cartella dove si trova il file
177- PERCORSO COMPLETO della cartella dove si trova il file
178- Nome cartella (percorso\cartella\)
180- percorso COMPLETO del FILE
182- Tipo di file (es Immagine JPEG)
188- BOOOH (es Non risolto)
230- VERSIONE DEI DATI EXIF (vedi standard EXIF) (es 0210     = 2.1)
232- Passaggi Esposizione (es ?0 passaggio)
233- Programma Esposizinoe (es Manuale)
234- Tempo di Esposizione (es ?1/77 sec.)
235- Apertura del diaframma (es f/5.5)
236- Flash (es Flash, obbligatorio, con ritorno di luce stroboscopica)
237- Distanza focale (es ?13 mm)
238- Lunghezza Focale (es 135, 50, 28, 80, ... sono gli obbiettivi)
239- ISO (es ISO-80)
240- Riduttore Lenti
241- Modello Lenti
242- Sorgente Luminosa (es Fluorescente)
243- Massima apertura della lente (es 2.6)
244- Modalità di regolazione (es Motivo)
245- BOOOOOH (nel mio esempio: Normale)
247- Programma di Esposizione (es Manuale)
248- Modalità di Saturazione (es Saturazione elevata)
250- Modalità di blianciam. dei bianchi (es Automatico)
269- Condiviso (es Non condiviso) ???


Questi sono i dati che per ora sono riuscito a rilevare. Chiunque voglia contribuire alla creazione di questo elenco può far girare lo script GetDetailsOf (preso da un esempio sul sito della MS e "leggermente modificato"), modificando il nome del file e la cartella, per analizzare i dati di un suo file e vedere se riesce ad estrarre di più, postandolo nei commenti

La riga di comando, da lanciare dentro un prompt dei comandi (cmd**) è questa:
Prima ci si sposta nella cartella che contiene lo script, con "CD nomecartella"
cscript getDetailsOf.vbs "nome_cartella" "nome_file.ext" (CON le virgolette)



** per lanciare il prompt dei comandi: start->esegui->scrivere CMD->OK , oppure cliccare sul prompt dei comandi da start->programmi->accessori.




##########################################################################
LO SCRIPT getDetailOf.vbs:
##########################################################################
Set args = Wscript.Arguments
StrFolderNamet = args.Item(0)
StrFileNamet = args.Item(1)


function fnGetDetailsOfVB(StrFolderName, StrFileName)
        dim objShell
        dim objFolder
       
        set objShell = CreateObject("shell.application")
        set objFolder = objShell.NameSpace(StrFolderName)

        if (not objFolder is nothing) then
            dim objFolderItem

            set objFolderItem = objFolder.ParseName(StrFileName)

            if (not objFolderItem Is Nothing) then
                dim objInfo, objInfoTip
                 For x=0 to 500
                    objInfo = objFolder.GetDetailsOf(objFolderItem, x)
                    if (not objInfo = "") Then
                    wscript.echo x &"- " & objInfo
                    end if
                 Next
                 objInfoTip = objFolder.GetDetailsOf(objFolderItem, -1)
                 wscript.echo
                 wscript.echo objInfoTip
            end if
           
            set objFolderItem = nothing
        end if
       
        set objFolder = nothing
        set objShell = nothing
    end function
fnGetDetailsOfVB StrFolderNamet, StrFileNamet


##########################################################################
FINE DELLO SCRIPT getDetailOf.vbs
##########################################################################

Ora riporto qui uno script molto semplice che ottiene tutte le info per i files JPG e MP3 in una cartella, passata come parametro. (si può trascinare la cartella sul file .bat), GENERANDO UN FILE DI  TESTO PER OGNI FILE di quel tipo presente nella cartella, contenente le info di quel file.


##########################################################################
LO SCRIPT gainAllInfo.bat:
##########################################################################

@echo off

FOR /F "usebackq delims=;" %%a IN (`dir /b %1\*.jpg, *.mp3`) DO (
echo %1\%%a
 cscript /nologo getDetailsOf.vbs %1 "%%a">"%%a_INFO.txt"


##########################################################################
FINE DELLO SCRIPT gainAllInfo.bat:
##########################################################################


OVVIAMENTE I DUE FILE (.vbs e .bat) DEVONO ESSERE POSIZIONATI NELLA STESSA CARTELLA.

 ...

A presto per la prossima parte dell'articolo e per il commento di ogni parte degli script qui elencati.

    3 commenti:

    1. Ciao,
      ho trovato molto interessante la lettura dei tags .jpg in quanto li cercavo ta tempo. Mi piacerebbe però poter scrivere via vbscript alcunti di essi quali ad es. 21-Titolo, 22-Oggetto, 18-Tag, 24-Commenti ..
      Ho provato per simmetria ad utilizzare SetDetailsOf(objFolderItem, x), ma senza successo.
      Qualche suggerimento? ringrazio in anticipo. Ignazio

      RispondiElimina
      Risposte
      1. Ciao, purtroppo non sono a conoscenza di un metodo con vbscript. Anzi ho proprio guardato all'object model degli oggetti shell relativi al filesystem sulla doc MS ma non ho trovato nulla.
        Tuttavia ho trovato un sistema con powershell in un interessante commento qui: https://social.technet.microsoft.com/Forums/scriptcenter/en-US/8b398413-0728-4a8a-a593-d2e8b92b88f2/editing-image-exif-tags?forum=ITCG
        Spero ti possa essere utile.

        Elimina
      2. P.S. in alternativa c'è anche chi ha scritto degli eseguibili.
        Non che mi piaccia raccomandare tool di cui non conosco nulla, ma se serve e se puoi verificarne la sicurezza:
        https://exiftool.org/

        Elimina

    I commenti sono soggetti a moderazione, prima di essere pubblicati.

    Qualsiasi contenuto illecito, immorale o che io ritenga (arbitrariamente) offensivo od inappropriato, verrà cancellato.