YouTube videosunu klavye kısayoluyla veya menü çubuğundan nasıl duraklatabilirim?


17

Şu anda oynatılan bir YouTube videosunu (veya ideal olarak herhangi bir çevrimiçi video / ses ortamını) klavye kısayoluyla veya kolay erişilebilir bir düğmeyle (ör. ekranın sağ üst köşesinde bulunan menü çubuğunda oturur)? Ne kadar az tıklama olursa o kadar iyidir.

Buradaki anahtar, videoyu herhangi bir uygulamada, yani Google Chrome en önde gelen uygulama olmadığında (ör. TextEdit veya Microsoft Word en önde gelen uygulama) duraklatmak istediğimdir .

iOS'ta bu kısayol yerleşiktir. Biri ekranın altından yukarı doğru kaydırırsa, medya denetimleri görünür. Bu denetimler, bir Safari sekmesinden kaynaklanan tüm sesleri işleyebilir.

Web tarayıcım Google Chrome.

OS X El Capitan, sürüm 10.11.6.


Ayrıca bunu bir AppleScript (daha sonra FastScripts.app bir tuş kombinasyonuna atanabilir) ile başarmak için açık olurdu. Ancak, böyle karmaşık bir görevin AppleScript aracılığıyla mümkün olduğunu hayal edemiyorum.


1
Yani, sadece Space Bar'a dokunmak yerine bir menü çubuğu çözümü mü arıyorsunuz? Veya Oynat / Duraklat düğmesine fareyle mi tıklıyorsunuz?
Monomeeth

1
@Monomeeth Lütfen düzenlememe bakın. Chrome'un etkin uygulama olmadığını belirtmeyi unuttum; video arka planda oynatılır. Bu nedenle, videoyu duraklatmak için Chrome penceresini tıklamam, videoyu içeren sekmeyi tıklamam gerekiyor ve ancak videoyu duraklatmak için boşluk çubuğunu veya sol tıklamayı kullanabilirim.
rubik'in küresi

1
soruyu anladım gibi bir şey arıyorsunuz: beardedspice.github.io
enzo

@enzo BeardedSpice'i indirdim ve tam da aradığım şey bu. BeardedSpice ihtiyaçlarım için mükemmel. Bunu bir cevap olarak göndermek istiyorsanız, memnuniyetle kabul edeceğim. Teşekkürler!
rubik'in küresi

Aslında, Chrome'da Google Play Müzik'i ziyaret ettiğinizde beklendiği gibi çalıştığı göz önüne alındığında Google'ın neden YouTube Oynat / Duraklat düğmesini (F8) YouTube için çalışmadığını merak ediyorum.
calum_b

Yanıtlar:


19

********** GÜNCELLENEN ÇÖZÜM **********

Bu güncelleme OP'nin orijinal sorusuna doğrudan bir çözümdür.

Aşağıdaki AppleScript kodu, tarayıcılar görünür olsun veya olmasın, Google Chrome veya Safari'deki herhangi bir YouTube videosunu oynatma veya duraklatma seçeneklerinin bulunduğu bir "YouTube Oynat / Duraklat" durum menü öğesi ekleyecektir. Aşağıdaki AppleScript kodunu Script Editor.app uygulamasında "açık kal" uygulaması olarak kaydedin.

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

resim açıklamasını buraya girin

Yeni ... Play Duraklat YouTube Durum Menüsü.app'ın Dock'ta değil, yalnızca durum menüsünde görünmesini istiyorsanız, Finder'da uygulamayı sağ tıklayıp "Paket İçeriğini Göster" seçeneğini belirleyebilirsiniz. İçindekiler klasöründe, herhangi bir metin düzenleyicisinde Info.plist dosyasını açın ve aşağıdaki iki satırı ekleyin. Ardından dosyayı kaydedip kapatın.

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

.Plist dosyasını doğrudan düzenlemekte rahat değilseniz, aşağıdaki AppleScript kodu çalışırken Dock'tan gizlenecek uygulamayı seçmenize izin verecektir.

Seçilen uygulama zaten Dock'tan gizlenecek şekilde ayarlanmışsa, size verilecek tek seçenek uygulamanın Dock'ta çalışırken görünmesini engellemektir… Ve bunun tersi de geçerlidir.

Bu komut dosyası, özellikle boşta işleyicilerin uygulama simgelerinin çalışırken Dock'ta görünmesini engelleyen "açık uygulamaları koru" gizlemek için özellikle kullanışlıdır.

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


************ ORİJİNAL ÇÖZÜM ************

Bu komut dosyası, Google Chrome görünür olsun ya da olmasın, Google Chrome'da YouTube'da oynatılan bir videoda Oynat / Duraklat düğmesini tıklar.

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)

Bu, Safari ile çalışacak komut dosyası sürümüdür

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)

OP A'ya eksiksiz bir AppleScript çözümü sunmak için orijinal yanıtımı bir adım daha ileri götürdüm.

GÜNCELLEME

Sonunda anladım. Xcode'da bir AppleScript uygulaması oluşturdum. Başlangıçta, projem yalnızca şu anda Chrome veya Safari'de etkin olan YouTube videolarını kontrol etmek için tek bir düğme penceresiyle başladı. Bu proje, birkaç yardımcı program içeren bir uygulama haline geldi. Bu GIF, Chrome ve Safari'de YouTube'u kontrol eden YouTube Duraklat düğmesini gösterir. Düğme eylemlerini, komut dosyası düzenleyicide yazdığım AppleScript'e bağladım.

resim açıklamasını buraya girin

Bu, AppDelegate.applescript dosyasında çalışan Xcode uygulamasının anlık görüntüsüdür.

resim açıklamasını buraya girin

İşte programın çalışması için oluşturduğum dosyadaki kod.

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

Kodu güncelledim, böylece Xcode'da oluşturulan YouTube Duraklat Düğmesini tıkladığınızda Chrome'daki YouTube sekmesinin görünür veya etkin sekme olması gerekmiyor

İşte tüm Xcode projesini indirmek için bir bağlantı

resim açıklamasını buraya girin

UYARI: Masaüstü ekran koruyucu işlevi Uygulamayı dondurur. Zorla çıktıktan ve yeniden açtıktan sonra, aktif ekran koruyucu çıkmak için masaüstü ekran koruyucu işlevi çalışacaktır.

Sonrasında: Bu projeyle oynayan ve aynı sisteme ve bilgisayar türüne sahip olmayanlar için her türlü hata mesajını önlemek için muhtemelen AppleScript kodlarının her birini "try" ifadelerine sarmalıydım. (MacBook Pro 15 "İşletim Sistemi Sierra 10.12.6)

Yakınlaştırma işlevi için Çalışması için, sistem tercihlerinde etkinleştirilmesi gerekir.

resim açıklamasını buraya girin

“Dikte açık / kapalı” nın geçişinin doğru çalışması için, sistem tercihlerinde dikte komutlarını etkinleştirmek için kullanılan kısayolun kodda kullanılan kısayolla eşleşmesi gerekir

resim açıklamasını buraya girin

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

Şu anda pencereli çalışan uygulama veya menü çubuğu arasında geçiş yapma yeteneği üzerinde çalışıyorum


Bir kenara koymak, display dialing ...sadece bu bir kod satırına ihtiyacınız var tell application "Google Chrome" to execute front window's active tab javascript "document.getElementsByClassName('ytp-play-button ytp-button')['0'].click();". OP "şu anda oynatılmakta olan bir YouTube videosunu duraklatmak (& duraklatmak)" istediğinden, Google zaten açıktır ve etkin sekme oynatıldığında simge durumuna küçültülebilir ve yukarıda belirtilen bir kod satırı buna göre hareket eder. Bu nedenle, pencereyi etkinleştirmenize veya kodunuzda launcholduğu gibi, dokümantasyonda belirtildiği gibi kullanın , bir sonraki yorumda devam edin ...
user3439894

3
Bu çok akıllı bir çözüm! Daha önce enzo tarafından yapılan bir yorumda önerildiği gibi üçüncü taraf program BeardedSpice ile gitmeye karar verdim çünkü BeardedSpice, videoyu içeren Chrome penceresi minimize edilmiş olsa bile çalışıyor ve bu Chrome penceresi minimize kalacak. BeardedSpice aynı zamanda bir çevrimiçi medya oynatıcısıyla (yalnızca YouTube'da değil) çalışır. Ancak, bunu AppleScript'te nasıl yapacağınızı anladığınıza şaşırdım.
rubik'in küresi

1
Xcode Proje Dosyalarını arşivlemek ve arşiv için bir indirme bağlantısı sağlamak çok güzel olurdu. :)
user3439894

1
Ben sadece biraz kod temizliyorum ve ben kısa bir süre sorduğunuzda yapacağım :)
wch1zpink

1
Proje dosyalarını paylaştığınız için teşekkür ederiz. Eğer cevabınızı tekrar oylayabilirsem yapardım. :)
user3439894

1

Saf AppleScript ile menü çubuğuna nasıl girileceği. Uygulama Olarak Kaydet stay open after run handler:

PS @ @ wch1zpink gerçek çalma / duraklatma fonksiyonları için kod çaldı bu yüzden onların cevap da lütfen

--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
Gördüğüm iki sorun, birincisi, AppleScript Application Dock Tile'ın menü çubuğundan çıkarsanız hala orada ve uygulamanın ayrı olarak kapatılması gerekiyor. Bir ekleyebilir quit komutu için if aTitle is "Quit" then bloğun sonra current application's ...hattı koduna bu sorunu çözmek için. İkinci sorun, Koyu renk kullan menü çubuğu ve Dock Genel Sistem Tercihi seçildiğinde kullandığınız sembollerin iyi gösterilmemesidir . Fareyle üzerine gelene kadar sembolleri gerçekten göremezsiniz. Menü öğesine sembollerle birlikte metin eklemeyi düşünebilirsiniz. Örneğin:Play/Pause YouTube ⏯​
user3439894

Karanlık mod ile ilgili önerileriniz için teşekkür ederiz. Çıkma sorununu çözeceğim.
JBis

1
Ayrıca, bunun gibi bir menü ekstra uygulaması oluştururken, uygulamanın LSUIElement = 1eklenen Dock Tile'ı name.app/Contents/Info.plistdosyaya gizlemek istiyorum . IMO Bu tür menü ekstra uygulaması için Uygulamanın Dock Tile gösterilmesine gerek yoktur.
user3439894

@ user3439894 Uygulamalarımın eklemeyi unuttuğumu daha çok unuttuğumu biliyordum.
JBis

Ayrıca koddaki--http://piyocast.com/as/archives/4502 yorumun artık geçerli olmadığını unutmayın, ancak bu cevap Applescript menü çubuğundan çalışıyor mu? orijinal kod tarafından yazar, o URL'de bulunan orijinal kodu içerir. Cevap ayrıca Dock defaults defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
Karosu'nu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.