From 2c0347ff7a13896dcc64c1deb4447449790bad73 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 14 Jun 2021 08:54:55 +0200 Subject: Workaround shitty mpv pulseaudio issue where the video is frozen. Try reloading video on failure to load --- src/QuickMedia.cpp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index c6a1d2f..0513862 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -2451,7 +2451,6 @@ namespace QuickMedia { void Program::video_content_page(Page *parent_page, VideoPage *video_page, std::string video_title, bool download_if_streaming_fails, BodyItems &next_play_items, int play_index, int *parent_body_page, const std::string &parent_page_search) { PageType previous_page = pop_page_stack(); - sf::Clock time_watched_timer; bool video_loaded = false; std::string youtube_video_id_dummy; const bool is_youtube = youtube_url_extract_id(video_page->get_url(), youtube_video_id_dummy); @@ -2483,7 +2482,11 @@ namespace QuickMedia { sf::Clock seeking_start_timer; const float seeking_restart_timeout_sec = 4.0f; // TODO: Test if this timeout is good on slow hardware such as pinephone and slow internet - auto load_video_error_check = [this, &in_seeking, &video_url, &audio_url, &video_title, &video_tasks, &channel_url, previous_page, &go_to_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](std::string start_time = "", bool reuse_media_source = false) mutable { + const int num_load_tries_max = 3; + int load_try = 0; + std::string prev_start_time; + + auto load_video_error_check = [this, &prev_start_time, &in_seeking, &video_url, &audio_url, &video_title, &video_tasks, &channel_url, previous_page, &go_to_previous_page, &video_loaded, video_page, &video_event_callback, &on_window_create, &video_player_window, is_youtube, is_matrix, download_if_streaming_fails](std::string start_time = "", bool reuse_media_source = false) mutable { video_player.reset(); channel_url.clear(); video_loaded = false; @@ -2541,8 +2544,8 @@ namespace QuickMedia { const bool is_resume_go_back = !start_time.empty(); if(is_youtube && start_time.empty()) start_time = youtube_url_extract_timestamp(video_page->get_url()); + prev_start_time = start_time; - time_watched_timer.restart(); watched_videos.insert(video_page->get_url()); video_player = std::make_unique(is_audio_only, use_system_mpv_config, is_matrix && !is_youtube, video_event_callback, on_window_create, resources_root, largest_monitor_height); @@ -2602,7 +2605,7 @@ namespace QuickMedia { } }; - video_event_callback = [&time_watched_timer, &video_loaded, &in_seeking, &seeking_start_timer](const char *event_name) mutable { + video_event_callback = [&load_try, &video_loaded, &in_seeking, &seeking_start_timer](const char *event_name) mutable { if(strcmp(event_name, "seek") == 0) { in_seeking = true; seeking_start_timer.restart(); @@ -2615,16 +2618,17 @@ namespace QuickMedia { } else if(strcmp(event_name, "playback-restart") == 0) { //video_player->set_paused(false); in_seeking = false; + load_try = 0; } else if(strcmp(event_name, "file-loaded") == 0) { - time_watched_timer.restart(); video_loaded = true; in_seeking = false; + load_try = 0; } else if(strcmp(event_name, "video-reconfig") == 0 || strcmp(event_name, "audio-reconfig") == 0) { if(!video_loaded) { video_loaded = true; - time_watched_timer.restart(); } in_seeking = false; + load_try = 0; } //fprintf(stderr, "event name: %s\n", event_name); @@ -2802,6 +2806,7 @@ namespace QuickMedia { in_seeking = false; double resume_start_time = 0.0; if(video_player->get_time_in_file(&resume_start_time) == VideoPlayer::Error::OK) { + fprintf(stderr, "Video seems to be stuck after seeking, reloading...\n"); // TODO: Set the second argument to false if the video url is no longer valid (or always?) load_video_error_check(std::to_string((int)resume_start_time), true); } @@ -2902,10 +2907,16 @@ namespace QuickMedia { load_video_error_check(); } else if(update_err != VideoPlayer::Error::OK) { - show_notification("QuickMedia", "Failed to play the video (error code " + std::to_string((int)update_err) + ")", Urgency::CRITICAL); - current_page = previous_page; - go_to_previous_page = true; - break; + if(load_try < num_load_tries_max) { + fprintf(stderr, "Failed to play the media, retrying (try %d out of %d)\n", 1 + load_try, num_load_tries_max); + ++load_try; + load_video_error_check(prev_start_time); + } else { + show_notification("QuickMedia", "Failed to play the video (error code " + std::to_string((int)update_err) + ")", Urgency::CRITICAL); + current_page = previous_page; + go_to_previous_page = true; + break; + } } AsyncImageLoader::get_instance().update(); -- cgit v1.2.3