diff --git a/src/libs/scanner/impl/Scanner.cpp b/src/libs/scanner/impl/Scanner.cpp index 11175d61..064b5a4c 100644 --- a/src/libs/scanner/impl/Scanner.cpp +++ b/src/libs/scanner/impl/Scanner.cpp @@ -888,7 +888,6 @@ checkFile(const std::filesystem::path& p, const std::filesystem::path& mediaDire } return true; - } catch (std::filesystem::filesystem_error& e) { diff --git a/src/libs/scanner/impl/Scanner.hpp b/src/libs/scanner/impl/Scanner.hpp index 43a8b964..e8564c66 100644 --- a/src/libs/scanner/impl/Scanner.hpp +++ b/src/libs/scanner/impl/Scanner.hpp @@ -115,8 +115,7 @@ class Scanner : public IScanner std::unordered_set _fileExtensions; std::filesystem::path _mediaDirectory; Database::ScanSettings::RecommendationEngineType _recommendationEngineType; - -}; // class Scanner +}; } // Scanner diff --git a/src/lms/ui/PlayQueue.cpp b/src/lms/ui/PlayQueue.cpp index 9d971ab6..d4a790cd 100644 --- a/src/lms/ui/PlayQueue.cpp +++ b/src/lms/ui/PlayQueue.cpp @@ -412,118 +412,7 @@ PlayQueue::addSome() auto tracklistEntries = tracklist->getEntries(_entriesContainer->count(), 50); for (const Database::TrackListEntry::pointer& tracklistEntry : tracklistEntries) - { - const auto tracklistEntryId {tracklistEntry.id()}; - const auto track {tracklistEntry->getTrack()}; - const Database::IdType trackId {track->id()}; - - Wt::WTemplate* entry = _entriesContainer->addNew(Wt::WString::tr("Lms.PlayQueue.template.entry")); - - entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::TextFormat::Plain); - - const auto artists {track->getArtists({Database::TrackArtistLinkType::Artist})}; - const auto release {track->getRelease()}; - - if (!artists.empty() || release) - entry->setCondition("if-has-artists-or-release", true); - - if (!artists.empty()) - { - entry->setCondition("if-has-artists", true); - - Wt::WContainerWidget* artistContainer {entry->bindNew("artists")}; - for (const auto& artist : artists) - { - Wt::WTemplate* a {artistContainer->addNew(Wt::WString::tr("Lms.PlayQueue.template.entry-artist"))}; - a->bindWidget("artist", LmsApplication::createArtistAnchor(artist)); - } - } - if (release) - { - entry->setCondition("if-has-release", true); - entry->bindWidget("release", LmsApplication::createReleaseAnchor(release)); - { - Wt::WAnchor* anchor = entry->bindWidget("cover", LmsApplication::createReleaseAnchor(release, false)); - auto cover = std::make_unique(); - cover->setImageLink(LmsApp->getCoverResource()->getReleaseUrl(release.id(), CoverResource::Size::Large)); - cover->setStyleClass("Lms-cover"); - cover->setAttributeValue("onload", LmsApp->javaScriptClass() + ".onLoadCover(this)"); - anchor->setImage(std::move(cover)); - } - } - else - { - auto cover = entry->bindNew("cover"); - cover->setImageLink(LmsApp->getCoverResource()->getTrackUrl(track.id(), CoverResource::Size::Large)); - cover->setStyleClass("Lms-cover"); - cover->setAttributeValue("onload", LmsApp->javaScriptClass() + ".onLoadCover(this)"); - } - - entry->bindString("duration", trackDurationToString(track->getDuration()), Wt::TextFormat::Plain); - - Wt::WText* playBtn {entry->bindNew("play-btn", Wt::WString::tr("Lms.PlayQueue.template.play-btn"), Wt::TextFormat::XHTML)}; - playBtn->clicked().connect(std::bind([=] - { - auto pos = _entriesContainer->indexOf(entry); - if (pos >= 0) - loadTrack(pos, true); - })); - - Wt::WText* delBtn {entry->bindNew("del-btn", Wt::WString::tr("Lms.PlayQueue.template.delete-btn"), Wt::TextFormat::XHTML)}; - delBtn->clicked().connect([=] - { - // Remove the entry n both the widget tree and the playqueue - { - auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; - - Database::TrackListEntry::pointer entryToRemove {Database::TrackListEntry::getById(LmsApp->getDbSession(), tracklistEntryId)}; - entryToRemove.remove(); - } - - if (_trackPos) - { - auto pos {_entriesContainer->indexOf(entry)}; - if (pos > 0 && *_trackPos >= static_cast(pos)) - (*_trackPos)--; - } - - _entriesContainer->removeWidget(entry); - - updateInfo(); - }); - - Wt::WText* moreBtn {entry->bindNew("more-btn", Wt::WString::tr("Lms.PlayQueue.template.more-btn"), Wt::TextFormat::XHTML)}; - moreBtn->clicked().connect([=] - { - Wt::WPopupMenu* popup {LmsApp->createPopupMenu()}; - - bool isStarred {}; - { - auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - - if (auto track {Database::Track::getById(LmsApp->getDbSession(), trackId)}) - isStarred = LmsApp->getUser()->hasStarredTrack(track); - } - popup->addItem(Wt::WString::tr(isStarred ? "Lms.Explore.unstar" : "Lms.Explore.star")) - ->triggered().connect(moreBtn, [=] - { - auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; - - auto track {Database::Track::getById(LmsApp->getDbSession(), trackId)}; - if (!track) - return; - - if (isStarred) - LmsApp->getUser().modify()->unstarTrack(track); - else - LmsApp->getUser().modify()->starTrack(track); - }); - popup->addItem(Wt::WString::tr("Lms.Explore.download")) - ->setLink(Wt::WLink {std::make_unique(trackId)}); - - popup->popup(moreBtn); - }); - } + addEntry(tracklistEntry); if (static_cast(_entriesContainer->count()) < tracklist->getCount()) displayLoadingIndicator(); @@ -531,6 +420,122 @@ PlayQueue::addSome() hideLoadingIndicator(); } +void +PlayQueue::addEntry(const Database::TrackListEntry::pointer& tracklistEntry) +{ + const auto tracklistEntryId {tracklistEntry.id()}; + const auto track {tracklistEntry->getTrack()}; + const Database::IdType trackId {track->id()}; + + Wt::WTemplate* entry = _entriesContainer->addNew(Wt::WString::tr("Lms.PlayQueue.template.entry")); + + entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::TextFormat::Plain); + + const auto artists {track->getArtists({Database::TrackArtistLinkType::Artist})}; + const auto release {track->getRelease()}; + + if (!artists.empty() || release) + entry->setCondition("if-has-artists-or-release", true); + + if (!artists.empty()) + { + entry->setCondition("if-has-artists", true); + + Wt::WContainerWidget* artistContainer {entry->bindNew("artists")}; + for (const auto& artist : artists) + { + Wt::WTemplate* a {artistContainer->addNew(Wt::WString::tr("Lms.PlayQueue.template.entry-artist"))}; + a->bindWidget("artist", LmsApplication::createArtistAnchor(artist)); + } + } + if (release) + { + entry->setCondition("if-has-release", true); + entry->bindWidget("release", LmsApplication::createReleaseAnchor(release)); + { + Wt::WAnchor* anchor = entry->bindWidget("cover", LmsApplication::createReleaseAnchor(release, false)); + auto cover = std::make_unique(); + cover->setImageLink(LmsApp->getCoverResource()->getReleaseUrl(release.id(), CoverResource::Size::Large)); + cover->setStyleClass("Lms-cover"); + cover->setAttributeValue("onload", LmsApp->javaScriptClass() + ".onLoadCover(this)"); + anchor->setImage(std::move(cover)); + } + } + else + { + auto cover = entry->bindNew("cover"); + cover->setImageLink(LmsApp->getCoverResource()->getTrackUrl(track.id(), CoverResource::Size::Large)); + cover->setStyleClass("Lms-cover"); + cover->setAttributeValue("onload", LmsApp->javaScriptClass() + ".onLoadCover(this)"); + } + + entry->bindString("duration", trackDurationToString(track->getDuration()), Wt::TextFormat::Plain); + + Wt::WText* playBtn {entry->bindNew("play-btn", Wt::WString::tr("Lms.PlayQueue.template.play-btn"), Wt::TextFormat::XHTML)}; + playBtn->clicked().connect([=] + { + auto pos = _entriesContainer->indexOf(entry); + if (pos >= 0) + loadTrack(pos, true); + }); + + Wt::WText* delBtn {entry->bindNew("del-btn", Wt::WString::tr("Lms.PlayQueue.template.delete-btn"), Wt::TextFormat::XHTML)}; + delBtn->clicked().connect([=] + { + // Remove the entry n both the widget tree and the playqueue + { + auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; + + Database::TrackListEntry::pointer entryToRemove {Database::TrackListEntry::getById(LmsApp->getDbSession(), tracklistEntryId)}; + entryToRemove.remove(); + } + + if (_trackPos) + { + auto pos {_entriesContainer->indexOf(entry)}; + if (pos > 0 && *_trackPos >= static_cast(pos)) + (*_trackPos)--; + } + + _entriesContainer->removeWidget(entry); + + updateInfo(); + }); + + Wt::WText* moreBtn {entry->bindNew("more-btn", Wt::WString::tr("Lms.PlayQueue.template.more-btn"), Wt::TextFormat::XHTML)}; + moreBtn->clicked().connect([=] + { + Wt::WPopupMenu* popup {LmsApp->createPopupMenu()}; + + bool isStarred {}; + { + auto transaction {LmsApp->getDbSession().createSharedTransaction()}; + + if (auto track {Database::Track::getById(LmsApp->getDbSession(), trackId)}) + isStarred = LmsApp->getUser()->hasStarredTrack(track); + } + + popup->addItem(Wt::WString::tr(isStarred ? "Lms.Explore.unstar" : "Lms.Explore.star")) + ->triggered().connect(moreBtn, [=] + { + auto transaction {LmsApp->getDbSession().createUniqueTransaction()}; + + auto track {Database::Track::getById(LmsApp->getDbSession(), trackId)}; + if (!track) + return; + + if (isStarred) + LmsApp->getUser().modify()->unstarTrack(track); + else + LmsApp->getUser().modify()->starTrack(track); + }); + popup->addItem(Wt::WString::tr("Lms.Explore.download")) + ->setLink(Wt::WLink {std::make_unique(trackId)}); + + popup->popup(moreBtn); + }); +} + void PlayQueue::enqueueRadioTracks() { diff --git a/src/lms/ui/PlayQueue.hpp b/src/lms/ui/PlayQueue.hpp index 5b9dfc93..9a65c177 100644 --- a/src/lms/ui/PlayQueue.hpp +++ b/src/lms/ui/PlayQueue.hpp @@ -35,6 +35,7 @@ namespace Similarity { namespace Database { class Track; class TrackList; + class TrackListEntry; } namespace UserInterface { @@ -65,6 +66,7 @@ class PlayQueue : public Wt::WTemplate void clearTracks(); std::size_t enqueueTracks(const std::vector& trackIds); void addSome(); + void addEntry(const Wt::Dbo::ptr& entry); void enqueueRadioTracks(); void updateInfo(); void updateCurrentTrack(bool selected); diff --git a/src/lms/ui/resource/CoverResource.hpp b/src/lms/ui/resource/CoverResource.hpp index f95a555d..ff58976c 100644 --- a/src/lms/ui/resource/CoverResource.hpp +++ b/src/lms/ui/resource/CoverResource.hpp @@ -44,7 +44,6 @@ namespace UserInterface private: void handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response) override; - }; } // namespace UserInterface