コンテンツにスキップ

アーキテクチャ概要

レイヤー 技術 役割
フロントエンド SolidJS + Kobalte + Vite UI (ダッシュボード / 設定 / 更新 / ライセンス)
バックエンド Rust / Tauri v2 メディア取得・Discord 連携・設定管理
Android ネイティブ Kotlin 通知アクセス・フォアグラウンドサービス・JNI ブリッジ
src/ フロントエンド (SolidJS)
components/ パネル・カード等の UI コンポーネント
locales/{ja,en}.json i18n 文言 (起動時に OS 言語から自動選択)
src-tauri/
src/
adb/ ADB クライアントと dumpsys パーサー
apk_label/ APK 引き取りによるアプリ名解決 (+ディスクキャッシュ)
artwork/ ArtworkResolver プラグイン群 (ニコニコ・YouTube 等)
android/discord.rs Discord Social SDK の C FFI ラッパー
commands/app.rs フロントエンドへ公開する IPC コマンド
tray.rs, config.rs ... トレイ / 設定 / i18n / シャットダウン対応
gen/android/ Android プロジェクト (Kotlin)
app/src/main/java/... MediaCollectorService (通知アクセス) /
MediaInfoService (FGS) / MediaBridge (JNI) ほか
site/ ドキュメントサイト (Astro Starlight)
scripts/ ビルド支援スクリプト (ライセンス生成など)
  • デスクトップ: adb モジュールが dumpsys media_session を解析 → IPC コマンド get_media_info でフロントエンドが 5 秒間隔で取得 → 変化時のみ Discord IPC へ更新
  • Android: Kotlin 側のイベント (通知投稿/削除 + 30 秒の安全タイマー) が JNI MediaBridge.updateMediaInfo で Rust へ流れ、Tauri イベント media-updated としてフロントエンドへ配信される (通常はイベント駆動で、30 秒間隔の保険ポーリングを併用)

フロントエンドから呼び出せる Tauri コマンド (commands/app.rs):

コマンド 対応環境 用途
get_adb_status デスクトップ ADB 接続状態の取得
get_media_info 共通 現在のメディア情報の取得
connect_discord / disconnect_discord 共通 Discord 接続制御
update_discord_presence 共通 Rich Presence の更新
get_discord_status 共通 Discord 接続状態の取得
get_rpc_enabled / set_rpc_enabled Android RPC トグルの永続化
get_settings / update_settings 共通 設定の読み書き
list_media_apps Android (デスクトップでは空配列のスタブ) ホワイトリスト用アプリ一覧
get_notification_access_status / open_notification_access_settings Android (デスクトップでは正常系のスタブ) 通知アクセス権限の確認・誘導
get_signing_fingerprint Android (デスクトップでは None) APK 署名フィンガープリントの取得
check_android_update / download_android_update / install_android_update Android Android 版の更新確認・取得・導入
get_install_permission_status / open_install_permission_settings Android 不明アプリ導入権限の確認・誘導
  • adb_client — ADB プロトコル
  • discord-rich-presence — デスクトップの Discord IPC
  • Discord Social SDK (Android) — 規約上リポジトリにコミットしないため、CI が都度ダウンロードする (リリース 参照)

設計思想や詳細実装はソースコード内のコメントも参照してください。