musikr.metadata: wrap exceptions into log

Not ideal, but avoids a total catastrophic crash on failed metadata
extractions.
This commit is contained in:
Alexander Capehart 2024-12-23 16:48:32 -05:00
parent b6bc065a4a
commit c379174ffe
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47

View file

@ -18,9 +18,9 @@
#include <jni.h>
#include <string>
#include "JVMInputStream.h"
#include "JVMMetadataBuilder.h"
#include "log.h"
#include "taglib/fileref.h"
#include "taglib/flacfile.h"
@ -34,41 +34,46 @@ extern "C" JNIEXPORT jobject JNICALL
Java_org_oxycblt_musikr_metadata_TagLibJNI_openNative(JNIEnv *env,
jobject /* this */,
jobject inputStream) {
JVMInputStream stream {env, inputStream};
TagLib::FileRef fileRef {&stream};
if (fileRef.isNull()) {
return nullptr;
}
TagLib::File *file = fileRef.file();
JVMMetadataBuilder builder {env};
try {
JVMInputStream stream {env, inputStream};
TagLib::FileRef fileRef {&stream};
if (fileRef.isNull()) {
return 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.
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;
}
builder.setProperties(file->audioProperties());
builder.setCover(file->tag()->complexProperties("PICTURE"));
return builder.build();
} catch (std::runtime_error e) {
LOGE("Error opening file: %s", e.what());
return nullptr;
}
builder.setProperties(file->audioProperties());
builder.setCover(file->tag()->complexProperties("PICTURE"));
return builder.build();
}