Come mettere in pausa il video di YouTube tramite la scorciatoia da tastiera o dalla barra dei menu?


17

Esiste un software che consente di mettere in pausa (e annullare la pausa) un video di YouTube attualmente in riproduzione (o, idealmente, qualsiasi supporto audio / video online), con una scorciatoia da tastiera o un pulsante facilmente accessibile (ad esempio, un pulsante che si trova nella barra dei menu, situata nella parte in alto a destra dello schermo)? Meno clic necessari, meglio è.

La chiave qui è che voglio la possibilità di mettere in pausa il video in qualsiasi applicazione, cioè quando Google Chrome non è l'applicazione principale (ad esempio, TextEdit o Microsoft Word è l'applicazione principale).

iOS ha questo collegamento integrato. Se si scorre dalla parte inferiore dello schermo verso l'alto, vengono visualizzati i controlli multimediali. Questi controlli possono manipolare qualsiasi audio proveniente da una scheda Safari.

Il mio browser Web è Google Chrome.

OS X El Capitan, versione 10.11.6.


Sarei anche aperto a realizzare questo con un AppleScript (che può quindi essere assegnato a una combinazione di tasti in FastScripts.app). Ma non riesco a immaginare che un compito così complesso sia possibile tramite AppleScript.


1
Quindi, stai cercando una soluzione per la barra dei menu piuttosto che toccare la barra spaziatrice? Oppure fai clic con il mouse sul pulsante Riproduci / Pausa?
Monomeeth

1
@Monomeeth Vedi la mia modifica. Ho dimenticato di dire che Chrome non è l'applicazione attiva; il video viene riprodotto in background. Quindi, per mettere in pausa il video, devo fare clic sulla finestra di Chrome, fare clic sulla scheda che contiene il video e solo allora posso usare la barra spaziatrice o un clic sinistro per mettere in pausa il video.
sfera di rubik,

1
stai cercando qualcosa come se avessi
enzo

@enzo Ho scaricato BeardedSpice ed è esattamente quello che sto cercando. BeardedSpice è perfetto per le mie esigenze. Se vuoi pubblicare questo come risposta, lo accetterò felicemente. Grazie!
sfera di rubik,

In realtà mi chiedo perché Google non abbia fatto funzionare il pulsante Play / Pause (F8) della tastiera per YouTube, dato che funziona come previsto quando visiti Google Play Music in Chrome.
calum_b,

Risposte:


19

********** SOLUZIONE AGGIORNATA **********

Questo aggiornamento è una soluzione diretta alla domanda originale del PO.

Questo codice AppleScript seguente aggiungerà una voce del menu di stato "Riproduci / Pausa YouTube" con le opzioni per riprodurre o mettere in pausa qualsiasi video di YouTube in Google Chrome o Safari, indipendentemente dal fatto che i browser siano visibili o meno. Salvare questo seguente codice AppleScript come un'applicazione "rimanere aperta" in 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

inserisci qui la descrizione dell'immagine

Se vuoi che il tuo nuovo ... Riproduci Pausa YouTube Status Menu.app sia visibile solo nel menu di stato e non nel Dock, puoi fare clic con il tasto destro del mouse sull'app nel Finder e selezionare l'opzione "Mostra contenuto pacchetto". Nella cartella Contenuti, apri il file Info.plist in qualsiasi editor di testo e aggiungi le seguenti due righe. Quindi salva e chiudi quel file.

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

Se non ti senti a tuo agio nel modificare direttamente il file .plist, questo codice AppleScript seguente ti consentirà di scegliere l'applicazione da nascondere dal Dock quando è in esecuzione.

Se l'applicazione selezionata è già impostata per essere nascosta dal Dock, l'unica opzione che ti verrà data è quella di scoprire che l'applicazione è visibile nel Dock mentre è in esecuzione ... E viceversa.

Questo script è particolarmente utile per nascondere "applicazioni aperte" con le icone delle applicazioni dei gestori inattivi che compaiono nel Dock durante l'esecuzione.

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


************ SOLUZIONE ORIGINALE ************

Questo script farà clic sul pulsante Riproduci / Pausa su un video riprodotto su YouTube in Google Chrome, indipendentemente dal fatto che Google Chrome sia visibile o meno.

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)

Questa è la versione dello script per funzionare 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)

Nel tentativo di offrire all'OP una soluzione AppleScript completa, ho portato la mia risposta originale a un ulteriore passo.

AGGIORNARE

Alla fine l'ho capito. Ho creato un'applicazione AppleScript in Xcode. Inizialmente, il mio progetto era iniziato solo con una finestra a un pulsante per controllare i video di YouTube attualmente attivi in ​​Chrome o Safari. Questo progetto è cresciuto un po 'in un'applicazione che contiene diverse utility. Questa GIF mostra il pulsante Pausa di YouTube che controlla YouTube in Chrome e Safari. Ho collegato le azioni dei pulsanti all'AppleScript che avevo originariamente scritto nell'editor di script.

inserisci qui la descrizione dell'immagine

Questa è un'istantanea dell'applicazione Xcode che funziona nel file AppDelegate.applescript.

inserisci qui la descrizione dell'immagine

Ecco il codice in quel file che ho creato per far funzionare il programma.

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

Ho aggiornato il codice in modo che la scheda YouTube in Chrome non debba essere la scheda visibile o attiva quando si fa clic sul pulsante Pausa YouTube creato in Xcode

Ecco un link per scaricare l'intero progetto Xcode

inserisci qui la descrizione dell'immagine

ATTENZIONE: la funzione salvaschermo del desktop bloccherà l'app. Dopo aver forzato la chiusura e la riapertura, la funzione salvaschermo desktop per uscire dal salvaschermo attivo funzionerà.

Ripensamenti: probabilmente avrei dovuto racchiudere ciascuno dei codici AppleScript in istruzioni "try" per evitare tutti i tipi di messaggi di errore per coloro che giocano con questo progetto, che non hanno lo stesso sistema e tipo di computer che ho. (MacBook Pro 15 "OS Sierra 10.12.6)

Perché la funzione zoom funzioni, deve essere abilitata nelle preferenze di sistema.

inserisci qui la descrizione dell'immagine

Affinché l'opzione “Attiva / disattiva dettatura” funzioni correttamente, la scorciatoia per abilitare i comandi di dettatura nelle preferenze di sistema deve corrispondere alla scorciatoia utilizzata nello script

inserisci qui la descrizione dell'immagine

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

Attualmente sto lavorando sulla possibilità di alternare tra l'applicazione che esegue solo finestre o menu


Mettendo da parte display dialing ...hai solo bisogno di questa riga di codice tell application "Google Chrome" to execute front window's active tab javascript "document.getElementsByClassName('ytp-play-button ytp-button')['0'].click();". Poiché l'OP vuole "mettere in pausa (e annullare la pausa) un video di YouTube attualmente in riproduzione", Google è già aperto e potrebbe essere ridotto al minimo con la scheda attiva in riproduzione e la suddetta riga di codice agirà su di esso. Pertanto non è necessario attivare la finestra o come nel codice, utilizzare launchcome è ciò che è indicato nella documentazione, continuato nel prossimo commento ...
user3439894

3
Questa è una soluzione molto intelligente! Ho deciso di utilizzare il programma di terze parti, BeardedSpice, come precedentemente suggerito in un commento di enzo, perché BeardedSpice funziona anche se la finestra di Chrome che contiene il video è ridotta a icona e questa finestra di Chrome rimarrà ridotta a icona. BeardedSpice funziona anche con una serie di lettori multimediali online (non solo YouTube). Ma sono sorpreso che tu abbia capito come farlo in AppleScript.
sfera di rubik,

1
Sarebbe molto bello se si archivia zip i file di progetto Xcode e si fornisca un collegamento per il download per l'archivio. :)
user3439894,

1
Sto solo ripulendo un po 'il codice e farò quello che mi chiedi a breve :)
wch1zpink,

1
Grazie per aver condiviso i file del progetto. Se potessi votare nuovamente la tua risposta, lo farei. :)
user3439894,

1

Ecco come accedere alla barra dei menu con AppleScript puro. Salva come applicazione con stay open after run handler:

PS Ho rubato il codice per le effettive funzioni di riproduzione / pausa da @ wch1zpink, quindi per favore vota anche la loro risposta

--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

1
Due problemi che vedo, il primo è che se esci dalla barra dei menu, il riquadro Dock dell'applicazione AppleScript è ancora lì e l'app deve essere chiusa separatamente. È possibile aggiungere un quit comando al if aTitle is "Quit" then blocco dopo la current application's ...riga di codice per risolvere il problema. Il secondo problema è che i simboli che stai utilizzando non vengono visualizzati correttamente quando è selezionata la barra dei menu scura e Preferenza di sistema generale Dock . Non puoi davvero vedere i simboli finché non ci passi sopra con il mouse. Potresti prendere in considerazione l'aggiunta di testo alla voce di menu con i simboli. Ad esempio:Play/Pause YouTube ⏯​
user3439894

Grazie per i suggerimenti riguardanti la modalità scura si adatterà. Risolverò il problema di uscita.
JBis

1
Inoltre, quando creo un'app extra di menu come questa, mi piace nascondere il riquadro Dock dell'app con l' LSUIElement = 1aggiunta al name.app/Contents/Info.plistfile. IMO Non è necessario che il Dock Tile dell'app sia visualizzato per questo tipo di menu in più.
user3439894,

@utente3439894 Sapevo che avevo altre mie app che ho dimenticato di aggiungere sentitevi liberi di modificarlo.
JBis

Si noti inoltre che il --http://piyocast.com/as/archives/4502commento nel codice non è più valido, tuttavia questa risposta Applescript viene eseguita dalla barra dei menu? dall'autore del codice originale contiene il codice originale che si trovava in quell'URL. La risposta include anche il defaults comando per nascondere la defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
tessera
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.