- }, query=query, expected_status={400, 401, 403, 404} if graphql else {403})
+ })
+
+ for first_attempt in (True, False):
+ if not self.is_logged_in:
+ if not self._guest_token:
+ self._fetch_guest_token(headers, video_id)
+ headers['x-guest-token'] = self._guest_token
+
+ allowed_status = {400, 401, 403, 404} if graphql else {403}
+ result = self._download_json(
+ (self._GRAPHQL_API_BASE if graphql else self._API_BASE) + path,
+ video_id, headers=headers, query=query, expected_status=allowed_status,
+ note=f'Downloading {"GraphQL" if graphql else "legacy API"} JSON')
+
+ if result.get('errors'):
+ errors = ', '.join(set(traverse_obj(result, ('errors', ..., 'message', {str}))))
+ if not self.is_logged_in and first_attempt and 'bad guest token' in errors.lower():
+ self.to_screen('Guest token has expired. Refreshing guest token')
+ self._guest_token = None
+ continue