Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MusicAppMediaFix: support multiple (user-specified) media apps #302

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 25 additions & 4 deletions Source/MusicAppMediaFix.spoon/init.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
--- === MusicAppMediaFix ===
---
--- Override macOS behaviour and send all media keys (play/prev/next) to Music.app
--- Override macOS behaviour and send all media keys (play/prev/next) to
--- the last active of a specified list of apps in MusicAppMediaFix.mediaApps
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would remove in MusicAppMediaFix.mediaApps from this docstring, given the comment below.

local obj = { __gc = true }
--obj.__index = obj
setmetatable(obj, obj)
Expand All @@ -16,6 +17,9 @@ obj.homepage = "https://github.com/Hammerspoon/Spoons"
obj.license = "MIT - https://opensource.org/licenses/MIT"

obj.eventtap = nil
obj.appWatcher = nil
obj.mediaApps = {"Music"}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should really have a docstring and be notated as a Variable.

obj.currentApp = nil

-- Internal function used to find our location, so we know where to load files from
local function script_path()
Expand All @@ -25,7 +29,9 @@ end
obj.spoonPath = script_path()

function obj:init()
self.currentApp = self.mediaApps[1]
self.eventtap = hs.eventtap.new({hs.eventtap.event.types.systemDefined}, self.mediaKeyCallback)
self.appWatcher = hs.application.watcher.new(self.appWatcherCallback)
end

function obj.mediaKeyCallback(event)
Expand All @@ -38,19 +44,32 @@ function obj.mediaKeyCallback(event)

-- handle action
if data["down"] == false or data["repeat"] == true then
for i, app in pairs(obj.mediaApps) do
if app ~= obj.currentApp then
hs.osascript.applescript('tell application "' .. app .. '" to pause')
end
end
if data["key"] == "PLAY" then
hs.applescript('tell application "Music" to playpause')
hs.applescript('tell application "' .. obj.currentApp .. '" to playpause')
elseif data["key"] == "FAST" then
hs.applescript('tell application "Music" to next track')
hs.applescript('tell application "' .. obj.currentApp .. '" to next track')
elseif data["key"] == "REWIND" then
hs.applescript('tell application "Music" to previous track')
hs.applescript('tell application "' .. obj.currentApp .. '" to previous track')
end
end

-- consume event
return true, nil
end

function obj.appWatcherCallback(appName, eventType, app)
if hs.fnutils.contains(obj.mediaApps, appName)
and (eventType == hs.application.watcher.activated) then
obj.currentApp = appName
print("Sending media key events to " .. appName)
end
end

--- MusicAppMediaFix:start()
--- Method
--- Starts the hs.eventtap that powers this Spoon
Expand All @@ -64,6 +83,7 @@ function obj:start()
if self.eventtap:isEnabled() ~= true then
self.eventtap:start()
end
self.appWatcher:start()
return self
end

Expand All @@ -80,6 +100,7 @@ function obj:stop()
if self.eventtap:isEnabled() then
self.eventtap:stop()
end
self.appWatcher:stop()
return self
end

Expand Down
Loading