Merge pull request #36 from cfajardo/add-application-image
Add application image
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
©2018 Valve Corporation. Steam and the Steam logo are trademarks and/or
|
||||||
|
registered trademarks of Valve Corporation in the U.S. and/or other countries. All
|
||||||
|
rights reserved.
|
||||||
@@ -13,7 +13,8 @@
|
|||||||
"name":"Steam BigPicture",
|
"name":"Steam BigPicture",
|
||||||
|
|
||||||
"output":"steam.txt",
|
"output":"steam.txt",
|
||||||
"detached":["setsid steam steam://open/bigpicture"]
|
"detached":["setsid steam steam://open/bigpicture"],
|
||||||
|
"image-path":"./assets/steam.png"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
"name":"Steam BigPicture",
|
"name":"Steam BigPicture",
|
||||||
|
|
||||||
"output":"steam.txt",
|
"output":"steam.txt",
|
||||||
"detached":["steam steam://open/bigpicture"]
|
"detached":["steam steam://open/bigpicture"],
|
||||||
|
"image-path":"./assets/steam.png"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
@@ -166,6 +166,21 @@
|
|||||||
If not set, Sunshine will default to the parent directory of the command
|
If not set, Sunshine will default to the parent directory of the command
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Image path -->
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="appImagePath" class="form-label">Image</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control monospace"
|
||||||
|
id="appImagePath"
|
||||||
|
aria-describedby="appImagePathHelp"
|
||||||
|
v-model="editForm['image-path']"
|
||||||
|
/>
|
||||||
|
<div id="appImagePathHelp" class="form-text">
|
||||||
|
Application icon/picture/image path that will be sent to client. Image must be a PNG file.
|
||||||
|
If not set, Sunshine will send default box image.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<!--buttons-->
|
<!--buttons-->
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<button @click="showEditForm = false" class="btn btn-secondary m-2">
|
<button @click="showEditForm = false" class="btn btn-secondary m-2">
|
||||||
@@ -208,6 +223,7 @@
|
|||||||
index: -1,
|
index: -1,
|
||||||
"prep-cmd": [],
|
"prep-cmd": [],
|
||||||
detached: [],
|
detached: [],
|
||||||
|
"image-path": ""
|
||||||
};
|
};
|
||||||
this.editForm.index = -1;
|
this.editForm.index = -1;
|
||||||
this.showEditForm = true;
|
this.showEditForm = true;
|
||||||
@@ -238,6 +254,7 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
save() {
|
save() {
|
||||||
|
this.editForm["image-path"] = this.editForm["image-path"].toString().replace(/"/g, '');
|
||||||
fetch("/api/apps", {
|
fetch("/api/apps", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify(this.editForm),
|
body: JSON.stringify(this.editForm),
|
||||||
|
|||||||
+8
-2
@@ -761,11 +761,17 @@ void cancel(resp_https_t response, req_https_t request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void appasset(resp_https_t response, req_https_t request) {
|
void appasset(resp_https_t response, req_https_t request) {
|
||||||
print_req<SimpleWeb::HTTPS>(request);
|
print_req<SimpleWeb::HTTPS>(request);
|
||||||
|
|
||||||
std::ifstream in(SUNSHINE_ASSETS_DIR "/box.png");
|
auto args = request->parse_query_string();
|
||||||
response->write(SimpleWeb::StatusCode::success_ok, in);
|
auto app_image = proc::proc.get_app_image(util::from_view(args.at("appid")));
|
||||||
|
|
||||||
|
std::ifstream in(app_image, std::ios::binary);
|
||||||
|
SimpleWeb::CaseInsensitiveMultimap headers;
|
||||||
|
headers.emplace("Content-Type", "image/png");
|
||||||
|
response->write(SimpleWeb::StatusCode::success_ok, in, headers);
|
||||||
response->close_connection_after_response = true;
|
response->close_connection_after_response = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,12 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
#include <boost/property_tree/json_parser.hpp>
|
#include <boost/property_tree/json_parser.hpp>
|
||||||
#include <boost/property_tree/ptree.hpp>
|
#include <boost/property_tree/ptree.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
#include <boost/algorithm/string.hpp>
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
@@ -189,6 +191,33 @@ std::vector<ctx_t> &proc_t::get_apps() {
|
|||||||
return _apps;
|
return _apps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets application image from application list.
|
||||||
|
/// Returns default image if image configuration is not set.
|
||||||
|
/// returns http content-type header compatible image type
|
||||||
|
std::string proc_t::get_app_image(int app_id) {
|
||||||
|
auto app_index = app_id -1;
|
||||||
|
if(app_index < 0 || app_index >= _apps.size()) {
|
||||||
|
BOOST_LOG(error) << "Couldn't find app with ID ["sv << app_id << ']';
|
||||||
|
return SUNSHINE_ASSETS_DIR "/box.png";
|
||||||
|
}
|
||||||
|
|
||||||
|
auto app_image_path = _apps[app_index].image_path;
|
||||||
|
if (app_image_path.empty()) {
|
||||||
|
return SUNSHINE_ASSETS_DIR "/box.png";
|
||||||
|
}
|
||||||
|
|
||||||
|
auto image_extension = std::filesystem::path(app_image_path).extension().string();
|
||||||
|
boost::to_lower(image_extension);
|
||||||
|
|
||||||
|
std::error_code code;
|
||||||
|
if (!std::filesystem::exists(app_image_path, code) || image_extension != ".png") {
|
||||||
|
return SUNSHINE_ASSETS_DIR "/box.png";
|
||||||
|
}
|
||||||
|
|
||||||
|
// return only "content-type" http header compatible image type.
|
||||||
|
return app_image_path;
|
||||||
|
}
|
||||||
|
|
||||||
proc_t::~proc_t() {
|
proc_t::~proc_t() {
|
||||||
terminate();
|
terminate();
|
||||||
}
|
}
|
||||||
@@ -279,6 +308,7 @@ std::optional<proc::proc_t> parse(const std::string &file_name) {
|
|||||||
auto output = app_node.get_optional<std::string>("output"s);
|
auto output = app_node.get_optional<std::string>("output"s);
|
||||||
auto name = parse_env_val(this_env, app_node.get<std::string>("name"s));
|
auto name = parse_env_val(this_env, app_node.get<std::string>("name"s));
|
||||||
auto cmd = app_node.get_optional<std::string>("cmd"s);
|
auto cmd = app_node.get_optional<std::string>("cmd"s);
|
||||||
|
auto image_path = app_node.get_optional<std::string>("image-path"s);
|
||||||
auto working_dir = app_node.get_optional<std::string>("working-dir"s);
|
auto working_dir = app_node.get_optional<std::string>("working-dir"s);
|
||||||
|
|
||||||
std::vector<proc::cmd_t> prep_cmds;
|
std::vector<proc::cmd_t> prep_cmds;
|
||||||
@@ -321,6 +351,10 @@ std::optional<proc::proc_t> parse(const std::string &file_name) {
|
|||||||
ctx.working_dir = parse_env_val(this_env, *working_dir);
|
ctx.working_dir = parse_env_val(this_env, *working_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (image_path) {
|
||||||
|
ctx.image_path = parse_env_val(this_env, *image_path);
|
||||||
|
}
|
||||||
|
|
||||||
ctx.name = std::move(name);
|
ctx.name = std::move(name);
|
||||||
ctx.prep_cmds = std::move(prep_cmds);
|
ctx.prep_cmds = std::move(prep_cmds);
|
||||||
ctx.detached = std::move(detached);
|
ctx.detached = std::move(detached);
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ struct ctx_t {
|
|||||||
std::string cmd;
|
std::string cmd;
|
||||||
std::string working_dir;
|
std::string working_dir;
|
||||||
std::string output;
|
std::string output;
|
||||||
|
std::string image_path;
|
||||||
};
|
};
|
||||||
|
|
||||||
class proc_t {
|
class proc_t {
|
||||||
@@ -78,6 +79,7 @@ public:
|
|||||||
|
|
||||||
const std::vector<ctx_t> &get_apps() const;
|
const std::vector<ctx_t> &get_apps() const;
|
||||||
std::vector<ctx_t> &get_apps();
|
std::vector<ctx_t> &get_apps();
|
||||||
|
std::string get_app_image(int app_id);
|
||||||
|
|
||||||
void terminate();
|
void terminate();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user