Add copyright/copyrightURL support and display it in the release view

This commit is contained in:
emeric
2018-09-21 14:00:15 +02:00
parent c464200644
commit f5f6136159
13 changed files with 139 additions and 19 deletions
+43 -1
View File
@@ -19,6 +19,8 @@
#include "Release.hpp"
#include "utils/Logger.hpp"
#include "Artist.hpp"
#include "Cluster.hpp"
#include "SqlQuery.hpp"
@@ -163,7 +165,7 @@ Release::getReleaseYear(bool original) const
.groupBy(field)
.bind(this->id());
/* various dates, no date */
// various dates => no date
if (dates.empty() || dates.size() > 1)
return boost::none;
@@ -175,6 +177,46 @@ Release::getReleaseYear(bool original) const
return boost::none;
}
boost::optional<std::string>
Release::getCopyright() const
{
assert(session());
Wt::Dbo::collection<std::string> copyrights = 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(this->id());
std::vector<std::string> values(copyrights.begin(), copyrights.end());
// various copyrights => no copyright
if (values.empty() || values.size() > 1 || values.front().empty())
return boost::none;
return values.front();
}
boost::optional<std::string>
Release::getCopyrightURL() const
{
assert(session());
Wt::Dbo::collection<std::string> copyrights = session()->query<std::string>
("SELECT copyright_url FROM track t INNER JOIN release r ON r.id = t.release_id")
.where("r.id = ?")
.groupBy("copyright_url")
.bind(this->id());
std::vector<std::string> values(copyrights.begin(), copyrights.end());
// various copyright URLs => no copyright URL
if (values.empty() || values.size() > 1 || values.front().empty())
return boost::none;
return values.front();
}
std::vector<Wt::Dbo::ptr<Artist>>
Release::getArtists() const
{
+2
View File
@@ -69,6 +69,8 @@ class Release : public Wt::Dbo::Dbo<Release>
// Utility functions
boost::optional<int> getReleaseYear(bool originalDate = false) const; // 0 if unknown or various
boost::optional<std::string> getCopyright() const;
boost::optional<std::string> getCopyrightURL() const;
// Accessors
std::string getName() const { return _name; }
+12
View File
@@ -224,6 +224,18 @@ Track::getOriginalYear() const
return (_originalYear > 0) ? boost::make_optional<int>(_originalYear) : boost::none;
}
boost::optional<std::string>
Track::getCopyright() const
{
return _copyright != "" ? boost::make_optional<std::string>(_copyright) : boost::none;
}
boost::optional<std::string>
Track::getCopyrightURL() const
{
return _copyrightURL != "" ? boost::make_optional<std::string>(_copyrightURL) : boost::none;
}
std::vector<std::vector<Cluster::pointer>>
Track::getClusterGroups(std::vector<ClusterType::pointer> clusterTypes, std::size_t size) const
{
+15 -11
View File
@@ -49,12 +49,6 @@ class Track : public Wt::Dbo::Dbo<Track>
Track() {}
Track(const boost::filesystem::path& p);
enum class CoverType
{
Embedded, // Contains embedded cover
None, // No local cover available
};
// Find utility functions
static pointer getByPath(Wt::Dbo::Session& session, const boost::filesystem::path& p);
static pointer getById(Wt::Dbo::Session& session, IdType id);
@@ -95,8 +89,10 @@ class Track : public Wt::Dbo::Dbo<Track>
void setYear(int year) { _year = year; }
void setOriginalYear(int year) { _originalYear = year; }
void setGenres(const std::string& genreList) { _genreList = genreList; }
void setCoverType(CoverType coverType) { _coverType = coverType; }
void setHasCover(bool hasCover) { _hasCover = hasCover; }
void setMBID(const std::string& MBID) { _MBID = MBID; }
void setCopyright(const std::string& copyright) { _copyright = std::string(copyright, 0, _maxCopyrightLength); }
void setCopyrightURL(const std::string& copyrightURL) { _copyrightURL = std::string(copyrightURL, 0, _maxCopyrightURLLength); }
void setArtist(Wt::Dbo::ptr<Artist> artist) { _artist = artist; }
void setRelease(Wt::Dbo::ptr<Release> release) { _release = release; }
@@ -113,8 +109,10 @@ class Track : public Wt::Dbo::Dbo<Track>
Wt::WDateTime getLastWriteTime() const { return _fileLastWrite; }
Wt::WDateTime getAddedTime() const { return _fileAdded; }
const std::vector<unsigned char>& getChecksum() const { return _fileChecksum; }
CoverType getCoverType() const { return _coverType; }
bool hasCover() const { return _hasCover; }
const std::string& getMBID() const { return _MBID; }
boost::optional<std::string> getCopyright() const;
boost::optional<std::string> getCopyrightURL() const;
Wt::Dbo::ptr<Artist> getArtist() const { return _artist; }
Wt::Dbo::ptr<Release> getRelease() const { return _release; }
std::vector<Wt::Dbo::ptr<Cluster>> getClusters() const;
@@ -138,8 +136,10 @@ class Track : public Wt::Dbo::Dbo<Track>
Wt::Dbo::field(a, _fileLastWrite, "file_last_write");
Wt::Dbo::field(a, _fileAdded, "file_added");
Wt::Dbo::field(a, _fileChecksum, "checksum");
Wt::Dbo::field(a, _coverType, "cover_type");
Wt::Dbo::field(a, _hasCover, "has_cover");
Wt::Dbo::field(a, _MBID, "mbid");
Wt::Dbo::field(a, _copyright, "copyright");
Wt::Dbo::field(a, _copyrightURL, "copyright_url");
Wt::Dbo::belongsTo(a, _release, "release", Wt::Dbo::OnDeleteCascade);
Wt::Dbo::belongsTo(a, _artist, "artist", Wt::Dbo::OnDeleteCascade);
Wt::Dbo::hasMany(a, _clusters, Wt::Dbo::ManyToMany, "track_cluster", "", Wt::Dbo::OnDeleteCascade);
@@ -149,6 +149,8 @@ class Track : public Wt::Dbo::Dbo<Track>
private:
static const std::size_t _maxNameLength = 128;
static const std::size_t _maxCopyrightLength = 128;
static const std::size_t _maxCopyrightURLLength = 128;
int _scanVersion = 0;
int _trackNumber = 0;
@@ -166,8 +168,10 @@ class Track : public Wt::Dbo::Dbo<Track>
std::vector<unsigned char> _fileChecksum;
Wt::WDateTime _fileLastWrite;
Wt::WDateTime _fileAdded;
CoverType _coverType = CoverType::None;
std::string _MBID = ""; // Musicbrainz Identifier
bool _hasCover;
std::string _MBID; // Musicbrainz Identifier
std::string _copyright;
std::string _copyrightURL;
Wt::Dbo::ptr<Artist> _artist;
Wt::Dbo::ptr<Release> _release;