コンテンツにスキップ
Documentation

開発ガイド

このガイドでは、Media Sortにコードで貢献し始めるために必要なすべてを説明します。コードベースの構成概要については、アーキテクチャ概要のページをご覧ください。

  • Rust 1.96以降(rustupでインストール)
  • Clang(FFIバインディング用にlibmpv-sysが必要)
  • libmpv開発ファイル:
    • Linux: libmpv-dev(Debian/Ubuntu)または同等品
    • macOS: brew install mpv
    • Windows: vcpkgまたは手動インストール
  • プラットフォームライブラリ(Linux):
    • libasound2-dev(音声用ALSA)
    • libx11-dev、libwayland-dev(ウィンドウシステム)
    • Vulkanドライバとローダー
ターミナルウィンドウ
# ワークスペース全体をビルド
cargo build --workspace
# GUIバイナリのみをビルド
cargo build -p media-sort-gui
# リリースビルド
cargo build --workspace --release
ターミナルウィンドウ
# GUIを実行(デフォルトでシステムのPicturesディレクトリを開きます)
cargo run -p media-sort-gui
# 特定のディレクトリを開く
cargo run -p media-sort-gui -- /path/to/media
# インタラクティブデモモードで実行
cargo run -p media-sort-gui -- --demo
ターミナルウィンドウ
# すべてのテストを実行
cargo test --workspace
# 特定のクレートのテストを実行
cargo test -p media-sort-core
cargo test -p media-sort-backend
cargo test -p media-sort-gui

テストの配置場所:

  • crates/media-sort-core/tests/: 統合テスト
  • crates/media-sort-backend/tests/: 統合テスト(テストフィクスチャはtests/fixtures/にあります)
  • crates/media-sort-gui/src/: #[cfg(test)]ユニットテスト

コミット前にフォーマッタとリンターを実行してください。

ターミナルウィンドウ
# すべてのコードをフォーマット
cargo fmt --all --
# 警告をエラーとしてclippyを実行
cargo clippy --workspace --all-targets -- -D warnings

プレコミットフックがこれらを自動的に強制します。clippyが失敗した場合、コミットは拒否されます。

ユーザー向け文字列はFluent(.ftl)ファイルにあります。

resources/locale/
├── en/main.ftl
├── de/main.ftl
└── ja/main.ftl

コードに新しいユーザー向け文字列を追加する場合、3つすべてのロケールファイルに対応するエントリを追加する必要があります。英語ファイルが正本となります。

ビルドスクリプト(crates/media-sort-core/build.rs)はロケールファイルの変更を自動的に検出し、ルックアップコードを再生成します。

設定はcrates/media-sort-core/src/settings/で定義されています。新しい永続化設定を追加するには:

  1. 適切なサブ構造体(例: GeneralSettings)にフィールドを追加
  2. 古い設定ファイルが読み込み可能なように#[serde(default)]を追加
  3. 設定にUIトグルがある場合、設定ダイアログビューを更新
  4. 変更後にstate.settings.save()を呼び出す
  5. website/内のドキュメントを更新(settings.mdxとconfig-file.mdxの両方)

動画再生は複数のレイヤーで構成されています。

  1. 起動時: main.rsがmpvにサポートフォーマットを問い合わせ、MediaRegistryを初期化
  2. サブスクリプション: VideoWorkerスレッドがmpvイベントループを実行
  3. 通信: GUIがチャネル経由でVideoCommandを送信、ワーカーがVideoEventで応答
  4. レンダリング: フレームデータがRGBAピクセルとして到着し、ゼロコピーVulkan相互運用のためのカスタムwgpuシェーダーでレンダリング
  5. ライフサイクル: 動画から離れるとDeactivateがレンダリングを停止

動画ワーカーの実装はcrates/media-sort-backend/src/media/mpv_context.rs、GPUシェーダーはcrates/media-sort-gui/src/widgets/video_shader.rsを参照してください。

Media Sortには、ドキュメントウェブサイト用のデモ動画を生成するために使用されるヘッドレス自動化エンジンが含まれています。

ターミナルウィンドウ
# すべてのデモフローをMP4動画にレンダリング
cd website && npm run render-demos

デモフロー仕様はresources/demo_flows/のJSONファイルです。自動化エンジン(crates/iced-automation/)はフルアプリケーションをヘッドレスで(ウィンドウなしで)実行し、レンダリングパイプラインを通じてフレームをキャプチャします。

mediasort.appのウェブサイトは、website/ディレクトリにあるAstro/Starlightプロジェクトです。

ターミナルウィンドウ
cd website
npm ci
npm run dev # 開発サーバーを起動
npm run render-demos # デモ動画をレンダリング
npm run build # プロダクションビルド

ドキュメントページはwebsite/src/content/docs/にロケールごとにサブディレクトリ(en/、de/、ja/)で配置されています。サイドバーはastro.config.mjsで設定されています。

変数 目的
UI_TEST 設定パスをカレントディレクトリのui_test_config.tomlに切り替え
LANG / LC_ALL ロケール検出を上書き(デモ動画レンダリング時に使用)