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)
This commit is contained in:
Alexander Capehart 2024-12-13 13:04:49 -07:00
parent 93a602b592
commit 2f98d67855
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
2 changed files with 24 additions and 14 deletions

View file

@ -5,6 +5,7 @@
#include "JVMMetadataBuilder.h" #include "JVMMetadataBuilder.h"
#include <taglib/mp4tag.h> #include <taglib/mp4tag.h>
#include <taglib/textidentificationframe.h>
JVMMetadataBuilder::JVMMetadataBuilder(JNIEnv *env) : env(env), id3v2(env), xiph(env), mp4(env), JVMMetadataBuilder::JVMMetadataBuilder(JNIEnv *env) : env(env), id3v2(env), xiph(env), mp4(env),
cover(), properties(nullptr) {} cover(), properties(nullptr) {}
@ -15,28 +16,37 @@ void JVMMetadataBuilder::setMimeType(const std::string_view mimeType) {
void JVMMetadataBuilder::setId3v2(const TagLib::ID3v2::Tag &tag) { void JVMMetadataBuilder::setId3v2(const TagLib::ID3v2::Tag &tag) {
for (auto frame: tag.frameList()) { for (auto frame: tag.frameList()) {
auto frameId = TagLib::String(frame->frameID()); if (auto txxxFrame = dynamic_cast<TagLib::ID3v2::UserTextIdentificationFrame *>(frame)) {
auto frameText = frame->toStringList(); TagLib::String desc = std::string(txxxFrame->description().toCString(true));
id3v2.add(frameId, frameText); // 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<TagLib::ID3v2::TextIdentificationFrame *>(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) { void JVMMetadataBuilder::setXiph(const TagLib::Ogg::XiphComment &tag) {
for (auto field: tag.fieldListMap()) { 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; auto fieldValue = field.second;
xiph.add(fieldName, fieldValue); xiph.add(taglibFieldName, fieldValue);
} }
} }
void JVMMetadataBuilder::setMp4(const TagLib::MP4::Tag &tag) { void JVMMetadataBuilder::setMp4(const TagLib::MP4::Tag &tag) {
for (auto item: tag.itemMap()) { for (auto item: tag.itemMap()) {
auto atomName = item.first; auto itemName = TagLib::String(item.first);
// Strip out ID Padding
while (atomName.startsWith("\251")) {
atomName = atomName.substr(1);
}
auto itemName = TagLib::String(atomName);
auto itemValue = item.second; auto itemValue = item.second;
auto type = itemValue.type(); auto type = itemValue.type();

View file

@ -30,9 +30,9 @@ data class FileRef(
) )
data class Metadata( data class Metadata(
val id3v2: Map<String, String>, val id3v2: Map<String, List<String>>,
val xiph: Map<String, String>, val xiph: Map<String, List<String>>,
val mp4: Map<String, String>, val mp4: Map<String, List<String>>,
val cover: ByteArray?, val cover: ByteArray?,
val properties: Properties val properties: Properties
) { ) {