diff --git a/src/api/subsonic/SubsonicResource.cpp b/src/api/subsonic/SubsonicResource.cpp index 6e6939b0..56f67e3a 100644 --- a/src/api/subsonic/SubsonicResource.cpp +++ b/src/api/subsonic/SubsonicResource.cpp @@ -836,6 +836,13 @@ handleGetAlbumListRequestCommon(const RequestContext& context, bool id3) { releases = Release::getAll(context.dbSession, offset, size); } + else if (type == "byYear") + { + int fromYear {getMandatoryParameterAs(context.parameters, "fromYear")}; + int toYear {getMandatoryParameterAs(context.parameters, "toYear")}; + + releases = Release::getByYear(context.dbSession, fromYear, toYear, offset, size); + } else if (type == "byGenre") { // Mandatory param diff --git a/src/database/Release.cpp b/src/database/Release.cpp index 8922e955..19bc053e 100644 --- a/src/database/Release.cpp +++ b/src/database/Release.cpp @@ -119,7 +119,7 @@ Release::getAllOrphans(Session& session) } std::vector -Release::getLastAdded(Session& session, Wt::WDateTime after, boost::optional offset, boost::optional limit) +Release::getLastAdded(Session& session, const Wt::WDateTime& after, boost::optional offset, boost::optional limit) { session.checkSharedLocked(); @@ -133,6 +133,20 @@ Release::getLastAdded(Session& session, Wt::WDateTime after, boost::optional(res.begin(), res.end()); } +std::vector +Release::getByYear(Session& session, int yearFrom, int yearTo, boost::optional offset, boost::optional limit) +{ + Wt::Dbo::collection res = session.getDboSession().query + ("SELECT DISTINCT r from release r INNER JOIN track t ON r.id = t.release_id") + .where("t.year >= ?").bind(yearFrom) + .where("t.year <= ?").bind(yearTo) + .orderBy("t.year, r.name COLLATE NOCASE") + .offset(offset ? static_cast(*offset) : -1) + .limit(limit ? static_cast(*limit) : -1); + + return std::vector(res.begin(), res.end()); +} + static Wt::Dbo::Query getQuery(Session& session, diff --git a/src/database/Release.hpp b/src/database/Release.hpp index cd617d12..a0a581df 100644 --- a/src/database/Release.hpp +++ b/src/database/Release.hpp @@ -53,7 +53,8 @@ class Release : public Wt::Dbo::Dbo static std::vector getAllOrphans(Session& session); // no track related static std::vector getAll(Session& session, boost::optional offset = {}, boost::optional size = {}); static std::vector getAllRandom(Session& session, boost::optional size = {}); - static std::vector getLastAdded(Session& session, Wt::WDateTime after, boost::optional offset = {}, boost::optional size = {}); + static std::vector getLastAdded(Session& session, const Wt::WDateTime& after, boost::optional offset = {}, boost::optional size = {}); + static std::vector getByYear(Session& session, int yearFrom, int yearTo, boost::optional offset = {}, boost::optional size = {}); static std::vector getByFilter(Session& session, const std::set& clusters); static std::vector getByFilter(Session& session,