aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortamland <thomas.amland@gmail.com>2017-06-06 18:15:51 +0200
committerGitHub <noreply@github.com>2017-06-06 18:15:51 +0200
commit34322d847de7d47fdcc951e094c824703d05efe3 (patch)
tree436f20f3153b94b769deac82e46f71d4abdd6c7c
parentb2a2bfc9360195b3d61f91f7f1406d61b0a188ba (diff)
parent51685022c74614e0acba69075368a22b5b71b045 (diff)
Merge pull request #12244 from tamland/addons_art
[addons] add support for banner and clearlogo
-rw-r--r--xbmc/addons/Addon.h12
-rw-r--r--xbmc/addons/AddonBuilder.h3
-rw-r--r--xbmc/addons/AddonDatabase.cpp11
-rw-r--r--xbmc/addons/AddonManager.cpp24
-rw-r--r--xbmc/addons/IAddon.h2
-rw-r--r--xbmc/addons/Repository.cpp9
-rw-r--r--xbmc/filesystem/AddonsDirectory.cpp3
7 files changed, 46 insertions, 18 deletions
diff --git a/xbmc/addons/Addon.h b/xbmc/addons/Addon.h
index ba41b49621..443a971ad3 100644
--- a/xbmc/addons/Addon.h
+++ b/xbmc/addons/Addon.h
@@ -69,9 +69,9 @@ public:
std::string author;
std::string source;
std::string path;
- std::string icon;
std::string changelog;
- std::string fanart;
+ std::string icon;
+ std::map<std::string, std::string> art;
std::vector<std::string> screenshots;
std::string disclaimer;
ADDONDEPS dependencies;
@@ -106,8 +106,8 @@ public:
std::string LibPath() const override;
std::string Author() const override { return m_props.author; }
std::string ChangeLog() const override { return m_props.changelog; }
- std::string FanArt() const override { return m_props.fanart; }
std::string Icon() const override { return m_props.icon; };
+ ArtMap Art() const override { return m_props.art; };
std::vector<std::string> Screenshots() const override { return m_props.screenshots; };
std::string Disclaimer() const override { return m_props.disclaimer; }
std::string Broken() const override { return m_props.broken; }
@@ -119,6 +119,12 @@ public:
const InfoMap& ExtraInfo() const override { return m_props.extrainfo; }
const ADDONDEPS& GetDeps() const override { return m_props.dependencies; }
+ std::string FanArt() const override
+ {
+ auto it = m_props.art.find("fanart");
+ return it != m_props.art.end() ? it->second : "";
+ }
+
/*! \brief Check whether the this addon can be configured or not
\return true if the addon has settings, false otherwise
\sa LoadSettings, LoadUserSettings, SaveSettings, HasUserSettings, GetSetting, UpdateSetting
diff --git a/xbmc/addons/AddonBuilder.h b/xbmc/addons/AddonBuilder.h
index 29663642d6..7667b33bc5 100644
--- a/xbmc/addons/AddonBuilder.h
+++ b/xbmc/addons/AddonBuilder.h
@@ -39,7 +39,8 @@ public:
void SetAuthor(std::string author) { m_props.author = std::move(author); }
void SetSource(std::string source) { m_props.source = std::move(source); }
void SetIcon(std::string icon) { m_props.icon = std::move(icon); }
- void SetFanart(std::string fanart) { m_props.fanart = std::move(fanart); }
+ void SetArt(std::string type, std::string value) { m_props.art[type] = value; }
+ void SetArt(std::map<std::string, std::string> art) { m_props.art = std::move(art); }
void SetScreenshots(std::vector<std::string> screenshots) { m_props.screenshots = std::move(screenshots); }
void SetChangelog(std::string changelog) { m_props.changelog = std::move(changelog); }
void SetBroken(std::string broken) { m_props.broken = std::move(broken); }
diff --git a/xbmc/addons/AddonDatabase.cpp b/xbmc/addons/AddonDatabase.cpp
index cbabf9dc09..7c94d9fd00 100644
--- a/xbmc/addons/AddonDatabase.cpp
+++ b/xbmc/addons/AddonDatabase.cpp
@@ -47,9 +47,12 @@ static std::string SerializeMetadata(const IAddon& addon)
variant["size"] = addon.PackageSize();
variant["path"] = addon.Path();
- variant["fanart"] = addon.FanArt();
variant["icon"] = addon.Icon();
+ variant["art"] = CVariant(CVariant::VariantTypeObject);
+ for (const auto& item : addon.Art())
+ variant["art"][item.first] = item.second;
+
variant["screenshots"] = CVariant(CVariant::VariantTypeArray);
for (const auto& item : addon.Screenshots())
variant["screenshots"].push_back(item);
@@ -93,9 +96,13 @@ static void DeserializeMetadata(const std::string& document, CAddonBuilder& buil
builder.SetPackageSize(variant["size"].asUnsignedInteger());
builder.SetPath(variant["path"].asString());
- builder.SetFanart(variant["fanart"].asString());
builder.SetIcon(variant["icon"].asString());
+ std::map<std::string, std::string> art;
+ for (auto it = variant["art"].begin_map(); it != variant["art"].end_map(); ++it)
+ art.emplace(it->first, it->second.asString());
+ builder.SetArt(std::move(art));
+
std::vector<std::string> screenshots;
for (auto it = variant["screenshots"].begin_array(); it != variant["screenshots"].end_array(); ++it)
screenshots.push_back(it->asString());
diff --git a/xbmc/addons/AddonManager.cpp b/xbmc/addons/AddonManager.cpp
index 8da977831b..9774ddfd73 100644
--- a/xbmc/addons/AddonManager.cpp
+++ b/xbmc/addons/AddonManager.cpp
@@ -21,6 +21,7 @@
#include "AddonManager.h"
#include <algorithm>
+#include <array>
#include <iterator>
#include <memory>
#include <utility>
@@ -174,7 +175,7 @@ void CAddonMgr::FillCpluffMetadata(const cp_plugin_info_t* plugin, CAddonBuilder
if (!icon.empty())
builder.SetIcon(URIUtils::AddFileToFolder(plugin->plugin_path, icon));
if (!fanart.empty())
- builder.SetFanart(URIUtils::AddFileToFolder(plugin->plugin_path, fanart));
+ builder.SetArt("fanart", URIUtils::AddFileToFolder(plugin->plugin_path, fanart));
}
if (metadata)
@@ -202,14 +203,23 @@ void CAddonMgr::FillCpluffMetadata(const cp_plugin_info_t* plugin, CAddonBuilder
if (assets)
{
builder.SetIcon("");
- builder.SetFanart("");
+ builder.SetArt("fanart", "");
std::string icon = CAddonMgr::GetInstance().GetExtValue(assets, "icon");
- std::string fanart = CAddonMgr::GetInstance().GetExtValue(assets, "fanart");
-
if (!icon.empty())
- builder.SetIcon(URIUtils::AddFileToFolder(plugin->plugin_path, icon));
- if (!fanart.empty())
- builder.SetFanart(URIUtils::AddFileToFolder(plugin->plugin_path, fanart));
+ icon = URIUtils::AddFileToFolder(plugin->plugin_path, icon);
+ builder.SetIcon(icon);
+
+ std::map<std::string, std::string> art;
+ std::array<std::string, 3> artTypes{"fanart", "banner", "clearlogo"};
+ for (auto type : artTypes)
+ {
+ auto value = CAddonMgr::GetInstance().GetExtValue(assets, type.c_str());
+ if (!value.empty())
+ {
+ value = URIUtils::AddFileToFolder(plugin->plugin_path, value);
+ builder.SetArt(type, value);
+ }
+ }
std::vector<std::string> screenshots;
ELEMENTS elements;
diff --git a/xbmc/addons/IAddon.h b/xbmc/addons/IAddon.h
index 1bb53e3ed8..e082332ad7 100644
--- a/xbmc/addons/IAddon.h
+++ b/xbmc/addons/IAddon.h
@@ -49,6 +49,7 @@ namespace ADDON
class AddonVersion;
typedef std::map<std::string, std::pair<const AddonVersion, bool> > ADDONDEPS;
typedef std::map<std::string, std::string> InfoMap;
+ typedef std::map<std::string, std::string> ArtMap;
class AddonProps;
class IAddon : public std::enable_shared_from_this<IAddon>
@@ -70,6 +71,7 @@ namespace ADDON
virtual std::string LibPath() const =0;
virtual std::string ChangeLog() const =0;
virtual std::string FanArt() const =0;
+ virtual ArtMap Art() const =0;
virtual std::vector<std::string> Screenshots() const =0;
virtual std::string Author() const =0;
virtual std::string Icon() const =0;
diff --git a/xbmc/addons/Repository.cpp b/xbmc/addons/Repository.cpp
index ce1e8ab7ed..83219c9b45 100644
--- a/xbmc/addons/Repository.cpp
+++ b/xbmc/addons/Repository.cpp
@@ -243,14 +243,17 @@ bool CRepositoryUpdateJob::DoWork()
AddonPtr oldAddon;
if (database.GetAddon(addon->ID(), oldAddon) && addon->Version() > oldAddon->Version())
{
- if (!oldAddon->Icon().empty() || !oldAddon->FanArt().empty() || !oldAddon->Screenshots().empty())
+ if (!oldAddon->Icon().empty() || !oldAddon->Art().empty() || !oldAddon->Screenshots().empty())
CLog::Log(LOGDEBUG, "CRepository: invalidating cached art for '%s'", addon->ID().c_str());
+
if (!oldAddon->Icon().empty())
textureDB.InvalidateCachedTexture(oldAddon->Icon());
- if (!oldAddon->FanArt().empty())
- textureDB.InvalidateCachedTexture(oldAddon->Icon());
+
for (const auto& path : oldAddon->Screenshots())
textureDB.InvalidateCachedTexture(path);
+
+ for (const auto& art : oldAddon->Art())
+ textureDB.InvalidateCachedTexture(art.second);
}
}
textureDB.CommitMultipleExecute();
diff --git a/xbmc/filesystem/AddonsDirectory.cpp b/xbmc/filesystem/AddonsDirectory.cpp
index 8e32bfdaf5..c0f7c0b3f9 100644
--- a/xbmc/filesystem/AddonsDirectory.cpp
+++ b/xbmc/filesystem/AddonsDirectory.cpp
@@ -833,10 +833,9 @@ CFileItemPtr CAddonsDirectory::FileItemFromAddon(const AddonPtr &addon,
if (CURL(path).GetHostName() == "search")
strLabel = StringUtils::Format("%s - %s", CAddonInfo::TranslateType(addon->Type(), true).c_str(), addon->Name().c_str());
item->SetLabel(strLabel);
+ item->SetArt(addon->Art());
item->SetArt("thumb", addon->Icon());
item->SetIconImage("DefaultAddon.png");
- if (URIUtils::IsInternetStream(addon->FanArt()) || CFile::Exists(addon->FanArt()))
- item->SetArt("fanart", addon->FanArt());
//! @todo fix hacks that depends on these
item->SetProperty("Addon.ID", addon->ID());