diff options
author | tamland <thomas.amland@gmail.com> | 2017-06-06 18:15:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-06 18:15:51 +0200 |
commit | 34322d847de7d47fdcc951e094c824703d05efe3 (patch) | |
tree | 436f20f3153b94b769deac82e46f71d4abdd6c7c | |
parent | b2a2bfc9360195b3d61f91f7f1406d61b0a188ba (diff) | |
parent | 51685022c74614e0acba69075368a22b5b71b045 (diff) |
Merge pull request #12244 from tamland/addons_art
[addons] add support for banner and clearlogo
-rw-r--r-- | xbmc/addons/Addon.h | 12 | ||||
-rw-r--r-- | xbmc/addons/AddonBuilder.h | 3 | ||||
-rw-r--r-- | xbmc/addons/AddonDatabase.cpp | 11 | ||||
-rw-r--r-- | xbmc/addons/AddonManager.cpp | 24 | ||||
-rw-r--r-- | xbmc/addons/IAddon.h | 2 | ||||
-rw-r--r-- | xbmc/addons/Repository.cpp | 9 | ||||
-rw-r--r-- | xbmc/filesystem/AddonsDirectory.cpp | 3 |
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()); |