|
|
|
@ -2402,6 +2402,11 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
return sts
|
|
|
|
|
|
|
|
|
|
def _mark_watched(self, video_id, player_responses):
|
|
|
|
|
# cpn generation algorithm is reverse engineered from base.js.
|
|
|
|
|
# In fact it works even with dummy cpn.
|
|
|
|
|
CPN_ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
|
|
|
|
|
cpn = ''.join(CPN_ALPHABET[random.randint(0, 256) & 63] for _ in range(16))
|
|
|
|
|
|
|
|
|
|
for is_full, key in enumerate(('videostatsPlaybackUrl', 'videostatsWatchtimeUrl')):
|
|
|
|
|
label = 'fully ' if is_full else ''
|
|
|
|
|
url = get_first(player_responses, ('playbackTracking', key, 'baseUrl'),
|
|
|
|
@ -2412,11 +2417,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
parsed_url = urllib.parse.urlparse(url)
|
|
|
|
|
qs = urllib.parse.parse_qs(parsed_url.query)
|
|
|
|
|
|
|
|
|
|
# cpn generation algorithm is reverse engineered from base.js.
|
|
|
|
|
# In fact it works even with dummy cpn.
|
|
|
|
|
CPN_ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
|
|
|
|
|
cpn = ''.join(CPN_ALPHABET[random.randint(0, 256) & 63] for _ in range(16))
|
|
|
|
|
|
|
|
|
|
# # more consistent results setting it to right before the end
|
|
|
|
|
video_length = [str(float((qs.get('len') or ['1.5'])[0]) - 1)]
|
|
|
|
|
|
|
|
|
|