我是一名经验丰富的编码员,但是新手为Apple设备编写代码。我试图使用Swift访问我的OS X设备上的媒体库。我可以找到几十个为iOS设备完成此任务的示例,并成功实现了一些代码来为iOS执行此操作。但是,我很难尝试为OS X做同样的事情。
任何人都可以指点我,或提供任何可以帮助我使用Swift访问OS X设备上的媒体库(itunes)的建议吗?
编辑:为了澄清,如果我正在为iOS编写,我可以调用MPMediaQuery来查询媒体库。我正在寻找可以在为OS X编写的Swift代码中使用的类似的东西。
提前致谢。
答案 0 :(得分:1)
您似乎专指iTunes资料库。它是通过Apple提供的iTunes应用程序创建,维护和访问的。幸运的是,iTunes可以直接通过AppleScript或在您自己的应用程序中加入AppleScript调用来实现高度脚本化。
要了解可能的内容,请先打开位于/ Applications / Utilities中的脚本编辑器应用,然后选择文件 - >打开词典......
该列表包括支持脚本编写的所有应用程序。选择iTunes以显示详细说明其界面的浏览器。例如,选择 iTunes套件 - >跟踪显示您可以访问的属性:
如何编写AppleScript代码和/或如何将其合并到您自己的应用程序中远远超出了单个问题的范围。但是,Apple开发者网站上有许多资源可以帮助您开展工作。一个合乎逻辑的起点是:AppleScript Overview。
答案 1 :(得分:1)
上个月我一直在努力解决这个问题。这就是我能想到的。
加载媒体对象后,您必须对媒体对象执行相同的操作。这些电话是非阻塞的。
我使用OS X库中的MediaLibrary引用来解决这个问题。这是获取其余细节的好地方。
import Cocoa
import MediaLibrary
class ViewController: NSViewController {
var library : MLMediaLibrary!
var iTunes : MLMediaSource!
var rootGroup : MLMediaGroup!
override func viewDidLoad() {
super.viewDidLoad()
let options : [String : AnyObject] = [MLMediaLoadIncludeSourcesKey: [MLMediaSourceiTunesIdentifier]]
library = MLMediaLibrary(options: options)
library.addObserver(self, forKeyPath: "mediaSources", options: NSKeyValueObservingOptions.New, context: nil)
library.mediaSources
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
guard let path = keyPath else { return }
switch path {
case "mediaSources":
loadSources()
case "rootMediaGroup":
loadRootGroup()
default:
print("Nothing to do for \(path)")
}
}
func loadSources(){
if let mediaSources = library.mediaSources {
for (ident, source) in mediaSources {
print("Ident: \(ident)")
print("Source Ident: \(source.mediaSourceIdentifier)")
iTunes = source
iTunes.addObserver(self, forKeyPath: "rootMediaGroup", options: NSKeyValueObservingOptions.New, context: nil)
iTunes.rootMediaGroup
}
}
}
func loadRootGroup(){
if let rootGroup = iTunes.rootMediaGroup {
print("Root Group Identifier: \(rootGroup.identifier)")
print("Root Group Type Ident: \(rootGroup.typeIdentifier)")
}
}
}
我删除了我的特定代码,因为我正在编写一个上传器,它将我的库的一部分用于我办公室的其他人的流式传输。但这应该让你开始。