1

我到处搜索,但找不到如何使用 Apple ITunesLibraryFramework 的快速示例。我一直在试图弄清楚如何在 Swift 5.2 中使用这个框架。

我想直接从音乐库中获取信息,而不必依赖 XML 库导出文件。

我的操场上有以下代码,它打印的内容不清晰。我将如何访问播放列表和 mediaItems 的字段并能够以人类可读的形式阅读它们?

我已经在项目中安装了框架。这是我的项目游乐场代码:

import Foundation
import iTunesLibrary

var library:ITLibrary

do {
    let library = try ITLibrary(apiVersion: "1.1")
    let mediaItems = library.allMediaItems
    let playlists = library.allPlaylists
    print("Media Folder Location - \(String(describing: library.mediaFolderLocation))")
    print("\nPlaylists - \(playlists)")
    print("\nTracks - \(mediaItems)")
} catch let error as NSError {
    print(error)
}

这是我导入标题的 ITLibrary.m 文件:

#import <Foundation/Foundation.h>
#import <iTunesLibrary/iTunesLibrary.h>

当我在项目操场上运行上述代码时,我得到的只是播放列表和 mediaItems 的一堆二进制数据。我要做的就是遍历数据并从库中收集信息以用于我的程序。这可能很容易,但我还没有找到它。

编辑: - 使用@Vincent的回答后,我遇到了以下代码的另一个问题:

import Foundation
import iTunesLibrary

let library = try ITLibrary(apiVersion: "1.1")
typealias tracks = [NSNumber:TrackInfo]
var trackInfo = TrackInfo()

struct TrackInfo {
    var title = ""
    var artist = ""
    var album = ""
    var totalTime = 0
    var year = 0
    var persistentID = ""
    var location:URL!
}

let songs = library.allMediaItems
let playlists = library.allPlaylists

for playlist in playlists {
    if playlist.name.lowercased().contains("test-") {
        print("New Playlist---------------\nName: \(playlist.name)")
        for song in playlist.items {
            trackInfo.title = song.title
            print("\n\nNew Track-----------------\nTitle: \(trackInfo.title)")
            if song.artist?.name != nil {
                trackInfo.artist = song.artist?.name as! String
            }
            print("Artist: \(trackInfo.artist)")
            trackInfo.album = song.album.title!
            print("Albumn Name: \(trackInfo.album)")
            trackInfo.totalTime = song.totalTime
            print("Total Time: \(trackInfo.totalTime)")
            trackInfo.year = song.year
            print("Year: \(trackInfo.year)")
            trackInfo.location = song.location!
            print("Location: \(trackInfo.location!)")
            var persistentID = song.persistentID
            tracks.updateValue(song.persistentID, trackInfo)
        }
    }
}

我遇到的问题是将曲目信息放入 trackInfo 字典。我正在尝试使用 track persistentID (NSNumber) 作为我已声明的字典的键。出于某种原因,它不允许我使用它。

4

1 回答 1

1

以下是如何让它打印每个播放列表和曲目:

每个ITLibPlaylistITLibMediaItem对象包含有关每个播放列表/媒体项目的许多信息。要仅获取每个名称/标题,您必须遍历结果以检索它们。

对于下面的这个例子,每个播放列表的名字都会被打印出来。

    print("\nPlaylists -")
    for playlist in playlists {
        print(playlist.name)
    }

将打印(例如):

Playlists -
Library
Music

对于下面的这个例子,每个轨道的名字都会被打印出来。

    print("\nTracks -")
    for mediaItem in mediaItems {
        print(mediaItem.title)
    }

将打印(例如):

Tracks -
Ev'ry Time We Say Goodbye
My Favorite Things
But Not for Me
Summertime

编辑:这是次要问题的次要解决方案:

首先,应该初始化字典,而不是使用typealias.

typealias只为预先存在的类型创建别名,例如

typealias NumberWithAlotOfDecimals = Double
let a: NumberWithAlotOfDecimals = 10.1
let b: Double = 10.1

willabareDoubleNumberWithAlotOfDecimals只是Double.

以下是初始化方法:

//typealias tracks = [NSNumber:TrackInfo] // not this
var tracks = [NSNumber:TrackInfo]() // but this

其次,应妥善处理可空对象

            if let artistName = song.artist?.name {
                trackInfo.artist = artistName
            }

            if let title = song.album.title {
                trackInfo.album = title
            }
            if let location = song.location {
                trackInfo.location = location
                print("Location: \(location)")
            }

代替

            if song.artist?.name != nil {
                trackInfo.artist = song.artist?.name as! String
            }

请不要使用!强制解包可为空的对象,因为当对象为nil.

最后,这是在 Swift 中将键值存储到字典中的方法。

            let persistentID = song.persistentID
            //tracks.updateValue(song.persistentID, trackInfo) // not this
            tracks[persistentID] = trackInfo // this 
于 2020-06-17T05:25:41.383 回答