Delphi+YouTube
, Как?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Delphi+YouTube
, Как?
|
Сообщ.
#1
,
|
|
|
|
Здраствуйте. Подскажите пожайлусто как мне скачать видео с YouTube? хотябы с чего начать как скачивать файлы с сети я могу, а вот с ю тубом все сложнее.
|
|
Сообщ.
#2
,
|
|
|
|
![]() ![]() BOOL InternetReadFile( HINTERNET hFile, LPVOID lpBuffer, DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead ); |
|
Сообщ.
#3
,
|
|
|
|
А как узнать какой URL у видео файла?
|
|
Сообщ.
#4
,
|
|
|
|
Gaws, дополняя пример Rouse_'а посмотри в MSDN работу с библиотекой WinInet или в FAQ форума
Цитата Attack @ А как узнать какой URL у видео файла? так на странице же есть ссылка чтобы вставить видео на свой сайт, проблема лишь в том что видео вставиться с плеером и будем иметь расширение *.swf, т.е. расширение Adobe Flash |
|
Сообщ.
#5
,
|
|
|
|
а отдельно скачать .flv файл нельзя?
И как тогда поступают программы вроде YouTube Downloader? даже некоторые сайты позволяют через них скачивать только видео... |
|
Сообщ.
#6
,
|
|
|
|
Цитата Attack @ И как тогда поступают программы вроде YouTube Downloader? скорее всего использует какую-то дырку в движке |
|
Сообщ.
#7
,
|
|
|
|
Какие дырки ? Парсишь страницу и ищешь url для загрузки.
|
|
Сообщ.
#8
,
|
|
|
|
Цитата P.O.D @ Парсишь страницу и ищешь url для загрузки. дык у youtube не предусмотрена скачка видео только просмотр и распространение на других ресурсах путем вставки их плеера |
|
Сообщ.
#9
,
|
|
|
|
Цитата kanes @ скорее всего использует какую-то дырку в движке эта дырка редиректом зовется |
|
Сообщ.
#10
,
|
|
|
|
Rouse_, а как использоать этот "редирект" с целью получения flv файла?
|
|
Сообщ.
#11
,
|
|
|
|
послать запрос на внешнюю ссылку, при это выставить INTERNET_FLAG_NO_AUTO_REDIRECT, при получении статуса HTTP_STATUS_REDIRECT обработать сам редирект, ну или просто вытащить оттуда имя файла...
|
|
Сообщ.
#12
,
|
|
|
|
Rouse_, прошу прощения за назойливость, но можно пример кода? а то я всё это довольно смутно представляю...
|
|
Сообщ.
#13
,
|
|
|
|
Сначала покажи ссылку, по которой хочешь получить результат
|
|
Сообщ.
#14
,
|
|
|
|
ну скажем эта:
![]() ![]() http://www.youtube.com/watch?v=x_z8FeN6j78 |
|
Сообщ.
#15
,
|
|
|
|
По этой ссылке нет никакого FLV. Это обычная страница которая запускает проигрыватель расположенный по адресу:
http://s.ytimg.com/yt/swf/watch-vfl50057.swf или http://s.ytimg.com/yt/swf/watch_v8-vfl50057.swf и передает ему код файла. Как видишь на www.youtube.com самого файла нет, а откуда проигрыватель его бует известно только ему самому. |
|
Сообщ.
#16
,
|
|
|
|
Rouse_ возник впрос а перехватить как-нибудь разве нельзя адреса роликов, например, посылая запросы на YouTube ...
|
|
Сообщ.
#17
,
|
|
|
|
Цитата andrew.virus @ а перехватить как-нибудь разве нельзя адреса роликов, например, посылая запросы на YouTube Мне такие способы не известны |
|
Сообщ.
#18
,
|
|
|
|
Ура! Я разобрался...
В аттаче мой енот, с помощью которого можно скачивать видео с www.youtube.com Угощаемся =) P.S. Код мальца кривой, но рабочий! Прикреплённый файл GetYTVFile.zip (1.33 Кбайт, скачиваний: 1090)
|
|
Сообщ.
#19
,
|
|
|
|
Attack спасибо ...
|
|
Сообщ.
#20
,
|
|
|
|
пробывал этот код переделать под наш баштуб но неполучилось ничего.
Можете переделать эту программу под скачку видео дял сервиса http://bashtube.ru/ ? |
|
Сообщ.
#21
,
|
|
|
|
Tapac, перекроил под bashtube.ru=) пользуем...
Прикреплённый файл GetBTVFile.zip (1.22 Кбайт, скачиваний: 404)
|
|
Сообщ.
#22
,
|
|
|
|
Вот пример использования, так на всякий слуай =)
Прикреплённый файл BD.zip (3.06 Кбайт, скачиваний: 500)
|
|
Сообщ.
#23
,
|
|
|
|
ага, этот BD.zip при запуске требует какойто компонент(((
|
|
Сообщ.
#24
,
|
|
|
|
Обновлённый енот для bashtube.ru
![]() ![]() //////////////////////////////////////////////////////////////////////////////// /// /// /// -------= GetBashTubeVideoFile =------- /// /// /// /// Ссылка должна быть вида: /// /// http://bashtube.ru/video/XXXX/ /// /// /// /// Пример использования: /// /// /// /// if GetVideoFile('http://bashtube.ru/video/XXXX/', /// /// 'C:\VideoFile.flv') then /// /// ShowMessage('Файл получен!') /// /// else ShowMessage('Ошибка'); /// /// /// //////////////////////////////////////////////////////////////////////////////// unit GetBTVFile; interface uses Windows, SysUtils, Wininet, Classes, IdHTTP; Function GetVideoFile(const URL, SaveFileName : String) : Boolean; implementation function GetInetFile(const fileURL, FileName: String): boolean; const BufferSize = 1024; var hSession, hURL : HInternet; Buffer : array[1..BufferSize] of Byte; BufferLen : DWORD; f : File; begin Result:=False; hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); try hURL := InternetOpenURL(hSession, PChar(fileURL),nil,0,0,0); try AssignFile(f, FileName); Rewrite(f,1); repeat InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen); BlockWrite(f, Buffer, BufferLen) until BufferLen = 0; CloseFile(f); Result:=True; finally InternetCloseHandle(hURL) end finally InternetCloseHandle(hSession) end end; Function GetVideoFile(const URL, SaveFileName : String) : Boolean; function fAnsiPos(const Substr, S: AnsiString; FromPos: integer) : Integer; var P : PAnsiChar; begin Result := 0; P := AnsiStrPos(PAnsiChar(S) + fromPos - 1, PAnsiChar(SubStr)); if P <> nil then Result := Integer(P) - Integer(PAnsiChar(S)) + 1; end; var IdHTTP : TIdHTTP; WebDoc : TStringStream; X1, X2 : Integer; FullURLFile : String; Begin Result := false; IdHTTP := TIdHTTP.Create(nil); try WebDoc := TStringStream.Create(''); try with IdHTTP do Begin Request.UserAgent := 'MSIE'; Request.Host := 'www.bashtube.ru'; End; IdHTTP.Get(URL + 'play.xml?123', WebDoc); X1 := fAnsiPos('<location>', WebDoc.DataString, Pos('</creator>', WebDoc.DataString) + 10)+10; X2 := fAnsiPos('</location>', WebDoc.DataString, X1); FullURLFile := copy(WebDoc.DataString, X1, X2-X1); if GetInetFile(FullURLFile, SaveFileName) then Result := true; finally WebDoc.Free; end; finally IdHTTP.Free; end; End; end. Хочу заметить, что енот написан и тестирован на Delphi 2009 |
|
Сообщ.
#25
,
|
|
|
|
Цитата Rouse_ @ а откуда проигрыватель его бует известно только ему самому Есть ли возможность как-то это узнать, например с помощью снифера? |
|
Сообщ.
#26
,
|
|
|
|
ну лично я понял откуда берётся видео разбирая исходник.
Например открывает ссылку http://bashtube.ru/video/10181/ И просто напросто добавим туда play.xml?123 И у нас выходит ссылка http://bashtube.ru/video/10181/play.xml?123 И у нас будет написано http://bashtube.ru/spotajob1.swf http://www.ufanet.ru/ overlay http://bashtube.ru/files/93/93dc089120dbbe0130fbdf3f06ac0d54.flv Вот ссылка http://bashtube.ru/files/93/93dc089120dbbe0130fbdf3f06ac0d54.flv и есть тот самый видос !!! А не знаете ли как зделать эту программу чтобы например мона было грузить более 2-ух видосов сразу ! А то ведь вставляешь ссылку в прогу и всё, пока нескачает нельзя к ней обращаться. Я имею ввиду то, чтобы зделать 1 оболочку, и зделать 1 программу которая будет запускаться из-под оболочки и сохранять видосы |
|
Сообщ.
#27
,
|
|
|
|
Tapac, вроде привели вверху код. Осталось только потоки создавать, передавать в них разные ссылки на скачку и усе
|
|
Сообщ.
#28
,
|
|
|
|
Пример для YouTube не работает.
Качаем файл: http://www.youtube.com/watch?v=Y0a1e2wvhCs FullURLFile в функции GetVideoFile становится следующим: http://www.youtube.com/get_video?video_id=Y0a1e2wvhCs&t=t И никакого FLV по этому адресу нет. |
|
Сообщ.
#29
,
|
|
|
|
Такая же проблема
ну что с ютубом делать? |
|
Сообщ.
#30
,
|
|
|
|
pkotenev, ZILOSOFT, всё дело в том что ребята из youtube просто изменили код странички...
Переписал Unit, теперь всё работает, по крайней мере пока! ![]() ![]() //////////////////////////////////////////////////////////////////////////////// /// /// /// -------= GetYouTubeVideoFile =------- /// /// /// /// Ссылка должна быть вида: /// /// http://www.youtube.com/watch?v=XXXXXXXXXXX /// /// /// /// Пример использования: /// /// /// /// if GetVideoFile('http://www.youtube.com/watch?v=XXXXXXXXXXX', /// /// 'C:\VideoFile.flv') then /// /// ShowMessage('Файл получен!') /// /// else ShowMessage('Ошибка'); /// /// /// ///------------------>>> Написано на Delphi 2009 <<<-------------------------/// /// с предыдущими версиями работать НЕ должно! /// //////////////////////////////////////////////////////////////////////////////// unit GetYTVFile; interface uses Windows, SysUtils, Wininet, Classes, IdHTTP; Function GetVideoFile(const URL, SaveFileName : String) : Boolean; implementation function GetInetFile(const fileURL, FileName: String): boolean; const BufferSize = 1024; var hSession, hURL : HInternet; Buffer : array[1..BufferSize] of Byte; BufferLen : DWORD; f : File; begin Result:=False; hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); try hURL := InternetOpenURL(hSession, PChar(fileURL),nil,0,0,0); try AssignFile(f, FileName); Rewrite(f,1); repeat InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen); BlockWrite(f, Buffer, BufferLen) until BufferLen = 0; CloseFile(f); Result:=True; finally InternetCloseHandle(hURL) end finally InternetCloseHandle(hSession) end end; Function GetVideoFile(const URL, SaveFileName : String) : Boolean; function fAnsiPos(const Substr, S: string; FromPos: integer) : Integer; var tmp : String; p : Integer; begin Result := 0; tmp := copy(S, FromPos, (Length(S) - FromPos)); p := pos(Substr, tmp); if p <> 0 then Result := p + FromPos - 1; end; const BeginURLFile = 'http://www.youtube.com/get_video?video_id='; var IdHTTP : TIdHTTP; WebDoc : TStringStream; X1, X2, X4, X5 : Integer; FullURLFile : String; Begin Result := false; IdHTTP := TIdHTTP.Create(nil); try WebDoc := TStringStream.Create(''); try with IdHTTP do Begin Request.UserAgent := 'MSIE'; Request.Host := 'www.youtube.com'; End; IdHTTP.Get(URL, WebDoc); X1 := fAnsiPos('"', WebDoc.DataString, Pos('"video_id":', WebDoc.DataString) + 11)+1; X2 := fAnsiPos('"', WebDoc.DataString, X1); FullURLFile := BeginURLFile; FullURLFile := FullURLFile + copy(WebDoc.DataString, X1, X2-X1) + '&t='; X4 := fAnsiPos('"', WebDoc.DataString, Pos('"t"', WebDoc.DataString) + 3)+1; X5 := fAnsiPos('"', WebDoc.DataString, X4+1); FullURLFile := FullURLFile + copy(WebDoc.DataString, X4, X5-X4); if GetInetFile(FullURLFile, SaveFileName) then Result := true; finally WebDoc.Free; end; finally IdHTTP.Free; end; End; end. написано и протестировано на Delhpi 2009 А вообще ребята, парсер вам в помощь, я этот енот написал чисто для того, чтобы новичкам было от чего отталкиваться! А обновляю его от делать нечего )) |
|
Сообщ.
#31
,
|
|
|
|
и снова всё поменяли
|
|
Сообщ.
#32
,
|
|
|
|
и снова все исправили ))
http://www.onlinedisk.ru/file/731468/ |
|
Сообщ.
#33
,
|
|
|
|
Цитата Bravo @ Файл при запуске пишет ошибку! Если у кого есть рабочий варинт, то прошу в студию. тема опять актульна |
|
Сообщ.
#35
,
|
|
|
|
Цитата Filka @ Этот подойдёт? Только я не проверял работоспособность. Скачал. потребовалось установит еще два компонента. программа предоставляет ссылку на скачивание, однако не рабочую. пытается что-то скачать и в итоге получается просто файл на ~100 kb. Коротко - код не рабочий. надо еще разобраться может получиться, а пока тема актуальна! |
|
Сообщ.
#36
,
|
|
|
|
1. Получаем код страницы..
2. Делаем ссылки читабельными.. типа тк.. Link:= TIdURI.URLDecode(Link); Потом например регисом фильтруем...TRegeXpr правило.. 'url=([/a-zA-Zа-яА-Я0-9- _!?.,:;"#=&%@№*]{1,500})&quality' |
|
Сообщ.
#37
,
|
|
|
|
Вроде всё работает проверил на последнем выложеном ролике
Ссылка на ролик http://www.youtube.com/watch?v=aog_IX09as4&feature=g-logo Полученая ссылка на файл Скомпилиный файл + исходник http://www.onlinedisk.ru/file/885372/ |
|
Сообщ.
#38
,
|
|
|
|
Цитата faust777 @ Потом например регисом фильтруем...TRegeXpr правило.. 'url=([/a-zA-Zа-яА-Я0-9- _!?.,:;"#=&%@№*]{1,500})&quality' На днях что то подобное правило заглючело.. Оказалось можно и проще... Rege.Expression := 'url=(.+?)&quality'; Так же можно прикрутить Gzip, вес страницы при парсинге в разы меньше.. |
|
Сообщ.
#39
,
|
|
|
|
И вновь они там что то намутили..
Ни как в коде ссылку не могу найти.. Есть у кого рабочий пример? |
|
Сообщ.
#40
,
|
|
|
|
Найди исходники "сайта" (скрипта) на пхп и там посмотри.
Суть в том чтоб из ролика выдернуть адрес FLV файла а его уже скачать удобным методом. P.S. меняют они что-то регулярно чтобы не парсили. Чаще них меняется только формат поисковой выдачи Гугла |
|
Сообщ.
#41
,
|
|
|
|
Виталь Какой ПХП на гуглвском ЮТУБЕ? Кто тебе даст СЕРВЕРНЫЙ скрипт?
Проблема в том, что распарсить результат не получилось в этот раз. |
|
Сообщ.
#42
,
|
|
|
|
Да какие скрипты..
Вот например http://userscripts.org/scripts/show/25105 для Greasemonkey... Но толку, я например далёк от этого.. крутил, вертел).. Вообще ссылки то спарсить не такая и проблема.. беда в том что этого мало. А именно, как различить какому формату соответствует ссылка.... в ссылках щас по Два itag= которые "отвечают" за формат.. и фишка в том, что они Разные.. Цитата "Например..мы знаем, что.." itag=18 - MP4 360p itag=34 - FLV 360p itag=43 - WebM 360p И нам нужно ссылку для MP4 360.. вот тут то и проблемка.. как определить что есть что. в ссылке может быть два одинаковых например два itag=18.. а может быть itag=18 и itag=34.. при этом в следующей ссылке будет itag=18 и itag=43 и т.д..а могут быть вообще другие. На video/mp4 тоже можно особо не смотреть.. так как может быть video/x-flv или video/webm, а на деле mp4..и.п.. И нужно оставить только Одни правильный itag=.. Такая вот фигня.. |
|
Сообщ.
#43
,
|
|
|
|
Ха, вроде раскурил)
Короче.. Неподалёку от ссылок.. есть параметр fmt_list=.. Там записаны форматы... И короче порядок этих форматов соответствует порядку ссылок.. Ну а как это всё собрать, проявляем фантазию).. |
|
Сообщ.
#45
,
|
|
|
|
Filka
Да не, мне то уже не нужно.. основная проблема то была, это в различие ссылок и она решаема как я уже выше написал).. В общем решение уже как бы есть..а кто как реализует, уже его дело. Ну а прежде чем смотреть чужие варианты нужно убедиться,что они работают.. судя по регису.. ![]() ![]() Regex(@"url=(?<url>http://.+?)&quality="); это старый вариант.. хотя там тоже парсится ещё и fmt_list=.. может там как то по своему, не знаю. |
|
Сообщ.
#46
,
|
|
|
|
Цитата ttiger Виталь Какой ПХП на гуглвском ЮТУБЕ? Кто тебе даст СЕРВЕРНЫЙ скрипт? По интернетам ходил исходик скрипта-сайта типа savefrom.net - ты ему ссылку которую дает YouTube а он тебе в ответ прямую ссылку на скачивание flv. Я имел в виду что надо достать этот исходник и посмотреть как там сделано... Но раз проблема решена - мой совет уже бесполезен |