From bc533e53b0b4c6906f6e72eac7e3f228da3e4bbd Mon Sep 17 00:00:00 2001 From: Alexander Todorov Date: Mon, 10 Mar 2025 23:03:05 +0200 Subject: [PATCH] fix(ios): invalid metadata handling (#4422) - When the metadata has the tag "iTunSMPB" or "iTunNORM" then the metadata is not converted correctly and comes [nil, nil, ...] which leads to crash Co-authored-by: Alexander --- ios/Video/NowPlayingInfoCenterManager.swift | 23 +++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/ios/Video/NowPlayingInfoCenterManager.swift b/ios/Video/NowPlayingInfoCenterManager.swift index 153a5daf..0b74cea5 100644 --- a/ios/Video/NowPlayingInfoCenterManager.swift +++ b/ios/Video/NowPlayingInfoCenterManager.swift @@ -208,10 +208,25 @@ class NowPlayingInfoCenterManager { // commonMetadata is metadata from asset, externalMetadata is custom metadata set by user // externalMetadata should override commonMetadata to allow override metadata from source - let metadata = { - let common = Dictionary(uniqueKeysWithValues: currentItem.asset.commonMetadata.map { ($0.identifier, $0) }) - let external = Dictionary(uniqueKeysWithValues: currentItem.externalMetadata.map { ($0.identifier, $0) }) - return Array((common.merging(external) { _, new in new }).values) + // When the metadata has the tag "iTunSMPB" or "iTunNORM" then the metadata is not converted correctly and comes [nil, nil, ...] + // This leads to a crash of the app + let metadata: [AVMetadataItem] = { + func processMetadataItems(_ items: [AVMetadataItem]) -> [String: AVMetadataItem] { + var result = [String: AVMetadataItem]() + + for item in items { + if let id = item.identifier?.rawValue, !id.isEmpty, result[id] == nil { + result[id] = item + } + } + + return result + } + + let common = processMetadataItems(currentItem.asset.commonMetadata) + let external = processMetadataItems(currentItem.externalMetadata) + + return Array(common.merging(external) { _, new in new }.values) }() let titleItem = AVMetadataItem.metadataItems(from: metadata, filteredByIdentifier: .commonIdentifierTitle).first?.stringValue ?? ""