aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp175
1 files changed, 110 insertions, 65 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 7479299..4b78117 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -2362,8 +2362,6 @@ namespace QuickMedia {
if(video_page->autoplay_next_item() && play_index + 1 >= 0 && play_index + 1 < (int)next_play_items.size())
related_videos.insert(related_videos.end(), next_play_items.begin() + play_index + 1, next_play_items.end());
- std::string channel_url;
-
sf::WindowHandle video_player_window = None;
auto on_window_create = [this, &video_player_window](sf::WindowHandle _video_player_window) mutable {
video_player_window = _video_player_window;
@@ -2371,11 +2369,18 @@ namespace QuickMedia {
XSync(disp, False);
};
+ std::string channel_url;
+ AsyncTask<BodyItems> video_tasks;
std::function<void(const char*)> video_event_callback;
- auto load_video_error_check = [this, &related_videos, &channel_url, &video_title, &video_player, previous_page, &time_watched_timer, &video_loaded, video_page, &video_event_callback, &on_window_create, &video_player_window, is_youtube, is_matrix, download_if_streaming_fails](bool resume_video) mutable {
- TaskResult load_result = run_task_with_loading_screen([video_page]() {
- return video_page->load() == PluginResult::OK;
+ auto load_video_error_check = [this, &video_title, &video_tasks, &video_player, &channel_url, previous_page, &time_watched_timer, &video_loaded, video_page, &video_event_callback, &on_window_create, &video_player_window, is_youtube, is_matrix, download_if_streaming_fails](bool resume_video) mutable {
+ video_player.reset();
+ channel_url.clear();
+ video_loaded = false;
+ video_player_window = None;
+
+ TaskResult load_result = run_task_with_loading_screen([video_page, &channel_url]() {
+ return video_page->load(channel_url) == PluginResult::OK;
});
if(load_result == TaskResult::CANCEL) {
@@ -2471,33 +2476,26 @@ namespace QuickMedia {
}
time_watched_timer.restart();
- video_loaded = false;
- video_player_window = None;
- watched_videos.insert(video_url);
+ watched_videos.insert(video_page->get_url());
video_player = std::make_unique<VideoPlayer>(is_audio_only, use_system_mpv_config, resume_video, is_matrix && !is_youtube, video_event_callback, on_window_create, resources_root, largest_monitor_height);
VideoPlayer::Error err = video_player->load_video(video_url.c_str(), audio_url.c_str(), window.getSystemHandle(), plugin_name, video_title);
if(err != VideoPlayer::Error::OK) {
std::string err_msg = "Failed to play url: ";
- err_msg += video_url;
+ err_msg += video_page->get_url();
show_notification("QuickMedia", err_msg.c_str(), Urgency::CRITICAL);
current_page = previous_page;
} else {
if(video_page->autoplay_next_item())
return;
- channel_url.clear();
- TaskResult load_related_media_result = run_task_with_loading_screen([video_page, &related_videos, &channel_url]{
- // TODO: Do async
- related_videos = video_page->get_related_media(video_page->get_url(), channel_url);
- return true;
+ std::string url = video_page->get_url();
+ video_tasks = AsyncTask<BodyItems>([video_page, url]() {
+ BodyItems related_videos = video_page->get_related_media(url);
+ video_page->mark_watched();
+ return related_videos;
});
- if(load_related_media_result == TaskResult::CANCEL) {
- current_page = previous_page;
- return;
- }
-
// TODO: Make this also work for other video plugins
if(strcmp(plugin_name, "youtube") != 0 || resume_video)
return;
@@ -2622,62 +2620,89 @@ namespace QuickMedia {
} else if(pressed_keysym == XK_s && pressing_ctrl) {
video_page_download_video(video_page->get_url(), !is_matrix || is_youtube, video_player_window);
} else if(pressed_keysym == XK_r && pressing_ctrl) {
- if(!cursor_visible)
- window.setMouseCursorVisible(true);
- cursor_visible = true;
-
- int search_delay = 0;
- auto search_page = video_page->create_search_page(this, search_delay);
- auto comments_page = video_page->create_comments_page(this);
- auto related_videos_page = video_page->create_related_videos_page(this);
- auto channels_page = video_page->create_channels_page(this, channel_url);
- if(search_page || related_videos_page || channels_page) {
+ bool cancelled = false;
+ if(video_tasks.valid()) {
XUnmapWindow(disp, video_player_window);
XSync(disp, False);
- std::vector<Tab> tabs;
- if(search_page) {
- tabs.push_back(Tab{create_body(false, true), std::move(search_page), create_search_bar("Search...", search_delay)});
- }
- if(comments_page) {
- tabs.push_back(Tab{create_body(), std::move(comments_page), nullptr});
- }
- if(related_videos_page) {
- auto related_videos_body = create_body(false, true);
- related_videos_body->items = related_videos;
- tabs.push_back(Tab{std::move(related_videos_body), std::move(related_videos_page), create_search_bar("Search...", SEARCH_DELAY_FILTER)});
- }
- if(channels_page) {
- tabs.push_back(Tab{create_body(false, true), std::move(channels_page), create_search_bar("Search...", 350)});
- }
+ TaskResult task_result = run_task_with_loading_screen([&video_tasks, &related_videos]() {
+ while(true) {
+ if(program_is_dead_in_current_thread())
+ return false;
- bool page_changed = false;
- page_loop(tabs, 1, [this, &video_player, &page_changed](const std::vector<Tab> &new_tabs) {
- if(!page_changed && new_tabs.size() == 1 && new_tabs[0].page->get_type() == PageTypez::VIDEO) {
- window.setMouseCursorVisible(true);
- if(video_player) {
- video_player->quit_and_save_watch_later();
- while(true) {
- VideoPlayer::Error update_err = video_player->update();
- if(update_err != VideoPlayer::Error::OK || !window.isOpen() || current_page == PageType::EXIT)
- break;
- std::this_thread::sleep_for(std::chrono::milliseconds(20));
- }
- video_player.reset();
+ if(video_tasks.ready()) {
+ related_videos = video_tasks.get();
+ return true;
}
- page_changed = true;
+ std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
});
- if(!window.isOpen() || current_page == PageType::EXIT)
- return;
+ XMapWindow(disp, video_player_window);
+ XSync(disp, False);
- if(page_changed) {
- current_page = PageType::VIDEO_CONTENT;
- load_video_error_check(true);
- } else {
- XMapWindow(disp, video_player_window);
+ if(task_result == TaskResult::CANCEL || task_result == TaskResult::FALSE)
+ cancelled = true;
+ }
+
+ if(!cancelled) {
+ if(!cursor_visible)
+ window.setMouseCursorVisible(true);
+ cursor_visible = true;
+
+ int search_delay = 0;
+ auto search_page = video_page->create_search_page(this, search_delay);
+ auto comments_page = video_page->create_comments_page(this);
+ auto related_videos_page = video_page->create_related_videos_page(this);
+ auto channels_page = video_page->create_channels_page(this, channel_url);
+ if(search_page || related_videos_page || channels_page) {
+ XUnmapWindow(disp, video_player_window);
XSync(disp, False);
+
+ std::vector<Tab> tabs;
+ if(search_page) {
+ tabs.push_back(Tab{create_body(false, true), std::move(search_page), create_search_bar("Search...", search_delay)});
+ }
+ if(comments_page) {
+ tabs.push_back(Tab{create_body(), std::move(comments_page), nullptr});
+ }
+ if(related_videos_page) {
+ auto related_videos_body = create_body(false, true);
+ related_videos_body->items = related_videos;
+ tabs.push_back(Tab{std::move(related_videos_body), std::move(related_videos_page), create_search_bar("Search...", SEARCH_DELAY_FILTER)});
+ }
+ if(channels_page) {
+ tabs.push_back(Tab{create_body(false, true), std::move(channels_page), create_search_bar("Search...", 350)});
+ }
+
+ bool page_changed = false;
+ page_loop(tabs, 1, [this, &video_player, &page_changed](const std::vector<Tab> &new_tabs) {
+ if(!page_changed && new_tabs.size() == 1 && new_tabs[0].page->get_type() == PageTypez::VIDEO) {
+ window.setMouseCursorVisible(true);
+ if(video_player) {
+ video_player->quit_and_save_watch_later();
+ while(true) {
+ VideoPlayer::Error update_err = video_player->update();
+ if(update_err != VideoPlayer::Error::OK || !window.isOpen() || current_page == PageType::EXIT)
+ break;
+ std::this_thread::sleep_for(std::chrono::milliseconds(20));
+ }
+ video_player.reset();
+ }
+ page_changed = true;
+ }
+ });
+
+ if(!window.isOpen() || current_page == PageType::EXIT)
+ return;
+
+ if(page_changed) {
+ current_page = PageType::VIDEO_CONTENT;
+ load_video_error_check(true);
+ } else {
+ XMapWindow(disp, video_player_window);
+ XSync(disp, False);
+ }
}
}
} else if(pressed_keysym == XK_c && pressing_ctrl) {
@@ -2702,6 +2727,26 @@ namespace QuickMedia {
std::string new_video_url;
std::string new_video_title;
+ if(video_tasks.valid()) {
+ TaskResult task_result = run_task_with_loading_screen([&video_tasks, &related_videos]() {
+ while(true) {
+ if(program_is_dead_in_current_thread())
+ return false;
+
+ if(video_tasks.ready()) {
+ related_videos = video_tasks.get();
+ return true;
+ }
+ std::this_thread::sleep_for(std::chrono::milliseconds(50));
+ }
+ });
+
+ if(task_result == TaskResult::CANCEL || task_result == TaskResult::FALSE) {
+ current_page = previous_page;
+ return;
+ }
+ }
+
// Find video that hasn't been played before in this video session
auto find_next_video = [this, &related_videos, &video_page, &new_video_url, &new_video_title]() {
for(auto it = related_videos.begin(), end = related_videos.end(); it != end; ++it) {