From 0df7d7093623b7cb5801f6df7fecb480bcb3f614 Mon Sep 17 00:00:00 2001 From: Jonathan Marshall Date: Tue, 29 Oct 2013 11:21:27 +1300 Subject: [PATCH] [textures] move image wrapping functions into a separate class --- xbmc/TextureCache.cpp | 39 +++------------------------ xbmc/TextureCache.h | 16 ----------- xbmc/TextureDatabase.cpp | 33 +++++++++++++++++++++++ xbmc/TextureDatabase.h | 20 ++++++++++++++ xbmc/interfaces/json-rpc/AddonsOperations.cpp | 2 +- xbmc/interfaces/json-rpc/FileItemHandler.cpp | 10 +++---- xbmc/interfaces/json-rpc/VideoLibrary.cpp | 4 +-- xbmc/music/MusicThumbLoader.cpp | 4 +-- xbmc/music/dialogs/GUIDialogMusicInfo.cpp | 4 +-- xbmc/music/infoscanner/MusicInfoScanner.cpp | 4 +-- xbmc/network/upnp/UPnPInternal.cpp | 6 ++--- xbmc/network/upnp/UPnPRenderer.cpp | 4 +-- xbmc/pictures/PictureThumbLoader.cpp | 6 ++--- xbmc/video/VideoInfoTag.cpp | 4 +-- xbmc/video/VideoThumbLoader.cpp | 2 +- xbmc/video/dialogs/GUIDialogVideoInfo.cpp | 4 +-- xbmc/video/windows/GUIWindowVideoNav.cpp | 2 +- 17 files changed, 84 insertions(+), 80 deletions(-) diff --git a/xbmc/TextureCache.cpp b/xbmc/TextureCache.cpp index 6fb440f..7f356b7 100644 --- a/xbmc/TextureCache.cpp +++ b/xbmc/TextureCache.cpp @@ -80,7 +80,7 @@ bool CTextureCache::HasCachedImage(const CStdString &url) CStdString CTextureCache::GetCachedImage(const CStdString &image, CTextureDetails &details, bool trackUsage) { - CStdString url = UnwrapImageURL(image); + CStdString url = CTextureUtils::UnwrapImageURL(image); if (IsCachedImage(url)) return url; @@ -95,39 +95,6 @@ CStdString CTextureCache::GetCachedImage(const CStdString &image, CTextureDetail return ""; } -CStdString CTextureCache::GetWrappedImageURL(const CStdString &image, const CStdString &type, const CStdString &options) -{ - if (StringUtils::StartsWith(image, "image://")) - return image; // already wrapped - - CURL url; - url.SetProtocol("image"); - url.SetUserName(type); - url.SetHostName(image); - if (!options.IsEmpty()) - { - url.SetFileName("transform"); - url.SetOptions("?" + options); - } - return url.Get(); -} - -CStdString CTextureCache::GetWrappedThumbURL(const CStdString &image) -{ - return GetWrappedImageURL(image, "", "size=thumb"); -} - -CStdString CTextureCache::UnwrapImageURL(const CStdString &image) -{ - if (StringUtils::StartsWith(image, "image://")) - { - CURL url(image); - if (url.GetUserName().IsEmpty() && url.GetOptions().IsEmpty()) - return url.GetHostName(); - } - return image; -} - bool CTextureCache::CanCacheImageURL(const CURL &url) { return (url.GetUserName().empty() || url.GetUserName() == "music"); @@ -161,7 +128,7 @@ void CTextureCache::BackgroundCacheImage(const CStdString &url) return; // image is already cached and doesn't need to be checked further // needs (re)caching - AddJob(new CTextureCacheJob(UnwrapImageURL(url), details.hash)); + AddJob(new CTextureCacheJob(CTextureUtils::UnwrapImageURL(url), details.hash)); } bool CTextureCache::CacheImage(const CStdString &image, CTextureDetails &details) @@ -175,7 +142,7 @@ bool CTextureCache::CacheImage(const CStdString &image, CTextureDetails &details CStdString CTextureCache::CacheImage(const CStdString &image, CBaseTexture **texture, CTextureDetails *details) { - CStdString url = UnwrapImageURL(image); + CStdString url = CTextureUtils::UnwrapImageURL(image); CSingleLock lock(m_processingSection); if (m_processing.find(url) == m_processing.end()) { diff --git a/xbmc/TextureCache.h b/xbmc/TextureCache.h index 168fb70..be405af 100644 --- a/xbmc/TextureCache.h +++ b/xbmc/TextureCache.h @@ -134,22 +134,6 @@ public: */ static CStdString GetCachedPath(const CStdString &file); - /*! \brief retrieve a wrapped URL for a image file - \param image name of the file - \param type signifies a special type of image (eg embedded video thumb, picture folder thumb) - \param options which options we need (eg size=thumb) - \return full wrapped URL of the image file - */ - static CStdString GetWrappedImageURL(const CStdString &image, const CStdString &type = "", const CStdString &options = ""); - static CStdString GetWrappedThumbURL(const CStdString &image); - - /*! \brief Unwrap an image:// style URL - Such urls are used for art over the webserver or other users of the VFS - \param image url of the image - \return the unwrapped URL, or the original URL if unwrapping is inappropriate. - */ - static CStdString UnwrapImageURL(const CStdString &image); - /*! \brief check whether an image:// URL may be cached \param url the URL to the image \return true if the given URL may be cached, false otherwise diff --git a/xbmc/TextureDatabase.cpp b/xbmc/TextureDatabase.cpp index 89f9190..7a0e469 100644 --- a/xbmc/TextureDatabase.cpp +++ b/xbmc/TextureDatabase.cpp @@ -107,6 +107,39 @@ void CTextureRule::GetAvailableFields(std::vector &fieldList) fieldList.push_back(fields[i].string); } +CStdString CTextureUtils::GetWrappedImageURL(const CStdString &image, const CStdString &type, const CStdString &options) +{ + if (StringUtils::StartsWith(image, "image://")) + return image; // already wrapped + + CURL url; + url.SetProtocol("image"); + url.SetUserName(type); + url.SetHostName(image); + if (!options.IsEmpty()) + { + url.SetFileName("transform"); + url.SetOptions("?" + options); + } + return url.Get(); +} + +CStdString CTextureUtils::GetWrappedThumbURL(const CStdString &image) +{ + return GetWrappedImageURL(image, "", "size=thumb"); +} + +CStdString CTextureUtils::UnwrapImageURL(const CStdString &image) +{ + if (StringUtils::StartsWith(image, "image://")) + { + CURL url(image); + if (url.GetUserName().IsEmpty() && url.GetOptions().IsEmpty()) + return url.GetHostName(); + } + return image; +} + CTextureDatabase::CTextureDatabase() { } diff --git a/xbmc/TextureDatabase.h b/xbmc/TextureDatabase.h index f4f3811..93317d5 100644 --- a/xbmc/TextureDatabase.h +++ b/xbmc/TextureDatabase.h @@ -40,6 +40,26 @@ protected: virtual FIELD_TYPE GetFieldType(int field) const; }; +class CTextureUtils +{ +public: + /*! \brief retrieve a wrapped URL for a image file + \param image name of the file + \param type signifies a special type of image (eg embedded video thumb, picture folder thumb) + \param options which options we need (eg size=thumb) + \return full wrapped URL of the image file + */ + static CStdString GetWrappedImageURL(const CStdString &image, const CStdString &type = "", const CStdString &options = ""); + static CStdString GetWrappedThumbURL(const CStdString &image); + + /*! \brief Unwrap an image:// style URL + Such urls are used for art over the webserver or other users of the VFS + \param image url of the image + \return the unwrapped URL, or the original URL if unwrapping is inappropriate. + */ + static CStdString UnwrapImageURL(const CStdString &image); +}; + class CTextureDatabase : public CDatabase, public IDatabaseQueryRuleFactory { public: diff --git a/xbmc/interfaces/json-rpc/AddonsOperations.cpp b/xbmc/interfaces/json-rpc/AddonsOperations.cpp index 6bbfd8d..07a4c8e 100644 --- a/xbmc/interfaces/json-rpc/AddonsOperations.cpp +++ b/xbmc/interfaces/json-rpc/AddonsOperations.cpp @@ -227,7 +227,7 @@ void CAddonsOperations::FillDetails(AddonPtr addon, const CVariant& fields, CVar bool needsRecaching; CStdString image = CTextureCache::Get().CheckCachedImage(url, false, needsRecaching); if (!image.empty() || CFile::Exists(url)) - object[field] = CTextureCache::Get().GetWrappedImageURL(url); + object[field] = CTextureUtils::GetWrappedImageURL(url); else object[field] = ""; } diff --git a/xbmc/interfaces/json-rpc/FileItemHandler.cpp b/xbmc/interfaces/json-rpc/FileItemHandler.cpp index e1a8288..68582c8 100644 --- a/xbmc/interfaces/json-rpc/FileItemHandler.cpp +++ b/xbmc/interfaces/json-rpc/FileItemHandler.cpp @@ -35,7 +35,7 @@ #include "video/VideoDatabase.h" #include "filesystem/Directory.h" #include "filesystem/File.h" -#include "TextureCache.h" +#include "TextureDatabase.h" #include "video/VideoThumbLoader.h" #include "music/MusicThumbLoader.h" #include "Util.h" @@ -117,7 +117,7 @@ bool CFileItemHandler::GetField(const std::string &field, const CVariant &info, for (CGUIListItem::ArtMap::const_iterator artIt = artMap.begin(); artIt != artMap.end(); ++artIt) { if (!artIt->second.empty()) - artObj[artIt->first] = CTextureCache::GetWrappedImageURL(artIt->second); + artObj[artIt->first] = CTextureUtils::GetWrappedImageURL(artIt->second); } result["art"] = artObj; @@ -133,10 +133,10 @@ bool CFileItemHandler::GetField(const std::string &field, const CVariant &info, fetchedArt = true; } else if (item->HasPictureInfoTag() && !item->HasArt("thumb")) - item->SetArt("thumb", CTextureCache::GetWrappedThumbURL(item->GetPath())); + item->SetArt("thumb", CTextureUtils::GetWrappedThumbURL(item->GetPath())); if (item->HasArt("thumb")) - result["thumbnail"] = CTextureCache::GetWrappedImageURL(item->GetArt("thumb")); + result["thumbnail"] = CTextureUtils::GetWrappedImageURL(item->GetArt("thumb")); else result["thumbnail"] = ""; @@ -153,7 +153,7 @@ bool CFileItemHandler::GetField(const std::string &field, const CVariant &info, } if (item->HasArt("fanart")) - result["fanart"] = CTextureCache::GetWrappedImageURL(item->GetArt("fanart")); + result["fanart"] = CTextureUtils::GetWrappedImageURL(item->GetArt("fanart")); else result["fanart"] = ""; diff --git a/xbmc/interfaces/json-rpc/VideoLibrary.cpp b/xbmc/interfaces/json-rpc/VideoLibrary.cpp index 6ab2548..8b75798 100644 --- a/xbmc/interfaces/json-rpc/VideoLibrary.cpp +++ b/xbmc/interfaces/json-rpc/VideoLibrary.cpp @@ -20,7 +20,7 @@ #include "VideoLibrary.h" #include "ApplicationMessenger.h" -#include "TextureCache.h" +#include "TextureDatabase.h" #include "Util.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" @@ -973,7 +973,7 @@ void CVideoLibrary::UpdateVideoTag(const CVariant ¶meterObject, CVideoInfoTa for (CVariant::const_iterator_map artIt = art.begin_map(); artIt != art.end_map(); artIt++) { if (!artIt->second.asString().empty()) - artwork[artIt->first] = CTextureCache::UnwrapImageURL(artIt->second.asString()); + artwork[artIt->first] = CTextureUtils::UnwrapImageURL(artIt->second.asString()); } } } diff --git a/xbmc/music/MusicThumbLoader.cpp b/xbmc/music/MusicThumbLoader.cpp index 4473aaa..a916cba 100644 --- a/xbmc/music/MusicThumbLoader.cpp +++ b/xbmc/music/MusicThumbLoader.cpp @@ -20,7 +20,7 @@ #include "MusicThumbLoader.h" #include "FileItem.h" -#include "TextureCache.h" +#include "TextureDatabase.h" #include "music/tags/MusicInfoTag.h" #include "music/tags/MusicInfoTagLoaderFactory.h" #include "music/infoscanner/MusicInfoScanner.h" @@ -159,7 +159,7 @@ bool CMusicThumbLoader::LoadItemLookup(CFileItem* pItem) if (!FillThumb(*pItem, false)) // Check for user thumbs but ignore folder thumbs { // No user thumb, use embedded art - CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "music"); + CStdString thumb = CTextureUtils::GetWrappedImageURL(pItem->GetPath(), "music"); pItem->SetArt("thumb", thumb); } } diff --git a/xbmc/music/dialogs/GUIDialogMusicInfo.cpp b/xbmc/music/dialogs/GUIDialogMusicInfo.cpp index 2eadc0b..b8aef21 100644 --- a/xbmc/music/dialogs/GUIDialogMusicInfo.cpp +++ b/xbmc/music/dialogs/GUIDialogMusicInfo.cpp @@ -459,7 +459,7 @@ void CGUIDialogMusicInfo::OnGetFanart() strItemPath.Format("fanart://Remote%i",i); CFileItemPtr item(new CFileItem(strItemPath, false)); CStdString thumb = m_artist.fanart.GetPreviewURL(i); - item->SetArt("thumb", CTextureCache::GetWrappedThumbURL(thumb)); + item->SetArt("thumb", CTextureUtils::GetWrappedThumbURL(thumb)); item->SetIconImage("DefaultPicture.png"); item->SetLabel(g_localizeStrings.Get(20441)); @@ -518,7 +518,7 @@ void CGUIDialogMusicInfo::OnGetFanart() result.clear(); if (flip && !result.empty()) - result = CTextureCache::GetWrappedImageURL(result, "", "flipped"); + result = CTextureUtils::GetWrappedImageURL(result, "", "flipped"); // update thumb in the database CMusicDatabase db; diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp index f04bb44..89bc461 100644 --- a/xbmc/music/infoscanner/MusicInfoScanner.cpp +++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp @@ -954,7 +954,7 @@ void CMusicInfoScanner::FindArtForAlbums(VECALBUMS &albums, const CStdString &pa if (!art->strThumb.empty()) albumArt = art->strThumb; else - albumArt = CTextureCache::GetWrappedImageURL(art->strFileName, "music"); + albumArt = CTextureUtils::GetWrappedImageURL(art->strFileName, "music"); } if (!albumArt.empty()) @@ -970,7 +970,7 @@ void CMusicInfoScanner::FindArtForAlbums(VECALBUMS &albums, const CStdString &pa for (VECSONGS::iterator k = album.songs.begin(); k != album.songs.end(); ++k) { if (k->strThumb.empty() && !k->embeddedArt.empty()) - k->strThumb = CTextureCache::GetWrappedImageURL(k->strFileName, "music"); + k->strThumb = CTextureUtils::GetWrappedImageURL(k->strFileName, "music"); } } } diff --git a/xbmc/network/upnp/UPnPInternal.cpp b/xbmc/network/upnp/UPnPInternal.cpp index f1ec1ca..0d0868c 100644 --- a/xbmc/network/upnp/UPnPInternal.cpp +++ b/xbmc/network/upnp/UPnPInternal.cpp @@ -36,7 +36,7 @@ #include "video/VideoInfoTag.h" #include "music/MusicDatabase.h" #include "music/tags/MusicInfoTag.h" -#include "TextureCache.h" +#include "TextureDatabase.h" #include "ThumbLoader.h" #include "utils/URIUtils.h" @@ -559,7 +559,7 @@ BuildObject(CFileItem& item, art.uri = upnp_server->BuildSafeResourceUri( rooturi, (*ips.GetFirstItem()).ToString(), - CTextureCache::GetWrappedImageURL(thumb).c_str()); + CTextureUtils::GetWrappedImageURL(thumb).c_str()); // Set DLNA profileID by extension, defaulting to JPEG. if (URIUtils::HasExtension(thumb, ".png")) { @@ -572,7 +572,7 @@ BuildObject(CFileItem& item, fanart = item.GetArt("fanart"); if (upnp_server && !fanart.empty()) - upnp_server->AddSafeResourceUri(object, rooturi, ips, CTextureCache::GetWrappedImageURL(fanart), "xbmc.org:*:fanart:*"); + upnp_server->AddSafeResourceUri(object, rooturi, ips, CTextureUtils::GetWrappedImageURL(fanart), "xbmc.org:*:fanart:*"); return object; diff --git a/xbmc/network/upnp/UPnPRenderer.cpp b/xbmc/network/upnp/UPnPRenderer.cpp index b51510b..b991b42 100644 --- a/xbmc/network/upnp/UPnPRenderer.cpp +++ b/xbmc/network/upnp/UPnPRenderer.cpp @@ -33,7 +33,7 @@ #include "pictures/PictureInfoTag.h" #include "interfaces/AnnouncementManager.h" #include "settings/Settings.h" -#include "TextureCache.h" +#include "TextureDatabase.h" #include "ThumbLoader.h" #include "URL.h" #include "utils/URIUtils.h" @@ -395,7 +395,7 @@ CUPnPRenderer::GetMetadata(NPT_String& meta) else thumb = g_infoManager.GetImage(VIDEOPLAYER_COVER, -1); - thumb = CTextureCache::GetWrappedImageURL(thumb); + thumb = CTextureUtils::GetWrappedImageURL(thumb); NPT_String ip; if (g_application.getNetwork().GetFirstConnectedInterface()) { diff --git a/xbmc/pictures/PictureThumbLoader.cpp b/xbmc/pictures/PictureThumbLoader.cpp index 36a94ea..4f24700 100644 --- a/xbmc/pictures/PictureThumbLoader.cpp +++ b/xbmc/pictures/PictureThumbLoader.cpp @@ -79,7 +79,7 @@ bool CPictureThumbLoader::LoadItemCached(CFileItem* pItem) CStdString thumb; if (pItem->IsPicture() && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && !pItem->IsCBR() && !pItem->IsPlayList()) { // load the thumb from the image file - thumb = pItem->HasArt("thumb") ? pItem->GetArt("thumb") : CTextureCache::GetWrappedThumbURL(pItem->GetPath()); + thumb = pItem->HasArt("thumb") ? pItem->GetArt("thumb") : CTextureUtils::GetWrappedThumbURL(pItem->GetPath()); } else if (pItem->IsVideo() && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && !pItem->IsCBR() && !pItem->IsPlayList()) { // video @@ -223,7 +223,7 @@ void CPictureThumbLoader::ProcessFoldersAndArchives(CFileItem *pItem) if (items.Size() < 4 || pItem->IsCBR() || pItem->IsCBZ()) { // less than 4 items, so just grab the first thumb items.Sort(SortByLabel, SortOrderAscending); - CStdString thumb = CTextureCache::GetWrappedThumbURL(items[0]->GetPath()); + CStdString thumb = CTextureUtils::GetWrappedThumbURL(items[0]->GetPath()); db.SetTextureForPath(pItem->GetPath(), "thumb", thumb); CTextureCache::Get().BackgroundCacheImage(thumb); pItem->SetArt("thumb", thumb); @@ -235,7 +235,7 @@ void CPictureThumbLoader::ProcessFoldersAndArchives(CFileItem *pItem) vector files; for (int thumb = 0; thumb < 4; thumb++) files.push_back(items[thumb]->GetPath()); - CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "picturefolder"); + CStdString thumb = CTextureUtils::GetWrappedImageURL(pItem->GetPath(), "picturefolder"); CStdString relativeCacheFile = CTextureCache::GetCacheFile(thumb) + ".png"; if (CPicture::CreateTiledThumb(files, CTextureCache::GetCachedPath(relativeCacheFile))) { diff --git a/xbmc/video/VideoInfoTag.cpp b/xbmc/video/VideoInfoTag.cpp index d9b97f6..821e515 100644 --- a/xbmc/video/VideoInfoTag.cpp +++ b/xbmc/video/VideoInfoTag.cpp @@ -25,7 +25,7 @@ #include "utils/log.h" #include "utils/StringUtils.h" #include "utils/Variant.h" -#include "TextureCache.h" +#include "TextureDatabase.h" #include "filesystem/File.h" #include @@ -432,7 +432,7 @@ void CVideoInfoTag::Serialize(CVariant& value) const actor["role"] = m_cast[i].strRole; actor["order"] = m_cast[i].order; if (!m_cast[i].thumb.IsEmpty()) - actor["thumbnail"] = CTextureCache::GetWrappedImageURL(m_cast[i].thumb); + actor["thumbnail"] = CTextureUtils::GetWrappedImageURL(m_cast[i].thumb); value["cast"].push_back(actor); } value["set"] = m_strSet; diff --git a/xbmc/video/VideoThumbLoader.cpp b/xbmc/video/VideoThumbLoader.cpp index 75e53e5..4ba7d72 100644 --- a/xbmc/video/VideoThumbLoader.cpp +++ b/xbmc/video/VideoThumbLoader.cpp @@ -500,7 +500,7 @@ CStdString CVideoThumbLoader::GetEmbeddedThumbURL(const CFileItem &item) if (URIUtils::IsStack(path)) path = CStackDirectory::GetFirstStackedFile(path); - return CTextureCache::GetWrappedImageURL(path, "video"); + return CTextureUtils::GetWrappedImageURL(path, "video"); } void CVideoThumbLoader::OnJobComplete(unsigned int jobID, bool success, CJob* job) diff --git a/xbmc/video/dialogs/GUIDialogVideoInfo.cpp b/xbmc/video/dialogs/GUIDialogVideoInfo.cpp index d59ba5f..ed7c416 100644 --- a/xbmc/video/dialogs/GUIDialogVideoInfo.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoInfo.cpp @@ -800,7 +800,7 @@ void CGUIDialogVideoInfo::OnGetFanart() strItemPath.Format("fanart://Remote%i",i); CFileItemPtr item(new CFileItem(strItemPath, false)); CStdString thumb = m_movieItem->GetVideoInfoTag()->m_fanart.GetPreviewURL(i); - item->SetArt("thumb", CTextureCache::GetWrappedThumbURL(thumb)); + item->SetArt("thumb", CTextureUtils::GetWrappedThumbURL(thumb)); item->SetIconImage("DefaultPicture.png"); item->SetLabel(g_localizeStrings.Get(20441)); @@ -857,7 +857,7 @@ void CGUIDialogVideoInfo::OnGetFanart() // set the fanart image if (flip && !result.IsEmpty()) - result = CTextureCache::GetWrappedImageURL(result, "", "flipped"); + result = CTextureUtils::GetWrappedImageURL(result, "", "flipped"); CVideoDatabase db; if (db.Open()) { diff --git a/xbmc/video/windows/GUIWindowVideoNav.cpp b/xbmc/video/windows/GUIWindowVideoNav.cpp index 577bce3..5d8d3eb 100644 --- a/xbmc/video/windows/GUIWindowVideoNav.cpp +++ b/xbmc/video/windows/GUIWindowVideoNav.cpp @@ -1407,7 +1407,7 @@ void CGUIWindowVideoNav::OnChooseFanart(const CFileItem &videoItem) if (result.Equals("fanart://None") || !CFile::Exists(result)) result.clear(); if (!result.IsEmpty() && flip) - result = CTextureCache::GetWrappedImageURL(result, "", "flipped"); + result = CTextureUtils::GetWrappedImageURL(result, "", "flipped"); // update the db CVideoDatabase db; -- 2.7.4