Archivi tag: iTunes

IMG_2710.JPG

Condivisione multi utente per la libreria iTunes e altro ancora (parte 3)

Fatto il vostro backup?

Allora siamo pronti a partire con lo sviluppo del cuore del nostro progetto: una procedura di creazione di una libreria indipendente e condivisa.

Da questo momento consideriamo la libreria del nostro utente (che è amministratore per ragioni che vedremo in seguito) la libreria master nella nostra architettura, che evidentemente è stata scelta in quanto ragionevolmente é quella che per ragioni anche storiche ha il peso maggiore di media condivisibili nel sistema.

Creiamo una nuova libreria nella Cartella condivisa (con procedura ormai nota se avete letto la documentazione consigliata).SegliLibreria

Apriamola. Configuriamola in modo che non esegua copia degli oggetti importanti (consolidamento) e non mantenga ordinata la libreria: non è il suo ruolo: questa sarà una libreria slave, non dovrebbe avere diritto di gestione (anche se vedremo possibile, entro certi limiti, utilizzando uno strumento di gestione che proporremo alla fine della trattazione).configurazione

Il problema (rilevato ma non risolto dal supporto Apple) sarà trovare il modo di rendere sincrone le due librerie. Vedremo di risolverlo.

Rimuoviamo ora la cartella Music nella nuova libreria (in iTunes Media); al suo posto ci poniamo (muovendola) la cartella Music della libreria master (è la cartella che contiene tutti i media da condividere).

Nella libreria master spoglia della cartella Music (in iTunes Media) creiamo un collegamento (semplicemente tenendo premuto alt+cmd mentre fate un drag&drop) della cartella Music ora mossa nella nuova posizione. Questo garantirà alla libreria master di mantenere la visibilità dei media a lei noti.stato_master

Come amministratore possiamo ora modificare i diritti della cartella Musica appena spostata consentendo la lettura a tutti gli utenti con cui volete condividere il suo contenuto; non autorizziamo la scrittura se vogliamo rendere la libreria puramente slave e non abbia quindi diritto di modificare i media.

Ora è il momento di riaprire la libreria master: tutto è al suo posto, giusto? Se qualcosa non è al posto giusto possiamo verificare la posizione della cartella Music nelle Preferenze ed eventualmente reimpostarla. Se iTunes pensa di dove iniziare la copia dei media potrebbe avviare tale procedura: bloccatela! Non è necessaria. Abbiamo giocato con spostamento e collegamento, andando oltre la procedura Apple che prevede necessita di spazio disco libero pari alla dimensione dei media da spostare. Se tutto è dunque a posto esportiamo la libreria master in formato xml.export

Ora riaprite la nuova libreria costituita in precedenza (slave): questa è vuota pur avendo collocati una cartella Music piena di materiale. Abbiamo detto già che la libreria è tale in quanto raccoglitore di metadati. Ora importate il file xml esportato precedentemente con la funzione “Importa playlist”.import

Chiaro no? L’importazione parla di playlist; Music è una playlist, e iTunes ci sta dicendo che l’importazione riguarderà solo musica.

Finita l’operazione ecco dunque che avrete due librerie identiche (solo nel contenuto migrato) ma che condividono anche fisicamente gli stessi media, ma solo per ciò che attiene alla musica. Per gli altri media la gestione risulterà indipendente. Potrete aggiungere libri, applicazioni o quanto altro alla nuova libreria nei modi di sempre: questo è dunque possibile. Ciò trova anche una soluzione alla gestione ad esempio delle app “legacy” per vecchi dispositivi (basta creare una libreria slave per gestire questi, pur condividendo altri media).


Ma adesso arriva il difficile: aggiungendo nuovi media musicali nella libreria master (che consolida) avremo nuovi oggetti nella cartella media condivisa, ma non li avremo come metadati nella libreria (o nelle librerie) slave (nel file .itl, per intenderci).

Ogni volta che si modifica la libreria master andrebbe aggiornata la slave aprendo iTunes su questa e aggiungendo o rimuovendo oggetti (alterare playlist, ecc).

È evidente come sia necessario automatizzare questa procedura, almeno per quanto riguarda l’aggiunta di nuovi media condivisi (le pllaylist sono raccolte soggettive che lasciamo ai singoli utenti).

Per risolvere questo problema ancora una colta ho scritto un po’ di codice AppleScript (ci ho preso gusto!).

Purtroppo iTunes non espone metodi per salvare tutte le informazioni in un colpo solo, ma solo un metodo add per aggiungere file a partire da un loro alias: questo mi sono fatto comunque bastare. Un unico script che esporti ed importi i metadati attraverso un file di interscambio (un semplice file contenente la lista dei nuovi file) tra le due istanze di libreria.

Andrà attivato prima sulla libreria sorgente (usando la playlist “Aggiunti di recente” quale fonte dell’elenco dei brani da migrare), poi su quella destinazione: questa procedura ci offre la soluzione cercata.

Possiamo eseguire esportazioni successive dalla libreria master ed importare il tutto nella libreria slave in un unico momento.  L’importazione finisce con la rimozione del file di interscambio, iniziando una nuova accumulazione.

Ma non dilunghiamoci in descrizioni ulteriori di implementazione; ecco di seguito il sorgente.

 

[codesyntax lang=”applescript”]

-- 
-- @author Andrea Tassotti


--
-- differenza tra due insiemi
--
on difference(set1, set2)
set differ to {}
repeat with o in set2
if set1 does not contain o then
set differ to differ & o
end if
end repeat
return differ
end difference

--
-- Esistenza file
--
on existsFile(migrationFile)
tell application "Finder"
if not (exists migrationFile) then
return false
else
return true
end if
end tell
end existsFile

--
-- Lettura lista migrazione
--
on readMigrationFile(migrationFile)
-- read
if existsFile(migrationFile) is true then
tell current application
set fileRef to open for access alias migrationFile
set lista to read alias migrationFile as list
close access fileRef
return lista
end tell
else
return false
end if
end readMigrationFile

--
-- Scrittura (overwrite) lista migrazione
--
on writeMigrationFile(migrationFile, lista)
-- write
try
tell current application
set fileRef to open for access alias migrationFile with write permission
write lista to fileRef as list
close access fileRef
end tell
on error
display alert "Errore scrittura:" & (migrationFile as text)
end try
end writeMigrationFile

--
-- Preleva alias da voci di playlist selezionata (no Libreria intera)
-- 
to itemsToMigrate()
tell application "iTunes"
set currentPlayList to view of window 1
set currentPlayListName to name of currentPlayList
if special kind of currentPlayList is none then
return location of every file track of currentPlayList
else
display alert "Possono essere esportate solo playlist effettive" message "Le playlist speciali (Music, Books, Podcasts, ecc) non sono contemplate" giving up after 2
return {}
end if
end tell
return {}
end itemsToMigrate

--
-- Corpo principale del programma
--
on run
set migrati to {}
set migrationFile to ((path to shared documents) as text) & "migration.itpl"
set migrati to readMigrationFile(migrationFile)

if migrati is not false then
-- - -- Verifica se master o slave
display alert "Controllo esistenza elementi in libreria. Questa operazione può durare molto. Attendere" giving up after 1
set primo to first item of migrati
tell application "iTunes"

set libreria to location of every file track of library playlist 1

if libreria does not contain primo then
-- Libreria Slave: importiamo
repeat with aFile in migrati
add aFile
end repeat
-- Rimuoviamo il file consumato
tell application "Finder"
if exists migrationFile then
delete migrationFile
end if
end tell
display alert "Fine importazione"
return
end if
end tell
end if
 

if migrati is false then
set migrati to {}
end if


-- Esportazione controllata
set daMigrare to itemsToMigrate()
if daMigrare is not {} then
-- Calcoliamo la differenza per evitare doppioni
-- poi aggiungiamo comunque quelli migrati per fare append del file
set lista to difference(migrati, daMigrare)
if lista is {} then
display alert "Contenuto migrato in precedenza"
else
writeMigrationFile(migrationFile, migrati & lista)
display alert "Esportazione lista migrazione terminata"
end if
end if
end run

[/codesyntax]

 

In quanto risultato delle nostre analisi, lo script lo rilasciamo liberamente, ma gradiremmo almeno un commento su questo blog se sarete tra quelli che lo copieranno ed utilizzeranno.

Buona condivisione!

Riferimenti

iTunes: How to share music between different user accounts on a single computer

iTunes for Mac: Moving your iTunes Media folder

How to move your iTunes library to a new computer

iTunes: How to re-create your iTunes library and playlists

IMG_2710.JPG

Condivisione multi utente per la libreria iTunes e altro ancora (parte 2)

Continuiamo l’analisi di iTunes per raggiungere il nostro obiettivo di condivisione.

Ripartiamo con alcune caratteristiche “fisiche” della libreria iTunes.

La libreria è composta di un file “.itl” e un insieme ordinato di cartelle.
Lo schema della cartella della libreria è il seguente:

  • Album Artwork
  • iTunes Library.xml
  • iTunes Library Extras.itdb
  • iTunes Library Genius.itdb
  • iTunes Library.itl
  • iTunes Media
  • Previous iTunes Libraries

In particolare la cartella iTunes Media contiene le seguenti cartelle (molte create dinamicamente all’aggiunta in libreria dei media per cui sono predisposte, così come verranno rimosse quando dalla libreria verrà eliminata l’ultima istanza di in certo media):

  • Automatically Add to iTunes.localized
  • Books
  • Music
  • Home Videos
  • iTunes U
  • Mobile Applications
  • Podcasts

Se la vostra libreria è vecchia come la mia, ha probabilmente ereditato la struttura gerarchica precedente: potete liberamente trasferire le cartelle nella posizione corretta (troverete probabilmente Books, Podcast e Home Videos in una cartella iTunes Music).

Mentre le finalità di ciascuna cartella sono abbastanza ovvie, meno noto è l’uso della cartella “Automatically Add to iTunes.localized”.

La cartella “Automatically Add to iTunes.localized” serve ad aggiungere alla libreria (all’avvio di iTunes) gli oggetti ivi eventualmente contenuti: ha due difetti: accetta solo file di media del tipo gestito  (no alias, no playlist in formato xml, testo, m3u, ecc) e copia l’oggetto nel ramo di iTunes Media anche se opzione consolidamento non è attiva. Questo impedisce a questa cartella di essere usata come luogo di scambio (o migrazione) tra librerie da sincronizzare.

ITunes consente di esportare la libreria in formato xml: è una operazione da menu, e si chiama appunto “Esporta Libreria”. Come sottolineato dalla documentazione Apple questa esportazione non è completa; aggiungiamo noi quanto non detto: il file non contempla ad esempio le app mobile, ma per noi è sufficiente riguardi la playlist Musica e le playlist utente derivanti.export

L’importazione sarebbe un mistero se non si tenesse in considerazione quanto abbiamo sottolineato in precedenza e quanto è osservabile interrogando iTunes via AppleScript: la Musica nella libreria è una playlist (particolare, ma pur sempre una playlist). Quindi la funzione “Importa Playlist” è la nostra funzione di importazione della libreria di musica. Per quanto accennato la funzione importerà anche tutte le playlist utente esportate col precedente metodo.import

Non considerate questa esportazione/importazione un sistema di backup completo per la vostra libreria: abbiamo già detto che non contiene tutte le informazioni.

Eppure Apple stessa la considera utile per un disaster recovery della vostra libreria: perché ?

La nascita stessa di una libreria in iTunes fonda le sue ragioni nella necessità di preservare quelle informazioni che non possono risiedere nel formato file del media (è ancora vero per alcuni formati). Tutto quanto è parte del formato file è recuperabile aggiungendo nuovamente il file alla libreria, ma il resto delle informazioni aggiunte grazie alla capacità della libreria non lo è: queste informazioni sono oggetto di esportazione nel formato xml della funzione Esporta Libreria, ecco perché è utile ancora oggi a recuperare una libreria corrotta.

Noi sfrutteremo questa funzione con ben altro scopo.


Quindi, prima di iniziare, affidatevi ad una copia aggiornata della vostra libreria in Time Machine, o (se proprio non potete) almeno affidatevi ad una copia su altro percorso del file Library.itl.

Ci leggiamo quando siete pronti !

IMG_2710.JPG

Condivisione multi utente per la libreria iTunes e altro ancora (parte 1)

Torniamo a parlare di iTunes.

Uno degli aspetti più trascurati in molti software è la possibilità di condividere il proprio archivio tra gli utenti del sistema quando questo archivio abbia una naturale vocazione alla condivisione, anche e non solo per la necessità di tenere sotto controllo il peso degli oggetti di archivio che possono ripetersi tra più utenti.
Forse questa tendenza a trascurare la multi-utenza è dovuta alla ridotta necessità di questa in un mercato dominato da computer portatili utilizzati da un solo proprietario (personal computer, dunque). Il predominare poi dei dispositivi mobile (per loro natura “personal”) ha ulteriormente allontanato la multi-utenza tra le priorità degli sviluppatori software.

Peccano di mancanza di strumenti per la multi-utenza iTunes come gli altri software della famiglia i* (tutto il pacchetto iLife, per intenderci).

Ma stiamo parlando di OSX, un sistema che a differenza del MacOS nasce multiutente, e questa caratteristica ha una naturale collocazione nell’uso domestico e familiare di un iMac, ove ciascun membro può avere un profilo proprio ma che (per naturale appartenenza al medesimo gruppo umano) condividerà molto con gli altri utenti (pensiamo solo ai video o le foto delle gite familiari).

Eppure tutti questi programmi ignorano la loro possibile collocazione in ambito multiutente, lasciando a noi l’onere di individuare una soluzione.

Certo una qualche soluzione a volte è fornita dal supporto Apple (vedi https://support.apple.com/it-it/HT204488), ma come si può leggere non tutto è agevole, e nemmeno tutto è esplicitato.
Focalizzandoci su iTunes (dovremmo affrontare analoghe questioni anche per iPhoto o iMovie) vedremo di trovare alcune soluzioni più “complete”.
iTunes nasce in epoca MacOS ed era dedicato alla sola riproduzione audio. Si è evoluto gradualmente: video, podcast e app mobile sono arrivare col tempo e ben dopo la migrazione a OSX. Librerie ereditate da un’epoca pre iOS (come nel caso della mia) contengono i file multimediali in una cartella iTunes Music. Abbastanza significativo, no?
Gli aggiornamenti dell’applicativo hanno modificato la base dati, ma non la struttura di directory della mia libreria.
Ma il tempo è passato, e la struttura prevista dalle nuove versioni prevede ora tutta un’altra gerarchia, come si può osservare in una libreria creata ex-novo con una nuova versione (vedi procedura https://support.apple.com/it-it/HT201596).

In questa serie di articoli affronteremo principalmente il problema della condivisione della libreria iTunes a vari livelli, ma forniremo anche alcune esperienze sul significato di alcune componenti e sulle possibili configurazioni della libreria, nonché qualche suggerimento sparso. Sia ben chiaro: la “Condivisione in famiglia” non ha nulla a che vedere con il problema affrontato: questa condivisione è via rete locale, quindi l’iPod di vostra moglie non potrà essere sincronizzato con i brani che voi avete acquistato sullo store, pertanto non potrà sentirli durante la sua sessione di palestra (a meno che non abbiate la palestra in casa).
Purtroppo quello che vorremmo raggiungere, ossia la a piena automazione di tutte le procedure, non è ottenibile (come evidente dal documento del supporto Apple https://support.apple.com/it-it/HT204488) anche e non solo in quanto iTunes (come altri software) può aprire librerie differenti solo al suo avvio (vedi procedura https://support.apple.com/it-it/HT201596) e non è capace di fare questo nemmeno via Apple Script (esistono delle possibilità alterando un file di configurazione attraverso il comando defaults, ma non è una scelta condivisibile: troppo suscettibile di variazioni con gli aggiornamenti software). Comunque e una possibilità che completerebbe l’automazione cercata.
Cercheremo comunque di avvicinarci offrendo delle soluzioni di automazione che almeno supportino i processi eventualmente necessari a raggiungere lo scopo principale di realizzare una condivisione multiutente.

Chiariamo subito: una totale condivisione della libreria è possibile in un modo semplice ed immediato ma non utile. Si può infatti completamente condividere una libreria ponendola in area condivisa (Shared folder.localized) tra più utenti e dando i giusti permessi (fatto questo abbastanza ovvio).
Questa però non è (dicevamo) una soluzione utile, in quanto la libreria è contenitore di tutti i media gestibili con iTunes e ciascun utente vorrebbe una qualche autonomia di configurazione, lasciando che solo quanto è realmente condivisibile lo sia mentre il resto possa restare autonomo e privato. Se consideriamo che il file “.itl” gestisce il parco musica, così come le app mobile, libri e playlist e altro ancora è di tutta evidenza come ciascun utente voglia poter mantenere una certa autonomia di alcuni di questi media.

Cercheremo di mostrare come consentire una condivisione completa di musica e al contempo una piena indipendenza di app o quanto altro.
Come si evince da documenti Apple, si possono avere due librerie distinte che condividono gli stessi media, ma non si ha un modo per sincronizzarle.

Questo in quanto le due librerie hanno file “.itl” indipendenti: in questi è presente l’insieme delle informazioni che costituiscono la libreria, e non esistono strumenti di esportazione o importazione parziali.

Cercheremo di superare questo ostacolo. Inoltre daremo una soluzione alla individualità di gestione di altre risorse come le app mobile (la frattura tra versioni di iOS e dispositivi di vecchia generazione impone di avere un parco software non aggiornatissimo in una libreria indipendente diciamo “legacy”).

Iniziamo dunque con una panoramica degli strumenti disponibili, ma questo lo faremo in un altro articolo: ci siamo dilungati troppo.

articolo_itunes

Ancora su iTunes e playlist

Con l’ultimo post su iTunes ho potuto riabbracciare la programmazione AppleScript che avevo tralasciato per lunghi anni, da quando lavoravo ancora con un OS Classic 7.5.5 !

Ovviamente ci ho ripreso gusto, pertanto eccomi di nuovo con un altro post che prosegue in qualche modo il precedente.

L’idea di questa nuova estensione alle funzionalità di iTunes mi viene dal passato, ossia da quei lettori di CD Audio che erano parte degli impianti Hi-Fi degli anni 90 e che oggi sono solo appannaggio di impianti detti di “Hi-Fi esoterico“, dove un componente di tal genere può costare anche fino e oltre i 1000€! Oggi che il mondo musicale è sempre più liquido, un lettore CD Audio è qualcosa rara, pertanto per molti sono solo un ricordo.

In ogni caso quei dispositivi avevano una funzione (almeno quelli di una certa fascia) interessante che non si è diffusa nel mondo liquido. La scansione rapida delle tracce.

La scansione prevedeva l’ascolto dei primi 10 secondi di ogni traccia del disco.

Ebbene abbiamo implementato due script per iTunes che mimano questa funzione sulla playlist selezionata.

Il primo è esattamente a scansione dall’inizione di ogni traccia della playlist selezionata; il secondo invece è una variante che mi è utile nella costruzione di playlist per sonorizzazioni: consente l’ascolto degli ultimi 10 secondi di ciascuna traccia della playlist. Questa funzione è molto utile per trovare i migliori collegamenti tra fine e inizio di tracce che devono susseguirsi in un mix continuativo.

Rammentiamo (cosa non fatta nell’altro post) che per integrare i nostri AppleScript in iTunes sarà sufficiente collocarli in /Library/iTunes/Scripts.

Ovviamente anche in questo caso gli script sono un abbozzo funzionante che può essere migliorato a vostro piacere.

--
-- Scan mode 1
--
--	Head of track for 10 seconds
--
property thePlaylist : ""
property scanTime : 10

tell application "iTunes"
	-- Per le sorgentti che non sono una playlist (come Film, ecc)
	try
		set thePlaylist to (view of front window)
	on error number errn
	end try

	if thePlaylist ≠ "" then
		repeat with theTrack in (tracks of thePlaylist)
			play theTrack
			repeat while player position < scanTime
				delay 0.2
			end repeat
		end repeat
	end if
end tell
--
-- Scan mode 2
--
--	Tail of track for 10 seconds
--
property thePlaylist : ""
property scanTime : 10

tell application "iTunes"
	-- Per le sorgentti che non sono una playlist (come Film, ecc)
	try
		set thePlaylist to (view of front window)
	on error number errn
	end try

	if thePlaylist ≠ "" then
		repeat with theTrack in (tracks of thePlaylist)
			play theTrack
			set player position to (duration of theTrack) - scanTime
			repeat while player position < (duration of theTrack) - 1
				delay 0.2
			end repeat
			pause
		end repeat
	end if
end tell
articolo_itunes

Esportare una playlist iTunes su chiavetta USB

Per tutti coloro che utilizzano al meglio (e felicemente) iTunes e la sua libreria organizzata e consolidata, è difficile pensare ad una organizzazione del materiale audio senza iTunes.

Molti però tendono ancora a gestire i file multimediali in maniera autonoma, specie chi di questa gestione automatizzata, comoda ed integrata non ha mai sentito parlare (non è nel loro DNA, diciamo). Va bé! ci sono forme alternative di pensiero che dicono che noi utenti Apple invero siamo indottrinati; fate come volete. Tant’é. Noi viviamo sereni.

Però il problema nasce quando occorre integrarsi con il mondo a “gestione manuale”.
Se qualcuno ci chiede una copia della nostra playlist (per ascoltare le nostre canzoni autoprodotte rigorosamente con il nostro GarageBand !!! ovviamente !!! ;-), potrebbe essere difficile raccogliere in giro per la cartella “iTunes Music” tutti i file e copiarli diciamo su una chiavetta USB.

Ecco che ci viene incontro un piccolo frammento di codice AppleScript da me creato in pochi minuti (potenza del linguaggio):

tell application "iTunes"
    repeat with aTrack in (tracks of user playlist "Prova")
        set theAlias to (get location of aTrack)
        set theAlbum to (get album of aTrack).
        tell application "Finder"
        try
                duplicate theAlias to folder "Macintosh HD:Users:andrea:Desktop:Prova"
        on error number errn
            if errn = -15267 then
                make new folder at folder "Macintosh HD:Users:andrea:Desktop:Prova" with properties {name:theAlbum}
                duplicate theAlias to folder ("Macintosh HD:Users:andrea:Desktop:Prova:" & theAlbum)
            end if
        end try
        end tell
    end repeat
end tell

Rozzamente (non abbiamo prodotto una interfaccia per richiedere sorgente, ossia playlist, e destinazione, ossia un folder) ma semplicemente questo script cercherà per noi tutti gli originali indicati da una playlist e li copierà in un folder da noi indicato: qualora il file dovesse collidere con uno già presente (ricordiamo che i nomi di file gestiti con libreria organizzata da iTunes sono fatti del numero di traccia e del titolo, quindi possono sussistere casi di omonimia in assenza di album) allora crea un subfolder con il titolo dell’album.

Potrete modificarlo a piacimento, magari creando direttamente la gerarchia di folder che più vi aggrada, introducendo altre meta informazioni, se necessario.

Buon ascolto!