🗂

YouTube (Music) のプレイリスト管理を楽にするウェブアプリを Next.js で作った

2024/12/21に公開

はじめに

こんにちは。鈴木です。
個人開発で YouTube、YouTube Music のプレイリストを簡単にするウェブアプリケーション Playlist Manager For YouTube (https://pmfy.suzuki3.jp) を開発しました。
リポジトリはこちらです。
https://github.com/suzuki3jp/YouTubePlaylistManager

何ができる?

YouTube, YouTube Music のプレイリストを管理できます。

  • プレイリストをコピー
  • プレイリストのアイテムをシャッフル
  • プレイリスト同士を結合
  • プレイリストを削除
  • プレイリストのアイテムを検索

    プレイリストを管理する画面

    プレイリストアイテムの検索画面

開発の背景

プレイリスト同士をマージしたい

普段から YouTube Music を使っていて、K-POP, 洋楽などジャンル別のプレイリストを作成しています。
それらのジャンルの曲を含んだ "すべて" のようなプレイリストを作成したかったのですが、当時すでに K-POP プレイリストは150曲ほど、洋楽プレイリストは100曲ほど入っていたので手作業で追加するには大変な量でした。

プレイリストのアイテムをシャッフルしたい

YouTube Music のシャッフル再生はプレイリストから毎回ランダムに曲が選ばれるのではなく、何曲スキップするかを毎回ランダムに決めている(多分)ので "すべて" のようなプレイリストを作成すると、ジャンルそれぞれが固まっているのでランダム再生をしても同じジャンルが続きます。
そのため、真にランダムな再生をするため、プレイリストそもそもをシャッフルするという需要がありました。

使用技術

Vercel デプロイ先 Next.jsと相性がいい
Next.js フレームワーク
TypeScript 型最高!
Material UI コンポーネントライブラリ 今のデザインに満足していないので他のライブラリに乗り換えるかも
NextAuth Google OAuth、永続化が簡単
YouTube Data API v3 NextAuth で取得したアクセストークンを使用して、APIにリクエスト

工夫したこと

認証について

Google 認証周りは NextAuth の GoogleProvider がよしなにやってくれました。
ユーザーの機密情報をサーバーに保存したくなかったので、Cookie に JWT 形式で保存する方法を採用しました。
詳しくは以下の記事で紹介しています。
https://zenn.dev/suzuki3jp/articles/nextauth-approuter-google-20241025

Next.js Server Actions はなるべく小さい粒度で作成する

当初プレイリストの コピー・シャッフル・マージ・削除 の操作を行う Server Action をそれぞれ作成していました。
しかしコピーなどは処理完了までに長い時間が予想されるので、進捗を表示するために state を変更するようなイベントハンドラを Server Actions に渡そうと思ったところ、Server Actions はクライアントサイドで定義された関数を渡せないようで、進捗の表示に行き詰まっていました。

そこで Server Actions を プレイリストを作成する・プレイリストにアイテムを追加する・プレイリストアイテムのポジションを変更する のようになるべく小さな粒度で作成します。
そしてそれらを コピー・シャッフル・マージ の固有のロジックを含んだ純粋な関数から呼び、その関数にクライアントサイドで定義したイベントハンドラを渡すことで進捗の表示を実装しました。

i18n について

今回のアプリケーションでは YouTube Data API を使用しており、Google の OAuth も併せて使用しています。そのため Google の OAuth 関係の審査のために少なくとも英語に対応する必要がありました。
せっかくなので、多言語対応しようと思い、i18n を実装しました。
クライアントサイドとサーバーサイド両方で翻訳を利用できるようにするのに大分詰まりました。
詳しくは以下の記事で紹介しています。
https://zenn.dev/suzuki3jp/articles/nextjs-i18n-20241115

課題と展望

デザイン

当初自分用のツールとして開発をスタートし、localhostで使用することを想定していたため、デザインを凝ることよりも開発速度を優先しました。
そのため、お世辞にもおしゃれとは言えないデザインになっています。
ホストするならもう少しデザインを凝るのも勉強になっていいなと思っています。

エラーハンドリング

これも当初はlocalhostでの使用を想定したことに関係するのですが、Github にソースコードを公開するだけの場合、非エンジニアが利用することは考えずらかったため、現在は YouTube Data API からエラーコードが変えてきた場合やその他エラーが発生した場合など、エラーコードを表示するのみで処理を中断しています。
これをもう少しユーザーフレンドリーな形にアップデートする必要があると感じています。

追加予定の機能

  • プレイリストのアイテムを曲名やアーティスト名でソートする
  • プレイリストからアーティスト名で曲を抽出する
  • プレイリストから手選択でアイテムを抽出する
  • 操作で出力されるプレイリストを指定可能にする
    • 現在は毎回新しいプレイリストを作成している
    • これを指定可能にすることで API quota の節約にもなる
    • ユースケースによってはより便利になる

さいごに

今後も継続してメンテナンスを続けていくつもりです。
よければ Github リポジトリにスターをお願いします!
https://github.com/suzuki3jp/YouTubePlaylistManager

GitHubで編集を提案

Discussion