ktaglib: implement tag parsing scaffold

This commit is contained in:
Alexander Capehart 2024-12-12 18:39:50 -07:00
parent 44de732247
commit 29f82c0963
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
3 changed files with 87 additions and 18 deletions

View file

@ -0,0 +1,5 @@
//
// Created by oxycblt on 12/12/24.
//
#include "JVMMetadataBuilder.h"

View 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

View file

@ -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();
}