summaryrefslogtreecommitdiffstats
path: root/xbmc/music/infoscanner/MusicInfoScraper.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xbmc/music/infoscanner/MusicInfoScraper.cpp202
1 files changed, 202 insertions, 0 deletions
diff --git a/xbmc/music/infoscanner/MusicInfoScraper.cpp b/xbmc/music/infoscanner/MusicInfoScraper.cpp
new file mode 100644
index 0000000..630c2a7
--- /dev/null
+++ b/xbmc/music/infoscanner/MusicInfoScraper.cpp
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "MusicInfoScraper.h"
+
+#include "filesystem/CurlFile.h"
+#include "utils/log.h"
+
+using namespace MUSIC_GRABBER;
+using namespace ADDON;
+using namespace std::chrono_literals;
+
+CMusicInfoScraper::CMusicInfoScraper(const ADDON::ScraperPtr& scraper)
+ : CThread("MusicInfoScraper"), m_scraper(scraper)
+{
+ m_bSucceeded=false;
+ m_bCanceled=false;
+ m_iAlbum=-1;
+ m_iArtist=-1;
+ m_http = new XFILE::CCurlFile;
+}
+
+CMusicInfoScraper::~CMusicInfoScraper(void)
+{
+ StopThread();
+ delete m_http;
+}
+
+int CMusicInfoScraper::GetAlbumCount() const
+{
+ return (int)m_vecAlbums.size();
+}
+
+int CMusicInfoScraper::GetArtistCount() const
+{
+ return (int)m_vecArtists.size();
+}
+
+CMusicAlbumInfo& CMusicInfoScraper::GetAlbum(int iAlbum)
+{
+ return m_vecAlbums[iAlbum];
+}
+
+CMusicArtistInfo& CMusicInfoScraper::GetArtist(int iArtist)
+{
+ return m_vecArtists[iArtist];
+}
+
+void CMusicInfoScraper::FindAlbumInfo(const std::string& strAlbum, const std::string& strArtist /* = "" */)
+{
+ m_strAlbum=strAlbum;
+ m_strArtist=strArtist;
+ m_bSucceeded=false;
+ StopThread();
+ Create();
+}
+
+void CMusicInfoScraper::FindArtistInfo(const std::string& strArtist)
+{
+ m_strArtist=strArtist;
+ m_bSucceeded=false;
+ StopThread();
+ Create();
+}
+
+void CMusicInfoScraper::FindAlbumInfo()
+{
+ m_vecAlbums = m_scraper->FindAlbum(*m_http, m_strAlbum, m_strArtist);
+ m_bSucceeded = !m_vecAlbums.empty();
+}
+
+void CMusicInfoScraper::FindArtistInfo()
+{
+ m_vecArtists = m_scraper->FindArtist(*m_http, m_strArtist);
+ m_bSucceeded = !m_vecArtists.empty();
+}
+
+void CMusicInfoScraper::LoadAlbumInfo(int iAlbum)
+{
+ m_iAlbum=iAlbum;
+ m_iArtist=-1;
+ StopThread();
+ Create();
+}
+
+void CMusicInfoScraper::LoadArtistInfo(int iArtist, const std::string &strSearch)
+{
+ m_iAlbum=-1;
+ m_iArtist=iArtist;
+ m_strSearch=strSearch;
+ StopThread();
+ Create();
+}
+
+void CMusicInfoScraper::LoadAlbumInfo()
+{
+ if (m_iAlbum<0 || m_iAlbum>=(int)m_vecAlbums.size())
+ return;
+
+ CMusicAlbumInfo& album=m_vecAlbums[m_iAlbum];
+ // Clear album artist credits
+ album.GetAlbum().artistCredits.clear();
+ if (album.Load(*m_http,m_scraper))
+ m_bSucceeded=true;
+}
+
+void CMusicInfoScraper::LoadArtistInfo()
+{
+ if (m_iArtist<0 || m_iArtist>=(int)m_vecArtists.size())
+ return;
+
+ CMusicArtistInfo& artist=m_vecArtists[m_iArtist];
+ artist.GetArtist().strArtist.clear();
+ if (artist.Load(*m_http,m_scraper,m_strSearch))
+ m_bSucceeded=true;
+}
+
+bool CMusicInfoScraper::Completed()
+{
+ return Join(10ms);
+}
+
+bool CMusicInfoScraper::Succeeded()
+{
+ return !m_bCanceled && m_bSucceeded;
+}
+
+void CMusicInfoScraper::Cancel()
+{
+ m_http->Cancel();
+ m_bCanceled=true;
+ m_http->Reset();
+}
+
+bool CMusicInfoScraper::IsCanceled()
+{
+ return m_bCanceled;
+}
+
+void CMusicInfoScraper::OnStartup()
+{
+ m_bSucceeded=false;
+ m_bCanceled=false;
+}
+
+void CMusicInfoScraper::Process()
+{
+ try
+ {
+ if (m_strAlbum.size())
+ {
+ FindAlbumInfo();
+ m_strAlbum.clear();
+ m_strArtist.clear();
+ }
+ else if (m_strArtist.size())
+ {
+ FindArtistInfo();
+ m_strArtist.clear();
+ }
+ if (m_iAlbum>-1)
+ {
+ LoadAlbumInfo();
+ m_iAlbum=-1;
+ }
+ if (m_iArtist>-1)
+ {
+ LoadArtistInfo();
+ m_iArtist=-1;
+ }
+ }
+ catch(...)
+ {
+ CLog::Log(LOGERROR, "Exception in CMusicInfoScraper::Process()");
+ }
+}
+
+bool CMusicInfoScraper::CheckValidOrFallback(const std::string &fallbackScraper)
+{
+ return true;
+//! @todo Handle fallback mechanism
+ /*
+ if (m_scraper->Path() != fallbackScraper &&
+ parser.Load("special://xbmc/system/scrapers/music/" + fallbackScraper))
+ {
+ CLog::Log(LOGWARNING, "{} - scraper {} fails to load, falling back to {}", __FUNCTION__, m_info.strPath, fallbackScraper);
+ m_info.strPath = fallbackScraper;
+ m_info.strContent = "albums";
+ m_info.strTitle = parser.GetName();
+ m_info.strDate = parser.GetDate();
+ m_info.strFramework = parser.GetFramework();
+ m_info.strLanguage = parser.GetLanguage();
+ m_info.settings.LoadSettingsXML("special://xbmc/system/scrapers/music/" + m_info.strPath);
+ return true;
+ }
+ return false; */
+}