From c04dcc2e7d834218ef2d4194331e383402495ae1 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 20:07:22 +0200 Subject: Adding upstream version 2:20.4+dfsg. Signed-off-by: Daniel Baumann --- xbmc/music/infoscanner/MusicInfoScraper.cpp | 202 ++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 xbmc/music/infoscanner/MusicInfoScraper.cpp (limited to 'xbmc/music/infoscanner/MusicInfoScraper.cpp') 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; */ +} -- cgit v1.2.3