🎬 卡卡字幕助手 | VideoCaptioner - 基于 LLM 的智能字幕助手 - 视频字幕生成、断句、校正、字幕翻译全流程处理!- A powered tool for easy and efficient video subtitling.
665 matches across 16 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | videocaptioner/ui/task_factory.py | 245 | def create_transcript_and_subtitle_task( |
| LOW | videocaptioner/ui/components/WhisperCppSettingWidget.py | 408 | def _on_model_download_progress(value, msg): |
| LOW | videocaptioner/ui/components/WhisperCppSettingWidget.py | 412 | def _on_model_download_finished(): |
| LOW | videocaptioner/ui/components/WhisperCppSettingWidget.py | 489 | def _set_all_download_buttons_enabled(self, enabled: bool): |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 126 | def check_faster_whisper_exists() -> tuple[bool, list[str]]: |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 451 | def _on_program_download_progress(self, value, status_msg): |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 456 | def _on_program_download_finished(self, save_path): |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 479 | def _on_program_download_error(self, error): |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 533 | def _on_model_download_progress(value, msg): |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 537 | def _on_model_download_finished(): |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 607 | def _set_all_download_buttons_enabled(self, enabled: bool): |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 634 | def _finish_program_installation(self): |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 878 | def check_faster_whisper_model(self): |
| LOW | videocaptioner/ui/components/WhisperAPISettingWidget.py | 161 | def on_connection_check_finished(self, success, result): |
| LOW | videocaptioner/ui/components/WhisperAPISettingWidget.py | 184 | def on_connection_check_error(self, message): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 285 | def on_soft_subtitle_action_triggered(self, checked: bool): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 316 | def on_need_video_action_triggered(self, checked: bool): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 344 | def on_video_quality_action_changed(self, quality_text: str): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 363 | def on_use_style_action_triggered(self, checked: bool): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 406 | def on_render_mode_changed_external(self, mode_text: str): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 410 | def _update_synthesis_controls_state(self): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 422 | def _update_style_controls_state(self): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 499 | def on_video_synthesis_finished(self, task): |
| LOW | videocaptioner/ui/view/video_synthesis_interface.py | 511 | def on_video_synthesis_progress(self, progress, message): |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 421 | def _update_prompt_button_style(self) -> None: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 449 | def start_subtitle_optimization(self, need_create_task: bool = True) -> None: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 502 | def on_subtitle_optimization_finished( |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 518 | def on_subtitle_optimization_error(self, error: str) -> None: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 529 | def on_subtitle_optimization_progress(self, value: int, status: str) -> None: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 861 | def retranslate_selected_rows(self, rows: List[int]) -> None: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 956 | def on_target_language_changed(self, language: str) -> None: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 964 | def on_subtitle_optimization_changed(self, checked: bool) -> None: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 969 | def on_subtitle_translation_changed(self, checked: bool) -> None: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 976 | def on_subtitle_layout_changed(self, layout: str) -> None: |
| LOW | videocaptioner/ui/view/subtitle_style_interface.py | 687 | def on_open_style_folder_clicked(self): |
| LOW | videocaptioner/ui/view/subtitle_style_interface.py | 691 | def on_subtitle_layout_changed(self, layout: str): |
| LOW | videocaptioner/ui/view/subtitle_style_interface.py | 696 | def on_render_mode_changed_external(self, mode_text: str): |
| LOW | videocaptioner/ui/view/transcription_interface.py | 216 | def update_audio_track_button_text( |
| LOW | videocaptioner/ui/view/transcription_interface.py | 458 | def on_transcription_model_changed(self, model_name: str): |
| LOW | videocaptioner/ui/view/task_creation_interface.py | 327 | def on_video_download_finished(self, video_file_path): |
| LOW | videocaptioner/ui/view/home_interface.py | 85 | def switch_to_subtitle_optimization(self, file_path, video_path): |
| LOW | videocaptioner/ui/view/home_interface.py | 95 | def switch_to_video_synthesis(self, video_path, subtitle_path): |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 177 | def _on_trans_sub_progress_wrapper( |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 184 | def _on_trans_sub_finished_wrapper( |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 212 | def _on_trans_sub_subtitle_progress_wrapper( |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 219 | def _handle_full_process_task(self, batch_task: BatchTask): |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 273 | def on_full_process_subtitle_progress( |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 281 | def on_full_process_subtitle_finished( |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 304 | def on_full_process_synthesis_progress( |
| LOW | videocaptioner/ui/thread/transcript_thread.py | 58 | def _check_downloaded_subtitle(self) -> bool: |
| LOW | videocaptioner/ui/thread/subtitle_thread.py | 38 | def create_translator_from_config( |
| LOW | videocaptioner/ui/thread/modelscope_download_thread.py | 33 | def create_progress_callback_class( |
| LOW | videocaptioner/ui/thread/version_checker_thread.py | 132 | def check_new_version_announcement(self) -> None: |
| LOW | videocaptioner/core/entities.py | 476 | def _get_all_languages_except_auto() -> list[TranscribeLanguageEnum]: |
| LOW | videocaptioner/core/entities.py | 511 | def get_asr_language_capability(model: TranscribeModelEnum) -> ASRLanguageCapability: |
| LOW | videocaptioner/core/split/split.py | 591 | def _merge_processed_segments( |
| LOW | videocaptioner/core/split/split.py | 661 | def _merge_segments_based_on_sentences( |
| LOW | videocaptioner/core/llm/request_logger.py | 83 | def create_logging_http_client() -> httpx.Client: |
| LOW | videocaptioner/core/optimize/optimize.py | 273 | def _validate_optimization_result( |
| LOW | videocaptioner/core/translate/base.py | 150 | def _set_segments_translated_text( |
| 227 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | videocaptioner/cli/main.py | 526 | # ── Command runners ────────────────────────────────────────────────────────── |
| MEDIUM | tests/test_tts/test_tts_integration.py | 195 | # ============================================================================ |
| MEDIUM | tests/test_tts/test_tts_integration.py | 197 | # ============================================================================ |
| MEDIUM | tests/test_tts/test_tts_core.py | 504 | # ============================================================================ |
| MEDIUM | tests/test_tts/test_tts_core.py | 506 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 61 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 63 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 193 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 195 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 353 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 355 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 468 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 470 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 691 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 693 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 746 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 748 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 536 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 538 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 615 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunk_merger.py | 617 | # ============================================================================ |
| MEDIUM | tests/test_asr/conftest.py | 11 | # ============================================================================ |
| MEDIUM | tests/test_asr/conftest.py | 13 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 163 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 165 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 277 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 279 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 282 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 293 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 295 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 303 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 305 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 313 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 315 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 323 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 325 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 333 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 335 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 22 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 24 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 117 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 119 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 413 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunking.py | 421 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 340 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 342 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 406 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 408 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 463 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 465 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 28 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 30 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 119 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 121 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 210 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 212 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 284 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 286 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 366 | # ============================================================================ |
| MEDIUM | tests/test_asr/test_chunked_asr.py | 368 | # ============================================================================ |
| 12 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | videocaptioner/config.py | 11 | except Exception: |
| LOW | videocaptioner/ui/components/WhisperCppSettingWidget.py | 459 | except Exception as e: |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 176 | except Exception as e: |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 475 | except Exception as e: |
| MEDIUM | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 164 | def run(self): |
| LOW | videocaptioner/ui/components/WhisperAPISettingWidget.py | 217 | except Exception as e: |
| LOW | videocaptioner/ui/components/MyVideoWidget.py | 255 | except Exception: |
| LOW | videocaptioner/ui/components/MyVideoWidget.py | 370 | except Exception: |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 602 | except Exception as e: |
| LOW | videocaptioner/ui/view/log_window.py | 60 | except Exception as e: |
| LOW | videocaptioner/ui/view/log_window.py | 110 | except Exception as e: |
| LOW | videocaptioner/ui/view/log_window.py | 152 | except Exception as e: |
| LOW | videocaptioner/ui/view/setting_interface.py | 1014 | except Exception as e: |
| LOW | videocaptioner/ui/view/setting_interface.py | 1036 | except Exception as e: |
| LOW | videocaptioner/ui/view/llm_logs_interface.py | 325 | except Exception as e: |
| LOW | videocaptioner/ui/view/llm_logs_interface.py | 466 | except Exception as e: |
| LOW | videocaptioner/ui/thread/subtitle_pipeline_thread.py | 128 | except Exception as e: |
| MEDIUM | videocaptioner/ui/thread/subtitle_pipeline_thread.py | 36 | def run(self): |
| LOW | videocaptioner/ui/thread/video_download_thread.py | 35 | except Exception as e: |
| LOW | videocaptioner/ui/thread/video_download_thread.py | 163 | except Exception: |
| MEDIUM | videocaptioner/ui/thread/video_download_thread.py | 29 | def run(self): |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 89 | except Exception as e: |
| LOW | videocaptioner/ui/thread/transcript_thread.py | 37 | except Exception as e: |
| MEDIUM | videocaptioner/ui/thread/transcript_thread.py | 24 | def run(self): |
| LOW | videocaptioner/ui/thread/subtitle_thread.py | 235 | except Exception as e: |
| LOW | videocaptioner/ui/thread/subtitle_thread.py | 276 | except Exception as e: |
| LOW | videocaptioner/ui/thread/subtitle_thread.py | 288 | except Exception as e: |
| LOW | videocaptioner/ui/thread/subtitle_thread.py | 351 | except Exception as e: |
| LOW | videocaptioner/ui/thread/video_synthesis_thread.py | 103 | except Exception as e: |
| MEDIUM | videocaptioner/ui/thread/video_synthesis_thread.py | 25 | def run(self): |
| LOW | videocaptioner/ui/thread/modelscope_download_thread.py | 79 | except Exception as e: |
| MEDIUM | videocaptioner/ui/thread/modelscope_download_thread.py | 64 | def run(self): |
| LOW | videocaptioner/ui/thread/version_checker_thread.py | 90 | except Exception as e: |
| LOW | videocaptioner/ui/thread/version_checker_thread.py | 158 | except Exception: |
| LOW | videocaptioner/ui/thread/video_info_thread.py | 36 | except Exception as e: |
| MEDIUM | videocaptioner/ui/thread/video_info_thread.py | 21 | def run(self): |
| LOW | videocaptioner/ui/thread/file_download_thread.py | 121 | except Exception: |
| LOW | videocaptioner/ui/thread/file_download_thread.py | 219 | except Exception as e: |
| MEDIUM | videocaptioner/ui/thread/file_download_thread.py | 197 | def run(self): |
| LOW | videocaptioner/core/split/split_by_llm.py | 36 | except Exception as e: |
| LOW | videocaptioner/core/split/split.py | 165 | except Exception as e: |
| LOW | videocaptioner/core/split/split.py | 264 | except Exception as e: |
| LOW | videocaptioner/core/split/split.py | 275 | except Exception as e: |
| LOW | videocaptioner/core/split/split.py | 781 | except Exception as e: |
| LOW | videocaptioner/core/llm/check_whisper.py | 74 | except Exception as e: |
| LOW | videocaptioner/core/llm/request_logger.py | 44 | except Exception: |
| LOW | videocaptioner/core/llm/check_llm.py | 50 | except Exception as e: |
| LOW | videocaptioner/core/llm/check_llm.py | 108 | except Exception: |
| LOW | videocaptioner/core/optimize/optimize.py | 101 | except Exception as e: |
| LOW | videocaptioner/core/optimize/optimize.py | 148 | except Exception as e: |
| LOW | videocaptioner/core/optimize/optimize.py | 183 | except Exception as e: |
| LOW | videocaptioner/core/optimize/optimize.py | 378 | except Exception as e: |
| LOW | videocaptioner/core/optimize/optimize.py | 415 | except Exception: |
| LOW | videocaptioner/core/translate/google_translator.py | 67 | except Exception as e: |
| LOW | videocaptioner/core/translate/bing_translator.py | 48 | except Exception as e: |
| LOW | videocaptioner/core/translate/bing_translator.py | 87 | except Exception as e: |
| LOW | videocaptioner/core/translate/bing_translator.py | 96 | except Exception as e: |
| LOW | videocaptioner/core/translate/factory.py | 72 | except Exception as e: |
| LOW | videocaptioner/core/translate/deeplx_translator.py | 53 | except Exception as e: |
| LOW | videocaptioner/core/translate/llm_translator.py | 95 | except Exception as e: |
| 56 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | videocaptioner/core/entities.py | 8 | |
| LOW | videocaptioner/core/llm/__init__.py | 3 | |
| LOW | videocaptioner/core/llm/__init__.py | 3 | |
| LOW | videocaptioner/core/llm/__init__.py | 4 | |
| LOW | videocaptioner/core/llm/__init__.py | 5 | |
| LOW | videocaptioner/core/llm/__init__.py | 5 | |
| LOW | videocaptioner/core/translate/__init__.py | 7 | |
| LOW | videocaptioner/core/translate/__init__.py | 8 | |
| LOW | videocaptioner/core/translate/__init__.py | 9 | |
| LOW | videocaptioner/core/translate/__init__.py | 10 | |
| LOW | videocaptioner/core/translate/__init__.py | 11 | |
| LOW | videocaptioner/core/translate/__init__.py | 12 | |
| LOW | videocaptioner/core/translate/__init__.py | 13 | |
| LOW | videocaptioner/core/translate/__init__.py | 14 | |
| LOW | videocaptioner/core/translate/__init__.py | 14 | |
| LOW | videocaptioner/core/utils/video_utils.py | 22 | |
| LOW | videocaptioner/core/speech/__init__.py | 3 | |
| LOW | videocaptioner/core/speech/__init__.py | 3 | |
| LOW | videocaptioner/core/speech/__init__.py | 3 | |
| LOW | videocaptioner/core/speech/__init__.py | 4 | |
| LOW | videocaptioner/core/speech/__init__.py | 4 | |
| LOW | videocaptioner/core/speech/__init__.py | 4 | |
| LOW | videocaptioner/core/speech/__init__.py | 4 | |
| LOW | videocaptioner/core/speech/__init__.py | 4 | |
| LOW | videocaptioner/core/asr/__init__.py | 1 | |
| LOW | videocaptioner/core/asr/__init__.py | 2 | |
| LOW | videocaptioner/core/asr/__init__.py | 3 | |
| LOW | videocaptioner/core/asr/__init__.py | 4 | |
| LOW | videocaptioner/core/asr/__init__.py | 5 | |
| LOW | videocaptioner/core/asr/__init__.py | 6 | |
| LOW | videocaptioner/core/asr/__init__.py | 7 | |
| LOW | videocaptioner/core/asr/__init__.py | 8 | |
| LOW | videocaptioner/core/subtitle/rounded_renderer.py | 21 | |
| LOW | videocaptioner/core/subtitle/ass_renderer.py | 19 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 5 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 5 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 6 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 6 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 6 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 6 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 6 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 13 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 13 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 13 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 13 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 13 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 20 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 20 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 21 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 21 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 21 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 21 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 21 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 29 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 30 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 30 | |
| LOW | videocaptioner/core/subtitle/__init__.py | 30 | |
| LOW | videocaptioner/core/tts/__init__.py | 6 | |
| LOW | videocaptioner/core/tts/__init__.py | 7 | |
| LOW | videocaptioner/core/tts/__init__.py | 8 | |
| 15 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | videocaptioner/ui/task_factory.py | 110 | |
| LOW | videocaptioner/ui/components/WhisperCppSettingWidget.py | 383 | |
| LOW | videocaptioner/ui/components/WhisperCppSettingWidget.py | 412 | |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 503 | |
| LOW | …ocaptioner/ui/components/FasterWhisperSettingWidget.py | 537 | |
| LOW | videocaptioner/ui/components/MyVideoWidget.py | 185 | |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 78 | |
| LOW | videocaptioner/ui/view/subtitle_interface.py | 915 | |
| LOW | videocaptioner/ui/view/subtitle_style_interface.py | 909 | |
| LOW | videocaptioner/ui/view/llm_logs_interface.py | 308 | |
| LOW | videocaptioner/ui/view/batch_process_interface.py | 176 | |
| LOW | videocaptioner/ui/thread/video_download_thread.py | 115 | |
| LOW | videocaptioner/ui/thread/batch_process_thread.py | 73 | |
| LOW | videocaptioner/ui/thread/subtitle_thread.py | 100 | |
| LOW | videocaptioner/ui/thread/file_download_thread.py | 136 | |
| LOW | videocaptioner/core/split/alignment.py | 74 | |
| LOW | videocaptioner/core/split/split_by_llm.py | 110 | |
| LOW | videocaptioner/core/split/split.py | 57 | |
| LOW | videocaptioner/core/split/split.py | 343 | |
| LOW | videocaptioner/core/split/split.py | 661 | |
| LOW | videocaptioner/core/llm/client.py | 52 | |
| LOW | videocaptioner/core/llm/check_llm.py | 54 | |
| LOW | videocaptioner/core/translate/bing_translator.py | 52 | |
| LOW | videocaptioner/core/translate/factory.py | 20 | |
| LOW | videocaptioner/core/utils/video_utils.py | 173 | |
| LOW | videocaptioner/core/utils/platform_utils.py | 15 | |
| LOW | videocaptioner/core/utils/platform_utils.py | 56 | |
| LOW | videocaptioner/core/utils/subprocess_helper.py | 90 | |
| LOW | videocaptioner/core/utils/subprocess_helper.py | 142 | |
| LOW | videocaptioner/core/asr/whisper_cpp.py | 114 | |
| LOW | videocaptioner/core/asr/asr_data.py | 220 | |
| LOW | videocaptioner/core/asr/asr_data.py | 248 | |
| LOW | videocaptioner/core/asr/asr_data.py | 275 | |
| LOW | videocaptioner/core/asr/asr_data.py | 320 | |
| LOW | videocaptioner/core/asr/asr_data.py | 515 | |
| LOW | videocaptioner/core/asr/asr_data.py | 782 | |
| LOW | videocaptioner/core/asr/faster_whisper.py | 227 | |
| LOW | videocaptioner/core/asr/transcribe.py | 45 | |
| LOW | videocaptioner/core/subtitle/font_utils.py | 18 | |
| LOW | videocaptioner/core/subtitle/font_utils.py | 74 | |
| LOW | videocaptioner/core/subtitle/text_utils.py | 98 | |
| LOW | videocaptioner/core/subtitle/text_utils.py | 172 | |
| LOW | videocaptioner/core/subtitle/rounded_renderer.py | 268 | |
| LOW | videocaptioner/core/subtitle/ass_renderer.py | 244 | |
| LOW | videocaptioner/core/subtitle/ass_utils.py | 52 | |
| LOW | videocaptioner/core/tts/siliconflow.py | 30 | |
| LOW | videocaptioner/cli/commands/config_cmd.py | 24 | |
| LOW | videocaptioner/cli/commands/subtitle.py | 49 | |
| LOW | videocaptioner/cli/commands/style_cmd.py | 28 | |
| LOW | videocaptioner/cli/commands/synthesize.py | 39 | |
| LOW | videocaptioner/cli/commands/synthesize.py | 155 | |
| LOW | videocaptioner/cli/commands/transcribe.py | 13 | |
| LOW | tests/test_split/test_split_realistic.py | 13 | |
| LOW | scripts/translate_llm.py | 188 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | videocaptioner/core/split/split.py | 119 | 分割字幕(主入口) 处理流程: 1. Reading并预处理字幕 2. 按字数Segments 3. 并发调用LLM处理 4. 合并结果并优化 |
| HIGH | videocaptioner/core/split/split.py | 667 | 基于LLM返回的句子列表合并ASRSegments 使用滑动窗口匹配算法: 1. 对每个LLM句子,寻找最佳匹配的ASRSegments序列 2. 使用相似度算法进行匹配 3 |
| HIGH | videocaptioner/core/optimize/optimize.py | 188 | 使用agent loop优化字幕 LLM → 验证 → 反馈 → 重试 (最多MAX_STEPS次) Args: subtitle_chunk: 字幕批次字典 R |
| HIGH | videocaptioner/core/utils/cache.py | 72 | Decorator to cache function results with global switch support. This is a thin wrapper around diskcache.Cache.memoi |
| HIGH | videocaptioner/core/asr/asr_data.py | 516 | Load ASRData from subtitle file. Args: file_path: Subtitle file path (supports .srt, .vtt, .ass, .j |
| HIGH | videocaptioner/core/asr/chunk_merger.py | 43 | 合并多个音频片段的 ASR 结果 Args: chunks: ASRData 对象列表(每个 chunk 的 segments 应从 0 开始) chunk_offsets: |
| HIGH | videocaptioner/core/tts/siliconflow.py | 36 | 上传音频并获取声音克隆 URI Args: audio_path: 音频文件路径 text: 对应文本内容 model: 模型名称 |
| HIGH | videocaptioner/core/prompts/__init__.py | 25 | 从文件加载提示词(带LRU缓存) Args: prompt_path: 提示词相对路径,如 "split/semantic" Returns: 提示词原始文本 Raises: |
| HIGH | videocaptioner/core/prompts/__init__.py | 48 | 获取提示词并进行变量替换 Args: prompt_path: 提示词路径,如 "split/semantic", "optimize/subtitle" **kwargs: 模板变量,用于替换提示 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | tests/test_asr/test_bcut_asr.py | 0 | test transcription with different configurations and languages. args: need_word_ts: whether to use word-level timestamps |
| HIGH | tests/test_asr/test_jianying_asr.py | 0 | test transcription with different configurations and languages. args: need_word_ts: whether to use word-level timestamps |
| HIGH | tests/test_asr/test_whisper_api_asr.py | 0 | test transcription with different configurations and languages. args: need_word_ts: whether to use word-level timestamps |
| HIGH | tests/test_translate/test_deeplx_translator.py | 0 | test translating simple asr data with quality validation. |
| HIGH | tests/test_translate/test_bing_translator.py | 0 | test translating simple asr data with quality validation. |
| HIGH | tests/test_translate/test_google_translator.py | 0 | test translating simple asr data with quality validation. |
| HIGH | tests/test_translate/test_deeplx_translator.py | 0 | test translating a single chunk of data with quality validation. |
| HIGH | tests/test_translate/test_bing_translator.py | 0 | test translating a single chunk of data with quality validation. |
| HIGH | tests/test_translate/test_google_translator.py | 0 | test translating a single chunk of data with quality validation. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| CRITICAL | videocaptioner/core/tts/openai_tts.py | 47 | with self.client.audio.speech.with_streaming_response.create( |
| CRITICAL | tests/test_tts/test_tts_core.py | 416 | mock_client.audio.speech.with_streaming_response.create.assert_called_once_with( |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | videocaptioner/core/subtitle/text_utils.py | 103 | # Step 1: Calculate minimum required lines using greedy algorithm |
| LOW | videocaptioner/core/subtitle/text_utils.py | 124 | # Step 2: Calculate total width and target width per line |
| LOW | videocaptioner/core/subtitle/text_utils.py | 129 | # Step 3: Redistribute text to achieve balanced lines |
| LOW | videocaptioner/core/subtitle/text_utils.py | 181 | # Step 1: Calculate minimum required lines |
| LOW | videocaptioner/core/subtitle/text_utils.py | 202 | # Step 2: Calculate target width |
| LOW | videocaptioner/core/subtitle/text_utils.py | 207 | # Step 3: Redistribute words to achieve balanced lines |
| LOW | videocaptioner/cli/commands/process.py | 74 | # Step 1: Transcribe |
| LOW | videocaptioner/cli/commands/process.py | 98 | # Step 2: Subtitle (optimize + translate) |
| LOW | videocaptioner/cli/commands/process.py | 132 | # Step 3: Dub |
| LOW | videocaptioner/cli/commands/process.py | 196 | # Step 4: Synthesize |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | tests/README.md | 54 | OPENAI_API_KEY=sk-your-api-key |
| HIGH | tests/test_tts/test_tts_integration.py | 5 | OPENAI_TTS_API_KEY=your-api-key-here |
| HIGH | tests/test_tts/test_tts_integration.py | 10 | OPENAI_API_KEY=your-api-key-here |
| HIGH | docs/dev/translate-module.md | 109 | export OPENAI_API_KEY="your-api-key" |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | videocaptioner/ui/thread/version_checker_thread.py | 41 | data = response.json() |
| LOW | videocaptioner/core/asr/asr_data.py | 421 | WebVTT format subtitle content |
| LOW | tests/test_asr/test_chunking.py | 281 | # 现在使用 ChunkedASR 包装器模式,相关测试已在 test_chunked_asr.py 中实现 |
| LOW | tests/test_asr/test_chunking.py | 401 | |
| LOW | tests/test_asr/test_bcut_asr.py | 61 | # print(f" Total segments: {len(result.segments)}") |
| LOW | tests/test_asr/test_bcut_asr.py | 81 | # print("BcutASR Word-Level Transcription Results:") |
| LOW | tests/test_asr/test_jianying_asr.py | 21 | # @pytest.fixture |
| LOW | tests/test_asr/test_jianying_asr.py | 41 | # test_audio_path: Path to test audio file |
| LOW | tests/test_asr/test_jianying_asr.py | 61 | # print("\n" + "=" * 60) |
| LOW | tests/test_asr/test_jianying_asr.py | 81 | |
| LOW | .github/workflows/claude-code-review.yml | 1 | name: Claude Code Review |
| LOW | .github/workflows/claude-code-review.yml | 61 | # - For TypeScript files: Type safety and proper interface usage |
| LOW | .github/workflows/claude.yml | 41 | actions: read |
| LOW | .github/workflows/claude.yml | 61 | # Optional: Custom environment variables for Claude |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | videocaptioner/core/subtitle/text_utils.py | 137 | # Check if we should break the line |
| LOW | videocaptioner/core/subtitle/text_utils.py | 150 | # Check if next char would significantly exceed target |
| LOW | videocaptioner/core/subtitle/text_utils.py | 227 | # Check if next word would significantly exceed target |
| LOW | videocaptioner/cli/commands/transcribe.py | 151 | # Check if the temp file is empty (no audio track) |
| LOW | tests/test_subtitle/test_subtitle_thread.py | 33 | # Check if model specified in environment |
| LOW | scripts/trans-extract.sh | 17 | # Check if pylupdate5 is available |
| LOW | scripts/run.sh | 26 | # Check if running from within the project directory |
| LOW | scripts/run.sh | 28 | # Check if in project directory |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | .github/workflows/claude-code-review.yml | 63 | # - For React components: Performance, accessibility, and best practices |
| MEDIUM | .github/workflows/claude-code-review.yml | 70 | # 'Please provide a thorough code review focusing on our coding standards and best practices.' }} |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | videocaptioner/ui/components/MyVideoWidget.py | 277 | path = media.toLocalFile() or media.toString() |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | tests/test_thread/conftest.py | 37 | # Create a simple video with a solid color and the audio |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | videocaptioner/core/asr/bcut.py | 195 | # Example usage |