プロジェクトアーキテクチャ

FlowPick の技術アーキテクチャ詳細。システム設計、モジュール分割、データフロー、重要な設計判断を含みます。

本ドキュメントは FlowPick の内部設計を深く理解したい開発者向けで、システムアーキテクチャ、モジュール責任範囲、データフロー、重要な設計判断を網羅します。


システムアーキテクチャ概要

FlowPick は ブラウザ拡張機能オンラインツール Web サイト という 2 つの主要なプロダクト形態から構成されます。両者はコアダウンロードエンジンを共有していますが、メディア検知とネットワークリクエスト処理には違いがあります。

┌─────────────────────────────────────────────────────────┐
│                      FlowPick                           │
│                                                         │
│  ┌──────────────────┐    ┌──────────────────────────┐   │
│  │   ブラウザ拡張機能 │    │     オンラインツールサイト   │   │
│  │                  │    │                          │   │
│  │ · ネットワークリクエスト監視 │    │ · M3U8 ダウンローダー      │   │
│  │ · メディア自動検知  │    │ · DASH ダウンローダー      │   │
│  │ · ポップアップ UI │    │ · ドキュメントシステム       │   │
│  │ · クロスオリジンリクエスト能力 │    │ · トップページ表示        │   │
│  └────────┬─────────┘    └────────────┬─────────────┘   │
│           │                           │                 │
│           └───────────┬───────────────┘                 │
│                       │                                 │
│           ┌───────────▼───────────────┐                 │
│           │      コアダウンロードエンジン │                 │
│           │                           │                 │
│           │ · useStreamMerge.ts       │                 │
│           │ · useFFmpeg.ts            │                 │
│           │ · セグメントダウンロードと並列制御 │               │
│           │ · AES-128 復号            │                 │
│           │ · ストリーミングファイル書き込み │               │
│           │ · フォーマット変換         │                 │
│           └───────────────────────────┘                 │
└─────────────────────────────────────────────────────────┘

2 種類のプロダクト形態のポジショニング

次元ブラウザ拡張機能オンラインツールサイト
ターゲットユーザー日常的な高頻度使用者一時的使用者、拡張機能インストール不可の環境
コアアドバンテージ自動検知、ワンクリックダウンロードインストール不要、クロスプラットフォーム
技術的制約Manifest V3 制限同一生成元ポリシー制限
アクセス方法ツールバーアイコンクリック直接 Web URL アクセス
拡張機能とオンラインツールの詳細な機能差異と選択提案についてはオンラインツール — 拡張機能との比較をご参照ください。拡張機能のインストール手順についてはインストールガイドをご参照ください。

モジュール詳細

コアダウンロードエンジン

ダウンロードエンジンは 2 つの composable から構成され、app/composables/ に配置されています。

useStreamMerge.ts

ストリーミングメディアセグメントのダウンロード、復号、結合、書き込みを担当します。これはシステム全体で最もコアなモジュールです。

主な責任範囲

機能実装方式
セグメント並列ダウンロードWorker Pool パターン、共有タスクカウンター
リトライ機構指数バックオフ、最大 3 回
AES-128 復号Web Crypto API
セグメント結合バイナリ直接結合(TS)または FFmpeg リマックス(MP4)
ファイル書き込みFSA → StreamSaver → Blob の 3 段階ダウングレード
進捗追跡スライディングウィンドウ速度計算 + 残り時間推定
メモリ管理サンプル予測 + 閾値チェック + 戦略選択

エクスポートインターフェース

export interface StreamMergeOptions {
  segments: ArrayBuffer[] | AsyncGenerator<ArrayBuffer>
  totalSegments: number
  filename: string
  outputFormat?: 'mp4' | 'ts'
  onProgress?: (progress: StreamMergeProgress) => void
  signal?: AbortSignal
}

export interface StreamMergeProgress {
  phase: 'downloading' | 'merging'
  percent: number
  downloadedBytes: number
  totalBytes: number
  speed: string
  eta: string
}
ダウンロードエンジンの完全な技術実装(並列制御、リトライ戦略、メモリ管理、書き込み戦略比較を含む)についてはダウンロードエンジンアーキテクチャをご参照ください。3 段階書き込み戦略のダウングレードロジックについてはダウンロードエンジンアーキテクチャ — 戦略比較まとめをご参照ください。

useFFmpeg.ts

FFmpeg WASM のロード、ライフサイクル管理、メディア処理コマンド実行を担当します。

主な責任範囲

機能実装方式
WASM ロードオンデマンドロード、マルチスレッド/シングルスレッド自動切り替え対応
マルチスレッド検出SharedArrayBuffercrossOriginIsolated をチェック
TS → MP4 リマックスffmpeg -i input.ts -c copy output.mp4
音视频結合それぞれ仮想 FS に書き込み、結合コマンド実行
FMP4 再構成DASH の初期化セグメント + メディアセグメント処理
進捗コールバックFFmpeg 出力の time 情報を解析

エクスポートインターフェース

export const useFFmpeg = () => {
  return {
    ffmpeg: Ref<FFmpegType | null>
    loaded: Ref<boolean>
    loading: Ref<boolean>
    error: Ref<string | null>
    load: () => Promise<void>
    mergeToMP4: (options: MergeOptions) => Promise<ArrayBuffer>
    mergeAudioVideo: (options: MergeAudioVideoOptions) => Promise<ArrayBuffer>
    mergeFmp4: (options: MergeFmp4Options) => Promise<ArrayBuffer>
  }
}
FFmpeg WASM のロードフロー、マルチスレッド検出、パフォーマンス比較についてはフォーマット変換 — FFmpeg WASM エンジンをご参照ください。SharedArrayBuffer の設定要件についてはブラウザ互換性 — 高度な APIをご参照ください。

ページモジュール

M3U8 ダウンローダー (m3u8-downloader.vue)

HLS ストリーミングメディアプロトコルのダウンロードページを処理します。

処理フロー

ユーザー URL 入力
    ↓
fetch M3U8 コンテンツ
    ↓
m3u8-parser 解析
    ↓
┌─ Master Playlist? ──→ 画質リスト表示 → ユーザー選択
│
└─ Media Playlist? ──→ セグメントリスト抽出
    ↓
#EXT-X-KEY チェック(暗号化情報)
    ↓
キーファイルダウンロード(該当する場合)
    ↓
並列セグメントダウンロード + 復号
    ↓
結合/リマックス
    ↓
ディスクに書き込み

主要な依存関係

  • m3u8-parser:M3U8 プレイリスト解析
  • useStreamMerge:セグメントダウンロードと結合
  • useFFmpeg:フォーマット変換
HLS プロトコルの Master Playlist と Media Playlist の違いについては動画メディア検知 — HLS ストリームをご参照ください。オンラインツールでの M3U8 ダウンローダーの使用方法についてはオンラインツールをご参照ください。

DASH ダウンローダー (dash-downloader.vue)

DASH ストリーミングメディアプロトコルのダウンロードページを処理します。

処理フロー

ユーザー URL 入力
    ↓
fetch MPD コンテンツ
    ↓
mpd-parser 解析
    ↓
ContentProtection チェック(DRM)
    ↓
AdaptationSet 抽出(動画/音声)
    ↓
ストリームリスト表示 → ユーザー選択
    ↓
初期化セグメントダウンロード(該当する場合)
    ↓
並列メディアセグメントダウンロード + 復号
    ↓
FMP4 再構成 / 音视频結合
    ↓
ディスクに書き込み

主要な依存関係

  • mpd-parser:MPD プレイリスト解析
  • useStreamMerge:セグメントダウンロードと結合
  • useFFmpeg:FMP4 再構成と音视频結合
DASH ストリームの検出原理と ContentProtection 処理については動画メディア検知 — DASH ストリームをご参照ください。DRM 保護コンテンツの制限事項については既知の制限事項 — DRM 保護コンテンツをご参照ください。

ドキュメントシステム

Nuxt Content v3 ベースで構築され、ドキュメントは Markdown ファイル形式で content/ ディレクトリに配置されます。

ディレクトリ構造

content/zh-Hans/
├── 1.docs/                    # ドキュメント本体
│   ├── 1.getting-started/     # クイックスタート
│   ├── 2.features/            # 機能特性
│   ├── 3.advanced/            # 高度なガイド
│   ├── 5.troubleshooting/     # トラブルシューティング
│   └── 6.developer/           # 開発者ドキュメント
├── 4.changelog/               # 更新ログ
└── 6.legal/                   # 法的条項

ナビゲーションシステム:各ディレクトリ下の .navigation.yml がその分類のタイトルとアイコンを定義します。Nuxt Content が全ドキュメントを自動収集しサイドバーナビゲーションを生成します。

ドキュメントレイアウトapp/layouts/docs.vue が統一されたドキュメントページレイアウトを提供し、トップナビゲーション、サイドバー、コンテンツ領域を含みます。

ドキュメント作成規範(Frontmatter、コンテンツフォーマット、多言語)については貢献ガイド — ドキュメント作成ガイドをご参照ください。

データフロー

完全なダウンロードフロー

┌─────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ プレイリスト取得 │ → │ プレイリスト解析 │ → │ セグメントダウンロード │ → │ 結合書き込み │
└─────────┘    └──────────┘    └──────────┘    └──────────┘
     │              │               │               │
     ▼              ▼               ▼               ▼
  fetch()      m3u8-parser    Worker Pool     useStreamMerge
                mpd-parser    AES-128 復号    useFFmpeg
                              fetch() 並列    FSA/SS/Blob

各フェーズの詳細説明

フェーズ入力処理出力失敗可能な原因
プレイリスト取得M3U8/MPD URLHTTP GET リクエストプレイリストテキストネットワークエラー、URL 有効期限切れ、404
プレイリスト解析プレイリストテキストm3u8/mpd-parser 解析セグメントリスト + メタデータ非標準フォーマット、DRM 保護
セグメントダウンロードセグメント URL リストWorker Pool 並列ダウンロードArrayBuffer 配列CORS、帯域制限、トークン有効期限切れ
結合書き込みArrayBuffer 配列結合/リマックス + 書き込みディスクファイルメモリ不足、書き込み権限
ダウンロードエンジンの完全なデータフロー(エラー分類とリトライ機構を含む)についてはダウンロードエンジンアーキテクチャ — データフロー全景をご参照ください。各フェーズ失敗時のトラブルシューティング方法については一般的な問題のトラブルシューティングをご参照ください。

書き込み戦略選択フロー

書き込み開始
    │
    ▼
File System Access API 利用可能?
    │
    ├── 是 → FSA ストリーミング書き込み使用(最適)
    │         · 16MB バッファ
    │         · 任意サイズ対応
    │
    └── 否 → StreamSaver 利用可能?
                │
                ├── 是 → StreamSaver ストリーミング書き込み使用
                │         · Service Worker プロキシ
                │         · 大容量ファイル対応
                │
                └── 否 → ファイルサイズ予測
                            │
                            ├── < 1.5GB → Blob モード
                            │              · 全部メモリにロード
                            │              · ブラウザダウンロードトリガー
                            │
                            └── > 1.5GB → ダウンロード拒否
                                           · ブラウザ切り替えを促す
3 段階書き込み戦略の詳細比較(各戦略の適用シーンと制限を含む)についてはダウンロードエンジンアーキテクチャ — 戦略比較まとめをご参照ください。各ブラウザの FSA API サポート状況についてはブラウザ互換性 — 機能サポートマトリックスをご参照ください。

重要な設計判断

FFmpeg WASM を選択した理由は何か?サーバーサイド処理ではないのか?

判断:すべてのメディア処理をブラウザサイドで完結させる。

理由

  • プライバシー保護:ユーザーファイルをサーバーにアップロードしない
  • サーバーコストゼロ:トランスコードサーバークラスター維持不要
  • 即座に利用可能:アップロード待ち時間やキュー不要
  • オフライン能力:理論上 PWA モードでオフライン使用可能

代償

  • ネイティブ FFmpeg よりパフォーマンスが劣る(約 10-20%)
  • 初回ロード時に WASM ファイルのダウンロードが必要(約 8MB)
  • ブラウザメモリ制限を受ける
FFmpeg WASM とネイティブ版のパフォーマンス比較データについては既知の制限事項 — FFmpeg WASM パフォーマンスをご参照ください。プライバシー保護の完全な説明についてはプライバシーとセキュリティをご参照ください。

3 段階書き込みダウングレード戦略を採用した理由は?

判断:FSA → StreamSaver → Blob の優先度チェーン。

理由

  • FSA API が最適解だが Chrome/Edge のみサポート
  • StreamSaver は互換性が広いが Service Worker 依存
  • Blob はフォールバック方案ですべてのブラウザでダウンロード可能

代償

  • 3 セットの書き込みロジックを維持必要
  • ダウングレード動作によりユーザー体験の一貫性が損なわれる可能性
3 段階戦略の詳細な実装とダウングレードトリガー条件についてはダウンロードエンジンアーキテクチャ — ファイル書き込みモジュールをご参照ください。各ブラウザの書き込み能力比較についてはブラウザ互換性 — 機能ダウングレード戦略をご参照ください。

並列ダウンロードで Worker Pool を採用した理由は?事前分割ではないのか?

判断:共有カウンター + 動的タスク割り当てを使用。

理由

  • セグメントサイズが不均一の場合、事前分割により一部の Worker がアイドル状態になる
  • 共有カウンターによりすべての Worker がタスク完了まで継続的に稼働
  • 実装が簡単で複雑な負荷分散ロジック不要
Worker Pool の並列制御実装とパフォーマンス分析についてはダウンロードエンジンアーキテクチャ — 並列数とパフォーマンスの関係をご参照ください。並列数の設定方法については設定参考をご参照ください。

拡張機能とオンラインツールがコアエンジンを共有している理由は?

判断useStreamMergeuseFFmpeg を独立した composable として、拡張機能 API に依存しない。

理由

  • コード再利用、2 セットのダウンロードロジック維持不要
  • オンラインツールを拡張機能機能のデモおよびダウングレード方案として使用可能
  • テスト容易:コアロジックを通常の Web ページ環境でデバッグ可能
拡張機能とオンラインツールの CORS 処理における差異については既知の制限事項 — CORS クロスオリジン制限をご参照ください。2 種類のプロダクト形態の機能比較についてはオンラインツール — 拡張機能との比較をご参照ください。

依存関係図

m3u8-downloader.vue ──────┐
                          ├──→ useStreamMerge.ts ──→ Web Crypto API
dash-downloader.vue ──────┤         │                    fetch API
                          │         ├──→ useFFmpeg.ts ──→ @ffmpeg/ffmpeg
拡張機能ポップアップ ───────┘         │                    @ffmpeg/util
                                    ├──→ File System Access API
                                    ├──→ StreamSaver.js
                                    └──→ Blob API

ドキュメントシステム ──→ @nuxt/content ──→ Markdown ファイル
                      └──→ @nuxt/ui ──→ Tailwind CSS

依存関係説明

依存関係タイプ説明
useStreamMerge → useFFmpegオプション依存MP4 出力または音视频結合時のみ必要
useStreamMerge → Web Crypto API条件付き依存AES-128 暗号化ストリームのみ必要
useStreamMerge → FSA / StreamSaver / Blob排他的選択優先度に基づき 1 種類の書き込み方式を選択
ページ → useStreamMerge直接依存すべてのダウンロードページがコアエンジンに依存
ドキュメントシステム → @nuxt/contentフレームワーク依存Nuxt Content モジュール

拡張機能アーキテクチャ

拡張機能部分(本リポジトリには含まれない)の構造:

flowpick-extension/
├── manifest.json           # Manifest V3 設定
├── background/
│   └── service-worker.js   # Service Worker(ネットワーク監視)
├── popup/
│   ├── popup.html          # ポップアップ
│   ├── popup.js            # ポップアップロジック
│   └── popup.css           # ポップアップスタイル
├── content/
│   └── content.js          # コンテントスクリプト(ページ注入)
└── assets/
    └── icons/              # 拡張機能アイコン

拡張機能は webRequest API でネットワークリクエストを監視し、メディアリソースを検出後メッセージパッシングで URL リストをポップアップに送信します。ポップアップはオンラインツールのコアダウンロードロジックを再利用します。

拡張機能通信フロー

Content Script ←→ Background Service Worker ←→ Popup UI
      │                      │                      │
  ページ DOM アクセス     ネットワークリクエスト監視   ユーザーインタラクションインターフェース
  メディア要素検知        M3U8/MPD フィルタリング     ダウンロードトリガーと管理
Manifest V3 の拡張機能への制限と対策については既知の制限事項 — Manifest V3 制限をご参照ください。拡張機能のインストールと権限説明についてはインストールガイドをご参照ください。

関連ドキュメント