Home / All Skills / Content & Media Creation / qiaomu-anything-to-notebooklm
Content & Media Creation · joeseesun/qiaomu-anything-to-notebooklm

qiaomu-anything-to-notebooklm

Multi-source intelligent content processor: supports WeChat Official Accounts, web pages, YouTube, podcasts (Xiaoyuzhou/Ximalaya), PDFs, Markdown, and more. Automatically uploads content to NotebookLM and generates podcasts, presentations (PPT), mind maps, and various other formats. Features an in-depth analysis mode and automated Lark/Feishu document creation.

L5 Restricted · Isolated sandbox & strict auditV2 Human-AuditedTerms / ComplianceCredential / SessionExecute CommandInstall DepsNetwork AccessWrite FileDual-pass Audit
Author joeseesunGitHub joeseesun/qiaomu-anything-to-notebooklm ↗Stars 5994License MIT(仓库根 LICENSE 首行 'MIT License'、'Copyright (c) 2026 Joe';README 徽标 Licensed MIT)Commit cea6ceee8c
Control levels describe skill capabilities and suggested control measures; they do not represent quality or safety certifications, nor do they dictate usability. Usage decisions rest entirely with users and administrators. Different agent hosts apply varying constraints; do not assume hosts provide automatic protection. Third-party skill copyrights belong to their original authors. Use at your own risk.

1How It Works & Mechanism

The core design combines a massive SKILL.md routing table with a few proprietary scripts and extensive external CLI/MCP tools: SKILL.md maps 15+ content sources to distinct extraction pipelines using an input characteristic table, delegating unified uploads and generation to the notebooklm CLI.

SKILL.md
| `https://mp.weixin.qq.com/s/` | 微信公众号 | MCP 工具抓取 |
The table also defines branches such as xiaoyuzhoufm/ximalaya/bilibili → GetNote (得到/Get笔记) transcription API, x.com → built-in proxy cascade, paywalled sites → paywall bypass, file extensions → markitdown, and missing URL/path → WebSearch. The table serves as a behavioral contract, whereas the actual classification code exists solely in main.py via detect_input_type().

The built-in CLI (main.py) covers significantly fewer input types than claimed in SKILL.md: the code only implements epub, document, podcast, x_twitter, and url, reporting 'unsupported input type' for anything else.

main.py
不支持的输入类型: {input_type}
Although detect_input_type() returns values like weixin, image, audio, zip, office, and search, these branches are missing from main(): WeChat relies on external MCPs, image/audio/Office/ZIP rely on the host executing markitdown, and search defaults to the host's WebSearch tool. Thus, more than half of the claimed capabilities are offloaded to host-level tools rather than handled by code in this repository.

Podcast/Bilibili audio transcription relies on three GetNote (得到/Get笔记) APIs: OpenAPI creates linked notes → polls task progress (up to 40 × 30s) → Web API fetches the full transcript, saving the output as a TXT file.

scripts/get_podcast_transcript.py
for i in range(40):
Three endpoints are used across the workflow: getnote_request (openapi.biji.com), refresh_jwt (notes-api.biji.com), and get_note_transcript (get-notes.luojilab.com). Authentication depends on the GETNOTE_API_KEY and GETNOTE_CLIENT_ID environment variables alongside refresh_token stored in ~/.claude/skills/getnote/tokens.json, which the script rewrites upon token refresh.

Fetching X/Twitter and paywalled pages relies on a cascading strategy in fetch_url.sh: it first attempts conversion to Markdown via third-party proxies (r.jina.ai, defuddle.md), falling back to spoofing Googlebot/Bingbot User-Agents, X-Forwarded-For, Referer, AMP, and JSON-LD, and finally trying archive.today, Google Cache, and npx agent-fetch.

scripts/fetch_url.sh
# 1a. r.jina.ai — wide coverage, preserves image links, often bypasses paywalls
Domain whitelists are hardcoded in the script (GOOGLEBOT_DOMAINS, BINGBOT_DOMAINS, FACEBOOK_REF_DOMAINS, AMP_DOMAINS, PAYWALL_DOMAINS); this '6-layer cascading bypass strategy' serves as a central promotional highlight in the README.

Extracted content is uniformly handed over to the external notebooklm CLI (notebooklm-py) for upload and artifact generation; this repository does not implement the NotebookLM protocol internally.

main.py
['notebooklm', 'create', title],
The script contains three invocation points: ['notebooklm', 'source', 'add', file_path, '--title', title], ['notebooklm', 'ask', question], and ['notebooklm', 'source', 'add', input_arg]. The intent mapping table in SKILL.md translates requests for podcasts, PPTs, mind maps, quizzes, videos, reports, infographics, data tables, and flashcards into a three-stage command sequence: generate + artifact wait + download.

Deep Analysis Mode executes a fixed 3-round progressive interrogation template (4+5+3 = 12 questions, or 10 questions in SKILL.md), invoking notebooklm ask sequentially with 1.5-second pauses, outputting results to /tmp/*_analysis.json.

main.py
- 第一轮(4题):建立整体认知框架
Question templates branch based on content type (epub/document, youtube, and others), enforcing NotebookLM to rely solely on uploaded documents without web search via explicit system instructions. main.py's ask_round() implements time.sleep(1.5) between queries.

The optional Lark/Feishu document generation does not directly invoke open platform APIs; instead, it delegates to the external lark-cli by formatting the Q&A into Markdown and executing lark-cli docs +create.

main.py
['lark-cli', 'docs', '+create', '--title', title, '--markdown', markdown_content],
This repository only handles Markdown construction (format_feishu_markdown) and subprocess execution; lark-cli installation and Lark credentials management are outside the scope of this repository.

WeChat Official Account content extraction depends on a separate MCP server repository (using Playwright browser emulation), which install.sh clones into the skill directory while prompting the user to manually edit Claude configuration.

install.sh
git clone https://github.com/Bwkyd/wexin-read-mcp.git "$MCP_DIR"
SKILL.md provides a sample mcpServers snippet for ~/.claude/config.json pointing to <skill>/wexin-read-mcp/src/server.py. However, the pinned repository does not include the wexin-read-mcp directory (only feishu-read-mcp is present), meaning this feature strictly depends on runtime cloning.

Includes an isolated Feishu read MCP sub-package (FastMCP + Playwright) decoupled from the primary Skill workflow, offering read_feishu_doc and get_doc_info tools.

feishu-read-mcp/src/server.py
mcp = FastMCP("feishu-reader")
Its directory name differs from the cloned wexin-read-mcp, and neither SKILL.md nor the installation steps reference it, leaving it as an unlinked standalone asset in the repository.

YouTube handling is marked as the 'highest priority' special rule: URLs must be forwarded directly to NotebookLM, strictly banning any local subtitle download or transcription steps.

SKILL.md
- **禁止**使用 yt-dlp、yt-search-download、whisper、浏览器自动化等手段下载字幕
The rationale is stated explicitly: NotebookLM natively supports YouTube, automatically extracting transcripts and metadata. This rule enforces an optimization step as a hard prohibition (marked with 🔴).

2Core Capabilities

01Automatic multi-source identification (URL domain / file extension / keyword branching)
02Paywall and anti-bot bypass cascade (proxy services → search engine UA spoofing → Referer/AMP/JSON-LD → web archives → web cache → local agent-fetch)
03Podcast/Bilibili transcription (GetNote API task creation, polling, transcript extraction, and local TXT generation)
04Direct YouTube forwarding to NotebookLM (utilizes native transcript extraction, prohibiting local transcription)
05Natural language mapping to NotebookLM generation commands (podcast, PPT, mind map, quiz, video, report, infographic, data table, flashcard)
06Default minimal action discipline: uploads content without triggering generation unless explicitly instructed
07Deep Analysis Mode: 3-round progressive interrogation + structured JSON output (with optional Lark/Feishu document export)
08Direct EPUB text extraction via ebooklib and BeautifulSoup (intentionally avoids Calibre dependencies)
09Built-in 13-point environment diagnostic check (dependency modules, CLIs, MCP files, MCP configurations, NotebookLM authentication)
10One-click installation script (Python version check, MCP cloning, pip dependencies, Playwright Chromium setup, notebooklm CLI installation)

3External Dependencies

KindDependency / Endpoint
clinotebooklm(notebooklm-py CLI)
clipython3 ≥ 3.9
cligit
clicurl
climarkitdown(Microsoft)
clilark-cli(飞书文档 CLI)
clinpx(agent-fetch 兜底)
apiGet笔记 / 得到(笔记与转写)
apiNotebookLM(Google)
network第三方抓取代理/存档
network被绕过站点(付费墙/社交)
network飞书(读取:Playwright 浏览器抓文档;写入:lark-cli)
network微信公众号(经外部 MCP)
packagePython 依赖(MCP 与转换链)
packagepip 直装 git 源

4Recommended Governance & Evidence

Suggested Controls for Safe Operation
For Agent Runtime
Isolated environment, per-use explicit authorization
For Administrators
Strict authorization, full audit, compliance signoff
Evidence & Triggers (File Paths & Excerpts)
  • SKILL.md / 脚本参数: Contains anti-bot detection evasion, host sandbox disabling, or SSL verification bypassing.
  • SKILL.md / 会话存储: Reads or reuses browser authentication states and session cookies.
  • scripts/: Executes local scripts or commands: install.sh (executed by the user during installation: pip install, playwright install chromium, git clone for external MCP).
  • scripts/ 或 SKILL.md: Declares dynamic installation of external language package dependencies.
  • 网络端点: Declares external network access: openapi.biji.com / notes-api.biji.com / get-notes.luojilab.com (GetNote: creating notes, refreshing tokens, fetching transcripts).
  • 本地工作目录: Performs file read/write operations and artifact export: /tmp/*.txt (stores extracted source content; SKILL.md states these are cleaned up upon system reboot).
Audit Notes: Flagged RED at the 'policy/capability level' rather than for 'malicious payload injection'—the codebase is clean, readable, un-obfuscated, and contains no hardcoded exfiltration credentials. It triggers two red flags: ① [Anti-Scraping / Paywall Evasion] Paywall evasion is an explicit core feature: fetch_url.sh spoofs Googlebot/Bingbot UAs and X-Forwarded-For headers, fakes Referers, and routes through AMP/archive.today, with SKILL.md and README highlighting it as a core capability ('automatically detects and bypasses paywalls on 300+ sites') backed by 49 hardcoded target domains. ② [Bulk Scraping / Browser Emulation] Playwright headless browser workflows (including --no-sandbox) are implemented for WeChat and Lark/Feishu to bypass anti-scraping and login walls. Additional risk factors include credential access (reading and persisting GETNOTE_API_KEY/CLIENT_ID and tokens.json, reading NotebookLM session tokens), data routing via third-party proxies (r.jina.ai, defuddle.md, and archive.today receive scraped URLs), and external runtime package retrieval (pip installs directly from git+github, npx executes agent-fetch, and git clones external MCP repositories). Note: This classification evaluates functional characteristics only and does not evaluate authorial intent; the repository README notes it is intended 'for personal learning and research only'.

5Second-Pass Verification

  • [ok] skill.path 定位与 commit 一致性 — 单 skill 仓库,SKILL.md 在仓库根,故 path='.';工作副本 HEAD cea6ceee8cdcd01a573af5ae75c2d3cffc20650b,任务表 pin cea6ceee8cdc,PINS-b2.json 记 {dir: qiaomu-anything-to-notebooklm, commit: cea6ceee8cdc}。
  • [discrepancy] SKILL.md 宣称的内容源 vs main.py 实际覆盖 — SKILL.md/README 宣称 15+ 类源;main.py 的 main() 只有 epub/document/podcast/x_twitter/url 五个分支,其余(微信、图片、音频、Office、ZIP、搜索)不在本仓代码内,靠外部 MCP 与宿主工具完成。「不支持的输入类型」是代码里的真实兜底分支。
  • [discrepancy] README 结构图与实际文件树 — README 项目结构图与 SKILL.md 前置条件都列 wexin-read-mcp/(并给出 <skill>/wexin-read-mcp/src/server.py 的配置路径),但本 pin 仓库内不存在该目录(ls 报 No such file or directory),只有名称不同的 feishu-read-mcp/。该目录只在用户执行 install.sh 后由 git clone 产生;check_env.py 也检查这个不存在的路径。
  • [discrepancy] fetch_url.sh 的『6 层级联』是否真的可走完 — 第 4 级 archive.today 之后为无条件 `exit 75`(脚本在这里结束进程),Level 5(Google Cache)与 Level 6(agent-fetch)在代码上不可达;README 的『6 层级联』流程图因此比实际执行多两级。exit 75 的设计意图是让调用方去浏览器解 CAPTCHA 后重试,属有意为之,但副作用未在文档说明。
  • [discrepancy] feishu-read-mcp/src/server.py 是否可运行 — 该文件使用 `cookies_str: Optional[str] = None` 标注,但全文只 import sys / pathlib.Path / fastmcp / logging,没有 from typing import Optional——注解在函数定义时求值,导入即 NameError。本仓不含该服务器的测试,check_env.py 也不检查它(只查 wexin-read-mcp)。
  • [ok] 『13 项环境检查』是否属实 — check_env.py 累加结果共 13 项:Python 版本 1 + 核心模块 5(fastmcp/playwright/bs4/lxml/markitdown)+ Playwright 导入 1 + notebooklm/markitdown/git 三个 CLI 3 + MCP 文件 1 + MCP 配置 1 + NotebookLM 认证 1;与 README 的『13 项环境检查』一致。
  • [discrepancy] 深度分析问题数(SKILL.md 10 问 vs main.py / README 12 问) — SKILL.md 意图映射表写「自动生成10个问题并递归提问」、Step 4 的示例 JSON 也写 total_questions: 10;而 main.py 的模板是 4+5+3=12 问,README 场景 3 同样写「生成 12 个问题」(Step 4 另一处又是 10 问)。同一文档内自相矛盾。
  • [discrepancy] SKILL.md 章节编号连续性与内容重复 — 『支持的内容源』下出现两个 5(付费墙、YouTube)、两个 4(Office 文档、播客/音频平台)、两个 5(播客/音频平台、电子书与文档),编号重复且与 README 的 15+ 计数对不上;YouTube 与付费墙内容还被重复叙述一次(含一段孤立的绕过策略 5 条列表挂在 YouTube 规则下)。

6Verdict & Scenarios

  • Chains 'fetch → upload → generate' into a seamless natural-language pipeline covering an extensive range of sources (books, podcasts, tweets, and search keywords).
  • Delegates complex external operations to proven utilities (notebooklm, lark-cli, markitdown, external MCPs) rather than reinventing them, maintaining a lightweight and readable codebase.
  • Makes an effective architectural choice for YouTube: eliminates local subtitle extraction pipelines and enforces this optimization as a strict rule to keep LLM actions efficient.
  • Adopts a conservative default behavior: avoids triggering token-consuming or paid generation artifacts unless explicitly requested by the user.
  • Includes comprehensive environment diagnostics and an automated installer, lowering setup barriers by pinpointing missing dependencies across 13 checks.
  • Best for: Ideal for individual learning workflows requiring 'one-stop synthesis of raw materials into actionable artifacts': feeding WeChat articles, podcasts, Bilibili videos, long-form articles, PDFs, or EPUBs into NotebookLM to produce audio overviews, decks, mind maps, or quizzes. Also fits users wanting a structured 12-question deep analysis exported into Lark/Feishu docs. Requires local NotebookLM authentication (notebooklm login) and acceptance of content transmission to Google cloud services.
    Not for: Not suitable for enterprise or compliance-sensitive environments: paywall bypassing, third-party proxy routing, and Playwright scraping violate standard Terms of Service and data-handling policies, sending audio and text off-premises. Not suitable as a mission-critical or production-stable integration: includes code-documentation drift, incomplete self-checks for built-in MCPs, and unreachable fallback tiers in fetch_url.sh. Unsuitable for users seeking offline-only document processing (all core features depend on network connectivity and external CLIs).
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload qiaomu-anything-to-notebooklm.tar.gz
    sha256: 8f32da1fd86d07e0…
    Option B · Copy Guide for Agent
    install.json
    Agents automatically download and verify mirrors from this JSON guide.
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit cea6ceee8c.