tag/{ApeLoader,Id3Load}: catch InputStream exceptions
This commit is contained in:
parent
1bc553ea62
commit
ab967462e6
@ -25,6 +25,7 @@
|
|||||||
#include "util/Error.hxx"
|
#include "util/Error.hxx"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -41,7 +42,7 @@ struct ApeFooter {
|
|||||||
|
|
||||||
bool
|
bool
|
||||||
tag_ape_scan(InputStream &is, ApeTagCallback callback)
|
tag_ape_scan(InputStream &is, ApeTagCallback callback)
|
||||||
{
|
try {
|
||||||
const ScopeLock protect(is.mutex);
|
const ScopeLock protect(is.mutex);
|
||||||
|
|
||||||
if (!is.KnownSize() || !is.CheapSeeking())
|
if (!is.KnownSize() || !is.CheapSeeking())
|
||||||
@ -103,4 +104,6 @@ tag_ape_scan(InputStream &is, ApeTagCallback callback)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include <id3tag.h>
|
#include <id3tag.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
static constexpr Domain id3_domain("id3");
|
static constexpr Domain id3_domain("id3");
|
||||||
|
|
||||||
@ -43,7 +44,7 @@ tag_is_id3v1(struct id3_tag *tag)
|
|||||||
|
|
||||||
static long
|
static long
|
||||||
get_id3v2_footer_size(InputStream &is, offset_type offset)
|
get_id3v2_footer_size(InputStream &is, offset_type offset)
|
||||||
{
|
try {
|
||||||
id3_byte_t buf[ID3_TAG_QUERYSIZE];
|
id3_byte_t buf[ID3_TAG_QUERYSIZE];
|
||||||
if (!is.Seek(offset, IgnoreError()))
|
if (!is.Seek(offset, IgnoreError()))
|
||||||
return 0;
|
return 0;
|
||||||
@ -52,11 +53,13 @@ get_id3v2_footer_size(InputStream &is, offset_type offset)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return id3_tag_query(buf, sizeof(buf));
|
return id3_tag_query(buf, sizeof(buf));
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniqueId3Tag
|
static UniqueId3Tag
|
||||||
ReadId3Tag(InputStream &is)
|
ReadId3Tag(InputStream &is)
|
||||||
{
|
try {
|
||||||
id3_byte_t query_buffer[ID3_TAG_QUERYSIZE];
|
id3_byte_t query_buffer[ID3_TAG_QUERYSIZE];
|
||||||
if (!is.ReadFull(query_buffer, sizeof(query_buffer), IgnoreError()))
|
if (!is.ReadFull(query_buffer, sizeof(query_buffer), IgnoreError()))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -84,40 +87,48 @@ ReadId3Tag(InputStream &is)
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return UniqueId3Tag(id3_tag_parse(tag_buffer.get(), tag_size));
|
return UniqueId3Tag(id3_tag_parse(tag_buffer.get(), tag_size));
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniqueId3Tag
|
static UniqueId3Tag
|
||||||
ReadId3Tag(InputStream &is, offset_type offset)
|
ReadId3Tag(InputStream &is, offset_type offset)
|
||||||
{
|
try {
|
||||||
if (!is.Seek(offset, IgnoreError()))
|
if (!is.Seek(offset, IgnoreError()))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return ReadId3Tag(is);
|
return ReadId3Tag(is);
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniqueId3Tag
|
static UniqueId3Tag
|
||||||
ReadId3v1Tag(InputStream &is)
|
ReadId3v1Tag(InputStream &is)
|
||||||
{
|
try {
|
||||||
id3_byte_t buffer[ID3V1_SIZE];
|
id3_byte_t buffer[ID3V1_SIZE];
|
||||||
|
|
||||||
if (is.Read(buffer, ID3V1_SIZE, IgnoreError()) != ID3V1_SIZE)
|
if (is.Read(buffer, ID3V1_SIZE, IgnoreError()) != ID3V1_SIZE)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return UniqueId3Tag(id3_tag_parse(buffer, ID3V1_SIZE));
|
return UniqueId3Tag(id3_tag_parse(buffer, ID3V1_SIZE));
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniqueId3Tag
|
static UniqueId3Tag
|
||||||
ReadId3v1Tag(InputStream &is, offset_type offset)
|
ReadId3v1Tag(InputStream &is, offset_type offset)
|
||||||
{
|
try {
|
||||||
if (!is.Seek(offset, IgnoreError()))
|
if (!is.Seek(offset, IgnoreError()))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return ReadId3v1Tag(is);
|
return ReadId3v1Tag(is);
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniqueId3Tag
|
static UniqueId3Tag
|
||||||
tag_id3_find_from_beginning(InputStream &is)
|
tag_id3_find_from_beginning(InputStream &is)
|
||||||
{
|
try {
|
||||||
auto tag = ReadId3Tag(is);
|
auto tag = ReadId3Tag(is);
|
||||||
if (!tag) {
|
if (!tag) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -144,11 +155,13 @@ tag_id3_find_from_beginning(InputStream &is)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return tag;
|
return tag;
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniqueId3Tag
|
static UniqueId3Tag
|
||||||
tag_id3_find_from_end(InputStream &is)
|
tag_id3_find_from_end(InputStream &is)
|
||||||
{
|
try {
|
||||||
if (!is.KnownSize() || !is.CheapSeeking())
|
if (!is.KnownSize() || !is.CheapSeeking())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
@ -183,11 +196,13 @@ tag_id3_find_from_end(InputStream &is)
|
|||||||
|
|
||||||
/* We have an id3v2 tag, so ditch v1tag */
|
/* We have an id3v2 tag, so ditch v1tag */
|
||||||
return tag;
|
return tag;
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniqueId3Tag
|
static UniqueId3Tag
|
||||||
tag_id3_riff_aiff_load(InputStream &is)
|
tag_id3_riff_aiff_load(InputStream &is)
|
||||||
{
|
try {
|
||||||
size_t size = riff_seek_id3(is);
|
size_t size = riff_seek_id3(is);
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
size = aiff_seek_id3(is);
|
size = aiff_seek_id3(is);
|
||||||
@ -205,11 +220,13 @@ tag_id3_riff_aiff_load(InputStream &is)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return UniqueId3Tag(id3_tag_parse(buffer.get(), size));
|
return UniqueId3Tag(id3_tag_parse(buffer.get(), size));
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
UniqueId3Tag
|
UniqueId3Tag
|
||||||
tag_id3_load(InputStream &is)
|
tag_id3_load(InputStream &is)
|
||||||
{
|
try {
|
||||||
const ScopeLock protect(is.mutex);
|
const ScopeLock protect(is.mutex);
|
||||||
|
|
||||||
auto tag = tag_id3_find_from_beginning(is);
|
auto tag = tag_id3_find_from_beginning(is);
|
||||||
@ -220,4 +237,6 @@ tag_id3_load(InputStream &is)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return tag;
|
return tag;
|
||||||
|
} catch (const std::runtime_error &) {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user