summaryrefslogtreecommitdiff
path: root/src/tangara/database
diff options
context:
space:
mode:
authorClayton Craft <clayton@craftyguy.net>2024-12-26 09:53:15 -0800
committercooljqln <cooljqln@noreply.codeberg.org>2024-12-29 23:38:57 +0000
commit92908533c48a9bc9b84e66a65c09f590858a6c45 (patch)
treef1f55da6f5f8e5d02aa6757bd0a2cad81a00bd65 /src/tangara/database
parent46f55e3a1f951683bbbff02e6d5ca8a13fdc7a19 (diff)
downloadtangara-fw-92908533c48a9bc9b84e66a65c09f590858a6c45.tar.gz
Attempt to parse tags only from supported audio files
Trying and failing to parse tags from unsupported files is probably costly (requires reading from SD card), and it probably slows down indexing large collections that include a lot of non-audio files (like cover art, etc). This limits tag parsing to only files that have extensions for supported audio formats. It assumes that folks don't have audio files in supported formats with crazy extensions (e.g. an mp3-formatted file with the extension .lol). Since this hardcodes a list of supported file extensions for tag parsing, it'll need to be maintained later if more formats are supported. The file ext matching is case-insensitive. Fixes #149
Diffstat (limited to 'src/tangara/database')
-rw-r--r--src/tangara/database/tag_parser.cpp17
-rw-r--r--src/tangara/database/tag_parser.hpp13
2 files changed, 30 insertions, 0 deletions
diff --git a/src/tangara/database/tag_parser.cpp b/src/tangara/database/tag_parser.cpp
index ab1d30f3..15323a7c 100644
--- a/src/tangara/database/tag_parser.cpp
+++ b/src/tangara/database/tag_parser.cpp
@@ -312,6 +312,23 @@ auto GenericTagParser::ReadAndParseTags(std::string_view p)
-> std::shared_ptr<TrackTags> {
std::string path{p};
libtags::Aux aux;
+
+ // Fail fast if trying to parse a file that doesn't appear to be a supported audio format
+ // For context, see: https://codeberg.org/cool-tech-zone/tangara-fw/issues/149
+ bool found = false;
+ for (const auto& ext : supported_exts) {
+ // Case-insensitive file extension check
+ if (std::equal(ext.rbegin(), ext.rend(), path.rbegin(),
+ [](char a, char b) { return std::tolower(a) == std::tolower(b); })) {
+ found=true;
+ break;
+ }
+ }
+ if (!found) {
+ ESP_LOGD(kTag, "skipping unsupported file: %s", path.c_str());
+ return {};
+ }
+
auto out = TrackTags::create();
aux.tags = out.get();
diff --git a/src/tangara/database/tag_parser.hpp b/src/tangara/database/tag_parser.hpp
index 642c4876..9130b306 100644
--- a/src/tangara/database/tag_parser.hpp
+++ b/src/tangara/database/tag_parser.hpp
@@ -55,6 +55,19 @@ class GenericTagParser : public ITagParser {
public:
auto ReadAndParseTags(std::string_view path)
-> std::shared_ptr<TrackTags> override;
+
+ private:
+ // Supported file extensions for parsing tags, derived from the list of
+ // supported audio formats here:
+ // https://cooltech.zone/tangara/docs/music-library/
+ static constexpr std::string supported_exts[] = {
+ "flac",
+ "mp3",
+ "ogg",
+ "ogx",
+ "opus",
+ "wav"
+ };
};
} // namespace database