mcpField
B
bilibili-obsidian-notes

bilibili-obsidian-notes

github.com/le876生産性1049 回インストール7 週間前に更新
リポジトリ

bilibili-obsidian-notes について

Bilibili の動画を Obsidian Vault 内の学習ノートにまとめるスキルとスクリプトです。字幕処理、キーフレーム選択、スクリーンショット、ノートの書式案内に加え、動画ファイルの保持と整理も扱います。

主な機能

  1. 01Bilibili 動画からノートを生成
  2. 02字幕ファイルの取得と再利用
  3. 03キーフレーム選択とスナップショット撮影
  4. 04ノートと画像を Obsidian Vault に保存
  5. 05動画の保持状態と整理の管理
  6. 06学習・復習向けのノート書式

活用シーン

  1. 01講義動画から学習ノートを作成
  2. 02タイムスタンプ付き画像を Obsidian ノートに追加
  3. 03字幕の再利用や動画の特定時点の撮影
  4. 04ノート完成後にダウンロード動画を整理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/le876/bilibili-obsidian-notes --skill bilibili-obsidian-notes

インストール後、Claude Code で/bilibili-obsidian-notesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.gitignore
LICENSE
README.md
requirements.txt
requirements-optional.txt
.codex/
config.toml
.codex/agents/
media-note-writer.toml
.codex/style/
media_note_style_spec.md
agents/
openai.yaml
docs/
troubleshooting.md
workflow.md
scripts/
bili_fetch_subtitle.py
bili_retention.py
bili_qr_login.py
bili_snapshot.py
bili_subtitles.py
bili_vision_notes.py
tests/
test_retention_and_timings.py
test_subtitles_formats.py

詳細

bilibili-obsidian-notes

クイックスタート(Windows / PowerShell)

ターミナルで文字化けが発生する場合は、まず UTF-8 モードで Python を実行してください。

# 一次性会话设置(二选一即可)
chcp 65001
$env:PYTHONUTF8 = "1"   # 或者每次运行都用 python -X utf8
python -X utf8 scripts\bili_vision_notes.py `
  --url "<Bilibili URL>" `
  --vault "<你的 Obsidian Vault 路径>" `
  --max-frames 12

出力先:

  • <vault>/video-notes/<title> (<id>).md
  • <vault>/video-notes-images/<id>/*.png
  • <vault>/.tmp/bili-vision-notes/<id>/...
  • <vault>/.tmp/bili-vision-notes/<id>/timings.json(フェーズごとの処理時間の構造化データ)
  • <vault>/.tmp/bili-vision-notes/<id>/retention.json(動画の保持状態)

字幕のみを取得するヘルパー:

python -X utf8 scripts\bili_fetch_subtitle.py `
  --url "<Bilibili URL>" `
  --out ".\\subtitle.json" `
  --login

QR コードでのログイン(有料動画やログインが必要な動画におすすめ):

python -X utf8 scripts\bili_qr_login.py

ログイン後、bili_fetch_subtitle.py / bili_vision_notes.py はフォールバックの Cookie として BBDown.data を自動的に試します。 字幕の優先順位:投稿者による中国語字幕、その他の投稿者字幕、中国語の AI 字幕、その他の言語の AI 字幕。

スナップショット用ヘルパー(?t=501.16 や #t=08:21.17 などのジャンプ URL に対応):

python -X utf8 scripts\bili_snapshot.py `
  --url "https://www.bilibili.com/video/BV1cL411n7KV/?t=501.165719#t=08:21.17" `
  --vault "<你的 Obsidian Vault 路径>"

メモ:

  • デフォルトの出力先:<vault>/_resources/<title>PT8M21.166S.webp
  • デフォルトの最大幅:1920(幅が 1920 を超える場合のみ縮小し、拡大はしません)
  • Obsidian にそのまま使える埋め込み行が出力されます: - ![[...webp|<title> - 08:21]] [08:21](https://.../?t=501.165719#t=08:21.17)
  • --clip N を使うと、[t-N, t+N](秒)の範囲だけをダウンロードします。「前後 1 秒ずつ」の場合は、--clip 1 を使います。多数のスクリーンショットが必要な場合は、全体をダウンロードしてください(--clip なし)。

プレビュースナップショット(低解像度のプレビュー画像。動画全体はダウンロードせず、通常は代替手段やタイムスタンプの素早い特定にのみ使用します):

python -X utf8 scripts\bili_snapshot.py `
  --method preview `
  --url "https://www.bilibili.com/video/BV1cL411n7KV/?t=501.165719#t=08:21.17" `
  --vault "<你的 Obsidian Vault 路径>"

自動フォールバック(デフォルトでは無効):まず高画質の video を試し、失敗した場合は preview にフォールバックします。

python -X utf8 scripts\bili_snapshot.py `
  --method auto `
  --url "https://www.bilibili.com/video/BV1cL411n7KV/?t=501.165719#t=08:21.17" `
  --vault "<你的 Obsidian Vault 路径>"

よく使うオプション

  • --cookies-from-browser edge|chrome ログインが必要な動画用
  • --max-frames N メモに含めるキーフレームの最大数
  • --scene-threshold 0.0-1.0 値を小さくすると、フレーム数が増えます
  • --keep-video/--no-keep-video 作業ディレクトリに mp4 を保持するかどうか
  • スクリーンショットの QA が完了するまで動画全体を保持してください。動画はシーン検出と追加のスナップショットに共通で使うローカルソースです。後でスナップショットを取得する必要がない場合に限り、--no-keep-video を使用してください。
  • --subtitle-file <path> 既存の Bilibili 字幕 JSON/VTT ファイルを使用します(自動取得より優先)
  • --subtitle-json-out <path> 取得した字幕 JSON をファイルに保存します(デバッグ/再利用用)
  • bili_snapshot.py --clip N t の前後の短い時間範囲だけをダウンロードします

ダウンロードした動画の保持

メモの画像が変更される可能性がある間は、ダウンロードした講義動画のメディアを保持してください。次のいずれかの条件を満たした時点でメモが完成したものとみなし、ダウンロードした video.<media extension> ファイルを削除してください。

  1. ユーザーが学習メモの完成を明示的に確認した場合。
  2. そのメモの画像について、最後に話し合い、確認、または調整を行ってから 7 日が経過した場合。

Markdown メモ、字幕、スクリーンショット、コンタクトシート、メタデータ、timings.json、retention.json は保持してください。retention.json がない旧形式の作業ディレクトリは、ファイルシステムの更新日時だけを根拠に削除しないでください。

メインノート用スクリプトとスナップショット用スクリプトは、現在の動画の画像アクティビティ時刻を更新し、条件を満たした他の動画をクリーンアップします。どちらのスクリプトも実行せずにメモ画像について話し合う場合は、アクティビティを明示的に更新してください。

python -X utf8 scripts\bili_retention.py `
  --vault "<你的 Obsidian Vault 路径>" `
  touch --video-id "<BV id>"

ユーザーが完成を確認した場合は、既定の削除ポリシーを直ちに適用してください。

python -X utf8 scripts\bili_retention.py `
  --vault "<你的 Obsidian Vault 路径>" `
  complete --video-id "<BV id>" --delete

7 日ルールを手動で確認または適用してください。

# Dry run
python -X utf8 scripts\bili_retention.py `
  --vault "<你的 Obsidian Vault 路径>" cleanup --days 7

# Delete eligible video media
python -X utf8 scripts\bili_retention.py `
  --vault "<你的 Obsidian Vault 路径>" cleanup --days 7 --write

ダウンロードした動画が含まれているものの retention.json がない旧形式の作業ディレクトリでは、bootstrap を使って、7 日間の猶予期間を慎重に 1 回だけ開始してください。タスクが実行されていない間、スキルは継続して実行されません。このルールは、次回のメインノート/スナップショットの実行時、または明示的なクリーンアップコマンドの実行時に評価されます。

ワークフロー(Codex 向け)

  1. 画像について話し合う前に、現在の動画の保持アクティビティを更新します。メインノート用スクリプトとスナップショット用スクリプトでは、これを自動的に行います。
  2. 動画全体を保持した状態でスクリプトを一度実行し、ノートの骨子とキーフレームを生成します。最適化する前に timings.json を確認してください。ここには自動処理の各フェーズが記録され、後続の目視確認や手動でのノート拡充は明示的に含まれていません。
  3. まずコンタクトシートを1つ作成するか確認します。1回の目視確認で補足用のタイムスタンプを選び、保持した動画を使ってローカルで FFmpeg による切り出しを行います。
  4. 選択した各キーフレームで functions.view_image を使い、以下を抽出します。
    • 黒板の数式(LaTeX に変換)
    • コードブロック(そのまま転記)
    • 主要な導出手順/注意点
  5. apply_patch を使って生成されたノートファイルのみを修正し、メイン作業後の目視確認、補足スクリーンショット、手動でのノート拡充、QA にかかった時間をそれぞれ分けて報告します。
  6. ユーザーが完了を確認した場合は、bili_retention.py complete --delete を実行します。それ以外の場合は、最後のノート画像アクティビティから7日が経過するまで動画をアクティブな状態に保ちます。

ノートのスタイル(学習ノート版、デフォルトとして推奨)

目標:字幕を一文ずつ書き起こすのではなく、字幕の内容を復習しやすい学習ノート(構成が明確で、要点が際立ち、数式が正しく組版されている)に整理しつつ、「知識の解説の主軸」を漏らさないことです。

内容の取捨選択
  • 削除:冒頭の挨拶、締めくくりの高評価/フォロー/コメントの呼びかけなど、知識に関係のない内容。
  • 保持:定義、動機、例、重要な結論、手順、注意点(たとえば「なぜ最初の制御量だけを実行するのか」)。
  • 誤りの修正方針:明らかな ASR の誤りのみ、最小限の修正を行います(例:「NPC」→「MPC」)。表現は元の字幕にできるだけ近づけつつ、文章を自然に整えます。
  • メタな説明を避ける:「話者の意図/作者が伝えようとしていること」のようなメタ叙述は書かず、学習者の記録という口調で言い換えます。
構成と書式(読みやすさは PPO算法.md を参考に)
  • 見出しは ## / ### で知識項目を階層化します。見出しに時間を入れません。
  • 要点はリストで示し、重要なキーワードは 太字 で強調します。コールアウトも使用できます。
    • > [!summary] まとめ
    • > [!note] 注記/注意
  • タイムスタンプの方針:すべての文にタイムスタンプを付ける必要はありません。重要なスクリーンショット/結論の箇所にのみ、タイムスタンプのリンクを残します。
数式とコード(特に間違いやすいため、必ず守ること)
  • インライン数式には $...$ を使います(例:$e(t)=y(t)-r(t)$)。数式をコードのように表示するために、バッククォート `...` で囲まないでください。
  • 数式ブロックには独立した $$ ... $$ を使い、数式ブロックの前後にそれぞれ空行を入れます。
  • $$ をリスト内にインデントしないでください:Obsidian では、インデントされた $$ はコードブロックとして扱われ、レンダリングに失敗しやすくなります。
    • 推奨する書き方:コロンで終わる箇条書きを書き、次の行を空けてから、インデントしない $$ ... $$ の数式ブロックを書きます。
  • コード(コード/コマンド/変数名)にのみバッククォートまたはトリプルバッククォートのコードブロックを使います。コードブロックの内容は、できるだけそのまま保持します。
スクリーンショットの参照(重要な板書/導出/コードのみ)
  • スクリーンショットはすべて <vault>/_resources に保存します(bili_snapshot.py のデフォルト)。
  • ノート内で参照する際は、スクリプトが出力する embed 行の形式を使います(そのまま貼り付け可能です)。例: - ![[<title>PT3M10.002S.webp|<title> - 03:10]] [03:10](https://.../?t=190.001762#t=03:10.00)

注:

  • 現在、functions.view_image は .webp に対応していません。Codex に bili_snapshot.py が生成したスクリーンショットを認識させる必要がある場合は、一時的に .png に変換してから表示してください(Obsidian では引き続き .webp を参照することを推奨します)。

コメント