videonote 0.1.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- videonote-0.1.7/.claude-plugin/marketplace.json +18 -0
- videonote-0.1.7/.claude-plugin/plugin.json +122 -0
- videonote-0.1.7/.dockerignore +13 -0
- videonote-0.1.7/.github/workflows/ci.yml +67 -0
- videonote-0.1.7/.github/workflows/release.yml +96 -0
- videonote-0.1.7/.gitignore +44 -0
- videonote-0.1.7/.python-version +1 -0
- videonote-0.1.7/CONTRIBUTING.md +38 -0
- videonote-0.1.7/Dockerfile +32 -0
- videonote-0.1.7/LICENSE +21 -0
- videonote-0.1.7/PKG-INFO +289 -0
- videonote-0.1.7/README.md +250 -0
- videonote-0.1.7/README_EN.md +248 -0
- videonote-0.1.7/VENDOR.md +76 -0
- videonote-0.1.7/app/__init__.py +2 -0
- videonote-0.1.7/app/db/__init__.py +0 -0
- videonote-0.1.7/app/db/builtin_providers.json +68 -0
- videonote-0.1.7/app/db/engine.py +71 -0
- videonote-0.1.7/app/db/init_db.py +60 -0
- videonote-0.1.7/app/db/model_dao.py +55 -0
- videonote-0.1.7/app/db/models/__init__.py +0 -0
- videonote-0.1.7/app/db/models/models.py +12 -0
- videonote-0.1.7/app/db/models/providers.py +16 -0
- videonote-0.1.7/app/db/models/video_tasks.py +18 -0
- videonote-0.1.7/app/db/provider_dao.py +147 -0
- videonote-0.1.7/app/db/video_task_dao.py +159 -0
- videonote-0.1.7/app/decorators/__init__.py +0 -0
- videonote-0.1.7/app/decorators/timeit.py +20 -0
- videonote-0.1.7/app/downloaders/__init__.py +0 -0
- videonote-0.1.7/app/downloaders/base.py +53 -0
- videonote-0.1.7/app/downloaders/bilibili_comment.py +293 -0
- videonote-0.1.7/app/downloaders/bilibili_dm_patch.py +77 -0
- videonote-0.1.7/app/downloaders/bilibili_downloader.py +404 -0
- videonote-0.1.7/app/downloaders/bilibili_subtitle.py +205 -0
- videonote-0.1.7/app/downloaders/common.py +127 -0
- videonote-0.1.7/app/downloaders/douyin_downloader.py +364 -0
- videonote-0.1.7/app/downloaders/douyin_helper/__init__.py +0 -0
- videonote-0.1.7/app/downloaders/douyin_helper/abogus.py +588 -0
- videonote-0.1.7/app/downloaders/generic_downloader.py +133 -0
- videonote-0.1.7/app/downloaders/kuaishou_downloader.py +168 -0
- videonote-0.1.7/app/downloaders/kuaishou_helper/__init__.py +0 -0
- videonote-0.1.7/app/downloaders/kuaishou_helper/kuaishou.py +115 -0
- videonote-0.1.7/app/downloaders/local_downloader.py +180 -0
- videonote-0.1.7/app/downloaders/youtube_downloader.py +200 -0
- videonote-0.1.7/app/downloaders/youtube_subtitle.py +142 -0
- videonote-0.1.7/app/enmus/exception.py +21 -0
- videonote-0.1.7/app/enmus/note_enums.py +7 -0
- videonote-0.1.7/app/enmus/task_status_enums.py +30 -0
- videonote-0.1.7/app/exceptions/__init__.py +0 -0
- videonote-0.1.7/app/exceptions/note.py +9 -0
- videonote-0.1.7/app/exceptions/provider.py +12 -0
- videonote-0.1.7/app/exceptions/task.py +13 -0
- videonote-0.1.7/app/gpt/__init__.py +0 -0
- videonote-0.1.7/app/gpt/base.py +17 -0
- videonote-0.1.7/app/gpt/gpt_factory.py +12 -0
- videonote-0.1.7/app/gpt/prompt.py +80 -0
- videonote-0.1.7/app/gpt/prompt_builder.py +139 -0
- videonote-0.1.7/app/gpt/provider/OpenAI_compatible_provider.py +15 -0
- videonote-0.1.7/app/gpt/request_chunker.py +241 -0
- videonote-0.1.7/app/gpt/universal_gpt.py +509 -0
- videonote-0.1.7/app/models/__init__.py +0 -0
- videonote-0.1.7/app/models/audio_model.py +15 -0
- videonote-0.1.7/app/models/gpt_model.py +20 -0
- videonote-0.1.7/app/models/model_config.py +16 -0
- videonote-0.1.7/app/models/notes_model.py +14 -0
- videonote-0.1.7/app/models/transcriber_model.py +19 -0
- videonote-0.1.7/app/services/constant.py +67 -0
- videonote-0.1.7/app/services/cookie_manager.py +65 -0
- videonote-0.1.7/app/services/diarization.py +148 -0
- videonote-0.1.7/app/services/inspect.py +275 -0
- videonote-0.1.7/app/services/merge.py +99 -0
- videonote-0.1.7/app/services/note.py +1185 -0
- videonote-0.1.7/app/services/note_cache.py +323 -0
- videonote-0.1.7/app/services/pipeline.py +520 -0
- videonote-0.1.7/app/services/provider.py +213 -0
- videonote-0.1.7/app/services/proxy_config_manager.py +60 -0
- videonote-0.1.7/app/services/transcriber_config_manager.py +190 -0
- videonote-0.1.7/app/transcriber/__init__.py +0 -0
- videonote-0.1.7/app/transcriber/audio_preprocess.py +153 -0
- videonote-0.1.7/app/transcriber/base.py +14 -0
- videonote-0.1.7/app/transcriber/bcut.py +282 -0
- videonote-0.1.7/app/transcriber/funasr_transcriber.py +125 -0
- videonote-0.1.7/app/transcriber/groq.py +99 -0
- videonote-0.1.7/app/transcriber/kuaishou.py +98 -0
- videonote-0.1.7/app/transcriber/mlx_whisper_transcriber.py +135 -0
- videonote-0.1.7/app/transcriber/model_download_state.py +95 -0
- videonote-0.1.7/app/transcriber/transcriber_provider.py +166 -0
- videonote-0.1.7/app/transcriber/whisper.py +190 -0
- videonote-0.1.7/app/transcriber/whisper_models.py +133 -0
- videonote-0.1.7/app/utils/env_checker.py +12 -0
- videonote-0.1.7/app/utils/json_store.py +86 -0
- videonote-0.1.7/app/utils/logger.py +63 -0
- videonote-0.1.7/app/utils/model_status.py +74 -0
- videonote-0.1.7/app/utils/note_helper.py +78 -0
- videonote-0.1.7/app/utils/openai_client.py +61 -0
- videonote-0.1.7/app/utils/path_helper.py +42 -0
- videonote-0.1.7/app/utils/screenshot_marker.py +15 -0
- videonote-0.1.7/app/utils/task_manifest.py +383 -0
- videonote-0.1.7/app/utils/url_parser.py +120 -0
- videonote-0.1.7/app/utils/url_safety.py +105 -0
- videonote-0.1.7/app/utils/video_helper.py +73 -0
- videonote-0.1.7/app/utils/video_reader.py +231 -0
- videonote-0.1.7/assets/cover-dark.png +0 -0
- videonote-0.1.7/assets/cover-light.png +0 -0
- videonote-0.1.7/assets/square.png +0 -0
- videonote-0.1.7/commands/videonote-setup.md +68 -0
- videonote-0.1.7/conftest.py +80 -0
- videonote-0.1.7/docs/00-/346/226/207/346/241/243/347/264/242/345/274/225.md +45 -0
- videonote-0.1.7/docs/00-/346/226/260/346/211/213/344/270/212/350/267/257.md +139 -0
- videonote-0.1.7/docs/01-/347/233/256/347/232/204/344/270/216/350/203/214/346/231/257.md +42 -0
- videonote-0.1.7/docs/02-/346/236/266/346/236/204/350/256/276/350/256/241.md +101 -0
- videonote-0.1.7/docs/03-/351/242/204/346/234/237/346/225/210/346/236/234.md +40 -0
- videonote-0.1.7/docs/04-/344/275/277/347/224/250/346/211/213/345/206/214.md +371 -0
- videonote-0.1.7/docs/05-/344/274/230/345/214/226/346/270/205/345/215/225.md +1322 -0
- videonote-0.1.7/docs/06-/346/211/247/350/241/214/350/277/233/345/272/246.md +315 -0
- videonote-0.1.7/docs/CHANGELOG.md +713 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/README.md +73 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/deepseek-v4-mathnote-page1.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/deepseek-v4-mathnote-page2.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/deepseek-v4-mathnote-page3.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_1.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_11.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_13.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_2.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_3.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_4.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_5.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_8.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/DeepSeek-V4 /346/212/200/346/234/257/350/247/243/350/257/273/357/274/210/347/262/276/344/277/256/347/211/210/357/274/211.pdf +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/DeepSeek-V4 /346/212/200/346/234/257/350/247/243/350/257/273/357/274/210/347/262/276/344/277/256/347/211/210/357/274/211.tex" +353 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/MathNoteCN.cls +79 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_1.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_11.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_13.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_2.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_3.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_4.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_5.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_8.jpg +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/logo-ZJU.png +0 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/note.md +304 -0
- videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/note_original.md +153 -0
- videonote-0.1.7/examples/mcp.example.json +8 -0
- videonote-0.1.7/examples/note-generation-example/README.md +103 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_000_098fa603-f076-4242-a170-f903deb7a5f9.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_001_f185cdbd-b00a-4d18-811e-1abdbd4b95e6.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_002_7c7e1054-3ffb-4494-854f-42d6ce90e0ff.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_003_81a54920-4477-4399-924c-87e42ca132f5.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_004_65adc295-a606-49f2-a8dd-ecc0ff56f944.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_005_5036c5ad-aafb-4689-b418-828df79e4d48.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_006_08fc4c48-496e-4c1b-b64a-f59d0803e254.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_007_0cce5342-c537-42b8-9bca-ae71d9c543eb.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_008_7d40c9b1-f9fc-42f0-ae52-655b664b8646.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/note.md +182 -0
- videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/note_original.md +60 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_000_ba27db97-37e7-48df-b88c-c31bc78e4a5d.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_001_b0e55a38-17e8-453b-b07a-01cd57199961.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_002_8edb5b60-c2cb-40a9-942b-065d2052808a.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_003_7ca03dca-555f-412e-9a75-170fda93557a.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_004_a5a96c39-a2ff-4404-85c0-c46026d60856.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_005_f2796883-776b-4272-b7cf-c1a78cc8e7b8.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_006_6768b8e3-594b-48f6-893e-f69868b8f445.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_007_619b207f-8cea-420c-ba6c-86b9227e1ff7.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_008_0af7afff-9571-48e5-8f7b-1b62d54b5f2d.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_009_c272bca2-a0d0-4a97-aa01-4663143aa19c.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_010_3871d1f9-5007-4974-9e49-85fd5655bb4f.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_011_07122c52-9953-4b39-bf99-f72aba7a1273.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_012_ddae9510-b4fe-46a1-911b-93f0293ae7e4.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_013_5f37961d-5de2-4843-a6b2-74f922a858d0.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_014_32c4ffb6-1e99-4bf0-9ac3-792452c91242.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_015_ad320201-32d4-4ac3-9ee2-6cdd37333b7b.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_016_a21966c3-f6b7-48db-b037-b1de5d640a1b.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_017_0a2e1753-4eea-461e-99c3-55665deb11df.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/note.md +270 -0
- videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/note_original.md +116 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_000_ac8d5550-0e2b-4909-9061-66ef912ed790.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_001_0f6d3d25-7e9c-481f-8960-50178d088696.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_002_b950c00a-a307-49df-b3f3-d820680ce2e4.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_003_6fa0440c-16f6-41f8-9bb0-763ee95b6f62.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_004_71f32d8f-8356-46cb-aaa8-e5f96a0400b2.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_005_340c8f19-14be-4ec6-bf3a-e455197ca10e.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_006_665bbd68-d258-41f5-81c8-0b53de6b3567.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_007_f9d70bfc-ecb7-47d1-bdab-4dc38e187b01.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_008_682b52a6-dfb0-4255-bc7c-c70162fad9d3.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_009_f8cd4489-81c2-4650-a7fb-73d6a85a8380.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_010_fe1ebfad-fc64-4421-9d3e-c33a28911efc.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_011_f5ae9787-c362-4df2-83c1-425426371b2e.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_012_4e5b25c1-0231-4755-91af-83c784aa0812.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_013_29e84b44-3f67-448b-a9e8-0cbaa65da36e.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_014_f9359984-421d-4edf-9b44-f047fe4efd09.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_015_c21a7359-abd8-422a-91d1-ee9ce929be0e.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_016_86fb26f5-bad0-42d1-874c-931fd8f8c259.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_017_d17e8256-2401-4019-9361-189e4ecc9487.jpg +0 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/note.md +199 -0
- videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/note_original.md +76 -0
- videonote-0.1.7/glama.json +4 -0
- videonote-0.1.7/install.sh +73 -0
- videonote-0.1.7/pyproject.toml +69 -0
- videonote-0.1.7/skills/videonote/SKILL.md +56 -0
- videonote-0.1.7/skills/videonote/reference/output-formats.md +57 -0
- videonote-0.1.7/skills/videonote/reference/tools.md +163 -0
- videonote-0.1.7/skills/videonote/reference/troubleshooting.md +37 -0
- videonote-0.1.7/skills/videonote/templates/latex/English Article/README.md +181 -0
- videonote-0.1.7/skills/videonote/templates/latex/English Article/image-1.png +0 -0
- videonote-0.1.7/skills/videonote/templates/latex/English Article/image.png +0 -0
- videonote-0.1.7/skills/videonote/templates/latex/English Article/main.pdf +0 -0
- videonote-0.1.7/skills/videonote/templates/latex/English Article/main.tex +153 -0
- videonote-0.1.7/skills/videonote/templates/latex/LICENSE-LPPL-1.3c.txt +416 -0
- videonote-0.1.7/skills/videonote/templates/latex/Math Note/MathNote.cls +76 -0
- videonote-0.1.7/skills/videonote/templates/latex/Math Note/MathNoteCN.cls +79 -0
- videonote-0.1.7/skills/videonote/templates/latex/Math Note/README.md +75 -0
- videonote-0.1.7/skills/videonote/templates/latex/Math Note/image.png +0 -0
- videonote-0.1.7/skills/videonote/templates/latex/Math Note/main.pdf +0 -0
- videonote-0.1.7/skills/videonote/templates/latex/Math Note/main.tex +45 -0
- videonote-0.1.7/skills/videonote/templates/latex/NOTICE.md +30 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/LICENSE +21 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/README.md +50 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/demo.pdf +8808 -6
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/demo.png +0 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/demo.typ +820 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/example.pdf +1499 -2
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/example.png +0 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/example.typ +53 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/img/ZJU-logo.png +0 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/img/ZJU-name.png +0 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/imports.typ +32 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/template.typ +182 -0
- videonote-0.1.7/skills/videonote/templates/typst/zju-lab/works.bib +38 -0
- videonote-0.1.7/tests/test_126_batch.py +722 -0
- videonote-0.1.7/tests/test_127_batch.py +270 -0
- videonote-0.1.7/tests/test_app_silent_fallbacks.py +148 -0
- videonote-0.1.7/tests/test_audio_preprocess.py +86 -0
- videonote-0.1.7/tests/test_audio_preprocess_cleanup.py +37 -0
- videonote-0.1.7/tests/test_b5_coverage.py +183 -0
- videonote-0.1.7/tests/test_batch_generate.py +218 -0
- videonote-0.1.7/tests/test_bcut.py +172 -0
- videonote-0.1.7/tests/test_bilibili_comment.py +311 -0
- videonote-0.1.7/tests/test_bilibili_downloader.py +160 -0
- videonote-0.1.7/tests/test_bilibili_subtitle.py +65 -0
- videonote-0.1.7/tests/test_cli.py +697 -0
- videonote-0.1.7/tests/test_config_env.py +190 -0
- videonote-0.1.7/tests/test_crypto.py +95 -0
- videonote-0.1.7/tests/test_diarization.py +125 -0
- videonote-0.1.7/tests/test_downloader_integration.py +285 -0
- videonote-0.1.7/tests/test_downloader_robustness.py +629 -0
- videonote-0.1.7/tests/test_export.py +286 -0
- videonote-0.1.7/tests/test_funasr.py +86 -0
- videonote-0.1.7/tests/test_gpt_resilience.py +158 -0
- videonote-0.1.7/tests/test_groq_compress.py +51 -0
- videonote-0.1.7/tests/test_inspect_video.py +216 -0
- videonote-0.1.7/tests/test_json_store.py +203 -0
- videonote-0.1.7/tests/test_material_mode.py +500 -0
- videonote-0.1.7/tests/test_merge.py +62 -0
- videonote-0.1.7/tests/test_note_cache.py +535 -0
- videonote-0.1.7/tests/test_openai_client.py +55 -0
- videonote-0.1.7/tests/test_outline.py +143 -0
- videonote-0.1.7/tests/test_pipeline_steps.py +362 -0
- videonote-0.1.7/tests/test_request_chunker.py +95 -0
- videonote-0.1.7/tests/test_round16_batch2.py +242 -0
- videonote-0.1.7/tests/test_server_contracts.py +1775 -0
- videonote-0.1.7/tests/test_status_tools.py +368 -0
- videonote-0.1.7/tests/test_stderr_log.py +94 -0
- videonote-0.1.7/tests/test_task_index.py +161 -0
- videonote-0.1.7/tests/test_task_manifest.py +259 -0
- videonote-0.1.7/tests/test_url_parser.py +92 -0
- videonote-0.1.7/tests/test_url_safety.py +148 -0
- videonote-0.1.7/tests/test_video_helper.py +61 -0
- videonote-0.1.7/tests/test_video_reader.py +136 -0
- videonote-0.1.7/tests/test_whisper.py +115 -0
- videonote-0.1.7/uv.lock +4276 -0
- videonote-0.1.7/videonote_mcp/__init__.py +6 -0
- videonote-0.1.7/videonote_mcp/cli.py +1653 -0
- videonote-0.1.7/videonote_mcp/config.py +305 -0
- videonote-0.1.7/videonote_mcp/crypto.py +118 -0
- videonote-0.1.7/videonote_mcp/export/__init__.py +36 -0
- videonote-0.1.7/videonote_mcp/export/exporter.py +94 -0
- videonote-0.1.7/videonote_mcp/export/json.py +70 -0
- videonote-0.1.7/videonote_mcp/export/srt.py +47 -0
- videonote-0.1.7/videonote_mcp/export/vtt.py +50 -0
- videonote-0.1.7/videonote_mcp/provider_probe.py +71 -0
- videonote-0.1.7/videonote_mcp/server.py +2091 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/claude-code-marketplace.json",
|
|
3
|
+
"name": "videonote",
|
|
4
|
+
"description": "VideoNote-Mcp:把视频链接变成 AI Markdown 笔记(Skill + MCP server),无需启动后端",
|
|
5
|
+
"owner": {
|
|
6
|
+
"name": "HuangYincan",
|
|
7
|
+
"url": "https://github.com/HuangYincan"
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
{
|
|
11
|
+
"name": "videonote",
|
|
12
|
+
"source": "./",
|
|
13
|
+
"description": "生成视频笔记的 Skill 与 MCP server(下载→转写→LLM→Markdown)",
|
|
14
|
+
"displayName": "VideoNote",
|
|
15
|
+
"skills": ["./skills/videonote"]
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "videonote",
|
|
3
|
+
"version": "0.1.7",
|
|
4
|
+
"description": "Generate AI Markdown notes from video links (Bilibili/YouTube/Douyin/Kuaishou/local)",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "HuangYincan",
|
|
7
|
+
"url": "https://github.com/HuangYincan"
|
|
8
|
+
},
|
|
9
|
+
"commands": [
|
|
10
|
+
"./commands/"
|
|
11
|
+
],
|
|
12
|
+
"mcpServers": {
|
|
13
|
+
"videonote": {
|
|
14
|
+
"command": "uvx",
|
|
15
|
+
"args": [
|
|
16
|
+
"videonote"
|
|
17
|
+
],
|
|
18
|
+
"env": {
|
|
19
|
+
"VIDEONOTE_DEFAULT_STYLE": "${user_config.default_style}",
|
|
20
|
+
"VIDEONOTE_DEFAULT_SCREENSHOT": "${user_config.default_screenshot}",
|
|
21
|
+
"VIDEONOTE_VIDEO_UNDERSTANDING": "${user_config.video_understanding}",
|
|
22
|
+
"VIDEONOTE_INCLUDE_COMMENTS": "${user_config.include_comments}",
|
|
23
|
+
"VIDEONOTE_NOTES_DIR": "${user_config.notes_dir}",
|
|
24
|
+
"TRANSCRIBER_TYPE": "${user_config.transcriber_type}",
|
|
25
|
+
"WHISPER_MODEL_SIZE": "${user_config.whisper_model_size}",
|
|
26
|
+
"VIDEONOTE_VIDEO_INTERVAL": "${user_config.video_interval}",
|
|
27
|
+
"VIDEONOTE_COMMENTS_LIMIT": "${user_config.comments_limit}",
|
|
28
|
+
"VIDEONOTE_DEFAULT_EXPORT_FORMATS": "${user_config.default_export_formats}",
|
|
29
|
+
"VIDEONOTE_ENABLE_PREPROCESS": "${user_config.enable_preprocess}",
|
|
30
|
+
"VIDEONOTE_DIARIZATION": "${user_config.diarization}",
|
|
31
|
+
"VIDEONOTE_MAX_WORKERS": "${user_config.max_workers}",
|
|
32
|
+
"VIDEONOTE_STDERR_LOG_MAX_MB": "${user_config.stderr_log_max_mb}"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"userConfig": {
|
|
37
|
+
"default_style": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"title": "笔记风格默认",
|
|
40
|
+
"description": "直接输入英文 key,其一:detailed 详细 / minimal 精简 / academic 学术 / tutorial 教程 / xiaohongshu 小红书 / life_journal 生活向 / task_oriented 任务导向 / business 商业 / meeting_minutes 会议纪要",
|
|
41
|
+
"default": "detailed"
|
|
42
|
+
},
|
|
43
|
+
"default_screenshot": {
|
|
44
|
+
"type": "boolean",
|
|
45
|
+
"title": "笔记默认插图",
|
|
46
|
+
"description": "输入 true 或 false。true=生成笔记时默认插入视频截图",
|
|
47
|
+
"default": false
|
|
48
|
+
},
|
|
49
|
+
"video_understanding": {
|
|
50
|
+
"type": "boolean",
|
|
51
|
+
"title": "视频理解默认",
|
|
52
|
+
"description": "输入 true 或 false。true=默认把画面抽帧发给多模态 LLM(需多模态模型)",
|
|
53
|
+
"default": false
|
|
54
|
+
},
|
|
55
|
+
"include_comments": {
|
|
56
|
+
"type": "boolean",
|
|
57
|
+
"title": "弹幕+评论整合默认",
|
|
58
|
+
"description": "输入 true 或 false。true=默认把 B 站弹幕+热门评论整合进笔记(需 SESSDATA)",
|
|
59
|
+
"default": false
|
|
60
|
+
},
|
|
61
|
+
"notes_dir": {
|
|
62
|
+
"type": "directory",
|
|
63
|
+
"title": "笔记默认位置",
|
|
64
|
+
"description": "输入笔记输出目录的绝对路径。留空=默认 note_results/{task_id}/",
|
|
65
|
+
"default": ""
|
|
66
|
+
},
|
|
67
|
+
"transcriber_type": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"title": "语音转写引擎",
|
|
70
|
+
"description": "直接输入英文 key,其一:fast-whisper 本地(推荐,免费)/ funasr 本地(中文更优,需手动切换)/ groq 云端 / bcut 云端 / kuaishou 云端 / mlx-whisper 本地(macOS)",
|
|
71
|
+
"default": "fast-whisper"
|
|
72
|
+
},
|
|
73
|
+
"whisper_model_size": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"title": "Whisper 模型尺寸",
|
|
76
|
+
"description": "直接输入英文 key,其一:tiny / base / small / medium / large-v3 / large-v3-turbo(内存小用 tiny/base,追求精度用 medium+;中文建议 small 起)",
|
|
77
|
+
"default": "small"
|
|
78
|
+
},
|
|
79
|
+
"video_interval": {
|
|
80
|
+
"type": "number",
|
|
81
|
+
"title": "视频理解截帧间隔(秒)",
|
|
82
|
+
"description": "数字,如 6。默认关闭时无效;开视频理解时每 N 秒抽一帧",
|
|
83
|
+
"default": 6
|
|
84
|
+
},
|
|
85
|
+
"comments_limit": {
|
|
86
|
+
"type": "number",
|
|
87
|
+
"title": "弹幕+评论条数上限",
|
|
88
|
+
"description": "数字,默认 20。开弹幕/评论整合时抓取的条数",
|
|
89
|
+
"default": 20
|
|
90
|
+
},
|
|
91
|
+
"default_export_formats": {
|
|
92
|
+
"type": "string",
|
|
93
|
+
"title": "转写导出格式默认",
|
|
94
|
+
"description": "JSON 数组字符串,如 [\"srt\",\"vtt\"]。留空=不自动导出(成功后可手动 export_transcript)",
|
|
95
|
+
"default": ""
|
|
96
|
+
},
|
|
97
|
+
"enable_preprocess": {
|
|
98
|
+
"type": "boolean",
|
|
99
|
+
"title": "音频预处理",
|
|
100
|
+
"description": "输入 true 或 false。true=转写前做 16kHz 归一化+超长分块(提高长视频转写稳定)",
|
|
101
|
+
"default": false
|
|
102
|
+
},
|
|
103
|
+
"diarization": {
|
|
104
|
+
"type": "boolean",
|
|
105
|
+
"title": "说话人分离",
|
|
106
|
+
"description": "输入 true 或 false。true=转写后做说话人分离(需可选依赖 pyannote,且需要 HF token)",
|
|
107
|
+
"default": false
|
|
108
|
+
},
|
|
109
|
+
"max_workers": {
|
|
110
|
+
"type": "number",
|
|
111
|
+
"title": "并发任务上限",
|
|
112
|
+
"description": "数字,默认 3。同时执行的笔记生成任务数上限(排队不算;机器强可调大,弱可调小)",
|
|
113
|
+
"default": 3
|
|
114
|
+
},
|
|
115
|
+
"stderr_log_max_mb": {
|
|
116
|
+
"type": "number",
|
|
117
|
+
"title": "MCP 日志轮转上限(MB)",
|
|
118
|
+
"description": "数字,默认 50。mcp_stderr.log 超过该大小后轮转为 .log.1",
|
|
119
|
+
"default": 50
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, dev]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
smoke:
|
|
10
|
+
name: Smoke test (Python ${{ matrix.python-version }})
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
fail-fast: false
|
|
14
|
+
matrix:
|
|
15
|
+
python-version: ['3.11', '3.12', '3.13']
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v5
|
|
18
|
+
- uses: astral-sh/setup-uv@v7
|
|
19
|
+
- name: Install dependencies (Python ${{ matrix.python-version }})
|
|
20
|
+
run: |
|
|
21
|
+
uv python install ${{ matrix.python-version }}
|
|
22
|
+
uv sync --frozen --python ${{ matrix.python-version }}
|
|
23
|
+
- name: Ruff F-class lint
|
|
24
|
+
run: uv run ruff check --select F .
|
|
25
|
+
- name: Server imports
|
|
26
|
+
run: uv run python -c "import videonote_mcp.server; print('import OK')"
|
|
27
|
+
- name: MCP tools/list over stdio
|
|
28
|
+
run: |
|
|
29
|
+
uv run python - <<'EOF'
|
|
30
|
+
import asyncio
|
|
31
|
+
from mcp import ClientSession, StdioServerParameters
|
|
32
|
+
from mcp.client.stdio import stdio_client
|
|
33
|
+
|
|
34
|
+
async def main():
|
|
35
|
+
params = StdioServerParameters(command="uv", args=["run", "videonote"])
|
|
36
|
+
async with stdio_client(params) as (read, write):
|
|
37
|
+
async with ClientSession(read, write) as session:
|
|
38
|
+
await session.initialize()
|
|
39
|
+
tools = await session.list_tools()
|
|
40
|
+
names = sorted(t.name for t in tools.tools)
|
|
41
|
+
# 名单断言(docs/05 #70):数量断言放过名字漂移(get_task_status 曾
|
|
42
|
+
# 丢失装饰器仍 38 全绿),必须精确匹配。改名/增删工具时同步这里。
|
|
43
|
+
expected = [
|
|
44
|
+
"batch_generate_notes", "cancel_note", "cleanup_all", "cleanup_note",
|
|
45
|
+
"diarize_media", "export_transcript", "generate_note", "get_config",
|
|
46
|
+
"get_task_status", "get_task_transcript", "health_check",
|
|
47
|
+
"inspect_video", "list_tasks", "merge_audio", "preflight",
|
|
48
|
+
"prepare_note_material",
|
|
49
|
+
]
|
|
50
|
+
assert names == expected, f"工具名单漂移: {names}"
|
|
51
|
+
print(f"tools/list OK: {len(names)} tools (名单精确匹配)")
|
|
52
|
+
asyncio.run(main())
|
|
53
|
+
EOF
|
|
54
|
+
- name: CLI smoke
|
|
55
|
+
run: uv run videonote providers list
|
|
56
|
+
- name: Unit tests
|
|
57
|
+
run: uv run pytest -q
|
|
58
|
+
|
|
59
|
+
# 汇总 job:main 分支保护规则要求 context "Smoke test"(矩阵 job 名带
|
|
60
|
+
# Python 版本,规则早于矩阵化配置)。needs 矩阵全部通过才绿,
|
|
61
|
+
# 任一失败即失败(fail-fast: false 保证三个版本都跑完)。
|
|
62
|
+
smoke-summary:
|
|
63
|
+
name: Smoke test
|
|
64
|
+
needs: smoke
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
steps:
|
|
67
|
+
- run: echo "Smoke tests passed (Python 3.11/3.12/3.13)"
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ['v*']
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
test:
|
|
9
|
+
name: Test gate (Python ${{ matrix.python-version }})
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
strategy:
|
|
12
|
+
fail-fast: false
|
|
13
|
+
matrix:
|
|
14
|
+
python-version: ['3.11', '3.12', '3.13']
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v5
|
|
17
|
+
- uses: astral-sh/setup-uv@v7
|
|
18
|
+
- name: Install dependencies (Python ${{ matrix.python-version }})
|
|
19
|
+
run: |
|
|
20
|
+
uv python install ${{ matrix.python-version }}
|
|
21
|
+
uv sync --frozen --python ${{ matrix.python-version }}
|
|
22
|
+
- name: Ruff F-class lint
|
|
23
|
+
run: uv run ruff check --select F .
|
|
24
|
+
- name: Unit tests
|
|
25
|
+
run: uv run pytest -q
|
|
26
|
+
|
|
27
|
+
release:
|
|
28
|
+
name: Create GitHub Release
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
needs: test
|
|
31
|
+
permissions:
|
|
32
|
+
contents: write
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@v5
|
|
35
|
+
# uv 不在 runner 默认 PATH(CI job 有 setup-uv,release job 漏了)——
|
|
36
|
+
# `uv build` command not found(exit 127)致 v0.1.6 首次发布失败
|
|
37
|
+
- uses: astral-sh/setup-uv@v7
|
|
38
|
+
- name: Verify version matches tag
|
|
39
|
+
run: |
|
|
40
|
+
pkg_version="$(grep -m1 '^version' pyproject.toml | sed -E 's/version = "([^"]+)"/\1/')"
|
|
41
|
+
init_version="$(grep -m1 '__version__' videonote_mcp/__init__.py | sed -E 's/__version__ = "([^"]+)"/\1/')"
|
|
42
|
+
plugin_version="$(grep -m1 '"version"' .claude-plugin/plugin.json | sed -E 's/.*"version"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/')"
|
|
43
|
+
tag_version="${GITHUB_REF_NAME#v}"
|
|
44
|
+
echo "pyproject version: $pkg_version"
|
|
45
|
+
echo "__init__ version: $init_version"
|
|
46
|
+
echo "plugin.json version: $plugin_version"
|
|
47
|
+
echo "tag version: $tag_version"
|
|
48
|
+
if [ "$pkg_version" != "$tag_version" ] || [ "$init_version" != "$tag_version" ] || [ "$plugin_version" != "$tag_version" ]; then
|
|
49
|
+
echo "::error::版本不一致(pyproject=$pkg_version / __init__=$init_version / plugin=$plugin_version / tag=${GITHUB_REF_NAME}),拒绝发布"
|
|
50
|
+
exit 1
|
|
51
|
+
fi
|
|
52
|
+
echo "✅ 四处版本一致,继续发布"
|
|
53
|
+
- name: Build wheel and verify contents
|
|
54
|
+
run: |
|
|
55
|
+
uv build --no-sources
|
|
56
|
+
wheel="$(ls dist/*.whl | head -1)"
|
|
57
|
+
echo "wheel: $wheel"
|
|
58
|
+
python - <<EOF
|
|
59
|
+
import zipfile, glob, sys
|
|
60
|
+
wheel = glob.glob("dist/*.whl")[0]
|
|
61
|
+
with zipfile.ZipFile(wheel) as z:
|
|
62
|
+
names = z.namelist()
|
|
63
|
+
required = [
|
|
64
|
+
"videonote_mcp/server.py",
|
|
65
|
+
"app/services/note.py",
|
|
66
|
+
"app/services/constant.py",
|
|
67
|
+
"skills/videonote/SKILL.md",
|
|
68
|
+
"skills/videonote/reference/tools.md",
|
|
69
|
+
]
|
|
70
|
+
missing = [r for r in required if not any(n.endswith(r) for n in names)]
|
|
71
|
+
if missing:
|
|
72
|
+
print("::error::wheel 缺少文件: %s" % missing)
|
|
73
|
+
sys.exit(1)
|
|
74
|
+
print("✅ wheel 内容完整(%d 个文件)" % len(names))
|
|
75
|
+
EOF
|
|
76
|
+
- name: Create release for tag
|
|
77
|
+
uses: softprops/action-gh-release@v3
|
|
78
|
+
with:
|
|
79
|
+
generate_release_notes: true
|
|
80
|
+
|
|
81
|
+
publish:
|
|
82
|
+
name: Publish to PyPI
|
|
83
|
+
runs-on: ubuntu-latest
|
|
84
|
+
needs: release
|
|
85
|
+
permissions:
|
|
86
|
+
# Trusted publishing(OIDC):GitHub Actions 直接以 PyPI 项目身份发布,
|
|
87
|
+
# 无需 API token 进仓库。前置:PyPI 项目 videonote 的 Publishing 里
|
|
88
|
+
# 添加 trusted publisher(owner=HuangYincan,repo=VideoNote-MCP,workflow=release.yml)。
|
|
89
|
+
id-token: write
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/checkout@v5
|
|
92
|
+
- uses: astral-sh/setup-uv@v7
|
|
93
|
+
- name: Build wheel and sdist
|
|
94
|
+
run: uv build
|
|
95
|
+
- name: Publish to PyPI
|
|
96
|
+
run: uv publish
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 运行时数据(根锚定,避免误伤 app/db/models 等源码目录)
|
|
2
|
+
/data/
|
|
3
|
+
/models/
|
|
4
|
+
/note_results/
|
|
5
|
+
/config/
|
|
6
|
+
|
|
7
|
+
# 数据库
|
|
8
|
+
*.db
|
|
9
|
+
*.sqlite3
|
|
10
|
+
|
|
11
|
+
# Python
|
|
12
|
+
__pycache__/
|
|
13
|
+
*.py[cod]
|
|
14
|
+
*.egg-info/
|
|
15
|
+
.venv/
|
|
16
|
+
venv/
|
|
17
|
+
build/
|
|
18
|
+
dist/
|
|
19
|
+
.pytest_cache/
|
|
20
|
+
.ruff_cache/
|
|
21
|
+
|
|
22
|
+
# uv
|
|
23
|
+
.uv/
|
|
24
|
+
|
|
25
|
+
# 编辑器 / 系统
|
|
26
|
+
.DS_Store
|
|
27
|
+
.idea/
|
|
28
|
+
.vscode/
|
|
29
|
+
*.log
|
|
30
|
+
|
|
31
|
+
# Claude Code 机器本地配置(插件/marketplace 安装状态,不入库)
|
|
32
|
+
.claude/settings.json
|
|
33
|
+
.claude/settings.local.json
|
|
34
|
+
# 项目 CLAUDE.md(本机开发上下文,不提交)
|
|
35
|
+
/CLAUDE.md
|
|
36
|
+
# 项目开发专用 skills(只在本机开发用,不随插件分发/入库)
|
|
37
|
+
.claude/skills/
|
|
38
|
+
|
|
39
|
+
# LaTeX 编译产物(模板预览 main.pdf 除外,需入库)
|
|
40
|
+
*.aux
|
|
41
|
+
*.fdb_latexmk
|
|
42
|
+
*.fls
|
|
43
|
+
*.out
|
|
44
|
+
*.synctex.gz
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## 开发流程
|
|
4
|
+
|
|
5
|
+
- **功能分支(日常开发)**:每次改动都**从 `dev` 新建分支**,开发完成后 **PR 合并回 `dev`**(CI 必须绿)。命名规则(`描述` 用 kebab-case,如 `feat/mcp-tools`):
|
|
6
|
+
|
|
7
|
+
| 前缀 | 用途 |
|
|
8
|
+
|------|------|
|
|
9
|
+
| `feat/` | 新功能 |
|
|
10
|
+
| `fix/` | 修复 |
|
|
11
|
+
| `docs/` | 文档 |
|
|
12
|
+
| `refactor/` | 重构 |
|
|
13
|
+
| `chore/` | 杂项(CI / 依赖 / 构建) |
|
|
14
|
+
|
|
15
|
+
示例:`git checkout -b feat/video-understanding dev`
|
|
16
|
+
- **`dev`(集成分支,无保护)**:功能分支合并到这里;保持可跑,CI 每次 push 自动冒烟。
|
|
17
|
+
- **发布分支 `main`(受保护)**:`main` 只接受 PR 合入 —— PR 必须 **Smoke test** 通过 + 1 个 approval;直接 push 会被拒(admin 也不例外)。
|
|
18
|
+
- **发版**:`dev` 稳定后开 PR `dev → main`,合并后打 `git tag vX.Y.Z && git push origin vX.Y.Z` —— [Release workflow](.github/workflows/release.yml) 会自动创建 GitHub Release。
|
|
19
|
+
|
|
20
|
+
## 本地开发
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uv sync --no-dev --frozen # 安装依赖(含本项目)
|
|
24
|
+
uv run videonote setup # 配置 LLM / 转写
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 冒烟测试(CI)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
uv run python -c "import videonote_mcp.server; print('import OK')"
|
|
31
|
+
# MCP tools/list over stdio(脚本见 .github/workflows/ci.yml)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 提交前自查
|
|
35
|
+
|
|
36
|
+
- `uv sync --frozen` 能过(锁文件与依赖一致)
|
|
37
|
+
- `import videonote_mcp.server` 不报错
|
|
38
|
+
- `uv run videonote providers list` 正常输出
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# VideoNote-Mcp —— MCP server(stdio)
|
|
2
|
+
# 用途:Docker 部署 / Glama (glama.ai/mcp/servers) 校验(提交时把本文件内容粘到 Glama 的 Dockerfile 栏)
|
|
3
|
+
# 启动:无参数运行 = MCP stdio server(客户端 attach stdin/stdout)
|
|
4
|
+
FROM python:3.12-slim
|
|
5
|
+
|
|
6
|
+
# FFmpeg(音频/视频处理必需)
|
|
7
|
+
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg \
|
|
8
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
9
|
+
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
|
|
12
|
+
# 安装 uv
|
|
13
|
+
RUN pip install --no-cache-dir uv
|
|
14
|
+
|
|
15
|
+
# 复制项目(源码必须与依赖一起就位,uv sync 会构建并安装本包,wheel 含 app/**)
|
|
16
|
+
COPY pyproject.toml uv.lock README.md ./
|
|
17
|
+
COPY videonote_mcp/ videonote_mcp/
|
|
18
|
+
COPY app/ app/
|
|
19
|
+
|
|
20
|
+
# 按锁文件安装依赖 + 本项目(--no-dev:不带可选依赖)
|
|
21
|
+
RUN uv sync --no-dev --frozen
|
|
22
|
+
|
|
23
|
+
# 非 root 运行(docs/05 第 16 轮 A3):SSRF/文件写等被利用时容器内不放大到 root。
|
|
24
|
+
# 数据目录随 HOME(/home/videonote/.local/share/videonote-mcp)走,/app 交给用户写。
|
|
25
|
+
RUN useradd --create-home --uid 1000 videonote \
|
|
26
|
+
&& chown -R videonote:videonote /app
|
|
27
|
+
|
|
28
|
+
USER videonote
|
|
29
|
+
ENV HOME=/home/videonote
|
|
30
|
+
|
|
31
|
+
# MCP server(无参数 = stdio 模式)
|
|
32
|
+
CMD ["uv", "run", "videonote"]
|
videonote-0.1.7/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yincan Huang
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|