Added copyright info each track, fixes #793
This commit is contained in:
@@ -642,13 +642,20 @@ namespace lms::db
|
||||
return *year;
|
||||
}
|
||||
|
||||
bool Release::hasVariousCopyrights() const
|
||||
{
|
||||
assert(session());
|
||||
|
||||
return utils::fetchQuerySingleResult(session()->query<int>("SELECT COUNT(DISTINCT copyright) FROM track t").where("t.release_id = ?").bind(getId())) > 1;
|
||||
}
|
||||
|
||||
std::optional<std::string> Release::getCopyright() const
|
||||
{
|
||||
assert(session());
|
||||
|
||||
auto query{ session()->query<std::string>("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<std::string>("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())
|
||||
|
||||
@@ -643,14 +643,14 @@ namespace lms::db
|
||||
return !_trackLyrics.empty();
|
||||
}
|
||||
|
||||
std::optional<std::string> Track::getCopyright() const
|
||||
std::string_view Track::getCopyright() const
|
||||
{
|
||||
return _copyright != "" ? std::make_optional<std::string>(_copyright) : std::nullopt;
|
||||
return _copyright;
|
||||
}
|
||||
|
||||
std::optional<std::string> Track::getCopyrightURL() const
|
||||
std::string_view Track::getCopyrightURL() const
|
||||
{
|
||||
return _copyrightURL != "" ? std::make_optional<std::string>(_copyrightURL) : std::nullopt;
|
||||
return _copyrightURL;
|
||||
}
|
||||
|
||||
std::vector<Artist::pointer> Track::getArtists(core::EnumSet<TrackArtistLinkType> linkTypes) const
|
||||
|
||||
@@ -289,6 +289,7 @@ namespace lms::db
|
||||
std::optional<int> getYear() const;
|
||||
core::PartialDateTime getOriginalDate() const;
|
||||
std::optional<int> getOriginalYear() const;
|
||||
bool hasVariousCopyrights() const;
|
||||
std::optional<std::string> getCopyright() const;
|
||||
std::optional<std::string> getCopyrightURL() const;
|
||||
std::size_t getMeanBitrate() const;
|
||||
|
||||
@@ -297,8 +297,8 @@ namespace lms::db
|
||||
bool hasLyrics() const;
|
||||
std::optional<core::UUID> getTrackMBID() const { return core::UUID::fromString(_trackMBID); }
|
||||
std::optional<core::UUID> getRecordingMBID() const { return core::UUID::fromString(_recordingMBID); }
|
||||
std::optional<std::string> getCopyright() const;
|
||||
std::optional<std::string> 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; }
|
||||
|
||||
@@ -474,4 +474,31 @@ namespace lms::ui::utils
|
||||
|
||||
return artistMap;
|
||||
}
|
||||
|
||||
std::unique_ptr<Wt::WInteractWidget> createCopyright(std::string_view copyright, std::string_view copyrightURL)
|
||||
{
|
||||
std::unique_ptr<Wt::WInteractWidget> 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<Wt::WAnchor>(link) };
|
||||
anchor->setTextFormat(Wt::TextFormat::Plain);
|
||||
anchor->setText(Wt::WString::fromUTF8(std::string{ copyright }));
|
||||
|
||||
res = std::move(anchor);
|
||||
}
|
||||
else
|
||||
res = std::make_unique<Wt::WText>(Wt::WString::fromUTF8(std::string{ copyright }), Wt::TextFormat::Plain);
|
||||
|
||||
return res;
|
||||
}
|
||||
} // namespace lms::ui::utils
|
||||
|
||||
@@ -91,4 +91,6 @@ namespace lms::ui::utils
|
||||
|
||||
std::map<Wt::WString, std::vector<db::ObjectPtr<db::Artist>>> getArtistsByRole(db::ObjectPtr<db::Track> track, core::EnumSet<db::TrackArtistLinkType> artistLinkTypes = {});
|
||||
std::map<Wt::WString, std::vector<db::ObjectPtr<db::Artist>>> getTrackArtistsByRole(db::ObjectPtr<db::Release> release);
|
||||
|
||||
std::unique_ptr<Wt::WInteractWidget> createCopyright(std::string_view copyright, std::string_view copyrightURL);
|
||||
} // namespace lms::ui::utils
|
||||
|
||||
@@ -522,29 +522,24 @@ namespace lms::ui
|
||||
|
||||
void Release::refreshCopyright(const db::Release::pointer& release)
|
||||
{
|
||||
std::optional<std::string> copyright{ release->getCopyright() };
|
||||
std::optional<std::string> copyrightURL{ release->getCopyrightURL() };
|
||||
std::optional<std::string> copyright;
|
||||
std::optional<std::string> 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<Wt::WAnchor>("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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user