Removed some global using namespace (not that useful + problems with blobs)
This commit is contained in:
+26
-28
@@ -87,8 +87,6 @@ namespace lms::ui
|
|||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
class SettingsModel : public Wt::WFormModel
|
class SettingsModel : public Wt::WFormModel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -192,7 +190,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
||||||
|
|
||||||
User::pointer user{ LmsApp->getUser() };
|
db::User::pointer user{ LmsApp->getUser() };
|
||||||
|
|
||||||
{
|
{
|
||||||
const auto artistReleaseSortMethodRow{ _artistReleaseSortMethodModel->getRowFromString(valueText(ArtistReleaseSortMethodField)) };
|
const auto artistReleaseSortMethodRow{ _artistReleaseSortMethodModel->getRowFromString(valueText(ArtistReleaseSortMethodField)) };
|
||||||
@@ -307,7 +305,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const User::pointer user{ LmsApp->getUser() };
|
const db::User::pointer user{ LmsApp->getUser() };
|
||||||
|
|
||||||
// UI
|
// UI
|
||||||
{
|
{
|
||||||
@@ -396,7 +394,7 @@ namespace lms::ui
|
|||||||
setValue(ListenBrainzTokenField, Wt::WString::fromUTF8(std::string{ listenBrainzToken->getAsString() }));
|
setValue(ListenBrainzTokenField, Wt::WString::fromUTF8(std::string{ listenBrainzToken->getAsString() }));
|
||||||
|
|
||||||
{
|
{
|
||||||
const bool usesListenBrainz{ user->getScrobblingBackend() == ScrobblingBackend::ListenBrainz || user->getFeedbackBackend() == FeedbackBackend::ListenBrainz };
|
const bool usesListenBrainz{ user->getScrobblingBackend() == db::ScrobblingBackend::ListenBrainz || user->getFeedbackBackend() == db::FeedbackBackend::ListenBrainz };
|
||||||
setReadOnly(SettingsModel::ListenBrainzTokenField, !usesListenBrainz);
|
setReadOnly(SettingsModel::ListenBrainzTokenField, !usesListenBrainz);
|
||||||
validator(SettingsModel::ListenBrainzTokenField)->setMandatory(usesListenBrainz);
|
validator(SettingsModel::ListenBrainzTokenField)->setMandatory(usesListenBrainz);
|
||||||
}
|
}
|
||||||
@@ -472,17 +470,17 @@ namespace lms::ui
|
|||||||
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcoding-mode.never"), MediaPlayer::Settings::Transcoding::Mode::Never);
|
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcoding-mode.never"), MediaPlayer::Settings::Transcoding::Mode::Never);
|
||||||
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcoding-mode.if-format-not-supported"), MediaPlayer::Settings::Transcoding::Mode::IfFormatNotSupported);
|
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcoding-mode.if-format-not-supported"), MediaPlayer::Settings::Transcoding::Mode::IfFormatNotSupported);
|
||||||
|
|
||||||
_transcodingOutputBitrateModel = std::make_shared<ValueStringModel<Bitrate>>();
|
_transcodingOutputBitrateModel = std::make_shared<ValueStringModel<db::Bitrate>>();
|
||||||
visitAllowedAudioBitrates([&](const Bitrate bitrate) {
|
db::visitAllowedAudioBitrates([&](const db::Bitrate bitrate) {
|
||||||
_transcodingOutputBitrateModel->add(Wt::WString::fromUTF8(std::to_string(bitrate / 1000)), bitrate);
|
_transcodingOutputBitrateModel->add(Wt::WString::fromUTF8(std::to_string(bitrate / 1000)), bitrate);
|
||||||
});
|
});
|
||||||
|
|
||||||
_transcodingOutputFormatModel = std::make_shared<ValueStringModel<TranscodingOutputFormat>>();
|
_transcodingOutputFormatModel = std::make_shared<ValueStringModel<db::TranscodingOutputFormat>>();
|
||||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.mp3"), TranscodingOutputFormat::MP3);
|
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.mp3"), db::TranscodingOutputFormat::MP3);
|
||||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.ogg_opus"), TranscodingOutputFormat::OGG_OPUS);
|
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.ogg_opus"), db::TranscodingOutputFormat::OGG_OPUS);
|
||||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.matroska_opus"), TranscodingOutputFormat::MATROSKA_OPUS);
|
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.matroska_opus"), db::TranscodingOutputFormat::MATROSKA_OPUS);
|
||||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.ogg_vorbis"), TranscodingOutputFormat::OGG_VORBIS);
|
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.ogg_vorbis"), db::TranscodingOutputFormat::OGG_VORBIS);
|
||||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.webm_vorbis"), TranscodingOutputFormat::WEBM_VORBIS);
|
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.webm_vorbis"), db::TranscodingOutputFormat::WEBM_VORBIS);
|
||||||
|
|
||||||
_replayGainModeModel = std::make_shared<ReplayGainModeModel>();
|
_replayGainModeModel = std::make_shared<ReplayGainModeModel>();
|
||||||
_replayGainModeModel->add(Wt::WString::tr("Lms.Settings.replaygain-mode.none"), MediaPlayer::Settings::ReplayGain::Mode::None);
|
_replayGainModeModel->add(Wt::WString::tr("Lms.Settings.replaygain-mode.none"), MediaPlayer::Settings::ReplayGain::Mode::None);
|
||||||
@@ -490,18 +488,18 @@ namespace lms::ui
|
|||||||
_replayGainModeModel->add(Wt::WString::tr("Lms.Settings.replaygain-mode.track"), MediaPlayer::Settings::ReplayGain::Mode::Track);
|
_replayGainModeModel->add(Wt::WString::tr("Lms.Settings.replaygain-mode.track"), MediaPlayer::Settings::ReplayGain::Mode::Track);
|
||||||
_replayGainModeModel->add(Wt::WString::tr("Lms.Settings.replaygain-mode.release"), MediaPlayer::Settings::ReplayGain::Mode::Release);
|
_replayGainModeModel->add(Wt::WString::tr("Lms.Settings.replaygain-mode.release"), MediaPlayer::Settings::ReplayGain::Mode::Release);
|
||||||
|
|
||||||
_subsonicArtistListModeModel = std::make_shared<ValueStringModel<SubsonicArtistListMode>>();
|
_subsonicArtistListModeModel = std::make_shared<ValueStringModel<db::SubsonicArtistListMode>>();
|
||||||
_subsonicArtistListModeModel->add(Wt::WString::tr("Lms.Settings.subsonic-artist-list-mode.all-artists"), SubsonicArtistListMode::AllArtists);
|
_subsonicArtistListModeModel->add(Wt::WString::tr("Lms.Settings.subsonic-artist-list-mode.all-artists"), db::SubsonicArtistListMode::AllArtists);
|
||||||
_subsonicArtistListModeModel->add(Wt::WString::tr("Lms.Settings.subsonic-artist-list-mode.release-artists"), SubsonicArtistListMode::ReleaseArtists);
|
_subsonicArtistListModeModel->add(Wt::WString::tr("Lms.Settings.subsonic-artist-list-mode.release-artists"), db::SubsonicArtistListMode::ReleaseArtists);
|
||||||
_subsonicArtistListModeModel->add(Wt::WString::tr("Lms.Settings.subsonic-artist-list-mode.track-artists"), SubsonicArtistListMode::TrackArtists);
|
_subsonicArtistListModeModel->add(Wt::WString::tr("Lms.Settings.subsonic-artist-list-mode.track-artists"), db::SubsonicArtistListMode::TrackArtists);
|
||||||
|
|
||||||
_feedbackBackendModel = std::make_shared<ValueStringModel<FeedbackBackend>>();
|
_feedbackBackendModel = std::make_shared<ValueStringModel<db::FeedbackBackend>>();
|
||||||
_feedbackBackendModel->add(Wt::WString::tr("Lms.Settings.backend.internal"), FeedbackBackend::Internal);
|
_feedbackBackendModel->add(Wt::WString::tr("Lms.Settings.backend.internal"), db::FeedbackBackend::Internal);
|
||||||
_feedbackBackendModel->add(Wt::WString::tr("Lms.Settings.backend.listenbrainz"), FeedbackBackend::ListenBrainz);
|
_feedbackBackendModel->add(Wt::WString::tr("Lms.Settings.backend.listenbrainz"), db::FeedbackBackend::ListenBrainz);
|
||||||
|
|
||||||
_scrobblingBackendModel = std::make_shared<ValueStringModel<ScrobblingBackend>>();
|
_scrobblingBackendModel = std::make_shared<ValueStringModel<db::ScrobblingBackend>>();
|
||||||
_scrobblingBackendModel->add(Wt::WString::tr("Lms.Settings.backend.internal"), ScrobblingBackend::Internal);
|
_scrobblingBackendModel->add(Wt::WString::tr("Lms.Settings.backend.internal"), db::ScrobblingBackend::Internal);
|
||||||
_scrobblingBackendModel->add(Wt::WString::tr("Lms.Settings.backend.listenbrainz"), ScrobblingBackend::ListenBrainz);
|
_scrobblingBackendModel->add(Wt::WString::tr("Lms.Settings.backend.listenbrainz"), db::ScrobblingBackend::ListenBrainz);
|
||||||
}
|
}
|
||||||
|
|
||||||
auth::IPasswordService* _authPasswordService{};
|
auth::IPasswordService* _authPasswordService{};
|
||||||
@@ -512,10 +510,10 @@ namespace lms::ui
|
|||||||
std::shared_ptr<ArtistReleaseSortMethodModel> _artistReleaseSortMethodModel;
|
std::shared_ptr<ArtistReleaseSortMethodModel> _artistReleaseSortMethodModel;
|
||||||
std::shared_ptr<ArtistRelationshipsModel> _artistRelationshipsModel;
|
std::shared_ptr<ArtistRelationshipsModel> _artistRelationshipsModel;
|
||||||
std::shared_ptr<TranscodingModeModel> _transcodingModeModeModel;
|
std::shared_ptr<TranscodingModeModel> _transcodingModeModeModel;
|
||||||
std::shared_ptr<ValueStringModel<Bitrate>> _transcodingOutputBitrateModel;
|
std::shared_ptr<ValueStringModel<db::Bitrate>> _transcodingOutputBitrateModel;
|
||||||
std::shared_ptr<ValueStringModel<TranscodingOutputFormat>> _transcodingOutputFormatModel;
|
std::shared_ptr<ValueStringModel<db::TranscodingOutputFormat>> _transcodingOutputFormatModel;
|
||||||
std::shared_ptr<ReplayGainModeModel> _replayGainModeModel;
|
std::shared_ptr<ReplayGainModeModel> _replayGainModeModel;
|
||||||
std::shared_ptr<ValueStringModel<SubsonicArtistListMode>> _subsonicArtistListModeModel;
|
std::shared_ptr<ValueStringModel<db::SubsonicArtistListMode>> _subsonicArtistListModeModel;
|
||||||
std::shared_ptr<FeedbackBackendModel> _feedbackBackendModel;
|
std::shared_ptr<FeedbackBackendModel> _feedbackBackendModel;
|
||||||
std::shared_ptr<ScrobblingBackendModel> _scrobblingBackendModel;
|
std::shared_ptr<ScrobblingBackendModel> _scrobblingBackendModel;
|
||||||
};
|
};
|
||||||
@@ -740,8 +738,8 @@ namespace lms::ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto updateListenBrainzTokenField{ [=] {
|
auto updateListenBrainzTokenField{ [=] {
|
||||||
const bool enable{ model->getFeedbackBackendModel()->getValue(feedbackBackendRaw->currentIndex()) == FeedbackBackend::ListenBrainz
|
const bool enable{ model->getFeedbackBackendModel()->getValue(feedbackBackendRaw->currentIndex()) == db::FeedbackBackend::ListenBrainz
|
||||||
|| model->getScrobblingBackendModel()->getValue(scrobblingBackendRaw->currentIndex()) == ScrobblingBackend::ListenBrainz };
|
|| model->getScrobblingBackendModel()->getValue(scrobblingBackendRaw->currentIndex()) == db::ScrobblingBackend::ListenBrainz };
|
||||||
|
|
||||||
model->setReadOnly(SettingsModel::ListenBrainzTokenField, !enable);
|
model->setReadOnly(SettingsModel::ListenBrainzTokenField, !enable);
|
||||||
model->validator(SettingsModel::ListenBrainzTokenField)->setMandatory(enable);
|
model->validator(SettingsModel::ListenBrainzTokenField)->setMandatory(enable);
|
||||||
|
|||||||
@@ -83,8 +83,6 @@ namespace lms::ui
|
|||||||
|
|
||||||
void MediaLibrariesView::showDeleteLibraryModal(db::MediaLibraryId mediaLibraryId, Wt::WTemplate* libraryEntry)
|
void MediaLibrariesView::showDeleteLibraryModal(db::MediaLibraryId mediaLibraryId, Wt::WTemplate* libraryEntry)
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
auto modal{ std::make_unique<Wt::WTemplate>(Wt::WString::tr("Lms.Admin.MediaLibraries.template.delete-library")) };
|
auto modal{ std::make_unique<Wt::WTemplate>(Wt::WString::tr("Lms.Admin.MediaLibraries.template.delete-library")) };
|
||||||
modal->addFunction("tr", &Wt::WTemplate::Functions::tr);
|
modal->addFunction("tr", &Wt::WTemplate::Functions::tr);
|
||||||
Wt::WWidget* modalPtr{ modal.get() };
|
Wt::WWidget* modalPtr{ modal.get() };
|
||||||
@@ -94,7 +92,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
||||||
|
|
||||||
db::MediaLibrary::pointer mediaLibrary{ MediaLibrary::find(LmsApp->getDbSession(), mediaLibraryId) };
|
db::MediaLibrary::pointer mediaLibrary{ db::MediaLibrary::find(LmsApp->getDbSession(), mediaLibraryId) };
|
||||||
if (mediaLibrary)
|
if (mediaLibrary)
|
||||||
mediaLibrary.remove();
|
mediaLibrary.remove();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,14 +33,12 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
class LibraryNameValidator : public Wt::WValidator
|
class LibraryNameValidator : public Wt::WValidator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LibraryNameValidator(MediaLibraryId libraryId)
|
LibraryNameValidator(db::MediaLibraryId libraryId)
|
||||||
: _libraryId{ libraryId } {}
|
: _libraryId{ libraryId } {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -66,13 +64,13 @@ namespace lms::ui
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MediaLibraryId _libraryId;
|
const db::MediaLibraryId _libraryId;
|
||||||
};
|
};
|
||||||
|
|
||||||
class LibraryRootPathValidator : public Wt::WValidator
|
class LibraryRootPathValidator : public Wt::WValidator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LibraryRootPathValidator(MediaLibraryId libraryId)
|
LibraryRootPathValidator(db::MediaLibraryId libraryId)
|
||||||
: _libraryId{ libraryId } {}
|
: _libraryId{ libraryId } {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -115,7 +113,7 @@ namespace lms::ui
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MediaLibraryId _libraryId;
|
const db::MediaLibraryId _libraryId;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MediaLibraryModel : public Wt::WFormModel
|
class MediaLibraryModel : public Wt::WFormModel
|
||||||
@@ -124,7 +122,7 @@ namespace lms::ui
|
|||||||
static inline constexpr Field NameField{ "name" };
|
static inline constexpr Field NameField{ "name" };
|
||||||
static inline constexpr Field DirectoryField{ "directory" };
|
static inline constexpr Field DirectoryField{ "directory" };
|
||||||
|
|
||||||
MediaLibraryModel(MediaLibraryId libraryId)
|
MediaLibraryModel(db::MediaLibraryId libraryId)
|
||||||
: _libraryId{ libraryId }
|
: _libraryId{ libraryId }
|
||||||
{
|
{
|
||||||
addField(NameField);
|
addField(NameField);
|
||||||
@@ -146,7 +144,7 @@ namespace lms::ui
|
|||||||
loadData();
|
loadData();
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaLibraryId saveData()
|
db::MediaLibraryId saveData()
|
||||||
{
|
{
|
||||||
auto& session{ LmsApp->getDbSession() };
|
auto& session{ LmsApp->getDbSession() };
|
||||||
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
||||||
@@ -154,10 +152,10 @@ namespace lms::ui
|
|||||||
std::string name{ valueText(NameField).toUTF8() };
|
std::string name{ valueText(NameField).toUTF8() };
|
||||||
std::string path{ valueText(DirectoryField).toUTF8() };
|
std::string path{ valueText(DirectoryField).toUTF8() };
|
||||||
|
|
||||||
MediaLibrary::pointer library;
|
db::MediaLibrary::pointer library;
|
||||||
if (_libraryId.isValid())
|
if (_libraryId.isValid())
|
||||||
{
|
{
|
||||||
library = MediaLibrary::find(session, _libraryId);
|
library = db::MediaLibrary::find(session, _libraryId);
|
||||||
if (library)
|
if (library)
|
||||||
{
|
{
|
||||||
library.modify()->setName(name);
|
library.modify()->setName(name);
|
||||||
@@ -166,7 +164,7 @@ namespace lms::ui
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
library = session.create<MediaLibrary>(name, path);
|
library = session.create<db::MediaLibrary>(name, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
return library->getId();
|
return library->getId();
|
||||||
@@ -178,17 +176,17 @@ namespace lms::ui
|
|||||||
auto& session{ LmsApp->getDbSession() };
|
auto& session{ LmsApp->getDbSession() };
|
||||||
auto transaction{ session.createReadTransaction() };
|
auto transaction{ session.createReadTransaction() };
|
||||||
|
|
||||||
const MediaLibrary::pointer library{ MediaLibrary::find(session, _libraryId) };
|
const db::MediaLibrary::pointer library{ db::MediaLibrary::find(session, _libraryId) };
|
||||||
|
|
||||||
setValue(NameField, std::string{ library->getName() });
|
setValue(NameField, std::string{ library->getName() });
|
||||||
setValue(DirectoryField, library->getPath().string());
|
setValue(DirectoryField, library->getPath().string());
|
||||||
}
|
}
|
||||||
|
|
||||||
const MediaLibraryId _libraryId;
|
const db::MediaLibraryId _libraryId;
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
MediaLibraryModal::MediaLibraryModal(MediaLibraryId mediaLibraryId)
|
MediaLibraryModal::MediaLibraryModal(db::MediaLibraryId mediaLibraryId)
|
||||||
: Wt::WTemplateFormView{ Wt::WString::tr("Lms.Admin.MediaLibrary.template") }
|
: Wt::WTemplateFormView{ Wt::WString::tr("Lms.Admin.MediaLibrary.template") }
|
||||||
{
|
{
|
||||||
auto model{ std::make_shared<MediaLibraryModel>(mediaLibraryId) };
|
auto model{ std::make_shared<MediaLibraryModel>(mediaLibraryId) };
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace lms::ui
|
|||||||
class MediaLibraryModal : public Wt::WTemplateFormView
|
class MediaLibraryModal : public Wt::WTemplateFormView
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MediaLibraryModal(db::MediaLibraryId mediaLibaryId);
|
MediaLibraryModal(db::MediaLibraryId mediaLibraryId);
|
||||||
|
|
||||||
Wt::Signal<db::MediaLibraryId>& saved() { return _saved; };
|
Wt::Signal<db::MediaLibraryId>& saved() { return _saved; };
|
||||||
Wt::Signal<>& cancelled() { return _cancelled; }
|
Wt::Signal<>& cancelled() { return _cancelled; }
|
||||||
|
|||||||
@@ -42,8 +42,6 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
class TagDelimitersValidator : public Wt::WValidator
|
class TagDelimitersValidator : public Wt::WValidator
|
||||||
@@ -75,7 +73,7 @@ namespace lms::ui
|
|||||||
static inline constexpr Field ArtistImageFallbackToReleaseField{ "artist-image-fallback-to-release" };
|
static inline constexpr Field ArtistImageFallbackToReleaseField{ "artist-image-fallback-to-release" };
|
||||||
static inline constexpr Field ArtistsToNotSplitField{ "artists-to-not-split" };
|
static inline constexpr Field ArtistsToNotSplitField{ "artists-to-not-split" };
|
||||||
|
|
||||||
using UpdatePeriodModel = ValueStringModel<ScanSettings::UpdatePeriod>;
|
using UpdatePeriodModel = ValueStringModel<db::ScanSettings::UpdatePeriod>;
|
||||||
|
|
||||||
DatabaseSettingsModel()
|
DatabaseSettingsModel()
|
||||||
{
|
{
|
||||||
@@ -105,7 +103,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const ScanSettings::pointer scanSettings{ ScanSettings::find(LmsApp->getDbSession()) };
|
const db::ScanSettings::pointer scanSettings{ db::ScanSettings::find(LmsApp->getDbSession()) };
|
||||||
|
|
||||||
auto periodRow{ _updatePeriodModel->getRowFromValue(scanSettings->getUpdatePeriod()) };
|
auto periodRow{ _updatePeriodModel->getRowFromValue(scanSettings->getUpdatePeriod()) };
|
||||||
if (periodRow)
|
if (periodRow)
|
||||||
@@ -115,8 +113,8 @@ namespace lms::ui
|
|||||||
if (startTimeRow)
|
if (startTimeRow)
|
||||||
setValue(UpdateStartTimeField, _updateStartTimeModel->getString(*startTimeRow));
|
setValue(UpdateStartTimeField, _updateStartTimeModel->getString(*startTimeRow));
|
||||||
|
|
||||||
if (scanSettings->getUpdatePeriod() == ScanSettings::UpdatePeriod::Hourly
|
if (scanSettings->getUpdatePeriod() == db::ScanSettings::UpdatePeriod::Hourly
|
||||||
|| scanSettings->getUpdatePeriod() == ScanSettings::UpdatePeriod::Never)
|
|| scanSettings->getUpdatePeriod() == db::ScanSettings::UpdatePeriod::Never)
|
||||||
{
|
{
|
||||||
setReadOnly(UpdateStartTimeField, true);
|
setReadOnly(UpdateStartTimeField, true);
|
||||||
}
|
}
|
||||||
@@ -147,7 +145,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
||||||
|
|
||||||
ScanSettings::pointer scanSettings{ ScanSettings::find(LmsApp->getDbSession()) };
|
db::ScanSettings::pointer scanSettings{ db::ScanSettings::find(LmsApp->getDbSession()) };
|
||||||
|
|
||||||
{
|
{
|
||||||
const auto updatePeriodRow{ _updatePeriodModel->getRowFromString(valueText(UpdatePeriodField)) };
|
const auto updatePeriodRow{ _updatePeriodModel->getRowFromString(valueText(UpdatePeriodField)) };
|
||||||
@@ -197,12 +195,12 @@ namespace lms::ui
|
|||||||
void
|
void
|
||||||
initializeModels()
|
initializeModels()
|
||||||
{
|
{
|
||||||
_updatePeriodModel = std::make_shared<ValueStringModel<ScanSettings::UpdatePeriod>>();
|
_updatePeriodModel = std::make_shared<ValueStringModel<db::ScanSettings::UpdatePeriod>>();
|
||||||
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.never"), ScanSettings::UpdatePeriod::Never);
|
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.never"), db::ScanSettings::UpdatePeriod::Never);
|
||||||
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.hourly"), ScanSettings::UpdatePeriod::Hourly);
|
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.hourly"), db::ScanSettings::UpdatePeriod::Hourly);
|
||||||
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.daily"), ScanSettings::UpdatePeriod::Daily);
|
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.daily"), db::ScanSettings::UpdatePeriod::Daily);
|
||||||
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.weekly"), ScanSettings::UpdatePeriod::Weekly);
|
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.weekly"), db::ScanSettings::UpdatePeriod::Weekly);
|
||||||
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.monthly"), ScanSettings::UpdatePeriod::Monthly);
|
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.monthly"), db::ScanSettings::UpdatePeriod::Monthly);
|
||||||
|
|
||||||
_updateStartTimeModel = std::make_shared<ValueStringModel<Wt::WTime>>();
|
_updateStartTimeModel = std::make_shared<ValueStringModel<Wt::WTime>>();
|
||||||
for (std::size_t i = 0; i < 24; ++i)
|
for (std::size_t i = 0; i < 24; ++i)
|
||||||
@@ -211,14 +209,14 @@ namespace lms::ui
|
|||||||
_updateStartTimeModel->add(time.toString(), time);
|
_updateStartTimeModel->add(time.toString(), time);
|
||||||
}
|
}
|
||||||
|
|
||||||
_similarityEngineTypeModel = std::make_shared<ValueStringModel<ScanSettings::SimilarityEngineType>>();
|
_similarityEngineTypeModel = std::make_shared<ValueStringModel<db::ScanSettings::SimilarityEngineType>>();
|
||||||
_similarityEngineTypeModel->add(Wt::WString::tr("Lms.Admin.Database.similarity-engine-type.clusters"), ScanSettings::SimilarityEngineType::Clusters);
|
_similarityEngineTypeModel->add(Wt::WString::tr("Lms.Admin.Database.similarity-engine-type.clusters"), db::ScanSettings::SimilarityEngineType::Clusters);
|
||||||
_similarityEngineTypeModel->add(Wt::WString::tr("Lms.Admin.Database.similarity-engine-type.none"), ScanSettings::SimilarityEngineType::None);
|
_similarityEngineTypeModel->add(Wt::WString::tr("Lms.Admin.Database.similarity-engine-type.none"), db::ScanSettings::SimilarityEngineType::None);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<UpdatePeriodModel> _updatePeriodModel;
|
std::shared_ptr<UpdatePeriodModel> _updatePeriodModel;
|
||||||
std::shared_ptr<ValueStringModel<Wt::WTime>> _updateStartTimeModel;
|
std::shared_ptr<ValueStringModel<Wt::WTime>> _updateStartTimeModel;
|
||||||
std::shared_ptr<ValueStringModel<ScanSettings::SimilarityEngineType>> _similarityEngineTypeModel;
|
std::shared_ptr<ValueStringModel<db::ScanSettings::SimilarityEngineType>> _similarityEngineTypeModel;
|
||||||
};
|
};
|
||||||
|
|
||||||
class LineEditEntryModel : public Wt::WFormModel
|
class LineEditEntryModel : public Wt::WFormModel
|
||||||
@@ -362,8 +360,8 @@ namespace lms::ui
|
|||||||
auto updatePeriod{ std::make_unique<Wt::WComboBox>() };
|
auto updatePeriod{ std::make_unique<Wt::WComboBox>() };
|
||||||
updatePeriod->setModel(model->updatePeriodModel());
|
updatePeriod->setModel(model->updatePeriodModel());
|
||||||
updatePeriod->activated().connect([=](int row) {
|
updatePeriod->activated().connect([=](int row) {
|
||||||
const ScanSettings::UpdatePeriod period{ model->updatePeriodModel()->getValue(row) };
|
const db::ScanSettings::UpdatePeriod period{ model->updatePeriodModel()->getValue(row) };
|
||||||
model->setReadOnly(DatabaseSettingsModel::UpdateStartTimeField, period == ScanSettings::UpdatePeriod::Hourly || period == ScanSettings::UpdatePeriod::Never);
|
model->setReadOnly(DatabaseSettingsModel::UpdateStartTimeField, period == db::ScanSettings::UpdatePeriod::Hourly || period == db::ScanSettings::UpdatePeriod::Never);
|
||||||
t->updateModel(model.get());
|
t->updateModel(model.get());
|
||||||
t->updateView(model.get());
|
t->updateView(model.get());
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -42,8 +42,6 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
class UserModel : public Wt::WFormModel
|
class UserModel : public Wt::WFormModel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -51,7 +49,7 @@ namespace lms::ui
|
|||||||
static inline const Field PasswordField{ "password" };
|
static inline const Field PasswordField{ "password" };
|
||||||
static inline const Field DemoField{ "demo" };
|
static inline const Field DemoField{ "demo" };
|
||||||
|
|
||||||
UserModel(std::optional<UserId> userId, auth::IPasswordService* authPasswordService, auth::IAuthTokenService& authTokenService)
|
UserModel(std::optional<db::UserId> userId, auth::IPasswordService* authPasswordService, auth::IAuthTokenService& authTokenService)
|
||||||
: _userId{ userId }
|
: _userId{ userId }
|
||||||
, _authPasswordService{ authPasswordService }
|
, _authPasswordService{ authPasswordService }
|
||||||
, _authTokenService{ authTokenService }
|
, _authTokenService{ authTokenService }
|
||||||
@@ -81,7 +79,7 @@ namespace lms::ui
|
|||||||
if (_userId)
|
if (_userId)
|
||||||
{
|
{
|
||||||
// Update user
|
// Update user
|
||||||
User::pointer user{ User::find(LmsApp->getDbSession(), *_userId) };
|
db::User::pointer user{ db::User::find(LmsApp->getDbSession(), *_userId) };
|
||||||
if (!user)
|
if (!user)
|
||||||
throw UserNotFoundException{};
|
throw UserNotFoundException{};
|
||||||
|
|
||||||
@@ -94,16 +92,16 @@ namespace lms::ui
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Check races with other endpoints (subsonic API...)
|
// Check races with other endpoints (subsonic API...)
|
||||||
User::pointer user{ User::find(LmsApp->getDbSession(), valueText(LoginField).toUTF8()) };
|
db::User::pointer user{ db::User::find(LmsApp->getDbSession(), valueText(LoginField).toUTF8()) };
|
||||||
if (user)
|
if (user)
|
||||||
throw UserNotAllowedException{};
|
throw UserNotAllowedException{};
|
||||||
|
|
||||||
// Create user
|
// Create user
|
||||||
user = LmsApp->getDbSession().create<User>(valueText(LoginField).toUTF8());
|
user = LmsApp->getDbSession().create<db::User>(valueText(LoginField).toUTF8());
|
||||||
|
|
||||||
if (Wt::asNumber(value(DemoField)))
|
if (Wt::asNumber(value(DemoField)))
|
||||||
{
|
{
|
||||||
user.modify()->setType(UserType::DEMO);
|
user.modify()->setType(db::UserType::DEMO);
|
||||||
|
|
||||||
// For demo user, we create the subsonic API auth token now as we have no other mean to create it later
|
// For demo user, we create the subsonic API auth token now as we have no other mean to create it later
|
||||||
core::Service<auth::IAuthTokenService>::get()->createAuthToken("subsonic", user->getId(), core::UUID::generate().getAsString());
|
core::Service<auth::IAuthTokenService>::get()->createAuthToken("subsonic", user->getId(), core::UUID::generate().getAsString());
|
||||||
@@ -122,24 +120,24 @@ namespace lms::ui
|
|||||||
|
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const User::pointer user{ User::find(LmsApp->getDbSession(), *_userId) };
|
const db::User::pointer user{ db::User::find(LmsApp->getDbSession(), *_userId) };
|
||||||
if (!user)
|
if (!user)
|
||||||
throw UserNotFoundException{};
|
throw UserNotFoundException{};
|
||||||
if (user == LmsApp->getUser())
|
if (user == LmsApp->getUser())
|
||||||
throw UserNotAllowedException{};
|
throw UserNotAllowedException{};
|
||||||
}
|
}
|
||||||
|
|
||||||
UserType getUserType() const
|
db::UserType getUserType() const
|
||||||
{
|
{
|
||||||
if (_userId)
|
if (_userId)
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const User::pointer user{ User::find(LmsApp->getDbSession(), *_userId) };
|
const db::User::pointer user{ db::User::find(LmsApp->getDbSession(), *_userId) };
|
||||||
return user->getType();
|
return user->getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Wt::asNumber(value(DemoField)) ? UserType::DEMO : UserType::REGULAR;
|
return Wt::asNumber(value(DemoField)) ? db::UserType::DEMO : db::UserType::REGULAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string getLoginName() const
|
std::string getLoginName() const
|
||||||
@@ -148,7 +146,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const User::pointer user{ User::find(LmsApp->getDbSession(), *_userId) };
|
const db::User::pointer user{ db::User::find(LmsApp->getDbSession(), *_userId) };
|
||||||
return user->getLoginName();
|
return user->getLoginName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,7 +161,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const User::pointer user{ User::find(LmsApp->getDbSession(), valueText(LoginField).toUTF8()) };
|
const db::User::pointer user{ db::User::find(LmsApp->getDbSession(), valueText(LoginField).toUTF8()) };
|
||||||
if (user)
|
if (user)
|
||||||
error = Wt::WString::tr("Lms.Admin.User.user-already-exists");
|
error = Wt::WString::tr("Lms.Admin.User.user-already-exists");
|
||||||
}
|
}
|
||||||
@@ -171,7 +169,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
if (Wt::asNumber(value(DemoField)) && User::findDemoUser(LmsApp->getDbSession()))
|
if (Wt::asNumber(value(DemoField)) && db::User::findDemoUser(LmsApp->getDbSession()))
|
||||||
error = Wt::WString::tr("Lms.Admin.User.demo-account-already-exists");
|
error = Wt::WString::tr("Lms.Admin.User.demo-account-already-exists");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,7 +181,7 @@ namespace lms::ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<UserId> _userId;
|
std::optional<db::UserId> _userId;
|
||||||
auth::IPasswordService* _authPasswordService{};
|
auth::IPasswordService* _authPasswordService{};
|
||||||
auth::IAuthTokenService& _authTokenService;
|
auth::IAuthTokenService& _authTokenService;
|
||||||
};
|
};
|
||||||
@@ -202,7 +200,7 @@ namespace lms::ui
|
|||||||
if (!wApp->internalPathMatches("/admin/user"))
|
if (!wApp->internalPathMatches("/admin/user"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const std::optional<UserId> userId{ core::stringUtils::readAs<UserId::ValueType>(wApp->internalPathNextPart("/admin/user/")) };
|
const std::optional<db::UserId> userId{ core::stringUtils::readAs<db::UserId::ValueType>(wApp->internalPathNextPart("/admin/user/")) };
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
@@ -220,7 +218,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const User::pointer user{ User::find(LmsApp->getDbSession(), *userId) };
|
const db::User::pointer user{ db::User::find(LmsApp->getDbSession(), *userId) };
|
||||||
if (!user)
|
if (!user)
|
||||||
throw UserNotFoundException{};
|
throw UserNotFoundException{};
|
||||||
|
|
||||||
|
|||||||
@@ -23,19 +23,14 @@
|
|||||||
#include <Wt/WPushButton.h>
|
#include <Wt/WPushButton.h>
|
||||||
#include <Wt/WTemplate.h>
|
#include <Wt/WTemplate.h>
|
||||||
|
|
||||||
#include "core/ILogger.hpp"
|
|
||||||
#include "core/Service.hpp"
|
|
||||||
#include "database/Session.hpp"
|
#include "database/Session.hpp"
|
||||||
#include "database/objects/User.hpp"
|
#include "database/objects/User.hpp"
|
||||||
#include "services/auth/IPasswordService.hpp"
|
|
||||||
|
|
||||||
#include "LmsApplication.hpp"
|
#include "LmsApplication.hpp"
|
||||||
#include "ModalManager.hpp"
|
#include "ModalManager.hpp"
|
||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
UsersView::UsersView()
|
UsersView::UsersView()
|
||||||
: Wt::WTemplate{ Wt::WString::tr("Lms.Admin.Users.template") }
|
: Wt::WTemplate{ Wt::WString::tr("Lms.Admin.Users.template") }
|
||||||
{
|
{
|
||||||
@@ -69,9 +64,9 @@ namespace lms::ui
|
|||||||
|
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const UserId currentUserId{ LmsApp->getUserId() };
|
const db::UserId currentUserId{ LmsApp->getUserId() };
|
||||||
User::find(LmsApp->getDbSession(), User::FindParameters{}, [&](const User::pointer& user) {
|
db::User::find(LmsApp->getDbSession(), db::User::FindParameters{}, [&](const db::User::pointer& user) {
|
||||||
const UserId userId{ user->getId() };
|
const db::UserId userId{ user->getId() };
|
||||||
|
|
||||||
Wt::WTemplate* entry{ _container->addNew<Wt::WTemplate>(Wt::WString::tr("Lms.Admin.Users.template.entry")) };
|
Wt::WTemplate* entry{ _container->addNew<Wt::WTemplate>(Wt::WString::tr("Lms.Admin.Users.template.entry")) };
|
||||||
|
|
||||||
@@ -107,7 +102,7 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
auto transaction{ LmsApp->getDbSession().createWriteTransaction() };
|
||||||
|
|
||||||
User::pointer user{ User::find(LmsApp->getDbSession(), userId) };
|
db::User::pointer user{ db::User::find(LmsApp->getDbSession(), userId) };
|
||||||
if (user)
|
if (user)
|
||||||
user.remove();
|
user.remove();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,16 +32,14 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
db::RangeResults<db::ArtistId> ArtistCollector::get(std::optional<db::Range> requestedRange)
|
||||||
|
|
||||||
RangeResults<ArtistId> ArtistCollector::get(std::optional<db::Range> requestedRange)
|
|
||||||
{
|
{
|
||||||
feedback::IFeedbackService& feedbackService{ *core::Service<feedback::IFeedbackService>::get() };
|
feedback::IFeedbackService& feedbackService{ *core::Service<feedback::IFeedbackService>::get() };
|
||||||
scrobbling::IScrobblingService& scrobblingService{ *core::Service<scrobbling::IScrobblingService>::get() };
|
scrobbling::IScrobblingService& scrobblingService{ *core::Service<scrobbling::IScrobblingService>::get() };
|
||||||
|
|
||||||
const Range range{ getActualRange(requestedRange) };
|
const Range range{ getActualRange(requestedRange) };
|
||||||
|
|
||||||
RangeResults<ArtistId> artists;
|
db::RangeResults<db::ArtistId> artists;
|
||||||
|
|
||||||
switch (getMode())
|
switch (getMode())
|
||||||
{
|
{
|
||||||
@@ -56,7 +54,7 @@ namespace lms::ui
|
|||||||
params.setUser(LmsApp->getUserId());
|
params.setUser(LmsApp->getUserId());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setLinkType(_linkType);
|
params.setLinkType(_linkType);
|
||||||
params.setSortMethod(ArtistSortMethod::StarredDateDesc);
|
params.setSortMethod(db::ArtistSortMethod::StarredDateDesc);
|
||||||
params.setRange(range);
|
params.setRange(range);
|
||||||
artists = feedbackService.findStarredArtists(params);
|
artists = feedbackService.findStarredArtists(params);
|
||||||
break;
|
break;
|
||||||
@@ -90,48 +88,48 @@ namespace lms::ui
|
|||||||
|
|
||||||
case Mode::RecentlyAdded:
|
case Mode::RecentlyAdded:
|
||||||
{
|
{
|
||||||
Artist::FindParameters params;
|
db::Artist::FindParameters params;
|
||||||
params.setFilters(getDbFilters());
|
params.setFilters(getDbFilters());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setLinkType(_linkType);
|
params.setLinkType(_linkType);
|
||||||
params.setSortMethod(ArtistSortMethod::AddedDesc);
|
params.setSortMethod(db::ArtistSortMethod::AddedDesc);
|
||||||
params.setRange(range);
|
params.setRange(range);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
artists = Artist::findIds(LmsApp->getDbSession(), params);
|
artists = db::Artist::findIds(LmsApp->getDbSession(), params);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Mode::RecentlyModified:
|
case Mode::RecentlyModified:
|
||||||
{
|
{
|
||||||
Artist::FindParameters params;
|
db::Artist::FindParameters params;
|
||||||
params.setFilters(getDbFilters());
|
params.setFilters(getDbFilters());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setLinkType(_linkType);
|
params.setLinkType(_linkType);
|
||||||
params.setSortMethod(ArtistSortMethod::LastWrittenDesc);
|
params.setSortMethod(db::ArtistSortMethod::LastWrittenDesc);
|
||||||
params.setRange(range);
|
params.setRange(range);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
artists = Artist::findIds(LmsApp->getDbSession(), params);
|
artists = db::Artist::findIds(LmsApp->getDbSession(), params);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Mode::All:
|
case Mode::All:
|
||||||
{
|
{
|
||||||
Artist::FindParameters params;
|
db::Artist::FindParameters params;
|
||||||
params.setFilters(getDbFilters());
|
params.setFilters(getDbFilters());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setLinkType(_linkType);
|
params.setLinkType(_linkType);
|
||||||
params.setSortMethod(ArtistSortMethod::SortName);
|
params.setSortMethod(db::ArtistSortMethod::SortName);
|
||||||
params.setRange(range);
|
params.setRange(range);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
artists = Artist::findIds(LmsApp->getDbSession(), params);
|
artists = db::Artist::findIds(LmsApp->getDbSession(), params);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -143,22 +141,22 @@ namespace lms::ui
|
|||||||
return artists;
|
return artists;
|
||||||
}
|
}
|
||||||
|
|
||||||
RangeResults<db::ArtistId> ArtistCollector::getRandomArtists(Range range)
|
db::RangeResults<db::ArtistId> ArtistCollector::getRandomArtists(Range range)
|
||||||
{
|
{
|
||||||
assert(getMode() == Mode::Random);
|
assert(getMode() == Mode::Random);
|
||||||
|
|
||||||
if (!_randomArtists)
|
if (!_randomArtists)
|
||||||
{
|
{
|
||||||
Artist::FindParameters params;
|
db::Artist::FindParameters params;
|
||||||
params.setFilters(getDbFilters());
|
params.setFilters(getDbFilters());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setLinkType(_linkType);
|
params.setLinkType(_linkType);
|
||||||
params.setSortMethod(ArtistSortMethod::Random);
|
params.setSortMethod(db::ArtistSortMethod::Random);
|
||||||
params.setRange(Range{ 0, getMaxCount() });
|
params.setRange(db::Range{ 0, getMaxCount() });
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
_randomArtists = Artist::findIds(LmsApp->getDbSession(), params);
|
_randomArtists = db::Artist::findIds(LmsApp->getDbSession(), params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,11 +47,9 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
std::optional<ArtistId> extractArtistIdFromInternalPath()
|
std::optional<db::ArtistId> extractArtistIdFromInternalPath()
|
||||||
{
|
{
|
||||||
if (wApp->internalPathMatches("/artist/mbid/"))
|
if (wApp->internalPathMatches("/artist/mbid/"))
|
||||||
{
|
{
|
||||||
@@ -66,7 +64,7 @@ namespace lms::ui
|
|||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
return core::stringUtils::readAs<ArtistId::ValueType>(wApp->internalPathNextPart("/artist/"));
|
return core::stringUtils::readAs<db::ArtistId::ValueType>(wApp->internalPathNextPart("/artist/"));
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@@ -109,7 +107,7 @@ namespace lms::ui
|
|||||||
if (!artistId)
|
if (!artistId)
|
||||||
throw ArtistNotFoundException{};
|
throw ArtistNotFoundException{};
|
||||||
|
|
||||||
const auto similarArtistIds{ core::Service<recommendation::IRecommendationService>::get()->getSimilarArtists(*artistId, { TrackArtistLinkType::Artist, TrackArtistLinkType::ReleaseArtist }, 6) };
|
const auto similarArtistIds{ core::Service<recommendation::IRecommendationService>::get()->getSimilarArtists(*artistId, { db::TrackArtistLinkType::Artist, db::TrackArtistLinkType::ReleaseArtist }, 6) };
|
||||||
|
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
@@ -131,7 +129,7 @@ namespace lms::ui
|
|||||||
Wt::WContainerWidget* clusterContainers{ bindNew<Wt::WContainerWidget>("clusters") };
|
Wt::WContainerWidget* clusterContainers{ bindNew<Wt::WContainerWidget>("clusters") };
|
||||||
|
|
||||||
{
|
{
|
||||||
auto clusterTypes{ ClusterType::findIds(LmsApp->getDbSession()).results };
|
auto clusterTypes{ db::ClusterType::findIds(LmsApp->getDbSession()).results };
|
||||||
auto clusterGroups{ artist->getClusterGroups(clusterTypes, 3) };
|
auto clusterGroups{ artist->getClusterGroups(clusterTypes, 3) };
|
||||||
|
|
||||||
for (const auto& clusters : clusterGroups)
|
for (const auto& clusters : clusterGroups)
|
||||||
@@ -232,16 +230,16 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
_releaseContainers.clear();
|
_releaseContainers.clear();
|
||||||
|
|
||||||
Release::FindParameters params;
|
db::Release::FindParameters params;
|
||||||
params.setFilters(_filters.getDbFilters());
|
params.setFilters(_filters.getDbFilters());
|
||||||
params.setArtist(_artistId, { TrackArtistLinkType::ReleaseArtist }, {});
|
params.setArtist(_artistId, { db::TrackArtistLinkType::ReleaseArtist }, {});
|
||||||
params.setSortMethod(LmsApp->getUser()->getUIArtistReleaseSortMethod());
|
params.setSortMethod(LmsApp->getUser()->getUIArtistReleaseSortMethod());
|
||||||
|
|
||||||
const auto releases{ Release::findIds(LmsApp->getDbSession(), params) };
|
const auto releases{ db::Release::findIds(LmsApp->getDbSession(), params) };
|
||||||
if (!releases.results.empty())
|
if (!releases.results.empty())
|
||||||
{
|
{
|
||||||
// first pass: gather all ids and sort by release type
|
// first pass: gather all ids and sort by release type
|
||||||
for (const ReleaseId releaseId : releases.results)
|
for (const db::ReleaseId releaseId : releases.results)
|
||||||
{
|
{
|
||||||
const db::Release::pointer release{ db::Release::find(LmsApp->getDbSession(), releaseId) };
|
const db::Release::pointer release{ db::Release::find(LmsApp->getDbSession(), releaseId) };
|
||||||
|
|
||||||
@@ -274,27 +272,27 @@ namespace lms::ui
|
|||||||
|
|
||||||
void Artist::refreshAppearsOnReleases()
|
void Artist::refreshAppearsOnReleases()
|
||||||
{
|
{
|
||||||
constexpr core::EnumSet<TrackArtistLinkType> types{
|
constexpr core::EnumSet<db::TrackArtistLinkType> types{
|
||||||
TrackArtistLinkType::Artist,
|
db::TrackArtistLinkType::Artist,
|
||||||
TrackArtistLinkType::Arranger,
|
db::TrackArtistLinkType::Arranger,
|
||||||
TrackArtistLinkType::Composer,
|
db::TrackArtistLinkType::Composer,
|
||||||
TrackArtistLinkType::Conductor,
|
db::TrackArtistLinkType::Conductor,
|
||||||
TrackArtistLinkType::Lyricist,
|
db::TrackArtistLinkType::Lyricist,
|
||||||
TrackArtistLinkType::Mixer,
|
db::TrackArtistLinkType::Mixer,
|
||||||
TrackArtistLinkType::Performer,
|
db::TrackArtistLinkType::Performer,
|
||||||
TrackArtistLinkType::Producer,
|
db::TrackArtistLinkType::Producer,
|
||||||
TrackArtistLinkType::Remixer,
|
db::TrackArtistLinkType::Remixer,
|
||||||
TrackArtistLinkType::Writer,
|
db::TrackArtistLinkType::Writer,
|
||||||
};
|
};
|
||||||
|
|
||||||
_appearsOnReleaseContainer = {};
|
_appearsOnReleaseContainer = {};
|
||||||
|
|
||||||
Release::FindParameters params;
|
db::Release::FindParameters params;
|
||||||
params.setFilters(_filters.getDbFilters());
|
params.setFilters(_filters.getDbFilters());
|
||||||
params.setArtist(_artistId, types, { TrackArtistLinkType::ReleaseArtist });
|
params.setArtist(_artistId, types, { db::TrackArtistLinkType::ReleaseArtist });
|
||||||
params.setSortMethod(ReleaseSortMethod::OriginalDateDesc);
|
params.setSortMethod(db::ReleaseSortMethod::OriginalDateDesc);
|
||||||
|
|
||||||
const auto releases{ Release::findIds(LmsApp->getDbSession(), params) };
|
const auto releases{ db::Release::findIds(LmsApp->getDbSession(), params) };
|
||||||
if (!releases.results.empty())
|
if (!releases.results.empty())
|
||||||
{
|
{
|
||||||
Wt::WTemplate* releaseContainer{ bindNew<Wt::WTemplate>("appears-on-releases", Wt::WString::tr("Lms.Explore.Artist.template.release-container")) };
|
Wt::WTemplate* releaseContainer{ bindNew<Wt::WTemplate>("appears-on-releases", Wt::WString::tr("Lms.Explore.Artist.template.release-container")) };
|
||||||
@@ -323,7 +321,7 @@ namespace lms::ui
|
|||||||
setCondition("if-has-non-release-tracks", added);
|
setCondition("if-has-non-release-tracks", added);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Artist::refreshSimilarArtists(const std::vector<ArtistId>& similarArtistsId)
|
void Artist::refreshSimilarArtists(const std::vector<db::ArtistId>& similarArtistsId)
|
||||||
{
|
{
|
||||||
if (similarArtistsId.empty())
|
if (similarArtistsId.empty())
|
||||||
return;
|
return;
|
||||||
@@ -331,7 +329,7 @@ namespace lms::ui
|
|||||||
setCondition("if-has-similar-artists", true);
|
setCondition("if-has-similar-artists", true);
|
||||||
Wt::WContainerWidget* similarArtistsContainer{ bindNew<Wt::WContainerWidget>("similar-artists") };
|
Wt::WContainerWidget* similarArtistsContainer{ bindNew<Wt::WContainerWidget>("similar-artists") };
|
||||||
|
|
||||||
for (const ArtistId artistId : similarArtistsId)
|
for (const db::ArtistId artistId : similarArtistsId)
|
||||||
{
|
{
|
||||||
const db::Artist::pointer similarArtist{ db::Artist::find(LmsApp->getDbSession(), artistId) };
|
const db::Artist::pointer similarArtist{ db::Artist::find(LmsApp->getDbSession(), artistId) };
|
||||||
if (!similarArtist)
|
if (!similarArtist)
|
||||||
@@ -371,19 +369,19 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
bool areTracksAdded{};
|
bool areTracksAdded{};
|
||||||
|
|
||||||
const Range range{ static_cast<std::size_t>(_trackContainer->getCount()), _tracksBatchSize };
|
const db::Range range{ static_cast<std::size_t>(_trackContainer->getCount()), _tracksBatchSize };
|
||||||
|
|
||||||
Track::FindParameters params;
|
db::Track::FindParameters params;
|
||||||
params.setFilters(_filters.getDbFilters());
|
params.setFilters(_filters.getDbFilters());
|
||||||
params.setArtist(_artistId);
|
params.setArtist(_artistId);
|
||||||
params.setRange(range);
|
params.setRange(range);
|
||||||
params.setSortMethod(TrackSortMethod::Name);
|
params.setSortMethod(db::TrackSortMethod::Name);
|
||||||
params.setNonRelease(true);
|
params.setNonRelease(true);
|
||||||
|
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const auto tracks{ Track::find(LmsApp->getDbSession(), params) };
|
const auto tracks{ db::Track::find(LmsApp->getDbSession(), params) };
|
||||||
for (const Track::pointer& track : tracks.results)
|
for (const db::Track::pointer& track : tracks.results)
|
||||||
{
|
{
|
||||||
// TODO handle this with range
|
// TODO handle this with range
|
||||||
if (_trackContainer->getCount() == _tracksMaxCount)
|
if (_trackContainer->getCount() == _tracksMaxCount)
|
||||||
|
|||||||
@@ -108,7 +108,6 @@ namespace lms::ui
|
|||||||
|
|
||||||
std::vector<db::TrackId> getTrackListTracks(db::Session& session, db::TrackListId trackListId, const Filters& filters, std::size_t maxTrackCount)
|
std::vector<db::TrackId> getTrackListTracks(db::Session& session, db::TrackListId trackListId, const Filters& filters, std::size_t maxTrackCount)
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
assert(maxTrackCount);
|
assert(maxTrackCount);
|
||||||
|
|
||||||
auto transaction{ session.createReadTransaction() };
|
auto transaction{ session.createReadTransaction() };
|
||||||
@@ -117,7 +116,7 @@ namespace lms::ui
|
|||||||
params.setTrackList(trackListId);
|
params.setTrackList(trackListId);
|
||||||
params.setFilters(filters.getDbFilters());
|
params.setFilters(filters.getDbFilters());
|
||||||
params.setRange(db::Range{ 0, maxTrackCount });
|
params.setRange(db::Range{ 0, maxTrackCount });
|
||||||
params.setSortMethod(TrackSortMethod::TrackList);
|
params.setSortMethod(db::TrackSortMethod::TrackList);
|
||||||
|
|
||||||
return db::Track::findIds(session, params).results;
|
return db::Track::findIds(session, params).results;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,6 @@
|
|||||||
|
|
||||||
namespace lms::ui::releaseListHelpers
|
namespace lms::ui::releaseListHelpers
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
enum class ReleaseOptions
|
enum class ReleaseOptions
|
||||||
@@ -42,7 +40,7 @@ namespace lms::ui::releaseListHelpers
|
|||||||
ShowYear,
|
ShowYear,
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<Wt::WTemplate> createEntryInternal(const Release::pointer& release, const Artist::pointer& artist, core::EnumSet<ReleaseOptions> options)
|
std::unique_ptr<Wt::WTemplate> createEntryInternal(const db::Release::pointer& release, const db::Artist::pointer& artist, core::EnumSet<ReleaseOptions> options)
|
||||||
{
|
{
|
||||||
auto entry{ std::make_unique<Wt::WTemplate>(Wt::WString::tr("Lms.Explore.Releases.template.entry-grid")) };
|
auto entry{ std::make_unique<Wt::WTemplate>(Wt::WString::tr("Lms.Explore.Releases.template.entry-grid")) };
|
||||||
|
|
||||||
@@ -64,7 +62,7 @@ namespace lms::ui::releaseListHelpers
|
|||||||
|
|
||||||
if (options.contains(ReleaseOptions::ShowArtist))
|
if (options.contains(ReleaseOptions::ShowArtist))
|
||||||
{
|
{
|
||||||
auto artistAnchors{ utils::createArtistsAnchorsForRelease(release, artist ? artist->getId() : ArtistId{}, "link-secondary") };
|
auto artistAnchors{ utils::createArtistsAnchorsForRelease(release, artist ? artist->getId() : db::ArtistId{}, "link-secondary") };
|
||||||
if (artistAnchors)
|
if (artistAnchors)
|
||||||
{
|
{
|
||||||
entry->setCondition("if-has-artist", true);
|
entry->setCondition("if-has-artist", true);
|
||||||
@@ -94,9 +92,9 @@ namespace lms::ui::releaseListHelpers
|
|||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
std::unique_ptr<Wt::WTemplate> createEntry(const Release::pointer& release)
|
std::unique_ptr<Wt::WTemplate> createEntry(const db::Release::pointer& release)
|
||||||
{
|
{
|
||||||
return createEntryInternal(release, Artist::pointer{}, core::EnumSet<ReleaseOptions>{ ReleaseOptions::ShowArtist });
|
return createEntryInternal(release, db::Artist::pointer{}, core::EnumSet<ReleaseOptions>{ ReleaseOptions::ShowArtist });
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Wt::WTemplate> createEntryForArtist(const db::Release::pointer& release, const db::Artist::pointer& artist)
|
std::unique_ptr<Wt::WTemplate> createEntryForArtist(const db::Release::pointer& release, const db::Artist::pointer& artist)
|
||||||
@@ -106,7 +104,7 @@ namespace lms::ui::releaseListHelpers
|
|||||||
|
|
||||||
std::unique_ptr<Wt::WTemplate> createEntryForOtherVersions(const db::ObjectPtr<db::Release>& release)
|
std::unique_ptr<Wt::WTemplate> createEntryForOtherVersions(const db::ObjectPtr<db::Release>& release)
|
||||||
{
|
{
|
||||||
return createEntryInternal(release, Artist::pointer{}, core::EnumSet<ReleaseOptions>{ ReleaseOptions::ShowYear });
|
return createEntryInternal(release, db::Artist::pointer{}, core::EnumSet<ReleaseOptions>{ ReleaseOptions::ShowYear });
|
||||||
}
|
}
|
||||||
} // namespace lms::ui::releaseListHelpers
|
} // namespace lms::ui::releaseListHelpers
|
||||||
|
|
||||||
|
|||||||
@@ -57,8 +57,6 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
void showReleaseInfoModal(db::ReleaseId releaseId)
|
void showReleaseInfoModal(db::ReleaseId releaseId)
|
||||||
@@ -79,36 +77,36 @@ namespace lms::ui
|
|||||||
releaseInfo->bindString("release-type", releaseHelpers::buildReleaseTypeString(parseReleaseType(releaseTypeNames)));
|
releaseInfo->bindString("release-type", releaseHelpers::buildReleaseTypeString(parseReleaseType(releaseTypeNames)));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<Wt::WString, std::set<ArtistId>> artistMap;
|
std::map<Wt::WString, std::set<db::ArtistId>> artistMap;
|
||||||
|
|
||||||
auto addArtists = [&](TrackArtistLinkType linkType, const char* type) {
|
auto addArtists = [&](db::TrackArtistLinkType linkType, const char* type) {
|
||||||
Artist::FindParameters params;
|
db::Artist::FindParameters params;
|
||||||
params.setRelease(releaseId);
|
params.setRelease(releaseId);
|
||||||
params.setLinkType(linkType);
|
params.setLinkType(linkType);
|
||||||
const auto artistIds{ Artist::findIds(LmsApp->getDbSession(), params) };
|
const auto artistIds{ db::Artist::findIds(LmsApp->getDbSession(), params) };
|
||||||
if (artistIds.results.empty())
|
if (artistIds.results.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Wt::WString typeStr{ Wt::WString::trn(type, artistIds.results.size()) };
|
Wt::WString typeStr{ Wt::WString::trn(type, artistIds.results.size()) };
|
||||||
for (ArtistId artistId : artistIds.results)
|
for (db::ArtistId artistId : artistIds.results)
|
||||||
artistMap[typeStr].insert(artistId);
|
artistMap[typeStr].insert(artistId);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto addPerformerArtists = [&] {
|
auto addPerformerArtists = [&] {
|
||||||
TrackArtistLink::FindParameters params;
|
db::TrackArtistLink::FindParameters params;
|
||||||
params.setRelease(releaseId);
|
params.setRelease(releaseId);
|
||||||
params.setLinkType(TrackArtistLinkType::Performer);
|
params.setLinkType(db::TrackArtistLinkType::Performer);
|
||||||
TrackArtistLink::find(LmsApp->getDbSession(), params, [&](const TrackArtistLink::pointer& link) {
|
db::TrackArtistLink::find(LmsApp->getDbSession(), params, [&](const db::TrackArtistLink::pointer& link) {
|
||||||
artistMap[std::string{ link->getSubType() }].insert(link->getArtist()->getId());
|
artistMap[std::string{ link->getSubType() }].insert(link->getArtist()->getId());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
addArtists(TrackArtistLinkType::Composer, "Lms.Explore.Artists.linktype-composer");
|
addArtists(db::TrackArtistLinkType::Composer, "Lms.Explore.Artists.linktype-composer");
|
||||||
addArtists(TrackArtistLinkType::Conductor, "Lms.Explore.Artists.linktype-conductor");
|
addArtists(db::TrackArtistLinkType::Conductor, "Lms.Explore.Artists.linktype-conductor");
|
||||||
addArtists(TrackArtistLinkType::Lyricist, "Lms.Explore.Artists.linktype-lyricist");
|
addArtists(db::TrackArtistLinkType::Lyricist, "Lms.Explore.Artists.linktype-lyricist");
|
||||||
addArtists(TrackArtistLinkType::Mixer, "Lms.Explore.Artists.linktype-mixer");
|
addArtists(db::TrackArtistLinkType::Mixer, "Lms.Explore.Artists.linktype-mixer");
|
||||||
addArtists(TrackArtistLinkType::Remixer, "Lms.Explore.Artists.linktype-remixer");
|
addArtists(db::TrackArtistLinkType::Remixer, "Lms.Explore.Artists.linktype-remixer");
|
||||||
addArtists(TrackArtistLinkType::Producer, "Lms.Explore.Artists.linktype-producer");
|
addArtists(db::TrackArtistLinkType::Producer, "Lms.Explore.Artists.linktype-producer");
|
||||||
addPerformerArtists();
|
addPerformerArtists();
|
||||||
|
|
||||||
if (auto itRolelessPerformers{ artistMap.find("") }; itRolelessPerformers != std::cend(artistMap))
|
if (auto itRolelessPerformers{ artistMap.find("") }; itRolelessPerformers != std::cend(artistMap))
|
||||||
@@ -141,7 +139,7 @@ namespace lms::ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: save in DB and aggregate all this
|
// TODO: save in DB and aggregate all this
|
||||||
for (const Track::pointer& track : Track::find(LmsApp->getDbSession(), Track::FindParameters{}.setRelease(releaseId).setRange(Range{ 0, 1 })).results)
|
for (const db::Track::pointer& track : db::Track::find(LmsApp->getDbSession(), db::Track::FindParameters{}.setRelease(releaseId).setRange(db::Range{ 0, 1 })).results)
|
||||||
{
|
{
|
||||||
if (const auto audioFile{ av::parseAudioFile(track->getAbsoluteFilePath()) })
|
if (const auto audioFile{ av::parseAudioFile(track->getAbsoluteFilePath()) })
|
||||||
{
|
{
|
||||||
@@ -171,7 +169,7 @@ namespace lms::ui
|
|||||||
LmsApp->getModalManager().show(std::move(releaseInfo));
|
LmsApp->getModalManager().show(std::move(releaseInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<ReleaseId> extractReleaseIdFromInternalPath()
|
std::optional<db::ReleaseId> extractReleaseIdFromInternalPath()
|
||||||
{
|
{
|
||||||
if (wApp->internalPathMatches("/release/mbid/"))
|
if (wApp->internalPathMatches("/release/mbid/"))
|
||||||
{
|
{
|
||||||
@@ -186,12 +184,12 @@ namespace lms::ui
|
|||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
return core::stringUtils::readAs<ReleaseId::ValueType>(wApp->internalPathNextPart("/release/"));
|
return core::stringUtils::readAs<db::ReleaseId::ValueType>(wApp->internalPathNextPart("/release/"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void fillTrackArtistLinks(Wt::WTemplate* trackEntry, db::TrackId trackId)
|
void fillTrackArtistLinks(Wt::WTemplate* trackEntry, db::TrackId trackId)
|
||||||
{
|
{
|
||||||
const User::pointer user{ LmsApp->getUser() };
|
const db::User::pointer user{ LmsApp->getUser() };
|
||||||
if (!user->getUIEnableInlineArtistRelationships())
|
if (!user->getUIEnableInlineArtistRelationships())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -199,7 +197,7 @@ namespace lms::ui
|
|||||||
if (inlineArtistRelationships.empty())
|
if (inlineArtistRelationships.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const std::map<Wt::WString, std::set<ArtistId>> artistsByRole{ TrackListHelpers::getArtistsByRole(trackId, inlineArtistRelationships) };
|
const std::map<Wt::WString, std::set<db::ArtistId>> artistsByRole{ TrackListHelpers::getArtistsByRole(trackId, inlineArtistRelationships) };
|
||||||
if (artistsByRole.empty())
|
if (artistsByRole.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -318,14 +316,14 @@ namespace lms::ui
|
|||||||
|
|
||||||
Wt::WContainerWidget* clusterContainers{ bindNew<Wt::WContainerWidget>("clusters") };
|
Wt::WContainerWidget* clusterContainers{ bindNew<Wt::WContainerWidget>("clusters") };
|
||||||
{
|
{
|
||||||
const auto clusterTypeIds{ ClusterType::findIds(session).results };
|
const auto clusterTypeIds{ db::ClusterType::findIds(session).results };
|
||||||
const auto clusterGroups{ release->getClusterGroups(clusterTypeIds, 3) };
|
const auto clusterGroups{ release->getClusterGroups(clusterTypeIds, 3) };
|
||||||
|
|
||||||
for (const auto& clusters : clusterGroups)
|
for (const auto& clusters : clusterGroups)
|
||||||
{
|
{
|
||||||
for (const db::Cluster::pointer& cluster : clusters)
|
for (const db::Cluster::pointer& cluster : clusters)
|
||||||
{
|
{
|
||||||
const ClusterId clusterId{ cluster->getId() };
|
const db::ClusterId clusterId{ cluster->getId() };
|
||||||
Wt::WInteractWidget* entry{ clusterContainers->addWidget(utils::createFilterCluster(clusterId)) };
|
Wt::WInteractWidget* entry{ clusterContainers->addWidget(utils::createFilterCluster(clusterId)) };
|
||||||
entry->clicked().connect([this, clusterId] {
|
entry->clicked().connect([this, clusterId] {
|
||||||
_filters.add(clusterId);
|
_filters.add(clusterId);
|
||||||
@@ -458,7 +456,7 @@ namespace lms::ui
|
|||||||
|
|
||||||
if (displayTrackArtists)
|
if (displayTrackArtists)
|
||||||
{
|
{
|
||||||
const auto artists{ track->getArtistIds({ TrackArtistLinkType::Artist }) };
|
const auto artists{ track->getArtistIds({ db::TrackArtistLinkType::Artist }) };
|
||||||
if (!artists.empty())
|
if (!artists.empty())
|
||||||
{
|
{
|
||||||
entry->setCondition("if-has-artists", true);
|
entry->setCondition("if-has-artists", true);
|
||||||
@@ -533,7 +531,7 @@ namespace lms::ui
|
|||||||
|
|
||||||
entry->bindString("duration", utils::durationToString(track->getDuration()), Wt::TextFormat::Plain);
|
entry->bindString("duration", utils::durationToString(track->getDuration()), Wt::TextFormat::Plain);
|
||||||
|
|
||||||
LmsApp->getMediaPlayer().trackLoaded.connect(entry, [=](TrackId loadedTrackId) {
|
LmsApp->getMediaPlayer().trackLoaded.connect(entry, [=](db::TrackId loadedTrackId) {
|
||||||
entry->toggleStyleClass("Lms-entry-playing", loadedTrackId == trackId);
|
entry->toggleStyleClass("Lms-entry-playing", loadedTrackId == trackId);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -600,7 +598,7 @@ namespace lms::ui
|
|||||||
setCondition("if-has-other-versions", true);
|
setCondition("if-has-other-versions", true);
|
||||||
auto* container{ bindNew<Wt::WContainerWidget>("other-versions") };
|
auto* container{ bindNew<Wt::WContainerWidget>("other-versions") };
|
||||||
|
|
||||||
for (const ReleaseId id : releaseIds.results)
|
for (const db::ReleaseId id : releaseIds.results)
|
||||||
{
|
{
|
||||||
if (id == _releaseId)
|
if (id == _releaseId)
|
||||||
continue;
|
continue;
|
||||||
@@ -613,7 +611,7 @@ namespace lms::ui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Release::refreshSimilarReleases(const std::vector<ReleaseId>& similarReleaseIds)
|
void Release::refreshSimilarReleases(const std::vector<db::ReleaseId>& similarReleaseIds)
|
||||||
{
|
{
|
||||||
if (similarReleaseIds.empty())
|
if (similarReleaseIds.empty())
|
||||||
return;
|
return;
|
||||||
@@ -621,7 +619,7 @@ namespace lms::ui
|
|||||||
setCondition("if-has-similar-releases", true);
|
setCondition("if-has-similar-releases", true);
|
||||||
auto* similarReleasesContainer{ bindNew<Wt::WContainerWidget>("similar-releases") };
|
auto* similarReleasesContainer{ bindNew<Wt::WContainerWidget>("similar-releases") };
|
||||||
|
|
||||||
for (const ReleaseId id : similarReleaseIds)
|
for (const db::ReleaseId id : similarReleaseIds)
|
||||||
{
|
{
|
||||||
const db::Release::pointer similarRelease{ db::Release::find(LmsApp->getDbSession(), id) };
|
const db::Release::pointer similarRelease{ db::Release::find(LmsApp->getDbSession(), id) };
|
||||||
if (!similarRelease)
|
if (!similarRelease)
|
||||||
|
|||||||
@@ -36,8 +36,6 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
Releases::Releases(Filters& filters, PlayQueueController& playQueueController)
|
Releases::Releases(Filters& filters, PlayQueueController& playQueueController)
|
||||||
: Template{ Wt::WString::tr("Lms.Explore.Releases.template") }
|
: Template{ Wt::WString::tr("Lms.Explore.Releases.template") }
|
||||||
, _playQueueController{ playQueueController }
|
, _playQueueController{ playQueueController }
|
||||||
@@ -116,14 +114,14 @@ namespace lms::ui
|
|||||||
|
|
||||||
void Releases::addSome()
|
void Releases::addSome()
|
||||||
{
|
{
|
||||||
const auto releaseIds{ _releaseCollector.get(Range{ static_cast<std::size_t>(_container->getCount()), _batchSize }) };
|
const auto releaseIds{ _releaseCollector.get(db::Range{ static_cast<std::size_t>(_container->getCount()), _batchSize }) };
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
for (const ReleaseId releaseId : releaseIds.results)
|
for (const db::ReleaseId releaseId : releaseIds.results)
|
||||||
{
|
{
|
||||||
if (const Release::pointer release{ Release::find(LmsApp->getDbSession(), releaseId) })
|
if (const db::Release::pointer release{ db::Release::find(LmsApp->getDbSession(), releaseId) })
|
||||||
_container->add(releaseListHelpers::createEntry(release));
|
_container->add(releaseListHelpers::createEntry(release));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -131,9 +129,9 @@ namespace lms::ui
|
|||||||
_container->setHasMore(releaseIds.moreResults);
|
_container->setHasMore(releaseIds.moreResults);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ReleaseId> Releases::getAllReleases()
|
std::vector<db::ReleaseId> Releases::getAllReleases()
|
||||||
{
|
{
|
||||||
RangeResults<ReleaseId> releaseIds{ _releaseCollector.get() };
|
db::RangeResults<db::ReleaseId> releaseIds{ _releaseCollector.get() };
|
||||||
return std::move(releaseIds.results);
|
return std::move(releaseIds.results);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,16 +32,14 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
db::RangeResults<db::TrackId> TrackCollector::get(std::optional<db::Range> requestedRange)
|
||||||
|
|
||||||
RangeResults<TrackId> TrackCollector::get(std::optional<Range> requestedRange)
|
|
||||||
{
|
{
|
||||||
feedback::IFeedbackService& feedbackService{ *core::Service<feedback::IFeedbackService>::get() };
|
feedback::IFeedbackService& feedbackService{ *core::Service<feedback::IFeedbackService>::get() };
|
||||||
scrobbling::IScrobblingService& scrobblingService{ *core::Service<scrobbling::IScrobblingService>::get() };
|
scrobbling::IScrobblingService& scrobblingService{ *core::Service<scrobbling::IScrobblingService>::get() };
|
||||||
|
|
||||||
const Range range{ getActualRange(requestedRange) };
|
const db::Range range{ getActualRange(requestedRange) };
|
||||||
|
|
||||||
RangeResults<TrackId> tracks;
|
db::RangeResults<db::TrackId> tracks;
|
||||||
|
|
||||||
switch (getMode())
|
switch (getMode())
|
||||||
{
|
{
|
||||||
@@ -86,44 +84,44 @@ namespace lms::ui
|
|||||||
|
|
||||||
case Mode::RecentlyAdded:
|
case Mode::RecentlyAdded:
|
||||||
{
|
{
|
||||||
Track::FindParameters params;
|
db::Track::FindParameters params;
|
||||||
params.setFilters(getDbFilters());
|
params.setFilters(getDbFilters());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setSortMethod(TrackSortMethod::AddedDesc);
|
params.setSortMethod(db::TrackSortMethod::AddedDesc);
|
||||||
params.setRange(range);
|
params.setRange(range);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
tracks = Track::findIds(LmsApp->getDbSession(), params);
|
tracks = db::Track::findIds(LmsApp->getDbSession(), params);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Mode::RecentlyModified:
|
case Mode::RecentlyModified:
|
||||||
{
|
{
|
||||||
Track::FindParameters params;
|
db::Track::FindParameters params;
|
||||||
params.setFilters(getDbFilters());
|
params.setFilters(getDbFilters());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setSortMethod(TrackSortMethod::LastWrittenDesc);
|
params.setSortMethod(db::TrackSortMethod::LastWrittenDesc);
|
||||||
params.setRange(range);
|
params.setRange(range);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
tracks = Track::findIds(LmsApp->getDbSession(), params);
|
tracks = db::Track::findIds(LmsApp->getDbSession(), params);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Mode::All:
|
case Mode::All:
|
||||||
{
|
{
|
||||||
Track::FindParameters params;
|
db::Track::FindParameters params;
|
||||||
params.setFilters(getDbFilters());
|
params.setFilters(getDbFilters());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setRange(range);
|
params.setRange(range);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
tracks = Track::findIds(LmsApp->getDbSession(), params);
|
tracks = db::Track::findIds(LmsApp->getDbSession(), params);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -135,21 +133,21 @@ namespace lms::ui
|
|||||||
return tracks;
|
return tracks;
|
||||||
}
|
}
|
||||||
|
|
||||||
RangeResults<TrackId> TrackCollector::getRandomTracks(Range range)
|
db::RangeResults<db::TrackId> TrackCollector::getRandomTracks(Range range)
|
||||||
{
|
{
|
||||||
assert(getMode() == Mode::Random);
|
assert(getMode() == Mode::Random);
|
||||||
|
|
||||||
if (!_randomTracks)
|
if (!_randomTracks)
|
||||||
{
|
{
|
||||||
Track::FindParameters params;
|
db::Track::FindParameters params;
|
||||||
params.setFilters(getDbFilters());
|
params.setFilters(getDbFilters());
|
||||||
params.setKeywords(getSearchKeywords());
|
params.setKeywords(getSearchKeywords());
|
||||||
params.setSortMethod(TrackSortMethod::Random);
|
params.setSortMethod(db::TrackSortMethod::Random);
|
||||||
params.setRange(Range{ 0, getMaxCount() });
|
params.setRange(db::Range{ 0, getMaxCount() });
|
||||||
|
|
||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
_randomTracks = Track::findIds(LmsApp->getDbSession(), params);
|
_randomTracks = db::Track::findIds(LmsApp->getDbSession(), params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,13 +40,11 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
std::optional<TrackListId> extractTrackListIdFromInternalPath()
|
std::optional<db::TrackListId> extractTrackListIdFromInternalPath()
|
||||||
{
|
{
|
||||||
return core::stringUtils::readAs<TrackListId::ValueType>(wApp->internalPathNextPart("/tracklist/"));
|
return core::stringUtils::readAs<db::TrackListId::ValueType>(wApp->internalPathNextPart("/tracklist/"));
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@@ -74,7 +72,7 @@ namespace lms::ui
|
|||||||
if (!wApp->internalPathMatches("/tracklist/"))
|
if (!wApp->internalPathMatches("/tracklist/"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const std::optional<TrackListId> trackListId{ extractTrackListIdFromInternalPath() };
|
const std::optional<db::TrackListId> trackListId{ extractTrackListIdFromInternalPath() };
|
||||||
if (!trackListId)
|
if (!trackListId)
|
||||||
throw TrackListNotFoundException{};
|
throw TrackListNotFoundException{};
|
||||||
|
|
||||||
@@ -103,14 +101,14 @@ namespace lms::ui
|
|||||||
|
|
||||||
Wt::WContainerWidget* clusterContainers{ bindNew<Wt::WContainerWidget>("clusters") };
|
Wt::WContainerWidget* clusterContainers{ bindNew<Wt::WContainerWidget>("clusters") };
|
||||||
{
|
{
|
||||||
const auto clusterTypeIds{ ClusterType::findIds(LmsApp->getDbSession()).results };
|
const auto clusterTypeIds{ db::ClusterType::findIds(LmsApp->getDbSession()).results };
|
||||||
const auto clusterGroups{ trackList->getClusterGroups(clusterTypeIds, 3) };
|
const auto clusterGroups{ trackList->getClusterGroups(clusterTypeIds, 3) };
|
||||||
|
|
||||||
for (const auto& clusters : clusterGroups)
|
for (const auto& clusters : clusterGroups)
|
||||||
{
|
{
|
||||||
for (const db::Cluster::pointer& cluster : clusters)
|
for (const db::Cluster::pointer& cluster : clusters)
|
||||||
{
|
{
|
||||||
const ClusterId clusterId{ cluster->getId() };
|
const db::ClusterId clusterId{ cluster->getId() };
|
||||||
Wt::WInteractWidget* entry{ clusterContainers->addWidget(utils::createFilterCluster(clusterId)) };
|
Wt::WInteractWidget* entry{ clusterContainers->addWidget(utils::createFilterCluster(clusterId)) };
|
||||||
entry->clicked().connect([this, clusterId] {
|
entry->clicked().connect([this, clusterId] {
|
||||||
_filters.add(clusterId);
|
_filters.add(clusterId);
|
||||||
@@ -193,7 +191,7 @@ namespace lms::ui
|
|||||||
params.setRange(db::Range{ static_cast<std::size_t>(_container->getCount()), _batchSize });
|
params.setRange(db::Range{ static_cast<std::size_t>(_container->getCount()), _batchSize });
|
||||||
|
|
||||||
bool moreResults{};
|
bool moreResults{};
|
||||||
db::Track::find(LmsApp->getDbSession(), params, moreResults, [this](const Track::pointer& track) {
|
db::Track::find(LmsApp->getDbSession(), params, moreResults, [this](const db::Track::pointer& track) {
|
||||||
_container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters));
|
_container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
|
|
||||||
namespace lms::ui
|
namespace lms::ui
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
Tracks::Tracks(Filters& filters, PlayQueueController& playQueueController)
|
Tracks::Tracks(Filters& filters, PlayQueueController& playQueueController)
|
||||||
: Template{ Wt::WString::tr("Lms.Explore.Tracks.template") }
|
: Template{ Wt::WString::tr("Lms.Explore.Tracks.template") }
|
||||||
, _filters{ filters }
|
, _filters{ filters }
|
||||||
@@ -119,11 +117,11 @@ namespace lms::ui
|
|||||||
{
|
{
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
const auto trackIds{ _trackCollector.get(Range{ static_cast<std::size_t>(_container->getCount()), _batchSize }) };
|
const auto trackIds{ _trackCollector.get(db::Range{ static_cast<std::size_t>(_container->getCount()), _batchSize }) };
|
||||||
|
|
||||||
for (const TrackId trackId : trackIds.results)
|
for (const db::TrackId trackId : trackIds.results)
|
||||||
{
|
{
|
||||||
if (const Track::pointer track{ Track::find(LmsApp->getDbSession(), trackId) })
|
if (const db::Track::pointer track{ db::Track::find(LmsApp->getDbSession(), trackId) })
|
||||||
_container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters));
|
_container->add(TrackListHelpers::createEntry(track, _playQueueController, _filters));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +130,7 @@ namespace lms::ui
|
|||||||
|
|
||||||
std::vector<db::TrackId> Tracks::getAllTracks()
|
std::vector<db::TrackId> Tracks::getAllTracks()
|
||||||
{
|
{
|
||||||
RangeResults<TrackId> trackIds{ _trackCollector.get() };
|
db::RangeResults<db::TrackId> trackIds{ _trackCollector.get() };
|
||||||
return std::move(trackIds.results);
|
return std::move(trackIds.results);
|
||||||
}
|
}
|
||||||
} // namespace lms::ui
|
} // namespace lms::ui
|
||||||
|
|||||||
@@ -197,11 +197,9 @@ namespace lms::ui
|
|||||||
|
|
||||||
std::unique_ptr<zip::IZipper> DownloadReleaseResource::createZipper()
|
std::unique_ptr<zip::IZipper> DownloadReleaseResource::createZipper()
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
|
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
auto tracks{ Track::find(LmsApp->getDbSession(), Track::FindParameters{}.setRelease(_releaseId).setSortMethod(TrackSortMethod::Release)) };
|
auto tracks{ db::Track::find(LmsApp->getDbSession(), db::Track::FindParameters{}.setRelease(_releaseId).setSortMethod(db::TrackSortMethod::Release)) };
|
||||||
return details::createZipper(tracks.results);
|
return details::createZipper(tracks.results);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,12 +239,11 @@ namespace lms::ui
|
|||||||
|
|
||||||
std::unique_ptr<zip::IZipper> DownloadTrackListResource::createZipper()
|
std::unique_ptr<zip::IZipper> DownloadTrackListResource::createZipper()
|
||||||
{
|
{
|
||||||
using namespace db;
|
|
||||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||||
|
|
||||||
Track::FindParameters params;
|
db::Track::FindParameters params;
|
||||||
params.setTrackList(_trackListId);
|
params.setTrackList(_trackListId);
|
||||||
const auto tracks{ Track::find(LmsApp->getDbSession(), params) };
|
const auto tracks{ db::Track::find(LmsApp->getDbSession(), params) };
|
||||||
return details::createZipper(tracks.results);
|
return details::createZipper(tracks.results);
|
||||||
}
|
}
|
||||||
} // namespace lms::ui
|
} // namespace lms::ui
|
||||||
|
|||||||
Reference in New Issue
Block a user