From 2f98d67855bc7558195414aab9b1c7788d38551d Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Fri, 13 Dec 2024 13:04:49 -0700 Subject: [PATCH] ktaglib: fix tag mapping - TagLib apparently bundles description with a TXXX frame's field values. - TagLib doesn't normalize to lowercase like Auxio does (Will change this in the future to be uppercase instead to save on re-allocs) --- ktaglib/src/main/cpp/JVMMetadataBuilder.cpp | 32 ++++++++++++------- .../main/java/org/oxycblt/ktaglib/KTagLib.kt | 6 ++-- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ktaglib/src/main/cpp/JVMMetadataBuilder.cpp b/ktaglib/src/main/cpp/JVMMetadataBuilder.cpp index c2fe48e54..78a9ed626 100644 --- a/ktaglib/src/main/cpp/JVMMetadataBuilder.cpp +++ b/ktaglib/src/main/cpp/JVMMetadataBuilder.cpp @@ -5,6 +5,7 @@ #include "JVMMetadataBuilder.h" #include +#include JVMMetadataBuilder::JVMMetadataBuilder(JNIEnv *env) : env(env), id3v2(env), xiph(env), mp4(env), cover(), properties(nullptr) {} @@ -15,28 +16,37 @@ void JVMMetadataBuilder::setMimeType(const std::string_view mimeType) { void JVMMetadataBuilder::setId3v2(const TagLib::ID3v2::Tag &tag) { for (auto frame: tag.frameList()) { - auto frameId = TagLib::String(frame->frameID()); - auto frameText = frame->toStringList(); - id3v2.add(frameId, frameText); + if (auto txxxFrame = dynamic_cast(frame)) { + TagLib::String desc = std::string(txxxFrame->description().toCString(true)); + // Make desc lowercase + std::transform(desc.begin(), desc.end(), desc.begin(), ::tolower); + TagLib::String key = TagLib::String(frame->frameID()) + ":" + desc; + TagLib::StringList frameText = txxxFrame->fieldList(); + frameText.erase(frameText.begin()); // Remove description that exists for some insane reason + id3v2.add(key, frameText); + } else if (auto textFrame = dynamic_cast(frame)) { + TagLib::String key = frame->frameID(); + TagLib::StringList frameText = textFrame->fieldList(); + id3v2.add(key, frameText); + } else { + continue; + } } } void JVMMetadataBuilder::setXiph(const TagLib::Ogg::XiphComment &tag) { for (auto field: tag.fieldListMap()) { - auto fieldName = TagLib::String(field.first); + auto fieldName = std::string(field.first.toCString(true)); + std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower); + auto taglibFieldName = TagLib::String(fieldName); auto fieldValue = field.second; - xiph.add(fieldName, fieldValue); + xiph.add(taglibFieldName, fieldValue); } } void JVMMetadataBuilder::setMp4(const TagLib::MP4::Tag &tag) { for (auto item: tag.itemMap()) { - auto atomName = item.first; - // Strip out ID Padding - while (atomName.startsWith("\251")) { - atomName = atomName.substr(1); - } - auto itemName = TagLib::String(atomName); + auto itemName = TagLib::String(item.first); auto itemValue = item.second; auto type = itemValue.type(); diff --git a/ktaglib/src/main/java/org/oxycblt/ktaglib/KTagLib.kt b/ktaglib/src/main/java/org/oxycblt/ktaglib/KTagLib.kt index ec54b3ea6..9d7792211 100644 --- a/ktaglib/src/main/java/org/oxycblt/ktaglib/KTagLib.kt +++ b/ktaglib/src/main/java/org/oxycblt/ktaglib/KTagLib.kt @@ -30,9 +30,9 @@ data class FileRef( ) data class Metadata( - val id3v2: Map, - val xiph: Map, - val mp4: Map, + val id3v2: Map>, + val xiph: Map>, + val mp4: Map>, val cover: ByteArray?, val properties: Properties ) {