Поле `lyrics` пусто для MPMediaItem текущей воспроизводимой песни в swift, ios 12+

У меня похожая проблема, например:

Мне нужно получить текст для текущей воспроизводимой песни.

Я получаю пустой результат, если просто пытаюсь получить текст из медиафайла:

let musicPlayerController = MPMusicPlayerController.systemMusicPlayer

// ...

if let nowPlayingItem = musicPlayerController.nowPlayingItem {
    // We have empty string here
    if let lyrics = nowPlayingItem.lyrics {
        print("Lyrics: \(lyrics)")
    }
}

Я пытался получить тексты песен через URL-адрес актива, как было предложено в ответах выше, но это не работает, URL-адрес актива всегда равен нулю.

let musicPlayerController = MPMusicPlayerController.systemMusicPlayer

// ...

if let nowPlayingItem = musicPlayerController.nowPlayingItem {
    if let songUrl = nowPlayingItem.value(forProperty: MPMediaItemPropertyAssetURL) as? URL {
        print("song url: \(songUrl)")
        let songAsset = AVURLAsset(url: songUrl)

        if let lyricsFromAsset = songAsset.lyrics {
            print("Lyrics from asset: \(lyricsFromAsset)")
        }
    }
}

Я также безуспешно пробовал (также получаю nil и пустую строку соответственно):

print("asset url: \(nowPlayingItem.assetURL)")
print("lyrics from value for property: \(nowPlayingItem.value(forProperty: MPMediaItemPropertyLyrics))")

Я точно знаю, что у песни есть текст, потому что я вижу его в приложении Apple Music на iPhone для этой песни. Я пытался найти текст песни: Queen - Bohemian Rhapsody.

Может ли кто-нибудь помочь с получением текстов для текущей воспроизводимой песни из музыки Apple?


person tohasan    schedule 30.07.2019    source источник
comment
Я столкнулся с той же проблемой, у вас есть решение?   -  person Yogesh Patel    schedule 21.02.2021


Ответы (1)


Мы говорим о локальных файлах здесь? Я не уверен, как это работает с файлами Apple Music, но для локальных файлов этот метод имеет 100% -ный успех при извлечении текстов песен.

extension MPMediaItem {
    func lyrics() -> String? {
        guard let url = assetURL else { return nil }
        let ass = AVAsset(url: url)
        return ass.lyrics
    }
}
person Adam    schedule 10.09.2019
comment
Этот метод не работает с локальными файлами. Есть ли другое решение? - person Yogesh Patel; 21.02.2021