
TL;DR
notebooklm-py
to nieoficjalna biblioteka Pythona, która daje programatyczny dostęp do
NotebookLM — razem z gotowym skillem dla Claude Code. Instalujesz raz,
logujesz się przez przeglądarkę, i potem: „zrób mi deep research o X,
raport briefing-doc i mind-mapę” — wszystko z terminala, bez
klikania.
Nieoficjalne = Google może to jutro popsuć. Do researchu i
prototypów: super. Do produkcji klienckiej: nie.
Problem
NotebookLM jest świetny do researchu: wrzucasz 20 URL-i, on to
indeksuje, zadajesz pytania z cytowaniami, generujesz audio overview,
mind-mapę, raport. Tylko że cały workflow jest w
przeglądarce:
- Otwórz NotebookLM.
- Nowy notebook.
- Wklej URL. Czekaj.
- Wklej kolejny. Czekaj.
- „Generate audio overview”. Czekaj 15 minut.
- Pobierz MP3, gdzieś go sobie zapisz.
- Gdy chcesz mieć to w swoim projekcie — kopiuj-wklej.
Przy jednym notebooku to jeszcze OK. Przy dziesięciu research
threadach tygodniowo — zgrzyta.
Rozwiązanie:
notebooklm-py + skill do Claude Code
Biblioteka notebooklm-py
(autor: teng-lin, MIT) robi dwie rzeczy:
- CLI i Python API do wszystkiego co NotebookLM
potrafi — tworzenie notebooków, dodawanie źródeł (URL, PDF, YouTube,
Drive), chat z cytowaniami, generowanie
audio/video/raportów/mind-map/quizów/fiszek/infografik, pobieranie
artefaktów. - Skill dla Claude Code — instalowany jedną komendą,
aktywuje się gdy piszesz „zrób mi podcast o X” albo
/notebooklm.
Jako bonus: część rzeczy, których web UI nie oferuje
— batch download, export quizów/fiszek do JSON/Markdown, mind-mapy jako
JSON, slide decki jako PPTX.
Instalacja
# Biblioteka + playwright (do pierwszego logowania)
uv tool install "notebooklm-py[browser]"
uv tool run --from playwright playwright install chromium
# Login (otwiera Chromium, zalogujesz się przez Google)
notebooklm login
# Skill do Claude Code
notebooklm skill install
Skill ląduje w ~/.claude/skills/notebooklm/SKILL.md.
Cookies trafiają do ~/.notebooklm/storage_state.json (perm
600).
Jak wygląda workflow
Scenariusz z tego tygodnia — robię research „jak zrobić aplikację na
CarPlay żeby nie zagryzać zębów”:
Ja: ok utwórz nowy notebook i znajdź mi jak zrobić
aplikację na CarPlay żeby nie zagryzać zębów
Claude Code:
1. notebooklm create "CarPlay bez bólu" --json
→ notebook ID
2. notebooklm source add-research "Jak stworzyć aplikację
na CarPlay..." --mode deep --no-wait --notebook <id>
3. notebooklm research wait -n <id> --import-all --timeout 1800
→ 77 źródeł znalezione
4. notebooklm generate report --format briefing-doc --append
"Grupa docelowa: developer iOS... priorytety: (1) entitlements,
(2) co nie jest dozwolone, (3) template'y CPListTemplate/CPMapTemplate,
(4) checklist, (5) przykłady..." --json
5. notebooklm artifact wait <id>
6. notebooklm download report ./raport.md -a <id>
7. notebooklm generate mind-map; notebooklm download mind-map ./mindmap.json
Efekt: dwa pliki w ~/Research/carplay-bez-bolu/. Raport
ma TL;DR „zrób tak, żeby nie zagryzać zębów”, konkretne entitlement keys
(com.apple.developer.carplay-audio etc.), realne estymaty
(„~1 miesiąc na entitlement”, „4–8 tygodni dev”), listę zakazów App
Review. 93 linie konkretu, nie „introduction to CarPlay”.
Czas: ~25 minut research, ~8 minut raport. Zero klikania.
Pułapki (uczciwie)
Nic nie działa od razu idealnie. Rzeczy, na które trafiłem:
1.
research wait --import-all pada przy >30 źródłach
Deep research znalazł 77 źródeł. RPC IMPORT_RESEARCH ma
30-sekundowy timeout, retry z backoffem próbuje 5 razy — i każdy retry
duplikuje importowane źródła. Skończyłem z 385 źródłami
w notebooku (292 ready, 93 error), gdzie powinno być 77.
Obejście: wywołuj research wait bez
--import-all, potem importuj selektywnie.
2.
Subagenty Claude Code nie mają dostępu do notebooklm
Skill zachęca do spawnowania subagentów Task dla długich operacji — w
moim setupie subagent dostał Bash permission denied na
pierwszym notebooklm research wait. Musiałem puścić to z
głównej konwersacji jako Bash run_in_background=true.
To jest konfiguracja permissionów Claude Code, nie bug biblioteki —
ale warto wiedzieć zanim zaplanujesz pipeline na subagentach.
3. Rate limity Google
Audio, video, quiz, flashcards, infographic i slide deck — to
może failować z powodu rate limitów Google (skill to
otwarcie mówi). Retry po 5–10 minutach zwykle pomaga. Raport, mind-map,
data-table — zwykle działają bez problemu.
4. Cookies Google w plain JSON
~/.notebooklm/storage_state.json zawiera Twoje cookies
do .google.com. Plik ma -rw-------, więc OS
Cię chroni, ale kto wejdzie na Twojego usera ma pełny dostęp do
Twojego Google (nie tylko NotebookLM). Nie trzymaj tego na
współdzielonej maszynie.
5. To nieoficjalne API
Google może zmienić endpointy z dnia na dzień i biblioteka przestanie
działać. Do researchu, prototypów, personal automation — fine. Do
czegoś, co klient będzie używał co dzień — nie.
Audyt bezpieczeństwa
skilla i biblioteki
Przed instalacją przeskanowałem oba:
- SKILL.md (565 linii, 25 KB): 0 ukrytych znaków
unicode, 0 wzorców prompt-injection, żadnych podejrzanych URL-i. Jedyny
curlto instrukcja instalacji z
api.github.com. - Biblioteka (42 pliki .py, 1.4 MB): brak
eval/exec/pickle.loads/shell=True/base64-obfuskacji.
Jedynesubprocess.run(2 wywołania) to
playwright install chromium. Sieciowo gada tylko z
accounts.google.com,notebooklm.google.com,
youtube.com,github.com.
Wygląda uczciwie. Nie znaczy że nie zepsują tego w v0.5.0 — przy
update warto zerknąć w CHANGELOG.
Dla kogo to jest
- Dla Ciebie: jeśli robisz research tygodniowo,
lubisz terminal i nie masz zabronione wysyłanie URL-i do Google. - Nie dla Ciebie: jeśli pracujesz z materiałami,
których nie możesz wrzucić do NotebookLM (NDA, dane klientów, cokolwiek
regulowanego). NotebookLM to nadal Google, a nieoficjalna biblioteka nie
zmienia tego, gdzie trafiają dane.
Linki
- Biblioteka: github.com/teng-lin/notebooklm-py
- Dokumentacja CLI: docs/cli-reference.md
- NotebookLM: notebooklm.google.com