如何使用 Swift 从播客中获取所有关联数据或元数据?
How to get all associated data or metadata from podcast using Swift?
我目前正在使用 Swift 3 创建播客播放器,但在访问与播客文件关联的所有 'hidden' 数据(元数据)时遇到问题。
具体来说,在 Apple 的 Podcast 应用程序中,他们会显示 'comments' 或详细说明。使用 MPMediaPlayer 时此信息不可用
到目前为止,这就是我编写整个应用程序的方式。
我发现这个 post 似乎在正确的轨道上,但对我使用 Swift 来说不够具体:
Getting podcast metadata from from iPodLibrary
我如何访问此附加信息?
或者有没有办法在我的 Swit 3 应用程序中实现链接代码 (Obj-C)?
编辑:
好的,我离解决方案越来越近了。但是,我现在无法弄清楚如何获取以下结构中的特定键。
首先这是我当前的代码,我在其中向此函数发送播客(项目):
///////// key=TDS
func getMeta(_ item: MPMediaItem){
print("")
print("--------- GETMETA ---------")
let url = item.value(forProperty:MPMediaItemPropertyAssetURL) as? NSURL
let asset = AVURLAsset(url: url as! URL, options: nil)
let formatsKey = "availableMetadataFormats"
asset.loadValuesAsynchronously(forKeys: [formatsKey]) {
var error: NSError? = nil
let status = asset.statusOfValue(forKey: formatsKey, error: &error)
if status == .loaded {
for format in asset.availableMetadataFormats {
let metadata = asset.metadata(forFormat: format)
print("format:\(format)")
print("metadata description:\(metadata.description)")
}
}
}
}
/////////
为给定的播客生成此输出:
format:org.id3
metadata description:[<AVMetadataItem: 0x174005f40, identifier=id3/TIT2, keySpace=org.id3, key class = NSTaggedPointerString, key=TIT2, commonKey=title, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=FriComedy: The News Quiz 3rd Feb 2017>, <AVMetadataItem: 0x174006160, identifier=id3/TPE1, keySpace=org.id3, key class = NSTaggedPointerString, key=TPE1, commonKey=artist, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=BBC Radio 4>, <AVMetadataItem: 0x174006310, identifier=id3/TALB, keySpace=org.id3, key class = NSTaggedPointerString, key=TALB, commonKey=albumName, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=Friday Night Comedy from BBC Radio 4>, <AVMetadataItem: 0x174006130, identifier=id3/TCON, keySpace=org.id3, key class = NSTaggedPointerString, key=TCON, commonKey=type, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=Podcast>, <AVMetadataItem: 0x174006320, identifier=id3/USLT, keySpace=org.id3, key class = NSTaggedPointerString, key=USLT, commonKey=(null), extendedLanguageTag= , dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
info = "";
}, value=Susan Calman, Andy Hamilton, Katy Brand and Lloyd Langford are amongst Miles' esteemed guests for this week's round of news-wrangling.
Theresa May won a vote, Donald Trump won a vote and François Fillon might have to drop out of a vote. Orangutans can't vote but still feature in the programme.
Producer: Richard Morris
A BBC Studios Production>, <AVMetadataItem: 0x174006330, identifier=id3/COMM, keySpace=org.id3, key class = NSTaggedPointerString, key=COMM, commonKey=(null), extendedLanguageTag=en, dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
info = "";
}, value=Susan Calman, Andy Hamilton, Katy Brand and Lloyd Langford are amongst Miles' esteemed guests for this week's round of news-wrangling.
Theresa May won a vote, Donald Trump won a vote and François Fillon might have to drop out of a vote. Orangutans can't vote but still feature in the programme.
Producer: Richard Morris
A BBC Studios Production>, <AVMetadataItem: 0x174006340, identifier=id3/TCOP, keySpace=org.id3, key class = NSTaggedPointerString, key=TCOP, commonKey=copyrights, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=(c) BBC 2017>, <AVMetadataItem: 0x174006350, identifier=id3/APIC, keySpace=org.id3, key class = NSTaggedPointerString, key=APIC, commonKey=artwork, extendedLanguageTag=(null), dataType=com.apple.metadata.datatype.JPEG, time={INVALID}, duration={INVALID}, startDate=(null), extras={
dataType = "image/jpeg";
dataTypeNamespace = "org.iana.media-type";
info = "";
pictureType = "Cover (front)";
}, value length=50551>, <AVMetadataItem: 0x174006360, identifier=id3/TIT3, keySpace=org.id3, key class = NSTaggedPointerString, key=TIT3, commonKey=description, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=A satirical review of the week's news, chaired by Miles Jupp>, <AVMetadataItem: 0x174006370, identifier=id3/TYER, keySpace=org.id3, key class = NSTaggedPointerString, key=TYER, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=2017>, <AVMetadataItem: 0x174006380, identifier=id3/TDRL, keySpace=org.id3, key class = NSTaggedPointerString, key=TDRL, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=2017-02-03T18:57:00Z>, <AVMetadataItem: 0x174006390, identifier=id3/COMM, keySpace=org.id3, key class = NSTaggedPointerString, key=COMM, commonKey=(null), extendedLanguageTag=en, dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
info = iTunPGAP;
}, value=0>, <AVMetadataItem: 0x1740063a0, identifier=id3/PCST, keySpace=org.id3, key class = NSTaggedPointerString, key=PCST, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value length=4>, <AVMetadataItem: 0x1740063b0, identifier=id3/TDES, keySpace=org.id3, key class = NSTaggedPointerString, key=TDES, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=Susan Calman, Andy Hamilton, Katy Brand and Lloyd Langford are amongst Miles' esteemed guests for this week's round of news-wrangling.
Theresa May won a vote, Donald Trump won a vote and François Fillon might have to drop out of a vote. Orangutans can't vote but still feature in the programme.
Producer: Richard Morris
A BBC Studios Production>, <AVMetadataItem: 0x1740063c0, identifier=id3/TGID, keySpace=org.id3, key class = NSTaggedPointerString, key=TGID, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=urn:bbc:podcast:p04rt97d>, <AVMetadataItem: 0x1740063d0, identifier=id3/WFED, keySpace=org.id3, key class = NSTaggedPointerString, key=WFED, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=%00http://www.bbc.co.uk/programmes/p02pc9pj/episodes/downloads.rss%00>]
我正在尝试为 key=TDES
and/or identifier=id3/TDES
隔离 text/value
好的,经过大量的挖掘和提问,我相信这是我可以设法循环遍历来自 MPMediaItem 的 any/all 元数据的最短代码 - 包括播客。
代码是 Swift 3
// Use this function to get and search through all the metadata from an MPMediaItem
func getMeta(_ item: MPMediaItem)->String{
let url = item.value(forProperty:MPMediaItemPropertyAssetURL) as? NSURL
let asset = AVURLAsset(url: url! as URL, options: nil)
var sMetaValue: String = ""
// If you want to parse metadata based on a specific format or key space,
// uncomment the line below and comment the line 2 below
// let metaArray = asset.metadata(forFormat: "org.id3")
let metaArray = asset.metadata
for metadata in metaArray{
// Uncomment this print to see all the metadata
//print("----- metadata:\(metadata)")
let sKey = returnKeyString(metadata.identifier!)
// See if the returned key matches your intent
if (sKey == "tdes"){
if let sVal = metadata.stringValue{
sMetaValue = sVal
}
}
}
}
// Helper function to parse the identifier - easier than working with keys
func returnKeyString(_ inVal: String)->String{
// expecting the metadata for "identifier" as input - returns key value
// eg "itsk/ldes" -> "ldes"
// or "id3/%00WFD" etc. -> "wfd"
var sFinal:String = ""
if (inVal.contains("/")){
sFinal = (inVal.components(separatedBy: "/")[1])
}
if sFinal.contains("%"){
sFinal = sFinal.components(separatedBy: "%")[1]
let index1 = sFinal.index(sFinal.startIndex, offsetBy: 2)
sFinal = sFinal.substring(from: index1)
}
return sFinal.lowercased()
}
我目前正在使用 Swift 3 创建播客播放器,但在访问与播客文件关联的所有 'hidden' 数据(元数据)时遇到问题。
具体来说,在 Apple 的 Podcast 应用程序中,他们会显示 'comments' 或详细说明。使用 MPMediaPlayer 时此信息不可用 到目前为止,这就是我编写整个应用程序的方式。
我发现这个 post 似乎在正确的轨道上,但对我使用 Swift 来说不够具体: Getting podcast metadata from from iPodLibrary
我如何访问此附加信息?
或者有没有办法在我的 Swit 3 应用程序中实现链接代码 (Obj-C)?
编辑:
好的,我离解决方案越来越近了。但是,我现在无法弄清楚如何获取以下结构中的特定键。
首先这是我当前的代码,我在其中向此函数发送播客(项目):
///////// key=TDS
func getMeta(_ item: MPMediaItem){
print("")
print("--------- GETMETA ---------")
let url = item.value(forProperty:MPMediaItemPropertyAssetURL) as? NSURL
let asset = AVURLAsset(url: url as! URL, options: nil)
let formatsKey = "availableMetadataFormats"
asset.loadValuesAsynchronously(forKeys: [formatsKey]) {
var error: NSError? = nil
let status = asset.statusOfValue(forKey: formatsKey, error: &error)
if status == .loaded {
for format in asset.availableMetadataFormats {
let metadata = asset.metadata(forFormat: format)
print("format:\(format)")
print("metadata description:\(metadata.description)")
}
}
}
}
/////////
为给定的播客生成此输出:
format:org.id3
metadata description:[<AVMetadataItem: 0x174005f40, identifier=id3/TIT2, keySpace=org.id3, key class = NSTaggedPointerString, key=TIT2, commonKey=title, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=FriComedy: The News Quiz 3rd Feb 2017>, <AVMetadataItem: 0x174006160, identifier=id3/TPE1, keySpace=org.id3, key class = NSTaggedPointerString, key=TPE1, commonKey=artist, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=BBC Radio 4>, <AVMetadataItem: 0x174006310, identifier=id3/TALB, keySpace=org.id3, key class = NSTaggedPointerString, key=TALB, commonKey=albumName, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=Friday Night Comedy from BBC Radio 4>, <AVMetadataItem: 0x174006130, identifier=id3/TCON, keySpace=org.id3, key class = NSTaggedPointerString, key=TCON, commonKey=type, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=Podcast>, <AVMetadataItem: 0x174006320, identifier=id3/USLT, keySpace=org.id3, key class = NSTaggedPointerString, key=USLT, commonKey=(null), extendedLanguageTag= , dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
info = "";
}, value=Susan Calman, Andy Hamilton, Katy Brand and Lloyd Langford are amongst Miles' esteemed guests for this week's round of news-wrangling.
Theresa May won a vote, Donald Trump won a vote and François Fillon might have to drop out of a vote. Orangutans can't vote but still feature in the programme.
Producer: Richard Morris
A BBC Studios Production>, <AVMetadataItem: 0x174006330, identifier=id3/COMM, keySpace=org.id3, key class = NSTaggedPointerString, key=COMM, commonKey=(null), extendedLanguageTag=en, dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
info = "";
}, value=Susan Calman, Andy Hamilton, Katy Brand and Lloyd Langford are amongst Miles' esteemed guests for this week's round of news-wrangling.
Theresa May won a vote, Donald Trump won a vote and François Fillon might have to drop out of a vote. Orangutans can't vote but still feature in the programme.
Producer: Richard Morris
A BBC Studios Production>, <AVMetadataItem: 0x174006340, identifier=id3/TCOP, keySpace=org.id3, key class = NSTaggedPointerString, key=TCOP, commonKey=copyrights, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=(c) BBC 2017>, <AVMetadataItem: 0x174006350, identifier=id3/APIC, keySpace=org.id3, key class = NSTaggedPointerString, key=APIC, commonKey=artwork, extendedLanguageTag=(null), dataType=com.apple.metadata.datatype.JPEG, time={INVALID}, duration={INVALID}, startDate=(null), extras={
dataType = "image/jpeg";
dataTypeNamespace = "org.iana.media-type";
info = "";
pictureType = "Cover (front)";
}, value length=50551>, <AVMetadataItem: 0x174006360, identifier=id3/TIT3, keySpace=org.id3, key class = NSTaggedPointerString, key=TIT3, commonKey=description, extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=A satirical review of the week's news, chaired by Miles Jupp>, <AVMetadataItem: 0x174006370, identifier=id3/TYER, keySpace=org.id3, key class = NSTaggedPointerString, key=TYER, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=2017>, <AVMetadataItem: 0x174006380, identifier=id3/TDRL, keySpace=org.id3, key class = NSTaggedPointerString, key=TDRL, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=2017-02-03T18:57:00Z>, <AVMetadataItem: 0x174006390, identifier=id3/COMM, keySpace=org.id3, key class = NSTaggedPointerString, key=COMM, commonKey=(null), extendedLanguageTag=en, dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
info = iTunPGAP;
}, value=0>, <AVMetadataItem: 0x1740063a0, identifier=id3/PCST, keySpace=org.id3, key class = NSTaggedPointerString, key=PCST, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value length=4>, <AVMetadataItem: 0x1740063b0, identifier=id3/TDES, keySpace=org.id3, key class = NSTaggedPointerString, key=TDES, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=Susan Calman, Andy Hamilton, Katy Brand and Lloyd Langford are amongst Miles' esteemed guests for this week's round of news-wrangling.
Theresa May won a vote, Donald Trump won a vote and François Fillon might have to drop out of a vote. Orangutans can't vote but still feature in the programme.
Producer: Richard Morris
A BBC Studios Production>, <AVMetadataItem: 0x1740063c0, identifier=id3/TGID, keySpace=org.id3, key class = NSTaggedPointerString, key=TGID, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=urn:bbc:podcast:p04rt97d>, <AVMetadataItem: 0x1740063d0, identifier=id3/WFED, keySpace=org.id3, key class = NSTaggedPointerString, key=WFED, commonKey=(null), extendedLanguageTag=(null), dataType=(null), time={INVALID}, duration={INVALID}, startDate=(null), extras={
}, value=%00http://www.bbc.co.uk/programmes/p02pc9pj/episodes/downloads.rss%00>]
我正在尝试为 key=TDES
and/or identifier=id3/TDES
好的,经过大量的挖掘和提问,我相信这是我可以设法循环遍历来自 MPMediaItem 的 any/all 元数据的最短代码 - 包括播客。 代码是 Swift 3
// Use this function to get and search through all the metadata from an MPMediaItem
func getMeta(_ item: MPMediaItem)->String{
let url = item.value(forProperty:MPMediaItemPropertyAssetURL) as? NSURL
let asset = AVURLAsset(url: url! as URL, options: nil)
var sMetaValue: String = ""
// If you want to parse metadata based on a specific format or key space,
// uncomment the line below and comment the line 2 below
// let metaArray = asset.metadata(forFormat: "org.id3")
let metaArray = asset.metadata
for metadata in metaArray{
// Uncomment this print to see all the metadata
//print("----- metadata:\(metadata)")
let sKey = returnKeyString(metadata.identifier!)
// See if the returned key matches your intent
if (sKey == "tdes"){
if let sVal = metadata.stringValue{
sMetaValue = sVal
}
}
}
}
// Helper function to parse the identifier - easier than working with keys
func returnKeyString(_ inVal: String)->String{
// expecting the metadata for "identifier" as input - returns key value
// eg "itsk/ldes" -> "ldes"
// or "id3/%00WFD" etc. -> "wfd"
var sFinal:String = ""
if (inVal.contains("/")){
sFinal = (inVal.components(separatedBy: "/")[1])
}
if sFinal.contains("%"){
sFinal = sFinal.components(separatedBy: "%")[1]
let index1 = sFinal.index(sFinal.startIndex, offsetBy: 2)
sFinal = sFinal.substring(from: index1)
}
return sFinal.lowercased()
}