ktaglib: implement tag parsing scaffold
This commit is contained in:
parent
44de732247
commit
29f82c0963
3 changed files with 87 additions and 18 deletions
5
ktaglib/src/main/cpp/JVMMetadataBuilder.cpp
Normal file
5
ktaglib/src/main/cpp/JVMMetadataBuilder.cpp
Normal file
|
@ -0,0 +1,5 @@
|
|||
//
|
||||
// Created by oxycblt on 12/12/24.
|
||||
//
|
||||
|
||||
#include "JVMMetadataBuilder.h"
|
45
ktaglib/src/main/cpp/JVMMetadataBuilder.h
Normal file
45
ktaglib/src/main/cpp/JVMMetadataBuilder.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
//
|
||||
// Created by oxycblt on 12/12/24.
|
||||
//
|
||||
|
||||
#ifndef AUXIO_JVMMETADATABUILDER_H
|
||||
#define AUXIO_JVMMETADATABUILDER_H
|
||||
|
||||
#include <jni.h>
|
||||
#include <string_view>
|
||||
#include <optional>
|
||||
|
||||
#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<TagLib::VariantMap> 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
|
|
@ -2,8 +2,15 @@
|
|||
#include <string>
|
||||
|
||||
#include "JVMInputStream.h"
|
||||
#include <taglib/fileref.h>
|
||||
#include <taglib/tag.h>
|
||||
#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<TagLib::MPEG::File *>(file)) {
|
||||
builder.setMimeType("audio/mpeg");
|
||||
builder.setId3v2(*mpegFile->ID3v2Tag());
|
||||
} else if (auto *mp4File = dynamic_cast<TagLib::MP4::File *>(file)) {
|
||||
builder.setMimeType("audio/mp4");
|
||||
builder.setMp4(*mp4File->tag());
|
||||
} else if (auto *flacFile = dynamic_cast<TagLib::FLAC::File *>(file)) {
|
||||
builder.setMimeType("audio/flac");
|
||||
builder.setId3v2(*flacFile->ID3v2Tag());
|
||||
builder.setXiph(*flacFile->xiphComment());
|
||||
} else if (auto *opusFile = dynamic_cast<TagLib::Ogg::Opus::File *>(file)) {
|
||||
builder.setMimeType("audio/opus");
|
||||
builder.setXiph(*opusFile->tag());
|
||||
} else if (auto *vorbisFile = dynamic_cast<TagLib::Ogg::Vorbis::File *>(file)) {
|
||||
builder.setMimeType("audio/vorbis");
|
||||
builder.setXiph(*vorbisFile->tag());
|
||||
} else if (auto *wavFile = dynamic_cast<TagLib::RIFF::WAV::File *>(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, "<init>", "()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, "<init>", "(Ljava/util/Map;Ljava/util/Map;[B)V");
|
||||
|
||||
jobject tagObj = env->NewObject(tagClass, tagInit, id3v2, vorbis, coverData);
|
||||
|
||||
return tagObj;
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue