diff --git a/src/database/Playlist.cpp b/src/database/Playlist.cpp index 4e7a0ee0..b26cc91b 100644 --- a/src/database/Playlist.cpp +++ b/src/database/Playlist.cpp @@ -71,6 +71,13 @@ Playlist::getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr user) return std::vector(res.begin(), res.end()); } +Playlist::pointer +Playlist::getById(Wt::Dbo::Session& session, IdType id) +{ + return session.find().where("id = ?").bind(id); +} + + PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr track, Wt::Dbo::ptr playlist) : _track(track), _playlist(playlist) diff --git a/src/database/Playlist.hpp b/src/database/Playlist.hpp index ef9aa059..15795494 100644 --- a/src/database/Playlist.hpp +++ b/src/database/Playlist.hpp @@ -42,6 +42,7 @@ class Playlist : public Wt::Dbo::Dbo // Search utility static pointer get(Wt::Dbo::Session& session, std::string name, Wt::Dbo::ptr user); + static pointer getById(Wt::Dbo::Session& session, IdType playlistId); static std::vector getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr user); // Create utility diff --git a/src/ui/LmsApplication.cpp b/src/ui/LmsApplication.cpp index cd8860bc..b1e108b7 100644 --- a/src/ui/LmsApplication.cpp +++ b/src/ui/LmsApplication.cpp @@ -131,7 +131,8 @@ LmsApplication::LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnecti } } -LmsApplication::~LmsApplication() +void +LmsApplication::finalize() { LmsApplicationInfo info = LmsApplicationInfo::fromEnvironment(environment()); @@ -141,6 +142,8 @@ LmsApplication::~LmsApplication() }); getApplicationGroup().leave(); + + preQuit().emit(); } std::unique_ptr @@ -456,8 +459,11 @@ LmsApplication::createHome() _groupEvents.appOpen.connect([=] (LmsApplicationInfo info) { // Only one active session by user - setConfirmCloseMessage(""); - quit(Wt::WString::tr("Lms.quit-other-session")); + if (!LmsApp->getUser()->isDemo()) + { + setConfirmCloseMessage(""); + quit(Wt::WString::tr("Lms.quit-other-session")); + } }); _groupEvents.appClosed.connect([=] (LmsApplicationInfo info) diff --git a/src/ui/LmsApplication.hpp b/src/ui/LmsApplication.hpp index 4bdd04bf..21d2eaaf 100644 --- a/src/ui/LmsApplication.hpp +++ b/src/ui/LmsApplication.hpp @@ -48,7 +48,6 @@ class LmsApplication : public Wt::WApplication { public: LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner); - ~LmsApplication(); static std::unique_ptr create(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner); @@ -77,6 +76,9 @@ class LmsApplication : public Wt::WApplication static std::unique_ptr createReleaseAnchor(Database::Release::pointer release, bool addText = true); static std::unique_ptr createCluster(Database::Cluster::pointer cluster, bool canDelete = false); + // Signal emitted just before the session ends (user may already be logged out) + Wt::Signal<>& preQuit() { return _preQuit; } + private: LmsApplicationGroup& getApplicationGroup(); @@ -84,9 +86,11 @@ class LmsApplication : public Wt::WApplication // Events void handleAuthEvent(); void notify(const Wt::WEvent& event) override; + void finalize() override; void createHome(); + Wt::Signal<> _preQuit; Database::Handler _db; LmsApplicationGroupContainer& _appGroups; GroupEvents _groupEvents; diff --git a/src/ui/PlayQueueView.cpp b/src/ui/PlayQueueView.cpp index d337ddfe..b8c93d2e 100644 --- a/src/ui/PlayQueueView.cpp +++ b/src/ui/PlayQueueView.cpp @@ -33,6 +33,7 @@ #include "LmsApplication.hpp" + namespace UserInterface { PlayQueue::PlayQueue() @@ -50,15 +51,8 @@ PlayQueue::PlayQueue() Wt::WText* shuffleBtn = bindNew("shuffle-btn", Wt::WString::tr("Lms.PlayQueue.shuffle"), Wt::TextFormat::XHTML); _radioMode = bindNew("radio-mode", Wt::WString::tr("Lms.PlayQueue.radio-mode")); - _nbTracks = bindNew("nb-tracks"); - { - Wt::Dbo::Transaction transaction (LmsApp->getDboSession()); - - _trackPos = LmsApp->getUser()->getCurPlayingTrackPos(); - } - clearBtn->clicked().connect([=] { clearTracks(); @@ -80,6 +74,20 @@ PlayQueue::PlayQueue() addSome(); }); + LmsApp->preQuit().connect([=] + { + if (_playlistId) + { + LMS_LOG(UI, DEBUG) << "Removing playlist id " << *_playlistId; + + Wt::Dbo::Transaction transaction(LmsApp->getDboSession()); + + auto playlist = Database::Playlist::getById(LmsApp->getDboSession(), *_playlistId); + if (playlist) + playlist.remove(); + } + }); + updateInfo(); addSome(); } @@ -88,8 +96,22 @@ Database::Playlist::pointer PlayQueue::getPlaylist() { static const std::string currentPlayQueueName = "__current__playqueue__"; + Database::Playlist::pointer res; - Database::Playlist::pointer res = Database::Playlist::get(LmsApp->getDboSession(), currentPlayQueueName, LmsApp->getUser()); + if (LmsApp->getUser()->isDemo()) + { + if (!_playlistId) + { + res = Database::Playlist::create(LmsApp->getDboSession(), currentPlayQueueName, false, LmsApp->getUser()); + LmsApp->getDboSession().flush(); + _playlistId = res.id(); + return res; + } + + return Database::Playlist::getById(LmsApp->getDboSession(), *_playlistId); + } + + res = Database::Playlist::get(LmsApp->getDboSession(), currentPlayQueueName, LmsApp->getUser()); if (!res) res = Database::Playlist::create(LmsApp->getDboSession(), currentPlayQueueName, false, LmsApp->getUser()); diff --git a/src/ui/PlayQueueView.hpp b/src/ui/PlayQueueView.hpp index 8457eabb..75210d23 100644 --- a/src/ui/PlayQueueView.hpp +++ b/src/ui/PlayQueueView.hpp @@ -66,6 +66,7 @@ class PlayQueue : public Wt::WTemplate void play(std::size_t pos); void stop(); + boost::optional _playlistId; Wt::WCheckBox* _radioMode; Wt::WContainerWidget* _entriesContainer; Wt::WTemplate* _showMore;