aboutsummaryrefslogtreecommitdiffstats
path: root/youtube/watch.py
diff options
context:
space:
mode:
Diffstat (limited to 'youtube/watch.py')
-rw-r--r--youtube/watch.py17
1 files changed, 13 insertions, 4 deletions
diff --git a/youtube/watch.py b/youtube/watch.py
index 32b6eef..7494b95 100644
--- a/youtube/watch.py
+++ b/youtube/watch.py
@@ -23,7 +23,7 @@ except FileNotFoundError:
decrypt_cache = {}
-def get_video_sources(info):
+def get_video_sources(info, target_resolution):
'''return dict with organized sources: {
'uni_sources': [{}, ...], # video and audio in one file
'uni_idx': int, # default unified source index
@@ -35,7 +35,6 @@ def get_video_sources(info):
video_only_sources = []
uni_sources = []
pair_sources = []
- target_resolution = settings.default_resolution
for fmt in info['formats']:
if not all(fmt[attr] for attr in ('ext', 'url')):
continue
@@ -563,7 +562,8 @@ def get_watch_page(video_id=None):
'codecs': codecs_string,
})
- source_info = get_video_sources(info)
+ target_resolution = settings.default_resolution
+ source_info = get_video_sources(info, target_resolution)
uni_sources = source_info['uni_sources']
pair_sources = source_info['pair_sources']
uni_idx, pair_idx = source_info['uni_idx'], source_info['pair_idx']
@@ -577,8 +577,17 @@ def get_watch_page(video_id=None):
pair_quality = yt_data_extract.deep_get(pair_sources, pair_idx, 0,
'quality')
uni_quality = yt_data_extract.deep_get(uni_sources, uni_idx, 'quality')
+ pair_error = abs((pair_quality or 360) - target_resolution)
+ uni_error = abs((uni_quality or 360) - target_resolution)
+ if uni_error == pair_error:
+ # use settings.prefer_uni_sources as a tiebreaker
+ closer_to_target = 'uni' if settings.prefer_uni_sources else 'pair'
+ elif uni_error < pair_error:
+ closer_to_target = 'uni'
+ else:
+ closer_to_target = 'pair'
using_pair_sources = (
- bool(pair_sources) and (not uni_sources or pair_quality != uni_quality)
+ bool(pair_sources) and (not uni_sources or closer_to_target == 'pair')
)
# 1 second per pixel, or the actual video width