// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "Record.hpp" #include "Table.hpp" #include #include namespace db::multimedia_files { using Artist = std::string; struct Album { Artist artist{}; std::string title{}; }; struct Tags { std::string title{}; Album album{}; std::string comment{}; std::string genre{}; std::uint32_t year{}; std::uint32_t track{}; }; struct AudioProperties { std::uint32_t songLength{}; /// in seconds std::uint32_t bitrate{}; /// in kb/s std::uint32_t sampleRate{}; /// in Hz std::uint32_t channels{}; /// 1 - mono, 2 - stereo }; struct FileInfo { std::string path{}; std::string mediaType{}; /// mime type e.g. "audio/mp3" std::size_t size{}; /// in bytes }; struct TableRow : public Record { FileInfo fileInfo{}; Tags tags{}; AudioProperties audioProperties{}; auto isValid() const -> bool; }; struct SortedRecord { std::string path{}; std::uint32_t offset{}; }; enum class TableFields { path, media_type, size, title, artist, album, comment, genre, year, track, song_length, bitrate, sample_rate, channels }; enum class SortingBy { TitleAscending, TrackIdAscending }; class MultimediaFilesTable : public Table { public: explicit MultimediaFilesTable(Database *db); virtual ~MultimediaFilesTable() = default; auto create() -> bool override; auto add(TableRow entry) -> bool override; auto removeById(uint32_t id) -> bool override; auto removeByField(TableFields field, const char *str) -> bool override; bool removeAll() override final; auto update(TableRow entry) -> bool override; auto getById(uint32_t id) -> TableRow override; auto getLimitOffset(uint32_t offset, uint32_t limit) -> std::vector override; auto getLimitOffsetByField(uint32_t offset, uint32_t limit, TableFields field, const char *str) -> std::vector override; auto count() -> uint32_t override; auto countByFieldId(const char *field, uint32_t id) -> uint32_t override; auto getArtistsLimitOffset(uint32_t offset, uint32_t limit) -> std::vector; auto countArtists() -> uint32_t; auto getAlbumsLimitOffset(uint32_t offset, uint32_t limit) -> std::vector; auto countAlbums() -> uint32_t; auto getLimitOffset(const Artist &artist, uint32_t offset, uint32_t limit) -> std::vector; auto count(const Artist &artist) -> uint32_t; auto getLimitOffset(const Album &album, uint32_t offset, uint32_t limit) -> std::vector; auto count(const Album &album) -> uint32_t; auto getLimitOffsetByPaths(const std::vector &paths, std::uint32_t offset, std::uint32_t limit, SortingBy sorting = SortingBy::TitleAscending) -> std::vector; auto count(const std::vector &paths) -> uint32_t; TableRow getByPath(std::string path); /// @note entry.ID is skipped bool addOrUpdate(TableRow entry, std::string oldPath = ""); auto getOffsetOfSortedRecordByPath(const std::string &folderPath, const std::string &recordPath, SortingBy sorting = SortingBy::TitleAscending) -> SortedRecord; private: auto getFieldName(TableFields field) -> std::string; }; } // namespace db::multimedia_files