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