AutoIt: 3.3.6.1
Версия: первая рабочая
Категория: Автоматизация, Сеть, Разное
Описание: Сабж. Качаем flash video (*.flv) с youtube. Смотреть можно в VLC-плеере. Делал без особых наворочек, чтобы алгоритм скачивания был понятен, т.к. сам в сети смог найти только устаревшую информацию по этой теме, да и то только когда сам с этим разобрался.
Зы:
Разбирался через Opera Dragonfly, закладка Network.
В принципе можно через любую программу/сервис позволяющую смотреть заголовки http.
Например плагин к FireFox, называется вроде бы live-http-headers.
Код:
Автор(ы): dwerf
Версия: первая рабочая
Категория: Автоматизация, Сеть, Разное
Описание: Сабж. Качаем flash video (*.flv) с youtube. Смотреть можно в VLC-плеере. Делал без особых наворочек, чтобы алгоритм скачивания был понятен, т.к. сам в сети смог найти только устаревшую информацию по этой теме, да и то только когда сам с этим разобрался.
Зы:
Разбирался через Opera Dragonfly, закладка Network.
В принципе можно через любую программу/сервис позволяющую смотреть заголовки http.
Например плагин к FireFox, называется вроде бы live-http-headers.
Код:
Код:
;пользователь вводит ссылку
$sLink = InputBox('youtube downloader', 'введите ссылку на видео' & @CRLF & @CRLF & 'пример:' & @CRLF & 'http://www.youtube.com/watch?v=-ZtCRJld08c&&feature=related', '', '', 500)
If @error Then Exit
;проверяем ссылку на валидность
;в ссылке дожен стоять адрес youtube.com/watch и параметр v=id нужного видео
;проверяем наличие "youtube.com/watch": youtube\.com/watch
;перед параметром v могут присутствовать другие параметры: .*
;перед параметром v должен присутствовать ? если v является первым параметром или & если v таковым не является: (?:\?|&)
;дальше идёт название параметра и =: v=
;дальше идёт значение параметра v, оно не может содержать &, т.к. этот сивол указывает на начало следующиго параметра: [^&]+
If Not StringRegExp($sLink, 'youtube\.com/watch.*(?:\?|&)v=[^&]+') Then
MsgBox(16, 'Ошибка', 'Кривая ссылка.')
Exit
EndIf
;получаем значение параметра v
;например из 'http://www.youtube.com/watch?v=-ZtCRJld08c&feature=related'
;-ZtCRJld08c
$sVideoId = StringRegExpReplace($sLink, '.*?(?:\?|&)v=([^&]+).*', '$1')
;качаем с youtube текст, в котором находится ссылка на видео
$sVideoInfo = InetRead('http://www.youtube.com/get_video_info?video_id=' & $sVideoId, 1)
If @error Or $sVideoInfo='' Then
MsgBox(16, 'Ошибка', 'Не удаётся скачать:' & @CRLF & 'http://www.youtube.com/get_video_info?video_id=' & $sVideoId)
Exit
EndIf
;из справки: "The returned data is in binary format. The BinaryToString() function can be used to convert the data to a string."
$sVideoInfo = BinaryToString($sVideoInfo)
;декодируем текст, пока в тексте присутствуют %xy, заменяем их на Chr(Dec(xy)) (гуглить url encoding)
While StringRegExp($sVideoInfo, '%[a-fA-F\d]{2}')
$sCode = StringRegExpReplace($sVideoInfo, '(?s).*?%([a-fA-F\d]{2}).*', '$1')
$sVideoInfo = StringReplace($sVideoInfo, '%' & $sCode, Chr(Dec($sCode)))
WEnd
;в тексте будут несколько строк/ссылок разделённых |
;нам нужна та, которая находится между первым и вторым |
;в ней должно присутствовать "youtube.com/videoplayback?"
;проверяем её наличие и валидность:
;перед первым | могут присутствовать символы: .*?
;|: \|
;дальше снова идут неизвестные символы, так как нам нужна ссылка находящаяся между первым и вторым |, эти символы не являются |: [^\|]*
;в ссылке должно присутствовать "youtube.com/videoplayback?": youtube\.com/videoplayback\?
;потом идут ещё какие-то символы и должен быть ещё один |: .*\|
If Not StringRegExp($sVideoInfo, '.*?\|[^\|]*youtube\.com/videoplayback\?.*\|') Then
MsgBox(16, 'Ошибка', 'Данные о видео скачаны в не известном формате.')
Exit
EndIf
;Получаем ссылку
$sLink = StringRegExpReplace($sVideoInfo, '.*?\|(.*?)\|.*', '$1')
;Пользователь вводит адрес, куда сохранять файл
$sSavePath = FileSaveDialog('youtube downloader', @WorkingDir, 'Flash video (*.flv)|All files (*.*)', 18)
If @error Or $sSavePath = '' Then Exit
;собственно качаем
$hInet = InetGet($sLink, $sSavePath, 1, 1)
ProgressOn('youtube downloader', $sLink)
Do
$aInfo = InetGetInfo($hInet)
ProgressSet($aInfo[0]*100/$aInfo[1], $aInfo[0] & '/' & $aInfo[1] & ' байтов')
Until $aInfo[2]
InetClose($hInet)
ProgressOff()
If $aInfo[3] Then
MsgBox(0, 'youtube downloader', 'Скачанно успешно')
Else
MsgBox(16, 'Ошибка', 'При скачивании произошла ошибка ' & $aInfo[4])
EndIf
Автор(ы): dwerf