利用AI大模型,一键解说并剪辑视频; Using AI models to automatically provide commentary and edit videos with a single click.
This report presents the forensic synthetic code analysis of linyqh/NarratoAI, a Python project with 10,290 GitHub stars. SynthScan v2.0 examined 47,272 lines of code across 164 source files, recording 1063 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 22.8 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 1063 distinct pattern matches across 9 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 | webui.py | 160 | def _render_generation_status(task: dict | None) -> str: | CODE |
| LOW | webui.py | 375 | def get_voice_name_for_tts_engine(tts_engine: str) -> str: | CODE |
| LOW | webui.py | 411 | def get_jianying_export_params(draft_name=None) -> VideoClipParams: | CODE |
| LOW | webui.py | 456 | def _render_jianying_export_status(): | CODE |
| LOW | webui.py | 468 | def _render_jianying_export_dialog(): | CODE |
| LOW | webui.py | 614 | def render_export_jianying_button(): | STRING |
| LOW | app/config/audio_config.py | 89 | def get_audio_processing_config(cls) -> Dict[str, Any]: | CODE |
| LOW | app/config/audio_config.py | 168 | def get_recommended_volumes_for_content(content_type: str = 'mixed') -> Dict[str, float]: | CODE |
| LOW | app/config/config.py | 23 | def normalize_tts_engine_name(tts_engine: str) -> str: | CODE |
| LOW | app/config/config.py | 27 | def normalize_indextts_voice_prefix(voice_name: str) -> str: | CODE |
| LOW | app/config/test_config_bootstrap_unittest.py | 18 | def test_load_config_bootstraps_webui_llm_defaults(self): | CODE |
| LOW | app/config/test_config_bootstrap_unittest.py | 105 | def test_ui_keeps_full_model_name_and_openai_provider(self): | CODE |
| LOW | app/config/test_config_bootstrap_unittest.py | 114 | def test_normalize_only_strips_openai_prefix(self): | CODE |
| LOW | app/config/defaults.py | 52 | def merge_missing_app_defaults(app_config: dict | None = None) -> dict: | CODE |
| LOW | app/config/defaults.py | 60 | def normalize_openai_compatible_model_name( | CODE |
| LOW | app/config/defaults.py | 72 | def get_openai_compatible_ui_values( | CODE |
| LOW | app/utils/script_generator.py | 499 | def calculate_duration_and_word_count(self, time_range: str) -> int: | CODE |
| LOW | app/utils/ffmpeg_detector.py | 225 | def _parse_ffmpeg_table_names(output: str) -> set[str]: | CODE |
| LOW | app/utils/ffmpeg_detector.py | 267 | def _detect_hardware_encoding(ffmpeg_path: str, encoders: set[str]) -> dict[str, Any]: | CODE |
| LOW | app/utils/qwenvl_analyzer.py | 64 | async def _generate_content_with_retry(self, prompt: str, batch: List[PIL.Image.Image]): | CODE |
| LOW⚡ | app/utils/video_processor.py | 261 | def _collect_extracted_frame_paths(output_dir: str) -> List[str]: | CODE |
| LOW⚡ | app/utils/video_processor.py | 269 | def _cleanup_fast_path_artifacts(output_dir: str) -> None: | CODE |
| LOW⚡ | app/utils/video_processor.py | 277 | def _extract_single_frame_optimized(self, timestamp: float, output_path: str, | CODE |
| LOW | app/utils/video_processor.py | 89 | def extract_frames_by_interval(self, output_dir: str, interval_seconds: float = 5.0, | CODE |
| LOW | app/utils/video_processor.py | 188 | def extract_frames_by_interval_with_fallback(self, output_dir: str, interval_seconds: float = 5.0) -> List[str]: | CODE |
| LOW | app/utils/video_processor.py | 205 | def _extract_frames_fast_path(self, output_dir: str, interval_seconds: float = 5.0) -> List[str]: | CODE |
| LOW | app/utils/video_processor.py | 310 | def _try_extract_with_software_decode(self, timestamp: float, output_path: str) -> bool: | CODE |
| LOW | app/utils/video_processor.py | 338 | def _try_extract_with_hwaccel(self, timestamp: float, output_path: str, hw_accel: List[str]) -> bool: | CODE |
| LOW | app/utils/video_processor.py | 371 | def _try_extract_with_software(self, timestamp: float, output_path: str) -> bool: | CODE |
| LOW | app/utils/video_processor.py | 400 | def _try_extract_with_ultra_compatibility(self, timestamp: float, output_path: str) -> bool: | CODE |
| LOW | app/utils/video_processor.py | 584 | def extract_frames_by_interval_ultra_compatible(self, output_dir: str, interval_seconds: float = 5.0) -> List[int]: | CODE |
| LOW | app/utils/video_processor.py | 675 | def _extract_frame_ultra_compatible(self, timestamp: float, output_path: str) -> bool: | CODE |
| LOW | app/utils/test_ffmpeg_detector_unittest.py | 41 | def test_discover_includes_configured_path(self): | CODE |
| LOW | app/utils/test_ffmpeg_detector_unittest.py | 59 | def test_validate_reports_hardware_and_subtitle_support(self): | CODE |
| LOW | app/utils/utils.py | 191 | def time_convert_seconds_to_hmsm(seconds) -> str: | CODE |
| LOW | app/utils/utils.py | 244 | def split_string_by_punctuations(s): | STRING |
| LOW | app/utils/ffmpeg_utils.py | 118 | def check_ffmpeg_installation() -> bool: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 252 | def detect_hardware_acceleration() -> Dict[str, Union[bool, str, List[str], None]]: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 440 | def _detect_macos_acceleration(supported_hwaccels: str) -> None: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 470 | def _detect_windows_acceleration(supported_hwaccels: str) -> None: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 639 | def _detect_linux_acceleration(supported_hwaccels: str) -> None: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 806 | def get_ffmpeg_hwaccel_encoder() -> Optional[str]: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 834 | def is_ffmpeg_hwaccel_available() -> bool: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 862 | def get_optimal_ffmpeg_encoder() -> str: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 881 | def get_ffmpeg_command_with_hwaccel(input_path: str, output_path: str, **kwargs) -> List[str]: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 925 | def test_ffmpeg_compatibility() -> Dict[str, any]: | CODE |
| LOW | app/utils/openai_base_url_security.py | 49 | def _is_well_formed_http_base_url(base_url: str) -> bool: | CODE |
| LOW | app/utils/openai_base_url_security.py | 62 | def is_trusted_openai_compatible_base_url(base_url: Optional[str]) -> bool: | CODE |
| LOW | app/utils/openai_base_url_security.py | 88 | def openai_compatible_base_url_warning(base_url: Optional[str]) -> str: | CODE |
| LOW | app/utils/openai_base_url_security.py | 101 | def validate_openai_compatible_base_url(base_url: Optional[str]) -> Optional[str]: | CODE |
| LOW | app/services/clip_video.py | 48 | def _calculate_ffmpeg_duration(start_time: str, end_time: str) -> str: | CODE |
| LOW | app/services/clip_video.py | 61 | def _normalize_video_origin_paths( | CODE |
| LOW | app/services/clip_video.py | 104 | def _resolve_script_video_path(script_item: Dict, video_origin_paths: List[str]) -> str: | CODE |
| LOW | app/services/clip_video.py | 178 | def check_hardware_acceleration() -> Optional[str]: | CODE |
| LOW | app/services/clip_video.py | 329 | def execute_ffmpeg_with_fallback( | CODE |
| LOW | app/services/clip_video.py | 444 | def try_compatibility_fallback( | CODE |
| LOW | app/services/clip_video.py | 651 | def _process_narration_only_segment( | CODE |
| LOW | app/services/clip_video.py | 703 | def _process_original_audio_segment( | CODE |
| LOW | app/services/clip_video.py | 798 | def _build_ffmpeg_command_with_audio_control( | CODE |
| LOW⚡ | app/services/task.py | 59 | def _is_auto_transcription_enabled(params: VideoClipParams) -> bool: | CODE |
| 392 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | webui.py | 99 | except Exception as e: | CODE |
| LOW | webui.py | 286 | except Exception as e: | CODE |
| LOW | webui.py | 355 | except Exception as e: | CODE |
| LOW | webui.py | 582 | except Exception as e: | STRING |
| LOW | webui.py | 603 | except Exception as e: | STRING |
| LOW | webui.py | 666 | except Exception as e: | CODE |
| LOW | webui.py | 689 | except Exception as e: | CODE |
| MEDIUM | webui.py | 143 | def _safe_int(value, default=0): | CODE |
| LOW | app/config/config.py | 71 | except Exception as e: | CODE |
| LOW | app/config/config.py | 98 | except Exception as e: | CODE |
| LOW | app/config/ffmpeg_config.py | 115 | except Exception as e: | CODE |
| LOW | app/config/ffmpeg_config.py | 197 | except Exception: | CODE |
| LOW | app/config/ffmpeg_config.py | 258 | except Exception: | CODE |
| LOW | app/utils/script_generator.py | 37 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 77 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 113 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 188 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 300 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 341 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 380 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 422 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 556 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 613 | except Exception as e: | CODE |
| LOW | app/utils/script_generator.py | 639 | except Exception as e: | CODE |
| LOW | app/utils/ffmpeg_detector.py | 93 | except Exception as exc: | CODE |
| LOW | app/utils/ffmpeg_detector.py | 159 | except Exception as exc: | CODE |
| LOW | app/utils/ffmpeg_detector.py | 184 | except Exception: | CODE |
| LOW | app/utils/ffmpeg_detector.py | 239 | except Exception as exc: | CODE |
| LOW | app/utils/qwenvl_analyzer.py | 48 | except Exception as e: | CODE |
| LOW | app/utils/qwenvl_analyzer.py | 98 | except Exception as e: | CODE |
| LOW | app/utils/qwenvl_analyzer.py | 182 | except Exception as e: | CODE |
| LOW | app/utils/qwenvl_analyzer.py | 203 | except Exception as e: | CODE |
| LOW | app/utils/qwenvl_analyzer.py | 259 | except Exception as e: | CODE |
| LOW | app/utils/video_processor.py | 199 | except Exception as exc: | CODE |
| LOW | app/utils/video_processor.py | 440 | except Exception as e: | CODE |
| LOW | app/utils/video_processor.py | 446 | except Exception: | CODE |
| LOW | app/utils/video_processor.py | 488 | except Exception: | CODE |
| LOW | app/utils/video_processor.py | 493 | except Exception: | CODE |
| LOW | app/utils/video_processor.py | 538 | except Exception as e: | CODE |
| LOW | app/utils/video_processor.py | 579 | except Exception as e: | CODE |
| LOW | app/utils/video_processor.py | 720 | except Exception as e: | CODE |
| LOW | app/utils/video_processor.py | 726 | except Exception: | CODE |
| LOW | app/utils/video_processor.py | 737 | except Exception as e: | CODE |
| LOW | app/utils/utils.py | 61 | except Exception as e: | CODE |
| LOW | app/utils/utils.py | 183 | except Exception as e: | CODE |
| LOW | app/utils/utils.py | 291 | except Exception as e: | STRING |
| LOW | app/utils/utils.py | 552 | except Exception as e: | STRING |
| LOW | app/utils/utils.py | 608 | except Exception as e: | STRING |
| LOW | app/utils/utils.py | 659 | except Exception as e: | CODE |
| LOW | app/utils/utils.py | 676 | except Exception as e: | CODE |
| LOW | app/utils/utils.py | 695 | except Exception as e: | CODE |
| MEDIUM | app/utils/utils.py | 33 | def to_json(obj): | CODE |
| MEDIUM | app/utils/utils.py | 180 | def run(): | CODE |
| MEDIUM | app/utils/utils.py | 284 | def get_system_locale(): | CODE |
| LOW | app/utils/check_script.py | 122 | except Exception as e: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 99 | except Exception as e: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 114 | except Exception as e: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 177 | except Exception as e: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 247 | except Exception as e: | CODE |
| LOW | app/utils/ffmpeg_utils.py | 287 | except Exception as e: | CODE |
| 266 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/config/__init__.py | 7 | CODE | |
| LOW | app/config/defaults.py | 3 | CODE | |
| LOW | app/config/ffmpeg_config.py | 6 | CODE | |
| LOW | app/utils/ffmpeg_detector.py | 3 | CODE | |
| LOW | app/utils/video_processor.py | 23 | CODE | |
| LOW | app/utils/ffmpeg_utils.py | 9 | CODE | |
| LOW | app/models/schema.py | 3 | CODE | |
| LOW | app/services/task.py | 1 | CODE | |
| LOW | app/services/task.py | 5 | CODE | |
| LOW | app/services/task.py | 10 | CODE | |
| LOW | app/services/material.py | 6 | CODE | |
| LOW | app/services/subtitle_text.py | 13 | CODE | |
| LOW | app/services/short_drama_narration_validation.py | 6 | CODE | |
| LOW | app/services/subtitle_corrector.py | 3 | CODE | |
| LOW | app/services/subtitle_corrector.py | 9 | CODE | |
| LOW | app/services/subtitle_merger.py | 13 | CODE | |
| LOW | app/services/video_service.py | 1 | CODE | |
| LOW | app/services/video_service.py | 4 | CODE | |
| LOW | app/services/fun_asr_subtitle.py | 7 | CODE | |
| LOW | app/services/update_script.py | 13 | CODE | |
| LOW | app/services/audio_normalizer.py | 14 | CODE | |
| LOW | app/services/audio_normalizer.py | 15 | CODE | |
| LOW | app/services/audio_normalizer.py | 15 | CODE | |
| LOW | app/services/audio_normalizer.py | 17 | CODE | |
| LOW | app/services/llm.py | 5 | CODE | |
| LOW | app/services/llm.py | 14 | CODE | |
| LOW | app/services/llm.py | 15 | CODE | |
| LOW | app/services/llm.py | 24 | CODE | |
| LOW | app/services/subtitle.py | 1 | CODE | |
| LOW | app/services/generate_narration_script.py | 14 | CODE | |
| LOW | app/services/generate_narration_script.py | 19 | CODE | |
| LOW | app/services/voice.py | 1 | CODE | |
| LOW | app/services/voice.py | 13 | CODE | |
| LOW | app/services/generate_video.py | 34 | CODE | |
| LOW | app/services/tavily_search.py | 3 | CODE | |
| LOW | app/services/subtitle_translator.py | 3 | CODE | |
| LOW | app/services/youtube_service.py | 8 | CODE | |
| LOW | app/services/audio_merger.py | 2 | CODE | |
| LOW | app/services/audio_merger.py | 4 | CODE | |
| LOW | app/services/audio_merger.py | 5 | CODE | |
| LOW | app/services/audio_merger.py | 7 | CODE | |
| LOW | app/services/audio_merger.py | 7 | CODE | |
| LOW | app/services/video.py | 5 | CODE | |
| LOW | app/services/video.py | 7 | CODE | |
| LOW | app/services/video.py | 19 | CODE | |
| LOW | app/services/documentary/__init__.py | 1 | CODE | |
| LOW | app/services/documentary/__init__.py | 1 | CODE | |
| LOW | app/services/documentary/__init__.py | 5 | CODE | |
| LOW | app/services/llm/test_twelvelabs_provider_unittest.py | 15 | CODE | |
| LOW | app/services/llm/openai_compatible_provider.py | 26 | CODE | |
| LOW | app/services/llm/config_validator.py | 7 | CODE | |
| LOW | app/services/llm/config_validator.py | 12 | CODE | |
| LOW | app/services/llm/validators.py | 9 | CODE | |
| LOW | app/services/llm/__init__.py | 18 | CODE | |
| LOW | app/services/llm/__init__.py | 19 | CODE | |
| LOW | app/services/llm/__init__.py | 19 | CODE | |
| LOW | app/services/llm/__init__.py | 19 | CODE | |
| LOW | app/services/llm/__init__.py | 20 | CODE | |
| LOW | app/services/llm/__init__.py | 20 | CODE | |
| LOW | app/services/llm/__init__.py | 21 | CODE | |
| 46 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | webui.py | 209 | CODE | |
| LOW | webui.py | 468 | CODE | |
| LOW | webui.py | 474 | CODE | |
| LOW | webui.py | 251 | CODE | |
| LOW | app/config/ffmpeg_config.py | 99 | CODE | |
| LOW | app/utils/script_generator.py | 198 | CODE | |
| LOW | app/utils/script_generator.py | 434 | CODE | |
| LOW | app/utils/script_generator.py | 572 | CODE | |
| LOW | app/utils/qwenvl_analyzer.py | 102 | CODE | |
| LOW | app/utils/video_processor.py | 400 | CODE | |
| LOW | app/utils/video_processor.py | 675 | CODE | |
| LOW | app/utils/utils.py | 33 | CODE | |
| LOW | app/utils/utils.py | 295 | CODE | |
| LOW | app/utils/utils.py | 573 | CODE | |
| LOW | app/utils/utils.py | 612 | CODE | |
| LOW | app/utils/utils.py | 36 | CODE | |
| LOW | app/utils/check_script.py | 5 | CODE | |
| LOW | app/utils/ffmpeg_utils.py | 138 | CODE | |
| LOW | app/utils/ffmpeg_utils.py | 183 | CODE | |
| LOW | app/utils/ffmpeg_utils.py | 252 | CODE | |
| LOW | app/utils/ffmpeg_utils.py | 403 | CODE | |
| LOW | app/utils/ffmpeg_utils.py | 470 | CODE | |
| LOW | app/utils/ffmpeg_utils.py | 639 | CODE | |
| LOW | app/utils/ffmpeg_utils.py | 925 | CODE | |
| LOW | app/services/clip_video.py | 189 | CODE | |
| LOW | app/services/clip_video.py | 245 | CODE | |
| LOW | app/services/clip_video.py | 329 | CODE | |
| LOW | app/services/clip_video.py | 798 | CODE | |
| LOW | app/services/clip_video.py | 880 | CODE | |
| LOW | app/services/clip_video.py | 1011 | CODE | |
| LOW | app/services/task.py | 132 | CODE | |
| LOW | app/services/task.py | 308 | CODE | |
| LOW | app/services/task.py | 604 | CODE | |
| LOW | app/services/material.py | 39 | CODE | |
| LOW | app/services/material.py | 93 | CODE | |
| LOW | app/services/material.py | 190 | CODE | |
| LOW | app/services/material.py | 323 | CODE | |
| LOW | app/services/material.py | 525 | CODE | |
| LOW | app/services/merger_video.py | 280 | CODE | |
| LOW | app/services/merger_video.py | 313 | CODE | |
| LOW | app/services/merger_video.py | 511 | CODE | |
| LOW | app/services/merger_video.py | 30 | CODE | |
| LOW | app/services/jianying_task.py | 110 | CODE | |
| LOW | app/services/jianying_task.py | 275 | CODE | |
| LOW | app/services/subtitle_merger.py | 62 | CODE | |
| LOW | app/services/fun_asr_subtitle.py | 309 | CODE | |
| LOW | app/services/fun_asr_subtitle.py | 681 | CODE | |
| LOW | app/services/update_script.py | 90 | CODE | |
| LOW | app/services/llm.py | 115 | CODE | |
| LOW | app/services/llm.py | 138 | CODE | |
| LOW | app/services/llm.py | 478 | CODE | |
| LOW | app/services/llm.py | 532 | CODE | |
| LOW | app/services/subtitle.py | 23 | CODE | |
| LOW | app/services/subtitle.py | 197 | CODE | |
| LOW | app/services/subtitle.py | 254 | CODE | |
| LOW | app/services/generate_narration_script.py | 25 | CODE | |
| LOW | app/services/voice.py | 84 | CODE | |
| LOW | app/services/voice.py | 1147 | CODE | |
| LOW | app/services/voice.py | 1398 | CODE | |
| LOW | app/services/voice.py | 1460 | CODE | |
| 53 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/services/upload_validation.py | 27 | 验证文件路径是否存在且有效 Args: file_path: 待验证的文件路径 label: 文件类型标签(用于错误提示) allowed_exts: 允许的文件扩展名元组 | STRING |
| HIGH | app/services/upload_validation.py | 69 | 解析字幕输入源,确保只有一个有效来源 Args: subtitle_content: 字幕文本内容 subtitle_file_path: 字幕文件路径(推荐) srt_p | STRING |
| HIGH | app/services/llm/validators.py | 20 | 验证JSON输出格式 Args: output: 待验证的输出字符串 schema: JSON Schema (可选) | STRING |
| HIGH | app/services/llm/validators.py | 91 | 验证解说文案输出格式 Args: output: 待验证的解说文案输出 Returns: 解析后的 | STRING |
| HIGH | app/services/llm/validators.py | 179 | 验证字幕分析输出格式 Args: output: 待验证的字幕分析输出 Returns: 验证后的 | STRING |
| HIGH | app/services/llm/unified_service.py | 30 | 分析图片内容 Args: images: 图片路径列表或PIL图片对象列表 prompt: 分析提示词 provid | STRING |
| HIGH | app/services/llm/unified_service.py | 73 | 生成文本内容 Args: prompt: 用户提示词 system_prompt: 系统提示词 provider: | STRING |
| HIGH | app/services/llm/unified_service.py | 149 | 生成解说文案 Args: prompt: 提示词 provider: 文本模型提供商名称 temperature: | STRING |
| HIGH | app/services/llm/unified_service.py | 200 | 分析字幕内容 Args: subtitle_content: 字幕内容 provider: 文本模型提供商名称 te | STRING |
| HIGH | app/services/llm/manager.py | 93 | 获取视觉模型提供商实例 Args: provider_name: 提供商名称,如果不指定则从配置中获取 Returns: 视觉模型提供商实 | STRING |
| HIGH | app/services/llm/manager.py | 158 | 获取文本模型提供商实例 Args: provider_name: 提供商名称,如果不指定则从配置中获取 Returns: 文本模型提供商实 | STRING |
| HIGH | app/services/SDP/generate_script_short.py | 113 | 生成视频混剪脚本(向后兼容版本) Args: srt_path: 字幕文件路径(向后兼容参数,可选) api_key: API密钥 model_name: 模型名称 | STRING |
| HIGH | app/services/SDP/utils/utils.py | 10 | 加载并解析SRT文件(使用 pysrt 库,支持多种编码和格式) Args: file_path: SRT文件路径 Returns: 字幕内容列表,格式: [ | STRING |
| HIGH | app/services/SDP/utils/utils.py | 84 | 从字符串内容解析SRT(用于直接传入字幕内容,无需依赖文件路径) Args: srt_content: SRT格式的字幕文本内容 Returns: 字幕内容列表,格式同 load_srt | STRING |
| HIGH | app/services/prompts/template.py | 32 | 渲染模板 Args: template: 模板字符串 parameters: 参数字典 Retur | STRING |
| HIGH | app/services/prompts/manager.py | 39 | 获取渲染后的提示词 Args: category: 分类 name: 名称 version: 版本(可选,默认使用最 | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/utils/utils.py | 275 | CODE | |
| LOW | app/utils/utils.py | 508 | CODE | |
| LOW | app/services/fun_asr_subtitle.py | 897 | CODE | |
| LOW | app/services/subtitle_translator.py | 239 | CODE | |
| LOW | app/services/subtitle_translator.py | 342 | CODE | |
| LOW | app/services/script_service.py | 12 | CODE | |
| LOW | app/services/documentary/frame_analysis_service.py | 37 | CODE | |
| LOW | app/services/documentary/frame_analysis_service.py | 97 | CODE | |
| LOW | app/services/llm/validators.py | 69 | CODE | |
| LOW | app/services/llm/migration_adapter.py | 235 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 833 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 894 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 955 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 988 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 1025 | CODE | |
| LOW | app/services/SDP/generate_script_short.py | 14 | CODE | |
| LOW | app/services/SDP/generate_script_short.py | 97 | CODE | |
| LOW | …p/services/SDP/utils/step1_subtitle_analyzer_openai.py | 192 | CODE | |
| LOW | webui/tools/generate_short_summary.py | 272 | CODE | |
| LOW | webui/tools/generate_short_summary.py | 351 | CODE | |
| LOW | webui/tools/generate_short_summary.py | 460 | CODE | |
| LOW | webui/tools/generate_script_short.py | 36 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | config.example.toml | 21 | # 常用视觉模型示例: | COMMENT |
| LOW | config.example.toml | 61 | text_openai_max_tokens = 65536 | COMMENT |
| LOW | config.example.toml | 81 | # Together AI: https://api.together.xyz/settings/api-keys | COMMENT |
| LOW | requirements.txt | 21 | Pillow>=10.3.0 | COMMENT |
| LOW | app/config/__init__.py | 61 | colorize=True, | COMMENT |
| LOW | app/models/schema.py | 61 | COMMENT | |
| LOW | app/models/schema.py | 81 | # | COMMENT |
| LOW | app/services/task.py | 381 | # logger.info(f"\n\n使用 {subtitle_provider} 生成字幕") | COMMENT |
| LOW | app/services/llm.py | 801 | ) | COMMENT |
| LOW | app/services/subtitle.py | 441 | extract_audio_and_create_subtitle(video_file, subtitle_file) | COMMENT |
| LOW | app/services/subtitle.py | 461 | # # if gemini_subtitle_file: | COMMENT |
| LOW | app/services/generate_narration_script.py | 241 | # print(markdown_output) | COMMENT |
| LOW | app/services/generate_narration_script.py | 261 | # with open(narration_file, 'w', encoding='utf-8') as f: | COMMENT |
| LOW | webui/components/basic_settings.py | 1041 | # ) | COMMENT |
| LOW | webui/i18n/__init__.py | 1 | # 空文件,用于标记包 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/services/documentary/__init__.py | 9 | __all__ = [ | CODE |
| LOW | app/services/llm/__init__.py | 26 | __all__ = [ | CODE |
| LOW | app/services/llm/providers/__init__.py | 45 | __all__ = [ | CODE |
| LOW | app/services/prompts/registry.py | 114 | def set_default_version(self, category: str, name: str, version: str) -> None: | CODE |
| LOW | app/services/prompts/__init__.py | 29 | __all__ = [ | CODE |
| LOW | app/services/prompts/short_drama_narration/__init__.py | 49 | __all__ = [ | CODE |
| LOW | app/services/prompts/documentary/__init__.py | 29 | __all__ = [ | CODE |
| LOW | app/services/prompts/short_drama_editing/__init__.py | 34 | __all__ = [ | CODE |
| LOW | app/services/prompts/film_tv_narration/__init__.py | 40 | __all__ = [ | CODE |
| LOW | webui/__init__.py | 13 | __all__ = [ | CODE |
| LOW | webui/utils/vision_analyzer.py | 5 | logger = logging.getLogger(__name__) | CODE |
| LOW | webui/components/__init__.py | 7 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | webui.py | 280 | def run_task(): | CODE |