diff --git a/src/libs/services/database/impl/Cluster.cpp b/src/libs/services/database/impl/Cluster.cpp index ed01031a..5ec3217d 100644 --- a/src/libs/services/database/impl/Cluster.cpp +++ b/src/libs/services/database/impl/Cluster.cpp @@ -149,11 +149,11 @@ ClusterType::findUsed(Session& session, Range range) } ClusterType::pointer -ClusterType::find(Session& session, const std::string& name) +ClusterType::find(Session& session, std::string_view name) { session.checkSharedLocked(); - return session.getDboSession().find().where("name = ?").bind(name).resultValue(); + return session.getDboSession().find().where("name = ?").bind(std::string {name}).resultValue(); } ClusterType::pointer diff --git a/src/libs/services/database/impl/Release.cpp b/src/libs/services/database/impl/Release.cpp index 781a3017..915aadd5 100644 --- a/src/libs/services/database/impl/Release.cpp +++ b/src/libs/services/database/impl/Release.cpp @@ -287,8 +287,20 @@ Release::getDiscCount() const return res; } -std::optional -Release::getReleaseYear(bool original) const +Wt::WDate +Release::getReleaseDate() const +{ + return getReleaseDate(false); +} + +Wt::WDate +Release::getOriginalReleaseDate() const +{ + return getReleaseDate(true); +} + +Wt::WDate +Release::getReleaseDate(bool original) const { assert(session()); @@ -301,16 +313,11 @@ Release::getReleaseYear(bool original) const .bind(getId()) .resultList()}; - // various dates => no date + // various dates => invalid date if (dates.empty() || dates.size() > 1) - return std::nullopt; + return {}; - auto date {dates.front().year()}; - - if (date > 0) - return date; - - return std::nullopt; + return dates.front(); } std::optional diff --git a/src/libs/services/database/include/services/database/Cluster.hpp b/src/libs/services/database/include/services/database/Cluster.hpp index a7113713..77a15671 100644 --- a/src/libs/services/database/include/services/database/Cluster.hpp +++ b/src/libs/services/database/include/services/database/Cluster.hpp @@ -89,7 +89,7 @@ class ClusterType final : public Object // Getters static std::size_t getCount(Session& session); static RangeResults find(Session& session, Range range); - static pointer find(Session& session, const std::string& name); + static pointer find(Session& session, std::string_view name); static pointer find(Session& session, ClusterTypeId id); static RangeResults findOrphans(Session& session, Range range); static RangeResults findUsed(Session& session, Range range); diff --git a/src/libs/services/database/include/services/database/Release.hpp b/src/libs/services/database/include/services/database/Release.hpp index ec1ca623..27276fc7 100644 --- a/src/libs/services/database/include/services/database/Release.hpp +++ b/src/libs/services/database/include/services/database/Release.hpp @@ -100,7 +100,8 @@ class Release final : public Object std::vector>> getClusterGroups(const std::vector>& clusterTypes, std::size_t size) const; // Utility functions (if all tracks have the same values, which is legit to not be the case) - std::optional getReleaseYear(bool originalDate = false) const; + Wt::WDate getReleaseDate() const; + Wt::WDate getOriginalReleaseDate() const; std::optional getCopyright() const; std::optional getCopyrightURL() const; @@ -145,6 +146,8 @@ class Release final : public Object Release(const std::string& name, const std::optional& MBID = {}); static pointer create(Session& session, const std::string& name, const std::optional& MBID = {}); + Wt::WDate getReleaseDate(bool original) const; + static constexpr std::size_t _maxNameLength {128}; std::string _name; diff --git a/src/libs/services/database/test/Release.cpp b/src/libs/services/database/test/Release.cpp index 573ed9c7..9c153fc4 100644 --- a/src/libs/services/database/test/Release.cpp +++ b/src/libs/services/database/test/Release.cpp @@ -350,8 +350,8 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseDate) track1A.get().modify()->setOriginalDate(release1OriginalDate); track1B.get().modify()->setOriginalDate(release1OriginalDate); - EXPECT_EQ(release1.get()->getReleaseYear(), release1Date.year()); - EXPECT_EQ(release1.get()->getReleaseYear(true), release1OriginalDate.year()); + EXPECT_EQ(release1.get()->getReleaseDate(), release1Date); + EXPECT_EQ(release1.get()->getOriginalReleaseDate(), release1OriginalDate); } { diff --git a/src/libs/subsonic/impl/SubsonicResource.cpp b/src/libs/subsonic/impl/SubsonicResource.cpp index 79f4f7c4..ed1c6685 100644 --- a/src/libs/subsonic/impl/SubsonicResource.cpp +++ b/src/libs/subsonic/impl/SubsonicResource.cpp @@ -57,14 +57,11 @@ using namespace Database; -static const std::string genreClusterName {"GENRE"}; -static const std::string reportedStarredDate {"2000-01-01T00:00:00"}; -static const std::string reportedDummyDate {"2000-01-01T00:00:00"}; +static const std::string_view genreClusterName {"GENRE"}; +static const std::string_view reportedStarredDate {"2000-01-01T00:00:00"}; +static const std::string_view reportedDummyDate {"2000-01-01T00:00:00"}; static const unsigned long long reportedDummyDateULong {946684800000ULL}; // 2000-01-01T00:00:00 UTC - - - namespace API::Subsonic { @@ -375,9 +372,8 @@ releaseToResponseNode(const Release::pointer& release, Session& dbSession, const albumNode.setAttribute("created", dateTimeToCreatedString(release->getLastWritten())); albumNode.setAttribute("id", idToString(release->getId())); albumNode.setAttribute("coverArt", idToString(release->getId())); - auto releaseYear {release->getReleaseYear()}; - if (releaseYear) - albumNode.setAttribute("year", *releaseYear); + if (const Wt::WDate releaseDate {release->getReleaseDate()}; releaseDate.isValid()) + albumNode.setAttribute("year", releaseDate.year()); auto artists {release->getReleaseArtists()}; if (artists.empty()) @@ -405,10 +401,10 @@ releaseToResponseNode(const Release::pointer& release, Session& dbSession, const if (id3) { // Report the first GENRE for this track - ClusterType::pointer clusterType {ClusterType::find(dbSession, genreClusterName)}; + ClusterType::pointer clusterType{ClusterType::find(dbSession, genreClusterName)}; if (clusterType) { - auto clusters {release->getClusterGroups({clusterType}, 1)}; + auto clusters{release->getClusterGroups({clusterType}, 1)}; if (!clusters.empty() && !clusters.front().empty()) albumNode.setAttribute("genre", clusters.front().front()->getName()); } @@ -1905,7 +1901,7 @@ struct RequestEntryPointInfo CheckImplementedFunc checkFunc {}; }; -static const std::unordered_map requestEntryPoints +static const std::unordered_map requestEntryPoints { // System {"/ping", {handlePingRequest}}, diff --git a/src/lms/ui/explore/ReleaseHelpers.cpp b/src/lms/ui/explore/ReleaseHelpers.cpp index c4b9fa32..57a91efe 100644 --- a/src/lms/ui/explore/ReleaseHelpers.cpp +++ b/src/lms/ui/explore/ReleaseHelpers.cpp @@ -66,7 +66,7 @@ namespace UserInterface::ReleaseListHelpers if (showYear) { - Wt::WString year {ReleaseHelpers::buildReleaseYearString(release->getReleaseYear(), release->getReleaseYear(true))}; + Wt::WString year {ReleaseHelpers::buildReleaseYearString(release->getReleaseDate(), release->getOriginalReleaseDate())}; if (!year.empty()) { entry->setCondition("if-has-year", true); @@ -135,18 +135,18 @@ namespace UserInterface::ReleaseHelpers return res; } - Wt::WString buildReleaseYearString(std::optional year, std::optional originalYear) + Wt::WString buildReleaseYearString(const Wt::WDate& releaseDate, const Wt::WDate& originalReleaseDate) { Wt::WString res; // Year can be here, but originalYear can't be here without year (enforced by scanner) - if (!year) + if (!releaseDate.isValid()) return res; - if (originalYear && *originalYear != *year) - res = std::to_string(*originalYear) + " (" + std::to_string(*year) + ")"; + if (originalReleaseDate.isValid() && originalReleaseDate != releaseDate) + res = std::to_string(originalReleaseDate.year()) + " (" + std::to_string(releaseDate.year()) + ")"; else - res = std::to_string(*year); + res = std::to_string(releaseDate.year()); return res; } diff --git a/src/lms/ui/explore/ReleaseHelpers.hpp b/src/lms/ui/explore/ReleaseHelpers.hpp index ebc424aa..3bdef46b 100644 --- a/src/lms/ui/explore/ReleaseHelpers.hpp +++ b/src/lms/ui/explore/ReleaseHelpers.hpp @@ -24,6 +24,7 @@ #include #include +#include #include "services/database/Object.hpp" #include "services/database/Types.hpp" #include "utils/EnumSet.hpp" @@ -43,5 +44,5 @@ namespace UserInterface::ReleaseListHelpers namespace UserInterface::ReleaseHelpers { Wt::WString buildReleaseTypeString(Database::ReleaseTypePrimary primaryType, EnumSet secondaryTypes); - Wt::WString buildReleaseYearString(std::optional year, std::optional originalYear); + Wt::WString buildReleaseYearString(const Wt::WDate& releaseDate, const Wt::WDate& originalReleaseDate); } diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index 7e538365..de03fe76 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -248,7 +248,7 @@ Release::refreshView() bindString("name", Wt::WString::fromUTF8(release->getName()), Wt::TextFormat::Plain); - Wt::WString year {ReleaseHelpers::buildReleaseYearString(release->getReleaseYear(), release->getReleaseYear(true))}; + Wt::WString year {ReleaseHelpers::buildReleaseYearString(release->getReleaseDate(), release->getOriginalReleaseDate())}; if (!year.empty()) { setCondition("if-has-year", true); diff --git a/src/lms/ui/resource/DownloadResource.cpp b/src/lms/ui/resource/DownloadResource.cpp index 4f6f4b77..594c8182 100644 --- a/src/lms/ui/resource/DownloadResource.cpp +++ b/src/lms/ui/resource/DownloadResource.cpp @@ -109,8 +109,8 @@ getReleasePathName(Database::Release::pointer release) { std::string releaseName; - if (auto releaseYear {release->getReleaseYear()}) - releaseName += std::to_string(*releaseYear) + " - "; + if (const Wt::WDate releaseDate {release->getReleaseDate()}; releaseDate.isValid()) + releaseName += std::to_string(releaseDate.year()) + " - "; releaseName += StringUtils::replaceInString(release->getName(), "/", "_"); return releaseName;