notebooklm-py
ライブラリteng-lin/notebooklm-py
Google NotebookLM の非公式 Python インターフェースおよびコマンドラインツール。
概要
NotebookLMへの包括的なプログラマティックアクセスを提供し、一括ダウンロード、ポッドキャスト生成、AIエージェント統合をサポートします。Python、コマンドライン、およびClaude Codeなどのエージェントで利用可能です。
README プレビュー
# notebooklm-py\n\n \n\n\n**A Comprehensive NotebookLM Skill & Unofficial Python API.** Full programmatic access to NotebookLM's features—including capabilities the web UI doesn't expose—via Python, CLI, and AI agents like Claude Code, Codex, and OpenClaw.\n\n[](https://pypi.org/project/notebooklm-py/)\n[](https://pypi.org/project/notebooklm-py/)\n[](https://opensource.org/licenses/MIT)\n[](https://github.com/teng-lin/notebooklm-py/actions/workflows/test.yml)\n\n \n\n\n**Source & Development**: \n\n> **⚠️ Unofficial Library - Use at Your Own Risk**\n>\n> This library uses **undocumented Google APIs** that can change without notice.\n>\n> - **Not affiliated with Google** - This is a community project\n> - **APIs may break** - Google can change internal endpoints anytime\n> - **Rate limits apply** - Heavy usage may be throttled\n>\n> Best for prototypes, research, and personal projects. See [Troubleshooting](docs/troubleshooting.md) for debugging tips.\n\n## What You Can Build\n\n🤖 **AI Agent Tools** - Integrate NotebookLM into Claude Code, Codex, and other LLM agents. Ships with a root [NotebookLM skill](SKILL.md) for GitHub and `npx skills add` discovery, local `notebooklm skill install` support for Claude Code and `.agents` skill directories, and repo-level Codex guidance in [`AGENTS.md`](AGENTS.md).\n\n📚 **Research Automation** - Bulk-import sources (URLs, PDFs, YouTube, Google Drive), run web/Drive research queries with auto-import, and extract insights programmatically. Build repeatable research pipelines.\n\n🎙️ **Content Generation** - Generate Audio Overviews (podcasts), videos, slide decks, quizzes, flashcards, infographics, data tables, mind maps, and study guides. Full control over formats, styles, and output.\n\n📥 **Downloads & Export** - Download all generated artifacts locally (MP3, MP4, PDF, PNG, CSV, JSON, Markdown). Export to Google Docs/Sheets. **Features the web UI doesn't offer**: batch downloads, quiz/flashcard export in multiple formats, mi
FAQ (5)
トラブル対応notebooklm-py 0.8.5 を実行した際に発生する「ModuleNotFoundError: No module named 'typing_extensions'」エラーの修正方法
notebooklm-py 0.8.5 は実行時に typing_extensions をインポートしますが、依存関係として宣言していないため、pipx/uv/mise によるクリーンインストールでは起動時にクラッシュします。回避策: 同じ隔離環境に typing_extensions をインストールしてください。例: pipx inject notebooklm-py typing_extensions または uv pip install --python <notebooklm-py venv>/bin/python typing_extensions。恒久的な修正: PR #2500 を含むリリースにアップグレードしてください。この PR では typing_extensions が無条件の依存関係として宣言され、クリーンインストールに対する CI チェックが追加されています。
トラブル対応繰り返し使用されるloop-affinityコードを、再利用可能なPython mixinにリファクタリングする方法は?
LoopBoundPrimitive 基本クラスを作成し、set_bound_loop メソッドはループを保存し、ループが実際に変更された場合にのみフック _on_loop_rebind(old_loop, new_loop) を発火します。サブクラスは再バインド時のクリア動作のためにフックをオーバーライドできます。これにより、複数のコンポーネントにわたる重複した簿記処理が統合されます。例: src/notebooklm/_loop_bound.py
トラブル対応Windows で notebooklm master-token ログイン中に context.close() 時に発生する TargetClosedError を修正する方法
Windows 上の notebooklm-py 0.8.5 では、notebooklm login --master-token --browser chrome で oauth_token の取得には成功しますが、src/notebooklm/_browser/oauth_token.py の終了処理で、finally ブロック内の context.close() が TargetClosedError を発生させます(Chrome がすでに自身を閉じているため)。この例外は finally から抜け出すため、取得済みのトークンは破棄され、master_token.json は一切書き込まれません。回避策: oauth_token.py にパッチを適用し、page.close()、context.close()、browser_obj.close() をそれぞれ try/except Exception: pass で囲ってから、ログインコマンドを再実行してください。Master-token login OK と表示されるはずです。恒久的な修正は PR #2522 に含まれています。ローカルパッチを適用したままにせず、マージ/リリースされたら notebooklm-py をアップグレードしてください。
トラブル対応ヘッドレス再認証によって storage_state.json が期限切れの Google SID クッキーで置き換えられるのを防ぐにはどうすればよいですか?
これは、Google が notebook.google.com の GET / に対して HTTP 200 のサインアウト済みランディングページを返すようになったのに対し、キャプチャロジックはブラウザがアプリのホスト上にあり、URL スコープの SID Cookie を持っていることしか確認しないために発生します。その結果、期限切れの SID が検証を通過し、storage_state.json を上書きしてしまいます。
直ちに有効な回避策:期限切れのブラウザプロファイルがキャプチャされないよう、ヘッドレス再認証を無効にします:
unset NOTEBOOKLM_HEADLESS_REAUTH
# or
export NOTEBOOKLM_HEADLESS_REAUTH=0
また、allow_headless=False であることを確認した上で、有効な storage_state.json を復元するか、再度認証してください。
コード修正:src/notebooklm/_browser/browser_capture.py で、_settle_capture_candidate/_captured_sid_is_usable 周辺のヘッドレスパスと CDP パスの両方を更新し、ストレージを書き込む前にセッションの生存を検証するようにします。キャプチャされたアプリページ上で SNlM0e トークンを必須とするか、/login リダイレクトチェックを実行してください。有効なセッションはアプリにリダイレクトで戻りますが、サインアウト済みのセッションは accounts.google.com に移動します。失敗した場合は、SID なしのキャプチャに使われるのと同じ拒否パス(_refuse_incomplete_capture など)を呼び出し、既存の認証状態を保持してください。ブラウザコンテキスト内に期限切れの SID を持つ、トークンなしのアプリランディングを使った回帰テストを追加してください。
トラブル対応なぜ notebooklm-py のタイトルルックアップは、トルコ語の大文字 İ を含むノートブックのタイトルで失敗するのですか?
これは既知のバグです(main @ 1d8920f、MCP の _resolve_by_title および _normalize_for_match に影響):str.casefold() は 'İ'(U+0130)を 'i' + U+0307(結合文字の上付きドット)という2文字に変換するため、istanbul のような小文字のクエリはフォールドされたタイトル İstanbul notları に決してマッチせず、NotebookNotFoundError が発生します。回避策:大文字の 'İ' を含め、元の正確な文字でタイトルを入力してください(例:istanbul の代わりに İstanbul でクエリを実行)— 正確な文字によるクエリは両側が同一にフォールドされるためマッチします。恒久的な修正:正規化の際に結合記号を除去します。例えば _normalize_for_match で unicodedata.normalize('NFKD', s) を使用し、casefold() の前後で unicodedata.combining(c) が真となる文字を除去することで、'İ' が通常の 'i' にフォールドされるようにします。