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 { 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 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