Что нового

перехват буфера и запуск консольной программы

bambino

Новичок
Сообщения
2
Репутация
0
Версия AutoIt: v3.3.14.5

Здравствуйте. Прошу написать следующий скрипт:
При запуске скрипт запускает консольную программу youtube-dl.exe --update. Если неудача выдает сообщение???
Далее скрипт после окончания обновления youtube-dl сидит в трее и мониторит буфер обмена. Как только в буфере появляется текст начинающийся как "https://www.youtube.com" всплывает гуи. В гуи есть чекбоксы выбор качества - 720р, 1024р, лучшее, только аудио. В гуи есть кнопки скачать, посмотреть, отмена.

Если нажать кнопку "скачать" запускается скачивание. У меня это выглядит вот так, я по другому не умею:
Код:
RunWait (@ScriptDir & '\youtube-dl.exe --config-location '& @ScriptDir& '\config_file.txt --batch-file 1_download_file_list720.txt --format bestvideo[height<=720]+bestaudio/best', @ScriptDir, @SW_MINIMIZE)

1_download_file_list720.txt это список ссылок на скачивание. Я не знаю как передать ссылку напрямую, вот как это описано в справке:
-a, --batch-file FILE File containing URLs to download ('-' for stdin), one URL per line. Lines starting with '#', ';' or ']' are considered as comments and ignored.

--format в соответствии с чекбоксами может принимать следующие значения:
bestvideo[height<=720]+bestaudio/best
bestvideo[height=1080]+bestaudio/best
bestvideo+bestaudio/best
bestaudio

При нажатии кнопки посмотреть запускается: (у меня есть только строка из бат файла)
youtube-dl.exe -f %playformat% -q -o- %url% | mplayer.exe -cache 8192 -
где set playformat="22/18/url720/best/url360/medium"

При нажатии кнопки отмена очищается буфер обмена.

В идеале настройки хранить в файле *.ini чтобы проще было изменять, например форматы скачивания и путь к плэйеру.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

Global $sConfig_File = @ScriptDir & '\Config.ini'

Global $sDwnld_Format = IniRead($sConfig_File, 'Main', 'Download Format', '720p')
Global $sPlayer = IniRead($sConfig_File, 'Main', 'Player', @ScriptDir & '\mplayer.exe -cache 8192')
Global $sYouTube_DL = IniRead($sConfig_File, 'Main', 'Youtube-DL', @ScriptDir & '\youtube-dl.exe')
Global $sYT_Config = IniRead($sConfig_File, 'Main', 'Youtube-Config', @ScriptDir & '\youtube-dl_config.txt')

_Check_Update()

$hGUI = GUICreate('YouTube DL', 300, 200, -1, -1, -1, $WS_EX_TOPMOST)

$i720_Radio = GUICtrlCreateRadio('720p', 20, 20)
GUICtrlSetState($i720_Radio, $GUI_CHECKED)
$i1024_Radio = GUICtrlCreateRadio('1024p', 20, 40)
$iBest_Radio = GUICtrlCreateRadio('Лучшее', 20, 60)
$iAudio_Radio = GUICtrlCreateRadio('Только аудио', 20, 80)

For $i = $i720_Radio To $iAudio_Radio
    If GUICtrlRead($i, 1) = $sDwnld_Format Then
        GUICtrlSetState($i, $GUI_CHECKED)
    EndIf
Next

$iURL_Input = GUICtrlCreateInput('', 20, 130, 260, 20, BitOR($ES_LEFT, $ES_AUTOHSCROLL, $ES_READONLY))

$iDwnld_Bttn = GUICtrlCreateButton('Скачать', 20, 170, 70, 20)
$iPlay_Bttn = GUICtrlCreateButton('Посмотреть', 115, 170, 70, 20)
$iCancel_Bttn = GUICtrlCreateButton('Отмена', 210, 170, 70, 20)

AdlibRegister('_Check_ClipBoard', 10)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            For $i = $i720_Radio To $iAudio_Radio
                If GUICtrlRead($i) = $GUI_CHECKED Then
                    IniWrite($sConfig_File, 'Main', 'Download Format', GUICtrlRead($i, 1))
                EndIf
            Next
            
            Exit
        Case $iCancel_Bttn
            AdlibRegister('_Check_ClipBoard', 10)
            GUISetState(@SW_HIDE, $hGUI)
        Case $iDwnld_Bttn
            Select
                Case GUICtrlRead($i720_Radio) = $GUI_CHECKED
                    $sFormat = 'bestvideo[height<=720]+bestaudio/best'
                Case GUICtrlRead($i1024_Radio) = $GUI_CHECKED
                    $sFormat = 'bestvideo[height<=1024]+bestaudio/best'
                Case GUICtrlRead($iBest_Radio) = $GUI_CHECKED
                    $sFormat = 'bestvideo+bestaudio/best'
                Case Else
                    $sFormat = 'bestaudio'
            EndSelect
            
            GUISetState(@SW_HIDE, $hGUI)
            RunWait('"' & $sYouTube_DL & '" ' & GUICtrlRead($iURL_Input) & ' --config-location "' & $sYT_Config & '" --format ' & $sFormat, @ScriptDir, @SW_HIDE)
        Case $iPlay_Bttn
            If Not FileExists($sPlayer) Then
                MsgBox(48, @ScriptName, 'Player not found.', 0, $hGUI)
                ContinueLoop
            EndIf
            
            Local $sPlayFormat = '22/18/url720/best/url360/medium'
            Run('"' & $sYouTube_DL & '" -f ' & $sPlayFormat & ' -q -o- ' & GUICtrlRead($iURL_Input) & ' | ' & $sPlayer, @ScriptDir, @SW_HIDE)
    EndSwitch
WEnd

Func _Check_Update()
    If Not FileExists($sYouTube_DL) Then
        MsgBox(16, @ScriptName, 'youtube-dl not found.')
        Exit
    EndIf
    
    Local $iPID = Run(@ComSpec & ' /C "' & $sYouTube_DL & '" --update', @ScriptDir, @SW_HIDE, 6)
    ProcessWaitClose($iPID)
    
    If Not StringInStr(StdoutRead($iPID), 'youtube-dl is up-to-date') Then
        MsgBox(48, @ScriptName, 'youtube-dl should be updated, please restart.')
        Exit
    EndIf
EndFunc

Func _Check_ClipBoard()
    Local $sCB = ClipGet()
    
    If StringRegExp($sCB, '^https://(?:www\.)?youtube\.com') Then
        AdlibUnRegister('_Check_ClipBoard')
        ClipPut('')
        GUICtrlSetData($iURL_Input, $sCB)
        GUISetState(@SW_SHOWNORMAL, $hGUI)
    EndIf
EndFunc


mplayer.exe, youtube-dl.exe и youtube-dl_config.txt должны лежать в папке со скриптом.
Особо не тестировал.
 
Автор
B

bambino

Новичок
Сообщения
2
Репутация
0
Спасибо вам большое, ближе к выходным потестирую.
Сообщение автоматически объединено:

Положение радиобокса записывается в ини файл только при закрытии на крестик. Не записывается при нажатии кнопок скачать, посмотреть и отмена, так же не записывается при закрытии скрипта из трея. Лучше бы они запоминались при каждом изменении.
Попытался найти как сделать чтобы окно командной строки не закрывалось по окончании, чтобы прочитать ошибки. Не нашел. Это возможно?
 
Последнее редактирование:
Верх