From 6443ce7df2d690c5a03dc68cb6866f5d7d4e3fba Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 11 Jun 2021 06:33:35 +0200 Subject: Make get_related_videos async, readd mark-watched --- src/QuickMedia.cpp | 175 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 110 insertions(+), 65 deletions(-) (limited to 'src/QuickMedia.cpp') 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 video_tasks; std::function 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(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([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 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 &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 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 &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) { -- cgit v1.2.3