xbmc
MusicDatabase.h
Go to the documentation of this file.
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 
16 #include "Album.h"
17 #include "MediaSource.h"
18 #include "addons/Scraper.h"
19 #include "dbwrappers/Database.h"
20 #include "settings/LibExportSettings.h"
21 #include "utils/SortUtils.h"
22 
23 #include <utility>
24 #include <vector>
25 
26 class CArtist;
27 class CFileItem;
28 class CMusicDbUrl;
29 
30 namespace dbiplus
31 {
32 class field_value;
33 typedef std::vector<field_value> sql_record;
34 } // namespace dbiplus
35 
36 #include <set>
37 #include <string>
38 
39 // return codes of Cleaning up the Database
40 // numbers are strings from strings.po
41 #define ERROR_OK 317
42 #define ERROR_CANCEL 0
43 #define ERROR_DATABASE 315
44 #define ERROR_REORG_SONGS 319
45 #define ERROR_REORG_ARTIST 321
46 #define ERROR_REORG_OTHER 323
47 #define ERROR_REORG_PATH 325
48 #define ERROR_REORG_ALBUM 327
49 #define ERROR_WRITING_CHANGES 329
50 #define ERROR_COMPRESSING 332
51 
52 #define NUM_SONGS_BEFORE_COMMIT 500
53 
59 typedef std::set<std::string> SETPATHS;
60 
66 typedef std::set<std::string>::iterator ISETPATHS;
67 
74 typedef struct
75 {
76  std::string mediaType;
77  std::string artType;
78  std::string prefix;
79  std::string url;
81 
82 class CGUIDialogProgress;
83 class CFileItemList;
84 
98 class CMusicDatabase : public CDatabase
99 {
100  friend class DatabaseUtils;
101  friend class TestDatabaseUtilsHelper;
102 
103 public:
104  CMusicDatabase(void);
105  ~CMusicDatabase(void) override;
106 
107  bool Open() override;
108  bool CommitTransaction() override;
109  void EmptyCache();
110  void Clean();
111  int Cleanup(CGUIDialogProgress* progressDialog = nullptr);
112  bool LookupCDDBInfo(bool bRequery = false);
113  void DeleteCDDBInfo();
114 
116  // Song CRUD
118 
147  int AddSong(const int idSong,
148  const CDateTime& dtDateNew,
149  const int idAlbum,
150  const std::string& strTitle,
151  const std::string& strMusicBrainzTrackID,
152  const std::string& strPathAndFileName,
153  const std::string& strComment,
154  const std::string& strMood,
155  const std::string& strThumb,
156  const std::string& artistDisp,
157  const std::string& artistSort,
158  const std::vector<std::string>& genres,
159  int iTrack,
160  int iDuration,
161  const std::string& strReleaseDate,
162  const std::string& strOrigReleaseDate,
163  std::string& strDiscSubtitle,
164  const int iTimesPlayed,
165  int iStartOffset,
166  int iEndOffset,
167  const CDateTime& dtLastPlayed,
168  float rating,
169  int userrating,
170  int votes,
171  int iBPM,
172  int iBitRate,
173  int iSampleRate,
174  int iChannels,
175  const std::string& songVideoURL,
176  const ReplayGain& replayGain);
177  bool GetSong(int idSong, CSong& song);
178 
185  bool UpdateSong(CSong& song, bool bArtists = true, bool bArtistLinks = true);
186 
218  int UpdateSong(int idSong,
219  const std::string& strTitle,
220  const std::string& strMusicBrainzTrackID,
221  const std::string& strPathAndFileName,
222  const std::string& strComment,
223  const std::string& strMood,
224  const std::string& strThumb,
225  const std::string& artistDisp,
226  const std::string& artistSort,
227  const std::vector<std::string>& genres,
228  int iTrack,
229  int iDuration,
230  const std::string& strReleaseDate,
231  const std::string& strOrigReleaseDate,
232  const std::string& strDiscSubtitle,
233  int iTimesPlayed,
234  int iStartOffset,
235  int iEndOffset,
236  const CDateTime& dtLastPlayed,
237  float rating,
238  int userrating,
239  int votes,
240  const ReplayGain& replayGain,
241  int iBPM,
242  int iBitRate,
243  int iSampleRate,
244  int iChannels,
245  const std::string& songVideoURL);
246 
248  bool GetSongByFileName(const std::string& strFileName, CSong& song, int64_t startOffset = 0);
249  bool GetSongsByPath(const std::string& strPath, MAPSONGS& songmap, bool bAppendToMap = false);
250  bool Search(const std::string& search, CFileItemList& items);
251  bool RemoveSongsFromPath(const std::string& path, MAPSONGS& songmap, bool exact = true);
252  void CheckArtistLinksChanged();
253  bool SetSongUserrating(const std::string& filePath, int userrating);
254  bool SetSongUserrating(int idSong, int userrating);
255  bool SetSongVotes(const std::string& filePath, int votes);
256  int GetSongByArtistAndAlbumAndTitle(const std::string& strArtist,
257  const std::string& strAlbum,
258  const std::string& strTitle);
259 
261  // Album
263 
268  bool AddAlbum(CAlbum& album, int idSource);
269 
274  bool UpdateAlbum(CAlbum& album);
275 
292  int AddAlbum(const std::string& strAlbum,
293  const std::string& strMusicBrainzAlbumID,
294  const std::string& strReleaseGroupMBID,
295  const std::string& strArtist,
296  const std::string& strArtistSort,
297  const std::string& strGenre,
298  const std::string& strReleaseDate,
299  const std::string& strOrigReleaseDate,
300  bool bBoxedSet,
301  const std::string& strRecordLabel,
302  const std::string& strType,
303  const std::string& strReleaseStatus,
304  bool bCompilation,
305  CAlbum::ReleaseType releaseType);
306 
313  bool GetAlbum(int idAlbum, CAlbum& album, bool getSongs = true);
314  int UpdateAlbum(int idAlbum,
315  const std::string& strAlbum,
316  const std::string& strMusicBrainzAlbumID,
317  const std::string& strReleaseGroupMBID,
318  const std::string& strArtist,
319  const std::string& strArtistSort,
320  const std::string& strGenre,
321  const std::string& strMoods,
322  const std::string& strStyles,
323  const std::string& strThemes,
324  const std::string& strReview,
325  const std::string& strImage,
326  const std::string& strLabel,
327  const std::string& strType,
328  const std::string& strReleaseStatus,
329  float fRating,
330  int iUserrating,
331  int iVotes,
332  const std::string& strReleaseDate,
333  const std::string& strOrigReleaseDate,
334  bool bBoxedSet,
335  bool bCompilation,
336  CAlbum::ReleaseType releaseType,
337  bool bScrapedMBID);
338  bool ClearAlbumLastScrapedTime(int idAlbum);
339  bool HasAlbumBeenScraped(int idAlbum);
340 
342  // Audiobook
344  bool AddAudioBook(const CFileItem& item);
345  bool SetResumeBookmarkForAudioBook(const CFileItem& item, int bookmark);
346  bool GetResumeBookmarkForAudioBook(const CFileItem& item, int& bookmark);
347 
351  bool InsideScannedPath(const std::string& path);
352 
354  int GetAlbumIdByPath(const std::string& path);
355  bool GetAlbumFromSong(int idSong, CAlbum& album);
356  int GetAlbumByName(const std::string& strAlbum, const std::string& strArtist = "");
357  int GetAlbumByName(const std::string& strAlbum, const std::vector<std::string>& artist);
358  bool GetMatchingMusicVideoAlbum(const std::string& strAlbum,
359  const std::string& strArtist,
360  int& idAlbum,
361  std::string& strReview);
362  bool SearchAlbumsByArtistName(const std::string& strArtist, CFileItemList& items);
363  int GetAlbumByMatch(const CAlbum& album);
364  std::string GetAlbumById(int id);
365  std::string GetAlbumDiscTitle(int idAlbum, int idDisc);
366  bool SetAlbumUserrating(const int idAlbum, int userrating);
367  int GetAlbumDiscsCount(int idAlbum);
368 
370  // Artist CRUD
372  bool UpdateArtist(const CArtist& artist);
373 
374  int AddArtist(const std::string& strArtist,
375  const std::string& strMusicBrainzArtistID,
376  const std::string& strSortName,
377  bool bScrapedMBID = false);
378  int AddArtist(const std::string& strArtist,
379  const std::string& strMusicBrainzArtistID,
380  bool bScrapedMBID = false);
381  bool GetArtist(int idArtist, CArtist& artist, bool fetchAll = false);
382  bool GetArtistExists(int idArtist);
383  int GetLastArtist();
384  int GetArtistFromMBID(const std::string& strMusicBrainzArtistID, std::string& artistname);
385  int UpdateArtist(int idArtist,
386  const std::string& strArtist,
387  const std::string& strSortName,
388  const std::string& strMusicBrainzArtistID,
389  bool bScrapedMBID,
390  const std::string& strType,
391  const std::string& strGender,
392  const std::string& strDisambiguation,
393  const std::string& strBorn,
394  const std::string& strFormed,
395  const std::string& strGenres,
396  const std::string& strMoods,
397  const std::string& strStyles,
398  const std::string& strInstruments,
399  const std::string& strBiography,
400  const std::string& strDied,
401  const std::string& strDisbanded,
402  const std::string& strYearsActive,
403  const std::string& strImage);
404  bool UpdateArtistScrapedMBID(int idArtist, const std::string& strMusicBrainzArtistID);
405  bool GetTranslateBlankArtist() { return m_translateBlankArtist; }
406  void SetTranslateBlankArtist(bool translate) { m_translateBlankArtist = translate; }
407  bool HasArtistBeenScraped(int idArtist);
408  bool ClearArtistLastScrapedTime(int idArtist);
409  int AddArtistDiscography(int idArtist, const CDiscoAlbum& discoAlbum);
410  bool DeleteArtistDiscography(int idArtist);
411  bool GetArtistDiscography(int idArtist, CFileItemList& items);
412  bool AddArtistVideoLinks(const CArtist& artist);
413  bool DeleteArtistVideoLinks(const int idArtist);
414 
415  std::string GetArtistById(int id);
416  int GetArtistByName(const std::string& strArtist);
417  int GetArtistByMatch(const CArtist& artist);
418  bool GetArtistFromSong(int idSong, CArtist& artist);
419  bool IsSongArtist(int idSong, int idArtist);
420  bool IsSongAlbumArtist(int idSong, int idArtist);
421  std::string GetRoleById(int id);
422 
427  bool UpdateArtistSortNames(int idArtist = -1);
428 
430  // Paths
432  int AddPath(const std::string& strPath);
433 
434  bool GetPaths(std::set<std::string>& paths);
435  bool SetPathHash(const std::string& path, const std::string& hash);
436  bool GetPathHash(const std::string& path, std::string& hash);
437  bool GetAlbumPaths(int idAlbum, std::vector<std::pair<std::string, int>>& paths);
438  bool GetAlbumPath(int idAlbum, std::string& basePath);
439  int GetDiscnumberForPathID(int idPath);
440  bool GetOldArtistPath(int idArtist, std::string& path);
441  bool GetArtistPath(const CArtist& artist, std::string& path);
442  bool GetAlbumFolder(const CAlbum& album, const std::string& strAlbumPath, std::string& strFolder);
443  bool GetArtistFolderName(const CArtist& artist, std::string& strFolder);
444  bool GetArtistFolderName(const std::string& strArtist,
445  const std::string& strMusicBrainzArtistID,
446  std::string& strFolder);
447 
449  // Sources
451  bool UpdateSources();
452  int AddSource(const std::string& strName,
453  const std::string& strMultipath,
454  const std::vector<std::string>& vecPaths,
455  int id = -1);
456  int UpdateSource(const std::string& strOldName,
457  const std::string& strName,
458  const std::string& strMultipath,
459  const std::vector<std::string>& vecPaths);
460  bool RemoveSource(const std::string& strName);
461  int GetSourceFromPath(const std::string& strPath);
462  bool AddAlbumSource(int idAlbum, int idSource);
463  bool AddAlbumSources(int idAlbum, const std::string& strPath);
464  bool DeleteAlbumSources(int idAlbum);
465  bool GetSources(CFileItemList& items);
466 
467  bool GetSourcesByArtist(int idArtist, CFileItem* item);
468  bool GetSourcesByAlbum(int idAlbum, CFileItem* item);
469  bool GetSourcesBySong(int idSong, const std::string& strPath, CFileItem* item);
470  int GetSourceByName(const std::string& strSource);
471  std::string GetSourceById(int id);
472 
474  // Genres
476  int AddGenre(std::string& strGenre);
477  std::string GetGenreById(int id);
478  int GetGenreByName(const std::string& strGenre);
479 
481  // Link tables
483  bool AddAlbumArtist(int idArtist, int idAlbum, const std::string& strArtist, int iOrder);
484  bool GetAlbumsByArtist(int idArtist, std::vector<int>& albums);
485  bool GetArtistsByAlbum(int idAlbum, CFileItem* item);
486  bool GetArtistsByAlbum(int idAlbum, std::vector<std::string>& artistIDs);
487  bool DeleteAlbumArtistsByAlbum(int idAlbum);
488 
489  int AddRole(const std::string& strRole);
490  bool AddSongArtist(int idArtist,
491  int idSong,
492  const std::string& strRole,
493  const std::string& strArtist,
494  int iOrder);
495  bool AddSongArtist(
496  int idArtist, int idSong, int idRole, const std::string& strArtist, int iOrder);
497  int AddSongContributor(int idSong,
498  const std::string& strRole,
499  const std::string& strArtist,
500  const std::string& strSort);
501  void AddSongContributors(int idSong,
502  const VECMUSICROLES& contributors,
503  const std::string& strSort);
504  int GetRoleByName(const std::string& strRole);
505  bool GetRolesByArtist(int idArtist, CFileItem* item);
506  bool GetSongsByArtist(int idArtist, std::vector<int>& songs);
507  bool GetArtistsBySong(int idSong, std::vector<int>& artists);
508  bool DeleteSongArtistsBySong(int idSong);
509 
510  bool AddSongGenres(int idSong, const std::vector<std::string>& genres);
511  bool GetGenresBySong(int idSong, std::vector<int>& genres);
512 
513  bool GetGenresByAlbum(int idAlbum, CFileItem* item);
514 
515  bool GetGenresByArtist(int idArtist, CFileItem* item);
516  bool GetIsAlbumArtist(int idArtist, CFileItem* item);
517 
519  // Top 100
521  bool GetTop100(const std::string& strBaseDir, CFileItemList& items);
522  bool GetTop100Albums(VECALBUMS& albums);
523  bool GetTop100AlbumSongs(const std::string& strBaseDir, CFileItemList& item);
524 
526  // Recently added
528  bool GetRecentlyAddedAlbums(VECALBUMS& albums, unsigned int limit = 0);
529  bool GetRecentlyAddedAlbumSongs(const std::string& strBaseDir,
530  CFileItemList& item,
531  unsigned int limit = 0);
532  bool GetRecentlyPlayedAlbums(VECALBUMS& albums);
533  bool GetRecentlyPlayedAlbumSongs(const std::string& strBaseDir, CFileItemList& item);
534 
536  // Compilations
538  int GetCompilationAlbumsCount();
539 
541  // Boxsets
543  bool IsAlbumBoxset(int idAlbum);
544  int GetBoxsetsCount();
545 
546  int GetSinglesCount();
547 
548  int GetArtistCountForRole(int role);
549  int GetArtistCountForRole(const std::string& strRole);
550 
555  void IncrementPlayCount(const CFileItem& item);
556  bool CleanupOrphanedItems();
557 
559  // VIEWS
561  bool GetGenresNav(const std::string& strBaseDir,
562  CFileItemList& items,
563  const Filter& filter = Filter(),
564  bool countOnly = false);
565  bool GetSourcesNav(const std::string& strBaseDir,
566  CFileItemList& items,
567  const Filter& filter = Filter(),
568  bool countOnly = false);
569  bool GetYearsNav(const std::string& strBaseDir,
570  CFileItemList& items,
571  const Filter& filter = Filter());
572  bool GetRolesNav(const std::string& strBaseDir,
573  CFileItemList& items,
574  const Filter& filter = Filter());
575  bool GetArtistsNav(const std::string& strBaseDir,
576  CFileItemList& items,
577  bool albumArtistsOnly = false,
578  int idGenre = -1,
579  int idAlbum = -1,
580  int idSong = -1,
581  const Filter& filter = Filter(),
582  const SortDescription& sortDescription = SortDescription(),
583  bool countOnly = false);
584  bool GetCommonNav(const std::string& strBaseDir,
585  const std::string& table,
586  const std::string& labelField,
587  CFileItemList& items,
588  const Filter& filter /* = Filter() */,
589  bool countOnly /* = false */);
590  bool GetAlbumTypesNav(const std::string& strBaseDir,
591  CFileItemList& items,
592  const Filter& filter = Filter(),
593  bool countOnly = false);
594  bool GetMusicLabelsNav(const std::string& strBaseDir,
595  CFileItemList& items,
596  const Filter& filter = Filter(),
597  bool countOnly = false);
598  bool GetAlbumsNav(const std::string& strBaseDir,
599  CFileItemList& items,
600  int idGenre = -1,
601  int idArtist = -1,
602  const Filter& filter = Filter(),
603  const SortDescription& sortDescription = SortDescription(),
604  bool countOnly = false);
605  bool GetDiscsNav(const std::string& strBaseDir,
606  CFileItemList& items,
607  int idAlbum,
608  const Filter& filter = Filter(),
609  const SortDescription& sortDescription = SortDescription(),
610  bool countOnly = false);
611  bool GetAlbumsByYear(const std::string& strBaseDir, CFileItemList& items, int year);
612  bool GetSongsNav(const std::string& strBaseDir,
613  CFileItemList& items,
614  int idGenre,
615  int idArtist,
616  int idAlbum,
617  const SortDescription& sortDescription = SortDescription());
618  bool GetSongsByYear(const std::string& baseDir, CFileItemList& items, int year);
619  bool GetSongsByWhere(const std::string& baseDir,
620  const Filter& filter,
621  CFileItemList& items,
622  const SortDescription& sortDescription = SortDescription());
623  bool GetSongsFullByWhere(const std::string& baseDir,
624  const Filter& filter,
625  CFileItemList& items,
626  const SortDescription& sortDescription = SortDescription(),
627  bool artistData = false);
628  bool GetAlbumsByWhere(const std::string& baseDir,
629  const Filter& filter,
630  CFileItemList& items,
631  const SortDescription& sortDescription = SortDescription(),
632  bool countOnly = false);
633  bool GetDiscsByWhere(const std::string& baseDir,
634  const Filter& filter,
635  CFileItemList& items,
636  const SortDescription& sortDescription = SortDescription(),
637  bool countOnly = false);
638  bool GetDiscsByWhere(CMusicDbUrl& musicUrl,
639  const Filter& filter,
640  CFileItemList& items,
641  const SortDescription& sortDescription = SortDescription(),
642  bool countOnly = false);
643  bool GetArtistsByWhere(const std::string& strBaseDir,
644  const Filter& filter,
645  CFileItemList& items,
646  const SortDescription& sortDescription = SortDescription(),
647  bool countOnly = false);
648  int GetDiscsCount(const std::string& baseDir, const Filter& filter = Filter());
649  int GetSongsCount(const Filter& filter = Filter());
650  bool GetFilter(CDbUrl& musicUrl, Filter& filter, SortDescription& sorting) override;
651  int GetOrderFilter(const std::string& type, const SortDescription& sorting, Filter& filter);
652 
654  // Party Mode
656 
661  unsigned int GetRandomSongIDs(const Filter& filter, std::vector<std::pair<int, int>>& songIDs);
662 
664  // JSON-RPC
666  bool GetGenresJSON(CFileItemList& items, bool bSources = false);
667  bool GetArtistsByWhereJSON(const std::set<std::string>& fields,
668  const std::string& baseDir,
669  CVariant& result,
670  int& total,
671  const SortDescription& sortDescription = SortDescription());
672  bool GetAlbumsByWhereJSON(const std::set<std::string>& fields,
673  const std::string& baseDir,
674  CVariant& result,
675  int& total,
676  const SortDescription& sortDescription = SortDescription());
677  bool GetSongsByWhereJSON(const std::set<std::string>& fields,
678  const std::string& baseDir,
679  CVariant& result,
680  int& total,
681  const SortDescription& sortDescription = SortDescription());
682 
684  // Scraper
686  bool SetScraper(int id, const CONTENT_TYPE& content, const ADDON::ScraperPtr& scraper);
687  bool SetScraperAll(const std::string& strBaseDir, const ADDON::ScraperPtr& scraper);
688  bool GetScraper(int id, const CONTENT_TYPE& content, ADDON::ScraperPtr& scraper);
689 
694  bool ScraperInUse(const std::string& scraperID) const;
695 
697  // Filters
699  bool GetItems(const std::string& strBaseDir,
700  CFileItemList& items,
701  const Filter& filter = Filter(),
702  const SortDescription& sortDescription = SortDescription());
703  bool GetItems(const std::string& strBaseDir,
704  const std::string& itemType,
705  CFileItemList& items,
706  const Filter& filter = Filter(),
707  const SortDescription& sortDescription = SortDescription());
708  std::string GetItemById(const std::string& itemType, int id);
709 
711  // XML
713  void ExportToXML(const CLibExportSettings& settings,
714  CGUIDialogProgress* progressDialog = nullptr);
715  bool ExportSongHistory(TiXmlNode* pNode, CGUIDialogProgress* progressDialog = nullptr);
716  void ImportFromXML(const std::string& xmlFile, CGUIDialogProgress* progressDialog = nullptr);
717  bool ImportSongHistory(const std::string& xmlFile,
718  const int total,
719  CGUIDialogProgress* progressDialog = nullptr);
720 
722  // Properties
724  void SetPropertiesForFileItem(CFileItem& item);
725  static void SetPropertiesFromArtist(CFileItem& item, const CArtist& artist);
726  static void SetPropertiesFromAlbum(CFileItem& item, const CAlbum& album);
727  void SetItemUpdated(int mediaId, const std::string& mediaType);
728 
730  // Art
732 
740  void SetArtForItem(int mediaId,
741  const std::string& mediaType,
742  const std::string& artType,
743  const std::string& url);
744 
752  void SetArtForItem(int mediaId,
753  const std::string& mediaType,
754  const std::map<std::string, std::string>& art);
755 
756 
774  bool GetArtForItem(int songId,
775  int albumId,
776  int artistId,
777  bool bPrimaryArtist,
778  std::vector<ArtForThumbLoader>& art);
779 
788  bool GetArtForItem(int mediaId,
789  const std::string& mediaType,
790  std::map<std::string, std::string>& art);
791 
800  std::string GetArtForItem(int mediaId, const std::string& mediaType, const std::string& artType);
801 
810  bool RemoveArtForItem(int mediaId, const MediaType& mediaType, const std::string& artType);
811 
820  bool RemoveArtForItem(int mediaId,
821  const MediaType& mediaType,
822  const std::set<std::string>& artTypes);
823 
829  bool GetArtTypes(const MediaType& mediaType, std::vector<std::string>& artTypes);
830 
837  std::vector<std::string> GetAvailableArtTypesForItem(int mediaId, const MediaType& mediaType);
838 
846  std::vector<CScraperUrl::SUrlEntry> GetAvailableArtForItem(int mediaId,
847  const MediaType& mediaType,
848  const std::string& artType);
849 
851  // Tag Scan Version
853 
858  virtual int GetMusicNeedsTagScan();
859 
863  void SetMusicNeedsTagScan(int version);
864 
868  void SetMusicTagScanVersion(int version = 0);
869 
870  std::string GetLibraryLastUpdated();
871  void SetLibraryLastUpdated();
872  std::string GetLibraryLastCleaned();
873  void SetLibraryLastCleaned();
874  std::string GetArtistLinksUpdated();
875  void SetArtistLinksUpdated();
876  std::string GetGenresLastAdded();
877  std::string GetSongsLastAdded();
878  std::string GetAlbumsLastAdded();
879  std::string GetArtistsLastAdded();
880  std::string GetSongsLastModified();
881  std::string GetAlbumsLastModified();
882  std::string GetArtistsLastModified();
883 
884 
885 protected:
886  std::map<std::string, int> m_genreCache;
887  std::map<std::string, int> m_pathCache;
888 
889  void CreateTables() override;
890  void CreateAnalytics() override;
891  int GetMinSchemaVersion() const override { return 32; }
892  int GetSchemaVersion() const override;
893 
894  const char* GetBaseDBName() const override { return "MyMusic"; }
895 
896 private:
899  virtual void CreateViews();
900  void CreateNativeDBFunctions();
901  void CreateRemovedLinkTriggers();
902 
903  void SplitPath(const std::string& strFileNameAndPath,
904  std::string& strPath,
905  std::string& strFileName);
906 
907  CSong GetSongFromDataset();
908  CSong GetSongFromDataset(const dbiplus::sql_record* const record, int offset = 0);
909  CArtist GetArtistFromDataset(dbiplus::Dataset* pDS, int offset = 0, bool needThumb = true);
910  CArtist GetArtistFromDataset(const dbiplus::sql_record* const record,
911  int offset = 0,
912  bool needThumb = true);
913  CAlbum GetAlbumFromDataset(dbiplus::Dataset* pDS, int offset = 0, bool imageURL = false);
914  CAlbum GetAlbumFromDataset(const dbiplus::sql_record* const record,
915  int offset = 0,
916  bool imageURL = false);
917  CArtistCredit GetArtistCreditFromDataset(const dbiplus::sql_record* const record, int offset = 0);
918  CMusicRole GetArtistRoleFromDataset(const dbiplus::sql_record* const record, int offset = 0);
919  std::string GetMediaDateFromFile(const std::string& strFileNameAndPath);
920  void GetFileItemFromDataset(CFileItem* item, const CMusicDbUrl& baseUrl);
921  void GetFileItemFromDataset(const dbiplus::sql_record* const record,
922  CFileItem* item,
923  const CMusicDbUrl& baseUrl);
924  void GetFileItemFromArtistCredits(VECARTISTCREDITS& artistCredits, CFileItem* item);
925 
926  bool DeleteRemovedLinks();
927 
928  bool CleanupSongs(CGUIDialogProgress* progressDialog = nullptr);
929  bool CleanupSongsByIds(const std::string& strSongIds);
930  bool CleanupPaths();
931  bool CleanupAlbums();
932  bool CleanupArtists();
933  bool CleanupGenres();
934  bool CleanupInfoSettings();
935  bool CleanupRoles();
936  void UpdateTables(int version) override;
937  bool SearchArtists(const std::string& search, CFileItemList& artists);
938  bool SearchAlbums(const std::string& search, CFileItemList& albums);
939  bool SearchSongs(const std::string& strSearch, CFileItemList& songs);
940  int GetSongIDFromPath(const std::string& filePath);
941  void NormaliseSongDates(std::string& strRelease, std::string& strOriginal);
942  bool TrimImageURLs(std::string& strImage, const size_t space);
943 
948  std::string GetIgnoreArticleSQL(const std::string& strField);
949 
961  std::string SortnameBuildSQL(const std::string& strAlias,
962  const SortAttribute& sortAttributes,
963  const std::string& strField,
964  const std::string& strSortField);
965 
973  std::string AlphanumericSortSQL(const std::string& strField, const SortOrder& sortOrder);
974 
978  bool CheckSources(VECSOURCES& sources);
979 
984  bool MigrateSources();
985 
986  bool m_translateBlankArtist;
987 
988  // Fields should be ordered as they
989  // appear in the songview
990  static enum _SongFields {
991  song_idSong = 0,
992  song_strArtists,
993  song_strArtistSort,
994  song_strGenres,
995  song_strTitle,
996  song_iTrack,
997  song_iDuration,
998  song_strReleaseDate,
999  song_strOrigReleaseDate,
1000  song_strDiscSubtitle,
1001  song_strFileName,
1002  song_strMusicBrainzTrackID,
1003  song_iTimesPlayed,
1004  song_iStartOffset,
1005  song_iEndOffset,
1006  song_lastplayed,
1007  song_rating,
1008  song_userrating,
1009  song_votes,
1010  song_comment,
1011  song_idAlbum,
1012  song_strAlbum,
1013  song_strPath,
1014  song_strReleaseStatus,
1015  song_bCompilation,
1016  song_bBoxedSet,
1017  song_strAlbumArtists,
1018  song_strAlbumArtistSort,
1019  song_strAlbumReleaseType,
1020  song_mood,
1021  song_strReplayGain,
1022  song_iBPM,
1023  song_iBitRate,
1024  song_iSampleRate,
1025  song_iChannels,
1026  song_songVideoURL,
1027  song_iAlbumDuration,
1028  song_iDiscTotal,
1029  song_dateAdded,
1030  song_dateNew,
1031  song_dateModified,
1032  song_enumCount // end of the enum, do not add past here
1033  } SongFields;
1034 
1035  // Fields should be ordered as they
1036  // appear in the albumview
1037  static enum _AlbumFields {
1038  album_idAlbum = 0,
1039  album_strAlbum,
1040  album_strMusicBrainzAlbumID,
1041  album_strReleaseGroupMBID,
1042  album_strArtists,
1043  album_strArtistSort,
1044  album_strGenres,
1045  album_strReleaseDate,
1046  album_strOrigReleaseDate,
1047  album_bBoxedSet,
1048  album_strMoods,
1049  album_strStyles,
1050  album_strThemes,
1051  album_strReview,
1052  album_strLabel,
1053  album_strType,
1054  album_strReleaseStatus,
1055  album_strThumbURL,
1056  album_fRating,
1057  album_iUserrating,
1058  album_iVotes,
1059  album_bCompilation,
1060  album_bScrapedMBID,
1061  album_lastScraped,
1062  album_dateAdded,
1063  album_dateNew,
1064  album_dateModified,
1065  album_iTimesPlayed,
1066  album_strReleaseType,
1067  album_iTotalDiscs,
1068  album_dtLastPlayed,
1069  album_iAlbumDuration,
1070  album_enumCount // end of the enum, do not add past here
1071  } AlbumFields;
1072 
1073  // Fields should be ordered as they
1074  // appear in the songartistview/albumartistview
1075  static enum _ArtistCreditFields {
1076  // used for GetAlbum to get the cascaded album/song artist credits
1077  artistCredit_idEntity = 0, // can be idSong or idAlbum depending on context
1078  artistCredit_idArtist,
1079  artistCredit_idRole,
1080  artistCredit_strRole,
1081  artistCredit_strArtist,
1082  artistCredit_strSortName,
1083  artistCredit_strMusicBrainzArtistID,
1084  artistCredit_iOrder,
1085  artistCredit_enumCount
1086  } ArtistCreditFields;
1087 
1088  // Fields should be ordered as they
1089  // appear in the artistview
1090  static enum _ArtistFields {
1091  artist_idArtist = 0,
1092  artist_strArtist,
1093  artist_strSortName,
1094  artist_strMusicBrainzArtistID,
1095  artist_strType,
1096  artist_strGender,
1097  artist_strDisambiguation,
1098  artist_strBorn,
1099  artist_strFormed,
1100  artist_strGenres,
1101  artist_strMoods,
1102  artist_strStyles,
1103  artist_strInstruments,
1104  artist_strBiography,
1105  artist_strDied,
1106  artist_strDisbanded,
1107  artist_strYearsActive,
1108  artist_strImage,
1109  artist_bScrapedMBID,
1110  artist_lastScraped,
1111  artist_dateAdded,
1112  artist_dateNew,
1113  artist_dateModified,
1114  artist_enumCount // end of the enum, do not add past here
1115  } ArtistFields;
1116 
1117  // Fields fetched by GetArtistsByWhereJSON, order same as in JSONtoDBArtist
1118  static enum _JoinToArtistFields {
1119  joinToArtist_isSong = 0,
1120  joinToArtist_idSourceAlbum,
1121  joinToArtist_idSourceSong,
1122  joinToArtist_idSongGenreAlbum,
1123  joinToArtist_idSongGenreSong,
1124  joinToArtist_strSongGenreAlbum,
1125  joinToArtist_strSongGenreSong,
1126  joinToArtist_idArt,
1127  joinToArtist_artType,
1128  joinToArtist_artURL,
1129  joinToArtist_idRole,
1130  joinToArtist_strRole,
1131  joinToArtist_iOrderRole,
1132  joinToArtist_isalbumartist,
1133  joinToArtist_thumbnail,
1134  joinToArtist_fanart,
1135  joinToArtist_enumCount // end of the enum, do not add past here
1136  } JoinToArtistFields;
1137 
1138  // Fields fetched by GetAlbumsByWhereJSON, order same as in JSONtoDBAlbum
1139  static enum _JoinToAlbumFields {
1140  joinToAlbum_idArtist = 0,
1141  joinToAlbum_strArtist,
1142  joinToAlbum_strArtistMBID,
1143  joinToAlbum_enumCount // end of the enum, do not add past here
1144  } JoinToAlbumFields;
1145 
1146  // Fields fetched by GetSongsByWhereJSON, order same as in JSONtoDBSong
1147  static enum _JoinToSongFields {
1148  // Used by GetSongsByWhereJSON
1149  joinToSongs_idAlbumArtist = 0,
1150  joinToSongs_strAlbumArtist,
1151  joinToSongs_strAlbumArtistMBID,
1152  joinToSongs_iOrderAlbumArtist,
1153  joinToSongs_idArtist,
1154  joinToSongs_strArtist,
1155  joinToSongs_strArtistMBID,
1156  joinToSongs_iOrderArtist,
1157  joinToSongs_idRole,
1158  joinToSongs_strRole,
1159  joinToSongs_iOrderRole,
1160  joinToSongs_idGenre,
1161  joinToSongs_iOrderGenre,
1162  joinToSongs_enumCount // end of the enum, do not add past here
1163  } JoinToSongFields;
1164 };
Definition: Artist.h:132
Definition: Artist.h:194
Definition: ReplayGain.h:16
Definition: MusicDbUrl.h:17
std::map< std::string, VECSONGS > MAPSONGS
A map of a vector of CSong objects key by filename, used for CMusicDatabase.
Definition: Song.h:218
Class to store and read tag information.
Definition: MusicDatabase.h:98
Represents a list of files.
Definition: FileItem.h:721
Definition: Database.h:29
Definition: scraper.py:1
Definition: Database.h:11
Definition: Variant.h:31
Definition: TestNfsFile.cpp:22
Definition: LibExportSettings.h:38
std::set< std::string >::iterator ISETPATHS
The SETPATHS iterator.
Definition: MusicDatabase.h:66
Definition: Database.h:26
A structure used for fetching music art data.
Definition: MusicDatabase.h:74
Definition: Artist.h:24
Definition: DatabaseUtils.h:168
DateTime class, which uses FileTime as it&#39;s base.
Definition: XBDateTime.h:63
std::set< std::string > SETPATHS
A set of std::string objects, used for CMusicDatabase.
Definition: MusicDatabase.h:59
Definition: settings.py:1
Definition: Album.h:26
Definition: TestDatabaseUtils.cpp:18
Definition: dataset.h:196
Definition: GUIDialogProgress.h:16
Definition: DbUrl.h:18
Definition: SortUtils.h:176
Definition: Artist.h:40
Class to store and read song information from CMusicDatabase.
Definition: Song.h:48
Represents a file on a share.
Definition: FileItem.h:102