diff --git a/approot/messages.xml b/approot/messages.xml index ca602687..1bcfd5f8 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -199,6 +199,7 @@ Artists Bitrate Codec +Copyright Cover art Download Duration @@ -233,6 +234,7 @@ Unstar Value Various artists +Some rights reserved. Please refer to individual tracks for copyright info Appears on diff --git a/approot/messages_en-US.xml b/approot/messages_en-US.xml index 77611a53..2840228a 100644 --- a/approot/messages_en-US.xml +++ b/approot/messages_en-US.xml @@ -9,4 +9,4 @@ hh:mm:ss a MM/dd/yyyy hh:mm:ss a - \ No newline at end of file + diff --git a/approot/messages_es.xml b/approot/messages_es.xml index 988e6d78..75a7c8e1 100644 --- a/approot/messages_es.xml +++ b/approot/messages_es.xml @@ -199,6 +199,7 @@ Artistas Bitrate Codec +Derechos de autor Carátula Descargar Duración @@ -233,6 +234,7 @@ Eliminar de favoritos Valor Varios artistas +Algunos derechos reservados. Consulte las pistas para información sobre copyright Aparece en diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index b5229885..e77abe2b 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -199,6 +199,7 @@ Artistes Bitrate Codec +Droits d'auteur Pochette Télécharger Durée @@ -233,6 +234,7 @@ Retirer des favoris Valeur Artistes divers +Certains droits réservés. Consultez les pistes pour les informations sur les droits d'auteur Apparaît dans diff --git a/approot/messages_it.xml b/approot/messages_it.xml index 798dc86e..5eba39d8 100644 --- a/approot/messages_it.xml +++ b/approot/messages_it.xml @@ -199,6 +199,7 @@ Artisti Bitrate Codec +Diritti d'autore Copertina Download Durata @@ -233,6 +234,7 @@ Rimuovi dai preferiti Valore Vari artisti +Alcuni diritti riservati. Consultare le tracce per le informazioni sul copyright Appare su diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml index 84cd5729..08181d06 100644 --- a/approot/messages_pl.xml +++ b/approot/messages_pl.xml @@ -216,6 +216,7 @@ Artyści Przepływność Kodek +Prawa autorskie Okładka Pobierz Długość @@ -250,6 +251,7 @@ Przestań wyróżniać Wartość Różni artyści +Niektóre prawa zastrzeżone. Sprawdź poszczególne utwory, aby uzyskać informacje o prawach autorskich Pojawia się na diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml index 8293c6bf..ee81802d 100644 --- a/approot/messages_zh.xml +++ b/approot/messages_zh.xml @@ -197,6 +197,7 @@ 歌手 比特率 编码器 +版权所有 封面 下载 时长 @@ -231,6 +232,7 @@ 取消收藏 值 群星 +部分权利保留。请查看单曲以获取版权信息 出现于 diff --git a/approot/tracks.xml b/approot/tracks.xml index 22f8740b..d40598ab 100644 --- a/approot/tracks.xml +++ b/approot/tracks.xml @@ -129,6 +129,16 @@ ${playcount} + ${} + + + ${tr:Lms.Explore.copyright} + + + ${copyright} + + + ${} ${} ${comment} @@ -143,7 +153,6 @@ - diff --git a/src/libs/database/impl/objects/Release.cpp b/src/libs/database/impl/objects/Release.cpp index 96d3a427..c9d10dd5 100644 --- a/src/libs/database/impl/objects/Release.cpp +++ b/src/libs/database/impl/objects/Release.cpp @@ -642,13 +642,20 @@ namespace lms::db return *year; } + bool Release::hasVariousCopyrights() const + { + assert(session()); + + return utils::fetchQuerySingleResult(session()->query("SELECT COUNT(DISTINCT copyright) FROM track t").where("t.release_id = ?").bind(getId())) > 1; + } + std::optional Release::getCopyright() const { assert(session()); auto query{ session()->query("SELECT copyright FROM track t INNER JOIN release r ON r.id = t.release_id").where("r.id = ?").groupBy("copyright").bind(getId()) }; - const auto copyrights{ utils::fetchQueryResults(query) }; + auto copyrights{ utils::fetchQueryResults(query) }; // various copyrights => no copyright if (copyrights.empty() || copyrights.size() > 1 || copyrights.front().empty()) @@ -663,7 +670,7 @@ namespace lms::db const auto query{ session()->query("SELECT copyright_url FROM track t INNER JOIN release r ON r.id = t.release_id").where("r.id = ?").bind(getId()).groupBy("copyright_url") }; - const auto copyrights{ utils::fetchQueryResults(query) }; + auto copyrights{ utils::fetchQueryResults(query) }; // various copyright URLs => no copyright URL if (copyrights.empty() || copyrights.size() > 1 || copyrights.front().empty()) diff --git a/src/libs/database/impl/objects/Track.cpp b/src/libs/database/impl/objects/Track.cpp index 60c5d2a1..d21794db 100644 --- a/src/libs/database/impl/objects/Track.cpp +++ b/src/libs/database/impl/objects/Track.cpp @@ -643,14 +643,14 @@ namespace lms::db return !_trackLyrics.empty(); } - std::optional Track::getCopyright() const + std::string_view Track::getCopyright() const { - return _copyright != "" ? std::make_optional(_copyright) : std::nullopt; + return _copyright; } - std::optional Track::getCopyrightURL() const + std::string_view Track::getCopyrightURL() const { - return _copyrightURL != "" ? std::make_optional(_copyrightURL) : std::nullopt; + return _copyrightURL; } std::vector Track::getArtists(core::EnumSet linkTypes) const diff --git a/src/libs/database/include/database/objects/Release.hpp b/src/libs/database/include/database/objects/Release.hpp index 81af2ae6..30a4bd8c 100644 --- a/src/libs/database/include/database/objects/Release.hpp +++ b/src/libs/database/include/database/objects/Release.hpp @@ -289,6 +289,7 @@ namespace lms::db std::optional getYear() const; core::PartialDateTime getOriginalDate() const; std::optional getOriginalYear() const; + bool hasVariousCopyrights() const; std::optional getCopyright() const; std::optional getCopyrightURL() const; std::size_t getMeanBitrate() const; diff --git a/src/libs/database/include/database/objects/Track.hpp b/src/libs/database/include/database/objects/Track.hpp index 4a43e8b6..6aad6854 100644 --- a/src/libs/database/include/database/objects/Track.hpp +++ b/src/libs/database/include/database/objects/Track.hpp @@ -297,8 +297,8 @@ namespace lms::db bool hasLyrics() const; std::optional getTrackMBID() const { return core::UUID::fromString(_trackMBID); } std::optional getRecordingMBID() const { return core::UUID::fromString(_recordingMBID); } - std::optional getCopyright() const; - std::optional getCopyrightURL() const; + std::string_view getCopyright() const; + std::string_view getCopyrightURL() const; std::string_view getArtistDisplayName() const { return _artistDisplayName; } std::string_view getComment() const { return _comment; } Advisory getAdvisory() const { return _advisory; } diff --git a/src/lms/ui/Utils.cpp b/src/lms/ui/Utils.cpp index 558d6686..f2241c3c 100644 --- a/src/lms/ui/Utils.cpp +++ b/src/lms/ui/Utils.cpp @@ -474,4 +474,31 @@ namespace lms::ui::utils return artistMap; } + + std::unique_ptr createCopyright(std::string_view copyright, std::string_view copyrightURL) + { + std::unique_ptr res; + + if (copyright.empty() && copyrightURL.empty()) + return res; + + if (copyright.empty() && !copyrightURL.empty()) + copyright = copyrightURL; + + if (!copyrightURL.empty()) + { + Wt::WLink link{ std::string{ copyrightURL } }; + link.setTarget(Wt::LinkTarget::NewWindow); + + auto anchor{ std::make_unique(link) }; + anchor->setTextFormat(Wt::TextFormat::Plain); + anchor->setText(Wt::WString::fromUTF8(std::string{ copyright })); + + res = std::move(anchor); + } + else + res = std::make_unique(Wt::WString::fromUTF8(std::string{ copyright }), Wt::TextFormat::Plain); + + return res; + } } // namespace lms::ui::utils diff --git a/src/lms/ui/Utils.hpp b/src/lms/ui/Utils.hpp index 0b083c41..13c124dc 100644 --- a/src/lms/ui/Utils.hpp +++ b/src/lms/ui/Utils.hpp @@ -91,4 +91,6 @@ namespace lms::ui::utils std::map>> getArtistsByRole(db::ObjectPtr track, core::EnumSet artistLinkTypes = {}); std::map>> getTrackArtistsByRole(db::ObjectPtr release); + + std::unique_ptr createCopyright(std::string_view copyright, std::string_view copyrightURL); } // namespace lms::ui::utils diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index 2405c240..268d69e8 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -522,29 +522,24 @@ namespace lms::ui void Release::refreshCopyright(const db::Release::pointer& release) { - std::optional copyright{ release->getCopyright() }; - std::optional copyrightURL{ release->getCopyrightURL() }; + std::optional copyright; + std::optional copyrightURL; - if (!copyright && !copyrightURL) - return; - - setCondition("if-has-copyright", true); - - std::string copyrightText{ copyright ? *copyright : "" }; - if (copyrightText.empty() && copyrightURL) - copyrightText = *copyrightURL; - - if (copyrightURL) + if (release->hasVariousCopyrights()) { - Wt::WLink link{ *copyrightURL }; - link.setTarget(Wt::LinkTarget::NewWindow); - - Wt::WAnchor* anchor{ bindNew("copyright", link) }; - anchor->setTextFormat(Wt::TextFormat::Plain); - anchor->setText(Wt::WString::fromUTF8(copyrightText)); + copyright = Wt::WString::tr("Lms.Explore.various-copyrights").toUTF8(); } else - bindString("copyright", Wt::WString::fromUTF8(*copyright), Wt::TextFormat::Plain); + { + copyright = release->getCopyright(); + copyrightURL = release->getCopyrightURL(); + } + + if (auto copyrightWidget{ utils::createCopyright(copyright ? *copyright : "", copyrightURL ? *copyrightURL : "") }) + { + setCondition("if-has-copyright", true); + bindWidget("copyright", std::move(copyrightWidget)); + } } void Release::refreshLinks(const db::Release::pointer& release) diff --git a/src/lms/ui/explore/TrackListHelpers.cpp b/src/lms/ui/explore/TrackListHelpers.cpp index 6f77c7ab..d33d36d7 100644 --- a/src/lms/ui/explore/TrackListHelpers.cpp +++ b/src/lms/ui/explore/TrackListHelpers.cpp @@ -96,6 +96,12 @@ namespace lms::ui::TrackListHelpers trackInfo->bindString("comment", Wt::WString::fromUTF8(std::string{ comment }), Wt::TextFormat::Plain); } + if (auto copyrightWidget{ utils::createCopyright(track->getCopyright(), track->getCopyrightURL()) }) + { + trackInfo->setCondition("if-has-copyright", true); + trackInfo->bindWidget("copyright", std::move(copyrightWidget)); + } + Wt::WContainerWidget* clusterContainer{ trackInfo->bindWidget("clusters", utils::createFilterClustersForTrack(track, filters)) }; if (clusterContainer->count() > 0) trackInfo->setCondition("if-has-clusters", true);
${comment}