Skip to content

スマホ用の画面を /m/ に足す(PC 版には手を入れない。D-115) - #41

Merged
AkashiSN merged 24 commits into
mainfrom
feat-mobile-ui
Oct 19, 2026
Merged

AkashiSN merged 24 commits into
mainfrom
feat-mobile-ui

Conversation

@AkashiSN

Copy link
Copy Markdown
Owner

PC 専用だった UI に手を入れずに、スマホ用のページを /m/ に足す(SPEC §12.7、D-115)。

何ができるか

  • 下タブ 4 つ: ライブラリ(アーティスト / アルバム / 曲の切り替えと検索)、フォルダ(カテゴリ → アルバムアーティスト → アルバム)、プレイリスト、購読
  • 曲をタップすると下からシートが出て、タグ・形式・ファイル情報を確認できる。シートから試し聴きとプレイリストへの追加ができる
  • タグの誤字はその場で 1 曲だけ直せる。PC と同じ preview → apply を通るので、PC の「履歴」から巻き戻せる
  • プレイリストの作成・名前の変更・削除、普通のプレイリストの追加・外す・並べ替え。スマートプレイリストは条件を 1 行ずつ組み立てる画面で編集し、組み立てられないルールはルール文の画面で編集する
  • 購読(YouTube 再生リスト)の手動同期。押すと進捗が出て、投入したダウンロードがすべて終わったら結果を 1 行で出す。Inbox の確認は PC で行う

PC 版に影響しないようにしたこと

  • スマホ版は web/src/mobile/ に置き、PC とは別の vite ビルド(web/vite.mobile.config.ts → web/dist/m)にした。PC のコンポーネント・フック・App.tsx・index.css・vite.config.ts は import も編集もしていない
  • npm run build の PC 側の出力(dist/m 以外)が変更前とバイト単位で同一であることを、各タスクで web/scripts/pc-dist-hash.sh で確かめた
  • サーバは足すだけ。/ はスマホの UA(Mobi / Android / iPhone)のときだけ /m/ へ 302 する(no-store、Vary: User-Agent, Cookie)。「PC 版を開く」で Cookie spindle_view=pc を立てると振り分けない。iPad は PC 版になる

サーバに足した API

  • GET /api/stream/:id?transcode=aac: Derived の AAC があれば Range 付きで直送し、無ければ ffmpeg で ADTS に変換して流す。スマホの試し聴きは Opus で流し、鳴らない端末では AAC に一度だけ切り替える(外から LTE 経由で使うため、原本の FLAC は流さない)
  • GET /api/ytmusic/subscriptions/:id/progress: 直近の同期と、その同期で投入した ytdl(と、まだ動いている古い ytdl)を返す

確認

  • cargo test 全件、cargo clippy -- -D warnings、cargo fmt --check
  • npx vitest run(613 件)、npm run build、npm run lint
  • 実際の spindle を起動し、スマホ幅のブラウザで各画面の操作を確認した。Opus から AAC への切り替えは、Opus を強制的に失敗させて確認した

未確認(RC で実機確認が要る)

  • iPhone の Safari と Xperia の Chrome での試し聴き。特にその場で変換するストリームは Range に対応しておらず、iOS では再生できない可能性がある。次の 3 通りで確かめたい: Derived の AAC がある可逆の曲、Derived の無い可逆の曲、非可逆(Opus)の原本
  • プレイリストの並べ替えを指で操作したときの感触

@AkashiSN
AkashiSN merged commit e283efb into main Oct 19, 2026
5 checks passed
@AkashiSN
AkashiSN deleted the feat-mobile-ui branch October 19, 2026 13:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant