aboutsummaryrefslogtreecommitdiff
path: root/src/VideoPlayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VideoPlayer.cpp')
-rw-r--r--src/VideoPlayer.cpp69
1 files changed, 30 insertions, 39 deletions
diff --git a/src/VideoPlayer.cpp b/src/VideoPlayer.cpp
index 76fa82a..4be0671 100644
--- a/src/VideoPlayer.cpp
+++ b/src/VideoPlayer.cpp
@@ -90,27 +90,20 @@ namespace QuickMedia {
}
}
- VideoPlayer::VideoPlayer(bool no_video, bool use_system_mpv_config, bool keep_open, EventCallbackFunc _event_callback, VideoPlayerWindowCreateCallback _window_create_callback, const std::string &resource_root, int monitor_height, std::string plugin_name) :
+ VideoPlayer::VideoPlayer(StartupArgs startup_args, EventCallbackFunc _event_callback, VideoPlayerWindowCreateCallback _window_create_callback) :
exit_status(0),
- plugin_name(std::move(plugin_name)),
- no_video(no_video),
- use_system_mpv_config(use_system_mpv_config),
- keep_open(keep_open),
- use_youtube_dl(true),
+ startup_args(std::move(startup_args)),
video_process_id(-1),
connect_tries(0),
find_window_tries(0),
- monitor_height(monitor_height),
event_callback(_event_callback),
window_create_callback(_window_create_callback),
window_handle(0),
- parent_window(0),
display(nullptr),
request_id_counter(1),
expected_request_id(0),
request_response_data(Json::nullValue),
- response_data_status(ResponseDataStatus::NONE),
- resource_root(resource_root)
+ response_data_status(ResponseDataStatus::NONE)
{
tmp_chapters_filepath[0] = '\0';
display = XOpenDisplay(NULL);
@@ -118,7 +111,7 @@ namespace QuickMedia {
show_notification("QuickMedia", "Failed to open display to X11 server", Urgency::CRITICAL);
abort();
}
- fprintf(stderr, "Video max height: %d\n", monitor_height);
+ fprintf(stderr, "Video max height: %d\n", startup_args.monitor_height);
}
VideoPlayer::~VideoPlayer() {
@@ -147,9 +140,7 @@ namespace QuickMedia {
return path;
}
- VideoPlayer::Error VideoPlayer::launch_video_process(const char *path, const char *audio_path, mgl::WindowHandle _parent_window, const std::string &title, const std::string &start_time) {
- parent_window = _parent_window;
-
+ VideoPlayer::Error VideoPlayer::launch_video_process() {
int fd[2];
if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0) {
perror("Failed to create socketpair for video player");
@@ -162,13 +153,13 @@ namespace QuickMedia {
fcntl(ipc_socket, F_SETFL, flags | O_NONBLOCK);
const std::string ipc_fd = std::to_string(fd[1]);
- std::string input_conf = "--input-conf=" + resource_root + "input.conf";
+ std::string input_conf = "--input-conf=" + startup_args.resource_root + "input.conf";
std::string cache_dir = "--cache-dir=" + std::move(get_cache_dir().join("media").data);
std::string wid_arg = "--wid=";
- wid_arg += std::to_string(parent_window);
+ wid_arg += std::to_string(startup_args.parent_window);
- std::string video_player_filepath = resource_root + "/video_player/sibs-build/linux_x86_64/"
+ std::string video_player_filepath = startup_args.resource_root + "/video_player/sibs-build/linux_x86_64/"
#ifdef NDEBUG
"release/"
#else
@@ -203,27 +194,29 @@ namespace QuickMedia {
"--osc=yes",
//"--force_all_formats=no",
cache_dir.c_str(),
- input_conf.c_str(),
wid_arg.c_str(),
"--ipc-fd",
ipc_fd.c_str()
});
+
+ if(!startup_args.use_system_input_config)
+ args.push_back(input_conf.c_str());
if(is_running_wayland()) {
args.push_back("--gpu-context=x11egl");
fprintf(stderr, "Wayland detected. Launching mpv in x11egl mode\n");
}
- if(keep_open)
+ if(startup_args.keep_open)
args.push_back("--keep-open=yes");
std::string ytdl_format;
- if(no_video)
+ if(startup_args.no_video)
ytdl_format = "--ytdl-format=bestaudio/best";
else
- ytdl_format = "--ytdl-format=bestvideo[height<=?" + std::to_string(monitor_height) + "]+bestaudio/best";
+ ytdl_format = "--ytdl-format=bestvideo[height<=?" + std::to_string(startup_args.monitor_height) + "]+bestaudio/best";
- if(!use_youtube_dl)
+ if(!startup_args.use_youtube_dl)
args.push_back("--ytdl=no");
else
args.push_back(ytdl_format.c_str());
@@ -233,7 +226,7 @@ namespace QuickMedia {
if(get_file_type(mpris_path) == FileType::REGULAR)
mpris_arg = "--scripts=" + mpris_path.data;
- if(!use_system_mpv_config) {
+ if(!startup_args.use_system_mpv_config) {
args.insert(args.end(), {
"--config=no",
"--profile=gpu-hq",
@@ -246,12 +239,12 @@ namespace QuickMedia {
}
std::string force_media_title_arg;
- if(!title.empty()) {
- force_media_title_arg = "--force-media-title=" + title;
+ if(!startup_args.title.empty()) {
+ force_media_title_arg = "--force-media-title=" + startup_args.title;
args.push_back(force_media_title_arg.c_str());
}
- if(no_video)
+ if(startup_args.no_video)
args.push_back("--video=no");
std::string chapters_file_arg;
@@ -260,18 +253,18 @@ namespace QuickMedia {
args.push_back(chapters_file_arg.c_str());
}
- if(audio_path && audio_path[0] != '\0') {
+ if(!startup_args.audio_path.empty()) {
args.push_back("--audio-file");
- args.push_back(audio_path);
+ args.push_back(startup_args.audio_path.c_str());
}
std::string start_time_arg;
- if(!start_time.empty()) {
- start_time_arg = "--start=" + start_time;
+ if(!startup_args.start_time.empty()) {
+ start_time_arg = "--start=" + startup_args.start_time;
args.push_back(start_time_arg.c_str());
}
- args.insert(args.end(), { "--", path, nullptr });
+ args.insert(args.end(), { "--", startup_args.path.c_str(), nullptr });
if(exec_program_async(args.data(), &video_process_id) != 0) {
close(fd[1]);
@@ -284,18 +277,16 @@ namespace QuickMedia {
return Error::OK;
}
- VideoPlayer::Error VideoPlayer::load_video(const char *path, const char *audio_path, mgl::WindowHandle _parent_window, bool use_youtube_dl, const std::string &title, const std::string &start_time, const std::vector<MediaChapter> &chapters) {
+ VideoPlayer::Error VideoPlayer::load_video() {
// This check is to make sure we dont change window that the video belongs to. This is not a usecase we will have so
// no need to support it for now at least.
- assert(parent_window == 0 || parent_window == _parent_window);
- assert(path);
- this->use_youtube_dl = use_youtube_dl;
- if(!create_tmp_file_with_chapters_data(tmp_chapters_filepath, chapters))
+ assert(!startup_args.path.empty());
+ if(!create_tmp_file_with_chapters_data(tmp_chapters_filepath, startup_args.chapters))
fprintf(stderr, "Warning: failed to create chapters file. Chapters will not be displayed\n");
- fprintf(stderr, "Playing video: %s, audio: %s\n", path ? path : "", audio_path ? audio_path : "");
+ fprintf(stderr, "Playing video: %s, audio: %s\n", startup_args.path.c_str(), startup_args.audio_path.c_str());
if(video_process_id == -1)
- return launch_video_process(path, audio_path, _parent_window, title, start_time);
+ return launch_video_process();
fprintf(stderr, "TODO: Implement VideoPlayer::load_video without restarting the video player\n");
abort();
@@ -341,7 +332,7 @@ namespace QuickMedia {
if(window_handle == 0 && retry_timer.get_elapsed_time_seconds() >= RETRY_TIME_SEC) {
retry_timer.restart();
- std::vector<Window> child_windows = get_child_window(display, parent_window);
+ std::vector<Window> child_windows = get_child_window(display, startup_args.parent_window);
size_t num_children = child_windows.size();
if(num_children == 0) {
++find_window_tries;