import urllib.request
-MAX_MEMORY_BYTES = 128 * 1024*1024
-USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1"
+USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0"
MIMETYPES = {
"video/mp4": "mp4",
p.stdin.close()
transformed_signature = p.stdout.read().decode("utf-8").strip()
+ transformed_signature = urllib.parse.unquote(transformed_signature)
if p.wait() != 0:
raise Exception("js failed to execute: %d" % p.returncode)
signature = None
if signature:
- video_url = append_to_qs(video_url, {"signature": signature})
+ sp = url_data.get("sp", ["signature"])[0]
+ video_url = append_to_qs(video_url, {sp: signature})
best_url = video_url
best_quality = quality
if not video_url:
return None, None
- filename = sanitize_filename(page.title)
+ filename = sanitize_filename(player_config["args"]["title"])
filename += "." + extension
return video_url, filename
class YouTubeVideoPageParser(html.parser.HTMLParser):
def __init__(self):
super().__init__()
- self.title = None
self.unavailable_message = None
self.scripts = []
def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
- self._handle_title(tag, attrs)
self._handle_unavailable_message(tag, attrs)
self._handle_script(tag, attrs)
def _ignore_data(self, _):
pass
- def _handle_title(self, tag, attrs):
- if tag == "title":
- self.handle_data = self._handle_title_data
-
- def _handle_title_data(self, data):
- self.title = data.strip()
-
def _handle_unavailable_message(self, tag, attrs):
if attrs.get("id", None) == "unavailable-message":
self.handle_data = self._handle_unavailable_message_data