コンテンツにスキップ
Documents for MorningStatusApp
Esc
移動開く⌘Jプレビュー
このページの内容

プレイリスト機能 画面設計書

最終更新: 2026-03-21

1. 概要

プレイリスト機能(#336)で追加・変更される画面の設計。 新規2画面(プレイリスト一覧・詳細)と、既存2画面(メンバー詳細・リリース詳細)へのセクション追加を定義する。


2. 画面一覧(プレイリスト関連)

画面名 URL パターン レンダリング方式 対応 Issue
プレイリスト一覧 /playlists SSR(動的) #332
プレイリスト詳細 /playlists/[id] SSR(動的) #332

既存画面への追加セクションは §5 を参照。


3. プレイリスト一覧画面(/playlists

概要

全プレイリストをカード形式で一覧表示する画面。 playlists.json のデータを Vercel Blob から取得して表示する。

表示コンテンツ

要素 内容
ナビゲーション 「ホームに戻る」リンク(/ へ)
ページタイトル 「プレイリスト」
プレイリスト数 登録プレイリスト件数(例: 3件
プレイリストカード一覧 公開日降順のカードグリッド

プレイリストカードの表示項目

項目 内容
プレイリスト名 Playlist.name(プレイリスト詳細画面へのリンク)
公開日 Playlist.publishedAt(YYYY-MM-DD 形式)
収録曲数 entries.length
説明文 Playlist.description(設定されている場合のみ表示)

データなし表示

playlists が空配列の場合は「プレイリストデータがまだありません」などのメッセージを表示する。

ヘッダーナビゲーション

トップ画面(/)のヘッダーには「プレイリスト」へのナビリンクを追加済み(#332 で実装)。


4. プレイリスト詳細画面(/playlists/[id]

概要

特定プレイリストの詳細情報と収録楽曲リストを表示する画面。 [id]Playlist.id(kebab-case の識別子)。

表示コンテンツ

要素 内容
ナビゲーション 「プレイリスト一覧に戻る」リンク(/playlists へ)
プレイリスト切り替え 「← 前のプレイリスト / 次のプレイリスト →」のリンク(sortPlaylists の並び順基準)
プレイリスト名 Playlist.name
公開日 Playlist.publishedAt
説明文 Playlist.description(設定されている場合のみ表示)
収録楽曲リスト entries の各エントリを順番に表示

楽曲エントリの表示項目

項目 内容 リンク先
メンバー名 PlaylistEntry.memberId から引いたメンバー名 /members/{memberId}
メンバーの所属ユニット メンバー名の右に、所属する全ユニット(上位 or 単独、重複排除)を (ユニットA・ユニットB) 形式で併記 /units/{id}
楽曲タイトル trackId あり → Track.title、なし → songTitlereleaseId が設定されている場合のみリンクになる(リリースリンクは楽曲タイトル自体に統合されており、別要素はない) releaseId あり → /releases/{releaseId}trackId もある場合は #track-{trackId} アンカー付き)
アーティスト名 trackId をキーに、そのトラックの Track.unitId から対応するユニットを解決して表示(units.jsonreleaseIds で逆引きするのではない)。一致しない場合は非表示 /units/{id}(各期ユニットの場合は上位ユニットへのリンク)
サブスクリンクバッジ trackId が設定されている楽曲の Track.links[] の各プラットフォームへのリンクボタン 各サービスの URL(新しいタブで開く)
YouTube Music プレイヤー埋め込み Track.links[]youtube-music タイプのリンクがあり、URLから動画IDを抽出できた場合のみ、サブスクリンクバッジの下に YouTubePlayer を埋め込み表示

サブスクリンクバッジのデザイン

プラットフォーム 表示ラベル
youtube YouTube
youtube-music YouTube Music
tiktok TikTok
spotify Spotify
apple-music Apple Music
line-music LINE MUSIC
recochoku レコチョク
mora mora
genius Genius
other 外部リンク
  • バッジは各プラットフォーム固有の背景色で表示する(ExternalLinkBadgeLINK_COLOR
  • リンクは target="_blank" rel="noopener noreferrer" で新しいタブで開く
  • trackId 未設定または Track.links[] が空の場合はバッジを表示しない

リリース詳細へのリンクとアンカー仕様

  • releaseId が設定されている楽曲タイトルをクリックすると /releases/{releaseId} に遷移する
  • trackId も設定されている場合は /releases/{releaseId}#track-{trackId} のアンカーリンクで収録曲一覧の該当行に直接ジャンプする

id が存在しない場合

Playlist.id に一致するプレイリストが見つからない場合は notFound() を返す。


5. 既存ページへの追加

5.1 メンバー詳細画面(/members/[id])への追加

追加セクション名: 「選曲した楽曲」

配置場所: 「関連リリース」セクションの後に配置する。

データソース: member-playlist-index.json(Vercel Blob)をメンバー詳細ページのデータ取得時に並行フェッチする。

見出し行: 「選曲した楽曲」見出しの下に「プレイリスト一覧 →」リンク(/playlists へ)を配置する。

並び順トグル: 「プレイリスト順」「楽曲順」(songTitle の五十音順)を切り替えるボタン群。デフォルトは「プレイリスト順」。

表示項目:

項目 内容 リンク先
楽曲タイトル trackId あり → Track.title、なし → songTitle releaseId あり → /releases/{releaseId}trackId もある場合は #track-{trackId} アンカー付き)
プレイリスト名 Playlist.name /playlists/{playlistId}
サブスクリンクバッジ trackId が設定されている楽曲の Track.links[] の各プラットフォームへのリンクボタン 各サービスの URL(新しいタブで開く)

ゼロ件時: 選曲した楽曲が存在しない場合はセクション自体を非表示にする。


5.2 曲詳細画面(/songs/[id])へのプレイリスト掲載情報セクション

データソース: track-playlist-index.json(Vercel Blob)を曲詳細ページのデータ取得時に並行フェッチし、trackId(= Track.id)をキーにルックアップする。

配置場所: 収録リリース一覧の下。

表示項目:

項目 内容 リンク先
プレイリスト名 Playlist.name /playlists/{playlistId}
選曲メンバー メンバー名(memberIdmemberName の両方がある場合のみ表示) /members/{memberId}

ゼロ件時: 掲載プレイリストが存在しない場合はセクション自体を非表示にする。

変更履歴(#400・#402): 旧 §5.2「リリース詳細画面へのプレイリスト掲載情報追加」は削除された。release-playlist-index.jsonreleaseId キー)も廃止し、track-playlist-index.jsontrackId キー)に統合。


6. クロスリンク設計図


7. 後続 Issue との関係

Issue 本設計書への依存内容
#332 プレイリスト一覧・詳細ページ実装 §3・§4 の設計に基づいて実装
#333 メンバー詳細画面への選曲楽曲一覧セクション追加 §5.1 の設計に基づいて実装
#401 曲詳細画面へのプレイリスト掲載情報セクション追加 §5.2 の設計に基づいて実装
#349 プレイリスト詳細画面への YouTube Music 再生機能追加 §4 のサブスクリンクバッジ設計を拡張して実装

改訂履歴

更新日 変更内容
1.2 2026-07-18 実装との乖離是正: ナビゲーション文言、アーティスト名解決ロジック(trackId起点。releaseId逆引きではない)、存在しない「リリースリンク」要素の削除、プレイリスト切り替えナビ・メンバー所属ユニットリンク・YouTube Musicプレイヤー埋め込み・並び順トグルの追記、サブスクバッジにtiktokgeniusを追加(#1366)
1.1 2026-04-04 §4 楽曲エントリにアーティスト名(ユニット詳細リンク)を追加、クロスリンク設計図に PLAYLIST → UNIT 遷移を追加(#561)
1.0 2026-03-21 初版作成(#329)

このページは役に立ちましたか?