Як призупинити відео YouTube за допомогою комбінації клавіш або на панелі меню?


17

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

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

В iOS вбудований цей ярлик. Якщо провести пальцем з нижньої частини екрана вгору, з'являться елементи керування медіа. Ці елементи керування можуть управляти будь-яким звуком, який бере свій початок на вкладці Safari.

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

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


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


1
Отже, ви шукаєте рішення в рядку меню, а не просто натискання на пробіл? Або клацання мишкою на кнопці «Відтворити / призупинити»?
Мономет

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 відображався лише в меню статусу, а не в доці, ви можете клацнути правою кнопкою миші додаток у Finder і вибрати опцію "Показати зміст пакета". У папці «Зміст» відкрийте файл Info.plist у будь-якому текстовому редакторі та додайте наступні два рядки. Потім збережіть і закрийте цей файл.

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

Якщо вам не зручно безпосередньо редагувати .plist-файл, цей наступний код AppleScript дозволить вам вибрати додаток, яке ховається від 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 повноцінне рішення 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 у випробуваннях «спробувати», щоб уникнути всіляких повідомлень про помилки для тих, хто грає з цим проектом, у яких немає тієї ж системи та типу комп’ютера, що я. (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:

В даний час я працюю над можливістю перемикатися між додатком, що працює у вікні, або лише у рядку меню


Відставляючи, 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 і надали посилання для архіву. :)
користувач3439894

1
Я трохи прибираю код, і незабаром зроблю те, про що ви запитаєте :)
wch1zpink

1
Дякуємо, що поділилися файлами проекту. Якби я міг проголосувати вашу відповідь ще раз, я б. :)
користувач3439894

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
Я бачу два випуски, перше - якщо ви вийдете з меню меню, плитка доклей програми AppleScript все ще існує, і додаток потім потрібно вийти окремо. Ви можете додати quit команду до if aTitle is "Quit" then блоку після current application's ...рядка коду, щоб вирішити цю проблему. Друге питання - символи, які ви використовуєте, не відображаються добре, якщо вибрано смужку меню Використовувати і темні налаштування Док . Ви дійсно не можете бачити символи, поки не наведіть на них курсор миші. Ви можете розглянути можливість додавання тексту до пункту меню із символами. Наприклад:Play/Pause YouTube ⏯​
user3439894

Дякуємо за пропозиції щодо темного режиму. Я виправлю проблему з виходу.
JBis

1
Також під час створення меню додаткового додатка, такого як цей, я люблю приховувати док-плитку додатка, LSUIElement = 1додану у name.app/Contents/Info.plistфайл. IMO Для цього типу додаткового додатка меню немає необхідності показувати Dock Tile для додатків.
користувач3439894

@ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.