2011-12-06 11 views
5

Voglio creare un'applicazione che si colleghi alla libreria iPhoto. Quindi ora mi piacerebbe leggere gli eventi e le immagini stesse dalla biblioteca.Lettura dalla libreria iPhoto programmaticamente

C'è un modo elegante/semplice per fare questo o devo leggere manualmente la Struttura Bundle dei dati utente di iPhoto?

Finora ho trovato solo un acquirente di immagine: Is there a UIImagePicker for the Mac Desktop

Aggiornamento: Ho trovato un altro rilevante SO postale: Selecting iPhoto images within a cocoa application

risposta

5

È possibile farlo con NSAppleScript. Questo è un po 'copia/incolla dalla mia app, un po' hacked un po 'solo per mostrare l'idea.

NSAppleEventDescriptor d = .. compile this script .. 
     @"tell application \"iPhoto\" to properties of albums" 

    for (int i = 0; i < [d numberOfItems]; i++) 
    { 
     NSAppleEventDescriptor *albumDesc = [d descriptorAtIndex:i]; 

     // <NSAppleEventDescriptor: 'ipal'{ 
     // 'ID ':4.265e+09, 
     // 'purl':'utxt'("http://www.flickr.com/photos/..."), 
     // 'pnam':'utxt'("Vacation"), 
     // 'alTy':'pubs', 
     // 'alCh':[ ], 
     // 'alPx':'msng' }> 

     NSString *albumName = [[albumDesc descriptorForKeyword:'pnam'] stringValue]; 
     NSString *albumId = [[albumDesc descriptorForKeyword:'ID '] stringValue]; 

È possibile fare la stessa cosa per trovare le immagini

NSString *scp = 
    [NSString stringWithFormat:@"tell application \"iPhoto\" to properties of photos of album id %@", 
    [album objectForKey:@"id"]]; 

NSAppleEventDescriptor *d = ... compile scp ... 

// 1 based!? 
for (int i = 1; i <= [d numberOfItems]; i++) 
{ 
    NSAppleEventDescriptor *photoDesc = [d descriptorAtIndex:i]; 

    // Yes.. this happens. Not sure why?! 
    if (!photoDesc) 
     continue; 

    // <NSAppleEventDescriptor: 'ipmr'{ 
    // 'pnam':'utxt'("IMG_0058.JPG"), 
    // 'pwid':768, 
    // 'pdim':[ 768, 1024 ], 
    // 'alti':1.79769e+308, 
    // 'filn':'utxt'("3133889525_10975ba071_b.jpg"), 
    // 'ipth':'utxt'("/Users/lagnat/Pictures/iPhoto Library/Masters/2010/11/10/20101110-002341/3133889525_10975ba071_b.jpg"), 
    // 'idat':'ldt '($F57C69C500000000$), 
    // 'rate':0, 
    // 'titl':'utxt'("IMG_0058.JPG"), 
    // 'phit':1024, 
    // 'itpt':'utxt'("/Users/lagnat/Pictures/iPhoto Library/Thumbnails/2010/11/10/20101110-002341/3133889525_10975ba071_b.jpg.jpg"), 
    // 'ID ':4.295e+09, 
    // 'lati':'msng', 
    // 'pcom':'utxt'(""), 
    // 'opth':'utxt'("/Users/lagnat/Pictures/iPhoto Library/Masters/2010/11/10/20101110-002341/3133889525_10975ba071_b.jpg"), 
    // 'lngt':'msng', 
    // 'tiln':'utxt'("3133889525_10975ba071_b.jpg.jpg") }> 

    NSString *path = [[photoDesc descriptorForKeyword:'ipth'] stringValue]; 
    NSString *imgname = [[photoDesc descriptorForKeyword:'pnam'] stringValue]; 
1

Se rilasciare applicazioni su App Store che si sono ora tenuti ora tenuti a utilizzare la Sandbox, questo si ferma il metodo AppleScript precedente di lavorare (l'app iPhoto si avvia ma viene restituito un set vuoto).

Le librerie iPhoto sono costituite da una struttura di directory contenente foto, database e file XML. Il contenuto cambia con ciascuna versione di iPhoto, quindi fai attenzione se accedi manualmente a questi file.

Se si desidera solo i dettagli dell'album è possibile analizzare il file AlbumData.xml

Se volete foto è possibile sfogliare la cartella Masters. La struttura dei file segue la data piuttosto che i set configurati in iPhoto.

Maggiori informazioni possono essere trovate sui meccanismi interni della libreria di iPhoto qui: http://www.fatcatsoftware.com/iplm/Help/iphoto%20library%20internals.html

La maggior parte delle basi di dati sono in formato SQLite e quindi può essere di programmazione accede attraverso Objective C, anche se ancora una volta ci si può aspettare le modifiche dello schema tra diverse versioni di iPhoto. I principali database di interesse sono Library.apdb e Properties.apdb in Database/apdb.


Se si desidera continuare a utilizzare il metodo di Apple Script, ecco una versione della risposta precedente con la parte esecuzione dello script di Apple incluso:

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"tell application \"iPhoto\" to properties of albums"]; 
NSAppleEventDescriptor *d = [script executeAndReturnError:nil]; 

NSLog(@"photo library count: %ld", (long)[d numberOfItems]); 

for (int i = 0; i < [d numberOfItems]; i++) 
{ 
    NSAppleEventDescriptor *albumDesc = [d descriptorAtIndex:i]; 

    NSString *albumName = [[albumDesc descriptorForKeyword:'pnam'] stringValue]; 
    NSLog(@"%@", albumName); 
} 
Problemi correlati