2011-12-06 12 views
5

Chcę utworzyć aplikację, która łączy się z biblioteką iPhoto. Teraz chciałbym przeczytać wydarzenia i same zdjęcia z biblioteki.Programowany programowo z biblioteki iPhoto

Czy istnieje elegancki/łatwy sposób to zrobić, czy muszę ręcznie odczytać strukturę pakietu danych użytkownika iPhoto?

Do tej pory tylko znalazłem przyjmujący obrazku: Is there a UIImagePicker for the Mac Desktop

Update: Znalazłem kolejny istotny SO postu: Selecting iPhoto images within a cocoa application

Odpowiedz

5

Można to zrobić z NSAppleScript. To jest trochę kopiowania/wklejania z mojej aplikacji, zhakowałem trochę tylko po to, by pokazać ten pomysł.

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]; 

Można zrobić to samo, aby znaleźć obrazy

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

Jeśli zwalniając aplikacje na App Store jesteś obecnie wymagane obecnie wymagane do korzystania z piaskownicy, to zatrzymuje poprzednią metodę AppleScript z pracy (aplikacja iPhoto uruchamia się, ale zwracany jest pusty zestaw).

Biblioteki iPhoto składają się ze struktury katalogów zawierających zdjęcia, bazy danych i pliki XML. Zawartość zmienia się wraz z każdą wersją iPhoto, więc zachowaj ostrożność, jeśli ręcznie uzyskasz dostęp do tych plików.

Jeśli chcesz tylko szczegóły album można przetworzyć plik AlbumData.xml

Jeśli chciałbyś zdjęcia można przeglądać folder Masters. Struktura plików jest zgodna z datą, a nie z zestawami skonfigurowanymi w programie iPhoto.

Więcej informacji można znaleźć na wewnętrznych biblioteki iPhoto tutaj: http://www.fatcatsoftware.com/iplm/Help/iphoto%20library%20internals.html

Większość baz danych w formacie SQLite i tak można programowo dostęp przez Objective C, chociaż znowu można się spodziewać zmian schematu między różnymi wersjami iPhoto. Główne interesujące bazy danych to Library.apdb i Properties.apdb w Database/apdb.


Jeśli nadal chcesz korzystać z metody firmy Apple Script, oto wersja poprzedniej odpowiedzi z części wykonawczej APPLESCRIPT obejmowały:

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); 
} 
Powiązane problemy