有什么API用于选择iTunes库的位置?

问题描述 投票:1回答:2

[例如,如何通过编程方式将macOS上的iTunes资料库位置设置为自定义位置, C / Obj-C还是Swift API?

或者,对我来说也可以使用环境设置,例如使用defaults CLI工具或类似的方法修改支柱。

通常,通过在按住Option键的同时启动iTunes来选择自定义iTunes库的位置。我需要能够在例如单元测试环境/以编程方式。

macos cocoa itunes ituneslibrary
2个回答
0
投票

您可能可以通过首选项进行设置。这就是我的访问方式。

-(void)loadITunesPrefLibraryPath {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *userPref = [userDefaults persistentDomainForName:@"com.apple.iTunes"];

id dataBaseLoc = [userPref objectForKey:@"Database Location"];
NSLog(@"%s dataBaseLoc is:%@", __PRETTY_FUNCTION__, dataBaseLoc);
NSLog(@"%s dataBaseLoc class is:%@", __PRETTY_FUNCTION__, [dataBaseLoc class]);
NSData* dataBaseData = (NSData*)dataBaseLoc;
BOOL staleBook = NO;
NSError* bookError = nil;
NSURL* dataBaseURL = [NSURL URLByResolvingBookmarkData:dataBaseData options:NSURLBookmarkResolutionWithoutMounting relativeToURL:nil bookmarkDataIsStale:&staleBook error:&bookError];
self.libExtDBfile = dataBaseURL;
}

一旦获得iTunes的userPrefs。并从URL创建BookMarkData。您可能可以通过

进行设置
[userPref setObject:newDataBaseLoc forKey:@"Database Location"];

另请参阅下一个答案以获取可能的ITLibrary框架私有API访问权限


0
投票

您可以通过ITLibrary框架专用API进行设置(但不要提交到AppStore!)

Via Dumper此处是一个私有类头:

    #import <Foundation/NSObject.h>

@class ITLibLibraryData, NSArray, NSNumber, NSURL;

@interface ITLibDBContent : NSObject
{
    NSArray *_allMediaItems;
    NSArray *_allPlaylists;
    ITLibLibraryData *_libraryData;
    struct _xpc_connection_s *_connection;
    struct dispatch_queue_s *_connectionDispatchQueue;
    void *_artworkRetriever;
    BOOL _dbLoaded;
    NSURL *_databaseURL;
    NSNumber *_databaseID;
}

+ (void)setSharedInstance:(id)arg1;
+ (id)sharedInstance;
@property(retain, nonatomic) NSNumber *databaseID; // @synthesize databaseID=_databaseID;
@property(retain, nonatomic) NSURL *databaseURL; // @synthesize databaseURL=_databaseURL;
@property BOOL dbLoaded; // @synthesize dbLoaded=_dbLoaded;
- (BOOL)havePendingMigratedBooks;
- (void)migratedMediaItems:(id)arg1;
- (void)downloadCloudMediaItem:(id)arg1;
- (void)sendCommandToITunes:(struct __CFDictionary *)arg1;
- (void)setiTunesPref:(id)arg1 value:(void *)arg2;
- (void *)copyiTunesPref:(id)arg1;
- (id)artworkForMediaFileAtURL:(id)arg1;
- (id)artworkForMediaItem:(id)arg1;
@property(readonly, nonatomic) struct ITLibArtworkRetriever *artworkRetriever; // @dynamic artworkRetriever;
- (id)locationOfMediaItem:(id)arg1;
- (id)mediaItemArtworkByPersistentID:(id)arg1;
- (id)playlistByPersistentID:(id)arg1;
- (id)mediaItemByPersistentID:(id)arg1;
@property(retain, nonatomic) NSArray *allPlaylists; // @dynamic allPlaylists;
@property(retain, nonatomic) NSArray *allMediaItems; // @dynamic allMediaItems;
@property(retain, nonatomic) ITLibLibraryData *libraryData; // @dynamic libraryData;
- (int)loadDatabase;
- (int)initDatabaseURL;
- (void)sendMessage:(void *)arg1 withReplyHandler:(CDUnknownBlockType)arg2;
- (int)initConnection;
@property struct dispatch_queue_s *connectionDispatchQueue; // @dynamic connectionDispatchQueue;
@property struct _xpc_connection_s *connection; // @dynamic connection;
@property(readonly) BOOL useRemote; // @dynamic useRemote;
- (void)finalize;
- (void)dealloc;
- (id)initAndReturnError:(id *)arg1;

@end

在我的.m文件中,我添加了以下扩展名:

    @interface ITLibrary ()

@property(retain, nonatomic) ITLibLibraryData *libraryData;
@property(retain, nonatomic) NSNumber *databaseID; // @synthesize databaseID=_databaseID;
@property(retain, nonatomic) NSURL *databaseURL;
    //@property(copy, nonatomic) NSURL *musicFolderLocation;

- (id)locationOfMediaItem:(id)arg1;
- (id)mediaItemArtworkByPersistentID:(id)arg1;
- (id)playlistByPersistentID:(id)arg1;
- (id)mediaItemByPersistentID:(id)arg1;

@end

    @interface ITLibDBParser : NSObject

 - (id)parse;
 - (void)dealloc;
 @property(nonatomic) BOOL parseMediaItemLocation; // @dynamic parseMediaItemLocation;
 - (id)initWithDatabaseURL:(id)arg1;

 @end

我已添加此方法,但尚未尝试:

-(void)loadExternalDBFile:(NSURL*)extItunesDBFile {
[self.iTunesLib setDatabaseURL:extItunesDBFile];
BOOL loadExt = [self.iTunesLib reloadData];
NSLog(@"%s loadExt is:%hhd", __PRETTY_FUNCTION__, loadExt);

}

嗯,我刚刚尝试过:

NSURL* newDBURL;
BOOL loadExt2 = [ITLibDBContent initDatabaseURL:newDBURL];

并且说不知道initDatabaseURL的类方法

也尝试过:

NSURL* newDBURL;
BOOL loadExt2 = [self.iTunesLib initDatabaseURL:newDBURL];

并且有相同的错误

© www.soinside.com 2019 - 2024. All rights reserved.