【问题标题】:How to get all tracks from an album using iTunes.h/Scripting Bridge如何使用 iTunes.h/Scripting Bridge 从专辑中获取所有曲目
【发布时间】:2012-12-28 21:36:38
【问题描述】:

我想使用iTunes.h从 iTunes 上的专辑中获取所有曲目。
现在我通过以下方式获取当前曲目的数据:

NSInteger trackID = iTunes.currentTrack.databaseID;
NSString *name  = iTunes.currentTrack.name;

专辑名称:

NSString *trackAlbum = iTunes.currentTrack.album;

但是知道我不知道如何获取与当前曲目在同一专辑中的所有曲目。
有任何想法吗?谢谢

【问题讨论】:

    标签: objective-c macos cocoa itunes


    【解决方案1】:

    iTunes API 写得不好。 您必须使用谓词过滤数组。

    NSArray *allSongs = [self allSongs];
    NSArray *songsOfAlbum = [allSongs filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"album == %@ && artist == %@", albumString, artistString]];
    

    你可以得到所有这样的歌曲:

    // Get all Songs
    - (NSArray *)allSongs {
        if (_allSongs == nil) {
    
            NSArray *tracksToPlay = [(SBElementArray *)[self.library tracks] get];
    
            // Sort by artist
            _allSongs = tracksToPlay;
        }
    
        return _allSongs;
    }
    
    - (iTunesLibraryPlaylist *)library {
        if (_library == nil) {
            // Whole Library
            iTunesSource *source = [[[[self.iTunes sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcLibrary]] objectAtIndex:0];
            // Only the Music
            _library = [[[[source playlists] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"specialKind == %i", iTunesESpKMusic]] objectAtIndex:0];
        }
    
        return _library;
    }
    

    【讨论】:

    • 顺便说一句,我应该把allSongslibrary 方法放在哪里?我需要子类化 iTunes 类吗?
    • @PedroVieira 你可以,但你也可以创建一个帮助类来管理你的歌曲
    • 等等,你给我的代码给了我iTunesFileTracks,但我需要他们是iTunesTracks,所以我可以得到他们的名字,持续时间等...
    • iTunesFileTrack 是 iTunesTrack 的子类
    • 有谁知道如何在 iTunes 11 之后只获取音乐曲目?
    【解决方案2】:

    您可以将iTunes Library Framework (10.9 osx) 用于 iTunes 11。

    #import <iTunesLibrary/ITLibrary.h>
    #import <iTunesLibrary/ITLibMediaItem.h>
    #import <iTunesLibrary/ITLibAlbum.h>
    
    NSError *error = nil;
    ITLibrary *library = [ITLibrary libraryWithAPIVersion:@"1.0" error:&error];
    if (library)
    {
            NSArray *tracks = library.allMediaItems; //  <- NSArray of ITLibMediaItem
    }
    for (ITLibMediaItem *item in tracks) {
           NSLog(@"tracks %@",item.album.title);
    }
    

    您可以从ITLibMediaItem获取专辑信息

    【讨论】:

    • 这没有回答问题。
    【解决方案3】:

    作为检索艺术品的示例,我提交了一个 github 存储库: 这是一个使用上述代码更改的目标c代码:

        #import <Foundation/Foundation.h>
        #import <iTunesLibrary/ITLibrary.h>
        #import <iTunesLibrary/ITLibMediaItem.h>
        #import <iTunesLibrary/ITLibArtwork.h>
        int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSError *error = nil;
            ITLibrary *library = [ITLibrary libraryWithAPIVersion:@"1.0" error:&error];
            NSFileManager *fileManager = [NSFileManager defaultManager];
    
            if (library)
            {
                //NSArray *playlists = library.allPlaylists; //  <- NSArray of ITLibPlaylist
                NSArray *tracks = library.allMediaItems; //  <- NSArray of ITLibMediaItem
                [tracks enumerateObjectsUsingBlock:^(ITLibMediaItem*  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                    if (obj.artworkAvailable) {
                        ITLibArtwork* artWork=obj.artwork;
                        //NSData* d=artWork.imageData;
                        switch (artWork.imageDataFormat) {
                            case ITLibArtworkFormatPNG:{
                                NSURL* fileURL=obj.location;
                                NSString* fs=fileURL.lastPathComponent;
                                NSString* path=[fileURL.path stringByReplacingOccurrencesOfString:fs withString:@"Folder.png"];
                                if (![fileManager fileExistsAtPath:path]){
                                    [artWork.imageData writeToFile:path atomically:YES];
                                }
                            }
                                break;
                            case ITLibArtworkFormatJPEG:{
                                NSURL* fileURL=obj.location;
                                NSString* fs=fileURL.lastPathComponent;
                                NSString* path=[fileURL.path stringByReplacingOccurrencesOfString:fs withString:@"Folder.jpg"];
                                if (![fileManager fileExistsAtPath:path]){
                                    [artWork.imageData writeToFile:path atomically:YES];
                                }
                            }
                                break;
                            default:
                                break;
                        }
                    }
                }];
                NSLog(@"End reached");
            }
        }
        return 0;
        }
    

    https://github.com/ENees/iTunesGetImages

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2015-03-28
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 2015-02-20
      相关资源
      最近更新 更多