利用 AI 大模型,一键解说并剪辑视频
This report summarizes scanner evidence for linyqh/NarratoAI, a Python project with 11,357 GitHub stars. SynthScan examined 50,217 lines of code across 171 source files, recording 1151 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 24.5 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 682 finding(s).
Are imports declared and package/API names verified? 106 finding(s).
Are wrappers, guards, and repeated structures necessary? 897 finding(s).
Which changes need focused human review? 1151 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1151 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| 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 | 42 | def normalize_tts_engine_name(tts_engine: str) -> str: | CODE |
| LOW | app/config/config.py | 46 | def normalize_indextts_voice_prefix(voice_name: str) -> str: | CODE |
| LOW | app/config/test_config_bootstrap_unittest.py | 20 | def test_save_config_keeps_macos_tts_settings_independent(self): | CODE |
| LOW | app/config/test_config_bootstrap_unittest.py | 44 | def test_load_config_bootstraps_webui_llm_defaults(self): | CODE |
| LOW | app/config/test_config_bootstrap_unittest.py | 133 | def test_fast_text_model_falls_back_to_reasoning_model(self): | CODE |
| LOW | app/config/test_config_bootstrap_unittest.py | 150 | def test_ui_keeps_full_model_name_and_openai_provider(self): | CODE |
| LOW | app/config/test_config_bootstrap_unittest.py | 159 | def test_normalize_only_strips_openai_prefix(self): | CODE |
| LOW | app/config/defaults.py | 54 | def merge_missing_app_defaults(app_config: dict | None = None) -> dict: | CODE |
| LOW | app/config/defaults.py | 62 | def normalize_openai_compatible_model_name( | CODE |
| LOW | app/config/defaults.py | 99 | 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 |
| 452 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 | 116 | except Exception as e: | CODE |
| LOW | app/config/config.py | 143 | 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 |
| 273 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 | 133 | CODE | |
| LOW | app/services/task.py | 348 | CODE | |
| LOW | app/services/task.py | 644 | 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 | 279 | 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 | 1410 | CODE | |
| LOW | app/services/voice.py | 1472 | CODE | |
| 57 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/config/ffmpeg_config.py | 197 | except Exception: | CODE |
| HIGH | app/utils/video_processor.py | 446 | except Exception: | CODE |
| HIGH | app/utils/video_processor.py | 493 | except Exception: | CODE |
| HIGH | app/services/voice.py | 77 | except Exception: | CODE |
| HIGH | app/services/voice.py | 2424 | except: | CODE |
| HIGH | app/services/voice.py | 2433 | except: | CODE |
| HIGH | app/services/voice.py | 3037 | except Exception: | CODE |
| HIGH | app/services/generate_video.py | 691 | except Exception: | CODE |
| HIGH | app/services/generate_video.py | 454 | except ValueError: | CODE |
| HIGH | app/services/generate_video.py | 1335 | except OSError: | CODE |
| HIGH | app/services/generate_video.py | 1321 | except OSError: | CODE |
| HIGH | app/services/sonilo.py | 538 | except Exception: | CODE |
| HIGH | app/services/state.py | 100 | except (ValueError, SyntaxError): | CODE |
| HIGH | webui/tools/generate_short_summary.py | 129 | except json.JSONDecodeError: | CODE |
| HIGH | webui/tools/generate_short_summary.py | 140 | except json.JSONDecodeError: | CODE |
| HIGH | webui/tools/generate_short_summary.py | 152 | except json.JSONDecodeError: | CODE |
| HIGH | webui/components/audio_settings.py | 2065 | except: | CODE |
| HIGH | webui/components/subtitle_settings.py | 719 | except OSError: | CODE |
| 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 | 243 | CODE | |
| LOW | app/services/subtitle_translator.py | 353 | 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 | 835 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 896 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 957 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 992 | CODE | |
| LOW | app/services/SDE/short_drama_explanation.py | 1029 | 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 | 463 | 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_top_p = 0.95 | COMMENT |
| LOW | config.example.toml | 81 | # sonilo_bgm_prompt = "" # 可选:配乐风格提示,留空则完全根据画面生成 | 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 | 421 | # 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/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 |