Applescript - как добиться функциональности очереди - PullRequest
0 голосов
/ 15 января 2019

Я пишу скрипт для конвертирования видео в формат h.265, который использует repeat with для просмотра всех видео. Он отлично работает для 3 или 4 файлов одновременно, но мой старый Mac перезагружается, когда количество видео достигает ~ 50.

repeat with videofile in video_list
    set filePath to POSIX path of videofile
    set filePath to esc_space(filePath)
    set [folderPath, filename] to split_path_name(filePath)

    tell application "Terminal"
        activate
        do script with command "ffmpeg -hide_banner -i " & filePath & " -vcodec libx265 -tag:v hvc1 " & folderPath & filename & "_hevc.mp4; mv " & filePath & " ~/.Trash"
    end tell
end repeat

Поэтому я хочу использовать applecript для достижения функциональности «Очередь»: конвертировать ограниченное количество видео в окнах терминала (скажем, 10) и отслеживать, завершилось ли выполнение каких-либо окон, активировать некоторые оставшиеся задачи, если число активных окон меньше чем 10.

Я провел несколько поисков и обнаружил, что системное событие может сказать, запущены ли приложения, но я не уверен, как отслеживать несколько окон, особенно новые окна будут активированы после завершения некоторых задач.

Любые предложения приветствуются. (скрипт оболочки также приветствуется, если это удобно)

1 Ответ

0 голосов
/ 16 января 2019

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

Поскольку список в AppleScript не может быть изменен (поправьте меня, если я ошибаюсь), я должен использовать индекс для циклического просмотра моих видео вместо получения 1-го элемента, а затем удалить его из списка:

set next_video_index to 1

Следующий бесконечный цикл repeat предназначен для контроля количества активных окон терминала, которое считается System Events. Это не лучшее решение, потому что System Events считает все окна, включая те, которые были открыты пользователем вручную.

repeat while true
    tell application "System Events"
        tell application "Terminal"
            set window_count to (count of windows)
        end tell
    end tell

if оператор помогает начать новую задачу конвертации, когда количество окон терминала не достигает максимума (в моем коде установлено значение 5) и не все видео конвертируются.

Следует отметить, что ; exit в конце скрипта терминала гарантирует, что окно завершенной задачи не испортит счетчик окон, но сначала вам нужно изменить настройки терминала, см. Эту ссылку: OSX - Как автоматически закрыть окно терминала после выполнения команды «выход».

    set task_not_finished to (next_video_index ≤ length of video_list)

    if (window_count < 5) and task_not_finished then
        set filePath to POSIX path of item next_video_index in video_list
        set filePath to esc_space(filePath)
        set [folderPath, filename] to split_path_name(filePath)
        set next_video_index to next_video_index + 1

        tell application "Terminal"
            activate
            do script with command "ffmpeg -hide_banner -i " & filePath & " -vcodec libx265 -tag:v hvc1 " & folderPath & filename & "_hevc.mp4; mv " & filePath & " ~/.Trash; exit"
        end tell
    end if

Когда последнее видео конвертируется, пора заканчивать цикл повторения.

    if not task_not_finished then exit repeat
    delay 1
end repeat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...