Discordのnowplayingに音楽を表示させるのを作った

2020-05-09

デスクトップ常駐型アプリケーションを作りました.

Github
使い方



経緯

Last.fm を見つけた

ライフログを取るのにハマっていて,GPS とかの記録を取ったりしているのですが,ふと音楽のログも取りたいと思いました.
そのようなサービスがないか調べたところ,Last.fm というものがありました. Spotify などと連携して聞いた音楽のログを取り,似た傾向のおすすめの曲を紹介してくれるそうです. 気に入ったのが,ログを取るための API が用意してあり,PC,スマートフォンのあらゆるプレイヤーで記録できるところで,もし対応していなければ開発すればいいのです.


共有したい

Last.fm の API リファレンスを見ていたところ今聞いている曲を取得できるのを見つけたので,これで discord の「プレイ中」欄に表示しようと考えたのでした.さりげなさがいい感じなので.



使ったもの

  • C# Windows フォームアプリ
  • Last.fm API
  • Discord RPC (Discord Game SDK の C#ラッパー)



ポイントなど

C#フォームアプリの基本

あんまり書く機会がなくて,いつも忘れるので.
Form クラスを継承したクラスのインスタンスに初期化処理を書けば動く.
定期実行は Timer クラスがあるので,以下で FunctionName に定期実行したい処理を書けばよい.

var timer = new Timer();
timer.Interval = 5000; //5s
timer.Elapsed += FunctionName;
timer.Enable = true //動き出す


タスクトレイ常駐

参考にしました. http://pineplanter.moo.jp/non-it-salaryman/2017/06/01/c-sharp-tasktray/
全部ここに書いてるのですが,やることは

  • タスクトレイにアイコンを追加する
  • タスクトレイアイコンに終了メニューを追加する
  • タスクバーに表示させない
  • フォームを表示させない

です.


discord RPC

ドキュメントが充実しているので特に書くこともないです. https://github.com/Lachee/discord-rpc-csharp
nuget で導入して README のチュートリアル通りに書けばいいです.

ただ最初は Discord Game SDK でやろうとしていて,文字化け問題に直面したのでかなり苦労しました.Issue→https://github.com/discord/discord-rpc/issues/119
ちなみに,昔は GameSDK でなくても RichPeresence を弄れたのですが API が廃止されたので面倒になりました. 昔は同じことをする js 製ツールがあったっぽいのですが,API 廃止で使えなくなっちゃったみたいです.


WebAPI を呼ぶ

HttpClient を使います.クエリパラメタも URL エンコードできます. その他まとめ →C# 今更ですが、HttpClient を使う - Qiita


動的な Json を処理する

動的な,というのは,Last.fm の API を JSON で受け取ると,Nowplaying かどうかで微妙に形が変わるため構造体を作ってそこにぶち込む,という手法が使えない,ということです.
Json.NET では動的にメンバが生成される Json オブジェクトが扱えるので,Json.NET を nuget で導入します.
面白かったのが,C#には dynamic 型という,Python や JS のように実行時に型が決まる静的な型(型自体は静的,ややこしい)が存在することです.ゆるゆるなので当然実行時エラーガンガンなんですけどね.

dynamic jsonResponse = JsonConvert.Deserialize(jsonString);
var m = jsonResponse.member;//

json で要素が存在するかは,メンバが存在するかなので,以下で判断できます.

jsonResponse.GetType().GetProperty("member") != null


参考



おわり

Last.fm の API は制限もゆるく太っ腹なのでいろいろ遊べそうです. 楽曲情報も取得できるっぽいのでそれで何かします.