diff --git a/projects/RPi/patches/kodi/kodi-001-newclock4.patch b/projects/RPi/patches/kodi/kodi-001-newclock4.patch index b4bf0ed322..410852ee52 100644 --- a/projects/RPi/patches/kodi/kodi-001-newclock4.patch +++ b/projects/RPi/patches/kodi/kodi-001-newclock4.patch @@ -114,451 +114,6 @@ index 0000000..4ac5636 + } + } -From 5116901918bb718694906bbe731df901a33e356b Mon Sep 17 00:00:00 2001 -From: Jonathan Marshall -Date: Sat, 2 Nov 2013 23:49:17 +1300 -Subject: [PATCH 03/96] adds GetTvShowSeasons - ---- - xbmc/video/VideoDatabase.cpp | 30 ++++++++++++++++++++++++------ - xbmc/video/VideoDatabase.h | 1 + - 2 files changed, 25 insertions(+), 6 deletions(-) - -diff --git a/xbmc/video/VideoDatabase.cpp b/xbmc/video/VideoDatabase.cpp -index 21391dd..0249ed6 100644 ---- a/xbmc/video/VideoDatabase.cpp -+++ b/xbmc/video/VideoDatabase.cpp -@@ -4213,7 +4213,7 @@ bool CVideoDatabase::RemoveArtForItem(int mediaId, const MediaType &mediaType, c - return result; - } - --bool CVideoDatabase::GetTvShowSeasonArt(int showId, map > &seasonArt) -+bool CVideoDatabase::GetTvShowSeasons(int showId, map &seasons) - { - try - { -@@ -4224,19 +4224,37 @@ bool CVideoDatabase::GetTvShowSeasonArt(int showId, map - CStdString sql = PrepareSQL("select idSeason,season from seasons where idShow=%i", showId); - m_pDS2->query(sql.c_str()); - -- vector< pair > seasons; -+ seasons.clear(); - while (!m_pDS2->eof()) - { -- seasons.push_back(make_pair(m_pDS2->fv(0).get_asInt(), m_pDS2->fv(1).get_asInt())); -+ seasons.insert(make_pair(m_pDS2->fv(1).get_asInt(), m_pDS2->fv(0).get_asInt())); - m_pDS2->next(); - } - m_pDS2->close(); -+ return true; -+ } -+ catch (...) -+ { -+ CLog::Log(LOGERROR, "%s(%d) failed", __FUNCTION__, showId); -+ } -+ return false; -+} -+ -+bool CVideoDatabase::GetTvShowSeasonArt(int showId, map > &seasonArt) -+{ -+ try -+ { -+ if (NULL == m_pDB.get()) return false; -+ if (NULL == m_pDS2.get()) return false; // using dataset 2 as we're likely called in loops on dataset 1 -+ -+ map seasons; -+ GetTvShowSeasons(showId, seasons); - -- for (vector< pair >::const_iterator i = seasons.begin(); i != seasons.end(); ++i) -+ for (map::const_iterator i = seasons.begin(); i != seasons.end(); ++i) - { - map art; -- GetArtForItem(i->first, MediaTypeSeason, art); -- seasonArt.insert(make_pair(i->second,art)); -+ GetArtForItem(i->second, MediaTypeSeason, art); -+ seasonArt.insert(make_pair(i->first,art)); - } - return true; - } -diff --git a/xbmc/video/VideoDatabase.h b/xbmc/video/VideoDatabase.h -index 78259ed..cbb26b7 100644 ---- a/xbmc/video/VideoDatabase.h -+++ b/xbmc/video/VideoDatabase.h -@@ -746,6 +746,7 @@ class CVideoDatabase : public CDatabase - std::string GetArtForItem(int mediaId, const MediaType &mediaType, const std::string &artType); - bool RemoveArtForItem(int mediaId, const MediaType &mediaType, const std::string &artType); - bool RemoveArtForItem(int mediaId, const MediaType &mediaType, const std::set &artTypes); -+ bool GetTvShowSeasons(int showId, std::map &seasons); - bool GetTvShowSeasonArt(int mediaId, std::map > &seasonArt); - bool GetArtTypes(const MediaType &mediaType, std::vector &artTypes); - - -From eb300fcaab79f877d913e2d38fb15cdd97858fc6 Mon Sep 17 00:00:00 2001 -From: Jonathan Marshall -Date: Sat, 2 Nov 2013 23:50:10 +1300 -Subject: [PATCH 04/96] move AddSeason() public. - ---- - xbmc/video/VideoDatabase.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/xbmc/video/VideoDatabase.h b/xbmc/video/VideoDatabase.h -index cbb26b7..1a79c00 100644 ---- a/xbmc/video/VideoDatabase.h -+++ b/xbmc/video/VideoDatabase.h -@@ -757,6 +757,7 @@ class CVideoDatabase : public CDatabase - - virtual bool GetFilter(CDbUrl &videoUrl, Filter &filter, SortDescription &sorting); - -+ int AddSeason(int showID, int season); - int AddSet(const CStdString& strSet); - void ClearMovieSet(int idMovie); - void SetMovieSet(int idMovie, int idSet); -@@ -787,7 +788,6 @@ class CVideoDatabase : public CDatabase - - int AddTvShow(); - int AddMusicVideo(const CStdString& strFilenameAndPath); -- int AddSeason(int showID, int season); - - /*! \brief Adds a path to the tvshow link table. - \param idShow the id of the show. - -From 69ed0c95572c3371d2f6d45cfc27610656e6002f Mon Sep 17 00:00:00 2001 -From: Jonathan Marshall -Date: Sat, 2 Nov 2013 23:48:24 +1300 -Subject: [PATCH 05/96] adds GetArt function to (video) scraper, allowing art - to be fetched given the video identifier. - ---- - xbmc/addons/Scraper.cpp | 38 ++++++++++++++++++++++++++++++++++++++ - xbmc/addons/Scraper.h | 3 +++ - xbmc/video/VideoInfoDownloader.cpp | 5 +++++ - xbmc/video/VideoInfoDownloader.h | 7 +++++++ - 4 files changed, 53 insertions(+) - -diff --git a/xbmc/addons/Scraper.cpp b/xbmc/addons/Scraper.cpp -index 4d22ce7..36865ac 100644 ---- a/xbmc/addons/Scraper.cpp -+++ b/xbmc/addons/Scraper.cpp -@@ -924,6 +924,44 @@ EPISODELIST CScraper::GetEpisodeList(XFILE::CCurlFile &fcurl, const CScraperUrl - return vcep; - } - -+// takes URL; returns true and populates art XML details on success, false otherwise -+bool CScraper::GetArt(XFILE::CCurlFile &fcurl, const std::string &id, CVideoInfoTag &video) -+{ -+ CLog::Log(LOGDEBUG, "%s: Reading art for '%s' using %s scraper " -+ "(file: '%s', content: '%s', version: '%s')", __FUNCTION__, id.c_str(), Name().c_str(), Path().c_str(), -+ ADDON::TranslateContent(Content()).c_str(), Version().asString().c_str()); -+ -+ video.Reset(); -+ vector vcsIn; -+ CScraperUrl scurl; -+ vcsIn.push_back(id); -+ vector vcsOut = RunNoThrow("GetArt", scurl, fcurl, &vcsIn); -+ -+ // parse XML output -+ bool fRet(false); -+ for (vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) -+ { -+ CXBMCTinyXML doc; -+ doc.Parse(*i, TIXML_ENCODING_UTF8); -+ if (!doc.RootElement()) -+ { -+ CLog::Log(LOGERROR, "%s: Unable to parse XML", __FUNCTION__); -+ continue; -+ } -+ -+ TiXmlHandle xhDoc(&doc); -+ TiXmlElement *pxeDetails = xhDoc.FirstChild("details").Element(); -+ if (!pxeDetails) -+ { -+ CLog::Log(LOGERROR, "%s: Invalid XML file (want
)", __FUNCTION__); -+ continue; -+ } -+ video.Load(pxeDetails, true/*fChain*/); -+ fRet = true; // but don't exit in case of chaining -+ } -+ return fRet; -+} -+ - // takes URL; returns true and populates video details on success, false otherwise - bool CScraper::GetVideoDetails(XFILE::CCurlFile &fcurl, const CScraperUrl &scurl, - bool fMovie/*else episode*/, CVideoInfoTag &video) -diff --git a/xbmc/addons/Scraper.h b/xbmc/addons/Scraper.h -index c7274f2..5df5296 100644 ---- a/xbmc/addons/Scraper.h -+++ b/xbmc/addons/Scraper.h -@@ -18,6 +18,8 @@ - * . - * - */ -+ -+#include - #include "addons/Addon.h" - #include "XBDateTime.h" - #include "utils/ScraperUrl.h" -@@ -146,6 +148,7 @@ class CScraper : public CAddon - CAlbum &album); - bool GetArtistDetails(XFILE::CCurlFile &fcurl, const CScraperUrl &scurl, - const std::string &sSearch, CArtist &artist); -+ bool GetArt(XFILE::CCurlFile &fcurl, const std::string &id, CVideoInfoTag &video); - - private: - CScraper(const CScraper &rhs); -diff --git a/xbmc/video/VideoInfoDownloader.cpp b/xbmc/video/VideoInfoDownloader.cpp -index f33ac8a..5d84734 100644 ---- a/xbmc/video/VideoInfoDownloader.cpp -+++ b/xbmc/video/VideoInfoDownloader.cpp -@@ -191,6 +191,11 @@ bool CVideoInfoDownloader::GetDetails(const CScraperUrl &url, - return m_info->GetVideoDetails(*m_http, url, true/*fMovie*/, movieDetails); - } - -+bool CVideoInfoDownloader::GetArt(const std::string &id, CVideoInfoTag &details) -+{ -+ return m_info->GetArt(*m_http, id, details); -+} -+ - bool CVideoInfoDownloader::GetEpisodeDetails(const CScraperUrl &url, - CVideoInfoTag &movieDetails, - CGUIDialogProgress *pProgress /* = NULL */) -diff --git a/xbmc/video/VideoInfoDownloader.h b/xbmc/video/VideoInfoDownloader.h -index 22ac229..75bc341 100644 ---- a/xbmc/video/VideoInfoDownloader.h -+++ b/xbmc/video/VideoInfoDownloader.h -@@ -59,6 +59,13 @@ class CVideoInfoDownloader : public CThread - - static void ShowErrorDialog(const ADDON::CScraperError &sce); - -+ /*! \brief Grab art URLs for an item with the scraper -+ \param id the unique identifier used by the scraper to describe the item. -+ \param details [out] the video info tag structure to fill with art. -+ \return true on success, false on failure. -+ */ -+ bool GetArt(const std::string &id, CVideoInfoTag &details); -+ - protected: - enum LOOKUP_STATE { DO_NOTHING = 0, - FIND_MOVIE = 1, - -From e56fe6d246ef40dca634d78f393279e361c90e9f Mon Sep 17 00:00:00 2001 -From: Jonathan Marshall -Date: Sat, 2 Nov 2013 23:53:14 +1300 -Subject: [PATCH 06/96] refresh season art if a new season is found that isn't - recorded in the database yet. Fixes #14339 - ---- - xbmc/video/VideoInfoScanner.cpp | 33 ++++++++++++++++++++++++++++++++- - xbmc/video/VideoInfoScanner.h | 2 ++ - 2 files changed, 34 insertions(+), 1 deletion(-) - -diff --git a/xbmc/video/VideoInfoScanner.cpp b/xbmc/video/VideoInfoScanner.cpp -index cb6a4fe..fe1355c 100644 ---- a/xbmc/video/VideoInfoScanner.cpp -+++ b/xbmc/video/VideoInfoScanner.cpp -@@ -1405,6 +1405,10 @@ namespace VIDEO - pDlgProgress->Progress(); - } - -+ bool updateSeasons = false; -+ map seasons; -+ m_database.GetTvShowSeasons(showInfo.m_iDbId, seasons); -+ - EPISODELIST episodes; - bool hasEpisodeGuide = false; - -@@ -1453,6 +1457,8 @@ namespace VIDEO - } - if (AddVideo(&item, CONTENT_TVSHOWS, file->isFolder, true, &showInfo) < 0) - return INFO_ERROR; -+ if (seasons.find(item.GetVideoInfoTag()->m_iSeason) == seasons.end()) -+ updateSeasons = true; - continue; - } - -@@ -1582,6 +1588,8 @@ namespace VIDEO - - if (AddVideo(&item, CONTENT_TVSHOWS, file->isFolder, useLocal, &showInfo) < 0) - return INFO_ERROR; -+ if (seasons.find(item.GetVideoInfoTag()->m_iSeason) == seasons.end()) -+ updateSeasons = true; - } - else - { -@@ -1590,9 +1598,27 @@ namespace VIDEO - file->cDate.GetAsLocalizedDate().c_str(), file->strTitle.c_str()); - } - } -+ if (updateSeasons) -+ UpdateSeasons(showInfo, scraper, useLocal); - return INFO_ADDED; - } - -+ void CVideoInfoScanner::UpdateSeasons(const CVideoInfoTag &showInfo, const ADDON::ScraperPtr &scraper, bool useLocal) -+ { -+ map > seasonArt; -+ m_database.GetTvShowSeasonArt(showInfo.m_iDbId, seasonArt); -+ CVideoInfoTag details; -+ CVideoInfoDownloader loader(scraper); -+ loader.GetArt(showInfo.m_strIMDBNumber, details); -+ details.m_strPath = showInfo.m_strPath; -+ GetSeasonThumbs(details, seasonArt, CVideoThumbLoader::GetArtTypes("season"), useLocal); -+ for (map >::iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) -+ { -+ int seasonID = m_database.AddSeason(showInfo.m_iDbId, i->first); -+ m_database.SetArtForItem(seasonID, "season", i->second); -+ } -+ } -+ - CStdString CVideoInfoScanner::GetnfoFile(CFileItem *item, bool bGrabAny) const - { - CStdString nfoFile; -@@ -1857,6 +1883,11 @@ namespace VIDEO - } - for (int season = -1; season <= maxSeasons; season++) - { -+ // skip if we already have some art -+ map >::const_iterator i = seasonArt.find(season); -+ if (i != seasonArt.end() && !i->second.empty()) -+ continue; -+ - map art; - if (useLocal) - { -@@ -1910,7 +1941,7 @@ namespace VIDEO - art.insert(make_pair(artTypes.front(), image)); - } - -- seasonArt.insert(make_pair(season, art)); -+ seasonArt[season] = art; - } - } - -diff --git a/xbmc/video/VideoInfoScanner.h b/xbmc/video/VideoInfoScanner.h -index 28bd2bf..a0f9d53 100644 ---- a/xbmc/video/VideoInfoScanner.h -+++ b/xbmc/video/VideoInfoScanner.h -@@ -232,6 +232,8 @@ namespace VIDEO - */ - INFO_RET OnProcessSeriesFolder(EPISODELIST& files, const ADDON::ScraperPtr &scraper, bool useLocal, const CVideoInfoTag& showInfo, CGUIDialogProgress* pDlgProgress = NULL); - -+ void UpdateSeasons(const CVideoInfoTag &showInfo, const ADDON::ScraperPtr &scraper, bool useLocal); -+ - bool EnumerateSeriesFolder(CFileItem* item, EPISODELIST& episodeList); - bool ProcessItemByVideoInfoTag(const CFileItem *item, EPISODELIST &episodeList); - - -From 1b57e14b00d8fc755c66f646e4bfaebf9beb927d Mon Sep 17 00:00:00 2001 -From: Jonathan Marshall -Date: Sat, 2 Nov 2013 23:53:34 +1300 -Subject: [PATCH 07/96] REMOVEME: updated thetvdb.com scraper to support art - updates - ---- - addons/metadata.tvdb.com/tvdb.xml | 59 +++++++++++++++++++++++++-------------- - 1 file changed, 38 insertions(+), 21 deletions(-) - -diff --git a/addons/metadata.tvdb.com/tvdb.xml b/addons/metadata.tvdb.com/tvdb.xml -index f27e4fc..bdf329f 100644 ---- a/addons/metadata.tvdb.com/tvdb.xml -+++ b/addons/metadata.tvdb.com/tvdb.xml -@@ -102,57 +102,74 @@ - - <Actor>.*?<Image>([^<]*)</Image>.*?<Name>([^<]*)</Name>.*?<Role>([^<]*) - -- -+ -+ -+ -+ -+ .*/(.*).zip -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>series</BannerType>[^<]*<BannerType2>graphical</BannerType2>[^<]*<Language>$INFO[language]</Language> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>series</BannerType>[^<]*<BannerType2>graphical</BannerType2>[^<]*<Language>((?!$INFO[language])[a-z])*</Language> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>series</BannerType>[^<]*<BannerType2>text</BannerType2>[^<]*<Language>$INFO[language]</Language> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>series</BannerType>[^<]*<BannerType2>text</BannerType2>[^<]*<Language>((?!$INFO[language])[a-z])*</Language> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>series</BannerType>[^<]*<BannerType2>blank</BannerType2>[^<]*<Language></Language> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>season</BannerType>[^<]*<BannerType2>season</BannerType2>[^<]*<Language>$INFO[language]</Language>[^<]*[^S]*Season>([0-9]+)</Season> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>season</BannerType>[^<]*<BannerType2>season</BannerType2>[^<]*<Language>((?!$INFO[language])[a-z])*</Language>[^<]*[^S]*Season>([0-9]+)</Season> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>season</BannerType>[^<]*<BannerType2>seasonwide</BannerType2>[^<]*<Language>$INFO[language]</Language>[^<]*[^S]*Season>([0-9]+)</Season> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>season</BannerType>[^<]*<BannerType2>seasonwide</BannerType2>[^<]*<Language>((?!$INFO[language])[a-z])*</Language>[^<]*[^S]*Season>([0-9]+)</Season> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>poster</BannerType> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>poster</BannerType> - -- -- -+ -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>fanart</BannerType>[^<]*<BannerType2>([^<]*)</BannerType2>[^<]*<Colors>([^<]*)</Colors>[^<]*<Language>$INFO[language]</Language> - -- -+ - <BannerPath>([^<]*)</BannerPath>[^<]*<BannerType>fanart</BannerType>[^<]*<BannerType2>([^<]*)</BannerType2>[^<]*<Colors>([^<]*)</Colors>[^<]*<Language>((?!$INFO[language])[a-z])*</Language> - - - -- -- .*/(.*).zip -- -- -- -- - - -- -+ - - - - From 93085d1cd4ca39f8be362d187a289dcfdbb259e2 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sat, 2 Aug 2014 17:48:04 +0100 @@ -10419,38 +9974,6 @@ index 03a05de..c0ff30d 100644 // we only want to upload frames once if (buffer->flipindex++) -From b1b3b79b2dfd39574fb9fe6dcbc3c2e4cf7077cc Mon Sep 17 00:00:00 2001 -From: popcornmix -Date: Wed, 19 Nov 2014 20:36:56 +0000 -Subject: [PATCH 95/96] scraper: Fix for losing infotags when artwork grab - fails suggested by menakite - ---- - xbmc/addons/Scraper.cpp | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/xbmc/addons/Scraper.cpp b/xbmc/addons/Scraper.cpp -index 36865ac..d430f15 100644 ---- a/xbmc/addons/Scraper.cpp -+++ b/xbmc/addons/Scraper.cpp -@@ -931,7 +931,6 @@ bool CScraper::GetArt(XFILE::CCurlFile &fcurl, const std::string &id, CVideoInfo - "(file: '%s', content: '%s', version: '%s')", __FUNCTION__, id.c_str(), Name().c_str(), Path().c_str(), - ADDON::TranslateContent(Content()).c_str(), Version().asString().c_str()); - -- video.Reset(); - vector vcsIn; - CScraperUrl scurl; - vcsIn.push_back(id); -@@ -956,6 +955,8 @@ bool CScraper::GetArt(XFILE::CCurlFile &fcurl, const std::string &id, CVideoInfo - CLog::Log(LOGERROR, "%s: Invalid XML file (want
)", __FUNCTION__); - continue; - } -+ if (!fRet) -+ video.Reset(); - video.Load(pxeDetails, true/*fChain*/); - fRet = true; // but don't exit in case of chaining - } - From a815b2f685515f3669f33d842421dbaad278def8 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 19 Nov 2014 20:57:10 +0000