SYMBOL INDEX (683 symbols across 83 files) FILE: app/config/__init__.py function __init_logger (line 10) | def __init_logger(): FILE: app/config/audio_config.py class AudioConfig (line 16) | class AudioConfig: method get_optimized_volumes (line 50) | def get_optimized_volumes(cls, video_type: str = 'default') -> Dict[st... method get_audio_processing_config (line 89) | def get_audio_processing_config(cls) -> Dict[str, Any]: method get_mixing_config (line 94) | def get_mixing_config(cls) -> Dict[str, Any]: method validate_volume (line 99) | def validate_volume(cls, volume: float, name: str) -> float: method apply_volume_profile (line 123) | def apply_volume_profile(cls, profile_name: str) -> Dict[str, float]: function get_recommended_volumes_for_content (line 168) | def get_recommended_volumes_for_content(content_type: str = 'mixed') -> ... FILE: app/config/config.py function get_version_from_file (line 12) | def get_version_from_file(): function load_config (line 24) | def load_config(): function save_config (line 47) | def save_config(): FILE: app/config/ffmpeg_config.py class FFmpegProfile (line 14) | class FFmpegProfile: class FFmpegConfigManager (line 27) | class FFmpegConfigManager: method get_recommended_profile (line 99) | def get_recommended_profile(cls) -> str: method get_profile (line 143) | def get_profile(cls, profile_name: str) -> FFmpegProfile: method get_extraction_command (line 160) | def get_extraction_command(cls, method list_profiles (line 235) | def list_profiles(cls) -> Dict[str, str]: method get_compatibility_report (line 245) | def get_compatibility_report(cls) -> Dict[str, any]: method _get_suggestions (line 271) | def _get_suggestions(cls, profile: FFmpegProfile, hwaccel_info: Dict) ... FILE: app/models/exception.py class HttpException (line 7) | class HttpException(Exception): method __init__ (line 8) | def __init__( class FileNotFoundException (line 27) | class FileNotFoundException(Exception): FILE: app/models/schema.py class AudioVolumeDefaults (line 16) | class AudioVolumeDefaults: class VideoConcatMode (line 37) | class VideoConcatMode(str, Enum): class VideoAspect (line 42) | class VideoAspect(str, Enum): method to_resolution (line 49) | def to_resolution(self): class _Config (line 59) | class _Config: class MaterialInfo (line 64) | class MaterialInfo: class VideoParams (line 108) | class VideoParams(BaseModel): class VideoClipParams (line 160) | class VideoClipParams(BaseModel): class SubtitlePosition (line 204) | class SubtitlePosition(str, Enum): FILE: app/services/SDE/short_drama_explanation.py class SubtitleAnalyzer (line 23) | class SubtitleAnalyzer: method __init__ (line 26) | def __init__( method _detect_provider (line 62) | def _detect_provider(self): method _init_headers (line 66) | def _init_headers(self): method analyze_subtitle (line 79) | def analyze_subtitle(self, subtitle_content: str) -> Dict[str, Any]: method _call_native_gemini_api (line 117) | def _call_native_gemini_api(self, prompt: str) -> Dict[str, Any]: method _call_openai_compatible_api (line 233) | def _call_openai_compatible_api(self, prompt: str) -> Dict[str, Any]: method analyze_subtitle_from_file (line 293) | def analyze_subtitle_from_file(self, subtitle_file_path: str) -> Dict[... method save_analysis_result (line 332) | def save_analysis_result(self, analysis_result: Dict[str, Any], output... method generate_narration_script (line 366) | def generate_narration_script(self, short_name: str, plot_analysis: st... method _generate_narration_with_native_gemini (line 406) | def _generate_narration_with_native_gemini(self, prompt: str, temperat... method _generate_narration_with_openai_compatible (line 526) | def _generate_narration_with_openai_compatible(self, prompt: str, temp... method save_narration_script (line 590) | def save_narration_script(self, narration_result: Dict[str, Any], outp... function analyze_subtitle (line 625) | def analyze_subtitle( function generate_narration_script (line 684) | def generate_narration_script( FILE: app/services/SDP/generate_script_short.py function generate_script_result (line 12) | def generate_script_result( function generate_script (line 74) | def generate_script( FILE: app/services/SDP/utils/short_schema.py class PlotPoint (line 9) | class PlotPoint: class Commentary (line 16) | class Commentary: class SubtitleSegment (line 23) | class SubtitleSegment: class ScriptItem (line 30) | class ScriptItem: class PipelineResult (line 38) | class PipelineResult: class VideoProcessingError (line 47) | class VideoProcessingError(Exception): class SubtitleProcessingError (line 51) | class SubtitleProcessingError(Exception): class PlotAnalysisError (line 55) | class PlotAnalysisError(Exception): class CopywritingError (line 59) | class CopywritingError(Exception): FILE: app/services/SDP/utils/step1_subtitle_analyzer_openai.py function analyze_subtitle (line 17) | def analyze_subtitle( FILE: app/services/SDP/utils/step5_merge_script.py function merge_script (line 9) | def merge_script( FILE: app/services/SDP/utils/utils.py function load_srt (line 9) | def load_srt(file_path: str) -> List[Dict]: function load_srt_from_content (line 83) | def load_srt_from_content(srt_content: str) -> List[Dict]: FILE: app/services/audio_merger.py function check_ffmpeg (line 12) | def check_ffmpeg(): function merge_audio_files (line 21) | def merge_audio_files(task_id: str, total_duration: float, list_script: ... function time_to_seconds (line 79) | def time_to_seconds(time_str): function extract_timestamp (line 113) | def extract_timestamp(filename): FILE: app/services/audio_normalizer.py class AudioNormalizer (line 22) | class AudioNormalizer: method __init__ (line 25) | def __init__(self): method analyze_audio_lufs (line 29) | def analyze_audio_lufs(self, audio_path: str) -> Optional[float]: method get_audio_rms (line 87) | def get_audio_rms(self, audio_path: str) -> Optional[float]: method normalize_audio_lufs (line 122) | def normalize_audio_lufs(self, input_path: str, output_path: str, method _simple_normalize (line 207) | def _simple_normalize(self, input_path: str, output_path: str) -> bool: method calculate_volume_adjustment (line 236) | def calculate_volume_adjustment(self, tts_path: str, original_path: st... function normalize_audio_for_mixing (line 276) | def normalize_audio_for_mixing(audio_path: str, output_dir: str, FILE: app/services/clip_video.py function parse_timestamp (line 21) | def parse_timestamp(timestamp: str) -> tuple: function calculate_end_time (line 35) | def calculate_end_time(start_time: str, duration: float, extra_seconds: ... function check_hardware_acceleration (line 76) | def check_hardware_acceleration() -> Optional[str]: function get_safe_encoder_config (line 87) | def get_safe_encoder_config(hwaccel_type: Optional[str] = None) -> Dict[... function build_ffmpeg_command (line 143) | def build_ffmpeg_command( function execute_ffmpeg_with_fallback (line 230) | def execute_ffmpeg_with_fallback( function analyze_ffmpeg_error (line 304) | def analyze_ffmpeg_error(error_msg: str) -> str: function try_compatibility_fallback (line 345) | def try_compatibility_fallback( function try_software_fallback (line 386) | def try_software_fallback( function try_basic_fallback (line 426) | def try_basic_fallback( function execute_simple_command (line 464) | def execute_simple_command(cmd: List[str], timestamp: str, method_name: ... function try_fallback_encoding (line 509) | def try_fallback_encoding( function _process_narration_only_segment (line 548) | def _process_narration_only_segment( function _process_original_audio_segment (line 600) | def _process_original_audio_segment( function _process_mixed_segment (line 643) | def _process_mixed_segment( function _build_ffmpeg_command_with_audio_control (line 695) | def _build_ffmpeg_command_with_audio_control( function clip_video_unified (line 780) | def clip_video_unified( function clip_video (line 901) | def clip_video( FILE: app/services/generate_narration_script.py function parse_frame_analysis_to_markdown (line 25) | def parse_frame_analysis_to_markdown(json_file_path): function generate_narration (line 87) | def generate_narration(markdown_content, api_key, base_url, model): function _generate_narration_legacy (line 110) | def _generate_narration_legacy(markdown_content, api_key, base_url, model): FILE: app/services/generate_video.py function is_valid_subtitle_file (line 32) | def is_valid_subtitle_file(subtitle_path: str) -> bool: function merge_materials (line 66) | def merge_materials( function wrap_text (line 407) | def wrap_text(text, max_width, font="Arial", fontsize=60): FILE: app/services/llm.py function handle_exception (line 111) | def handle_exception(err): function _generate_response (line 134) | def _generate_response(prompt: str, llm_provider: str = None) -> str: function _generate_response_video (line 357) | def _generate_response_video(prompt: str, llm_provider_video: str, video... function compress_video (line 394) | def compress_video(input_path: str, output_path: str): function generate_script (line 414) | def generate_script( function gemini_video_transcription (line 470) | def gemini_video_transcription(video_name: str, video_path: str, languag... function generate_terms (line 524) | def generate_terms(video_subject: str, video_script: str, amount: int = ... function gemini_video2json (line 585) | def gemini_video2json(video_origin_name: str, video_origin_path: str, vi... function writing_movie (line 674) | def writing_movie(video_plot, video_name, llm_provider): function writing_short_play (line 699) | def writing_short_play(video_plot: str, video_name: str, llm_provider: s... function screen_matching (line 730) | def screen_matching(huamian: str, wenan: str, llm_provider: str): FILE: app/services/llm/base.py class BaseLLMProvider (line 16) | class BaseLLMProvider(ABC): method __init__ (line 19) | def __init__(self, method provider_name (line 46) | def provider_name(self) -> str: method supported_models (line 52) | def supported_models(self) -> List[str]: method _validate_config (line 56) | def _validate_config(self): method _validate_model_support (line 67) | def _validate_model_support(self): method _initialize (line 78) | def _initialize(self): method _make_api_call (line 83) | async def _make_api_call(self, payload: Dict[str, Any]) -> Dict[str, A... method _handle_api_error (line 87) | def _handle_api_error(self, status_code: int, response_text: str) -> L... class VisionModelProvider (line 103) | class VisionModelProvider(BaseLLMProvider): method analyze_images (line 107) | async def analyze_images(self, method _prepare_images (line 126) | def _prepare_images(self, images: List[Union[str, Path, PIL.Image.Imag... class TextModelProvider (line 153) | class TextModelProvider(BaseLLMProvider): method generate_text (line 157) | async def generate_text(self, method _build_messages (line 180) | def _build_messages(self, prompt: str, system_prompt: Optional[str] = ... FILE: app/services/llm/config_validator.py class LLMConfigValidator (line 15) | class LLMConfigValidator: method validate_all_configs (line 19) | def validate_all_configs() -> Dict[str, Any]: method validate_vision_provider (line 88) | def validate_vision_provider(provider_name: str) -> Dict[str, Any]: method validate_text_provider (line 145) | def validate_text_provider(provider_name: str) -> Dict[str, Any]: method get_config_suggestions (line 202) | def get_config_suggestions() -> Dict[str, Any]: method _get_example_models (line 252) | def _get_example_models(provider_name: str, model_type: str) -> List[s... method print_validation_report (line 280) | def print_validation_report(validation_results: Dict[str, Any]): FILE: app/services/llm/exceptions.py class LLMServiceError (line 11) | class LLMServiceError(Exception): method __init__ (line 14) | def __init__(self, message: str, error_code: Optional[str] = None, det... method __str__ (line 20) | def __str__(self): class ProviderNotFoundError (line 26) | class ProviderNotFoundError(LLMServiceError): method __init__ (line 29) | def __init__(self, provider_name: str): class ConfigurationError (line 37) | class ConfigurationError(LLMServiceError): method __init__ (line 40) | def __init__(self, message: str, config_key: Optional[str] = None): class APICallError (line 48) | class APICallError(LLMServiceError): method __init__ (line 51) | def __init__(self, message: str, status_code: Optional[int] = None, re... class ValidationError (line 62) | class ValidationError(LLMServiceError): method __init__ (line 65) | def __init__(self, message: str, validation_type: Optional[str] = None... class ModelNotSupportedError (line 76) | class ModelNotSupportedError(LLMServiceError): method __init__ (line 79) | def __init__(self, model_name: str, provider_name: str): class RateLimitError (line 90) | class RateLimitError(LLMServiceError): method __init__ (line 93) | def __init__(self, message: str = "API调用频率超限", retry_after: Optional[i... class AuthenticationError (line 101) | class AuthenticationError(LLMServiceError): method __init__ (line 104) | def __init__(self, message: str = "API密钥无效或权限不足"): class ContentFilterError (line 111) | class ContentFilterError(LLMServiceError): method __init__ (line 114) | def __init__(self, message: str = "内容被安全过滤器阻止"): FILE: app/services/llm/litellm_provider.py function configure_litellm (line 39) | def configure_litellm(): class LiteLLMVisionProvider (line 59) | class LiteLLMVisionProvider(VisionModelProvider): method provider_name (line 63) | def provider_name(self) -> str: method supported_models (line 70) | def supported_models(self) -> List[str]: method _validate_model_support (line 75) | def _validate_model_support(self): method _initialize (line 98) | def _initialize(self): method analyze_images (line 130) | async def analyze_images(self, method _analyze_batch (line 167) | async def _analyze_batch(self, batch: List[PIL.Image.Image], prompt: s... method _image_to_base64 (line 254) | def _image_to_base64(self, img: PIL.Image.Image) -> str: method _make_api_call (line 261) | async def _make_api_call(self, payload: Dict[str, Any]) -> Dict[str, A... class LiteLLMTextProvider (line 266) | class LiteLLMTextProvider(TextModelProvider): method provider_name (line 270) | def provider_name(self) -> str: method supported_models (line 289) | def supported_models(self) -> List[str]: method _validate_model_support (line 294) | def _validate_model_support(self): method _initialize (line 317) | def _initialize(self): method generate_text (line 349) | async def generate_text(self, method _clean_json_output (line 474) | def _clean_json_output(self, output: str) -> str: method _make_api_call (line 488) | async def _make_api_call(self, payload: Dict[str, Any]) -> Dict[str, A... FILE: app/services/llm/manager.py class LLMServiceManager (line 15) | class LLMServiceManager: method register_vision_provider (line 29) | def register_vision_provider(cls, name: str, provider_class: Type[Visi... method register_text_provider (line 35) | def register_text_provider(cls, name: str, provider_class: Type[TextMo... method is_registered (line 46) | def is_registered(cls) -> bool: method get_registered_providers_info (line 56) | def get_registered_providers_info(cls) -> dict: method get_vision_provider (line 69) | def get_vision_provider(cls, provider_name: Optional[str] = None) -> V... method get_text_provider (line 137) | def get_text_provider(cls, provider_name: Optional[str] = None) -> Tex... method clear_cache (line 211) | def clear_cache(cls): method list_vision_providers (line 218) | def list_vision_providers(cls) -> list[str]: method list_text_providers (line 223) | def list_text_providers(cls) -> list[str]: method get_provider_info (line 228) | def get_provider_info(cls) -> Dict[str, Dict[str, any]]: FILE: app/services/llm/migration_adapter.py function _run_async_safely (line 23) | def _run_async_safely(coro_func, *args, **kwargs): class LegacyLLMAdapter (line 62) | class LegacyLLMAdapter: method create_vision_analyzer (line 66) | def create_vision_analyzer(provider: str, api_key: str, model: str, ba... method generate_narration (line 82) | def generate_narration(markdown_content: str, api_key: str, base_url: ... class VisionAnalyzerAdapter (line 150) | class VisionAnalyzerAdapter: method __init__ (line 153) | def __init__(self, provider: str, api_key: str, model: str, base_url: ... method analyze_images (line 159) | async def analyze_images(self, class SubtitleAnalyzerAdapter (line 207) | class SubtitleAnalyzerAdapter: method __init__ (line 210) | def __init__(self, api_key: str, model: str, base_url: str, provider: ... method _run_async_safely (line 216) | def _run_async_safely(self, coro_func, *args, **kwargs): method _clean_json_output (line 220) | def _clean_json_output(self, output: str) -> str: method analyze_subtitle (line 238) | def analyze_subtitle(self, subtitle_content: str) -> Dict[str, Any]: method generate_narration_script (line 274) | def generate_narration_script(self, short_name: str, plot_analysis: st... function create_vision_analyzer (line 334) | def create_vision_analyzer(provider: str, api_key: str, model: str, base... function generate_narration (line 339) | def generate_narration(markdown_content: str, api_key: str, base_url: st... FILE: app/services/llm/providers/__init__.py function register_all_providers (line 12) | def register_all_providers(): FILE: app/services/llm/test_litellm_integration.py function test_provider_registration (line 20) | def test_provider_registration(): function test_litellm_import (line 45) | def test_litellm_import(): function test_text_generation_mock (line 61) | async def test_text_generation_mock(): function test_vision_analysis_mock (line 77) | async def test_vision_analysis_mock(): function test_backward_compatibility (line 93) | def test_backward_compatibility(): function print_usage_guide (line 125) | def print_usage_guide(): function main (line 188) | def main(): FILE: app/services/llm/test_llm_service.py function test_text_generation (line 25) | async def test_text_generation(): function test_json_generation (line 50) | async def test_json_generation(): function test_narration_script_generation (line 89) | async def test_narration_script_generation(): function test_subtitle_analysis (line 124) | async def test_subtitle_analysis(): function test_config_validation (line 159) | def test_config_validation(): function test_provider_info (line 184) | def test_provider_info(): function run_all_tests (line 205) | async def run_all_tests(): FILE: app/services/llm/unified_service.py class UnifiedLLMService (line 20) | class UnifiedLLMService: method analyze_images (line 24) | async def analyze_images(images: List[Union[str, Path, PIL.Image.Image]], method generate_text (line 65) | async def generate_text(prompt: str, method generate_narration_script (line 112) | async def generate_narration_script(prompt: str, method analyze_subtitle (line 162) | async def analyze_subtitle(subtitle_content: str, method get_provider_info (line 209) | def get_provider_info() -> Dict[str, Any]: method list_vision_providers (line 219) | def list_vision_providers() -> List[str]: method list_text_providers (line 229) | def list_text_providers() -> List[str]: method clear_cache (line 239) | def clear_cache(): function analyze_images_unified (line 246) | async def analyze_images_unified(images: List[Union[str, Path, PIL.Image... function generate_text_unified (line 254) | async def generate_text_unified(prompt: str, FILE: app/services/llm/validators.py class OutputValidator (line 15) | class OutputValidator: method validate_json_output (line 19) | def validate_json_output(output: str, schema: Optional[Dict[str, Any]]... method _clean_json_output (line 55) | def _clean_json_output(output: str) -> str: method _validate_json_schema (line 72) | def _validate_json_schema(data: Dict[str, Any], schema: Dict[str, Any]): method validate_narration_script (line 90) | def validate_narration_script(output: str) -> List[Dict[str, Any]]: method _validate_narration_item (line 146) | def _validate_narration_item(item: Dict[str, Any], index: int): method validate_subtitle_analysis (line 166) | def validate_subtitle_analysis(output: str) -> str: FILE: app/services/material.py function get_api_key (line 22) | def get_api_key(cfg_key: str): function search_videos_pexels (line 39) | def search_videos_pexels( function search_videos_pixabay (line 93) | def search_videos_pixabay( function save_video (line 149) | def save_video(video_url: str, save_dir: str = "") -> str: function download_videos (line 190) | def download_videos( function time_to_seconds (line 257) | def time_to_seconds(time_str: str) -> float: function format_timestamp (line 292) | def format_timestamp(seconds: float) -> str: function _detect_hardware_acceleration (line 311) | def _detect_hardware_acceleration() -> Optional[str]: function save_clip_video (line 323) | def save_clip_video(timestamp: str, origin_video: str, save_dir: str = "... function clip_videos (line 492) | def clip_videos(task_id: str, timestamp_terms: List[str], origin_video: ... function merge_videos (line 525) | def merge_videos(video_paths, ost_list): FILE: app/services/merger_video.py class VideoAspect (line 21) | class VideoAspect(Enum): method to_resolution (line 29) | def to_resolution(self) -> Tuple[int, int]: function check_ffmpeg_installation (line 45) | def check_ffmpeg_installation() -> bool: function get_hardware_acceleration_option (line 60) | def get_hardware_acceleration_option() -> Optional[str]: function check_video_has_audio (line 71) | def check_video_has_audio(video_path: str) -> bool: function create_ffmpeg_concat_file (line 101) | def create_ffmpeg_concat_file(video_paths: List[str], concat_file_path: ... function process_single_video (line 130) | def process_single_video( function combine_clip_videos (line 328) | def combine_clip_videos( FILE: app/services/prompts/__init__.py function initialize_prompts (line 56) | def initialize_prompts(): FILE: app/services/prompts/base.py class ModelType (line 19) | class ModelType(Enum): class OutputFormat (line 26) | class OutputFormat(Enum): class PromptMetadata (line 35) | class PromptMetadata: class BasePrompt (line 50) | class BasePrompt(ABC): method __init__ (line 53) | def __init__(self, metadata: PromptMetadata): method name (line 60) | def name(self) -> str: method category (line 65) | def category(self) -> str: method version (line 70) | def version(self) -> str: method model_type (line 75) | def model_type(self) -> ModelType: method output_format (line 80) | def output_format(self) -> OutputFormat: method get_template (line 85) | def get_template(self) -> str: method get_system_prompt (line 89) | def get_system_prompt(self) -> Optional[str]: method get_examples (line 93) | def get_examples(self) -> List[str]: method validate_parameters (line 97) | def validate_parameters(self, parameters: Dict[str, Any]) -> bool: method render (line 112) | def render(self, parameters: Dict[str, Any] = None) -> str: method to_dict (line 134) | def to_dict(self) -> Dict[str, Any]: class TextPrompt (line 156) | class TextPrompt(BasePrompt): method __init__ (line 159) | def __init__(self, metadata: PromptMetadata): class VisionPrompt (line 165) | class VisionPrompt(BasePrompt): method __init__ (line 168) | def __init__(self, metadata: PromptMetadata): class ParameterizedPrompt (line 174) | class ParameterizedPrompt(BasePrompt): method __init__ (line 177) | def __init__(self, metadata: PromptMetadata, required_parameters: List... FILE: app/services/prompts/documentary/__init__.py function register_prompts (line 17) | def register_prompts(): FILE: app/services/prompts/documentary/frame_analysis.py class FrameAnalysisPrompt (line 15) | class FrameAnalysisPrompt(VisionPrompt): method __init__ (line 18) | def __init__(self): method get_template (line 33) | def get_template(self) -> str: FILE: app/services/prompts/documentary/narration_generation.py class NarrationGenerationPrompt (line 15) | class NarrationGenerationPrompt(TextPrompt): method __init__ (line 18) | def __init__(self): method get_template (line 33) | def get_template(self) -> str: FILE: app/services/prompts/exceptions.py class PromptError (line 13) | class PromptError(Exception): class PromptNotFoundError (line 18) | class PromptNotFoundError(PromptError): method __init__ (line 21) | def __init__(self, category: str, name: str, version: str = None): class PromptValidationError (line 34) | class PromptValidationError(PromptError): method __init__ (line 37) | def __init__(self, message: str, validation_errors: list = None): class TemplateRenderError (line 42) | class TemplateRenderError(PromptError): method __init__ (line 45) | def __init__(self, template_name: str, error_message: str, missing_par... class PromptRegistrationError (line 57) | class PromptRegistrationError(PromptError): method __init__ (line 60) | def __init__(self, category: str, name: str, reason: str): class PromptVersionError (line 69) | class PromptVersionError(PromptError): method __init__ (line 72) | def __init__(self, category: str, name: str, version: str, reason: str): FILE: app/services/prompts/manager.py class PromptManager (line 26) | class PromptManager: method __init__ (line 29) | def __init__(self): method get_prompt (line 34) | def get_prompt(cls, method get_prompt_object (line 63) | def get_prompt_object(cls, method register_prompt (line 82) | def register_prompt(cls, prompt: BasePrompt, is_default: bool = True) ... method list_categories (line 94) | def list_categories(cls) -> List[str]: method list_prompts (line 100) | def list_prompts(cls, category: str) -> List[str]: method list_versions (line 106) | def list_versions(cls, category: str, name: str) -> List[str]: method exists (line 112) | def exists(cls, category: str, name: str, version: Optional[str] = Non... method search_prompts (line 118) | def search_prompts(cls, method get_stats (line 150) | def get_stats(cls) -> Dict[str, Any]: method validate_output (line 164) | def validate_output(cls, method get_prompt_info (line 204) | def get_prompt_info(cls, category: str, name: str, version: Optional[s... method export_prompts (line 240) | def export_prompts(cls, category: Optional[str] = None) -> Dict[str, A... method _get_current_time (line 273) | def _get_current_time(self) -> str: function get_prompt (line 280) | def get_prompt(category: str, name: str, version: str = None, **paramete... function validate_prompt_output (line 285) | def validate_prompt_output(output: Union[str, Dict], category: str, name... FILE: app/services/prompts/registry.py class PromptRegistry (line 24) | class PromptRegistry: method __init__ (line 27) | def __init__(self): method register (line 35) | def register(self, prompt: BasePrompt, is_default: bool = True) -> None: method get (line 65) | def get(self, category: str, name: str, version: Optional[str] = None)... method list_categories (line 94) | def list_categories(self) -> List[str]: method list_prompts (line 98) | def list_prompts(self, category: str) -> List[str]: method list_versions (line 104) | def list_versions(self, category: str, name: str) -> List[str]: method get_default_version (line 110) | def get_default_version(self, category: str, name: str) -> Optional[str]: method set_default_version (line 114) | def set_default_version(self, category: str, name: str, version: str) ... method exists (line 124) | def exists(self, category: str, name: str, version: Optional[str] = No... method remove (line 132) | def remove(self, category: str, name: str, version: Optional[str] = No... method search (line 158) | def search(self, method get_stats (line 200) | def get_stats(self) -> Dict[str, int]: function get_registry (line 221) | def get_registry() -> PromptRegistry: FILE: app/services/prompts/short_drama_editing/__init__.py function register_prompts (line 17) | def register_prompts(): FILE: app/services/prompts/short_drama_editing/plot_extraction.py class PlotExtractionPrompt (line 15) | class PlotExtractionPrompt(TextPrompt): method __init__ (line 18) | def __init__(self): method get_template (line 33) | def get_template(self) -> str: FILE: app/services/prompts/short_drama_editing/subtitle_analysis.py class SubtitleAnalysisPrompt (line 15) | class SubtitleAnalysisPrompt(TextPrompt): method __init__ (line 18) | def __init__(self): method get_template (line 33) | def get_template(self) -> str: FILE: app/services/prompts/short_drama_narration/__init__.py function register_prompts (line 17) | def register_prompts(): FILE: app/services/prompts/short_drama_narration/plot_analysis.py class PlotAnalysisPrompt (line 15) | class PlotAnalysisPrompt(TextPrompt): method __init__ (line 18) | def __init__(self): method get_template (line 33) | def get_template(self) -> str: FILE: app/services/prompts/short_drama_narration/script_generation.py class ScriptGenerationPrompt (line 15) | class ScriptGenerationPrompt(ParameterizedPrompt): method __init__ (line 18) | def __init__(self): method get_template (line 33) | def get_template(self) -> str: FILE: app/services/prompts/template.py class TemplateRenderer (line 20) | class TemplateRenderer: method __init__ (line 23) | def __init__(self): method register_filter (line 26) | def register_filter(self, name: str, func: callable) -> None: method render (line 31) | def render(self, template: str, parameters: Dict[str, Any] = None) -> ... method _apply_filters (line 65) | def _apply_filters(self, text: str, parameters: Dict[str, Any]) -> str: method extract_variables (line 92) | def extract_variables(self, template: str) -> List[str]: method validate_template (line 99) | def validate_template(self, template: str, required_params: List[str] ... function _upper_filter (line 127) | def _upper_filter(value: Any) -> str: function _lower_filter (line 132) | def _lower_filter(value: Any) -> str: function _title_filter (line 137) | def _title_filter(value: Any) -> str: function _strip_filter (line 142) | def _strip_filter(value: Any) -> str: function _truncate_filter (line 147) | def _truncate_filter(value: Any, length: int = 100) -> str: function _json_filter (line 155) | def _json_filter(value: Any) -> str: function get_renderer (line 173) | def get_renderer() -> TemplateRenderer: function render_template (line 178) | def render_template(template: str, parameters: Dict[str, Any] = None) ->... FILE: app/services/prompts/validators.py class PromptOutputValidator (line 21) | class PromptOutputValidator: method validate_json (line 25) | def validate_json(output: str, schema: Dict[str, Any] = None) -> Dict[... method validate_narration_script (line 55) | def validate_narration_script(output: Union[str, Dict]) -> Dict[str, A... method validate_plot_analysis (line 90) | def validate_plot_analysis(output: Union[str, Dict]) -> Dict[str, Any]: method _clean_json_output (line 123) | def _clean_json_output(output: str) -> str: method _validate_json_schema (line 140) | def _validate_json_schema(data: Dict[str, Any], schema: Dict[str, Any]... method _validate_narration_item (line 153) | def _validate_narration_item(item: Dict[str, Any], index: int) -> None: method _validate_plot_point (line 190) | def _validate_plot_point(point: Dict[str, Any], index: int) -> None: method validate_by_format (line 217) | def validate_by_format(output: str, format_type: OutputFormat, schema:... function validate_json_output (line 243) | def validate_json_output(output: str, schema: Dict[str, Any] = None) -> ... function validate_narration_output (line 248) | def validate_narration_output(output: Union[str, Dict]) -> Dict[str, Any]: FILE: app/services/script_service.py class ScriptGenerator (line 15) | class ScriptGenerator: method __init__ (line 16) | def __init__(self): method generate_script (line 20) | async def generate_script( method _extract_keyframes (line 76) | async def _extract_keyframes( method _process_with_llm (line 120) | async def _process_with_llm( method _get_batch_files (line 248) | def _get_batch_files( method _get_batch_timestamps (line 259) | def _get_batch_timestamps( FILE: app/services/state.py class BaseState (line 8) | class BaseState(ABC): method update_task (line 10) | def update_task(self, task_id: str, state: int, progress: int = 0, **k... method get_task (line 14) | def get_task(self, task_id: str): class MemoryState (line 19) | class MemoryState(BaseState): method __init__ (line 20) | def __init__(self): method update_task (line 23) | def update_task( method get_task (line 40) | def get_task(self, task_id: str): method delete_task (line 43) | def delete_task(self, task_id: str): class RedisState (line 49) | class RedisState(BaseState): method __init__ (line 50) | def __init__(self, host="localhost", port=6379, db=0, password=None): method update_task (line 55) | def update_task( method get_task (line 75) | def get_task(self, task_id: str): method delete_task (line 86) | def delete_task(self, task_id: str): method _convert_to_original_type (line 90) | def _convert_to_original_type(value): FILE: app/services/subtitle.py function create (line 23) | def create(audio_file, subtitle_file: str = ""): function file_to_subtitles (line 197) | def file_to_subtitles(filename): function levenshtein_distance (line 228) | def levenshtein_distance(s1, s2): function similarity (line 248) | def similarity(a, b): function correct (line 254) | def correct(subtitle_file, video_script): function create_with_gemini (line 348) | def create_with_gemini(audio_file: str, subtitle_file: str = "", api_key... function extract_audio_and_create_subtitle (line 380) | def extract_audio_and_create_subtitle(video_file: str, subtitle_file: st... FILE: app/services/subtitle_merger.py function parse_time (line 16) | def parse_time(time_str): function format_time (line 30) | def format_time(td): function parse_edited_time_range (line 41) | def parse_edited_time_range(time_range_str): function merge_subtitle_files (line 62) | def merge_subtitle_files(subtitle_items, output_file=None): FILE: app/services/subtitle_text.py class DecodedSubtitle (line 28) | class DecodedSubtitle: function has_timecodes (line 33) | def has_timecodes(text: str) -> bool: function normalize_subtitle_text (line 40) | def normalize_subtitle_text(text: str) -> str: function decode_subtitle_bytes (line 69) | def decode_subtitle_bytes( function read_subtitle_text (line 114) | def read_subtitle_text(file_path: str) -> DecodedSubtitle: FILE: app/services/task.py function start_subclip (line 18) | def start_subclip(task_id: str, params: VideoClipParams, subclip_path_vi... function start_subclip_unified (line 266) | def start_subclip_unified(task_id: str, params: VideoClipParams): function validate_params (line 480) | def validate_params(video_path, audio_path, output_file, params): FILE: app/services/update_script.py function extract_timestamp_from_video_path (line 16) | def extract_timestamp_from_video_path(video_path: str) -> str: function calculate_duration (line 48) | def calculate_duration(timestamp: str) -> float: function update_script_timestamps (line 90) | def update_script_timestamps( FILE: app/services/upload_validation.py class InputValidationError (line 16) | class InputValidationError(ValueError): function ensure_existing_file (line 21) | def ensure_existing_file( function resolve_subtitle_input (line 63) | def resolve_subtitle_input( FILE: app/services/video.py function wrap_text (line 22) | def wrap_text(text, max_width, font, fontsize=60): function manage_clip (line 92) | def manage_clip(clip): function resize_video_with_padding (line 108) | def resize_video_with_padding(clip, target_width: int, target_height: int): function loop_audio_clip (line 145) | def loop_audio_clip(audio_clip: AudioFileClip, target_duration: float) -... function calculate_subtitle_position (line 170) | def calculate_subtitle_position(position, video_height: int, text_height... function generate_video_v3 (line 200) | def generate_video_v3( FILE: app/services/video_service.py class VideoService (line 9) | class VideoService: method crop_video (line 11) | async def crop_video( FILE: app/services/voice.py function mktimestamp (line 28) | def mktimestamp(time_seconds: float) -> str: function new_sub_maker (line 44) | def new_sub_maker() -> SubMaker: function add_subtitle_event (line 54) | def add_subtitle_event( function get_all_azure_voices (line 80) | def get_all_azure_voices(filter_locals=None) -> list[str]: function parse_voice_name (line 1083) | def parse_voice_name(name: str): function is_azure_v2_voice (line 1091) | def is_azure_v2_voice(voice_name: str): function should_use_azure_speech_services (line 1098) | def should_use_azure_speech_services(voice_name: str) -> bool: function tts (line 1119) | def tts( function convert_rate_to_percent (line 1156) | def convert_rate_to_percent(rate: float) -> str: function convert_pitch_to_percent (line 1166) | def convert_pitch_to_percent(rate: float) -> str: function get_edge_tts_proxy (line 1176) | def get_edge_tts_proxy() -> str | None: function azure_tts_v1 (line 1186) | def azure_tts_v1( function azure_tts_v2 (line 1248) | def azure_tts_v2(text: str, voice_name: str, voice_file: str) -> Union[S... function _format_text (line 1342) | def _format_text(text: str) -> str: function create_subtitle_from_multiple (line 1357) | def create_subtitle_from_multiple(text: str, sub_maker_list: List[SubMak... function create_subtitle (line 1460) | def create_subtitle(sub_maker: submaker.SubMaker, text: str, subtitle_fi... function get_audio_duration (line 1561) | def get_audio_duration(sub_maker: submaker.SubMaker): function tts_multiple (line 1570) | def tts_multiple(task_id: str, list_script: list, voice_name: str, voice... function get_audio_duration_from_file (line 1638) | def get_audio_duration_from_file(audio_file: str) -> float: function parse_soulvoice_voice (line 1670) | def parse_soulvoice_voice(voice_name: str) -> str: function parse_tencent_voice (line 1681) | def parse_tencent_voice(voice_name: str) -> str: function parse_qwen3_voice (line 1691) | def parse_qwen3_voice(voice_name: str) -> str: function qwen3_tts (line 1700) | def qwen3_tts(text: str, voice_name: str, voice_file: str, speed: float ... function tencent_tts (line 1796) | def tencent_tts(text: str, voice_name: str, voice_file: str, speed: floa... function soulvoice_tts (line 1899) | def soulvoice_tts(text: str, voice_name: str, voice_file: str, speed: fl... function is_soulvoice_voice (line 1990) | def is_soulvoice_voice(voice_name: str) -> bool: function is_qwen_engine (line 1996) | def is_qwen_engine(tts_engine: str) -> bool: function parse_soulvoice_voice (line 1999) | def parse_soulvoice_voice(voice_name: str) -> str: function parse_indextts2_voice (line 2011) | def parse_indextts2_voice(voice_name: str) -> str: function indextts2_tts (line 2022) | def indextts2_tts(text: str, voice_name: str, voice_file: str, speed: fl... FILE: app/services/youtube_service.py class YoutubeService (line 11) | class YoutubeService: method __init__ (line 12) | def __init__(self): method _get_video_formats (line 15) | def _get_video_formats(self, url: str) -> List[Dict]: method _validate_format (line 44) | def _validate_format(self, output_format: str) -> None: method download_video (line 52) | async def download_video( FILE: app/utils/check_script.py function check_format (line 5) | def check_format(script_content: str) -> Dict[str, Any]: FILE: app/utils/ffmpeg_utils.py function get_null_input (line 64) | def get_null_input() -> str: function create_test_video (line 78) | def create_test_video() -> str: function cleanup_test_video (line 104) | def cleanup_test_video(path: str) -> None: function check_ffmpeg_installation (line 118) | def check_ffmpeg_installation() -> bool: function detect_gpu_vendor (line 138) | def detect_gpu_vendor() -> str: function test_hwaccel_method (line 183) | def test_hwaccel_method(method: str, test_input: str) -> bool: function detect_hardware_acceleration (line 252) | def detect_hardware_acceleration() -> Dict[str, Union[bool, str, List[st... function _get_gpu_info (line 358) | def _get_gpu_info() -> str: function _get_macos_gpu_info (line 377) | def _get_macos_gpu_info() -> str: function _find_vaapi_device (line 403) | def _find_vaapi_device() -> Optional[str]: function _detect_macos_acceleration (line 440) | def _detect_macos_acceleration(supported_hwaccels: str) -> None: function _detect_windows_acceleration (line 470) | def _detect_windows_acceleration(supported_hwaccels: str) -> None: function _detect_linux_acceleration (line 639) | def _detect_linux_acceleration(supported_hwaccels: str) -> None: function _get_windows_gpu_info (line 719) | def _get_windows_gpu_info() -> str: function _get_linux_gpu_info (line 748) | def _get_linux_gpu_info() -> str: function get_ffmpeg_hwaccel_args (line 778) | def get_ffmpeg_hwaccel_args() -> List[str]: function get_ffmpeg_hwaccel_type (line 792) | def get_ffmpeg_hwaccel_type() -> Optional[str]: function get_ffmpeg_hwaccel_encoder (line 806) | def get_ffmpeg_hwaccel_encoder() -> Optional[str]: function get_ffmpeg_hwaccel_info (line 820) | def get_ffmpeg_hwaccel_info() -> Dict[str, Union[bool, str, List[str], N... function is_ffmpeg_hwaccel_available (line 834) | def is_ffmpeg_hwaccel_available() -> bool: function is_dedicated_gpu (line 848) | def is_dedicated_gpu() -> bool: function get_optimal_ffmpeg_encoder (line 862) | def get_optimal_ffmpeg_encoder() -> str: function get_ffmpeg_command_with_hwaccel (line 881) | def get_ffmpeg_command_with_hwaccel(input_path: str, output_path: str, *... function test_ffmpeg_compatibility (line 925) | def test_ffmpeg_compatibility() -> Dict[str, any]: function force_software_encoding (line 981) | def force_software_encoding() -> None: function reset_hwaccel_detection (line 1001) | def reset_hwaccel_detection() -> None: function test_nvenc_directly (line 1028) | def test_nvenc_directly() -> bool: function force_use_nvenc_pure (line 1059) | def force_use_nvenc_pure() -> None: function get_hwaccel_status (line 1082) | def get_hwaccel_status() -> Dict[str, any]: function _auto_reset_on_import (line 1106) | def _auto_reset_on_import(): FILE: app/utils/gemini_analyzer.py class VisionAnalyzer (line 17) | class VisionAnalyzer: method __init__ (line 20) | def __init__(self, model_name: str = "gemini-2.0-flash-exp", api_key: ... method _configure_client (line 32) | def _configure_client(self): method _generate_content_with_retry (line 43) | async def _generate_content_with_retry(self, prompt, batch): method _generate_with_gemini_api (line 54) | async def _generate_with_gemini_api(self, prompt, batch): method analyze_images (line 165) | async def analyze_images(self, method save_results_to_txt (line 249) | def save_results_to_txt(self, results: List[Dict], output_dir: str): method load_images (line 290) | def load_images(self, image_paths: List[str]) -> List[PIL.Image.Image]: FILE: app/utils/gemini_openai_analyzer.py class GeminiOpenAIAnalyzer (line 22) | class GeminiOpenAIAnalyzer: method __init__ (line 25) | def __init__(self, model_name: str = "gemini-2.0-flash-exp", api_key: ... method _configure_client (line 40) | def _configure_client(self): method _generate_content_with_retry (line 54) | async def _generate_content_with_retry(self, prompt, batch): method _generate_with_openai_api (line 62) | async def _generate_with_openai_api(self, prompt, batch): method analyze_images (line 108) | async def analyze_images(self, method analyze_images_sync (line 170) | def analyze_images_sync(self, FILE: app/utils/qwenvl_analyzer.py class QwenAnalyzer (line 16) | class QwenAnalyzer: method __init__ (line 19) | def __init__(self, model_name: str = "qwen-vl-max-latest", api_key: st... method _configure_client (line 38) | def _configure_client(self): method _image_to_base64 (line 52) | def _image_to_base64(self, image: PIL.Image.Image) -> str: method _generate_content_with_retry (line 64) | async def _generate_content_with_retry(self, prompt: str, batch: List[... method analyze_images (line 102) | async def analyze_images(self, method save_results_to_txt (line 208) | def save_results_to_txt(self, results: List[Dict], output_dir: str): method load_images (line 233) | def load_images(self, image_paths: List[str]) -> List[PIL.Image.Image]: FILE: app/utils/script_generator.py class BaseGenerator (line 13) | class BaseGenerator: method __init__ (line 14) | def __init__(self, model_name: str, api_key: str, prompt: str): method _try_generate (line 29) | def _try_generate(self, messages: list, params: dict = None) -> str: method _generate (line 44) | def _generate(self, messages: list, params: dict) -> any: method _process_response (line 47) | def _process_response(self, response: any) -> str: method generate_script (line 50) | def generate_script(self, scene_description: str, word_count: int) -> ... class OpenAIGenerator (line 82) | class OpenAIGenerator(BaseGenerator): method __init__ (line 84) | def __init__(self, model_name: str, api_key: str, prompt: str, base_ur... method _generate (line 104) | def _generate(self, messages: list, params: dict) -> any: method _process_response (line 117) | def _process_response(self, response: any) -> str: method _count_tokens (line 123) | def _count_tokens(self, messages: list) -> int: class GeminiGenerator (line 136) | class GeminiGenerator(BaseGenerator): method __init__ (line 138) | def __init__(self, model_name: str, api_key: str, prompt: str, base_ur... class GeminiOpenAIGenerator (line 155) | class GeminiOpenAIGenerator(BaseGenerator): method __init__ (line 157) | def __init__(self, model_name: str, api_key: str, prompt: str, base_ur... method _generate (line 179) | def _generate(self, messages: list, params: dict) -> any: method _process_response (line 192) | def _process_response(self, response: any) -> str: method _generate (line 198) | def _generate(self, messages: list, params: dict) -> any: method _process_response (line 309) | def _process_response(self, response: any) -> str: class QwenGenerator (line 316) | class QwenGenerator(BaseGenerator): method __init__ (line 318) | def __init__(self, model_name: str, api_key: str, prompt: str, base_ur... method _generate (line 332) | def _generate(self, messages: list, params: dict) -> any: method _process_response (line 345) | def _process_response(self, response: any) -> str: class MoonshotGenerator (line 352) | class MoonshotGenerator(BaseGenerator): method __init__ (line 354) | def __init__(self, model_name: str, api_key: str, prompt: str, base_ur... method _generate (line 370) | def _generate(self, messages: list, params: dict) -> any: method _process_response (line 390) | def _process_response(self, response: any) -> str: class DeepSeekGenerator (line 397) | class DeepSeekGenerator(BaseGenerator): method __init__ (line 399) | def __init__(self, model_name: str, api_key: str, prompt: str, base_ur... method _generate (line 413) | def _generate(self, messages: list, params: dict) -> any: method _process_response (line 426) | def _process_response(self, response: any) -> str: class ScriptProcessor (line 433) | class ScriptProcessor: method __init__ (line 434) | def __init__(self, model_name: str, api_key: str = None, base_url: str... method _get_default_prompt (line 454) | def _get_default_prompt(self) -> str: method calculate_duration_and_word_count (line 499) | def calculate_duration_and_word_count(self, time_range: str) -> int: method process_frames (line 560) | def process_frames(self, frame_content_list: List[Dict]) -> List[Dict]: method _save_results (line 572) | def _save_results(self, frame_content_list: List[Dict]): FILE: app/utils/utils.py function get_response (line 22) | def get_response(status: int, data: Any = None, message: str = ""): function to_json (line 33) | def to_json(obj): function get_uuid (line 65) | def get_uuid(remove_hyphen: bool = False): function root_dir (line 72) | def root_dir(): function storage_dir (line 76) | def storage_dir(sub_dir: str = "", create: bool = False): function resource_dir (line 86) | def resource_dir(sub_dir: str = ""): function task_dir (line 93) | def task_dir(sub_dir: str = ""): function font_dir (line 102) | def font_dir(sub_dir: str = ""): function song_dir (line 111) | def song_dir(sub_dir: str = ""): function get_bgm_file (line 120) | def get_bgm_file(bgm_type: str = "random", bgm_file: str = ""): function public_dir (line 161) | def public_dir(sub_dir: str = ""): function srt_dir (line 170) | def srt_dir(sub_dir: str = ""): function run_in_background (line 179) | def run_in_background(func, *args, **kwargs): function time_convert_seconds_to_hmsm (line 191) | def time_convert_seconds_to_hmsm(seconds) -> str: function format_time (line 200) | def format_time(seconds: float) -> str: function text_to_srt (line 222) | def text_to_srt(idx: int, msg: str, start_time: float, end_time: float) ... function str_contains_punctuation (line 237) | def str_contains_punctuation(word): function split_string_by_punctuations (line 244) | def split_string_by_punctuations(s): function md5 (line 278) | def md5(text): function get_system_locale (line 284) | def get_system_locale(): function load_locales (line 295) | def load_locales(i18n_dir): function parse_extension (line 306) | def parse_extension(filename): function script_dir (line 310) | def script_dir(sub_dir: str = ""): function video_dir (line 319) | def video_dir(sub_dir: str = ""): function subtitle_dir (line 328) | def subtitle_dir(sub_dir: str = ""): function split_timestamp (line 337) | def split_timestamp(timestamp): function reduce_video_time (line 351) | def reduce_video_time(txt: str, duration: float = 0.21531): function get_current_country (line 361) | def get_current_country(): function time_to_seconds (line 385) | def time_to_seconds(time_str: str) -> float: function seconds_to_time (line 431) | def seconds_to_time(seconds: float) -> str: function calculate_total_duration (line 437) | def calculate_total_duration(scenes): function add_new_timestamps (line 461) | def add_new_timestamps(scenes): function clean_model_output (line 503) | def clean_model_output(output): function cut_video (line 511) | def cut_video(params, progress_callback=None): function temp_dir (line 557) | def temp_dir(sub_dir: str = ""): function clear_keyframes_cache (line 573) | def clear_keyframes_cache(video_path: str = None): function init_resources (line 602) | def init_resources(): function download_font (line 640) | def download_font(url: str, font_path: str): function init_imagemagick (line 658) | def init_imagemagick(): FILE: app/utils/video_processor.py class VideoProcessor (line 26) | class VideoProcessor: method __init__ (line 27) | def __init__(self, video_path: str): method _get_video_info (line 45) | def _get_video_info(self) -> Dict[str, str]: method extract_frames_by_interval (line 89) | def extract_frames_by_interval(self, output_dir: str, interval_seconds... method _extract_single_frame_optimized (line 188) | def _extract_single_frame_optimized(self, timestamp: float, output_pat... method _try_extract_with_software_decode (line 221) | def _try_extract_with_software_decode(self, timestamp: float, output_p... method _try_extract_with_hwaccel (line 249) | def _try_extract_with_hwaccel(self, timestamp: float, output_path: str... method _try_extract_with_software (line 282) | def _try_extract_with_software(self, timestamp: float, output_path: st... method _try_extract_with_ultra_compatibility (line 311) | def _try_extract_with_ultra_compatibility(self, timestamp: float, outp... method _execute_ffmpeg_command (line 409) | def _execute_ffmpeg_command(self, cmd: List[str], description: str) ->... method _detect_hw_accelerator (line 452) | def _detect_hw_accelerator(self) -> List[str]: method process_video_pipeline (line 464) | def process_video_pipeline(self, method extract_frames_by_interval_ultra_compatible (line 495) | def extract_frames_by_interval_ultra_compatible(self, output_dir: str,... method _extract_frame_ultra_compatible (line 586) | def _extract_frame_ultra_compatible(self, timestamp: float, output_pat... FILE: webui.py function init_log (line 34) | def init_log(): function init_global_state (line 111) | def init_global_state(): function tr (line 122) | def tr(key): function render_generate_button (line 130) | def render_generate_button(): function main (line 225) | def main(): FILE: webui/components/audio_settings.py function get_soulvoice_voices (line 11) | def get_soulvoice_voices(): function get_tts_engine_options (line 22) | def get_tts_engine_options(): function get_tts_engine_descriptions (line 33) | def get_tts_engine_descriptions(): function is_valid_azure_voice_name (line 69) | def is_valid_azure_voice_name(voice_name: str) -> bool: function render_audio_panel (line 83) | def render_audio_panel(tr): function render_tts_settings (line 95) | def render_tts_settings(tr): function render_edge_tts_settings (line 155) | def render_edge_tts_settings(tr): function render_azure_speech_settings (line 257) | def render_azure_speech_settings(tr): function render_tencent_tts_settings (line 381) | def render_tencent_tts_settings(tr): function render_qwen3_tts_settings (line 495) | def render_qwen3_tts_settings(tr): function render_indextts2_tts_settings (line 574) | def render_indextts2_tts_settings(tr): function render_voice_preview_new (line 706) | def render_voice_preview_new(tr, selected_engine): function render_azure_v2_settings (line 784) | def render_azure_v2_settings(tr): function render_voice_parameters (line 803) | def render_voice_parameters(tr, voice_name): function render_voice_preview (line 853) | def render_voice_preview(tr, voice_name): function render_bgm_settings (line 894) | def render_bgm_settings(tr): function get_audio_params (line 932) | def get_audio_params(): FILE: webui/components/basic_settings.py function build_base_url_help (line 19) | def build_base_url_help(provider: str, model_type: str) -> tuple[str, bo... function validate_api_key (line 43) | def validate_api_key(api_key: str, provider: str) -> tuple[bool, str]: function validate_base_url (line 55) | def validate_base_url(base_url: str, provider: str) -> tuple[bool, str]: function validate_model_name (line 67) | def validate_model_name(model_name: str, provider: str) -> tuple[bool, s... function validate_litellm_model_name (line 75) | def validate_litellm_model_name(model_name: str, model_type: str) -> tup... function show_config_validation_errors (line 118) | def show_config_validation_errors(errors: list): function render_basic_settings (line 125) | def render_basic_settings(tr): function render_language_settings (line 144) | def render_language_settings(tr): function render_proxy_settings (line 171) | def render_proxy_settings(tr): function test_vision_model_connection (line 203) | def test_vision_model_connection(api_key, base_url, model_name, provider... function test_litellm_vision_model (line 315) | def test_litellm_vision_model(api_key: str, base_url: str, model_name: s... function test_litellm_text_model (line 437) | def test_litellm_text_model(api_key: str, base_url: str, model_name: str... function render_vision_llm_settings (line 541) | def render_vision_llm_settings(tr): function test_text_model_connection (line 710) | def test_text_model_connection(api_key, base_url, model_name, provider, ... function render_text_llm_settings (line 813) | def render_text_llm_settings(tr): FILE: webui/components/ffmpeg_diagnostics.py function show_ffmpeg_diagnostics (line 20) | def show_ffmpeg_diagnostics(): function show_ffmpeg_settings (line 110) | def show_ffmpeg_settings(): function show_troubleshooting_guide (line 201) | def show_troubleshooting_guide(): function render_ffmpeg_diagnostics_page (line 262) | def render_ffmpeg_diagnostics_page(): FILE: webui/components/script_settings.py function render_script_panel (line 18) | def render_script_panel(tr): function render_script_file (line 51) | def render_script_file(tr, params): function render_video_file (line 225) | def render_video_file(tr, params): function render_short_generate_options (line 273) | def render_short_generate_options(tr): function render_video_details (line 291) | def render_video_details(tr): function short_drama_summary (line 325) | def short_drama_summary(tr): function render_script_buttons (line 404) | def render_script_buttons(tr, params): function load_script (line 450) | def load_script(tr, script_path): function save_script_with_validation (line 464) | def save_script_with_validation(tr, video_clip_json_details): function get_script_params (line 543) | def get_script_params(): FILE: webui/components/subtitle_settings.py function render_subtitle_panel (line 9) | def render_subtitle_panel(tr): function render_font_settings (line 47) | def render_font_settings(tr): function is_disabled_subtitle_settings (line 91) | def is_disabled_subtitle_settings(tts_engine:str)->bool: function render_position_settings (line 95) | def render_position_settings(tr): function render_style_settings (line 130) | def render_style_settings(tr): function get_subtitle_params (line 152) | def get_subtitle_params(): FILE: webui/components/system_settings.py function clear_directory (line 9) | def clear_directory(dir_path, tr): function render_system_panel (line 30) | def render_system_panel(tr): FILE: webui/components/video_settings.py function render_video_panel (line 5) | def render_video_panel(tr): function render_video_config (line 13) | def render_video_config(tr, params): function get_video_params (line 56) | def get_video_params(): FILE: webui/config/settings.py function get_version_from_file (line 7) | def get_version_from_file(): class WebUIConfig (line 23) | class WebUIConfig: method __post_init__ (line 44) | def __post_init__(self): function load_config (line 52) | def load_config(config_path: Optional[str] = None) -> WebUIConfig: function save_config (line 98) | def save_config(config: WebUIConfig, config_path: Optional[str] = None) ... function get_config (line 137) | def get_config() -> WebUIConfig: function update_config (line 146) | def update_config(config_dict: Dict[str, Any]) -> bool: FILE: webui/tools/base.py function create_vision_analyzer (line 16) | def create_vision_analyzer(provider, api_key, model, base_url): function get_batch_timestamps (line 50) | def get_batch_timestamps(batch_files, prev_batch_files=None): function get_batch_files (line 140) | def get_batch_files(keyframe_files, result, batch_size=5): FILE: webui/tools/generate_script_docu.py function generate_script_docu (line 16) | def generate_script_docu(params): FILE: webui/tools/generate_script_short.py function generate_script_short (line 13) | def generate_script_short(tr, params, custom_clips=5): FILE: webui/tools/generate_short_summary.py function parse_and_fix_json (line 26) | def parse_and_fix_json(json_string): function generate_script_short_sunmmary (line 138) | def generate_script_short_sunmmary(params, subtitle_path, video_theme, t... FILE: webui/utils/cache.py function get_fonts_cache (line 6) | def get_fonts_cache(font_dir): function get_video_files_cache (line 18) | def get_video_files_cache(): function get_songs_cache (line 26) | def get_songs_cache(song_dir): FILE: webui/utils/file_utils.py function open_task_folder (line 10) | def open_task_folder(root_dir, task_id): function cleanup_temp_files (line 29) | def cleanup_temp_files(temp_dir, max_age=3600): function get_file_list (line 48) | def get_file_list(directory, file_types=None, sort_by='ctime', reverse=T... function save_uploaded_file (line 89) | def save_uploaded_file(uploaded_file, save_dir, allowed_types=None): function create_temp_file (line 127) | def create_temp_file(prefix='tmp', suffix='', directory=None): function get_file_size (line 150) | def get_file_size(file_path, format='MB'): function ensure_directory (line 176) | def ensure_directory(directory): function create_zip (line 191) | def create_zip(files: list, zip_path: str, base_dir: str = None, folder_... FILE: webui/utils/vision_analyzer.py class VisionAnalyzer (line 7) | class VisionAnalyzer: method __init__ (line 8) | def __init__(self): method initialize_gemini (line 15) | def initialize_gemini(self, api_key: str, model: str, base_url: str) -... method initialize_qwenvl (line 33) | def initialize_qwenvl(self, api_key: str, model: str, base_url: str) -... method analyze_images (line 51) | async def analyze_images(self, images: List[str], prompt: str, batch_s... function create_vision_analyzer (line 72) | def create_vision_analyzer(provider: str, **kwargs) -> VisionAnalyzer: