diff --git a/musikr/src/main/cpp/JVMMetadataBuilder.cpp b/musikr/src/main/cpp/JVMMetadataBuilder.cpp index 9488b9ecd..d7254e845 100644 --- a/musikr/src/main/cpp/JVMMetadataBuilder.cpp +++ b/musikr/src/main/cpp/JVMMetadataBuilder.cpp @@ -34,6 +34,15 @@ void JVMMetadataBuilder::setMimeType(const std::string_view type) { this->mimeType = type; } +void JVMMetadataBuilder::setId3v1(TagLib::ID3v1::Tag &tag) { + id3v2.add_id("TIT2", tag.title()); + id3v2.add_id("TPE1", tag.artist()); + id3v2.add_id("TALB", tag.album()); + id3v2.add_id("TRCK", std::to_string(tag.track())); + id3v2.add_id("TYER", std::to_string(tag.year())); + id3v2.add_id("TCON", std::to_string(tag.genreNumber())); +} + void JVMMetadataBuilder::setId3v2(TagLib::ID3v2::Tag &tag) { // We want to ideally find the front cover, fall back to the first picture otherwise. std::optional firstPic; diff --git a/musikr/src/main/cpp/JVMMetadataBuilder.h b/musikr/src/main/cpp/JVMMetadataBuilder.h index b093dd01d..1ee52db3a 100644 --- a/musikr/src/main/cpp/JVMMetadataBuilder.h +++ b/musikr/src/main/cpp/JVMMetadataBuilder.h @@ -23,6 +23,7 @@ #include #include +#include "taglib/id3v1tag.h" #include "taglib/id3v2tag.h" #include "taglib/xiphcomment.h" #include "taglib/mp4tag.h" @@ -35,6 +36,7 @@ public: JVMMetadataBuilder(JNIEnv *env); void setMimeType(const std::string_view type); + void setId3v1(TagLib::ID3v1::Tag &tag); void setId3v2(TagLib::ID3v2::Tag &tag); void setXiph(TagLib::Ogg::XiphComment &tag); void setMp4(TagLib::MP4::Tag &tag); diff --git a/musikr/src/main/cpp/JVMTagMap.cpp b/musikr/src/main/cpp/JVMTagMap.cpp index d8030dea0..19ec9b733 100644 --- a/musikr/src/main/cpp/JVMTagMap.cpp +++ b/musikr/src/main/cpp/JVMTagMap.cpp @@ -52,13 +52,13 @@ JVMTagMap::~JVMTagMap() { env->DeleteLocalRef(arrayListClass); } -void JVMTagMap::add_id(TagLib::String &id, TagLib::String &value) { +void JVMTagMap::add_id(TagLib::String id, TagLib::String value) { env->CallVoidMethod(tagMap, tagMapAddIdSingleMethod, env->NewStringUTF(id.toCString(true)), env->NewStringUTF(value.toCString(true))); } -void JVMTagMap::add_id(TagLib::String &id, TagLib::StringList &value) { +void JVMTagMap::add_id(TagLib::String id, TagLib::StringList value) { jobject arrayList = env->NewObject(arrayListClass, arrayListInitMethod); for (auto &item : value) { env->CallBooleanMethod(arrayList, arrayListAddMethod, @@ -68,14 +68,14 @@ void JVMTagMap::add_id(TagLib::String &id, TagLib::StringList &value) { env->NewStringUTF(id.toCString(true)), arrayList); } -void JVMTagMap::add_custom(TagLib::String &description, TagLib::String &value) { +void JVMTagMap::add_custom(TagLib::String description, TagLib::String value) { env->CallVoidMethod(tagMap, tagMapAddCustomSingleMethod, env->NewStringUTF(description.toCString(true)), env->NewStringUTF(value.toCString(true))); } -void JVMTagMap::add_custom(TagLib::String &description, - TagLib::StringList &value) { +void JVMTagMap::add_custom(TagLib::String description, + TagLib::StringList value) { jobject arrayList = env->NewObject(arrayListClass, arrayListInitMethod); for (auto &item : value) { env->CallBooleanMethod(arrayList, arrayListAddMethod, @@ -85,16 +85,16 @@ void JVMTagMap::add_custom(TagLib::String &description, env->NewStringUTF(description.toCString(true)), arrayList); } -void JVMTagMap::add_combined(TagLib::String &id, TagLib::String &description, - TagLib::String &value) { +void JVMTagMap::add_combined(TagLib::String id, TagLib::String description, + TagLib::String value) { env->CallVoidMethod(tagMap, tagMapAddCombinedSingleMethod, env->NewStringUTF(id.toCString(true)), env->NewStringUTF(description.toCString(true)), env->NewStringUTF(value.toCString(true))); } -void JVMTagMap::add_combined(TagLib::String &id, TagLib::String &description, - TagLib::StringList &value) { +void JVMTagMap::add_combined(TagLib::String id, TagLib::String description, + TagLib::StringList value) { jobject arrayList = env->NewObject(arrayListClass, arrayListInitMethod); for (auto &item : value) { env->CallBooleanMethod(arrayList, arrayListAddMethod, diff --git a/musikr/src/main/cpp/JVMTagMap.h b/musikr/src/main/cpp/JVMTagMap.h index 842f6872d..07db6443d 100644 --- a/musikr/src/main/cpp/JVMTagMap.h +++ b/musikr/src/main/cpp/JVMTagMap.h @@ -32,16 +32,16 @@ public: JVMTagMap(const JVMTagMap&) = delete; JVMTagMap& operator=(const JVMTagMap&) = delete; - void add_id(TagLib::String &id, TagLib::String &value); - void add_id(TagLib::String &id, TagLib::StringList &value); + void add_id(TagLib::String id, TagLib::String value); + void add_id(TagLib::String id, TagLib::StringList value); - void add_custom(TagLib::String &description, TagLib::String &value); - void add_custom(TagLib::String &description, TagLib::StringList &value); + void add_custom(TagLib::String description, TagLib::String value); + void add_custom(TagLib::String description, TagLib::StringList value); - void add_combined(TagLib::String &id, TagLib::String &description, - TagLib::String &value); - void add_combined(TagLib::String &id, TagLib::String &description, - TagLib::StringList &value); + void add_combined(TagLib::String id, TagLib::String description, + TagLib::String value); + void add_combined(TagLib::String id, TagLib::String description, + TagLib::StringList value); jobject getObject(); diff --git a/musikr/src/main/cpp/taglib_jni.cpp b/musikr/src/main/cpp/taglib_jni.cpp index 8590cbb25..a0c393c2c 100644 --- a/musikr/src/main/cpp/taglib_jni.cpp +++ b/musikr/src/main/cpp/taglib_jni.cpp @@ -46,9 +46,13 @@ Java_org_oxycblt_musikr_metadata_TagLibJNI_openNative(JNIEnv *env, if (auto *mpegFile = dynamic_cast(file)) { builder.setMimeType("audio/mpeg"); - auto tag = mpegFile->ID3v2Tag(); - if (tag != nullptr) { - builder.setId3v2(*tag); + auto id3v1Tag = mpegFile->ID3v1Tag(); + if (id3v1Tag != nullptr) { + builder.setId3v1(*id3v1Tag); + } + auto id3v2Tag = mpegFile->ID3v2Tag(); + if (id3v2Tag != nullptr) { + builder.setId3v2(*id3v2Tag); } } else if (auto *mp4File = dynamic_cast(file)) { builder.setMimeType("audio/mp4"); @@ -58,6 +62,10 @@ Java_org_oxycblt_musikr_metadata_TagLibJNI_openNative(JNIEnv *env, } } else if (auto *flacFile = dynamic_cast(file)) { builder.setMimeType("audio/flac"); + auto id3v1Tag = flacFile->ID3v1Tag(); + if (id3v1Tag != nullptr) { + builder.setId3v1(*id3v1Tag); + } auto id3v2Tag = flacFile->ID3v2Tag(); if (id3v2Tag != nullptr) { builder.setId3v2(*id3v2Tag); @@ -89,14 +97,14 @@ Java_org_oxycblt_musikr_metadata_TagLibJNI_openNative(JNIEnv *env, } } else { // While taglib supports other formats, ExoPlayer does not. Ignore them. - LOGE("Unsupported file format"); + LOGD("Unsupported file format"); return nullptr; } builder.setProperties(file->audioProperties()); return builder.build(); } catch (std::runtime_error e) { - LOGE("Error opening file: %s", e.what()); + LOGD("Error opening file: %s", e.what()); return nullptr; }