Added a way to filter by record label, display labels in the release info panel

This commit is contained in:
emeric
2025-02-08 18:56:54 +01:00
parent bebe384376
commit 13698c379b
30 changed files with 234 additions and 8 deletions
+10 -2
View File
@@ -50,7 +50,8 @@ namespace lms::db
|| params.track.isValid()
|| params.release.isValid()
|| params.clusters.size() == 1
|| params.mediaLibrary.isValid())
|| params.mediaLibrary.isValid()
|| params.label.isValid())
{
query.join("track_artist_link t_a_l ON t_a_l.artist_id = a.id");
}
@@ -59,7 +60,8 @@ namespace lms::db
|| params.sortMethod == ArtistSortMethod::AddedDesc
|| params.writtenAfter.isValid()
|| params.release.isValid()
|| params.mediaLibrary.isValid())
|| params.mediaLibrary.isValid()
|| params.label.isValid())
{
query.join("track t ON t.id = t_a_l.track_id");
@@ -71,6 +73,12 @@ namespace lms::db
if (params.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.mediaLibrary);
if (params.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = t.release_id");
query.where("r_l.label_id = ?").bind(params.label);
}
}
if (params.linkType)
+21 -1
View File
@@ -42,10 +42,18 @@ namespace lms::db
assert(!params.artist.isValid()); // poor check
if (params.library.isValid())
if (params.library.isValid() || params.label.isValid())
{
query.join("track t ON t.id = t_a_l.track_id");
}
if (params.library.isValid())
query.where("t.media_library_id = ?").bind(params.library);
if (params.label.isValid())
{
query.join("release_label r_l ON t.release_id = r_l.release_id");
query.where("r_l.label_id = ?").bind(params.label);
}
if (params.linkType)
@@ -113,6 +121,12 @@ namespace lms::db
if (params.library.isValid())
query.where("t.media_library_id = ?").bind(params.library);
if (params.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = r.id");
query.where("r_l.label_id = ?").bind(params.label);
}
if (!params.clusters.empty())
{
std::ostringstream oss;
@@ -160,6 +174,12 @@ namespace lms::db
if (params.library.isValid())
query.where("t.media_library_id = ?").bind(params.library);
if (params.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = t.release_id");
query.where("r_l.label_id = ?").bind(params.label);
}
if (!params.clusters.empty())
{
std::ostringstream oss;
+3
View File
@@ -1074,6 +1074,9 @@ FROM tracklist)");
void migrateFromV81(Session& session)
{
// Make sure we remove all the previoulsy created index, the createIndexesIfNeeded will recreate them all
dropIndexes(session);
// Add country + release country
utils::executeCommand(*session.getDboSession(), R"(CREATE TABLE IF NOT EXISTS "country" (
"id" integer primary key autoincrement,
+25
View File
@@ -28,6 +28,7 @@
#include "database/Image.hpp"
#include "database/Session.hpp"
#include "database/Track.hpp"
#include "database/Types.hpp"
#include "database/User.hpp"
#include "EnumSetTraits.hpp"
@@ -76,6 +77,12 @@ namespace lms::db
if (params.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.mediaLibrary);
if (params.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = r.id");
query.where("r_l.label_id = ?").bind(params.label);
}
if (params.directory.isValid())
query.where("t.directory_id = ?").bind(params.directory);
@@ -332,6 +339,24 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query<Wt::Dbo::ptr<Label>>("SELECT l from label l").where("l.name = ?").bind(name));
}
void Label::find(Session& session, LabelSortMethod sortMethod, std::function<void(const Label::pointer& label)> func)
{
session.checkReadTransaction();
auto query{ session.getDboSession()->find<Label>() };
switch (sortMethod)
{
case LabelSortMethod::None:
break;
case LabelSortMethod::Name:
query.orderBy("name COLLATE NOCASE");
}
utils::forEachQueryResult(query, [&](const Label::pointer& label) {
func(label);
});
}
RangeResults<LabelId> Label::findOrphanIds(Session& session, std::optional<Range> range)
{
session.checkReadTransaction();
+2 -2
View File
@@ -201,7 +201,7 @@ namespace lms::db
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS cluster_type_name_idx ON cluster_type(name)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS country_id_idx ON country(id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS country_name_idx ON country(name)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS country_name_idx ON country(name COLLATE NOCASE)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_id_idx ON directory(id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_parent_directory_idx ON directory(parent_directory_id)");
@@ -215,7 +215,7 @@ namespace lms::db
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_stem_idx ON image(stem COLLATE NOCASE)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS label_id_idx ON label(id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS label_name_idx ON label(name)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS label_name_idx ON label(name COLLATE NOCASE)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS listen_backend_idx ON listen(backend)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS listen_id_idx ON listen(id)");
+6
View File
@@ -162,6 +162,12 @@ namespace lms::db
if (params.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.mediaLibrary);
if (params.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = t.release_id");
query.where("r_l.label_id = ?").bind(params.label);
}
if (params.directory.isValid())
query.where("t.directory_id = ?").bind(params.directory);
@@ -32,6 +32,7 @@
#include "core/UUID.hpp"
#include "database/ArtistId.hpp"
#include "database/ClusterId.hpp"
#include "database/LabelId.hpp"
#include "database/MediaLibraryId.hpp"
#include "database/Object.hpp"
#include "database/ReleaseId.hpp"
@@ -68,6 +69,7 @@ namespace lms::db
TrackId track; // artists involved in this track
ReleaseId release; // artists involved in this release
MediaLibraryId mediaLibrary; // artists that belong to this library
LabelId label; // artists that have issued releases using this label
FindParameters& setClusters(std::span<const ClusterId> _clusters)
{
@@ -120,6 +122,11 @@ namespace lms::db
mediaLibrary = _mediaLibrary;
return *this;
}
FindParameters& setLabel(LabelId _label)
{
label = _label;
return *this;
}
};
Artist() = default;
@@ -26,6 +26,7 @@
#include "database/ArtistId.hpp"
#include "database/ClusterId.hpp"
#include "database/LabelId.hpp"
#include "database/ListenId.hpp"
#include "database/MediaLibraryId.hpp"
#include "database/Object.hpp"
@@ -90,6 +91,7 @@ namespace lms::db
std::optional<Range> range;
ArtistId artist; // if set, matching this artist
MediaLibraryId library;
LabelId label;
StatsFindParameters& setUser(UserId _user)
{
@@ -126,6 +128,11 @@ namespace lms::db
library = _library;
return *this;
}
StatsFindParameters& setLabel(LabelId _label)
{
label = _label;
return *this;
}
};
struct ArtistStatsFindParameters : public StatsFindParameters
@@ -93,6 +93,7 @@ namespace lms::db
static std::size_t getCount(Session& session);
static pointer find(Session& session, LabelId id);
static pointer find(Session& session, std::string_view name);
static void find(Session& session, LabelSortMethod sortMethod, std::function<void(const Label::pointer& label)> func);
static RangeResults<LabelId> findOrphanIds(Session& session, std::optional<Range> range = std::nullopt);
// Accessors
@@ -166,6 +167,7 @@ namespace lms::db
core::EnumSet<TrackArtistLinkType> excludedTrackArtistLinkTypes; // but not for these link types
std::string releaseType; // If set, albums that has this release type
MediaLibraryId mediaLibrary; // If set, releases that has at least a track in this library
LabelId label; // If set, releases that has this label
DirectoryId directory; // if set, releases in this directory (cannot be set with parent directory)
DirectoryId parentDirectory; // if set, releases in this parent directory (cannot be set with directory)
@@ -227,6 +229,11 @@ namespace lms::db
mediaLibrary = _mediaLibrary;
return *this;
}
FindParameters& setLabel(LabelId _label)
{
label = _label;
return *this;
}
FindParameters& setDirectory(DirectoryId _directory)
{
directory = _directory;
@@ -38,6 +38,7 @@
#include "database/ArtistId.hpp"
#include "database/ClusterId.hpp"
#include "database/DirectoryId.hpp"
#include "database/LabelId.hpp"
#include "database/MediaLibraryId.hpp"
#include "database/Object.hpp"
#include "database/ReleaseId.hpp"
@@ -85,6 +86,7 @@ namespace lms::db
std::optional<int> trackNumber; // matching this track number
std::optional<int> discNumber; // matching this disc number
MediaLibraryId mediaLibrary; // If set, tracks in this library
LabelId label; // If set, tracks that belongs to a release with this label
DirectoryId directory; // if set, tracks in this directory
std::optional<bool> hasEmbeddedImage; // if set, tracks that have or not embedded images
@@ -182,6 +184,11 @@ namespace lms::db
mediaLibrary = _mediaLibrary;
return *this;
}
FindParameters& setLabel(LabelId _label)
{
label = _label;
return *this;
}
FindParameters& setDirectory(DirectoryId _directory)
{
directory = _directory;
@@ -136,6 +136,12 @@ namespace lms::db
Name,
};
enum class LabelSortMethod
{
None,
Name,
};
enum class ReleaseSortMethod
{
None,
@@ -104,6 +104,7 @@ namespace lms::feedback
searchParams.setSortMethod(params.sortMethod);
searchParams.setRange(params.range);
searchParams.setMediaLibrary(params.library);
searchParams.setLabel(params.label);
Session& session{ _db.getTLSSession() };
auto transaction{ session.createReadTransaction() };
@@ -154,6 +155,7 @@ namespace lms::feedback
searchParams.setSortMethod(ReleaseSortMethod::StarredDateDesc);
searchParams.setRange(params.range);
searchParams.setMediaLibrary(params.library);
searchParams.setLabel(params.label);
Session& session{ _db.getTLSSession() };
auto transaction{ session.createReadTransaction() };
@@ -204,6 +206,7 @@ namespace lms::feedback
searchParams.setSortMethod(TrackSortMethod::StarredDateDesc);
searchParams.setRange(params.range);
searchParams.setMediaLibrary(params.library);
searchParams.setLabel(params.label);
Session& session{ _db.getTLSSession() };
auto transaction{ session.createReadTransaction() };
@@ -28,6 +28,7 @@
#include "database/ArtistId.hpp"
#include "database/ClusterId.hpp"
#include "database/LabelId.hpp"
#include "database/MediaLibraryId.hpp"
#include "database/ReleaseId.hpp"
#include "database/TrackId.hpp"
@@ -57,6 +58,7 @@ namespace lms::feedback
std::vector<std::string_view> keywords; // if non empty, name must match all of these keywords
std::optional<db::Range> range;
db::MediaLibraryId library;
db::LabelId label;
FindParameters& setUser(const db::UserId _user)
{
@@ -83,6 +85,11 @@ namespace lms::feedback
library = _library;
return *this;
}
FindParameters& setLabel(db::LabelId _label)
{
label = _label;
return *this;
}
};
// Artists
@@ -45,6 +45,7 @@ namespace lms::scrobbling
listenFindParams.setKeywords(params.keywords);
listenFindParams.setRange(params.range);
listenFindParams.setMediaLibrary(params.library);
listenFindParams.setLabel(params.label);
listenFindParams.setArtist(params.artist);
return listenFindParams;
@@ -29,6 +29,7 @@
#include "database/ArtistId.hpp"
#include "database/ClusterId.hpp"
#include "database/LabelId.hpp"
#include "database/MediaLibraryId.hpp"
#include "database/ReleaseId.hpp"
#include "database/TrackId.hpp"
@@ -65,6 +66,7 @@ namespace lms::scrobbling
std::vector<std::string_view> keywords; // if non empty, name must match all of these keywords
std::optional<db::Range> range;
db::MediaLibraryId library; // if set, match this library
db::LabelId label; // if set, match this label
db::ArtistId artist; // if set, match this artist
FindParameters& setUser(const db::UserId _user)
@@ -92,6 +94,11 @@ namespace lms::scrobbling
library = _library;
return *this;
}
FindParameters& setLabel(db::LabelId _label)
{
label = _label;
return *this;
}
FindParameters& setArtist(db::ArtistId _artist)
{
artist = _artist;
+7
View File
@@ -57,6 +57,7 @@ namespace lms::ui
params.setClusters(filters.getClusters());
params.setKeywords(getSearchKeywords());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setLinkType(_linkType);
params.setSortMethod(ArtistSortMethod::StarredDateDesc);
params.setRange(range);
@@ -71,6 +72,7 @@ namespace lms::ui
params.setClusters(filters.getClusters());
params.setKeywords(getSearchKeywords());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setLinkType(_linkType);
params.setRange(range);
@@ -85,6 +87,7 @@ namespace lms::ui
params.setClusters(filters.getClusters());
params.setKeywords(getSearchKeywords());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setLinkType(_linkType);
params.setRange(range);
@@ -98,6 +101,7 @@ namespace lms::ui
params.setClusters(filters.getClusters());
params.setKeywords(getSearchKeywords());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setLinkType(_linkType);
params.setSortMethod(ArtistSortMethod::AddedDesc);
params.setRange(range);
@@ -115,6 +119,7 @@ namespace lms::ui
params.setClusters(filters.getClusters());
params.setKeywords(getSearchKeywords());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setLinkType(_linkType);
params.setSortMethod(ArtistSortMethod::LastWrittenDesc);
params.setRange(range);
@@ -131,6 +136,7 @@ namespace lms::ui
Artist::FindParameters params;
params.setClusters(filters.getClusters());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setLinkType(_linkType);
params.setSortMethod(ArtistSortMethod::SortName);
@@ -159,6 +165,7 @@ namespace lms::ui
Artist::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setLinkType(_linkType);
params.setSortMethod(ArtistSortMethod::Random);
+3
View File
@@ -195,6 +195,7 @@ namespace lms::ui
Release::FindParameters params;
params.setClusters(_filters.getClusters());
params.setMediaLibrary(_filters.getMediaLibrary());
params.setLabel(_filters.getLabel());
params.setArtist(_artistId, { TrackArtistLinkType::ReleaseArtist }, {});
params.setSortMethod(LmsApp->getUser()->getUIArtistReleaseSortMethod());
@@ -253,6 +254,7 @@ namespace lms::ui
Release::FindParameters params;
params.setClusters(_filters.getClusters());
params.setMediaLibrary(_filters.getMediaLibrary());
params.setLabel(_filters.getLabel());
params.setArtist(_artistId, types, { TrackArtistLinkType::ReleaseArtist });
params.setSortMethod(ReleaseSortMethod::OriginalDateDesc);
@@ -338,6 +340,7 @@ namespace lms::ui
Track::FindParameters params;
params.setClusters(_filters.getClusters());
params.setMediaLibrary(_filters.getMediaLibrary());
params.setLabel(_filters.getLabel());
params.setArtist(_artistId);
params.setRange(range);
params.setSortMethod(TrackSortMethod::Name);
+56 -3
View File
@@ -27,7 +27,9 @@
#include <Wt/WTemplate.h>
#include "database/Cluster.hpp"
#include "database/LabelId.hpp"
#include "database/MediaLibrary.hpp"
#include "database/Release.hpp"
#include "database/Session.hpp"
#include "LmsApplication.hpp"
@@ -44,7 +46,11 @@ namespace lms::ui
{
};
using TypeVariant = std::variant<db::ClusterTypeId, MediaLibraryTag>;
struct LabelTag
{
};
using TypeVariant = std::variant<db::ClusterTypeId, MediaLibraryTag, LabelTag>;
using TypeModel = ValueStringModel<TypeVariant>;
std::unique_ptr<TypeModel> createTypeModel()
@@ -59,11 +65,12 @@ namespace lms::ui
}
typeModel->add(Wt::WString::tr("Lms.Explore.media-library"), MediaLibraryTag{});
typeModel->add(Wt::WString::tr("Lms.Explore.label"), LabelTag{});
return typeModel;
}
using ValueVariant = std::variant<db::ClusterId, db::MediaLibraryId>;
using ValueVariant = std::variant<db::ClusterId, db::MediaLibraryId, db::LabelId>;
using ValueModel = ValueStringModel<ValueVariant>;
std::unique_ptr<ValueModel> createValueModel(TypeVariant type)
@@ -80,6 +87,12 @@ namespace lms::ui
valueModel->add(Wt::WString::fromUTF8(std::string{ library->getName() }), library->getId());
});
}
else if (std::holds_alternative<LabelTag>(type))
{
db::Label::find(session, db::LabelSortMethod::Name, [&](const db::Label::pointer& label) {
valueModel->add(Wt::WString::fromUTF8(std::string{ label->getName() }), label->getId());
});
}
else if (const db::ClusterTypeId * clusterTypeId{ std::get_if<db::ClusterTypeId>(&type) })
{
db::Cluster::FindParameters params;
@@ -118,6 +131,11 @@ namespace lms::ui
set(*mediaLibraryId);
state::writeValue<db::MediaLibraryId::ValueType>("filters_media_library_id", mediaLibraryId->getValue());
}
else if (const db::LabelId * labelId{ std::get_if<db::LabelId>(&value) })
{
set(*labelId);
state::writeValue<db::LabelId::ValueType>("filters_label_id", labelId->getValue());
}
else if (const db::ClusterId * clusterId{ std::get_if<db::ClusterId>(&value) })
{
add(*clusterId);
@@ -157,7 +175,9 @@ namespace lms::ui
_filters = bindNew<Wt::WContainerWidget>("clusters");
if (const std::optional<db::MediaLibraryId::ValueType> mediaLibraryId{ state::readValue<db::MediaLibraryId::ValueType>("filters_media_library_id") })
set(*mediaLibraryId);
set(db::MediaLibraryId{ *mediaLibraryId });
if (const std::optional<db::LabelId::ValueType> mediaLibraryId{ state::readValue<db::LabelId::ValueType>("filters_label_id") })
set(db::LabelId{ *mediaLibraryId });
}
void Filters::add(db::ClusterId clusterId)
@@ -219,6 +239,39 @@ namespace lms::ui
emitFilterAddedNotification();
}
void Filters::set(db::LabelId labelId)
{
if (_labelFilter)
{
_filters->removeWidget(_labelFilter);
_labelFilter = nullptr;
_labelId = db::LabelId{};
}
std::string name;
{
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
const auto label{ db::Label::find(LmsApp->getDbSession(), labelId) };
if (!label)
return;
name = label->getName();
}
_labelId = labelId;
_labelFilter = _filters->addWidget(utils::createFilter(Wt::WString::fromUTF8(name), Wt::WString::tr("Lms.Explore.label"), "bg-secondary", true));
_labelFilter->clicked().connect(_labelFilter, [this] {
_filters->removeWidget(_labelFilter);
_labelId = db::LabelId{};
_labelFilter = nullptr;
_sigUpdated.emit();
state::writeValue<db::LabelId::ValueType>("filters_label_id", std::nullopt);
});
emitFilterAddedNotification();
}
void Filters::emitFilterAddedNotification()
{
LmsApp->notifyMsg(Notification::Type::Info,
+6
View File
@@ -27,6 +27,7 @@
#include <Wt/WTemplate.h>
#include "database/ClusterId.hpp"
#include "database/LabelId.hpp"
#include "database/MediaLibraryId.hpp"
namespace lms::ui
@@ -38,6 +39,7 @@ namespace lms::ui
std::span<const db::ClusterId> getClusters() const { return _clusterIds; }
db::MediaLibraryId getMediaLibrary() const { return _mediaLibraryId; }
db::LabelId getLabel() const { return _labelId; }
void add(db::ClusterId clusterId);
@@ -45,6 +47,7 @@ namespace lms::ui
private:
void showDialog();
void set(db::LabelId labelId);
void set(db::MediaLibraryId mediaLibraryId);
void emitFilterAddedNotification();
@@ -54,5 +57,8 @@ namespace lms::ui
Wt::WInteractWidget* _mediaLibraryFilter{};
db::MediaLibraryId _mediaLibraryId;
Wt::WInteractWidget* _labelFilter{};
db::LabelId _labelId;
};
} // namespace lms::ui
@@ -46,6 +46,7 @@ namespace lms::ui
params.setSortMethod(db::TrackSortMethod::DateDescAndRelease);
params.setClusters(filters.getClusters());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(filters.getLabel());
params.setRange(db::Range{ 0, maxTrackCount - res.size() });
const auto tracks{ db::Track::findIds(session, params) };
@@ -76,6 +77,7 @@ namespace lms::ui
params.setSortMethod(db::TrackSortMethod::Release);
params.setClusters(filters.getClusters());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(filters.getLabel());
params.setRange(db::Range{ 0, maxTrackCount - res.size() });
const auto tracks{ db::Track::findIds(session, params) };
@@ -107,6 +109,7 @@ namespace lms::ui
params.setDiscNumber(disc.discNumber);
params.setClusters(filters.getClusters());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(filters.getLabel());
params.setRange(db::Range{ 0, maxTrackCount - res.size() });
const auto tracks{ db::Track::findIds(session, params) };
@@ -132,6 +135,7 @@ namespace lms::ui
params.setTrackList(trackListId);
params.setClusters(filters.getClusters());
params.setMediaLibrary(filters.getMediaLibrary());
params.setLabel(filters.getLabel());
params.setRange(db::Range{ 0, maxTrackCount });
params.setSortMethod(TrackSortMethod::TrackList);
+7
View File
@@ -54,6 +54,7 @@ namespace lms::ui
params.setUser(LmsApp->getUserId());
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setRange(range);
releases = feedbackService.findStarredReleases(params);
@@ -66,6 +67,7 @@ namespace lms::ui
params.setUser(LmsApp->getUserId());
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setRange(range);
@@ -79,6 +81,7 @@ namespace lms::ui
params.setUser(LmsApp->getUserId());
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setRange(range);
@@ -91,6 +94,7 @@ namespace lms::ui
Release::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setSortMethod(ReleaseSortMethod::AddedDesc);
params.setRange(range);
@@ -107,6 +111,7 @@ namespace lms::ui
Release::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setSortMethod(ReleaseSortMethod::LastWrittenDesc);
params.setRange(range);
@@ -123,6 +128,7 @@ namespace lms::ui
Release::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setSortMethod(ReleaseSortMethod::Name);
params.setKeywords(getSearchKeywords());
params.setRange(range);
@@ -150,6 +156,7 @@ namespace lms::ui
Release::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setSortMethod(ReleaseSortMethod::Random);
params.setRange(Range{ 0, getMaxCount() });
+9
View File
@@ -26,6 +26,7 @@
#include <Wt/WPushButton.h>
#include "av/IAudioFile.hpp"
#include "core/String.hpp"
#include "database/Artist.hpp"
#include "database/Cluster.hpp"
#include "database/Release.hpp"
@@ -128,6 +129,13 @@ namespace lms::ui
}
}
// TODO make labels clickable to automatically add filters
if (const std::vector<std::string> labels{ release->getLabelNames() }; !labels.empty())
{
releaseInfo->setCondition("if-has-labels", true);
releaseInfo->bindString("release-labels", core::stringUtils::joinStrings(labels, " · "));
}
// TODO: save in DB and aggregate all this
for (const Track::pointer& track : Track::find(LmsApp->getDbSession(), Track::FindParameters{}.setRelease(releaseId).setRange(Range{ 0, 1 })).results)
{
@@ -391,6 +399,7 @@ namespace lms::ui
params.setSortMethod(db::TrackSortMethod::Release);
params.setClusters(_filters.getClusters());
params.setMediaLibrary(_filters.getMediaLibrary());
params.setLabel(_filters.getLabel()); // TODO: do we really want to hide all tracks when a release does not match the current label filter?
db::Track::find(LmsApp->getDbSession(), params, [&](const db::Track::pointer& track) {
const db::TrackId trackId{ track->getId() };
+7
View File
@@ -54,6 +54,7 @@ namespace lms::ui
feedback::IFeedbackService::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setRange(range);
params.setUser(LmsApp->getUserId());
@@ -67,6 +68,7 @@ namespace lms::ui
params.setUser(LmsApp->getUserId());
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setRange(range);
@@ -80,6 +82,7 @@ namespace lms::ui
params.setUser(LmsApp->getUserId());
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setRange(range);
@@ -92,6 +95,7 @@ namespace lms::ui
Track::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setSortMethod(TrackSortMethod::AddedDesc);
params.setRange(range);
@@ -108,6 +112,7 @@ namespace lms::ui
Track::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setSortMethod(TrackSortMethod::LastWrittenDesc);
params.setRange(range);
@@ -124,6 +129,7 @@ namespace lms::ui
Track::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setRange(range);
@@ -150,6 +156,7 @@ namespace lms::ui
Track::FindParameters params;
params.setClusters(getFilters().getClusters());
params.setMediaLibrary(getFilters().getMediaLibrary());
params.setLabel(getFilters().getLabel());
params.setKeywords(getSearchKeywords());
params.setSortMethod(TrackSortMethod::Random);
params.setRange(Range{ 0, getMaxCount() });
+1
View File
@@ -189,6 +189,7 @@ namespace lms::ui
db::Track::FindParameters params;
params.setClusters(_filters.getClusters());
params.setMediaLibrary(_filters.getMediaLibrary());
params.setLabel(_filters.getLabel());
params.setTrackList(_trackListId);
params.setSortMethod(db::TrackSortMethod::TrackList);
params.setRange(db::Range{ static_cast<std::size_t>(_container->getCount()), _batchSize });