diff --git a/ktaglib/src/main/cpp/JVMMetadataBuilder.cpp b/ktaglib/src/main/cpp/JVMMetadataBuilder.cpp new file mode 100644 index 000000000..189662428 --- /dev/null +++ b/ktaglib/src/main/cpp/JVMMetadataBuilder.cpp @@ -0,0 +1,5 @@ +// +// Created by oxycblt on 12/12/24. +// + +#include "JVMMetadataBuilder.h" diff --git a/ktaglib/src/main/cpp/JVMMetadataBuilder.h b/ktaglib/src/main/cpp/JVMMetadataBuilder.h new file mode 100644 index 000000000..1e02f3540 --- /dev/null +++ b/ktaglib/src/main/cpp/JVMMetadataBuilder.h @@ -0,0 +1,45 @@ +// +// Created by oxycblt on 12/12/24. +// + +#ifndef AUXIO_JVMMETADATABUILDER_H +#define AUXIO_JVMMETADATABUILDER_H + +#include +#include +#include + +#include "taglib/id3v2tag.h" +#include "taglib/xiphcomment.h" +#include "taglib/mp4tag.h" +#include "taglib/audioproperties.h" + +#include "JVMTagMap.h" + +class JVMMetadataBuilder { +public: + JVMMetadataBuilder(JNIEnv *env); + + void setMimeType(const std::string_view mimeType); + void setId3v2(const TagLib::ID3v2::Tag &tag); + void setXiph(const TagLib::Ogg::XiphComment &tag); + void setMp4(const TagLib::MP4::Tag &tag); + void setCover(const TagLib::List covers); + void setProperties(const TagLib::AudioProperties &properties); + + jobject build(); + +private: + JNIEnv *env; + + std::string_view mimeType; + + TagLib::ByteVector cover; + TagLib::AudioProperties &properties; + + JVMTagMap id3v2; + JVMTagMap xiph; + JVMTagMap mp4; +}; + +#endif //AUXIO_JVMMETADATABUILDER_H diff --git a/ktaglib/src/main/cpp/ktaglib.cpp b/ktaglib/src/main/cpp/ktaglib.cpp index cd2df7f60..ccb6c2ce3 100644 --- a/ktaglib/src/main/cpp/ktaglib.cpp +++ b/ktaglib/src/main/cpp/ktaglib.cpp @@ -2,8 +2,15 @@ #include #include "JVMInputStream.h" -#include -#include +#include "JVMMetadataBuilder.h" + +#include "taglib/fileref.h" +#include "taglib/mpegfile.h" +#include "taglib/mp4file.h" +#include "taglib/flacfile.h" +#include "taglib/opusfile.h" +#include "taglib/vorbisfile.h" +#include "taglib/wavfile.h" extern "C" JNIEXPORT jobject JNICALL Java_org_oxycblt_ktaglib_KTagLib_openNative( @@ -11,24 +18,36 @@ Java_org_oxycblt_ktaglib_KTagLib_openNative( jobject /* this */, jobject inputStream) { JVMInputStream stream { env, inputStream }; - TagLib::FileRef file { &stream }; - if (file.isNull()) { + TagLib::FileRef fileRef { &stream }; + if (fileRef.isNull()) { return nullptr; } - TagLib::Tag* tag = file.tag(); - if (tag == nullptr) { + TagLib::File *file = fileRef.file(); + JVMMetadataBuilder builder { env }; + + if (auto *mpegFile = dynamic_cast(file)) { + builder.setMimeType("audio/mpeg"); + builder.setId3v2(*mpegFile->ID3v2Tag()); + } else if (auto *mp4File = dynamic_cast(file)) { + builder.setMimeType("audio/mp4"); + builder.setMp4(*mp4File->tag()); + } else if (auto *flacFile = dynamic_cast(file)) { + builder.setMimeType("audio/flac"); + builder.setId3v2(*flacFile->ID3v2Tag()); + builder.setXiph(*flacFile->xiphComment()); + } else if (auto *opusFile = dynamic_cast(file)) { + builder.setMimeType("audio/opus"); + builder.setXiph(*opusFile->tag()); + } else if (auto *vorbisFile = dynamic_cast(file)) { + builder.setMimeType("audio/vorbis"); + builder.setXiph(*vorbisFile->tag()); + } else if (auto *wavFile = dynamic_cast(file)) { + builder.setMimeType("audio/wav"); + builder.setId3v2(*wavFile->ID3v2Tag()); + } else { + // While taglib supports other formats, ExoPlayer does not. Ignore them. return nullptr; } - jclass mapClass = env->FindClass("java/util/HashMap"); - jmethodID init = env->GetMethodID(mapClass, "", "()V"); - jobject id3v2 = env->NewObject(mapClass, init); - jobject vorbis = env->NewObject(mapClass, init); - jbyteArray coverData = env->NewByteArray(0); - jclass tagClass = env->FindClass("org/oxycblt/ktaglib/Tag"); - jmethodID tagInit = env->GetMethodID(tagClass, "", "(Ljava/util/Map;Ljava/util/Map;[B)V"); - - jobject tagObj = env->NewObject(tagClass, tagInit, id3v2, vorbis, coverData); - - return tagObj; -} \ No newline at end of file + return builder.build(); +}