{"owner":"JefferyHcool","repo":"BiliNote","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md"],"skills":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nBiliNote is an AI video note generation tool. It extracts content from video links (Bilibili, YouTube, Douyin, Kuaishou, local files) and generates structured Markdown notes using LLM models. Full-stack app with a FastAPI backend, React frontend, and optional Tauri desktop packaging.\n\n## Development Commands\n\n### Backend (Python 3.11 + FastAPI)\n```bash\ncd backend\npip install -r requirements.txt\npython main.py                    # Starts on 0.0.0.0:8483\npytest                            # Run tests in backend/tests/\npytest tests/test_request_chunker.py::test_name   # Run a single test\n```\n\n### Frontend (React 19 + Vite + TypeScript)\n```bash\ncd BillNote_frontend\npnpm install\npnpm dev          # Dev server on port 3015, proxies /api to backend\npnpm build        # Production build\npnpm lint         # ESLint\n```\n\n### Docker\n```bash\ndocker-compose up                              # Web stack (backend + frontend + nginx)\ndocker-compose -f docker-compose.gpu.yml up    # GPU variant\n```\n\n### Desktop (Tauri)\n```bash\ncd backend && ./build.sh          # Build PyInstaller backend binary\ncd BillNote_frontend && pnpm tauri build\n```\n\n### Browser Extension (Vue 3 + vitesse-webext, MV3)\n```bash\ncd BillNote_extension\npnpm install\npnpm dev          # watch mode → ./extension/\npnpm build        # production build → ./extension/\npnpm typecheck\npnpm test         # Vitest unit tests\npnpm test:e2e     # Playwright e2e\n```\nLoad unpacked at `chrome://extensions/` → select `BillNote_extension/extension/`. Talks to the same backend at `http://localhost:8483` (configurable in the options page). CORS in `backend/main.py` already accepts `chrome-extension://` and `moz-extension://` via regex.\n\n## Architecture\n\n**Backend** (`backend/`) — FastAPI app, entry point `main.py`:\n- `app/routers/` — API routes: `note.py` (generation), `provider.py`, `model.py`, `config.py`, `chat.py` (RAG Q&A on generated notes)\n- `app/services/` — Business logic:\n  - `note.py` — `NoteGenerator` orchestrates the full pipeline (download → transcribe → LLM → notes)\n  - `task_serial_executor.py` — task queue\n  - `chat_service.py` + `chat_tools.py` + `vector_store.py` — RAG-based AI Q&A with Function Calling, indexing transcripts and video metadata\n  - `cookie_manager.py` — per-platform cookie storage; injected into yt-dlp by downloaders (e.g. Bilibili)\n  - `transcriber_config_manager.py` — persisted transcriber settings\n- `app/downloaders/` — Platform adapters (bilibili, youtube, douyin, kuaishou, local) with shared `base.py` interface\n- `app/transcriber/` — Speech-to-text engines (fast-whisper, groq, bcut, kuaishou, mlx-whisper) with factory in `transcriber_provider.py`. YouTube path prefers existing subtitles and skips audio download when available.\n- `app/gpt/` — LLM integration with factory pattern (`gpt_factory.py`), prompt templates (`prompt.py`, `prompt_builder.py`), and `request_chunker.py` for long transcripts\n- `app/db/` — SQLite + SQLAlchemy: DAO pattern (`provider_dao.py`, `model_dao.py`, `video_task_dao.py`), models in `models/`\n- `app/utils/` — `response.py` (ResponseWrapper for consistent JSON), `video_helper.py` (screenshots via FFmpeg), `export.py` (PDF/DOCX), `ppt_generator.py`, `minio_client.py`\n- `app/validators/video_url_validator.py` — URL → platform detection (mirrored client-side in the extension)\n- `app/exceptions/` — `BizException` + handlers wired in `main.py` via `register_exception_handlers`\n- `backend/events/` — Blinker signal system for post-processing (e.g., temp file cleanup after transcription); registered in `lifespan` startup\n- `backend/ffmpeg_helper.py` — `ensure_ffmpeg_or_raise` is called at startup; respects `FFMPEG_BIN_PATH`\n\n**Frontend** (`BillNote_frontend/src/`) — React 19 + Vite + Tailwind + shadcn/ui:\n- `pages/HomePage/` — Main note generation UI: `NoteForm.tsx` (input), `MarkdownViewer.tsx` (preview), `MarkmapComponent.tsx` (mind map)\n- `pages/SettingPage/` — LLM provider management, system monitoring, transcriber config\n- `store/` — Zustand stores: `taskStore`, `modelStore`, `configStore`, `providerStore`. Persists to IndexedDB.\n- `services/` — Axios API clients matching backend routes\n- `hooks/useTaskPolling.ts` — Polls task status every 3 seconds\n- `components/ui/` — shadcn/ui (Radix-based) components\n- `i18n/` — `react-i18next` setup with locale JSON in `i18n/locales/`; toggled via `components/LanguageSwitcher.tsx`\n- Path alias: `@` → `./src`\n\n**Core Workflow**: User submits URL → task queued → download video → extract audio (FFmpeg) → transcribe (Whisper/Groq/etc) → generate notes (LLM) → frontend polls for completion → display Markdown + mind map.\n\n**Browser Extension** (`BillNote_extension/`) — Vue 3 + Vite + UnoCSS + webextension-polyfill, MV3:\n- `src/popup/Popup.vue` — main entry: detects platform from active tab URL, drives generate flow, shows progress + markdown\n- `src/options/Options.vue` — settings: backend URL, default provider/model (loaded from `/get_all_providers` + `/get_models_by_provider/{id}`), quality, screenshot/link toggles, style\n- `src/logic/api.ts` — backend API client (uses `settings.backendUrl`, unwraps `ResponseWrapper`, absolutizes `/static/screenshots/...` image paths)\n- `src/logic/storage.ts` — `chrome.storage.local`-backed Pinia-like state via `useWebExtensionStorage` for settings + last 30 tasks\n- `src/logic/platform.ts` — URL → platform detection mirroring `backend/app/validators/video_url_validator.py`\n- `src/sidepanel/`, `src/contentScripts/` — placeholders for P2/P3 (floating button, side panel mind map, RAG chat); not wired into MVP UX\n- `src/manifest.ts` — MV3 manifest, popup is default action; `host_permissions: *://*/*`\n- Polling lives client-side in popup (3 s interval while open); MV3 service worker is intentionally thin in P1\n\n## Key Configuration\n\n- **Ports**: Backend 8483, Frontend dev 3015, Docker maps 3015→80\n- **Environment**: Root `.env` (copy from `.env.example`). LLM API keys are configured through the UI, not env vars.\n- **Database**: SQLite at `backend/app/db/bili_note.db`, auto-initialized on first run\n- **FFmpeg**: Required system dependency for video/audio processing\n- **Vite proxy**: Dev server proxies `/api` and `/static` to backend (configured in `vite.config.ts`, reads env from parent dir; falls back to current dir when `DOCKER_BUILD` is set)\n- **CORS**: `backend/main.py` uses a regex (`CORS_ORIGIN_REGEX`) that allows localhost, `tauri.localhost`, and `chrome-extension://` / `moz-extension://` origins — required for the desktop app and the browser extension.\n\n## Code Style\n\n- **Frontend**: ESLint + Prettier (2 spaces, single quotes, 100 char width, Tailwind plugin). TypeScript strict mode.\n- **Backend**: Python with type hints. No configured linter. Uses Pydantic models for validation.\n- **Note**: The frontend directory is named `BillNote_frontend` (not \"Bili\").\n"},"files":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nBiliNote is an AI video note generation tool. It extracts content from video links (Bilibili, YouTube, Douyin, Kuaishou, local files) and generates structured Markdown notes using LLM models. Full-stack app with a FastAPI backend, React frontend, and optional Tauri desktop packaging.\n\n## Development Commands\n\n### Backend (Python 3.11 + FastAPI)\n```bash\ncd backend\npip install -r requirements.txt\npython main.py                    # Starts on 0.0.0.0:8483\npytest                            # Run tests in backend/tests/\npytest tests/test_request_chunker.py::test_name   # Run a single test\n```\n\n### Frontend (React 19 + Vite + TypeScript)\n```bash\ncd BillNote_frontend\npnpm install\npnpm dev          # Dev server on port 3015, proxies /api to backend\npnpm build        # Production build\npnpm lint         # ESLint\n```\n\n### Docker\n```bash\ndocker-compose up                              # Web stack (backend + frontend + nginx)\ndocker-compose -f docker-compose.gpu.yml up    # GPU variant\n```\n\n### Desktop (Tauri)\n```bash\ncd backend && ./build.sh          # Build PyInstaller backend binary\ncd BillNote_frontend && pnpm tauri build\n```\n\n### Browser Extension (Vue 3 + vitesse-webext, MV3)\n```bash\ncd BillNote_extension\npnpm install\npnpm dev          # watch mode → ./extension/\npnpm build        # production build → ./extension/\npnpm typecheck\npnpm test         # Vitest unit tests\npnpm test:e2e     # Playwright e2e\n```\nLoad unpacked at `chrome://extensions/` → select `BillNote_extension/extension/`. Talks to the same backend at `http://localhost:8483` (configurable in the options page). CORS in `backend/main.py` already accepts `chrome-extension://` and `moz-extension://` via regex.\n\n## Architecture\n\n**Backend** (`backend/`) — FastAPI app, entry point `main.py`:\n- `app/routers/` — API routes: `note.py` (generation), `provider.py`, `model.py`, `config.py`, `chat.py` (RAG Q&A on generated notes)\n- `app/services/` — Business logic:\n  - `note.py` — `NoteGenerator` orchestrates the full pipeline (download → transcribe → LLM → notes)\n  - `task_serial_executor.py` — task queue\n  - `chat_service.py` + `chat_tools.py` + `vector_store.py` — RAG-based AI Q&A with Function Calling, indexing transcripts and video metadata\n  - `cookie_manager.py` — per-platform cookie storage; injected into yt-dlp by downloaders (e.g. Bilibili)\n  - `transcriber_config_manager.py` — persisted transcriber settings\n- `app/downloaders/` — Platform adapters (bilibili, youtube, douyin, kuaishou, local) with shared `base.py` interface\n- `app/transcriber/` — Speech-to-text engines (fast-whisper, groq, bcut, kuaishou, mlx-whisper) with factory in `transcriber_provider.py`. YouTube path prefers existing subtitles and skips audio download when available.\n- `app/gpt/` — LLM integration with factory pattern (`gpt_factory.py`), prompt templates (`prompt.py`, `prompt_builder.py`), and `request_chunker.py` for long transcripts\n- `app/db/` — SQLite + SQLAlchemy: DAO pattern (`provider_dao.py`, `model_dao.py`, `video_task_dao.py`), models in `models/`\n- `app/utils/` — `response.py` (ResponseWrapper for consistent JSON), `video_helper.py` (screenshots via FFmpeg), `export.py` (PDF/DOCX), `ppt_generator.py`, `minio_client.py`\n- `app/validators/video_url_validator.py` — URL → platform detection (mirrored client-side in the extension)\n- `app/exceptions/` — `BizException` + handlers wired in `main.py` via `register_exception_handlers`\n- `backend/events/` — Blinker signal system for post-processing (e.g., temp file cleanup after transcription); registered in `lifespan` startup\n- `backend/ffmpeg_helper.py` — `ensure_ffmpeg_or_raise` is called at startup; respects `FFMPEG_BIN_PATH`\n\n**Frontend** (`BillNote_frontend/src/`) — React 19 + Vite + Tailwind + shadcn/ui:\n- `pages/HomePage/` — Main note generation UI: `NoteForm.tsx` (input), `MarkdownViewer.tsx` (preview), `MarkmapComponent.tsx` (mind map)\n- `pages/SettingPage/` — LLM provider management, system monitoring, transcriber config\n- `store/` — Zustand stores: `taskStore`, `modelStore`, `configStore`, `providerStore`. Persists to IndexedDB.\n- `services/` — Axios API clients matching backend routes\n- `hooks/useTaskPolling.ts` — Polls task status every 3 seconds\n- `components/ui/` — shadcn/ui (Radix-based) components\n- `i18n/` — `react-i18next` setup with locale JSON in `i18n/locales/`; toggled via `components/LanguageSwitcher.tsx`\n- Path alias: `@` → `./src`\n\n**Core Workflow**: User submits URL → task queued → download video → extract audio (FFmpeg) → transcribe (Whisper/Groq/etc) → generate notes (LLM) → frontend polls for completion → display Markdown + mind map.\n\n**Browser Extension** (`BillNote_extension/`) — Vue 3 + Vite + UnoCSS + webextension-polyfill, MV3:\n- `src/popup/Popup.vue` — main entry: detects platform from active tab URL, drives generate flow, shows progress + markdown\n- `src/options/Options.vue` — settings: backend URL, default provider/model (loaded from `/get_all_providers` + `/get_models_by_provider/{id}`), quality, screenshot/link toggles, style\n- `src/logic/api.ts` — backend API client (uses `settings.backendUrl`, unwraps `ResponseWrapper`, absolutizes `/static/screenshots/...` image paths)\n- `src/logic/storage.ts` — `chrome.storage.local`-backed Pinia-like state via `useWebExtensionStorage` for settings + last 30 tasks\n- `src/logic/platform.ts` — URL → platform detection mirroring `backend/app/validators/video_url_validator.py`\n- `src/sidepanel/`, `src/contentScripts/` — placeholders for P2/P3 (floating button, side panel mind map, RAG chat); not wired into MVP UX\n- `src/manifest.ts` — MV3 manifest, popup is default action; `host_permissions: *://*/*`\n- Polling lives client-side in popup (3 s interval while open); MV3 service worker is intentionally thin in P1\n\n## Key Configuration\n\n- **Ports**: Backend 8483, Frontend dev 3015, Docker maps 3015→80\n- **Environment**: Root `.env` (copy from `.env.example`). LLM API keys are configured through the UI, not env vars.\n- **Database**: SQLite at `backend/app/db/bili_note.db`, auto-initialized on first run\n- **FFmpeg**: Required system dependency for video/audio processing\n- **Vite proxy**: Dev server proxies `/api` and `/static` to backend (configured in `vite.config.ts`, reads env from parent dir; falls back to current dir when `DOCKER_BUILD` is set)\n- **CORS**: `backend/main.py` uses a regex (`CORS_ORIGIN_REGEX`) that allows localhost, `tauri.localhost`, and `chrome-extension://` / `moz-extension://` origins — required for the desktop app and the browser extension.\n\n## Code Style\n\n- **Frontend**: ESLint + Prettier (2 spaces, single quotes, 100 char width, Tailwind plugin). TypeScript strict mode.\n- **Backend**: Python with type hints. No configured linter. Uses Pydantic models for validation.\n- **Note**: The frontend directory is named `BillNote_frontend` (not \"Bili\").\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nBiliNote is an AI video note generation tool. It extracts content from video links (Bilibili, YouTube, Douyin, Kuaishou, local files) and generates structured Markdown notes using LLM models. Full-stack app with a FastAPI backend, React frontend, and optional Tauri desktop packaging.\n\n## Development Commands\n\n### Backend (Python 3.11 + FastAPI)\n```bash\ncd backend\npip install -r requirements.txt\npython main.py                    # Starts on 0.0.0.0:8483\npytest                            # Run tests in backend/tests/\npytest tests/test_request_chunker.py::test_name   # Run a single test\n```\n\n### Frontend (React 19 + Vite + TypeScript)\n```bash\ncd BillNote_frontend\npnpm install\npnpm dev          # Dev server on port 3015, proxies /api to backend\npnpm build        # Production build\npnpm lint         # ESLint\n```\n\n### Docker\n```bash\ndocker-compose up                              # Web stack (backend + frontend + nginx)\ndocker-compose -f docker-compose.gpu.yml up    # GPU variant\n```\n\n### Desktop (Tauri)\n```bash\ncd backend && ./build.sh          # Build PyInstaller backend binary\ncd BillNote_frontend && pnpm tauri build\n```\n\n### Browser Extension (Vue 3 + vitesse-webext, MV3)\n```bash\ncd BillNote_extension\npnpm install\npnpm dev          # watch mode → ./extension/\npnpm build        # production build → ./extension/\npnpm typecheck\npnpm test         # Vitest unit tests\npnpm test:e2e     # Playwright e2e\n```\nLoad unpacked at `chrome://extensions/` → select `BillNote_extension/extension/`. Talks to the same backend at `http://localhost:8483` (configurable in the options page). CORS in `backend/main.py` already accepts `chrome-extension://` and `moz-extension://` via regex.\n\n## Architecture\n\n**Backend** (`backend/`) — FastAPI app, entry point `main.py`:\n- `app/routers/` — API routes: `note.py` (generation), `provider.py`, `model.py`, `config.py`, `chat.py` (RAG Q&A on generated notes)\n- `app/services/` — Business logic:\n  - `note.py` — `NoteGenerator` orchestrates the full pipeline (download → transcribe → LLM → notes)\n  - `task_serial_executor.py` — task queue\n  - `chat_service.py` + `chat_tools.py` + `vector_store.py` — RAG-based AI Q&A with Function Calling, indexing transcripts and video metadata\n  - `cookie_manager.py` — per-platform cookie storage; injected into yt-dlp by downloaders (e.g. Bilibili)\n  - `transcriber_config_manager.py` — persisted transcriber settings\n- `app/downloaders/` — Platform adapters (bilibili, youtube, douyin, kuaishou, local) with shared `base.py` interface\n- `app/transcriber/` — Speech-to-text engines (fast-whisper, groq, bcut, kuaishou, mlx-whisper) with factory in `transcriber_provider.py`. YouTube path prefers existing subtitles and skips audio download when available.\n- `app/gpt/` — LLM integration with factory pattern (`gpt_factory.py`), prompt templates (`prompt.py`, `prompt_builder.py`), and `request_chunker.py` for long transcripts\n- `app/db/` — SQLite + SQLAlchemy: DAO pattern (`provider_dao.py`, `model_dao.py`, `video_task_dao.py`), models in `models/`\n- `app/utils/` — `response.py` (ResponseWrapper for consistent JSON), `video_helper.py` (screenshots via FFmpeg), `export.py` (PDF/DOCX), `ppt_generator.py`, `minio_client.py`\n- `app/validators/video_url_validator.py` — URL → platform detection (mirrored client-side in the extension)\n- `app/exceptions/` — `BizException` + handlers wired in `main.py` via `register_exception_handlers`\n- `backend/events/` — Blinker signal system for post-processing (e.g., temp file cleanup after transcription); registered in `lifespan` startup\n- `backend/ffmpeg_helper.py` — `ensure_ffmpeg_or_raise` is called at startup; respects `FFMPEG_BIN_PATH`\n\n**Frontend** (`BillNote_frontend/src/`) — React 19 + Vite + Tailwind + shadcn/ui:\n- `pages/HomePage/` — Main note generation UI: `NoteForm.tsx` (input), `MarkdownViewer.tsx` (preview), `MarkmapComponent.tsx` (mind map)\n- `pages/SettingPage/` — LLM provider management, system monitoring, transcriber config\n- `store/` — Zustand stores: `taskStore`, `modelStore`, `configStore`, `providerStore`. Persists to IndexedDB.\n- `services/` — Axios API clients matching backend routes\n- `hooks/useTaskPolling.ts` — Polls task status every 3 seconds\n- `components/ui/` — shadcn/ui (Radix-based) components\n- `i18n/` — `react-i18next` setup with locale JSON in `i18n/locales/`; toggled via `components/LanguageSwitcher.tsx`\n- Path alias: `@` → `./src`\n\n**Core Workflow**: User submits URL → task queued → download video → extract audio (FFmpeg) → transcribe (Whisper/Groq/etc) → generate notes (LLM) → frontend polls for completion → display Markdown + mind map.\n\n**Browser Extension** (`BillNote_extension/`) — Vue 3 + Vite + UnoCSS + webextension-polyfill, MV3:\n- `src/popup/Popup.vue` — main entry: detects platform from active tab URL, drives generate flow, shows progress + markdown\n- `src/options/Options.vue` — settings: backend URL, default provider/model (loaded from `/get_all_providers` + `/get_models_by_provider/{id}`), quality, screenshot/link toggles, style\n- `src/logic/api.ts` — backend API client (uses `settings.backendUrl`, unwraps `ResponseWrapper`, absolutizes `/static/screenshots/...` image paths)\n- `src/logic/storage.ts` — `chrome.storage.local`-backed Pinia-like state via `useWebExtensionStorage` for settings + last 30 tasks\n- `src/logic/platform.ts` — URL → platform detection mirroring `backend/app/validators/video_url_validator.py`\n- `src/sidepanel/`, `src/contentScripts/` — placeholders for P2/P3 (floating button, side panel mind map, RAG chat); not wired into MVP UX\n- `src/manifest.ts` — MV3 manifest, popup is default action; `host_permissions: *://*/*`\n- Polling lives client-side in popup (3 s interval while open); MV3 service worker is intentionally thin in P1\n\n## Key Configuration\n\n- **Ports**: Backend 8483, Frontend dev 3015, Docker maps 3015→80\n- **Environment**: Root `.env` (copy from `.env.example`). LLM API keys are configured through the UI, not env vars.\n- **Database**: SQLite at `backend/app/db/bili_note.db`, auto-initialized on first run\n- **FFmpeg**: Required system dependency for video/audio processing\n- **Vite proxy**: Dev server proxies `/api` and `/static` to backend (configured in `vite.config.ts`, reads env from parent dir; falls back to current dir when `DOCKER_BUILD` is set)\n- **CORS**: `backend/main.py` uses a regex (`CORS_ORIGIN_REGEX`) that allows localhost, `tauri.localhost`, and `chrome-extension://` / `moz-extension://` origins — required for the desktop app and the browser extension.\n\n## Code Style\n\n- **Frontend**: ESLint + Prettier (2 spaces, single quotes, 100 char width, Tailwind plugin). TypeScript strict mode.\n- **Backend**: Python with type hints. No configured linter. Uses Pydantic models for validation.\n- **Note**: The frontend directory is named `BillNote_frontend` (not \"Bili\").\n","category":"root","tokens":1745}]}