Holophonor
用于管理和查询音乐的方便库。用Swift编写。
功能
- 支持来自
iTunes
库或本地文件和文件夹的音乐文件。 - 解析ID3和
iTunes
格式标签信息,包括-- 艺术家名称
- 专辑名称
- 流派名称
- 艺术作品图片,也称为封面图片
- 持续时间
- 标题
- 曲目编号
- 文件URL
- 通过名称、艺术家、专辑及其它维度查询库。
- 使用
CoreData
进行持久存储。
设计
依赖项
Holophonor使用CoreData
作为持久存储,并使用RxSwift
作为数据总线。
概念
多媒体项
正如其名所表示的,多媒体项
代表一个多媒体项目。
多媒体项可以是一首歌曲或者一个具有代表性的项目,它可以代表专辑、艺术家或流派。
多媒体项
将保留歌曲或所代表的多媒体集合的元数据。
多媒体项
在iOS的MediaPlayer
框架中类似于MPMediaItem
。
媒体集合
媒体集合
是多媒体项
的集合。
媒体集合
包含一个具有此集合元数据的代表性项目。
媒体集合
在iOS的MediaPlayer
框架中类似于MPMediaItemCollection
。
代表性项目
代表性项目是多媒体项
的一个实例,它包含了一个媒体集合的常见元数据。
代表性项目在iOS的MediaPlayer
框架中类似于MPMediaItemCollection.representativeItem
。
元数据
音乐文件中的ID3或iTunes格式的元数据,通常包含例如艺术家名称、专辑名称、流派名称、轨道持续时间等信息。
可以通过多媒体项
实例访问元数据。
以下是元数据的完整字段列表。
- albumTitle: 专辑的标题。
- artist: 专辑的艺术家。
- fileURL: 文件的URL。
- filePath: 文件的绝对路径,仅适用于本地项目。
- genre: 流派名称。
- mediaType: 媒体项的位置 - iTunes或本地文件。
- trackNumber: 轨道编号。
- title: 此媒体项的标题。
- duration: 此媒体项的持续时间。
- _itemArtwork: 此项目的封面图像。通过
getArtworkWithSize
访问。 - persistentID: 此媒体项的持久ID。
- albumPersistentID: 数据库中专辑的持久ID。
- genrePersistentID: 数据库中流派名称的持久ID。
- artistPersistentID: 数据库中艺术家的持久ID。
- mpPersistentID:
MediaPlayer
的持久ID,仅适用于iTunes项。
结构 & 关系
安装
Holophonor 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile
pod "Holophonor"
API
初始化
使用 Holophonor.instance
初始化 Holophonor 并获取实例。
在初始化过程中,Holophonor 将其数据库文件保存在 -
Documents
文件夹中用于调试构建,您可以通过iTunes
导出sqlite
文件。Library
文件夹用于非调试构建。
本地目录
Holophonor 将在初始化期间自动将 Documents
文件夹添加到其扫描路径并搜索本地目录中的音乐。
要在重新扫描库之前添加或删除本地目录,请使用以下功能 之前。
addLocalDirectory(dir: String)
removeLocalDirectory(dir: String)
"dir" 是一个目录的绝对路径字符串。确保您有添加的目录的访问权限。
重新扫描库
您需要执行重新扫描操作以完善Holophonor的数据库。
重新扫描操作将首先删除Holophonor的数据库,然后从iTunes和本地目录中搜索音乐文件。
调用rescan
函数以重新扫描库。
rescan(_ force: Bool = false, completion: @escaping () -> Void)
您可以通过订阅进度主题来观察重新扫描进度。
observeProgress() -> PublishSubject<Int64>
同样,您可以在重新扫描启动时接收通知。
observeRescan() -> PublishSubject<Bool>
查询
使用如holophonor.get**By(**: )
的查询方法来查询媒体项。
示例
获取库中所有艺术家
let foo = self.holo.getAllArtists()
foo.forEach({ (each) in
print((each.representativeItem?.artist)!)
})
获取库中所有专辑
let foo = self.holo.getAllAlbums()
foo.forEach({ (item) in
print(item.representativeItem?.albumTitle)
})
按艺术家获取专辑
let albums = self.holo.getAlbumsBy(artist: "The Killers")
let foo = self.holo.getAllArtists()
let bar = self.holo.getAlbumsBy(artistId: foo.first?.artistPersistentID)
获取专辑中的歌曲
let songs = self.holo.getAlbumsBy(artist: "Iron Maiden")?.first.items ?? []
print(songs)
获取歌曲中的元数据
let songs = self.holo.getAlbumsBy(artist: "Iron Maiden")?.first.items ?? []
songs.forEach({ (each) in
print(each.title)
print(each.artist)
print(each.albumTitle)
print(each.getArtworkWithSize(size: CGSize(width: 200, height: 200)) ?? #imageLiteral(resourceName: "ic_album"))
print(each.fileURL)
print(each.genre)
print(each.duration)
print(each.trackNumber)
})
运行示例项目
- 克隆仓库
- 从示例目录运行
bundle install &&(bundle exec pod install)
- 打开
Holophonor.xcworkspace
- 点击运行按钮
使用此库的应用
关于这个名字
来自 Futurama 维基
Holophonor 是 30 世纪的一种乐器,它就像是双簧管和全息投影仪的结合体。
...
根据《失落寄生体》的评论,Holophorer 是基于艾萨克·阿西莫夫的 1951-1953 年出版的《基地》三部曲中的 Visa-Sonor。1968 年,塞缪尔·R·迪兰尼在其小说 'Nova' 中创造了一个类似的概念,即 Sensory Syrinx。
作者
sponegbobsun, [email protected]
许可
Holophonor 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。