キーボードショートカットまたはメニューバーからYouTubeビデオを一時停止する方法


17

現在再生中のYouTubeビデオ(または、理想的には、任意のオンラインビデオ/オーディオメディア)をキーボードショートカットまたは便利にアクセスできるボタン(ボタンなど)で一時停止(および一時停止解除)できるソフトウェアがありますか画面の右上にあるメニューバーにありますか?)必要なクリック数が少ないほど効果的です。

ここで重要なのは、どのアプリケーションでも、つまりGoogle Chromeが最前面のアプリケーションではない場合(たとえば、TextEditやMicrosoft Wordが最前面のアプリケーション)にビデオを一時停止できることです。

iOSにはこのショートカットが組み込まれています。画面の下から上にスワイプすると、メディアコントロールが表示されます。これらのコントロールは、Safariタブで発生するすべてのオーディオを操作できます。

私のWebブラウザはGoogle Chromeです。

OS X El Capitan、バージョン10.11.6。


AppleScript(FastScripts.appのキーの組み合わせに割り当てることができます)でこれを実現することもできます。しかし、AppleScriptを介してこのような複雑なタスクが可能になるとは想像できません。


1
スペースバーをタップするだけでなく、メニューバーソリューションをお探しですか?または、再生/一時停止ボタンをマウスでクリックしますか?
Monomeeth

1
@Monomeeth私の編集をご覧ください。Chromeはアクティブなアプリケーションではないことを忘れていました。ビデオはバックグラウンドで再生されます。そのため、ビデオを一時停止するには、Chromeウィンドウをクリックし、ビデオを含むタブをクリックする必要があります。その後、スペースバーまたは左クリックを使用してビデオを一時停止できます。
ルービックの球

1
あなたは私が質問を理解した場合のようなものを探しています: beardedspice.github.io
enzo

@enzo BeardedSpiceをダウンロードしましたが、まさに私が探しているものです。BeardedSpiceは私のニーズに最適です。これを回答として投稿したい場合は、喜んで受け入れます。ありがとう!
ルービックの球

ChromeでGoogle Playミュージックにアクセスすると期待どおりに機能するので、GoogleがYouTubeでキーボードの[再生/一時停止]ボタン(F8)を機能させていない理由を実際に疑問に思います。
calum_b

回答:


19

********** 更新されたソリューション **********

この更新は、OPの元の質問に対する直接的な解決策です。

次のAppleScriptコードは、ブラウザが表示されているかどうかにかかわらず、Google ChromeまたはSafariでYouTubeビデオを再生または一時停止するオプションを備えた「YouTubeの再生/一時停止」ステータスメニュー項目を追加します。この次のAppleScriptコードを、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

ここに画像の説明を入力してください

新しい... Play Pause YouTube Status Menu.appをDockではなくステータスメニューにのみ表示するには、Finderでアプリを右クリックし、[パッケージの内容を表示]オプションを選択します。Contentsフォルダーで、任意のテキストエディターでInfo.plistファイルを開き、次の2行を追加します。次に、そのファイルを保存して閉じます。

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

.plistファイルを直接編集することに不安がある場合、次のAppleScriptコードを使用すると、実行中のDockから非表示にするアプリケーションを選択できます。

選択したアプリケーションがすでにDockから非表示に設定されている場合、実行中にDockに表示されないようにアプリケーションを非表示にすることが唯一のオプションです。逆も同様です。

このスクリプトは、実行中にアイドルハンドラーのアプリケーションアイコンがDockに表示されないように、「開いたままにする」アプリケーションを隠すのに特に便利です。

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


************ オリジナルソリューション ************

このスクリプトは、Google Chromeが表示されているかどうかにかかわらず、Google ChromeでYouTubeで再生している動画の[再生/一時停止]ボタンをクリックします。

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)

これは、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)

OP Aに完全なAppleScriptソリューションを提供するために、元の答えをさらに一歩進めました。

更新

私はついにそれを理解しました。XcodeでAppleScriptアプリケーションを作成しました。もともと、私のプロジェクトは、ChromeまたはSafariで現在アクティブなYouTubeビデオを制御するための1つのボタンウィンドウでのみ始まりました。このプロジェクトは、いくつかのユーティリティを含むアプリケーションに少し成長しました。このGIFは、ChromeとSafariでYouTubeを制御するYouTube一時停止ボタンを示しています。ボタンアクションを、元々スクリプトエディターで作成したAppleScriptにリンクしました。

ここに画像の説明を入力してください

これは、AppDelegate.applescriptファイルで動作するXcodeアプリケーションのスナップショットです。

ここに画像の説明を入力してください

プログラムを機能させるために作成したファイル内のコードを次に示します。

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

Xcodeで作成されたYouTube一時停止ボタンをクリックしたときに、ChromeのYouTubeタブが表示またはアクティブなタブである必要がないようにコードを更新しました

Xcodeプロジェクト全体をダウンロードするためのリンクがあります

ここに画像の説明を入力してください

警告:デスクトップスクリーンセーバー機能により、アプリがフリーズします。強制終了して再度開くと、アクティブスクリーンセーバーを終了するデスクトップスクリーンセーバー機能が動作します。

後考: 私はおそらく、AppleScriptの各コードを「try」ステートメントでラップして、このプロジェクトで遊んでいる人たちにあらゆる種類のエラーメッセージを避けるべきでした。(MacBook Pro 15 "OS Sierra 10.12.6)

ズーム機能を機能させるには、システム設定で有効にする必要があります。

ここに画像の説明を入力してください

「ディクテーションのオン/オフ」を正しく機能させるために、システム設定でディクテーションコマンドを有効にするショートカットは、スクリプトで使用されるショートカットと一致する必要があります

ここに画像の説明を入力してください

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

現在、ウィンドウまたはメニューバーのみを実行するアプリケーションを切り替える機能に取り組んでいます


脇に置いて、display dialing ...この1行のコードだけが必要ですtell application "Google Chrome" to execute front window's active tab javascript "document.getElementsByClassName('ytp-play-button ytp-button')['0'].click();"。OPは「現在再生中のYouTubeビデオを一時停止(および一時停止解除)」することを望んでいるため、Googleはすでに開いており、アクティブなタブ再生で最小化でき、前述の1行のコードがそれに応じて動作します。したがって、必要がウィンドウをアクティブにしないようにしたり、コードのように、使用launchこれとは...次のコメントに続けて、マニュアルには記載されているものである
user3439894

3
これは非常に賢い解決策です!ビデオを含むChromeウィンドウが最小化されていてもBeardedSpiceは動作し、このChromeウィンドウは最小化されたままになるため、以前にenzoのコメントで提案されたサードパーティプログラムBeardedSpiceを使用することにしました。BeardedSpiceは、YouTubeだけでなく、多数のオンラインメディアプレーヤーとも連携します。しかし、AppleScriptでこれを行う方法を理解してくれたことに驚いています。
ルービックの球体

1
Xcodeプロジェクトファイルをzipアーカイブし、アーカイブのダウンロードリンクを提供すると非常に便利です。:)
user3439894

1
私はコードを少し整理しているだけで、あなたがすぐに尋ねることを行います:)
wch1zpink

1
プロジェクトファイルを共有していただきありがとうございます。私があなたの答えを再び投票できるなら、私はそうします。:)
user3439894

1

純粋なAppleScriptを使用してメニューバーにアクセスする方法は次のとおりです。としてアプリケーションとして保存stay open after run handler

PS実際の再生/一時停止機能のコードを@ wch1zpinkから盗んだので、その答えも支持してください

--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
2つの問題があります。1つ目は、メニューバーからAppleScriptアプリケーションドックタイルがまだある場合、アプリを個別に終了する必要があることです。これを解決するために、コード行の後にブロックquit コマンドを追加できます。2番目の問題は、使用するシンボルが[ 暗いメニューバーを使用する]と[Dock General System Preference]を選択したときにうまく表示されないことです。シンボルの上にマウスを置くまで、シンボルは実際には表示されません。シンボルを使用してメニュー項目にテキストを追加することを検討してください。例:if aTitle is "Quit" then current application's ...Play/Pause YouTube ⏯​
user3439894

ダークモードに関する提案をお寄せいただきありがとうございます。終了の問題を修正します。
JBis

1
また、このようなメニューの追加アプリを作成するときLSUIElement = 1name.app/Contents/Info.plistファイルに追加されたアプリのドックタイルを非表示にするのが好きです。IMOこのタイプのメニューの追加アプリには、アプリのドックタイルショーを表示する必要はありません。
user3439894

@ user3439894追加するのを忘れたアプリがあることを知っていたので、気軽に編集してください
。– JBis

また--http://piyocast.com/as/archives/4502コード内のコメントは無効になっていますが、この回答はメニューバーからApplescriptを実行しますか?元のコード作成者による、そのURLにあった元のコードが含まれています。答えには、ドックタイルを非表示にするdefaults コマンドも含まれます。例:defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
user3439894
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.