개요
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) 훅을 실행합니다. 하위 클래스는 이 훅을 재정의하여 재바인드 시 클리어 동작을 구현할 수 있습니다. 이를 통해 여러 컴포넌트에 걸쳐 중복된 부기(bookkeeping)를 통합합니다. 예시: 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의 정리(teardown) 과정에서 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를 업그레이드하세요.
문제 해결headless 재인증이 만료된 Google SID 쿠키로 storage_state.json을 교체하는 것을 어떻게 방지할 수 있나요?
이 문제는 Google이 이제 notebook.google.com에 대한 GET / 요청에 HTTP 200 로그아웃 랜딩 페이지를 반환하는 반면, 캡처 로직은 브라우저가 앱 호스트에 있고 URL 범위의 SID 쿠키가 있는지만 확인하기 때문에 발생합니다. 따라서 만료된 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으로 이동합니다. 실패 시 _refuse_incomplete_capture와 같이 SID가 없는 캡처에 사용되는 것과 동일한 거부 경로를 호출하고 기존 인증 상태를 유지합니다. 브라우저 컨텍스트에서 만료된 SID를 가진 토큰 없는 앱 랜딩을 사용하는 회귀 테스트를 추가합니다.
문제 해결터키어 대문자 İ가 포함된 노트북 제목에 대해 notebooklm-py 제목 조회가 실패하는 이유는 무엇입니까?
이는 알려진 버그입니다(main @ 1d8920f, MCP _resolve_by_title 및 _normalize_for_match에 영향): str.casefold()는 'İ'(U+0130)를 두 개의 문자 'i' + U+0307(결합 윗점)으로 변환하므로, istanbul과 같은 소문자 쿼리는 폴딩된 제목 İstanbul notları와 절대 일치하지 않아 NotebookNotFoundError를 발생시킵니다. 임시 해결 방법: 대문자 'İ'를 포함하여 원래 문자 그대로 제목을 입력하세요(예: istanbul 대신 İstanbul로 쿼리) — 원본 문자 그대로의 쿼리는 양쪽이 동일하게 폴딩되므로 일치합니다. 영구 수정: 정규화 시 결합 기호를 제거합니다. 예를 들어 _normalize_for_match에서 unicodedata.normalize('NFKD', s)를 사용하고 casefold() 전/후에 unicodedata.combining(c)이 참인 문자를 제거하면 'İ'가 일반 'i'로 폴딩됩니다.