¿AppleScript puede detectar si se está reproduciendo Netflix o YouTube?

Tengo un script que detecta si QuickTime Player está reproduciendo algo en general , pero también necesito una forma de detectar si Safari está reproduciendo algo específico como Netflix o YouTube, pero si pudiera detectar cualquier actividad de reproducción, sería mejor.

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
En realidad, esa es mi publicación, pero no tenía una solución para Safari, por lo que la volví a publicar específicamente para eso.
Probablemente podría obtener las URL de las pestañas actualmente abiertas de Safari.
Pero eso no me diría si estaba jugando ¿no?
¿ Qué versión de macOS y Safari estás ejecutando?
Es posible que queramos cerrar esto o aquello una vez que tengamos respuestas o fusionarlas. ¿Está “reproduciendo” específicamente para video o desea algún audio para poder esquivar otra salida?
@user3439894 11.5.2 y 14.1.2
@bmike Realmente me gustaría para CUALQUIER audio. ¿Quizás hay una mejor manera en lugar de detectar en el nivel de la aplicación? ¿Quizás detectando en la capa central de audio?

Respuestas (2)

Esta es una manera de probar si el video se está reproduciendo en Safari .

Ejemplo de código 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

Notas:

Probado en macOS Catalina .

La contains "display sleep prevented by Safari"cláusula en realidad solo podría contener contains "Safari"y funcionaría. Si tiene, por ejemplo, Firefox reproduciendo video, usaría solo firefoxen esa cláusula, y solo Google Chromepara Google Chrome .

En términos generales, los paréntesis alrededor del do shell script comando no son necesarios, excepto en este caso de uso para permitir que el uso del carácter de continuación de línea, ¬se haya colocado donde está.

Fascinante y ++! Me pregunto si otros comandos del navegador pueden activar el "estado de prevención de suspensión" por razones distintas a un reproductor de video, pero esto es inesperadamente increíble.
@bmike, RE: "Me pregunto si otros comandos del navegador pueden activar "prevenir el estado de suspensión" por razones distintas a un reproductor de video". Sin embargo, no estoy seguro de eso, si en una ventana normal, probada en macOS Catalina , funciona 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 truepara cualquier cosa que produzca una señal de audio en Safari .
Gracias amablemente por entretener una pregunta de seguimiento y clavarla. Muy agradecido
@bmike, para una transmisión de solo audio en Firefox y Google Chrome, puede usar, por ejemplo, if (do shell script "pmset -g | grep -m 1 'sleep'") contains "firefox" theno para Google Chrome contains "Google Chrome" , sin embargo, para Safari no es definitivo y solo informa sleep prevented by coreaudiodcuando se usa 'sleep', y por eso le di una solución de UI Scripting en el comentario anterior.
@ user3439894 Voy a usar lo que publicaste aunque no pude hacerlo funcionar en FireFox o Safari. Sin embargo, funcionó en Brave Browser, que es principalmente lo que estaría usando. Solo probaré si "se ha impedido la suspensión de la pantalla" para no tener que probar aplicaciones individuales. También funcionó para QTP y VLC.
@Steve Torrence, lo que publiqué es, después de todo, solo un ejemplo , y puede usarlo pmset -gen la Terminal para ver cómo cambia cuando los distintos navegadores/aplicaciones cambian su opción cuando el video y/o solo el audio se reproduce/no se reproduce y ver qué es mejor para probar contra. En su pregunta mencionó Netflix , YouTube y Safari y nunca mencionó otros navegadores/aplicaciones como objetivo de la respuesta. Entre lo que incluí en mi respuesta y los comentarios a bmike, estoy seguro de que el código se puede modificar para adaptarse.
@ user3439894 para verificar el audio en general, lo cambié a: si (do shell script "pmset -g | grep -m 1 'sleep'") ¬ no contiene "coreaudiod" luego finalice si Por alguna razón no funciona. – Creo que la razón podría ser que coreaudiod aparece en la lista incluso cuando no se está reproduciendo nada. Así que no es un cheque confiable.
@Steve Torrence, comprenda que lo que se presenta en la respuesta es un ejemplo y no pretende ser una solución general para todo, ya que la pregunta se centró en Netflix , YouTube y Safari , ya que después de todo dijo "También necesito un forma de detectar si Safari está reproduciendo algo específico como Netflix o YouTube" y el punto principal de mi respuesta es eso. Si desea obtener todo lo que necesita, debe investigar e idear un método que satisfaga todas sus necesidades, ya que Ask Different no es un servicio de escritura de código. Creo que Netflix y YouTube solo reproducen videos.

Quería publicar la solución final que terminé usando. Basado en el ejemplo de @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