aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/QuickMedia.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 7bb537b..74e5194 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -868,6 +868,12 @@ namespace QuickMedia {
search_bar->onTextUpdateCallback = nullptr;
search_bar->onTextSubmitCallback = nullptr;
+ int fallback_count = 0;
+ const int max_fallbacks = 3;
+ /* itags from: https://gist.github.com/sidneys/7095afe4da4ae58694d128b1034e01e2 */
+ /* 1080p, 720p, 360p */
+ const char *fallback_itags[max_fallbacks] = { "37", "22", "18" };
+
Page previous_page = pop_page_stack();
std::unique_ptr<VideoPlayer> video_player;
@@ -922,7 +928,7 @@ namespace QuickMedia {
};
bool has_video_started = true;
- auto video_event_callback = [this, &video_player, &load_video_error_check, previous_page, &has_video_started](const char *event_name) mutable {
+ auto video_event_callback = [this, &video_player, &load_video_error_check, previous_page, &has_video_started, &fallback_count](const char *event_name) mutable {
bool end_of_file = false;
if(strcmp(event_name, "pause") == 0) {
double time_remaining = 9999.0;
@@ -932,6 +938,7 @@ namespace QuickMedia {
video_player->set_paused(false);
} else if(strcmp(event_name, "start-file") == 0) {
has_video_started = true;
+ fallback_count = 0;
}
if(end_of_file && has_video_started) {
@@ -1001,10 +1008,11 @@ namespace QuickMedia {
VideoPlayer::Error update_err = video_player->update();
if(update_err == VideoPlayer::Error::FAIL_TO_CONNECT_TIMEOUT) {
- show_notification("Video player", "Failed to connect to mpv ipc after 5 seconds", Urgency::CRITICAL);
+ show_notification("Video player", "Failed to connect to mpv ipc after 10 seconds", Urgency::CRITICAL);
current_page = previous_page;
break;
- } else if(update_err == VideoPlayer::Error::EXITED) {
+ } else if(update_err == VideoPlayer::Error::EXITED && fallback_count < max_fallbacks) {
+ ++fallback_count;
std::string youtube_video_id;
if(youtube_url_extract_id(content_url, youtube_video_id)) {
fprintf(stderr, "Failed to play youtube video (maybe because of age verification?), trying with invidio.us...\n");
@@ -1016,7 +1024,7 @@ namespace QuickMedia {
video_player.reset();
video_player = std::make_unique<VideoPlayer>(current_plugin->use_tor, use_system_mpv_config, video_event_callback, on_window_create);
- std::string new_video_url = "https://www.invidio.us/latest_version?id=" + youtube_video_id + "&itag=22";
+ std::string new_video_url = "https://www.invidio.us/latest_version?id=" + youtube_video_id + "&itag=" + fallback_itags[fallback_count - 1];
VideoPlayer::Error err = video_player->load_video(new_video_url.c_str(), window.getSystemHandle(), current_plugin->name);
if(err != VideoPlayer::Error::OK) {
std::string err_msg = "Failed to play url: ";