kodi
MusicInfoScanner.h
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 "InfoScanner.h"
12 #include "MusicAlbumInfo.h"
13 #include "MusicInfoScraper.h"
14 #include "music/MusicDatabase.h"
15 #include "threads/IRunnable.h"
16 #include "threads/Thread.h"
17 #include "utils/ScraperUrl.h"
18 
19 class CAlbum;
20 class CArtist;
22 
23 namespace MUSIC_INFO
24 {
25 
27 {
28 public:
31  enum SCAN_FLAGS { SCAN_NORMAL = 0,
32  SCAN_ONLINE = 1 << 0,
33  SCAN_BACKGROUND = 1 << 1,
34  SCAN_RESCAN = 1 << 2,
35  SCAN_ARTISTS = 1 << 3,
36  SCAN_ALBUMS = 1 << 4 };
37 
39  ~CMusicInfoScanner() override;
40 
41  void Start(const std::string& strDirectory, int flags);
42  void FetchAlbumInfo(const std::string& strDirectory, bool refresh = false);
43  void FetchArtistInfo(const std::string& strDirectory, bool refresh = false);
44  void Stop();
45 
54  static void FileItemsToAlbums(CFileItemList& items, VECALBUMS& albums, MAPSONGS* songsMap = NULL);
55 
65  INFO_RET UpdateAlbumInfo(CAlbum& album, const ADDON::ScraperPtr& scraper, bool bAllowSelection, CGUIDialogProgress* pDialog = NULL);
66 
76  INFO_RET UpdateArtistInfo(CArtist& artist, const ADDON::ScraperPtr& scraper, bool bAllowSelection, CGUIDialogProgress* pDialog = NULL);
77 
78 protected:
79  virtual void Process();
80  bool DoScan(const std::string& strDirectory) override;
81 
82 
98  static void FindArtForAlbums(VECALBUMS &albums, const std::string &path);
99 
109  INFO_RET UpdateDatabaseAlbumInfo(CAlbum& album, const ADDON::ScraperPtr& scraper, bool bAllowSelection, CGUIDialogProgress* pDialog = NULL);
110 
120  INFO_RET UpdateDatabaseArtistInfo(CArtist& artist, const ADDON::ScraperPtr& scraper, bool bAllowSelection, CGUIDialogProgress* pDialog = NULL);
121 
133  INFO_RET DownloadAlbumInfo(const CAlbum& album, const ADDON::ScraperPtr& scraper, MUSIC_GRABBER::CMusicAlbumInfo& albumInfo, bool bUseScrapedMBID, CGUIDialogProgress* pDialog = NULL);
134 
146  INFO_RET DownloadArtistInfo(const CArtist& artist, const ADDON::ScraperPtr& scraper, MUSIC_GRABBER::CMusicArtistInfo& artistInfo, bool bUseScrapedMBID, CGUIDialogProgress* pDialog = NULL);
147 
154  std::vector<CVariant> GetArtWhitelist(const MediaType& mediaType, int iArtLevel);
155 
165  bool AddLocalArtwork(std::map<std::string, std::string>& art,
166  const std::string& mediaType,
167  const std::string& mediaName,
168  const std::string& artfolder,
169  int discnum = 0);
170 
180  bool AddRemoteArtwork(std::map<std::string, std::string>& art,
181  const std::string& mediaType,
182  const CScraperUrl& thumbURL);
183 
196  bool AddArtistArtwork(CArtist& artist, const std::string& artfolder);
197 
211  bool AddAlbumArtwork(CAlbum& album);
212 
221  int RetrieveMusicInfo(const std::string& strDirectory, CFileItemList& items);
222 
223  void RetrieveLocalArt();
224  void ScrapeInfoAddedAlbums();
225 
233  INFO_RET ScanTags(const CFileItemList& items, CFileItemList& scannedItems);
234  int GetPathHash(const CFileItemList &items, std::string &hash);
235 
236  void Run() override;
237  int CountFiles(const CFileItemList& items, bool recursive);
238  int CountFilesRecursively(const std::string& strPath);
239 
247  bool ResolveMusicBrainz(const std::string &strMusicBrainzID, const ADDON::ScraperPtr &preferredScraper, CScraperUrl &musicBrainzURL);
248 
249  void ScannerWait(unsigned int milliseconds);
250 
251  int m_currentItem;
252  int m_itemCount;
253  bool m_bStop;
254  bool m_needsCleanup = false;
255  int m_scanType = 0; // 0 - load from files, 1 - albums, 2 - artists
256  int m_idSourcePath;
257  CMusicDatabase m_musicDatabase;
258 
259  std::set<int> m_albumsAdded;
260 
261  std::set<std::string> m_seenPaths;
262  int m_flags;
263  CThread m_fileCountReader;
264 };
265 }
Definition: MusicAlbumInfo.h:21
Definition: Thread.h:44
INFO_RET UpdateAlbumInfo(CAlbum &album, const ADDON::ScraperPtr &scraper, bool bAllowSelection, CGUIDialogProgress *pDialog=NULL)
Scrape additional album information and update the music database with it. Given an album...
Definition: MusicInfoScanner.cpp:885
std::vector< CVariant > GetArtWhitelist(const MediaType &mediaType, int iArtLevel)
Get the types of art for an artist or album that are to be automatically fetched from local files dur...
Definition: MusicInfoScanner.cpp:2133
Definition: MusicArtistInfo.h:19
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:702
INFO_RET UpdateDatabaseAlbumInfo(CAlbum &album, const ADDON::ScraperPtr &scraper, bool bAllowSelection, CGUIDialogProgress *pDialog=NULL)
Scrape additional album information and update the database. Search for the given album using the giv...
Definition: MusicInfoScanner.cpp:1282
Definition: scraper.py:1
INFO_RET DownloadArtistInfo(const CArtist &artist, const ADDON::ScraperPtr &scraper, MUSIC_GRABBER::CMusicArtistInfo &artistInfo, bool bUseScrapedMBID, CGUIDialogProgress *pDialog=NULL)
Using the scrapers download metadata for an artist Given a CAlbum style struct containing some data a...
Definition: MusicInfoScanner.cpp:1708
bool AddRemoteArtwork(std::map< std::string, std::string > &art, const std::string &mediaType, const CScraperUrl &thumbURL)
Add extra remote artwork for albums and artists This common utility fills the gaps in artwork using t...
Definition: MusicInfoScanner.cpp:2252
bool AddLocalArtwork(std::map< std::string, std::string > &art, const std::string &mediaType, const std::string &mediaName, const std::string &artfolder, int discnum=0)
Add extra local artwork for albums and artists This common utility scans the given folder for local (...
Definition: MusicInfoScanner.cpp:2156
static void FindArtForAlbums(VECALBUMS &albums, const std::string &path)
Find art for albums Based on the albums in the folder, finds whether we have unique album art and ass...
Definition: MusicInfoScanner.cpp:1087
int RetrieveMusicInfo(const std::string &strDirectory, CFileItemList &items)
Scan in the ID3/Ogg/FLAC tags for a bunch of FileItems Given a list of FileItems, scan in the tags fo...
Definition: MusicInfoScanner.cpp:908
INFO_RET UpdateDatabaseArtistInfo(CArtist &artist, const ADDON::ScraperPtr &scraper, bool bAllowSelection, CGUIDialogProgress *pDialog=NULL)
Scrape additional artist information and update the database. Search for the given artist using the g...
Definition: MusicInfoScanner.cpp:1364
Definition: IRunnable.h:11
static void FileItemsToAlbums(CFileItemList &items, VECALBUMS &albums, MAPSONGS *songsMap=NULL)
Categorize FileItems into Albums, Songs, and Artists This takes a list of FileItems and turns it into...
Definition: MusicInfoScanner.cpp:620
Definition: MusicInfoScanner.h:26
bool ResolveMusicBrainz(const std::string &strMusicBrainzID, const ADDON::ScraperPtr &preferredScraper, CScraperUrl &musicBrainzURL)
Resolve a MusicBrainzID to a URL If we have a MusicBrainz ID for an artist or album, resolve it to an MB URL and set up the scrapers accordingly.
Definition: MusicInfoScanner.cpp:1926
void RetrieveLocalArt()
Definition: MusicInfoScanner.cpp:1174
Definition: InfoScanner.h:17
Definition: Album.h:26
INFO_RET ScanTags(const CFileItemList &items, CFileItemList &scannedItems)
Scan in the ID3/Ogg/FLAC tags for a bunch of FileItems Given a list of FileItems, scan in the tags fo...
Definition: MusicInfoScanner.cpp:565
Definition: GUIDialogExtendedProgressBar.h:16
INFO_RET UpdateArtistInfo(CArtist &artist, const ADDON::ScraperPtr &scraper, bool bAllowSelection, CGUIDialogProgress *pDialog=NULL)
Scrape additional artist information and update the music database with it. Given an artist...
Definition: MusicInfoScanner.cpp:897
Definition: GUIDialogProgress.h:16
bool AddArtistArtwork(CArtist &artist, const std::string &artfolder)
Add art for an artist This scans the given folder for local art and/or applies the first available ar...
Definition: MusicInfoScanner.cpp:1963
SCAN_FLAGS
Flags for controlling the scanning process.
Definition: MusicInfoScanner.h:31
Definition: Artist.h:40
INFO_RET DownloadAlbumInfo(const CAlbum &album, const ADDON::ScraperPtr &scraper, MUSIC_GRABBER::CMusicAlbumInfo &albumInfo, bool bUseScrapedMBID, CGUIDialogProgress *pDialog=NULL)
Using the scrapers download metadata for an album Given a CAlbum style struct containing some data ab...
Definition: MusicInfoScanner.cpp:1447
bool AddAlbumArtwork(CAlbum &album)
Add art for an album This scans the album folder, and any disc set subfolders, for local art and/or a...
Definition: MusicInfoScanner.cpp:2011
INFO_RET
Return values from the information lookup functions.
Definition: InfoScanner.h:23
Definition: ScraperUrl.h:21
Definition: Application.h:77