Skip to content

Commit

Permalink
Merge pull request xbmc#12244 from tamland/addons_art
Browse files Browse the repository at this point in the history
[addons] add support for banner and clearlogo
  • Loading branch information
tamland authored Jun 6, 2017
2 parents b2a2bfc + 5168502 commit 34322d8
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 18 deletions.
12 changes: 9 additions & 3 deletions xbmc/addons/Addon.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ class AddonProps
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;
Expand Down Expand Up @@ -106,8 +106,8 @@ class CAddon : public IAddon
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; }
Expand All @@ -119,6 +119,12 @@ class CAddon : public IAddon
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
Expand Down
3 changes: 2 additions & 1 deletion xbmc/addons/AddonBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ class CAddonBuilder
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); }
Expand Down
11 changes: 9 additions & 2 deletions xbmc/addons/AddonDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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());
Expand Down
24 changes: 17 additions & 7 deletions xbmc/addons/AddonManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "AddonManager.h"

#include <algorithm>
#include <array>
#include <iterator>
#include <memory>
#include <utility>
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions xbmc/addons/IAddon.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand All @@ -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;
Expand Down
9 changes: 6 additions & 3 deletions xbmc/addons/Repository.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
3 changes: 1 addition & 2 deletions xbmc/filesystem/AddonsDirectory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down

0 comments on commit 34322d8

Please sign in to comment.