AutoClip|一个链接,一键出片。开源 AI 视频剪辑桌面工具,将播客、访谈、课程等长视频自动剪成短视频,生成字幕、封面和发布文案,适配抖音、小红书、TikTok、Reels 与 YouTube Shorts。Open-source AI video clipping & content repurposing.
This report summarizes scanner evidence for zhouxiaoka/autoclip, a Python project with 9,329 GitHub stars. SynthScan examined 194,743 lines of code across 1007 source files, recording 3522 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 20.7 (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? 1914 finding(s).
Are imports declared and package/API names verified? 478 finding(s).
Are wrappers, guards, and repeated structures necessary? 2807 finding(s).
Which changes need focused human review? 3522 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
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 3522 distinct pattern matches across 17 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 | frontend/src/features/studio/outputVariantPublish.ts | 11 | export function outputVariantPublishTarget(search: string) { | CODE |
| LOW | frontend/src/features/studio/editingStyleClient.ts | 9 | export async function requestStyleRecommendation(input: { url?: string; file?: File | null }, signal: AbortSignal): Prom | CODE |
| LOW | frontend/src/features/studio/editingStyle.ts | 74 | export function selectionAfterRecommendation(manual: EditingStyle | null, recommended: EditingStyle | null, current: Edi | CODE |
| LOW | frontend/src/utils/domTranslationGuard.ts | 32 | export function installDomTranslationGuard(): void { | CODE |
| LOW | frontend/src/analytics/posthog.ts | 74 | export function onAnalyticsPreferenceChange(listener: () => void): () => void { | CODE |
| LOW | frontend/src/analytics/events.ts | 79 | export function trackExampleProjectOpened(): void { | CODE |
| LOW | frontend/src/analytics/studio.ts | 30 | export function trackQuickOutputPlatforms(properties: Record<string, unknown>) { | CODE |
| LOW | frontend/src/analytics/studio.ts | 45 | export function trackTemplatePreviewPlayed(properties: Record<string, unknown>) { | CODE |
| LOW | frontend/src/analytics/studio.ts | 49 | export function trackTemplatePreviewFailed(properties: Record<string, unknown>) { | CODE |
| LOW | backend/cli.py | 538 | def _print_opencode_next_steps() -> None: | CODE |
| LOW | backend/pipeline/step5_clustering.py | 140 | def _create_collections_from_pre_clusters(self, pre_clusters: Dict[str, List[str]], clips_with_titles: List[Dict]) - | CODE |
| LOW | backend/pipeline/step5_clustering.py | 248 | def _create_default_collections(self, clips_with_titles: List[Dict]) -> List[Dict]: | CODE |
| LOW | backend/pipeline/step2_timeline.py | 244 | def _parse_and_validate_response(self, response: str, chunk_start: str, chunk_end: str, chunk_index: int) -> List[Di | CODE |
| LOW | backend/pipeline/failures.py | 59 | def looks_like_llm_setup_error(text: str) -> bool: | CODE |
| LOW | backend/pipeline/failures.py | 152 | def timeline_failure_from_report(topic_count: int, report: dict) -> PipelineFailure: | CODE |
| LOW | backend/pipeline/failures.py | 203 | def cloud_transcription_failure(message: str) -> PipelineFailure: | CODE |
| LOW | backend/pipeline/failures.py | 248 | def failure_from_speech_error(message: str) -> PipelineFailure: | CODE |
| LOW | backend/pipeline/step3_scoring.py | 23 | def resolve_min_score_threshold() -> float: | CODE |
| LOW | backend/tasks/notification.py | 20 | def send_processing_notification(self, project_id: str, task_id: str, message: str, notification_type: str = 'info') -> | CODE |
| LOW | backend/tasks/notification.py | 128 | def send_completion_notification(self, project_id: str, task_id: str, result: Dict[str, Any]) -> Dict[str, Any]: | CODE |
| LOW | backend/tasks/data_cleanup.py | 113 | def _cleanup_expired_projects(db: SessionLocal, days: int) -> int: | CODE |
| LOW | backend/tasks/import_processing.py | 106 | def _message_is_missing_credential(error: str, error_code: str) -> bool: | CODE |
| LOW | backend/tasks/import_processing.py | 113 | def import_failure_kind_for_type(type_name: str) -> Optional[str]: | CODE |
| LOW | backend/tasks/import_processing.py | 126 | def fingerprint_for_import_kind(kind: str) -> Optional[list[str]]: | CODE |
| LOW | backend/tasks/import_processing.py | 208 | def _generate_import_subtitle(task, project_id: str, video_path: str): | CODE |
| LOW | backend/tasks/video.py | 43 | def generate_video_collections(self, project_id: str, collection_data: List[Dict[str, Any]]) -> Dict[str, Any]: | CODE |
| LOW | backend/core/sentry_setup.py | 113 | def _import_monitoring_fields(event: dict, hint: Optional[dict]) -> tuple[Optional[str], Optional[list[str]]]: | CODE |
| LOW | backend/core/shared_config.py | 292 | def ensure_project_directories(self, project_id: str): | CODE |
| LOW | backend/core/desktop_config.py | 195 | def celery_worker_concurrency(self) -> int: | CODE |
| LOW | backend/core/desktop_config.py | 338 | def ensure_desktop_directories() -> bool: | CODE |
| LOW | backend/core/celery_simple_fixed.py | 92 | def backend_process_video_pipeline(self, project_id: str, input_video_path: str, input_srt_path: str, *args, **kwargs): | CODE |
| LOW | backend/core/celery_simple_fixed.py | 188 | def backend_process_single_step(self, project_id: str, step: str, config: dict, *args, **kwargs): | CODE |
| LOW | backend/core/llm_providers.py | 388 | def uses_max_completion_tokens(model: Optional[str], base_url: Optional[str]) -> bool: | CODE |
| LOW | backend/core/llm_providers.py | 403 | def asks_for_max_completion_tokens(message: Any) -> bool: | CODE |
| LOW | backend/core/windows_asyncio.py | 37 | def install_windows_proactor_cleanup() -> bool: | CODE |
| LOW | backend/core/llm_manager.py | 40 | def _reload_if_settings_changed(self) -> None: | CODE |
| LOW | backend/core/llm_manager.py | 49 | def _get_default_settings_file(self) -> Path: | CODE |
| LOW | backend/core/llm_manager.py | 326 | def openai_compatible_endpoint(self) -> Optional[Dict[str, str]]: | CODE |
| LOW | backend/core/llm_manager.py | 365 | def _get_api_key_for_provider(self, provider_type: ProviderType) -> Optional[str]: | CODE |
| LOW | backend/core/llm_manager.py | 470 | def get_current_provider_info(self) -> Dict[str, Any]: | CODE |
| LOW | backend/core/llm_manager.py | 503 | def _get_provider_display_name(self, provider_type: ProviderType) -> str: | CODE |
| LOW | backend/core/model_catalog.py | 341 | def _extract_openai_model_ids(payload) -> List[str]: | CODE |
| LOW | backend/core/model_catalog.py | 356 | def _extract_gemini_model_ids(payload: dict) -> List[str]: | CODE |
| LOW | backend/core/model_catalog.py | 380 | async def fetch_openai_compatible_models(base_url: str, api_key: str) -> List[str]: | CODE |
| LOW⚡ | backend/core/unified_paths.py | 99 | def get_project_raw_directory(self, project_id: str) -> Path: | CODE |
| LOW⚡ | backend/core/unified_paths.py | 105 | def get_project_output_directory(self, project_id: str) -> Path: | CODE |
| LOW⚡ | backend/core/unified_paths.py | 111 | def get_project_clips_directory(self, project_id: str) -> Path: | CODE |
| LOW⚡ | backend/core/unified_paths.py | 117 | def get_project_collections_directory(self, project_id: str) -> Path: | CODE |
| LOW | backend/core/error_middleware.py | 103 | def handle_autoclips_exception(exc: AutoClipsException, request_id: str = None) -> JSONResponse: | CODE |
| LOW | backend/core/error_middleware.py | 158 | def handle_starlette_http_exception(exc: StarletteHTTPException, request_id: str = None) -> JSONResponse: | CODE |
| LOW | backend/core/error_middleware.py | 179 | def get_status_code_for_category(category: ErrorCategory) -> int: | CODE |
| LOW | backend/core/error_middleware.py | 193 | def get_status_code_for_service_error(error_code) -> int: | CODE |
| LOW | backend/core/project_enum_migration.py | 37 | def normalize_legacy_project_enums(engine: Engine) -> int: | CODE |
| LOW⚡ | backend/core/unified_storage.py | 69 | def get_project_raw_directory(self, project_id: str) -> Path: | CODE |
| LOW⚡ | backend/core/unified_storage.py | 75 | def get_project_output_directory(self, project_id: str) -> Path: | CODE |
| LOW⚡ | backend/core/unified_storage.py | 81 | def get_project_clips_directory(self, project_id: str) -> Path: | CODE |
| LOW⚡ | backend/core/unified_storage.py | 87 | def get_project_collections_directory(self, project_id: str) -> Path: | CODE |
| LOW⚡ | backend/core/unified_storage.py | 93 | def get_project_metadata_directory(self, project_id: str) -> Path: | CODE |
| LOW | backend/core/image_providers.py | 430 | def _generate_legacy_dashscope(*, api_key, base_url, request, session, cancel, poll_interval): | CODE |
| LOW | backend/core/cloud_presets.py | 111 | def normalize_cloud_preset_key(name: Optional[str]) -> Optional[str]: | CODE |
| 1611 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clean_database.py | 51 | except Exception as e: | CODE |
| LOW | docker-entrypoint.sh | 15 | except Exception as error: | CODE |
| LOW | backend/app_factory.py | 39 | except Exception as e: # noqa: BLE001 | CODE |
| LOW⚡ | backend/app_factory.py | 94 | except Exception: | CODE |
| LOW⚡ | backend/app_factory.py | 100 | except Exception: | CODE |
| LOW⚡ | backend/app_factory.py | 106 | except Exception: | CODE |
| LOW | backend/app_factory.py | 203 | except Exception as e: | CODE |
| MEDIUM | backend/app_factory.py | 196 | def root_health(): | CODE |
| LOW | backend/cli.py | 159 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/cli.py | 314 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/cli.py | 374 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/cli.py | 506 | except Exception as e: # noqa: BLE001 | CODE |
| MEDIUM | backend/cli.py | 156 | def _cmd_run_body(args, outcome, configure_llm, prepare_project, run_pipeline, s | CODE |
| LOW | backend/desktop_main.py | 130 | except Exception as e: | CODE |
| LOW | backend/desktop_main.py | 164 | except Exception as e: | CODE |
| LOW | backend/desktop_main.py | 189 | except Exception as e: | CODE |
| LOW | backend/desktop_main.py | 208 | except Exception as e: | CODE |
| LOW | backend/desktop_main.py | 227 | except Exception as error: # noqa: BLE001 - keep going: exiting matters more | CODE |
| LOW | backend/desktop_main.py | 236 | except Exception as error: # noqa: BLE001 | CODE |
| LOW | backend/desktop_main.py | 279 | except Exception as e: | CODE |
| LOW | backend/desktop_main.py | 339 | except Exception as e: | CODE |
| LOW | backend/mcp_server.py | 165 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/mcp_server.py | 221 | except Exception: # noqa: BLE001 | CODE |
| LOW | backend/mcp_server.py | 310 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/mcp_server.py | 347 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/mcp_server.py | 360 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/mcp_server.py | 379 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/mcp_server.py | 396 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/mcp_server.py | 491 | except Exception: | CODE |
| LOW | backend/init_db.py | 86 | except Exception as e: | CODE |
| LOW | backend/pipeline/step4_title.py | 103 | except Exception as e: | CODE |
| LOW | backend/pipeline/step5_clustering.py | 88 | except Exception as e: | CODE |
| LOW | backend/pipeline/step5_clustering.py | 242 | except Exception as e: | CODE |
| LOW | backend/pipeline/step2_timeline.py | 148 | except Exception as call_error: | CODE |
| LOW | backend/pipeline/step2_timeline.py | 178 | except Exception as parse_error: | CODE |
| LOW | backend/pipeline/step2_timeline.py | 185 | except Exception as e: | CODE |
| LOW | backend/pipeline/step2_timeline.py | 213 | except Exception as e: | CODE |
| LOW | backend/pipeline/step2_timeline.py | 233 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/pipeline/step2_timeline.py | 321 | except Exception as e: | CODE |
| LOW | backend/pipeline/step2_timeline.py | 328 | except Exception as e: | CODE |
| LOW | backend/pipeline/step2_timeline.py | 391 | except Exception as e: | CODE |
| LOW | backend/pipeline/clip_finder.py | 78 | except Exception as error: # noqa: BLE001 - unknown provider: keep the established cloud windows | CODE |
| LOW | backend/pipeline/clip_finder.py | 197 | except Exception as error: # noqa: BLE001 - one retry with the reason, then this window is lost | CODE |
| LOW | backend/pipeline/step1_outline.py | 64 | except Exception as e: | CODE |
| LOW | backend/pipeline/step1_outline.py | 106 | except Exception as e: | CODE |
| LOW | backend/pipeline/concurrency.py | 32 | except Exception: # noqa: BLE001 - unknown provider: stay conservative but parallel | CODE |
| LOW | backend/pipeline/media_precheck.py | 66 | except Exception as error: # noqa: BLE001 - a precheck must never break the run it guards | CODE |
| LOW | backend/pipeline/step3_scoring.py | 36 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/pipeline/step3_scoring.py | 87 | except Exception as e: | CODE |
| LOW | backend/pipeline/step3_scoring.py | 142 | except Exception as e: | CODE |
| LOW | backend/pipeline/quality.py | 143 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/pipeline/quality.py | 184 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | backend/pipeline/quality.py | 474 | except Exception: # noqa: BLE001 | CODE |
| LOW | backend/tasks/upload.py | 128 | except Exception as e: | CODE |
| LOW | backend/tasks/upload.py | 197 | except Exception as e: | CODE |
| LOW | backend/tasks/maintenance.py | 67 | except Exception as e: | CODE |
| LOW | backend/tasks/maintenance.py | 81 | except Exception as e: | CODE |
| LOW | backend/tasks/maintenance.py | 109 | except Exception as e: | CODE |
| LOW | backend/tasks/maintenance.py | 119 | except Exception as e: | CODE |
| LOW | backend/tasks/maintenance.py | 132 | except Exception as e: | CODE |
| 831 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clean_database.py | 6 | CODE | |
| LOW | clean_database.py | 18 | CODE | |
| LOW | init_database.py | 8 | CODE | |
| LOW | backend/app_factory.py | 86 | CODE | |
| LOW | backend/app_factory.py | 86 | CODE | |
| LOW | backend/cli.py | 19 | CODE | |
| LOW | backend/mcp_server.py | 30 | CODE | |
| LOW | backend/init_db.py | 17 | CODE | |
| LOW | backend/init_db.py | 22 | CODE | |
| LOW | backend/pipeline/step4_title.py | 6 | CODE | |
| LOW | backend/pipeline/step4_title.py | 7 | CODE | |
| LOW | backend/pipeline/step5_clustering.py | 6 | CODE | |
| LOW | backend/pipeline/step5_clustering.py | 7 | CODE | |
| LOW | backend/pipeline/clip_finder.py | 18 | CODE | |
| LOW | backend/pipeline/step1_outline.py | 7 | CODE | |
| LOW | backend/pipeline/concurrency.py | 8 | CODE | |
| LOW | backend/pipeline/media_precheck.py | 13 | CODE | |
| LOW | backend/pipeline/failures.py | 8 | CODE | |
| LOW | backend/pipeline/step6_video.py | 6 | CODE | |
| LOW | backend/pipeline/step6_video.py | 7 | CODE | |
| LOW | backend/pipeline/step6_video.py | 12 | CODE | |
| LOW | backend/pipeline/step6_video.py | 12 | CODE | |
| LOW | backend/pipeline/step3_scoring.py | 6 | CODE | |
| LOW | backend/pipeline/step3_scoring.py | 7 | CODE | |
| LOW | backend/pipeline/scoring_backend.py | 2 | CODE | |
| LOW | backend/pipeline/quality.py | 14 | CODE | |
| LOW | backend/tasks/upload.py | 6 | CODE | |
| LOW | backend/tasks/upload.py | 7 | CODE | |
| LOW | backend/tasks/maintenance.py | 5 | CODE | |
| LOW | backend/tasks/maintenance.py | 10 | CODE | |
| LOW | backend/tasks/maintenance.py | 10 | CODE | |
| LOW | backend/tasks/maintenance.py | 11 | CODE | |
| LOW | backend/tasks/maintenance.py | 13 | CODE | |
| LOW | backend/tasks/maintenance.py | 16 | CODE | |
| LOW | backend/tasks/maintenance.py | 16 | CODE | |
| LOW | backend/tasks/notification.py | 5 | CODE | |
| LOW | backend/tasks/notification.py | 7 | CODE | |
| LOW | backend/tasks/notification.py | 10 | CODE | |
| LOW | backend/tasks/notification.py | 13 | CODE | |
| LOW | backend/tasks/notification.py | 13 | CODE | |
| LOW | backend/tasks/notification.py | 14 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 6 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 11 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 12 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 14 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 16 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 21 | CODE | |
| LOW | backend/tasks/scheduler.py | 7 | CODE | |
| LOW | backend/tasks/processing.py | 5 | CODE | |
| LOW | backend/tasks/processing.py | 9 | CODE | |
| LOW | backend/tasks/processing.py | 10 | CODE | |
| LOW | backend/tasks/processing.py | 15 | CODE | |
| LOW | backend/tasks/processing.py | 32 | CODE | |
| LOW | backend/tasks/import_processing.py | 9 | CODE | |
| LOW | backend/tasks/video.py | 5 | CODE | |
| LOW | backend/tasks/video.py | 7 | CODE | |
| LOW | backend/tasks/video.py | 8 | CODE | |
| LOW | backend/tasks/video.py | 10 | CODE | |
| LOW | backend/core/config.py | 6 | CODE | |
| LOW | backend/core/sentry_setup.py | 7 | CODE | |
| 408 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/mcp_server.py | 221 | except Exception: # noqa: BLE001 | CODE |
| HIGH | backend/pipeline/concurrency.py | 32 | except Exception: # noqa: BLE001 - unknown provider: stay conservative but parallel | CODE |
| HIGH | backend/pipeline/concurrency.py | 24 | except ValueError: | CODE |
| HIGH | backend/core/database.py | 28 | except ImportError: | CODE |
| HIGH | backend/core/database.py | 109 | except Exception: | CODE |
| HIGH | backend/core/windows_asyncio.py | 24 | except ConnectionResetError: | CODE |
| HIGH | backend/core/parent_watch.py | 107 | except psutil.Error: | CODE |
| HIGH | backend/core/parent_watch.py | 113 | except psutil.Error: | CODE |
| HIGH | backend/core/error_middleware.py | 85 | except Exception: | CODE |
| HIGH | backend/core/llm_usage.py | 83 | except OSError: | CODE |
| HIGH | backend/core/llm_usage.py | 134 | except OSError: | CODE |
| HIGH | backend/core/model_registry.py | 189 | except Exception: | CODE |
| HIGH | backend/core/model_registry.py | 58 | except OSError: | CODE |
| HIGH | backend/core/model_registry.py | 66 | except OSError: | CODE |
| HIGH | backend/core/project_cancellation.py | 318 | except FileNotFoundError: | CODE |
| HIGH | backend/core/project_cancellation.py | 250 | except OSError: | CODE |
| HIGH | backend/core/project_cancellation.py | 451 | except OSError: | CODE |
| HIGH | backend/core/project_cancellation.py | 442 | except OSError: | CODE |
| HIGH | backend/core/websocket_manager.py | 51 | except asyncio.CancelledError: | CODE |
| HIGH | backend/tests/test_mcp_jobs.py | 126 | except cancel.JobStopped: | CODE |
| HIGH | backend/tests/test_parent_watch.py | 226 | except ProcessLookupError: | CODE |
| HIGH | backend/utils/thumbnail_generator.py | 253 | except: | CODE |
| HIGH | backend/utils/performance_monitor.py | 131 | except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): | CODE |
| HIGH | backend/utils/performance_monitor.py | 270 | except asyncio.CancelledError: | CODE |
| HIGH | backend/utils/ffmpeg_utils.py | 48 | except OSError: | CODE |
| HIGH | backend/api/v1/youtube.py | 102 | except Exception: | CODE |
| HIGH | backend/api/v1/projects.py | 507 | except: | CODE |
| HIGH | backend/services/whisper_model_manager.py | 39 | except Exception: # noqa: BLE001 | CODE |
| HIGH | backend/services/whisper_model_manager.py | 76 | except Exception: # noqa: BLE001 | CODE |
| HIGH | backend/services/cover.py | 283 | except OSError: | CODE |
| HIGH | backend/services/packaging_runtime.py | 130 | except Exception: | CODE |
| HIGH | backend/services/packaging_runtime.py | 513 | except Exception: | CODE |
| HIGH | backend/services/packaging_runtime.py | 509 | except Exception: | CODE |
| HIGH | backend/services/simple_pipeline_adapter.py | 100 | except FileNotFoundError: | CODE |
| HIGH | backend/services/simple_pipeline_adapter.py | 121 | except Exception: # noqa: BLE001 | CODE |
| HIGH | backend/services/simple_pipeline_adapter.py | 134 | except Exception: # noqa: BLE001 | CODE |
| HIGH | backend/services/pipeline_adapter.py | 132 | except Exception: | CODE |
| HIGH | backend/services/pipeline_adapter.py | 147 | except Exception: | CODE |
| HIGH | backend/services/pip_install.py | 129 | except Exception: | CODE |
| HIGH | backend/services/pip_install.py | 150 | except Exception: | CODE |
| HIGH | backend/services/sensevoice_runtime.py | 63 | except RuntimeError: | CODE |
| HIGH | backend/services/websocket_gateway_service.py | 83 | except asyncio.CancelledError: | CODE |
| HIGH | backend/services/bilibili_publisher.py | 143 | except OSError: | CODE |
| HIGH | backend/services/upload_post_publisher.py | 132 | except OSError: | CODE |
| HIGH | backend/services/upload_post_publisher.py | 551 | except (OSError, ValueError): | CODE |
| HIGH | backend/services/mcp_jobs.py | 161 | except OSError: | CODE |
| HIGH | backend/services/quick_output_runner.py | 95 | except psutil.AccessDenied: | CODE |
| HIGH | backend/services/whisper_runtime.py | 103 | except Exception: | CODE |
| HIGH | backend/services/simple_progress.py | 232 | except ValueError: | CODE |
| HIGH | backend/services/simple_progress.py | 63 | except Exception: | CODE |
| HIGH | backend/services/bilibili_service.py | 477 | except: | CODE |
| HIGH | backend/services/bilibili_service.py | 695 | except: | CODE |
| HIGH | backend/services/studio/intelligence.py | 236 | except OSError: | CODE |
| HIGH | backend/services/studio/jobs.py | 301 | except FileNotFoundError: | CODE |
| HIGH | backend/services/studio/jobs.py | 203 | except FileNotFoundError: | CODE |
| HIGH | backend/services/studio/jobs.py | 278 | except FileNotFoundError: | CODE |
| HIGH | backend/services/studio/jobs.py | 1570 | except FileNotFoundError: | CODE |
| HIGH | backend/services/studio/jobs.py | 1727 | except FileNotFoundError: | CODE |
| HIGH | backend/services/studio/jobs.py | 187 | except (FileNotFoundError, project_cancellation.ProjectDeleted): | CODE |
| HIGH | backend/services/studio/cover_design.py | 34 | except (OSError, ValueError, AttributeError): | CODE |
| 8 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/cli.py | 384 | CODE | |
| LOW | backend/cli.py | 398 | CODE | |
| LOW | backend/cli.py | 543 | CODE | |
| LOW | backend/desktop_main.py | 169 | CODE | |
| LOW | backend/pipeline/step4_title.py | 36 | CODE | |
| LOW | backend/pipeline/step4_title.py | 53 | CODE | |
| LOW | backend/pipeline/step5_clustering.py | 193 | CODE | |
| LOW | backend/pipeline/step2_timeline.py | 43 | CODE | |
| LOW | backend/pipeline/step2_timeline.py | 244 | CODE | |
| LOW | backend/pipeline/step2_timeline.py | 346 | CODE | |
| LOW | backend/pipeline/step2_timeline.py | 97 | CODE | |
| LOW | backend/pipeline/step1_outline.py | 179 | CODE | |
| LOW | backend/pipeline/quality.py | 283 | CODE | |
| LOW | backend/tasks/upload.py | 18 | CODE | |
| LOW | backend/tasks/maintenance.py | 24 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 165 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 212 | CODE | |
| LOW | backend/tasks/data_cleanup.py | 251 | CODE | |
| LOW | backend/tasks/processing.py | 66 | CODE | |
| LOW | backend/tasks/processing.py | 249 | CODE | |
| LOW | backend/tasks/import_processing.py | 208 | CODE | |
| LOW | backend/tasks/import_processing.py | 323 | CODE | |
| LOW | backend/core/shared_config.py | 217 | CODE | |
| LOW | backend/core/shared_config.py | 235 | CODE | |
| LOW | backend/core/database.py | 42 | CODE | |
| LOW | backend/core/llm_providers.py | 126 | CODE | |
| LOW | backend/core/llm_manager.py | 91 | CODE | |
| LOW | backend/core/llm_manager.py | 326 | CODE | |
| LOW | backend/core/unified_paths.py | 151 | CODE | |
| LOW | backend/core/error_middleware.py | 67 | CODE | |
| LOW | backend/core/unified_storage.py | 183 | CODE | |
| LOW | backend/core/llm_usage.py | 117 | CODE | |
| LOW | backend/core/model_registry.py | 47 | CODE | |
| LOW | backend/core/model_registry.py | 166 | CODE | |
| LOW | backend/core/project_cancellation.py | 212 | CODE | |
| LOW | backend/core/project_cancellation.py | 418 | CODE | |
| LOW | backend/core/project_cancellation.py | 475 | CODE | |
| LOW | backend/core/image_providers.py | 251 | CODE | |
| LOW | backend/core/image_providers.py | 592 | CODE | |
| LOW | backend/core/path_utils.py | 170 | CODE | |
| LOW | backend/core/unified_config.py | 172 | CODE | |
| LOW | backend/core/unified_config.py | 265 | CODE | |
| LOW | backend/core/error_middleware_v2.py | 54 | CODE | |
| LOW | backend/core/websocket_manager.py | 71 | CODE | |
| LOW | backend/tests/test_project_cancellation.py | 207 | CODE | |
| LOW | backend/tests/test_studio_read_failure.py | 832 | CODE | |
| LOW | backend/tests/test_parent_watch.py | 203 | CODE | |
| LOW | backend/tests/render_ffmpeg_golden.py | 241 | CODE | |
| LOW | backend/utils/thumbnail_generator.py | 119 | CODE | |
| LOW | backend/utils/speech_recognizer.py | 804 | CODE | |
| LOW | backend/utils/speech_recognizer.py | 345 | CODE | |
| LOW | backend/utils/speech_recognizer.py | 663 | CODE | |
| LOW | backend/utils/video_processor.py | 418 | CODE | |
| LOW | backend/utils/api_key_manager.py | 201 | CODE | |
| LOW | backend/utils/api_key_manager.py | 254 | CODE | |
| LOW | backend/utils/text_processor.py | 30 | CODE | |
| LOW | backend/utils/video_editor.py | 198 | CODE | |
| LOW | backend/utils/video_editor.py | 296 | CODE | |
| LOW | backend/utils/subtitle_processor.py | 20 | CODE | |
| LOW | backend/utils/concurrency_manager.py | 173 | CODE | |
| 158 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/app_factory.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/main.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/mcp_server.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/step4_title.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/step5_clustering.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/step2_timeline.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/clip_finder.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/step1_outline.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/media_precheck.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/step6_video.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/step3_scoring.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/pipeline/quality.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/tasks/upload.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/tasks/maintenance.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/tasks/notification.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/tasks/data_cleanup.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/tasks/__init__.py | 8 | __all__ = [ | CODE |
| LOW | backend/tasks/scheduler.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/tasks/processing.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/tasks/import_processing.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/tasks/video.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/sentry_setup.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/llm_providers.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/parent_watch.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/llm_manager.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/model_catalog.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/error_middleware.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/project_enum_migration.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/unified_storage.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/llm_usage.py | 50 | def set_stage(name: str) -> None: | CODE |
| LOW | backend/core/project_cancellation.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/image_providers.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/unified_config.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/error_middleware_v2.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/core/websocket_manager.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/thumbnail_generator.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/speech_recognizer.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/video_processor.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/api_key_manager.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/text_processor.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/video_editor.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/performance_monitor.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/chunked_upload.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/subtitle_processor.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/crypto.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/task_submission_utils.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/concurrency_manager.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/llm_client.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/transcription_progress.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/ffmpeg_utils.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/error_handler.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/project_manager.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/bilibili_downloader.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/repositories/__init__.py | 7 | __all__ = [ | CODE |
| LOW | backend/repositories/task_repository.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/shared/progress_publisher.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/models/__init__.py | 12 | __all__ = [ | CODE |
| LOW | backend/models/lenient_enum.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/schemas/__init__.py | 12 | __all__ = [ | CODE |
| LOW | backend/scripts/fix_project_thumbnails.py | 23 | logger = logging.getLogger(__name__) | CODE |
| 86 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/runtime/start.sh | 28 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 30 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 52 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 54 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 77 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 79 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 136 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 138 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 204 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 206 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 389 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/runtime/start.sh | 391 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/runtime/start.sh | 443 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/runtime/start.sh | 445 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/runtime/start.sh | 455 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/runtime/start.sh | 457 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/runtime/start.sh | 486 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/runtime/start.sh | 488 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/runtime/start.sh | 494 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | scripts/runtime/start.sh | 496 | # ============================================================================= | COMMENT |
| MEDIUM | scripts/lib/desktop_build_common.sh | 22 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/lib/desktop_build_common.sh | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/lib/desktop_build_common.sh | 82 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/lib/desktop_build_common.sh | 84 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | DOCKER.md | 20 | API_DASHSCOPE_API_KEY=your_api_key | CODE |
| HIGH | docs/SPEECH_RECOGNITION_SETUP.md | 57 | export OPENAI_API_KEY="your-api-key-here" | CODE |
| HIGH | docs/SPEECH_RECOGNITION_REDESIGN.md | 250 | export OPENAI_API_KEY="your-api-key" | CODE |
| HIGH | docs/SPEECH_RECOGNITION_REDESIGN.md | 255 | export AZURE_SPEECH_KEY="your-api-key" | CODE |
| HIGH | docs/DOCKER.en.md | 20 | API_DASHSCOPE_API_KEY=your_api_key | CODE |
| HIGH | docs/OPTIONAL_SRT_UPLOAD_GUIDE.md | 195 | export OPENAI_API_KEY="your-api-key" | CODE |
| HIGH | docs/OPTIONAL_SRT_UPLOAD_GUIDE.md | 200 | export AZURE_SPEECH_KEY="your-api-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | backend/services/simple_pipeline_adapter.py | 315 | # Step 1: 大纲提取(字幕为空 / 模型全部失败 / 无法解析时由 step1 自己抛 PipelineFailure) | COMMENT |
| LOW⚡ | backend/services/simple_pipeline_adapter.py | 324 | # Step 2: 时间线提取 | COMMENT |
| LOW | backend/services/simple_pipeline_adapter.py | 338 | # Step 3: 内容评分 | COMMENT |
| LOW | backend/services/simple_pipeline_adapter.py | 358 | # Step 4: 标题生成 | COMMENT |
| LOW | backend/services/simple_pipeline_adapter.py | 372 | # Step 5: 主题聚类 | COMMENT |
| LOW | backend/services/simple_pipeline_adapter.py | 385 | # Step 6: 视频切割 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | backend/services/simple_pipeline_adapter.py | 315 | # Step 1: 大纲提取(字幕为空 / 模型全部失败 / 无法解析时由 step1 自己抛 PipelineFailure) | COMMENT |
| LOW⚡ | backend/services/simple_pipeline_adapter.py | 324 | # Step 2: 时间线提取 | COMMENT |
| LOW | backend/services/simple_pipeline_adapter.py | 338 | # Step 3: 内容评分 | COMMENT |
| LOW | backend/services/simple_pipeline_adapter.py | 358 | # Step 4: 标题生成 | COMMENT |
| LOW | backend/services/simple_pipeline_adapter.py | 372 | # Step 5: 主题聚类 | COMMENT |
| LOW | backend/services/simple_pipeline_adapter.py | 385 | # Step 6: 视频切割 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/utils/speech_recognizer.py | 347 | 生成字幕文件 Args: video_path: 视频文件路径 output_path: 输出字幕文件路径 conf | STRING |
| HIGH | backend/utils/speech_recognizer.py | 831 | 为视频生成字幕文件的便捷函数 Args: video_path: 视频文件路径 output_path: 输出字幕文件路径 method: 生成方法 ("auto" | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/tests/test_project_cancellation.py | 46 | (folder / 'metadata' / 'studio.json').write_text('{"schema_version":2,"drafts":[],"jobs":[],"analysis":null,"output_ | CODE |
| HIGH | scripts/packaging_frame_benchmark.py | 460 | if (hash !== expected[i]) bad.push([i, hash, expected[i]]); | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/mcp_server.py | 325 | CODE | |
| LOW | backend/utils/speech_recognizer.py | 823 | CODE | |
| LOW | backend/utils/llm_client.py | 116 | CODE | |
| LOW | backend/api/v1/studio.py | 95 | CODE | |
| LOW | backend/services/cover.py | 239 | CODE | |
| LOW | backend/services/cover.py | 576 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | requirements.txt | 1 | # Backend runtime dependencies. | COMMENT |
| LOW | scripts/build_windows_x64.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/lib/desktop_build_common.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .github/workflows/desktop-build.yml | 1 | name: Desktop Build | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | backend/api/v1/upload.py | 359 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/core/llm_providers.py | 668 | temp_provider = provider_class("dummy_key", "dummy_model") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/api/v1/async_task_manager.py | 134 | async def my_function(): | STRING |