JXA + Spotify + Macでワンクリックでアプリの起動＋好きな曲を再生する

# JXAとは
これです。
[知らないうちにMacがシステム標準でJavaScriptで操作できるようになってた (JXA)](https://qiita.com/zakuroishikuro/items/1b02378bf9e940602d87)

練習がてらSpotifyを起動して好きな曲を再生するアプリを作ってみます。

## STEP1. スクリプトエディタを起動、新規書類をjavascriptモードで開く
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520951/93dd3b0a-4147-c41c-9aab-349062d63e9d.png" width=60%>

## STEP2. コードを書く

追記：はじめにシャッフルを有効にして、通知センターを使って曲名も表示することにしてみました。
私はURIに My Library > お気に入りの曲 を指定しています。

参考: 

- [JXAのUIエレメントのリンクを取得するスクリプト](https://qiita.com/zakuroishikuro/items/3023d34eba7986066e7c)
- [AppleScript / JavaScript for Automation (JXA) を使ってMacに通知を出す](https://qiita.com/ytkhs/items/3ffa24fe6078bba3a15b)


```Javascript
var spotify = Application("Spotify")
var target = "流したい曲/アルバム/アーティスト/プレイリストのURI"

// シャッフルを有効にする
if(spotify.shuffling() == false){
	const shuffleMenu = Application("System Events").applicationProcesses.byName("Spotify").menuBars.at(0).menuBarItems.byName("曲の再生").menus.byName("曲の再生").menuItems.byName("シャッフル")
	shuffleMenu.click()
}

spotify.playTrack(target)

// 現在の曲のtrackを取得
var current = spotify.currentTrack
delay(0.1)

//通知を表示
var app = Application.currentApplication()
app.includeStandardAdditions = true
app.displayNotification(current.artist() , {
    withTitle: current.name(),
	subtitle: current.album(),
	soundName: 'Pop'
})
```

## STEP3. 流したい曲/アルバム/アーティスト/プレイリストのURIを調べる
URIとはSpotifyの中での住所的なやつです。
調べる方法は次の2つ。

#### 1. ブラウザ版SpotifyのURLを見る

アルバムやプレイリストを開くと
https://open.spotify.com/album/4RlqowFUNcZR7UTUinXZlT
（アルバム「かつて天才だった俺たちへ」 by Creepy Nuts）
のように https\://open.spotify.com/ + 〇〇 という形式になっていると思います。
この〇〇はURIに対応しているので

```Javascript
var target = "spotify:album:4RlqowFUNcZR7UTUinXZlT"
```
のように書けばOKです。

#### 2. Spotify APIを使って調べる

1の方法だとアルバム/アーティスト/プレイリストのURIは分かるのですが個別の曲のURIの調べ方がいまいち分かりませんでした。（追記：「曲のリンクをコピー」という機能から普通に調べられました。。）そこでAPIを使ってダイレクトに調べます。

参考: [Spotify APIで遊んでみる](https://qiita.com/musiccoffeetea/items/69a58d6d66e42b3c113f)

1の方法でアルバムのURIが既に分かっている時は、簡単に曲のURIを検索できます。

```Python
import pprint

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

client_id = 'xxxxxxxxxxxxxx'
client_secret = 'xxxxxxxxxxxxxx'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(
    client_id, client_secret)
spotify = spotipy.Spotify(
    client_credentials_manager=client_credentials_manager)

results = spotify.album('アルバムのURI（英数字部分）')
# 例えば、results = spotify.album('4RlqowFUNcZR7UTUinXZlT')
results = results['tracks']['items']

pprint.pprint(results)
```
これで、下のように曲ごとの詳細情報が一覧表示されるので、その中のuriの項目を使えばOKです。

```
~~省略 ~~~
'name': 'かつて天才だった俺たちへ',
'preview_url': 'https://p.scdn.co/mp3-preview/037b28ab2dbdc68efb5b6a85398645a16a010f60?cid=67c1745df8724b52918df69aab8ff0bd',
'track_number': 7,
'type': 'track',
'uri': 'spotify:track:4qjpey2aljl28C40NmTcgQ'
~~省略 ~~~
```

## STEP4. アプリの作成
スクリプトエディタに戻って、ファイル > 書き出す より、フォーマットでアプリケーションを選んで保存します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520951/7647edf9-5c74-1655-7aa0-93d455312ac2.png" width=60%>

アイコンを変えてDockに追加すれば、ワンクリックで曲の再生までやってくれるアプリができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520951/480efeda-2b6f-8d54-9475-c088db396c60.png)