Added a link to music brainz for releaseS/artists

This commit is contained in:
emeric
2020-05-15 14:12:36 +02:00
parent 0f4e3270cf
commit 2d8c350dea
13 changed files with 157 additions and 107 deletions
+21 -15
View File
@@ -12,6 +12,14 @@
</div> </div>
${releases class="Lms-explore-artist-entries-container"} ${releases class="Lms-explore-artist-entries-container"}
</div> </div>
${<if-has-mbid>}
<div class="col-md-4">
<div class="well well-sm">
<h3>${tr:Lms.Explore.links}</h3>
${mbid-link class="text-muted"}
</div>
</div>
${</if-has-mbid>}
<div class="col-md-4"> <div class="col-md-4">
<div class="well well-sm"> <div class="well well-sm">
<h3>${tr:Lms.Explore.Artist.similar-artists}</h3> <h3>${tr:Lms.Explore.Artist.similar-artists}</h3>
@@ -22,23 +30,21 @@
</message> </message>
<message id="Lms.Explore.Artist.template.entry"> <message id="Lms.Explore.Artist.template.entry">
<div class="row Lms-explore-artist-entry Lms-entry-hoverable"> <div class="Lms-explore-artist-entry Lms-entry-hoverable">
<div class="col-xs-12"> <div class="media">
<div class="media"> <div class="media-left media-middle">
<div class="media-left media-middle"> <div class="media-object Lms-cover-container-medium">
<div class="media-object Lms-cover-container-medium"> ${cover}
${cover}
</div>
</div>
<div class="media-body media-middle">
<h4 class="media-heading">
${name class="Lms-releasename text-primary"}
</h4>
${<if-has-artist>}<h4><small>${artist class="Lms-artistname text-muted"}</small></h4>${</if-has-artist>}
<h4><small><div class="text-muted">${<if-has-year>}${year}${</if-has-year>}${<if-has-orig-year>} (${orig-year})${</if-has-orig-year>}</div></small></h4>
${play-btn}${add-btn}
</div> </div>
</div> </div>
<div class="media-body media-middle">
<h4 class="media-heading">
${name class="Lms-releasename text-primary"}
</h4>
${<if-has-artist>}<h4><small>${artist class="Lms-artistname text-muted"}</small></h4>${</if-has-artist>}
<h4><small><div class="text-muted">${<if-has-year>}${year}${</if-has-year>}${<if-has-orig-year>} (${orig-year})${</if-has-orig-year>}</div></small></h4>
${play-btn}${add-btn}
</div>
</div> </div>
</div> </div>
</message> </message>
+6 -12
View File
@@ -13,26 +13,20 @@
</div> </div>
</div> </div>
${artists} ${artists}
<div class="row"> <div class="Lms-horizontal-center">
<div class="col-xs-12 Lms-horizontal-center"> ${show-more class="btn-primary Lms-show-more"}
${show-more class="btn-primary Lms-show-more"}
</div>
</div> </div>
</message> </message>
<message id="Lms.Explore.Artists.template.entry"> <message id="Lms.Explore.Artists.template.entry">
<div class="row Lms-explore-artists-entry Lms-entry-hoverable Lms-vertical-align"> <div class="Lms-explore-artists-entry Lms-entry-hoverable Lms-vertical-align">
<div class="col-xs-12"> <h4>${name class="Lms-artistname text-primary"}</h4>
<h4>${name class="Lms-artistname text-primary"}</h4>
</div>
</div> </div>
</message> </message>
<message id="Lms.Explore.Artists.template.entry-small"> <message id="Lms.Explore.Artists.template.entry-small">
<div class="row Lms-explore-artists-entry-small Lms-entry-hoverable Lms-vertical-align"> <div class="Lms-explore-artists-entry-small Lms-entry-hoverable Lms-vertical-align">
<div class="col-xs-12"> ${name class="Lms-artistname text-primary"}
${name class="Lms-artistname text-primary"}
</div>
</div> </div>
</message> </message>
+3 -1
View File
@@ -105,7 +105,10 @@
<message id="Lms.Explore.artists">Artists</message> <message id="Lms.Explore.artists">Artists</message>
<message id="Lms.Explore.filter-added">Filter added</message> <message id="Lms.Explore.filter-added">Filter added</message>
<message id="Lms.Explore.filters">Filters</message> <message id="Lms.Explore.filters">Filters</message>
<message id="Lms.Explore.links">Links</message>
<message id="Lms.Explore.most-played">Most played</message> <message id="Lms.Explore.most-played">Most played</message>
<message id="Lms.Explore.musicbrainz-artist">MusicBrainz Artist</message>
<message id="Lms.Explore.musicbrainz-release">MusicBrainz Release</message>
<message id="Lms.Explore.random">Random</message> <message id="Lms.Explore.random">Random</message>
<message id="Lms.Explore.recently-added">Recently added</message> <message id="Lms.Explore.recently-added">Recently added</message>
<message id="Lms.Explore.recently-played">Recently played</message> <message id="Lms.Explore.recently-played">Recently played</message>
@@ -193,4 +196,3 @@
<message id="Lms.Settings.settings-saved">New settings saved!</message> <message id="Lms.Settings.settings-saved">New settings saved!</message>
</messages> </messages>
+4 -2
View File
@@ -105,7 +105,10 @@
<message id="Lms.Explore.artists">Artistes</message> <message id="Lms.Explore.artists">Artistes</message>
<message id="Lms.Explore.filter-added">Filtre ajouté</message> <message id="Lms.Explore.filter-added">Filtre ajouté</message>
<message id="Lms.Explore.filters">Filtres</message> <message id="Lms.Explore.filters">Filtres</message>
<message id="Lms.Explore.mostly-played">Plus joués</message> <message id="Lms.Explore.links">Liens</message>
<message id="Lms.Explore.most-played">Plus joués</message>
<message id="Lms.Explore.musicbrainz-artist">MusicBrainz Artist</message>
<message id="Lms.Explore.musicbrainz-release">MusicBrainz Release</message>
<message id="Lms.Explore.random">Aléatoire</message> <message id="Lms.Explore.random">Aléatoire</message>
<message id="Lms.Explore.recently-added">Ajoutés récemment</message> <message id="Lms.Explore.recently-added">Ajoutés récemment</message>
<message id="Lms.Explore.recently-played">Joués récemment</message> <message id="Lms.Explore.recently-played">Joués récemment</message>
@@ -190,7 +193,6 @@
<message id="Lms.Settings.transcode-mode.always">Toujours</message> <message id="Lms.Settings.transcode-mode.always">Toujours</message>
<message id="Lms.Settings.transcode-mode.if-format-not-supported">Seulement lorsque le format n'est pas pris en charge</message> <message id="Lms.Settings.transcode-mode.if-format-not-supported">Seulement lorsque le format n'est pas pris en charge</message>
<message id="Lms.Settings.transcode-mode.never">Jamais</message> <message id="Lms.Settings.transcode-mode.never">Jamais</message>
<message id="Lms.Settings.settings">Paramètres</message>
<message id="Lms.Settings.settings-saved">Paramètres sauvegardés !</message> <message id="Lms.Settings.settings-saved">Paramètres sauvegardés !</message>
<!--Wt--> <!--Wt-->
+3 -5
View File
@@ -9,17 +9,15 @@
<message id="Lms.PlayQueue.template"> <message id="Lms.PlayQueue.template">
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-lg-8">
<div class="Lms-header"> <div class="Lms-header">
<h2>${tr:Lms.PlayQueue.playqueue}</h2> <h2>${tr:Lms.PlayQueue.playqueue}</h2>
${clear-btn}${shuffle-btn}${repeat-btn}${radio-btn} ${clear-btn}${shuffle-btn}${repeat-btn}${radio-btn}
<h4><small>${nb-tracks}</small></h4> <h4><small>${nb-tracks}</small></h4>
</div> </div>
${entries} ${entries}
<div class="row"> <div class="Lms-horizontal-center">
<div class="col-xs-12 Lms-horizontal-center"> ${show-more class="btn-primary Lms-show-more"}
${show-more class="btn-primary Lms-show-more"}
</div>
</div> </div>
</div> </div>
</div> </div>
+15 -4
View File
@@ -21,13 +21,24 @@
</div> </div>
${container class="Lms-explore-release-entries-container"} ${container class="Lms-explore-release-entries-container"}
</div> </div>
${<if-has-copyright>}
<div class="col-md-4"> <div class="col-md-4">
<div class="well well-sm"> <div class="well well-sm">
${<if-has-copyright-or-copyright-url>}
<h3>${tr:Lms.Explore.Release.copyright}</h3> <h3>${tr:Lms.Explore.Release.copyright}</h3>
${<if-has-copyright>}<small>${copyright}</small>${</if-has-copyright>} ${copyright class="text-muted"}
${<if-has-copyright-url>}<small>${copyright-url}</small>${</if-has-copyright-url>} </div>
${</if-has-copyright-or-copyright-url>} </div>
${</if-has-copyright>}
${<if-has-mbid>}
<div class="col-md-4">
<div class="well well-sm">
<h3>${tr:Lms.Explore.links}</h3>
${mbid-link class="text-muted"}
</div>
</div>
${</if-has-mbid>}
<div class="col-md-4">
<div class="well well-sm">
<h3>${tr:Lms.Explore.Release.similar-releases}</h3> <h3>${tr:Lms.Explore.Release.similar-releases}</h3>
${similar-releases} ${similar-releases}
</div> </div>
+24 -30
View File
@@ -9,49 +9,43 @@
${play-btn}${add-btn} ${play-btn}${add-btn}
</div> </div>
${releases} ${releases}
<div class="row"> <div class="Lms-horizontal-center">
<div class="col-xs-12 Lms-horizontal-center"> ${show-more class="btn-primary Lms-show-more"}
${show-more class="btn-primary Lms-show-more"}
</div>
</div> </div>
</message> </message>
<message id="Lms.Explore.Releases.template.entry"> <message id="Lms.Explore.Releases.template.entry">
<div class="row Lms-explore-releases-entry Lms-entry-hoverable"> <div class="Lms-explore-releases-entry Lms-entry-hoverable">
<div class="col-xs-12"> <div class="media">
<div class="media"> <div class="media-left media-middle">
<div class="media-left media-middle"> <div class="media-object Lms-cover-container-medium">
<div class="media-object Lms-cover-container-medium"> ${cover}
${cover}
</div>
</div>
<div class="media-body media-middle">
<h4 class="media-heading">
${release-name class="Lms-releasename text-primary"}
</h4>
${<if-has-artist>}<h4><small>${artist-name class="Lms-artistname text-muted"}</small></h4>${</if-has-artist>}
${play-btn}${add-btn}
</div> </div>
</div> </div>
<div class="media-body media-middle">
<h4 class="media-heading">
${release-name class="Lms-releasename text-primary"}
</h4>
${<if-has-artist>}<h4><small>${artist-name class="Lms-artistname text-muted"}</small></h4>${</if-has-artist>}
${play-btn}${add-btn}
</div>
</div> </div>
</div> </div>
</message> </message>
<message id="Lms.Explore.Releases.template.entry-small"> <message id="Lms.Explore.Releases.template.entry-small">
<div class="row Lms-explore-releaselink Lms-entry-hoverable"> <div class="Lms-explore-releaselink Lms-entry-hoverable">
<div class="col-xs-12"> <div class="media">
<div class="media"> <div class="media-left media-middle">
<div class="media-left media-middle"> <div class="media-object Lms-cover-container-smaller">
<div class="media-object Lms-cover-container-smaller"> ${cover}
${cover}
</div>
</div> </div>
<div class="media-body media-middle"> </div>
<div class="media-heading"> <div class="media-body media-middle">
${release-name class="Lms-releasename text-primary"} <div class="media-heading">
</div> ${release-name class="Lms-releasename text-primary"}
${<if-has-artist>}<small>${artist-name class="Lms-artistname text-muted"}</small>${</if-has-artist>}
</div> </div>
${<if-has-artist>}<small>${artist-name class="Lms-artistname text-muted"}</small>${</if-has-artist>}
</div> </div>
</div> </div>
</div> </div>
+26 -16
View File
@@ -3,26 +3,36 @@
<!--FORMS message blocks--> <!--FORMS message blocks-->
<message id="Lms.Explore.Search.template"> <message id="Lms.Explore.Search.template">
<div class="Lms-header"> <div class="row">
<h2>${tr:Lms.Explore.Search.search}</h2> <div class="col-lg-8">
<div class="Lms-header">
<h2>${tr:Lms.Explore.Search.search}</h2>
</div>
${<if-artists>}
<div class="well well-sm">
<h3>${tr:Lms.Explore.artists}</h3>
${artists}
</div>
${</if-artists>}
${<if-releases>}
<div class="well well-sm">
<h3>${tr:Lms.Explore.releases}</h3>
${releases}
</div>
${</if-releases>}
${<if-tracks>}
<div class="well well-sm">
<h3>${tr:Lms.Explore.tracks}</h3>
${tracks}
</div>
${</if-tracks>}
</div>
</div> </div>
${<if-artists>}
<h3>${tr:Lms.Explore.artists}</h3>
${artists}
${</if-artists>}
${<if-releases>}
<h3>${tr:Lms.Explore.releases}</h3>
${releases}
${</if-releases>}
${<if-tracks>}
<h3>${tr:Lms.Explore.tracks}</h3>
${tracks}
${</if-tracks>}
</message> </message>
<message id="Lms.Explore.Search.template.track-entry"> <message id="Lms.Explore.Search.template.track-entry">
<div class="row Lms-explore-tracks-entry Lms-entry-hoverable Lms-vertical-align"> <div class="Lms-explore-tracks-entry Lms-entry-hoverable Lms-vertical-align">
<div class="col-xs-12 Lms-explore-tracks-entry-name"> <div class="Lms-explore-tracks-entry-name">
<div class="media"> <div class="media">
<div class="media-left media-middle hidden-xs"> <div class="media-left media-middle hidden-xs">
<div class="media-object Lms-cover-container-small"> <div class="media-object Lms-cover-container-small">
+8 -10
View File
@@ -4,19 +4,17 @@
<!--FORMS message blocks--> <!--FORMS message blocks-->
<message id="Lms.Explore.Tracks.template"> <message id="Lms.Explore.Tracks.template">
<div class="Lms-header">
<h2>${tr:Lms.Explore.tracks}</h2>
${mode class="nav nav-pills Lms-explore-mode-container"}
${play-btn}${add-btn}
</div>
<div class="row"> <div class="row">
<div class="col-lg-8"> <div class="col-lg-8">
<div class="Lms-header">
<h2>${tr:Lms.Explore.tracks}</h2>
${mode class="nav nav-pills Lms-explore-mode-container"}
${play-btn}${add-btn}
</div>
${tracks} ${tracks}
</div> <div class="Lms-horizontal-center">
</div> ${show-more class="btn-primary Lms-show-more"}
<div class="row"> </div>
<div class="col-lg-8 col-xs-12 Lms-horizontal-center">
${show-more class="btn-primary Lms-show-more"}
</div> </div>
</div> </div>
</message> </message>
+18 -2
View File
@@ -77,10 +77,11 @@ Artist::refreshView()
auto transaction {LmsApp->getDbSession().createSharedTransaction()}; auto transaction {LmsApp->getDbSession().createSharedTransaction()};
const Database::Artist::pointer artist = Database::Artist::getById(LmsApp->getDbSession(), *artistId); const Database::Artist::pointer artist {Database::Artist::getById(LmsApp->getDbSession(), *artistId)};
if (!artist) if (!artist)
throw ArtistNotFoundException {*artistId}; throw ArtistNotFoundException {*artistId};
refreshLinks(artist);
refreshSimilarArtists(similarArtistIds); refreshSimilarArtists(similarArtistIds);
Wt::WContainerWidget* clusterContainers = bindNew<Wt::WContainerWidget>("clusters"); Wt::WContainerWidget* clusterContainers = bindNew<Wt::WContainerWidget>("clusters");
@@ -199,7 +200,7 @@ Artist::createRelease(const Database::Artist::pointer& artist, const Release::po
void void
Artist::refreshSimilarArtists(const std::vector<Database::IdType>& similarArtistsId) Artist::refreshSimilarArtists(const std::vector<Database::IdType>& similarArtistsId)
{ {
auto* similarArtistsContainer {bindNew<Wt::WContainerWidget>("similar-artists")}; Wt::WContainerWidget* similarArtistsContainer {bindNew<Wt::WContainerWidget>("similar-artists")};
for (Database::IdType artistId : similarArtistsId) for (Database::IdType artistId : similarArtistsId)
{ {
@@ -211,5 +212,20 @@ Artist::refreshSimilarArtists(const std::vector<Database::IdType>& similarArtist
} }
} }
void
Artist::refreshLinks(const Database::Artist::pointer& artist)
{
const auto mbid {artist->getMBID()};
if (mbid)
{
setCondition("if-has-mbid", true);
Wt::WLink link {"https://musicbrainz.org/artist/" + std::string {mbid->getAsString()}};
link.setTarget(Wt::LinkTarget::NewWindow);
bindNew<Wt::WAnchor>("mbid-link", link, Wt::WString::tr("Lms.Explore.musicbrainz-artist"));
}
}
} // namespace UserInterface } // namespace UserInterface
+1
View File
@@ -50,6 +50,7 @@ class Artist : public Wt::WTemplate
private: private:
void refreshView(); void refreshView();
void refreshSimilarArtists(const std::vector<Database::IdType>& similarArtistsId); void refreshSimilarArtists(const std::vector<Database::IdType>& similarArtistsId);
void refreshLinks(const Wt::Dbo::ptr<Database::Artist>& artist);
std::unique_ptr<Wt::WTemplate> createRelease(const Wt::Dbo::ptr<Database::Artist>& artist, const Wt::Dbo::ptr<Database::Release>& release); std::unique_ptr<Wt::WTemplate> createRelease(const Wt::Dbo::ptr<Database::Artist>& artist, const Wt::Dbo::ptr<Database::Release>& release);
+27 -10
View File
@@ -84,6 +84,7 @@ Release::refreshView()
throw ReleaseNotFoundException {*releaseId}; throw ReleaseNotFoundException {*releaseId};
refreshCopyright(release); refreshCopyright(release);
refreshLinks(release);
refreshSimilarReleases(similarReleasesIds); refreshSimilarReleases(similarReleasesIds);
bindString("name", Wt::WString::fromUTF8(release->getName()), Wt::TextFormat::Plain); bindString("name", Wt::WString::fromUTF8(release->getName()), Wt::TextFormat::Plain);
@@ -261,24 +262,40 @@ Release::refreshCopyright(const Database::Release::pointer& release)
std::optional<std::string> copyright {release->getCopyright()}; std::optional<std::string> copyright {release->getCopyright()};
std::optional<std::string> copyrightURL {release->getCopyrightURL()}; std::optional<std::string> copyrightURL {release->getCopyrightURL()};
setCondition("if-has-copyright-or-copyright-url", copyright || copyrightURL); if (!copyright && !copyrightURL)
return;
setCondition("if-has-copyright", true);
std::string copyrightText {copyright ? *copyright : ""};
if (copyrightText.empty() && copyrightURL)
copyrightText = *copyrightURL;
if (copyrightURL) if (copyrightURL)
{ {
setCondition("if-has-copyright-url", true);
Wt::WLink link {*copyrightURL}; Wt::WLink link {*copyrightURL};
link.setTarget(Wt::LinkTarget::NewWindow); link.setTarget(Wt::LinkTarget::NewWindow);
Wt::WAnchor* anchor {bindNew<Wt::WAnchor>("copyright-url", link)}; Wt::WAnchor* anchor {bindNew<Wt::WAnchor>("copyright", link)};
anchor->setTextFormat(Wt::TextFormat::XHTML); anchor->setTextFormat(Wt::TextFormat::Plain);
anchor->setText(Wt::WString::tr("Lms.Explore.Release.template.link-btn")); anchor->setText(Wt::WString::fromUTF8(copyrightText));
} }
else
if (copyright)
{
setCondition("if-has-copyright", true);
bindString("copyright", Wt::WString::fromUTF8(*copyright), Wt::TextFormat::Plain); bindString("copyright", Wt::WString::fromUTF8(*copyright), Wt::TextFormat::Plain);
}
void
Release::refreshLinks(const Database::Release::pointer& release)
{
const auto mbid {release->getMBID()};
if (mbid)
{
setCondition("if-has-mbid", true);
Wt::WLink link {"https://musicbrainz.org/release/" + std::string {mbid->getAsString()}};
link.setTarget(Wt::LinkTarget::NewWindow);
bindNew<Wt::WAnchor>("mbid-link", link, Wt::WString::tr("Lms.Explore.musicbrainz-release"));
} }
} }
+1
View File
@@ -47,6 +47,7 @@ namespace UserInterface
private: private:
void refreshView(); void refreshView();
void refreshCopyright(const Wt::Dbo::ptr<Database::Release>& release); void refreshCopyright(const Wt::Dbo::ptr<Database::Release>& release);
void refreshLinks(const Wt::Dbo::ptr<Database::Release>& release);
void refreshSimilarReleases(const std::vector<Database::IdType>& similarReleasesId); void refreshSimilarReleases(const std::vector<Database::IdType>& similarReleasesId);
Filters* _filters {}; Filters* _filters {};