SYMBOL INDEX (1154 symbols across 211 files) FILE: desktop-client/main.js function createWindow (line 11) | function createWindow() { function isExternalUrl (line 98) | function isExternalUrl(url) { FILE: desktop-client/nodeapi/download.js constant RECORD_MAX (line 10) | const RECORD_MAX = 500; constant LOG_MAX (line 12) | const LOG_MAX = 2000; function isHttpUrl (line 24) | function isHttpUrl(value) { function inferMaterialSubDir (line 34) | function inferMaterialSubDir(materialType, material) { function getFileExtFromUrl (line 42) | function getFileExtFromUrl(url, fallbackExt = ".bin") { function sanitizeFilename (line 52) | function sanitizeFilename(value) { function downloadRemoteMaterialFile (line 57) | async function downloadRemoteMaterialFile(fileUrl, localPath) { function ensureWindowsDraftFilesWritable (line 86) | async function ensureWindowsDraftFilesWritable(rootDir) { constant MAX_DOWNLOAD_ATTEMPTS (line 113) | const MAX_DOWNLOAD_ATTEMPTS = 6; constant GET_DRAFT_FETCH_MAX_ATTEMPTS (line 116) | const GET_DRAFT_FETCH_MAX_ATTEMPTS = 3; constant GET_DRAFT_FETCH_DEADLINE_MS (line 117) | const GET_DRAFT_FETCH_DEADLINE_MS = 3000; constant GET_DRAFT_FETCH_PER_ATTEMPT_MAX_MS (line 118) | const GET_DRAFT_FETCH_PER_ATTEMPT_MAX_MS = 800; constant GET_DRAFT_FETCH_BACKOFF_MS (line 119) | const GET_DRAFT_FETCH_BACKOFF_MS = [120, 200]; function isRetryableGetDraftError (line 121) | function isRetryableGetDraftError(error) { function requestGetDraftOnce (line 132) | async function requestGetDraftOnce(remoteUrl, timeoutMs) { function fetchGetDraftWithRetry (line 141) | async function fetchGetDraftWithRetry(remoteUrl) { function retryDownloadTask (line 184) | async function retryDownloadTask(task, options = {}) { function localizeRemoteMaterialPaths (line 222) | async function localizeRemoteMaterialPaths(materials, draftRootDir, pare... function getConfigPath (line 292) | function getConfigPath() { function readConfig (line 296) | async function readConfig() { function writeConfig (line 307) | async function writeConfig(config) { function ensureAutoDetectedDraftPathInConfig (line 321) | async function ensureAutoDetectedDraftPathInConfig() { function getDownloadLogPath (line 335) | function getDownloadLogPath() { function readDownloadLog (line 339) | async function readDownloadLog() { function appendDownloadLog (line 354) | async function appendDownloadLog(entry, parentWindow) { function clearDownloadLog (line 378) | async function clearDownloadLog() { function getHistoryRecordPath (line 389) | function getHistoryRecordPath() { function readHistoryRecord (line 393) | async function readHistoryRecord() { function appendHistoryRecord (line 408) | async function appendHistoryRecord(entry) { function errorHandler (line 431) | function errorHandler(error = {}, url = "") { function getDraftUrls (line 444) | async function getDraftUrls(remoteUrl, parentWindow) { function updateDraftPath (line 466) | async function updateDraftPath(parentWindow) { function getTargetDirectory (line 514) | async function getTargetDirectory(parentWindow = null, isUpdate = false) { function updateValue (line 586) | function updateValue(current, finalKey, targetDir, oldVal, targetId) { function recursivelyUpdatePaths (line 604) | function recursivelyUpdatePaths(obj, targetDir, targetId) { function downloadJsonFile (line 630) | async function downloadJsonFile( function downloadNotJsonFile (line 686) | async function downloadNotJsonFile( function downloadSingleFile (line 748) | async function downloadSingleFile(config, parentWindow) { function triggerDirectoryScan (line 782) | async function triggerDirectoryScan(targetDir) { function openDraftDirectory (line 846) | async function openDraftDirectory(dirPath) { function getTargetFilePath (line 862) | async function getTargetFilePath(fileUrl, baseTargetDir, targetId) { function downloadFileWithRetry (line 891) | async function downloadFileWithRetry(config, parentWindow, fileIndex) { function downloadFiles (line 949) | async function downloadFiles( function checkUrlAccessRight (line 1069) | async function checkUrlAccessRight(url) { FILE: desktop-client/nodeapi/draftPathDetect.js constant DRAFT_REL_WIN (line 7) | const DRAFT_REL_WIN = path.join( function isConfirmedJianyingDraftDir (line 19) | async function isConfirmedJianyingDraftDir(dir) { function detectWindowsDraftPath (line 41) | async function detectWindowsDraftPath() { function detectMacDraftPath (line 78) | async function detectMacDraftPath() { function detectJianyingDraftRoot (line 94) | async function detectJianyingDraftRoot() { FILE: desktop-client/nodeapi/ipcHandlers.js function setupIpcHandlers (line 25) | function setupIpcHandlers(mainWindow) { FILE: desktop-client/web/src/App.jsx function App (line 22) | function App() { FILE: desktop-client/web/src/components/DownloadButton.jsx function DownloadButton (line 2) | function DownloadButton({ onClick, isLoading, setIsLoading, textValue }) { FILE: desktop-client/web/src/components/DownloadControls.jsx function DownloadControls (line 1) | function DownloadControls({ isOpen, onToggle, isLoading }) { FILE: desktop-client/web/src/components/ExternalWebpage.jsx function ExternalWebpage (line 7) | function ExternalWebpage() { FILE: desktop-client/web/src/components/Header/index.jsx function TopHeader (line 6) | function TopHeader({ onTabChange, selectedTab }) { FILE: desktop-client/web/src/components/LogModule.jsx function LogModule (line 4) | function LogModule({ logs, onClear }) { FILE: desktop-client/web/src/components/Tabs.jsx function Tabs (line 3) | function Tabs({ onTabChange, initialContent }) { FILE: desktop-client/web/src/components/Textarea.jsx function Textarea (line 3) | function Textarea({ value, onChange }) { FILE: desktop-client/web/src/pages/Download/index.jsx function MainPage (line 13) | function MainPage() { FILE: desktop-client/web/src/pages/History/index.jsx function HistoryPage (line 23) | function HistoryPage() { FILE: desktop-client/web/src/utils/const.tsx constant THEME_COLOR (line 5) | const THEME_COLOR = "#5c89ff"; FILE: desktop-client/web/src/utils/date.ts constant DATE_TIME_FORMAT (line 9) | const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss"; constant DATE_TIME_MIN_FORMAT (line 10) | const DATE_TIME_MIN_FORMAT = "YYYY-MM-DD HH:mm"; constant DATE_FORMAT (line 11) | const DATE_FORMAT = "YYYY-MM-DD"; constant TIME_FORMAT (line 12) | const TIME_FORMAT = "HH:mm:ss"; function formatToDateTime (line 14) | function formatToDateTime( function formatToDateTimeMin (line 21) | function formatToDateTimeMin( function formatToDate (line 28) | function formatToDate( function formatToTime (line 35) | function formatToTime( function formatToUTCDate (line 42) | function formatToUTCDate(date: ConfigType = null): string { function toDate (line 47) | function toDate(date?: ConfigType) { function toTimeStamp (line 52) | function toTimeStamp(date?: ConfigType) { FILE: exceptions.py class CustomError (line 4) | class CustomError(Enum): method __init__ (line 62) | def __init__(self, code: int, cn_message: str, en_message: str) -> None: method as_dict (line 67) | def as_dict(self, detail: str = "", lang: str = 'zh') -> dict: class CustomException (line 76) | class CustomException(Exception): method __init__ (line 78) | def __init__(self, err: CustomError, detail: str = "") -> None: FILE: main.py function lifespan (line 12) | async def lifespan(app: FastAPI): FILE: src/middlewares/prepare.py class PrepareMiddleware (line 8) | class PrepareMiddleware(BaseHTTPMiddleware): method dispatch (line 15) | async def dispatch(self, request: Request, call_next): FILE: src/middlewares/response.py class ResponseMiddleware (line 9) | class ResponseMiddleware(BaseHTTPMiddleware): method dispatch (line 16) | async def dispatch(self, request: Request, call_next): method _get_language_from_request (line 39) | def _get_language_from_request(self, request: Request) -> str: method _handle_422_error (line 64) | def _handle_422_error(self, body_str: str, lang: str) -> JSONResponse: method _handle_non_200_response (line 91) | async def _handle_non_200_response(self, response, lang: str) -> JSONR... method _is_json_response (line 113) | def _is_json_response(self, response) -> bool: method _process_json_response (line 117) | async def _process_json_response(self, response, lang: str): method _handle_custom_exception (line 148) | def _handle_custom_exception(self, e: CustomException, lang: str) -> J... method _handle_generic_exception (line 157) | def _handle_generic_exception(self, e: Exception, lang: str) -> JSONRe... FILE: src/middlewares/trace_context.py class TraceContextMiddleware (line 11) | class TraceContextMiddleware(BaseHTTPMiddleware): method dispatch (line 17) | async def dispatch(self, request: Request, call_next) -> Response: FILE: src/pyJianYingDraft/__init__.py function _deprecated_class_warning (line 41) | def _deprecated_class_warning(old_name: str, new_name: str): class Script_file (line 50) | class Script_file: method __new__ (line 52) | def __new__(cls, *args, **kwargs): class Draft_folder (line 56) | class Draft_folder: method __new__ (line 58) | def __new__(cls, *args, **kwargs): class Shrink_mode (line 62) | class Shrink_mode: method __new__ (line 64) | def __new__(cls, *args, **kwargs): class Extend_mode (line 68) | class Extend_mode: method __new__ (line 70) | def __new__(cls, *args, **kwargs): class Clip_settings (line 74) | class Clip_settings: method __new__ (line 76) | def __new__(cls, *args, **kwargs): class Text_style (line 80) | class Text_style: method __new__ (line 82) | def __new__(cls, *args, **kwargs): class Text_border (line 86) | class Text_border: method __new__ (line 88) | def __new__(cls, *args, **kwargs): class Text_background (line 92) | class Text_background: method __new__ (line 94) | def __new__(cls, *args, **kwargs): class Text_segment (line 98) | class Text_segment: method __new__ (line 100) | def __new__(cls, *args, **kwargs): class Audio_segment (line 104) | class Audio_segment: method __new__ (line 106) | def __new__(cls, *args, **kwargs): class Video_segment (line 110) | class Video_segment: method __new__ (line 112) | def __new__(cls, *args, **kwargs): class Sticker_segment (line 116) | class Sticker_segment: method __new__ (line 118) | def __new__(cls, *args, **kwargs): class Effect_segment (line 122) | class Effect_segment: method __new__ (line 124) | def __new__(cls, *args, **kwargs): class Filter_segment (line 128) | class Filter_segment: method __new__ (line 130) | def __new__(cls, *args, **kwargs): class Video_material (line 134) | class Video_material: method __new__ (line 136) | def __new__(cls, *args, **kwargs): class Audio_material (line 140) | class Audio_material: method __new__ (line 142) | def __new__(cls, *args, **kwargs): class Crop_settings (line 146) | class Crop_settings: method __new__ (line 148) | def __new__(cls, *args, **kwargs): class _DeprecatedEnum (line 153) | class _DeprecatedEnum: method __init__ (line 155) | def __init__(self, original_enum, old_name, new_name): method __getattr__ (line 160) | def __getattr__(self, name): method __getitem__ (line 165) | def __getitem__(self, name): method __repr__ (line 170) | def __repr__(self): class Jianying_controller (line 191) | class Jianying_controller: method __new__ (line 193) | def __new__(cls, *args, **kwargs): FILE: src/pyJianYingDraft/animation.py class Animation (line 14) | class Animation: method __init__ (line 34) | def __init__(self, animation_meta: AnimationMeta, start: int, duration... method export_json (line 42) | def export_json(self) -> Dict[str, Any]: class VideoAnimation (line 59) | class VideoAnimation(Animation): method __init__ (line 64) | def __init__(self, animation_type: Union[IntroType, OutroType, GroupAn... class Text_animation (line 77) | class Text_animation(Animation): method __init__ (line 82) | def __init__(self, animation_type: Union[TextIntro, TextOutro, TextLoo... class SegmentAnimations (line 95) | class SegmentAnimations: method __init__ (line 106) | def __init__(self): method get_animation_trange (line 110) | def get_animation_trange(self, animation_type: Literal["in", "out", "g... method add_animation (line 117) | def add_animation(self, animation: Union[VideoAnimation, Text_animatio... method export_json (line 134) | def export_json(self) -> Dict[str, Any]: FILE: src/pyJianYingDraft/assets/__init__.py function get_asset_path (line 17) | def get_asset_path(asset_name: str) -> Path: FILE: src/pyJianYingDraft/audio_segment.py class AudioFade (line 20) | class AudioFade: method __init__ (line 31) | def __init__(self, in_duration: int, out_duration: int): method export_json (line 38) | def export_json(self) -> Dict[str, Any]: class AudioEffect (line 47) | class AudioEffect: method __init__ (line 63) | def __init__(self, effect_meta: Union[AudioSceneEffectType, ToneEffect... method export_json (line 89) | def export_json(self) -> Dict[str, Any]: class AudioSegment (line 106) | class AudioSegment(MediaSegment): method __init__ (line 124) | def __init__(self, material: Union[AudioMaterial, str], target_timeran... method add_effect (line 160) | def add_effect(self, effect_type: Union[AudioSceneEffectType, ToneEffe... method add_fade (line 183) | def add_fade(self, in_duration: Union[str, int], out_duration: Union[s... method add_keyframe (line 204) | def add_keyframe(self, time_offset: int, volume: float) -> "AudioSegme... method export_json (line 221) | def export_json(self) -> Dict[str, Any]: FILE: src/pyJianYingDraft/draft_folder.py class DraftFolder (line 11) | class DraftFolder: method __init__ (line 17) | def __init__(self, folder_path: str): method list_drafts (line 31) | def list_drafts(self) -> List[str]: method has_draft (line 38) | def has_draft(self, draft_name: str) -> bool: method remove (line 48) | def remove(self, draft_name: str) -> None: method create_draft (line 63) | def create_draft(self, draft_name: str, width: int, height: int, fps: ... method inspect_material (line 104) | def inspect_material(self, draft_name: str) -> None: method load_template (line 120) | def load_template(self, draft_name: str) -> ScriptFile: method duplicate_as_template (line 141) | def duplicate_as_template(self, template_name: str, new_draft_name: st... FILE: src/pyJianYingDraft/effect_segment.py class EffectSegment (line 11) | class EffectSegment(BaseSegment): method __init__ (line 20) | def __init__(self, effect_type: Union[VideoSceneEffectType, VideoChara... class FilterSegment (line 25) | class FilterSegment(BaseSegment): method __init__ (line 34) | def __init__(self, meta: FilterType, target_timerange: Timerange, inte... FILE: src/pyJianYingDraft/exceptions.py class TrackNotFound (line 3) | class TrackNotFound(NameError): class AmbiguousTrack (line 5) | class AmbiguousTrack(ValueError): class SegmentOverlap (line 7) | class SegmentOverlap(ValueError): class MaterialNotFound (line 10) | class MaterialNotFound(NameError): class AmbiguousMaterial (line 12) | class AmbiguousMaterial(ValueError): class ExtensionFailed (line 15) | class ExtensionFailed(ValueError): class DraftNotFound (line 18) | class DraftNotFound(NameError): class AutomationError (line 20) | class AutomationError(Exception): class ExportTimeout (line 22) | class ExportTimeout(Exception): FILE: src/pyJianYingDraft/jianying_controller.py class ExportResolution (line 30) | class ExportResolution(Enum): class ExportFramerate (line 39) | class ExportFramerate(Enum): class ControlFinder (line 47) | class ControlFinder: method desc_matcher (line 51) | def desc_matcher(target_desc: str, depth: int = 2, exact: bool = False... method class_name_matcher (line 62) | def class_name_matcher(class_name: str, depth: int = 1, exact: bool = ... class JianyingController (line 72) | class JianyingController: method __init__ (line 85) | def __init__(self): method find_and_click_draft (line 89) | def find_and_click_draft(self, draft_name: str, max_retries: int = 5, ... method click_export_button (line 130) | def click_export_button(self) -> None: method get_original_export_path (line 143) | def get_original_export_path(self) -> str: method set_export_resolution (line 161) | def set_export_resolution(self, resolution: Optional[ExportResolution]... method set_export_framerate (line 188) | def set_export_framerate(self, framerate: Optional[ExportFramerate]) -... method click_final_export_button (line 215) | def click_final_export_button(self) -> None: method __ensure_window_focus (line 227) | def __ensure_window_focus(self) -> None: method wait_for_export_completion (line 244) | def wait_for_export_completion(self, timeout: float) -> None: method return_to_home (line 278) | def return_to_home(self) -> None: method move_exported_file (line 284) | def move_exported_file(self, original_path: str, output_path: Optional... method export_draft (line 295) | def export_draft(self, draft_name: str, output_path: Optional[str] = N... method switch_to_home (line 362) | def switch_to_home(self) -> None: method get_window (line 384) | def get_window( method init_export_sub_status (line 438) | def init_export_sub_status(self) -> None: method __jianying_window_cmp (line 457) | def __jianying_window_cmp(self, control: uia.WindowControl, depth: int... FILE: src/pyJianYingDraft/keyframe.py class Keyframe (line 6) | class Keyframe: method __init__ (line 16) | def __init__(self, time_offset: int, value: float): method export_json (line 23) | def export_json(self) -> Dict[str, Any]: class KeyframeProperty (line 36) | class KeyframeProperty(Enum): class KeyframeList (line 65) | class KeyframeList: method __init__ (line 75) | def __init__(self, keyframe_property: KeyframeProperty): method add_keyframe (line 82) | def add_keyframe(self, time_offset: int, value: float): method export_json (line 88) | def export_json(self) -> Dict[str, Any]: FILE: src/pyJianYingDraft/local_materials.py class CropSettings (line 8) | class CropSettings: method __init__ (line 20) | def __init__(self, *, upper_left_x: float = 0.0, upper_left_y: float =... method export_json (line 34) | def export_json(self) -> Dict[str, Any]: class VideoMaterial (line 46) | class VideoMaterial: method __init__ (line 68) | def __init__(self, path: str, material_name: Optional[str] = None, cro... method export_json (line 117) | def export_json(self) -> Dict[str, Any]: class AudioMaterial (line 139) | class AudioMaterial: method __init__ (line 152) | def __init__(self, path: str, material_name: Optional[str] = None): method export_json (line 180) | def export_json(self) -> Dict[str, Any]: FILE: src/pyJianYingDraft/metadata/audio_scene_effect.py class AudioSceneEffectType (line 6) | class AudioSceneEffectType(EffectEnum): FILE: src/pyJianYingDraft/metadata/effect_meta.py class EffectParam (line 8) | class EffectParam: method __init__ (line 20) | def __init__(self, name: str, default_value: float, min_value: float, ... class EffectParamInstance (line 26) | class EffectParamInstance(EffectParam): method __init__ (line 34) | def __init__(self, meta: EffectParam, index: int, value: float): method export_json (line 39) | def export_json(self) -> Dict[str, Any]: class EffectMeta (line 51) | class EffectMeta: method __init__ (line 68) | def __init__(self, name: str, is_vip: bool, resource_id: str, effect_i... method parse_params (line 76) | def parse_params(self, params: Optional[List[Optional[float]]]) -> Lis... class EffectEnum (line 95) | class EffectEnum(Enum): method from_name (line 99) | def from_name(cls: "type[EffectEnumSubclass]", name: str) -> EffectEnu... class AnimationMeta (line 115) | class AnimationMeta: method __init__ (line 127) | def __init__(self, title: str, is_vip: bool, duration: float, resource... class MaskMeta (line 136) | class MaskMeta: method __init__ (line 154) | def __init__(self, name: str, resource_type: str, resource_id: str, ef... class TransitionMeta (line 164) | class TransitionMeta: method __init__ (line 183) | def __init__(self, name: str, is_vip: bool, resource_id: str, effect_i... FILE: src/pyJianYingDraft/metadata/filter_meta.py class FilterType (line 6) | class FilterType(EffectEnum): FILE: src/pyJianYingDraft/metadata/font_meta.py class FontType (line 6) | class FontType(EffectEnum): FILE: src/pyJianYingDraft/metadata/mask_meta.py class MaskType (line 5) | class MaskType(EffectEnum): FILE: src/pyJianYingDraft/metadata/mix_mode_meta.py class MixModeType (line 5) | class MixModeType(EffectEnum): FILE: src/pyJianYingDraft/metadata/speech_to_song.py class SpeechToSongType (line 4) | class SpeechToSongType(EffectEnum): FILE: src/pyJianYingDraft/metadata/text_intro.py class TextIntro (line 5) | class TextIntro(EffectEnum): FILE: src/pyJianYingDraft/metadata/text_loop.py class TextLoopAnim (line 5) | class TextLoopAnim(EffectEnum): FILE: src/pyJianYingDraft/metadata/text_outro.py class TextOutro (line 5) | class TextOutro(EffectEnum): FILE: src/pyJianYingDraft/metadata/tone_effect.py class ToneEffectType (line 4) | class ToneEffectType(EffectEnum): FILE: src/pyJianYingDraft/metadata/transition_meta.py class TransitionType (line 5) | class TransitionType(EffectEnum): FILE: src/pyJianYingDraft/metadata/video_character_effect.py class VideoCharacterEffectType (line 6) | class VideoCharacterEffectType(EffectEnum): FILE: src/pyJianYingDraft/metadata/video_group_animation.py class GroupAnimationType (line 5) | class GroupAnimationType(EffectEnum): FILE: src/pyJianYingDraft/metadata/video_intro.py class IntroType (line 5) | class IntroType(EffectEnum): FILE: src/pyJianYingDraft/metadata/video_outro.py class OutroType (line 5) | class OutroType(EffectEnum): FILE: src/pyJianYingDraft/metadata/video_scene_effect.py class VideoSceneEffectType (line 6) | class VideoSceneEffectType(EffectEnum): FILE: src/pyJianYingDraft/script_file.py class ScriptMaterial (line 24) | class ScriptMaterial: method __init__ (line 58) | def __init__(self): method __contains__ (line 77) | def __contains__(self, item: Union[VideoMaterial, AudioMaterial]) -> b... method __contains__ (line 79) | def __contains__(self, item: Union[AudioFade, AudioEffect]) -> bool: ... method __contains__ (line 81) | def __contains__(self, item: Union[SegmentAnimations, VideoEffect, Tra... method __contains__ (line 83) | def __contains__(self, item) -> bool: method export_json (line 105) | def export_json(self) -> Dict[str, List[Any]]: class ScriptFile (line 154) | class ScriptFile: method __init__ (line 187) | def __init__(self, width: int, height: int, fps: int, maintrack_adsorb... method load_template (line 216) | def load_template(json_path: str) -> "ScriptFile": method add_material (line 241) | def add_material(self, material: Union[VideoMaterial, AudioMaterial]) ... method next_track_render_index (line 253) | def next_track_render_index(self) -> int: method add_track_ordered (line 259) | def add_track_ordered(self, track_type: TrackType, track_name: Optiona... method add_track (line 264) | def add_track(self, track_type: TrackType, track_name: Optional[str] =... method _get_track (line 299) | def _get_track(self, segment_type: Type[BaseSegment], track_name: Opti... method add_segment (line 312) | def add_segment(self, segment: Union[VideoSegment, StickerSegment, Aud... method add_effect (line 400) | def add_effect(self, effect: Union[VideoSceneEffectType, VideoCharacte... method add_filter (line 429) | def add_filter(self, filter_meta: FilterType, t_range: Timerange, method import_srt (line 455) | def import_srt(self, srt_path: str, track_name: str, *, method get_imported_track (line 534) | def get_imported_track(self, track_type: Literal[TrackType.video, Trac... method import_track (line 570) | def import_track(self, source_file: "ScriptFile", track: EditableTrack... method replace_material_by_name (line 627) | def replace_material_by_name(self, material_name: str, material: Union... method replace_material_by_seg (line 665) | def replace_material_by_seg(self, track: EditableTrack, segment_index:... method replace_text (line 711) | def replace_text(self, track: EditableTrack, segment_index: int, text:... method inspect_material (line 799) | def inspect_material(self) -> None: method dumps (line 816) | def dumps(self) -> str: method dump (line 838) | def dump(self, file_path: str) -> None: method save (line 843) | def save(self) -> None: FILE: src/pyJianYingDraft/segment.py class BaseSegment (line 10) | class BaseSegment: method __init__ (line 23) | def __init__(self, material_id: str, target_timerange: Timerange): method start (line 31) | def start(self) -> int: method start (line 35) | def start(self, value: int): method duration (line 39) | def duration(self) -> int: method duration (line 43) | def duration(self, value: int): method end (line 47) | def end(self) -> int: method overlaps (line 51) | def overlaps(self, other: "BaseSegment") -> bool: method export_json (line 55) | def export_json(self) -> Dict[str, Any]: class Speed (line 79) | class Speed: method __init__ (line 87) | def __init__(self, speed: float): method export_json (line 91) | def export_json(self) -> Dict[str, Any]: class AudioFade (line 100) | class AudioFade: method __init__ (line 111) | def __init__(self, in_duration: int, out_duration: int): method export_json (line 118) | def export_json(self) -> Dict[str, Any]: class ClipSettings (line 127) | class ClipSettings: method __init__ (line 147) | def __init__(self, *, alpha: float = 1.0, method export_json (line 171) | def export_json(self) -> Dict[str, Any]: class MediaSegment (line 181) | class MediaSegment(BaseSegment): method __init__ (line 196) | def __init__(self, material_id: str, source_timerange: Optional[Timera... method export_json (line 207) | def export_json(self) -> Dict[str, Any]: class VisualSegment (line 219) | class VisualSegment(MediaSegment): method __init__ (line 234) | def __init__(self, material_id: str, source_timerange: Optional[Timera... method add_keyframe (line 253) | def add_keyframe(self, _property: KeyframeProperty, time_offset: Union... method export_json (line 282) | def export_json(self) -> Dict[str, Any]: FILE: src/pyJianYingDraft/template_mode.py class ShrinkMode (line 15) | class ShrinkMode(Enum): class ExtendMode (line 29) | class ExtendMode(Enum): class ImportedSegment (line 43) | class ImportedSegment(BaseSegment): method __init__ (line 50) | def __init__(self, json_data: Dict[str, Any]): method export_json (line 55) | def export_json(self) -> Dict[str, Any]: class ImportedMediaSegment (line 60) | class ImportedMediaSegment(ImportedSegment): method __init__ (line 67) | def __init__(self, json_data: Dict[str, Any]): method export_json (line 72) | def export_json(self) -> Dict[str, Any]: class ImportedTrack (line 78) | class ImportedTrack(BaseTrack): method __init__ (line 84) | def __init__(self, json_data: Dict[str, Any]): method export_json (line 92) | def export_json(self) -> Dict[str, Any]: class EditableTrack (line 100) | class EditableTrack(ImportedTrack): method __len__ (line 106) | def __len__(self): method start_time (line 110) | def start_time(self) -> int: method end_time (line 117) | def end_time(self) -> int: method export_json (line 123) | def export_json(self) -> Dict[str, Any]: class ImportedTextTrack (line 132) | class ImportedTextTrack(EditableTrack): method __init__ (line 135) | def __init__(self, json_data: Dict[str, Any]): class ImportedMediaTrack (line 139) | class ImportedMediaTrack(EditableTrack): method __init__ (line 145) | def __init__(self, json_data: Dict[str, Any]): method check_material_type (line 149) | def check_material_type(self, material: object) -> bool: method process_timerange (line 157) | def process_timerange(self, seg_index: int, src_timerange: Timerange, function import_track (line 214) | def import_track(json_data: Dict[str, Any]) -> ImportedTrack: FILE: src/pyJianYingDraft/text_segment.py class TextStyle (line 17) | class TextStyle: method __init__ (line 50) | def __init__(self, *, size: float = 8.0, bold: bool = False, italic: b... class TextBorder (line 87) | class TextBorder: method __init__ (line 97) | def __init__(self, *, alpha: float = 1.0, color: Tuple[float, float, f... method export_json (line 108) | def export_json(self) -> Dict[str, Any]: class TextBackground (line 120) | class TextBackground: method __init__ (line 141) | def __init__(self, *, color: str, style: Literal[1, 2] = 1, alpha: flo... method export_json (line 165) | def export_json(self) -> Dict[str, Any]: class TextBubble (line 178) | class TextBubble: method __init__ (line 187) | def __init__(self, effect_id: str, resource_id: str): method export_json (line 192) | def export_json(self) -> Dict[str, Any]: class TextEffect (line 203) | class TextEffect(TextBubble): method export_json (line 206) | def export_json(self) -> Dict[str, Any]: class TextShadow (line 212) | class TextShadow: method __init__ (line 226) | def __init__(self, *, alpha: float = 1.0, color: Tuple[float, float, f... method export_json (line 242) | def export_json(self) -> Dict[str, Any]: class TextSegment (line 255) | class TextSegment(VisualSegment): method __init__ (line 279) | def __init__(self, text: str, timerange: Timerange, *, method create_from_template (line 312) | def create_from_template(cls, text: str, timerange: Timerange, templat... method add_animation (line 331) | def add_animation(self, animation_type: Union[TextIntro, TextOutro, Te... method add_bubble (line 374) | def add_bubble(self, effect_id: str, resource_id: str) -> "TextSegment": method add_effect (line 385) | def add_effect(self, effect_id: str) -> "TextSegment": method export_material (line 395) | def export_material(self) -> Dict[str, Any]: FILE: src/pyJianYingDraft/time_util.py function tim (line 9) | def tim(inp: Union[str, float]) -> int: class Timerange (line 34) | class Timerange: method __init__ (line 41) | def __init__(self, start: int, duration: int): method import_json (line 53) | def import_json(cls, json_obj: Dict[str, str]) -> "Timerange": method end (line 58) | def end(self) -> int: method __eq__ (line 62) | def __eq__(self, other: object) -> bool: method overlaps (line 67) | def overlaps(self, other: "Timerange") -> bool: method __repr__ (line 71) | def __repr__(self) -> str: method __str__ (line 74) | def __str__(self) -> str: method export_json (line 77) | def export_json(self) -> Dict[str, int]: function trange (line 80) | def trange(start: Union[str, float], duration: Union[str, float]) -> Tim... function srt_tstamp (line 91) | def srt_tstamp(srt_tstamp: str) -> int: FILE: src/pyJianYingDraft/track.py class Track_meta (line 19) | class Track_meta: class TrackType (line 31) | class TrackType(Enum): method from_name (line 48) | def from_name(name: str) -> "TrackType": class BaseTrack (line 56) | class BaseTrack(ABC): method export_json (line 69) | def export_json(self) -> Dict[str, Any]: ... class Track (line 72) | class Track(BaseTrack, Generic[Seg_type]): method __init__ (line 81) | def __init__(self, track_type: TrackType, name: str, render_index: int... method end_time (line 91) | def end_time(self) -> int: method accept_segment_type (line 98) | def accept_segment_type(self) -> Type[Seg_type]: method add_segment (line 102) | def add_segment(self, segment: Seg_type) -> "Track[Seg_type]": method export_json (line 124) | def export_json(self) -> Dict[str, Any]: FILE: src/pyJianYingDraft/util.py function provide_ctor_defaults (line 10) | def provide_ctor_defaults(cls: Type) -> Dict[str, Any]: function assign_attr_with_json (line 31) | def assign_attr_with_json(obj: object, attrs: List[str], json_data: Dict... function export_attr_to_json (line 47) | def export_attr_to_json(obj: object, attrs: List[str]) -> Dict[str, Json... FILE: src/pyJianYingDraft/video_segment.py class Mask (line 23) | class Mask: method __init__ (line 46) | def __init__(self, mask_meta: MaskMeta, method export_json (line 61) | def export_json(self) -> Dict[str, Any]: class VideoEffect (line 84) | class VideoEffect: method __init__ (line 102) | def __init__(self, effect_meta: Union[VideoSceneEffectType, VideoChara... method export_json (line 123) | def export_json(self) -> Dict[str, Any]: class Filter (line 148) | class Filter: method __init__ (line 162) | def __init__(self, meta: EffectMeta, intensity: float, *, method export_json (line 171) | def export_json(self) -> Dict[str, Any]: class Transition (line 205) | class Transition: method __init__ (line 222) | def __init__(self, effect_meta: TransitionType, duration: Optional[int... method export_json (line 232) | def export_json(self) -> Dict[str, Any]: class BackgroundFilling (line 247) | class BackgroundFilling: method __init__ (line 259) | def __init__(self, fill_type: Literal["canvas_blur", "canvas_color"], ... method export_json (line 265) | def export_json(self) -> Dict[str, Any]: class MixMode (line 274) | class MixMode: method __init__ (line 289) | def __init__(self, meta: EffectMeta, *, method export_json (line 297) | def export_json(self) -> Dict[str, Any]: class VideoSegment (line 315) | class VideoSegment(VisualSegment): method __init__ (line 360) | def __init__(self, material: Union[VideoMaterial, str], target_timeran... method add_animation (line 404) | def add_animation(self, animation_type: Union[IntroType, OutroType, Gr... method add_effect (line 435) | def add_effect(self, effect_type: Union[VideoSceneEffectType, VideoCha... method add_fade (line 456) | def add_fade(self, in_duration: Union[str, int], out_duration: Union[s... method add_filter (line 477) | def add_filter(self, filter_type: FilterType, intensity: float = 100.0... method set_mix_mode (line 490) | def set_mix_mode(self, mode: MixModeType) -> "VideoSegment": method add_mask (line 502) | def add_mask(self, mask_type: MaskType, *, center_x: float = 0.0, cent... method add_transition (line 538) | def add_transition(self, transition_type: TransitionType, *, duration:... method add_background_filling (line 556) | def add_background_filling(self, fill_type: Literal["blur", "color"], ... method export_json (line 582) | def export_json(self) -> Dict[str, Any]: class StickerSegment (line 589) | class StickerSegment(VisualSegment): method __init__ (line 595) | def __init__(self, resource_id: str, target_timerange: Timerange, *, c... method export_material (line 608) | def export_material(self) -> Dict[str, Any]: FILE: src/router/v1.py function create_draft (line 67) | def create_draft(cdr: CreateDraftRequest) -> CreateDraftResponse: function save_draft (line 81) | async def save_draft(sdr: SaveDraftRequest) -> SaveDraftResponse: function add_videos (line 96) | async def add_videos(avr: AddVideosRequest) -> AddVideosResponse: function add_audios (line 124) | async def add_audios(aar: AddAudiosRequest) -> AddAudiosResponse: function add_images (line 140) | async def add_images(air: AddImagesRequest) -> AddImagesResponse: function add_sticker (line 167) | async def add_sticker(asr: AddStickerRequest) -> AddStickerResponse: function add_keyframes (line 194) | async def add_keyframes(akr: AddKeyframesRequest) -> AddKeyframesResponse: function add_captions (line 214) | async def add_captions(acr: AddCaptionsRequest) -> AddCaptionsResponse: function add_effects (line 258) | async def add_effects(aer: AddEffectsRequest) -> AddEffectsResponse: function add_filters (line 279) | async def add_filters(afr: AddFiltersRequest) -> AddFiltersResponse: function add_masks (line 300) | async def add_masks(amr: AddMasksRequest) -> AddMasksResponse: function add_text_style (line 330) | def add_text_style(atsr: AddTextStyleRequest) -> AddTextStyleResponse: function easy_create_material (line 349) | async def easy_create_material(ecmr: EasyCreateMaterialRequest) -> EasyC... function get_text_animations (line 373) | def get_text_animations(gtar: GetTextAnimationsRequest) -> GetTextAnimat... function get_image_animations (line 390) | def get_image_animations(giar: GetImageAnimationsRequest) -> GetImageAni... function get_filters (line 407) | def get_filters(gfr: GetFiltersRequest) -> GetFiltersResponse: function get_text_effects (line 423) | def get_text_effects(gter: GetTextEffectsRequest) -> GetTextEffectsRespo... function get_effects (line 441) | def get_effects(ger: GetEffectsRequest) -> GetEffectsResponse: function get_draft (line 457) | def get_draft(params: Annotated[GetDraftRequest, Depends()]) -> GetDraft... function gen_video (line 471) | def gen_video(request: Request, gvr: GenVideoRequest) -> GenVideoResponse: function gen_video_status (line 486) | def gen_video_status(gvsr: GenVideoStatusRequest) -> GenVideoStatusRespo... function gen_video_active_count (line 500) | def gen_video_active_count() -> GenVideoActiveCountResponse: function get_audio_duration (line 509) | def get_audio_duration(gadr: GetAudioDurationRequest) -> GetAudioDuratio... function timelines (line 523) | def timelines(request: TimelinesRequest) -> TimelinesResponse: function audio_timelines (line 541) | def audio_timelines(request: AudioTimelinesRequest) -> AudioTimelinesRes... function audio_infos (line 556) | def audio_infos(request: AudioInfosRequest) -> AudioInfosResponse: function imgs_infos (line 574) | def imgs_infos(request: ImgsInfosRequest) -> ImgsInfosResponse: function caption_infos (line 600) | def caption_infos(request: CaptionInfosRequest) -> CaptionInfosResponse: function effect_infos (line 629) | def effect_infos(request: EffectInfosRequest) -> EffectInfosResponse: function filter_infos (line 645) | def filter_infos(request: FilterInfosRequest) -> FilterInfosResponse: function keyframes_infos (line 662) | def keyframes_infos(request: KeyframesInfosRequest) -> KeyframesInfosRes... function video_infos (line 682) | def video_infos(request: VideoInfosRequest) -> VideoInfosResponse: function search_sticker (line 704) | def search_sticker(ssr: SearchStickerRequest) -> SearchStickerResponse: function get_url (line 718) | def get_url(gur: GetUrlRequest) -> GetUrlResponse: function str_list_to_objs (line 732) | def str_list_to_objs(slto: StrListToObjsRequest) -> StrListToObjsResponse: function str_to_list (line 746) | def str_to_list(stl: StrToListRequest) -> StrToListResponse: function objs_to_str_list (line 760) | def objs_to_str_list(otl: ObjsToStrListRequest) -> ObjsToStrListResponse: FILE: src/schemas/add_audios.py class AddAudiosRequest (line 6) | class AddAudiosRequest(BaseModel): method validate_audio_infos_http_urls (line 13) | def validate_audio_infos_http_urls(cls, value: str) -> str: class AddAudiosResponse (line 32) | class AddAudiosResponse(BaseModel): FILE: src/schemas/add_captions.py class ShadowInfo (line 5) | class ShadowInfo(BaseModel): class AddCaptionsRequest (line 14) | class AddCaptionsRequest(BaseModel): class CaptionItem (line 39) | class CaptionItem(BaseModel): class SegmentInfo (line 61) | class SegmentInfo(BaseModel): class AddCaptionsResponse (line 68) | class AddCaptionsResponse(BaseModel): FILE: src/schemas/add_effects.py class AddEffectsRequest (line 5) | class AddEffectsRequest(BaseModel): class EffectItem (line 11) | class EffectItem(BaseModel): class AddEffectsResponse (line 18) | class AddEffectsResponse(BaseModel): FILE: src/schemas/add_filters.py class AddFiltersRequest (line 5) | class AddFiltersRequest(BaseModel): class FilterItem (line 11) | class FilterItem(BaseModel): class AddFiltersResponse (line 19) | class AddFiltersResponse(BaseModel): FILE: src/schemas/add_images.py class AddImagesRequest (line 6) | class AddImagesRequest(BaseModel): method validate_image_infos_http_urls (line 18) | def validate_image_infos_http_urls(cls, value: str) -> str: class SegmentInfo (line 37) | class SegmentInfo(BaseModel): class AddImagesResponse (line 44) | class AddImagesResponse(BaseModel): FILE: src/schemas/add_keyframes.py class AddKeyframesRequest (line 5) | class AddKeyframesRequest(BaseModel): class KeyframeItem (line 11) | class KeyframeItem(BaseModel): class AddKeyframesResponse (line 19) | class AddKeyframesResponse(BaseModel): FILE: src/schemas/add_masks.py class AddMasksRequest (line 5) | class AddMasksRequest(BaseModel): class AddMasksResponse (line 20) | class AddMasksResponse(BaseModel): FILE: src/schemas/add_sticker.py class AddStickerRequest (line 4) | class AddStickerRequest(BaseModel): class AddStickerResponse (line 14) | class AddStickerResponse(BaseModel): FILE: src/schemas/add_text_style.py class AddTextStyleRequest (line 4) | class AddTextStyleRequest(BaseModel): class AddTextStyleResponse (line 13) | class AddTextStyleResponse(BaseModel): FILE: src/schemas/add_videos.py class SceneTimelineItem (line 6) | class SceneTimelineItem(BaseModel): class AddVideosRequest (line 12) | class AddVideosRequest(BaseModel): method validate_video_infos_http_urls (line 25) | def validate_video_infos_http_urls(cls, value: str) -> str: class SegmentInfo (line 44) | class SegmentInfo(BaseModel): class AddVideosResponse (line 51) | class AddVideosResponse(BaseModel): FILE: src/schemas/audio_infos.py class AudioInfosRequest (line 6) | class AudioInfosRequest(BaseModel): class AudioInfosResponse (line 14) | class AudioInfosResponse(BaseModel): FILE: src/schemas/audio_timelines.py class AudioTimelinesRequest (line 5) | class AudioTimelinesRequest(BaseModel): class TimelineItem (line 10) | class TimelineItem(BaseModel): class AudioTimelinesResponse (line 16) | class AudioTimelinesResponse(BaseModel): FILE: src/schemas/caption_infos.py class CaptionInfosRequest (line 6) | class CaptionInfosRequest(BaseModel): class CaptionInfosResponse (line 27) | class CaptionInfosResponse(BaseModel): FILE: src/schemas/create_draft.py class CreateDraftRequest (line 4) | class CreateDraftRequest(BaseModel): class CreateDraftResponse (line 10) | class CreateDraftResponse(BaseModel): FILE: src/schemas/easy_create_material.py class EasyCreateMaterialRequest (line 5) | class EasyCreateMaterialRequest(BaseModel): method _is_http_url (line 17) | def _is_http_url(url: str) -> bool: method validate_audio_url (line 22) | def validate_audio_url(cls, value: str) -> str: method validate_optional_media_url (line 30) | def validate_optional_media_url(cls, value: Optional[str]) -> Optional... class EasyCreateMaterialResponse (line 39) | class EasyCreateMaterialResponse(BaseModel): FILE: src/schemas/effect_infos.py class EffectInfosRequest (line 6) | class EffectInfosRequest(BaseModel): class EffectInfosResponse (line 12) | class EffectInfosResponse(BaseModel): FILE: src/schemas/filter_infos.py class FilterInfosRequest (line 6) | class FilterInfosRequest(BaseModel): method validate_intensities (line 14) | def validate_intensities(cls, v): class FilterInfosResponse (line 21) | class FilterInfosResponse(BaseModel): FILE: src/schemas/gen_video.py class GenVideoRequest (line 7) | class GenVideoRequest(BaseModel): method validate_api_key (line 14) | def validate_api_key(cls, v): class GenVideoResponse (line 24) | class GenVideoResponse(BaseModel): FILE: src/schemas/gen_video_active_count.py class GenVideoActiveCountResponse (line 5) | class GenVideoActiveCountResponse(BaseModel): FILE: src/schemas/gen_video_status.py class GenVideoStatusRequest (line 8) | class GenVideoStatusRequest(BaseModel): class GenVideoStatusResponse (line 13) | class GenVideoStatusResponse(BaseModel): FILE: src/schemas/get_audio_duration.py class GetAudioDurationRequest (line 4) | class GetAudioDurationRequest(BaseModel): class Config (line 11) | class Config: class GetAudioDurationResponse (line 19) | class GetAudioDurationResponse(BaseModel): class Config (line 27) | class Config: FILE: src/schemas/get_draft.py class GetDraftRequest (line 5) | class GetDraftRequest(BaseModel): class GetDraftResponse (line 10) | class GetDraftResponse(BaseModel): FILE: src/schemas/get_effects.py class GetEffectsRequest (line 5) | class GetEffectsRequest(BaseModel): class EffectItem (line 10) | class EffectItem(BaseModel): class GetEffectsResponse (line 20) | class GetEffectsResponse(BaseModel): FILE: src/schemas/get_filters.py class GetFiltersRequest (line 5) | class GetFiltersRequest(BaseModel): class FilterItem (line 10) | class FilterItem(BaseModel): class GetFiltersResponse (line 19) | class GetFiltersResponse(BaseModel): FILE: src/schemas/get_image_animations.py class GetImageAnimationsRequest (line 8) | class GetImageAnimationsRequest(BaseModel): class ImageAnimationItem (line 14) | class ImageAnimationItem(BaseModel): class GetImageAnimationsResponse (line 32) | class GetImageAnimationsResponse(BaseModel): FILE: src/schemas/get_text_animations.py class GetTextAnimationsRequest (line 8) | class GetTextAnimationsRequest(BaseModel): class TextAnimationItem (line 14) | class TextAnimationItem(BaseModel): class GetTextAnimationsResponse (line 32) | class GetTextAnimationsResponse(BaseModel): FILE: src/schemas/get_text_effects.py class GetTextEffectsRequest (line 5) | class GetTextEffectsRequest(BaseModel): class TextEffectItem (line 10) | class TextEffectItem(BaseModel): class GetTextEffectsResponse (line 17) | class GetTextEffectsResponse(BaseModel): FILE: src/schemas/get_url.py class GetUrlRequest (line 4) | class GetUrlRequest(BaseModel): class GetUrlResponse (line 9) | class GetUrlResponse(BaseModel): FILE: src/schemas/imgs_infos.py class ImgsInfosRequest (line 6) | class ImgsInfosRequest(BaseModel): class ImgsInfosResponse (line 22) | class ImgsInfosResponse(BaseModel): FILE: src/schemas/keyframes_infos.py class SegmentInfoItem (line 5) | class SegmentInfoItem(BaseModel): class KeyframesInfosRequest (line 12) | class KeyframesInfosRequest(BaseModel): class KeyframesInfosResponse (line 22) | class KeyframesInfosResponse(BaseModel): FILE: src/schemas/objs_to_str_list.py class ObjItem (line 5) | class ObjItem(BaseModel): class ObjsToStrListRequest (line 10) | class ObjsToStrListRequest(BaseModel): class ObjsToStrListResponse (line 15) | class ObjsToStrListResponse(BaseModel): FILE: src/schemas/save_draft.py class SaveDraftRequest (line 4) | class SaveDraftRequest(BaseModel): class SaveDraftResponse (line 9) | class SaveDraftResponse(BaseModel): FILE: src/schemas/search_sticker.py class StickerPackage (line 5) | class StickerPackage(BaseModel): class LargeImage (line 12) | class LargeImage(BaseModel): class StickerInfo (line 17) | class StickerInfo(BaseModel): class StickerItem (line 26) | class StickerItem(BaseModel): class SearchStickerRequest (line 33) | class SearchStickerRequest(BaseModel): class SearchStickerResponse (line 38) | class SearchStickerResponse(BaseModel): FILE: src/schemas/str_list_to_objs.py class StrListToObjsItem (line 5) | class StrListToObjsItem(BaseModel): class StrListToObjsRequest (line 10) | class StrListToObjsRequest(BaseModel): class StrListToObjsResponse (line 15) | class StrListToObjsResponse(BaseModel): FILE: src/schemas/str_to_list.py class StrToListRequest (line 5) | class StrToListRequest(BaseModel): class StrToListResponse (line 10) | class StrToListResponse(BaseModel): FILE: src/schemas/timelines.py class TimelineItem (line 5) | class TimelineItem(BaseModel): class TimelinesRequest (line 11) | class TimelinesRequest(BaseModel): class TimelinesResponse (line 19) | class TimelinesResponse(BaseModel): FILE: src/schemas/video_infos.py class VideoInfosRequest (line 6) | class VideoInfosRequest(BaseModel): class VideoInfosResponse (line 18) | class VideoInfosResponse(BaseModel): FILE: src/service/add_audios.py function add_audios (line 18) | def add_audios( function _prepare_audios_local_files (line 40) | def _prepare_audios_local_files(draft_url: str, audio_infos: str) -> Lis... function _add_audios_internal (line 54) | def _add_audios_internal( function add_audios_async (line 85) | async def add_audios_async( function validate_and_get_draft_id (line 157) | def validate_and_get_draft_id(draft_url: str) -> str: function create_audio_directory (line 166) | def create_audio_directory(draft_id: str) -> str: function validate_audio_data (line 175) | def validate_audio_data(audios: List[Dict[str, Any]], draft_id: str): function add_audio_track (line 183) | def add_audio_track(script: ScriptFile) -> str: function add_audio_segments (line 192) | def add_audio_segments(script: ScriptFile, track_name: str, draft_audio_... function get_track_id (line 206) | def get_track_id(script: ScriptFile, track_name: str) -> str: function find_audio_effect_type (line 216) | def find_audio_effect_type(audio_effect: str): function convert_params_to_range (line 251) | def convert_params_to_range(effect_type) -> list: function add_audio_effect (line 275) | def add_audio_effect(audio_segment, audio_effect: str): function add_audio_to_draft (line 299) | def add_audio_to_draft( function download_audio_file (line 371) | def download_audio_file(audio: dict, draft_audio_dir: str) -> str: function get_audio_actual_duration (line 378) | def get_audio_actual_duration(audio_path: str) -> int: function process_audio_duration (line 386) | def process_audio_duration(audio: dict, actual_duration: int): function calculate_adjusted_time_range (line 393) | def calculate_adjusted_time_range(audio: dict, actual_duration: int): function update_audio_time_params (line 429) | def update_audio_time_params(audio: dict, start_time: int, end_time: int): function create_audio_segment (line 435) | def create_audio_segment(audio_path: str, start_time: int, segment_durat... function add_segment_with_overlap_handling (line 445) | def add_segment_with_overlap_handling(script: ScriptFile, track_name: st... function parse_audio_data (line 492) | def parse_audio_data(json_str: str) -> List[Dict[str, Any]]: function parse_json_string (line 520) | def parse_json_string(json_str: str) -> List[Dict[str, Any]]: function validate_input_format (line 531) | def validate_input_format(data: Any): function process_single_audio_item (line 538) | def process_single_audio_item(item: Any, index: int) -> Dict[str, Any]: function validate_item_type (line 556) | def validate_item_type(item: Any, index: int): function validate_required_fields (line 563) | def validate_required_fields(item: Dict[str, Any], index: int): function create_processed_item (line 573) | def create_processed_item(item: Dict[str, Any]) -> Dict[str, Any]: function validate_numeric_ranges (line 585) | def validate_numeric_ranges(processed_item: Dict[str, Any], index: int): FILE: src/service/add_captions.py function resolve_font_type (line 23) | def resolve_font_type(font_name: str) -> Optional[FontType]: function add_captions (line 94) | def add_captions( function add_captions_async (line 265) | async def add_captions_async( function add_caption_to_draft (line 384) | def add_caption_to_draft( function apply_keyword_highlight (line 663) | def apply_keyword_highlight(text_segment: TextSegment, keywords: str, ke... function parse_captions_data (line 736) | def parse_captions_data(json_str: str) -> List[Dict[str, Any]]: function map_animation_name_to_enum (line 839) | def map_animation_name_to_enum(animation_name: str, animation_type: str): function hex_to_rgb (line 881) | def hex_to_rgb(hex_color: str) -> tuple: FILE: src/service/add_effects.py function add_effects (line 14) | def add_effects( function add_effects_async (line 99) | async def add_effects_async( function add_effect_to_draft (line 161) | def add_effect_to_draft( function find_effect_type_by_name (line 217) | def find_effect_type_by_name(effect_title: str) -> Optional[Union[VideoS... function parse_effects_data (line 245) | def parse_effects_data(json_str: str) -> List[Dict[str, Any]]: FILE: src/service/add_filters.py function add_filters (line 14) | def add_filters( function add_filters_async (line 100) | async def add_filters_async( function add_filter_to_draft (line 162) | def add_filter_to_draft( function find_filter_type_by_name (line 223) | def find_filter_type_by_name(filter_title: str) -> Optional[FilterType]: function parse_filters_data (line 245) | def parse_filters_data(json_str: str) -> List[Dict[str, Any]]: FILE: src/service/add_images.py function add_images (line 20) | def add_images( function _prepare_images_local_files (line 80) | def _prepare_images_local_files(draft_url: str, image_infos: str) -> Lis... function _add_images_internal (line 106) | def _add_images_internal( function add_images_async (line 185) | async def add_images_async( function add_image_to_draft (line 272) | def add_image_to_draft( function map_video_animation_name_to_enum (line 454) | def map_video_animation_name_to_enum(animation_name: str, animation_type... function parse_image_data (line 496) | def parse_image_data(json_str: str) -> List[Dict[str, Any]]: FILE: src/service/add_keyframes.py function add_keyframes (line 16) | def add_keyframes( function add_keyframes_async (line 150) | async def add_keyframes_async( function find_segment_by_id (line 212) | def find_segment_by_id(script: ScriptFile, segment_id: str) -> Optional[... function parse_keyframes_data (line 239) | def parse_keyframes_data(json_str: str) -> List[Dict[str, Any]]: FILE: src/service/add_masks.py function add_masks (line 14) | def add_masks( function add_masks_async (line 118) | async def add_masks_async( function add_mask_to_segment (line 208) | def add_mask_to_segment( function find_segment_by_id (line 330) | def find_segment_by_id(script: ScriptFile, segment_id: str) -> Optional[... function calculate_mask_size_params (line 357) | def calculate_mask_size_params( function find_mask_type_by_name (line 391) | def find_mask_type_by_name(mask_name: str) -> Optional[MaskType]: FILE: src/service/add_sticker.py function add_sticker (line 14) | def add_sticker( function add_sticker_async (line 140) | async def add_sticker_async( FILE: src/service/add_text_style.py function add_text_style (line 7) | def add_text_style( function parse_keywords (line 79) | def parse_keywords(keyword_str: str) -> List[str]: function find_keyword_positions (line 102) | def find_keyword_positions(text: str, keywords: List[str]) -> List[Tuple... function hex_to_rgb (line 137) | def hex_to_rgb(hex_color: str) -> List[float]: function generate_text_styles (line 167) | def generate_text_styles( function create_text_style_segment (line 233) | def create_text_style_segment( function create_simple_text_style (line 275) | def create_simple_text_style(text: str, font_size: int) -> str: FILE: src/service/add_videos.py function add_videos (line 20) | def add_videos( function _prepare_videos_local_files (line 88) | def _prepare_videos_local_files(draft_url: str, video_infos: str) -> Lis... function add_videos_async (line 114) | async def add_videos_async( function _add_videos_internal (line 206) | def _add_videos_internal( function _is_valid_scene_timeline (line 321) | def _is_valid_scene_timeline(scene_timeline: Any) -> bool: function _has_valid_scene_timelines (line 333) | def _has_valid_scene_timelines( function add_video_to_draft (line 347) | def add_video_to_draft( function find_transition_type_by_name (line 480) | def find_transition_type_by_name(transition_name: str) -> Optional[draft... function parse_video_data (line 500) | def parse_video_data(json_str: str) -> List[Dict[str, Any]]: FILE: src/service/audio_infos.py function audio_infos (line 6) | def audio_infos( FILE: src/service/audio_timelines.py function audio_timelines (line 10) | def audio_timelines(links: List[str]) -> Tuple[List[dict], List[dict]]: function _calculate_timelines (line 67) | def _calculate_timelines(durations: List[int]) -> Tuple[List[dict], List... function _cleanup_temp_files (line 94) | def _cleanup_temp_files(temp_files: List[str]) -> None: FILE: src/service/caption_infos.py function caption_infos (line 6) | def caption_infos( function _build_caption_info (line 77) | def _build_caption_info(text, timeline, index, keywords, FILE: src/service/create_draft.py function create_draft (line 12) | def create_draft(width: int, height: int) -> str: FILE: src/service/easy_create_material.py function easy_create_material (line 17) | def easy_create_material( function easy_create_material_async (line 96) | async def easy_create_material_async( function add_video_material (line 177) | def add_video_material(script: ScriptFile, draft_id: str, video_url: str... function add_image_material (line 235) | def add_image_material(script: ScriptFile, draft_id: str, img_url: str) ... function add_audio_material (line 291) | def add_audio_material(script: ScriptFile, draft_id: str, audio_url: str... function add_text_material (line 346) | def add_text_material( function hex_to_rgb (line 409) | def hex_to_rgb(hex_color: str) -> list: function validate_url (line 439) | def validate_url(url: str) -> bool: FILE: src/service/effect_infos.py function effect_infos (line 6) | def effect_infos( FILE: src/service/filter_infos.py function filter_infos (line 6) | def filter_infos( FILE: src/service/gen_video.py function gen_video (line 8) | def gen_video(draft_url: str, apiKey: str = None) -> str: function validate_draft_url (line 58) | def validate_draft_url(draft_url: str) -> None: function extract_draft_id_from_url (line 76) | def extract_draft_id_from_url(draft_url: str) -> str: function gen_video_status (line 90) | def gen_video_status(draft_url: str) -> dict: function get_task_status_info (line 116) | def get_task_status_info(draft_url: str) -> dict: function get_gen_video_active_count (line 138) | def get_gen_video_active_count() -> int: FILE: src/service/get_audio_duration.py function get_audio_duration (line 10) | def get_audio_duration(mp3_url: str) -> int: function _cleanup_temp_file (line 54) | def _cleanup_temp_file(temp_file_path: Optional[str]) -> None: FILE: src/service/get_draft.py function gen_download_url (line 8) | def gen_download_url(file_path: str) -> str: function batch_gen_download_url (line 32) | def batch_gen_download_url(file_paths: List[str]) -> List[str]: function get_draft (line 48) | def get_draft(draft_id: str) -> List[str]: FILE: src/service/get_effects.py function get_effects (line 10) | def get_effects(mode: int = 0) -> List[Dict[str, Any]]: function _get_effects_by_mode (line 48) | def _get_effects_by_mode(mode: int) -> List[Dict[str, Any]]: FILE: src/service/get_filters.py function get_filters (line 10) | def get_filters(mode: int = 0) -> List[Dict[str, Any]]: function _get_filters_by_mode (line 48) | def _get_filters_by_mode(mode: int) -> List[Dict[str, Any]]: FILE: src/service/get_image_animations.py function get_image_animations (line 10) | def get_image_animations(mode: int = 0, type: str = "in") -> List[Dict[s... function _get_animations_by_type_and_mode (line 53) | def _get_animations_by_type_and_mode(type: str, mode: int) -> List[Dict[... function _get_mock_image_animation_data (line 87) | def _get_mock_image_animation_data() -> List[Dict[str, Any]]: FILE: src/service/get_text_animations.py function get_text_animations (line 10) | def get_text_animations(mode: int = 0, type: str = "in") -> List[Dict[st... function _get_animations_by_type_and_mode (line 53) | def _get_animations_by_type_and_mode(type: str, mode: int) -> List[Dict[... function _get_mock_animation_data (line 87) | def _get_mock_animation_data() -> List[Dict[str, Any]]: FILE: src/service/get_text_effects.py function _load_huazi_data (line 17) | def _load_huazi_data() -> None: function resolve_text_effect (line 55) | def resolve_text_effect(effect_identifier: str) -> Optional[Dict[str, An... function get_text_effects (line 95) | def get_text_effects(mode: int = 0) -> List[Dict[str, Any]]: function _get_text_effects_by_mode (line 133) | def _get_text_effects_by_mode(mode: int) -> List[Dict[str, Any]]: FILE: src/service/get_url.py function get_url (line 6) | def get_url(output: str) -> str: FILE: src/service/imgs_infos.py function imgs_infos (line 6) | def imgs_infos( function _parse_animation_params (line 73) | def _parse_animation_params(in_animation, out_animation, loop_animation,... function _build_image_info (line 88) | def _build_image_info(img_url, timeline, height, width, i, function _add_animation_with_extension_logic (line 114) | def _add_animation_with_extension_logic(info, animation_key, animations,... FILE: src/service/keyframes_infos.py function calculate_relative_time_offset (line 7) | def calculate_relative_time_offset(offset_percent: int, duration: int) -... function keyframes_infos (line 21) | def keyframes_infos( FILE: src/service/objs_to_str_list.py function objs_to_str_list (line 6) | def objs_to_str_list(outputs: List[Dict[str, Any]]) -> List[str]: FILE: src/service/save_draft.py function save_draft (line 12) | def save_draft(draft_url: str) -> str: function save_draft_async (line 40) | async def save_draft_async(draft_url: str, lock_timeout: float = 30.0) -... FILE: src/service/search_sticker.py function search_sticker (line 9) | def search_sticker(keyword: str) -> List[Dict[str, Any]]: FILE: src/service/str_list_to_objs.py function str_list_to_objs (line 6) | def str_list_to_objs(infos: List[str]) -> List[Dict[str, Any]]: FILE: src/service/str_to_list.py function str_to_list (line 7) | def str_to_list(obj: str) -> List[str]: FILE: src/service/timelines.py function timelines (line 5) | def timelines(duration: int, num: int, start: int, type: int) -> Tuple[L... FILE: src/service/video_infos.py function video_infos (line 6) | def video_infos( FILE: src/utils/cos.py function cos_upload_file (line 14) | def cos_upload_file(file_path: str, expire_days: Optional[int] = None) -... FILE: src/utils/download.py function download (line 45) | def download(url: str, save_dir: str, limit: int = DEFAULT_FILE_SIZE_LIMIT, function cleanup_temp_file (line 71) | def cleanup_temp_file(temp_file_path: Optional[str]) -> None: function _prepare_download_context (line 85) | def _prepare_download_context(url: str, save_dir: str, timeout: int) -> ... function _execute_download_with_retry (line 119) | def _execute_download_with_retry(context: dict, limit: int, retry: int) ... function _check_resume_conditions (line 198) | def _check_resume_conditions(save_path: str, supports_range: bool, function _execute_single_download (line 231) | def _execute_single_download(url: str, resume_info: dict, timeouts: dict... function _handle_download_exception (line 251) | def _handle_download_exception(exception: Exception, attempt: int, retry... function _execute_retry_wait (line 301) | def _execute_retry_wait(attempt: int, error_category: str, consecutive_f... function _handle_final_failure (line 325) | def _handle_final_failure(last_exception: Optional[Exception], url: str)... function _determine_file_path_with_extension (line 344) | def _determine_file_path_with_extension(response: requests.Response, sav... function _parse_api_response (line 362) | def _parse_api_response(response: requests.Response) -> Dict[str, Any]: function _validate_download_integrity_with_resume (line 381) | def _validate_download_integrity_with_resume( function _safe_remove_file (line 435) | def _safe_remove_file(file_path: str) -> None: function _assess_network_quality (line 450) | def _assess_network_quality(url: str) -> str: function _check_range_support_with_retry (line 500) | def _check_range_support_with_retry(url: str, max_retries: int = 2) -> b... function _calculate_adaptive_timeouts (line 591) | def _calculate_adaptive_timeouts(network_quality: str, base_timeout: int... function _create_optimized_session (line 626) | def _create_optimized_session() -> requests.Session: function _download_with_resume_enhanced (line 662) | def _download_with_resume_enhanced(url: str, resume_pos: int, timeouts: ... function _download_fresh_enhanced (line 718) | def _download_fresh_enhanced(url: str, timeouts: dict) -> requests.Respo... function _download_file_with_enhanced_stability (line 764) | def _download_file_with_enhanced_stability( function _classify_download_error (line 864) | def _classify_download_error(error: Exception) -> str: function _should_cleanup_on_error (line 899) | def _should_cleanup_on_error(error_category: str, supports_range: bool, ... function _calculate_retry_delay (line 927) | def _calculate_retry_delay(attempt: int, error_category: str, consecutiv... FILE: src/utils/draft_cache.py function update_cache (line 9) | def update_cache(key: str, value: draft.ScriptFile) -> None: FILE: src/utils/draft_cleanup.py function is_draft_directory_name (line 32) | def is_draft_directory_name(name: str) -> bool: function _draft_sort_key (line 36) | def _draft_sort_key(draft_id: str) -> tuple[datetime.datetime, str]: function list_sorted_draft_ids (line 42) | def list_sorted_draft_ids(draft_dir: str) -> list[str]: function select_drafts_for_deletion (line 54) | def select_drafts_for_deletion( function delete_draft_folders (line 71) | def delete_draft_folders(draft_dir: str, draft_ids: Iterable[str]) -> li... function run_one_draft_cleanup (line 98) | def run_one_draft_cleanup( function draft_cleanup_background_loop (line 143) | async def draft_cleanup_background_loop() -> None: FILE: src/utils/draft_downloader.py function _sleep_gateway_backoff (line 25) | def _sleep_gateway_backoff(retry_no: int) -> None: function safe_write_file (line 31) | def safe_write_file(file_path: str, file_content: bytes, is_binary: bool... function extract_draft_id_from_url (line 79) | def extract_draft_id_from_url(url: str) -> Optional[str]: function download_draft (line 99) | def download_draft(draft_url: str, save_path: Optional[str] = None) -> b... function get_draft_files_list (line 135) | def get_draft_files_list(draft_url: str) -> list: function download_all_files (line 209) | def download_all_files(files: list, target_dir: str, draft_id: str) -> b... function download_single_file (line 239) | def download_single_file(file_url: str, target_dir: str) -> bool: function update_json_file_paths (line 345) | def update_json_file_paths(json_file_path: str, target_dir: str, draft_i... function update_material_paths (line 381) | def update_material_paths(data, remote_prefix: str, local_prefix: str): function update_single_path (line 439) | def update_single_path(path: str, remote_prefix: str, local_prefix: str)... function _is_http_url (line 462) | def _is_http_url(value: Any) -> bool: function _safe_name (line 469) | def _safe_name(name: str) -> str: function _infer_local_subdir (line 473) | def _infer_local_subdir(material_type: str, material: Dict[str, Any]) ->... function _infer_ext_from_url (line 481) | def _infer_ext_from_url(url: str, fallback: str) -> str: function _download_remote_file (line 489) | def _download_remote_file(file_url: str, local_path: str) -> bool: function localize_remote_material_paths (line 542) | def localize_remote_material_paths(data: Dict[str, Any], target_dir: str... function trigger_directory_scan_with_robocopy (line 595) | def trigger_directory_scan_with_robocopy(target_dir: str): function copy_with_robocopy (line 614) | def copy_with_robocopy(src: str, dst: str, verbose: bool = False) -> bool: function prepare_target_directory (line 749) | def prepare_target_directory(save_path: str, draft_id: str) -> str: function execute_download (line 765) | def execute_download(draft_url: str, target_dir: str, draft_id: str) -> ... function get_file_path (line 814) | def get_file_path(response: requests.Response, target_dir: str, draft_id... function extract_filename_from_response (line 831) | def extract_filename_from_response(response: requests.Response, draft_id... function sanitize_filename (line 854) | def sanitize_filename(filename: str) -> str: function batch_download_drafts (line 876) | def batch_download_drafts(draft_urls: list, save_path: Optional[str] = N... function initialize_batch_results (line 896) | def initialize_batch_results() -> dict: function process_single_draft (line 910) | def process_single_draft(url: str, save_path: Optional[str], results: di... function finalize_batch_results (line 928) | def finalize_batch_results(results: dict, draft_urls: list) -> None: FILE: src/utils/draft_lock_manager.py class DraftLockManager (line 11) | class DraftLockManager: method __new__ (line 30) | def __new__(cls): method __init__ (line 36) | def __init__(self): method acquire_lock (line 56) | async def acquire_lock(self, draft_id: str, timeout: Optional[float] =... method release_lock (line 132) | async def release_lock(self, draft_id: str) -> None: method is_locked (line 190) | def is_locked(self, draft_id: str) -> bool: method get_lock_count (line 212) | def get_lock_count(self, draft_id: str) -> int: method get_all_locked_drafts (line 229) | def get_all_locked_drafts(self) -> list: method clear_all_locks (line 247) | async def clear_all_locks(self) -> None: method get_stats (line 267) | def get_stats(self) -> dict: function get_draft_lock_manager (line 291) | def get_draft_lock_manager() -> DraftLockManager: FILE: src/utils/helper.py function get_url_param (line 13) | def get_url_param(url: str, key: str, default=None): function gen_unique_id (line 21) | def gen_unique_id() -> str: function get_all_files (line 30) | def get_all_files(dir: str) -> list: FILE: src/utils/keyframe_value.py function normalize_keyframe_value (line 10) | def normalize_keyframe_value( FILE: src/utils/logger.py class SkipGenVideoStatusAccessLogFilter (line 16) | class SkipGenVideoStatusAccessLogFilter(logging.Filter): method filter (line 21) | def filter(self, record: logging.LogRecord) -> bool: class RelativePathFormatter (line 25) | class RelativePathFormatter(logging.Formatter): method __init__ (line 26) | def __init__(self, *args, project_root: Optional[str] = None, **kwargs): method format (line 31) | def format(self, record: logging.LogRecord) -> str: function _install_trace_context_filters (line 71) | def _install_trace_context_filters() -> None: FILE: src/utils/media.py function get_media_duration (line 7) | def get_media_duration(file_path: str) -> Optional[int]: function get_media_duration_formatted (line 77) | def get_media_duration_formatted(file_path: str) -> Optional[str]: FILE: src/utils/oss.py function oss_upload_file (line 18) | def oss_upload_file(file_path: str, expire_days: Optional[int] = None) -... FILE: src/utils/points.py function get_user_points (line 19) | def get_user_points(api_key: str) -> float: function deduct_user_points (line 58) | def deduct_user_points(api_key: str, points: float, desc: str) -> bool: function _extract_points_from_response (line 100) | def _extract_points_from_response(result: Dict[str, Any]) -> float: function _parse_api_response (line 121) | def _parse_api_response(response: requests.Response) -> Dict[str, Any]: function _call_user_api (line 140) | def _call_user_api(method: str, endpoint: str, params: Optional[dict] = ... FILE: src/utils/storage_upload_retry.py function _iter_exception_chain (line 40) | def _iter_exception_chain(exc: BaseException) -> Iterator[BaseException]: function is_retryable_storage_error (line 50) | def is_retryable_storage_error(exc: BaseException) -> bool: function run_with_storage_retry (line 95) | def run_with_storage_retry(operation: Callable[[], T], *, context: str =... FILE: src/utils/trace_context.py function get_trace_id (line 30) | def get_trace_id() -> Optional[str]: function get_span_id (line 34) | def get_span_id() -> Optional[str]: function _gen_trace_id (line 38) | def _gen_trace_id() -> str: function _gen_span_id (line 42) | def _gen_span_id() -> str: function parse_traceparent (line 46) | def parse_traceparent(value: str) -> Optional[Tuple[str, str]]: function build_traceparent (line 66) | def build_traceparent(trace_id: str, span_id: str, sampled: bool = True)... function _normalize_custom_request_id (line 72) | def _normalize_custom_request_id(raw: str) -> str: function resolve_trace_from_headers (line 84) | def resolve_trace_from_headers(header_getter) -> Tuple[str, str]: class TraceContextFilter (line 104) | class TraceContextFilter(logging.Filter): method filter (line 107) | def filter(self, record: logging.LogRecord) -> bool: FILE: src/utils/upload_file.py function _is_valid_storage_config (line 11) | def _is_valid_storage_config(value: str) -> bool: function _is_cos_configured (line 17) | def _is_cos_configured() -> bool: function _is_oss_configured (line 25) | def _is_oss_configured() -> bool: function upload_file (line 38) | def upload_file(file_path: str, expire_days: Optional[int] = None) -> str: FILE: src/utils/video_task_manager.py class UIAutomationInitializerInThread (line 42) | class UIAutomationInitializerInThread: # type: ignore method __enter__ (line 43) | def __enter__(self): method __exit__ (line 45) | def __exit__(self, *args): class TaskStatus (line 49) | class TaskStatus(Enum): class VideoGenTask (line 58) | class VideoGenTask: class VideoGenTaskManager (line 73) | class VideoGenTaskManager: method __new__ (line 85) | def __new__(cls): method __init__ (line 92) | def __init__(self): method submit_task (line 134) | def submit_task(self, draft_url: str, api_key: str = None) -> None: method _add_task_to_queue_sync (line 173) | def _add_task_to_queue_sync(self, task: VideoGenTask) -> None: method get_task_status (line 178) | def get_task_status(self, draft_url: str) -> Optional[Dict[str, Any]]: method get_active_render_count (line 206) | def get_active_render_count(self) -> int: method _ensure_worker_running (line 214) | def _ensure_worker_running(self): method _worker_loop (line 222) | def _worker_loop(self): method _async_worker_loop (line 235) | async def _async_worker_loop(self): method _log_async_task_done (line 249) | def _log_async_task_done(self, fut: asyncio.Task) -> None: method _persist_terminal_task (line 257) | def _persist_terminal_task(self, task: VideoGenTask) -> None: method _run_upload_and_finalize (line 279) | async def _run_upload_and_finalize(self, task: VideoGenTask) -> None: method _process_task (line 307) | async def _process_task(self, task: VideoGenTask): method _check_draft_duration (line 360) | def _check_draft_duration(self, task: VideoGenTask) -> bool: method _phase_download_and_prepare (line 427) | def _phase_download_and_prepare(self, task: VideoGenTask) -> str: method _phase_export_only (line 462) | def _phase_export_only(self, task: VideoGenTask) -> str: method _phase_cos_upload_finalize (line 498) | def _phase_cos_upload_finalize(self, task: VideoGenTask) -> Tuple[str,... method _download_draft (line 516) | def _download_draft(self, task: VideoGenTask) -> bool: method _export_video (line 537) | def _export_video(self, task: VideoGenTask, outfile: str) -> bool: method _upload_video_to_cos (line 597) | def _upload_video_to_cos(self, outfile: str) -> Tuple[str, bool]: method _calculate_and_charge (line 621) | def _calculate_and_charge(self, task: VideoGenTask, outfile: str) -> N... method _cleanup_files (line 666) | def _cleanup_files(self, outfile: str, draft_id: str) -> None: method _handle_result (line 688) | def _handle_result(self, upload_url: str, upload_failed: bool) -> Tupl... method stop (line 706) | def stop(self): FILE: src/utils/video_task_store.py function _connect (line 26) | def _connect() -> sqlite3.Connection: function _init_schema (line 34) | def _init_schema(conn: sqlite3.Connection) -> None: function _ensure_schema (line 59) | def _ensure_schema() -> None: function prune_if_needed (line 71) | def prune_if_needed() -> None: function save_completed_result (line 112) | def save_completed_result( function get_completed_by_draft_id (line 152) | def get_completed_by_draft_id(draft_id: str) -> Optional[Dict[str, Any]]: FILE: tests/manual_test_audio_infos.py function audio_infos (line 3) | def audio_infos( function test_audio_infos (line 40) | def test_audio_infos(): FILE: tests/manual_test_caption_infos.py function caption_infos (line 3) | def caption_infos( function test_caption_infos (line 85) | def test_caption_infos(): FILE: tests/manual_test_effect_infos.py function effect_infos (line 4) | def effect_infos( function test_effect_infos (line 32) | def test_effect_infos(): FILE: tests/manual_test_imgs_infos.py function imgs_infos (line 3) | def imgs_infos( function test_imgs_infos (line 72) | def test_imgs_infos(): FILE: tests/manual_test_keyframes_infos.py function keyframes_infos (line 4) | def keyframes_infos( function test_keyframes_infos (line 60) | def test_keyframes_infos(): FILE: tests/manual_test_video_infos.py function video_infos (line 4) | def video_infos( function test_video_infos (line 62) | def test_video_infos(): FILE: tests/test_add_audios.py function test_add_audios (line 5) | def test_add_audios(): FILE: tests/test_add_captions_text_effect.py function test_resolve_text_effect (line 9) | def test_resolve_text_effect(): function test_text_effect_map (line 46) | def test_text_effect_map(): function test_add_captions_with_text_effect (line 57) | def test_add_captions_with_text_effect(): FILE: tests/test_add_images.py function test_add_images (line 5) | def test_add_images(): FILE: tests/test_add_keyframes_normalize.py function visual_segment (line 17) | def visual_segment(): function test_add_keyframes_normalizes_pixel_position_x (line 24) | def test_add_keyframes_normalizes_pixel_position_x(visual_segment): function test_add_keyframes_rotation_value_unchanged (line 60) | def test_add_keyframes_rotation_value_unchanged(visual_segment): function test_add_keyframes_uniform_scale_and_alpha_unchanged (line 77) | def test_add_keyframes_uniform_scale_and_alpha_unchanged(visual_segment): function test_keyframes_infos_normalizes_pixels_for_position (line 104) | def test_keyframes_infos_normalizes_pixels_for_position(): FILE: tests/test_add_keyframes_refactor.py function test_parse_keyframes_data (line 9) | def test_parse_keyframes_data(): function test_parse_invalid_keyframes_data (line 48) | def test_parse_invalid_keyframes_data(): FILE: tests/test_add_masks.py class TestCalculateMaskSizeParams (line 29) | class TestCalculateMaskSizeParams(unittest.TestCase): method test_circle_mask_size_calculation (line 32) | def test_circle_mask_size_calculation(self): method test_rectangle_mask_size_calculation (line 55) | def test_rectangle_mask_size_calculation(self): method test_heart_mask_size_calculation (line 79) | def test_heart_mask_size_calculation(self): method test_star_mask_size_calculation (line 99) | def test_star_mask_size_calculation(self): method test_linear_mask_size_calculation (line 119) | def test_linear_mask_size_calculation(self): method test_mirror_mask_size_calculation (line 139) | def test_mirror_mask_size_calculation(self): method test_zero_dimensions (line 159) | def test_zero_dimensions(self): method test_large_dimensions (line 178) | def test_large_dimensions(self): class TestFindMaskTypeByName (line 200) | class TestFindMaskTypeByName(unittest.TestCase): method test_find_circle_mask (line 203) | def test_find_circle_mask(self): method test_find_rectangle_mask (line 208) | def test_find_rectangle_mask(self): method test_find_linear_mask (line 213) | def test_find_linear_mask(self): method test_find_mirror_mask (line 218) | def test_find_mirror_mask(self): method test_find_heart_mask (line 223) | def test_find_heart_mask(self): method test_find_star_mask (line 228) | def test_find_star_mask(self): method test_find_invalid_mask (line 233) | def test_find_invalid_mask(self): method test_case_sensitive_search (line 238) | def test_case_sensitive_search(self): class TestAddMaskToSegment (line 248) | class TestAddMaskToSegment(unittest.TestCase): method setUp (line 251) | def setUp(self): method test_add_circle_mask_success (line 269) | def test_add_circle_mask_success(self): method test_add_rectangle_mask_with_all_params (line 310) | def test_add_rectangle_mask_with_all_params(self): method test_segment_not_found (line 344) | def test_segment_not_found(self): method test_non_video_segment (line 358) | def test_non_video_segment(self): method test_segment_already_has_mask (line 375) | def test_segment_already_has_mask(self, mock_find_segment): class TestAddMasksIntegration (line 394) | class TestAddMasksIntegration(unittest.TestCase): method test_add_single_circle_mask (line 401) | def test_add_single_circle_mask(self, mock_add_mask, mock_find_mask_ty... method test_add_multiple_masks (line 447) | def test_add_multiple_masks(self, mock_add_mask, mock_find_mask_type, ... method test_invalid_draft_url (line 476) | def test_invalid_draft_url(self, mock_cache, mock_get_param): method test_empty_segment_ids (line 490) | def test_empty_segment_ids(self, mock_get_param, mock_cache): method test_invalid_mask_type (line 507) | def test_invalid_mask_type(self, mock_find_mask_type, mock_get_param, ... method test_partial_failure_handling (line 526) | def test_partial_failure_handling(self, mock_add_mask, mock_find_mask_... FILE: tests/test_add_videos_concurrent.py class TestAddVideosAsync (line 25) | class TestAddVideosAsync: method mock_draft_data (line 29) | def mock_draft_data(self): method test_add_videos_with_lock_success (line 46) | async def test_add_videos_with_lock_success(self, mock_draft_data): method test_add_videos_invalid_draft_url (line 95) | async def test_add_videos_invalid_draft_url(self): method test_add_videos_lock_timeout (line 106) | async def test_add_videos_lock_timeout(self): method test_concurrent_add_videos_same_draft (line 140) | async def test_concurrent_add_videos_same_draft(self): method test_concurrent_add_videos_different_drafts (line 215) | async def test_concurrent_add_videos_different_drafts(self): class TestAddVideosInternal (line 275) | class TestAddVideosInternal: method test_internal_function_requires_lock (line 279) | async def test_internal_function_requires_lock(self): class TestLockManagerIntegration (line 300) | class TestLockManagerIntegration: method test_lock_cleanup_after_exception (line 304) | async def test_lock_cleanup_after_exception(self): method test_lock_stats_accuracy (line 325) | async def test_lock_stats_accuracy(self): FILE: tests/test_add_videos_concurrent_demo.py class TestConcurrentProtectionDemo (line 16) | class TestConcurrentProtectionDemo: method test_same_draft_serialized_access (line 20) | async def test_same_draft_serialized_access(self): method test_different_drafts_parallel_access (line 64) | async def test_different_drafts_parallel_access(self): method test_lock_prevents_concurrent_writes (line 102) | async def test_lock_prevents_concurrent_writes(self): function main (line 154) | async def main(): FILE: tests/test_add_videos_duration.py function test_add_videos_with_duration (line 5) | def test_add_videos_with_duration(): FILE: tests/test_add_videos_refactor.py function test_parse_video_data_with_duration (line 8) | def test_parse_video_data_with_duration(): FILE: tests/test_all_text_effects.py function test_total_count (line 8) | def test_total_count(): function test_resolve_by_name (line 22) | def test_resolve_by_name(): function test_resolve_by_id (line 47) | def test_resolve_by_id(): function test_random_effects (line 65) | def test_random_effects(): function test_filter_by_mode (line 85) | def test_filter_by_mode(): function test_special_characters (line 110) | def test_special_characters(): function test_export_capability (line 137) | def test_export_capability(): function main (line 159) | def main(): FILE: tests/test_api_version.py function test_v1_create_draft (line 8) | def test_v1_create_draft(): function test_version_not_found (line 17) | def test_version_not_found(): FILE: tests/test_audio_infos.py function test_audio_infos (line 9) | def test_audio_infos(): FILE: tests/test_audio_infos_simple.py function test_audio_infos (line 10) | def test_audio_infos(): FILE: tests/test_audio_timelines.py function test_audio_timelines (line 8) | def test_audio_timelines(): FILE: tests/test_caption_keywords.py function test_caption_keywords (line 5) | def test_caption_keywords(): FILE: tests/test_caption_transform.py function test_caption_transform (line 5) | def test_caption_transform(): FILE: tests/test_caption_transform_fix.py function test_caption_transform_fix (line 5) | def test_caption_transform_fix(): FILE: tests/test_chinese_encoding_fix.py function test_chinese_metadata_audio (line 7) | def test_chinese_metadata_audio(): FILE: tests/test_ci_dependencies.py function test_platform_info (line 13) | def test_platform_info(): function test_basic_sync (line 22) | def test_basic_sync(): function test_windows_extras (line 36) | def test_windows_extras(): function test_import_functionality (line 54) | def test_import_functionality(): function main (line 81) | def main(): FILE: tests/test_cross_platform.py function test_cross_platform_compatibility (line 10) | def test_cross_platform_compatibility(): FILE: tests/test_draft_cleanup.py function _mkdir (line 9) | def _mkdir(p: str, name: str) -> str: function test_is_draft_directory_name_accepts_standard_id (line 15) | def test_is_draft_directory_name_accepts_standard_id() -> None: function test_is_draft_directory_name_rejects_invalid (line 20) | def test_is_draft_directory_name_rejects_invalid() -> None: function test_list_sorted_draft_ids_ignores_files_and_bad_names (line 27) | def test_list_sorted_draft_ids_ignores_files_and_bad_names(tmp_path) -> ... function test_select_drafts_for_deletion_oldest_first_until_quota (line 37) | def test_select_drafts_for_deletion_oldest_first_until_quota(tmp_path) -... function test_select_drafts_for_deletion_skips_protected_uses_next_oldest (line 54) | def test_select_drafts_for_deletion_skips_protected_uses_next_oldest() -... function test_run_one_draft_cleanup_deletes_oldest_unskipped_only (line 67) | def test_run_one_draft_cleanup_deletes_oldest_unskipped_only(tmp_path) -... function test_run_one_draft_cleanup_never_removes_protected_ids (line 87) | def test_run_one_draft_cleanup_never_removes_protected_ids(tmp_path) -> ... function test_run_one_draft_cleanup_skips_locked_ids (line 106) | def test_run_one_draft_cleanup_skips_locked_ids(tmp_path) -> None: function test_run_one_draft_cleanup_skips_cached_ids (line 127) | def test_run_one_draft_cleanup_skips_cached_ids(tmp_path) -> None: function test_list_sorted_draft_ids_missing_dir_returns_empty (line 143) | def test_list_sorted_draft_ids_missing_dir_returns_empty(tmp_path) -> None: FILE: tests/test_draft_downloader_remote_materials.py function no_sleep (line 16) | def no_sleep(): class TestDownloadRemoteFile (line 22) | class TestDownloadRemoteFile: method _ok_response (line 23) | def _ok_response(self, content: bytes = b"data") -> MagicMock: method test_succeeds_first_request (line 29) | def test_succeeds_first_request(self, no_sleep) -> None: method test_retries_then_success_on_timeout (line 43) | def test_retries_then_success_on_timeout(self, no_sleep) -> None: method test_returns_false_after_exhausting_retries (line 63) | def test_returns_false_after_exhausting_retries(self, no_sleep) -> None: method test_non200_retries_then_success (line 72) | def test_non200_retries_then_success(self, no_sleep) -> None: class TestLocalizeRemoteMaterialPaths (line 88) | class TestLocalizeRemoteMaterialPaths: method test_no_materials_returns_true (line 89) | def test_no_materials_returns_true(self) -> None: method test_no_urls_returns_true (line 92) | def test_no_urls_returns_true(self) -> None: method test_rewrites_path_on_success (line 97) | def test_rewrites_path_on_success(self, m_dl) -> None: method test_returns_false_when_download_fails (line 119) | def test_returns_false_when_download_fails(self, m_dl) -> None: method test_same_url_shared_across_items (line 132) | def test_same_url_shared_across_items(self, m_dl) -> None: class TestUpdateJsonFilePaths (line 152) | class TestUpdateJsonFilePaths: method test_skips_write_when_localize_fails (line 153) | def test_skips_write_when_localize_fails(self) -> None: method test_writes_when_localize_ok (line 175) | def test_writes_when_localize_ok(self, m_config, m_loc) -> None: class TestDownloadSingleFile (line 193) | class TestDownloadSingleFile: method _stream_response (line 202) | def _stream_response( method test_success_writes_concatenated_chunks_and_relative_path (line 213) | def test_success_writes_concatenated_chunks_and_relative_path(self, no... method test_fallback_relative_path_without_draft_segment (line 237) | def test_fallback_relative_path_without_draft_segment(self, no_sleep) ... method test_non200_returns_false_and_closes (line 252) | def test_non200_returns_false_and_closes(self, no_sleep) -> None: method test_gateway_503_retries_until_exhausted (line 263) | def test_gateway_503_retries_until_exhausted(self, no_sleep) -> None: method test_retries_then_success_on_read_timeout (line 275) | def test_retries_then_success_on_read_timeout(self, no_sleep) -> None: method test_returns_false_after_exhausting_retries (line 297) | def test_returns_false_after_exhausting_retries(self, no_sleep) -> None: method test_plain_file_does_not_touch_json_paths (line 310) | def test_plain_file_does_not_touch_json_paths(self, m_upd, no_sleep) -... method test_json_files_invoke_path_update (line 322) | def test_json_files_invoke_path_update(self, m_upd, no_sleep) -> None: method test_json_update_failure_returns_false (line 338) | def test_json_update_failure_returns_false(self, m_upd, no_sleep) -> N... class TestExecuteDownload (line 350) | class TestExecuteDownload: method test_streams_body_to_default_filename_and_closes (line 358) | def test_streams_body_to_default_filename_and_closes(self, no_sleep) -... method test_non200_returns_false (line 384) | def test_non200_returns_false(self, no_sleep) -> None: method test_request_exception_returns_false (line 395) | def test_request_exception_returns_false(self, no_sleep) -> None: FILE: tests/test_draft_lock_all_apis.py class TestAllAsyncLockAPIs (line 46) | class TestAllAsyncLockAPIs: method mock_draft_data (line 50) | def mock_draft_data(self): method test_save_draft_async_normal (line 58) | async def test_save_draft_async_normal(self, mock_draft_data): method test_add_audios_async_normal (line 76) | async def test_add_audios_async_normal(self, mock_draft_data): method test_add_images_async_normal (line 121) | async def test_add_images_async_normal(self, mock_draft_data): method test_add_captions_async_normal (line 167) | async def test_add_captions_async_normal(self, mock_draft_data): method test_add_effects_async_normal (line 199) | async def test_add_effects_async_normal(self, mock_draft_data): method test_add_keyframes_async_normal (line 229) | async def test_add_keyframes_async_normal(self, mock_draft_data): method test_add_sticker_async_normal (line 265) | async def test_add_sticker_async_normal(self, mock_draft_data): method test_add_filters_async_normal (line 291) | async def test_add_filters_async_normal(self, mock_draft_data): method test_add_masks_async_normal (line 321) | async def test_add_masks_async_normal(self, mock_draft_data): method test_easy_create_material_async_normal (line 349) | async def test_easy_create_material_async_normal(self, mock_draft_data): method test_concurrent_access_same_draft_serialized (line 376) | async def test_concurrent_access_same_draft_serialized(self, mock_draf... method test_invalid_draft_id_raises_error (line 413) | async def test_invalid_draft_id_raises_error(self): method test_lock_timeout_raises_error (line 422) | async def test_lock_timeout_raises_error(self, mock_draft_data): FILE: tests/test_draft_lock_manager.py class TestDraftLockManager (line 21) | class TestDraftLockManager: method lock_manager (line 25) | def lock_manager(self): method test_acquire_and_release_lock (line 30) | async def test_acquire_and_release_lock(self, lock_manager): method test_acquire_lock_with_timeout (line 46) | async def test_acquire_lock_with_timeout(self, lock_manager): method test_acquire_lock_timeout_exception (line 63) | async def test_acquire_lock_timeout_exception(self, lock_manager): method test_release_nonexistent_lock (line 78) | async def test_release_nonexistent_lock(self, lock_manager): method test_is_locked_method (line 86) | async def test_is_locked_method(self, lock_manager): method test_get_lock_count (line 102) | async def test_get_lock_count(self, lock_manager): method test_get_all_locked_drafts (line 118) | async def test_get_all_locked_drafts(self, lock_manager): method test_clear_all_locks (line 144) | async def test_clear_all_locks(self, lock_manager): method test_get_stats (line 164) | async def test_get_stats(self, lock_manager): method test_concurrent_access_different_drafts (line 187) | async def test_concurrent_access_different_drafts(self, lock_manager): method test_serial_access_same_draft (line 213) | async def test_serial_access_same_draft(self, lock_manager): method test_singleton_pattern (line 247) | async def test_singleton_pattern(self): method test_get_draft_lock_manager_function (line 256) | async def test_get_draft_lock_manager_function(self): class TestDraftLockManagerEdgeCases (line 265) | class TestDraftLockManagerEdgeCases: method test_empty_draft_id (line 269) | async def test_empty_draft_id(self): method test_special_characters_in_draft_id (line 281) | async def test_special_characters_in_draft_id(self): method test_very_long_draft_id (line 300) | async def test_very_long_draft_id(self): method test_rapid_acquire_release_cycle (line 312) | async def test_rapid_acquire_release_cycle(self): method test_multiple_workers_same_draft_stress (line 326) | async def test_multiple_workers_same_draft_stress(self): FILE: tests/test_draft_service.py function test_create_draft_service (line 10) | def test_create_draft_service(mocker): function test_create_draft_api (line 32) | def test_create_draft_api(): FILE: tests/test_export_error_handling.py function test_export_error_handling (line 15) | def test_export_error_handling(): FILE: tests/test_file_operations.py function test_file_move_improvements (line 17) | def test_file_move_improvements(): function test_directory_creation (line 51) | def test_directory_creation(): FILE: tests/test_float_transform.py function test_float_transform (line 5) | def test_float_transform(): FILE: tests/test_font_alias_resolution.py function test_resolve_font_type_by_alias_zhixianghei (line 10) | def test_resolve_font_type_by_alias_zhixianghei(): function test_resolve_font_type_by_display_name (line 15) | def test_resolve_font_type_by_display_name(): function test_resolve_font_type_by_enum_name (line 20) | def test_resolve_font_type_by_enum_name(): function test_resolve_font_type_with_unknown_name (line 25) | def test_resolve_font_type_with_unknown_name(): FILE: tests/test_font_size.py function test_font_size (line 8) | def test_font_size(): FILE: tests/test_font_size_debug.py function test_font_size_logic (line 1) | def test_font_size_logic(): FILE: tests/test_font_size_logic.py function test_font_size_logic (line 5) | def test_font_size_logic(): FILE: tests/test_font_size_not_set.py function test_font_size_not_set (line 8) | def test_font_size_not_set(): FILE: tests/test_get_audio_duration_api.py function test_get_audio_duration_api (line 7) | def test_get_audio_duration_api(): FILE: tests/test_get_text_effects.py function test_get_all_text_effects (line 13) | def test_get_all_text_effects(): function test_get_vip_text_effects (line 44) | def test_get_vip_text_effects(): function test_get_free_text_effects (line 65) | def test_get_free_text_effects(): function test_invalid_mode (line 86) | def test_invalid_mode(): FILE: tests/test_imgs_infos_multiple_animations.py function test_multiple_animations_basic (line 11) | def test_multiple_animations_basic(): function test_animation_extension_logic (line 53) | def test_animation_extension_logic(): function test_excess_animations (line 95) | def test_excess_animations(): function test_multiple_animation_types (line 132) | def test_multiple_animation_types(): function test_backward_compatibility (line 192) | def test_backward_compatibility(): function test_empty_and_none_animations (line 230) | def test_empty_and_none_animations(): function run_all_tests (line 269) | def run_all_tests(): FILE: tests/test_keyframe_value.py function test_normalize_pixel_position_x (line 10) | def test_normalize_pixel_position_x(): function test_normalize_already_normalized_position_x (line 15) | def test_normalize_already_normalized_position_x(): function test_normalize_pixel_position_y (line 20) | def test_normalize_pixel_position_y(): function test_keyframes_infos_assume_pixel_normalizes_small_values (line 24) | def test_keyframes_infos_assume_pixel_normalizes_small_values(): function test_rotation_scale_alpha_unchanged (line 30) | def test_rotation_scale_alpha_unchanged(): function test_rotation_scale_alpha_unchanged_with_assume_pixel (line 37) | def test_rotation_scale_alpha_unchanged_with_assume_pixel(): FILE: tests/test_keyword_font_size.py function test_keyword_font_size_parsing (line 10) | def test_keyword_font_size_parsing(): function test_keyword_font_size_application (line 45) | def test_keyword_font_size_application(): function test_keyword_font_size_default (line 67) | def test_keyword_font_size_default(): FILE: tests/test_latest_commit_features.py class TestMaintrackAdsorb (line 26) | class TestMaintrackAdsorb(unittest.TestCase): method test_maintrack_adsorb_default_true (line 29) | def test_maintrack_adsorb_default_true(self): method test_maintrack_adsorb_false (line 34) | def test_maintrack_adsorb_false(self): method test_maintrack_adsorb_in_export (line 39) | def test_maintrack_adsorb_in_export(self): class TestMixMode (line 46) | class TestMixMode(unittest.TestCase): method test_mix_mode_creation (line 49) | def test_mix_mode_creation(self): method test_mix_mode_export_json (line 56) | def test_mix_mode_export_json(self): method test_video_segment_set_mix_mode (line 70) | def test_video_segment_set_mix_mode(self): class TestVideoSegmentAudioFade (line 80) | class TestVideoSegmentAudioFade(unittest.TestCase): method test_audio_fade_creation (line 83) | def test_audio_fade_creation(self): method test_audio_fade_export_json (line 90) | def test_audio_fade_export_json(self): class TestNewFilters (line 102) | class TestNewFilters(unittest.TestCase): method test_filter_has_resource_id (line 105) | def test_filter_has_resource_id(self): method test_filter_with_params (line 111) | def test_filter_with_params(self): class TestNewFonts (line 120) | class TestNewFonts(unittest.TestCase): method test_new_fonts_exist (line 123) | def test_new_fonts_exist(self): class TestScriptMaterial (line 136) | class TestScriptMaterial(unittest.TestCase): method test_mix_modes_list_exists (line 139) | def test_mix_modes_list_exists(self): method test_mix_mode_in_check (line 146) | def test_mix_mode_in_check(self): class TestIntegration (line 160) | class TestIntegration(unittest.TestCase): method test_script_file_creation_with_maintrack_adsorb (line 163) | def test_script_file_creation_with_maintrack_adsorb(self): method test_export_json_structure (line 172) | def test_export_json_structure(self): class TestBackwardCompatibility (line 184) | class TestBackwardCompatibility(unittest.TestCase): method test_script_file_init_requires_maintrack_adsorb (line 187) | def test_script_file_init_requires_maintrack_adsorb(self): method test_mix_mode_types_available (line 193) | def test_mix_mode_types_available(self): FILE: tests/test_logic_validation.py function test_duration_handling_logic (line 5) | def test_duration_handling_logic(): FILE: tests/test_media_utils.py function test_media_duration (line 8) | def test_media_duration(): FILE: tests/test_middleware.py function test (line 15) | async def test(request: Request): FILE: tests/test_param_pass.py function test_create_draft_with_custom_params (line 4) | def test_create_draft_with_custom_params(): FILE: tests/test_parse_video_data.py function parse_video_data (line 3) | def parse_video_data(json_str: str) -> list: function test_parse_video_data_with_duration (line 61) | def test_parse_video_data_with_duration(): FILE: tests/test_search_sticker.py function test_search_sticker (line 17) | def test_search_sticker(): FILE: tests/test_search_sticker_basic.py function search_sticker (line 13) | def search_sticker(keyword: str, sticker_config_path: str) -> list: function test_search_sticker (line 63) | def test_search_sticker(): FILE: tests/test_search_sticker_simple.py function search_sticker (line 18) | def search_sticker(keyword: str) -> list: function test_search_sticker (line 67) | def test_search_sticker(): FILE: tests/test_storage_upload_retry.py function no_sleep_no_random_delay (line 17) | def no_sleep_no_random_delay(): class TestIterExceptionChain (line 28) | class TestIterExceptionChain: method test_yields_self_then_cause (line 29) | def test_yields_self_then_cause(self) -> None: method test_stops_on_cycle (line 37) | def test_stops_on_cycle(self) -> None: class TestIsRetryableStorageError (line 46) | class TestIsRetryableStorageError: method test_requests_transient (line 55) | def test_requests_transient(self, exc: Exception) -> None: method test_urllib3_new_connection (line 58) | def test_urllib3_new_connection(self) -> None: method test_urllib3_read_timeout (line 64) | def test_urllib3_read_timeout(self) -> None: method test_urllib3_connect_timeout (line 69) | def test_urllib3_connect_timeout(self) -> None: method test_urllib3_protocol (line 72) | def test_urllib3_protocol(self) -> None: method test_oserror_errno (line 76) | def test_oserror_errno(self, code: int) -> None: method test_oserror_not_retryable (line 79) | def test_oserror_not_retryable(self) -> None: method test_cos_client_error (line 82) | def test_cos_client_error(self) -> None: method test_cos_service_error (line 86) | def test_cos_service_error(self, status: int, expected: bool) -> None: method test_exception_chain_finds_cause (line 90) | def test_exception_chain_finds_cause(self) -> None: method test_exception_chain_valueerror_first_in_chain_still_finds_cause (line 96) | def test_exception_chain_valueerror_first_in_chain_still_finds_cause(s... method test_oss_request_error (line 103) | def test_oss_request_error(self) -> None: method test_oss_oss_error_status (line 110) | def test_oss_oss_error_status(self, status: int, expected: bool) -> None: class TestRunWithStorageRetry (line 117) | class TestRunWithStorageRetry: method test_success_first_call (line 118) | def test_success_first_call(self, no_sleep_no_random_delay) -> None: method test_retries_then_success (line 123) | def test_retries_then_success(self, no_sleep_no_random_delay) -> None: method test_non_retryable_raises_immediately (line 130) | def test_non_retryable_raises_immediately(self, no_sleep_no_random_del... method test_exhausts_attempts (line 138) | def test_exhausts_attempts(self, no_sleep_no_random_delay) -> None: method test_context_passed_to_warning_logger (line 148) | def test_context_passed_to_warning_logger(self, no_sleep_no_random_del... FILE: tests/test_text_segment_add_animation.py function _anim (line 20) | def _anim(seg: TextSegment, animation_type: str): function test_intro_only_start_zero_and_respects_duration (line 28) | def test_intro_only_start_zero_and_respects_duration(): function test_outro_only_start_is_segment_end_minus_duration (line 36) | def test_outro_only_start_is_segment_end_minus_duration(): function test_intro_then_outro_both_unchanged (line 44) | def test_intro_then_outro_both_unchanged(): function test_intro_duration_still_capped_by_segment_length (line 53) | def test_intro_duration_still_capped_by_segment_length(): function test_outro_duration_still_capped_by_segment_length (line 60) | def test_outro_duration_still_capped_by_segment_length(): function test_loop_only_start_zero_uses_explicit_cycle (line 71) | def test_loop_only_start_zero_uses_explicit_cycle(): function test_loop_only_cycle_limited_by_segment_before_loop_branch (line 79) | def test_loop_only_cycle_limited_by_segment_before_loop_branch(): function test_loop_none_duration_uses_enum_default_microseconds (line 88) | def test_loop_none_duration_uses_enum_default_microseconds(): function test_loop_after_intro_outro_starts_at_intro_end (line 97) | def test_loop_after_intro_outro_starts_at_intro_end(): function test_loop_cycle_capped_by_available_between_in_and_out (line 109) | def test_loop_cycle_capped_by_available_between_in_and_out(): function test_loop_accepts_int_duration_microseconds (line 120) | def test_loop_accepts_int_duration_microseconds(): function test_add_in_out_loop_order_required_by_contract (line 126) | def test_add_in_out_loop_order_required_by_contract(): function test_add_loop_before_in_raises (line 135) | def test_add_loop_before_in_raises(): FILE: tests/test_transform_coordinate_fix.py function test_transform_coordinate_fix (line 5) | def test_transform_coordinate_fix(): function test_transform_with_different_draft_sizes (line 68) | def test_transform_with_different_draft_sizes(): FILE: tests/test_upload_file.py function upload_mocks (line 10) | def upload_mocks(): function test_upload_file_prefers_cos_when_configured (line 20) | def test_upload_file_prefers_cos_when_configured(upload_mocks) -> None: function test_upload_file_fallback_oss_when_cos_not_configured (line 32) | def test_upload_file_fallback_oss_when_cos_not_configured(upload_mocks) ... function test_upload_file_neither_storage_raises (line 44) | def test_upload_file_neither_storage_raises(upload_mocks) -> None: function test_upload_file_passes_expire_days (line 57) | def test_upload_file_passes_expire_days(upload_mocks) -> None: FILE: tests/test_video_duration_extension.py class MockMediaInfo (line 6) | class MockMediaInfo: method __init__ (line 7) | def __init__(self, duration=2000000, width=576, height=1024): method parse (line 12) | def parse(self, path, **kwargs): method can_parse (line 27) | def can_parse(): function test_video_duration_extension (line 39) | def test_video_duration_extension(): FILE: tests/test_video_task_draft_duration.py function _task (line 18) | def _task(draft_id: str = "d_test") -> VideoGenTask: function draft_home (line 28) | def draft_home(): class TestCheckDraftDuration (line 33) | class TestCheckDraftDuration: method test_below_three_seconds_returns_false (line 34) | def test_below_three_seconds_returns_false(self, draft_home) -> None: method test_exactly_three_seconds_returns_true (line 46) | def test_exactly_three_seconds_returns_true(self, draft_home) -> None: method test_zero_duration_returns_false (line 58) | def test_zero_duration_returns_false(self, draft_home) -> None: class TestPhaseDownloadPrepareMessage (line 71) | class TestPhaseDownloadPrepareMessage: method test_phase_returns_duration_too_short_message (line 76) | def test_phase_returns_duration_too_short_message( FILE: tests/test_video_transform.py function test_video_transform (line 9) | def test_video_transform(): FILE: tests/test_video_transform_fix.py function test_video_transform_coordinate_fix (line 5) | def test_video_transform_coordinate_fix(): function test_video_transform_with_different_draft_sizes (line 68) | def test_video_transform_with_different_draft_sizes(): function test_video_transform_vs_image_transform_consistency (line 123) | def test_video_transform_vs_image_transform_consistency(): FILE: tests/verify_get_text_effects_api.py function test_imports (line 10) | def test_imports(): function test_schema_validation (line 50) | def test_schema_validation(): function test_service_logic (line 86) | def test_service_logic(): function main (line 124) | def main(): FILE: tools/extract_text_effects.py function extract_text_effects_from_data_ts (line 8) | def extract_text_effects_from_data_ts(file_path: str) -> dict: function generate_python_mapping (line 63) | def generate_python_mapping(text_effects: dict) -> str: function main (line 98) | def main(): FILE: tools/query_sticker.py function query_stickers (line 24) | def query_stickers(keyword, workflow_id=None, auth_token=None): function save_result (line 78) | def save_result(result, output_file=None): function query_multiple_keywords (line 126) | def query_multiple_keywords(keywords, output_file=None): function get_common_chinese_characters (line 203) | def get_common_chinese_characters(): function main (line 421) | def main():