¿Cómo pausar el video de YouTube a través del atajo de teclado o desde la barra de menú?

17

¿Existe un software que permita pausar (y pausar) un video de YouTube que se está reproduciendo actualmente (o, idealmente, cualquier medio de video / audio en línea), con un atajo de teclado o un botón convenientemente accesible (por ejemplo, un botón que se encuentra en la barra de menú, ubicada en la parte superior derecha de la pantalla)? Cuantos menos clics necesarios, mejor.

La clave aquí es que quiero poder pausar el video en cualquier aplicación, es decir, cuando Google Chrome no es la aplicación principal (por ejemplo, TextEdit o Microsoft Word es la aplicación principal).

iOS tiene este acceso directo incorporado. Si se desliza desde la parte inferior de la pantalla hacia la parte superior, aparecen los controles multimedia. Estos controles pueden manipular todo el audio que se origina en una pestaña Safari.

Mi navegador web es Google Chrome.

OS X El Capitan, versión 10.11.6.


También estaría dispuesto a lograr esto con un AppleScript (que luego se puede asignar a una combinación de teclas en FastScripts.app). Pero no puedo imaginar que una tarea tan compleja sea posible a través de AppleScript.

esfera de rubik
fuente
1
Entonces, ¿estás buscando una solución de barra de menú en lugar de solo tocar la barra espaciadora? ¿O haciendo clic con el mouse en el botón Reproducir / Pausa?
Monomeeth
1
@ Monomeeth Por favor vea mi edición. Olvidé mencionar que Chrome no es la aplicación activa; el video se reproduce en segundo plano. Entonces, para pausar el video, tengo que hacer clic en la ventana de Chrome, hacer clic en la pestaña que contiene el video, y solo entonces puedo usar la barra espaciadora o hacer clic con el botón izquierdo para pausar el video.
esfera de rubik
1
estás buscando algo así como si entendiera la pregunta: beardedspice.github.io
enzo
@enzo He descargado BeardedSpice y es exactamente lo que estoy buscando. BeardedSpice es perfecto para mis necesidades. Si desea publicar esto como respuesta, con gusto lo aceptaré. ¡Gracias!
esfera de rubik
De hecho, me pregunto por qué Google no ha hecho que el botón Reproducir / Pausa del teclado (F8) funcione para YouTube, dado que funciona como se esperaba cuando visita Google Play Music en Chrome.
calum_b

Respuestas:

19

********** SOLUCIÓN ACTUALIZADA **********

Esta actualización es una solución directa a la pregunta original del OP.

El siguiente código AppleScript agregará un elemento de menú de estado "Reproducir / Pausar YouTube" con las opciones para reproducir o pausar cualquier video de YouTube en Google Chrome o Safari, ya sea que los navegadores sean visibles o no. Guarde el siguiente código AppleScript como una aplicación "permanecer abierta" en Script Editor.app.

use framework "Foundation"
use framework "AppKit"
use scripting additions

property StatusItem : missing value
property selectedMenu : ""
property defaults : class "NSUserDefaults"
property internalMenuItem : class "NSMenuItem"
property externalMenuItem : class "NSMenuItem"
property newMenu : class "NSMenu"

my makeStatusBar()
my makeMenus()

on makeStatusBar()
    set bar to current application's NSStatusBar's systemStatusBar
    set StatusItem to bar's statusItemWithLength:-1.0
    -- set up the initial NSStatusBars title
    StatusItem's setTitle:"Play/Pause YouTube"
    -- set up the initial NSMenu of the statusbar
    set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
    newMenu's setDelegate:me (*
    Requied delegation for when the Status bar Menu is clicked  the menu will use the delegates method (menuNeedsUpdate:(menu)) to run dynamically update.*)
    StatusItem's setMenu:newMenu
end makeStatusBar

on makeMenus()
    newMenu's removeAllItems() -- remove existing menu items
    set someListInstances to {"Play/Pause YouTube - Safari", "Play/Pause YouTube - Chrome", "Quit"}
    repeat with i from 1 to number of items in someListInstances
        set this_item to item i of someListInstances
        set thisMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:this_item action:("someAction" & (i as text) & ":") keyEquivalent:"")
        (newMenu's addItem:thisMenuItem)
        (thisMenuItem's setTarget:me) -- required for enabling the menu item
    end repeat
end makeMenus

on someAction1:sender
    clickClassName2("ytp-play-button ytp-button", 0)
end someAction1:

on someAction2:sender
    clickClassName("ytp-play-button ytp-button", 0)
end someAction2:

on someAction3:sender
    quit me
end someAction3:

to clickClassName2(theClassName, elementnum)
    if application "Safari" is running then
        try
            tell application "Safari"
                tell window 1 to set current tab to tab 1 whose URL contains "youtube"
                do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1
            end tell
        end try
    end if
end clickClassName2

to clickClassName(theClassName, elementnum)
    tell application "Google Chrome" to (tabs of window 1 whose URL contains "youtube")
    set youtubeTabs to item 1 of the result
    tell application "Google Chrome"
        execute youtubeTabs javascript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();"
    end tell
end clickClassName

ingrese la descripción de la imagen aquí

Si desea que su nuevo ... Play Pause YouTube Status Menu.app solo esté visible en el menú de estado y no en el Dock, puede hacer clic con el botón derecho en la aplicación en Finder y seleccionar la opción "Mostrar contenido del paquete". En la carpeta Contenido, abra el archivo Info.plist en cualquier editor de texto y agregue las siguientes dos líneas. Luego guarde y cierre ese archivo.

<key>LSBackgroundOnly</key>
<true/>

Si no se siente cómodo editando el archivo .plist directamente, el siguiente código AppleScript le permitirá elegir la aplicación que se ocultará del Dock cuando se esté ejecutando.

Si la aplicación elegida ya está configurada para ocultarse del Dock, la única opción que se le dará es mostrar que la aplicación no estará visible en el Dock mientras se está ejecutando ... Y viceversa.

Este script es especialmente útil para que las "aplicaciones abiertas" ocultas con los iconos de aplicaciones de los manejadores inactivos aparezcan en el Dock mientras se ejecutan.

property fileTypes : {"com.apple.application-bundle"}
property plistFileItem : "  <key>LSBackgroundOnly</key>" & linefeed & " <true/>"

activate
set chosenApp to (choose application with prompt ¬
    "Choose  The Application You Want Hidden From The Dock While It Is Running" as alias)

tell application "System Events" to set appName to name of chosenApp
set plistFile to ((POSIX path of chosenApp) & "/Contents/info.plist") as string
set plistFileContents to (read plistFile)
set plistFileItemExists to plistFileItem is in plistFileContents

if plistFileItemExists then
    activate
    set theChoice to button returned of (display dialog ¬
        "Would you like to un-hide " & quote & appName & quote & ¬
        " from the Dock while it's running?" buttons {"Cancel", "Un-Hide"} ¬
        default button 2 cancel button 1 with title "Make A Choice")
else
    activate
    set theChoice to button returned of (display dialog ¬
        "Would you like to hide " & quote & appName & quote & ¬
        " from the Dock while it's running?" buttons {"Cancel", "Hide"} ¬
        default button 2 cancel button 1 with title "Make A Choice")
end if

if theChoice is "Hide" then
    tell application "System Events" to tell contents of property list file plistFile ¬
        to make new property list item at end with properties ¬
        {kind:string, name:"LSBackgroundOnly", value:true}
else if theChoice is "Un-Hide" then
    tell application "System Events" to tell contents of property list file plistFile ¬
        to make new property list item at end with properties ¬
        {kind:string, name:"LSBackgroundOnly", value:false}
else
    return
end if


************ SOLUCIÓN ORIGINAL ************

Este script hará clic en el botón Reproducir / Pausa en un video que se reproduce en YouTube en Google Chrome, independientemente de si Google Chrome está visible o no.

to clickClassName(theClassName, elementnum)
    tell application "Google Chrome" to (tabs of window 1 whose URL contains "youtube")
    set youtubeTabs to item 1 of the result
    tell application "Google Chrome"
        execute youtubeTabs javascript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();"
    end tell
end clickClassName    

clickClassName("ytp-play-button ytp-button", 0)

Esta es la versión del script para trabajar con Safari

to clickClassName2(theClassName, elementnum)
    tell application "Safari"
        tell window 1 to set current tab to tab 1 whose URL contains "youtube"
        do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1
    end tell
end clickClassName2

clickClassName2("ytp-play-button ytp-button", 0)

En un esfuerzo por dar a OP una solución AppleScript completa, he llevado mi respuesta original un paso más allá.

ACTUALIZAR

Finalmente lo resolví. Creé una aplicación AppleScript en Xcode. Originalmente, mi proyecto solo comenzó con una ventana de un botón para controlar los videos de YouTube actualmente activos en Chrome o Safari. Este proyecto se ha convertido un poco en una aplicación que contiene varias utilidades. Este GIF muestra el botón de pausa de YouTube que controla YouTube en Chrome y Safari. Enlacé las acciones del botón al AppleScript que escribí originalmente en el editor de scripts.

ingrese la descripción de la imagen aquí

Esta es una instantánea de la aplicación Xcode Trabajando en el archivo AppDelegate.applescript.

ingrese la descripción de la imagen aquí

Aquí está el código en ese archivo que creé para que el programa funcione.

script AppDelegate

    property parent : class "NSObject"


    -- IBOutlets
    property theWindow : missing value

    to clickClassName(theClassName, elementnum) -- Handler for pausing YouTube in Chrome
        if application "Google Chrome" is running then
            try
                tell application "Google Chrome" to (tabs of window 1 whose URL contains "youtube")
                set youtubeTabs to item 1 of the result
                tell application "Google Chrome"
                    execute youtubeTabs javascript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();"
                end tell
            end try
        end if
    end clickClassName

    to clickClassName2(theClassName, elementnum) -- Handler for pausing YouTube in Safari
        if application "Safari" is running then
            try
                tell application "Safari"
                    tell window 1 to set current tab to tab 1 whose URL contains "youtube"
                    do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1
                end tell
            end try
        end if
    end clickClassName2

    on doSomething:sender -- Calls the Chrome YouTube Handler
        clickClassName("ytp-play-button ytp-button", 0)
    end doSomething:

    on doSomething14:sender -- Calls the Safari YouTube Handler
        clickClassName2("ytp-play-button ytp-button", 0)
    end doSomething14:

    on doSomething2:sender -- Hide and or show the Menu Bar
        tell application "System Preferences"
            reveal pane id "com.apple.preference.general"
        end tell
        tell application "System Events" to tell process "System Preferences" to tell window "General"
            click checkbox "Automatically hide and show the menu bar"
        end tell
        delay 1
        quit application "System Preferences"
    end doSomething2:

    on doSomething3:sender -- Sets Display resolution to the second lowest setting (15 inch Built In Retina Display - MBP)
        tell application "System Preferences"
            reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
        end tell
        tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
            click radio button "Scaled" of radio group 1 of tab group 1
            click radio button 2 of radio group 1 of group 1 of tab group 1
        end tell
        quit application "System Preferences"
    end doSomething3:

    on doSomething4:sender -- Sets Display resolution to the second highest setting (15 inch Built In Retina Display - MBP)
        tell application "System Preferences"
            reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
        end tell
        tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
            click radio button "Scaled" of radio group 1 of tab group 1
            click radio button 4 of radio group 1 of group 1 of tab group 1
        end tell
        quit application "System Preferences"
    end doSomething4:

    on doSomething5:sender -- Sets Display resolution to the highest setting (15 inch Built In Retina Display - MBP)
        tell application "System Preferences"
            reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
        end tell
        tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
            click radio button "Scaled" of radio group 1 of tab group 1
            click radio button 5 of radio group 1 of group 1 of tab group 1
        end tell
        quit application "System Preferences"
    end doSomething5:

    on doSomething6:sender -- Sets Display resolution to the lowest setting (15 inch Built In Retina Display - MBP)
        tell application "System Preferences"
            reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
        end tell
        tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
            click radio button "Scaled" of radio group 1 of tab group 1
            click radio button 1 of radio group 1 of group 1 of tab group 1
            delay 0.1
            click button "OK" of sheet 1
            quit application "System Preferences"
        end tell
    end doSomething6:

    on doSomething7:sender -- Displays a dialog with your current IP
        tell current application to display dialog (do shell script "curl ifconfig.io") with icon 2 buttons "OK" default button 1 with title "Your Current IP Address Is.." giving up after 5
    end doSomething7:

    on doSomething8:sender -- Shows hidden files in Finder
        do shell script "defaults write com.apple.finder AppleShowAllFiles TRUE\nkillall Finder"
    end doSomething8:

    on doSomething9:sender -- Hides hidden files in Finder if they are showing
        do shell script "defaults write com.apple.finder AppleShowAllFiles FALSE\nkillall Finder"
    end doSomething9:

    on doSomething10:sender  -- Brightness Highest
        tell application "System Preferences"
            reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
        end tell
        tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
        set value of value indicator 1 of slider 1 of group 2 of tab group 1 to 12
        end tell
        quit application "System Preferences"
    end doSomething10:

    on doSomething11:sender -- Brightness Lowest
        tell application "System Preferences"
            reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
        end tell
        tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
        set value of value indicator 1 of slider 1 of group 2 of tab group 1 to 0.1
        end tell
        quit application "System Preferences"
    end doSomething11:

    on doSomething12:sender -- Zoom
        tell application "System Events"
            key code 28 using {command down, option down}
        end tell
    end doSomething12:

    on doSomething13:sender -- Dictation On/Off
        tell application "System Events"
            keystroke "x" using {option down}
        end tell
    end doSomething13:

    on doSomething15:sender -- Enables Screensaver as Desktop background
        tell application "System Events"
            do shell script "/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background"
        end tell
    end doSomething15:

    on doSomething16:sender -- Kills Screensaver Desktop background
        try
            tell application id "com.apple.ScreenSaver.Engine" to quit
        end try
    end doSomething16:


    on applicationWillFinishLaunching:aNotification
        -- Insert code here to initialize your application before any files are opened

    end applicationWillFinishLaunching:

    on applicationShouldTerminate:sender
        -- Insert code here to do any housekeeping before your application quits


        return current application's NSTerminateNow
    end applicationShouldTerminate:

    on applicationShouldTerminateAfterLastWindowClosed:sender -- Quits app when clicking red x

        return TRUE

    end applicationShouldTerminateAfterLastWindowClosed:

end script

Actualicé el código para que la pestaña de YouTube en Chrome no tenga que ser la pestaña visible o activa al hacer clic en el botón de pausa de YouTube creado en Xcode

Aquí hay un enlace para descargar todo el proyecto Xcode

ingrese la descripción de la imagen aquí

ADVERTENCIA: La función de protector de pantalla de escritorio congelará la aplicación. Después de forzar el cierre y la reapertura, funcionará la función de protector de pantalla del escritorio para salir del protector de pantalla activo.

Consideraciones posteriores: Probablemente debería haber envuelto cada uno de los códigos AppleScript en declaraciones de "prueba" para evitar todo tipo de mensajes de error para aquellos que juegan con este proyecto, que no tienen el mismo sistema y tipo de computadora que yo. (MacBook Pro 15 "OS Sierra 10.12.6)

Para que la función de zoom funcione, debe estar habilitada en las preferencias del sistema.

ingrese la descripción de la imagen aquí

Para que la activación de "Dictado activado / desactivado" funcione correctamente, el atajo para habilitar los comandos de dictado en las preferencias del sistema debe coincidir con el acceso directo utilizado en el script

ingrese la descripción de la imagen aquí

on doSomething13:sender -- Dictation On/Off
    tell application "System Events"
        keystroke "x" using {option down}
    end tell
end doSomething13:

Actualmente estoy trabajando en la capacidad de alternar entre la aplicación que se ejecuta en la ventana o la barra de menú solamente

wch1zpink
fuente
Dejando de lado display dialing ..., solo necesita esta línea de código tell application "Google Chrome" to execute front window's active tab javascript "document.getElementsByClassName('ytp-play-button ytp-button')['0'].click();". Dado que el OP quiere "pausar (y pausar) un video de YouTube que se está reproduciendo actualmente", Google ya está abierto y podría minimizarse con la pestaña activa que se reproduce y la mencionada línea de código actuará sobre él. Por lo tanto, no es necesario activar la ventana o como en su código, use launchya que esto es lo que se indica en la documentación, continúa en el próximo comentario ...
user3439894
3
¡Esta es una solución muy inteligente! Decidí ir con el programa de terceros, BeardedSpice, como se sugirió anteriormente en un comentario de enzo, porque BeardedSpice funciona incluso si la ventana de Chrome que contiene el video está minimizada, y esta ventana de Chrome seguirá minimizada. BeardedSpice también funciona con una letanía de reproductores multimedia en línea (no solo YouTube). Pero, estoy sorprendido de que hayas descubierto cómo hacer esto en AppleScript.
esfera de rubik
1
Sería muy bueno si comprimieras los archivos del proyecto Xcode y proporcionaras un enlace de descarga para el archivo. :)
user3439894
1
Solo estoy limpiando el código un poco y haré lo que me pidas en breve :)
wch1zpink
1
Gracias por compartir los archivos del proyecto. Si pudiera votar tu respuesta nuevamente, lo haría. :)
user3439894
1

Aquí está cómo entrar en la barra de menú con AppleScript puro. Guardar como aplicación con stay open after run handler:

PD: robé el código para las funciones de reproducción / pausa reales de @ wch1zpink, así que por favor, vota también su respuesta

--AppleScript: menu bar script -- Created 2017-03-03 by Takaaki Naganoya adapted by Josh Brown
--2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
--http://piyocast.com/as/archives/4502

property aStatusItem : missing value

on run
    init() of me
end run

on init()
    set aList to {"Google Chrome", "⏯", "", "Safari", "⏯​", "", "Quit"}
    set aStatusItem to current application's NSStatusBar's systemStatusBar()'s statusItemWithLength:(current application's NSVariableStatusItemLength)

    aStatusItem's setTitle:"🎛"
    aStatusItem's setHighlightMode:true
    aStatusItem's setMenu:(createMenu(aList) of me)
end init

on createMenu(aList)
    set aMenu to current application's NSMenu's alloc()'s init()
    set aCount to 1
    repeat with i in aList
        set j to contents of i
        if j is not equal to "" then
            set aMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:j action:"actionHandler:" keyEquivalent:"")
        else
            set aMenuItem to (current application's NSMenuItem's separatorItem())
        end if
        (aMenuItem's setTarget:me)
        (aMenuItem's setTag:aCount)
        (aMenu's addItem:aMenuItem)
        if j is not equal to "" then
            set aCount to aCount + 1
        end if
    end repeat

    return aMenu
end createMenu

on actionHandler:sender
    set aTag to tag of sender as integer
    set aTitle to title of sender as string

    if aTitle is "Quit" then
        current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
    end if
    #Chrome
    if aTitle is "⏯" then
        clickClassName("ytp-play-button ytp-button", 0)
    end if
    #Safari
    if aTitle is "⏯​" then
        clickClassName2("ytp-play-button ytp-button", 0)
    end if
end actionHandler:

to clickClassName(theClassName, elementnum)
    tell application "Google Chrome" to (tabs of window 1 whose URL contains "youtube")
    set youtubeTabs to item 1 of the result
    tell application "Google Chrome"
        execute youtubeTabs javascript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();"
    end tell
end clickClassName

to clickClassName2(theClassName, elementnum)
    tell application "Safari"
        tell window 1 to set current tab to tab 1 whose URL contains "youtube"
        do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1
    end tell
end clickClassName2
JBis
fuente
1
Veo dos problemas, el primero es que si sale de la barra de menú, el mosaico de Dock de aplicaciones AppleScript sigue ahí y la aplicación debe cerrarse por separado. Puede agregar un quit comando al if aTitle is "Quit" then bloque después de la current application's ...línea de código para resolver esto. El segundo problema es que los símbolos que está utilizando no se muestran bien cuando se selecciona Usar barra de menú oscura y Dock General System Preference. Realmente no puede ver los símbolos hasta que pasa el mouse sobre ellos. Puede considerar agregar texto al elemento del menú con los símbolos., Por ejemplo:Play/Pause YouTube ⏯​
user3439894
Gracias por las sugerencias sobre el modo oscuro se ajustará. Arreglaré el problema de dejar de fumar.
JBis
1
Además, al crear una aplicación adicional de menú como esta, me gusta ocultar el Dock Tile de la aplicación con LSUIElement = 1agregado al name.app/Contents/Info.plistarchivo. IMO No es necesario que se muestre el Dock Tile de la aplicación para este tipo de aplicación adicional de menú.
user3439894
@ user3439894 Sabía que tenía más, mis aplicaciones simplemente olvidaron agregar, siéntase libre de editar eso.
JBis
También tenga en cuenta que el --http://piyocast.com/as/archives/4502comentario en el código ya no es válido, sin embargo, esta respuesta Applescript se ejecuta desde la barra de menú. por el autor del código original contiene el código original que solía estar en esa URL. La respuesta también incluye el defaults comando para ocultar el Dock Tile, por ejemplo:defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
user3439894