Entwickler-Ecke

Internet / Netzwerk - Youtube link in Download link umwandeln?


jackie05 - Fr 05.09.08 00:49
Titel: Youtube link in Download link umwandeln?
Hallo,
wie kann ich in Delphi einen Youtube link in Download link umwandeln?

Ich wäre euch sehr dankbar, wenn Ihr mir tips geben könnt oder vieleicht ein beispiel Code posten könnt.

MfG


Moderiert von user profile iconChristian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 05.09.2008 um 01:01


Dunkel - Fr 05.09.08 01:06

Hallo!

Öhm, Du möchtest Youtube-Videos runterladen, oder?


jackie05 - Fr 05.09.08 01:47

Ich möchte es nicht runterladen sondern den link in Download link umwandeln mit Delphi.
Es gibt ja einige seiten wie KeepVid... aber ich möchte es in Delphi gerne machen.

Danke schonmal.

MfG


jackie05 - Fr 05.09.08 03:11

Ich hab den Download link jetzt entschlüsselt und zusammen gesetzt.

Funktioniert einwandfrei.

Trotzdem Danke.

MfG


Fabian W. - Fr 05.09.08 09:23

Falls du einige Referenzen suchst - ich habe in einem Artikel einige Möglichkeiten gesammelt Videos (auch von anderen Seiten) auf verschiedene Art und Weise herunterzuladen: Videos herunterladen [http://fabianwalz.kilu.de/_homepage/?action=blog&entry=136].

mfg


jackie05 - Fr 05.09.08 21:16

Danke Dir.

Ich hab ja hinbekommen mit dem Download link umzuwandeln, aber ich kann es nicht per Delphi downloaden, mit der Indy Komponente.

Es liegt daran, das es keine direkte pfad angabe zur Video Datei ist:
http://www.youtube.com/get_video?video_id=fEhoBOyfK2w&t=OEgsToPDskJdN13Ytk2hwfMcOyt-IQBG&use_get_video_info=1&load_modules=1
Der Download wird über diese Seite geprüft und dann geöffnet.

Es müsste z.B. in dieser art http://www.youtube.com/video/Datei.flv heißen.

Wie könnte ich den richtigen Link generieren lassen?

Vielen Dank schonmal.


Tilman - Fr 05.09.08 21:28

Ich lade Videos immer mit Flashget runter... gut das nützt dir jetzt nix weil du es mit Delphi machen willst ;) Du könntest den Link an deinen Standard-Browser schicken, der bietet es dir dann als Download an... oder du generierst eine HTML-Seite mit


XML-Daten
1:
2:
<h3>Video ganz fies loaden</h3>
<a href='youtube/bla/link/blubber'>Laden</a>
und öffnest diese dann im Standardbrowser oder im TWebBrowser...

aber eigentlich müsste es mit Indy trotzdem gehen ^^


SAiBOT - Fr 05.09.08 21:40

user profile iconTilman hat folgendes geschrieben:

aber eigentlich müsste es mit Indy trotzdem gehen ^^


So einfach ist es leider nicht.

So gehts:

-IndyHttp->Get (zB "http://www.youtube.com/watch?v=uayowbYqvZA")
-Im Quellcode nach der VideoID und dem "t"-Wert suchen.
daraus ergibt sich dann "http://www.youtube.com/get_video?video_id=uayowbYqvZA&t=OEgsToPDskKCWYdPeRPRda6smL3iWVGb"
-IndyHttp->Get
-Nun folgt eine Exception "See other"
-Der endgültige Dowloadlink befindet sich nun in IndyHttp->Response->Location.

Dieser Link [http://evil-soft.blogspot.com/2008/08/clipcommander-13-release.html] könnte vll auch für dich interessant sein.

MfG


Tilman - Fr 05.09.08 21:42

Ja das man den Link umwandeln muss weiß ich, aber der TE hat ja geschrieben dass er das bereits geschafft hat. Dazu benutze ich übrigens immer das FF-Addon "Live HTTP-Headers" (BTW... ist nicht sehr komfortabel, kennt da wer was besseres?).


SAiBOT - Fr 05.09.08 21:48

user profile iconTilman hat folgendes geschrieben:
Ja das man den Link umwandeln muss weiß ich, aber der TE hat ja geschrieben dass er das bereits geschafft hat. Dazu benutze ich übrigens immer das FF-Addon "Live HTTP-Headers" (BTW... ist nicht sehr komfortabel, kennt da wer was besseres?).


Wenn du dir seinen und meinen letzten Post genauer ansiehst, wirst du erkennen, dass er es NICHT geschafft hat an die endgültige URL zu kommen :wink:


Tilman - Fr 05.09.08 21:56

user profile iconjackie05 hat folgendes geschrieben:

Ich hab ja hinbekommen mit dem Download link umzuwandeln, aber ich kann es nicht per Delphi downloaden, mit der Indy Komponente.

Es liegt daran, das es keine direkte pfad angabe zur Video Datei ist:
http://www.youtube.com/get_video?video_id=fEhoBOyfK2w&t=OEgsToPDskJdN13Ytk2hwfMcOyt-IQBG&use_get_video_info=1&load_modules=1
Der Download wird über diese Seite geprüft und dann geöffnet.


Wir halten also fest: das umwandeln des LInks hast du geschafft. Jetzt habe ich folgendes gemacht:

- Eine TMozillaBrowser-Komponente auf die Form gezogen (müsste aber auch mit TWebBrowser gehen, nur die hab ich nicht installiert). Habe diese moz genannt und sie so eingestellt dass sie unsichtbar ist.


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  moz.Navigate('http://v15.cache.googlevideo.com/get_video?video_id=fEhoBOyfK2w&origin=chi-v240.chi.youtube.com&signature=365FE8B1EE14E74B23F8A51BEE7DCF93D3C43DA9.B777655E18435AE356398367D734A8F7EB4C0BAB&ip=85.179.96.56&ipbits=8&expire=1220665895&key=yt1&sver=2');
end;


funzt super. Natürlich werde ich gefragt ob ich downloaden will oder nicht.

Wie es mit den Indys steht, ob es da nicht doch irgendwie geht, weiß ich nicht.

Alernativ hast du immer noch die möglichkeit eine HTML-Seite dynamisch zu generieren wie oben genannt und diese in eine Webbrowswer-Kompo einzubinden, so dass der User selbst loaden kann.


SAiBOT - Fr 05.09.08 22:02

user profile iconTilman hat folgendes geschrieben:

Wie es mit den Indys steht, ob es da nicht doch irgendwie geht, weiß ich nicht.


Wie gesagt... mit dem entgültigen Link funktioniert es mit Indy ohne Probleme.


jackie05 - Fr 05.09.08 22:08

@SAiBOT Vielen Dank für deine Hilfe.

Der entgültige Code steckt in IdHTTP1.Response.Location, hat wunderbar funktioniert, vielen Dank.

MfG


Tilman - Fr 05.09.08 22:13

Ah okay, sry ^^ hatte irgendwie überlesen dass du die Lösung gepostet hattest, hatte dich irgendwie missverstanden, SAiBOT.


jackie05 - Mo 29.09.08 22:26

Hallo nochmal,
seit paar tagen bekomme ich eine ganz andere Download URL zurückgeliefert, diese in IdHTTP1.Response.Location steckt, nun funktioniert das downloaden auch nicht mehr in Delphi.
Wenn ich den Link dann in Internet Explorer einfüge und anschließend auf Enter drücke, kann ich es downloaden, aber wieso kann ich es per Delphi nicht mehr downloaden?

Ich bedanke mich schonmal für die Hilfe.

MfG


dTrace - Do 09.10.08 17:27
Titel: quellcode
Hi, kannst du vielleicht mal den kompletten quellcode hier posten um mit indy eine youtube datei herunterzuladen.
Ich habe es versucht und bekomme ich die exception "forbidden"

danke....dtrace


SAiBOT - So 12.10.08 13:17

user profile iconjackie05 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo nochmal,
seit paar tagen bekomme ich eine ganz andere Download URL zurückgeliefert, diese in IdHTTP1.Response.Location steckt, nun funktioniert das downloaden auch nicht mehr in Delphi.
Wenn ich den Link dann in Internet Explorer einfüge und anschließend auf Enter drücke, kann ich es downloaden, aber wieso kann ich es per Delphi nicht mehr downloaden?

Ich bedanke mich schonmal für die Hilfe.

MfG


Es funktioniert immernoch GENAU so wie ich oben beschrieben habe!

user profile icondTrace hat folgendes geschrieben Zum zitierten Posting springen:
Hi, kannst du vielleicht mal den kompletten quellcode hier posten um mit indy eine youtube datei herunterzuladen.
Ich habe es versucht und bekomme ich die exception "forbidden"
danke....dtrace


Das liegt wohl daran das YouTube den Standart UserAgent von Indy>Http gesperrt hat.

Dieser muss geändert werden!


jackie05 - Fr 20.02.09 01:06

Hallo nochmal,
seit einigen Tagen funktioniert das mit dem Downloaden nicht mehr, ich bekomme beim Downloaden der Datei folgende fehlermeldung:
HTTP/1.1 403 Forbidden

Hier ist mal der Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure GetYoutubeDownloadURL(URL: string);
var
  HTTP: TIdHTTP;
  Quelltext: string;
  VideoID: string;
  T: string;
  Pos1: integer;
begin
  HTTP := TIdHTTP.Create(nil);
  HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';
  
  Quelltext := HTTP.Get(URL);
  //Titel herausfiltern
  Download.Titel := Copy(Quelltext,Pos('<title>',Quelltext)+7,Pos('</title>', Quelltext)-Pos('<title>', Quelltext)-7);
  //VideoID herausfiltern
  VideoID := Copy(Quelltext,Pos('video_id', Quelltext)+12,Pos('video_id', Quelltext)+0-Pos('video_id', Quelltext)+11);
  //T herausfiltern
  Pos1 := Pos('"t": "', Quelltext)+6;
  T := Copy(Quelltext, Pos1,PosEx('"',Quelltext,Pos1+1)-Pos1);

  try
    HTTP.Get('http://de.youtube.com/get_video?video_id='+VideoID+'&t='+T);
  except

  end;

  Download.URL := HTTP.Response.Location;

  HTTP.Free;
end;


Das ist jetzt nur der Code, um den Downloadlink zu generieren.

woran liegt denn der fehler?

Danke schonmal.

MfG


jaenicke - Fr 20.02.09 01:24

Da hast du wohl das selbe Problem wie dieses Tool:
http://www.techcrunch.com/2009/02/13/youtube-kills-our-video-download-tool/
Denen wurde mit dem Auszug aus den Nutzungsbedingungen geantwortet. ;-)


jackie05 - Fr 20.02.09 02:21

Das hat mir nicht weitergeholfen.

es liegt an diesem Code, wie ich gemerkt habe:
HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';

muss ich da vieleicht noch etwas hinzufügen oder so?

Danke schonmal.

MfG


jaenicke - Fr 20.02.09 02:36

user profile iconjackie05 hat folgendes geschrieben Zum zitierten Posting springen:
es liegt an diesem Code, wie ich gemerkt habe:
Wie kommst du darauf? :gruebel:

Wenn du das festgestellt hast, dann musst du ja nur den Code nehmen, mit dem es klappt. Und wenn du keinen funktionierenden hast, woher weißt du dann, dass es daran liegt? :shock:
Mit denen anderer realer Browser gehts jedenfalls auch nicht.

Ich würde jedenfalls eher sagen, dass schlicht die Adresse so nicht mehr geht, evtl. weil die mit get_video vermutlich jetzt geschützt weil ggf. kostenpflichtig ist.
Wie die richtige Adresse ist, sehe ich im Moment nicht.


jackie05 - Fr 20.02.09 04:45

Ich habe den Link jetzt von

Delphi-Quelltext
1:
2:
3:
4:
try
  HTTP.Get('http://de.youtube.com/get_video?video_id='+VideoID+'&t='+T);
except
end;


in


Delphi-Quelltext
1:
2:
3:
4:
try
  HTTP.Get('http://www.youtube.com/get_video?video_id='+VideoID+'&t='+T);
except
end;


geändert, und nun funktioniert das.

Danke trotzdem für die Hilfe.

MfG