2011-12-06 16 views
5

Quiero crear una aplicación que se conecta a la biblioteca de iPhoto. Así que ahora me gustaría leer los Eventos y las imágenes de la biblioteca.Leído de la biblioteca de iPhoto programatically

¿Hay alguna manera elegante/fácil de hacer esto o tengo que leer manualmente la estructura del paquete de datos de usuario de iPhoto?

Hasta ahora sólo han encontrado un tomador de la imagen: Is there a UIImagePicker for the Mac Desktop

Actualización: He encontrado otro relevante SO mensaje: Selecting iPhoto images within a cocoa application

Respuesta

5

Puede hacerlo con NSAppleScript. Esto es copiar/pegar desde mi aplicación, hackeado un poco solo para mostrar la 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]; 

Puede hacer lo mismo para encontrar las imágenes

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

Si la liberación de aplicaciones en la App Store que ahora se exige ahora la obligación de utilizar el recinto de seguridad, esto detiene el método de AppleScript anterior de trabajar (la aplicación iPhoto se inicia pero se devuelve un juego vacío).

Las bibliotecas de iPhoto consisten en una estructura de directorios que contiene fotos, bases de datos y archivos XML. El contenido cambia con cada versión de iPhoto, así que tenga cuidado si accede manualmente a estos archivos.

Si sólo desea los detalles del álbum se puede analizar el archivo AlbumData.xml

Si desea fotos se puede navegar por la carpeta Masters. La estructura de archivos sigue la fecha en lugar de los conjuntos configurados en iPhoto.

Más información se puede encontrar en la parte interna de la biblioteca de iPhoto aquí: http://www.fatcatsoftware.com/iplm/Help/iphoto%20library%20internals.html

La mayoría de las bases de datos están en formato SQLite y así se puede acceder mediante programación a través de Objective C, aunque una vez más que puede esperar cambios en el esquema entre diferentes versiones de iPhoto. Las principales bases de datos de interés son Library.apdb y Properties.apdb en Database/apdb.


Si aún desea utilizar el método de Apple Script, aquí es una versión de la respuesta anterior con la parte de la ejecución del script de Apple incluye:

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); 
} 
Cuestiones relacionadas