Что нового

[Сеть, интернет] Запись потокового видео и аудио

tref777

Новичок
Сообщения
38
Репутация
2
Добрый день, уважаемые посетители форума! :smile:
Решил написать программу для записи потокового аудио и видео на таких ресурсах как vkontakte.ru, youtube.com и т.п.
Раньше никогда не сталкивался с такими задачами, поэтому прошу у вас помощи или подсказки в каком направлении думать. Пробовал привлечь для этих целей библиотеку Media.au3, но насколько понимаю там содержаться функции для работы с уже существующими файлами, может я что-то недопонимаю. Наведите на светлые мысли плз...
 

Arei

Скриптер
Сообщения
938
Репутация
115
OffTopic:
Решил написать программу для записи потокового аудио и видео на таких ресурсах как vkontakte.ru, youtube.com и т.п.
про это можно подробнее, а то как то не понятно.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Ничего не понятно. Вы хотите написать программу, которая будет скачивать видео/аудио с этих сайтов? Если это так - зачем так замутно это объяснять? Если нет - объясните подробнее, что вы хотите сделать :smile:
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
на примере контакта. Есть список аудио у меня на страничке, или в списке результатов поиска аудио хочу чтобы программа смогла записать или скачать любую песню в файл mp3 мне на компьютер.
То что "замутно" написано, извиняюсь...я новичек, потому и выражаюсь некорректно.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Ну тогда ясно. Уверены, что хотите этим заниматься? Чем-то не устраивают уже готовые решения?
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
Да, во первых мне хочется разобраться в деталях процесса, во вторых мне придется со временем модифицировать свою программу под свои нужды.
Понятно что готовый скрипт для меня писать никто не будет, все-таки это не стол заказов
Подскажите как поток аудио который играет через браузер можно записать или сохранить в файл.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
хм, а разве прежде чем начать проигрывать поток, браузер на сохраняет файл или его куски на компе? какой-нибудь temp file?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
tref777
Подскажите как поток аудио который играет через браузер можно записать или сохранить в файл.
Я делаю просто: открываю макстон (надстройка над IE) и файл закачивается в кэш-папку браузера IE - "%UserProfile%\Local Settings\Temporary Internet Files", потом запускаю скрипт Сортировка файлов, который использует функцию _FileSearch.au3. Получаю нужнуе файлы отсортированными по расширению в указанной папке. Обычно файлы videoplayback[1] без расширения, поэтому запускаю ReName и на владке "Расширение" жму "Добавить AVI".
Кроме этого в гугле можно найти "7 способов скачать видео с ютуб".
Кстати, новая версия _FileSearch, под которую ещё не подстроены мои скрипты, так как я изменил разделитель ";" на "|", потому что ";" может использоваться в именах файлов и его нельзя дискриминировать.
 

Arei

Скриптер
Сообщения
938
Репутация
115
вот сделал очень коряво и не красиво,но вроде работает.

Код:
InetGet("http://vkontakte.ru/audio","1.txt")

$we=FileOpen("1.txt")
$wer= FileRead($we)
$start = 'http://cs'
$end = "mp3"

for $i = 1 to 19
$source = StringFindSE($wer,$start,$end,$i)


$wert= $start & $source & $end

InetGet($wert, $i &".mp3",1)
next









Func StringFindSE($string,$start="",$end="",$start_occ=1,$end_occ=1,$cas=0)
    Local $source_start,$source_count,$source
    If $start <> '' Then
        Local $st_count
        $st_count = StringSplit($start,'')
        $source_start = StringInStr($string,$start,$cas,$start_occ) + $st_count[0]
    Else
        $source_start = 1
    EndIf
    If $end <> '' Then
        $source_count = StringInStr($string,$end,$cas,$end_occ,$source_start) - $source_start
    Else
        $source_count = -1
    EndIf
    Return StringMid ($string,$source_start,$source_count)
EndFunc

19 это количество песен у меня, и они все скачиваются, но для нормальной программы,надо делать очень много,что бы она работала хорошо.
 

SyDr

Сидра
Сообщения
651
Репутация
158
OffTopic:
AZJIO, ну а в 3 просто через сниффер. Без всяких заморочек с кешем. Хотя это, вроде и во втором есть. И не вводи людей в заблуждение: Макстон не надстройка. Даже 2 им можно было назвать только с натяжкой, а с текущей версией это вообще не верно.


Arei, вау! ВК, однако, в коде хранит ссылки на сами файлы. Это офигительно упрощает задачу. Правда, при этом искать конкретные файлы не получится (запросы, походу, отдельно подгружются). Ну и работает оно только с ВК.
 

Arei

Скриптер
Сообщения
938
Репутация
115
Спасибо, но человек как раз просил для ознакомления сделать с вконтакте, а если ему ютюб нужен, то пусть заглянет,на наш иностранный форум посвященный Autoit и найдет там много примеров скачивания видео.
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
tref777 [?]
для записи потокового аудио и видео
на таких ресурсах как vkontakte.ru, youtube.com

Не путайте потовое видео и просто видео показываемое через Flash.
Потоковое видео - то которое идёт потоком к вам.
На сайтах же типа ВК и youtube не потоковое видео. В этом случае "вы" скачиваете файл аудио/видео а Flash является просто плеером.

Для ваших нужно - нужно просто знать где на странице прячется нужная ссылка на файл.
 

Arei

Скриптер
Сообщения
938
Репутация
115
вот новый код
Код:
#include <GUIConstants.au3>
#include <GUIListBox.au3>
#include <GuiConstantsEx.au3>
$start = '[q]='
$end = "&c"
$start1 = 'http://cs'
$end1= "mp3"

InetGet("http://vkontakte.ru/audio","1.txt")



GUICreate("My GUI combo",400,400)  ; will create a dialog box that when displayed is centered
$Button1 = GUICtrlCreateButton("Загрузить", 250, 350, 75, 25)
$mylist=GUICtrlCreateList ("", 0,0,400,300,BitOR(0x0001,0x1000))



GUISetState ()
$we=FileOpen("1.txt")
$wer= FileRead($we)



for $i = 1 to 100
$source = StringFindSE($wer,$start,$end,$i)






$result2 = StringInStr($source, '+performer+')

If $result2 = 2 Then
exitloop


			EndIf

$result1 = StringInStr($source, '\&#')

If $result1 = 1 Then
	$ww= StringLen($source)
	$ww= $ww -8
$source = StringRight($source,$ww )


			EndIf

			$text = StringReplace($source, "\&#", "")
			$text = StringReplace($source, "&quot;", "")
$text1 = StringReplace($text, "'+performer+'", "")

GUICtrlSetData(-1,$text1)
ConsoleWrite(@cr &$text1&@cr)




next





While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			   $w= GUICtrlRead($mylist)

			   $mylist = _GUICtrlListBox_GetCaretIndex($mylist)


   $mylist = $mylist+1
$source = StringFindSE($wer,$start1,$end1,$mylist)
$wert= $start1 & $source& $end1

InetGet($wert, $w&".mp3",1)
MsgBox("","","Спасибо")
	EndSwitch
WEnd







Func StringFindSE($string,$start="",$end="",$start_occ=1,$end_occ=1,$cas=0)
    Local $source_start,$source_count,$source
    If $start <> '' Then
        Local $st_count
        $st_count = StringSplit($start,'')
        $source_start = StringInStr($string,$start,$cas,$start_occ) + $st_count[0]
    Else
        $source_start = 1
    EndIf
    If $end <> '' Then
        $source_count = StringInStr($string,$end,$cas,$end_occ,$source_start) - $source_start
    Else
        $source_count = -1
    EndIf
    Return StringMid ($string,$source_start,$source_count)
EndFunc

Можно сделать лучше, жду советов по совершенствованию скрипта.
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
на этапе
Код:
InetGet("http://vkontakte.ru/audio","1.txt")

возникают проблемы с логином. Насколько я понимаю нужно быть залогиненым из IE, иначе он возвращает код странички авторизации... :-\
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
Я написал такой скрипт:
Код:
#include <IE.au3> 
#include <file.au3>
Dim $aRecords
$name = InputBox("Загрузка аудио", "Введите название песни:")
$oIE = _IECreate("vkontakte.ru/audio", 0, 0)
$sHTML = _IEBodyReadHTML($oIE)
FileWrite("temphtml.txt", $sHTML)
_FileReadToArray("temphtml.txt", $aRecords)
For $i = 1 To $aRecords[0]
	$location = StringInStr($aRecords[$i], $name)
	If $location <> 0 Then
		For $i = $i To 1 Step -1
	    $SoundLoc1 = StringInStr($aRecords[$i], "http://cs")
		$SoundLoc2 = StringInStr($aRecords[$i], ".mp3")
		$count = $SoundLoc2 - $SoundLoc1
		$string = StringMid($aRecords[$i], $SoundLoc1, $count)
		   If $SoundLoc1 <> 0 AND $SoundLoc2 <> 0 Then 
			   ExitLoop
		   EndIf
	   Next
	   ExitLoop
	   EndIf
   Next
        InetGet($string & ".mp3", $name & ".mp3")
	ProcessClose("iexplore.exe")
	FileRecycle("temphtml.txt")


Он работает только для первых песен в списке и при условии что выполнен вход в ВК, через IE
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Давно делал парсер с выводом форматов (тип кодека видео и разрешение по короткой стороне) для youtube, но они снова сменили код, вот обновленный:
Код:
#include <Array.au3>
Dim $aLinksInput[1] = ['http://www.youtube.com/watch?v=p7H7heGDqoY'] ; ссылка должна начинаться на http://www.
Dim $aFormat[12][2] = [['5', 'FLV 240p'], ['17', '3gp'], ['13', '3gp'], ['18', 'MP4 360p'], ['22', 'MP4 720p (HD)'], ['34', 'FLV 360p'], _
['35', 'FLV 480p'], ['37', 'MP4 1080p (HD)'], ['38', 'MP4 Original (HD)'], ['43', 'WebM 480p'], ['44', 'WebM 480p'], ['45', 'WebM 720p (HD)']] ; массив форматов youtube.com
Dim $aSimbols[12][2] = [['\u00', '%'], ['%7C', '|'], ['%26', '&'], ['%3B', ';'], ['%2B', '+'], ['%22', '"'], _
['%3A', ':'], ['%2F', '/'], ['%3F', '?'], ['%3D', '='], ['%2C', ','], ['&amp', '']] ; массив для восстановления символов пунктуации из кодировки
;~ 	$ProxyServer = 'proxy ip'
;~ 	$ProxyUser = 'user'
;~ 	$ProxyPass = 'pass'
For $z = 0 To UBound($aLinksInput) - 1
	$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1') ; объект WinHTTP создается каждый раз, иначе выдаются кривые ссылки
;~ 		$oHTTP.SetProxy(2, $ProxyServer)
	$sUrl = StringReplace($aLinksInput[$z], '.com/v/', '.com/watch?v=') ; приводим ссылку к нужному виду
	$oHTTP.Open('GET', $sUrl, False)
;~ 		$oHTTP.SetCredentials($ProxyUser, $ProxyPass, 0)
	$oHTTP.Send('')
	$oHTTP.WaitForResponse
	$sHTML = $oHTTP.ResponseText
	$sOut = StringRegExpReplace($sHTML, '(?si).*?"url_encoded_fmt_stream_map": "(.*?)".*$', '$1') ; получаем строку со всеми ссылками на ролик
	$sTitle = BinaryToString(StringToBinary(StringRegExpReplace($sHTML, '(?si).*?<meta name="title" content="(.*?)">.*$', '$1'), 4)) ; получаем названия ролика и переводим в кодировку UTF-8
	$sTitle = StringRegExpReplace($sTitle, '(?si)(&.*?;)', '') ; убираем теги (типа "&quote;")из названия ролика
	$sOut = StringRegExpReplace($sOut, '%(25)+', '%')
	For $i = 0 To UBound($aSimbols) - 1
		$sOut = StringReplace($sOut, $aSimbols[$i][0], $aSimbols[$i][1]) ; восстанавливаем кодировку пунктуации
	Next
	$aLinks = StringRegExp($sOut, '(?si)(http.*?)&quality.*?itag=(\d+)', 3) ; получаем массив из ссылок на ролики и их форматов
	$Format = False
	For $i = 0 To UBound($aLinks) - 1 Step 2
		$aLinks[$i] = $aLinks[$i] & '&title=' & $sTitle ; дописываем к ссылкам тег "title" иначе ролик будет называться "videoplayback"
		For $j = 0 To UBound($aFormat) - 1 ; расшифровка формата
			If $aFormat[$j][0] = $aLinks[$i + 1] Then
				$aLinks[$i + 1] = 'Format: ' & $aFormat[$j][1] & ' [' & $aLinks[$i + 1] & ']'
				$Format = True
				ExitLoop
			EndIf
		Next
		If Not $Format Then $aLinks[$i + 1] = 'Format: unknown [' & $aLinks[$i + 1] & ']'
		ConsoleWrite($aLinks[$i + 1] & @CRLF) ; выдача форматов для ссылки
		ConsoleWrite($aLinks[$i] & @CRLF) ; выдача ссылок в консоль (в _ArrayDisplay() ссылки обрезаются, т.к. слишком длинные)
	Next
	ConsoleWrite('------------------' & @CRLF)
	$oHTTP = 0 ; удаляем объект WinHTTP
Next
 

Arei

Скриптер
Сообщения
938
Репутация
115
мне кажется так будет надежнее, сделать скрытый режим.
Код:
#include <IE.au3>
#include <file.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Dim $aRecords
$name = InputBox("Загрузка аудио", "Введите название песни:")
$Form1 = GUICreate("Form1", 1, 1, 9999, 9999)
$Obj1 = ObjCreate("Shell.Explorer.2")
$Obj1_ctrl = GUICtrlCreateObj($Obj1, 0, 0, 616, 400)


GUISetState(@SW_HIDE)

$oIE = _IENavigate($Obj1, "vkontakte.ru/audio")


$sHTML = _IEBodyReadHTML($Obj1)
FileWrite("temphtml.txt", $sHTML)
_FileReadToArray("temphtml.txt", $aRecords)
For $i = 1 To $aRecords[0]
    $location = StringInStr($aRecords[$i], $name)
    If $location <> 0 Then
        For $i = $i To 1 Step -1
        $SoundLoc1 = StringInStr($aRecords[$i], "http://cs")
        $SoundLoc2 = StringInStr($aRecords[$i], ".mp3")
        $count = $SoundLoc2 - $SoundLoc1
        $string = StringMid($aRecords[$i], $SoundLoc1, $count)
           If $SoundLoc1 <> 0 AND $SoundLoc2 <> 0 Then
               ExitLoop
           EndIf
       Next
       ExitLoop
       EndIf
   Next
        InetGet($string & ".mp3", $name & ".mp3")
    FileRecycle("temphtml.txt")




Добавлено:
Сообщение автоматически объединено:

на этапе Код: AutoIt [Выделить]
InetGet("http://vkontakte.ru/audio","1.txt")

возникают проблемы с логином. Насколько я понимаю нужно быть залогиненым из IE, иначе он возвращает код странички авторизации...
да это так, но можно ведь легко авторизоваться.
 
Автор
T

tref777

Новичок
Сообщения
38
Репутация
2
Код:
InetGet("http://vkontakte.ru/audio", "html")
$file = FileRead("html")
If StringInStr($file, "Чтобы просматривать эту страницу, нужно зайти на сайт") Then
    $login = InputBox("логин", "логин")
	$pass = InputBox("пароль", "пароль")
	InetGet("http://vkontakte.ru/login.php?m=1&email="&$login&"&pass="&$pass, "html")
	$file = InetGet("http://vkontakte.ru/audio", "html")
EndIf
FindBlue()
FindBlack()
	FileRecycle("html")



Func FindBlue()
local $metka1 = ';return false;">'
local $metka2 = '</a> </span>'
local $plus = 16
Local $pos1
Local $start = 1
$file = FileRead("html")
$pos1 = 1
$start = 1
While $pos1 <> 0 
$pos1 = StringInStr($file, $metka1, 0, 1, $start)
$pos2 = StringInStr($file, $metka2, 0, 1, $pos1)
$start = $pos1 + 1
$startMid = $pos1 + $plus
$count = $pos2 - $startMid
$name = StringMid($file, $startMid, $count)
If $pos1 <> 0 And $pos2 <> 0 Then 
	$linkpos1 = StringInStr($file, 'http://cs', 0, -1, $start)
	$linkpos2 = StringInStr($file, '.mp3', 0, -1, $start)
	$linkStartMid = $linkpos1 + 9
	$linkCount = $linkpos2 - $linkStartMid
	$link = StringMid($file, $linkStartMid, $linkCount)
	InetGet("http://cs"&$link&".mp3", $name&".mp3")
	EndIf
WEnd
EndFunc


Func FindBlack()
local $metka1 = 'class="title">'
local $metka2 = '</span><span'
local $plus = 14
Local $pos1
Local $start = 1
$file = FileRead("html")
$pos1 = 1
$start = 1
While $pos1 <> 0 
$pos1 = StringInStr($file, $metka1, 0, 1, $start)
$pos2 = StringInStr($file, $metka2, 0, 1, $pos1)
$start = $pos1 + 1
$startMid = $pos1 + $plus
$count = $pos2 - $startMid
$name = StringMid($file, $startMid, $count)
If $pos1 <> 0 And $pos2 <> 0 Then
	$linkpos1 = StringInStr($file, 'http://cs', 0, -1, $start)
	$linkpos2 = StringInStr($file, '.mp3', 0, -1, $start)
	$linkStartMid = $linkpos1 + 9
	$linkCount = $linkpos2 - $linkStartMid
	$link = StringMid($file, $linkStartMid, $linkCount)
	InetGet("http://cs"&$link&".mp3", $name&".mp3")
EndIf
WEnd
EndFunc



если кому не лень напишите интерфейс нормальный. Буду благодарен)) :smile:
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>


Global $metka1 = ';return false;">', $metka2 = '</a> </span>', $plus = 16
Global $metka12 = 'class="title">', $metka22 = '</span><span', $plus2 = 14


$MainForm = GUICreate("Скачивание музыки с контакта", 352, 220, 192, 124)
GUICtrlCreateTab(8, 8, 329, 201)
GUICtrlCreateTabItem("Главная")
$ProgressDownload = GUICtrlCreateProgress(16, 152, 313, 17)
$ID_Login = GUICtrlCreateInput("Логин", 16, 65, 145, 21)
GUICtrlSetState(-1, $GUI_DISABLE)
$ID_Pass = GUICtrlCreateInput("Пароль", 176, 65, 153, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_PASSWORD))
GUICtrlSetState(-1, $GUI_DISABLE)
$Download_label = GUICtrlCreateLabel("Статус: ", 16, 104, 313, 41)
GUICtrlCreateLabel("Введите Логин и Пароль: ", 16, 40, 136, 17)
$Cancel_But = GUICtrlCreateButton("Отмена", 112, 176, 121, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$Login_But = GUICtrlCreateButton("Логин", 226, 37, 100, 20)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState(@SW_SHOW)

$String = BinaryToString(InetRead("http://vkontakte.ru/audio"))

If StringInStr($String, "Чтобы просматривать эту страницу, нужно зайти на сайт") Then
	GUICtrlSetState($Login_But, $GUI_ENABLE)
	GUICtrlSetState($ID_Login, $GUI_ENABLE)
	GUICtrlSetState($ID_Pass, $GUI_ENABLE)
    Do
		$nMsg = GUIGetMsg()
	Until $nMsg = $Login_But
	$login = GUICtrlRead($ID_Login)
	$pass = GUICtrlRead($ID_Pass)
    InetRead("http://vkontakte.ru/login.php?m=1&email="&$login&"&pass="&$pass)
    $String = BinaryToString(InetRead("http://vkontakte.ru/audio"))
EndIf

Find($String, $metka1, $metka2, $plus)
Find($String, $metka12, $metka22, $plus2)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Func Find($String, $metka1, $metka2, $plus)
Local $pos1 = 1
Local $start = 1

While $pos1 <> 0
$pos1 = StringInStr($String, $metka1, 0, 1, $start)
$pos2 = StringInStr($String, $metka2, 0, 1, $pos1)
$start = $pos1 + 1
$startMid = $pos1 + $plus
$count = $pos2 - $startMid
$name = StringMid($String, $startMid, $count)
ConsoleWrite($pos1 & $pos2)
If $pos1 <> 0 And $pos2 <> 0 Then
    $linkpos1 = StringInStr($String, 'http://cs', 0, -1, $start)
    $linkpos2 = StringInStr($String, '.mp3', 0, -1, $start)
    $linkStartMid = $linkpos1 + 9
    $linkCount = $linkpos2 - $linkStartMid
    $link = StringMid($String, $linkStartMid, $linkCount)
    $hDownload = InetGet("http://cs"&$link&".mp3", @ScriptDir & "\Music\" &$name&".mp3",1,1)
	GUICtrlSetData($Download_label, "Статус:"&@CRLF&"Загрузка: " & $name&".mp3")
	GUICtrlSetState($Cancel_But, $GUI_ENABLE)
	Do
		$Data = InetGetInfo($hDownload)
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				Exit
			Case $Cancel_But
				GUICtrlSetData($ProgressDownload, 0)
				Return
		EndSwitch
		GUICtrlSetData($ProgressDownload, $Data[0]/$Data[1]*100)
		Sleep(200)
	Until InetGetInfo($hDownload, 2)
	InetClose($hDownload)
    EndIf
WEnd
EndFunc

Осталось довести до ума :smile:
 
Верх