From b9305f2c25513e75dc07a2957fcc57a36a607130 Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 12 Jun 2022 21:15:56 +0200 Subject: [PATCH] Raised artist/album/track limits when explorin the collection. fixes #237 --- src/libs/services/cover/impl/CoverService.cpp | 15 +++--- src/libs/services/database/impl/Release.cpp | 52 ------------------- src/libs/services/database/impl/Track.cpp | 6 +++ .../include/services/database/Release.hpp | 2 - .../include/services/database/Track.hpp | 3 ++ .../include/services/database/Types.hpp | 1 + .../services/database/test/DatabaseTest.cpp | 3 +- src/libs/services/database/test/Release.cpp | 27 ++++++---- src/libs/subsonic/impl/SubsonicResource.cpp | 14 +++-- src/lms/ui/LmsApplication.cpp | 1 + src/lms/ui/PlayQueue.cpp | 8 +-- src/lms/ui/PlayQueue.hpp | 4 +- src/lms/ui/explore/ArtistsView.hpp | 2 +- src/lms/ui/explore/Explore.cpp | 51 ++++++++++++------ src/lms/ui/explore/Explore.hpp | 2 + src/lms/ui/explore/ReleaseView.cpp | 11 ++-- src/lms/ui/explore/ReleasesView.cpp | 1 - src/lms/ui/explore/ReleasesView.hpp | 2 +- src/lms/ui/explore/SearchView.hpp | 6 +-- src/lms/ui/explore/TracksView.hpp | 2 +- src/lms/ui/resource/DownloadResource.cpp | 15 +++--- 21 files changed, 114 insertions(+), 114 deletions(-) diff --git a/src/libs/services/cover/impl/CoverService.cpp b/src/libs/services/cover/impl/CoverService.cpp index 1abcd910..86526dab 100644 --- a/src/libs/services/cover/impl/CoverService.cpp +++ b/src/libs/services/cover/impl/CoverService.cpp @@ -370,6 +370,7 @@ CoverService::getFromTrack(Database::Session& dbSession, Database::TrackId track std::shared_ptr CoverService::getFromRelease(Database::ReleaseId releaseId, ImageSize width) { + using namespace Database; const CacheEntryDesc cacheEntryDesc {releaseId, width}; std::shared_ptr cover {loadFromCache(cacheEntryDesc)}; @@ -378,11 +379,11 @@ CoverService::getFromRelease(Database::ReleaseId releaseId, ImageSize width) struct ReleaseInfo { - Database::TrackId firstTrackId; + TrackId firstTrackId; std::filesystem::path releaseDirectory; }; - Database::Session& session {_db.getTLSSession()}; + Session& session {_db.getTLSSession()}; auto getReleaseInfo {[&] { @@ -390,13 +391,15 @@ CoverService::getFromRelease(Database::ReleaseId releaseId, ImageSize width) auto transaction {session.createSharedTransaction()}; - if (const Database::Release::pointer release {Database::Release::find(session, releaseId)}) + const auto tracks {Track::find(session, Track::FindParameters {}.setRelease(releaseId).setRange({0, 1}).setSortMethod(TrackSortMethod::Release))}; + + if (!tracks.results.empty()) { - if (const auto firstTrack {release->getFirstTrack()}) + if (const Track::pointer track {Track::find(session, tracks.results.front())}) { res = ReleaseInfo {}; - res->firstTrackId = firstTrack->getId(); - res->releaseDirectory = firstTrack->getPath().parent_path(); + res->firstTrackId = track->getId(); + res->releaseDirectory = track->getPath().parent_path(); } } diff --git a/src/libs/services/database/impl/Release.cpp b/src/libs/services/database/impl/Release.cpp index 4513f9cd..0d18bf03 100644 --- a/src/libs/services/database/impl/Release.cpp +++ b/src/libs/services/database/impl/Release.cpp @@ -405,64 +405,12 @@ Release::hasVariousArtists() const return getArtists().size() > 1; } -std::vector -Release::getTracks(const std::vector& clusterIds) const -{ - assert(session()); - - WhereClause where; - - std::ostringstream oss; - oss << "SELECT t FROM track t INNER JOIN release r ON t.release_id = r.id"; - - if (!clusterIds.empty()) - { - oss << " INNER JOIN cluster c ON c.id = t_c.cluster_id INNER JOIN track_cluster t_c ON t_c.track_id = t.id"; - - WhereClause clusterClause; - - for (auto id : clusterIds) - clusterClause.Or(WhereClause("c.id = ?")).bind(id.toString()); - - where.And(clusterClause); - } - - where.And(WhereClause("r.id = ?")).bind(getId().toString()); - - oss << " " << where.get(); - - if (!clusterIds.empty()) - oss << " GROUP BY t.id HAVING COUNT(*) = " << clusterIds.size(); - - oss << " ORDER BY t.disc_number,t.track_number"; - - auto query {session()->query>(oss.str())}; - for (const std::string& bindArg : where.getBindArgs()) - query.bind(bindArg); - - auto res {query.resultList()}; - return std::vector (res.begin(), res.end()); -} - std::size_t Release::getTracksCount() const { return _tracks.size(); } -Track::pointer -Release::getFirstTrack() const -{ - assert(session()); - - return session()->query>("SELECT t from track t") - .join("release r ON t.release_id = r.id") - .where("r.id = ?").bind(getId()) - .orderBy("t.disc_number,t.track_number") - .limit(1) - .resultValue(); -} - std::chrono::milliseconds Release::getDuration() const { diff --git a/src/libs/services/database/impl/Track.cpp b/src/libs/services/database/impl/Track.cpp index e5f28a5e..04c6e943 100644 --- a/src/libs/services/database/impl/Track.cpp +++ b/src/libs/services/database/impl/Track.cpp @@ -103,8 +103,11 @@ createQuery(Session& session, const Track::FindParameters& params) } } + assert(!(params.nonRelease && params.release.isValid())); if (params.nonRelease) query.where("t.release_id IS NULL"); + else if (params.release.isValid()) + query.where("t.release_id = ?").bind(params.release); switch (params.sortMethod) { @@ -126,6 +129,9 @@ createQuery(Session& session, const Track::FindParameters& params) case TrackSortMethod::DateDescAndRelease: query.orderBy("t.date DESC,t.release_id,t.disc_number,t.track_number"); break; + case TrackSortMethod::Release: + query.orderBy("t.disc_number,t.track_number"); + break; } return query; diff --git a/src/libs/services/database/include/services/database/Release.hpp b/src/libs/services/database/include/services/database/Release.hpp index ed11e694..656dc69e 100644 --- a/src/libs/services/database/include/services/database/Release.hpp +++ b/src/libs/services/database/include/services/database/Release.hpp @@ -91,9 +91,7 @@ class Release : public Object static RangeResults findOrphans(Session& session, Range range); // no track related static RangeResults findOrderedByArtist(Session& session, Range range); - std::vector> getTracks(const std::vector& clusters = {}) const; std::size_t getTracksCount() const; - ObjectPtr getFirstTrack() const; // Get the cluster of the tracks that belong to this release // Each clusters are grouped by cluster type, sorted by the number of occurence (max to min) diff --git a/src/libs/services/database/include/services/database/Track.hpp b/src/libs/services/database/include/services/database/Track.hpp index 997cdfd7..3d902f41 100644 --- a/src/libs/services/database/include/services/database/Track.hpp +++ b/src/libs/services/database/include/services/database/Track.hpp @@ -37,6 +37,7 @@ #include "services/database/ArtistId.hpp" #include "services/database/ClusterId.hpp" #include "services/database/Object.hpp" +#include "services/database/ReleaseId.hpp" #include "services/database/TrackId.hpp" #include "services/database/Types.hpp" #include "services/database/UserId.hpp" @@ -67,6 +68,7 @@ class Track : public Object ArtistId artist; // only tracks that involve this user EnumSet trackArtistLinkTypes; // and for these link types bool nonRelease {}; // only tracks that do not belong to a release + ReleaseId release; // matching this release FindParameters& setClusters(const std::vector& _clusters) { clusters = _clusters; return *this; } FindParameters& setKeywords(const std::vector& _keywords) { keywords = _keywords; return *this; } @@ -76,6 +78,7 @@ class Track : public Object FindParameters& setStarringUser(UserId _user, Scrobbler _scrobbler) { starringUser = _user; scrobbler = _scrobbler; return *this; } FindParameters& setArtist(ArtistId _artist, EnumSet _trackArtistLinkTypes = {}) { artist = _artist; trackArtistLinkTypes = _trackArtistLinkTypes; return *this; } FindParameters& setNonRelease(bool _nonRelease) { nonRelease = _nonRelease; return *this; } + FindParameters& setRelease(ReleaseId _release) { release = _release; return *this; } }; struct PathResult diff --git a/src/libs/services/database/include/services/database/Types.hpp b/src/libs/services/database/include/services/database/Types.hpp index 15505e8b..c51ed710 100644 --- a/src/libs/services/database/include/services/database/Types.hpp +++ b/src/libs/services/database/include/services/database/Types.hpp @@ -112,6 +112,7 @@ namespace Database StarredDateDesc, Name, DateDescAndRelease, + Release, // order by disc/track number }; enum class TrackArtistLinkType diff --git a/src/libs/services/database/test/DatabaseTest.cpp b/src/libs/services/database/test/DatabaseTest.cpp index 528abd48..fc680fed 100644 --- a/src/libs/services/database/test/DatabaseTest.cpp +++ b/src/libs/services/database/test/DatabaseTest.cpp @@ -53,7 +53,8 @@ TEST_F(DatabaseFixture, MultiTracksSingleArtistSingleRelease) ASSERT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.front(), release.getId()); - EXPECT_EQ(release->getTracks().size(), nbTracks); + const auto tracks {Track::find(session, Track::FindParameters {}.setRelease(release.getId()))}; + EXPECT_EQ(tracks.results.size(), nbTracks); } } diff --git a/src/libs/services/database/test/Release.cpp b/src/libs/services/database/test/Release.cpp index bd18a13f..08c34068 100644 --- a/src/libs/services/database/test/Release.cpp +++ b/src/libs/services/database/test/Release.cpp @@ -70,9 +70,9 @@ TEST_F(DatabaseFixture, Release_singleTrack) auto transaction {session.createSharedTransaction()}; EXPECT_TRUE(Release::findOrphans(session, Range {}).results.empty()); - EXPECT_EQ(release->getTracksCount(), 1); - ASSERT_EQ(release->getTracks().size(), 1); - EXPECT_EQ(release->getTracks().front()->getId(), track.getId()); + const auto tracks {Track::find(session, Track::FindParameters {}.setRelease(release.getId()))}; + ASSERT_EQ(tracks.results.size(), 1); + EXPECT_EQ(tracks.results.front(), track.getId()); } { @@ -103,7 +103,8 @@ TEST_F(DatabaseFixture, Release_singleTrack) { auto transaction {session.createUniqueTransaction()}; - EXPECT_TRUE(release->getTracks().empty()); + const auto tracks {Track::find(session, Track::FindParameters {}.setRelease(release.getId()))}; + EXPECT_TRUE(tracks.results.empty()); auto releases {Release::findOrphans(session, Range {})}; ASSERT_EQ(releases.results.size(), 1); @@ -279,8 +280,8 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseFirstTrack) { auto transaction {session.createSharedTransaction()}; - EXPECT_FALSE(release1->getFirstTrack()); - EXPECT_FALSE(release2->getFirstTrack()); + EXPECT_TRUE(Track::find(session, Track::FindParameters {}.setRelease(release1.getId())).results.empty()); + EXPECT_TRUE(Track::find(session, Track::FindParameters {}.setRelease(release2.getId())).results.empty()); } { @@ -303,11 +304,17 @@ TEST_F(DatabaseFixture, MultiTracksSingleReleaseFirstTrack) { auto transaction {session.createSharedTransaction()}; - EXPECT_TRUE(release1->getFirstTrack()); - EXPECT_TRUE(release2->getFirstTrack()); + { + const auto tracks {Track::find(session, Track::FindParameters {}.setRelease(release1.getId()).setSortMethod(TrackSortMethod::Release))}; + ASSERT_FALSE(tracks.results.empty()); + EXPECT_EQ(tracks.results.front(), track1A.getId()); + } - EXPECT_EQ(release1->getFirstTrack()->getId(), track1A.getId()); - EXPECT_EQ(release2->getFirstTrack()->getId(), track2B.getId()); + { + const auto tracks {Track::find(session, Track::FindParameters {}.setRelease(release2.getId()).setSortMethod(TrackSortMethod::Release))}; + ASSERT_FALSE(tracks.results.empty()); + EXPECT_EQ(tracks.results.front(), track2B.getId()); + } } } diff --git a/src/libs/subsonic/impl/SubsonicResource.cpp b/src/libs/subsonic/impl/SubsonicResource.cpp index f5174330..657744ce 100644 --- a/src/libs/subsonic/impl/SubsonicResource.cpp +++ b/src/libs/subsonic/impl/SubsonicResource.cpp @@ -860,9 +860,12 @@ handleGetAlbumRequest(RequestContext& context) Response response {Response::createOkResponse(context.serverProtocolVersion)}; Response::Node releaseNode {releaseToResponseNode(release, context.dbSession, user, true /* id3 */)}; - auto tracks {release->getTracks()}; - for (const Track::pointer& track : tracks) + const auto tracks {Track::find(context.dbSession, Track::FindParameters {}.setRelease(id).setSortMethod(TrackSortMethod::Release))}; + for (const TrackId trackId : tracks.results) + { + const Track::pointer track {Track::find(context.dbSession, trackId)}; releaseNode.addArrayChild("song", trackToResponseNode(track, context.dbSession, user)); + } response.addNode("album", std::move(releaseNode)); @@ -1021,9 +1024,12 @@ handleGetMusicDirectoryRequest(RequestContext& context) directoryNode.setAttribute("name", makeNameFilesystemCompatible(release->getName())); - auto tracks {release->getTracks()}; - for (const Track::pointer& track : tracks) + const auto tracks {Track::find(context.dbSession, Track::FindParameters {}.setRelease(*releaseId).setSortMethod(TrackSortMethod::Release))}; + for (const TrackId trackId : tracks.results) + { + const Track::pointer track {Track::find(context.dbSession, trackId)}; directoryNode.addArrayChild("child", trackToResponseNode(track, context.dbSession, user)); + } } else throw BadParameterGenericError {"id"}; diff --git a/src/lms/ui/LmsApplication.cpp b/src/lms/ui/LmsApplication.cpp index 58227305..e05aa14c 100644 --- a/src/lms/ui/LmsApplication.cpp +++ b/src/lms/ui/LmsApplication.cpp @@ -481,6 +481,7 @@ LmsApplication::createHome() mainStack->addNew(); } + explore->setMaxTrackCountForAction(_playQueue->getCapacity()); explore->tracksAction.connect([this] (PlayQueueAction action, const std::vector& trackIds) { _playQueue->processTracks(action, trackIds); diff --git a/src/lms/ui/PlayQueue.cpp b/src/lms/ui/PlayQueue.cpp index 4c8bc2f8..b86c4bf9 100644 --- a/src/lms/ui/PlayQueue.cpp +++ b/src/lms/ui/PlayQueue.cpp @@ -187,7 +187,7 @@ bool PlayQueue::isFull() const { auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - return getTrackList()->getCount() == _nbMaxEntries; + return getTrackList()->getCount() == getCapacity(); } void @@ -313,7 +313,7 @@ PlayQueue::enqueueTracks(const std::vector& trackIds) auto tracklist {getTrackList()}; - std::size_t nbTracksToEnqueue {tracklist->getCount() + trackIds.size() > _nbMaxEntries ? _nbMaxEntries - tracklist->getCount() : trackIds.size()}; + std::size_t nbTracksToEnqueue {tracklist->getCount() + trackIds.size() > getCapacity() ? getCapacity() - tracklist->getCount() : trackIds.size()}; for (const Database::TrackId trackId : trackIds) { Database::Track::pointer track {Database::Track::find(LmsApp->getDbSession(), trackId)}; @@ -368,10 +368,10 @@ PlayQueue::processTracks(PlayQueueAction action, const std::vector 0) - LmsApp->notifyMsg(Notification::Type::Info, Wt::WString::tr("Lms.PlayQueue.playqueue"), Wt::WString::trn("Lms.PlayQueue.nb-tracks-added", nbAddedTracks).arg(nbAddedTracks), std::chrono::milliseconds(2000)); + LmsApp->notifyMsg(Notification::Type::Info, Wt::WString::tr("Lms.PlayQueue.playqueue"), Wt::WString::trn("Lms.PlayQueue.nb-tracks-added", nbAddedTracks).arg(nbAddedTracks), std::chrono::seconds {2}); if (isFull()) - LmsApp->notifyMsg(Notification::Type::Warning, Wt::WString::tr("Lms.PlayQueue.playqueue"), Wt::WString::tr("Lms.PlayQueue.playqueue-full"), std::chrono::milliseconds(2000)); + LmsApp->notifyMsg(Notification::Type::Warning, Wt::WString::tr("Lms.PlayQueue.playqueue"), Wt::WString::tr("Lms.PlayQueue.playqueue-full"), std::chrono::seconds {2}); } void diff --git a/src/lms/ui/PlayQueue.hpp b/src/lms/ui/PlayQueue.hpp index 145f03d7..df630cf9 100644 --- a/src/lms/ui/PlayQueue.hpp +++ b/src/lms/ui/PlayQueue.hpp @@ -67,6 +67,8 @@ class PlayQueue : public Template // Signal emitted when track is unselected (has to be stopped) Wt::Signal<> trackUnselected; + constexpr std::size_t getCapacity() const { return _capacity; } + private: Database::ObjectPtr getTrackList() const; bool isFull() const; @@ -88,7 +90,7 @@ class PlayQueue : public Template void addRadioTrackFromClusters(); std::optional getReplayGain(std::size_t pos, const Database::ObjectPtr& track) const; - static inline constexpr std::size_t _nbMaxEntries {1000}; + static inline constexpr std::size_t _capacity {1000}; static inline constexpr std::size_t _batchSize {12}; bool _mediaPlayerSettingsLoaded {}; diff --git a/src/lms/ui/explore/ArtistsView.hpp b/src/lms/ui/explore/ArtistsView.hpp index 74248af2..53a200e2 100644 --- a/src/lms/ui/explore/ArtistsView.hpp +++ b/src/lms/ui/explore/ArtistsView.hpp @@ -46,7 +46,7 @@ namespace UserInterface void addSome(); static constexpr std::size_t _batchSize {30}; - static constexpr std::size_t _maxCount {512}; + static constexpr std::size_t _maxCount {8000}; Wt::WWidget* _currentActiveItem {}; InfiniteScrollingContainer* _container {}; diff --git a/src/lms/ui/explore/Explore.cpp b/src/lms/ui/explore/Explore.cpp index 13e2432b..b050092c 100644 --- a/src/lms/ui/explore/Explore.cpp +++ b/src/lms/ui/explore/Explore.cpp @@ -130,18 +130,29 @@ Explore::search(const Wt::WString& searchText) static std::vector -getArtistsTracks(Database::Session& session, const std::vector& artistsId, const std::vector& clusters) +getArtistsTracks(Database::Session& session, const std::vector& artistsId, const std::vector& clusters, std::size_t maxTrackCount) { + assert(maxTrackCount); + std::vector res; - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + auto transaction {session.createSharedTransaction()}; for (const Database::ArtistId artistId : artistsId) { - const auto tracks {Database::Track::find(LmsApp->getDbSession(), Database::Track::FindParameters {}.setArtist(artistId).setClusters(clusters).setSortMethod(Database::TrackSortMethod::DateDescAndRelease))}; + Database::Track::FindParameters params; + params.setArtist(artistId); + params.setSortMethod(Database::TrackSortMethod::DateDescAndRelease); + params.setClusters(clusters); + params.setRange({0, maxTrackCount - res.size()}); + + const auto tracks {Database::Track::find(session, params)}; res.reserve(res.size() + tracks.results.size()); res.insert(std::end(res), std::cbegin(tracks.results), std::cend(tracks.results)); + + if (res.size() == maxTrackCount) + break; } return res; @@ -149,23 +160,31 @@ getArtistsTracks(Database::Session& session, const std::vector -getReleasesTracks(Database::Session& session, const std::vector& releasesId, const std::vector& clusters) +getReleasesTracks(Database::Session& session, const std::vector& releasesId, const std::vector& clusters, std::size_t maxTrackCount) { - std::vector res; + using namespace Database; - // TODO optimize this - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + assert(maxTrackCount); - for (const Database::ReleaseId releaseId : releasesId) + std::vector res; + + auto transaction {session.createSharedTransaction()}; + + for (const ReleaseId releaseId : releasesId) { - const Database::Release::pointer release {Database::Release::find(session, releaseId)}; - if (!release) - continue; + Database::Track::FindParameters params; + params.setRelease(releaseId); + params.setSortMethod(Database::TrackSortMethod::Release); + params.setClusters(clusters); + params.setRange({0, maxTrackCount - res.size()}); - const std::vector tracks {release->getTracks(clusters)}; + const auto tracks {Database::Track::find(session, params)}; - res.reserve(res.size() + tracks.size()); - std::transform(std::cbegin(tracks), std::cend(tracks), std::back_inserter(res), [](const Database::Track::pointer& track) { return track->getId(); }); + res.reserve(res.size() + tracks.results.size()); + res.insert(std::end(res), std::cbegin(tracks.results), std::cend(tracks.results)); + + if (res.size() == maxTrackCount) + break; } return res; @@ -174,13 +193,13 @@ getReleasesTracks(Database::Session& session, const std::vector& artistsId) { - tracksAction.emit(action, getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds())); + tracksAction.emit(action, getArtistsTracks(LmsApp->getDbSession(), artistsId, _filters->getClusterIds(), _maxTrackCount)); } void Explore::handleReleasesAction(PlayQueueAction action, const std::vector& releasesId) { - tracksAction.emit(action, getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds())); + tracksAction.emit(action, getReleasesTracks(LmsApp->getDbSession(), releasesId, _filters->getClusterIds(), _maxTrackCount)); } void diff --git a/src/lms/ui/explore/Explore.hpp b/src/lms/ui/explore/Explore.hpp index 9e4c3bb0..113108e7 100644 --- a/src/lms/ui/explore/Explore.hpp +++ b/src/lms/ui/explore/Explore.hpp @@ -37,6 +37,7 @@ namespace UserInterface void search(const Wt::WString& searchText); PlayQueueActionTrackSignal tracksAction; + void setMaxTrackCountForAction(std::size_t maxTrackCount) { _maxTrackCount = maxTrackCount; } private: void handleArtistsAction(PlayQueueAction action, const std::vector& artistsId); @@ -45,6 +46,7 @@ namespace UserInterface Filters* _filters {}; SearchView* _search {}; + std::size_t _maxTrackCount {}; }; } // namespace UserInterface diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index 824e5027..c1ba5987 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -232,12 +232,15 @@ Release::refreshView() return noDiscTracksContainer; }; - const auto clusterIds {_filters->getClusterIds()}; - const auto tracks {release->getTracks(clusterIds)}; + Database::Track::FindParameters params; + params.setRelease(*releaseId); + params.setSortMethod(Database::TrackSortMethod::Release); + params.setClusters(_filters->getClusterIds()); - for (const auto& track : tracks) + const auto tracks {Database::Track::find(LmsApp->getDbSession(), params)}; + for (const Database::TrackId trackId : tracks.results) { - auto trackId {track->getId()}; + const Database::Track::pointer track {Database::Track::find(LmsApp->getDbSession(), trackId)}; const auto discNumber {track->getDiscNumber()}; diff --git a/src/lms/ui/explore/ReleasesView.cpp b/src/lms/ui/explore/ReleasesView.cpp index 8ada8c37..e70ceef2 100644 --- a/src/lms/ui/explore/ReleasesView.cpp +++ b/src/lms/ui/explore/ReleasesView.cpp @@ -134,7 +134,6 @@ std::vector Releases::getAllReleases() { RangeResults releaseIds {_releaseCollector.get(Range {})}; - return std::move(releaseIds.results); } diff --git a/src/lms/ui/explore/ReleasesView.hpp b/src/lms/ui/explore/ReleasesView.hpp index 366e1d1c..8ec89055 100644 --- a/src/lms/ui/explore/ReleasesView.hpp +++ b/src/lms/ui/explore/ReleasesView.hpp @@ -48,7 +48,7 @@ namespace UserInterface static constexpr std::size_t _maxItemsPerLine {6}; static constexpr std::size_t _batchSize {_maxItemsPerLine}; - static constexpr std::size_t _maxCount {_maxItemsPerLine * 32}; + static constexpr std::size_t _maxCount {_maxItemsPerLine * 500}; Wt::WWidget* _currentActiveItem {}; InfiniteScrollingContainer* _container {}; diff --git a/src/lms/ui/explore/SearchView.hpp b/src/lms/ui/explore/SearchView.hpp index d3ec1140..36bd2653 100644 --- a/src/lms/ui/explore/SearchView.hpp +++ b/src/lms/ui/explore/SearchView.hpp @@ -62,9 +62,9 @@ namespace UserInterface }; static inline std::unordered_map _maxCounts { - {Mode::Artist, 512}, - {Mode::Release, 60}, - {Mode::Track, 64}, + {Mode::Artist, 8000}, + {Mode::Release, 4000}, + {Mode::Track, 4000}, }; std::size_t getBatchSize(Mode mode) const; std::size_t getMaxCount(Mode mode) const; diff --git a/src/lms/ui/explore/TracksView.hpp b/src/lms/ui/explore/TracksView.hpp index 21ecfb9c..e4888006 100644 --- a/src/lms/ui/explore/TracksView.hpp +++ b/src/lms/ui/explore/TracksView.hpp @@ -46,7 +46,7 @@ namespace UserInterface static constexpr TrackCollector::Mode _defaultMode {TrackCollector::Mode::Random}; static constexpr std::size_t _batchSize {6}; - static constexpr std::size_t _maxCount {160}; + static constexpr std::size_t _maxCount {8000}; Wt::WWidget* _currentActiveItem {}; InfiniteScrollingContainer* _container {}; diff --git a/src/lms/ui/resource/DownloadResource.cpp b/src/lms/ui/resource/DownloadResource.cpp index 23e2abe9..1e8ca0c5 100644 --- a/src/lms/ui/resource/DownloadResource.cpp +++ b/src/lms/ui/resource/DownloadResource.cpp @@ -212,16 +212,17 @@ DownloadReleaseResource::DownloadReleaseResource(Database::ReleaseId releaseId) std::unique_ptr DownloadReleaseResource::createZipper() { + using namespace Database; + auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - const Database::Release::pointer release {Database::Release::find(LmsApp->getDbSession(), _releaseId)}; - if (!release) - { - LOG(DEBUG) << "Cannot find release"; - return {}; - } + auto trackResults {Track::find(LmsApp->getDbSession(), Track::FindParameters {}.setRelease(_releaseId).setSortMethod(TrackSortMethod::Release))}; - return UserInterface::createZipper(release->getTracks()); + std::vector tracks; + tracks.reserve(trackResults.results.size()); + std::transform(std::cbegin(trackResults.results), std::cend(trackResults.results), std::back_inserter(tracks), [](TrackId trackId){ return Track::find(LmsApp->getDbSession(), trackId); }); + + return UserInterface::createZipper(tracks); } DownloadTrackResource::DownloadTrackResource(Database::TrackId trackId)