-
Notifications
You must be signed in to change notification settings - Fork 0
/
HyperlinkHijacker.lua
166 lines (141 loc) · 5.71 KB
/
HyperlinkHijacker.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
-- HyperlinkHijacker: https://github.com/sryo/Spoons/blob/main/HyperlinkHijacker.lua
-- Choose which browser opens your links. Shift-click to bypass chooser.
local passthroughs = {
spotify = { url = "https://open.spotify.com/", appName = "Spotify", bundleID = "com.spotify.client" },
-- Add more passthroughs here if needed
}
local browsers = {
{ name = "Arc", appName = "Arc", bundleID = "company.thebrowser.Browser", args = {""} },
{ name = "Google Chrome", appName = "Google Chrome", bundleID = "com.google.Chrome", args = {""} },
{ name = "Google Chrome (Incognito)", appName = "Google Chrome", bundleID = "com.google.Chrome", args = {"--incognito"} },
{ name = "Firefox", appName = "Firefox", bundleID = "org.mozilla.firefox", args = {""} },
{ name = "Firefox (Private)", appName = "Firefox", bundleID = "org.mozilla.firefox", args = {"-private"} },
{ name = "Safari", appName = "Safari", bundleID = "com.apple.Safari", args = {""} },
{ name = "Copy to Clipboard", action = "clipboard", args = {""} },
-- Add more options here if needed
}
local countdownValue = 5
local function debugLog(message)
print("DEBUG: " .. message)
end
local function getLastUsedBrowser()
local saved = hs.settings.get("lastUsedBrowser")
debugLog("Retrieved last used browser: " .. hs.inspect(saved))
return saved or { bundleID = browsers[1].bundleID, args = browsers[1].args }
end
local lastUsedBrowser = getLastUsedBrowser()
local function saveLastUsedBrowser(browser)
local toSave = { bundleID = browser.bundleID, args = browser.args }
hs.settings.set("lastUsedBrowser", toSave)
lastUsedBrowser = toSave
debugLog("Saved last used browser: " .. hs.inspect(toSave))
end
local function generateChoices(browsers)
local choices = {}
local lastUsedChoice = nil
for _, browser in ipairs(browsers) do
local icon = browser.bundleID and hs.image.imageFromAppBundle(browser.bundleID) or nil
local choice = {
["text"] = browser.name,
["subText"] = "Open link in " .. browser.name,
["image"] = icon,
["bundleID"] = browser.bundleID,
["action"] = browser.action,
["args"] = browser.args,
["appName"] = browser.appName,
}
if browser.bundleID == lastUsedBrowser.bundleID and
((browser.args[1] == lastUsedBrowser.args[1]) or
(browser.args[1] == "" and lastUsedBrowser.args[1] == nil)) then
choice.subText = choice.subText .. " (Last used)"
lastUsedChoice = choice
else
table.insert(choices, choice)
end
end
if lastUsedChoice then
table.insert(choices, 1, lastUsedChoice)
end
return choices
end
local function generateChoicesWithCountdown(countdown, browsers)
local choices = generateChoices(browsers)
choices[1].subText = choices[1].subText .. " (" .. countdown .. ")"
return choices
end
function handleUrlEvent(scheme, host, params, fullURL)
debugLog("Handling URL: " .. fullURL)
hs.printf("🔗 URL: %s", fullURL)
local modifiers = hs.eventtap.checkKeyboardModifiers()
if modifiers["shift"] then
hs.printf("🚀 Launching %s", browsers[1].appName)
hs.urlevent.openURLWithBundle(fullURL, browsers[1].bundleID)
return
end
for _, passthrough in pairs(passthroughs) do
if string.sub(fullURL, 1, string.len(passthrough.url)) == passthrough.url then
hs.printf("🚀 Launching %s", passthrough.appName)
hs.urlevent.openURLWithBundle(fullURL, passthrough.bundleID)
return
end
end
local countdown = countdownValue
local countdownTimer
local browserChooser
local function cleanup()
if countdownTimer then
countdownTimer:stop()
countdownTimer = nil
end
if browserChooser then
browserChooser:delete()
browserChooser = nil
end
end
local function handleBrowserSelection(choice)
if choice then
hs.printf("🚀 Launching %s", choice.text)
if choice.action == "clipboard" then
hs.pasteboard.setContents(fullURL)
else
saveLastUsedBrowser(choice)
if choice.args and choice.args[1] ~= "" then
local args = table.concat(choice.args, " ")
local cmd = "/usr/bin/open -a \"" .. choice.appName .. "\" --args " .. args .. " \"" .. fullURL .. "\""
hs.execute(cmd)
else
hs.urlevent.openURLWithBundle(fullURL, choice.bundleID)
end
end
end
cleanup()
end
browserChooser = hs.chooser.new(handleBrowserSelection)
browserChooser:choices(generateChoices(browsers))
browserChooser:show()
countdownTimer = hs.timer.new(1, function()
if browserChooser and browserChooser:query() == "" then
countdown = countdown - 1
if countdown == 0 then
browserChooser:select(1)
else
browserChooser:choices(generateChoicesWithCountdown(countdown, browsers))
browserChooser:refreshChoicesCallback()
end
else
countdownTimer:stop()
end
end)
countdownTimer:start()
-- Set up a separate timer to check if the chooser has been closed
local checkClosedTimer = hs.timer.new(0.1, function()
if not browserChooser:isVisible() then
cleanup()
checkClosedTimer:stop()
end
end):start()
return browserChooser, countdownTimer
end
hs.urlevent.setDefaultHandler('http')
hs.urlevent.setDefaultHandler('https')
hs.urlevent.httpCallback = handleUrlEvent