Как получить только аудиофайлы из основной библиотеки iTunes (возвращенной Scripting Bridge)? - PullRequest
0 голосов
/ 22 марта 2011

У меня довольно простая проблема. Я хочу разместить аудиофайлы в моем виде таблицы. Как я могу отличить их от PDF-файлов и фильмов и т. Д.

Я получаю их из iTunes через Scripting Bridge:

    iTunesSource *source = [[[self iTunes] sources] objectAtIndex:0];
    iTunesPlaylist *mainPlaylist = [[source libraryPlaylists] objectAtIndex:0] ;
    library_ = [[NSArray arrayWithArray:[mainPlaylist tracks]] retain ] ;

Это дает мне ошибку, говоря, что класс iTunesFileTrack не может быть найден (во время соединения) :

[track get];
if(![track isKindOfClass:[iTunesFileTrack class]]) {
    DLog1(@"SKIPPING kind: %@", [track kind]);
}

Я уверен, что упускаю что-то простое:)

На заметку по теме: Есть ли более быстрый способ чтения библиотеки iTunes? Я просто совет по загрузке из файла XML, но это кажется мне небезопасным. Если в следующем выпуске Apple что-то изменит, я облажался.

Спасибо

РЕДАКТИРОВАТЬ: С sdef /Applications/iTunes.app | sdp -fhm --basename iTunes я могу сгенерировать файл .m, который мне нужно проверить для класса. Но это не похоже на работу:

[track get];         
if(![[track className] isEqualToString:@"ITunesFileTrack"]) {
    DLog1(@"SKIPPING kind: %@", [track kind]);
    continue;
}

Skipps только мои потоки: P Не фильмы. (Даже когда я добавляю (track.videoKind != iTunesEVdKNone)). Даже PDF-файлы являются iTunesFileTracks. Но .h заявляет:

// a track representing an audio file (MP3, AIFF, etc.)
@interface iTunesFileTrack : iTunesTrack

1 Ответ

1 голос
/ 22 марта 2011

Я использую что-то подобное в своем коде, поэтому оно должно работать (app - это iTunes SBApplication):

1.) Сначала получите исходный код библиотеки

- (ITunesSource *)librarySource {
  NSArray *sources = [[app sources] get];       
  NSArray *libs = [sources filteredArrayUsingPredicate:[NSPredicate
    predicateWithFormat:@"kind == %i",
    ITunesESrcLibrary]];
  if ([libs count]) {
    return [libs objectAtIndex:0];
  }
  return nil;
}

2.) Итерация по спискам воспроизведения библиотеки

NSArray *libraryLists = [[[self librarySource] libraryPlaylists] get];
for (ITunesLibraryPlaylist *list in libraryLists) {
  NSArray *listTracks = [[list fileTracks] get];
  for (ITunesTrack *listTrack in listTracks) {
    // do stuff...
  }
  [listTracks release];
}

3.) Вы можете проверить другие типы треков, например

if (track.videoKind != ITunesEVdKNone || track.podcast) {
  // track is not of type music
}
...