snoitaleR
AutoIT Гуру
- Сообщения
- 855
- Репутация
- 223
- Версия AutoIt
- 3.3.16.0
- Версия
- 1.0
AutoIt: 3.3.16.0
Версия: 1.0
Категория: Сети, Интернет
Описание: Скрипт загружает видео с Яндекс.Видео по ссылкам типа:
Автор: snoitaleR
Версия: 1.0
Категория: Сети, Интернет
Описание: Скрипт загружает видео с Яндекс.Видео по ссылкам типа:
Автор: snoitaleR
Код:
; Кодировка
; НАЧАЛО
#NoTrayIcon
; Проверка на повторный запуск
If RUNONCE('SNOITALER.YVD')=0 Then Exit
$URL1='https://zen.yandex.ru/video/watch/'
$URL2='https://zen.yandex.ru/media/id/'
$URL=''
$ID=''
$TSITE=''
$TRES=''
; Создание GUI
$GUI=GUICreate('Загрузка с Яндекс.Видео',670,70)
$L1=GUICtrlCreateLabel('',40,10,620,25,0x1000)
$B1=GUICtrlCreateButton('➤',10,10,25,25)
$B2=GUICtrlCreateButton('➤',10,40,25,25)
$CB1=GUICtrlCreateCombo('',40,40,175,25)
$SL1=GUICtrlCreateSlider(220,40,440,25,0x0010)
GUICtrlSetTip($B1,'Вставить ссылку из буфера обмена')
GUICtrlSetTip($B2,'Загрузить список разрешений')
GUICtrlSetBkColor($B1,0xFFFF00)
GUICtrlSetBkColor($B2,0xCCCCCC)
GUICtrlSetState($B2,128)
GUICtrlSetState($CB1,128)
GUICtrlSetState($SL1,128)
GUISetState()
While Sleep(10)
Switch GUIGetMsg()
Case -3
ExitLoop
Case $B1
$URL=ClipGet()
If (StringInStr($URL,$URL1)=0) And (StringInStr($URL,$URL2)=0) Then
GUICtrlSetData($L1,'')
GUICtrlSetState($B2,128)
GUICtrlSetBkColor($B1,0xFF0000)
Sleep(1000)
GUICtrlSetBkColor($B1,0xFFFF00)
GUICtrlSetData($CB1,'')
ContinueLoop
EndIf
GUICtrlSetData($L1,$URL)
GUICtrlSetBkColor($B1,0x00FF00)
GUICtrlSetBkColor($B2,0xFFFF00)
GUICtrlSetState($B2,64)
GUICtrlSetData($CB1,'')
GUICtrlSetState($CB1,128)
GUICtrlSetData($SL1,0)
Case $B2
DLSITE()
GUICtrlSetBkColor($B2,0x00FF00)
GUICtrlSetState($CB1,64)
Case $CB1
GUICtrlSetState($B1,128)
GUICtrlSetState($B2,128)
GUICtrlSetState($CB1,128)
$RES=GUICtrlRead($CB1)
DLVIDEO()
EndSwitch
WEnd
; Загрузка сайта
Func DLSITE()
; Разбор адреса
$P=StringInStr($URL,'?')
If $P>0 Then
$URL=StringLeft($URL,$P-1)
$ID=StringMid($URL,$P-24,$P-1)
$URL=$URL1&$ID
ElseIf $P=0 Then
$ID=StringRight($URL,24)
EndIf
; Загрузка страницы
$R=InetGet($URL,'site.htm')
$TSITE=FileRead('site.htm')
FileDelete('site.htm')
$LIST1=StringRegExp($TSITE,'.*(https://strm\.yandex\.ru/vod/.*?/master\.m3u8).*',3)
; Загрузка списка разрешений
$R=InetGet($LIST1[0],'res.m3u8')
$TRES=FileRead('res.m3u8')
FileDelete('res.m3u8')
; Составление списка разрешений
$LIST2=StringRegExp($TRES,'RESOLUTION=.*?,',3)
$S=''
For $I=0 To UBound($LIST2)-1
$R=StringRegExpReplace($LIST2[$I],'.*=(.*?),.*','\1')
If StringInStr($S,$R)>0 Then ContinueLoop
$S=$S&'|'&$R
Next
; Сортировка списка разрешений
$S=StringTrimLeft($S,1)
$A=StringSplit($S,'|')
$I=1
$J=2
While True
$A1=StringSplit($A[$I],'x')
$A2=StringSplit($A[$J],'x')
If Number($A1[1])>Number($A2[1]) Then
If $J=UBound($A)-1 Then
$T=$A[$I]
$A[$I]=$A[$J]
$A[$J]=$T
$I=1
$J=2
Else
$J+=1
ContinueLoop
EndIf
Else
If $J-$I>1 Then
$T=$A[$I]
$A[$I]=$A[$J-1]
$A[$J-1]=$T
$I=1
$J=2
Else
$I+=1
$J=$I+1
If $J=UBound($A)-1 Then ExitLoop
EndIf
EndIf
WEnd
$S=''
For $I=1 To UBound($A)-1
$S=$S&'|'&$A[$I]
Next
; Добавления списка разрешений
GUICtrlSetData($CB1,$S)
EndFunc
; Загрузка видео
Func DLVIDEO()
$LIST2=StringRegExp($TRES,'(?s)RESOLUTION='&$RES&'.*?/vod/.*?m3u8.*?packager=1',3)
$URL=StringRegExpReplace($LIST2[0],'(?s).*(/vod/.*?m3u8.*?packager=1).*','\1')
; Загрузка списка сегментов
$R=InetGet('https://strm.yandex.ru'&$URL,'video.m3u8')
$TEXT=FileRead('video.m3u8')
FileDelete('video.m3u8')
$LIST3=StringRegExp($TEXT,'https://.*?\.ts',3)
; Загрузка и объединение сегментов
$N=$ID&'-'&$RES&'.mp4'
$F=FileOpen($N,1)
For $I=0 To UBound($LIST3)-1
$R=InetRead($LIST3[$I])
FileWrite($F,$R)
Sleep(10)
GUICtrlSetData($SL1,Int(100*$I/(UBound($LIST3)-1)))
Next
GUICtrlSetData($L1,'')
GUICtrlSetBkColor($B1,0xFFFF00)
GUICtrlSetBkColor($B2,0xCCCCCC)
GUICtrlSetState($B1,64)
GUICtrlSetData($CB1,'')
FileClose($F)
EndFunc
; Проверка на повторный запуск
Func RUNONCE($ID)
Local $MUTEX=DllCall('kernel32.dll','handle','CreateMutexW','ptr',0,'bool',1,'wstr',$ID)
If @error Then Return SetError(@error,@extended,0)
Local $ERROR=DllCall('kernel32.dll','dword','GetLastError')
If @error Then Return SetError(@error,@extended,0)
If $ERROR[0]=183 Then Return SetError($ERROR[0],$ERROR[0],0)
Return $MUTEX[0]
EndFunc
; КОНЕЦ