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.
Files changed (281) hide show
  1. videonote-0.1.7/.claude-plugin/marketplace.json +18 -0
  2. videonote-0.1.7/.claude-plugin/plugin.json +122 -0
  3. videonote-0.1.7/.dockerignore +13 -0
  4. videonote-0.1.7/.github/workflows/ci.yml +67 -0
  5. videonote-0.1.7/.github/workflows/release.yml +96 -0
  6. videonote-0.1.7/.gitignore +44 -0
  7. videonote-0.1.7/.python-version +1 -0
  8. videonote-0.1.7/CONTRIBUTING.md +38 -0
  9. videonote-0.1.7/Dockerfile +32 -0
  10. videonote-0.1.7/LICENSE +21 -0
  11. videonote-0.1.7/PKG-INFO +289 -0
  12. videonote-0.1.7/README.md +250 -0
  13. videonote-0.1.7/README_EN.md +248 -0
  14. videonote-0.1.7/VENDOR.md +76 -0
  15. videonote-0.1.7/app/__init__.py +2 -0
  16. videonote-0.1.7/app/db/__init__.py +0 -0
  17. videonote-0.1.7/app/db/builtin_providers.json +68 -0
  18. videonote-0.1.7/app/db/engine.py +71 -0
  19. videonote-0.1.7/app/db/init_db.py +60 -0
  20. videonote-0.1.7/app/db/model_dao.py +55 -0
  21. videonote-0.1.7/app/db/models/__init__.py +0 -0
  22. videonote-0.1.7/app/db/models/models.py +12 -0
  23. videonote-0.1.7/app/db/models/providers.py +16 -0
  24. videonote-0.1.7/app/db/models/video_tasks.py +18 -0
  25. videonote-0.1.7/app/db/provider_dao.py +147 -0
  26. videonote-0.1.7/app/db/video_task_dao.py +159 -0
  27. videonote-0.1.7/app/decorators/__init__.py +0 -0
  28. videonote-0.1.7/app/decorators/timeit.py +20 -0
  29. videonote-0.1.7/app/downloaders/__init__.py +0 -0
  30. videonote-0.1.7/app/downloaders/base.py +53 -0
  31. videonote-0.1.7/app/downloaders/bilibili_comment.py +293 -0
  32. videonote-0.1.7/app/downloaders/bilibili_dm_patch.py +77 -0
  33. videonote-0.1.7/app/downloaders/bilibili_downloader.py +404 -0
  34. videonote-0.1.7/app/downloaders/bilibili_subtitle.py +205 -0
  35. videonote-0.1.7/app/downloaders/common.py +127 -0
  36. videonote-0.1.7/app/downloaders/douyin_downloader.py +364 -0
  37. videonote-0.1.7/app/downloaders/douyin_helper/__init__.py +0 -0
  38. videonote-0.1.7/app/downloaders/douyin_helper/abogus.py +588 -0
  39. videonote-0.1.7/app/downloaders/generic_downloader.py +133 -0
  40. videonote-0.1.7/app/downloaders/kuaishou_downloader.py +168 -0
  41. videonote-0.1.7/app/downloaders/kuaishou_helper/__init__.py +0 -0
  42. videonote-0.1.7/app/downloaders/kuaishou_helper/kuaishou.py +115 -0
  43. videonote-0.1.7/app/downloaders/local_downloader.py +180 -0
  44. videonote-0.1.7/app/downloaders/youtube_downloader.py +200 -0
  45. videonote-0.1.7/app/downloaders/youtube_subtitle.py +142 -0
  46. videonote-0.1.7/app/enmus/exception.py +21 -0
  47. videonote-0.1.7/app/enmus/note_enums.py +7 -0
  48. videonote-0.1.7/app/enmus/task_status_enums.py +30 -0
  49. videonote-0.1.7/app/exceptions/__init__.py +0 -0
  50. videonote-0.1.7/app/exceptions/note.py +9 -0
  51. videonote-0.1.7/app/exceptions/provider.py +12 -0
  52. videonote-0.1.7/app/exceptions/task.py +13 -0
  53. videonote-0.1.7/app/gpt/__init__.py +0 -0
  54. videonote-0.1.7/app/gpt/base.py +17 -0
  55. videonote-0.1.7/app/gpt/gpt_factory.py +12 -0
  56. videonote-0.1.7/app/gpt/prompt.py +80 -0
  57. videonote-0.1.7/app/gpt/prompt_builder.py +139 -0
  58. videonote-0.1.7/app/gpt/provider/OpenAI_compatible_provider.py +15 -0
  59. videonote-0.1.7/app/gpt/request_chunker.py +241 -0
  60. videonote-0.1.7/app/gpt/universal_gpt.py +509 -0
  61. videonote-0.1.7/app/models/__init__.py +0 -0
  62. videonote-0.1.7/app/models/audio_model.py +15 -0
  63. videonote-0.1.7/app/models/gpt_model.py +20 -0
  64. videonote-0.1.7/app/models/model_config.py +16 -0
  65. videonote-0.1.7/app/models/notes_model.py +14 -0
  66. videonote-0.1.7/app/models/transcriber_model.py +19 -0
  67. videonote-0.1.7/app/services/constant.py +67 -0
  68. videonote-0.1.7/app/services/cookie_manager.py +65 -0
  69. videonote-0.1.7/app/services/diarization.py +148 -0
  70. videonote-0.1.7/app/services/inspect.py +275 -0
  71. videonote-0.1.7/app/services/merge.py +99 -0
  72. videonote-0.1.7/app/services/note.py +1185 -0
  73. videonote-0.1.7/app/services/note_cache.py +323 -0
  74. videonote-0.1.7/app/services/pipeline.py +520 -0
  75. videonote-0.1.7/app/services/provider.py +213 -0
  76. videonote-0.1.7/app/services/proxy_config_manager.py +60 -0
  77. videonote-0.1.7/app/services/transcriber_config_manager.py +190 -0
  78. videonote-0.1.7/app/transcriber/__init__.py +0 -0
  79. videonote-0.1.7/app/transcriber/audio_preprocess.py +153 -0
  80. videonote-0.1.7/app/transcriber/base.py +14 -0
  81. videonote-0.1.7/app/transcriber/bcut.py +282 -0
  82. videonote-0.1.7/app/transcriber/funasr_transcriber.py +125 -0
  83. videonote-0.1.7/app/transcriber/groq.py +99 -0
  84. videonote-0.1.7/app/transcriber/kuaishou.py +98 -0
  85. videonote-0.1.7/app/transcriber/mlx_whisper_transcriber.py +135 -0
  86. videonote-0.1.7/app/transcriber/model_download_state.py +95 -0
  87. videonote-0.1.7/app/transcriber/transcriber_provider.py +166 -0
  88. videonote-0.1.7/app/transcriber/whisper.py +190 -0
  89. videonote-0.1.7/app/transcriber/whisper_models.py +133 -0
  90. videonote-0.1.7/app/utils/env_checker.py +12 -0
  91. videonote-0.1.7/app/utils/json_store.py +86 -0
  92. videonote-0.1.7/app/utils/logger.py +63 -0
  93. videonote-0.1.7/app/utils/model_status.py +74 -0
  94. videonote-0.1.7/app/utils/note_helper.py +78 -0
  95. videonote-0.1.7/app/utils/openai_client.py +61 -0
  96. videonote-0.1.7/app/utils/path_helper.py +42 -0
  97. videonote-0.1.7/app/utils/screenshot_marker.py +15 -0
  98. videonote-0.1.7/app/utils/task_manifest.py +383 -0
  99. videonote-0.1.7/app/utils/url_parser.py +120 -0
  100. videonote-0.1.7/app/utils/url_safety.py +105 -0
  101. videonote-0.1.7/app/utils/video_helper.py +73 -0
  102. videonote-0.1.7/app/utils/video_reader.py +231 -0
  103. videonote-0.1.7/assets/cover-dark.png +0 -0
  104. videonote-0.1.7/assets/cover-light.png +0 -0
  105. videonote-0.1.7/assets/square.png +0 -0
  106. videonote-0.1.7/commands/videonote-setup.md +68 -0
  107. videonote-0.1.7/conftest.py +80 -0
  108. videonote-0.1.7/docs/00-/346/226/207/346/241/243/347/264/242/345/274/225.md +45 -0
  109. videonote-0.1.7/docs/00-/346/226/260/346/211/213/344/270/212/350/267/257.md +139 -0
  110. videonote-0.1.7/docs/01-/347/233/256/347/232/204/344/270/216/350/203/214/346/231/257.md +42 -0
  111. videonote-0.1.7/docs/02-/346/236/266/346/236/204/350/256/276/350/256/241.md +101 -0
  112. videonote-0.1.7/docs/03-/351/242/204/346/234/237/346/225/210/346/236/234.md +40 -0
  113. videonote-0.1.7/docs/04-/344/275/277/347/224/250/346/211/213/345/206/214.md +371 -0
  114. videonote-0.1.7/docs/05-/344/274/230/345/214/226/346/270/205/345/215/225.md +1322 -0
  115. videonote-0.1.7/docs/06-/346/211/247/350/241/214/350/277/233/345/272/246.md +315 -0
  116. videonote-0.1.7/docs/CHANGELOG.md +713 -0
  117. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/README.md +73 -0
  118. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/deepseek-v4-mathnote-page1.jpg +0 -0
  119. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/deepseek-v4-mathnote-page2.jpg +0 -0
  120. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/deepseek-v4-mathnote-page3.jpg +0 -0
  121. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_1.jpg +0 -0
  122. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_11.jpg +0 -0
  123. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_13.jpg +0 -0
  124. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_2.jpg +0 -0
  125. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_3.jpg +0 -0
  126. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_4.jpg +0 -0
  127. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_5.jpg +0 -0
  128. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/Assets/frame_8.jpg +0 -0
  129. 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
  130. 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
  131. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/MathNoteCN.cls +79 -0
  132. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_1.jpg +0 -0
  133. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_11.jpg +0 -0
  134. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_13.jpg +0 -0
  135. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_2.jpg +0 -0
  136. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_3.jpg +0 -0
  137. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_4.jpg +0 -0
  138. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_5.jpg +0 -0
  139. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/frame_8.jpg +0 -0
  140. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/latex/logo-ZJU.png +0 -0
  141. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/note.md +304 -0
  142. videonote-0.1.7/examples/agent-direct-deepseek-v4-mathnote/notes/deepseek-v4-agent-direct/note_original.md +153 -0
  143. videonote-0.1.7/examples/mcp.example.json +8 -0
  144. videonote-0.1.7/examples/note-generation-example/README.md +103 -0
  145. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_000_098fa603-f076-4242-a170-f903deb7a5f9.jpg +0 -0
  146. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_001_f185cdbd-b00a-4d18-811e-1abdbd4b95e6.jpg +0 -0
  147. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_002_7c7e1054-3ffb-4494-854f-42d6ce90e0ff.jpg +0 -0
  148. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_003_81a54920-4477-4399-924c-87e42ca132f5.jpg +0 -0
  149. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_004_65adc295-a606-49f2-a8dd-ecc0ff56f944.jpg +0 -0
  150. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_005_5036c5ad-aafb-4689-b418-828df79e4d48.jpg +0 -0
  151. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_006_08fc4c48-496e-4c1b-b64a-f59d0803e254.jpg +0 -0
  152. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_007_0cce5342-c537-42b8-9bca-ae71d9c543eb.jpg +0 -0
  153. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/Assets/screenshot_008_7d40c9b1-f9fc-42f0-ae52-655b664b8646.jpg +0 -0
  154. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/note.md +182 -0
  155. videonote-0.1.7/examples/note-generation-example/notes/forensic-doctor-reacts/note_original.md +60 -0
  156. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_000_ba27db97-37e7-48df-b88c-c31bc78e4a5d.jpg +0 -0
  157. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_001_b0e55a38-17e8-453b-b07a-01cd57199961.jpg +0 -0
  158. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_002_8edb5b60-c2cb-40a9-942b-065d2052808a.jpg +0 -0
  159. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_003_7ca03dca-555f-412e-9a75-170fda93557a.jpg +0 -0
  160. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_004_a5a96c39-a2ff-4404-85c0-c46026d60856.jpg +0 -0
  161. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_005_f2796883-776b-4272-b7cf-c1a78cc8e7b8.jpg +0 -0
  162. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_006_6768b8e3-594b-48f6-893e-f69868b8f445.jpg +0 -0
  163. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_007_619b207f-8cea-420c-ba6c-86b9227e1ff7.jpg +0 -0
  164. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_008_0af7afff-9571-48e5-8f7b-1b62d54b5f2d.jpg +0 -0
  165. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_009_c272bca2-a0d0-4a97-aa01-4663143aa19c.jpg +0 -0
  166. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_010_3871d1f9-5007-4974-9e49-85fd5655bb4f.jpg +0 -0
  167. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_011_07122c52-9953-4b39-bf99-f72aba7a1273.jpg +0 -0
  168. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_012_ddae9510-b4fe-46a1-911b-93f0293ae7e4.jpg +0 -0
  169. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_013_5f37961d-5de2-4843-a6b2-74f922a858d0.jpg +0 -0
  170. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_014_32c4ffb6-1e99-4bf0-9ac3-792452c91242.jpg +0 -0
  171. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_015_ad320201-32d4-4ac3-9ee2-6cdd37333b7b.jpg +0 -0
  172. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_016_a21966c3-f6b7-48db-b037-b1de5d640a1b.jpg +0 -0
  173. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/Assets/screenshot_017_0a2e1753-4eea-461e-99c3-55665deb11df.jpg +0 -0
  174. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/note.md +270 -0
  175. videonote-0.1.7/examples/note-generation-example/notes/ielts-true-class/note_original.md +116 -0
  176. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_000_ac8d5550-0e2b-4909-9061-66ef912ed790.jpg +0 -0
  177. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_001_0f6d3d25-7e9c-481f-8960-50178d088696.jpg +0 -0
  178. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_002_b950c00a-a307-49df-b3f3-d820680ce2e4.jpg +0 -0
  179. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_003_6fa0440c-16f6-41f8-9bb0-763ee95b6f62.jpg +0 -0
  180. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_004_71f32d8f-8356-46cb-aaa8-e5f96a0400b2.jpg +0 -0
  181. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_005_340c8f19-14be-4ec6-bf3a-e455197ca10e.jpg +0 -0
  182. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_006_665bbd68-d258-41f5-81c8-0b53de6b3567.jpg +0 -0
  183. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_007_f9d70bfc-ecb7-47d1-bdab-4dc38e187b01.jpg +0 -0
  184. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_008_682b52a6-dfb0-4255-bc7c-c70162fad9d3.jpg +0 -0
  185. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_009_f8cd4489-81c2-4650-a7fb-73d6a85a8380.jpg +0 -0
  186. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_010_fe1ebfad-fc64-4421-9d3e-c33a28911efc.jpg +0 -0
  187. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_011_f5ae9787-c362-4df2-83c1-425426371b2e.jpg +0 -0
  188. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_012_4e5b25c1-0231-4755-91af-83c784aa0812.jpg +0 -0
  189. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_013_29e84b44-3f67-448b-a9e8-0cbaa65da36e.jpg +0 -0
  190. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_014_f9359984-421d-4edf-9b44-f047fe4efd09.jpg +0 -0
  191. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_015_c21a7359-abd8-422a-91d1-ee9ce929be0e.jpg +0 -0
  192. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_016_86fb26f5-bad0-42d1-874c-931fd8f8c259.jpg +0 -0
  193. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/Assets/screenshot_017_d17e8256-2401-4019-9361-189e4ecc9487.jpg +0 -0
  194. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/note.md +199 -0
  195. videonote-0.1.7/examples/note-generation-example/notes/transformer-self-attention/note_original.md +76 -0
  196. videonote-0.1.7/glama.json +4 -0
  197. videonote-0.1.7/install.sh +73 -0
  198. videonote-0.1.7/pyproject.toml +69 -0
  199. videonote-0.1.7/skills/videonote/SKILL.md +56 -0
  200. videonote-0.1.7/skills/videonote/reference/output-formats.md +57 -0
  201. videonote-0.1.7/skills/videonote/reference/tools.md +163 -0
  202. videonote-0.1.7/skills/videonote/reference/troubleshooting.md +37 -0
  203. videonote-0.1.7/skills/videonote/templates/latex/English Article/README.md +181 -0
  204. videonote-0.1.7/skills/videonote/templates/latex/English Article/image-1.png +0 -0
  205. videonote-0.1.7/skills/videonote/templates/latex/English Article/image.png +0 -0
  206. videonote-0.1.7/skills/videonote/templates/latex/English Article/main.pdf +0 -0
  207. videonote-0.1.7/skills/videonote/templates/latex/English Article/main.tex +153 -0
  208. videonote-0.1.7/skills/videonote/templates/latex/LICENSE-LPPL-1.3c.txt +416 -0
  209. videonote-0.1.7/skills/videonote/templates/latex/Math Note/MathNote.cls +76 -0
  210. videonote-0.1.7/skills/videonote/templates/latex/Math Note/MathNoteCN.cls +79 -0
  211. videonote-0.1.7/skills/videonote/templates/latex/Math Note/README.md +75 -0
  212. videonote-0.1.7/skills/videonote/templates/latex/Math Note/image.png +0 -0
  213. videonote-0.1.7/skills/videonote/templates/latex/Math Note/main.pdf +0 -0
  214. videonote-0.1.7/skills/videonote/templates/latex/Math Note/main.tex +45 -0
  215. videonote-0.1.7/skills/videonote/templates/latex/NOTICE.md +30 -0
  216. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/LICENSE +21 -0
  217. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/README.md +50 -0
  218. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/demo.pdf +8808 -6
  219. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/demo.png +0 -0
  220. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/demo.typ +820 -0
  221. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/example.pdf +1499 -2
  222. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/example.png +0 -0
  223. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/example.typ +53 -0
  224. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/img/ZJU-logo.png +0 -0
  225. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/img/ZJU-name.png +0 -0
  226. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/imports.typ +32 -0
  227. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/template.typ +182 -0
  228. videonote-0.1.7/skills/videonote/templates/typst/zju-lab/works.bib +38 -0
  229. videonote-0.1.7/tests/test_126_batch.py +722 -0
  230. videonote-0.1.7/tests/test_127_batch.py +270 -0
  231. videonote-0.1.7/tests/test_app_silent_fallbacks.py +148 -0
  232. videonote-0.1.7/tests/test_audio_preprocess.py +86 -0
  233. videonote-0.1.7/tests/test_audio_preprocess_cleanup.py +37 -0
  234. videonote-0.1.7/tests/test_b5_coverage.py +183 -0
  235. videonote-0.1.7/tests/test_batch_generate.py +218 -0
  236. videonote-0.1.7/tests/test_bcut.py +172 -0
  237. videonote-0.1.7/tests/test_bilibili_comment.py +311 -0
  238. videonote-0.1.7/tests/test_bilibili_downloader.py +160 -0
  239. videonote-0.1.7/tests/test_bilibili_subtitle.py +65 -0
  240. videonote-0.1.7/tests/test_cli.py +697 -0
  241. videonote-0.1.7/tests/test_config_env.py +190 -0
  242. videonote-0.1.7/tests/test_crypto.py +95 -0
  243. videonote-0.1.7/tests/test_diarization.py +125 -0
  244. videonote-0.1.7/tests/test_downloader_integration.py +285 -0
  245. videonote-0.1.7/tests/test_downloader_robustness.py +629 -0
  246. videonote-0.1.7/tests/test_export.py +286 -0
  247. videonote-0.1.7/tests/test_funasr.py +86 -0
  248. videonote-0.1.7/tests/test_gpt_resilience.py +158 -0
  249. videonote-0.1.7/tests/test_groq_compress.py +51 -0
  250. videonote-0.1.7/tests/test_inspect_video.py +216 -0
  251. videonote-0.1.7/tests/test_json_store.py +203 -0
  252. videonote-0.1.7/tests/test_material_mode.py +500 -0
  253. videonote-0.1.7/tests/test_merge.py +62 -0
  254. videonote-0.1.7/tests/test_note_cache.py +535 -0
  255. videonote-0.1.7/tests/test_openai_client.py +55 -0
  256. videonote-0.1.7/tests/test_outline.py +143 -0
  257. videonote-0.1.7/tests/test_pipeline_steps.py +362 -0
  258. videonote-0.1.7/tests/test_request_chunker.py +95 -0
  259. videonote-0.1.7/tests/test_round16_batch2.py +242 -0
  260. videonote-0.1.7/tests/test_server_contracts.py +1775 -0
  261. videonote-0.1.7/tests/test_status_tools.py +368 -0
  262. videonote-0.1.7/tests/test_stderr_log.py +94 -0
  263. videonote-0.1.7/tests/test_task_index.py +161 -0
  264. videonote-0.1.7/tests/test_task_manifest.py +259 -0
  265. videonote-0.1.7/tests/test_url_parser.py +92 -0
  266. videonote-0.1.7/tests/test_url_safety.py +148 -0
  267. videonote-0.1.7/tests/test_video_helper.py +61 -0
  268. videonote-0.1.7/tests/test_video_reader.py +136 -0
  269. videonote-0.1.7/tests/test_whisper.py +115 -0
  270. videonote-0.1.7/uv.lock +4276 -0
  271. videonote-0.1.7/videonote_mcp/__init__.py +6 -0
  272. videonote-0.1.7/videonote_mcp/cli.py +1653 -0
  273. videonote-0.1.7/videonote_mcp/config.py +305 -0
  274. videonote-0.1.7/videonote_mcp/crypto.py +118 -0
  275. videonote-0.1.7/videonote_mcp/export/__init__.py +36 -0
  276. videonote-0.1.7/videonote_mcp/export/exporter.py +94 -0
  277. videonote-0.1.7/videonote_mcp/export/json.py +70 -0
  278. videonote-0.1.7/videonote_mcp/export/srt.py +47 -0
  279. videonote-0.1.7/videonote_mcp/export/vtt.py +50 -0
  280. videonote-0.1.7/videonote_mcp/provider_probe.py +71 -0
  281. 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,13 @@
1
+ .git
2
+ .venv
3
+ data
4
+ models
5
+ note_results
6
+ config
7
+ logs
8
+ dist
9
+ build
10
+ *.db
11
+ *.pyc
12
+ __pycache__
13
+ .github
@@ -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"]
@@ -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.