1 /* 2 * Copyright (C) 2005-2018 Team Kodi 3 * This file is part of Kodi - https://kodi.tv 4 * 5 * SPDX-License-Identifier: GPL-2.0-or-later 6 * See LICENSES/README.md for more information. 7 */ 8 9 #pragma once 10 11 #include "XBDateTime.h" 12 #include "utils/ScraperUrl.h" 13 #include "utils/StringUtils.h" 14 15 #include <map> 16 #include <string> 17 #include <utility> 18 #include <vector> 19 20 class TiXmlNode; 21 class CAlbum; 22 class CMusicDatabase; 23 24 class CDiscoAlbum 25 { 26 public: 27 std::string strAlbum; 28 std::string strYear; 29 std::string strReleaseGroupMBID; 30 }; 31 32 class CArtist 33 { 34 public: 35 int idArtist = -1; 36 bool operator<(const CArtist& a) const 37 { 38 if (strMusicBrainzArtistID.empty() && a.strMusicBrainzArtistID.empty()) 39 { 40 if (strArtist < a.strArtist) return true; 41 if (strArtist > a.strArtist) return false; 42 return false; 43 } 44 45 if (strMusicBrainzArtistID < a.strMusicBrainzArtistID) return true; 46 if (strMusicBrainzArtistID > a.strMusicBrainzArtistID) return false; 47 return false; 48 } 49 50 void MergeScrapedArtist(const CArtist& source, bool override = true); 51 Reset()52 void Reset() 53 { 54 strArtist.clear(); 55 strSortName.clear(); 56 strType.clear(); 57 strGender.clear(); 58 strDisambiguation.clear(); 59 genre.clear(); 60 strBiography.clear(); 61 styles.clear(); 62 moods.clear(); 63 instruments.clear(); 64 strBorn.clear(); 65 strFormed.clear(); 66 strDied.clear(); 67 strDisbanded.clear(); 68 yearsActive.clear(); 69 thumbURL.Clear(); 70 art.clear(); 71 discography.clear(); 72 idArtist = -1; 73 strPath.clear(); 74 dateAdded.Reset(); 75 dateUpdated.Reset(); 76 dateNew.Reset(); 77 bScrapedMBID = false; 78 strLastScraped.clear(); 79 } 80 81 /*! \brief Load artist information from an XML file. 82 See CVideoInfoTag::Load for a description of the types of elements we load. 83 \param element the root XML element to parse. 84 \param append whether information should be added to the existing tag, or whether it should be reset first. 85 \param prioritise if appending, whether additive tags should be prioritised (i.e. replace or prepend) over existing values. Defaults to false. 86 \sa CVideoInfoTag::Load 87 */ 88 bool Load(const TiXmlElement *element, bool append = false, bool prioritise = false); 89 bool Save(TiXmlNode *node, const std::string &tag, const std::string& strPath); 90 91 void SetDateAdded(const std::string& strDateAdded); 92 void SetDateUpdated(const std::string& strDateUpdated); 93 void SetDateNew(const std::string& strDateNew); 94 95 std::string strArtist; 96 std::string strSortName; 97 std::string strMusicBrainzArtistID; 98 std::string strType; 99 std::string strGender; 100 std::string strDisambiguation; 101 std::vector<std::string> genre; 102 std::string strBiography; 103 std::vector<std::string> styles; 104 std::vector<std::string> moods; 105 std::vector<std::string> instruments; 106 std::string strBorn; 107 std::string strFormed; 108 std::string strDied; 109 std::string strDisbanded; 110 std::vector<std::string> yearsActive; 111 std::string strPath; 112 CScraperUrl thumbURL; // Data for available remote art 113 std::map<std::string, std::string> art; // Current artwork - thumb, fanart etc. 114 std::vector<CDiscoAlbum> discography; 115 CDateTime dateAdded; // From related file creation or modification times, or when (re-)scanned 116 CDateTime dateUpdated; // Time db record Last modified 117 CDateTime dateNew; // Time db record created 118 bool bScrapedMBID = false; 119 std::string strLastScraped; 120 }; 121 122 class CArtistCredit 123 { 124 friend class CAlbum; 125 friend class CMusicDatabase; 126 127 public: 128 CArtistCredit() = default; CArtistCredit(std::string strArtist)129 explicit CArtistCredit(std::string strArtist) : m_strArtist(std::move(strArtist)) {} CArtistCredit(std::string strArtist,std::string strMusicBrainzArtistID)130 CArtistCredit(std::string strArtist, std::string strMusicBrainzArtistID) 131 : m_strArtist(std::move(strArtist)), m_strMusicBrainzArtistID(std::move(strMusicBrainzArtistID)) 132 { 133 } CArtistCredit(std::string strArtist,std::string strSortName,std::string strMusicBrainzArtistID)134 CArtistCredit(std::string strArtist, std::string strSortName, std::string strMusicBrainzArtistID) 135 : m_strArtist(std::move(strArtist)), 136 m_strSortName(std::move(strSortName)), 137 m_strMusicBrainzArtistID(std::move(strMusicBrainzArtistID)) 138 { 139 } 140 141 bool operator<(const CArtistCredit& a) const 142 { 143 if (m_strMusicBrainzArtistID.empty() && a.m_strMusicBrainzArtistID.empty()) 144 { 145 if (m_strArtist < a.m_strArtist) return true; 146 if (m_strArtist > a.m_strArtist) return false; 147 return false; 148 } 149 150 if (m_strMusicBrainzArtistID < a.m_strMusicBrainzArtistID) return true; 151 if (m_strMusicBrainzArtistID > a.m_strMusicBrainzArtistID) return false; 152 return false; 153 } 154 GetArtist()155 std::string GetArtist() const { return m_strArtist; } GetSortName()156 std::string GetSortName() const { return m_strSortName; } GetMusicBrainzArtistID()157 std::string GetMusicBrainzArtistID() const { return m_strMusicBrainzArtistID; } GetArtistId()158 int GetArtistId() const { return idArtist; } HasScrapedMBID()159 bool HasScrapedMBID() const { return m_bScrapedMBID; } SetArtist(const std::string & strArtist)160 void SetArtist(const std::string &strArtist) { m_strArtist = strArtist; } SetSortName(const std::string & strSortName)161 void SetSortName(const std::string &strSortName) { m_strSortName = strSortName; } SetMusicBrainzArtistID(const std::string & strMusicBrainzArtistID)162 void SetMusicBrainzArtistID(const std::string &strMusicBrainzArtistID) { m_strMusicBrainzArtistID = strMusicBrainzArtistID; } SetArtistId(int idArtist)163 void SetArtistId(int idArtist) { this->idArtist = idArtist; } SetScrapedMBID(bool scrapedMBID)164 void SetScrapedMBID(bool scrapedMBID) { this->m_bScrapedMBID = scrapedMBID; } 165 166 private: 167 int idArtist = -1; 168 std::string m_strArtist; 169 std::string m_strSortName; 170 std::string m_strMusicBrainzArtistID; 171 bool m_bScrapedMBID = false; // Flag that mbid is from album merge of scarper results not derived from tags 172 }; 173 174 typedef std::vector<CArtist> VECARTISTS; 175 typedef std::vector<CArtistCredit> VECARTISTCREDITS; 176 177 const std::string BLANKARTIST_FAKEMUSICBRAINZID = "Artist Tag Missing"; 178 const std::string BLANKARTIST_NAME = "[Missing Tag]"; 179 const int BLANKARTIST_ID = 1; 180 const std::string VARIOUSARTISTS_MBID = "89ad4ac3-39f7-470e-963a-56509c546377"; 181 182 #define ROLE_ARTIST 1 //Default role 183 184 class CMusicRole 185 { 186 public: 187 CMusicRole() = default; CMusicRole(std::string strRole,std::string strArtist)188 CMusicRole(std::string strRole, std::string strArtist) 189 : idRole(-1), m_strRole(std::move(strRole)), m_strArtist(std::move(strArtist)), idArtist(-1) 190 { 191 } CMusicRole(int role,std::string strRole,std::string strArtist,int ArtistId)192 CMusicRole(int role, std::string strRole, std::string strArtist, int ArtistId) 193 : idRole(role), 194 m_strRole(std::move(strRole)), 195 m_strArtist(std::move(strArtist)), 196 idArtist(ArtistId) 197 { 198 } GetArtist()199 std::string GetArtist() const { return m_strArtist; } GetRoleDesc()200 std::string GetRoleDesc() const { return m_strRole; } GetRoleId()201 int GetRoleId() const { return idRole; } GetArtistId()202 int GetArtistId() const { return idArtist; } SetArtistId(int iArtistId)203 void SetArtistId(int iArtistId) { idArtist = iArtistId; } 204 205 bool operator==(const CMusicRole& a) const 206 { 207 if (StringUtils::EqualsNoCase(m_strRole, a.m_strRole)) 208 return StringUtils::EqualsNoCase(m_strArtist, a.m_strArtist); 209 else 210 return false; 211 } 212 private: 213 int idRole; 214 std::string m_strRole; 215 std::string m_strArtist; 216 int idArtist; 217 }; 218 219 typedef std::vector<CMusicRole> VECMUSICROLES; 220 221 222 223