Jak wstrzymać wideo z YouTube za pomocą skrótu klawiaturowego lub z paska menu?

17

Czy istnieje oprogramowanie, które umożliwia wstrzymanie (i cofnięcie) aktualnie odtwarzanego filmu na YouTube (lub, najlepiej, dowolnego internetowego wideo / audio), za pomocą skrótu klawiaturowego lub łatwo dostępnego przycisku (np. Przycisku, który siedzi na pasku menu znajdującym się w prawym górnym rogu ekranu)? Im mniej niezbędnych kliknięć, tym lepiej.

Kluczem tutaj jest to, że chcę mieć możliwość wstrzymania wideo w dowolnej aplikacji, to znaczy, gdy Google Chrome nie jest najważniejszą aplikacją (np. TextEdit lub Microsoft Word jest najważniejszą aplikacją).

iOS ma wbudowany ten skrót. Jeśli jeden przesunie się od dołu ekranu do góry, pojawią się elementy sterujące multimediami. Te elementy sterujące mogą manipulować dowolnym dźwiękiem pochodzącym z karty Safari.

Moja przeglądarka to Google Chrome.

OS X El Capitan, wersja 10.11.6.


Byłbym również otwarty na dokonanie tego za pomocą AppleScript (który następnie można przypisać do kombinacji klawiszy w FastScripts.app). Ale nie mogę sobie wyobrazić, że tak złożone zadanie jest możliwe dzięki AppleScript.

kula Rubika
źródło
1
Więc szukasz rozwiązania paska menu zamiast stukania spacji? Lub kliknięcie myszą przycisku Odtwórz / Pauza?
Monomeeth
1
@Monomeeth Proszę zobaczyć moją edycję. Zapomniałem wspomnieć, że Chrome nie jest aktywną aplikacją; wideo jest odtwarzane w tle. Tak więc, aby wstrzymać wideo, muszę kliknąć okno Chrome, kliknąć kartę zawierającą wideo i tylko wtedy mogę użyć spacji lub kliknięcia lewym przyciskiem myszy, aby zatrzymać wideo.
kula
1
szukasz czegoś takiego, gdybym zrozumiał pytanie: beardedspice.github.io
enzo
@enzo Pobrałem BeardedSpice i właśnie tego szukam. BeardedSpice jest idealny dla moich potrzeb. Jeśli chcesz opublikować to jako odpowiedź, chętnie to zaakceptuję. Dzięki!
kula
Zastanawiam się, dlaczego Google nie uruchomił przycisku odtwarzania / wstrzymania klawiatury (F8) w YouTube, biorąc pod uwagę, że działa on zgodnie z oczekiwaniami, gdy odwiedzasz Muzykę Google Play w Chrome.
calum_b

Odpowiedzi:

19

********** ZAKTUALIZOWANE ROZWIĄZANIE **********

Ta aktualizacja jest bezpośrednim rozwiązaniem pierwotnego pytania PO.

Poniższy kod AppleScript doda pozycję menu „Odtwórz / Wstrzymaj YouTube” z opcjami odtwarzania lub wstrzymywania dowolnego wideo YouTube w Google Chrome lub Safari, niezależnie od tego, czy przeglądarki są widoczne, czy nie. Zapisz następujący kod AppleScript jako aplikację „bądź otwarty” w 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

wprowadź opis zdjęcia tutaj

Jeśli chcesz, aby nowa ... Play Pause YouTube Status Menu.app była widoczna tylko w menu statusu, a nie w Docku, możesz kliknąć prawym przyciskiem myszy aplikację w Finderze i wybrać opcję „Pokaż zawartość pakietu”. W folderze Contents otwórz plik Info.plist w dowolnym edytorze tekstu i dodaj następujące dwa wiersze. Następnie zapisz i zamknij ten plik.

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

Jeśli nie jesteś w stanie bezpośrednio edytować pliku .plist, poniższy kod AppleScript pozwoli ci wybrać aplikację do ukrycia przed Dockiem, gdy jest uruchomiona.

Jeśli wybrana aplikacja jest już ustawiona jako ukryta przed Dockiem, jedyną dostępną opcją jest ukrywanie aplikacji przed widocznością w Docku, gdy jest uruchomiona… I odwrotnie.

Ten skrypt jest szczególnie przydatny do ukrywania „pozostań otwartych aplikacji” z ikonami bezczynnych programów obsługi, które pojawiają się w Docku podczas działania.

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


************ ORYGINALNE ROZWIĄZANIE ************

Ten skrypt kliknie przycisk Odtwarzaj / Wstrzymaj na filmie odtwarzanym w YouTube w Google Chrome, niezależnie od tego, czy Google Chrome jest widoczny.

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)

To jest wersja skryptu do pracy z 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)

Starając się zapewnić OP kompletne rozwiązanie AppleScript, posunąłem moją oryginalną odpowiedź o krok dalej.

AKTUALIZACJA

W końcu to rozgryzłem. Stworzyłem aplikację AppleScript w Xcode. Pierwotnie mój projekt rozpoczął się od okna z jednym przyciskiem do sterowania filmami YouTube aktualnie aktywnymi w Chrome lub Safari. Ten projekt urósł nieco do aplikacji, która zawiera kilka narzędzi. Ten GIF pokazuje przycisk YouTube Pause kontrolujący YouTube w Chrome i Safari. Połączyłem działania przycisków z AppleScript, który pierwotnie napisałem w edytorze skryptów.

wprowadź opis zdjęcia tutaj

To jest migawka aplikacji Xcode działającej w pliku AppDelegate.applescript.

wprowadź opis zdjęcia tutaj

Oto kod w pliku, który utworzyłem, aby program działał.

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

Zaktualizowałem kod, aby karta YouTube w Chrome nie musiała być widoczną ani aktywną kartą po kliknięciu przycisku pauzy YouTube utworzonego w Xcode

Oto link do pobrania całego projektu Xcode

wprowadź opis zdjęcia tutaj

OSTRZEŻENIE: Funkcja wygaszacza ekranu na pulpicie zamrozi aplikację. Po wymuszonym wyjściu i ponownym otwarciu, funkcja wygaszacza pulpitu, aby wyjść z aktywnego wygaszacza ekranu, będzie działać.

Po namyśle: prawdopodobnie powinienem był zawinąć każdy kod AppleScript w instrukcje „try”, aby uniknąć wszelkiego rodzaju komunikatów o błędach dla osób grających w ten projekt, które nie mają tego samego systemu i komputera, co ja. (MacBook Pro 15 "OS Sierra 10.12.6)

Funkcja powiększania Aby działać, musi być włączona w preferencjach systemowych.

wprowadź opis zdjęcia tutaj

Aby przełączanie „Włączanie / wyłączanie dyktowania” działało poprawnie, skrót do włączania poleceń dyktowania w preferencjach systemowych musi być zgodny ze skrótem używanym w skrypcie

wprowadź opis zdjęcia tutaj

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

Obecnie pracuję nad możliwością przełączania między aplikacją działającą tylko w oknie lub w pasku menu

wch1zpink
źródło
Odkładając na bok display dialing ..., potrzebujesz tylko tego jednego wiersza kodu tell application "Google Chrome" to execute front window's active tab javascript "document.getElementsByClassName('ytp-play-button ytp-button')['0'].click();". Ponieważ OP chce „wstrzymać (i cofnąć) aktualnie odtwarzany film na YouTube”, Google jest już otwarty i można go zminimalizować przy aktywnym odtwarzaniu tabulatorów, a wspomniany jeden wiersz kodu będzie działał na nim. Dlatego nie ma potrzeby aktywowania okna lub jak w kodzie, użyj launchtego, co podano w dokumentacji, ciąg dalszy w następnym komentarzu ...
użytkownik3439894
3
To bardzo sprytne rozwiązanie! Zdecydowałem się na program zewnętrzny, BeardedSpice, jak wcześniej sugerowano w komentarzu enzo, ponieważ BeardedSpice działa nawet wtedy, gdy okno Chrome zawierające wideo jest zminimalizowane, a okno Chrome pozostanie zminimalizowane. BeardedSpice współpracuje również z litanią internetowych odtwarzaczy multimedialnych (nie tylko YouTube). Ale jestem zdumiony, że wymyśliłeś, jak to zrobić w AppleScript.
kula
1
Byłoby bardzo miło, gdybyś skompresował archiwum plików projektu Xcode i podał link do pobrania dla archiwum. :)
user3439894
1
Po prostu trochę
czyszczę
1
Dziękujemy za udostępnienie plików projektu. Gdybym mógł ponownie zagłosować na twoją odpowiedź, zrobiłbym to. :)
user3439894
1

Oto jak dostać się do paska menu z czystym AppleScript. Zapisz jako aplikację za pomocąstay open after run handler :

PS Ukradłem kod dla funkcji odtwarzania / pauzy z @ wch1zpink, więc proszę również głosować na ich odpowiedź

--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
źródło
1
Widzę dwa problemy, z których pierwszym jest to, że jeśli wyjdziesz z paska menu, nadal znajduje się kafelek dokowania aplikacji AppleScript, a aplikacja musi zostać zamknięta osobno. Możesz dodać quit polecenie do if aTitle is "Quit" then bloku po current application's ...wierszu kodu, aby rozwiązać ten problem. Drugi problem to to, że używane symbole nie wyświetlają się dobrze po wybraniu Użyj ciemnego paska menu i Dock Ogólne preferencje systemowe. Naprawdę nie widzisz symboli, dopóki na nie nie najedziesz myszką. Możesz rozważyć dodanie tekstu do pozycji menu za pomocą symboli., Np .:Play/Pause YouTube ⏯​
user3439894
Dzięki za sugestie dotyczące trybu ciemnego dostosuje się. Naprawię problem z wyjściem.
JBis
1
Ponadto podczas tworzenia dodatkowej aplikacji menu, takiej jak ta, lubię ukrywać płytkę dokującą aplikacji, LSUIElement = 1dodając ją do name.app/Contents/Info.plistpliku. IMO Nie ma potrzeby, aby aplikacja Dock Tile pokazywała aplikację dla tego rodzaju dodatkowej aplikacji menu.
user3439894,
@ user3439894 Wiedziałem o tym, że mam więcej aplikacji, ale zapomniałem dodać.
Zmodyfikuj to
Zauważ też, że --http://piyocast.com/as/archives/4502komentarz w kodzie nie jest już ważny, jednak ta odpowiedź Applescript działa z paska menu? autor oryginalnego kodu zawiera oryginalny kod, który był pod tym adresem URL. Odpowiedź zawiera także defaults polecenie ukrycia defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
kafelka