Subsonic API: added a way to filter files per media folder id when using directory commands

This commit is contained in:
emeric
2024-07-13 18:55:46 +02:00
parent 980709dbcf
commit 9ff387061a
8 changed files with 133 additions and 30 deletions
+5 -1
View File
@@ -19,6 +19,7 @@
#include "database/Directory.hpp"
#include "database/MediaLibrary.hpp"
#include "database/Session.hpp"
#include "IdTypeTraits.hpp"
@@ -43,12 +44,15 @@ namespace lms::db
query.groupBy("d.id");
}
if (params.mediaLibrary.isValid())
query.where("d.media_library_id = ?").bind(params.mediaLibrary);
if (params.parentDirectory.isValid())
query.where("d.parent_directory_id = ?").bind(params.parentDirectory);
if (params.release.isValid())
query.where("t.release_id = ?").bind(params.release);
if (params.artist.isValid())
{
query.join("artist a ON a.id = t_a_l.artist_id")
+35 -1
View File
@@ -35,7 +35,7 @@ namespace lms::db
{
namespace
{
static constexpr Version LMS_DATABASE_VERSION{ 61 };
static constexpr Version LMS_DATABASE_VERSION{ 62 };
}
VersionInfo::VersionInfo()
@@ -631,6 +631,39 @@ SELECT
} // namespace
void migrateFromV61(Session& session)
{
// Added a media_library_id in Directory
session.getDboSession()->execute(R"(
CREATE TABLE IF NOT EXISTS "directory_backup" (
"id" integer primary key autoincrement,
"version" integer not null,
"absolute_path" text not null,
"name" text not null,
"parent_directory_id" bigint,
"media_library_id" bigint,
constraint "fk_directory_parent_directory" foreign key ("parent_directory_id") references "directory" ("id") on delete cascade deferrable initially deferred,
constraint "fk_directory_media_library" foreign key ("media_library_id") references "media_library" ("id") on delete set null deferrable initially deferred
))");
// Migrate data, with the new directory_id field set to null
session.getDboSession()->execute(R"(INSERT INTO directory_backup
SELECT
id,
version,
absolute_path,
name,
parent_directory_id,
NULL
FROM directory)");
session.getDboSession()->execute("DROP TABLE directory");
session.getDboSession()->execute("ALTER TABLE directory_backup RENAME TO directory");
// Just increment the scan version of the settings to make the next scheduled scan rescan everything
session.getDboSession()->execute("UPDATE scan_settings SET scan_version = scan_version + 1");
}
bool doDbMigration(Session& session)
{
static const std::string outdatedMsg{ "Outdated database, please rebuild it (delete the .db file and restart)" };
@@ -668,6 +701,7 @@ SELECT
{ 58, migrateFromV58 },
{ 59, migrateFromV59 },
{ 60, migrateFromV60 },
{ 61, migrateFromV61 },
};
bool migrationPerformed{};
+1
View File
@@ -183,6 +183,7 @@ namespace lms::db
_session.execute("CREATE INDEX IF NOT EXISTS directory_id_idx ON directory(id)");
_session.execute("CREATE INDEX IF NOT EXISTS directory_path_idx ON directory(absolute_path)");
_session.execute("CREATE INDEX IF NOT EXISTS directory_media_library_idx ON directory(media_library_id)");
_session.execute("CREATE INDEX IF NOT EXISTS image_artist_idx ON image(artist_id)");
_session.execute("CREATE INDEX IF NOT EXISTS image_directory_idx ON image(directory_id)");
@@ -21,22 +21,24 @@
#include <filesystem>
#include <functional>
#include <vector>
#include <string>
#include <string_view>
#include <vector>
#include <Wt/Dbo/Dbo.h>
#include "core/EnumSet.hpp"
#include "database/ArtistId.hpp"
#include "database/DirectoryId.hpp"
#include "database/ReleaseId.hpp"
#include "database/MediaLibraryId.hpp"
#include "database/Object.hpp"
#include "database/ReleaseId.hpp"
#include "database/Types.hpp"
namespace lms::db
{
class Session;
class MediaLibrary;
class Directory final : public Object<Directory, DirectoryId>
{
@@ -52,6 +54,7 @@ namespace lms::db
core::EnumSet<TrackArtistLinkType> trackArtistLinkTypes; // and for these link types
DirectoryId parentDirectory; // If set, directories that have this parent
bool withNoTrack{}; // If set, directories that do not contain any track
MediaLibraryId mediaLibrary; // If set, directories in this library
FindParameters& setRange(std::optional<Range> _range)
{
@@ -84,6 +87,11 @@ namespace lms::db
withNoTrack = _withNoTrack;
return *this;
}
FindParameters& setMediaLibrary(MediaLibraryId _mediaLibrary)
{
mediaLibrary = _mediaLibrary;
return *this;
}
};
// find
@@ -100,10 +108,12 @@ namespace lms::db
const std::filesystem::path& getAbsolutePath() const { return _absolutePath; }
std::string_view getName() const { return _name; }
ObjectPtr<Directory> getParentDirectory() const { return _parent; }
ObjectPtr<MediaLibrary> getMediaLibrary() const { return _mediaLibrary; }
// setters
void setAbsolutePath(const std::filesystem::path& p);
void setParent(ObjectPtr<Directory> parent);
void setMediaLibrary(ObjectPtr<MediaLibrary> mediaLibrary) { _mediaLibrary = getDboPtr(mediaLibrary); }
template<class Action>
void persist(Action& a)
@@ -112,6 +122,7 @@ namespace lms::db
Wt::Dbo::field(a, _name, "name");
Wt::Dbo::belongsTo(a, _parent, "parent_directory", Wt::Dbo::OnDeleteCascade);
Wt::Dbo::belongsTo(a, _mediaLibrary, "media_library", Wt::Dbo::OnDeleteSetNull); // don't delete directories on media library removal, we want to wait for the next scan to have a chance to migrate files
}
private:
@@ -123,5 +134,6 @@ namespace lms::db
std::string _name;
Wt::Dbo::ptr<Directory> _parent;
Wt::Dbo::ptr<MediaLibrary> _mediaLibrary;
};
} // namespace lms::db