- Reverted database view back to HEAD as otherwise it would only show songs which...
[xbmc:xbmc-antiquated.git] / xbmc / MusicDatabase.h
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21 /*!
22  \file MusicDatabase.h
23 \brief
24 */
25 #pragma once
26 #include "Database.h"
27 #include "Album.h"
28 #include "StringUtils.h"
29
30 struct SScraperInfo;
31
32 class CArtist;
33 class CFileItem;
34
35 #include <set>
36
37 // return codes of Cleaning up the Database
38 // numbers are strings from strings.xml
39 #define ERROR_OK     317
40 #define ERROR_CANCEL    0
41 #define ERROR_DATABASE    315
42 #define ERROR_REORG_SONGS   319
43 #define ERROR_REORG_ARTIST   321
44 #define ERROR_REORG_GENRE   323
45 #define ERROR_REORG_PATH   325
46 #define ERROR_REORG_ALBUM   327
47 #define ERROR_WRITING_CHANGES  329
48 #define ERROR_COMPRESSING   332
49
50 #define NUM_SONGS_BEFORE_COMMIT 500
51
52 /*!
53  \ingroup music
54  \brief A set of CStdString objects, used for CMusicDatabase
55  \sa ISETPATHES, CMusicDatabase
56  */
57 typedef std::set<CStdString> SETPATHES;
58
59 /*!
60  \ingroup music
61  \brief The SETPATHES iterator
62  \sa SETPATHES, CMusicDatabase
63  */
64 typedef std::set<CStdString>::iterator ISETPATHES;
65
66 /*!
67  \ingroup music
68  \brief A vector of longs for iDs, used for CMusicDatabase's multiple artist/genre capability
69  */
70 typedef std::vector<long> VECLONGS;
71
72 class CGUIDialogProgress;
73 class CFileItemList;
74
75 /*!
76  \ingroup music
77  \brief Class to store and read tag information
78
79  CMusicDatabase can be used to read and store
80  tag information for faster access. It is based on
81  sqlite (http://www.sqlite.org).
82
83  Here is the database layout:
84   \image html musicdatabase.png
85
86  \sa CAlbum, CSong, VECSONGS, CMapSong, VECARTISTS, VECALBUMS, VECGENRES
87  */
88 class CMusicDatabase : public CDatabase
89 {
90   class CArtistCache
91   {
92   public:
93     long idArtist;
94     CStdString strArtist;
95   };
96
97   class CPathCache
98   {
99   public:
100     long idPath;
101     CStdString strPath;
102   };
103
104   class CGenreCache
105   {
106   public:
107     long idGenre;
108     CStdString strGenre;
109   };
110
111   class CAlbumCache : public CAlbum
112   {
113   public:
114     long idAlbum;
115     long idArtist;
116   };
117
118 public:
119   CMusicDatabase(void);
120   virtual ~CMusicDatabase(void);
121
122   virtual bool CommitTransaction();
123   void EmptyCache();
124   void Clean();
125   int  Cleanup(CGUIDialogProgress *pDlgProgress);
126   void DeleteAlbumInfo();
127   bool LookupCDDBInfo(bool bRequery=false);
128   void DeleteCDDBInfo();
129   void AddSong(const CSong& song, bool bCheck = true);
130   long SetAlbumInfo(long idAlbum, const CAlbum& album, const VECSONGS& songs, bool bTransaction=true);
131   bool DeleteAlbumInfo(long idArtist);
132   long SetArtistInfo(long idArtist, const CArtist& artist);
133   bool DeleteArtistInfo(long idArtist);
134   bool GetAlbumInfo(long idAlbum, CAlbum &info, VECSONGS* songs);
135   bool HasAlbumInfo(long idAlbum);
136   bool GetArtistInfo(long idArtist, CArtist &info, bool needAll=true);
137   bool GetSongByFileName(const CStdString& strFileName, CSong& song);
138   long GetAlbumIdByPath(const CStdString& path);
139   bool GetSongById(long idSong, CSong& song);
140   bool GetSongByKaraokeNumber( long number, CSong& song );
141   bool SetKaraokeSongDelay( long idSong, int delay );
142   bool GetSongsByPath(const CStdString& strPath, CSongMap& songs, bool bAppendToMap = false);
143   bool Search(const CStdString& search, CFileItemList &items);
144
145   bool GetAlbumFromSong(long idSong, CAlbum &album);
146   bool GetAlbumFromSong(const CSong &song, CAlbum &album);
147
148   bool GetArbitraryQuery(const CStdString& strQuery, const CStdString& strOpenRecordSet, const CStdString& strCloseRecordSet,
149                          const CStdString& strOpenRecord, const CStdString& strCloseRecord, const CStdString& strOpenField, const CStdString& strCloseField, CStdString& strResult);
150   bool GetTop100(const CStdString& strBaseDir, CFileItemList& items);
151   bool GetTop100Albums(VECALBUMS& albums);
152   bool GetTop100AlbumSongs(const CStdString& strBaseDir, CFileItemList& item);
153   bool GetRecentlyAddedAlbums(VECALBUMS& albums);
154   bool GetRecentlyAddedAlbumSongs(const CStdString& strBaseDir, CFileItemList& item);
155   bool GetRecentlyPlayedAlbums(VECALBUMS& albums);
156   bool GetRecentlyPlayedAlbumSongs(const CStdString& strBaseDir, CFileItemList& item);
157   bool IncrTop100CounterByFileName(const CStdString& strFileName1);
158   bool RemoveSongsFromPath(const CStdString &path, CSongMap &songs);
159   bool CleanupOrphanedItems();
160   bool GetPaths(std::set<CStdString> &paths);
161   bool SetPathHash(const CStdString &path, const CStdString &hash);
162   bool GetPathHash(const CStdString &path, CStdString &hash);
163   bool GetGenresNav(const CStdString& strBaseDir, CFileItemList& items);
164   bool GetYearsNav(const CStdString& strBaseDir, CFileItemList& items);
165   bool GetArtistsNav(const CStdString& strBaseDir, CFileItemList& items, long idGenre, bool albumArtistsOnly);
166   bool GetAlbumsNav(const CStdString& strBaseDir, CFileItemList& items, long idGenre, long idArtist);
167   bool GetAlbumsByYear(const CStdString &strBaseDir, CFileItemList& items, long year);
168   bool GetSongsNav(const CStdString& strBaseDir, CFileItemList& items, long idGenre, long idArtist,long idAlbum);
169   bool GetSongsByYear(const CStdString& baseDir, CFileItemList& items, long year);
170   bool GetSongsByWhere(const CStdString &baseDir, const CStdString &whereClause, CFileItemList& items);
171   bool GetAlbumsByWhere(const CStdString &baseDir, const CStdString &where, const CStdString &order, CFileItemList &items);
172   bool GetRandomSong(CFileItem* item, long& lSongId, const CStdString& strWhere);
173   int GetSongsCount();
174   int GetSongsCount(const CStdString& strWhere);
175   unsigned int GetSongIDs(const CStdString& strWhere, std::vector<std::pair<int,long> > &songIDs);
176
177   bool GetAlbumPath(long idAlbum, CStdString &path);
178   bool SaveAlbumThumb(long idAlbum, const CStdString &thumb);
179   bool GetAlbumThumb(long idAlbum, CStdString &thumb);
180   bool GetArtistPath(long idArtist, CStdString &path);
181
182   bool GetGenreById(long idGenre, CStdString& strGenre);
183   bool GetArtistById(long idArtist, CStdString& strArtist);
184   bool GetAlbumById(long idAlbum, CStdString& strAlbum);
185
186   long GetArtistByName(const CStdString& strArtist);
187   long GetAlbumByName(const CStdString& strAlbum, const CStdString& strArtist="");
188   long GetGenreByName(const CStdString& strGenre);
189   long GetSongByArtistAndAlbumAndTitle(const CStdString& strArtist, const CStdString& strAlbum, const CStdString& strTitle);
190
191   bool GetVariousArtistsAlbums(const CStdString& strBaseDir, CFileItemList& items);
192   bool GetVariousArtistsAlbumsSongs(const CStdString& strBaseDir, CFileItemList& items);
193
194   bool SetSongRating(const CStdString &filePath, char rating);
195   bool SetScraperForPath(const CStdString& strPath, const SScraperInfo& info);
196   bool GetScraperForPath(const CStdString& strPath, SScraperInfo& info);
197
198   void ExportToXML(const CStdString &xmlFile, bool singleFiles = false);
199   void ImportFromXML(const CStdString &xmlFile);
200
201   void ExportKaraokeInfo(const CStdString &outFile, bool asHTML );
202   void ImportKaraokeInfo(const CStdString &inputFile );
203
204 protected:
205   std::map<CStdString, int /*CArtistCache*/> m_artistCache;
206   std::map<CStdString, int /*CGenreCache*/> m_genreCache;
207   std::map<CStdString, int /*CPathCache*/> m_pathCache;
208   std::map<CStdString, int /*CPathCache*/> m_thumbCache;
209   std::map<CStdString, CAlbumCache> m_albumCache;
210   virtual bool CreateTables();
211   long AddAlbum(const CStdString& strAlbum1, long lArtistId, const CStdString &extraArtists, const CStdString &strArtist1, long idThumb, long idGenre, const CStdString &extraGenres, long year);
212   long AddGenre(const CStdString& strGenre);
213   long AddArtist(const CStdString& strArtist);
214   long AddPath(const CStdString& strPath);
215   long AddThumb(const CStdString& strThumb1);
216   void AddExtraAlbumArtists(const CStdStringArray& vecArtists, long lAlbumId);
217   void AddExtraSongArtists(const CStdStringArray& vecArtists, long lSongId, bool bCheck = true);
218   void AddKaraokeData(const CSong& song);
219   void AddExtraGenres(const CStdStringArray& vecGenres, long lSongId, long lAlbumId, bool bCheck = true);
220   bool SetAlbumInfoSongs(long idAlbumInfo, const VECSONGS& songs);
221   bool GetAlbumInfoSongs(long idAlbumInfo, VECSONGS& songs);
222 private:
223   void SplitString(const CStdString &multiString, std::vector<CStdString> &vecStrings, CStdString &extraStrings);
224   CSong GetSongFromDataset(bool bWithMusicDbPath=false);
225   CArtist GetArtistFromDataset(dbiplus::Dataset* pDS, bool needThumb=true);
226   CAlbum GetAlbumFromDataset(dbiplus::Dataset* pDS, bool imageURL=false);
227   void GetFileItemFromDataset(CFileItem* item, const CStdString& strMusicDBbasePath);
228   bool CleanupSongs();
229   bool CleanupSongsByIds(const CStdString &strSongIds);
230   bool CleanupPaths();
231   bool CleanupThumbs();
232   bool CleanupAlbums();
233   bool CleanupArtists();
234   bool CleanupGenres();
235   virtual bool UpdateOldVersion(int version);
236   bool SearchArtists(const CStdString& search, CFileItemList &artists);
237   bool SearchAlbums(const CStdString& search, CFileItemList &albums);
238   bool SearchSongs(const CStdString& strSearch, CFileItemList &songs);
239   long GetSongIDFromPath(const CStdString &filePath);
240
241     // Fields should be ordered as they
242   // appear in the songview
243   enum _SongFields
244   {
245     song_idSong=0,
246     song_strExtraArtists,
247     song_strExtraGenres,
248     song_strTitle,
249     song_iTrack,
250     song_iDuration,
251     song_iYear,
252     song_dwFileNameCRC,
253     song_strFileName,
254     song_strMusicBrainzTrackID,
255     song_strMusicBrainzArtistID,
256     song_strMusicBrainzAlbumID,
257     song_strMusicBrainzAlbumArtistID,
258     song_strMusicBrainzTRMID,
259     song_iTimesPlayed,
260     song_iStartOffset,
261     song_iEndOffset,
262     song_lastplayed,
263     song_rating,
264     song_comment,
265     song_idAlbum,
266     song_strAlbum,
267     song_strPath,
268     song_idArtist,
269     song_strArtist,
270     song_idGenre,
271     song_strGenre,
272     song_strThumb,
273     song_iKarNumber,
274     song_iKarDelay,
275     song_strKarEncoding
276   } SongFields;
277
278   // Fields should be ordered as they
279   // appear in the albumview
280   enum _AlbumFields
281   {
282     album_idAlbum=0,
283     album_strAlbum,
284     album_strExtraArtists,
285     album_idArtist,
286     album_strExtraGenres,
287     album_idGenre,
288     album_strArtist,
289     album_strGenre,
290     album_iYear,
291     album_strThumb,
292     album_idAlbumInfo,
293     album_strMoods,
294     album_strStyles,
295     album_strThemes,
296     album_strReview,
297     album_strLabel,
298     album_strType,
299     album_strThumbURL,
300     album_iRating
301   } AlbumFields;
302
303   enum _ArtistFields
304   {
305     artist_idArtist=1, // not a typo - we have the primary key @ 0
306     artist_strBorn,
307     artist_strFormed,
308     artist_strGenres,
309     artist_strMoods,
310     artist_strStyles,
311     artist_strInstruments,
312     artist_strBiography,
313     artist_strDied,
314     artist_strDisbanded,
315     artist_strYearsActive,
316     artist_strImage
317   } ArtistFields;
318
319   int m_iSongsBeforeCommit;
320 };