summaryrefslogtreecommitdiffstats
path: root/xbmc/music/Artist.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/music/Artist.h')
-rw-r--r--xbmc/music/Artist.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/xbmc/music/Artist.h b/xbmc/music/Artist.h
new file mode 100644
index 0000000..2ec77a8
--- /dev/null
+++ b/xbmc/music/Artist.h
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "XBDateTime.h"
+#include "utils/ScraperUrl.h"
+#include "utils/StringUtils.h"
+
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+class TiXmlNode;
+class CAlbum;
+class CMusicDatabase;
+
+class CDiscoAlbum
+{
+public:
+ std::string strAlbum;
+ std::string strYear;
+ std::string strReleaseGroupMBID;
+};
+
+class CArtist
+{
+public:
+ int idArtist = -1;
+ bool operator<(const CArtist& a) const
+ {
+ if (strMusicBrainzArtistID.empty() && a.strMusicBrainzArtistID.empty())
+ {
+ if (strArtist < a.strArtist) return true;
+ if (strArtist > a.strArtist) return false;
+ return false;
+ }
+
+ if (strMusicBrainzArtistID < a.strMusicBrainzArtistID) return true;
+ if (strMusicBrainzArtistID > a.strMusicBrainzArtistID) return false;
+ return false;
+ }
+
+ void MergeScrapedArtist(const CArtist& source, bool override = true);
+
+ void Reset()
+ {
+ strArtist.clear();
+ strSortName.clear();
+ strType.clear();
+ strGender.clear();
+ strDisambiguation.clear();
+ genre.clear();
+ strBiography.clear();
+ styles.clear();
+ moods.clear();
+ instruments.clear();
+ strBorn.clear();
+ strFormed.clear();
+ strDied.clear();
+ strDisbanded.clear();
+ yearsActive.clear();
+ thumbURL.Clear();
+ art.clear();
+ discography.clear();
+ idArtist = -1;
+ strPath.clear();
+ dateAdded.Reset();
+ dateUpdated.Reset();
+ dateNew.Reset();
+ bScrapedMBID = false;
+ strLastScraped.clear();
+ }
+
+ /*! \brief Load artist information from an XML file.
+ See CVideoInfoTag::Load for a description of the types of elements we load.
+ \param element the root XML element to parse.
+ \param append whether information should be added to the existing tag, or whether it should be reset first.
+ \param prioritise if appending, whether additive tags should be prioritised (i.e. replace or prepend) over existing values. Defaults to false.
+ \sa CVideoInfoTag::Load
+ */
+ bool Load(const TiXmlElement *element, bool append = false, bool prioritise = false);
+ bool Save(TiXmlNode *node, const std::string &tag, const std::string& strPath);
+
+ void SetDateAdded(const std::string& strDateAdded);
+ void SetDateUpdated(const std::string& strDateUpdated);
+ void SetDateNew(const std::string& strDateNew);
+
+ std::string strArtist;
+ std::string strSortName;
+ std::string strMusicBrainzArtistID;
+ std::string strType;
+ std::string strGender;
+ std::string strDisambiguation;
+ std::vector<std::string> genre;
+ std::string strBiography;
+ std::vector<std::string> styles;
+ std::vector<std::string> moods;
+ std::vector<std::string> instruments;
+ std::string strBorn;
+ std::string strFormed;
+ std::string strDied;
+ std::string strDisbanded;
+ std::vector<std::string> yearsActive;
+ std::string strPath;
+ CScraperUrl thumbURL; // Data for available remote art
+ std::map<std::string, std::string> art; // Current artwork - thumb, fanart etc.
+ std::vector<CDiscoAlbum> discography;
+ CDateTime dateAdded; // From related file creation or modification times, or when (re-)scanned
+ CDateTime dateUpdated; // Time db record Last modified
+ CDateTime dateNew; // Time db record created
+ bool bScrapedMBID = false;
+ std::string strLastScraped;
+};
+
+class CArtistCredit
+{
+ friend class CAlbum;
+ friend class CMusicDatabase;
+
+public:
+ CArtistCredit() = default;
+ explicit CArtistCredit(std::string strArtist) : m_strArtist(std::move(strArtist)) {}
+ CArtistCredit(std::string strArtist, std::string strMusicBrainzArtistID)
+ : m_strArtist(std::move(strArtist)), m_strMusicBrainzArtistID(std::move(strMusicBrainzArtistID))
+ {
+ }
+ CArtistCredit(std::string strArtist, std::string strSortName, std::string strMusicBrainzArtistID)
+ : m_strArtist(std::move(strArtist)),
+ m_strSortName(std::move(strSortName)),
+ m_strMusicBrainzArtistID(std::move(strMusicBrainzArtistID))
+ {
+ }
+
+ bool operator<(const CArtistCredit& a) const
+ {
+ if (m_strMusicBrainzArtistID.empty() && a.m_strMusicBrainzArtistID.empty())
+ {
+ if (m_strArtist < a.m_strArtist) return true;
+ if (m_strArtist > a.m_strArtist) return false;
+ return false;
+ }
+
+ if (m_strMusicBrainzArtistID < a.m_strMusicBrainzArtistID) return true;
+ if (m_strMusicBrainzArtistID > a.m_strMusicBrainzArtistID) return false;
+ return false;
+ }
+
+ std::string GetArtist() const { return m_strArtist; }
+ std::string GetSortName() const { return m_strSortName; }
+ std::string GetMusicBrainzArtistID() const { return m_strMusicBrainzArtistID; }
+ int GetArtistId() const { return idArtist; }
+ bool HasScrapedMBID() const { return m_bScrapedMBID; }
+ void SetArtist(const std::string &strArtist) { m_strArtist = strArtist; }
+ void SetSortName(const std::string &strSortName) { m_strSortName = strSortName; }
+ void SetMusicBrainzArtistID(const std::string &strMusicBrainzArtistID) { m_strMusicBrainzArtistID = strMusicBrainzArtistID; }
+ void SetArtistId(int idArtist) { this->idArtist = idArtist; }
+ void SetScrapedMBID(bool scrapedMBID) { this->m_bScrapedMBID = scrapedMBID; }
+
+private:
+ int idArtist = -1;
+ std::string m_strArtist;
+ std::string m_strSortName;
+ std::string m_strMusicBrainzArtistID;
+ bool m_bScrapedMBID = false; // Flag that mbid is from album merge of scarper results not derived from tags
+};
+
+typedef std::vector<CArtist> VECARTISTS;
+typedef std::vector<CArtistCredit> VECARTISTCREDITS;
+
+const std::string BLANKARTIST_FAKEMUSICBRAINZID = "Artist Tag Missing";
+const std::string BLANKARTIST_NAME = "[Missing Tag]";
+const int BLANKARTIST_ID = 1;
+const std::string VARIOUSARTISTS_MBID = "89ad4ac3-39f7-470e-963a-56509c546377";
+
+#define ROLE_ARTIST 1 //Default role
+
+class CMusicRole
+{
+public:
+ CMusicRole() = default;
+ CMusicRole(std::string strRole, std::string strArtist)
+ : idRole(-1), m_strRole(std::move(strRole)), m_strArtist(std::move(strArtist)), idArtist(-1)
+ {
+ }
+ CMusicRole(int role, std::string strRole, std::string strArtist, int ArtistId)
+ : idRole(role),
+ m_strRole(std::move(strRole)),
+ m_strArtist(std::move(strArtist)),
+ idArtist(ArtistId)
+ {
+ }
+ std::string GetArtist() const { return m_strArtist; }
+ std::string GetRoleDesc() const { return m_strRole; }
+ int GetRoleId() const { return idRole; }
+ int GetArtistId() const { return idArtist; }
+ void SetArtistId(int iArtistId) { idArtist = iArtistId; }
+
+ bool operator==(const CMusicRole& a) const
+ {
+ if (StringUtils::EqualsNoCase(m_strRole, a.m_strRole))
+ return StringUtils::EqualsNoCase(m_strArtist, a.m_strArtist);
+ else
+ return false;
+ }
+private:
+ int idRole;
+ std::string m_strRole;
+ std::string m_strArtist;
+ int idArtist;
+};
+
+typedef std::vector<CMusicRole> VECMUSICROLES;
+
+
+