Может ли AppleScript определить, воспроизводится ли Netflix или YouTube?

У меня есть скрипт, который определяет, воспроизводит ли QuickTime Player что-то в целом , но мне также нужен способ определить, воспроизводит ли Safari что-то конкретное, например Netflix или YouTube, но если бы он вообще мог обнаружить какую-либо игровую активность, это было бы лучше.

on mySay(p, myMessage)
    if application "QuickTime Player" is running then
        tell application "QuickTime Player" to set isQTplaying to ¬
            ((documents whose playing is true) is not {}) as boolean
    else
        set isQTplaying to false
    end if
        
    if isQTplaying then
        return
    else
        set myVolumeBefore to output volume of (get volume settings)
        set volume output volume p
        say myMessage
        set volume output volume myVolumeBefore
    end if
end mySay
На самом деле это мой пост, но в нем не было решения для Safari, поэтому я опубликовал его специально для этого.
Вероятно, вы могли бы получить URL-адреса открытых в данный момент вкладок из Safari.
Но это не сказало бы мне, правильно ли он играет?
Какая версия macOS и Safari у вас установлена?
Мы можем захотеть закрыть то или иное, как только у нас будут ответы, или объединить их. «Воспроизводится» специально для видео или вам нужен какой-либо звук, чтобы вы могли приглушить другой вывод?
@ user3439894 11.5.2 и 14.1.2
@bmike Мне бы очень хотелось, чтобы это было для ЛЮБОГО аудио. Может быть, есть лучший способ вместо обнаружения на уровне приложения? Может быть, обнаружение на уровне звукового ядра?

Ответы (2)

Вот один из способов проверить, воспроизводится ли видео в Safari .

Пример кода AppleScript :

if (do shell script "pmset -g | grep -m 1 'displaysleep'") ¬
    contains "display sleep prevented by Safari" then
    
    --  # Video is playing.
    --  # Do something when video is playing.
    
else
    
    --  # Video is not playing.
    --  # Do something else when video is not playing.
    
end if

Примечания:

Протестировано в macOS Catalina .

Предложение contains "display sleep prevented by Safari"может фактически только содержать, contains "Safari"и это будет работать. Если у вас, например, Firefox воспроизводит видео, вы должны использовать его только firefoxв этом пункте и только Google Chromeдля Google Chrome .

Вообще говоря, круглые скобки вокруг do shell script команды не нужны, за исключением этого варианта использования, позволяющего использовать символ продолжения строки, который ¬должен быть размещен там, где он есть.

Увлекательно и ++! Интересно, могут ли другие команды браузера активировать «предотвратить спящий режим» по причинам, отличным от видеоплеера, но это неожиданно круто.
@bmike, RE: «Интересно, могут ли другие команды браузера запускать «предотвращение спящего режима» по причинам, отличным от видеоплеера». Однако не уверен в этом, если в обычном окне, протестированном в macOS Catalina , работает tell application "System Events" to if exists (buttons of group 2 of toolbar 1 of window 1 of application process "Safari" whose description contains "Mute This Tab") then return trueдля все, что производит звуковой сигнал в Safari .
Спасибо, что развлекли меня и ответили на вопрос. Весьма признателен
@bmike, для потока только аудио в Firefox и Google Chrome вы можете использовать, например, if (do shell script "pmset -g | grep -m 1 'sleep'") contains "firefox" thenили для Google Chrome contains "Google Chrome" , однако для Safari это не является окончательным и сообщает только sleep prevented by coreaudiodпри использовании 'sleep', и почему я дал вам решение для сценариев пользовательского интерфейса в предыдущем комментарии.
@user3439894 user3439894 Я собираюсь использовать то, что вы опубликовали, хотя мне не удалось заставить его работать в FireFox или Safari. Однако он работал в Brave Browser, который я в основном использовал. Я просто проверю на «предотвращение перехода в спящий режим», поэтому мне не нужно тестировать отдельные приложения. Это работало и для QTP, и для VLC.
@ Стив Торренс, то, что я опубликовал, в конце концов, всего лишь пример , и вы можете использовать его pmset -gв Терминале , чтобы увидеть, как он меняется, когда различные браузеры / приложения меняют свой параметр , когда видео и / или просто звук воспроизводится / не воспроизводится, и посмотреть, что лучше всего протестировать. В своем вопросе вы упомянули Netflix , YouTube и Safari и никогда не упоминали другие браузеры/приложения в качестве цели ответа. Между тем, что я включил в свой ответ, и комментариями к bmike, я уверен, что код можно изменить, чтобы приспособиться.
@user3439894 user3439894 для проверки звука в целом я изменил его на: если (выполнить сценарий оболочки «pmset -g | grep -m 1 'sleep'») ¬ не содержит «coreaudiod», то завершить, если по какой-то причине он не работает. - Я думаю, причина может быть в том, что coreaudiod отображается в списке, даже когда ничего не воспроизводится. Так что это не надежная проверка.
@ Стив Торренс, пожалуйста, поймите, что то, что представлено в ответе, является примером и не предназначено для того, чтобы быть универсальным решением для всего, поскольку вопрос был сосредоточен на Netflix , YouTube и Safari, как вы, в конце концов, сказали: «Мне также нужен способ определить, воспроизводит ли Safari что-то конкретное, например Netflix или YouTube», и основная мысль моего ответа заключается в этом. Если вы хотите получить все сразу, вам нужно провести исследование и разработать метод, который удовлетворит все ваши потребности, поскольку Ask Different не является службой написания кода. Я считаю, что Netflix , а YouTube только воспроизводит видео.

Хотел опубликовать окончательное решение, которое я в итоге использовал. На основе примера @user3439894.

on mySay(p, myMessage)
    if (do shell script "pmset -g | grep -m 1 'displaysleep'") ¬
        does not contain "prevented" then
        set myVolumeBefore to output volume of (get volume settings)
        set volume output volume p
        say myMessage
        set volume output volume myVolumeBefore
    end if
end mySay