2016-03-29 10 views
4

Ich schreibe ein einfaches Python/Flask-Skript, das zum Extrahieren und Weiterleiten an die URL des gewünschten Youtube-Videos zum Herunterladen bereitgestellt wird. Zu diesem Zweck benutze ich youtube-dl Modul. Im Code erstelle ich ein YoutubeDL-Objekt ohne Parameter.Python Youtube-dl extrahiert ungültige URL

from youtube_dl import YoutubeDL 
ydl = YoutubeDL() 

Ich entwickle den Code lokal und auch habe ich meinen Code zu PythonAnywhere (relevante Schnipsel unten) eingesetzt ...

def video(id): 
    url = 'https://www.youtube.com/watch?v=' + id 
    r = ydl.extract_info(url, download=False) 

    if 'entries' in r: 
     video = r['entries'][0] 
    else: 
     video = r 

    video_url = video['url'] 
    return flask.redirect(video_url) 

... und es gibt URL, die korrekt betrachtet der erste Anblick, aber es führt jedes Mal zur leeren Seite. Derselbe Code gibt eine gültige URL zurück, die bei lokaler Ausführung tatsächlich zum Video-Download führt.

Dies ist, wie URL sieht das funktioniert:

https://r11---sn-2gb7ln7k.googlevideo.com/videoplayback?mm=31&ip=82.117.130.94&mn=sn-2gb7ln7k&pl=21&itag=22&signature=D73CFDE63BCE4359D57535A1478D1D9D65DA52AA.2C1AB3C70A9C95685DAFF5742D2D3ACE69306914&id=o-ALXi8_5fzzqW3bvJ-B9Yl2-hO927Vbfgx-ufVjNys1OI&mt=1459240812&upn=PhqlLYrRU3I&mv=m&ms=au&key=yt6&expire=1459262524&mime=video%2Fmp4&dur=4209.986&sver=3&ratebypass=yes&fexp=9408209%2C9416126%2C9416916%2C9417701%2C9420452%2C9422546%2C9422596%2C9423661%2C9423662%2C9424580%2C9427320%2C9427902%2C9429118%2C9429314%2C9431086%2C9431173%2C9432034&nh=IgphcjAxLnByZzAyKgkxMjcuMC4wLjE&sparams=dur%2Cgcr%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&lmt=1458929174531688&ipbits=0&gcr=cz&requiressl=yes&source=youtube&initcwndbps=1297500 

... und diese URL des gleichen Video extrahiert wird, die leere Seite führt:

https://r11---sn-p5qlsn7s.googlevideo.com/videoplayback?lmt=1458929174531688&ip=54.147.140.181&gcr=us&expire=1459262525&id=o-AH6rUZjQmWtR55nCdUd2VKG8QrZxZIgZ1aVaKp7Chc3s&upn=DDLzYOc4HBg&nh=IgpwcjAyLmlhZDI2KgkxMjcuMC4wLjE&pl=22&source=youtube&sparams=dur%2Cgcr%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&ratebypass=yes&key=yt6&mime=video%2Fmp4&fexp=9408506%2C9416126%2C9417368%2C9419452%2C9420452%2C9422596%2C9423661%2C9423662%2C9424132%2C9427143%2C9427364%2C9427902%2C9428422%2C9428710%2C9431439%2C9431464%2C9431860%2C9431952&ipbits=0&mn=sn-p5qlsn7s&signature=B71BF75C6BF798D49720F960F9AFF11E946382F0.8A17B35804BCBA5B0D0D2CA3C889B529A17AC9D9&mm=31&itag=22&sver=3&dur=4209.986&mv=u&mt=1459240330&ms=au 

ich die gleiche Version haben von youtube-dl lokal installiert und gehostet (2016.3.18).

Gibt es eine Möglichkeit, das Format der URL bei der Ausgabe zu steuern (z. B. Youtube-dl-Optionen)? Ich konnte es in der Dokumentation nicht finden. Oder eine andere Möglichkeit, URL neu zu formatieren, um gültig zu sein?

Vielen Dank im Voraus.

+0

Könnte es sein, dass Ihre lokale Instanz und gehostete Instanz verschiedene URLs basierend auf Faktoren wie Ort, Zeit, IP usw. bedient werden und sie nicht von verschiedenen Ort, Zeit, IP usw. funktionieren. Zum Beispiel für mich keiner von beiden URLs funktionieren. Parameter wie "ablaufen" weisen auch darauf hin, dass Ihre URLs zeitvariant sind. –

+0

Danke, ich denke darüber nach. Aber ich habe schon einen anderen Ansatz versucht: youtube-dl als Subprozess zu bezeichnen. Das Ergebnis ist das gleiche (die URL ist gültig, wenn sie lokal ausgeführt wird, wenn sie nicht gehostet wird). Interessant ist, dass callinag youtube-dl von bash, das auf PythonAnywhere hosting verfügbar ist, Arbeits-URLs generiert. Das würde deine Theorie widerlegen. –

Antwort

2

Ich antworte teilweise selbst - Es scheint, dass das Extrahieren von Video-URL zum Download und das Herunterladen des Videos auf 2 verschiedenen Maschinen nicht zuverlässig funktioniert (aufgrund von Cookies, IP muss identisch sein, ...) Dokumentiert here .