diff --git a/src/libs/av/impl/AudioFile.cpp b/src/libs/av/impl/AudioFile.cpp index 31ad7267..1067fb7c 100644 --- a/src/libs/av/impl/AudioFile.cpp +++ b/src/libs/av/impl/AudioFile.cpp @@ -34,6 +34,8 @@ extern "C" #include "core/ILogger.hpp" #include "core/String.hpp" +#include "av/Types.hpp" + namespace lms::av { namespace @@ -43,9 +45,9 @@ namespace lms::av std::array buf = { 0 }; if (::av_strerror(error, buf.data(), buf.size()) == 0) - return &buf[0]; - else - return "Unknown error"; + return buf.data(); + + return "Unknown error"; } class AudioFileException : public Exception @@ -158,7 +160,7 @@ namespace lms::av { ContainerInfo info; info.bitrate = _context->bit_rate; - info.duration = std::chrono::milliseconds{ _context->duration == AV_NOPTS_VALUE ? 0 : _context->duration / AV_TIME_BASE * 1000 }; + info.duration = std::chrono::milliseconds{ _context->duration == AV_NOPTS_VALUE ? 0 : _context->duration / AV_TIME_BASE * 1'000 }; info.name = _context->iformat->name; return info; @@ -237,7 +239,7 @@ namespace lms::av return false; } - void AudioFile::visitAttachedPictures(std::function func) const + void AudioFile::visitAttachedPictures(std::function func) const { static const std::unordered_map codecMimeMap{ { AV_CODEC_ID_BMP, "image/x-bmp" }, @@ -262,6 +264,9 @@ namespace lms::av continue; } + MetadataMap metadata; + getMetaDataFromDictionnary(avstream->metadata, metadata); + Picture picture; auto itMime = codecMimeMap.find(avstream->codecpar->codec_id); @@ -280,7 +285,7 @@ namespace lms::av picture.data = reinterpret_cast(pkt.data); picture.dataSize = pkt.size; - func(picture); + func(picture, metadata); } } diff --git a/src/libs/av/impl/AudioFile.hpp b/src/libs/av/impl/AudioFile.hpp index b1b7f1b6..41cc3ab0 100644 --- a/src/libs/av/impl/AudioFile.hpp +++ b/src/libs/av/impl/AudioFile.hpp @@ -25,12 +25,13 @@ struct AVFormatContext; namespace lms::av { - class AudioFile final : public IAudioFile { public: AudioFile(const std::filesystem::path& p); - ~AudioFile(); + ~AudioFile() override; + AudioFile(const AudioFile&) = delete; + AudioFile& operator=(const AudioFile&) = delete; const std::filesystem::path& getPath() const override; ContainerInfo getContainerInfo() const override; @@ -39,16 +40,12 @@ namespace lms::av std::optional getBestStreamInfo() const override; std::optional getBestStreamIndex() const override; bool hasAttachedPictures() const override; - void visitAttachedPictures(std::function func) const override; + void visitAttachedPictures(std::function func) const override; private: - AudioFile(const AudioFile&) = delete; - AudioFile& operator=(const AudioFile&) = delete; - std::optional getStreamInfo(std::size_t streamIndex) const; const std::filesystem::path _p; AVFormatContext* _context{}; }; - } // namespace lms::av diff --git a/src/libs/av/include/av/IAudioFile.hpp b/src/libs/av/include/av/IAudioFile.hpp index d6618da6..244fef58 100644 --- a/src/libs/av/include/av/IAudioFile.hpp +++ b/src/libs/av/include/av/IAudioFile.hpp @@ -28,8 +28,6 @@ #include #include -#include "Types.hpp" - namespace lms::av { // List should be sync with the codecs shipped in the lms's docker version @@ -62,14 +60,14 @@ namespace lms::av struct Picture { std::string mimeType; - const std::byte* data{}; + const std::byte* data{}; // valid as long as IAudioFile exists std::size_t dataSize{}; }; struct ContainerInfo { std::size_t bitrate{}; - std::string name{}; + std::string name; std::chrono::milliseconds duration{}; }; @@ -99,7 +97,7 @@ namespace lms::av virtual std::optional getBestStreamInfo() const = 0; // none if failure/unknown virtual std::optional getBestStreamIndex() const = 0; // none if failure/unknown virtual bool hasAttachedPictures() const = 0; - virtual void visitAttachedPictures(std::function func) const = 0; + virtual void visitAttachedPictures(std::function func) const = 0; }; std::unique_ptr parseAudioFile(const std::filesystem::path& p); diff --git a/src/libs/services/artwork/impl/ArtworkService.cpp b/src/libs/services/artwork/impl/ArtworkService.cpp index 0f3ae1f1..839e4556 100644 --- a/src/libs/services/artwork/impl/ArtworkService.cpp +++ b/src/libs/services/artwork/impl/ArtworkService.cpp @@ -20,11 +20,9 @@ #include "ArtworkService.hpp" #include "av/IAudioFile.hpp" +#include "av/Types.hpp" #include "core/IConfig.hpp" #include "core/ILogger.hpp" -#include "core/Path.hpp" -#include "core/Random.hpp" -#include "core/String.hpp" #include "core/Utils.hpp" #include "database/Artist.hpp" #include "database/Db.hpp" @@ -71,7 +69,7 @@ namespace lms::cover { std::unique_ptr image; - input.visitAttachedPictures([&](const av::Picture& picture) { + input.visitAttachedPictures([&](const av::Picture& picture, const av::IAudioFile::MetadataMap& /* metadata */) { if (image) return;