利用AI大模型,一键生成高清短视频 Generate short videos with one click using AI LLM.
This report presents the forensic synthetic code analysis of harry0703/MoneyPrinterTurbo, a Python project with 97,268 GitHub stars. SynthScan v2.0 examined 28,619 lines of code across 96 source files, recording 593 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 22.0 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 593 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli.py | 592 | def _path_is_within_directory(file_path: str, directory: str) -> bool: | STRING |
| LOW | cli.py | 602 | def _resolve_managed_resource_file( | STRING |
| LOW | app/asgi.py | 25 | def validation_exception_handler(request: Request, e: RequestValidationError): | CODE |
| LOW | app/config/config.py | 98 | def _decode_linux_route_gateway(hex_gateway: str) -> str: | CODE |
| LOW | app/config/config.py | 112 | def get_container_default_gateway_ip(route_path: str = "/proc/net/route") -> str: | CODE |
| LOW | app/config/config.py | 146 | def get_default_ollama_base_url() -> str: | CODE |
| LOW⚡ | app/utils/utils.py | 193 | def time_convert_seconds_to_hmsm(seconds) -> str: | CODE |
| LOW | app/utils/utils.py | 224 | def split_string_by_punctuations(s): | STRING |
| LOW | app/utils/utils.py | 266 | def normalize_script_for_subtitle_matching(video_script: str) -> str: | STRING |
| LOW | app/utils/file_security.py | 4 | def resolve_path_within_directory( | CODE |
| LOW | app/models/llm_provider.py | 259 | def normalize_provider_override(value: str | None, default_value: str | None) -> str: | CODE |
| LOW | app/controllers/v1/llm.py | 58 | def generate_video_social_metadata( | CODE |
| LOW | app/controllers/v1/video.py | 64 | def _sanitize_upload_filename(filename: str, request_id: str) -> str: | CODE |
| LOW | app/controllers/v1/video.py | 77 | def _resolve_path_within_directory(base_dir: str, unsafe_path: str, request_id: str) -> str: | CODE |
| LOW | app/controllers/v1/video.py | 381 | def upload_video_material_file(request: Request, file: UploadFile = File(...)): | CODE |
| LOW | app/services/task.py | 89 | def resolve_custom_audio_file(task_id: str, custom_audio_file: str | None) -> str: | CODE |
| LOW | app/services/material.py | 386 | def _download_videos_by_script_order( | CODE |
| LOW | app/services/cache_manager.py | 57 | def _iter_video_cache_entries() -> Iterator[_VideoCacheEntry]: | CODE |
| LOW | app/services/llm.py | 85 | def _extract_chat_completion_text(response, llm_provider: str) -> str: | STRING |
| LOW | app/services/llm.py | 114 | def _extract_qwen_generation_text(response) -> str: | CODE |
| LOW | app/services/llm.py | 442 | def _normalize_script_paragraph_number(paragraph_number: int | None) -> int: | CODE |
| LOW | app/services/llm.py | 736 | def _normalize_social_language(language: str | None) -> str: | STRING |
| LOW | app/services/llm.py | 760 | def _social_language_instruction(language: str | None) -> str: | STRING |
| LOW | app/services/llm.py | 811 | def build_social_metadata_prompt( | STRING |
| LOW | app/services/llm.py | 881 | def _fallback_social_metadata( | STRING |
| LOW | app/services/voice.py | 270 | def estimate_no_voice_duration(text: str) -> float: | CODE |
| LOW | app/services/voice.py | 482 | def ensure_legacy_submaker_fields(sub_maker: SubMaker) -> SubMaker: | CODE |
| LOW | app/services/voice.py | 497 | def populate_legacy_submaker_with_full_text( | CODE |
| LOW | app/services/voice.py | 569 | def create_edge_tts_communicate( | CODE |
| LOW | app/services/voice.py | 593 | def get_edge_tts_timeout_seconds() -> Union[float, None]: | CODE |
| LOW | app/services/voice.py | 626 | def _stream_edge_tts_sync_with_timeout( | CODE |
| LOW | app/services/voice.py | 960 | def _format_duration_to_offset(duration) -> int: | CODE |
| LOW | app/services/voice.py | 986 | def speech_synthesizer_word_boundary_cb(evt: speechsdk.SessionEventArgs): | CODE |
| LOW | app/services/voice.py | 1473 | def _build_subtitle_formatter(): | CODE |
| LOW | app/services/voice.py | 1575 | def _build_subtitle_items_from_edge_cues( | CODE |
| LOW | app/services/voice.py | 1630 | def _build_subtitle_items_from_legacy_submaker( | CODE |
| LOW | app/services/voice.py | 1705 | def _get_audio_duration_from_submaker(sub_maker: SubMaker): | CODE |
| LOW | app/services/voice.py | 1719 | def _get_audio_duration_from_file(audio_file: str) -> float: | CODE |
| LOW | app/services/video.py | 95 | def _get_required_video_duration(audio_duration: float) -> float: | CODE |
| LOW | app/services/video.py | 106 | def is_material_resolution_acceptable(width: int, height: int) -> bool: | CODE |
| LOW | app/services/video.py | 117 | def _prioritize_unique_source_clips( | CODE |
| LOW | app/services/video.py | 171 | def _get_configured_video_codec() -> str: | CODE |
| LOW | app/services/video.py | 223 | def _get_effective_video_codec(preferred_codec: str | None = None) -> str: | CODE |
| LOW | app/services/video.py | 252 | def _disable_runtime_video_codec(codec: str, reason: str): | CODE |
| LOW | app/services/video.py | 280 | def _fallback_write_videofile(clip, output_file: str, failed_codec: str, reason: str, **kwargs): | CODE |
| LOW | app/services/video.py | 293 | def _write_videofile_with_codec_fallback(clip, output_file: str, codec: str, **kwargs): | CODE |
| LOW | app/services/video.py | 316 | def _escape_ffmpeg_concat_path(file_path: str) -> str: | CODE |
| LOW | app/services/video.py | 321 | def _format_ffmpeg_concat_path(file_path: str) -> str: | CODE |
| LOW | app/services/video.py | 333 | def concat_video_clips_with_ffmpeg( | CODE |
| LOW | app/services/video.py | 412 | def _open_image_clip_with_fallback(image_path: str): | CODE |
| LOW | app/services/video.py | 848 | def _rounded_subtitle_background_clip( | CODE |
| LOW | app/services/video.py | 870 | def _get_visible_center_position( | CODE |
| LOW | app/services/video.py | 906 | def subtitle_colors_are_indistinguishable(params: VideoParams) -> bool: | CODE |
| LOW | app/services/video.py | 922 | def _subtitle_font_supports_sample(font_path: str, sample: str) -> bool: | CODE |
| LOW | app/services/video.py | 948 | def subtitle_font_supports_text(font_path: str, text: str) -> bool: | CODE |
| LOW | app/services/video.py | 993 | def resolve_subtitle_background_color(): | CODE |
| LOW | app/services/state.py | 153 | def _convert_to_original_type(value): | CODE |
| LOW | test/test_main.py | 11 | def test_main_starts_uvicorn_with_runtime_config(): | CODE |
| LOW⚡ | test/services/test_voice.py | 122 | def test_no_voice_alias_none_is_supported_temporarily(self): | CODE |
| LOW⚡ | test/services/test_voice.py | 131 | def test_no_voice_duration_estimates_non_ascii_languages(self): | CODE |
| 355 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | config.example.toml | 5 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | config.example.toml | 7 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | config.example.toml | 16 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.example.toml | 18 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.example.toml | 243 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.example.toml | 245 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.example.toml | 273 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | config.example.toml | 275 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | config.example.toml | 284 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | config.example.toml | 286 | # ============================================================================= | COMMENT |
| MEDIUM | config.example.toml | 32 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.example.toml | 34 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.example.toml | 67 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.example.toml | 69 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.example.toml | 196 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.example.toml | 198 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.example.toml | 218 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.example.toml | 220 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.example.toml | 260 | # ============================================================================= | COMMENT |
| MEDIUM | config.example.toml | 262 | # ============================================================================= | COMMENT |
| MEDIUM | config.example.toml | 314 | # ============================================================================= | COMMENT |
| MEDIUM | config.example.toml | 316 | # ============================================================================= | COMMENT |
| MEDIUM | app/services/llm.py | 689 | # ============================================================================= | STRING |
| MEDIUM | app/services/llm.py | 694 | # ============================================================================= | STRING |
| MEDIUM | webui/Main.py | 118 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | webui/Main.py | 120 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | webui/Main.py | 263 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | webui/Main.py | 265 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | webui/Main.py | 1664 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | webui/Main.py | 1666 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | webui/Main.py | 1919 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | webui/Main.py | 1921 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | webui/Main.py | 1125 | # ----------------------------------------------------------------------------- | STRING |
| MEDIUM | webui/Main.py | 1127 | # ----------------------------------------------------------------------------- | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli.py | 743 | except Exception as exc: | CODE |
| LOW | app/config/config.py | 189 | except Exception as e: | CODE |
| LOW | app/utils/utils.py | 56 | except Exception as e: | CODE |
| LOW⚡ | app/utils/utils.py | 175 | except Exception as exc: | CODE |
| LOW⚡ | app/utils/utils.py | 185 | except Exception as e: | CODE |
| MEDIUM | app/utils/utils.py | 28 | def to_json(obj): | CODE |
| MEDIUM | app/utils/utils.py | 182 | def run(): | CODE |
| LOW | app/controllers/manager/base_manager.py | 34 | except Exception: | CODE |
| LOW | app/controllers/manager/base_manager.py | 81 | except Exception: | CODE |
| LOW | app/services/material.py | 106 | except Exception as e: | CODE |
| LOW | app/services/material.py | 162 | except Exception as e: | CODE |
| LOW | app/services/material.py | 238 | except Exception as e: | CODE |
| LOW⚡ | app/services/material.py | 285 | except Exception as e: | CODE |
| LOW⚡ | app/services/material.py | 289 | except Exception as remove_error: | CODE |
| LOW⚡ | app/services/material.py | 297 | except Exception as close_error: | CODE |
| LOW | app/services/material.py | 380 | except Exception as e: | CODE |
| LOW | app/services/material.py | 460 | except Exception as e: | CODE |
| LOW | app/services/llm.py | 398 | except Exception as e: | CODE |
| LOW | app/services/llm.py | 557 | except Exception as e: | STRING |
| LOW | app/services/llm.py | 667 | except Exception as e: | STRING |
| LOW | app/services/llm.py | 674 | except Exception as e: | STRING |
| LOW | app/services/llm.py | 861 | except Exception: | STRING |
| LOW | app/services/llm.py | 939 | except Exception as e: | STRING |
| LOW | app/services/bgm.py | 185 | except Exception as exc: | CODE |
| LOW | app/services/subtitle.py | 39 | except Exception as e: | CODE |
| MEDIUM | app/services/voice.py | 645 | def _produce_chunks(): | CODE |
| LOW | app/services/voice.py | 162 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 650 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 765 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 773 | except Exception as remove_error: | CODE |
| LOW | app/services/voice.py | 892 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 916 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1047 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1143 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1173 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1272 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1331 | except Exception: | CODE |
| LOW | app/services/voice.py | 1361 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1448 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1568 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1701 | except Exception as e: | CODE |
| LOW | app/services/voice.py | 1731 | except Exception as e: | CODE |
| LOW | app/services/twelvelabs.py | 84 | except Exception as e: # noqa: BLE001 - never break the pipeline on TL errors | CODE |
| LOW | app/services/twelvelabs.py | 164 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | app/services/video.py | 304 | except Exception as exc: | CODE |
| LOW | app/services/video.py | 386 | except Exception as exc: | CODE |
| LOW | app/services/video.py | 416 | except Exception as exc: | CODE |
| LOW | app/services/video.py | 485 | except Exception as e: | CODE |
| LOW | app/services/video.py | 498 | except Exception as e: | CODE |
| LOW | app/services/video.py | 712 | except Exception as e: | CODE |
| LOW | app/services/video.py | 900 | except Exception as exc: | CODE |
| LOW | app/services/video.py | 942 | except Exception as e: | CODE |
| LOW | app/services/video.py | 1047 | except Exception as exc: | CODE |
| LOW | app/services/video.py | 1184 | except Exception as e: | CODE |
| LOW | app/services/video.py | 1243 | except Exception: | CODE |
| LOW | app/services/video.py | 1249 | except Exception as exc: | CODE |
| LOW | app/services/video.py | 1303 | except Exception: | CODE |
| LOW | test/services/test_video.py | 712 | except Exception as e: | CODE |
| LOW⚡ | test/services/test_cli.py | 236 | except Exception: | CODE |
| MEDIUM | webui/Main.py | 1155 | def open_task_folder(task_id): | CODE |
| 11 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/config/config.py | 197 | CODE | |
| LOW | app/utils/utils.py | 28 | CODE | |
| LOW | app/utils/utils.py | 350 | CODE | |
| LOW | app/utils/utils.py | 31 | CODE | |
| LOW | app/services/material.py | 55 | CODE | |
| LOW | app/services/material.py | 112 | CODE | |
| LOW | app/services/material.py | 244 | CODE | |
| LOW | app/services/material.py | 304 | CODE | |
| LOW | app/services/material.py | 386 | CODE | |
| LOW | app/services/upload_post.py | 28 | CODE | |
| LOW | app/services/cache_manager.py | 57 | CODE | |
| LOW | app/services/llm.py | 140 | CODE | |
| LOW | app/services/llm.py | 585 | CODE | |
| LOW | app/services/bgm.py | 139 | CODE | |
| LOW | app/services/subtitle.py | 21 | CODE | |
| LOW | app/services/subtitle.py | 145 | CODE | |
| LOW | app/services/subtitle.py | 200 | CODE | |
| LOW | app/services/voice.py | 357 | CODE | |
| LOW | app/services/voice.py | 626 | CODE | |
| LOW | app/services/voice.py | 726 | CODE | |
| LOW | app/services/voice.py | 781 | CODE | |
| LOW | app/services/voice.py | 947 | CODE | |
| LOW | app/services/voice.py | 1178 | CODE | |
| LOW | app/services/voice.py | 1278 | CODE | |
| LOW | app/services/video.py | 454 | CODE | |
| LOW | app/services/video.py | 529 | CODE | |
| LOW | test/services/test_llm.py | 396 | CODE | |
| LOW | test/services/test_bgm.py | 112 | CODE | |
| LOW | test/services/test_bgm.py | 270 | CODE | |
| LOW | test/services/test_controller_video.py | 52 | CODE | |
| LOW | test/services/test_controller_video.py | 212 | CODE | |
| LOW | test/services/test_video.py | 298 | CODE | |
| LOW | test/services/test_video.py | 532 | CODE | |
| LOW | webui/Main.py | 447 | CODE | |
| LOW | webui/Main.py | 663 | CODE | |
| LOW | webui/Main.py | 1031 | CODE | |
| LOW | webui/Main.py | 1493 | CODE | |
| LOW | webui/Main.py | 1678 | CODE | |
| LOW | webui/Main.py | 1924 | CODE | |
| LOW | webui/Main.py | 2331 | CODE | |
| LOW | webui/Main.py | 2465 | CODE | |
| LOW | webui/Main.py | 2877 | CODE | |
| LOW | webui/Main.py | 3105 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | config.example.toml | 248 | # Create an account and API key at https://upload-post.com/ | COMMENT |
| MEDIUM | config.example.toml | 54 | # Create an API key at https://playground.twelvelabs.io/ | COMMENT |
| MEDIUM | app/utils/utils.py | 30 | # Define a helper function to handle different types of objects | COMMENT |
| MEDIUM | app/services/video.py | 1271 | # Create an image clip and set its duration to 3 seconds | COMMENT |
| MEDIUM⚡ | test/services/test_cli.py | 227 | # Create a minimal valid video file for testing | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | README.md | 392 | upload_post_api_key = "your-api-key" | CODE |
| HIGH | README-en.md | 395 | upload_post_api_key = "your-api-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | config.example.toml | 1 | # MoneyPrinterTurbo configuration example. | COMMENT |
| LOW | config.example.toml | 21 | # 是否隐藏 WebUI 基础配置面板。 | COMMENT |
| LOW | config.example.toml | 41 | # Key 必须使用英文半角双引号,多个 Key 使用英文逗号分隔。 | COMMENT |
| LOW | config.example.toml | 61 | # twelvelabs_pegasus_model = "pegasus1.5" | COMMENT |
| LOW | config.example.toml | 201 | mimo_tts_model_name = "mimo-v2.5-tts" | COMMENT |
| LOW | config.example.toml | 261 | # Whisper Subtitles / Whisper 字幕 | COMMENT |
| LOW | config.example.toml | 321 | COMMENT | |
| LOW | docker-compose.gpu.yml | 1 | # GPU override file | COMMENT |
| LOW | app/config/__init__.py | 41 | colorize=True, | COMMENT |
| LOW | test/services/__init__.py | 1 | # Unit test package for services | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli.py | 1 | CODE | |
| LOW | app/config/__init__.py | 7 | CODE | |
| LOW | app/services/cache_manager.py | 3 | CODE | |
| LOW | app/services/video.py | 1 | CODE | |
| LOW | docs/skill/mpt_agent.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | webui.sh | 3 | # If you could not download the model from the official site, you can use the mirror site. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | test/services/test_voice.py | 999 | result = vs.get_elevenlabs_voices("fake-key") | CODE |
| LOW⚡ | test/services/test_voice.py | 1033 | mock_config.elevenlabs.get.return_value = "fake-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README-en.md | 37 | Thanks to [Kimi](https://platform.kimi.ai?aff=MoneyPrinterTurbo) for sponsoring this project! [Kimi K2.7 Code](https://p | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/controllers/manager/base_manager.py | 54 | def execute_task(self, func: Callable, *args: Any, **kwargs: Any): | CODE |
| LOW | app/controllers/manager/base_manager.py | 60 | def run_task(self, func: Callable, *args: Any, **kwargs: Any): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/utils/utils.py | 263 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | config.example.toml | 169 | # Set model_name to a model installed by `ollama pull` or shown by `ollama list`. | COMMENT |