Библиотека ITunes Framework в Swift 5.2 - PullRequest
1 голос
/ 17 июня 2020

Я искал повсюду и не могу найти быстрый пример того, как использовать Apple ITunesLibraryFramework. Я пытался понять, как использовать этот фреймворк в Swift 5.2.

Я хочу получать информацию непосредственно из библиотеки Musi c, вместо того, чтобы полагаться на файл экспорта библиотеки 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>

Когда я запускаю приведенный выше код на игровой площадке проекта, все, что я get - это набор двоичных данных для списков воспроизведения и mediaItems. Все, что я хочу сделать, это перебрать данные и собрать информацию из библиотеки для использования в моей программе. Вероятно, это что-то легкое, но я его еще не нашел.

EDIT: - После использования ответа @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. Я пытаюсь использовать трек persistentID (NSNumber) в качестве ключа для словаря, который я объявил. По какой-то причине он не позволяет мне его использовать.

1 Ответ

1 голос
/ 17 июня 2020

Вот как вы можете заставить его распечатать каждый список воспроизведения и трек:

Каждый объект ITLibPlaylist или ITLibMediaItem содержит много информации о каждом элементе списка воспроизведения / мультимедиа. Чтобы получить только имя / заголовок каждого, вам нужно будет перебирать результаты, чтобы получить их.

В этом примере ниже печатается имя каждого имени списка воспроизведения.

    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

Edit : Вот вторичное решение для вторичная проблема:

Перво-наперво, словарь должен быть инициализирован вместо использования typealias.

typealias создает только псевдоним для уже существующего типа, например

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

оба будут a и b будут Double, так как NumberWithAlotOfDecimals - это просто псевдоним для Double.

Вот как инициализировать:

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

Во-вторых, объекты, допускающие значение NULL, должны обрабатываться правильно

            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.

Наконец, это способ сохранить значение ключа в словаре в Свифт.

            let persistentID = song.persistentID
            //tracks.updateValue(song.persistentID, trackInfo) // not this
            tracks[persistentID] = trackInfo // this 
...