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 class CSong; 12 class CArtist; 13 class CVariant; 14 15 #include "ReplayGain.h" 16 #include "XBDateTime.h" 17 #include "music/Album.h" 18 #include "utils/IArchivable.h" 19 #include "utils/ISerializable.h" 20 #include "utils/ISortable.h" 21 22 #include <string> 23 #include <vector> 24 25 namespace MUSIC_INFO 26 { 27 class CMusicInfoTag final : public IArchivable, public ISerializable, public ISortable 28 { 29 public: 30 CMusicInfoTag(void); 31 bool operator !=(const CMusicInfoTag& tag) const; 32 bool Loaded() const; 33 const std::string& GetTitle() const; 34 const std::string& GetURL() const; 35 const std::vector<std::string>& GetArtist() const; 36 const std::string& GetArtistSort() const; 37 const std::string GetArtistString() const; 38 const std::string& GetComposerSort() const; 39 const std::string& GetAlbum() const; 40 int GetAlbumId() const; 41 const std::vector<std::string>& GetAlbumArtist() const; 42 const std::string GetAlbumArtistString() const; 43 const std::string& GetAlbumArtistSort() const; 44 const std::vector<std::string>& GetGenre() const; 45 int GetTrackNumber() const; 46 int GetDiscNumber() const; 47 int GetTrackAndDiscNumber() const; 48 int GetTotalDiscs() const; 49 int GetDuration() const; // may be set even if Loaded() returns false 50 int GetYear() const; 51 const std::string& GetReleaseDate() const; 52 const std::string GetReleaseYear() const; 53 const std::string& GetOriginalDate() const; 54 const std::string GetOriginalYear() const; 55 int GetDatabaseId() const; 56 const std::string &GetType() const; 57 const std::string& GetDiscSubtitle() const; 58 int GetBPM() const; 59 std::string GetYearString() const; 60 const std::string& GetMusicBrainzTrackID() const; 61 const std::vector<std::string>& GetMusicBrainzArtistID() const; 62 const std::vector<std::string>& GetMusicBrainzArtistHints() const; 63 const std::string& GetMusicBrainzAlbumID() const; 64 const std::string& GetMusicBrainzReleaseGroupID() const; 65 const std::vector<std::string>& GetMusicBrainzAlbumArtistID() const; 66 const std::vector<std::string>& GetMusicBrainzAlbumArtistHints() const; 67 const std::string& GetMusicBrainzReleaseType() const; 68 const std::string& GetComment() const; 69 const std::string& GetMood() const; 70 const std::string& GetRecordLabel() const; 71 const std::string& GetLyrics() const; 72 const std::string& GetCueSheet() const; 73 const CDateTime& GetLastPlayed() const; 74 const CDateTime& GetDateAdded() const; 75 bool GetCompilation() const; 76 bool GetBoxset() const; 77 float GetRating() const; 78 int GetUserrating() const; 79 int GetVotes() const; 80 int GetListeners() const; 81 int GetPlayCount() const; 82 int GetBitRate() const; 83 int GetNoOfChannels() const; 84 int GetSampleRate() const; 85 const std::string& GetAlbumReleaseStatus() const; 86 const std::string& GetStationName() const; 87 const std::string& GetStationArt() const; 88 const EmbeddedArtInfo &GetCoverArtInfo() const; 89 const ReplayGain& GetReplayGain() const; 90 CAlbum::ReleaseType GetAlbumReleaseType() const; 91 92 void SetURL(const std::string& strURL); 93 void SetTitle(const std::string& strTitle); 94 void SetArtist(const std::string& strArtist); 95 void SetArtist(const std::vector<std::string>& artists, bool FillDesc = false); 96 void SetArtistDesc(const std::string& strArtistDesc); 97 void SetArtistSort(const std::string& strArtistsort); 98 void SetComposerSort(const std::string& strComposerSort); 99 void SetAlbum(const std::string& strAlbum); 100 void SetAlbumId(const int iAlbumId); 101 void SetAlbumArtist(const std::string& strAlbumArtist); 102 void SetAlbumArtist(const std::vector<std::string>& albumArtists, bool FillDesc = false); 103 void SetAlbumArtistDesc(const std::string& strAlbumArtistDesc); 104 void SetAlbumArtistSort(const std::string& strAlbumArtistSort); 105 void SetGenre(const std::string& strGenre, bool bTrim = false); 106 void SetGenre(const std::vector<std::string>& genres, bool bTrim = false); 107 void SetYear(int year); 108 void SetOriginalDate(const std::string& strOriginalDate); 109 void SetReleaseDate(const std::string& strReleaseDate); 110 void SetDatabaseId(int id, const std::string &type); 111 void SetTrackNumber(int iTrack); 112 void SetDiscNumber(int iDiscNumber); 113 void SetTrackAndDiscNumber(int iTrackAndDisc); 114 void SetDuration(int iSec); 115 void SetLoaded(bool bOnOff = true); 116 void SetArtist(const CArtist& artist); 117 void SetAlbum(const CAlbum& album); 118 void SetSong(const CSong& song); 119 void SetMusicBrainzTrackID(const std::string& strTrackID); 120 void SetMusicBrainzArtistID(const std::vector<std::string>& musicBrainzArtistId); 121 void SetMusicBrainzArtistHints(const std::vector<std::string>& musicBrainzArtistHints); 122 void SetMusicBrainzAlbumID(const std::string& strAlbumID); 123 void SetMusicBrainzAlbumArtistID(const std::vector<std::string>& musicBrainzAlbumArtistId); 124 void SetMusicBrainzAlbumArtistHints(const std::vector<std::string>& musicBrainzAlbumArtistHints); 125 void SetMusicBrainzReleaseGroupID(const std::string& strReleaseGroupID); 126 void SetMusicBrainzReleaseType(const std::string& ReleaseType); 127 void SetComment(const std::string& comment); 128 void SetMood(const std::string& mood); 129 void SetRecordLabel(const std::string& publisher); 130 void SetLyrics(const std::string& lyrics); 131 void SetCueSheet(const std::string& cueSheet); 132 void SetRating(float rating); 133 void SetUserrating(int rating); 134 void SetVotes(int votes); 135 void SetListeners(int listeners); 136 void SetPlayCount(int playcount); 137 void SetLastPlayed(const std::string& strLastPlayed); 138 void SetLastPlayed(const CDateTime& strLastPlayed); 139 void SetDateAdded(const std::string& strDateAdded); 140 void SetDateAdded(const CDateTime& dateAdded); 141 void SetDateUpdated(const std::string& strDateUpdated); 142 void SetDateUpdated(const CDateTime& dateUpdated); 143 void SetDateNew(const std::string& strDateNew); 144 void SetDateNew(const CDateTime& dateNew); 145 void SetCompilation(bool compilation); 146 void SetBoxset(bool boxset); 147 void SetCoverArtInfo(size_t size, const std::string &mimeType); 148 void SetReplayGain(const ReplayGain& aGain); 149 void SetAlbumReleaseType(CAlbum::ReleaseType releaseType); 150 void SetType(const MediaType& mediaType); 151 void SetDiscSubtitle(const std::string& strDiscSubtitle); 152 void SetTotalDiscs(int iDiscTotal); 153 void SetBPM(int iBPM); 154 void SetBitRate(int bitrate); 155 void SetNoOfChannels(int channels); 156 void SetSampleRate(int samplerate); 157 void SetAlbumReleaseStatus(const std::string& strReleaseStatus); 158 void SetStationName(const std::string& strStationName); // name of online radio station 159 void SetStationArt(const std::string& strStationArt); 160 161 /*! \brief Append a unique artist to the artist list 162 Checks if we have this artist already added, and if not adds it to the songs artist list. 163 \param value artist to add. 164 */ 165 void AppendArtist(const std::string &artist); 166 167 /*! \brief Append a unique album artist to the artist list 168 Checks if we have this album artist already added, and if not adds it to the songs album artist list. 169 \param albumArtist album artist to add. 170 */ 171 void AppendAlbumArtist(const std::string &albumArtist); 172 173 /*! \brief Append a unique genre to the genre list 174 Checks if we have this genre already added, and if not adds it to the songs genre list. 175 \param genre genre to add. 176 */ 177 void AppendGenre(const std::string &genre); 178 void AddOriginalDate(const std::string& strDateYear); 179 void AddReleaseDate(const std::string& strDateYear, bool isMonth = false); 180 181 void AddArtistRole(const std::string& Role, const std::string& strArtist); 182 void AddArtistRole(const std::string& Role, const std::vector<std::string>& artists); 183 void AppendArtistRole(const CMusicRole& ArtistRole); 184 const std::string GetArtistStringForRole(const std::string& strRole) const; 185 const std::string GetContributorsText() const; 186 const std::string GetContributorsAndRolesText() const; 187 const VECMUSICROLES &GetContributors() const; 188 void SetContributors(const VECMUSICROLES& contributors); HasContributors()189 bool HasContributors() const { return !m_musicRoles.empty(); } 190 191 void Archive(CArchive& ar) override; 192 void Serialize(CVariant& ar) const override; 193 void ToSortable(SortItem& sortable, Field field) const override; 194 195 void Clear(); 196 197 protected: 198 /*! \brief Trim whitespace off the given string 199 \param value string to trim 200 \return trimmed value, with spaces removed from left and right, as well as carriage returns from the right. 201 */ 202 std::string Trim(const std::string &value) const; 203 204 std::string m_strURL; 205 std::string m_strTitle; 206 std::vector<std::string> m_artist; 207 std::string m_strArtistSort; 208 std::string m_strArtistDesc; 209 std::string m_strComposerSort; 210 std::string m_strAlbum; 211 std::vector<std::string> m_albumArtist; 212 std::string m_strAlbumArtistDesc; 213 std::string m_strAlbumArtistSort; 214 std::vector<std::string> m_genre; 215 std::string m_strMusicBrainzTrackID; 216 std::vector<std::string> m_musicBrainzArtistID; 217 std::vector<std::string> m_musicBrainzArtistHints; 218 std::string m_strMusicBrainzAlbumID; 219 std::vector<std::string> m_musicBrainzAlbumArtistID; 220 std::vector<std::string> m_musicBrainzAlbumArtistHints; 221 std::string m_strMusicBrainzReleaseGroupID; 222 std::string m_strMusicBrainzReleaseType; 223 VECMUSICROLES m_musicRoles; //Artists contributing to the recording and role (from tags other than ARTIST or ALBUMARTIST) 224 std::string m_strComment; 225 std::string m_strMood; 226 std::string m_strRecordLabel; 227 std::string m_strLyrics; 228 std::string m_cuesheet; 229 std::string m_strDiscSubtitle; 230 std::string m_strReleaseDate; //ISO8601 date YYYY, YYYY-MM or YYYY-MM-DD 231 std::string m_strOriginalDate; //ISO8601 date YYYY, YYYY-MM or YYYY-MM-DD 232 CDateTime m_lastPlayed; 233 CDateTime m_dateNew; 234 CDateTime m_dateAdded; 235 CDateTime m_dateUpdated; 236 bool m_bCompilation; 237 int m_iDuration; 238 int m_iTrack; // consists of the disk number in the high 16 bits, the track number in the low 16bits 239 int m_iDbId; 240 MediaType m_type; ///< item type "music", "song", "album", "artist" 241 bool m_bLoaded; 242 float m_Rating; 243 int m_Userrating; 244 int m_Votes; 245 int m_listeners; 246 int m_iTimesPlayed; 247 int m_iAlbumId; 248 int m_iDiscTotal; 249 bool m_bBoxset; 250 int m_iBPM; 251 CAlbum::ReleaseType m_albumReleaseType; 252 std::string m_strReleaseStatus; 253 int m_samplerate; 254 int m_channels; 255 int m_bitrate; 256 std::string m_stationName; 257 std::string m_stationArt; // Used to fetch thumb URL for Shoutcasts 258 259 EmbeddedArtInfo m_coverArt; ///< art information 260 261 ReplayGain m_replayGain; ///< ReplayGain information 262 }; 263 } 264