使用Swift代码访问OS X上的媒体库

时间:2016-01-02 21:25:56

标签: swift macos media-library

我是一名经验丰富的编码员,但是新手为Apple设备编写代码。我试图使用Swift访问我的OS X设备上的媒体库。我可以找到几十个为iOS设备完成此任务的示例,并成功实现了一些代码来为iOS执行此操作。但是,我很难尝试为OS X做同样的事情。

任何人都可以指点我,或提供任何可以帮助我使用Swift访问OS X设备上的媒体库(itunes)的建议吗?

编辑:为了澄清,如果我正在为iOS编写,我可以调用MPMediaQuery来查询媒体库。我正在寻找可以在为OS X编写的Swift代码中使用的类似的东西。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您似乎专指iTunes资料库。它是通过Apple提供的iTunes应用程序创建,维护和访问的。幸运的是,iTunes可以直接通过AppleScript或在您自己的应用程序中加入AppleScript调用来实现高度脚本化。

要了解可能的内容,请先打开位于/ Applications / Utilities中的脚本编辑器应用,然后选择文件 - >打开词典......

enter image description here

该列表包括支持脚本编写的所有应用程序。选择iTunes以显示详细说明其界面的浏览器。例如,选择 iTunes套件 - >跟踪显示您可以访问的属性:

enter image description here

如何编写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)")
    }
  }
}

我删除了我的特定代码,因为我正在编写一个上传器,它将我的库的一部分用于我办公室的其他人的流式传输。但这应该让你开始。