Что нового

Сеть, интернет Загрузка видео с Яндекс.Видео

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Версия AutoIt
3.3.16.0
Версия
1.0
AutoIt: 3.3.16.0
Версия: 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

; КОНЕЦ
 
Верх