標籤:

HammerSpoon - 實現音樂播放的全局鍵盤控制

原文鏈接:HammerSpoon - 實現音樂播放的全局鍵盤控制

關於 HammerSpoon 的基本介紹,請參考我的上一篇博文

關於本文中提到的 VOX,請點這裡

概述

由於地區限制和版權原因,不得不忍痛割愛網易雲音樂。從那之後便開始尋找一款 MacOS 上適合自己的播放器

先說說本篇博客的主角,VOX。作為一個顏控,第一眼確實被它的外觀吸引:

同時,他們提供一個叫 LOOP 的音樂服務,可以簡單理解為音樂雲盤。用戶可以把自己的歌曲上傳到 LOOP 提供的雲空間,然後就可以通過雲或者下載到本地播放了。這個空間是"沒有上限的!!!".repeat(3),至少現在是這樣

另外,如果你的 iTunes 有珍藏多年的音樂,VOX 一樣可以讀取出來,無縫同步,這個功能並不需要付費

通過一段時間的調查,做了一個價格、服務方面的橫向對比,分享給大家,如有錯誤歡迎指正:

  • Foobar2000 就不用說了,懂的人自然懂,可惜沒有 Mac 版,這款軟體一直都是資深音樂愛好者首推的神器

  • Clementine 則勝在全平台兼容,以及可以讀取 Dropbox 之類的網盤,當然前提是你的網盤空間得足夠大 (好像不支持百度雲。。)

  • Deezer 和 TIDAL 一樣,提供**在線**的無損音樂播放。雖然他們宣稱的總歌曲數比 Google Play 和 Apple Music 都要多,但中文歌曲數量還是太少了。另外,Deezer 需要第三方的硬體 SONOS 才能提供無損音樂播放服務

  • Google Play 其實中文歌不少。當然,肯定是不全的,至於一些小眾的歌曲就別指望找到了。播放器網頁版中規中矩,本地版,能用肯定是能用,但顏控估計是不會喜歡的

  • Spotify,付費用戶可以選擇高音質,也即是 320K MP3,並不提供無損。其實 Spotify 界面還是不錯的,而且跨平台性非常好,甚至 PS4,Bose 音箱都支持
  • Apple Music 用起來著實方便,和系統的結合度倒是值得一提,比如,你可以用在 iTunes 找到的歌來當鬧鐘鈴聲。英文歌資源非常多,從大眾的 Taylor Swift 到小眾的 Mono Inc,Bullet For My Valentine 都有,新磚也能找到。中文歌曲方面和 Google Play 差不多,不少,但稱不上全(至少很多我愛聽的歌沒有)。順便,iTunes 其實支持 FLAC 或者 APE 格式的播放,只是需要安裝插件

HammerSpoon + Watever

軟體,沒有最好的,只有最合適的

篇幅有限,不得不開啟下一個話題。對播放器方面有問題的朋友歡迎在底下留言,大家一起討論

一. HammerSpoon

上一篇博文中已經提到,HammerSpoon 不止是窗口管理。它還可以讀取系統的 API,可以執行 AppleScript。這兩個特性,為我們通過鍵盤全局操作音樂播放提供了堅實的基礎。實現全局的音樂播放控制,我們只需要 HammerSpoon 的這幾個 API:

  • hs.osascript.applescript() - 執行 AppleScript。同時,

    hs.osascript.javascript()n

    也提供了執行 JavaScript 的介面

  • hs.hotkey.bind() - 既然是用鍵盤來控制音樂播放,那麼綁定鍵盤快捷鍵的方法肯定是必不可少的
  • hs.alert - 可選,非必備。我是用這個來顯示曲目信息的

二. AppleScript 概述

AppleScript 是蘋果公司開發的腳本語言,可以用來控制 MacOS 上運行的程序,也可以寫成獨立的 Applet

所以,只要我們能獲取到 App 的介面,就可以通過 AppleScript 讓 App 來搞事情了。舉個例子,比如咱們安裝了迅雷,迅雷提供了一個開始下載的介面,叫 "startDownload"。這時候,我們只需要這樣寫 AppleScript:

tell application "迅雷" to startDownloadn

然後執行,那麼迅雷就可以開始下載了(事實上,迅雷並沒有提供這樣的介面=。=

AppleScript 的這個語法,其實和英語表達非常接近(接近自然語言),直接翻譯過來就是

告訴應用程序「迅雷」,(讓它)開始下載n

很好理解是不是?

三. App 介面

那麼現在,我們只需要找到應用程序介面,就大功告成了。我們可以在系統里直接查看,步驟如下:

1. 打開這個叫 ScriptEditor 的東西 (中文系統下叫「腳本編輯器」)

2. 然後就得到了這個界面,不用管它,點 "Done" 就好

3. 點擊 「File -> Open Dictionary」,找到你想要折騰的 App,打開(註:如果這裡面沒有,那多半是沒有文檔,或者不支持,我沒測試過所有 App)

4. 比如我們打開 VOX,就得到了如下的內容:

至此,一切都變得很簡單了。我們只要寫這個代碼:

tell application "VOX" to playn

並執行,就可以讓 VOX 播放歌曲了。同樣道理:

tell application "VOX" to nextn

就是切換到下一首歌。至於每個 API 是幹什麼的,文檔里都有說明

當然,我們也可以用同樣的方式找到不僅限於 iTunes,Spotify,iTerm,Alfred,Atom 的 API,然後寫一些自己想實現的功能

四. 與 HammerSpoon 合體

說了半天,終於到了合體的時候。用 VOX 的朋友可以直接使用我封裝好的 API

1. 基本操作

代碼變得非常簡單,比如,我們想把 「Ctrl + j」 設置為切換播放/暫停。那麼只需要:

hs.hotkey.bind({"ctrl"}, "j", hs.vox.playpause())n

我的代碼中,在快捷鍵綁定部分又封裝了一次而已,封裝部分是這樣:

local voxHyper = {"cmd", "alt", "shift"}nnlocal function voxBindTable(keyFuncTable, hyper)n for key,fn in pairs(keyFuncTable) don hs.hotkey.bind(hyper or voxHyper, key, function() fn() end)n endnendn

這個方法,首先接收一個 Table (可以理解為 JS 的對象,或者,HashMap?)然後接收 HyperKey 設置。我的 HyperKey 設置為 「Cmd + Alt + Shift」。然後遍歷傳入的 Table,把每一組的 key 和回調方法綁定上

調用起來就很方便了。我把 「hyper + j」 綁定為切換播放/暫停,「hyper + h」 綁定為上一首

voxBindTable({nn j = hs.vox.playpause,nn h = hs.vox.previous,nn l = hs.vox.next,nn k = hs.vox.trackInfo,nn i = hs.vox.togglePlaylistnn})n

2. 顯示歌曲信息

之前提到了 hs.alert,用處就是,讀取 VOX 的 API 獲得當前曲目的歌曲信息 (歌名,演唱者以及專輯名),然後顯示在屏幕上,持續 2 秒。效果如下圖:

代碼就是上面的 「hyper + k」,API 方面,「hs.vox.trackInfo()」 已經封裝好了

3. 顯示/隱藏播放列表

這個功能就是,類似於播放器的切換標準模式和 Mini 模式。API 已經封裝成了 「hs.vox.togglePlaylist()」,實際效果如圖(動圖):

不得不說的

  1. 每個應用程序的 API 不盡相同,比如我在 HammerSpoon 里封裝的 「hs.vox.trackInfo()」 只適用於 VOX。如果你不放心,可以先在 Console 里執行一下:「hs.vox.trackInfo()」,然後你就會得到一個彈出的信息框

  2. 對於沒有封裝的,也很簡單。按照上面提到的方法查 API 文檔,比如 Spotify 也提供了一個叫 「pause」 的 API,那就可以在控制台里執行這段代碼測試:

    hs.applescript.applescript(tell application "Spotify" to pause)n

    理論上會讓 Spotify 暫停播放

  3. 用好控制台 * 3,可以幫你在寫代碼過程中省不少時間。關於一些小技巧,我會在下一篇文章中提到

寫在最後

這是 HammerSpoon 的第二篇。下一篇打算聊聊全局的快捷鍵綁定,已經實現的功能是,類似於 VIM,通過 `hyper + hjkl` 的方式來實現全局的游標移動(方向鍵)。涉及到的事兒可能比較多,感興趣的朋友可以先試用一下,提提意見和建議。代碼在這裡,文檔在這裡

歡迎在頁面下方評論和留言。如果你喜歡這篇文章,請幫我點個贊

推薦閱讀:

不去爭取自理能力、還盡找理由?
為什麼你覺得 Windows 比 OS X 好?
兌換碼有限,我希望發揮它們真正的價值

TAG:Lua | macOS |