Как приостановить видео YouTube с помощью сочетания клавиш или из строки меню?

17

Существует ли какое-либо программное обеспечение, позволяющее приостанавливать (и не приостанавливать) воспроизводимое в настоящее время видео YouTube (или, в идеале, любые онлайн-видео / аудио носители), с помощью сочетания клавиш или удобно доступной кнопки (например, кнопки, которая сидит в строке меню, расположенной в правом верхнем углу экрана)? Чем меньше необходимых кликов, тем лучше.

Ключевым моментом здесь является то, что я хочу иметь возможность приостановить видео в любом приложении, то есть, когда Google Chrome не является основным приложением (например, TextEdit или Microsoft Word является основным приложением).

iOS имеет этот встроенный ярлык. Если пролистать экран снизу вверх, появятся элементы управления мультимедиа. Эти элементы управления могут манипулировать любым звуком, который создается на вкладке Safari.

Мой веб-браузер - Google Chrome.

OS X El Capitan, версия 10.11.6.


Я также был бы открыт для выполнения этого с помощью AppleScript (который затем можно назначить комбинации клавиш в FastScripts.app). Но я не могу себе представить, что такая сложная задача возможна через AppleScript.

сфера рубика
источник
1
Итак, вы ищете решение для панели меню, а не просто нажмите пробел? Или щелкнув мышью по кнопке Play / Pause?
Мономет
1
@Monomeeth Пожалуйста, смотрите мое редактирование. Я забыл упомянуть, что Chrome не является активным приложением; видео воспроизводится в фоновом режиме. Итак, чтобы приостановить видео, я должен нажать на окно Chrome, щелкнуть вкладку с видео, и только тогда я могу использовать пробел или щелчок левой кнопкой мыши, чтобы приостановить видео.
сфера Рубика
1
вы ищете что-то вроде, если бы я понял вопрос: beardedspice.github.io
enzo
@enzo Я скачал BeardedSpice, и это именно то , что я ищу. BeardedSpice идеально подходит для моих нужд. Если вы хотите опубликовать это как ответ, я с радостью приму это. Благодарность!
сфера Рубика
Мне действительно интересно, почему Google не сделал так, чтобы кнопка Play / Pause (F8) на клавиатуре работала для YouTube, учитывая, что она работает, как и ожидалось, когда вы посещаете Google Play Music в Chrome.
calum_b

Ответы:

19

********** ОБНОВЛЕННОЕ РЕШЕНИЕ **********

Это обновление является прямым решением оригинального вопроса ОП.

В следующем коде AppleScript будет добавлен элемент меню состояния «Воспроизвести / приостановить YouTube» с параметрами воспроизведения или приостановки любого видео YouTube в Google Chrome или Safari, независимо от того, видны браузеры или нет. Сохраните следующий код 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 и выбрать опцию «Показать содержимое пакета». В папке «Содержимое» откройте файл Info.plist в любом текстовом редакторе и добавьте следующие две строки. Затем сохраните и закройте этот файл.

<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


************ ОРИГИНАЛЬНОЕ РЕШЕНИЕ ************

Этот скрипт будет нажимать кнопку «Воспроизведение / Пауза» на видео, воспроизводимом на YouTube в Google Chrome, независимо от того, отображается ли Google Chrome.

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, я сделал еще один шаг вперед к своему первоначальному ответу.

ОБНОВИТЬ

Я наконец-то понял. Я создал приложение AppleScript в Xcode. Первоначально мой проект начинался только с помощью окна с одной кнопкой для управления видео YouTube, активными в настоящее время в Chrome или Safari. Этот проект немного вырос в приложение, которое содержит несколько утилит. Этот GIF показывает кнопку паузы YouTube, управляющую YouTube в Chrome и Safari. Я связал действия кнопки с AppleScript, который я изначально написал в редакторе сценариев.

введите описание изображения здесь

Это снимок приложения Xcode, работающего в файле AppDelegate.applescript.

введите описание изображения здесь

Вот код в этом файле, который я создал, чтобы программа работала.

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

Я обновил код, чтобы вкладка YouTube в Chrome не должна была быть видимой или активной вкладкой при нажатии кнопки паузы YouTube, созданной в Xcode

Вот ссылка для загрузки всего проекта XCode

введите описание изображения здесь

ВНИМАНИЕ: функция заставки рабочего стола остановит приложение. После принудительного выхода и повторного открытия будет работать функция заставки рабочего стола для выхода из активной заставки.

Запоздалая мысль: мне, вероятно, следовало бы обернуть каждый из кодов AppleScript в операторы «try», чтобы избежать всевозможных сообщений об ошибках для тех, кто играет с этим проектом, у которых нет той же системы и типа компьютера, что и у меня. (MacBook Pro 15 "ОС Sierra 10.12.6)

Чтобы функция масштабирования работала, она должна быть включена в системных настройках.

введите описание изображения здесь

Для правильной работы функции «Диктовка вкл. / Выкл.» Ярлык для включения команд диктовки в системных настройках должен совпадать с ярлыком, используемым в сценарии.

введите описание изображения здесь

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

В настоящее время я работаю над возможностью переключения между приложениями, работающими в оконном режиме или только в строке меню.

wch1zpink
источник
Если оставить в стороне, display dialing ...вам нужна только одна строка кода tell application "Google Chrome" to execute front window's active tab javascript "document.getElementsByClassName('ytp-play-button ytp-button')['0'].click();". Поскольку ОП хочет «приостановить (и отменить) воспроизводимое в данный момент видео на YouTube», Google уже открыт, и его можно свернуть, если активная вкладка воспроизводится, и вышеупомянутая одна строка кода будет воздействовать на него. Поэтому нет необходимости активировать окно или как в вашем коде, используйте, launchкак это указано в документации, продолжение в следующем комментарии ...
user3439894
3
Это очень умное решение! Я решил использовать стороннюю программу BeardedSpice, как было предложено ранее в комментарии enzo, потому что BeardedSpice работает, даже если окно Chrome, содержащее видео, свернуто, и это окно Chrome останется свернутым. BeardedSpice также работает со списком онлайн-медиаплееров (не только YouTube). Но я поражен, что вы выяснили, как это сделать в AppleScript.
сфера Рубика
1
Было бы очень хорошо, если бы вы заархивировали файлы проекта Xcode и предоставили ссылку для скачивания архива. :)
user3439894
1
Я просто немного
чищу
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
JBIS
источник
1
Я вижу две проблемы: во-первых, если вы выйдете из строки меню, панель приложений AppleScript до сих пор существует, а затем приложение должно быть закрыто отдельно. Вы можете добавить quit команду в if aTitle is "Quit" then блок после current application's ...строки кода, чтобы решить эту проблему. Вторая проблема заключается в том, что используемые вами символы плохо отображаются, если выбрана строка меню « Использовать темные» и общая системная настройка Dock . Вы действительно не можете видеть символы, пока не наведете на них курсор мыши. Вы можете рассмотреть возможность добавления текста к пункту меню с символами. Например:Play/Pause YouTube ⏯​
user3439894
Спасибо за предложения по поводу темного режима отрегулирую. Я исправлю проблему выхода.
JBis
1
Кроме того, при создании дополнительного приложения в меню, такого как этот, мне нравится скрывать панель приложения, LSUIElement = 1добавленную в name.app/Contents/Info.plistфайл. ИМО Нет необходимости показывать плитку приложения в этом дополнительном меню.
user3439894
@ user3439894 Знал о том, что у меня есть больше приложений, которые я просто забыл добавить, не стесняйтесь редактировать это в.
JBis
Также обратите внимание, что --http://piyocast.com/as/archives/4502комментарий в коде больше не действителен, однако этот ответ Applescript запускается из строки меню? Автор оригинального кода содержит оригинальный код, который раньше был по этому URL. В ответ также входит defaults команда для скрытия плитки Dock, например:defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
user3439894