Repository: Hommy-master/capcut-mate
Branch: main
Commit: e48b50529638
Files: 342
Total size: 136.6 MB
Directory structure:
gitextract_66uhurkx/
├── .github/
│ └── workflows/
│ ├── desktop-client-dev.yml
│ └── dev.yml
├── .gitignore
├── Dockerfile
├── LICENSE
├── README.md
├── README.zh.md
├── config/
│ ├── huazi.json
│ └── sticker.json
├── config.py
├── desktop-client/
│ ├── .gitignore
│ ├── .npmrc
│ ├── LICENSE
│ ├── assets/
│ │ ├── entitlements.mac.plist
│ │ └── icons/
│ │ └── logo.icns
│ ├── main.js
│ ├── nodeapi/
│ │ ├── download.js
│ │ ├── draftPathDetect.js
│ │ ├── ipcHandlers.js
│ │ └── logger.js
│ ├── package.json
│ ├── preload.js
│ ├── scripts/
│ │ ├── electron-builder-green.config.js
│ │ ├── electron-builder.config.js
│ │ └── update-version.js
│ └── web/
│ ├── .gitignore
│ ├── index.html
│ ├── package.json
│ ├── public/
│ │ └── index.html
│ ├── src/
│ │ ├── App.jsx
│ │ ├── components/
│ │ │ ├── DownloadButton.jsx
│ │ │ ├── DownloadControls.jsx
│ │ │ ├── ExternalWebpage.jsx
│ │ │ ├── Header/
│ │ │ │ ├── index.jsx
│ │ │ │ └── index.less
│ │ │ ├── LogModule.jsx
│ │ │ ├── Tabs.jsx
│ │ │ └── Textarea.jsx
│ │ ├── index.jsx
│ │ ├── pages/
│ │ │ ├── ConfigCenter/
│ │ │ │ ├── index.jsx
│ │ │ │ └── index.less
│ │ │ ├── Download/
│ │ │ │ ├── index.jsx
│ │ │ │ └── index.less
│ │ │ └── History/
│ │ │ ├── index.jsx
│ │ │ └── index.less
│ │ ├── services/
│ │ │ └── electronService.js
│ │ ├── styles/
│ │ │ ├── index.less
│ │ │ └── root.less
│ │ └── utils/
│ │ ├── const.tsx
│ │ └── date.ts
│ └── vite.config.js
├── docker-compose.example.yaml
├── docker-compose.yaml
├── docs/
│ ├── add_audios.md
│ ├── add_audios.zh.md
│ ├── add_captions.md
│ ├── add_captions.zh.md
│ ├── add_effects.md
│ ├── add_effects.zh.md
│ ├── add_filters.md
│ ├── add_filters.zh.md
│ ├── add_images.md
│ ├── add_images.zh.md
│ ├── add_keyframes.md
│ ├── add_keyframes.zh.md
│ ├── add_masks.md
│ ├── add_masks.zh.md
│ ├── add_sticker.md
│ ├── add_sticker.zh.md
│ ├── add_text_style.md
│ ├── add_text_style.zh.md
│ ├── add_videos.md
│ ├── add_videos.zh.md
│ ├── audio_infos.md
│ ├── audio_infos.zh.md
│ ├── audio_timelines.md
│ ├── audio_timelines.zh.md
│ ├── caption_infos.md
│ ├── caption_infos.zh.md
│ ├── create_draft.md
│ ├── create_draft.zh.md
│ ├── easy_create_material.md
│ ├── easy_create_material.zh.md
│ ├── effect_infos.md
│ ├── effect_infos.zh.md
│ ├── filter_infos.md
│ ├── filter_infos.zh.md
│ ├── gen_video.md
│ ├── gen_video.zh.md
│ ├── gen_video_status.md
│ ├── gen_video_status.zh.md
│ ├── get_audio_duration.md
│ ├── get_audio_duration.zh.md
│ ├── get_draft.md
│ ├── get_draft.zh.md
│ ├── get_image_animations.md
│ ├── get_image_animations.zh.md
│ ├── get_text_animations.md
│ ├── get_text_animations.zh.md
│ ├── get_text_effects.md
│ ├── get_url.md
│ ├── get_url.zh.md
│ ├── imgs_infos.md
│ ├── imgs_infos.zh.md
│ ├── keyframes_infos.md
│ ├── keyframes_infos.zh.md
│ ├── objs_to_str_list.md
│ ├── objs_to_str_list.zh.md
│ ├── save_draft.md
│ ├── save_draft.zh.md
│ ├── search_sticker.md
│ ├── search_sticker.zh.md
│ ├── str_list_to_objs.md
│ ├── str_list_to_objs.zh.md
│ ├── str_to_list.md
│ ├── str_to_list.zh.md
│ ├── timelines.md
│ ├── timelines.zh.md
│ ├── video_infos.md
│ └── video_infos.zh.md
├── exceptions.py
├── main.py
├── openapi.yaml
├── pyproject.toml
├── src/
│ ├── __init__.py
│ ├── middlewares/
│ │ ├── __init__.py
│ │ ├── prepare.py
│ │ ├── response.py
│ │ └── trace_context.py
│ ├── pyJianYingDraft/
│ │ ├── __init__.py
│ │ ├── animation.py
│ │ ├── assets/
│ │ │ ├── __init__.py
│ │ │ ├── draft_content_template.json
│ │ │ └── draft_meta_info.json
│ │ ├── audio_segment.py
│ │ ├── draft_folder.py
│ │ ├── effect_segment.py
│ │ ├── exceptions.py
│ │ ├── jianying_controller.py
│ │ ├── keyframe.py
│ │ ├── local_materials.py
│ │ ├── metadata/
│ │ │ ├── __init__.py
│ │ │ ├── audio_scene_effect.py
│ │ │ ├── effect_meta.py
│ │ │ ├── filter_meta.py
│ │ │ ├── font_meta.py
│ │ │ ├── mask_meta.py
│ │ │ ├── mix_mode_meta.py
│ │ │ ├── speech_to_song.py
│ │ │ ├── text_intro.py
│ │ │ ├── text_loop.py
│ │ │ ├── text_outro.py
│ │ │ ├── tone_effect.py
│ │ │ ├── transition_meta.py
│ │ │ ├── video_character_effect.py
│ │ │ ├── video_group_animation.py
│ │ │ ├── video_intro.py
│ │ │ ├── video_outro.py
│ │ │ └── video_scene_effect.py
│ │ ├── script_file.py
│ │ ├── segment.py
│ │ ├── template_mode.py
│ │ ├── text_segment.py
│ │ ├── time_util.py
│ │ ├── track.py
│ │ ├── util.py
│ │ └── video_segment.py
│ ├── router/
│ │ ├── __init__.py
│ │ └── v1.py
│ ├── schemas/
│ │ ├── __init__.py
│ │ ├── add_audios.py
│ │ ├── add_captions.py
│ │ ├── add_effects.py
│ │ ├── add_filters.py
│ │ ├── add_images.py
│ │ ├── add_keyframes.py
│ │ ├── add_masks.py
│ │ ├── add_sticker.py
│ │ ├── add_text_style.py
│ │ ├── add_videos.py
│ │ ├── audio_infos.py
│ │ ├── audio_timelines.py
│ │ ├── caption_infos.py
│ │ ├── create_draft.py
│ │ ├── easy_create_material.py
│ │ ├── effect_infos.py
│ │ ├── filter_infos.py
│ │ ├── gen_video.py
│ │ ├── gen_video_active_count.py
│ │ ├── gen_video_status.py
│ │ ├── get_audio_duration.py
│ │ ├── get_draft.py
│ │ ├── get_effects.py
│ │ ├── get_filters.py
│ │ ├── get_image_animations.py
│ │ ├── get_text_animations.py
│ │ ├── get_text_effects.py
│ │ ├── get_url.py
│ │ ├── imgs_infos.py
│ │ ├── keyframes_infos.py
│ │ ├── objs_to_str_list.py
│ │ ├── save_draft.py
│ │ ├── search_sticker.py
│ │ ├── str_list_to_objs.py
│ │ ├── str_to_list.py
│ │ ├── timelines.py
│ │ └── video_infos.py
│ ├── service/
│ │ ├── __init__.py
│ │ ├── add_audios.py
│ │ ├── add_captions.py
│ │ ├── add_effects.py
│ │ ├── add_filters.py
│ │ ├── add_images.py
│ │ ├── add_keyframes.py
│ │ ├── add_masks.py
│ │ ├── add_sticker.py
│ │ ├── add_text_style.py
│ │ ├── add_videos.py
│ │ ├── audio_infos.py
│ │ ├── audio_timelines.py
│ │ ├── caption_infos.py
│ │ ├── create_draft.py
│ │ ├── easy_create_material.py
│ │ ├── effect_infos.py
│ │ ├── filter_infos.py
│ │ ├── gen_video.py
│ │ ├── get_audio_duration.py
│ │ ├── get_draft.py
│ │ ├── get_effects.py
│ │ ├── get_filters.py
│ │ ├── get_image_animations.py
│ │ ├── get_text_animations.py
│ │ ├── get_text_effects.py
│ │ ├── get_url.py
│ │ ├── imgs_infos.py
│ │ ├── keyframes_infos.py
│ │ ├── objs_to_str_list.py
│ │ ├── save_draft.py
│ │ ├── search_sticker.py
│ │ ├── str_list_to_objs.py
│ │ ├── str_to_list.py
│ │ ├── text_effect_map_generated.py
│ │ ├── timelines.py
│ │ └── video_infos.py
│ └── utils/
│ ├── __init__.py
│ ├── cos.py
│ ├── download.py
│ ├── draft_cache.py
│ ├── draft_cleanup.py
│ ├── draft_downloader.py
│ ├── draft_lock_manager.py
│ ├── helper.py
│ ├── keyframe_value.py
│ ├── logger.py
│ ├── media.py
│ ├── oss.py
│ ├── points.py
│ ├── storage_upload_retry.py
│ ├── trace_context.py
│ ├── upload_file.py
│ ├── video_task_manager.py
│ └── video_task_store.py
├── template/
│ ├── default/
│ │ ├── draft_agency_config.json
│ │ ├── draft_info.json
│ │ ├── draft_info.json.bak
│ │ ├── draft_meta_info.json
│ │ ├── draft_settings
│ │ └── template.tmp
│ ├── default2/
│ │ ├── attachment_pc_common.json
│ │ ├── draft_agency_config.json
│ │ ├── draft_content.json
│ │ ├── draft_info.json
│ │ ├── draft_meta_info.json
│ │ └── template.tmp
│ └── readme.md
├── tests/
│ ├── __init__.py
│ ├── manual_test_audio_infos.py
│ ├── manual_test_caption_infos.py
│ ├── manual_test_effect_infos.py
│ ├── manual_test_imgs_infos.py
│ ├── manual_test_keyframes_infos.py
│ ├── manual_test_video_infos.py
│ ├── test_add_audios.py
│ ├── test_add_captions_text_effect.py
│ ├── test_add_images.py
│ ├── test_add_keyframes_normalize.py
│ ├── test_add_keyframes_refactor.py
│ ├── test_add_masks.py
│ ├── test_add_videos_concurrent.py
│ ├── test_add_videos_concurrent_demo.py
│ ├── test_add_videos_duration.py
│ ├── test_add_videos_refactor.py
│ ├── test_all_text_effects.py
│ ├── test_api_version.py
│ ├── test_audio_infos.py
│ ├── test_audio_infos_simple.py
│ ├── test_audio_timelines.py
│ ├── test_caption_keywords.py
│ ├── test_caption_transform.py
│ ├── test_caption_transform_fix.py
│ ├── test_chinese_encoding_fix.py
│ ├── test_ci_dependencies.py
│ ├── test_cross_platform.py
│ ├── test_draft_cleanup.py
│ ├── test_draft_downloader_remote_materials.py
│ ├── test_draft_lock_all_apis.py
│ ├── test_draft_lock_manager.py
│ ├── test_draft_service.py
│ ├── test_export_error_handling.py
│ ├── test_file_operations.py
│ ├── test_float_transform.py
│ ├── test_font_alias_resolution.py
│ ├── test_font_size.py
│ ├── test_font_size_debug.py
│ ├── test_font_size_logic.py
│ ├── test_font_size_not_set.py
│ ├── test_get_audio_duration_api.py
│ ├── test_get_text_effects.py
│ ├── test_imgs_infos_multiple_animations.py
│ ├── test_keyframe_value.py
│ ├── test_keyword_font_size.py
│ ├── test_latest_commit_features.py
│ ├── test_logic_validation.py
│ ├── test_media_utils.py
│ ├── test_middleware.py
│ ├── test_param_pass.py
│ ├── test_parse_video_data.py
│ ├── test_search_sticker.py
│ ├── test_search_sticker_basic.py
│ ├── test_search_sticker_simple.py
│ ├── test_storage_upload_retry.py
│ ├── test_text_segment_add_animation.py
│ ├── test_transform_coordinate_fix.py
│ ├── test_upload_file.py
│ ├── test_video_duration_extension.py
│ ├── test_video_task_draft_duration.py
│ ├── test_video_transform.py
│ ├── test_video_transform_fix.py
│ └── verify_get_text_effects_api.py
└── tools/
├── extract_text_effects.py
├── ffprobe
└── query_sticker.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/desktop-client-dev.yml
================================================
name: Build
on:
push:
branches: [ main, dev ]
tags: [ 'v*' ]
pull_request:
branches: [ main, dev ]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: windows-latest
platform: win
artifact_name: windows-build
build_command: build-win
installer_command: build-win-installer
green_command: build-win-green
- os: macos-latest
platform: mac
artifact_name: macos-build
build_command: build-mac
installer_command: build-mac-installer
green_command: build-mac-green
- os: macos-15-intel
platform: mac-x64
artifact_name: macos-build-x64
build_command: build-mac-x64
installer_command: build-mac-x64-installer
green_command: build-mac-x64-green
steps:
- name: 准备代码
uses: actions/checkout@v4
- name: 设置Node.js环境
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: desktop-client/package-lock.json
- name: 安装Electron依赖
run: npm ci
working-directory: ./desktop-client
- name: 安装前端依赖
run: npm ci
working-directory: ./desktop-client/web
- name: 构建前端
run: npm run build
working-directory: ./desktop-client/web
- name: 更新版本号
run: node scripts/update-version.js
working-directory: ./desktop-client
env:
GITHUB_REF: ${{ github.ref }}
- name: 根据平台打包应用程序
run: npm run ${{ matrix.build_command }}
working-directory: ./desktop-client
- name: 根据平台创建安装包
run: npm run ${{ matrix.installer_command }}
working-directory: ./desktop-client
env:
# 添加环境变量以解决macOS构建问题
CSC_IDENTITY_AUTO_DISCOVERY: false
DEBUG: electron-builder
- name: 构建绿色安装包
if: matrix.green_command != 'null'
run: npm run ${{ matrix.green_command }}
working-directory: ./desktop-client
env:
# 添加环境变量以解决macOS构建问题
CSC_IDENTITY_AUTO_DISCOVERY: false
DEBUG: electron-builder
- name: 列出dist目录内容
run: |
echo "当前操作系统: ${{ runner.os }}"
ls desktop-client/dist/
shell: bash
- name: 上传安装包构件
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact_name }}-installer
path: desktop-client/dist/
if-no-files-found: ignore
- name: 上传绿色安装包构件
if: matrix.green_command != 'null'
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact_name }}-green
path: desktop-client/dist/*.zip
if-no-files-found: ignore
- name: 发布版本
if: startsWith(github.ref, 'refs/tags/v')
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ github.ref_name }}
name: Release ${{ github.ref_name }}
files: |
desktop-client/dist/capcut-mate-windows-x64-installer.exe
desktop-client/dist/capcut-mate-macos-arm64-installer.dmg
desktop-client/dist/capcut-mate-macos-x64-installer.dmg
desktop-client/dist/*.zip
overwrite: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/dev.yml
================================================
name: Docker Image CI Dev
on:
push:
branches: [ "main", "dev" ]
tags:
- 'v*' # 当推送v开头的tag时触发
pull_request:
branches: [ "main", "dev" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 准备代码
uses: actions/checkout@v4
# 安装uv环境
- name: 安装uv
uses: astral-sh/setup-uv@v2
with:
version: "0.8.11"
enable-cache: true
- name: 准备python环境
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: 安装基础依赖
run: uv sync #只安装基础依赖,避免平台特定依赖
- name: 查看文件和目录结构
run: ls -lha
- name: 准备生产环境文件
run: |
mkdir -p dist/etc
# 复制源代码
cp -rf src dist/
cp -rf config dist/
cp -rf template dist/
# 复制依赖配置文件
cp pyproject.toml dist/
cp *.py dist/
cp uv.lock dist/
echo "${{ github.sha }}" > dist/etc/commit_hash
- name: 查看文件和目录结构
run: ls -lha dist -R
- name: 准备打包Docker镜像的环境
uses: docker/setup-buildx-action@v3
# 登录到Docker Hub
- name: 登录Docker Hub
if: github.event_name != 'pull_request' # PR时不登录
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# 提取标签信息 - 使用与登录相同的Secret变量名
- name: 提取镜像标签
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ secrets.DOCKERHUB_USERNAME }}/capcut-mate # 统一使用DOCKERHUB_USERNAME(无下划线)
tags: |
type=ref,event=branch
type=ref,event=tag
type=sha,format=short
type=raw,value=latest,enable={{is_default_branch}}
# 调试步骤:检查生成的标签
- name: 显示生成的镜像标签
run: |
echo "生成的标签: ${{ steps.meta.outputs.tags }}"
# 检查标签是否包含正确的用户名格式
if [[ ! "${{ steps.meta.outputs.tags }}" == *"${{ secrets.DOCKERHUB_USERNAME }}/capcut-mate:"* ]]; then
echo "错误:标签格式不正确,应为 ${secrets.DOCKERHUB_USERNAME}/capcut-mate:标签"
exit 1
fi
# 构建并推送Docker镜像
- name: 构建并推送Docker镜像
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
================================================
FILE: .gitignore
================================================
*.pyc
.venv
./dist
/.qoder
/output
/temp
/logs
/db
================================================
FILE: Dockerfile
================================================
FROM python:3.11-slim
# 使用pip安装uv
RUN pip install --no-cache-dir uv
# 验证uv安装
RUN uv --version
# 设置工作目录
WORKDIR /app
# 创建非root用户并提前配置缓存目录
RUN mkdir -p /root/.cache/uv /app/bin/
# 从CI构建的dist目录复制所有文件
COPY dist/ .
COPY tools/ffprobe /app/bin/ffprobe
# 安装依赖(仍使用root用户确保权限)
RUN uv sync
# 添加权限
RUN chmod 0755 /app/bin/*
# 暴露应用端口
EXPOSE 30000
# 设置环境变量,指定uv缓存目录和用户主目录
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PATH="/app/.venv/bin:/app/bin:$PATH" \
HOME="/root" \
UV_CACHE_DIR="/root/.cache/uv"
# 启动命令
CMD ["uv", "run", "main.py", "--workers", "4"]
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2025 gogoshine
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# CapCut Mate API
}
*/
async function detectJianyingDraftRoot() {
if (process.platform === "win32") {
return detectWindowsDraftPath();
}
if (process.platform === "darwin") {
return detectMacDraftPath();
}
return null;
}
module.exports = {
detectJianyingDraftRoot,
};
================================================
FILE: desktop-client/nodeapi/ipcHandlers.js
================================================
const { ipcMain, dialog, app } = require('electron');
// 引入logger模块
const logger = require('./logger');
// 引入axios
const axios = require('axios');
// 引入download.js模块
const {
readDownloadLog,
clearDownloadLog,
getDraftUrls,
updateDraftPath,
downloadFiles,
ensureAutoDetectedDraftPathInConfig,
checkUrlAccessRight,
readHistoryRecord,
} = require('./download');
console.log(process.versions.electron);
console.log(process.versions.chrome);
// 接收mainWindow作为参数
function setupIpcHandlers(mainWindow) {
ipcMain.handle('get-download-log', async (event) => {
return await readDownloadLog();
});
ipcMain.handle('clear-download-log', async (event) => {
return await clearDownloadLog();
});
ipcMain.handle('get-url-json-data', async (event, remoteUrl) => {
try {
return await getDraftUrls(remoteUrl, mainWindow);
} catch (error) {
logger.error(`[error] get draft url:`, error);
return {};
}
});
ipcMain.handle('save-file', async (event, config) => {
await downloadFiles(config, mainWindow);
});
ipcMain.handle('show-message-box', async (event, options) => {
return await dialog.showMessageBox(mainWindow, {
type: options.type || 'info',
title: options.title || '提示',
message: options.message || '',
buttons: ['确定'],
noLink: true, // 防止按钮以链接样式显示,这通常会使按钮更小更紧凑
normalizeAccessKeys: true // 标准化访问键,确保按钮文本格式一致
});
});
ipcMain.handle('get-config-data', async (event) => {
return await ensureAutoDetectedDraftPathInConfig();
});
// 设置默认草稿路径
ipcMain.handle('update-draft-path', async (event) => {
return await updateDraftPath(mainWindow);
});
// 在默认浏览器中打开URL
ipcMain.handle('open-external-url', async (event, url) => {
try {
const { shell } = require('electron');
await shell.openExternal(url);
logger.info(`已在默认浏览器中打开URL: ${url}`);
return { success: true };
} catch (error) {
logger.error(`打开URL失败: ${url}`, error);
return { success: false, error: error.message };
}
});
// 检测URL是否可访问
ipcMain.handle('check-url-access', async (event, url) => {
return await checkUrlAccessRight(url);
});
ipcMain.handle('get-history-record', async (event) => {
return await readHistoryRecord();
});
ipcMain.handle('get-app-version', async () => {
return app.getVersion();
});
}
module.exports = { setupIpcHandlers };
================================================
FILE: desktop-client/nodeapi/logger.js
================================================
// logger.js
const log4js = require('log4js');
const path = require('path');
const { app } = require('electron');
log4js.configure({
appenders: {
// 定义一个按日期分割的日志文件追加器
dateFile: {
type: 'dateFile',
filename: path.join(app.getPath('userData'), 'logs', 'app.log'), // 日志文件路径
pattern: 'yyyy-MM-dd', // 按天分割
compress: false, // 是否压缩备份文件
keepFileExt: true, // 保持.log扩展名
numBackups: 7 // 保留最近7天的备份
},
// 同时输出到控制台
console: { type: 'console' }
},
categories: {
default: {
appenders: ['dateFile', 'console'],
level: 'info' // 默认日志级别
}
}
});
const logger = log4js.getLogger();
module.exports = logger;
================================================
FILE: desktop-client/package.json
================================================
{
"name": "capcut-mate",
"version": "0.0.100",
"description": "剪映小助手,用于下载剪映草稿",
"main": "main.js",
"scripts": {
"start": "electron --enable-logging --v=1 .",
"web:dev": "npm --prefix web run dev",
"web:ci": "npm --prefix web ci",
"web:i": "npm --prefix web install",
"web:build": "npm --prefix web run build",
"build-win": "electron-packager . CapCut-Mate --platform=win32 --arch=x64 --out dist --overwrite --icon=assets/icons/logo.ico --ignore=.gitignore --ignore=.github --ignore=README.md --ignore=scripts --ignore=web",
"build-mac": "electron-packager . CapCut-Mate --platform=darwin --arch=arm64 --out dist --overwrite --icon=assets/icons/logo.icns --ignore=.gitignore --ignore=.github --ignore=README.md --ignore=scripts --ignore=web",
"build-mac-x64": "electron-packager . CapCut-Mate --platform=darwin --arch=x64 --out dist --overwrite --icon=assets/icons/logo.icns --ignore=.gitignore --ignore=.github --ignore=README.md --ignore=scripts --ignore=web",
"build-win-installer": "electron-builder --win nsis --x64 --config ./scripts/electron-builder.config.js --publish never",
"build-mac-installer": "electron-builder --mac --arm64 --config ./scripts/electron-builder.config.js --publish never",
"build-mac-x64-installer": "electron-builder --mac --x64 --config ./scripts/electron-builder.config.js --publish never",
"build-win-green": "electron-builder --win zip --x64 --config ./scripts/electron-builder-green.config.js --publish never",
"build-mac-green": "electron-builder --mac zip --arm64 --config ./scripts/electron-builder-green.config.js --publish never",
"build-mac-x64-green": "electron-builder --mac zip --x64 --config ./scripts/electron-builder-green.config.js --publish never"
},
"devDependencies": {
"@electron/packager": "^18.3.5",
"electron": "31.7.6",
"electron-builder": "^24.13.3"
},
"optionalDependencies": {
"dmg-license": "^1.0.11"
},
"author": "gogoshine",
"license": "MIT",
"dependencies": {
"axios": "^1.11.0",
"log4js": "^6.9.1",
"uuid": "^8.3.2"
}
}
================================================
FILE: desktop-client/preload.js
================================================
const { contextBridge, ipcRenderer } = require('electron');
console.log('Preload script is loaded!');
// 通过 contextBridge 安全地将 API 暴露给渲染进程
contextBridge.exposeInMainWorld('electronAPI', {
// 保存文件
saveFile: (data) => ipcRenderer.invoke('save-file', data),
getUrlJsonData: (url) => ipcRenderer.invoke('get-url-json-data', url),
getDownloadLog: () => ipcRenderer.invoke('get-download-log'),
clearDownloadLog: () => ipcRenderer.invoke('clear-download-log'),
// 监听来自主进程的日志消息
onFileOperationLog: (callback) => {
ipcRenderer.on('file-operation-log', (event, logEntry) => {
// 调用渲染进程提供的回调函数,并传递日志数据
callback(logEntry);
});
},
// 清理监听器,避免内存泄漏
removeAllFileOperationLogListeners: () => {
ipcRenderer.removeAllListeners('file-operation-log');
},
// 显示消息框
showMessageBox: (options) => ipcRenderer.invoke('show-message-box', options),
// 清空默认草稿路径
clearDefaultDraftPath: () => ipcRenderer.invoke('clear-default-draft-path'),
// 在默认浏览器中打开URL
openExternalUrl: (url) => ipcRenderer.invoke('open-external-url', url),
// 获取草稿保存路径
getConfigData: () => ipcRenderer.invoke('get-config-data'),
// 设置草稿保存路径
updateDraftPath: () => ipcRenderer.invoke('update-draft-path'),
// 检测URL是否可访问
checkUrlAccess: (url) => ipcRenderer.invoke('check-url-access', url),
getHistoryRecord: () => ipcRenderer.invoke('get-history-record'),
getAppVersion: () => ipcRenderer.invoke('get-app-version'),
});
================================================
FILE: desktop-client/scripts/electron-builder-green.config.js
================================================
module.exports = {
appId: "com.gogoshine.capcutmate",
productName: "CapCut-Mate",
directories: {
output: "dist"
},
win: {
icon: "assets/icons/logo.ico",
artifactName: "capcut-mate-windows-x64-green.zip",
},
mac: {
icon: "assets/icons/logo.icns",
artifactName: "capcut-mate-macos-\${arch}-green.zip",
hardenedRuntime: true,
gatekeeperAssess: false,
entitlements: "assets/entitlements.mac.plist",
entitlementsInherit: "assets/entitlements.mac.plist"
},
files: [
"!node_modules/**/*",
"!web/node_modules/**/*",
"!web/src/**/*",
"!web/public/**/*",
"!scripts/**/*",
"!*.yml",
"!*.yaml",
"!*.lock",
"!README.md",
"!Dockerfile",
"!docker-compose.yaml",
"node_modules/**/*",
"ui/**/*",
"nodeapi/**/*",
"*.js",
"*.json",
"assets/**/*"
],
extraResources: [
{
from: "assets/",
to: "assets/"
}
]
};
================================================
FILE: desktop-client/scripts/electron-builder.config.js
================================================
/**
* Electron Builder Configuration
*/
module.exports = {
appId: "com.gogoshine.capcut-mate",
productName: "剪映小助手",
directories: {
output: "dist"
},
files: [
"**/*",
// "!node_modules",
"!web",
"!dist",
"!electron-builder.config.js",
"!.gitignore",
"!.github",
"!README.md",
"!.vscode",
"!DS_Store",
],
win: {
icon: "assets/icons/logo.ico",
target: "nsis",
artifactName: "capcut-mate-windows-x64-installer.exe",
// 禁用代码签名
signingHashAlgorithms: []
},
nsis: {
oneClick: false,
allowToChangeInstallationDirectory: true,
},
mac: {
icon: "assets/icons/logo.icns",
target: [
{
target: "dmg",
arch: "arm64"
},
{
target: "dmg",
arch: "x64"
}
],
artifactName: "capcut-mate-macos-${arch}-installer.dmg",
category: "public.app-category.productivity",
hardenedRuntime: true,
gatekeeperAssess: false,
entitlements: "assets/entitlements.mac.plist",
entitlementsInherit: "assets/entitlements.mac.plist"
},
dmg: {
background: null,
window: {
width: 540,
height: 380
},
contents: [
{
x: 130,
y: 150,
type: "file"
},
{
x: 410,
y: 150,
type: "link",
path: "/Applications"
}
]
}
};
================================================
FILE: desktop-client/scripts/update-version.js
================================================
/**
* 更新 package.json 中的 version 字段为 GitHub tag 版本号
*/
const fs = require('fs');
const path = require('path');
// 获取 GitHub tag 版本号
const githubRef = process.env.GITHUB_REF;
console.log(`GITHUB_REF: ${githubRef}`);
if (!githubRef || !githubRef.startsWith('refs/tags/')) {
console.log('不是 tag 触发的构建,跳过版本更新');
process.exit(0);
}
// 提取 tag 名称(去除 refs/tags/ 前缀)
const tagName = githubRef.replace('refs/tags/', '');
console.log(`Tag 名称: ${tagName}`);
// 检查 tag 是否符合语义化版本规范 (v1.2.3 或 1.2.3)
const versionMatch = tagName.match(/v?(\d+\.\d+\.\d+)/);
if (!versionMatch) {
console.error(`Tag 名称 "${tagName}" 不符合语义化版本规范 (例: v1.2.3 或 1.2.3)`);
process.exit(1);
}
const version = versionMatch[1];
console.log(`提取的版本号: ${version}`);
// 读取 package.json 文件
const packageJsonPath = path.join(__dirname, '..', 'package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
// 更新版本号
const oldVersion = packageJson.version;
packageJson.version = version;
// 写回 package.json 文件
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
console.log(`成功更新版本号: ${oldVersion} -> ${version}`);
================================================
FILE: desktop-client/web/.gitignore
================================================
/node_modules
/dist
/ui
/.vscode
.DS_Store
.env
.env.local
.env.*.local
/coverage
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
.vscode-test
.idea
*.sublime-workspace
*.sublime-project
*.log
================================================
FILE: desktop-client/web/index.html
================================================
剪映小助手
================================================
FILE: desktop-client/web/package.json
================================================
{
"name": "@sd/web",
"version": "0.0.100",
"description": "剪映小助手,用于下载剪映草稿",
"scripts": {
"dev": "vite",
"build": "vite build",
"dev:electron": "cross-env NODE_ENV=development vite",
"build:electron": "cross-env NODE_ENV=production vite build"
},
"devDependencies": {
"@vitejs/plugin-react": "^5.1.1",
"cross-env": "^10.1.0",
"electron": "^39.2.5",
"electron-builder": "^26.0.12",
"less": "^4.6.4",
"vite": "^7.2.6",
"vite-plugin-electron": "^0.29.0"
},
"dependencies": {
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"axios": "^1.11.0",
"bootstrap": "^5.3.8",
"dayjs": "^1.11.19",
"react": "^19.2.0",
"react-bootstrap": "^2.10.10",
"react-bootstrap-icons": "^1.11.6",
"react-dom": "^19.2.0",
"react-router-dom": "^7.10.1",
"react-toastify": "^11.0.5"
}
}
================================================
FILE: desktop-client/web/public/index.html
================================================
剪映小助手
================================================
FILE: desktop-client/web/src/App.jsx
================================================
// import {
// BrowserRouter as Router,
// Routes,
// Route,
// Navigate,
// } from "react-router-dom";
import "bootstrap/dist/css/bootstrap.min.css";
import "react-toastify/dist/ReactToastify.css";
import "./styles/index.less";
import { ToastContainer } from "react-toastify";
import TopHeader from "./components/Header";
import HistoryPage from "./pages/History";
import MainPage from "./pages/Download";
import ConfigCenter from "./pages/ConfigCenter";
import { useEffect, useState } from "react";
import { fetchAppVersion } from "./utils/const";
function App() {
const [selectedTab, setSelectedTab] = useState("download");
const [appVersion, setAppVersion] = useState("");
useEffect(() => {
fetchAppVersion().then((version) => setAppVersion(version));
}, []);
const tabMap = {
download: ,
history: ,
config: ,
};
return (
{/*
*/}
{tabMap[selectedTab] || }
{/*
} />
} />
} />
} />
*/}
当前版本号:v{appVersion}
{/* */}
);
}
export default App;
================================================
FILE: desktop-client/web/src/components/DownloadButton.jsx
================================================
function DownloadButton({ onClick, isLoading, setIsLoading, textValue }) {
const handleClick = async () => {
setIsLoading(true);
try {
await onClick();
} finally {
setIsLoading(false);
}
};
return (
);
}
export default DownloadButton;
================================================
FILE: desktop-client/web/src/components/DownloadControls.jsx
================================================
function DownloadControls({ isOpen, onToggle, isLoading }) {
return (
);
}
export default DownloadControls;
================================================
FILE: desktop-client/web/src/components/ExternalWebpage.jsx
================================================
import { useEffect, useRef, useState } from "react";
import { fetchAppVersion } from "../utils/const";
import electronService from "../services/electronService";
const externalUrl = "https://jcaigc.cn/external-features";
function ExternalWebpage() {
const [iframeHeight, setIframeHeight] = useState(0);
const [isAccessible, setIsAccessible] = useState(null);
const [themeConfig, setThemeConfig] = useState(null);
const [appVersion, setAppVersion] = useState("");
const iframeRef = useRef(null);
// 将主题配置同步到全局 CSS 变量
useEffect(() => {
if (themeConfig && typeof themeConfig === "object") {
Object.entries(themeConfig).forEach(([key, value]) => {
document.documentElement.style.setProperty(key, value);
});
}
}, [themeConfig]);
const checkAccessibility = async () => {
try {
// 使用Electron提供的API来检测URL是否可访问(绕过CORS限制)
const result = await electronService.checkUrlAccess(externalUrl);
setIsAccessible(result.accessible);
} catch (error) {
// 请求失败,表示不可访问
setIsAccessible(false);
console.error("无法访问外部网页:", error);
}
};
useEffect(() => {
checkAccessibility();
}, []);
// 监听子页面发来的配置消息
useEffect(() => {
fetchAppVersion().then((version) => setAppVersion(version));
const handleMessage = (event) => {
// 安全校验:只接受来自指定域名的消息
if (event.origin !== new URL(externalUrl).origin) return;
if (event.data?.type === "config" && event.data?.payload) {
const { height, themeConfig: config } = event.data.payload;
const parsedHeight = +height;
if (parsedHeight && typeof parsedHeight === "number") {
setIframeHeight(parsedHeight);
}
if (config && typeof config === "object") {
setThemeConfig(config);
}
}
};
window.addEventListener("message", handleMessage);
return () => window.removeEventListener("message", handleMessage);
}, []);
// iframe 加载完成后,通知子页面父页面已就绪,并携带版本号
const handleIframeLoad = () => {
if (iframeRef.current?.contentWindow) {
iframeRef.current.contentWindow.postMessage(
{ type: "parentReady", appVersion },
new URL(externalUrl).origin,
);
}
};
// ✅ 关键:当版本号异步获取完成后,再次发送消息通知子页面父页面已就绪,并携带版本号
useEffect(() => {
if (appVersion) {
handleIframeLoad();
}
}, [appVersion]);
return (
);
}
export default ExternalWebpage;
================================================
FILE: desktop-client/web/src/components/Header/index.jsx
================================================
import electronService from "@/services/electronService";
import "./index.less";
// 顶部导航组件
function TopHeader({ onTabChange, selectedTab }) {
const handleTabClick = (tab) => {
onTabChange(tab);
};
return (
handleTabClick("download")}
>
剪映小助手(免费客户端)
{
handleTabClick("download");
electronService.openExternalUrl("https://jcaigc.cn");
}}
>
前往官网
handleTabClick("history")}
>
草稿历史
handleTabClick("config")}
>
配置中心
);
}
export default TopHeader;
================================================
FILE: desktop-client/web/src/components/Header/index.less
================================================
.top-header {
background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-dark) 100%);
color: #fff;
padding: 12px 16px;
text-align: right;
cursor: pointer;
width: 100%;
position: fixed;
z-index: 1;
}
.top-nav {
display: flex;
justify-content: space-between;
align-items: center;
flex-direction: row;
gap: 16px;
}
.top-nav-group {
display: flex;
justify-content: end;
align-items: center;
flex-direction: row;
gap: 16px;
}
.top-nav-item {
font-size: 16px;
color: rgba(255, 255, 255, .8);
transition: color 0.3s ease;
text-decoration: none ;
}
.top-nav-item.logo {
font-size: 20px;
}
.top-nav-item:hover {
color: #fff;
}
.top-nav-item.active {
color: #fff;
border-bottom: 2px solid #fff;
padding-bottom: 2px;
}
================================================
FILE: desktop-client/web/src/components/LogModule.jsx
================================================
import { formatToTime } from '../utils/date';
import { useEffect, useRef } from 'react';
function LogModule({ logs, onClear }) {
const logIconMap = {
// info: "fas fa-info-circle",
// success: "fas fa-check-circle",
error: "fas fa-times-circle",
// loading: "fas fa-spinner fa-spin",
all: "fas fa-check-circle", // check-square
};
const logListRef = useRef(null);
// 当日志列表变化时,自动滚动到底部
useEffect(() => {
if (logListRef.current) {
logListRef.current.scrollTop = logListRef.current.scrollHeight;
}
}, [logs]);
return (
下载日志
清空日志
{logs.length === 0 ? (
暂无日志记录
) : (
{logs.map((log, index) => (
[{formatToTime(log.time)}]
{log.message}
))}
)}
);
}
export default LogModule;
================================================
FILE: desktop-client/web/src/components/Tabs.jsx
================================================
import React, { useState } from 'react';
function Tabs({ onTabChange, initialContent }) {
const templates = {
template1: {
title: "案例一",
content: "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251204214904ccb1af38"
},
template2: {
title: "案例二",
content: "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025120421372636a27729"
}
};
const [activeTab, setActiveTab] = useState('');
const handleTabClick = (templateId) => {
setActiveTab(templateId);
onTabChange(templates[templateId].content);
};
return (
案例草稿:
{Object.entries(templates).map(([key, template]) => (
handleTabClick(key)}
data-template={key}
>
{template.title}
))}
);
}
export default Tabs;
================================================
FILE: desktop-client/web/src/components/Textarea.jsx
================================================
import React, { useState, useEffect } from 'react';
function Textarea({ value, onChange }) {
const [textareaHeight, setTextareaHeight] = useState('auto');
const handleInput = (e) => {
onChange(e.target.value);
adjustTextareaHeight(e.target);
};
const adjustTextareaHeight = (textarea) => {
textarea.style.height = 'auto';
const newHeight = Math.min(textarea.scrollHeight, 300); // 设置最大高度
setTextareaHeight(`${newHeight}px`);
};
useEffect(() => {
const textarea = document.querySelector('.auto-resize-textarea');
if (textarea) {
adjustTextareaHeight(textarea);
}
}, [value]);
return (
);
}
export default Textarea;
================================================
FILE: desktop-client/web/src/index.jsx
================================================
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
);
================================================
FILE: desktop-client/web/src/pages/ConfigCenter/index.jsx
================================================
import { useEffect, useState } from "react";
import electronService from "../../services/electronService";
import "./index.less";
import { toast } from "react-toastify";
const ConfigCenter = () => {
const [config, setConfig] = useState({ targetDirectory: "" });
const loadConfig = async () => {
try {
const configData = await electronService.getConfigData();
setConfig(configData || { targetDirectory: "" });
} catch (error) {
console.error("加载配置失败:", error);
}
};
// 加载配置
useEffect(() => {
loadConfig();
}, []);
const handleSelectPath = async () => {
try {
const { success, targetDir, error } =
await electronService.updateDraftPath();
if (success) {
setConfig({ targetDirectory: targetDir });
// } else if (error) {
// toast.info(error);
}
} catch (error) {
toast.error("选择路径失败:", error);
}
};
return (
剪映路径设置
{/*
*/}
当前路径:
选择...
设置剪映软件的草稿路径以导入草稿至剪映
{/*
*/}
);
};
export default ConfigCenter;
================================================
FILE: desktop-client/web/src/pages/ConfigCenter/index.less
================================================
.setting-path-input-group {
gap: 10px;
margin-bottom: 5px;
}
.setting-path-label {
font-size: 14px;
width: 70px;
}
.settings-hint {
font-size: 12px;
color: #7f8c8d;
margin-left: 80px;
}
.setting-draft-path-input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 14px;
cursor: pointer;
}
================================================
FILE: desktop-client/web/src/pages/Download/index.jsx
================================================
import { useState, useEffect, useRef } from "react";
import { toast } from "react-toastify";
import electronService from "../../services/electronService";
import ExternalWebpage from "../../components/ExternalWebpage";
import Textarea from "../../components/Textarea";
import Tabs from "../../components/Tabs";
import DownloadControls from "../../components/DownloadControls";
import DownloadButton from "../../components/DownloadButton";
import LogModule from "../../components/LogModule";
import "./index.less";
function MainPage() {
const [textareaValue, setTextareaValue] = useState("");
const [isDownloadOpen, setIsDownloadOpen] = useState(true);
const [logs, setLogs] = useState([]);
const [isLoading, setIsLoading] = useState(false);
// 外层容器的ref,用于实现自动滚动
const downloadPageRef = useRef(null);
// 加载配置
useEffect(() => {
// 监听日志更新
electronService.onFileOperationLog((logEntry) => {
setLogs((prevLogs) => [...prevLogs, logEntry]);
});
return () => {
try {
electronService.removeAllFileOperationLogListeners();
} catch (error) {
console.error("取消订阅日志失败:", error);
}
};
}, []);
// 当日志更新时,将外层容器滚动到底部
useEffect(() => {
if (downloadPageRef.current) {
downloadPageRef.current.scrollTop = downloadPageRef.current.scrollHeight;
}
}, [logs]);
const handleDownload = async () => {
const trimmedValue = textareaValue.trim();
if (!trimmedValue) {
toast.warn("请输入草稿地址,多个使用回车换行分隔");
return;
}
const valArray = trimmedValue.split("\n").map((line) => line.trim());
for (const val of valArray) {
if (val) {
await saveFile(val);
}
}
};
const saveFile = async (value) => {
// 从URL中提取draft_id
const urlParams = new URLSearchParams(
value.includes("?") ? value.split("?")[1] : ""
);
const targetId = urlParams.get("draft_id");
if (!targetId) {
toast.warn(`${value} 中缺少 draft_id 参数`);
return;
}
try {
const jsonData = await electronService.getUrlJsonData(value);
if (jsonData?.code !== 0 || !jsonData?.files) {
toast.error("获取文件列表失败,请确保您输入的地址可正常访问");
return;
}
const matchedFiles = jsonData.files.filter((fileUrl) =>
fileUrl.includes(targetId)
);
if (matchedFiles.length === 0) {
toast.error("未找到包含 draft_id 的文件");
return;
}
setLogs([]);
await electronService.saveFile({
sourceUrl: value,
remoteFileUrls: matchedFiles,
targetId,
isOpenDir: isDownloadOpen,
});
toast.success(`剪映草稿下载完成!请前往剪映查看`);
} catch (error) {
toast.error("保存文件失败", error);
}
};
const handleClearLogs = () => setLogs([]);
return (
);
}
export default MainPage;
================================================
FILE: desktop-client/web/src/pages/Download/index.less
================================================
.download-page {
height: 100%;
overflow-y: auto;
}
/* 外部网页样式 */
.external-webpage-container {
position: relative;
border-radius: 8px;
overflow: hidden;
}
.external-webpage {
display: block;
transition: opacity 0.3s ease;
}
.external-webpage.loading {
opacity: 0.5;
}
.loading-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: rgba(255, 255, 255, 0.8);
z-index: 10;
}
.loading-spinner {
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
margin-bottom: 10px;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* 文本输入区域样式 */
.textarea-container {
margin-bottom: 20px;
position: relative;
}
.auto-resize-textarea {
width: 100%;
min-height: 120px;
padding: 8px;
border: 1px solid #ddd;
border-radius: 8px;
resize: none;
font-size: 1rem;
line-height: 1.5;
transition: border-color 0.3s;
display: block;
}
.auto-resize-textarea:focus {
outline: none;
border-color: var(--secondary-color);
box-shadow: 0 0 0 2px rgba(var(--secondary-color-rgb), 0.2);
}
/* Tab样式 */
.tabs-module {
display: flex;
align-items: center;
}
.tabs {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.tab-btn {
padding: 8px 20px;
background: #f8f9fa;
border: 1px solid #dee2e6;
border-radius: 32px;
cursor: pointer;
transition: all 0.3s;
font-weight: 500;
}
.tab-btn:hover {
background: #e9ecef;
}
.tab-btn.active {
background: var(--secondary-color);
color: white;
border-color: var(--secondary-color);
}
/* 开关样式 */
.switch-container {
display: flex;
align-items: center;
gap: 8px;
}
.switch {
position: relative;
display: inline-block;
width: 48px;
height: 24px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: 0.4s;
border-radius: 34px;
}
.slider:before {
position: absolute;
content: "";
height: 16px;
width: 16px;
left: 4px;
bottom: 4px;
background-color: white;
transition: 0.4s;
border-radius: 50%;
}
.log-module {
border: 1px solid #ddd;
border-radius: 8px;
background-color: #fff;
overflow: hidden;
}
.log-module .module-title {
padding: 8px 12px;
}
.log-module .module-title {
background-color: #f8f8f8;
border-bottom: solid 1px #ddd;
}
.log-empty {
padding: 20px;
text-align: center;
color: #7f8c8d;
font-size: 1rem;
}
/* 日志列表样式 */
.log-list {
list-style: none;
max-height: 300px;
overflow-y: auto;
}
.log-item {
padding: 8px 12px;
border-bottom: 1px solid #eee;
display: flex;
align-items: center;
gap: 10px;
font-size: 1rem;
}
.log-time {
color: #7f8c8d;
}
.log-item .log-icon:not(.show) {
display: none;
}
.log-item .log-icon.loading,
.log-item .log-icon.all {
display: inline-block;
}
.log-item.loading,
i.log-icon {
color: var(--secondary-color);
}
.log-item.all,
.log-item.success,
.log-item.all i.log-icon,
.log-item.success i.log-icon {
color: #0da73b;
}
.log-item.error,
i.log-icon.error {
color: #e74c3c;
}
.log-message {
flex: 1;
word-break: break-word;
text-align: left;
}
.log-item:last-child {
border-bottom: none;
}
================================================
FILE: desktop-client/web/src/pages/History/index.jsx
================================================
import { useState, useEffect, useMemo } from "react";
import { toast } from "react-toastify";
import {
ListGroup,
Pagination,
OverlayTrigger,
Tooltip,
} from "react-bootstrap";
import {
CalendarCheckFill,
CollectionPlayFill,
ClockHistory,
Clipboard,
} from "react-bootstrap-icons";
import electronService from "../../services/electronService";
import { formatToDateTime } from "../../utils/date";
import "./index.less";
// 草稿历史记录页面组件
function HistoryPage() {
// 状态管理
const [historyList, setHistoryList] = useState([]); // 历史记录列表
const [currentPage, setCurrentPage] = useState(1); // 当前页码
const [pageSize, setPageSize] = useState(10); // 每页记录数
const [totalCount, setTotalCount] = useState(0); // 总记录数
const [isLoading, setIsLoading] = useState(false); // 加载状态
const [paginationItems, setPaginationItems] = useState([]); // 分页项
// 加载历史记录数据
const loadHistoryData = async () => {
setCurrentPage(1);
setIsLoading(true);
try {
// 从electronService获取完整历史记录
let allHistory = await electronService.getHistoryRecord() || [];
// 按时间倒序排列,使最新的草稿在最前面
allHistory = allHistory.sort(
(a, b) => new Date(b.time) - new Date(a.time),
);
setHistoryList(allHistory);
setTotalCount(allHistory.length || 0);
setPaginationItems(getPaginatedData(1, allHistory));
} catch (error) {
toast.error("加载历史记录失败");
} finally {
setIsLoading(false);
}
};
// 初始加载数据
useEffect(() => {
loadHistoryData();
}, []);
// 复制草稿地址到剪贴板
const copyDraftUrl = (url) => {
navigator.clipboard
.writeText(url)
.then(() => {
toast.success("草稿地址已复制到剪贴板");
})
.catch(() => {
toast.error("复制失败,请手动复制");
});
};
// 计算分页数据
const getPaginatedData = (
curPage = currentPage,
allHistory = historyList,
) => {
const startIndex = (curPage - 1) * pageSize;
const endIndex = startIndex + pageSize;
return allHistory.slice(startIndex, endIndex);
};
// 计算总页数
const totalPages = useMemo(
() => Math.ceil(totalCount / pageSize),
[totalCount, pageSize],
);
// 处理页码变更
const handlePageChange = (page) => {
if (page >= 1 && page <= totalPages) {
setCurrentPage(page);
setPaginationItems(getPaginatedData(page));
}
};
const renderPaginationItems = () => {
const items = [];
const maxPagesToShow = 5;
const halfPagesToShow = Math.floor(maxPagesToShow / 2);
let startPage = Math.max(1, currentPage - halfPagesToShow);
let endPage = Math.min(totalPages, currentPage + halfPagesToShow);
if (currentPage <= halfPagesToShow) {
endPage = Math.min(totalPages, maxPagesToShow);
} else if (currentPage + halfPagesToShow >= totalPages) {
startPage = Math.max(1, totalPages - maxPagesToShow + 1);
}
if (startPage > 1) {
items.push( );
}
for (let page = startPage; page <= endPage; page++) {
items.push(
handlePageChange(page)}
>
{page}
,
);
}
if (endPage < totalPages) {
items.push( );
}
return items;
};
const copyToClipboard = (text) => {
if (!text) return;
navigator.clipboard
.writeText(text)
.then(() => {
toast.success("已复制到剪贴板");
})
.catch((err) => {
toast.error("复制失败: " + err);
});
};
return (
{/* 历史记录列表 */}
草稿历史记录
{paginationItems.length > 0 ? (
paginationItems.map((item, index) => (
解析时间:{" "}
{formatToDateTime(item.time)}
{item.draft_url || "暂无地址"}
}
>
草稿地址:
{item.draft_url || "暂无"}
{item.draft_url && (
{
e.stopPropagation();
copyToClipboard(item.draft_url);
}}
/>
)}
))
) : (
暂无草稿记录
)}
{historyList.length > 0 && (
总记录数:
{historyList.length}
handlePageChange(1)}
disabled={currentPage === 1}
/>
handlePageChange(currentPage - 1)}
disabled={currentPage === 1}
/>
{renderPaginationItems()}
handlePageChange(currentPage + 1)}
disabled={currentPage === totalPages}
/>
handlePageChange(totalPages)}
disabled={currentPage === totalPages}
/>
)}
);
}
export default HistoryPage;
================================================
FILE: desktop-client/web/src/pages/History/index.less
================================================
.history-page {
padding: 20px 0;
height: 100%;
overflow-y: auto;
}
.history-page h2 {
margin-bottom: 20px;
font-size: 24px;
color: #333;
text-align: center;
}
.history-list-container {
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
padding: 20px;
margin-bottom: 20px;
.history-list-title {
color: var(--primary-color);
font-size: 22px;
font-weight: 600;
display: flex;
align-items: center;
}
.clock-history {
font-size: 14px;
color: var(--primary-color);
margin-right: 8px;
}
}
.loading,
.empty-state {
text-align: center;
padding: 40px 0;
color: #666;
font-size: 16px;
}
.history-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.history-item {
border: 1px solid #e0e0e0;
border-radius: 6px;
padding: 15px;
transition: all 0.3s ease;
}
.history-item:hover {
border-color: #007bff;
box-shadow: 0 2px 8px rgba(0, 123, 255, 0.15);
}
.history-item-header {
display: flex;
justify-content: space-between;
margin-bottom: 8px;
font-size: 14px;
}
.draft-id {
font-weight: 600;
color: #333;
}
.download-time {
color: #666;
font-size: 12px;
}
.history-item-content {
display: flex;
align-items: center;
gap: 10px;
position: relative;
}
.history-count {
color: var(--primary-color);
font-weight: 500;
margin-left: 4px;
}
.pagination {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 16px;
padding: 8px 0;
flex-wrap: wrap;
gap: 15px;
--bs-pagination-color: var(--primary-color);
--bs-pagination-hover-color: var(--primary-dark);
--bs-pagination-focus-color: var(--primary-dark);
--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(var(--primary-color-rgb), 0.25);
--bs-pagination-active-bg: var(--primary-color);
--bs-pagination-active-border-color: var(--primary-color);
}
/* 响应式设计 */
@media (max-width: 768px) {
.history-item-header {
flex-direction: column;
gap: 5px;
}
.pagination {
flex-direction: column;
align-items: stretch;
}
}
@media (max-width: 480px) {
.history-list-container {
padding: 10px;
}
.pagination {
padding: 10px;
}
}
================================================
FILE: desktop-client/web/src/services/electronService.js
================================================
/**
* Electron API服务层
* 封装Electron API调用,实现浏览器和Electron环境的兼容
*/
import axios from 'axios';
// 检查是否在Electron环境中
const isElectron = () => {
return window && window.electronAPI;
};
// 空实现或模拟实现(用于浏览器环境)
const mockElectronAPI = {
getConfigData: async () => {
console.warn('Electron API not available in browser: getConfigData');
return { targetDirectory: '' };
},
getDownloadLog: async () => {
console.warn('Electron API not available in browser: getDownloadLog');
return [];
},
onFileOperationLog: (callback) => {
console.warn('Electron API not available in browser: onFileOperationLog');
return () => {}; // 返回空的卸载函数
},
removeAllFileOperationLogListeners: () => {
console.warn('Electron API not available in browser: removeAllFileOperationLogListeners');
},
getUrlJsonData: async (url) => {
console.warn('Electron API not available in browser: getUrlJsonData');
// 在浏览器环境中,可以直接使用axios请求
try {
// const response = await fetch(url);
// return response.json();
return {};
} catch (error) {
console.error('Error fetching data in browser:', error);
return { code: -1, message: 'Browser fetch failed' };
}
},
saveFile: async (options) => {
console.warn('Electron API not available in browser: saveFile');
alert('保存文件功能仅在桌面应用中可用');
return { success: false, message: 'Not available in browser' };
},
clearDownloadLog: () => {
console.warn('Electron API not available in browser: clearDownloadLog');
},
openExternalUrl: (url) => {
console.warn('Electron API not available in browser: openExternalUrl');
window.open(url, '_blank');
},
updateDraftPath: async () => {
console.warn('Electron API not available in browser: updateDraftPath');
alert('选择路径功能仅在桌面应用中可用');
return { success: false, message: 'Not available in browser' };
},
checkUrlAccess: async (url) => {
console.warn('Electron API not available in browser: checkUrlAccess');
try {
// 在浏览器环境中,使用axios请求
const response = await axios({
method: "HEAD",
url: url,
timeout: 5000
});
return { accessible: response.status < 400 };
} catch (error) {
console.error('Error checking URL accessibility in browser:', error);
return { accessible: false };
}
},
getHistoryRecord: async () => {
console.warn('Electron API not available in browser: getHistoryRecord');
return [];
},
getAppVersion: async () => {
return null;
},
};
// 实际的Electron API(用于Electron环境)
const electronAPI = {
getConfigData: async () => {
return await window.electronAPI.getConfigData();
},
getDownloadLog: async () => {
return await window.electronAPI.getDownloadLog();
},
onFileOperationLog: async (callback) => {
return await window.electronAPI.onFileOperationLog(callback);
},
removeAllFileOperationLogListeners: () => {
window.electronAPI.removeAllFileOperationLogListeners();
},
getUrlJsonData: async (url) => {
return await window.electronAPI.getUrlJsonData(url);
},
saveFile: async (options) => {
return await window.electronAPI.saveFile(options);
},
clearDownloadLog: () => {
window.electronAPI.clearDownloadLog();
},
checkUrlAccess: async (url) => {
return await window.electronAPI.checkUrlAccess(url);
},
openExternalUrl: (url) => {
window.electronAPI.openExternalUrl(url);
},
updateDraftPath: async () => {
return await window.electronAPI.updateDraftPath();
},
getHistoryRecord: async () => {
return await window.electronAPI.getHistoryRecord();
},
getAppVersion: async () => {
return await window.electronAPI.getAppVersion();
},
};
// 根据环境选择使用哪个API实现
const electronService = isElectron() && window.electronAPI ? electronAPI : mockElectronAPI;
export default electronService;
================================================
FILE: desktop-client/web/src/styles/index.less
================================================
@charset "UTF-8";
@import "./root.less";
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}
html,
body,
#root,
.app {
height: 100%;
width: 100%;
overflow: hidden;
}
body {
background-color: #f5f7fa;
color: #333;
line-height: 1.6;
}
.hide {
display: none !important;
}
.main-content {
padding: 80px 0 40px;
width: 100%;
height: 100%;
overflow: hidden;
}
.main-content > div {
padding: 0 16px;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
.card {
position: relative;
padding: 22px;
display: flex;
flex-direction: column;
min-width: 0;
color: #212529;
word-wrap: break-word;
background-color: #fff;
background-clip: border-box;
border: 1px solid rgba(0, 0, 0, 0.175);
border-radius: 0.375rem;
}
.card-body {
flex: 1 1 auto;
padding: 1rem;
}
.section-title {
color: var(--secondary-color);
font-size: 16px;
font-weight: 500;
margin-bottom: 15px;
display: flex;
align-items: center;
}
.section-title:after {
content: "";
flex: 1;
height: 1px;
background: linear-gradient(to right, var(--secondary-light), transparent);
margin-left: 15px;
}
.setting-item {
font-size: 14px;
color: #555;
display: flex;
align-items: center;
padding: 5px 0;
flex-wrap: wrap;
}
i.fas {
color: var(--secondary-color);
}
.btn i.fas {
color: white;
}
h1 {
font-size: 2.5rem;
margin-bottom: 10px;
}
.flex {
display: flex;
}
.item-center {
align-items: center;
}
.justify-center {
justify-content: center;
}
.justify-between {
justify-content: space-between;
}
.subtitle {
font-size: 1.2rem;
opacity: 0.9;
}
.module {
border-radius: 10px;
margin-bottom: 24px;
}
.module-title {
font-size: 1rem;
color: #2c3e50;
display: flex;
align-items: center;
justify-content: space-between;
}
input:disabled + .slider {
background-color: #95a5a6;
cursor: not-allowed;
}
input:checked:not(:disabled) + .slider {
background-color: var(--secondary-color);
}
input:checked + .slider:before {
transform: translateX(24px);
}
.app-footer {
position: fixed;
bottom: 0;
width: 100%;
text-align: center;
padding-bottom: 16px;
font-size: 12px;
color: #999;
}
/* 按钮样式 */
.btn {
padding: 14px 28px;
background: linear-gradient(
135deg,
var(--secondary-color) 0%,
var(--primary-color) 100%
);
color: white;
border: none;
border-radius: 8px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: all 0.3s;
display: inline-flex;
align-items: center;
gap: 8px;
}
.btn:hover:not(:disabled) {
background: linear-gradient(
135deg,
var(--primary-light) 0%,
var(--primary-dark) 100%
);
color: white;
transform: translateY(-2px);
}
.btn:disabled:not(:hover) {
background: linear-gradient(
135deg,
var(--secondary-light) 0%,
var(--secondary-color) 100%
);
color: white;
cursor: not-allowed;
transform: none;
}
.btn-download {
width: 100%;
justify-content: center;
}
.btn-small {
padding: 8px;
}
.btn-clear,
.btn-small {
background: var(--secondary-color);
padding: 4px 8px;
font-size: 0.75rem;
}
.btn-clear:hover,
.btn-small:hover {
background: var(--secondary-light);
}
.btn-small {
padding: 8px 16px;
font-size: 14px;
background-color: var(--secondary-color);
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
.btn-small:hover {
background-color: var(--secondary-light);
}
@media (min-width: 992px) {
.container {
max-width: 960px;
}
}
@media (min-width: 1200px) {
.container {
max-width: 1140px;
}
}
@media (min-width: 1400px) {
.container {
max-width: 1320px;
}
}
================================================
FILE: desktop-client/web/src/styles/root.less
================================================
@charset "UTF-8";
:root {
/* 基础蓝色系 */
--primary-color: #356bfd;
--primary-light: #5c89ff;
--primary-dark: #1a50d9;
--primary-color-rgb: 53, 107, 253;
--primary-light-rgb: 92, 137, 255;
--primary-dark-rgb: 26, 80, 217;
/* 辅助蓝色系 */
--secondary-color: #3498db;
--secondary-light: #5dade2;
--secondary-dark: #1a6ba3;
--secondary-color-rgb: 52, 152, 219;
--secondary-light-rgb: 93, 173, 226;
--secondary-dark-rgb: 26, 107, 163;
}
================================================
FILE: desktop-client/web/src/utils/const.tsx
================================================
import electronService from "../services/electronService";
import { version } from "../../package.json";
export const THEME_COLOR = "#5c89ff"; // --primary-l
export const G_EmptyStr = "-";
export const fetchAppVersion = async () => {
let appVersion = version;
try {
const realVersion = await electronService.getAppVersion();
if (realVersion) {
return realVersion;
}
} catch (error) {
console.error("获取应用版本号失败:", error);
}
return appVersion;
};
================================================
FILE: desktop-client/web/src/utils/date.ts
================================================
/**
* 时间格式化工具函数
*/
import type { ConfigType } from "dayjs";
import dayjs from "dayjs";
import { G_EmptyStr } from "./const";
export const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
export const DATE_TIME_MIN_FORMAT = "YYYY-MM-DD HH:mm";
const DATE_FORMAT = "YYYY-MM-DD";
const TIME_FORMAT = "HH:mm:ss";
export function formatToDateTime(
date: ConfigType = null,
format = DATE_TIME_FORMAT
): string {
return date ? dayjs(date).format(format) : G_EmptyStr;
}
export function formatToDateTimeMin(
date: ConfigType = null,
format = DATE_TIME_MIN_FORMAT
): string {
return formatToDateTime(date, format);
}
export function formatToDate(
date: ConfigType = null,
format = DATE_FORMAT
): string {
return date ? dayjs(date).format(format) : G_EmptyStr;
}
export function formatToTime(
date: ConfigType = null,
format = TIME_FORMAT
): string {
return date ? dayjs(date).format(format) : G_EmptyStr;
}
export function formatToUTCDate(date: ConfigType = null): string {
return date ? dayjs(date).format() : G_EmptyStr;
}
/** 转Date实例 */
export function toDate(date?: ConfigType) {
return dayjs(date).toDate();
}
/** 转时间戳 */
export function toTimeStamp(date?: ConfigType) {
return dayjs(date).valueOf();
}
export const dateUtil = dayjs;
================================================
FILE: desktop-client/web/vite.config.js
================================================
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import electron from 'vite-plugin-electron'
// https://vitejs.dev/config/
export default defineConfig({
base: './',
plugins: [
react(),
// Electron插件仅在生产构建时启用
// ...(process.env.NODE_ENV === 'production' ? [electron({
// entry: 'electron/main.js',
// })] : [])
],
resolve: {
alias: {
'@': '/src'
}
},
server: {
port: 9000,
open: true
},
build: {
outDir: '../ui',
emptyOutDir: true
}
})
================================================
FILE: docker-compose.example.yaml
================================================
services:
capcut-mate:
image: gogoshine/capcut-mate:latest
#image: gogoshine/capcut-mate:sha-190a61f
ports:
- "30000:30000"
volumes:
- ./logs:/app/logs
- /opt/1panel/apps/openresty/openresty/www/sites/capcut-mate.jcaigc.cn/index/output:/app/output # 挂载配置文件目录
- /etc/localtime:/etc/localtime:ro # 挂载主机时区
- /etc/timezone:/etc/timezone:ro # 挂载时区名称(可选)
environment:
# 草稿下载URL
- DRAFT_URL=https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft
# 用于将容器内部的文件路径转成URL,本质是将/app/替换成DOWNLOAD_URL得到下载路径
- DOWNLOAD_URL=https://capcut-mate.jcaigc.cn/
# 草稿提示URL
- TIP_URL=https://docs.jcaigc.cn
# 文件下载大小限制(字节),默认200MB(209715200)
- DOWNLOAD_FILE_SIZE_LIMIT=209715200
mem_limit: 2G # 内存限制
memswap_limit: 2G # 总内存(物理内存 + Swap)限制
cpus: '2' # CPU使用率限制为150%,即容器最多可以使用1.5个完整的CPU核心
oom_score_adj: -500 # 调整 OOM 杀手优先级
restart: unless-stopped # 除非手动停止,否则总是重启容器
container_name: capcut-mate # 这里指容器名称,非必需,不指定时,名称为:<项目名称>-<服务名称>-<序号>
#entrypoint: ["/bin/sh", "-c", "sleep 10000"]
================================================
FILE: docker-compose.yaml
================================================
services:
capcut-mate:
image: gogoshine/capcut-mate:latest
#image: gogoshine/capcut-mate:sha-190a61f
platform: linux/amd64
ports:
- "30000:30000"
volumes:
- ./output:/app/output # 挂载配置文件目录
- ./logs:/app/logs
- /etc/localtime:/etc/localtime:ro # 挂载主机时区
- /etc/timezone:/etc/timezone:ro # 挂载时区名称(可选)
environment:
# 草稿下载URL
- DRAFT_URL=http://127.0.0.1/openapi/capcut-mate/v1/get_draft
# 用于将容器内部的文件路径转成URL,本质是将/app/替换成DOWNLOAD_URL得到下载路径
- DOWNLOAD_URL=http://127.0.0.1/
# 草稿提示URL
- TIP_URL=https://docs.jcaigc.cn
# 文件下载大小限制(字节),默认200MB(209715200)
- DOWNLOAD_FILE_SIZE_LIMIT=209715200
networks:
- capcut-mate-network
mem_limit: 2G # 内存限制
memswap_limit: 2G # 总内存(物理内存 + Swap)限制
cpus: '2' # CPU使用率限制为150%,即容器最多可以使用1.5个完整的CPU核心
oom_score_adj: -500 # 调整 OOM 杀手优先级
restart: unless-stopped # 除非手动停止,否则总是重启容器
container_name: capcut-mate # 这里指容器名称,非必需,不指定时,名称为:<项目名称>-<服务名称>-<序号>
#entrypoint: ["/bin/sh", "-c", "sleep 10000"]
linux: # nginx服务器
image: gogoshine/linux:latest
platform: linux/amd64
ports:
- "80:80"
volumes:
- ./output:/app/www/output
networks:
- capcut-mate-network
mem_limit: 2G # 内存限制
memswap_limit: 2G # 总内存(物理内存 + Swap)限制
cpus: '2.0' # CPU使用率限制为150%,即容器最多可以使用1.5个完整的CPU核心
oom_score_adj: -500 # 调整 OOM 杀手优先级
restart: unless-stopped # 除非手动停止,否则总是重启容器
container_name: linux # 这里指容器名称,非必需,不指定时,名称为:<项目名称>-<服务名称>-<序号>
#entrypoint: ["/bin/sh", "-c", "sleep 10000"]
networks:
capcut-mate-network:
driver: bridge
================================================
FILE: docs/add_audios.md
================================================
# ADD_AUDIOS API Documentation
## 🌐 Language Switch
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_audios
```
## Function Description
Batch add audio materials to existing drafts. This interface supports adding multiple audio files to Jianying drafts, creating background music, sound effects, narration and other audio content for videos. Audio will be added to separate audio tracks without affecting video content.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"audio_infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/audio1.mp3\",\"start\":0,\"end\":5000000,\"duration\":10000000,\"volume\":1.0,\"audio_effect\":\"reverb\"}]"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string | ✅ | - | Complete URL of the target draft |
| audio_infos | string | ✅ | - | JSON string of audio information array |
### audio_infos Array Structure
audio_infos is a JSON string that resolves to an array, with each element containing the following fields:
| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| audio_url | string | ✅ | - | URL address of the audio file |
| start | number | ✅ | - | Audio start playback time (microseconds) |
| end | number | ✅ | - | Audio end playback time (microseconds) |
| duration | number | ❌ | Automatically obtained | Total audio duration (microseconds), automatically obtained if not provided |
| volume | number | ❌ | 1.0 | Volume size (0.0-2.0) |
| audio_effect | string | ❌ | None | Audio effect name |
### Parameter Details
#### Time Parameters
- **start**: Start time of the audio on the timeline, unit microseconds (1 second = 1,000,000 microseconds)
- **end**: End time of the audio on the timeline, unit microseconds
- **duration**: Total duration of the audio file, used for material creation, unit microseconds, automatically obtained if not provided
- **Playback Duration**: Actual playback duration = end - start
#### Volume Control
- **volume**: Audio volume size
- 1.0 = Original volume
- 0.5 = Half volume
- 0.0 = Mute
- Range: 0.0 - 2.0
#### Audio Effects
- **audio_effect**: Audio effect name
- None = No audio effect
- Example: `"reverb"` (reverb effect)
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "audio-track-uuid",
"audio_ids": ["audio1-uuid", "audio2-uuid", "audio3-uuid"]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| track_id | string | Audio track ID |
| audio_ids | array | List of added audio IDs |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Audio Addition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_audios \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/bgm.mp3\",\"start\":0,\"end\":10000000,\"duration\":15000000,\"volume\":0.8}]"
}'
```
#### 2. Batch Adding Multiple Audios
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_audios \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/intro.mp3\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"volume\":1.0},{\"audio_url\":\"https://assets.jcaigc.cn/bgm.mp3\",\"start\":3000000,\"end\":30000000,\"duration\":35000000,\"volume\":0.6}]"
}'
```
#### 3. Audio with Fade In/Out Effects
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_audios \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/outro.mp3\",\"start\":25000000,\"end\":30000000,\"duration\":8000000,\"volume\":0.9,\"audio_effect\":\"reverb\"}]"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft URL |
| 400 | audio_infos is required | Missing audio information parameter | Provide valid audio information JSON |
| 400 | audio_infos format error | JSON format is incorrect | Check JSON string format |
| 400 | Audio configuration validation failed | Audio parameters do not meet requirements | Check parameters for each audio |
| 400 | audio_url is required | Audio URL missing | Provide URL for each audio |
| 400 | Time range invalid | end must be greater than start | Ensure end time is greater than start time |
| 400 | Volume value invalid | volume not in 0.0-2.0 range | Use volume value between 0.0-2.0 |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 404 | Audio resource does not exist | Audio URL inaccessible | Check if audio URL is accessible |
| 500 | Audio processing failed | Internal processing error | Contact technical support |
## Notes
1. **JSON Format**: audio_infos must be a valid JSON string
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Audio Format**: Ensure audio file format is supported (e.g., MP3, WAV, AAC, etc.)
4. **File Size**: Large audio files may affect processing speed
5. **Network Access**: Audio URL must be accessible
6. **Volume Range**: Volume value must be within 0.0-2.0 range
7. **Track Limitation**: Audio overlap may occur in the same time period
## Workflow
1. Validate required parameters (draft_url, audio_infos)
2. Parse audio_infos JSON string
3. Validate parameter configuration for each audio
4. Obtain and decrypt draft content
5. Create audio track
6. Add audio segments to track
7. Apply volume and audio effects
8. Save and encrypt draft
9. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Images](./add_images.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_audios.zh.md
================================================
# ADD_AUDIOS API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/add_audios
```
## 功能描述
批量向现有草稿中添加音频素材。该接口支持添加多个音频文件到剪映草稿,为视频创建背景音乐、音效、旁白等音频内容。音频将被添加到独立的音频轨道中,不会影响视频内容。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"audio_infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/audio1.mp3\",\"start\":0,\"end\":5000000,\"duration\":10000000,\"volume\":1.0,\"audio_effect\":\"reverb\"}]"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| audio_infos | string | ✅ | - | 音频信息数组的JSON字符串 |
### audio_infos 数组结构
audio_infos是一个JSON字符串,解析后为数组,每个元素包含以下字段:
| 字段名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| audio_url | string | ✅ | - | 音频文件的URL地址 |
| start | number | ✅ | - | 音频开始播放时间(微秒) |
| end | number | ✅ | - | 音频结束播放时间(微秒) |
| duration | number | ❌ | 自动获取 | 音频总时长(微秒),如果不提供将自动获取 |
| volume | number | ❌ | 1.0 | 音量大小(0.0-2.0) |
| audio_effect | string | ❌ | None | 音频效果名称 |
### 参数详解
#### 时间参数
- **start**: 音频在时间轴上的开始时间,单位为微秒(1秒 = 1,000,000微秒)
- **end**: 音频在时间轴上的结束时间,单位为微秒
- **duration**: 音频文件的总时长,用于素材创建,单位为微秒,如果不提供将自动获取
- **播放时长**: 实际播放时长 = end - start
#### 音量控制
- **volume**: 音频音量大小
- 1.0 = 原始音量
- 0.5 = 一半音量
- 0.0 = 静音
- 范围:0.0 - 2.0
#### 音频效果
- **audio_effect**: 音频效果名称
- None = 无音频效果
- 示例:`"reverb"`(混响效果)
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "audio-track-uuid",
"audio_ids": ["audio1-uuid", "audio2-uuid", "audio3-uuid"]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| track_id | string | 音频轨道ID |
| audio_ids | array | 添加的音频ID列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本音频添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_audios \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/bgm.mp3\",\"start\":0,\"end\":10000000,\"duration\":15000000,\"volume\":0.8}]"
}'
```
#### 2. 多音频批量添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_audios \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/intro.mp3\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"volume\":1.0},{\"audio_url\":\"https://assets.jcaigc.cn/bgm.mp3\",\"start\":3000000,\"end\":30000000,\"duration\":35000000,\"volume\":0.6}]"
}'
```
#### 3. 带淡入淡出效果的音频
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_audios \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/outro.mp3\",\"start\":25000000,\"end\":30000000,\"duration\":8000000,\"volume\":0.9,\"audio_effect\":\"reverb\"}]"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的草稿URL |
| 400 | audio_infos是必填项 | 缺少音频信息参数 | 提供有效的音频信息JSON |
| 400 | audio_infos格式错误 | JSON格式不正确 | 检查JSON字符串格式 |
| 400 | 音频配置验证失败 | 音频参数不符合要求 | 检查每个音频的参数 |
| 400 | audio_url是必填项 | 音频URL缺失 | 为每个音频提供URL |
| 400 | 时间范围无效 | end必须大于start | 确保结束时间大于开始时间 |
| 400 | 音量值无效 | volume不在0.0-2.0范围内 | 使用0.0-2.0之间的音量值 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 404 | 音频资源不存在 | 音频URL无法访问 | 检查音频URL是否可访问 |
| 500 | 音频处理失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **JSON格式**: audio_infos必须是合法的JSON字符串
2. **时间单位**: 所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **音频格式**: 确保音频文件格式被支持(如MP3、WAV、AAC等)
4. **文件大小**: 大音频文件可能影响处理速度
5. **网络访问**: 音频URL必须可以正常访问
6. **音量范围**: 音量值必须在0.0-2.0范围内
7. **轨道限制**: 同一时间段可能存在音频重叠
## 工作流程
1. 验证必填参数(draft_url, audio_infos)
2. 解析audio_infos JSON字符串
3. 验证每个音频的参数配置
4. 获取并解密草稿内容
5. 创建音频轨道
6. 添加音频片段到轨道
7. 应用音量和音频效果
8. 保存并加密草稿
9. 返回处理结果
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
================================================
FILE: docs/add_captions.md
================================================
# ADD_CAPTIONS API Documentation
## 🌐 Language Switch
[中文版](./add_captions.zh.md) | [English](./add_captions.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_captions
```
## Function Description
Batch add captions to existing drafts. This interface is used to add captions to Jianying drafts within specified time periods, supporting rich caption style settings including text color, border color, alignment, transparency, font, font size, letter spacing, line spacing, scaling, and position adjustments.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"captions": "[{\"start\":0,\"end\":10000000,\"text\":\"Hello, Jianying\",\"keyword\":\"Hello\",\"keyword_color\":\"#457616\",\"keyword_font_size\":15,\"font_size\":15}]",
"text_color": "#ffffff",
"border_color": null,
"alignment": 1,
"alpha": 1.0,
"font": null,
"font_size": 15,
"letter_spacing": null,
"line_spacing": null,
"scale_x": 1.0,
"scale_y": 1.0,
"transform_x": 0.0,
"transform_y": 0.0,
"style_text": false
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string |✅ | - | Complete URL of the target draft |
| captions | string |✅ | - | JSON string of caption information list |
| text_color | string | ❌ | "#ffffff" | Text color (hexadecimal) |
| border_color | string |❌ | null | Border color (hexadecimal) |
| alignment | integer |❌ | 1 | Text alignment (0-5) |
| alpha | number |❌ | 1.0 | Text transparency (0.0-1.0) |
| font | string |❌ | null | Font name |
| font_size | integer |❌ | 15 | Font size |
| letter_spacing | number |❌ | null | Letter spacing |
| line_spacing | number | ❌ | null | Line spacing |
| scale_x | number |❌ | 1.0 | Horizontal scaling factor |
| scale_y | number | ❌ | 1.0 | Vertical scaling factor |
| transform_x | number | ❌ | 0.0 | Horizontal position offset |
| transform_y | number | ❌ | 0.0 | Vertical position offset |
| style_text | boolean |❌ | false | Whether to apply rich text styling |
### Parameter Details
#### captions Array Structure
`captions` is a JSON string containing an array of caption objects, each with the following fields:
```json
[
{
"start": 0,
"end": 10000000,
"text": "Hello, Jianying",
"keyword": "Hello",
"keyword_color": "#457616",
"keyword_font_size": 15,
"font_size": 15
}
]
```
**Field Description**:
- `start`: Caption start time (microseconds)
- `end`: Caption end time (microseconds)
- `text`: Caption text content
- `keyword`: Keyword to highlight
- `keyword_color`: Keyword highlight color
- `keyword_font_size`: Keyword font size
- `font_size`: Base font size
#### Time Parameters
- **start**: Start time of the caption on the timeline, unit microseconds (1 second = 1,000,000 microseconds)
- **end**: End time of the caption on the timeline, unit microseconds
- **Duration**: Caption duration = end - start
#### Style Parameters
- **text_color**: Main text color in hexadecimal format (e.g., "#ffffff" for white)
- **border_color**: Text border color, null means no border
- **alignment**: Text alignment mode (0-5)
- **alpha**: Text transparency (0.0 = fully transparent, 1.0 = fully opaque)
- **font_size**: Base font size in pixels
- **scale_x/scale_y**: Horizontal/vertical scaling factors
- **transform_x/transform_y**: Position offset values
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "caption-track-uuid",
"text_ids": ["text1-uuid", "text2-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid"],
"segment_infos": [
{
"id": "segment1-uuid",
"start": 0,
"end": 5000000
}
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| track_id | string | Caption track ID |
| text_ids | array | List of added text IDs |
| segment_ids | array | List of segment IDs |
| segment_infos | array | Segment information array |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Caption Addition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_captions \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"captions": "[{\"start\":0,\"end\":5000000,\"text\":\"Welcome to Jianying\"}]",
"text_color": "#ffffff",
"font_size": 18
}'
```
#### 2. Caption with Keyword Highlighting
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_captions \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"captions": "[{\"start\":0,\"end\":3000000,\"text\":\"Hello World\",\"keyword\":\"Hello\",\"keyword_color\":\"#ff0000\",\"keyword_font_size\":20}]",
"text_color": "#ffffff",
"font_size": 16
}'
```
#### 3. Styled Caption with Positioning
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_captions \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"captions": "[{\"start\":2000000,\"end\":7000000,\"text\":\"Styled Caption\"}]",
"text_color": "#00ff00",
"border_color": "#000000",
"alignment": 2,
"alpha": 0.8,
"font_size": 20,
"scale_x": 1.2,
"scale_y": 1.2,
"transform_x": 100,
"transform_y": 50
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft URL |
| 400 | captions is required | Missing caption information parameter | Provide valid caption information JSON |
| 400 | captions format error | JSON format is incorrect | Check JSON string format |
| 400 | Caption configuration validation failed | Caption parameters do not meet requirements | Check parameters for each caption |
| 400 | start is required | Caption start time missing | Provide start time for each caption |
| 400 | end is required | Caption end time missing | Provide end time for each caption |
| 400 | text is required | Caption text content missing | Provide text content for each caption |
| 400 | Time range invalid | end must be greater than start | Ensure end time is greater than start time |
| 400 | Font size invalid | font_size must be positive | Use positive font size value |
| 400 | Alpha value invalid | alpha not in 0.0-1.0 range | Use alpha value between 0.0-1.0 |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 500 | Caption processing failed | Internal processing error | Contact technical support |
## Notes
1. **JSON Format**: captions must be a valid JSON string
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Color Format**: Colors use hexadecimal format (e.g., "#ffffff")
4. **Font Support**: Ensure font names are supported by the system
5. **Position Range**: transform_x and transform_y values should be within reasonable ranges
6. **Scaling**: Scale factors should typically be between 0.1-5.0
7. **Track Management**: Multiple captions will be added to the same caption track
## Workflow
1. Validate required parameters (draft_url, captions)
2. Parse captions JSON string
3. Validate parameter configuration for each caption
4. Obtain and decrypt draft content
5. Create caption track
6. Add text segments to track
7. Apply styling and positioning
8. Save and encrypt draft
9. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Images](./add_images.md)
- [Add Text Style](./add_text_style.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_captions.zh.md
================================================
# ADD_CAPTIONS API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/add_captions
```
## 功能描述
向现有草稿中批量添加字幕。该接口用于在指定的时间段内添加字幕到剪映草稿中,支持丰富的字幕样式设置,包括文本颜色、边框颜色、对齐方式、透明度、字体、字体大小、字间距、行间距、缩放和位置调整等。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"captions": "[{\"start\":0,\"end\":10000000,\"text\":\"你好,剪映\",\"keyword\":\"好\",\"keyword_color\":\"#457616\",\"keyword_font_size\":15,\"font_size\":15}]",
"text_color": "#ffffff",
"border_color": null,
"alignment": 1,
"alpha": 1.0,
"font": null,
"font_size": 15,
"letter_spacing": null,
"line_spacing": null,
"scale_x": 1.0,
"scale_y": 1.0,
"transform_x": 0.0,
"transform_y": 0.0,
"style_text": false
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| captions | string | ✅ | - | 字幕信息列表的JSON字符串 |
| text_color | string | ❌ | "#ffffff" | 文本颜色(十六进制) |
| border_color | string | ❌ | null | 边框颜色(十六进制) |
| alignment | integer | ❌ | 1 | 文本对齐方式(0-5) |
| alpha | number | ❌ | 1.0 | 文本透明度(0.0-1.0) |
| font | string | ❌ | null | 字体名称 |
| font_size | integer | ❌ | 15 | 字体大小 |
| letter_spacing | number | ❌ | null | 字间距 |
| line_spacing | number | ❌ | null | 行间距 |
| scale_x | number | ❌ | 1.0 | 水平缩放比例 |
| scale_y | number | ❌ | 1.0 | 垂直缩放比例 |
| transform_x | number | ❌ | 0.0 | X轴位置偏移(像素) |
| transform_y | number | ❌ | 0.0 | Y轴位置偏移(像素) |
| style_text | boolean | ❌ | false | 是否使用样式文本 |
| has_shadow | boolean | ❌ | false | 是否启用文本阴影 |
| shadow_info | object | ❌ | null | 文本阴影参数 |
### captions字段详细说明
captions是一个JSON字符串,包含字幕数组,每个字幕对象包含以下字段:
| 字段名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| start | integer | ✅ | - | 字幕开始时间(微秒) |
| end | integer | ✅ | - | 字幕结束时间(微秒) |
| text | string | ✅ | - | 字幕文本内容 |
| keyword | string | ❌ | null | 关键词(用\|分隔多个关键词) |
| keyword_color | string | ❌ | "#ff7100" | 关键词颜色 |
| keyword_font_size | integer | ❌ | 15 | 关键词字体大小 |
| font_size | integer | ❌ | 15 | 文本字体大小 |
| in_animation | string | ❌ | null | 入场动画 |
| out_animation | string | ❌ | null | 出场动画 |
| loop_animation | string | ❌ | null | 循环动画 |
| in_animation_duration | integer | ❌ | null | 入场动画时长 |
| out_animation_duration | integer | ❌ | null | 出场动画时长 |
| loop_animation_duration | integer | ❌ | null | 循环动画时长 |
### 参数详解
#### 时间参数
- **start**: 字幕在时间轴上的开始时间,单位为微秒(1秒 = 1,000,000微秒)
- **end**: 字幕在时间轴上的结束时间,单位为微秒
- **duration**: 字幕显示时长 = end - start
#### 对齐方式说明
| 值 | 说明 |
|---|------|
| 0 | 左对齐 |
| 1 | 居中对齐 |
| 2 | 右对齐 |
| 3 | 垂直居中 |
| 4 | 垂直左对齐 |
| 5 | 垂直右对齐 |
#### 字体大小参数
- **font_size**: 普通文本(非关键词)的字体大小
- 默认值:15(仅在caption项中未指定font_size时生效)
- 建议范围:8-72
- 注意:如果在caption项中明确指定了font_size,则使用caption项中的值;如果未指定,则使用接口级别的font_size参数值
#### 缩放参数
- **scale_x**: 字幕的水平缩放比例
- 1.0 = 原始大小
- 0.5 = 水平缩小到一半
- 2.0 = 水平放大到两倍
- **scale_y**: 字幕的垂直缩放比例
- 1.0 = 原始大小
- 0.5 = 垂直缩小到一半
- 2.0 = 垂直放大到两倍
#### 位置参数
- **transform_x**: 字幕在X轴方向的位置偏移,单位为像素
- 正值向右移动
- 负值向左移动
- 以画布中心为原点
- 实际存储时会转换为半画布宽单位(假设画布宽度1920,即除以960)
- **transform_y**: 字幕在Y轴方向的位置偏移,单位为像素
- 正值向下移动
- 负值向上移动
- 以画布中心为原点
- 实际存储时会转换为半画布高单位(假设画布高度1080,即除以540)
#### 文本阴影参数
`shadow_info` 是一个对象,包含以下字段:
| 字段名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| shadow_alpha | number | ❌ | 1.0 | 阴影不透明度,取值范围为[0, 1] |
| shadow_color | string | ❌ | "#000000" | 阴影颜色(十六进制) |
| shadow_diffuse | number | ❌ | 15.0 | 阴影扩散程度,取值范围为[0, 100] |
| shadow_distance | number | ❌ | 5.0 | 阴影距离,取值范围为[0, 100] |
| shadow_angle | number | ❌ | -45.0 | 阴影角度,取值范围为[-180, 180] |
当 `has_shadow` 设置为 `true` 但未提供 `shadow_info` 时,系统将使用以下默认阴影配置:
```json
{
"shadow_color": "#000000",
"shadow_alpha": 0.9,
"shadow_diffuse": 15,
"shadow_distance": 5,
"shadow_angle": -45
}
```
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "text_track_123",
"text_ids": ["text_001", "text_002"],
"segment_ids": ["seg_001", "seg_002"],
"segment_infos": [
{
"id": "seg_001",
"start": 0,
"end": 5000000
},
{
"id": "seg_002",
"start": 5000000,
"end": 10000000
}
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| track_id | string | 字幕轨道ID |
| text_ids | array | 字幕ID列表 |
| segment_ids | array | 字幕片段ID列表 |
| segment_infos | array | 片段信息列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本字幕添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_captions \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"captions": "[{\"start\":0,\"end\":5000000,\"text\":\"你好,剪映\"}]",
"text_color": "#ffffff",
"alignment": 1,
"alpha": 1.0,
"font_size": 20
}'
```
#### 2. 多字幕添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_captions \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"captions": "[{\"start\":0,\"end\":5000000,\"text\":\"你好,剪映\"},{\"start\":5000000,\"end\":10000000,\"text\":\"欢迎使用字幕功能\"}]",
"text_color": "#ffffff",
"alignment": 1,
"alpha": 1.0,
"font_size": 16
}'
```
#### 3. 带样式和位置的字幕
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_captions \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"captions": "[{\"start\":0,\"end\":5000000,\"text\":\"你好,剪映\",\"keyword\":\"好\",\"keyword_color\":\"#ff0000\"]",
"text_color": "#ffffff",
"alignment": 1,
"alpha": 1.0,
"font_size": 20,
"scale_x": 1.2,
"scale_y": 1.2,
"transform_x": 100.0,
"transform_y": -50.0
}'
```
#### 4. 带文本阴影的字幕
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_captions \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"captions": "[{\"start\":0,\"end\":5000000,\"text\":\"你好,剪映\"}]",
"text_color": "#ffffff",
"alignment": 1,
"alpha": 1.0,
"font_size": 20,
"has_shadow": true,
"shadow_info": {
"shadow_alpha": 0.8,
"shadow_color": "#000000",
"shadow_diffuse": 20.0,
"shadow_distance": 10.0,
"shadow_angle": -45.0
}
}'
```
#### 5. 使用默认文本阴影的字幕
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_captions \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"captions": "[{\"start\":0,\"end\":5000000,\"text\":\"你好,剪映\"}]",
"text_color": "#ffffff",
"alignment": 1,
"alpha": 1.0,
"font_size": 20,
"has_shadow": true
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | captions是必填项 | 缺少字幕信息参数 | 提供有效的captions |
| 400 | 无效的字幕信息,请检查captions字段值是否正确 | 字幕参数校验失败 | 检查字幕参数是否符合要求 |
| 400 | 时间范围无效 | end必须大于start | 确保结束时间大于开始时间 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 500 | 字幕添加失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **时间单位**: 所有时间参数使用微秒(1秒 = 1,000,000微秒)
2. **字幕时长**: end 时间必须大于 start 时间
3. **颜色格式**: 颜色值使用十六进制格式,如 "#ffffff"、"#ff0000"
4. **关键词高亮**: 暂未完全实现,目前为预留功能
5. **动画效果**: 暂未完全实现,目前为预留功能
6. **字体支持**: 字体名称需要系统支持或使用默认字体
7. **对齐方式**: 目前仅支持基础对齐方式(0-2),高级对齐方式(3-5)为预留功能
8. **坐标系统**: transform_x 和 transform_y 使用像素值,会自动转换为草稿相对坐标
9. **缩放参数**: scale_x 和 scale_y 建议在合理范围内使用
## 工作流程
1. 验证必填参数(draft_url, captions)
2. 检查时间范围的有效性
3. 从缓存中获取草稿
4. 创建字幕轨道(如果不存在)
5. 遍历字幕信息,创建字幕片段
6. 添加片段到轨道
7. 保存草稿
8. 返回字幕信息
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_effects.md
================================================
# ADD_EFFECTS API Documentation
## 🌐 Language Switch
[中文版](./add_effects.zh.md) | [English](./add_effects.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_effects
```
## Function Description
Add video effects to existing drafts. This interface is used to add effect materials to Jianying drafts within specified time periods, supporting multiple effect types such as border effects, filter effects, and dynamic effects. Effects can be used to enhance the visual impact of videos.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"effect_infos": "[{\"effect_title\": \"Recording Border III\", \"start\": 0, \"end\": 5000000}, {\"effect_title\": \"Vintage Filter\", \"start\": 2000000, \"end\": 7000000}]"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string |✅ | - | Complete URL of the target draft |
| effect_infos | string |✅ | - | JSON string of effect information list |
### Parameter Details
#### effect_infos Array Structure
`effect_infos` is a JSON string containing an array of effect objects, each with the following fields:
```json
[
{
"effect_title": "Recording Border III", // Effect name/title, required parameter
"start": 0, // Effect start time (microseconds), required parameter
"end": 5000000 // Effect end time (microseconds), required parameter
}
]
```
**Field Description**:
- `effect_title`: Effect name, must be an existing effect name in the system
- `start`: Effect start time in microseconds
- `end`: Effect end time in microseconds
#### Time Parameters
- **start**: Start time of the effect on the timeline, unit microseconds (1 second = 1,000,000 microseconds)
- **end**: End time of the effect on the timeline, unit microseconds
- **Duration**: Effect duration = end - start
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "effect-track-uuid",
"effect_ids": ["effect1-uuid", "effect2-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid"]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| track_id | string | Effect track ID |
| effect_ids | array | List of added effect IDs |
| segment_ids | array | List of segment IDs |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Effect Addition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_effects \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"effect_infos": "[{\"effect_title\":\"Vignette\",\"start\":0,\"end\":10000000}]"
}'
```
#### 2. Multiple Effects
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_effects \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"effect_infos": "[{\"effect_title\":\"Border Effect\",\"start\":0,\"end\":5000000},{\"effect_title\":\"Color Filter\",\"start\":3000000,\"end\":8000000}]"
}'
```
#### 3. Sequential Effects
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_effects \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"effect_infos": "[{\"effect_title\":\"Fade In\",\"start\":0,\"end\":1000000},{\"effect_title\":\"Main Effect\",\"start\":1000000,\"end\":9000000},{\"effect_title\":\"Fade Out\",\"start\":9000000,\"end\":10000000}]"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft URL |
| 400 | effect_infos is required | Missing effect information parameter | Provide valid effect information JSON |
| 400 | effect_infos format error | JSON format is incorrect | Check JSON string format |
| 400 | Effect configuration validation failed | Effect parameters do not meet requirements | Check parameters for each effect |
| 400 | effect_title is required | Effect title missing | Provide title for each effect |
| 400 | start is required | Effect start time missing | Provide start time for each effect |
| 400 | end is required | Effect end time missing | Provide end time for each effect |
| 400 | Time range invalid | end must be greater than start | Ensure end time is greater than start time |
| 400 | Effect title not found | Specified effect does not exist | Check if effect title is valid |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 500 | Effect processing failed | Internal processing error | Contact technical support |
## Notes
1. **JSON Format**: effect_infos must be a valid JSON string
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Effect Names**: Effect titles must match exactly with system effect names
4. **Time Overlap**: Multiple effects can be applied to the same time period
5. **Effect Priority**: Effects are applied in the order they appear in the array
6. **Performance**: Complex effects may affect video processing performance
7. **Supported Effects**: System currently supports transition effects like "Fade In", "Fade Out", color filters, etc.
8. **Preview Limitation**: Effects may not be visible in preview but will be applied during final video generation
## Workflow
1. Validate required parameters (draft_url, effect_infos)
2. Parse effect_infos JSON string
3. Validate parameter configuration for each effect
4. Obtain and decrypt draft content
5. Create effect track
6. Add effect segments to track
7. Apply effects to video segments
8. Save and encrypt draft
9. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Images](./add_images.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_effects.zh.md
================================================
# ADD_EFFECTS API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```bash
POST /openapi/capcut-mate/v1/add_effects
```
## 功能描述
向现有草稿中添加视频特效。该接口用于在指定的时间段内添加特效素材到剪映草稿中,支持多种特效类型如边框特效、滤镜特效、动态特效等。特效可以用于增强视频的视觉效果。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"effect_infos": "[{\"effect_title\": \"录制边框 III\", \"start\": 0, \"end\": 5000000}, {\"effect_title\": \"复古滤镜\", \"start\": 2000000, \"end\": 7000000}]"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| effect_infos | string | ✅ | - | 特效信息列表的JSON字符串 |
### 参数详解
#### effect_infos 字段格式
`effect_infos` 是一个JSON字符串,包含特效信息数组,每个特效对象包含以下字段:
```json
[
{
"effect_title": "录制边框 III", // 特效名称/标题,必选参数
"start": 0, // 特效开始时间(微秒),必选参数
"end": 5000000 // 特效结束时间(微秒),必选参数
}
]
```
**字段说明**:
- `effect_title`: 特效名称,必须是系统中已存在的特效名称
- `start`: 特效开始时间,单位为微秒,必须大于等于0
- `end`: 特效结束时间,单位为微秒,必须大于start
#### 时间参数
- **start**: 特效在时间轴上的开始时间,单位为微秒(1秒 = 1,000,000微秒)
- **end**: 特效在时间轴上的结束时间,单位为微秒
- **duration**: 特效显示时长 = end - start
#### 特效名称说明
- **effect_title**: 特效的名称
- 格式:字符串
- 示例:`"录制边框 III"`
- 获取方式:通过剪映特效库或相关API获取
- 常见特效名称:
- 边框特效:"录制边框 III", "简约边框", "霓虹边框"
- 滤镜特效:"复古滤镜", "黑白滤镜", "暖色调"
- 动态特效:"粒子效果", "光晕效果", "闪烁特效"
- 转场特效:"淡入淡出", "推拉门", "马赛克转场"
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "effect_track_123",
"effect_ids": ["effect_001", "effect_002"],
"segment_ids": ["seg_001", "seg_002"]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| track_id | string | 特效轨道ID |
| effect_ids | array | 添加的特效ID列表 |
| segment_ids | array | 创建的特效片段ID列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本特效添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_effects \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"effect_infos": "[{\"effect_title\": \"录制边框 III\", \"start\": 0, \"end\": 5000000}]"
}'
```
#### 2. 批量特效添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_effects \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"effect_infos": "[{\"effect_title\": \"录制边框 III\", \"start\": 0, \"end\": 5000000}, {\"effect_title\": \"复古滤镜\", \"start\": 2000000, \"end\": 7000000}]"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | effect_infos是必填项 | 缺少特效信息参数 | 提供有效的effect_infos |
| 400 | 时间范围无效 | end必须大于start | 确保结束时间大于开始时间 |
| 400 | 无效的特效信息,请检查effect_infos字段值是否正确 | 特效参数校验失败 | 检查特效参数是否符合要求 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 404 | 特效不存在 | 指定的特效名称无效 | 确认特效名称是否正确 |
| 500 | 特效添加失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **时间单位**: 所有时间参数使用微秒(1秒 = 1,000,000微秒)
2. **特效名称**: 确保使用有效的特效名称
3. **时间范围**: end必须大于start
4. **轨道管理**: 系统自动创建特效轨道
5. **性能考虑**: 避免同时添加大量特效
## 工作流程
1. 验证必填参数(draft_url, effect_infos)
2. 检查时间范围的有效性
3. 从缓存中获取草稿
4. 创建特效轨道(如果不存在)
5. 解析特效信息并创建特效片段
6. 添加片段到轨道
7. 保存草稿
8. 返回特效信息
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_filters.md
================================================
# ADD_FILTERS API Documentation
## 🌐 Language Switch
[中文版](./add_filters.zh.md) | [English](./add_filters.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_filters
```
## Function Description
Add video filters to existing drafts. This interface is used to add filter materials to Jianying drafts within specified time periods, supporting various filter types such as vintage, black and white, cinematic, etc. Filters can be used to adjust the color tone and visual style of videos.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"filter_infos": "[{\"filter_title\": \"复古\", \"start\": 0, \"end\": 5000000, \"intensity\": 80}, {\"filter_title\": \"黑白\", \"start\": 2000000, \"end\": 7000000}]"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string |✅ | - | Complete URL of the target draft |
| filter_infos | string |✅ | - | JSON string of filter information list |
### Parameter Details
#### filter_infos Array Structure
`filter_infos` is a JSON string containing an array of filter objects, each with the following fields:
```json
[
{
"filter_title": "复古", // Filter name/title, required parameter
"start": 0, // Filter start time (microseconds), required parameter
"end": 5000000, // Filter end time (microseconds), required parameter
"intensity": 80 // Filter intensity (0-100), optional, default 100
}
]
```
**Field Description**:
- `filter_title`: Filter name, must be an existing filter name in the system
- `start`: Filter start time in microseconds
- `end`: Filter end time in microseconds
- `intensity`: Filter intensity (0-100), controls the strength of the filter effect, default is 100
#### Time Parameters
- **start**: Start time of the filter on the timeline, unit microseconds (1 second = 1,000,000 microseconds)
- **end**: End time of the filter on the timeline, unit microseconds
- **Duration**: Filter duration = end - start
#### Intensity Parameter
- **intensity**: Controls the strength of the filter effect
- Range: 0-100
- Default: 100 (full intensity)
- Lower values result in a more subtle filter effect
- Example: `intensity: 50` applies the filter at 50% strength
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "filter-track-uuid",
"filter_ids": ["filter1-uuid", "filter2-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid"]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| track_id | string | Filter track ID |
| filter_ids | array | List of added filter IDs |
| segment_ids | array | List of segment IDs |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Filter Addition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_filters \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"filter_infos": "[{\"filter_title\":\"复古\",\"start\":0,\"end\":10000000}]"
}'
```
#### 2. Filter with Custom Intensity
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_filters \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"filter_infos": "[{\"filter_title\":\"黑白\",\"start\":0,\"end\":5000000,\"intensity\":60}]"
}'
```
#### 3. Multiple Filters
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_filters \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"filter_infos": "[{\"filter_title\":\"复古\",\"start\":0,\"end\":5000000,\"intensity\":80},{\"filter_title\":\"电影感\",\"start\":3000000,\"end\":8000000,\"intensity\":100}]"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft URL |
| 400 | filter_infos is required | Missing filter information parameter | Provide valid filter information JSON |
| 400 | filter_infos format error | JSON format is incorrect | Check JSON string format |
| 400 | Filter configuration validation failed | Filter parameters do not meet requirements | Check parameters for each filter |
| 400 | filter_title is required | Filter title missing | Provide title for each filter |
| 400 | start is required | Filter start time missing | Provide start time for each filter |
| 400 | end is required | Filter end time missing | Provide end time for each filter |
| 400 | Time range invalid | end must be greater than start | Ensure end time is greater than start time |
| 400 | Intensity out of range | Intensity must be between 0-100 | Provide valid intensity value |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 404 | Filter not found | Specified filter does not exist | Check if filter title is valid |
| 500 | Filter addition failed | Internal processing error | Contact technical support |
## Notes
1. **JSON Format**: filter_infos must be a valid JSON string
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Filter Names**: Filter titles must match exactly with system filter names
4. **Intensity Range**: Intensity must be between 0-100, default is 100
5. **Time Overlap**: Multiple filters can be applied to the same time period
6. **Filter Priority**: Filters are applied in the order they appear in the array
7. **Performance**: Complex filters may affect video processing performance
## Workflow
1. Validate required parameters (draft_url, filter_infos)
2. Parse filter_infos JSON string
3. Validate parameter configuration for each filter
4. Obtain and decrypt draft content
5. Create filter track
6. Add filter segments to track
7. Save and encrypt draft
8. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Images](./add_images.md)
- [Add Effects](./add_effects.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_filters.zh.md
================================================
# ADD_FILTERS API 接口文档
## 🌐 语言切换
[中文版](./add_filters.zh.md) | [English](./add_filters.md)
## 接口信息
```bash
POST /openapi/capcut-mate/v1/add_filters
```
## 功能描述
向现有草稿中添加视频滤镜。该接口用于在指定的时间段内添加滤镜素材到剪映草稿中,支持多种滤镜类型如复古、黑白、电影感等。滤镜可以用于调整视频的色调和视觉风格。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"filter_infos": "[{\"filter_title\": \"复古\", \"start\": 0, \"end\": 5000000, \"intensity\": 80}, {\"filter_title\": \"黑白\", \"start\": 2000000, \"end\": 7000000}]"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| filter_infos | string | ✅ | - | 滤镜信息列表的JSON字符串 |
### 参数详解
#### filter_infos 字段格式
`filter_infos` 是一个JSON字符串,包含滤镜信息数组,每个滤镜对象包含以下字段:
```json
[
{
"filter_title": "复古", // 滤镜名称/标题,必选参数
"start": 0, // 滤镜开始时间(微秒),必选参数
"end": 5000000, // 滤镜结束时间(微秒),必选参数
"intensity": 80 // 滤镜强度(0-100),可选参数,默认100
}
]
```
**字段说明**:
- `filter_title`: 滤镜名称,必须是系统中已存在的滤镜名称
- `start`: 滤镜开始时间,单位为微秒,必须大于等于0
- `end`: 滤镜结束时间,单位为微秒,必须大于start
- `intensity`: 滤镜强度(0-100),控制滤镜效果的强度,默认为100
#### 时间参数
- **start**: 滤镜在时间轴上的开始时间,单位为微秒(1秒 = 1,000,000微秒)
- **end**: 滤镜在时间轴上的结束时间,单位为微秒
- **duration**: 滤镜显示时长 = end - start
#### 强度参数
- **intensity**: 控制滤镜效果的强度
- 范围:0-100
- 默认值:100(完全强度)
- 较低的值会产生更柔和的滤镜效果
- 示例:`intensity: 50` 表示以50%的强度应用滤镜
#### 滤镜名称说明
- **filter_title**: 滤镜的名称
- 格式:字符串
- 示例:`"复古"`、`"黑白"`、`"电影感"`
- 获取方式:通过剪映滤镜库或相关API获取
- 常见滤镜名称:
- 复古风格:"复古", "1980", "VHS III"
- 黑白风格:"黑白", "森山"
- 电影风格:"电影感", "好莱坞III"
- 其他风格:"City Walk", "Lofi II"
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "filter_track_123",
"filter_ids": ["filter_001", "filter_002"],
"segment_ids": ["seg_001", "seg_002"]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| track_id | string | 滤镜轨道ID |
| filter_ids | array | 添加的滤镜ID列表 |
| segment_ids | array | 创建的滤镜片段ID列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本滤镜添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_filters \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"filter_infos": "[{\"filter_title\": \"复古\", \"start\": 0, \"end\": 10000000}]"
}'
```
#### 2. 自定义强度的滤镜
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_filters \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"filter_infos": "[{\"filter_title\": \"黑白\", \"start\": 0, \"end\": 5000000, \"intensity\": 60}]"
}'
```
#### 3. 批量滤镜添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_filters \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"filter_infos": "[{\"filter_title\": \"复古\", \"start\": 0, \"end\": 5000000, \"intensity\": 80}, {\"filter_title\": \"电影感\", \"start\": 3000000, \"end\": 8000000, \"intensity\": 100}]"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | filter_infos是必填项 | 缺少滤镜信息参数 | 提供有效的filter_infos |
| 400 | 时间范围无效 | end必须大于start | 确保结束时间大于开始时间 |
| 400 | 强度范围无效 | intensity必须在0-100之间 | 提供有效的强度值 |
| 400 | 无效的滤镜信息,请检查filter_infos字段值是否正确 | 滤镜参数校验失败 | 检查滤镜参数是否符合要求 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 404 | 滤镜不存在 | 指定的滤镜名称无效 | 确认滤镜名称是否正确 |
| 500 | 滤镜添加失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **时间单位**: 所有时间参数使用微秒(1秒 = 1,000,000微秒)
2. **滤镜名称**: 确保使用有效的滤镜名称
3. **时间范围**: end必须大于start
4. **强度范围**: intensity必须在0-100之间,默认为100
5. **轨道管理**: 系统自动创建滤镜轨道
6. **性能考虑**: 避免同时添加大量滤镜
## 工作流程
1. 验证必填参数(draft_url, filter_infos)
2. 检查时间范围的有效性
3. 从缓存中获取草稿
4. 创建滤镜轨道(如果不存在)
5. 解析滤镜信息并创建滤镜片段
6. 添加片段到轨道
7. 保存草稿
8. 返回滤镜信息
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [添加特效](./add_effects.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_images.md
================================================
# ADD_IMAGES API Documentation
## 🌐 Language Switch
[中文版](./add_images.zh.md) | [English](./add_images.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_images
```
## Function Description
Add images to existing drafts. This interface is used to add image materials to Jianying drafts within specified time periods, supporting transparency, scaling and position adjustments for images. Images can be used to enhance video visual effects, such as background images, watermarks, decorative images, etc.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"image_infos": "[{\"image_url\":\"https://assets.jcaigc.cn/image1.jpg\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000}]",
"alpha": 1.0,
"scale_x": 1.0,
"scale_y": 1.0,
"transform_x": 0,
"transform_y": 0
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string | ✅ | - | Complete URL of the target draft |
| image_infos | string | ✅ | - | JSON string of image information array |
| alpha | number | ❌ | 1.0 | Image transparency, recommended range [0.0, 1.0] |
| scale_x | number | ❌ | 1.0 | Image X-axis scaling ratio |
| scale_y | number | ❌ | 1.0 | Image Y-axis scaling ratio |
| transform_x | number | ❌ | 0 | X-axis position offset (pixels) |
| transform_y | number | ❌ | 0 | Y-axis position offset (pixels) |
### image_infos Array Structure
| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| image_url | string | ✅ | - | URL address of the image file |
| width | number | ✅ | - | Image width (pixels) |
| height | number | ✅ | - | Image height (pixels) |
| start | number | ✅ | - | Image start display time (microseconds) |
| end | number | ✅ | - | Image end display time (microseconds) |
### Parameter Details
#### Time Parameters
- **start**: Start time of the image on the timeline, unit microseconds (1 second = 1,000,000 microseconds)
- **end**: End time of the image on the timeline, unit microseconds
- **duration**: Image display duration = end - start
#### Transparency Parameters
- **alpha**: Image transparency
- 1.0 = Fully opaque
- 0.5 = Semi-transparent
- 0.0 = Fully transparent
- Recommended range: 0.0 - 1.0
#### Scaling Parameters
- **scale_x**: Image scaling ratio in X-axis direction
- 1.0 = Original size
- 0.5 = Shrink to half
- 2.0 = Enlarge to double
- **scale_y**: Image scaling ratio in Y-axis direction
- 1.0 = Original size
- 0.5 = Shrink to half
- 2.0 = Enlarge to double
#### Position Parameters
- **transform_x**: Image position offset in X-axis direction, unit pixels
- Positive value moves right
- Negative value moves left
- Canvas center as origin
- Actually stored as half-canvas-width units (assuming canvas width 1920, divided by 960)
- **transform_y**: Image position offset in Y-axis direction, unit pixels
- Positive value moves down
- Negative value moves up
- Canvas center as origin
- Actually stored as half-canvas-height units (assuming canvas height 1080, divided by 540)
#### Image Information Description
- **image_url**: URL address of the image
- Format: Valid image URL
- Example: `"https://assets.jcaigc.cn/image1.jpg"`
- Supported formats: JPG, PNG and other common image formats
- **width/height**: Original size of the image
- Used to calculate conversion ratio for position offset
- Unit: pixels
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "video-track-uuid",
"image_ids": ["image1-uuid", "image2-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid"],
"segment_infos": [
{
"id": "segment1-uuid",
"start": 0,
"end": 5000000
}
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| track_id | string | Video track ID |
| image_ids | array | List of image IDs |
| segment_ids | array | List of segment IDs |
| segment_infos | array | List of segment information, containing ID, start time and end time for each segment |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Image Addition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_images \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"image_infos": "[{\"image_url\":\"https://assets.jcaigc.cn/photo1.jpg\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000}]"
}'
```
#### 2. Image with Transparency
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_images \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"image_infos": "[{\"image_url\":\"https://assets.jcaigc.cn/logo.png\",\"width\":800,\"height\":600,\"start\":1000000,\"end\":6000000}]",
"alpha": 0.8
}'
```
#### 3. Image with Scaling and Position Offset
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_images \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"image_infos": "[{\"image_url\":\"https://assets.jcaigc.cn/watermark.png\",\"width\":300,\"height\":100,\"start\":2000000,\"end\":7000000}]",
"scale_x": 0.5,
"scale_y": 0.5,
"transform_x": 700,
"transform_y": -400
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft_url |
| 400 | image_infos is required | Missing image information parameter | Provide valid image_infos |
| 400 | image_url is required | Image URL missing | Provide URL for each image |
| 400 | Image dimensions invalid | width or height invalid | Provide positive width and height |
| 400 | Time range invalid | end must be greater than start | Ensure end time is greater than start time |
| 400 | Transparency invalid | alpha exceeds recommended range | Use transparency value within 0.0-1.0 range |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 404 | Image does not exist | Specified image URL invalid | Confirm if image URL is correct |
| 500 | Image addition failed | Internal processing error | Contact technical support |
## Notes
1. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
2. **Image URL**: Ensure using valid image URL
3. **Time Range**: end must be greater than start
4. **Transparency Range**: alpha recommended within 0.0-1.0 range
5. **Position Parameters**: transform_x and transform_y unit is pixels, but internally converted to half-canvas units for storage
- transform_x conversion formula: actual value / 960 (assuming canvas width 1920)
- transform_y conversion formula: actual value / 540 (assuming canvas height 1080)
6. **Track Management**: System automatically creates video track
7. **Performance Consideration**: Avoid adding large number of images simultaneously
## Workflow
1. Validate required parameters (draft_url, image_infos)
2. Check validity of time ranges
3. Get draft from cache
4. Create video track (images as VideoSegment)
5. Create image adjustment settings
6. Create image segments
7. Add segments to track
8. Save draft
9. Return image information
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Audios](./add_audios.md)
- [Add Stickers](./add_sticker.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_images.zh.md
================================================
# ADD_IMAGES API 接口文档
## 🌐 语言切换
[中文版](./add_images.zh.md) | [English](./add_images.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/add_images
```
## 功能描述
向现有草稿中添加图片。该接口用于在指定的时间段内添加图片素材到剪映草稿中,支持图片的透明度、缩放和位置调整。图片可以用于增强视频的视觉效果,如背景图、水印、装饰图等。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"image_infos": "[{\"image_url\":\"https://assets.jcaigc.cn/image1.jpg\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000}]",
"alpha": 1.0,
"scale_x": 1.0,
"scale_y": 1.0,
"transform_x": 0,
"transform_y": 0
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| image_infos | string | ✅ | - | 图片信息数组的JSON字符串 |
| alpha | number | ❌ | 1.0 | 图片透明度,建议范围[0.0, 1.0] |
| scale_x | number | ❌ | 1.0 | 图片X轴缩放比例 |
| scale_y | number | ❌ | 1.0 | 图片Y轴缩放比例 |
| transform_x | number | ❌ | 0 | X轴位置偏移(像素) |
| transform_y | number | ❌ | 0 | Y轴位置偏移(像素) |
### image_infos 数组结构
| 字段名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| image_url | string | ✅ | - | 图片文件的URL地址 |
| width | number | ✅ | - | 图片宽度(像素) |
| height | number | ✅ | - | 图片高度(像素) |
| start | number | ✅ | - | 图片开始显示时间(微秒) |
| end | number | ✅ | - | 图片结束显示时间(微秒) |
### 参数详解
#### 时间参数
- **start**: 图片在时间轴上的开始时间,单位为微秒(1秒 = 1,000,000微秒)
- **end**: 图片在时间轴上的结束时间,单位为微秒
- **duration**: 图片显示时长 = end - start
#### 透明度参数
- **alpha**: 图片的透明度
- 1.0 = 完全不透明
- 0.5 = 半透明
- 0.0 = 完全透明
- 建议范围:0.0 - 1.0
#### 缩放参数
- **scale_x**: 图片在X轴方向的缩放比例
- 1.0 = 原始大小
- 0.5 = 缩小到一半
- 2.0 = 放大到两倍
- **scale_y**: 图片在Y轴方向的缩放比例
- 1.0 = 原始大小
- 0.5 = 缩小到一半
- 2.0 = 放大到两倍
#### 位置参数
- **transform_x**: 图片在X轴方向的位置偏移,单位为像素
- 正值向右移动
- 负值向左移动
- 以画布中心为原点
- 实际存储时会转换为半画布宽单位(假设画布宽度1920,即除以960)
- **transform_y**: 图片在Y轴方向的位置偏移,单位为像素
- 正值向下移动
- 负值向上移动
- 以画布中心为原点
- 实际存储时会转换为半画布高单位(假设画布高度1080,即除以540)
#### 图片信息说明
- **image_url**: 图片的URL地址
- 格式:有效的图片URL
- 示例:`"https://assets.jcaigc.cn/image1.jpg"`
- 支持格式:JPG、PNG等常见图片格式
- **width/height**: 图片的原始尺寸
- 用于计算位置偏移的转换比例
- 单位:像素
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "video-track-uuid",
"image_ids": ["image1-uuid", "image2-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid"],
"segment_infos": [
{
"id": "segment1-uuid",
"start": 0,
"end": 5000000
}
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| track_id | string | 视频轨道ID |
| image_ids | array | 图片ID列表 |
| segment_ids | array | 片段ID列表 |
| segment_infos | array | 片段信息列表,包含每个片段的ID、开始时间和结束时间 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本图片添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_images \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"image_infos": "[{\"image_url\":\"https://assets.jcaigc.cn/photo1.jpg\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000}]"
}'
```
#### 2. 带透明度的图片
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_images \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"image_infos": "[{\"image_url\":\"https://assets.jcaigc.cn/logo.png\",\"width\":800,\"height\":600,\"start\":1000000,\"end\":6000000}]",
"alpha": 0.8
}'
```
#### 3. 带缩放和位置偏移的图片
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_images \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"image_infos": "[{\"image_url\":\"https://assets.jcaigc.cn/watermark.png\",\"width\":300,\"height\":100,\"start\":2000000,\"end\":7000000}]",
"scale_x": 0.5,
"scale_y": 0.5,
"transform_x": 700,
"transform_y": -400
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | image_infos是必填项 | 缺少图片信息参数 | 提供有效的image_infos |
| 400 | image_url是必填项 | 图片URL缺失 | 为每个图片提供URL |
| 400 | 图片尺寸无效 | width或height无效 | 提供正数的宽度和高度 |
| 400 | 时间范围无效 | end必须大于start | 确保结束时间大于开始时间 |
| 400 | 透明度无效 | alpha超出建议范围 | 使用0.0-1.0范围内的透明度值 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 404 | 图片不存在 | 指定的图片URL无效 | 确认图片URL是否正确 |
| 500 | 图片添加失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **时间单位**: 所有时间参数使用微秒(1秒 = 1,000,000微秒)
2. **图片URL**: 确保使用有效的图片URL
3. **时间范围**: end必须大于start
4. **透明度范围**: alpha建议在0.0-1.0范围内
5. **位置参数**: transform_x和transform_y单位为像素,但内部会转换为半画布单位存储
- transform_x转换公式:实际值 / 960(假设画布宽度1920)
- transform_y转换公式:实际值 / 540(假设画布高度1080)
6. **轨道管理**: 系统自动创建视频轨道
7. **性能考虑**: 避免同时添加大量图片
## 工作流程
1. 验证必填参数(draft_url, image_infos)
2. 检查时间范围的有效性
3. 从缓存中获取草稿
4. 创建视频轨道(图片作为VideoSegment)
5. 创建图像调节设置
6. 创建图片片段
7. 添加片段到轨道
8. 保存草稿
9. 返回图片信息
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加贴纸](./add_sticker.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./add_images.zh.md) | [English](./add_images.md)
================================================
FILE: docs/add_keyframes.md
================================================
# ADD_KEYFRAMES API Documentation
## 🌐 Language Switch
[中文版](./add_keyframes.zh.md) | [English](./add_keyframes.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_keyframes
```
## Function Description
Add keyframe animations to existing drafts. This interface is used to create property animations for position, scale, rotation, and other properties in Jianying drafts. Keyframes allow precise control over how properties change over time.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"keyframes": "[{\"property\":\"position.x\",\"time\":0,\"value\":0},{\"property\":\"position.x\",\"time\":1000000,\"value\":100}]"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string |✅ | - | Complete URL of the target draft |
| keyframes | string |✅ | - | JSON string of keyframe information |
### Parameter Details
#### keyframes Array Structure
`keyframes` is a JSON string containing an array of keyframe objects, each with the following fields:
```json
[
{
"property": "position.x", // Property name, required
"time": 0, // Keyframe time (microseconds), required
"value": 0 // Property value, required
}
]
```
**Supported Properties**:
- `position.x` - Horizontal position
- `position.y` - Vertical position
- `scale.x` - Horizontal scale
- `scale.y` - Vertical scale
- `rotation.z` - Rotation angle
- `opacity` - Transparency
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"keyframes_added": 5,
"affected_segments": ["segment1-uuid", "segment2-uuid"]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| keyframes_added | integer | Number of keyframes added |
| affected_segments | array | List of affected segment IDs |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Position Animation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_keyframes \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"keyframes": "[{\"property\":\"position.x\",\"time\":0,\"value\":0},{\"property\":\"position.x\",\"time\":1000000,\"value\":100}]"
}'
```
#### 2. Scale Animation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_keyframes \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"keyframes": "[{\"property\":\"scale.x\",\"time\":0,\"value\":1.0},{\"property\":\"scale.x\",\"time\":2000000,\"value\":1.5}]"
}'
```
#### 3. Rotation Animation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_keyframes \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"keyframes": "[{\"property\":\"rotation.z\",\"time\":0,\"value\":0},{\"property\":\"rotation.z\",\"time\":3000000,\"value\":360}]"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft URL |
| 400 | keyframes is required | Missing keyframe information | Provide valid keyframe JSON |
| 400 | keyframes format error | JSON format is incorrect | Check JSON string format |
| 400 | Invalid property name | Unsupported property | Use supported property names |
| 400 | Time value invalid | Time must be non-negative | Use valid time values |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 500 | Keyframe processing failed | Internal processing error | Contact technical support |
## Notes
1. **JSON Format**: keyframes must be a valid JSON string
2. **Time Unit**: Time values use microseconds (1 second = 1,000,000 microseconds)
3. **Property Names**: Must use exact property names as specified
4. **Value Ranges**: Different properties have different valid value ranges
5. **Interpolation**: Keyframes are automatically interpolated between key times
## Workflow
1. Validate required parameters (draft_url, keyframes)
2. Parse keyframes JSON string
3. Validate property names and values
4. Obtain and decrypt draft content
5. Apply keyframe animations to segments
6. Save and encrypt draft
7. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Images](./add_images.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_keyframes.zh.md
================================================
# ADD_KEYFRAMES API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/add_keyframes
```
## 功能描述
向现有草稿中添加关键帧。该接口用于在指定的片段上添加关键帧动画,支持多种属性类型的关键帧设置,如位置、缩放、旋转、透明度等。关键帧可以用于创建复杂的动画效果,增强视频的视觉表现力。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"keyframes": "[{\"segment_id\":\"d62994b4-25fe-422a-a123-87ef05038558\",\"property\":\"KFTypePositionX\",\"offset\":5000000,\"value\":-0.1}]"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| keyframes | string | ✅ | - | 关键帧信息列表的JSON字符串 |
### keyframes 参数详解
#### 基本结构
keyframes 是一个JSON字符串,包含关键帧数组,每个关键帧对象包含以下字段:
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| segment_id | string | ✅ | 目标片段的唯一标识ID |
| property | string | ✅ | 动画属性类型,支持的类型见下表 |
| offset | number | ✅ | 关键帧在片段中的时间偏移(微秒绝对时间) |
| value | number | ✅ | 属性在该时间点的值 |
#### offset 参数说明
offset 参数只支持微秒绝对时间格式:
- 以微秒为单位的整数,如 5000000 表示片段开始后5秒的位置
- 系统会自动将微秒值转换为相对时间比例
#### 支持的动画属性类型
| 属性类型 | 描述 | 值范围 | 示例 |
|---------|------|--------|------|
| KFTypePositionX | X轴位置 | -1.0 到 1.0 | 0.0 (居中), -0.5 (左移), 0.5 (右移) |
| KFTypePositionY | Y轴位置 | -1.0 到 1.0 | 0.0 (居中), -0.5 (上移), 0.5 (下移) |
| KFTypeScaleX | X轴缩放 | 0.1 到 10.0 | 1.0 (原始), 0.5 (缩小), 2.0 (放大) |
| KFTypeScaleY | Y轴缩放 | 0.1 到 10.0 | 1.0 (原始), 0.5 (缩小), 2.0 (放大) |
| KFTypeRotation | 旋转角度 | -360 到 360 | 0 (无旋转), 90 (顺时针90度) |
| KFTypeAlpha | 透明度 | 0.0 到 1.0 | 1.0 (不透明), 0.5 (半透明), 0.0 (透明) |
| UNIFORM_SCALE | 统一缩放 | 0.1 到 10.0 | 1.0 (原始), 0.5 (缩小), 2.0 (放大) |
| KFTypeSaturation | 饱和度 | -1.0 到 1.0 | 0.0 (原始), -0.5 (降低), 0.5 (增强) |
| KFTypeContrast | 对比度 | -1.0 到 1.0 | 0.0 (原始), -0.5 (降低), 0.5 (增强) |
| KFTypeBrightness | 亮度 | -1.0 到 1.0 | 0.0 (原始), -0.5 (变暗), 0.5 (变亮) |
| KFTypeVolume | 音量 | 0.0 到 2.0 | 1.0 (原始), 0.5 (降低), 2.0 (增强) |
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"keyframes_added": 3,
"affected_segments": ["segment_001", "segment_002"]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| keyframes_added | integer | 添加的关键帧数量 |
| affected_segments | array | 受影响的片段ID列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本关键帧添加(使用微秒时间)
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_keyframes \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"keyframes": "[{\"segment_id\":\"segment-id\",\"property\":\"UNIFORM_SCALE\",\"offset\":0,\"value\":1},{\"segment_id\":\"segment-id\",\"property\":\"UNIFORM_SCALE\",\"offset\":5000000,\"value\":1.3}]"
}'
```
#### 2. 多属性关键帧
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_keyframes \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"keyframes": "[{\"segment_id\":\"segment-uuid\",\"property\":\"KFTypePositionX\",\"offset\":0,\"value\":0},{\"segment_id\":\"segment-uuid\",\"property\":\"KFTypePositionY\",\"offset\":0,\"value\":0},{\"segment_id\":\"segment-uuid\",\"property\":\"KFTypeRotation\",\"offset\":2500000,\"value\":90},{\"segment_id\":\"segment-uuid\",\"property\":\"KFTypeAlpha\",\"offset\":5000000,\"value\":0}]"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | keyframes是必填项 | 缺少关键帧参数 | 提供有效的keyframes数据 |
| 400 | 无效的关键帧信息,请检查keyframes字段值是否正确 | 关键帧数据格式错误 | 检查关键帧数据格式是否符合要求 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 404 | 片段未找到 | 指定的segment_id在草稿中不存在 | 确认片段ID是否正确 |
| 400 | 无效的片段类型 | 该片段不支持关键帧功能 | 确保为目标片段是视觉片段(视频、图片、贴纸、文本) |
| 400 | 无效的关键帧属性类型 | 指定的property类型不受支持 | 检查属性类型是否在支持列表中 |
| 500 | 关键帧添加失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **片段ID验证**: segment_id 必须是草稿中存在的有效片段ID
2. **片段类型限制**: 只有视觉片段(视频、图片、贴纸、文本)支持关键帧
3. **时间偏移范围**: offset 值必须是非负整数(微秒)
4. **属性值范围**: 不同的属性类型有不同的值范围限制
5. **重复关键帧**: 相同片段相同属性的关键帧会被累加,不会覆盖
6. **性能考虑**: 单次请求建议不超过100个关键帧
7. **缩放属性**: 设置KFTypeScaleX或KFTypeScaleY会自动取消锁定XY轴缩放比例
## 工作流程
1. 验证必填参数(draft_url, keyframes)
2. 解析关键帧数据JSON字符串
3. 从缓存中获取草稿
4. 验证每个关键帧数据的有效性
5. 查找目标片段并验证片段类型
6. 为每个关键帧创建关键帧列表并添加到片段
7. 保存草稿
8. 返回添加结果信息
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_masks.md
================================================
# ADD_MASKS API Documentation
## 🌐 Language Switch
[中文版](./add_masks.zh.md) | [English](./add_masks.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_masks
```
## Function Description
Add mask effects to existing drafts. This interface is used to add various shape masks to control visible areas of the screen in Jianying drafts. Masks can be used to create interesting visual effects and focus attention on specific areas.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"segment_ids": ["segment1-uuid", "segment2-uuid"],
"name": "Circle Mask",
"X": 0.5,
"Y": 0.5,
"width": 0.3,
"height": 0.3,
"feather": 0.1,
"rotation": 0,
"invert": false,
"roundCorner": 0.2
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string |✅ | - | Complete URL of the target draft |
| segment_ids | array |✅ | - | List of segment IDs to apply masks |
| name | string |✅ | - | Mask name/type |
| X | number |✅ | - | Horizontal position (0.0-1.0) |
| Y | number |✅ | - | Vertical position (0.0-1.0) |
| width | number |✅ | - | Mask width (0.0-1.0) |
| height | number |✅ | - | Mask height (0.0-1.0) |
| feather | number |❌ | 0.0 | Feather edge softness |
| rotation | number | ❌ | 0 | Rotation angle (degrees) |
| invert | boolean | ❌ | false | Invert mask effect |
| roundCorner | number | ❌ | 0.0 | Rounded corner radius |
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"masks_added": 2,
"affected_segments": ["segment1-uuid", "segment2-uuid"],
"mask_ids": ["mask1-uuid", "mask2-uuid"]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| masks_added | integer | Number of masks added |
| affected_segments | array | List of affected segment IDs |
| mask_ids | array | List of added mask IDs |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Circle Mask
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_masks \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"segment_ids": ["segment1-uuid"],
"name": "Circle Mask",
"X": 0.5,
"Y": 0.5,
"width": 0.4,
"height": 0.4
}'
```
#### 2. Rectangle Mask with Effects
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_masks \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"segment_ids": ["segment1-uuid", "segment2-uuid"],
"name": "Rectangle Mask",
"X": 0.3,
"Y": 0.4,
"width": 0.5,
"height": 0.3,
"feather": 0.1,
"roundCorner": 0.1
}'
```
#### 3. Inverted Mask
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_masks \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"segment_ids": ["segment1-uuid"],
"name": "Heart Mask",
"X": 0.5,
"Y": 0.5,
"width": 0.3,
"height": 0.3,
"invert": true
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft URL |
| 400 | segment_ids is required | Missing segment IDs | Provide valid segment ID list |
| 400 | name is required | Missing mask name | Provide mask name |
| 400 | Position values invalid | X/Y must be between 0.0-1.0 | Use valid position values |
| 400 | Size values invalid | width/height must be between 0.0-1.0 | Use valid size values |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 404 | Segment not found | Specified segment ID does not exist | Check segment IDs |
| 500 | Mask processing failed | Internal processing error | Contact technical support |
## Notes
1. **Coordinate System**: Position values use normalized coordinates (0.0-1.0)
2. **Size Values**: Width and height are relative to screen size
3. **Mask Types**: Support various mask shapes (circle, rectangle, heart, etc.)
4. **Feather Effect**: Softens mask edges for natural transitions
5. **Rotation**: Rotation angle in degrees
6. **Invert**: When true, shows area outside the mask
## Workflow
1. Validate required parameters
2. Check segment existence
3. Create mask with specified parameters
4. Apply mask to segments
5. Save and encrypt draft
6. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Images](./add_images.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_masks.zh.md
================================================
# ADD_MASKS API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/add_masks
```
## 功能描述
向现有草稿中的指定片段添加遮罩效果。遮罩是视频编辑中的重要功能,通过遮罩可以控制图像的可见区域,创造出各种视觉效果。支持多种遮罩类型(线性、镜面、圆形、矩形、爱心、星形),每种遮罩都可以精确配置位置、大小、羽化、旋转等属性。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"segment_ids": ["d62994b4-25fe-422a-a123-87ef05038558"],
"name": "圆形",
"X": 100,
"Y": 200,
"width": 300,
"height": 300,
"feather": 20,
"rotation": 0,
"invert": false,
"roundCorner": 0
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | "" | 目标草稿的完整URL |
| segment_ids | array | ✅ | [] | 要应用遮罩的片段ID数组 |
| name | string | ❌ | "线性" | 遮罩类型名称 |
| X | integer | ❌ | 0 | 遮罩中心X坐标(像素) |
| Y | integer | ❌ | 0 | 遮罩中心Y坐标(像素) |
| width | integer | ❌ | 512 | 遮罩宽度(像素) |
| height | integer | ❌ | 512 | 遮罩高度(像素) |
| feather | integer | ❌ | 0 | 羽化程度(0-100) |
| rotation | integer | ❌ | 0 | 旋转角度(度) |
| invert | boolean | ❌ | false | 是否反转遮罩 |
| roundCorner | integer | ❌ | 0 | 圆角半径(0-100) |
### 参数详解
#### 遮罩类型参数
- **name**: 遮罩类型名称
- 可选值:线性、镜面、圆形、矩形、爱心、星形
- 默认值:线性
#### 位置参数
- **X**: 遮罩中心X坐标(像素)
- 正值向右移动
- 负值向左移动
- 以素材中心为原点
- **Y**: 遮罩中心Y坐标(像素)
- 正值向下移动
- 负值向上移动
- 以素材中心为原点
#### 尺寸参数
- **width**: 遮罩宽度(像素)
- 默认值:512
- 建议范围:1-2048
- **height**: 遮罩高度(像素)
- 默认值:512
- 建议范围:1-2048
#### 效果参数
- **feather**: 羽化程度(0-100)
- 0 = 无羽化(锐利边缘)
- 100 = 最大羽化(柔和边缘)
- 默认值:0
- **rotation**: 旋转角度(度)
- 0-360度范围
- 默认值:0
- **invert**: 是否反转遮罩
- true = 反转遮罩效果
- false = 正常遮罩效果
- 默认值:false
- **roundCorner**: 圆角半径(0-100)
- 仅对矩形遮罩有效
- 0 = 无圆角(直角)
- 100 = 最大圆角
- 默认值:0
#### 片段ID参数
- **segment_ids**: 要应用遮罩的片段ID数组
- 必须是视频片段ID
- 支持批量处理多个片段
- 每个片段只能添加一个遮罩
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"masks_added": 1,
"affected_segments": ["d62994b4-25fe-422a-a123-87ef05038558"],
"mask_ids": ["mask_001"]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| masks_added | number | 成功添加的遮罩数量 |
| affected_segments | array | 受影响的片段ID列表 |
| mask_ids | array | 遮罩ID列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本遮罩添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_masks \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"segment_ids": ["SEGMENT_ID"],
"name": "圆形"
}'
```
#### 2. 带位置和尺寸的遮罩
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_masks \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"segment_ids": ["SEGMENT_ID"],
"name": "矩形",
"X": 100,
"Y": 50,
"width": 400,
"height": 300
}'
```
#### 3. 带效果参数的遮罩
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_masks \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"segment_ids": ["SEGMENT_ID"],
"name": "线性",
"feather": 30,
"rotation": 45,
"invert": true
}'
```
#### 4. 矩形遮罩带圆角
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_masks \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"segment_ids": ["SEGMENT_ID"],
"name": "矩形",
"roundCorner": 50
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | segment_ids是必填项 | 缺少片段ID参数 | 提供有效的segment_ids数组 |
| 400 | 无效的遮罩信息,请检查遮罩参数是否正确 | 遮罩参数校验失败 | 检查遮罩参数是否符合要求 |
| 400 | 羽化程度无效 | feather超出范围 | 使用0-100范围内的羽化值 |
| 400 | 旋转角度无效 | rotation超出范围 | 使用0-360范围内的角度值 |
| 400 | 圆角半径无效 | roundCorner超出范围 | 使用0-100范围内的圆角值 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 404 | 片段未找到 | 指定的片段ID不存在 | 确认片段ID是否正确 |
| 400 | 无效的片段类型 | 片段类型不支持添加遮罩 | 确保使用视频片段ID |
| 404 | 遮罩类型未找到 | 指定的遮罩名称不存在 | 使用有效的遮罩类型名称 |
| 500 | 遮罩添加失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **片段要求**: 只有视频片段(VideoSegment)支持添加遮罩
2. **遮罩限制**: 每个片段只能添加一个遮罩,重复添加不会报错,会返回现有遮罩信息
3. **坐标系统**: X、Y坐标以像素为单位,原点位于素材中心
4. **参数范围**:
- feather: 0-100,羽化程度
- rotation: 0-360度,旋转角度
- roundCorner: 0-100,圆角半径(仅矩形遮罩有效)
5. **批量处理**: 支持同时为多个片段添加相同配置的遮罩
6. **遮罩类型**: 支持线性、镜面、圆形、矩形、爱心、星形六种遮罩类型
7. **性能考虑**: 避免同时添加大量遮罩
## 工作流程
1. 验证必填参数(draft_url, segment_ids)
2. 检查片段ID的有效性
3. 从缓存中获取草稿
4. 查找并验证遮罩类型
5. 为每个片段添加遮罩
6. 保存草稿
7. 返回遮罩信息
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_sticker.md
================================================
# ADD_STICKER API Documentation
## 🌐 Language Switch
[中文版](./add_sticker.zh.md) | [English](./add_sticker.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_sticker
```
## Function Description
Add stickers to existing drafts. This interface is used to add sticker materials to Jianying drafts within specified time periods, supporting sticker scaling and position adjustments. Stickers can be used to enhance the visual effects of videos, such as expressions, decorations, text, etc.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"sticker_id": "7326810673609018675",
"start": 0,
"end": 5000000,
"scale": 1.0,
"transform_x": 0,
"transform_y": 0
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string |✅ | - | Complete URL of the target draft |
| sticker_id | string |✅ | - | Unique ID of the sticker |
| start | number |✅ | - | Sticker start time (microseconds) |
| end | number | ✅ | - | Sticker end time (microseconds) |
| scale | number |❌ | 1.0 | Sticker scale ratio, recommended range [0.1, 5.0] |
| transform_x | number | ❌ | 0 | X-axis position offset (pixels) |
| transform_y | number | ❌ | 0 | Y-axis position offset (pixels) |
### Parameter Details
#### Time Parameters
- **start**: Start time of the sticker on the timeline, unit microseconds (1 second = 1,000,000 microseconds)
- **end**: End time of the sticker on the timeline, unit microseconds
- **duration**: Sticker display duration = end - start
#### Scale Parameters
- **scale**: Scale ratio of the sticker
- 1.0 = Original size
- 0.5 = Half size
- 2.0 = Double size
- Recommended range: 0.1 - 5.0
#### Position Parameters
- **transform_x**: X-axis position offset of the sticker, unit pixels
- Positive values move right
- Negative values move left
- Origin at canvas center
- Actually stored in half canvas width units (assuming canvas width 1920, i.e., divided by 960)
- **transform_y**: Y-axis position offset of the sticker, unit pixels
- Positive values move down
- Negative values move up
- Origin at canvas center
- Actually stored in half canvas height units (assuming canvas height 1080, i.e., divided by 540)
#### Sticker ID Description
- **sticker_id**: Unique identifier of the sticker
- Format: Usually numeric string
- Example: `"7326810673609018675"`
- Acquisition: Through Jianying sticker library or related APIs
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"sticker_id": "7326810673609018675",
"track_id": "track-uuid",
"segment_id": "segment-uuid",
"duration": 5000000
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| sticker_id | string | Unique ID of the sticker |
| track_id | string | Sticker track ID |
| segment_id | string | Sticker segment ID |
| duration | number | Sticker display duration (microseconds) |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Sticker Addition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_sticker \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"sticker_id": "7326810673609018675",
"start": 0,
"end": 5000000
}'
```
#### 2. Sticker with Scaling
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_sticker \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"sticker_id": "7326810673609018675",
"start": 1000000,
"end": 6000000,
"scale": 1.5
}'
```
#### 3. Sticker with Position Offset
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_sticker \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"sticker_id": "7326810673609018675",
"start": 2000000,
"end": 7000000,
"scale": 0.8,
"transform_x": 200,
"transform_y": -100
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft_url |
| 400 | sticker_id is required | Missing sticker ID parameter | Provide a valid sticker_id |
| 400 | start is required | Missing start time parameter | Provide a valid start time |
| 400 | end is required | Missing end time parameter | Provide a valid end time |
| 400 | Time range invalid | end must be greater than start | Ensure end time is greater than start time |
| 400 | Scale ratio invalid | scale out of recommended range | Use scale values within 0.1-5.0 range |
| 400 | Invalid sticker information, please check sticker parameters | Sticker parameter validation failed | Check if sticker parameters meet requirements |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 404 | Sticker does not exist | Specified sticker ID invalid | Confirm if sticker ID is correct |
| 500 | Sticker addition failed | Internal processing error | Contact technical support |
## Notes
1. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
2. **Sticker ID**: Ensure using valid sticker ID
3. **Time Range**: end must be greater than start
4. **Scale Range**: scale recommended within 0.1-5.0 range
5. **Position Parameters**: transform_x and transform_y units are pixels, but internally converted to half canvas units for storage
- transform_x conversion formula: actual value / 960 (assuming canvas width 1920)
- transform_y conversion formula: actual value / 540 (assuming canvas height 1080)
6. **Track Management**: System automatically creates sticker track
7. **Performance Consideration**: Avoid adding large numbers of stickers simultaneously
## Workflow
1. Validate required parameters (draft_url, sticker_id, start, end)
2. Check validity of time range
3. Get draft from cache
4. Create sticker track (if not exists)
5. Create image adjustment settings
6. Create sticker segment
7. Add segment to track
8. Save draft
9. Return sticker information
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Audios](./add_audios.md)
- [Add Images](./add_images.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_sticker.zh.md
================================================
# ADD_STICKER API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/add_sticker
```
## 功能描述
向现有草稿中添加贴纸。该接口用于在指定的时间段内添加贴纸素材到剪映草稿中,支持贴纸的缩放和位置调整。贴纸可以用于增强视频的视觉效果,如表情、装饰、文字等。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"sticker_id": "7326810673609018675",
"start": 0,
"end": 5000000,
"scale": 1.0,
"transform_x": 0,
"transform_y": 0
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| sticker_id | string | ✅ | - | 贴纸的唯一标识ID |
| start | number | ✅ | - | 贴纸开始时间(微秒) |
| end | number | ✅ | - | 贴纸结束时间(微秒) |
| scale | number | ❌ | 1.0 | 贴纸缩放比例,建议范围[0.1, 5.0] |
| transform_x | number | ❌ | 0 | X轴位置偏移(像素) |
| transform_y | number | ❌ | 0 | Y轴位置偏移(像素) |
### 参数详解
#### 时间参数
- **start**: 贴纸在时间轴上的开始时间,单位为微秒(1秒 = 1,000,000微秒)
- **end**: 贴纸在时间轴上的结束时间,单位为微秒
- **duration**: 贴纸显示时长 = end - start
#### 缩放参数
- **scale**: 贴纸的缩放比例
- 1.0 = 原始大小
- 0.5 = 缩小到一半
- 2.0 = 放大到两倍
- 建议范围:0.1 - 5.0
#### 位置参数
- **transform_x**: 贴纸在X轴方向的位置偏移,单位为像素
- 正值向右移动
- 负值向左移动
- 以画布中心为原点
- 实际存储时会转换为半画布宽单位(假设画布宽度1920,即除以960)
- **transform_y**: 贴纸在Y轴方向的位置偏移,单位为像素
- 正值向下移动
- 负值向上移动
- 以画布中心为原点
- 实际存储时会转换为半画布高单位(假设画布高度1080,即除以540)
#### 贴纸ID说明
- **sticker_id**: 贴纸的唯一标识符
- 格式:通常为数字字符串
- 示例:`"7326810673609018675"`
- 获取方式:通过剪映贴纸库或相关API获取
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"sticker_id": "7326810673609018675",
"track_id": "track-uuid",
"segment_id": "segment-uuid",
"duration": 5000000
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| sticker_id | string | 贴纸的唯一标识ID |
| track_id | string | 贴纸轨道ID |
| segment_id | string | 贴纸片段ID |
| duration | number | 贴纸显示时长(微秒) |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本贴纸添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_sticker \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"sticker_id": "7326810673609018675",
"start": 0,
"end": 5000000
}'
```
#### 2. 带缩放的贴纸
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_sticker \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"sticker_id": "7326810673609018675",
"start": 1000000,
"end": 6000000,
"scale": 1.5
}'
```
#### 3. 带位置偏移的贴纸
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_sticker \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"sticker_id": "7326810673609018675",
"start": 2000000,
"end": 7000000,
"scale": 0.8,
"transform_x": 200,
"transform_y": -100
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | sticker_id是必填项 | 缺少贴纸ID参数 | 提供有效的sticker_id |
| 400 | start是必填项 | 缺少开始时间参数 | 提供有效的start时间 |
| 400 | end是必填项 | 缺少结束时间参数 | 提供有效的end时间 |
| 400 | 时间范围无效 | end必须大于start | 确保结束时间大于开始时间 |
| 400 | 缩放比例无效 | scale超出建议范围 | 使用0.1-5.0范围内的缩放值 |
| 400 | 无效的贴纸信息,请检查贴纸参数是否正确 | 贴纸参数校验失败 | 检查贴纸参数是否符合要求 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 404 | 贴纸不存在 | 指定的贴纸ID无效 | 确认贴纸ID是否正确 |
| 500 | 贴纸添加失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **时间单位**: 所有时间参数使用微秒(1秒 = 1,000,000微秒)
2. **贴纸ID**: 确保使用有效的贴纸ID
3. **时间范围**: end必须大于start
4. **缩放范围**: scale建议在0.1-5.0范围内
5. **位置参数**: transform_x和transform_y单位为像素,但内部会转换为半画布单位存储
- transform_x转换公式:实际值 / 960(假设画布宽度1920)
- transform_y转换公式:实际值 / 540(假设画布高度1080)
6. **轨道管理**: 系统自动创建贴纸轨道
7. **性能考虑**: 避免同时添加大量贴纸
## 工作流程
1. 验证必填参数(draft_url, sticker_id, start, end)
2. 检查时间范围的有效性
3. 从缓存中获取草稿
4. 创建贴纸轨道(如果不存在)
5. 创建图像调节设置
6. 创建贴纸片段
7. 添加片段到轨道
8. 保存草稿
9. 返回贴纸信息
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_text_style.md
================================================
# ADD_TEXT_STYLE API Documentation
## 🌐 Language Switch
[中文版](./add_text_style.zh.md) | [English](./add_text_style.md)
## Interface Information
```bash
POST /openapi/capcut-mate/v1/add_text_style
```
## Function Description
Create rich text styles for text, supporting keyword highlighting, color settings, font size adjustments, and other functions. This interface can convert plain text into rich text format containing style information, achieving keyword highlighting and diverse text display effects.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"text": "五个快乐到死的顶级思维",
"keyword": "快乐|顶级思维",
"font_size": 12,
"keyword_color": "#ff7100",
"keyword_font_size": 15
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| text | string |✅ | - | Text content to process |
| keyword | string |✅ | - | Keywords, multiple separated by \| |
| font_size | number |❌ | 12 | Font size of plain text |
| keyword_color | string |❌ | "#ff7100" | Keyword text color (hexadecimal) |
| keyword_font_size | number |❌ | 15 | Keyword font size |
### Parameter Details
#### Text Parameters
- **text**: Original text content to be processed for styling
- Example: `"五个快乐到死的顶级思维"`
#### Keyword Parameters
- **keyword**: Keywords to be highlighted, support multiple keywords separated by vertical bar (|)
- Example: `"快乐|顶级思维"`
- Note: System matches keywords by length priority to avoid short keywords overriding long keywords
#### Font Size Parameters
- **font_size**: Font size of plain text (non-keywords)
- Default: 12
- Recommended range: 8-72
- **keyword_font_size**: Font size of keywords
- Default: 15
- Recommended range: 8-72
#### Color Parameters
- **keyword_color**: Text color of keywords, using hexadecimal format
- Default: `"#ff7100"` (orange)
- Format: #RRGGBB
- Examples: `"#ff0000"` (red), `"#00ff00"` (green), `"#0000ff"` (blue)
## Response Format
### Success Response (200)
```json
{
"text_style": "{\"styles\":[{\"fill\":{\"content\":{\"solid\":{\"color\":[1,1,1]}}},\"range\":[0,2],\"size\":12,\"font\":{\"id\":\"\",\"path\":\"\"}},{\"fill\":{\"content\":{\"solid\":{\"color\":[1,0.44313725490196076,0]}}},\"range\":[2,4],\"size\":15,\"font\":{\"id\":\"\",\"path\":\"\"},\"useLetterColor\":true},{\"fill\":{\"content\":{\"solid\":{\"color\":[1,1,1]}}},\"range\":[4,7],\"size\":12,\"font\":{\"id\":\"\",\"path\":\"\"}},{\"fill\":{\"content\":{\"solid\":{\"color\":[1,0.44313725490196076,0]}}},\"range\":[7,11],\"size\":15,\"font\":{\"id\":\"\",\"path\":\"\"},\"useLetterColor\":true}],\"text\":\"五个快乐到死的顶级思维\"}"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| text_style | string | Text style JSON string, containing styles array and text field |
### Error Response (4xx/5xx)
```json
{
"code": 2026,
"message": "Invalid text style information, please check text or keyword parameters"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Text Style Creation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_text_style \
-H "Content-Type: application/json" \
-d '{
"text": "五个快乐到死的顶级思维",
"keyword": "快乐|顶级思维"
}'
```
#### 2. Custom Font Sizes
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_text_style \
-H "Content-Type: application/json" \
-d '{
"text": "五个快乐到死的顶级思维",
"keyword": "快乐|顶级思维",
"font_size": 14,
"keyword_font_size": 18
}'
```
#### 3. Custom Keyword Color
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_text_style \
-H "Content-Type: application/json" \
-d '{
"text": "五个快乐到死的顶级思维",
"keyword": "快乐|顶级思维",
"keyword_color": "#ff0000"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 2026 | Invalid text style information, please check text or keyword parameters | Text or keyword parameter format error or invalid value | Check if text and keyword parameters meet requirements |
| 2027 | Text style creation failed | Error occurred during text style creation | Contact technical support |
## Notes
1. **Keyword Matching**: Keywords are matched by length priority, longer keywords take precedence over shorter ones
2. **Color Format**: Use standard hexadecimal color format #RRGGBB
3. **Font Size**: Recommended within 8-72 range
4. **Keyword Separation**: Multiple keywords separated by vertical bar |
5. **Case Sensitivity**: Keyword matching is case-sensitive
## Workflow
1. Validate required parameters (text, keyword)
2. Parse keyword string
3. Find keyword positions in text
4. Convert color values to RGB format
5. Generate text style array
6. Build response object
7. Return text style information
## Related Interfaces
- [Add Captions](./add_captions.md)
- [Create Draft](./create_draft.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_text_style.zh.md
================================================
# ADD_TEXT_STYLE API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```bash
POST /openapi/capcut-mate/v1/add_text_style
```
## 功能描述
为文本创建富文本样式,支持关键词高亮、颜色设置、字体大小调整等功能。该接口可以将普通文本转换为包含样式信息的富文本格式,实现关键词突出显示、多样化的文本展示效果。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"text": "五个快乐到死的顶级思维",
"keyword": "快乐|顶级思维",
"font_size": 12,
"keyword_color": "#ff7100",
"keyword_font_size": 15
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| text | string | ✅ | - | 要处理的文本内容 |
| keyword | string | ✅ | - | 关键词,多个用 \| 分隔 |
| font_size | number | ❌ | 12 | 普通文本的字体大小 |
| keyword_color | string | ❌ | "#ff7100" | 关键词文本颜色(十六进制) |
| keyword_font_size | number | ❌ | 15 | 关键词字体大小 |
### 参数详解
#### 文本参数
- **text**: 需要进行样式处理的原始文本内容
- 示例:`"五个快乐到死的顶级思维"`
#### 关键词参数
- **keyword**: 需要高亮显示的关键词,支持多个关键词用竖线(|)分隔
- 示例:`"快乐|顶级思维"`
- 注意:系统会按关键词长度优先匹配,避免短关键词覆盖长关键词
#### 字体大小参数
- **font_size**: 普通文本(非关键词)的字体大小
- 默认值:12
- 建议范围:8-72
- **keyword_font_size**: 关键词的字体大小
- 默认值:15
- 建议范围:8-72
#### 颜色参数
- **keyword_color**: 关键词的文本颜色,使用十六进制格式
- 默认值:`"#ff7100"` (橙色)
- 格式:#RRGGBB
- 示例:`"#ff0000"` (红色), `"#00ff00"` (绿色), `"#0000ff"` (蓝色)
## 响应格式
### 成功响应 (200)
```json
{
"text_style": "{\"styles\":[{\"fill\":{\"content\":{\"solid\":{\"color\":[1,1,1]}}},\"range\":[0,2],\"size\":12,\"font\":{\"id\":\"\",\"path\":\"\"}},{\"fill\":{\"content\":{\"solid\":{\"color\":[1,0.44313725490196076,0]}}},\"range\":[2,4],\"size\":15,\"font\":{\"id\":\"\",\"path\":\"\"},\"useLetterColor\":true},{\"fill\":{\"content\":{\"solid\":{\"color\":[1,1,1]}}},\"range\":[4,7],\"size\":12,\"font\":{\"id\":\"\",\"path\":\"\"}},{\"fill\":{\"content\":{\"solid\":{\"color\":[1,0.44313725490196076,0]}}},\"range\":[7,11],\"size\":15,\"font\":{\"id\":\"\",\"path\":\"\"},\"useLetterColor\":true}],\"text\":\"五个快乐到死的顶级思维\"}"
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| text_style | string | 文本样式JSON字符串,包含styles数组和text字段 |
### 错误响应 (4xx/5xx)
```json
{
"code": 2026,
"message": "无效的文本样式信息,请检查文本或关键词参数"
}
```
## 使用示例
### cURL 示例
#### 1. 基本文本样式创建
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_text_style \
-H "Content-Type: application/json" \
-d '{
"text": "五个快乐到死的顶级思维",
"keyword": "快乐|顶级思维"
}'
```
#### 2. 自定义字体大小
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_text_style \
-H "Content-Type: application/json" \
-d '{
"text": "五个快乐到死的顶级思维",
"keyword": "快乐|顶级思维",
"font_size": 14,
"keyword_font_size": 18
}'
```
#### 3. 自定义关键词颜色
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_text_style \
-H "Content-Type: application/json" \
-d '{
"text": "五个快乐到死的顶级思维",
"keyword": "快乐|顶级思维",
"keyword_color": "#ff0000"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 2026 | 无效的文本样式信息,请检查文本或关键词参数 | 文本或关键词参数格式错误或值无效 | 检查text和keyword参数是否符合要求 |
| 2027 | 文本样式创建失败 | 创建文本样式过程中发生错误 | 联系技术支持 |
## 注意事项
1. **关键词匹配**: 关键词按长度优先匹配,长关键词优先于短关键词
2. **颜色格式**: 使用标准十六进制颜色格式 #RRGGBB
3. **字体大小**: 建议在8-72范围内
4. **关键词分隔**: 多个关键词使用竖线 | 分隔
5. **大小写敏感**: 关键词匹配区分大小写
## 工作流程
1. 验证必填参数(text, keyword)
2. 解析关键词字符串
3. 在文本中查找关键词位置
4. 转换颜色值为RGB格式
5. 生成文本样式数组
6. 构建响应对象
7. 返回文本样式信息
## 相关接口
- [添加字幕](./add_captions.md)
- [创建草稿](./create_draft.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_videos.md
================================================
# ADD_VIDEOS API Documentation
## 🌐 Language Switch
[中文版](./add_videos.zh.md) | [English](./add_videos.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/add_videos
```
## Function Description
Batch add video materials to existing drafts. This interface is a powerful video addition tool that supports batch processing of multiple videos, including time range control, transparency adjustment, mask effects, transition animations, volume control, scaling transformations, and other advanced features. Particularly suitable for creating complex multi-video combination scenes, such as picture-in-picture effects, video splicing, transition animations, etc.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"width\":1024,\"height\":1024,\"start\":0,\"end\":5000000,\"duration\":5000000,\"mask\":\"circle\",\"transition\":\"fade\",\"transition_duration\":500000,\"volume\":0.8}]",
"scene_timelines": [{"start":0,"end":2500000}],
"alpha": 0.5,
"scale_x": 1.0,
"scale_y": 1.0,
"transform_x": 100,
"transform_y": 200
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string | ✅ | - | Complete URL of the target draft |
| video_infos | string | ✅ | - | JSON string of video information array |
| scene_timelines | array[object] | ❌ | - | Scene timeline array for video speed change, corresponds one-to-one with video_infos |
| alpha | number | ❌ | 1.0 | Global transparency (0-1) |
| scale_x | number | ❌ | 1.0 | X-axis scaling ratio |
| scale_y | number | ❌ | 1.0 | Y-axis scaling ratio |
| transform_x | number | ❌ | 0 | X-axis position offset (pixels) |
| transform_y | number | ❌ | 0 | Y-axis position offset (pixels) |
### video_infos Array Structure
| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| video_url | string | ✅ | - | URL address of the video file |
| width | number | ❌ | - | Video width (pixels), automatically obtained if not provided |
| height | number | ❌ | - | Video height (pixels), automatically obtained if not provided |
| start | number | ✅ | - | Video start playback time (microseconds) |
| end | number | ✅ | - | Video end playback time (microseconds) |
| duration | number | ❌ | end-start | Total video duration (microseconds) |
| mask | string | ❌ | - | Mask type |
| transition | string | ❌ | - | Transition effect name |
| transition_duration | number | ❌ | 500000 | Transition duration (microseconds) |
| volume | number | ❌ | 1.0 | Volume size (0-1) |
### scene_timelines Array Structure
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| start | number | ✅ | Scene start time (microseconds) |
| end | number | ✅ | Scene end time (microseconds) |
### Parameter Details
#### Time Parameters
- **start**: Start time of the video on the timeline, unit microseconds (1 second = 1,000,000 microseconds)
- **end**: End time of the video on the timeline, unit microseconds
- **duration**: Total duration of the video file, used for material creation (optional parameter, defaults to end-start if not provided)
- **Playback Duration**: Actual playback duration = end - start
#### Transparency Parameters
- **alpha**: Global transparency, applied to all added videos
- 1.0 = Fully opaque
- 0.5 = Semi-transparent
- 0.0 = Fully transparent
- Range: 0.0 - 1.0
#### Scaling Parameters
- **scale_x/scale_y**: Scaling ratios in X/Y axis directions
- 1.0 = Original size, 0.5 = Half size, 2.0 = Double size
- Recommended range: 0.1 - 5.0
#### Position Parameters
- **transform_x/transform_y**: Position offsets in X/Y axis directions, unit pixels
- Positive values move right/down, negative values move left/up
- Canvas center as origin
#### Mask Types
Supported mask types (all optional, default is no mask):
- `circle` - Circular mask effect
- `heart` - Heart-shaped mask
- `star` - Star-shaped mask
- `rectangle` - Rectangular mask
- `linear` - Linear gradient mask
- `mirror` - Mirror reflection mask
#### Transition Effects
- **transition**: Transition effect name
- **transition_duration**: Transition duration
- Minimum: 100,000 microseconds (0.1 seconds)
- Maximum: 2,500,000 microseconds (2.5 seconds)
- Recommended: 500,000 microseconds (0.5 seconds)
#### Volume Control
- **volume**: Video volume size
- 1.0 = Original volume
- 0.5 = Half volume
- 0.0 = Mute
- Range: 0.0 - 1.0
#### Video Speed Change (scene_timelines)
- **scene_timelines**: Scene timeline array for video speed change, corresponds one-to-one with video_infos
- Each item contains `start` and `end` fields (microseconds)
- Speed calculation: `speed = (video.end - video.start) / (scene_timeline.end - scene_timeline.start)`
- Example: If video timeline is 0-2000000 (2 seconds) and scene_timeline is 0-1000000 (1 second), the video will play at 2x speed
- If not provided, video plays at normal speed (1.0x)
**Speed Change Example**:
```json
// Original video: 2 seconds on timeline (0-2000000)
// To make it 2x speed (play in 1 second):
{
"video_infos": "[{\"video_url\":\"...\", \"start\":0, \"end\":2000000}]",
"scene_timelines": "[{\"start\":0, \"end\":1000000}]"
}
// Result: Video plays at 2x speed, actual playback duration is 1 second
```
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "video-track-uuid",
"video_ids": ["video1-uuid", "video2-uuid", "video3-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid", "segment3-uuid"]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
| track_id | string | Video track ID |
| video_ids | array | List of added video IDs |
| segment_ids | array | List of segment IDs |
## Usage Examples
### cURL Examples
#### 1. Basic Video Addition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000,\"duration\":10000000}]"
}'
```
#### 2. Batch Adding Multiple Videos
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000,\"duration\":10000000},{\"video_url\":\"https://assets.jcaigc.cn/video2.mp4\",\"width\":1280,\"height\":720,\"start\":5000000,\"end\":10000000,\"duration\":8000000}]",
"alpha": 0.8
}'
```
#### 3. Video with Mask and Transition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"width\":1024,\"height\":1024,\"start\":0,\"end\":5000000,\"duration\":10000000,\"mask\":\"circle\",\"transition\":\"fade\",\"transition_duration\":500000,\"volume\":0.8}]",
"alpha": 1.0,
"scale_x": 1.2,
"scale_y": 1.2
}'
```
#### 4. Picture-in-Picture Effect
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/main.mp4\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":10000000,\"duration\":15000000},{\"video_url\":\"https://assets.jcaigc.cn/pip.mp4\",\"width\":640,\"height\":360,\"start\":2000000,\"end\":8000000,\"duration\":10000000}]",
"transform_x": 300,
"transform_y": -200,
"scale_x": 0.3,
"scale_y": 0.3
}'
```
#### 5. Video with Speed Change (2x Speed)
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"start\":0,\"end\":2000000}]",
"scene_timelines": [{"start":0, "end":1000000}]
}'
```
#### 6. Multiple Videos with Different Speeds
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"start\":0,\"end\":3000000},{\"video_url\":\"https://assets.jcaigc.cn/video2.mp4\",\"start\":3000000,\"end\":6000000}]",
"scene_timelines": [{"start":0, "end":1500000},{"start":0, "end":4000000}]
}'
# video1: 3000000/1500000 = 2x speed
# video2: 3000000/4000000 = 0.75x speed (slow motion)
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft URL |
| 400 | video_infos is required | Missing video information parameter | Provide valid video information JSON |
| 400 | video_infos format error | JSON format is incorrect | Check JSON string format |
| 400 | video_url is required | Video URL missing | Provide URL for each video |
| 400 | Video dimensions invalid | width or height invalid | Provide positive width and height |
| 400 | Time range invalid | end must be greater than start | Ensure end time is greater than start time |
| 400 | Transparency value invalid | alpha not in 0-1 range | Use transparency value between 0-1 |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 404 | Video resource does not exist | Video URL inaccessible | Check if video URL is accessible |
| 500 | Video processing failed | Internal processing error | Contact technical support |
## Notes
1. **JSON Format**: video_infos must be a valid JSON string
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Video Format**: Ensure video file format is supported (e.g., MP4, AVI, etc.)
4. **File Size**: Large video files may affect processing speed
5. **Network Access**: Video URL must be accessible
6. **Mask Limitation**: Only predefined mask types are supported
7. **Transition Limitation**: Transition duration has fixed range limitations
8. **Performance Consideration**: Batch adding a large number of videos may affect performance
9. **Speed Change**: scene_timelines is an object array, length should match video_infos array length
## Workflow
1. Validate required parameters (draft_url, video_infos)
2. Parse video_infos JSON string
3. Validate parameter configuration for each video
4. Obtain and decrypt draft content
5. Create video track
6. Add video segments to track
7. Apply transparency, scaling and position transformation
8. Add mask and transition effects
9. Set volume
10. Save and encrypt draft
11. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Audios](./add_audios.md)
- [Add Images](./add_images.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/add_videos.zh.md
================================================
# ADD_VIDEOS API 接口文档
## 🌐 语言切换
[中文版](./add_videos.zh.md) | [English](./add_videos.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/add_videos
```
## 功能描述
批量向现有草稿中添加视频素材。该接口是一个功能强大的视频添加工具,支持多个视频的批量处理,包括时间范围控制、透明度调整、遮罩效果、转场动画、音量控制、缩放变换等高级功能。特别适合创建复杂的多视频组合场景,如画中画效果、视频拼接、过渡动画等。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"width\":1024,\"height\":1024,\"start\":0,\"end\":5000000,\"duration\":5000000,\"mask\":\"圆形\",\"transition\":\"淡入淡出\",\"transition_duration\":500000,\"volume\":0.8}]",
"scene_timelines": [{"start":0,"end":2500000}],
"alpha": 0.5,
"scale_x": 1.0,
"scale_y": 1.0,
"transform_x": 100,
"transform_y": 200
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| video_infos | string | ✅ | - | 视频信息数组的JSON字符串 |
| scene_timelines | array[object] | ❌ | - | 场景时间线数组,用于视频变速,与video_infos一一对应 |
| alpha | number | ❌ | 1.0 | 全局透明度(0-1) |
| scale_x | number | ❌ | 1.0 | X轴缩放比例 |
| scale_y | number | ❌ | 1.0 | Y轴缩放比例 |
| transform_x | number | ❌ | 0 | X轴位置偏移(像素) |
| transform_y | number | ❌ | 0 | Y轴位置偏移(像素) |
### video_infos 数组结构
| 字段名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| video_url | string | ✅ | - | 视频文件的URL地址 |
| width | number | ❌ | - | 视频宽度(像素),不传则自动获取视频文件尺寸 |
| height | number | ❌ | - | 视频高度(像素),不传则自动获取视频文件尺寸 |
| start | number | ✅ | - | 视频开始播放时间(微秒) |
| end | number | ✅ | - | 视频结束播放时间(微秒) |
| duration | number | ❌ | end-start | 视频总时长(微秒) |
| mask | string | ❌ | - | 遮罩类型 |
| transition | string | ❌ | - | 转场效果名称 |
| transition_duration | number | ❌ | 500000 | 转场持续时间(微秒) |
| volume | number | ❌ | 1.0 | 音量大小(0-1) |
### scene_timelines 数组结构
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| start | number | ✅ | 场景开始时间(微秒) |
| end | number | ✅ | 场景结束时间(微秒) |
### 参数详解
#### 时间参数
- **start**: 视频在时间轴上的开始时间,单位微秒(1秒 = 1,000,000微秒)
- **end**: 视频在时间轴上的结束时间,单位微秒
- **duration**: 视频文件的总时长,用于素材创建(可选参数,如果不传则默认为end-start)
- **播放时长**: 实际播放时长 = end - start
#### 透明度参数
- **alpha**: 全局透明度,应用于所有添加的视频
- 1.0 = 完全不透明
- 0.5 = 半透明
- 0.0 = 完全透明
- 范围:0.0 - 1.0
#### 缩放参数
- **scale_x/scale_y**: X/Y轴方向的缩放比例
- 1.0 = 原始大小,0.5 = 缩小一半,2.0 = 放大两倍
- 建议范围:0.1 - 5.0
#### 位置参数
- **transform_x/transform_y**: X/Y轴方向的位置偏移,单位像素
- 正值向右/下移动,负值向左/上移动
- 以画布中心为原点
#### 遮罩类型
支持的遮罩类型:
- `圆形` - 圆形遮罩效果
- `爱心` - 爱心形状遮罩
- `星形` - 星形遮罩
- `矩形` - 矩形遮罩
- `线性` - 线性渐变遮罩
- `镜面` - 镜面反射遮罩
#### 转场效果
- **transition**: 转场效果名称
- **transition_duration**: 转场持续时间
- 最小值:100,000微秒(0.1秒)
- 最大值:2,500,000微秒(2.5秒)
- 推荐值:500,000微秒(0.5秒)
#### 音量控制
- **volume**: 视频音量大小
- 1.0 = 原始音量
- 0.5 = 一半音量
- 0.0 = 静音
- 范围:0.0 - 1.0
#### 视频变速 (scene_timelines)
- **scene_timelines**: 场景时间线数组,用于视频变速,与video_infos一一对应
- 每个项包含 `start` 和 `end` 字段(微秒)
- 速度计算:`speed = (video.end - video.start) / (scene_timeline.end - scene_timeline.start)`
- 示例:如果视频时间线是 0-2000000(2秒),场景时间线是 0-1000000(1秒),则视频将以2倍速播放
- 如果不提供,视频以正常速度(1.0倍)播放
**变速示例**:
```json
// 原始视频:时间轴上占2秒(0-2000000)
// 要变为2倍速(1秒内播完):
{
"video_infos": "[{\"video_url\":\"...\", \"start\":0, \"end\":2000000}]",
"scene_timelines": "[{\"start\":0, \"end\":1000000}]"
}
// 结果:视频以2倍速播放,实际播放时长为1秒
```
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"track_id": "video-track-uuid",
"video_ids": ["video1-uuid", "video2-uuid", "video3-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid", "segment3-uuid"]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
| track_id | string | 视频轨道ID |
| video_ids | array | 添加的视频ID列表 |
| segment_ids | array | 片段ID列表 |
## 使用示例
### cURL 示例
#### 1. 基本视频添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000,\"duration\":10000000}]"
}'
```
#### 2. 多视频批量添加
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000,\"duration\":10000000},{\"video_url\":\"https://assets.jcaigc.cn/video2.mp4\",\"width\":1280,\"height\":720,\"start\":5000000,\"end\":10000000,\"duration\":8000000}]",
"alpha": 0.8
}'
```
#### 3. 带遮罩和转场的视频
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"width\":1024,\"height\":1024,\"start\":0,\"end\":5000000,\"duration\":10000000,\"mask\":\"圆形\",\"transition\":\"淡入淡出\",\"transition_duration\":500000,\"volume\":0.8}]",
"alpha": 1.0,
"scale_x": 1.2,
"scale_y": 1.2
}'
```
#### 4. 画中画效果
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/main.mp4\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":10000000,\"duration\":15000000},{\"video_url\":\"https://assets.jcaigc.cn/pip.mp4\",\"width\":640,\"height\":360,\"start\":2000000,\"end\":8000000,\"duration\":10000000}]",
"transform_x": 300,
"transform_y": -200,
"scale_x": 0.3,
"scale_y": 0.3
}'
```
#### 5. 视频变速(2倍速)
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"start\":0,\"end\":2000000}]",
"scene_timelines": [{"start":0, "end":1000000}]
}'
```
#### 6. 多个视频不同速度
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/add_videos \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"video_infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"start\":0,\"end\":3000000},{\"video_url\":\"https://assets.jcaigc.cn/video2.mp4\",\"start\":3000000,\"end\":6000000}]",
"scene_timelines": [{"start":0, "end":1500000},{"start":0, "end":4000000}]
}'
# video1: 3000000/1500000 = 2倍速
# video2: 3000000/4000000 = 0.75倍速(慢放)
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的草稿URL |
| 400 | video_infos是必填项 | 缺少视频信息参数 | 提供有效的视频信息JSON |
| 400 | video_infos格式错误 | JSON格式不正确 | 检查JSON字符串格式 |
| 400 | video_url是必填项 | 视频URL缺失 | 为每个视频提供URL |
| 400 | 视频尺寸无效 | width或height无效 | 提供正数的宽度和高度 |
| 400 | 时间范围无效 | end必须大于start | 确保结束时间大于开始时间 |
| 400 | 透明度值无效 | alpha不在0-1范围内 | 使用0-1之间的透明度值 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 404 | 视频资源不存在 | 视频URL无法访问 | 检查视频URL是否可访问 |
| 500 | 视频处理失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **JSON格式**: video_infos必须是合法的JSON字符串
2. **时间单位**: 所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **视频格式**: 确保视频文件格式被支持(如MP4、AVI等)
4. **文件大小**: 大视频文件可能影响处理速度
5. **网络访问**: 视频URL必须可以正常访问
6. **遮罩限制**: 只支持预定义的遮罩类型
7. **转场限制**: 转场时长有固定范围限制
8. **性能考虑**: 批量添加大量视频可能影响性能
9. **变速功能**: scene_timelines是对象数组,长度应与video_infos数组长度一致
## 工作流程
1. 验证必填参数(draft_url, video_infos)
2. 解析video_infos JSON字符串
3. 验证每个视频的参数配置
4. 获取并解密草稿内容
5. 创建视频轨道
6. 添加视频片段到轨道
7. 应用透明度、缩放和位置变换
8. 添加遮罩和转场效果
9. 设置音量
10. 保存并加密草稿
11. 返回处理结果
## 相关接口
- [创建草稿](./create_draft.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./add_videos.zh.md) | [English](./add_videos.md)
================================================
FILE: docs/audio_infos.md
================================================
# AUDIO_INFOS API Documentation
## 🌐 Language Switch
[中文版](./audio_infos.zh.md) | [English](./audio_infos.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/audio_infos
```
## Function Description
Generate audio information based on audio URLs and timelines. This interface converts audio file URLs and timeline configurations into the audio information format required by Jianying drafts, supporting volume control and audio effect settings.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"mp3_urls": ["https://assets.jcaigc.cn/audio1.mp3", "https://assets.jcaigc.cn/audio2.mp3"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 8000000}
],
"audio_effect": "reverb",
"volume": 0.8
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| mp3_urls | array[string] |✅ | - | Audio file URL array |
| timelines | array[object] |✅ | - | Timeline configuration array |
| audio_effect | string |❌ | None | Audio effect name |
| volume | number |❌ | 1.0 | Volume level (0.0-2.0) |
### Parameter Details
#### mp3_urls
- **Type**: array[string]
- **Description**: Array of audio file URL addresses
- **Example**: ["https://assets.jcaigc.cn/bgm.mp3", "https://assets.jcaigc.cn/sfx.mp3"]
#### timelines
- **Type**: array[object]
- **Description**: Timeline configuration array, each element contains start and end fields
- **Example**: [{"start": 0, "end": 5000000}, {"start": 5000000, "end": 10000000}]
#### audio_effect
- **Type**: string
- **Description**: Audio effect name
- **Default**: None
- **Example**: "reverb", "echo", "bass_boost"
#### volume
- **Type**: number
- **Description**: Audio volume level
- **Default**: 1.0
- **Range**: 0.0 - 2.0
- **Example**: 0.8 (80% volume)
## Response Format
### Success Response (200)
```json
{
"infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/audio1.mp3\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"volume\":0.8,\"audio_effect\":\"reverb\"},{\"audio_url\":\"https://assets.jcaigc.cn/audio2.mp3\",\"start\":3000000,\"end\":8000000,\"duration\":8000000,\"volume\":1.0,\"audio_effect\":null}]"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | string | Audio information JSON string |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Audio Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/audio_infos \
-H "Content-Type: application/json" \
-d '{
"mp3_urls": ["https://assets.jcaigc.cn/bgm.mp3"],
"timelines": [{"start": 0, "end": 10000000}],
"volume": 0.7
}'
```
#### 2. Audio Information with Effects
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/audio_infos \
-H "Content-Type: application/json" \
-d '{
"mp3_urls": ["https://assets.jcaigc.cn/intro.mp3", "https://assets.jcaigc.cn/content.mp3"],
"timelines": [{"start": 0, "end": 2000000}, {"start": 2000000, "end": 12000000}],
"audio_effect": "reverb",
"volume": 0.9
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | mp3_urls is required | Missing audio URL parameter | Provide valid audio URL array |
| 400 | timelines is required | Missing timeline parameter | Provide valid timeline array |
| 400 | Array length mismatch | mp3_urls and timelines array lengths don't match | Ensure both arrays have the same length |
| 400 | Invalid volume value | Volume not in range 0.0-2.0 | Use volume value between 0.0-2.0 |
| 404 | Audio resource not found | Audio URL inaccessible | Check if audio URL is accessible |
| 500 | Audio information generation failed | Internal processing error | Contact technical support |
## Notes
1. **Array Matching**: mp3_urls and timelines array lengths must be the same
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Volume Range**: volume value must be between 0.0-2.0
4. **Effect Support**: audio_effect needs to be a supported audio effect name
5. **JSON Format**: Returned infos is a JSON string that needs to be parsed before use
6. **Network Access**: Audio URLs must be accessible
## Workflow
1. Validate required parameters (mp3_urls, timelines)
2. Check array length matching
3. Validate timeline parameter validity
4. Validate volume parameter range
5. Generate corresponding audio information for each audio URL
6. Apply volume and audio effect settings
7. Convert information to JSON string format
8. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Audios](./add_audios.md)
- [Audio Timelines](./audio_timelines.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./audio_infos.zh.md) | [English](./audio_infos.md)
================================================
FILE: docs/audio_infos.zh.md
================================================
# AUDIO_INFOS API 接口文档
## 🌐 语言切换
[中文版](./audio_infos.zh.md) | [English](./audio_infos.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/audio_infos
```
## 功能描述
根据音频URL和时间线生成音频信息。该接口将音频文件URL和时间线配置转换为剪映草稿所需的音频信息格式,支持音量控制和音频效果设置。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"mp3_urls": ["https://assets.jcaigc.cn/audio1.mp3", "https://assets.jcaigc.cn/audio2.mp3"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 8000000}
],
"audio_effect": "reverb",
"volume": 0.8
}
```
### 参数说明
| 参数名 | 类型 |必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| mp3_urls | array[string] |✅ | - | 音频文件URL数组 |
| timelines | array[object] |✅ | - | 时间线配置数组 |
| audio_effect | string |❌ | None | 音频效果名称 |
| volume | number |❌ | 1.0 |音量大小(0.0-2.0) |
### 参数详解
#### mp3_urls
- **类型**: array[string]
- **说明**: 音频文件URL地址数组
- **示例**: ["https://assets.jcaigc.cn/bgm.mp3", "https://assets.jcaigc.cn/sfx.mp3"]
#### timelines
- **类型**: array[object]
- **说明**: 时间线配置数组,每个元素包含start和end字段
- **示例**: [{"start": 0, "end": 5000000}, {"start": 5000000, "end": 10000000}]
#### audio_effect
- **类型**: string
- **说明**: 音频效果名称
- **默认值**: None
- **示例**: "reverb", "echo", "bass_boost"
#### volume
- **类型**: number
- **说明**: 音频音量大小
- **默认值**: 1.0
- **范围**: 0.0 - 2.0
- **示例**: 0.8 (80%音量)
##响应格式
### 成功响应 (200)
```json
{
"infos": "[{\"audio_url\":\"https://assets.jcaigc.cn/audio1.mp3\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"volume\":0.8,\"audio_effect\":\"reverb\"},{\"audio_url\":\"https://assets.jcaigc.cn/audio2.mp3\",\"start\":3000000,\"end\":8000000,\"duration\":8000000,\"volume\":1.0,\"audio_effect\":null}]"
}
```
###响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | string |音信息JSON字符串 |
###错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1.基本音频信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/audio_infos \
-H "Content-Type: application/json" \
-d '{
"mp3_urls": ["https://assets.jcaigc.cn/bgm.mp3"],
"timelines": [{"start": 0, "end": 10000000}],
"volume": 0.7
}'
```
#### 2.效果的音频信息
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/audio_infos \
-H "Content-Type: application/json" \
-d '{
"mp3_urls": ["https://assets.jcaigc.cn/intro.mp3", "https://assets.jcaigc.cn/content.mp3"],
"timelines": [{"start": 0, "end": 2000000}, {"start": 2000000, "end": 12000000}],
"audio_effect": "reverb",
"volume": 0.9
}'
```
##错误码说明
|错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | mp3_urls是必填项 |缺少音频URL参数 | 提供有效的音频URL数组 |
| 400 | timelines是必填项 |缺少时间线参数 | 提供有效的时间线数组 |
| 400 | 数组长度不匹配 | mp3_urls和timelines长度不一致 |确保两个数组长度相同 |
| 400 | volume值无效 |音不在0.0-2.0范围内 | 使用0.0-2.0之间的音量值 |
| 404 |音频资源不存在 |音频URL无法访问 |检查音频URL是否可访问 |
| 500 |音频信息生成失败 |内部处理错误 |联技术支持 |
## 注意事项
1. **数组匹配**: mp3_urls和timelines数组长度必须相同
2. **时间单位**:所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **音量范围**: volume值必须在0.0-2.0范围内
4. **效果支持**: audio_effect需要是系统支持的音频效果名称
5. **JSON格式**: 返回的infos是JSON字符串,需要解析后使用
6. **网络访问**: 音频URL必须可以正常访问
##工作流程
1.验证必填参数(mp3_urls, timelines)
2.检查数组长度匹配
3.验证时间线参数有效性
4.验证音量参数范围
5. 为每个音频URL生成对应的音频信息
6.应用音量和音频效果设置
7.将信息转换为JSON字符串格式
8. 返回处理结果
##相关接口
- [创建草稿](./create_draft.md)
- [添加音频](./add_audios.md)
- [音频时间线](./audio_timelines.md)
- [保存草稿](./save_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./audio_infos.zh.md) | [English](./audio_infos.md)
================================================
FILE: docs/audio_timelines.md
================================================
# AUDIO_TIMELINES API Documentation
## 🌐 Language Switch
[中文版](./audio_timelines.zh.md) | [English](./audio_timelines.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/audio_timelines
```
## Function Description
Calculate timelines based on audio file durations. This interface analyzes the duration information of input audio files and automatically calculates and generates appropriate timeline configurations for precise time arrangement of audio materials in video editing.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"links": [
{
"url": "https://assets.jcaigc.cn/audio1.mp3",
"duration": 5000000
},
{
"url": "https://assets.jcaigc.cn/audio2.mp3",
"duration": 3000000
}
]
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| links | array[object] |✅ | - | Audio link information array |
### links Array Structure
Each links array element contains the following fields:
| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| url | string |✅ | - | Audio file URL address |
| duration | number |✅ | - | Audio duration (microseconds) |
### Parameter Details
#### url
- **Type**: string
- **Description**: Complete URL address of the audio file
- **Example**: "https://assets.jcaigc.cn/background.mp3"
#### duration
- **Type**: number
- **Description**: Duration of the audio file in microseconds (1 second = 1,000,000 microseconds)
- **Example**: 5000000 (5 seconds)
## Response Format
### Success Response (200)
```json
{
"timelines": [
{
"start": 0,
"end": 5000000
},
{
"start": 5000000,
"end": 8000000
}
],
"all_timelines": [
{
"start": 0,
"end": 8000000
}
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| timelines | array | Segmented audio timeline array |
| all_timelines | array | Complete audio timeline array |
| start | number | Start time of time segment (microseconds) |
| end | number | End time of time segment (microseconds) |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Audio Timeline Calculation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/audio_timelines \
-H "Content-Type: application/json" \
-d '{
"links": [
{
"url": "https://assets.jcaigc.cn/intro.mp3",
"duration": 3000000
},
{
"url": "https://assets.jcaigc.cn/bgm.mp3",
"duration": 15000000
}
]
}'
```
#### 2. Multiple Audio Timeline Calculation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/audio_timelines \
-H "Content-Type: application/json" \
-d '{
"links": [
{
"url": "https://assets.jcaigc.cn/opening.mp3",
"duration": 2000000
},
{
"url": "https://assets.jcaigc.cn/content.mp3",
"duration": 10000000
},
{
"url": "https://assets.jcaigc.cn/ending.mp3",
"duration": 3000000
}
]
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | links is required | Missing audio link parameter | Provide valid links array |
| 400 | links format error | Invalid JSON format | Check JSON array format |
| 400 | url is required | Missing audio URL | Provide URL for each audio |
| 400 | duration is required | Missing audio duration | Provide duration for each audio |
| 400 | duration must be greater than 0 | Invalid duration parameter | Use duration value greater than 0 |
| 404 | Audio resource not found | Audio URL inaccessible | Check if audio URL is accessible |
| 500 | Audio timeline calculation failed | Internal processing error | Contact technical support |
## Notes
1. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
2. **Parameter Requirements**: links array is required, and each element needs url and duration
3. **Duration Accuracy**: Ensure the provided duration parameter accurately reflects the actual audio duration
4. **Network Access**: Audio URLs must be accessible (for verification)
5. **Continuity**: Timelines are arranged continuously in audio order without gaps
6. **Total Duration**: The end value of complete timeline equals the sum of all audio durations
## Workflow
1. Validate required parameter (links)
2. Parse audio information from each element in links array
3. Validate url and duration parameters for each audio
4. Calculate time segments for each audio in order
5. Generate segmented audio timeline array
6. Generate complete audio timeline array
7. Return timeline configuration result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Timelines](./timelines.md)
- [Audio Infos](./audio_infos.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./audio_timelines.zh.md) | [English](./audio_timelines.md)
================================================
FILE: docs/audio_timelines.zh.md
================================================
# AUDIO_TIMELINES API 接口文档
## 🌐 语言切换
[中文版](./audio_timelines.zh.md) | [English](./audio_timelines.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/audio_timelines
```
## 功能描述
根据音频文件时长计算时间线。该接口通过分析输入音频文件的时长信息,自动计算并生成合适的时间线配置,用于视频编辑中音频素材的精确时间安排。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"links": [
{
"url": "https://assets.jcaigc.cn/audio1.mp3",
"duration": 5000000
},
{
"url": "https://assets.jcaigc.cn/audio2.mp3",
"duration": 3000000
}
]
}
```
### 参数说明
| 参数名 | 类型 |必 | | 默认值 | 说明 |
|--------|------|------|--------|------|
| links | array[object] |✅ | - |音链接信息数组 |
### links 数组结构
每个links数组元素包含以下字段:
| 字段名 | 类型 |必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| url | string |✅ | - |音频文件URL地址 |
| duration | number |✅ | - | 音频时长(微秒) |
### 参数详解
#### url
- **类型**: string
- **说明**: 音频文件的完整URL地址
- **示例**: "https://assets.jcaigc.cn/background.mp3"
#### duration
- **类型**: number
- **说明**: 音频文件的时长,单位为微秒(1秒 = 1,000,000微秒)
- **示例**: 5000000 (5秒)
##响应格式
### 成功响应 (200)
```json
{
"timelines": [
{
"start": 0,
"end": 5000000
},
{
"start": 5000000,
"end": 8000000
}
],
"all_timelines": [
{
"start": 0,
"end": 8000000
}
]
}
```
###响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| timelines | array | 分段音频时间线数组 |
| all_timelines | array |完整音频时间线数组 |
| start | number | 时间段开始时间(微秒) |
| end | number | 时间段结束时间(微秒) |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本音频时间线计算
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/audio_timelines \
-H "Content-Type: application/json" \
-d '{
"links": [
{
"url": "https://assets.jcaigc.cn/intro.mp3",
"duration": 3000000
},
{
"url": "https://assets.jcaigc.cn/bgm.mp3",
"duration": 15000000
}
]
}'
```
#### 2.多音频时间线计算
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/audio_timelines \
-H "Content-Type: application/json" \
-d '{
"links": [
{
"url": "https://assets.jcaigc.cn/opening.mp3",
"duration": 2000000
},
{
"url": "https://assets.jcaigc.cn/content.mp3",
"duration": 10000000
},
{
"url": "https://assets.jcaigc.cn/ending.mp3",
"duration": 3000000
}
]
}'
```
##错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | links是必填项 |缺少音频链接参数 | 提供有效的links数组 |
| 400 | links格式错误 | JSON格式不正确 |检查JSON数组格式 |
| 400 | url是必填项 | 音频URL缺失 | 为每个音频提供URL |
| 400 | duration是必填项 |音频时长缺失 | 为每个音频提供时长 |
| 400 | duration必须大于0 | 时长参数无效 | 使用大于0的时长值 |
| 404 | 音频资源不存在 |音频URL无法访问 |检查音频URL是否可访问 |
| 500 |音频时间线计算失败 |内部处理错误 |联技术支持 |
## 注意事项
1. **时间单位**:所有时间参数使用微秒(1秒 = 1,000,000微秒)
2. **参数要求**: links数组为必填参数,且每个元素都需要url和duration
3. **时长准确性**:确保提供的duration参数准确反映音频实际时长
4. **网络访问**: 音频URL必须可以正常访问(用于验证)
5. **连续性**: 时间线按音频顺序连续排列,无间隔
6. **总时长**:完整时间线的end值等于所有音频时长之和
##工作流程
1.验证必填参数(links)
2. 解析links数组中的每个音频信息
3.验证每个音频的url和duration参数
4.按顺序计算每个音频的时间段
5. 生成分段音频时间线数组
6. 生成完整音频时间线数组
7. 返回时间线配置结果
##相关接口
- [创建草稿](./create_draft.md)
- [创建时间线](./timelines.md)
- [音频信息](./audio_infos.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./audio_timelines.zh.md) | [English](./audio_timelines.md)
================================================
FILE: docs/caption_infos.md
================================================
# CAPTION_INFOS API Documentation
## 🌐 Language Switch
[中文版](./caption_infos.zh.md) | [English](./caption_infos.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/caption_infos
```
## Function Description
Generate caption information based on text and timelines. This interface converts text content and timeline configurations into the caption information format required by Jianying drafts, supporting keyword highlighting, animation effects, and transition settings.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"texts": ["Welcome to watch", "This is an example"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
],
"font_size": 24,
"keyword_color": "#FF0000",
"keyword_font_size": 28,
"keywords": ["example"],
"in_animation": "fade_in",
"in_animation_duration": 500000,
"loop_animation": "bounce",
"loop_animation_duration": 1000000,
"out_animation": "fade_out",
"out_animation_duration": 500000,
"transition": "cross_fade",
"transition_duration": 300000
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| texts | array[string] |✅ | - | Text content array |
| timelines | array[object] |✅ | - | Timeline configuration array |
| font_size | number |❌ | 24 | Font size |
| keyword_color | string |❌ | "#FF0000" | Keyword color |
| keyword_font_size | number |❌ | 28 | Keyword font size |
| keywords | array[string] |❌ | [] | Keyword array |
| in_animation | string |❌ | None | Entrance animation effect |
| in_animation_duration | number |❌ | 500000 | Entrance animation duration (microseconds) |
| loop_animation | string |❌ | None | Loop animation effect |
| loop_animation_duration | number |❌ | 1000000 | Loop animation duration (microseconds) |
| out_animation | string |❌ | None | Exit animation effect |
| out_animation_duration | number |❌ | 500000 | Exit animation duration (microseconds) |
| transition | string |❌ | None | Transition effect |
| transition_duration | number |❌ | 300000 | Transition duration (microseconds) |
## Response Format
### Success Response (200)
```json
{
"infos": "[{\"text\":\"Welcome to watch\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"font_size\":24,\"keyword_color\":\"#FF0000\",\"keyword_font_size\":28,\"keywords\":[\"watch\"],\"in_animation\":\"fade_in\",\"in_animation_duration\":500000,\"loop_animation\":\"bounce\",\"loop_animation_duration\":1000000,\"out_animation\":\"fade_out\",\"out_animation_duration\":500000,\"transition\":\"cross_fade\",\"transition_duration\":300000},{\"text\":\"This is an example\",\"start\":3000000,\"end\":6000000,\"duration\":5000000,\"font_size\":24,\"keyword_color\":\"#FF0000\",\"keyword_font_size\":28,\"keywords\":[\"example\"],\"in_animation\":\"fade_in\",\"in_animation_duration\":500000,\"loop_animation\":\"bounce\",\"loop_animation_duration\":1000000,\"out_animation\":\"fade_out\",\"out_animation_duration\":500000,\"transition\":\"cross_fade\",\"transition_duration\":300000}]"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | string | Caption information JSON string |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Caption Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/caption_infos \
-H "Content-Type: application/json" \
-d '{
"texts": ["Hello World"],
"timelines": [{"start": 0, "end": 3000000}],
"font_size": 28
}'
```
#### 2. Caption Information with Highlighting
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/caption_infos \
-H "Content-Type: application/json" \
-d '{
"texts": ["Welcome to watch our video", "This is a wonderful example"],
"timelines": [{"start": 0, "end": 3000000}, {"start": 3000000, "end": 6000000}],
"keyword_color": "#FF5500",
"keywords": ["wonderful", "video"],
"in_animation": "fade_in",
"loop_animation": "bounce"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | texts is required | Missing text content parameter | Provide valid text content array |
| 400 | timelines is required | Missing timeline parameter | Provide valid timeline array |
| 400 | Array length mismatch | texts and timelines array lengths don't match | Ensure both arrays have the same length |
| 400 | font_size must be greater than 0 | Invalid font size parameter | Use font size value greater than 0 |
| 500 | Caption information generation failed | Internal processing error | Contact technical support |
## Notes
1. **Array Matching**: texts and timelines array lengths must be the same
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Keyword Matching**: Keywords in keywords array will be highlighted in text
4. **Animation Effects**: Support entrance animation, loop animation, exit animation, and transition effects
5. **Color Format**: keyword_color uses hexadecimal color format (e.g., "#FF0000")
6. **Font Size**: Font size is in pixels
## Workflow
1. Validate required parameters (texts, timelines)
2. Check array length matching
3. Validate timeline parameter validity
4. Set font and color parameters
5. Apply animation effect parameters
6. Generate corresponding caption information for each text content
7. Convert information to JSON string format
8. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Captions](./add_captions.md)
- [Timelines](./timelines.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./caption_infos.zh.md) | [English](./caption_infos.md)
================================================
FILE: docs/caption_infos.zh.md
================================================
# CAPTION_INFOS API 接口文档
## 🌐 语言切换
[中文版](./caption_infos.zh.md) | [English](./caption_infos.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/caption_infos
```
## 功能描述
根据文本和时间线生成字幕信息。该接口将文本内容和时间线配置转换为剪映草稿所需的字幕信息格式,支持关键词高亮、动画效果和转场设置。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"texts": ["欢迎观看", "这是一个示例"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
],
"font_size": 24,
"keyword_color": "#FF0000",
"keyword_font_size": 28,
"keywords": ["示例"],
"in_animation": "fade_in",
"in_animation_duration": 500000,
"loop_animation": "bounce",
"loop_animation_duration": 1000000,
"out_animation": "fade_out",
"out_animation_duration": 500000,
"transition": "cross_fade",
"transition_duration": 300000
}
```
### 参数说明
| 参数名 | 类型 |必 | | 默认值 | 说明 |
|--------|------|------|--------|------|
| texts | array[string] |✅ | - | 文本内容数组 |
| timelines | array[object] |✅ | - | 时间线配置数组 |
| font_size | number |❌ | 24 | 字体大小 |
| keyword_color | string |❌ | "#FF0000" | 关键词颜色 |
| keyword_font_size | number | ❌ | 28 | 关键词字体大小 |
| keywords | array[string] | ❌ | [] | 关键词数组 |
| in_animation | string | ❌ | None |入动画效果 |
| in_animation_duration | number | ❌ | 500000 |入场动画时长(微秒) |
| loop_animation | string | ❌ | None |循动画效果 |
| loop_animation_duration | number | ❌ | 1000000 |循动画动画时长(微秒) |
| out_animation | string | ❌ | None |出场动画效果 |
| out_animation_duration | number | ❌ | 500000 |出场动画时长(微秒) |
| transition | string | ❌ | None |效果 |
| transition_duration | number | ❌ | 300000 |转时长(微秒) |
##响应格式
### 成功响应 (200)
```json
{
"infos": "[{\"text\":\"欢迎观看\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"font_size\":24,\"keyword_color\":\"#FF0000\",\"keyword_font_size\":28,\"keywords\":[\"观看\"],\"in_animation\":\"fade_in\",\"in_animation_duration\":500000,\"loop_animation\":\"bounce\",\"loop_animation_duration\":1000000,\"out_animation\":\"fade_out\",\"out_animation_duration\":500000,\"transition\":\"cross_fade\",\"transition_duration\":300000},{\"text\":\"这是一个示例\",\"start\":3000000,\"end\":6000000,\"duration\":5000000,\"font_size\":24,\"keyword_color\":\"#FF0000\",\"keyword_font_size\":28,\"keywords\":[\"示例\"],\"in_animation\":\"fade_in\",\"in_animation_duration\":500000,\"loop_animation\":\"bounce\",\"loop_animation_duration\":1000000,\"out_animation\":\"fade_out\",\"out_animation_duration\":500000,\"transition\":\"cross_fade\",\"transition_duration\":300000}]"
}
```
###响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | string | 字幕信息JSON字符串 |
###错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本字幕信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/caption_infos \
-H "Content-Type: application/json" \
-d '{
"texts": ["Hello World"],
"timelines": [{"start": 0, "end": 3000000}],
"font_size": 28
}'
```
#### 2.带高亮的字幕信息
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/caption_infos \
-H "Content-Type: application/json" \
-d '{
"texts": ["欢迎观看我们的视频", "这是一个精彩示例"],
"timelines": [{"start": 0, "end": 3000000}, {"start": 3000000, "end": 6000000}],
"keyword_color": "#FF5500",
"keywords": ["精彩", "视频"],
"in_animation": "fade_in",
"loop_animation": "bounce"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | texts是必填项 |缺少文本内容参数 | 提供有效的文本内容数组 |
| 400 | timelines是必填项 |缺少时间线参数 | 提供有效的时间线数组 |
| 400 | 数组长度不匹配 | texts和timelines长度不一致 |确保两个数组长度相同 |
| 400 | font_size必须大于0 | 字体大小参数无效 | 使用大于0的字体大小值 |
| 500 | 字幕信息生成失败 |内部处理错误 |联技术支持 |
## 注意事项
1. **数组匹配**: texts和timelines数组长度必须相同
2. **时间单位**:所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **关键词匹配**: keywords数组中的关键词将在文本中高亮显示
4. **动画效果**:支持入场动画、循环动画、出场动画和转场效果
5. **颜色格式**: keyword_color使用十六进制颜色格式(如"#FF0000")
6. **字体大小**: 字体大小以像素为单位
##工作流程
1.验证必填参数(texts, timelines)
2. 检查数组长度匹配
3.验证时间线参数有效性
4. 设置字体和颜色参数
5.应用动画效果参数
6. 为每个文本内容生成对应的字幕信息
7. 将信息转换为JSON字符串格式
8. 返回处理结果
##相关接口
- [创建草稿](./create_draft.md)
- [添加字幕](./add_captions.md)
- [时间线](./timelines.md)
- [保存草稿](./save_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./caption_infos.zh.md) | [English](./caption_infos.md)
================================================
FILE: docs/create_draft.md
================================================
# CREATE_DRAFT API Documentation
## 🌐 Language Switch
[中文版](./create_draft.zh.md) | [English](./create_draft.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/create_draft
```
## Function Description
Create a Jianying draft. This interface is used to create a new Jianying draft project, allowing customization of video width and height. After successful creation, it returns the draft URL and help document URL, providing the foundation for subsequent video editing operations.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"width": 1920,
"height": 1080
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| width | number | ❌ | 1920 | Video width (pixels), must be greater than or equal to 1 |
| height | number | ❌ | 1080 | Video height (pixels), must be greater than or equal to 1 |
### Parameter Details
#### Size Parameters
- **width**: Width of the draft video
- Minimum: 1 pixel
- Recommended common values: 1920, 1280, 720
- Supports custom sizes
- **height**: Height of the draft video
- Minimum: 1 pixel
- Recommended common values: 1080, 720, 480
- Supports custom sizes
#### Common Resolutions
| Resolution Name | Width | Height | Application Scenario |
|-----------------|-------|--------|---------------------|
| 1080P | 1920 | 1080 | HD video production |
| 720P | 1280 | 720 | SD video production |
| 4K | 3840 | 2160 | Ultra HD video production |
| Vertical Short Video | 1080 | 1920 | Mobile short videos |
| Square | 1080 | 1080 | Social media content |
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://cm.jcaigc.cn/openapi/v1/get_draft?draft_id=2025092811473036584258",
"tip_url": "https://help.assets.jcaigc.cn/draft-usage"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Newly created draft URL, used for subsequent editing operations |
| tip_url | string | Draft usage help documentation URL |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## 💻 Usage Examples
### cURL Examples
#### 1. Create Draft with Default Resolution
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/create_draft \
-H "Content-Type: application/json" \
-d '{}'
```
#### 2. Create Draft with Custom Resolution
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/create_draft \
-H "Content-Type: application/json" \
-d '{
"width": 1280,
"height": 720
}'
```
#### 3. Create Vertical Short Video Draft
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/create_draft \
-H "Content-Type: application/json" \
-d '{
"width": 1080,
"height": 1920
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | width must be greater than or equal to 1 | Invalid width parameter | Provide a width value greater than or equal to 1 |
| 400 | height must be greater than or equal to 1 | Invalid height parameter | Provide a height value greater than or equal to 1 |
| 400 | Parameter type error | Parameter type is incorrect | Ensure width and height are numeric types |
| 500 | Draft creation failed | Internal service error | Contact technical support |
| 503 | Service unavailable | System maintenance | Retry later |
## Notes
1. **Parameter Validation**: width and height must be positive integers
2. **Resolution Recommendation**: Suggest using common video resolutions to ensure compatibility
3. **Performance Consideration**: Ultra-high resolution may affect subsequent processing performance
4. **Storage Usage**: High-resolution drafts will occupy more storage space
5. **URL Validity**: The returned draft_url has a certain validity period
## Workflow
1. Receive and validate request parameters
2. Create draft basic structure
3. Set canvas size
4. Generate draft URL
5. Return draft information and help document link
## Related Interfaces
- [Add Videos](./add_videos.md)
- [Add Audios](./add_audios.md)
- [Add Images](./add_images.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
---
================================================
FILE: docs/create_draft.zh.md
================================================
# CREATE_DRAFT API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/create_draft
```
## 功能描述
创建剪映草稿。该接口用于创建一个新的剪映草稿项目,可以自定义视频的宽度和高度。创建成功后会返回草稿URL和帮助文档URL,为后续的视频编辑操作提供基础。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"width": 1920,
"height": 1080
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| width | number | ❌ | 1920 | 视频宽度(像素),必须大于等于1 |
| height | number | ❌ | 1080 | 视频高度(像素),必须大于等于1 |
### 参数详解
#### 尺寸参数
- **width**: 草稿视频的宽度
- 最小值:1像素
- 建议常用值:1920、1280、720
- 支持自定义尺寸
- **height**: 草稿视频的高度
- 最小值:1像素
- 建议常用值:1080、720、480
- 支持自定义尺寸
#### 常用分辨率
| 分辨率名称 | 宽度 | 高度 | 适用场景 |
|------------|------|------|----------|
| 1080P | 1920 | 1080 | 高清视频制作 |
| 720P | 1280 | 720 | 标清视频制作 |
| 4K | 3840 | 2160 | 超高清视频制作 |
| 竖屏短视频 | 1080 | 1920 | 手机短视频 |
| 正方形 | 1080 | 1080 | 社交媒体内容 |
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://cm.jcaigc.cn/openapi/v1/get_draft?draft_id=2025092811473036584258",
"tip_url": "https://help.assets.jcaigc.cn/draft-usage"
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 新创建的草稿URL,用于后续的编辑操作 |
| tip_url | string | 草稿使用帮助文档URL |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 💻 使用示例
### cURL 示例
#### 1. 创建默认分辨率草稿
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/create_draft \
-H "Content-Type: application/json" \
-d '{}'
```
#### 2. 创建自定义分辨率草稿
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/create_draft \
-H "Content-Type: application/json" \
-d '{
"width": 1280,
"height": 720
}'
```
#### 3. 创建竖屏短视频草稿
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/create_draft \
-H "Content-Type: application/json" \
-d '{
"width": 1080,
"height": 1920
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | width必须大于等于1 | 宽度参数无效 | 提供大于等于1的宽度值 |
| 400 | height必须大于等于1 | 高度参数无效 | 提供大于等于1的高度值 |
| 400 | 参数类型错误 | 参数类型不正确 | 确保width和height为数字类型 |
| 500 | 草稿创建失败 | 内部服务错误 | 联系技术支持 |
| 503 | 服务不可用 | 系统维护中 | 稍后重试 |
## 注意事项
1. **参数验证**: width和height必须为正整数
2. **分辨率建议**: 建议使用常见的视频分辨率以确保兼容性
3. **性能考虑**: 超高分辨率可能影响后续处理性能
4. **存储占用**: 高分辨率草稿会占用更多存储空间
5. **URL有效期**: 返回的draft_url具有一定的有效期
## 工作流程
1. 接收并验证请求参数
2. 创建草稿基础结构
3. 设置画布尺寸
4. 生成草稿URL
5. 返回草稿信息和帮助文档链接
## 相关接口
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./create_draft.zh.md) | [English](./create_draft.md)
================================================
FILE: docs/easy_create_material.md
================================================
# EASY_CREATE_MATERIAL API Documentation
## 🌐 Language Switch
[中文版](./easy_create_material.zh.md) | [English](./easy_create_material.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/easy_create_material
```
## Function Description
Add multiple types of material content to existing drafts, including audio, video, images, and text. This interface can add multiple media materials to drafts at once, automatically handling material duration, dimensions, and other properties, and intelligently managing different types of media tracks. It is one of the core interfaces for video creation.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"audio_url": "https://assets.jcaigc.cn/audio.mp3",
"text": "Hello World",
"img_url": "https://s.coze.cn/t/JTa5Ne6_liY/",
"video_url": "https://assets.jcaigc.cn/video.mp4",
"text_color": "#ff0000",
"font_size": 20,
"text_transform_y": 100
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string |✅ | - | Complete URL of the target draft |
| audio_url | string |✅ | - | Audio file URL, cannot be empty or null |
| text | string |❌ | null | Text content to add |
| img_url | string |❌ | null | Image file URL |
| video_url | string |❌ | null | Video file URL |
| text_color | string |❌ | "#ffffff" | Text color (hexadecimal format) |
| font_size | integer |❌ | 15 | Font size |
| text_transform_y | integer |❌ | 0 | Text Y-axis position offset |
### Parameter Details
#### Required Parameters
- **draft_url**: Complete URL of the target draft
- Format: Must be a valid Jianying draft URL
- Example: `"https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"`
- **audio_url**: Audio file URL
- Required parameter, cannot be empty or "null"
- Supported formats: MP3, WAV, AAC and other common audio formats
- Note: Audio is a required parameter, other material types are optional
#### Optional Parameters
- **text**: Text content to add
- Type: UTF-8 text
- Default: null (no text added)
- Note: If provided, text material will be added to the draft
- **img_url**: Image file URL
- Type: Valid image URL
- Default: null (no image added)
- Supported formats: JPEG, PNG, GIF and other common image formats
- Note: If provided, image material will be added to the draft
- **video_url**: Video file URL
- Type: Valid video URL
- Default: null (no video added)
- Supported formats: MP4, AVI, MOV and other common video formats
- Note: If provided, video material will be added to the draft
- **text_color**: Text color
- Type: Hexadecimal color code
- Default: `"#ffffff"` (white)
- Note: Set text color using standard hexadecimal format (e.g. #ffffff, #000000)
- **font_size**: Font size
- Type: Integer
- Default: 15
- Note: Set text font size, recommended range 10-50
- **text_transform_y**: Text Y-axis position offset
- Type: Integer
- Default: 0
- Note: Adjust vertical position of text in the frame, unit pixels
#### Material Processing Rules
- **Audio Processing**:
- Automatically parse audio duration
- Add to audio track
- Support multiple audio formats
- **Video Processing**:
- Fixed display duration 5 seconds
- Maintain original resolution ratio
- Add to video track
- **Image Processing**:
- Default display duration 3 seconds
- Automatically get image dimensions
- Add to image track
- **Text Processing**:
- Default display duration 5 seconds
- Support color and font size settings
- Adjustable vertical position
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Updated draft URL |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Add All Types of Materials
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/easy_create_material \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_url": "https://assets.jcaigc.cn/audio.mp3",
"text": "Hello World",
"img_url": "https://s.coze.cn/t/JTa5Ne6_liY/",
"video_url": "https://assets.jcaigc.cn/video.mp4",
"text_color": "#ff0000",
"font_size": 20,
"text_transform_y": 100
}'
```
#### 2. Add Only Audio and Text
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/easy_create_material \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_url": "https://assets.jcaigc.cn/background_music.mp3",
"text": "Welcome to watch",
"text_color": "#0066ff",
"font_size": 18
}'
```
#### 3. Minimal Request (Audio Only)
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/easy_create_material \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_url": "https://assets.jcaigc.cn/audio.wav"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft_url |
| 400 | audio_url is required | Missing audio URL parameter | Provide a valid audio_url |
| 400 | Invalid draft information, please check draft parameters | Draft parameter validation failed | Check if draft parameters meet requirements |
| 404 | Draft does not exist | Specified draft URL invalid | Check if draft URL is correct |
| 500 | Material creation failed | Internal processing error | Contact technical support |
## Notes
1. **Audio Required**: audio_url is a required parameter, cannot be empty or null
2. **Material URLs**: Material URLs must be publicly accessible, HTTPS protocol recommended
3. **Text Color**: text_color uses standard hexadecimal format (e.g. #ffffff, #000000)
4. **Font Size**: font_size recommended range 10-50
5. **Position Offset**: text_transform_y used to adjust vertical position of text in the frame
6. **Duration Settings**: Different material types have different default display durations
- Audio: Automatically get original duration
- Video: Fixed 5 seconds
- Image: Default 3 seconds
- Text: Default 5 seconds
7. **Track Management**: System automatically creates tracks for different types of materials
8. **Performance Consideration**: Avoid adding large numbers of materials simultaneously
## Workflow
1. Validate required parameters (draft_url, audio_url)
2. Get draft from cache
3. Create audio track and add audio material
4. If provided, create video track and add video material
5. If provided, create image track and add image material
6. If provided, create text track and add text material
7. Save draft
8. Return updated draft URL
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Audios](./add_audios.md)
- [Add Images](./add_images.md)
- [Save Draft](./save_draft.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/easy_create_material.zh.md
================================================
# EASY_CREATE_MATERIAL API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/easy_create_material
```
## 功能描述
在现有草稿中添加多种类型的素材内容,包括音频、视频、图片和文字。该接口可以一次性向草稿添加多种媒体素材,自动处理素材的时长、尺寸等属性,并智能管理不同类型的媒体轨道。是视频创作的核心接口之一。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"audio_url": "https://assets.jcaigc.cn/audio.mp3",
"text": "Hello World",
"img_url": "https://s.coze.cn/t/JTa5Ne6_liY/",
"video_url": "https://assets.jcaigc.cn/video.mp4",
"text_color": "#ff0000",
"font_size": 20,
"text_transform_y": 100
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
| audio_url | string | ✅ | - | 音频文件URL,不能为空或null |
| text | string | ❌ | null | 要添加的文字内容 |
| img_url | string | ❌ | null | 图片文件URL |
| video_url | string | ❌ | null | 视频文件URL |
| text_color | string | ❌ | "#ffffff" | 文字颜色(十六进制格式) |
| font_size | integer | ❌ | 15 | 字体大小 |
| text_transform_y | integer | ❌ | 0 | 文字Y轴位置偏移 |
### 参数详解
#### 必填参数
- **draft_url**: 目标草稿的完整URL
- 格式:必须是有效的剪映草稿URL
- 示例:`"https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"`
- **audio_url**: 音频文件URL
- 必填参数,不能为空或"null"
- 支持格式:MP3, WAV, AAC等常见音频格式
- 说明:音频是必填参数,其他素材类型都是可选的
#### 可选参数
- **text**: 要添加的文字内容
- 类型:UTF-8文本
- 默认值:null(不添加文字)
- 说明:如果提供,将添加文字素材到草稿中
- **img_url**: 图片文件URL
- 类型:有效的图片URL
- 默认值:null(不添加图片)
- 支持格式:JPEG, PNG, GIF等常见图片格式
- 说明:如果提供,将添加图片素材到草稿中
- **video_url**: 视频文件URL
- 类型:有效的视频URL
- 默认值:null(不添加视频)
- 支持格式:MP4, AVI, MOV等常见视频格式
- 说明:如果提供,将添加视频素材到草稿中
- **text_color**: 文字颜色
- 类型:十六进制颜色代码
- 默认值:`"#ffffff"`(白色)
- 说明:设置文字颜色,使用标准十六进制格式(如 #ffffff、#000000)
- **font_size**: 字体大小
- 类型:整数
- 默认值:15
- 说明:设置文字字体大小,建议范围10-50
- **text_transform_y**: 文字Y轴位置偏移
- 类型:整数
- 默认值:0
- 说明:调整文字在画面中的垂直位置,单位为像素
#### 素材处理规则
- **音频处理**:
- 自动解析音频时长
- 添加到音频轨道
- 支持多种音频格式
- **视频处理**:
- 固定显示时长5秒
- 保持原始分辨率比例
- 添加到视频轨道
- **图片处理**:
- 默认显示时长3秒
- 自动获取图片尺寸
- 添加到图片轨道
- **文字处理**:
- 默认显示时长5秒
- 支持颜色和字体大小设置
- 可调整垂直位置
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 更新后的草稿URL |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 添加所有类型素材
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/easy_create_material \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_url": "https://assets.jcaigc.cn/audio.mp3",
"text": "Hello World",
"img_url": "https://s.coze.cn/t/JTa5Ne6_liY/",
"video_url": "https://assets.jcaigc.cn/video.mp4",
"text_color": "#ff0000",
"font_size": 20,
"text_transform_y": 100
}'
```
#### 2. 仅添加音频和文字
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/easy_create_material \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_url": "https://assets.jcaigc.cn/background_music.mp3",
"text": "欢迎观看",
"text_color": "#0066ff",
"font_size": 18
}'
```
#### 3. 最简请求(仅音频)
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/easy_create_material \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL",
"audio_url": "https://assets.jcaigc.cn/audio.wav"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | audio_url是必填项 | 缺少音频URL参数 | 提供有效的audio_url |
| 400 | 无效的草稿信息,请检查草稿参数是否正确 | 草稿参数校验失败 | 检查草稿参数是否符合要求 |
| 404 | 草稿不存在 | 指定的草稿URL无效 | 检查草稿URL是否正确 |
| 500 | 素材创建失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **音频必填**: audio_url是必填参数,不能为空或null
2. **素材URL**: 素材URL必须可公开访问,建议使用HTTPS协议
3. **文字颜色**: text_color使用标准十六进制格式(如 #ffffff、#000000)
4. **字体大小**: font_size建议范围10-50
5. **位置偏移**: text_transform_y用于调整文字在画面中的垂直位置
6. **时长设置**: 不同素材类型有不同的默认显示时长
- 音频:自动获取原始时长
- 视频:固定5秒
- 图片:默认3秒
- 文字:默认5秒
7. **轨道管理**: 系统自动创建不同类型素材的轨道
8. **性能考虑**: 避免同时添加大量素材
## 工作流程
1. 验证必填参数(draft_url, audio_url)
2. 从缓存中获取草稿
3. 创建音频轨道并添加音频素材
4. 如果提供,创建视频轨道并添加视频素材
5. 如果提供,创建图片轨道并添加图片素材
6. 如果提供,创建文字轨道并添加文字素材
7. 保存草稿
8. 返回更新后的草稿URL
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [保存草稿](./save_draft.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/effect_infos.md
================================================
# EFFECT_INFOS API Documentation
## 🌐 Language Switch
[中文版](./effect_infos.zh.md) | [English](./effect_infos.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/effect_infos
```
## Function Description
Generate effect information based on effect names and timelines. This interface converts effect names and timeline configurations into the effect information format required by Jianying drafts.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"effects": ["blur", "vignette"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
]
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| effects | array[string] |✅ | - | Effect name array |
| timelines | array[object] |✅ | - | Timeline configuration array |
## Response Format
### Success Response (200)
```json
{
"infos": "[{\"effect\":\"blur\",\"start\":0,\"end\":3000000,\"duration\":5000000},{\"effect\":\"vignette\",\"start\":3000000,\"end\":6000000,\"duration\":5000000}]"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | string | Effect information JSON string |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Effect Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/effect_infos \
-H "Content-Type: application/json" \
-d '{
"effects": ["blur"],
"timelines": [{"start": 0, "end": 5000000}]
}'
```
#### 2. Multiple Effect Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/effect_infos \
-H "Content-Type: application/json" \
-d '{
"effects": ["blur", "vignette", "sepia"],
"timelines": [{"start": 0, "end": 2000000}, {"start": 2000000, "end": 4000000}, {"start": 4000000, "end": 6000000}]
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | effects is required | Missing effect name parameter | Provide valid effect name array |
| 400 | timelines is required | Missing timeline parameter | Provide valid timeline array |
| 400 | Array length mismatch | effects and timelines array lengths don't match | Ensure both arrays have the same length |
| 500 | Effect information generation failed | Internal processing error | Contact technical support |
## Notes
1. **Array Matching**: effects and timelines array lengths must be the same
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Effect Names**: Need to use system-supported effect names
4. **Continuity**: Effects are applied in timeline order
## Workflow
1. Validate required parameters (effects, timelines)
2. Check array length matching
3. Validate timeline parameter validity
4. Generate corresponding effect information for each effect name
5. Convert information to JSON string format
6. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Effects](./add_effects.md)
- [Timelines](./timelines.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./effect_infos.zh.md) | [English](./effect_infos.md)
================================================
FILE: docs/effect_infos.zh.md
================================================
# EFFECT_INFOS API 接口文档
## 🌐 语言切换
[中文版](./effect_infos.zh.md) | [English](./effect_infos.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/effect_infos
```
## 功能描述
根据特效名称和时间线生成特效信息。该接口将特效名称和时间线配置转换为剪映草稿所需的特效信息格式。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"effects": ["blur", "vignette"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
]
}
```
### 参数说明
| 参数名 | 类型 |必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| effects | array[string] |✅ | - |特名称数组 |
| timelines | array[object] |✅ | - | 时间线配置数组 |
##响应格式
### 成功响应 (200)
```json
{
"infos": "[{\"effect\":\"blur\",\"start\":0,\"end\":3000000,\"duration\":5000000},{\"effect\":\"vignette\",\"start\":3000000,\"end\":6000000,\"duration\":5000000}]"
}
```
###响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | string |特效信息JSON字符串 |
###错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本特效信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/effect_infos \
-H "Content-Type: application/json" \
-d '{
"effects": ["blur"],
"timelines": [{"start": 0, "end": 5000000}]
}'
```
#### 2.多特效信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/effect_infos \
-H "Content-Type: application/json" \
-d '{
"effects": ["blur", "vignette", "sepia"],
"timelines": [{"start": 0, "end": 2000000}, {"start": 2000000, "end": 4000000}, {"start": 4000000, "end": 6000000}]
}'
```
##错误码说明
|错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | effects是必填项 |缺少特效名称参数 | 提供有效的特效名称数组 |
| 400 | timelines是必填项 |缺少时间线参数 | 提供有效的时间线数组 |
| 400 | 数组长度不匹配 | effects和timelines长度不一致 |确保两个数组长度相同 |
| 500 |特效信息生成失败 |内部处理错误 |联技术支持 |
## 注意事项
1. **数组匹配**: effects和timelines数组长度必须相同
2. **时间单位**:所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **特效名称**:需要使用系统支持的特效名称
4. **连续性**:特效按时间线顺序应用
##工作流程
1.验证必填参数(effects, timelines)
2.检查数组长度匹配
3.验证时间线参数有效性
4. 为每个特效名称生成对应的特效信息
5.将信息转换为JSON字符串格式
6. 返回处理结果
##相关接口
- [创建草稿](./create_draft.md)
- [添加特效](./add_effects.md)
- [时间线](./timelines.md)
- [保存草稿](./save_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./effect_infos.zh.md) | [English](./effect_infos.md)
================================================
FILE: docs/filter_infos.md
================================================
# FILTER_INFOS API Documentation
## 🌐 Language Switch
[中文版](./filter_infos.zh.md) | [English](./filter_infos.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/filter_infos
```
## Function Description
Generate filter information based on filter names, timelines, and intensities. This interface converts filter names and timeline configurations into the filter information format required by Jianying drafts.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"filters": ["复古", "黑白"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
],
"intensities": [80, 100]
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| filters | array[string] |✅ | - | Filter name array |
| timelines | array[object] |✅ | - | Timeline configuration array |
| intensities | array[number] | ❌ | 100 | Filter intensity array (0-100), optional, defaults to 100 for all |
## Response Format
### Success Response (200)
```json
{
"infos": "[{\"filter_title\":\"复古\",\"start\":0,\"end\":3000000,\"intensity\":80},{\"filter_title\":\"黑白\",\"start\":3000000,\"end\":6000000,\"intensity\":100}]"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | string | Filter information JSON string |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Filter Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/filter_infos \
-H "Content-Type: application/json" \
-d '{
"filters": ["复古"],
"timelines": [{"start": 0, "end": 5000000}]
}'
```
#### 2. Filter Information with Custom Intensity
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/filter_infos \
-H "Content-Type: application/json" \
-d '{
"filters": ["黑白"],
"timelines": [{"start": 0, "end": 5000000}],
"intensities": [60]
}'
```
#### 3. Multiple Filter Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/filter_infos \
-H "Content-Type: application/json" \
-d '{
"filters": ["复古", "黑白", "电影感"],
"timelines": [{"start": 0, "end": 2000000}, {"start": 2000000, "end": 4000000}, {"start": 4000000, "end": 6000000}],
"intensities": [80, 100, 90]
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | filters is required | Missing filter name parameter | Provide valid filter name array |
| 400 | timelines is required | Missing timeline parameter | Provide valid timeline array |
| 400 | Array length mismatch | filters, timelines, and intensities array lengths don't match | Ensure all arrays have the same length |
| 400 | Intensity out of range | Intensity must be between 0-100 | Provide valid intensity values |
| 500 | Filter information generation failed | Internal processing error | Contact technical support |
## Notes
1. **Array Matching**: filters and timelines array lengths must be the same; intensities length should also match if provided
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Filter Names**: Need to use system-supported filter names
4. **Intensity Range**: Intensity values must be between 0-100, default is 100
5. **Continuity**: Filters are applied in timeline order
## Workflow
1. Validate required parameters (filters, timelines)
2. Check array length matching
3. Validate timeline parameter validity
4. Validate intensity range (if provided)
5. Generate corresponding filter information for each filter name
6. Convert information to JSON string format
7. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Filters](./add_filters.md)
- [Timelines](./timelines.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./filter_infos.zh.md) | [English](./filter_infos.md)
================================================
FILE: docs/filter_infos.zh.md
================================================
# FILTER_INFOS API 接口文档
## 🌐 语言切换
[中文版](./filter_infos.zh.md) | [English](./filter_infos.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/filter_infos
```
## 功能描述
根据滤镜名称、时间线和强度生成滤镜信息。该接口将滤镜名称和时间线配置转换为剪映草稿所需的滤镜信息格式。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"filters": ["复古", "黑白"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
],
"intensities": [80, 100]
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| filters | array[string] | ✅ | - | 滤镜名称数组 |
| timelines | array[object] | ✅ | - | 时间线配置数组 |
| intensities | array[number] | ❌ | 100 | 滤镜强度数组(0-100),可选,默认全部为100 |
## 响应格式
### 成功响应 (200)
```json
{
"infos": "[{\"filter_title\":\"复古\",\"start\":0,\"end\":3000000,\"intensity\":80},{\"filter_title\":\"黑白\",\"start\":3000000,\"end\":6000000,\"intensity\":100}]"
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | string | 滤镜信息JSON字符串 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本滤镜信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/filter_infos \
-H "Content-Type: application/json" \
-d '{
"filters": ["复古"],
"timelines": [{"start": 0, "end": 5000000}]
}'
```
#### 2. 自定义强度的滤镜信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/filter_infos \
-H "Content-Type: application/json" \
-d '{
"filters": ["黑白"],
"timelines": [{"start": 0, "end": 5000000}],
"intensities": [60]
}'
```
#### 3. 多滤镜信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/filter_infos \
-H "Content-Type: application/json" \
-d '{
"filters": ["复古", "黑白", "电影感"],
"timelines": [{"start": 0, "end": 2000000}, {"start": 2000000, "end": 4000000}, {"start": 4000000, "end": 6000000}],
"intensities": [80, 100, 90]
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | filters是必填项 | 缺少滤镜名称参数 | 提供有效的滤镜名称数组 |
| 400 | timelines是必填项 | 缺少时间线参数 | 提供有效的时间线数组 |
| 400 | 数组长度不匹配 | filters、timelines、intensities长度不一致 | 确保所有数组长度相同 |
| 400 | 强度范围无效 | intensity必须在0-100之间 | 提供有效的强度值 |
| 500 | 滤镜信息生成失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **数组匹配**: filters和timelines数组长度必须相同;如果提供intensities,长度也应相同
2. **时间单位**: 所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **滤镜名称**: 需要使用系统支持的滤镜名称
4. **强度范围**: 强度值必须在0-100之间,默认为100
5. **连续性**: 滤镜按时间线顺序应用
## 工作流程
1. 验证必填参数(filters, timelines)
2. 检查数组长度匹配
3. 验证时间线参数有效性
4. 验证强度范围(如果提供)
5. 为每个滤镜名称生成对应的滤镜信息
6. 将信息转换为JSON字符串格式
7. 返回处理结果
## 相关接口
- [创建草稿](./create_draft.md)
- [添加滤镜](./add_filters.md)
- [时间线](./timelines.md)
- [保存草稿](./save_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./filter_infos.zh.md) | [English](./filter_infos.md)
================================================
FILE: docs/gen_video.md
================================================
# GEN_VIDEO API Documentation
## 🌐 Language Switch
[中文版](./gen_video.zh.md) | [English](./gen_video.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/gen_video
```
## Function Description
Submit video generation task. This interface uses asynchronous processing mode, immediately returning task submission status, with video generation performed in the background. Supports task queuing to ensure system stability.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string | ✅ | - | Complete URL of the target draft |
### Parameter Details
#### Draft URL Parameter
- **draft_url**: Complete URL address of the draft
- Format: `https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id={draft_ID}`
- Example: `"https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"`
- Acquisition Method: Obtained via [Create Draft](./create_draft.md) or [Save Draft](./save_draft.md) interfaces
## Response Format
### Success Response (200)
```json
{
"message": "Video generation task submitted, please use draft_url to check progress"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| message | string | Response message |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Video Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/gen_video \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft_url |
| 400 | Invalid draft_url format | URL format is incorrect | Check if URL format is correct |
| 404 | Draft does not exist | Specified draft cannot be found | Confirm that draft URL is correct and exists |
| 400 | Draft content is empty | Draft contains no exportable content | Ensure draft contains video, audio or image materials |
| 400 | Material inaccessible | Material files in draft cannot be downloaded | Check if material URLs are valid |
| 500 | Video rendering failed | Error occurred during video processing | Check draft content or contact technical support |
| 500 | Audio processing failed | Error occurred during audio mixing | Check audio format or contact technical support |
| 500 | Encoding failed | Final video encoding failed | Contact technical support |
| 503 | Service busy | Rendering server overloaded | Retry later |
| 504 | Processing timeout | Video generation timed out | Simplify draft content or retry later |
| 500 | Video generation task submission failed | Internal processing error | Contact technical support |
## Notes
1. **Processing Time**: Video generation is time-consuming, may take minutes to tens of minutes
2. **File Size**: Draft complexity and number of materials affect processing time
3. **Network Stability**: Ensure material URLs are stably accessible
4. **Timeout Settings**: Suggest setting longer timeout or using polling mechanism
5. **Concurrency Limit**: Avoid generating large numbers of videos simultaneously
6. **Storage Space**: Generated video files may be large, pay attention to storage space
7. **URL Validity**: Generated video_url may have time-based restrictions
8. **System Requirements**: Video generation feature only available on Windows systems
## Workflow
1. Validate draft_url parameter
2. Parse draft configuration file
3. Download all required material files
4. Arrange and process materials according to timeline
5. Apply visual effects and transitions
6. Mix audio tracks
7. Render final video
8. Encode and upload video file
9. Return video URL
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Save Draft](./save_draft.md)
- [Add Videos](./add_videos.md)
- [Add Audios](./add_audios.md)
- [Add Images](./add_images.md)
- [Get Draft](./get_draft.md)
- [Query Video Generation Status](./gen_video_status.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./gen_video.zh.md) | [English](./gen_video.md)
================================================
FILE: docs/gen_video.zh.md
================================================
# GEN_VIDEO API 接口文档
## 🌐 语言切换
[中文版](./gen_video.zh.md) | [English](./gen_video.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/gen_video
```
## 功能描述
提交视频生成任务。该接口采用异步处理模式,立即返回任务提交状态,视频生成在后台进行。支持任务排队,确保系统稳定性。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 目标草稿的完整URL |
### 参数详解
#### 草稿URL参数
- **draft_url**: 草稿的完整URL地址
- 格式:`https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id={草稿ID}`
- 示例:`"https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"`
- 获取方式:通过[创建草稿](./create_draft.md)或[保存草稿](./save_draft.md)接口获取
## 响应格式
### 成功响应 (200)
```json
{
"message": "视频生成任务已提交,请使用draft_url查询进度"
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| message | string | 响应消息 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本视频生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/gen_video \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | draft_url格式无效 | URL格式不正确 | 检查URL格式是否正确 |
| 404 | 草稿不存在 | 指定的草稿无法找到 | 确认草稿URL是否正确且存在 |
| 400 | 草稿内容为空 | 草稿中没有可导出的内容 | 确保草稿包含视频、音频或图片素材 |
| 400 | 素材无法访问 | 草稿中的素材文件无法下载 | 检查素材URL是否有效 |
| 500 | 视频渲染失败 | 视频处理过程中出错 | 检查草稿内容或联系技术支持 |
| 500 | 音频处理失败 | 音频混合过程中出错 | 检查音频格式或联系技术支持 |
| 500 | 编码失败 | 最终视频编码失败 | 联系技术支持 |
| 503 | 服务繁忙 | 渲染服务器负载过高 | 稍后重试 |
| 504 | 处理超时 | 视频生成超时 | 简化草稿内容或稍后重试 |
| 500 | 视频生成任务提交失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **处理时间**: 视频生成是耗时操作,可能需要几分钟到几十分钟
2. **文件大小**: 草稿复杂度和素材数量会影响处理时间
3. **网络稳定**: 确保素材URL可以稳定访问
4. **超时设置**: 建议设置较长的超时时间或使用轮询机制
5. **并发限制**: 避免同时生成大量视频
6. **存储空间**: 生成的视频文件可能很大,注意存储空间
7. **URL有效期**: 生成的video_url可能有时效性限制
8. **系统要求**: 视频生成功能仅在Windows系统上可用
## 工作流程
1. 验证draft_url参数
2. 解析草稿配置文件
3. 下载所有必需的素材文件
4. 按时间轴排列和处理素材
5. 应用视觉效果和转场
6. 混合音频轨道
7. 渲染最终视频
8. 编码并上传视频文件
9. 返回视频URL
## 相关接口
- [创建草稿](./create_draft.md)
- [保存草稿](./save_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [获取草稿](./get_draft.md)
- [查询视频生成状态](./gen_video_status.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./gen_video.zh.md) | [English](./gen_video.md)
================================================
FILE: docs/gen_video_status.md
================================================
# GEN_VIDEO_STATUS API Documentation
## 🌐 Language Switch
[中文版](./gen_video_status.zh.md) | [English](./gen_video_status.md)
## Interface Information
```bash
POST /openapi/capcut-mate/v1/gen_video_status
```
## Function Description
Query the status and progress of video generation tasks. Used together with the [gen_video](./gen_video.md) interface to track the execution of video generation tasks in real-time, including task status, progress percentage, completion results, and other information.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string | ✅ | - | Draft URL, same as the URL used when submitting the task |
### Parameter Details
#### Draft URL Parameter
- **draft_url**: Complete URL of the draft, used to identify the video generation task to query status for
- Format: Must be a valid URL format
- Example: `"https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"`
- Acquisition Method: draft_url returned after submitting task via [gen_video](./gen_video.md) interface
## Response Format
### Success Response (200)
#### Task Waiting
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"status": "pending",
"progress": 0,
"video_url": "",
"error_message": "",
"created_at": "2024-09-24T10:30:00.000Z",
"started_at": null,
"completed_at": null
}
```
#### Task Processing
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"status": "processing",
"progress": 65,
"video_url": "",
"error_message": "",
"created_at": "2024-09-24T10:30:00.000Z",
"started_at": "2024-09-24T10:30:05.000Z",
"completed_at": null
}
```
#### Task Completed
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"status": "completed",
"progress": 100,
"video_url": "https://video-output.assets.jcaigc.cn/generated/video_abc123def456ghi789.mp4",
"error_message": "",
"created_at": "2024-09-24T10:30:00.000Z",
"started_at": "2024-09-24T10:30:05.000Z",
"completed_at": "2024-09-24T10:35:30.000Z"
}
```
#### Task Failed
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"status": "failed",
"progress": 0,
"video_url": "",
"error_message": "Export draft failed: Jianying export ended but target file was not generated, please check disk space or Jianying version",
"created_at": "2024-09-24T10:30:00.000Z",
"started_at": "2024-09-24T10:30:05.000Z",
"completed_at": "2024-09-24T10:32:15.000Z"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Draft URL |
| status | string | Task status: pending/processing/completed/failed |
| progress | integer | Task progress (0-100) |
| video_url | string | Generated video URL (only has value in completed status) |
| error_message | string | Error message (only has value in failed status) |
| created_at | string | Task creation time (ISO format) |
| started_at | string|null | Task start time (ISO format) |
| completed_at | string|null | Task completion time (ISO format) |
### Error Response (4xx/5xx)
#### 404 Not Found - Task Does Not Exist
```json
{
"detail": "Video generation task not found"
}
```
#### 500 Internal Server Error - Query Failed
```json
{
"detail": "Video task status query failed"
}
```
## Usage Examples
### cURL Examples
#### 1. Query Task Status
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/gen_video_status \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft_url |
| 400 | Invalid draft URL | draft_url format is incorrect | Check if draft URL format is correct |
| 404 | Video generation task not found | Specified draft URL has no corresponding video generation task | Confirm if task has been submitted via gen_video interface |
| 500 | Video task status query failed | Internal processing error | Retry later or contact technical support |
## Notes
1. **Polling Interval**: Suggest querying task status every 5-10 seconds
2. **Timeout Settings**: Suggest setting total timeout time (e.g. 10 minutes)
3. **Status Handling**: Provide different user feedback based on different statuses
4. **Error Handling**: Properly handle task failure situations
5. **Progress Display**: Utilize progress field to display progress bar
6. **Task Uniqueness**: Same draft URL can only have one ongoing task
## Workflow
1. Validate required parameters (draft_url)
2. Query task status from task manager
3. Convert internal status to API response format
4. Return task status information
## Related Interfaces
- [gen_video](./gen_video.md) - Submit video generation task
- [create_draft](./create_draft.md) - Create new draft file
- [save_draft](./save_draft.md) - Save draft file
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./gen_video_status.zh.md) | [English](./gen_video_status.md)
================================================
FILE: docs/gen_video_status.zh.md
================================================
# GEN_VIDEO_STATUS API 接口文档
## 🌐 语言切换
[中文版](./gen_video_status.zh.md) | [English](./gen_video_status.md)
## 接口信息
```bash
POST /openapi/capcut-mate/v1/gen_video_status
```
## 功能描述
查询视频生成任务的状态和进度。配合 [gen_video](./gen_video.md) 接口使用,用于实时跟踪视频生成任务的执行情况,包括任务状态、进度百分比、完成结果等信息。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 草稿URL,与提交任务时使用的URL相同 |
### 参数详解
#### 草稿URL参数
- **draft_url**: 草稿的完整URL,用于标识要查询状态的视频生成任务
- 格式:必须是有效的URL格式
- 示例:`"https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"`
- 获取方式:通过 [gen_video](./gen_video.md) 接口提交任务后返回的draft_url
## 响应格式
### 成功响应 (200)
#### 任务等待中
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"status": "pending",
"progress": 0,
"video_url": "",
"error_message": "",
"created_at": "2024-09-24T10:30:00.000Z",
"started_at": null,
"completed_at": null
}
```
#### 任务处理中
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"status": "processing",
"progress": 65,
"video_url": "",
"error_message": "",
"created_at": "2024-09-24T10:30:00.000Z",
"started_at": "2024-09-24T10:30:05.000Z",
"completed_at": null
}
```
#### 任务已完成
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"status": "completed",
"progress": 100,
"video_url": "https://video-output.assets.jcaigc.cn/generated/video_abc123def456ghi789.mp4",
"error_message": "",
"created_at": "2024-09-24T10:30:00.000Z",
"started_at": "2024-09-24T10:30:05.000Z",
"completed_at": "2024-09-24T10:35:30.000Z"
}
```
#### 任务失败
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
"status": "failed",
"progress": 0,
"video_url": "",
"error_message": "导出草稿失败: 剪映导出结束但目标文件未生成,请检查磁盘空间或剪映版本",
"created_at": "2024-09-24T10:30:00.000Z",
"started_at": "2024-09-24T10:30:05.000Z",
"completed_at": "2024-09-24T10:32:15.000Z"
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 草稿URL |
| status | string | 任务状态:pending/processing/completed/failed |
| progress | integer | 任务进度(0-100) |
| video_url | string | 生成的视频URL(仅在completed状态时有值) |
| error_message | string | 错误信息(仅在failed状态时有值) |
| created_at | string | 任务创建时间(ISO格式) |
| started_at | string|null | 任务开始时间(ISO格式) |
| completed_at | string|null | 任务完成时间(ISO格式) |
### 错误响应 (4xx/5xx)
#### 404 Not Found - 任务不存在
```json
{
"detail": "视频生成任务未找到"
}
```
#### 500 Internal Server Error - 查询失败
```json
{
"detail": "视频任务状态查询失败"
}
```
## 使用示例
### cURL 示例
#### 1. 查询任务状态
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/gen_video_status \
-H "Content-Type: application/json" \
-d '{
"draft_url": "YOUR_DRAFT_URL"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | 无效的草稿URL | draft_url格式不正确 | 检查草稿URL格式是否正确 |
| 404 | 视频生成任务未找到 | 指定的草稿URL没有对应的视频生成任务 | 确认是否已通过gen_video接口提交任务 |
| 500 | 视频任务状态查询失败 | 内部处理错误 | 稍后重试或联系技术支持 |
## 注意事项
1. **轮询间隔**: 建议每5-10秒查询一次任务状态
2. **超时设置**: 建议设置总超时时间(如10分钟)
3. **状态处理**: 根据不同状态提供不同的用户反馈
4. **错误处理**: 妥善处理任务失败情况
5. **进度显示**: 利用progress字段显示进度条
6. **任务唯一性**: 同一草稿URL只能有一个进行中的任务
## 工作流程
1. 验证必填参数(draft_url)
2. 从任务管理器中查询任务状态
3. 将内部状态转换为API响应格式
4. 返回任务状态信息
## 相关接口
- [gen_video](./gen_video.md) - 提交视频生成任务
- [create_draft](./create_draft.md) - 创建新的草稿文件
- [save_draft](./save_draft.md) - 保存草稿文件
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./gen_video_status.zh.md) | [English](./gen_video_status.md)
================================================
FILE: docs/get_audio_duration.md
================================================
# GET_AUDIO_DURATION API Documentation
## 🌐 Language Switch
[中文版](./get_audio_duration.zh.md) | [English](./get_audio_duration.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/get_audio_duration
```
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Function Description
Get the duration of audio files, supporting various common audio formats. Use FFprobe tool for precise audio analysis, returning the accurate duration of audio files in microseconds.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"mp3_url": "https://assets.jcaigc.cn/audio/sample.mp3"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| mp3_url | string |✅ | - | Audio file URL, supporting mp3, wav, m4a and other common audio formats |
### Parameter Details
#### Audio URL Parameter
- **mp3_url**: Complete URL address of the audio file
- Supported formats: mp3, wav, aac, flac, m4a and other common audio formats
- Need to ensure URL is accessible and file is complete
## Response Format
### Success Response (200)
```json
{
"duration": 2325333
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| duration | number | Audio duration, unit: microseconds |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Audio Duration Retrieval
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_audio_duration \
-H "Content-Type: application/json" \
-d '{
"mp3_url": "https://assets.jcaigc.cn/audio/sample.mp3"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | mp3_url is required | Missing audio URL parameter | Provide a valid mp3_url |
| 404 | Audio file cannot be accessed | Specified audio URL invalid | Check if audio URL is correct |
| 500 | Audio duration retrieval failed | Internal processing error | Contact technical support |
## Notes
1. **Time Unit**: Returned duration uses microseconds (1 second = 1,000,000 microseconds)
2. **Audio Formats**: Support mp3, wav, aac, flac, m4a and other common audio formats
3. **File Size**: Recommended to control within reasonable range, overly large files may cause timeout
4. **Network Access**: Ensure provided audio URL can be accessed normally
## Workflow
1. Validate required parameter (mp3_url)
2. Download audio file to temporary directory
3. Use ffprobe to analyze audio file and get duration
4. Clean up temporary files
5. Return audio duration information
## Related Interfaces
- [Add Audios](./add_audios.md)
- [Add Videos](./add_videos.md)
- [Create Draft](./create_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/get_audio_duration.zh.md
================================================
# GET_AUDIO_DURATION API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/get_audio_duration
```
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 功能描述
获取音频文件的时长,支持各种常见的音频格式。使用FFprobe工具进行精确的音频分析,返回音频文件的准确时长,单位为微秒。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"mp3_url": "https://assets.jcaigc.cn/audio/sample.mp3"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| mp3_url | string | ✅ | - | 音频文件URL,支持mp3、wav、m4a等常见音频格式 |
### 参数详解
#### 音频URL参数
- **mp3_url**: 音频文件的完整URL地址
- 支持格式:mp3、wav、aac、flac、m4a等常见音频格式
- 需要确保URL可访问且文件完整
## 响应格式
### 成功响应 (200)
```json
{
"duration": 2325333
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| duration | number | 音频时长,单位:微秒 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本获取音频时长
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_audio_duration \
-H "Content-Type: application/json" \
-d '{
"mp3_url": "https://assets.jcaigc.cn/audio/sample.mp3"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | mp3_url是必填项 | 缺少音频URL参数 | 提供有效的mp3_url |
| 404 | 音频文件无法访问 | 指定的音频URL无效 | 检查音频URL是否正确 |
| 500 | 音频时长获取失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **时间单位**: 返回的时长使用微秒(1秒 = 1,000,000微秒)
2. **音频格式**: 支持mp3、wav、aac、flac、m4a等常见音频格式
3. **文件大小**: 建议控制在合理范围内,过大的文件可能导致处理超时
4. **网络访问**: 确保提供的音频URL可以正常访问
## 工作流程
1. 验证必填参数(mp3_url)
2. 下载音频文件到临时目录
3. 使用ffprobe分析音频文件获取时长
4. 清理临时文件
5. 返回音频时长信息
## 相关接口
- [添加音频](./add_audios.md)
- [添加视频](./add_videos.md)
- [创建草稿](./create_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/get_draft.md
================================================
# GET_DRAFT API Documentation
## 🌐 Language Switch
[中文版](./get_draft.zh.md) | [English](./get_draft.md)
## Interface Information
```
GET /openapi/capcut-mate/v1/get_draft
```
## Function Description
Get draft file list. This interface is used to get all file lists corresponding to the specified draft ID, allowing you to view material files, configuration files, etc. in the draft. Usually used for draft content preview, file management or status checking.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
### Query Parameters
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_id | string | ✅ | - | Draft ID, length 20-32 characters |
### Parameter Details
#### draft_id
- **Type**: String
- **Required**: Yes
- **Length**: 20-32 characters
- **Format**: Usually UUID format or similar unique identifier
- **Example**: `2f52a63b-8c6a-4417-8b01-1b2a569ccb6c`
- **Acquisition Method**: Usually extracted from draft_url or returned by create_draft interface
## Response Format
### Success Response (200)
```json
{
"files": [
"2f52a63b-8c6a-4417-8b01-1b2a569ccb6c.json",
"video_123456789.mp4",
"audio_987654321.mp3",
"image_555666777.jpg",
"thumbnail_888999000.png"
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| files | array | List of files related to the draft |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Get Draft File List
```bash
curl -X GET "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2f52a63b-8c6a-4417-8b01-1b2a569ccb6c" \
-H "Content-Type: application/json"
```
#### 2. Using Complete draft_id
```bash
curl -X GET "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=7e8f9a0b-1c2d-3e4f-5g6h-7i8j9k0l1m2n" \
-H "Content-Type: application/json"
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_id is required | Missing draft_id parameter | Provide a valid draft_id |
| 400 | Invalid draft_id length | draft_id length not within 20-32 characters range | Check if draft_id format is correct |
| 400 | Invalid draft_id format | draft_id format is incorrect | Ensure using correct draft ID format |
| 404 | Draft does not exist | Specified draft ID cannot be found | Confirm that draft ID is correct and exists |
| 500 | Failed to get file list | Internal service error | Contact technical support or retry later |
| 503 | Service unavailable | System maintenance | Retry later |
## Notes
1. **Parameter Format**: Ensure draft_id format is correct and length is between 20-32 characters
2. **ID Extraction**: Correctly extract draft_id from draft_url
3. **File Types**: Returned file list contains multiple types of files
4. **Permission Verification**: Ensure permission to access specified draft
5. **Timeliness**: File list may not be updated in real-time, with some delay
6. **File Status**: Files in the list may be in different processing states
## Workflow
1. Validate draft_id parameter
2. Check draft_id format and length
3. Find specified draft
4. Get all files associated with the draft
5. Return file list
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Save Draft](./save_draft.md)
- [Add Videos](./add_videos.md)
- [Add Audios](./add_audios.md)
- [Add Images](./add_images.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./get_draft.zh.md) | [English](./get_draft.md)
================================================
FILE: docs/get_draft.zh.md
================================================
# GET_DRAFT API 接口文档
## 🌐 语言切换
[中文版](./get_draft.zh.md) | [English](./get_draft.md)
## 接口信息
```
GET /openapi/capcut-mate/v1/get_draft
```
## 功能描述
获取草稿文件列表。该接口用于获取指定草稿ID对应的所有文件列表,可以查看草稿中包含的素材文件、配置文件等信息。通常用于草稿内容的预览、文件管理或状态检查。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
### Query参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_id | string | ✅ | - | 草稿ID,长度为20-32位字符 |
### 参数详解
#### draft_id
- **类型**: 字符串
- **必填**: 是
- **长度**: 20-32位字符
- **格式**: 通常为UUID格式或类似的唯一标识符
- **示例**: `2f52a63b-8c6a-4417-8b01-1b2a569ccb6c`
- **获取方式**: 通常从draft_url中提取或由create_draft接口返回
## 响应格式
### 成功响应 (200)
```json
{
"files": [
"2f52a63b-8c6a-4417-8b01-1b2a569ccb6c.json",
"video_123456789.mp4",
"audio_987654321.mp3",
"image_555666777.jpg",
"thumbnail_888999000.png"
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| files | array | 草稿相关的文件列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本获取草稿文件列表
```bash
curl -X GET "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2f52a63b-8c6a-4417-8b01-1b2a569ccb6c" \
-H "Content-Type: application/json"
```
#### 2. 使用完整的draft_id
```bash
curl -X GET "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=7e8f9a0b-1c2d-3e4f-5g6h-7i8j9k0l1m2n" \
-H "Content-Type: application/json"
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_id是必填项 | 缺少draft_id参数 | 提供有效的draft_id |
| 400 | draft_id长度无效 | draft_id长度不在20-32位范围内 | 检查draft_id格式是否正确 |
| 400 | draft_id格式无效 | draft_id格式不正确 | 确保使用正确的草稿ID格式 |
| 404 | 草稿不存在 | 指定的草稿ID无法找到 | 确认草稿ID是否正确且存在 |
| 500 | 获取文件列表失败 | 内部服务错误 | 联系技术支持或稍后重试 |
| 503 | 服务不可用 | 系统维护中 | 稍后重试 |
## 注意事项
1. **参数格式**: 确保draft_id格式正确且长度在20-32位之间
2. **ID提取**: 从draft_url正确提取draft_id
3. **文件类型**: 返回的文件列表包含多种类型的文件
4. **权限验证**: 确保有权限访问指定的草稿
5. **实时性**: 文件列表可能不是实时更新的,存在一定延迟
6. **文件状态**: 列表中的文件可能处于不同的处理状态
## 工作流程
1. 验证draft_id参数
2. 检查draft_id格式和长度
3. 查找指定的草稿
4. 获取草稿关联的所有文件
5. 返回文件列表
## 相关接口
- [创建草稿](./create_draft.md)
- [保存草稿](./save_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./get_draft.zh.md) | [English](./get_draft.md)
================================================
FILE: docs/get_image_animations.md
================================================
# GET_IMAGE_ANIMATIONS API Documentation
## 🌐 Language Switch
[中文版](./get_image_animations.zh.md) | [English](./get_image_animations.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/get_image_animations
```
## Function Description
Get image entrance/exit animation list, returning all supported and qualified image entrance/exit animations. Support filtering based on animation type (entrance, exit, loop) and membership mode (all, VIP, free).
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"mode": 0,
"type": "in"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| mode | integer |❌ | 0 | Animation mode: 0=all, 1=VIP, 2=free |
| type | string |✅ | - | Animation type: in=entrance, out=exit, loop=loop |
### Parameter Details
#### Animation Mode Parameter
- **mode**: Animation filtering mode
- 0 = All animations (including VIP and free)
- 1 = VIP animations only
- 2 = Free animations only
- Default: 0
#### Animation Type Parameter
- **type**: Animation type (required)
- "in" = Entrance animation (effect when image appears)
- "out" = Exit animation (effect when image disappears)
- "loop" = Loop animation (continuous effect while image plays)
#### Animation Mode Description
| Mode Value | Mode Name | Description |
|------------|-----------|-------------|
| 0 | All | Return all animations (including VIP and free) |
| 1 | VIP | Return VIP animations only |
| 2 | Free | Return free animations only |
#### Animation Type Description
| Type Value | Type Name | Description |
|------------|-----------|-------------|
| in | Entrance Animation | Animation effect when image appears |
| out | Exit Animation | Animation effect when image disappears |
| loop | Loop Animation | Continuous loop animation effect while image plays |
## Response Format
### Success Response (200)
```json
{
"effects": [
{
"resource_id": "7314291622525538844",
"type": "in",
"category_id": "pic_ruchang",
"category_name": "图片入场",
"duration": 600000,
"id": "35395179",
"name": "渐显出现",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fade_in_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all"
}
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| effects | array | Image animation object array |
#### Single Animation Object Field Description
| Field | Type | Description |
|-------|------|-------------|
| resource_id | string | Animation resource ID |
| type | string | Animation type (in/out/loop) |
| category_id | string | Animation category ID |
| category_name | string | Animation category name |
| duration | integer | Animation duration (microseconds) |
| id | string | Animation unique identifier ID |
| name | string | Animation name |
| request_id | string | Request ID (usually empty) |
| start | integer | Animation start time |
| icon_url | string | Animation icon URL |
| material_type | string | Material type (usually "sticker") |
| panel | string | Panel information |
| path | string | Path information |
| platform | string | Supported platform (usually "all") |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Get All Entrance Animations
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_image_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 0,
"type": "in"
}'
```
#### 2. Get VIP Exit Animations
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_image_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 1,
"type": "out"
}'
```
#### 3. Get Free Loop Animations
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_image_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 2,
"type": "loop"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | type parameter must be in, out, or loop | Invalid animation type parameter | Use correct type values: "in", "out", or "loop" |
| 400 | mode parameter must be 0, 1, or 2 | Invalid animation mode parameter | Use correct mode values: 0, 1, or 2 |
| 500 | Failed to get image animations | Internal processing error | Contact technical support |
## Notes
1. **type parameter**: Required parameter, can only choose one from "in", "out", "loop"
2. **mode parameter**: Optional parameter, default is 0 (all animations)
3. **Response data**: Different from text animations, image animations have specialized categories and effects
4. **Animation duration**: Unit is microseconds (1 second = 1,000,000 microseconds)
5. **VIP identification**: Some animations may require VIP permissions to use
## Workflow
1. Validate required parameter (type)
2. Validate optional parameter (mode) validity
3. Filter image animation data based on type and mode
4. Return animation object array meeting conditions
5. Server automatically handles data formatting
## Related Interfaces
- [Add Images](./add_images.md)
- [Get Text Animations](./get_text_animations.md)
- [Add Effects](./add_effects.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/get_image_animations.zh.md
================================================
# GET_IMAGE_ANIMATIONS API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/get_image_animations
```
## 功能描述
获取图片出入场动画列表,返回所有支持的且满足条件的图片出入场动画。支持根据动画类型(入场、出场、循环)和会员模式(所有、VIP、免费)进行筛选。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"mode": 0,
"type": "in"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| mode | integer | ❌ | 0 | 动画模式:0=所有,1=VIP,2=免费 |
| type | string | ✅ | - | 动画类型:in=入场,out=出场,loop=循环 |
### 参数详解
#### 动画模式参数
- **mode**: 动画筛选模式
- 0 = 所有动画(包括VIP和免费)
- 1 = 仅VIP动画
- 2 = 仅免费动画
- 默认值:0
#### 动画类型参数
- **type**: 动画类型(必填)
- "in" = 入场动画(图片出现时的效果)
- "out" = 出场动画(图片消失时的效果)
- "loop" = 循环动画(图片持续播放的效果)
#### 动画模式说明
| 模式值 | 模式名称 | 描述 |
|--------|----------|------|
| 0 | 所有 | 返回所有动画(包括VIP和免费) |
| 1 | VIP | 仅返回VIP动画 |
| 2 | 免费 | 仅返回免费动画 |
#### 动画类型说明
| 类型值 | 类型名称 | 描述 |
|--------|----------|------|
| in | 入场动画 | 图片出现时的动画效果 |
| out | 出场动画 | 图片消失时的动画效果 |
| loop | 循环动画 | 图片持续播放的循环动画效果 |
## 响应格式
### 成功响应 (200)
```json
{
"effects": [
{
"resource_id": "7314291622525538844",
"type": "in",
"category_id": "pic_ruchang",
"category_name": "图片入场",
"duration": 600000,
"id": "35395179",
"name": "渐显出现",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fade_in_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all"
}
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| effects | array | 图片动画对象数组 |
#### 单个动画对象字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| resource_id | string | 动画资源ID |
| type | string | 动画类型(in/out/loop) |
| category_id | string | 动画分类ID |
| category_name | string | 动画分类名称 |
| duration | integer | 动画时长(微秒) |
| id | string | 动画唯一标识ID |
| name | string | 动画名称 |
| request_id | string | 请求ID(通常为空) |
| start | integer | 动画开始时间 |
| icon_url | string | 动画图标URL |
| material_type | string | 素材类型(通常为"sticker") |
| panel | string | 面板信息 |
| path | string | 路径信息 |
| platform | string | 支持平台(通常为"all") |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 获取所有入场动画
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_image_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 0,
"type": "in"
}'
```
#### 2. 获取VIP出场动画
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_image_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 1,
"type": "out"
}'
```
#### 3. 获取免费循环动画
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_image_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 2,
"type": "loop"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | type 参数必须为 in、out 或 loop | 动画类型参数无效 | 使用正确的type值:"in"、"out"或"loop" |
| 400 | mode 参数必须为 0、1 或 2 | 动画模式参数无效 | 使用正确的mode值:0、1或2 |
| 500 | 获取图片动画失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **type参数**:必填参数,只能选择 "in"、"out"、"loop" 中的一个
2. **mode参数**:可选参数,默认为0(所有动画)
3. **响应数据**:与文字动画不同,图片动画有专门的分类和效果
4. **动画时长**:单位为微秒(1秒 = 1,000,000微秒)
5. **VIP标识**:部分动画可能需要VIP权限才能使用
## 工作流程
1. 验证必填参数(type)
2. 验证可选参数(mode)的有效性
3. 根据type和mode筛选图片动画数据
4. 返回符合条件的动画对象数组
5. 服务端自动处理数据格式化
## 相关接口
- [添加图片](./add_images.md)
- [获取文字动画](./get_text_animations.md)
- [添加特效](./add_effects.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/get_text_animations.md
================================================
# GET_TEXT_ANIMATIONS API Documentation
## 🌐 Language Switch
[中文版](./get_text_animations.zh.md) | [English](./get_text_animations.md)
## Interface Information
```bash
POST /openapi/capcut-mate/v1/get_text_animations
```
## Function Description
Get text entrance/exit animation list, returning all supported and qualified text entrance/exit animations. Support filtering based on animation type (entrance, exit, loop) and membership mode (all, VIP, free).
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"mode": 0,
"type": "in"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| mode | integer |❌ | 0 | Animation mode: 0=all, 1=VIP, 2=free |
| type | string |✅ | - | Animation type: in=entrance, out=exit, loop=loop |
### Parameter Details
#### Animation Mode Parameter
- **mode**: Animation filtering mode
- 0 = Return all animations (including VIP and free)
- 1 = VIP animations only
- 2 = Free animations only
- Default: 0
#### Animation Type Parameter
- **type**: Animation type, required parameter
- "in" = Entrance animation (animation effect when text appears)
- "out" = Exit animation (animation effect when text disappears)
- "loop" = Loop animation (continuous loop animation effect while text plays)
#### Animation Mode Description
| Mode Value | Mode Name | Description |
|------------|-----------|-------------|
| 0 | All | Return all animations (including VIP and free) |
| 1 | VIP | VIP animations only |
| 2 | Free | Free animations only |
#### Animation Type Description
| Type Value | Type Name | Description |
|------------|-----------|-------------|
| in | Entrance Animation | Animation effect when text appears |
| out | Exit Animation | Animation effect when text disappears |
| loop | Loop Animation | Continuous loop animation effect while text plays |
## Response Format
### Success Response (200)
```json
{
"effects": [
{
"resource_id": "7314291622525538843",
"type": "in",
"category_id": "ruchang",
"category_name": "入场",
"duration": 500000,
"id": "35395178",
"name": "冰雪飘动",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/459c196951cadbd024456a63db89481f",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all"
},
{
"resource_id": "7397306443147252233",
"type": "in",
"category_id": "ruchang",
"category_name": "入场",
"duration": 500000,
"id": "77035159",
"name": "变色输入",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/c15f5c313f8170c558043abf300a0692",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all"
}
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| effects | array | Text entrance/exit animation object array |
#### Animation Object Structure
Each animation object contains the following fields:
| Field | Type | Description |
|-------|------|-------------|
| resource_id | string | Animation resource ID |
| type | string | Animation type (in/out/loop) |
| category_id | string | Animation category ID |
| category_name | string | Animation category name |
| duration | integer | Animation duration (microseconds) |
| id | string | Animation unique identifier ID |
| name | string | Animation name |
| request_id | string | Request ID (usually empty) |
| start | integer | Animation start time |
| icon_url | string | Animation icon URL |
| material_type | string | Material type (usually "sticker") |
| panel | string | Panel information |
| path | string | Path information |
| platform | string | Supported platform (usually "all") |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Get All Entrance Animations
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_text_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 0,
"type": "in"
}'
```
#### 2. Get VIP Exit Animations
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_text_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 1,
"type": "out"
}'
```
#### 3. Get Free Loop Animations
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_text_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 2,
"type": "loop"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | type is required | Missing animation type parameter | Provide a valid type parameter |
| 400 | Invalid mode parameter | mode parameter out of range | Use 0, 1, or 2 as mode value |
| 400 | Invalid type parameter | type parameter value incorrect | Use in, out, or loop as type value |
| 500 | Failed to get text animations | Internal processing error | Contact technical support |
## Notes
1. **Parameter Requirements**: type parameter is required, mode parameter is optional
2. **Animation Types**: type parameter can only be one of "in", "out", "loop"
3. **Animation Modes**: mode parameter can only be one of 0, 1, 2
4. **Response Format**: Different from old version, current version directly returns object array instead of JSON string
5. **Data Source**: Currently using mock data, in production environment should get from database or API
## Workflow
1. Validate required parameter (type)
2. Validate parameter validity (type and mode)
3. Filter animation data based on type and mode
4. Return animation list meeting conditions
## Related Interfaces
- [Add Captions](./add_captions.md)
- [Create Text Style](./add_text_style.md)
- [Get Image Animations](./get_image_animations.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/get_text_animations.zh.md
================================================
# GET_TEXT_ANIMATIONS API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```bash
POST /openapi/capcut-mate/v1/get_text_animations
```
## 功能描述
获取文字出入场动画列表,返回所有支持的且满足条件的文字出入场动画。支持根据动画类型(入场、出场、循环)和会员模式(所有、VIP、免费)进行筛选。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"mode": 0,
"type": "in"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| mode | integer | ❌ | 0 | 动画模式:0=所有,1=VIP,2=免费 |
| type | string | ✅ | - | 动画类型:in=入场,out=出场,loop=循环 |
### 参数详解
#### 动画模式参数
- **mode**: 动画筛选模式
- 0 = 返回所有动画(包括VIP和免费)
- 1 = 仅返回VIP动画
- 2 = 仅返回免费动画
- 默认值:0
#### 动画类型参数
- **type**: 动画类型,必填参数
- "in" = 入场动画(文字出现时的动画效果)
- "out" = 出场动画(文字消失时的动画效果)
- "loop" = 循环动画(文字持续播放的循环动画效果)
#### 动画模式说明
| 模式值 | 模式名称 | 描述 |
|--------|----------|------|
| 0 | 所有 | 返回所有动画(包括VIP和免费) |
| 1 | VIP | 仅返回VIP动画 |
| 2 | 免费 | 仅返回免费动画 |
#### 动画类型说明
| 类型值 | 类型名称 | 描述 |
|--------|----------|------|
| in | 入场动画 | 文字出现时的动画效果 |
| out | 出场动画 | 文字消失时的动画效果 |
| loop | 循环动画 | 文字持续播放的循环动画效果 |
## 响应格式
### 成功响应 (200)
```json
{
"effects": [
{
"resource_id": "7314291622525538843",
"type": "in",
"category_id": "ruchang",
"category_name": "入场",
"duration": 500000,
"id": "35395178",
"name": "冰雪飘动",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/459c196951cadbd024456a63db89481f",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all"
},
{
"resource_id": "7397306443147252233",
"type": "in",
"category_id": "ruchang",
"category_name": "入场",
"duration": 500000,
"id": "77035159",
"name": "变色输入",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/c15f5c313f8170c558043abf300a0692",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all"
}
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| effects | array | 文字出入场动画对象数组 |
#### 动画对象结构
每个动画对象包含以下字段:
| 字段名 | 类型 | 描述 |
|--------|------|------|
| resource_id | string | 动画资源ID |
| type | string | 动画类型(in/out/loop) |
| category_id | string | 动画分类ID |
| category_name | string | 动画分类名称 |
| duration | integer | 动画时长(微秒) |
| id | string | 动画唯一标识ID |
| name | string | 动画名称 |
| request_id | string | 请求ID(通常为空) |
| start | integer | 动画开始时间 |
| icon_url | string | 动画图标URL |
| material_type | string | 素材类型(通常为"sticker") |
| panel | string | 面板信息 |
| path | string | 路径信息 |
| platform | string | 支持平台(通常为"all") |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 获取所有入场动画
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_text_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 0,
"type": "in"
}'
```
#### 2. 获取VIP出场动画
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_text_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 1,
"type": "out"
}'
```
#### 3. 获取免费循环动画
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_text_animations \
-H "Content-Type: application/json" \
-d '{
"mode": 2,
"type": "loop"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | type是必填项 | 缺少动画类型参数 | 提供有效的type参数 |
| 400 | mode参数无效 | mode参数超出范围 | 使用0、1或2作为mode值 |
| 400 | type参数无效 | type参数值不正确 | 使用in、out或loop作为type值 |
| 500 | 获取文字动画失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **参数要求**: type参数为必填项,mode参数为可选项
2. **动画类型**: type参数只能是"in"、"out"、"loop"中的一个
3. **动画模式**: mode参数只能是0、1、2中的一个
4. **响应格式**: 与旧版本不同,当前版本直接返回对象数组而非JSON字符串
5. **数据来源**: 当前使用模拟数据,生产环境中应从数据库或API获取
## 工作流程
1. 验证必填参数(type)
2. 验证参数有效性(type和mode)
3. 根据type和mode筛选动画数据
4. 返回符合条件的动画列表
## 相关接口
- [添加字幕](./add_captions.md)
- [创建文本样式](./add_text_style.md)
- [获取图片动画](./get_image_animations.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/get_text_effects.md
================================================
# 获取花字效果列表 API 文档
## 📖 接口说明
获取所有支持的花字效果列表,支持按 VIP/免费进行筛选。
本接口参考 `get_filters` 的实现模式,提供 RESTful 风格的 POST 请求方式。
## 🔗 接口信息
- **路径**: `/get_text_effects`
- **方法**: POST
- **版本**: v1
## 📥 请求参数
### 请求体 (JSON)
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| mode | int | 否 | 0 | 花字效果模式:0=所有,1=VIP,2=免费 |
### 请求示例
#### 1. 获取所有花字效果
```bash
curl -X POST "http://localhost:8000/get_text_effects" \
-H "Content-Type: application/json" \
-d '{"mode": 0}'
```
#### 2. 获取 VIP 花字效果
```bash
curl -X POST "http://localhost:8000/get_text_effects" \
-H "Content-Type: application/json" \
-d '{"mode": 1}'
```
#### 3. 获取免费花字效果
```bash
curl -X POST "http://localhost:8000/get_text_effects" \
-H "Content-Type: application/json" \
-d '{"mode": 2}'
```
## 📤 响应参数
### 响应体 (JSON)
```json
{
"text_effects": [
{
"name": "红黄火焰综艺花字",
"is_vip": false,
"resource_id": "7539407429763796249",
"effect_id": "7539407429763796249"
},
{
"name": "综艺 - 黑暗斑驳红色",
"is_vip": false,
"resource_id": "7351316503771368713",
"effect_id": "7351316503771368713"
}
// ... 更多花字效果
]
}
```
### 字段说明
#### TextEffectItem 对象
| 字段名 | 类型 | 说明 |
|--------|------|------|
| name | string | 花字效果名称 |
| is_vip | boolean | 是否为 VIP 效果 |
| resource_id | string | 资源 ID |
| effect_id | string | 效果 ID |
## 📊 统计数据
根据当前数据源 (`config\data.ts`) 的统计:
- **总花字数**: 1,673 个
- **VIP 效果**: 0 个
- **免费效果**: 1,673 个
- **提取率**: 100%
## 💡 使用场景
### 1. 在客户端展示花字效果选择器
```javascript
// 获取所有花字效果
const response = await fetch('/get_text_effects', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ mode: 0 })
});
const data = await response.json();
// 渲染花字效果列表
data.text_effects.forEach(effect => {
console.log(`${effect.name} (ID: ${effect.effect_id})`);
});
```
### 2. 仅展示免费花字效果
```javascript
// 获取免费花字效果
const response = await fetch('/get_text_effects', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ mode: 2 })
});
const data = await response.json();
// data.text_effects 只包含免费花字
```
### 3. 配合 add_captions API 使用
```javascript
// 1. 先获取花字效果列表
const effectsResponse = await fetch('/get_text_effects', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ mode: 0 })
});
const effects = await effectsResponse.json();
// 2. 用户选择一个花字效果
const selectedEffect = effects.text_effects[0];
// 3. 在添加字幕时使用该花字
await fetch('/add_captions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
draft_id: "your_draft_id",
captions: [...],
text_effect: selectedEffect.name // 或 selectedEffect.effect_id
})
});
```
## 🔍 错误处理
### 错误码
| 错误码 | 说明 |
|--------|------|
| filter_get_failed | 获取花字效果列表失败 |
### 错误响应示例
```json
{
"code": "filter_get_failed",
"message": "获取花字效果列表失败",
"detail": null
}
```
## ⚙️ 参数模式说明
### mode = 0 (所有)
返回所有花字效果,包括 VIP 和免费效果。
**适用场景**:
- 完整的花字效果选择器
- 管理后台查看所有效果
### mode = 1 (VIP)
仅返回 VIP 花字效果。
**适用场景**:
- VIP 专属效果展示
- 付费效果推广
### mode = 2 (免费)
仅返回免费花字效果。
**适用场景**:
- 免费版客户端
- 免费效果筛选
## 📝 注意事项
1. **性能考虑**: 首次加载可能需要较长时间(1,673 个效果),建议使用缓存机制
2. **数据更新**: 花字效果数据来自 `config\data.ts`,如需更新请重新运行提取脚本
3. **重名处理**: 部分花字效果因名称重复,在映射表中添加了 `_effect_id` 后缀
4. **兼容性**: 即使没有 VIP 效果,接口也会正常返回空数组,不会报错
## 🛠️ 相关接口
- **添加字幕**: `/add_captions` - 可使用本接口返回的花字效果
- **获取滤镜列表**: `/get_filters` - 类似的滤镜效果列表接口
- **获取特效列表**: `/get_effects` - 视频特效列表接口
## 📦 技术实现
### Service 层
文件:`src/service/get_text_effects.py`
主要函数:
- `get_text_effects(mode: int)` - 主接口函数
- `resolve_text_effect(effect_identifier: str)` - 解析花字效果标识符
- `_get_text_effects_by_mode(mode: int)` - 根据模式获取效果
### Schema 层
文件:`src/schemas/get_text_effects.py`
Pydantic 模型:
- `GetTextEffectsRequest` - 请求参数
- `TextEffectItem` - 单个花字效果项
- `GetTextEffectsResponse` - 响应参数
### Router 层
文件:`src/router/v1.py`
路由定义:
```python
@router.post(path="/get_text_effects", response_model=GetTextEffectsResponse)
def get_text_effects(gter: GetTextEffectsRequest) -> GetTextEffectsResponse:
```
## 🧪 测试
运行测试脚本验证接口功能:
```bash
python tests\test_get_text_effects.py
```
测试覆盖:
- ✅ 获取所有花字效果 (mode=0)
- ✅ 获取 VIP 花字效果 (mode=1)
- ✅ 获取免费花字效果 (mode=2)
- ✅ 无效模式处理 (mode=3)
---
**最后更新**: 2026-03-31
**API 版本**: v1
**数据来源**: config\data.ts (1,673 个花字效果)
================================================
FILE: docs/get_url.md
================================================
# GET_URL API Documentation
## 🌐 Language Switch
[中文版](./get_url.zh.md) | [English](./get_url.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/get_url
```
## Function Description
Extract links. This interface is used to extract link information from input content, converting multiple values into single value return.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"output": "[魂牵梦萦https://sf.com;中国人https://jcaigc.cn],\"[]\""
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| output | string |✅ | - | Content to extract |
### Parameter Details
#### output
- **Type**: string
- **Description**: Content from which to extract links
- **Example**: `"[魂牵梦萦https://sf.com;中国人https://jcaigc.cn],\"[]\""`
## Response Format
### Success Response (200)
```json
{
"output": "[魂牵梦萦https://sf.com;中国人https://jcaigc.cn],\"[]\""
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| output | string | Extraction result |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Usage
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_url \
-H "Content-Type: application/json" \
-d '{
"output": "[魂牵梦萦https://sf.com;中国人https://jcaigc.cn],\"[]\""
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | output is required | Missing output parameter | Provide a valid output parameter |
| 500 | Link extraction failed | Internal processing error | Contact technical support |
## Notes
1. **Parameter Requirements**: output parameter is required
2. **Return Value**: Current version directly returns input content without additional processing
## Workflow
1. Validate required parameter (output)
2. Call service layer to handle business logic
3. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/get_url.zh.md
================================================
# GET_URL API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/get_url
```
## 功能描述
提取链接。该接口用于提取输入内容中的链接信息,用于多值返回变成单值返回。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"output": "[魂牵梦萦https://sf.com;中国人https://jcaigc.cn],\"[]\""
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| output | string | ✅ | - | 提取内容 |
### 参数详解
#### output
- **类型**: string
- **说明**: 需要提取链接的内容
- **示例**: `"[魂牵梦萦https://sf.com;中国人https://jcaigc.cn],\"[]\""`
## 响应格式
### 成功响应 (200)
```json
{
"output": "[魂牵梦萦https://sf.com;中国人https://jcaigc.cn],\"[]\""
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| output | string | 提取结果 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本使用
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_url \
-H "Content-Type: application/json" \
-d '{
"output": "[魂牵梦萦https://sf.com;中国人https://jcaigc.cn],\"[]\""
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | output是必填项 | 缺少output参数 | 提供有效的output参数 |
| 500 | 提取链接失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **参数要求**: output参数为必填项
2. **返回值**: 当前版本直接返回输入的内容,不做额外处理
## 工作流程
1. 验证必填参数(output)
2. 调用服务层处理业务逻辑
3. 返回处理结果
## 相关接口
- [创建草稿](./create_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/imgs_infos.md
================================================
# IMGS_INFOS API Documentation
## 🌐 Language Switch
[中文版](./imgs_infos.zh.md) | [English](./imgs_infos.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/imgs_infos
```
## Function Description
Generate image information based on image URLs and timelines. This interface converts image file URLs and timeline configurations into the image information format required by Jianying drafts, supporting animation effects and transition settings.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"imgs": ["https://assets.jcaigc.cn/img1.jpg", "https://assets.jcaigc.cn/img2.png"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
],
"height": 1080,
"width": 1920,
"in_animation": "fade_in",
"in_animation_duration": 500000,
"loop_animation": "bounce",
"loop_animation_duration": 1000000,
"out_animation": "fade_out",
"out_animation_duration": 500000,
"transition": "cross_fade",
"transition_duration": 300000
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| imgs | array[string] |✅ | - | Image file URL array |
| timelines | array[object] |✅ | - | Timeline configuration array |
| height | number |❌ | 1080 | Image height |
| width | number |❌ | 1920 | Image width |
| in_animation | string |❌ | None | Entrance animation effect |
| in_animation_duration | number |❌ | 500000 | Entrance animation duration (microseconds) |
| loop_animation | string |❌ | None | Loop animation effect |
| loop_animation_duration | number |❌ | 1000000 | Loop animation duration (microseconds) |
| out_animation | string |❌ | None | Exit animation effect |
| out_animation_duration | number |❌ | 500000 | Exit animation duration (microseconds) |
| transition | string |❌ | None | Transition effect |
| transition_duration | number |❌ | 300000 | Transition duration (microseconds) |
## Response Format
### Success Response (200)
```json
{
"infos": "[{\"img_url\":\"https://assets.jcaigc.cn/img1.jpg\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"height\":1080,\"width\":1920,\"in_animation\":\"fade_in\",\"in_animation_duration\":500000,\"loop_animation\":\"bounce\",\"loop_animation_duration\":1000000,\"out_animation\":\"fade_out\",\"out_animation_duration\":500000,\"transition\":\"cross_fade\",\"transition_duration\":300000},{\"img_url\":\"https://assets.jcaigc.cn/img2.png\",\"start\":3000000,\"end\":6000000,\"duration\":5000000,\"height\":1080,\"width\":1920,\"in_animation\":\"fade_in\",\"in_animation_duration\":500000,\"loop_animation\":\"bounce\",\"loop_animation_duration\":1000000,\"out_animation\":\"fade_out\",\"out_animation_duration\":500000,\"transition\":\"cross_fade\",\"transition_duration\":300000}]"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | string | Image information JSON string |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Image Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/imgs_infos \
-H "Content-Type: application/json" \
-d '{
"imgs": ["https://assets.jcaigc.cn/cover.jpg"],
"timelines": [{"start": 0, "end": 5000000}],
"height": 1080,
"width": 1920
}'
```
#### 2. Image Information with Animation Effects
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/imgs_infos \
-H "Content-Type: application/json" \
-d '{
"imgs": ["https://assets.jcaigc.cn/slide1.jpg", "https://assets.jcaigc.cn/slide2.jpg"],
"timelines": [{"start": 0, "end": 3000000}, {"start": 3000000, "end": 6000000}],
"in_animation": "fade_in",
"loop_animation": "bounce",
"out_animation": "fade_out",
"transition": "cross_fade"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | imgs is required | Missing image URL parameter | Provide valid image URL array |
| 400 | timelines is required | Missing timeline parameter | Provide valid timeline array |
| 400 | Array length mismatch | imgs and timelines array lengths don't match | Ensure both arrays have the same length |
| 404 | Image resource not found | Image URL inaccessible | Check if image URL is accessible |
| 500 | Image information generation failed | Internal processing error | Contact technical support |
## Notes
1. **Array Matching**: imgs and timelines array lengths must be the same
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Resolution Settings**: height and width parameters are used to set image display resolution
4. **Animation Effects**: Support entrance animation, loop animation, exit animation, and transition effects
5. **Network Access**: Image URLs must be accessible
6. **Format Support**: Support common image formats (JPG, PNG, GIF, etc.)
## Workflow
1. Validate required parameters (imgs, timelines)
2. Check array length matching
3. Validate timeline parameter validity
4. Set image resolution parameters
5. Apply animation effect parameters
6. Generate corresponding image information for each image URL
7. Convert information to JSON string format
8. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Images](./add_images.md)
- [Timelines](./timelines.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./imgs_infos.zh.md) | [English](./imgs_infos.md)
================================================
FILE: docs/imgs_infos.zh.md
================================================
# IMGS_INFOS API 接口文档
## 🌐 语言切换
[中文版](./imgs_infos.zh.md) | [English](./imgs_infos.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/imgs_infos
```
## 功能描述
根据图片URL和时间线生成图片信息。该接口将图片文件URL和时间线配置转换为剪映草稿所需的图片信息格式,支持动画效果和转场设置。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"imgs": ["https://assets.jcaigc.cn/img1.jpg", "https://assets.jcaigc.cn/img2.png"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
],
"height": 1080,
"width": 1920,
"in_animation": "fade_in",
"in_animation_duration": 500000,
"loop_animation": "bounce",
"loop_animation_duration": 1000000,
"out_animation": "fade_out",
"out_animation_duration": 500000,
"transition": "cross_fade",
"transition_duration": 300000
}
```
### 参数说明
| 参数名 | 类型 |必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| imgs | array[string] |✅ | - | 图片文件URL数组 |
| timelines | array[object] |✅ | - | 时间线配置数组 |
| height | number |❌ | 1080 |图片高度 |
| width | number |❌ | 1920 |图片宽度 |
| in_animation | string |❌ | None |入动画效果 |
| in_animation_duration | number |❌ | 500000 |入时长(微秒) |
| loop_animation | string |❌ | None |循动画效果 |
| loop_animation_duration | number |❌ | 1000000 |循动画时长(微秒) |
| out_animation | string |❌ | None |出动画效果 |
| out_animation_duration | number |❌ | 500000 |出动画时长(微秒) |
| transition | string |❌ | None |转场效果 |
| transition_duration | number |❌ | 300000 |转场时长(微秒) |
##响应格式
### 成功响应 (200)
```json
{
"infos": "[{\"img_url\":\"https://assets.jcaigc.cn/img1.jpg\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"height\":1080,\"width\":1920,\"in_animation\":\"fade_in\",\"in_animation_duration\":500000,\"loop_animation\":\"bounce\",\"loop_animation_duration\":1000000,\"out_animation\":\"fade_out\",\"out_animation_duration\":500000,\"transition\":\"cross_fade\",\"transition_duration\":300000},{\"img_url\":\"https://assets.jcaigc.cn/img2.png\",\"start\":3000000,\"end\":6000000,\"duration\":5000000,\"height\":1080,\"width\":1920,\"in_animation\":\"fade_in\",\"in_animation_duration\":500000,\"loop_animation\":\"bounce\",\"loop_animation_duration\":1000000,\"out_animation\":\"fade_out\",\"out_animation_duration\":500000,\"transition\":\"cross_fade\",\"transition_duration\":300000}]"
}
```
###响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | string | 图片信息JSON字符串 |
###错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1.基本图片信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/imgs_infos \
-H "Content-Type: application/json" \
-d '{
"imgs": ["https://assets.jcaigc.cn/cover.jpg"],
"timelines": [{"start": 0, "end": 5000000}],
"height": 1080,
"width": 1920
}'
```
#### 2.带动画效果的图片信息
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/imgs_infos \
-H "Content-Type: application/json" \
-d '{
"imgs": ["https://assets.jcaigc.cn/slide1.jpg", "https://assets.jcaigc.cn/slide2.jpg"],
"timelines": [{"start": 0, "end": 3000000}, {"start": 3000000, "end": 6000000}],
"in_animation": "fade_in",
"loop_animation": "bounce",
"out_animation": "fade_out",
"transition": "cross_fade"
}'
```
##错误码说明
|错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | imgs是必填项 |缺少图片URL参数 | 提供有效的图片URL数组 |
| 400 | timelines是必填项 |缺少时间线参数 | 提供有效的时间线数组 |
| 400 | 数组长度不匹配 | imgs和timelines长度不一致 |确保两个数组长度相同 |
| 404 | 图片资源不存在 |图片URL无法访问 |检查图片URL是否可访问 |
| 500 | 图片信息生成失败 |内部处理错误 |联技术支持 |
## 注意事项
1. **数组匹配**: imgs和timelines数组长度必须相同
2. **时间单位**:所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **分辨率设置**: height和width参数用于设置图片显示分辨率
4. **动画效果**:支持入动画、循环动画、出动画和转场效果
5. **网络访问**: 图片URL必须可以正常访问
6. **格式支持**:支持常见的图片格式(JPG、PNG、GIF等)
##工作流程
1.验证必填参数(imgs, timelines)
2.检查数组长度匹配
3.验证时间线参数有效性
4. 设置图片分辨率参数
5.应用动画效果参数
6.为每图片URL生成对应的图片信息
7.将信息转换为JSON字符串格式
8.返回处理结果
##相关接口
- [创建草稿](./create_draft.md)
- [添加图片](./add_images.md)
- [时间线](./timelines.md)
- [保存草稿](./save_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./imgs_infos.zh.md) | [English](./imgs_infos.md)
================================================
FILE: docs/keyframes_infos.md
================================================
# KEYFRAMES_INFOS API Documentation
## 🌐 Language Switch
[中文版](./keyframes_infos.zh.md) | [English](./keyframes_infos.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/keyframes_infos
```
## Function Description
Generate keyframe information based on keyframe type, position ratios, and values. This interface converts keyframe configurations into the keyframe information format required by Jianying drafts.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"ctype": "position",
"offsets": [0.0, 0.5, 1.0],
"values": [0.0, 0.5, 1.0],
"segment_infos": [
{"id": "segment1", "start": 0, "end": 5000000}
],
"height": 1080,
"width": 1920
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| ctype | string |✅ | - | Keyframe type |
| offsets | array[number] |✅ | - | Position ratio array |
| values | array[number] |✅ | - | Value array |
| segment_infos | array[object] |✅ | - | Segment information array |
| height | number |❌ | 1080 | Height |
| width | number |❌ | 1920 | Width |
## Response Format
### Success Response (200)
```json
{
"keyframes_infos": "[{\"ctype\":\"position\",\"offset\":0.0,\"value\":0.0,\"segment_id\":\"segment1\",\"height\":1080,\"width\":1920},{\"ctype\":\"position\",\"offset\":0.5,\"value\":0.5,\"segment_id\":\"segment1\",\"height\":1080,\"width\":1920},{\"ctype\":\"position\",\"offset\":1.0,\"value\":1.0,\"segment_id\":\"segment1\",\"height\":1080,\"width\":1920}]"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| keyframes_infos | string | Keyframe information JSON string |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Keyframe Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/keyframes_infos \
-H "Content-Type: application/json" \
-d '{
"ctype": "scale",
"offsets": [0.0, 1.0],
"values": [0.5, 1.5],
"segment_infos": [{"id": "segment1", "start": 0, "end": 5000000}]
}'
```
#### 2. Position Keyframe Information
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/keyframes_infos \
-H "Content-Type: application/json" \
-d '{
"ctype": "position",
"offsets": [0.0, 0.3, 0.7, 1.0],
"values": [0.0, 0.2, 0.8, 1.0],
"segment_infos": [{"id": "segment1", "start": 0, "end": 10000000}],
"height": 1080,
"width": 1920
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | ctype is required | Missing keyframe type parameter | Provide valid keyframe type |
| 400 | offsets is required | Missing position ratio parameter | Provide valid position ratio array |
| 400 | values is required | Missing value parameter | Provide valid value array |
| 400 | segment_infos is required | Missing segment information parameter | Provide valid segment information array |
| 400 | Array length mismatch | offsets and values array lengths don't match | Ensure both arrays have the same length |
| 500 | Keyframe information generation failed | Internal processing error | Contact technical support |
## Notes
1. **Array Matching**: offsets and values array lengths must be the same
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Keyframe Types**: Support position, scale, rotation, etc.
4. **Position Ratios**: offsets values should be in range 0.0-1.0
5. **Resolution Settings**: height and width parameters are used to set coordinate system
## Workflow
1. Validate required parameters (ctype, offsets, values, segment_infos)
2. Check array length matching
3. Validate parameter validity
4. Generate corresponding keyframe information for each offset
5. Apply resolution parameters
6. Convert information to JSON string format
7. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Keyframes](./add_keyframes.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./keyframes_infos.zh.md) | [English](./keyframes_infos.md)
================================================
FILE: docs/keyframes_infos.zh.md
================================================
# KEYFRAMES_INFOS API 接口文档
## 🌐 语言切换
[中文版](./keyframes_infos.zh.md) | [English](./keyframes_infos.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/keyframes_infos
```
## 功能描述
根据关键帧类型、位置比例和值生成关键帧信息。该接口将关键帧配置转换为剪映草稿所需的关键帧信息格式。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"ctype": "position",
"offsets": [0.0, 0.5, 1.0],
"values": [0.0, 0.5, 1.0],
"segment_infos": [
{"id": "segment1", "start": 0, "end": 5000000}
],
"height": 1080,
"width": 1920
}
```
### 参数说明
| 参数名 | 类型 |必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| ctype | string |✅ | - |关键帧类型 |
| offsets | array[number] |✅ | - | 位置比例数组 |
| values | array[number] |✅ | - |值数组 |
| segment_infos | array[object] |✅ | - |片信息数组 |
| height | number |❌ | 1080 |高度 |
| width | number |❌ | 1920 |宽 |
##响应格式
### 成功响应 (200)
```json
{
"keyframes_infos": "[{\"ctype\":\"position\",\"offset\":0.0,\"value\":0.0,\"segment_id\":\"segment1\",\"height\":1080,\"width\":1920},{\"ctype\":\"position\",\"offset\":0.5,\"value\":0.5,\"segment_id\":\"segment1\",\"height\":1080,\"width\":1920},{\"ctype\":\"position\",\"offset\":1.0,\"value\":1.0,\"segment_id\":\"segment1\",\"height\":1080,\"width\":1920}]"
}
```
###响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| keyframes_infos | string |关键帧信息JSON字符串 |
###错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1.基本关键帧信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/keyframes_infos \
-H "Content-Type: application/json" \
-d '{
"ctype": "scale",
"offsets": [0.0, 1.0],
"values": [0.5, 1.5],
"segment_infos": [{"id": "segment1", "start": 0, "end": 5000000}]
}'
```
#### 2.位置关键帧信息
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/keyframes_infos \
-H "Content-Type: application/json" \
-d '{
"ctype": "position",
"offsets": [0.0, 0.3, 0.7, 1.0],
"values": [0.0, 0.2, 0.8, 1.0],
"segment_infos": [{"id": "segment1", "start": 0, "end": 10000000}],
"height": 1080,
"width": 1920
}'
```
##错误码说明
|错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | ctype是必填项 |缺少关键帧类型参数 | 提供有效的关键帧类型 |
| 400 | offsets是必填项 |缺少位置比例参数 | 提供有效的位置比例数组 |
| 400 | values是必填项 |缺少值参数 | 提供有效的值数组 |
| 400 | segment_infos是必填项 |缺少片段信息参数 | 提供有效的片段信息数组 |
| 400 | 数组长度不匹配 | offsets和values长度不一致 |确保两个数组长度相同 |
| 500 |关键帧信息生成失败 |内部处理错误 |联技术支持 |
## 注意事项
1. **数组匹配**: offsets和values数组长度必须相同
2. **时间单位**:所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **关键帧类型**:支持position、scale、rotation等类型
4. **位置比例**: offsets值应在0.0-1.0范围内
5. **分辨率设置**: height和width参数用于设置坐标系
##工作流程
1.验证必填参数(ctype, offsets, values, segment_infos)
2. 检查数组长度匹配
3.验证参数有效性
4. 为每个offset生成对应的关键帧信息
5.应用分辨率参数
6.将信息转换为JSON字符串格式
7. 返回处理结果
##相关接口
- [创建草稿](./create_draft.md)
- [添加关键帧](./add_keyframes.md)
- [保存草稿](./save_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./keyframes_infos.zh.md) | [English](./keyframes_infos.md)
================================================
FILE: docs/objs_to_str_list.md
================================================
# OBJS_TO_STR_LIST API Documentation
## 🌐 Language Switch
[中文版](./objs_to_str_list.zh.md) | [English](./objs_to_str_list.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/objs_to_str_list
```
## Function Description
Convert object list to string list. This interface is used to convert input object list to string list format.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"outputs": [
{
"output": "https://assets.jcaigc.cn/min.mp4"
},
{
"output": "https://assets.jcaigc.cn/max.mp4"
}
]
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| outputs | array[object] |✅ | - | Data objects |
### Parameter Details
#### outputs
- **Type**: array[object]
- **Description**: Object list to convert
- **Example**: `[{"output": "https://assets.jcaigc.cn/min.mp4"}, {"output": "https://assets.jcaigc.cn/max.mp4"}]`
## Response Format
### Success Response (200)
```json
{
"infos": [
"https://assets.jcaigc.cn/min.mp4",
"https://assets.jcaigc.cn/max.mp4"
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | array[string] | String list |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Usage
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/objs_to_str_list \
-H "Content-Type: application/json" \
-d '{
"outputs": [
{
"output": "https://assets.jcaigc.cn/min.mp4"
},
{
"output": "https://assets.jcaigc.cn/max.mp4"
}
]
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | outputs is required | Missing outputs parameter | Provide a valid outputs parameter |
| 500 | Object list conversion failed | Internal processing error | Contact technical support |
## Notes
1. **Parameter Requirements**: outputs parameter is required
2. **Return Value**: Extract output fields from input object list to form string list
## Workflow
1. Validate required parameter (outputs)
2. Call service layer to handle business logic
3. Return converted string list
## Related Interfaces
- [Create Draft](./create_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/objs_to_str_list.zh.md
================================================
# OBJS_TO_STR_LIST API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/objs_to_str_list
```
## 功能描述
对象列表转化成字符串列表。该接口用于将输入的对象列表转换为字符串列表格式。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"outputs": [
{
"output": "https://assets.jcaigc.cn/min.mp4"
},
{
"output": "https://assets.jcaigc.cn/max.mp4"
}
]
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| outputs | array[object] | ✅ | - | 数据对象 |
### 参数详解
#### outputs
- **类型**: array[object]
- **说明**: 需要转换的对象列表
- **示例**: `[{"output": "https://assets.jcaigc.cn/min.mp4"}, {"output": "https://assets.jcaigc.cn/max.mp4"}]`
## 响应格式
### 成功响应 (200)
```json
{
"infos": [
"https://assets.jcaigc.cn/min.mp4",
"https://assets.jcaigc.cn/max.mp4"
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | array[string] | 字符串列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本使用
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/objs_to_str_list \
-H "Content-Type: application/json" \
-d '{
"outputs": [
{
"output": "https://assets.jcaigc.cn/min.mp4"
},
{
"output": "https://assets.jcaigc.cn/max.mp4"
}
]
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | outputs是必填项 | 缺少outputs参数 | 提供有效的outputs参数 |
| 500 | 对象列表转换失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **参数要求**: outputs参数为必填项
2. **返回值**: 将输入的对象列表中的output字段提取出来组成字符串列表
## 工作流程
1. 验证必填参数(outputs)
2. 调用服务层处理业务逻辑
3. 返回转换后的字符串列表
## 相关接口
- [创建草稿](./create_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/save_draft.md
================================================
# SAVE_DRAFT API Documentation
## 🌐 Language Switch
[中文版](./save_draft.zh.md) | [English](./save_draft.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/save_draft
```
## Function Description
Save Jianying draft. This interface is used to save the current draft state, ensuring that edited content is persistently stored. Usually called after completing a series of editing operations to prevent loss of edited content.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| draft_url | string | ✅ | - | Draft URL to be saved |
### Parameter Details
#### draft_url
- **Type**: String
- **Required**: Yes
- **Format**: Complete draft URL, usually returned by create_draft interface
- **Example**: `https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258`
## Response Format
### Success Response (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| draft_url | string | Saved draft URL, usually the same as the URL in the request |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Save Draft
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/save_draft \
-H "Content-Type: application/json" \
-d '{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | draft_url is required | Missing draft URL parameter | Provide a valid draft_url |
| 400 | Invalid draft_url format | URL format is incorrect | Check if URL format is correct |
| 404 | Draft does not exist | Specified draft cannot be found | Confirm that draft URL is correct and exists |
| 500 | Save failed | Internal service error | Contact technical support or retry later |
| 503 | Service unavailable | System maintenance | Retry later |
## Notes
1. **URL Validity**: Ensure the passed draft_url is valid and exists
2. **Network Stability**: Save operation requires stable network connection
3. **Frequency Control**: Avoid overly frequent save operations
4. **Concurrency Safety**: Concurrent saves of the same draft may cause conflicts
## Workflow
1. Validate draft_url parameter
2. Check if draft exists
3. Get current draft state
4. Persistently save draft data
5. Return save result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Add Audios](./add_audios.md)
- [Add Images](./add_images.md)
- [Generate Video](./gen_video.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./save_draft.zh.md) | [English](./save_draft.md)
================================================
FILE: docs/save_draft.zh.md
================================================
# SAVE_DRAFT API 接口文档
## 🌐 语言切换
[中文版](./save_draft.zh.md) | [English](./save_draft.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/save_draft
```
## 功能描述
保存剪映草稿。该接口用于保存当前的草稿状态,确保编辑的内容得到持久化存储。通常在完成一系列编辑操作后调用此接口,以防止编辑内容丢失。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| draft_url | string | ✅ | - | 要保存的草稿URL |
### 参数详解
#### draft_url
- **类型**: 字符串
- **必填**: 是
- **格式**: 完整的草稿URL,通常由create_draft接口返回
- **示例**: `https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258`
## 响应格式
### 成功响应 (200)
```json
{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| draft_url | string | 保存后的草稿URL,通常与请求中的URL相同 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本保存草稿
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/save_draft \
-H "Content-Type: application/json" \
-d '{
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
| 400 | draft_url格式无效 | URL格式不正确 | 检查URL格式是否正确 |
| 404 | 草稿不存在 | 指定的草稿无法找到 | 确认草稿URL是否正确且存在 |
| 500 | 保存失败 | 内部服务错误 | 联系技术支持或稍后重试 |
| 503 | 服务不可用 | 系统维护中 | 稍后重试 |
## 注意事项
1. **URL有效性**: 确保传入的draft_url是有效且存在的
2. **网络稳定性**: 保存操作需要稳定的网络连接
3. **频率控制**: 避免过于频繁的保存操作
4. **并发安全**: 同一草稿的并发保存可能导致冲突
## 工作流程
1. 验证draft_url参数
2. 检查草稿是否存在
3. 获取当前草稿状态
4. 持久化保存草稿数据
5. 返回保存结果
## 相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [添加音频](./add_audios.md)
- [添加图片](./add_images.md)
- [生成视频](./gen_video.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./save_draft.zh.md) | [English](./save_draft.md)
================================================
FILE: docs/search_sticker.md
================================================
# SEARCH_STICKER API Documentation
## 🌐 Language Switch
[中文版](./search_sticker.zh.md) | [English](./search_sticker.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/search_sticker
```
## Function Description
Search stickers by keywords. This interface is used to search for related sticker materials based on keywords provided by users, returning a list of matching stickers, including detailed information such as image URLs, dimensions, types, etc.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"keyword": "人"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| keyword | string |✅ | - | Search keyword |
### Parameter Details
#### keyword
- **Type**: string
- **Description**: Keyword to search for stickers
- **Example**: "人", "花", "动物"
## Response Format
### Success Response (200)
```json
{
"data": [
{
"sticker": {
"large_image": {
"image_url": "https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/29351205dbd943658d94c8feb17e5ed4~tplv-3jr8j4ixpe-resize:1920:1920.png?x-expires=1797257777&x-signature=r18I9uLQzgm%2FcvF8WNLbgw8BRwg%3D"
},
"preview_cover": "",
"sticker_package": {
"height_per_frame": 540,
"size": 305932,
"width_per_frame": 540
},
"sticker_type": 1,
"track_thumbnail": "https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/29351205dbd943658d94c8feb17e5ed4~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=NqeKYGyeqIjCzF0Ls07ctnP%2BehI%3D&format=.png"
},
"sticker_id": "7521200021564427545",
"title": "大笑"
}
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| data | array | Sticker data list |
| sticker | object | Detailed sticker information |
| large_image | object | Large image information |
| image_url | string | Image URL |
| preview_cover | string | Preview cover |
| sticker_package | object | Sticker package information |
| height_per_frame | number | Height per frame |
| size | number | Sticker package size |
| width_per_frame | number | Width per frame |
| sticker_type | number | Sticker type |
| track_thumbnail | string | Track thumbnail |
| sticker_id | string | Sticker ID |
| title | string | Sticker title |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Search Stickers with Keyword "人"
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/search_sticker \
-H "Content-Type: application/json" \
-d '{
"keyword": "人"
}'
```
#### 2. Search Stickers with Keyword "动物"
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/search_sticker \
-H "Content-Type: application/json" \
-d '{
"keyword": "动物"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | keyword is required | Missing keyword parameter | Provide a valid keyword parameter |
## Notes
1. **Keyword Matching**: Current implementation uses simple title matching, can be extended to full-text search in actual applications
2. **Data Source**: Currently returns mock data, in actual applications should connect to sticker database or call external APIs
3. **Performance Consideration**: For large sticker datasets, should consider pagination and caching mechanisms
## Workflow
1. Validate required parameter (keyword)
2. Call service layer to search for stickers
3. Return matching sticker list
## Related Interfaces
- [Add Sticker](./add_sticker.md)
- [Create Draft](./create_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/search_sticker.zh.md
================================================
# SEARCH_STICKER API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/search_sticker
```
## 功能描述
根据关键词搜索贴纸。该接口用于根据用户提供的关键词搜索相关的贴纸素材,返回匹配的贴纸列表,包括贴纸的详细信息如图片URL、尺寸、类型等。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"keyword": "人"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| keyword | string | ✅ | - | 搜索关键词 |
### 参数详解
#### keyword
- **类型**: string
- **说明**: 搜索贴纸的关键词
- **示例**: "人", "花", "动物"
## 响应格式
### 成功响应 (200)
```json
{
"data": [
{
"sticker": {
"large_image": {
"image_url": "https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/29351205dbd943658d94c8feb17e5ed4~tplv-3jr8j4ixpe-resize:1920:1920.png?x-expires=1797257777&x-signature=r18I9uLQzgm%2FcvF8WNLbgw8BRwg%3D"
},
"preview_cover": "",
"sticker_package": {
"height_per_frame": 540,
"size": 305932,
"width_per_frame": 540
},
"sticker_type": 1,
"track_thumbnail": "https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/29351205dbd943658d94c8feb17e5ed4~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=NqeKYGyeqIjCzF0Ls07ctnP%2BehI%3D&format=.png"
},
"sticker_id": "7521200021564427545",
"title": "大笑"
}
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| data | array | 贴纸数据列表 |
| sticker | object | 贴纸详细信息 |
| large_image | object | 大图信息 |
| image_url | string | 图片URL |
| preview_cover | string | 预览封面 |
| sticker_package | object | 贴纸包信息 |
| height_per_frame | number | 每帧高度 |
| size | number | 贴纸包大小 |
| width_per_frame | number | 每帧宽度 |
| sticker_type | number | 贴纸类型 |
| track_thumbnail | string | 轨道缩略图 |
| sticker_id | string | 贴纸ID |
| title | string | 贴纸标题 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 搜索关键词为"人"的贴纸
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/search_sticker \
-H "Content-Type: application/json" \
-d '{
"keyword": "人"
}'
```
#### 2. 搜索关键词为"动物"的贴纸
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/search_sticker \
-H "Content-Type: application/json" \
-d '{
"keyword": "动物"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | keyword是必填项 | 缺少关键词参数 | 提供有效的keyword参数 |
## 注意事项
1. **关键词匹配**: 当前实现为简单的标题匹配,实际应用中可以扩展为全文搜索
2. **数据来源**: 当前返回的是模拟数据,实际应用中应该连接贴纸数据库或调用外部API
3. **性能考虑**: 对于大量贴纸数据,应考虑分页和缓存机制
## 工作流程
1. 验证必填参数(keyword)
2. 调用服务层搜索贴纸
3. 返回匹配的贴纸列表
## 相关接口
- [添加贴纸](./add_sticker.md)
- [创建草稿](./create_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/str_list_to_objs.md
================================================
# STR_LIST_TO_OBJS API Documentation
## 🌐 Language Switch
[中文版](./str_list_to_objs.zh.md) | [English](./str_list_to_objs.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/str_list_to_objs
```
## Function Description
Convert string list to object list. This interface is used to convert input string list to object list format.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"infos": [
"https://assets.jcaigc.cn/min.mp4",
"https://assets.jcaigc.cn/max.mp4"
]
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| infos | array[string] |✅ | - | String list |
### Parameter Details
#### infos
- **Type**: array[string]
- **Description**: String list to convert
- **Example**: `["https://assets.jcaigc.cn/min.mp4", "https://assets.jcaigc.cn/max.mp4"]`
## Response Format
### Success Response (200)
```json
{
"infos": [
{
"output": "https://assets.jcaigc.cn/min.mp4"
},
{
"output": "https://assets.jcaigc.cn/max.mp4"
}
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | array[object] | Object list |
| output | string | URL address |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Usage
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/str_list_to_objs \
-H "Content-Type: application/json" \
-d '{
"infos": [
"https://assets.jcaigc.cn/min.mp4",
"https://assets.jcaigc.cn/max.mp4"
]
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | infos is required | Missing infos parameter | Provide a valid infos parameter |
| 500 | String list conversion failed | Internal processing error | Contact technical support |
## Notes
1. **Parameter Requirements**: infos parameter is required
2. **Return Value**: Convert input string list to object list containing output fields
## Workflow
1. Validate required parameter (infos)
2. Call service layer to handle business logic
3. Return converted object list
## Related Interfaces
- [Create Draft](./create_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/str_list_to_objs.zh.md
================================================
# STR_LIST_TO_OBJS API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/str_list_to_objs
```
## 功能描述
字符串列表转化成对象列表。该接口用于将输入的字符串列表转换为对象列表格式。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"infos": [
"https://assets.jcaigc.cn/min.mp4",
"https://assets.jcaigc.cn/max.mp4"
]
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| infos | array[string] | ✅ | - | 字符串列表 |
### 参数详解
#### infos
- **类型**: array[string]
- **说明**: 需要转换的字符串列表
- **示例**: `["https://assets.jcaigc.cn/min.mp4", "https://assets.jcaigc.cn/max.mp4"]`
## 响应格式
### 成功响应 (200)
```json
{
"infos": [
{
"output": "https://assets.jcaigc.cn/min.mp4"
},
{
"output": "https://assets.jcaigc.cn/max.mp4"
}
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | array[object] | 对象列表 |
| output | string | URL地址 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本使用
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/str_list_to_objs \
-H "Content-Type: application/json" \
-d '{
"infos": [
"https://assets.jcaigc.cn/min.mp4",
"https://assets.jcaigc.cn/max.mp4"
]
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | infos是必填项 | 缺少infos参数 | 提供有效的infos参数 |
| 500 | 字符串列表转换失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **参数要求**: infos参数为必填项
2. **返回值**: 将输入的字符串列表转换为包含output字段的对象列表
## 工作流程
1. 验证必填参数(infos)
2. 调用服务层处理业务逻辑
3. 返回转换后的对象列表
## 相关接口
- [创建草稿](./create_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/str_to_list.md
================================================
# STR_TO_LIST API Documentation
## 🌐 Language Switch
[中文版](./str_to_list.zh.md) | [English](./str_to_list.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/str_to_list
```
## Function Description
Convert string to list. This interface is used to convert input string to list format.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"obj": "{ \"infos\": [ \"https://assets.jcaigc.cn/min.mp4\", \"https://assets.jcaigc.cn/max.mp4\" ] }"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| obj | string |✅ | - | Object content |
### Parameter Details
#### obj
- **Type**: string
- **Description**: String content to convert
- **Example**: `"{ \"infos\": [ \"https://assets.jcaigc.cn/min.mp4\", \"https://assets.jcaigc.cn/max.mp4\" ] }"`
## Response Format
### Success Response (200)
```json
{
"infos": [
"{ \"infos\": [ \"https://assets.jcaigc.cn/min.mp4\", \"https://assets.jcaigc.cn/max.mp4\" ] }"
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | array[string] | String list |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Usage
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/str_to_list \
-H "Content-Type: application/json" \
-d '{
"obj": "{ \"infos\": [ \"https://assets.jcaigc.cn/min.mp4\", \"https://assets.jcaigc.cn/max.mp4\" ] }"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | obj is required | Missing obj parameter | Provide a valid obj parameter |
| 500 | String to list conversion failed | Internal processing error | Contact technical support |
## Notes
1. **Parameter Requirements**: obj parameter is required
2. **Return Value**: Put input string as single element in list and return
## Workflow
1. Validate required parameter (obj)
2. Call service layer to handle business logic
3. Return converted string list
## Related Interfaces
- [Create Draft](./create_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/str_to_list.zh.md
================================================
# STR_TO_LIST API 接口文档
## 🌐 语言切换
[中文版](./add_audios.zh.md) | [English](./add_audios.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/str_to_list
```
## 功能描述
字符转列表。该接口用于将输入的字符串转换为列表格式。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"obj": "{ \"infos\": [ \"https://assets.jcaigc.cn/min.mp4\", \"https://assets.jcaigc.cn/max.mp4\" ] }"
}
```
### 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| obj | string | ✅ | - | 对象内容 |
### 参数详解
#### obj
- **类型**: string
- **说明**: 需要转换的字符串内容
- **示例**: `"{ \"infos\": [ \"https://assets.jcaigc.cn/min.mp4\", \"https://assets.jcaigc.cn/max.mp4\" ] }"`
## 响应格式
### 成功响应 (200)
```json
{
"infos": [
"{ \"infos\": [ \"https://assets.jcaigc.cn/min.mp4\", \"https://assets.jcaigc.cn/max.mp4\" ] }"
]
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | array[string] | 字符串列表 |
### 错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本使用
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/str_to_list \
-H "Content-Type: application/json" \
-d '{
"obj": "{ \"infos\": [ \"https://assets.jcaigc.cn/min.mp4\", \"https://assets.jcaigc.cn/max.mp4\" ] }"
}'
```
## 错误码说明
| 错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | obj是必填项 | 缺少obj参数 | 提供有效的obj参数 |
| 500 | 字符转列表失败 | 内部处理错误 | 联系技术支持 |
## 注意事项
1. **参数要求**: obj参数为必填项
2. **返回值**: 将输入的字符串作为单个元素放入列表中返回
## 工作流程
1. 验证必填参数(obj)
2. 调用服务层处理业务逻辑
3. 返回转换后的字符串列表
## 相关接口
- [创建草稿](./create_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
================================================
FILE: docs/timelines.md
================================================
# TIMELINES API Documentation
## 🌐 Language Switch
[中文版](./timelines.zh.md) | [English](./timelines.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/timelines
```
## Function Description
Create timelines based on specified duration and quantity. This interface is used to generate timeline configurations needed for video editing, supporting multiple timeline types and start time settings, providing time reference for subsequent material addition and editing.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"duration": 10000000,
"num": 3,
"start": 0,
"type": "equal"
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| duration | number |✅ | - | Total duration (microseconds) |
| num | number |✅ | - | Number of time segments |
| start | number |❌ | 0 | Start time (microseconds) |
| type | string |❌ | "equal" | Timeline type |
### Parameter Details
#### duration
- **Type**: number
- **Description**: Total duration in microseconds (1 second = 1,000,000 microseconds)
- **Example**: 10000000 (10 seconds)
#### num
- **Type**: number
- **Description**: Number of time segments to create
- **Example**: 3 (Create 3 time segments)
#### start
- **Type**: number
- **Description**: Start time of the timeline in microseconds
- **Default**: 0
- **Example**: 2000000 (Start from 2 seconds)
#### type
- **Type**: string
- **Description**: Timeline segmentation type
- **Options**:
- "equal" - Equal division timeline
- "custom" - Custom timeline
- **Default**: "equal"
## Response Format
### Success Response (200)
```json
{
"timelines": [
{
"start": 0,
"end": 3333333
},
{
"start": 3333333,
"end": 6666666
},
{
"start": 6666666,
"end": 10000000
}
],
"all_timelines": [
{
"start": 0,
"end": 10000000
}
]
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| timelines | array | Array of segmented timelines |
| all_timelines | array | Array of complete timelines |
| start | number | Start time of time segment (microseconds) |
| end | number | End time of time segment (microseconds) |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Timeline Creation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/timelines \
-H "Content-Type: application/json" \
-d '{
"duration": 15000000,
"num": 5,
"start": 0,
"type": "equal"
}'
```
#### 2. Timeline with Start Time
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/timelines \
-H "Content-Type: application/json" \
-d '{
"duration": 20000000,
"num": 4,
"start": 5000000,
"type": "equal"
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | duration is required | Missing total duration parameter | Provide valid duration parameter |
| 400 | num is required | Missing time segment count parameter | Provide valid num parameter |
| 400 | duration must be greater than 0 | Invalid duration parameter | Use duration value greater than 0 |
| 400 | num must be greater than 0 | Invalid count parameter | Use count value greater than 0 |
| 400 | Invalid timeline type | Unsupported type parameter | Use supported timeline type |
| 500 | Timeline calculation failed | Internal processing error | Contact technical support |
## Notes
1. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
2. **Parameter Requirements**: duration and num are required parameters
3. **Time Range**: Ensure start + (duration/num) * num <= total duration
4. **Type Selection**: Choose appropriate timeline type based on actual needs
5. **Precision Consideration**: Microsecond-level time precision is suitable for precise video editing
## Workflow
1. Validate required parameters (duration, num)
2. Check parameter validity (positive numbers, reasonable range)
3. Calculate timeline segmentation method based on type
4. Generate segmented timeline array
5. Generate complete timeline array
6. Return timeline configuration result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Audio Timelines](./audio_timelines.md)
- [Video Infos](./video_infos.md)
- [Images Infos](./imgs_infos.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./timelines.zh.md) | [English](./timelines.md)
================================================
FILE: docs/timelines.zh.md
================================================
# TIMELINES API 接口文档
## 🌐 语言切换
[中文版](./timelines.zh.md) | [English](./timelines.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/timelines
```
## 功能描述
根据指定的时长和数量创建时间线。该接口用于生成视频编辑所需的时间线配置,支持多种时间线类型和起始时间设置,为后续的素材添加和编辑提供时间参考。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"duration": 10000000,
"num": 3,
"start": 0,
"type": "equal"
}
```
### 参数说明
| 参数名 | 类型 |必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| duration | number |✅ | - |总时长(微秒) |
| num | number |✅ | - | 时间段数量 |
| start | number |❌ | 0 |时间(微秒) |
| type | string |❌ | "equal" | 时间线类型 |
### 参数详解
#### duration
- **类型**: number
- **说明**:总时长,单位为微秒(1秒 = 1,000,000微秒)
- **示例**: 10000000 (10秒)
#### num
- **类型**: number
- **说明**:需要创建的时间段数量
- **示例**: 3 (创建3个时间段)
#### start
- **类型**: number
- **说明**: 时间线的起始时间,单位为微秒
- **默认值**: 0
- **示例**: 2000000 (从2秒开始)
#### type
- **类型**: string
- **说明**: 时间线分割类型
- **可选值**:
- "equal" -等分时间线
- "custom" - 自定义时间线
- **默认值**: "equal"
## 响应格式
### 成功响应 (200)
```json
{
"timelines": [
{
"start": 0,
"end": 3333333
},
{
"start": 3333333,
"end": 6666666
},
{
"start": 6666666,
"end": 10000000
}
],
"all_timelines": [
{
"start": 0,
"end": 10000000
}
]
}
```
###响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| timelines | array | 分段时间线数组 |
| all_timelines | array |完整时间线数组 |
| start | number | 时间段开始时间(微秒) |
| end | number | 时间段结束时间(微秒) |
###错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1.基本时间线创建
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/timelines \
-H "Content-Type: application/json" \
-d '{
"duration": 15000000,
"num": 5,
"start": 0,
"type": "equal"
}'
```
#### 2.带始时间的时间线
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/timelines \
-H "Content-Type: application/json" \
-d '{
"duration": 20000000,
"num": 4,
"start": 5000000,
"type": "equal"
}'
```
##错误码说明
| 错误码 |错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | duration是必填项 |缺少总时长参数 | 提供有效的duration参数 |
| 400 | num是必填项 |缺少时间段数量参数 | 提供有效的num参数 |
| 400 | duration必须大于0 | 时长参数无效 | 使用大于0的时长值 |
| 400 | num必须大于0 | 数量参数无效 | 使用大于0的数量值 |
| 400 | 时间线类型无效 | type参数不支持 | 使用支持的时间线类型 |
| 500 | 时间线计算失败 |内部处理错误 |联技术支持术支持 |
## 注意事项
1. **时间单位**:所有时间参数使用微秒(1秒 = 1,000,000微秒)
2. **参数要求**: duration和num为必填参数
3. **时间范围**:确保start + (duration/num) * num <=总时长
4. **类型选择**:根据实际需求选择合适的时间线类型
5. **精度考虑**:微秒级别的时间精度适合精确的视频编辑
##工作流程
1.验证必填参数(duration, num)
2.检查参数有效性(正数、合理范围)
3.根据type类型计算时间线分割方式
4. 生成分段时间线数组
5. 生成完整时间线数组
6. 返回时间线配置结果
##相关接口
- [创建草稿](./create_draft.md)
- [音频时间线](./audio_timelines.md)
- [视频信息](./video_infos.md)
- [图片信息](./imgs_infos.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./timelines.zh.md) | [English](./timelines.md)
================================================
FILE: docs/video_infos.md
================================================
# VIDEO_INFOS API Documentation
## 🌐 Language Switch
[中文版](./video_infos.zh.md) | [English](./video_infos.md)
## Interface Information
```
POST /openapi/capcut-mate/v1/video_infos
```
## Function Description
Generate video information based on video URLs and timelines. This interface converts video file URLs and timeline configurations into the video information format required by Jianying drafts, supporting mask and transition settings.
## More Documentation
📖 For more detailed documentation and tutorials, please visit: [https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## Request Parameters
```json
{
"video_urls": ["https://assets.jcaigc.cn/video1.mp4", "https://assets.jcaigc.cn/video2.mp4"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
],
"height": 1080,
"width": 1920,
"mask": "circle",
"transition": "cross_fade",
"transition_duration": 300000,
"volume": 1.0
}
```
### Parameter Description
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| video_urls | array[string] |✅ | - | Video file URL array |
| timelines | array[object] |✅ | - | Timeline configuration array |
| height | number |❌ | 1080 | Video height |
| width | number |❌ | 1920 | Video width |
| mask | string |❌ | None | Mask type |
| transition | string |❌ | None | Transition effect |
| transition_duration | number |❌ | 300000 | Transition duration (microseconds) |
| volume | number |❌ | 1.0 | Volume level (0.0-2.0) |
## Response Format
### Success Response (200)
```json
{
"infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"height\":1080,\"width\":1920,\"mask\":\"circle\",\"transition\":\"cross_fade\",\"transition_duration\":300000,\"volume\":1.0},{\"video_url\":\"https://assets.jcaigc.cn/video2.mp4\",\"start\":3000000,\"end\":6000000,\"duration\":5000000,\"height\":1080,\"width\":1920,\"mask\":\"circle\",\"transition\":\"cross_fade\",\"transition_duration\":300000,\"volume\":1.0}]"
}
```
### Response Field Description
| Field | Type | Description |
|-------|------|-------------|
| infos | string | Video information JSON string |
### Error Response (4xx/5xx)
```json
{
"detail": "Error message description"
}
```
## Usage Examples
### cURL Examples
#### 1. Basic Video Information Generation
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/video_infos \
-H "Content-Type: application/json" \
-d '{
"video_urls": ["https://assets.jcaigc.cn/intro.mp4"],
"timelines": [{"start": 0, "end": 5000000}],
"height": 1080,
"width": 1920
}'
```
#### 2. Video Information with Mask and Transition
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/video_infos \
-H "Content-Type: application/json" \
-d '{
"video_urls": ["https://assets.jcaigc.cn/clip1.mp4", "https://assets.jcaigc.cn/clip2.mp4"],
"timelines": [{"start": 0, "end": 3000000}, {"start": 3000000, "end": 6000000}],
"mask": "circle",
"transition": "cross_fade",
"volume": 0.8
}'
```
## Error Code Description
| Error Code | Error Message | Description | Solution |
|------------|---------------|-------------|----------|
| 400 | video_urls is required | Missing video URL parameter | Provide valid video URL array |
| 400 | timelines is required | Missing timeline parameter | Provide valid timeline array |
| 400 | Array length mismatch | video_urls and timelines array lengths don't match | Ensure both arrays have the same length |
| 400 | Invalid volume value | Volume not in range 0.0-2.0 | Use volume value between 0.0-2.0 |
| 404 | Video resource not found | Video URL inaccessible | Check if video URL is accessible |
| 500 | Video information generation failed | Internal processing error | Contact technical support |
## Notes
1. **Array Matching**: video_urls and timelines array lengths must be the same
2. **Time Unit**: All time parameters use microseconds (1 second = 1,000,000 microseconds)
3. **Resolution Settings**: height and width parameters are used to set video display resolution
4. **Mask Types**: Support circle, rectangle, etc. mask types
5. **Volume Range**: volume value must be between 0.0-2.0
6. **Network Access**: Video URLs must be accessible
## Workflow
1. Validate required parameters (video_urls, timelines)
2. Check array length matching
3. Validate timeline parameter validity
4. Set video resolution parameters
5. Apply mask and transition parameters
6. Generate corresponding video information for each video URL
7. Convert information to JSON string format
8. Return processing result
## Related Interfaces
- [Create Draft](./create_draft.md)
- [Add Videos](./add_videos.md)
- [Timelines](./timelines.md)
- [Save Draft](./save_draft.md)
---
📚 **Project Resources**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### Language Switch
[中文版](./video_infos.zh.md) | [English](./video_infos.md)
================================================
FILE: docs/video_infos.zh.md
================================================
# VIDEO_INFOS API 接口文档
## 🌐 语言切换
[中文版](./video_infos.zh.md) | [English](./video_infos.md)
## 接口信息
```
POST /openapi/capcut-mate/v1/video_infos
```
## 功能描述
根据视频URL和时间线生成视频信息。该接口将视频文件URL和时间线配置转换为剪映草稿所需的视频信息格式,支持遮罩和转场设置。
## 更多文档
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
## 请求参数
```json
{
"video_urls": ["https://assets.jcaigc.cn/video1.mp4", "https://assets.jcaigc.cn/video2.mp4"],
"timelines": [
{"start": 0, "end": 3000000},
{"start": 3000000, "end": 6000000}
],
"height": 1080,
"width": 1920,
"mask": "circle",
"transition": "cross_fade",
"transition_duration": 300000,
"volume": 1.0
}
```
### 参数说明
| 参数名 | 类型 |必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| video_urls | array[string] |✅ | - |视频文件URL数组 |
| timelines | array[object] |✅ | - | 时间线配置数组 |
| height | number |❌ | 1080 |视频高度 |
| width | number |❌ | 1920 |视频宽度 |
| mask | string |❌ | None |遮罩类型 |
| transition | string |❌ | None |转场效果 |
| transition_duration | number |❌ | 300000 |转场时长(微秒) |
| volume | number |❌ | 1.0 |音量大小(0.0-2.0) |
##响应格式
### 成功响应 (200)
```json
{
"infos": "[{\"video_url\":\"https://assets.jcaigc.cn/video1.mp4\",\"start\":0,\"end\":3000000,\"duration\":5000000,\"height\":1080,\"width\":1920,\"mask\":\"circle\",\"transition\":\"cross_fade\",\"transition_duration\":300000,\"volume\":1.0},{\"video_url\":\"https://assets.jcaigc.cn/video2.mp4\",\"start\":3000000,\"end\":6000000,\"duration\":5000000,\"height\":1080,\"width\":1920,\"mask\":\"circle\",\"transition\":\"cross_fade\",\"transition_duration\":300000,\"volume\":1.0}]"
}
```
###响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| infos | string |视频信息JSON字符串 |
###错误响应 (4xx/5xx)
```json
{
"detail": "错误信息描述"
}
```
## 使用示例
### cURL 示例
#### 1. 基本视频信息生成
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/video_infos \
-H "Content-Type: application/json" \
-d '{
"video_urls": ["https://assets.jcaigc.cn/intro.mp4"],
"timelines": [{"start": 0, "end": 5000000}],
"height": 1080,
"width": 1920
}'
```
#### 2.带遮罩和转场的视频信息
```bash
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/video_infos \
-H "Content-Type: application/json" \
-d '{
"video_urls": ["https://assets.jcaigc.cn/clip1.mp4", "https://assets.jcaigc.cn/clip2.mp4"],
"timelines": [{"start": 0, "end": 3000000}, {"start": 3000000, "end": 6000000}],
"mask": "circle",
"transition": "cross_fade",
"volume": 0.8
}'
```
##错误码说明
|错误码 | 错误信息 | 说明 | 解决方案 |
|--------|----------|------|----------|
| 400 | video_urls是必填项 |缺少视频URL参数 | 提供有效的视频URL数组 |
| 400 | timelines是必填项 |缺少时间线参数 | 提供有效的时间线数组 |
| 400 | 数组长度不匹配 | video_urls和timelines长度不一致 |确保两个数组长度相同 |
| 400 | volume值无效 |音量不在0.0-2.0范围内 | 使用0.0-2.0之间的音量值 |
| 404 |视频资源不存在 |视频URL无法访问 |检查视频URL是否可访问 |
| 500 |视频信息生成失败 |内部处理错误 |联技术支持 |
## 注意事项
1. **数组匹配**: video_urls和timelines数组长度必须相同
2. **时间单位**:所有时间参数使用微秒(1秒 = 1,000,000微秒)
3. **分辨率设置**: height和width参数用于设置视频显示分辨率
4. **遮罩类型**:支持circle、rectangle等遮罩类型
5. **音量范围**: volume值必须在0.0-2.0范围内
6. **网络访问**:视频URL必须可以正常访问
##工作流程
1.验证必填参数(video_urls, timelines)
2.检查数组长度匹配
3.验证时间线参数有效性
4. 设置视频分辨率参数
5.应用遮罩和转场参数
6. 为每个视频URL生成对应的视频信息
7.将信息转换为JSON字符串格式
8. 返回处理结果
##相关接口
- [创建草稿](./create_draft.md)
- [添加视频](./add_videos.md)
- [时间线](./timelines.md)
- [保存草稿](./save_draft.md)
---
📚 **项目资源**
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
### 语言切换
[中文版](./video_infos.zh.md) | [English](./video_infos.md)
================================================
FILE: exceptions.py
================================================
from enum import Enum
# 自定义错误码
class CustomError(Enum):
"""错误码枚举类(支持中英文)"""
# ===== 基础错误码 (1000-1999) =====
SUCCESS = (0, "成功", "Success")
PARAM_VALIDATION_FAILED = (1001, "参数校验失败", "Parameter validation failed")
RESOURCE_NOT_FOUND = (1002, "资源不存在", "Resource not found")
PERMISSION_DENIED = (1003, "权限不足", "Permission denied")
AUTHENTICATION_FAILED = (1004, "认证失败", "Authentication failed")
# ===== 业务错误码 (2000-2999) =====
INVALID_DRAFT_URL = (2001, "无效的草稿URL", "Invalid draft URL")
DRAFT_CREATE_FAILED = (2002, "草稿创建失败", "Draft creation failed")
INVALID_VIDEO_INFO = (2003, "无效的视频信息,请检查video_infos字段值是否正确", "Invalid video information, please check if the value of the video_infos field is correct.")
FILE_SIZE_LIMIT_EXCEEDED = (2004, "文件大小超出限制", "File size exceeds the limit")
DOWNLOAD_FILE_FAILED = (2005, "下载文件失败", "Download file failed")
VIDEO_ADD_FAILED = (2006, "视频添加失败", "Video addition failed")
INVALID_AUDIO_INFO = (2007, "无效的音频信息,请检查audio_infos字段值是否正确", "Invalid audio information, please check if the value of the audio_infos field is correct.")
AUDIO_ADD_FAILED = (2008, "音频添加失败", "Audio addition failed")
INVALID_IMAGE_INFO = (2009, "无效的图片信息,请检查image_infos字段值是否正确", "Invalid image information, please check if the value of the image_infos field is correct.")
IMAGE_ADD_FAILED = (2010, "图片添加失败", "Image addition failed")
INVALID_STICKER_INFO = (2011, "无效的贴纸信息,请检查贴纸参数是否正确", "Invalid sticker information, please check if sticker parameters are correct.")
STICKER_ADD_FAILED = (2012, "贴纸添加失败", "Sticker addition failed")
INVALID_KEYFRAME_INFO = (2013, "无效的关键帧信息,请检查keyframes字段值是否正确", "Invalid keyframe information, please check if the value of the keyframes field is correct.")
KEYFRAME_ADD_FAILED = (2014, "关键帧添加失败", "Keyframe addition failed")
SEGMENT_NOT_FOUND = (2015, "片段未找到,请检查segment_id是否正确", "Segment not found, please check if the segment_id is correct.")
INVALID_SEGMENT_TYPE = (2016, "无效的片段类型,该片段不支持关键帧", "Invalid segment type, this segment does not support keyframes.")
INVALID_KEYFRAME_PROPERTY = (2017, "无效的关键帧属性类型", "Invalid keyframe property type.")
INVALID_CAPTION_INFO = (2018, "无效的字幕信息,请检查captions字段值是否正确", "Invalid caption information, please check if the value of the captions field is correct.")
CAPTION_ADD_FAILED = (2019, "字幕添加失败", "Caption addition failed")
INVALID_EFFECT_INFO = (2020, "无效的特效信息,请检查effect_infos字段值是否正确", "Invalid effect information, please check if the value of the effect_infos field is correct.")
EFFECT_ADD_FAILED = (2021, "特效添加失败", "Effect addition failed")
EFFECT_NOT_FOUND = (2022, "特效未找到,请检查特效名称是否正确", "Effect not found, please check if the effect name is correct.")
INVALID_MASK_INFO = (2023, "无效的遮罩信息,请检查遮罩参数是否正确", "Invalid mask information, please check if mask parameters are correct.")
MASK_ADD_FAILED = (2024, "遮罩添加失败", "Mask addition failed")
MASK_NOT_FOUND = (2025, "遮罩类型未找到,请检查遮罩名称是否正确", "Mask type not found, please check if the mask name is correct.")
INVALID_TEXT_STYLE_INFO = (2026, "无效的文本样式信息,请检查文本或关键词参数", "Invalid text style information, please check text or keyword parameters.")
TEXT_STYLE_CREATE_FAILED = (2027, "文本样式创建失败", "Text style creation failed")
MATERIAL_CREATE_FAILED = (2028, "素材创建失败", "Material creation failed")
TEXT_ANIMATION_GET_FAILED = (2029, "获取文字动画失败", "Get text animation failed")
VIDEO_GENERATION_SUBMIT_FAILED = (2030, "视频生成任务提交失败", "Video generation task submit failed")
VIDEO_TASK_NOT_FOUND = (2031, "视频生成任务未找到", "Video generation task not found")
VIDEO_STATUS_QUERY_FAILED = (2032, "视频任务状态查询失败", "Video task status query failed")
IMAGE_ANIMATION_GET_FAILED = (2033, "获取图片动画失败", "Get image animation failed")
AUDIO_DURATION_GET_FAILED = (2034, "获取音频时长失败", "Get audio duration failed")
INSUFFICIENT_ACCOUNT_BALANCE = (2035, "账户余额不足,当前积分需大于 1 才可继续使用服务,请完成充值后重试", "Insufficient account balance. A minimum of 1 point is required to continue using the service. Please recharge and try again.")
INVALID_APIKEY = (2036, "无效的 apiKey", "Invalid apiKey")
INVALID_FILTER_INFO = (2037, "无效的滤镜信息,请检查 filter_infos 字段值是否正确", "Invalid filter information, please check if the value of the filter_infos field is correct.")
FILTER_ADD_FAILED = (2038, "滤镜添加失败", "Filter addition failed")
FILTER_NOT_FOUND = (2039, "滤镜未找到,请检查滤镜名称是否正确", "Filter not found, please check if the filter name is correct.")
FILTER_GET_FAILED = (2040, "获取滤镜列表失败", "Get filter list failed")
EFFECT_GET_FAILED = (2041, "获取特效列表失败", "Get effect list failed")
DRAFT_LOCK_TIMEOUT = (2042, "草稿锁获取超时,同一时间只允许一个操作", "Draft lock acquisition timeout, only one operation allowed at a time")
# ===== 系统错误码 (9000-9999) =====
INTERNAL_SERVER_ERROR = (9998, "系统内部错误", "Internal server error")
UNKNOWN_ERROR = (9999, "未知异常", "Unknown error")
def __init__(self, code: int, cn_message: str, en_message: str) -> None:
self.code = code
self.cn_message = cn_message
self.en_message = en_message
def as_dict(self, detail: str = "", lang: str = 'zh') -> dict:
"""转换为API响应格式,支持中英文"""
message = self.cn_message if lang == 'zh' else self.en_message
if detail:
message += f"({detail})"
return {"code": self.code, "message": message}
# 自定义异常类
class CustomException(Exception):
"""自定义业务异常类"""
def __init__(self, err: CustomError, detail: str = "") -> None:
self.err = err
self.detail = detail
super().__init__(err.cn_message)
================================================
FILE: main.py
================================================
import asyncio
from contextlib import asynccontextmanager, suppress
from fastapi import FastAPI
from src.router import v1_router
from src.utils.draft_downloader import download_draft
from src.utils.logger import logger
from src.middlewares import PrepareMiddleware, ResponseMiddleware, TraceContextMiddleware
@asynccontextmanager
async def lifespan(app: FastAPI):
from src.utils.draft_cleanup import draft_cleanup_background_loop
cleanup_task = asyncio.create_task(draft_cleanup_background_loop())
try:
yield
finally:
cleanup_task.cancel()
with suppress(asyncio.CancelledError):
await cleanup_task
# 1. 创建 FastAPI 应用
app: FastAPI = FastAPI(title="CapCut Mate API", version="1.0", lifespan=lifespan)
# 2. 注册路由
app.include_router(router=v1_router, prefix="/openapi/capcut-mate", tags=["capcut-mate"])
# 3. 添加中间件(最后注册的 TraceContextMiddleware 最先处理请求,用于 W3C trace_id)
app.add_middleware(middleware_class=PrepareMiddleware)
app.add_middleware(middleware_class=ResponseMiddleware)
app.add_middleware(middleware_class=TraceContextMiddleware)
# 4. 打印所有路由
for r in app.routes:
# 1. 取 HTTP 方法列表
methods = getattr(r, "methods", None) or [getattr(r, "method", "WS")]
# 2. 安全地取路径
path = getattr(r, "path", "")
# 3. 安全地取函数名
name = getattr(r, "name", "")
logger.info("Route: %s %s -> %s", ",".join(sorted(methods)), path, name)
logger.info("CapCut Mate API")
# 5. 启动
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=30000, log_config=None, log_level="info")
================================================
FILE: openapi.yaml
================================================
components:
examples:
add_audios:
value:
ReqExample:
audio_infos: '[{"audio_url":"https://www.jcaigc.cn/output/upload/2025-10-27-23/20251027234830.mp3","duration":23184000,"end":23184000,"start":0}]'
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262111301f5fceff
RespExample:
audio_ids:
- 9000bc9efb744c3196fb1d225993f43d
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262111301f5fceff
track_id: a2d21e5a343c4f1eba3c9234bea16658
add_captions:
value:
ReqExample:
alignment: 1
alpha: 1
bold: false
captions: '[{"start":0,"end":10000000,"text":"你好,剪映","keyword":"好","keyword_color":"#457616","keyword_font_size":15}]'
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251216104033617e9734
font_size: 15
has_shadow: false
italic: false
letter_spacing: 0
line_spacing: 0
scale_x: 1
scale_y: 1
style_text: 0
text_color: '#ffffff'
transform_x: 0
transform_y: 0
underline: false
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251216104033617e9734
segment_ids:
- 1b1102e3d2d14b9eabac064bbe64d2bf
segment_infos:
- end: 10000000
id: 1b1102e3d2d14b9eabac064bbe64d2bf
start: 0
text_ids:
- 52ae035e01584adf8d052533d83948ed
track_id: 7ffdf0f7d67e4d8caff5531f5873d26f
add_effects:
value:
ReqExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262337379d98b90e
effect_infos: '[{"effect_title": "录制边框 III","start": 0,"end": 5000000}]'
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262337379d98b90e
effect_ids:
- 34c70fba3619444fa897110b40b39386
segment_ids:
- 23e0c0900c69427f82e44243183706c9
track_id: 2ffea3839d304f83ae29dadc43a18227
add_filters:
value:
ReqExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20260319205519ce52b6b7
filter_infos: '[{"filter_title": "清透感", "start": 0, "end": 5000000, "intensity": 100.0}]'
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20260319205519ce52b6b7
filter_ids:
- 5dc1f01ad54a4ff3bc95e689dfc6177b
segment_ids:
- a52328e0df4e4ff9aef4733489e41488
track_id: 90ce51176b89486ebddca926d51af67c
add_images:
value:
ReqExample:
alpha: 1
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262111301f5fceff
image_infos: '[{"image_url":"https://assets.jcaigc.cn/demo.png","width":1920,"height":1080,"start":0,"end":5000000,"duration":5000000,"animation":"淡入淡出","transition":"溶解","transition_duration":500000}]'
scale_x: 1
scale_y: 1
transform_x: 0
transform_y: 0
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262111301f5fceff
image_ids:
- fa67760440104ca3adacdfd694fc25da
segment_ids:
- 2d19f38d5f544eecad18847e5eac1745
segment_infos:
- end: 5000000
id: 2d19f38d5f544eecad18847e5eac1745
start: 0
track_id: 38c8dfee92374137998715329494a8f9
add_keyframes:
value:
ReqExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251210224255e23f7146
keyframes: '[{"segment_id":"e1933f126437421bb52abdc56f062266","property":"KFTypePositionX","offset":0.5,"value":-0.1}]'
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251210224255e23f7146
add_masks:
value:
ReqExample:
draft_url: 线性
name: 线性
segment_ids:
- beb4adbea83d41d08021cf4e8f219206
RespExample: {}
add_sticker:
value:
ReqExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262337379d98b90e
end: 5000000
scale: 1
start: 0
sticker_id: "7326810673609018675"
transform_x: 0
transform_y: 0
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262337379d98b90e
duration: 5000000
segment_id: 7902e009fcfb44768f6f73e9432b5d5b
sticker_id: "7326810673609018675"
track_id: 10b612824bcd4dd882ab764d145dd7ce
add_text_style:
value:
ReqExample:
font_size: 15
keyword: 五个快乐到死的顶级思维
keyword_color: '#ff7100'
keyword_font_size: 15
text: 快乐|顶级思维
RespExample:
text_style: '{"text":"快乐|顶级思维","styles":[{"fill":{"content":{"solid":{"color":[1.0,1.0,1.0]}}},"range":[0,7],"size":15,"font":{"id":"","path":""}}]}'
add_videos:
value:
ReqExample:
alpha: 1
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262111301f5fceff
scale_x: 1
scale_y: 1
scene_timelines: []
transform_x: 0
transform_y: 0
video_infos: '[{"video_url": "https://assets.jcaigc.cn/min.mp4","width": 1920,"height": 1080,"start": 0,"end": 3000000,"duration": 6000000,"mask": "","transition": "","transition_duration": 500000,"volume": 1}]'
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262111301f5fceff
segment_ids:
- 20285056b4194e2c8944b587ceb592a7
track_id: 720274203a11442280b64570caf362c4
video_ids:
- 9b9f47126f384a6f95434cdc3fed5b7c
audio_infos:
value:
ReqExample:
mp3_urls:
- https://assets.jcaigc.cn/test1.mp3
- https://assets.jcaigc.cn/test2.mp3
timelines:
- end: 284891428
start: 0
- end: 579578774
start: 284891428
RespExample:
infos: '[{"audio_url": "https://assets.jcaigc.cn/test1.mp3", "start": 0, "end": 284891428}, {"audio_url": "https://assets.jcaigc.cn/test2.mp3", "start": 284891428, "end": 579578774}]'
audio_timelines:
value:
ReqExample:
links:
- https://assets.jcaigc.cn/test1.mp3
- https://assets.jcaigc.cn/test2.mp3
RespExample:
all_timelines:
- end: 579578776
start: 0
timelines:
- end: 284891429
start: 0
- end: 579578776
start: 284891429
caption_infos:
value:
ReqExample:
font_size: 12
keyword_border_color: '#ff0000'
keyword_color: '#ffef00'
keyword_font_size: 12
keywords:
- '["明月"]'
texts:
- '["床前明月光"]'
timelines:
- end: 5000000
start: 0
RespExample:
infos: '[{"start": 0, "end": 5000000, "text": "[\"床前明月光\"]", "keyword": "[\"明月\"]", "keyword_color": "#ffef00", "keyword_border_color": "#ff0000", "keyword_font_size": 12, "font_size": 12}]'
create_draft:
value:
ReqExample:
height: 1920
width: 1080
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251230140504254f511b
tip_url: ""
easy_create_material:
value:
ReqExample:
audio_url: https://assets.jcaigc.cn/test1.mp3
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262348074813d881
font_size: 15
img_url: https://assets.jcaigc.cn/demp.png
text: 简创AIGC官网:www.jcaigc.cn
text_color: '#ffffff'
text_transform_y: 0
video_url: https://assets.jcaigc.cn/min.mp4
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=202511262348074813d881
message: 成功
effect_infos:
value:
ReqExample:
effects:
- 红包来了
- 雪花
timelines:
- end: 284891428
start: 0
- end: 579578774
start: 284891428
RespExample:
infos: '[{"effect_title": "红包来了", "start": 0, "end": 284891428}, {"effect_title": "雪花", "start": 284891428, "end": 579578774}]'
filter_infos:
value:
ReqExample:
filters:
- 清透感
timelines:
- end: 5000000
start: 0
RespExample:
infos: '[{"filter_title": "清透感", "start": 0, "end": 5000000, "intensity": 100.0}]'
gen_video:
value:
ReqExample:
apiKey: 559a84a5-a9e9-4ade-a26b-e80b732754d6
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025120421372636a27729
RespExample:
code: 0
message: 视频生成任务已提交,请使用draft_url查询进度
gen_video_status:
value:
ReqExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025120421372636a27729
RespExample:
code: 0
completed_at: 2026-01-31T21:10:10.398727
created_at: 2026-01-31T21:09:15.104249
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025120421372636a27729
error_message: '导出草稿失败: 未在编辑窗口中找到导出按钮'
message: 成功
progress: 0
started_at: 2026-01-31T21:09:15.549183
status: failed
video_url: ""
get_audio_duration:
value:
ReqExample:
mp3_url: https://assets.jcaigc.cn/test1.mp3
RespExample:
duration: 284891429
message: 成功
get_effects:
value:
ReqExample:
mode: 0
RespExample:
effects:
- effect_id: "1183068"
has_params: true
icon_url: ""
is_vip: false
name: "1998"
resource_id: "6981791065204331044"
- effect_id: "634717"
has_params: true
icon_url: ""
is_vip: false
name: 70s
resource_id: "6706773500792689165"
- effect_id: "634889"
has_params: true
icon_url: ""
is_vip: false
name: 90s画质
resource_id: "6760946510910722564"
- effect_id: "4007303"
has_params: true
icon_url: ""
is_vip: false
name: CCD闪光
resource_id: "7130585796020539941"
- effect_id: "934600"
has_params: true
icon_url: ""
is_vip: false
name: DV录制框
resource_id: "6878115805498708493"
- effect_id: "1164160"
has_params: false
icon_url: ""
is_vip: false
name: DV界面
resource_id: "6974600764027048462"
- effect_id: "972753"
has_params: true
icon_url: ""
is_vip: false
name: I Lose You
resource_id: "6899746903735407117"
- effect_id: "972754"
has_params: true
icon_url: ""
is_vip: false
name: I Love You
resource_id: "6899746786294895112"
- effect_id: "2254788"
has_params: true
icon_url: ""
is_vip: false
name: JVC
resource_id: "7102302420310430215"
- effect_id: "1181892"
has_params: false
icon_url: ""
is_vip: false
name: List边框
resource_id: "6981463637676266020"
- effect_id: "1033288"
has_params: true
icon_url: ""
is_vip: false
name: MV封面
resource_id: "6925314612204147214"
- effect_id: "1483460"
has_params: true
icon_url: ""
is_vip: false
name: New Year
resource_id: "7041771617315197453"
- effect_id: "884226"
has_params: false
icon_url: ""
is_vip: false
name: PS边框
resource_id: "6860306184595837448"
- effect_id: "1025970"
has_params: true
icon_url: ""
is_vip: false
name: RGB描边
resource_id: "6922698007653650957"
- effect_id: "931458"
has_params: true
icon_url: ""
is_vip: false
name: VCR
resource_id: "6876012864679711245"
- effect_id: "634719"
has_params: true
icon_url: ""
is_vip: false
name: X-Signal
resource_id: "6709706971638927875"
- effect_id: "1162978"
has_params: true
icon_url: ""
is_vip: false
name: X开幕
resource_id: "6974024838000153096"
- effect_id: "14578173"
has_params: true
icon_url: ""
is_vip: false
name: betamax
resource_id: "7239937281937642041"
- effect_id: "1647776"
has_params: true
icon_url: ""
is_vip: false
name: emoji钻石
resource_id: "7078694071245476366"
- effect_id: "635133"
has_params: false
icon_url: ""
is_vip: false
name: ins界面
resource_id: "6761646727142314509"
- effect_id: "1380488"
has_params: true
icon_url: ""
is_vip: false
name: ins风放大镜
resource_id: "6992465511455920676"
- effect_id: "693883"
has_params: true
icon_url: ""
is_vip: false
name: kirakira
resource_id: "6706773500142555656"
- effect_id: "634197"
has_params: true
icon_url: ""
is_vip: false
name: ktv灯光
resource_id: "6771299914891661832"
- effect_id: "1054906"
has_params: true
icon_url: ""
is_vip: false
name: ktv灯光 II
resource_id: "6934938159763427876"
- effect_id: "1169934"
has_params: true
icon_url: ""
is_vip: false
name: windows弹窗关闭
resource_id: "6976562270071427598"
- effect_id: "1169728"
has_params: true
icon_url: ""
is_vip: false
name: windows弹窗打开
resource_id: "6976538396290191880"
- effect_id: "768190"
has_params: true
icon_url: ""
is_vip: false
name: 丁达尔光线
resource_id: "6834008866137575950"
- effect_id: "1405514"
has_params: true
icon_url: ""
is_vip: false
name: 万圣emoji
resource_id: "7021363005052948999"
- effect_id: "951616"
has_params: true
icon_url: ""
is_vip: false
name: 万圣夜
resource_id: "6888280327949652493"
- effect_id: "635029"
has_params: false
icon_url: ""
is_vip: false
name: 三屏
resource_id: "6706773500209664515"
- effect_id: "635007"
has_params: false
icon_url: ""
is_vip: false
name: 三格漫画
resource_id: "6795825532668744206"
- effect_id: "635039"
has_params: true
icon_url: ""
is_vip: false
name: 下雨
resource_id: "6734619419890160131"
- effect_id: "1068128"
has_params: false
icon_url: ""
is_vip: false
name: 不对劲
resource_id: "6940134524642660895"
- effect_id: "898673"
has_params: true
icon_url: ""
is_vip: false
name: 不规则黑框
resource_id: "6865921530488951309"
- effect_id: "635025"
has_params: false
icon_url: ""
is_vip: false
name: 两屏
resource_id: "6706773500796867075"
- effect_id: "1100950"
has_params: false
icon_url: ""
is_vip: false
name: 中枪了
resource_id: "6950894972291781127"
- effect_id: "1113160"
has_params: false
icon_url: ""
is_vip: false
name: 乌鸦飞过
resource_id: "6955028776094798366"
- effect_id: "635011"
has_params: false
icon_url: ""
is_vip: false
name: 九屏
resource_id: "6719657094741496333"
- effect_id: "635031"
has_params: false
icon_url: ""
is_vip: false
name: 九屏跑马灯
resource_id: "6726773973683540491"
- effect_id: "1535868"
has_params: true
icon_url: ""
is_vip: false
name: 五彩纸屑
resource_id: "7055567263029531143"
- effect_id: "1543542"
has_params: true
icon_url: ""
is_vip: false
name: 五彩缤纷
resource_id: "7055594981683106312"
- effect_id: "634129"
has_params: true
icon_url: ""
is_vip: false
name: 亮片
resource_id: "6715209448521994755"
- effect_id: "634199"
has_params: true
icon_url: ""
is_vip: false
name: 人鱼滤镜
resource_id: "6766876614862049795"
- effect_id: "634173"
has_params: true
icon_url: ""
is_vip: false
name: 仙女变身
resource_id: "6746483363567112707"
- effect_id: "634171"
has_params: true
icon_url: ""
is_vip: false
name: 仙女变身 II
resource_id: "6747515070114173447"
- effect_id: "35504704"
has_params: true
icon_url: ""
is_vip: false
name: 仙女棒
resource_id: "7314565034586149403"
- effect_id: "1133662"
has_params: true
icon_url: ""
is_vip: false
name: 仙尘闪闪
resource_id: "6963476143370408485"
- effect_id: "703237"
has_params: true
icon_url: ""
is_vip: false
name: 低像素
resource_id: "6810945511005098509"
- effect_id: "703239"
has_params: true
icon_url: ""
is_vip: false
name: 低像素 II
resource_id: "6811399125544735245"
- effect_id: "1521390"
has_params: true
icon_url: ""
is_vip: false
name: 倒计时 II
resource_id: "7051887173276013093"
- effect_id: "1663132"
has_params: true
icon_url: ""
is_vip: false
name: 像素画
resource_id: "7081557169539125791"
- effect_id: "634785"
has_params: true
icon_url: ""
is_vip: false
name: 像素纹理
resource_id: "6763903685983474189"
- effect_id: "28151372"
has_params: true
icon_url: ""
is_vip: false
name: 光斑虚化
resource_id: "7297154514262430259"
- effect_id: "972749"
has_params: true
icon_url: ""
is_vip: false
name: 光斑飘落
resource_id: "6899747276718084622"
- effect_id: "634095"
has_params: true
icon_url: ""
is_vip: false
name: 光晕
resource_id: "6714239617916211716"
- effect_id: "634093"
has_params: true
icon_url: ""
is_vip: false
name: 光晕 II
resource_id: "6709701759398318604"
- effect_id: "634079"
has_params: false
icon_url: ""
is_vip: false
name: 全剧终
resource_id: "6710109932122804750"
- effect_id: "635013"
has_params: false
icon_url: ""
is_vip: false
name: 六屏
resource_id: "6719657243039502851"
- effect_id: "634277"
has_params: true
icon_url: ""
is_vip: false
name: 关月亮
resource_id: "6774656266833760780"
- effect_id: "1398372"
has_params: true
icon_url: ""
is_vip: false
name: 冰冷实验室
resource_id: "7019265849047388680"
- effect_id: "966514"
has_params: true
icon_url: ""
is_vip: false
name: 冰霜
resource_id: "6896417042090430989"
- effect_id: "1499080"
has_params: true
icon_url: ""
is_vip: false
name: 冰霜 II
resource_id: "7047048873897890334"
- effect_id: "1146394"
has_params: true
icon_url: ""
is_vip: false
name: 冲击波
resource_id: "6967180577875169799"
- effect_id: "635003"
has_params: false
icon_url: ""
is_vip: false
name: 冲刺
resource_id: "6790536507905020430"
- effect_id: "635001"
has_params: false
icon_url: ""
is_vip: false
name: 冲刺 II
resource_id: "6781392637216690700"
- effect_id: "634981"
has_params: false
icon_url: ""
is_vip: false
name: 冲刺 III
resource_id: "6774324121783243271"
- effect_id: "875969"
has_params: true
icon_url: ""
is_vip: false
name: 冲屏闪粉
resource_id: "6858138911487562248"
- effect_id: "1113134"
has_params: false
icon_url: ""
is_vip: false
name: 凄凉
resource_id: "6955021464684728846"
- effect_id: "920550"
has_params: true
icon_url: ""
is_vip: false
name: 几何图形
resource_id: "6871054818241155592"
- effect_id: "634741"
has_params: true
icon_url: ""
is_vip: false
name: 刀光剑影
resource_id: "6740539604509659662"
- effect_id: "13525811"
has_params: true
icon_url: ""
is_vip: false
name: 分屏开幕
resource_id: "7232198317671715385"
- effect_id: "6940749"
has_params: true
icon_url: ""
is_vip: false
name: 初雪 I
resource_id: "7173558688605540901"
- effect_id: "1038710"
has_params: false
icon_url: ""
is_vip: false
name: 剪纸边框
resource_id: "6926456664228893191"
- effect_id: "1031291"
has_params: true
icon_url: ""
is_vip: false
name: 加载甜蜜
resource_id: "6924873263994638856"
- effect_id: "1368758"
has_params: true
icon_url: ""
is_vip: false
name: 动感模糊
resource_id: "7009120603055591943"
- effect_id: "1524680"
has_params: true
icon_url: ""
is_vip: false
name: 动感色卡
resource_id: "7052644171240182280"
- effect_id: "635125"
has_params: true
icon_url: ""
is_vip: false
name: 动感荧光
resource_id: "6755761739242934798"
- effect_id: "1155430"
has_params: true
icon_url: ""
is_vip: false
name: 动感蓝带
resource_id: "6970598283378954765"
- effect_id: "20412423"
has_params: true
icon_url: ""
is_vip: false
name: 单色涂鸦
resource_id: "7265798651019006521"
- effect_id: "1403930"
has_params: true
icon_url: ""
is_vip: false
name: 南瓜光斑
resource_id: "6992844454453318157"
- effect_id: "951196"
has_params: true
icon_url: ""
is_vip: false
name: 南瓜笑脸
resource_id: "6888208083202347534"
- effect_id: "634735"
has_params: true
icon_url: ""
is_vip: false
name: 卷动
resource_id: "6719657168292811278"
- effect_id: "635137"
has_params: false
icon_url: ""
is_vip: false
name: 原相机
resource_id: "6753416178909057549"
- effect_id: "1173234"
has_params: false
icon_url: ""
is_vip: false
name: 友友商店
resource_id: "6977709836993565220"
- effect_id: "5114825"
has_params: true
icon_url: ""
is_vip: false
name: 反转片 I
resource_id: "7153084450593575454"
- effect_id: "1126104"
has_params: true
icon_url: ""
is_vip: false
name: 发光
resource_id: "6961701455262650916"
- effect_id: "635089"
has_params: true
icon_url: ""
is_vip: false
name: 取景框
resource_id: "6712739398984667651"
- effect_id: "920935"
has_params: false
icon_url: ""
is_vip: false
name: 取景框 II
resource_id: "6871187132195541517"
- effect_id: "1068127"
has_params: false
icon_url: ""
is_vip: false
name: 变形了
resource_id: "6940134629282157064"
- effect_id: "634053"
has_params: true
icon_url: ""
is_vip: false
name: 变彩色
resource_id: "6720492336788279815"
- effect_id: "634019"
has_params: true
icon_url: ""
is_vip: false
name: 变清晰
resource_id: "6719658716750156291"
- effect_id: "1146596"
has_params: true
icon_url: ""
is_vip: false
name: 变清晰 II
resource_id: "6948352810895282724"
- effect_id: "27896191"
has_params: true
icon_url: ""
is_vip: false
name: 变焦推镜
resource_id: "7296418835429593651"
- effect_id: "1381700"
has_params: true
icon_url: ""
is_vip: false
name: 变秋天
resource_id: "7012941093520020004"
- effect_id: "634055"
has_params: true
icon_url: ""
is_vip: false
name: 变黑白
resource_id: "6730911849706951179"
- effect_id: "635005"
has_params: false
icon_url: ""
is_vip: false
name: 告白氛围
resource_id: "6798021156331852295"
- effect_id: "634073"
has_params: true
icon_url: ""
is_vip: false
name: 咔嚓
resource_id: "6752780026900386317"
- effect_id: "1106302"
has_params: false
icon_url: ""
is_vip: false
name: 哈哈弹幕
resource_id: "6952852858656002590"
- effect_id: "1646830"
has_params: true
icon_url: ""
is_vip: false
name: 哈苏胶片
resource_id: "7078598928056193566"
- effect_id: "1174596"
has_params: true
icon_url: ""
is_vip: false
name: 唱片
resource_id: "6978764021637845541"
- effect_id: "1196734"
has_params: false
icon_url: ""
is_vip: false
name: 唱片封面
resource_id: "6987741974455390734"
- effect_id: "1104164"
has_params: false
icon_url: ""
is_vip: false
name: 啊啊啊啊
resource_id: "6951661272827957790"
- effect_id: "634061"
has_params: true
icon_url: ""
is_vip: false
name: 噪点
resource_id: "6706773498510971404"
- effect_id: "635027"
has_params: false
icon_url: ""
is_vip: false
name: 四屏
resource_id: "6706773500490682888"
- effect_id: "4720539"
has_params: true
icon_url: ""
is_vip: false
name: 回弹摇摆
resource_id: "7146090225855369742"
- effect_id: "1227934"
has_params: false
icon_url: ""
is_vip: false
name: 回忆文件夹
resource_id: "6998352498062791205"
- effect_id: "1196624"
has_params: true
icon_url: ""
is_vip: false
name: 回忆胶片
resource_id: "6987725478912070174"
- effect_id: "1569306"
has_params: true
icon_url: ""
is_vip: false
name: 圆形虚线放大镜
resource_id: "7065242222068765198"
- effect_id: "634209"
has_params: true
icon_url: ""
is_vip: false
name: 圣诞光斑
resource_id: "6769436675958379021"
- effect_id: "634207"
has_params: true
icon_url: ""
is_vip: false
name: 圣诞星光
resource_id: "6767219683901837832"
- effect_id: "1406882"
has_params: true
icon_url: ""
is_vip: false
name: 地狱使者
resource_id: "7007684840506003999"
- effect_id: "635127"
has_params: false
icon_url: ""
is_vip: false
name: 基础黑框
resource_id: "6712316216905568772"
- effect_id: "703221"
has_params: true
icon_url: ""
is_vip: false
name: 塑料封面
resource_id: "6814664313496670728"
- effect_id: "703219"
has_params: true
icon_url: ""
is_vip: false
name: 塑料封面 II
resource_id: "6814664561082241550"
- effect_id: "703217"
has_params: true
icon_url: ""
is_vip: false
name: 塑料封面III
resource_id: "6815457699505902087"
- effect_id: "898868"
has_params: true
icon_url: ""
is_vip: false
name: 复古DV
resource_id: "6865959646092333576"
- effect_id: "909740"
has_params: true
icon_url: ""
is_vip: false
name: 复古DV II
resource_id: "6869650937841979911"
- effect_id: "1194896"
has_params: true
icon_url: ""
is_vip: false
name: 复古DV III
resource_id: "6986958810619318792"
- effect_id: "1217306"
has_params: true
icon_url: ""
is_vip: false
name: 复古DV IV
resource_id: "6994703188611830303"
- effect_id: "1212776"
has_params: true
icon_url: ""
is_vip: false
name: 复古发光
resource_id: "6993267867214942733"
- effect_id: "926324"
has_params: true
icon_url: ""
is_vip: false
name: 复古多格
resource_id: "6875631945510818318"
- effect_id: "635103"
has_params: true
icon_url: ""
is_vip: false
name: 复古弹窗 I
resource_id: "6709708058852856327"
- effect_id: "635143"
has_params: false
icon_url: ""
is_vip: false
name: 复古弹窗 II
resource_id: "6764667280681865731"
- effect_id: "784724"
has_params: true
icon_url: ""
is_vip: false
name: 复古漫画
resource_id: "6847440397027774984"
- effect_id: "1039434"
has_params: true
icon_url: ""
is_vip: false
name: 复古甜心
resource_id: "6926817888632312333"
- effect_id: "1094804"
has_params: true
icon_url: ""
is_vip: false
name: 复古碎钻
resource_id: "6948700335481295374"
- effect_id: "1648234"
has_params: true
icon_url: ""
is_vip: false
name: 复古蓝调
resource_id: "7078935944459457061"
- effect_id: "14244311"
has_params: true
icon_url: ""
is_vip: false
name: 夏日冰块
resource_id: "7237437172733710909"
- effect_id: "2488948"
has_params: true
icon_url: ""
is_vip: false
name: 夏日泡泡 I
resource_id: "7104624152044114462"
- effect_id: "719376"
has_params: true
icon_url: ""
is_vip: false
name: 夕阳
resource_id: "6820595030743323149"
- effect_id: "720788"
has_params: true
icon_url: ""
is_vip: false
name: 夕阳 II
resource_id: "6823659895221391886"
- effect_id: "762382"
has_params: true
icon_url: ""
is_vip: false
name: 夕阳 III
resource_id: "6836996542310650381"
- effect_id: "634175"
has_params: true
icon_url: ""
is_vip: false
name: 夜蝶
resource_id: "6748376019524129292"
- effect_id: "635131"
has_params: false
icon_url: ""
is_vip: false
name: 夜视框
resource_id: "6733023209978860035"
- effect_id: "635063"
has_params: true
icon_url: ""
is_vip: false
name: 大雪
resource_id: "6767148963503018503"
- effect_id: "961896"
has_params: true
icon_url: ""
is_vip: false
name: 大雪纷飞
resource_id: "6894517304487318024"
- effect_id: "634143"
has_params: true
icon_url: ""
is_vip: false
name: 天使光
resource_id: "6721949326022545928"
- effect_id: "1402689"
has_params: false
icon_url: ""
is_vip: false
name: 天使降临
resource_id: "7020715912596558366"
- effect_id: "1188938"
has_params: true
icon_url: ""
is_vip: false
name: 失焦
resource_id: "6984625607376114190"
- effect_id: "1115952"
has_params: false
icon_url: ""
is_vip: false
name: 夸夸弹幕
resource_id: "6956147849356644894"
- effect_id: "1194360"
has_params: true
icon_url: ""
is_vip: false
name: 夺冠
resource_id: "6986857922076611080"
- effect_id: "635037"
has_params: true
icon_url: ""
is_vip: false
name: 孔明灯
resource_id: "6734215575196668428"
- effect_id: "1363340"
has_params: true
icon_url: ""
is_vip: false
name: 孔明灯 II
resource_id: "7008056576514724365"
- effect_id: "747802"
has_params: true
icon_url: ""
is_vip: false
name: 字幕投影
resource_id: "6828021842695950856"
- effect_id: "747910"
has_params: true
icon_url: ""
is_vip: false
name: 字幕投影 II
resource_id: "6829181074954785294"
- effect_id: "784366"
has_params: true
icon_url: ""
is_vip: false
name: 字幕投影 III
resource_id: "6847378675894063623"
- effect_id: "875967"
has_params: true
icon_url: ""
is_vip: false
name: 字幕投影 IV
resource_id: "6858139153020752397"
- effect_id: "1227402"
has_params: true
icon_url: ""
is_vip: false
name: 定格闪烁
resource_id: "6998099471565328926"
- effect_id: "1113428"
has_params: false
icon_url: ""
is_vip: false
name: 小剧场
resource_id: "6955083477708444174"
- effect_id: "1138384"
has_params: false
icon_url: ""
is_vip: false
name: 小动物
resource_id: "6965381784674505246"
- effect_id: "1039448"
has_params: true
icon_url: ""
is_vip: false
name: 小花花
resource_id: "6926823177670627848"
- effect_id: "1209684"
has_params: true
icon_url: ""
is_vip: false
name: 少女心
resource_id: "6992842225541452325"
- effect_id: "1031294"
has_params: true
icon_url: ""
is_vip: false
name: 少女心事
resource_id: "6924872492381114894"
- effect_id: "703255"
has_params: true
icon_url: ""
is_vip: false
name: 少女星闪
resource_id: "6805098811694780942"
- effect_id: "6209717"
has_params: true
icon_url: ""
is_vip: false
name: 左右摇晃
resource_id: "7166435460321907207"
- effect_id: "909545"
has_params: true
icon_url: ""
is_vip: false
name: 布拉格
resource_id: "6869626257709994510"
- effect_id: "634737"
has_params: true
icon_url: ""
is_vip: false
name: 幻彩文字
resource_id: "6760975890806477319"
- effect_id: "634751"
has_params: true
icon_url: ""
is_vip: false
name: 幻影
resource_id: "6723059630676644364"
- effect_id: "971332"
has_params: true
icon_url: ""
is_vip: false
name: 幻影 II
resource_id: "6898958754792870413"
- effect_id: "1038152"
has_params: true
icon_url: ""
is_vip: false
name: 幻术摇摆
resource_id: "6926400232615842318"
- effect_id: "634723"
has_params: true
icon_url: ""
is_vip: false
name: 幻觉
resource_id: "6709706311455478285"
- effect_id: "1700284"
has_params: true
icon_url: ""
is_vip: false
name: 广角
resource_id: "7086792017837036046"
- effect_id: "1189232"
has_params: true
icon_url: ""
is_vip: false
name: 庆祝彩带
resource_id: "6984685757508096520"
- effect_id: "631211"
has_params: false
icon_url: ""
is_vip: false
name: 开幕
resource_id: "6706773534074491403"
- effect_id: "631213"
has_params: false
icon_url: ""
is_vip: false
name: 开幕 II
resource_id: "6708899027976458760"
- effect_id: "634783"
has_params: true
icon_url: ""
is_vip: false
name: 强锐化
resource_id: "6711567084741988876"
- effect_id: "634887"
has_params: true
icon_url: ""
is_vip: false
name: 录像带
resource_id: "6706773534074475012"
- effect_id: "634811"
has_params: true
icon_url: ""
is_vip: false
name: 录像带 II
resource_id: "6771299859803673101"
- effect_id: "703251"
has_params: false
icon_url: ""
is_vip: false
name: 录像带 III
resource_id: "6804357689859117581"
- effect_id: "634801"
has_params: true
icon_url: ""
is_vip: false
name: 录制框
resource_id: "6709725898762883595"
- effect_id: "635121"
has_params: false
icon_url: ""
is_vip: false
name: 录制边框
resource_id: "6720541178044879367"
- effect_id: "635119"
has_params: false
icon_url: ""
is_vip: false
name: 录制边框 II
resource_id: "6720541079080276484"
- effect_id: "961624"
has_params: false
icon_url: ""
is_vip: false
name: 录制边框 III
resource_id: "6894451240382501389"
- effect_id: "634063"
has_params: false
icon_url: ""
is_vip: false
name: 录制边框 IIII
resource_id: "6723065859260027403"
- effect_id: "1418386"
has_params: true
icon_url: ""
is_vip: false
name: 彩信
resource_id: "7023692066152518152"
- effect_id: "4253680"
has_params: true
icon_url: ""
is_vip: false
name: 彩噪画质
resource_id: "7135711291473138184"
- effect_id: "1381644"
has_params: true
icon_url: ""
is_vip: false
name: 彩带
resource_id: "7012933493663470088"
- effect_id: "1143666"
has_params: false
icon_url: ""
is_vip: false
name: 彩色描边
resource_id: "6966904744564494878"
- effect_id: "634947"
has_params: true
icon_url: ""
is_vip: false
name: 彩色漫画
resource_id: "6795430958737658382"
- effect_id: "1005840"
has_params: true
icon_url: ""
is_vip: false
name: 彩色负片
resource_id: "6914995893653475847"
- effect_id: "634161"
has_params: true
icon_url: ""
is_vip: false
name: 彩虹光
resource_id: "6719758141573042692"
- effect_id: "634159"
has_params: true
icon_url: ""
is_vip: false
name: 彩虹光 II
resource_id: "6738279134692119047"
- effect_id: "634213"
has_params: true
icon_url: ""
is_vip: false
name: 彩虹光晕
resource_id: "6768721870360416782"
- effect_id: "703249"
has_params: true
icon_url: ""
is_vip: false
name: 彩虹射线
resource_id: "6808837459728667144"
- effect_id: "634281"
has_params: true
icon_url: ""
is_vip: false
name: 彩虹幻影
resource_id: "6756845151630397960"
- effect_id: "634127"
has_params: true
icon_url: ""
is_vip: false
name: 彩虹气泡
resource_id: "6717434470128947725"
- effect_id: "1031292"
has_params: true
icon_url: ""
is_vip: false
name: 彩虹爱心
resource_id: "6924873147053249031"
- effect_id: "1192480"
has_params: true
icon_url: ""
is_vip: false
name: 彩钻
resource_id: "6986188114490298888"
- effect_id: "634273"
has_params: true
icon_url: ""
is_vip: false
name: 心河
resource_id: "6740821434307711496"
- effect_id: "634753"
has_params: true
icon_url: ""
is_vip: false
name: 心跳
resource_id: "6723068356821258764"
- effect_id: "634049"
has_params: true
icon_url: ""
is_vip: false
name: 心跳黑框
resource_id: "6732383404991451656"
- effect_id: "634979"
has_params: true
icon_url: ""
is_vip: false
name: 必杀技
resource_id: "6797658471840879111"
- effect_id: "634977"
has_params: true
icon_url: ""
is_vip: false
name: 必杀技 II
resource_id: "6797346848391565831"
- effect_id: "3222474"
has_params: true
icon_url: ""
is_vip: false
name: 怀旧边框
resource_id: "7113820806446060040"
- effect_id: "1475190"
has_params: false
icon_url: ""
is_vip: false
name: 怀旧边框 II
resource_id: "7039331384183230989"
- effect_id: "1031293"
has_params: true
icon_url: ""
is_vip: false
name: 怦然心动
resource_id: "6924872657083044359"
- effect_id: "952539"
has_params: true
icon_url: ""
is_vip: false
name: 恐怖故事
resource_id: "6888563496133333511"
- effect_id: "952540"
has_params: true
icon_url: ""
is_vip: false
name: 恐怖故事 II
resource_id: "6888562369627165191"
- effect_id: "952742"
has_params: true
icon_url: ""
is_vip: false
name: 恐怖故事 III
resource_id: "6888594040959275527"
- effect_id: "1416842"
has_params: true
icon_url: ""
is_vip: false
name: 恐怖综艺
resource_id: "7023349285592764941"
- effect_id: "1020210"
has_params: true
icon_url: ""
is_vip: false
name: 恭喜发财
resource_id: "6920164595214586381"
- effect_id: "1413882"
has_params: true
icon_url: ""
is_vip: false
name: 恶灵冲屏
resource_id: "7022838857221542414"
- effect_id: "756184"
has_params: true
icon_url: ""
is_vip: false
name: 愛
resource_id: "6831487239164269064"
- effect_id: "1113430"
has_params: false
icon_url: ""
is_vip: false
name: 我酸了
resource_id: "6955083374054609444"
- effect_id: "635113"
has_params: false
icon_url: ""
is_vip: false
name: 手帐边框
resource_id: "6761336384117543438"
- effect_id: "886132"
has_params: true
icon_url: ""
is_vip: false
name: 手电筒
resource_id: "6860757586220683790"
- effect_id: "1225274"
has_params: false
icon_url: ""
is_vip: false
name: 手绘拍摄器
resource_id: "6997608849750364708"
- effect_id: "635101"
has_params: true
icon_url: ""
is_vip: false
name: 手绘边框 II
resource_id: "6723044276625740296"
- effect_id: "703271"
has_params: true
icon_url: ""
is_vip: false
name: 扫描光条
resource_id: "6798379345783034382"
- effect_id: "634759"
has_params: true
icon_url: ""
is_vip: false
name: 抖动
resource_id: "6706773500796867084"
- effect_id: "703227"
has_params: true
icon_url: ""
is_vip: false
name: 折痕
resource_id: "6810944968396378638"
- effect_id: "1032270"
has_params: true
icon_url: ""
is_vip: false
name: 折痕 II
resource_id: "6925250879259939336"
- effect_id: "1032322"
has_params: true
icon_url: ""
is_vip: false
name: 折痕 III
resource_id: "6925288456943833608"
- effect_id: "1032321"
has_params: true
icon_url: ""
is_vip: false
name: 折痕 IV
resource_id: "6925288650011841031"
- effect_id: "1032418"
has_params: true
icon_url: ""
is_vip: false
name: 折痕 V
resource_id: "6925292438391099912"
- effect_id: "635091"
has_params: true
icon_url: ""
is_vip: false
name: 报纸:今日热门
resource_id: "6711575336955417095"
- effect_id: "634743"
has_params: true
icon_url: ""
is_vip: false
name: 摇摆
resource_id: "6709706542674874888"
- effect_id: "717392"
has_params: true
icon_url: ""
is_vip: false
name: 摇摆 II
resource_id: "6821460674577699342"
- effect_id: "768182"
has_params: true
icon_url: ""
is_vip: false
name: 撒星星
resource_id: "6839514681044898311"
- effect_id: "788728"
has_params: true
icon_url: ""
is_vip: false
name: 撒星星 II
resource_id: "6849588023714124295"
- effect_id: "1153996"
has_params: false
icon_url: ""
is_vip: false
name: 撕纸涂鸦边框
resource_id: "6969851947306193416"
- effect_id: "635141"
has_params: true
icon_url: ""
is_vip: false
name: 播放器
resource_id: "6758630566578360845"
- effect_id: "635139"
has_params: true
icon_url: ""
is_vip: false
name: 播放器 II
resource_id: "6792819149945967111"
- effect_id: "773560"
has_params: true
icon_url: ""
is_vip: false
name: 擦拭开幕
resource_id: "6841459176510591496"
- effect_id: "1520514"
has_params: true
icon_url: ""
is_vip: false
name: 放大镜
resource_id: "7051836120224502308"
- effect_id: "1576250"
has_params: true
icon_url: ""
is_vip: false
name: 放映机
resource_id: "7067049946049942030"
- effect_id: "634775"
has_params: true
icon_url: ""
is_vip: false
name: 放映机卡顿
resource_id: "6706773499031081483"
- effect_id: "634787"
has_params: true
icon_url: ""
is_vip: false
name: 放映机抖动
resource_id: "6771320983065203213"
- effect_id: "1155966"
has_params: false
icon_url: ""
is_vip: false
name: 放映滚动
resource_id: "6970890075907297806"
- effect_id: "634797"
has_params: true
icon_url: ""
is_vip: false
name: 故障
resource_id: "6707050322696606222"
- effect_id: "634795"
has_params: true
icon_url: ""
is_vip: false
name: 故障 II
resource_id: "6738265357825348103"
- effect_id: "999316"
has_params: true
icon_url: ""
is_vip: false
name: 故障读条
resource_id: "6912013942097187336"
- effect_id: "949372"
has_params: true
icon_url: ""
is_vip: false
name: 文字闪动
resource_id: "6886710931150082573"
- effect_id: "1607458"
has_params: true
icon_url: ""
is_vip: false
name: 斑斓
resource_id: "7072258619646939679"
- effect_id: "920936"
has_params: true
icon_url: ""
is_vip: false
name: 斜向模糊
resource_id: "6871185301071467015"
- effect_id: "1024106"
has_params: true
icon_url: ""
is_vip: false
name: 新年倒数
resource_id: "6921952071247729165"
- effect_id: "995666"
has_params: true
icon_url: ""
is_vip: false
name: 新年开幕
resource_id: "6911144014624330248"
- effect_id: "972751"
has_params: true
icon_url: ""
is_vip: false
name: 新年快乐
resource_id: "6899747094840480269"
- effect_id: "8573753"
has_params: true
icon_url: ""
is_vip: false
name: 新春杂志
resource_id: "7189543383222719034"
- effect_id: "8578565"
has_params: true
icon_url: ""
is_vip: false
name: 新春祝福
resource_id: "7189586707035984441"
- effect_id: "635099"
has_params: true
icon_url: ""
is_vip: false
name: 方形取景器
resource_id: "6706773499031097868"
- effect_id: "634043"
has_params: false
icon_url: ""
is_vip: false
name: 方形开幕
resource_id: "6729055410835165708"
- effect_id: "1482636"
has_params: true
icon_url: ""
is_vip: false
name: 旋转方块
resource_id: "7041504567648850445"
- effect_id: "1146392"
has_params: false
icon_url: ""
is_vip: false
name: 日式DV
resource_id: "6965747262165094942"
- effect_id: "881783"
has_params: true
icon_url: ""
is_vip: false
name: 日文字幕
resource_id: "6858954575701873160"
- effect_id: "1020046"
has_params: true
icon_url: ""
is_vip: false
name: 日落灯
resource_id: "6920147678248571406"
- effect_id: "1157058"
has_params: false
icon_url: ""
is_vip: false
name: 时光碎片
resource_id: "6971332934288544286"
- effect_id: "1095262"
has_params: false
icon_url: ""
is_vip: false
name: 时间停止
resource_id: "6948722700286169631"
- effect_id: "634117"
has_params: true
icon_url: ""
is_vip: false
name: 星光
resource_id: "6717433583289504268"
- effect_id: "634113"
has_params: true
icon_url: ""
is_vip: false
name: 星光 II
resource_id: "6715209934738297358"
- effect_id: "634195"
has_params: true
icon_url: ""
is_vip: false
name: 星光绽放
resource_id: "6760243564598268420"
- effect_id: "1146750"
has_params: true
icon_url: ""
is_vip: false
name: 星光闪耀
resource_id: "6967255188730024455"
- effect_id: "920549"
has_params: true
icon_url: ""
is_vip: false
name: 星光闪闪
resource_id: "6871055398107877902"
- effect_id: "1364164"
has_params: true
icon_url: ""
is_vip: false
name: 星夜
resource_id: "7008149210159649294"
- effect_id: "634193"
has_params: true
icon_url: ""
is_vip: false
name: 星星冲屏
resource_id: "6769007480652435982"
- effect_id: "1171606"
has_params: true
icon_url: ""
is_vip: false
name: 星星坠落
resource_id: "6977257384120947213"
- effect_id: "76607736"
has_params: true
icon_url: ""
is_vip: false
name: 星星彩绘
resource_id: "7395533077130252863"
- effect_id: "741906"
has_params: true
icon_url: ""
is_vip: false
name: 星星投影
resource_id: "6826530141586330120"
- effect_id: "977478"
has_params: true
icon_url: ""
is_vip: false
name: 星星灯
resource_id: "6903072502369489422"
- effect_id: "634215"
has_params: true
icon_url: ""
is_vip: false
name: 星星闪烁
resource_id: "6778285088485413384"
- effect_id: "755806"
has_params: true
icon_url: ""
is_vip: false
name: 星星闪烁 II
resource_id: "6834010357728547335"
- effect_id: "920916"
has_params: true
icon_url: ""
is_vip: false
name: 星星闪烁 III
resource_id: "6871167583991632391"
- effect_id: "1146749"
has_params: true
icon_url: ""
is_vip: false
name: 星月童话
resource_id: "6967255330958873124"
- effect_id: "634265"
has_params: true
icon_url: ""
is_vip: false
name: 星河
resource_id: "6734498838410695175"
- effect_id: "1372810"
has_params: true
icon_url: ""
is_vip: false
name: 星河 II
resource_id: "7010648091049071135"
- effect_id: "634103"
has_params: true
icon_url: ""
is_vip: false
name: 星火
resource_id: "6715209198109463054"
- effect_id: "986477"
has_params: true
icon_url: ""
is_vip: false
name: 星火 II
resource_id: "6907053209173365256"
- effect_id: "703243"
has_params: true
icon_url: ""
is_vip: false
name: 星火炸开
resource_id: "6808838081420988942"
- effect_id: "634267"
has_params: true
icon_url: ""
is_vip: false
name: 星移
resource_id: "6778284619499311623"
- effect_id: "635035"
has_params: true
icon_url: ""
is_vip: false
name: 星空
resource_id: "6734587005872640519"
- effect_id: "634271"
has_params: true
icon_url: ""
is_vip: false
name: 星辰
resource_id: "6761722814157296141"
- effect_id: "1087622"
has_params: true
icon_url: ""
is_vip: false
name: 星辰 I
resource_id: "6946113717100614158"
- effect_id: "1089758"
has_params: true
icon_url: ""
is_vip: false
name: 星辰 II
resource_id: "6946453051368542727"
- effect_id: "1094800"
has_params: true
icon_url: ""
is_vip: false
name: 星辰 III
resource_id: "6948700154874565156"
- effect_id: "634187"
has_params: true
icon_url: ""
is_vip: false
name: 星雨
resource_id: "6766488666261950989"
- effect_id: "1041304"
has_params: true
icon_url: ""
is_vip: false
name: 春日樱花
resource_id: "6927185086685123086"
- effect_id: "1076064"
has_params: true
icon_url: ""
is_vip: false
name: 春日边框
resource_id: "6942800783737885198"
- effect_id: "635071"
has_params: true
icon_url: ""
is_vip: false
name: 晴天光线
resource_id: "6740540037563159047"
- effect_id: "949350"
has_params: true
icon_url: ""
is_vip: false
name: 暗夜
resource_id: "6886698114258833934"
- effect_id: "1402690"
has_params: false
icon_url: ""
is_vip: false
name: 暗夜归来
resource_id: "7020715691355410951"
- effect_id: "720808"
has_params: true
icon_url: ""
is_vip: false
name: 暗夜彩虹
resource_id: "6823658782090859022"
- effect_id: "741832"
has_params: true
icon_url: ""
is_vip: false
name: 暗夜彩虹 II
resource_id: "6824046488419570184"
- effect_id: "741860"
has_params: true
icon_url: ""
is_vip: false
name: 暗夜彩虹III
resource_id: "6824047157369115150"
- effect_id: "952536"
has_params: true
icon_url: ""
is_vip: false
name: 暗夜精灵
resource_id: "6888573576870367751"
- effect_id: "1407954"
has_params: true
icon_url: ""
is_vip: false
name: 暗夜蝙蝠
resource_id: "7021786820153184775"
- effect_id: "634057"
has_params: true
icon_url: ""
is_vip: false
name: 暗角
resource_id: "6723086142658318860"
- effect_id: "949388"
has_params: true
icon_url: ""
is_vip: false
name: 暗黑剪影
resource_id: "6886718600233619982"
- effect_id: "1414024"
has_params: true
icon_url: ""
is_vip: false
name: 暗黑噪点
resource_id: "7022896066559218183"
- effect_id: "634179"
has_params: true
icon_url: ""
is_vip: false
name: 暗黑蝙蝠
resource_id: "6749064512390828548"
- effect_id: "1207064"
has_params: true
icon_url: ""
is_vip: false
name: 曝光
resource_id: "6992043513365926408"
- effect_id: "634659"
has_params: true
icon_url: ""
is_vip: false
name: 曝光降低
resource_id: "6765766949382132232"
- effect_id: "741892"
has_params: true
icon_url: ""
is_vip: false
name: 月亮投影
resource_id: "6826529572536717837"
- effect_id: "931823"
has_params: true
icon_url: ""
is_vip: false
name: 月亮闪闪
resource_id: "6876339287038628359"
- effect_id: "986344"
has_params: true
icon_url: ""
is_vip: false
name: 月光闪闪
resource_id: "6906802979861434887"
- effect_id: "761578"
has_params: true
icon_url: ""
is_vip: false
name: 望远镜
resource_id: "6834012604759806472"
- effect_id: "1185624"
has_params: false
icon_url: ""
is_vip: false
name: 未来主义
resource_id: "6982870068069667365"
- effect_id: "703235"
has_params: true
icon_url: ""
is_vip: false
name: 杂志
resource_id: "6810945952451400200"
- effect_id: "703215"
has_params: true
icon_url: ""
is_vip: false
name: 树影
resource_id: "6815830852035940872"
- effect_id: "719372"
has_params: true
icon_url: ""
is_vip: false
name: 树影 II
resource_id: "6820591707617235464"
- effect_id: "703223"
has_params: true
icon_url: ""
is_vip: false
name: 格纹纸质
resource_id: "6815834305084789262"
- effect_id: "703225"
has_params: true
icon_url: ""
is_vip: false
name: 格纹纸质 II
resource_id: "6815834434726531597"
- effect_id: "773088"
has_params: true
icon_url: ""
is_vip: false
name: 梦境
resource_id: "6841460732639318542"
- effect_id: "788039"
has_params: true
icon_url: ""
is_vip: false
name: 梦境 II
resource_id: "6849235870130639368"
- effect_id: "774964"
has_params: true
icon_url: ""
is_vip: false
name: 梦境 III
resource_id: "6843319622385537544"
- effect_id: "773086"
has_params: true
icon_url: ""
is_vip: false
name: 梦境 IV
resource_id: "6841460608248844813"
- effect_id: "961480"
has_params: true
icon_url: ""
is_vip: false
name: 梦幻雪花
resource_id: "6894208129534267912"
- effect_id: "1406766"
has_params: true
icon_url: ""
is_vip: false
name: 梦蝶
resource_id: "6998050316528652831"
- effect_id: "1419974"
has_params: true
icon_url: ""
is_vip: false
name: 梦魇
resource_id: "7024080087163081229"
- effect_id: "1147066"
has_params: true
icon_url: ""
is_vip: false
name: 梵高背景
resource_id: "6967354298275467807"
- effect_id: "634025"
has_params: true
icon_url: ""
is_vip: false
name: 模糊
resource_id: "6739752823140913675"
- effect_id: "634071"
has_params: true
icon_url: ""
is_vip: false
name: 模糊开幕
resource_id: "6758752103092457991"
- effect_id: "634255"
has_params: true
icon_url: ""
is_vip: false
name: 模糊星光
resource_id: "6771299961171612174"
- effect_id: "703247"
has_params: true
icon_url: ""
is_vip: false
name: 模糊星光 II
resource_id: "6806254134619017741"
- effect_id: "717394"
has_params: true
icon_url: ""
is_vip: false
name: 模糊闭幕
resource_id: "6821460725517521416"
- effect_id: "931822"
has_params: false
icon_url: ""
is_vip: false
name: 横向闭幕
resource_id: "6876339694825640455"
- effect_id: "703269"
has_params: true
icon_url: ""
is_vip: false
name: 横纹故障
resource_id: "6806254428358709767"
- effect_id: "703267"
has_params: true
icon_url: ""
is_vip: false
name: 横纹故障 II
resource_id: "6815093228216259079"
- effect_id: "1069014"
has_params: true
icon_url: ""
is_vip: false
name: 樱花朵朵
resource_id: "6940448547137393159"
- effect_id: "1005839"
has_params: true
icon_url: ""
is_vip: false
name: 橘色负片
resource_id: "6914995976608420365"
- effect_id: "21803568"
has_params: true
icon_url: ""
is_vip: false
name: 欧根纱
resource_id: "7273334324106105403"
- effect_id: "634711"
has_params: true
icon_url: ""
is_vip: false
name: 毛刺
resource_id: "6709706457543086605"
- effect_id: "1445528"
has_params: false
icon_url: ""
is_vip: false
name: 毛玻璃
resource_id: "7031846864198570532"
- effect_id: "634101"
has_params: true
icon_url: ""
is_vip: false
name: 水墨晕染
resource_id: "6746486938137530884"
- effect_id: "634099"
has_params: true
icon_url: ""
is_vip: false
name: 水彩晕染
resource_id: "6733378866686988803"
- effect_id: "1068390"
has_params: true
icon_url: ""
is_vip: false
name: 水波纹
resource_id: "6940173521905521159"
- effect_id: "783644"
has_params: true
icon_url: ""
is_vip: false
name: 水波纹投影
resource_id: "6847018706887774727"
- effect_id: "998722"
has_params: true
icon_url: ""
is_vip: false
name: 水滴模糊
resource_id: "6911935918433636871"
- effect_id: "892170"
has_params: true
icon_url: ""
is_vip: false
name: 水滴滚动
resource_id: "6863328348920091144"
- effect_id: "77243667"
has_params: true
icon_url: ""
is_vip: false
name: 油画泼墨
resource_id: "7398059491545059876"
- effect_id: "645833"
has_params: true
icon_url: ""
is_vip: false
name: 油画纹理
resource_id: "6808442362314887693"
- effect_id: "703241"
has_params: true
icon_url: ""
is_vip: false
name: 泡泡
resource_id: "6806254230614053383"
- effect_id: "4118383"
has_params: true
icon_url: ""
is_vip: false
name: 泡泡变焦
resource_id: "7133105682881974821"
- effect_id: "77269362"
has_params: true
icon_url: ""
is_vip: false
name: 波点彩绘
resource_id: "7398099732884623908"
- effect_id: "63865672"
has_params: true
icon_url: ""
is_vip: false
name: 波纹扭曲
resource_id: "7368745372081984035"
- effect_id: "634285"
has_params: true
icon_url: ""
is_vip: false
name: 波纹色差
resource_id: "6709347834690277892"
- effect_id: "18648774"
has_params: true
icon_url: ""
is_vip: false
name: 流动烟雾
resource_id: "7257495407712801317"
- effect_id: "1164794"
has_params: false
icon_url: ""
is_vip: false
name: 流星雨
resource_id: "6974750495415996936"
- effect_id: "635047"
has_params: true
icon_url: ""
is_vip: false
name: 浓雾
resource_id: "6751566830206194190"
- effect_id: "634253"
has_params: true
icon_url: ""
is_vip: false
name: 浪漫氛围
resource_id: "6790533020215415304"
- effect_id: "705081"
has_params: true
icon_url: ""
is_vip: false
name: 浪漫氛围 II
resource_id: "6814667933684339207"
- effect_id: "1153998"
has_params: false
icon_url: ""
is_vip: false
name: 涂鸦切割边框
resource_id: "6969850948969566756"
- effect_id: "635117"
has_params: true
icon_url: ""
is_vip: false
name: 淡彩边框
resource_id: "6753512270598246925"
- effect_id: "1141780"
has_params: false
icon_url: ""
is_vip: false
name: 清新绿格子
resource_id: "6966132680211567135"
- effect_id: "634041"
has_params: true
icon_url: ""
is_vip: false
name: 渐显开幕
resource_id: "6722343568188379661"
- effect_id: "634067"
has_params: true
icon_url: ""
is_vip: false
name: 渐渐放大
resource_id: "6730912024596845063"
- effect_id: "634039"
has_params: true
icon_url: ""
is_vip: false
name: 渐隐闭幕
resource_id: "6723050814006366734"
- effect_id: "1220300"
has_params: true
icon_url: ""
is_vip: false
name: 温柔细闪
resource_id: "6995497812221760030"
- effect_id: "1187140"
has_params: false
icon_url: ""
is_vip: false
name: 游戏界面
resource_id: "6983877697524994567"
- effect_id: "1101078"
has_params: false
icon_url: ""
is_vip: false
name: 满屏问号
resource_id: "6950902993294201358"
- effect_id: "703229"
has_params: true
icon_url: ""
is_vip: false
name: 漏光噪点
resource_id: "6810944598874001934"
- effect_id: "634167"
has_params: true
icon_url: ""
is_vip: false
name: 火光
resource_id: "6748623656181568011"
- effect_id: "705085"
has_params: true
icon_url: ""
is_vip: false
name: 火光刷过
resource_id: "6803160938603090440"
- effect_id: "705033"
has_params: true
icon_url: ""
is_vip: false
name: 火光包围
resource_id: "6803162714148442632"
- effect_id: "703263"
has_params: true
icon_url: ""
is_vip: false
name: 火光翻滚
resource_id: "6809889314860700173"
- effect_id: "703265"
has_params: true
icon_url: ""
is_vip: false
name: 火光蔓延
resource_id: "6803162375148016135"
- effect_id: "634709"
has_params: true
icon_url: ""
is_vip: false
name: 灵魂出窍
resource_id: "6706773500784284172"
- effect_id: "634091"
has_params: true
icon_url: ""
is_vip: false
name: 炫彩
resource_id: "6732693992225378828"
- effect_id: "1145374"
has_params: true
icon_url: ""
is_vip: false
name: 炫彩 II
resource_id: "6933131104274616840"
- effect_id: "635073"
has_params: true
icon_url: ""
is_vip: false
name: 烟花
resource_id: "6782461740274684424"
- effect_id: "1373018"
has_params: true
icon_url: ""
is_vip: false
name: 烟花 II
resource_id: "7010666068997837342"
- effect_id: "1522424"
has_params: true
icon_url: ""
is_vip: false
name: 烟花 III
resource_id: "7052201781241057805"
- effect_id: "634145"
has_params: true
icon_url: ""
is_vip: false
name: 烟雾
resource_id: "6733145063997575694"
- effect_id: "703261"
has_params: true
icon_url: ""
is_vip: false
name: 烟雾炸开
resource_id: "6804317747351130638"
- effect_id: "635067"
has_params: true
icon_url: ""
is_vip: false
name: 爆炸
resource_id: "6740540228194275844"
- effect_id: "965696"
has_params: true
icon_url: ""
is_vip: false
name: 爱心Kira
resource_id: "6896058666357625351"
- effect_id: "634133"
has_params: true
icon_url: ""
is_vip: false
name: 爱心bling
resource_id: "6709706255105004045"
- effect_id: "634135"
has_params: true
icon_url: ""
is_vip: false
name: 爱心光斑
resource_id: "6709706178340852236"
- effect_id: "634261"
has_params: true
icon_url: ""
is_vip: false
name: 爱心光斑 II
resource_id: "6791647108974776839"
- effect_id: "634191"
has_params: true
icon_url: ""
is_vip: false
name: 爱心光波
resource_id: "6746014633942848007"
- effect_id: "1031295"
has_params: true
icon_url: ""
is_vip: false
name: 爱心啵啵
resource_id: "6924869659476890125"
- effect_id: "703257"
has_params: true
icon_url: ""
is_vip: false
name: 爱心射线
resource_id: "6805099653730669070"
- effect_id: "741958"
has_params: true
icon_url: ""
is_vip: false
name: 爱心投影
resource_id: "6828020234876621325"
- effect_id: "1480898"
has_params: true
icon_url: ""
is_vip: false
name: 爱心方块
resource_id: "7041103714647544334"
- effect_id: "1033842"
has_params: true
icon_url: ""
is_vip: false
name: 爱心暗角
resource_id: "6925342127807271431"
- effect_id: "634235"
has_params: true
icon_url: ""
is_vip: false
name: 爱心气泡
resource_id: "6792405144655893005"
- effect_id: "949386"
has_params: true
icon_url: ""
is_vip: false
name: 爱心泡泡
resource_id: "6886709503136371207"
- effect_id: "824444"
has_params: true
icon_url: ""
is_vip: false
name: 爱心爆炸
resource_id: "6855563744123032071"
- effect_id: "634259"
has_params: true
icon_url: ""
is_vip: false
name: 爱心缤纷
resource_id: "6790534436153725448"
- effect_id: "634257"
has_params: true
icon_url: ""
is_vip: false
name: 爱心缤纷 II
resource_id: "6792092999468716558"
- effect_id: "634275"
has_params: true
icon_url: ""
is_vip: false
name: 爱心跳动
resource_id: "6790547496394297863"
- effect_id: "875970"
has_params: true
icon_url: ""
is_vip: false
name: 爱心跳动 II
resource_id: "6858138763290219021"
- effect_id: "634231"
has_params: true
icon_url: ""
is_vip: false
name: 爱心闪烁
resource_id: "6792109800135070222"
- effect_id: "1140082"
has_params: true
icon_url: ""
is_vip: false
name: 牛皮纸关闭
resource_id: "6966139059194303013"
- effect_id: "1140078"
has_params: true
icon_url: ""
is_vip: false
name: 牛皮纸打开
resource_id: "6966136913010889223"
- effect_id: "1140086"
has_params: false
icon_url: ""
is_vip: false
name: 牛皮纸边框 I
resource_id: "6966139444382405134"
- effect_id: "1140085"
has_params: false
icon_url: ""
is_vip: false
name: 牛皮纸边框 II
resource_id: "6966139579912950286"
- effect_id: "635051"
has_params: true
icon_url: ""
is_vip: false
name: 玫瑰花瓣
resource_id: "6734619627051028996"
- effect_id: "999326"
has_params: true
icon_url: ""
is_vip: false
name: 玻璃破碎
resource_id: "6912015453892121102"
- effect_id: "1552216"
has_params: true
icon_url: ""
is_vip: false
name: 甜心投影
resource_id: "7058961500060258847"
- effect_id: "972748"
has_params: true
icon_url: ""
is_vip: false
name: 生日快乐
resource_id: "6899747371593241096"
- effect_id: "703259"
has_params: true
icon_url: ""
is_vip: false
name: 电光包围
resource_id: "6809889225144537613"
- effect_id: "634975"
has_params: true
icon_url: ""
is_vip: false
name: 电光漩涡
resource_id: "6797341815377760782"
- effect_id: "785074"
has_params: true
icon_url: ""
is_vip: false
name: 电子屏
resource_id: "6847692508449739278"
- effect_id: "634789"
has_params: true
icon_url: ""
is_vip: false
name: 电影刮花
resource_id: "6722366799003783692"
- effect_id: "634029"
has_params: false
icon_url: ""
is_vip: false
name: 电影感
resource_id: "6719333680713568771"
- effect_id: "634083"
has_params: true
icon_url: ""
is_vip: false
name: 电影感画幅
resource_id: "6746135410218373646"
- effect_id: "1482288"
has_params: true
icon_url: ""
is_vip: false
name: 电脑桌面
resource_id: "7026619341839798820"
- effect_id: "634805"
has_params: true
icon_url: ""
is_vip: false
name: 电视关机
resource_id: "6719656840646365707"
- effect_id: "634807"
has_params: true
icon_url: ""
is_vip: false
name: 电视开机
resource_id: "6719661856434164237"
- effect_id: "815546"
has_params: true
icon_url: ""
is_vip: false
name: 电视彩虹屏
resource_id: "6852503085672043021"
- effect_id: "634803"
has_params: true
icon_url: ""
is_vip: false
name: 电视纹理
resource_id: "6763933311933878791"
- effect_id: "768176"
has_params: false
icon_url: ""
is_vip: false
name: 画展边框
resource_id: "6839527903424680456"
- effect_id: "1155426"
has_params: false
icon_url: ""
is_vip: false
name: 白噪点边框
resource_id: "6970599572976439839"
- effect_id: "898956"
has_params: true
icon_url: ""
is_vip: false
name: 白胶边框
resource_id: "6865979592264389127"
- effect_id: "1107244"
has_params: true
icon_url: ""
is_vip: false
name: 白色描边
resource_id: "6953169122649707045"
- effect_id: "634037"
has_params: true
icon_url: ""
is_vip: false
name: 白色渐显
resource_id: "6723790385069429262"
- effect_id: "904792"
has_params: true
icon_url: ""
is_vip: false
name: 白色爱心
resource_id: "6868556923503907342"
- effect_id: "635109"
has_params: false
icon_url: ""
is_vip: false
name: 白色线框
resource_id: "6753512551536923149"
- effect_id: "1164159"
has_params: false
icon_url: ""
is_vip: false
name: 白色边框
resource_id: "6974602583411266079"
- effect_id: "719380"
has_params: true
icon_url: ""
is_vip: false
name: 百叶窗
resource_id: "6823654892872143367"
- effect_id: "719404"
has_params: true
icon_url: ""
is_vip: false
name: 百叶窗 II
resource_id: "6823656768334205454"
- effect_id: "634941"
has_params: true
icon_url: ""
is_vip: false
name: 监控
resource_id: "6773542922030682632"
- effect_id: "1419276"
has_params: true
icon_url: ""
is_vip: false
name: 盗梦空间
resource_id: "7024053604596060680"
- effect_id: "886130"
has_params: true
icon_url: ""
is_vip: false
name: 盛世美颜
resource_id: "6860757421283873293"
- effect_id: "634051"
has_params: false
icon_url: ""
is_vip: false
name: 相机网格
resource_id: "6725730715138265612"
- effect_id: "635093"
has_params: true
icon_url: ""
is_vip: false
name: 相纸
resource_id: "6713856991086776835"
- effect_id: "979300"
has_params: true
icon_url: ""
is_vip: false
name: 瞬间模糊
resource_id: "6903409009210954253"
- effect_id: "1499079"
has_params: true
icon_url: ""
is_vip: false
name: 破冰
resource_id: "7047049192832766477"
- effect_id: "634027"
has_params: true
icon_url: ""
is_vip: false
name: 磨砂纹理
resource_id: "6732693826135134734"
- effect_id: "40453164"
has_params: true
icon_url: ""
is_vip: false
name: 祝福环绕
resource_id: "7324617866056045106"
- effect_id: "1024408"
has_params: true
icon_url: ""
is_vip: false
name: 福气满满
resource_id: "6922029632040473095"
- effect_id: "1352364"
has_params: false
icon_url: ""
is_vip: false
name: 秋日暖黄
resource_id: "7005090271696261640"
- effect_id: "1404120"
has_params: true
icon_url: ""
is_vip: false
name: 空灵
resource_id: "7021096050899292680"
- effect_id: "634781"
has_params: true
icon_url: ""
is_vip: false
name: 窗格
resource_id: "6719656757175521800"
- effect_id: "719378"
has_params: true
icon_url: ""
is_vip: false
name: 窗格光
resource_id: "6823659309428118030"
- effect_id: "1475188"
has_params: true
icon_url: ""
is_vip: false
name: 简约边框
resource_id: "7039329234170417701"
- effect_id: "1579942"
has_params: true
icon_url: ""
is_vip: false
name: 箭头放大镜
resource_id: "7067461440960991752"
- effect_id: "770876"
has_params: true
icon_url: ""
is_vip: false
name: 粉红老电视
resource_id: "6839596824936845838"
- effect_id: "1193772"
has_params: false
icon_url: ""
is_vip: false
name: 粉红芭比边框
resource_id: "6986591867999621668"
- effect_id: "881784"
has_params: true
icon_url: ""
is_vip: false
name: 粉色闪粉
resource_id: "6858953149974057486"
- effect_id: "1365502"
has_params: false
icon_url: ""
is_vip: false
name: 粉黄渐变
resource_id: "7008413208721494559"
- effect_id: "1146790"
has_params: true
icon_url: ""
is_vip: false
name: 精灵闪粉
resource_id: "6967274435963261476"
- effect_id: "16609879"
has_params: true
icon_url: ""
is_vip: false
name: 精细锐化
resource_id: "7250368600911909413"
- effect_id: "634217"
has_params: true
icon_url: ""
is_vip: false
name: 糖果纸
resource_id: "6782100631638249998"
- effect_id: "1195758"
has_params: false
icon_url: ""
is_vip: false
name: 紫色波纹
resource_id: "6987321998036701704"
- effect_id: "1007834"
has_params: true
icon_url: ""
is_vip: false
name: 紫色负片
resource_id: "6915313694884762125"
- effect_id: "948716"
has_params: true
icon_url: ""
is_vip: false
name: 紫雾
resource_id: "6886335679681270279"
- effect_id: "768166"
has_params: true
icon_url: ""
is_vip: false
name: 繁星点点
resource_id: "6839577027939406344"
- effect_id: "1373928"
has_params: false
icon_url: ""
is_vip: false
name: 红晕
resource_id: "7011032152380805640"
- effect_id: "931824"
has_params: false
icon_url: ""
is_vip: false
name: 纵向开幕
resource_id: "6876338988437737997"
- effect_id: "634137"
has_params: true
icon_url: ""
is_vip: false
name: 纵向模糊
resource_id: "6716684911840858628"
- effect_id: "1181888"
has_params: false
icon_url: ""
is_vip: false
name: 纸膜边框 I
resource_id: "6981464043542286879"
- effect_id: "1181886"
has_params: false
icon_url: ""
is_vip: false
name: 纸膜边框 II
resource_id: "6981464169736311327"
- effect_id: "784032"
has_params: true
icon_url: ""
is_vip: false
name: 纸质撕边
resource_id: "6843686214025875981"
- effect_id: "780656"
has_params: true
icon_url: ""
is_vip: false
name: 纸质边框
resource_id: "6844765419853582856"
- effect_id: "780658"
has_params: false
icon_url: ""
is_vip: false
name: 纸质边框 II
resource_id: "6844832937272152589"
- effect_id: "1511534"
has_params: true
icon_url: ""
is_vip: false
name: 纸醉金迷
resource_id: "7050402737174876702"
- effect_id: "785536"
has_params: true
icon_url: ""
is_vip: false
name: 细闪
resource_id: "6847773569435308558"
- effect_id: "959412"
has_params: true
icon_url: ""
is_vip: false
name: 细闪 II
resource_id: "6893002658420888078"
- effect_id: "1134290"
has_params: true
icon_url: ""
is_vip: false
name: 细闪 III
resource_id: "6963598424113418783"
- effect_id: "787752"
has_params: true
icon_url: ""
is_vip: false
name: 美式
resource_id: "6849214832856535560"
- effect_id: "774972"
has_params: true
icon_url: ""
is_vip: false
name: 美式 II
resource_id: "6843320153900323335"
- effect_id: "774968"
has_params: true
icon_url: ""
is_vip: false
name: 美式 III
resource_id: "6843319785522991623"
- effect_id: "812078"
has_params: true
icon_url: ""
is_vip: false
name: 美式 IV
resource_id: "6850006476472193543"
- effect_id: "787968"
has_params: true
icon_url: ""
is_vip: false
name: 美式 V
resource_id: "6849225862588404237"
- effect_id: "1181360"
has_params: true
icon_url: ""
is_vip: false
name: 美漫
resource_id: "6981339244547543560"
- effect_id: "634295"
has_params: true
icon_url: ""
is_vip: false
name: 羽毛
resource_id: "6709706658815152643"
- effect_id: "703231"
has_params: true
icon_url: ""
is_vip: false
name: 老照片
resource_id: "6815764475375784462"
- effect_id: "703233"
has_params: true
icon_url: ""
is_vip: false
name: 老照片 II
resource_id: "6815767788490068494"
- effect_id: "719374"
has_params: true
icon_url: ""
is_vip: false
name: 老照片 III
resource_id: "6813924503148564999"
- effect_id: "635095"
has_params: true
icon_url: ""
is_vip: false
name: 老电影
resource_id: "6706773498506777095"
- effect_id: "898674"
has_params: true
icon_url: ""
is_vip: false
name: 老电影 II
resource_id: "6865921078858879496"
- effect_id: "634771"
has_params: true
icon_url: ""
is_vip: false
name: 老电视卡顿
resource_id: "6706773499052036615"
- effect_id: "634081"
has_params: true
icon_url: ""
is_vip: false
name: 聚光灯
resource_id: "6750075966053159427"
- effect_id: "635083"
has_params: true
icon_url: ""
is_vip: false
name: 聚焦
resource_id: "6710056993287049742"
- effect_id: "1102990"
has_params: false
icon_url: ""
is_vip: false
name: 胡言乱语
resource_id: "6951364520048595492"
- effect_id: "635097"
has_params: true
icon_url: ""
is_vip: false
name: 胶片
resource_id: "6708624565657932292"
- effect_id: "635087"
has_params: true
icon_url: ""
is_vip: false
name: 胶片 II
resource_id: "6710090540643258891"
- effect_id: "773562"
has_params: true
icon_url: ""
is_vip: false
name: 胶片 III
resource_id: "6841053178406900231"
- effect_id: "966552"
has_params: true
icon_url: ""
is_vip: false
name: 胶片 IV
resource_id: "6896439221179912718"
- effect_id: "1625760"
has_params: true
icon_url: ""
is_vip: false
name: 胶片抖动
resource_id: "7075213848558440990"
- effect_id: "744244"
has_params: true
icon_url: ""
is_vip: false
name: 胶片显影
resource_id: "6830336944111620616"
- effect_id: "1164161"
has_params: false
icon_url: ""
is_vip: false
name: 胶片框
resource_id: "6974600629268255262"
- effect_id: "1164162"
has_params: false
icon_url: ""
is_vip: false
name: 胶片框 II
resource_id: "6974600475999998477"
- effect_id: "1196596"
has_params: true
icon_url: ""
is_vip: false
name: 胶片框 III
resource_id: "6987714956401578510"
- effect_id: "705083"
has_params: true
icon_url: ""
is_vip: false
name: 胶片漏光
resource_id: "6815093106841489934"
- effect_id: "718872"
has_params: true
icon_url: ""
is_vip: false
name: 胶片漏光 II
resource_id: "6814743838964322829"
- effect_id: "1218011"
has_params: true
icon_url: ""
is_vip: false
name: 胶片连拍
resource_id: "6994787976613990925"
- effect_id: "774970"
has_params: true
icon_url: ""
is_vip: false
name: 自然
resource_id: "6843319885339038216"
- effect_id: "773090"
has_params: true
icon_url: ""
is_vip: false
name: 自然 II
resource_id: "6841460795394494990"
- effect_id: "775998"
has_params: true
icon_url: ""
is_vip: false
name: 自然 III
resource_id: "6843680748856152584"
- effect_id: "776000"
has_params: true
icon_url: ""
is_vip: false
name: 自然 IV
resource_id: "6843680812584407559"
- effect_id: "774966"
has_params: true
icon_url: ""
is_vip: false
name: 自然 V
resource_id: "6843319715499086343"
- effect_id: "634059"
has_params: true
icon_url: ""
is_vip: false
name: 色差
resource_id: "6706773498561303044"
- effect_id: "904723"
has_params: true
icon_url: ""
is_vip: false
name: 色差开幕
resource_id: "6868546720783929870"
- effect_id: "945036"
has_params: true
icon_url: ""
is_vip: false
name: 色差放大
resource_id: "6883360769992299016"
- effect_id: "634777"
has_params: true
icon_url: ""
is_vip: false
name: 色差放射
resource_id: "6716422405511713287"
- effect_id: "634773"
has_params: true
icon_url: ""
is_vip: false
name: 色差故障
resource_id: "6706773498922013191"
- effect_id: "634769"
has_params: true
icon_url: ""
is_vip: false
name: 色差故障 II
resource_id: "6706773498561319428"
- effect_id: "982304"
has_params: true
icon_url: ""
is_vip: false
name: 色差星闪
resource_id: "6904921853635072520"
- effect_id: "634793"
has_params: true
icon_url: ""
is_vip: false
name: 色差默片
resource_id: "6719362972239532548"
- effect_id: "987446"
has_params: true
icon_url: ""
is_vip: false
name: 节日彩带
resource_id: "6907438556793278983"
- effect_id: "634223"
has_params: true
icon_url: ""
is_vip: false
name: 花火
resource_id: "6767147410671014407"
- effect_id: "986478"
has_params: true
icon_url: ""
is_vip: false
name: 花火 II
resource_id: "6907051960180937229"
- effect_id: "635059"
has_params: true
icon_url: ""
is_vip: false
name: 花瓣飘落
resource_id: "6796905369932141064"
- effect_id: "635057"
has_params: true
icon_url: ""
is_vip: false
name: 花瓣飞扬
resource_id: "6796903619762328072"
- effect_id: "4493526"
has_params: true
icon_url: ""
is_vip: false
name: 荡漾 II
resource_id: "7140929198763282980"
- effect_id: "73935190"
has_params: false
icon_url: ""
is_vip: false
name: 荡秋千
resource_id: "7388040405465436722"
- effect_id: "1482382"
has_params: true
icon_url: ""
is_vip: false
name: 荧光扫描
resource_id: "7041474808986472967"
- effect_id: "634227"
has_params: true
icon_url: ""
is_vip: false
name: 荧光爱心
resource_id: "6792095053360665096"
- effect_id: "634945"
has_params: true
icon_url: ""
is_vip: false
name: 荧光线描
resource_id: "6795826477590909454"
- effect_id: "875968"
has_params: true
icon_url: ""
is_vip: false
name: 荧光绿
resource_id: "6858138988834722312"
- effect_id: "948715"
has_params: true
icon_url: ""
is_vip: false
name: 荧光蝙蝠
resource_id: "6886339116561076749"
- effect_id: "634779"
has_params: true
icon_url: ""
is_vip: false
name: 荧幕噪点
resource_id: "6706773534066086413"
- effect_id: "703253"
has_params: true
icon_url: ""
is_vip: false
name: 荧幕噪点 II
resource_id: "6803161742789579277"
- effect_id: "634107"
has_params: true
icon_url: ""
is_vip: false
name: 萤光
resource_id: "6715209844216828420"
- effect_id: "932242"
has_params: true
icon_url: ""
is_vip: false
name: 萤光飞舞
resource_id: "6877098783209951751"
- effect_id: "1357502"
has_params: true
icon_url: ""
is_vip: false
name: 萤火
resource_id: "7006265184050221576"
- effect_id: "635043"
has_params: true
icon_url: ""
is_vip: false
name: 落叶
resource_id: "6740863535674298888"
- effect_id: "1031296"
has_params: true
icon_url: ""
is_vip: false
name: 落樱
resource_id: "6924859706661933576"
- effect_id: "634147"
has_params: true
icon_url: ""
is_vip: false
name: 蒸汽波
resource_id: "6719658860539286020"
- effect_id: "747926"
has_params: true
icon_url: ""
is_vip: false
name: 蒸汽波投影
resource_id: "6830351103272423949"
- effect_id: "755808"
has_params: true
icon_url: ""
is_vip: false
name: 蒸汽波路灯
resource_id: "6829184472349413895"
- effect_id: "961482"
has_params: true
icon_url: ""
is_vip: false
name: 蒸汽腾腾
resource_id: "6894200076227318286"
- effect_id: "17710554"
has_params: true
icon_url: ""
is_vip: false
name: 蓝光扫描
resource_id: "7254126209540297274"
- effect_id: "1019968"
has_params: true
icon_url: ""
is_vip: false
name: 蓝线模糊
resource_id: "6920136330563293704"
- effect_id: "1005838"
has_params: true
icon_url: ""
is_vip: false
name: 蓝色负片
resource_id: "6914996050382033421"
- effect_id: "1201878"
has_params: false
icon_url: ""
is_vip: false
name: 蓝色闪电边框
resource_id: "6989911842575356446"
- effect_id: "8311325"
has_params: true
icon_url: ""
is_vip: false
name: 蔡国强烟花
resource_id: "7187218013710455354"
- effect_id: "634065"
has_params: true
icon_url: ""
is_vip: false
name: 虚化
resource_id: "6756397840785740295"
- effect_id: "953420"
has_params: true
icon_url: ""
is_vip: false
name: 蝙蝠Kira
resource_id: "6888977985697747463"
- effect_id: "634157"
has_params: true
icon_url: ""
is_vip: false
name: 蝴蝶
resource_id: "6706773499836404228"
- effect_id: "634155"
has_params: true
icon_url: ""
is_vip: false
name: 蝴蝶 II
resource_id: "6747586717672280584"
- effect_id: "634183"
has_params: true
icon_url: ""
is_vip: false
name: 蝴蝶光斑
resource_id: "6748307256959308299"
- effect_id: "634177"
has_params: true
icon_url: ""
is_vip: false
name: 蝶舞
resource_id: "6747946665312784910"
- effect_id: "15249743"
has_params: true
icon_url: ""
is_vip: false
name: 表面模糊
resource_id: "7244073793562350140"
- effect_id: "1082654"
has_params: false
icon_url: ""
is_vip: false
name: 裂开了
resource_id: "6944914067702157861"
- effect_id: "634747"
has_params: true
icon_url: ""
is_vip: false
name: 视频分割
resource_id: "6729023693739004419"
- effect_id: "635135"
has_params: false
icon_url: ""
is_vip: false
name: 视频界面
resource_id: "6752799091941446147"
- effect_id: "1408118"
has_params: true
icon_url: ""
is_vip: false
name: 诡异分割
resource_id: "7021800634621891109"
- effect_id: "892686"
has_params: true
icon_url: ""
is_vip: false
name: 负片闪烁
resource_id: "6863353894152442375"
- effect_id: "1020906"
has_params: true
icon_url: ""
is_vip: false
name: 财富满满
resource_id: "6920520407179072007"
- effect_id: "1036164"
has_params: true
icon_url: ""
is_vip: false
name: 财富满满 II
resource_id: "6925663127845474830"
- effect_id: "1543072"
has_params: false
icon_url: ""
is_vip: false
name: 赞赞赞
resource_id: "7057055647472292359"
- effect_id: "634733"
has_params: true
icon_url: ""
is_vip: false
name: 蹦迪光
resource_id: "6716419849544798723"
- effect_id: "634731"
has_params: true
icon_url: ""
is_vip: false
name: 蹦迪彩光
resource_id: "6716450942285255182"
- effect_id: "1381596"
has_params: false
icon_url: ""
is_vip: false
name: 车窗
resource_id: "7012926200767058463"
- effect_id: "761222"
has_params: true
icon_url: ""
is_vip: false
name: 车窗影
resource_id: "6834006887415943694"
- effect_id: "18798726"
has_params: true
icon_url: ""
is_vip: false
name: 轻微抖动
resource_id: "7258208250896585274"
- effect_id: "634077"
has_params: true
icon_url: ""
is_vip: false
name: 轻微放大
resource_id: "6791743223522923021"
- effect_id: "634749"
has_params: true
icon_url: ""
is_vip: false
name: 边缘glitch
resource_id: "6777238992816443912"
- effect_id: "634757"
has_params: true
icon_url: ""
is_vip: false
name: 边缘加色
resource_id: "6781315516909752844"
- effect_id: "634755"
has_params: true
icon_url: ""
is_vip: false
name: 边缘加色 II
resource_id: "6790180635555140109"
- effect_id: "974844"
has_params: true
icon_url: ""
is_vip: false
name: 边缘加色 III
resource_id: "6901190770473046535"
- effect_id: "634069"
has_params: true
icon_url: ""
is_vip: false
name: 边缘发光
resource_id: "6769065553207235086"
- effect_id: "977454"
has_params: true
icon_url: ""
is_vip: false
name: 边缘荧光
resource_id: "6903064458008990215"
- effect_id: "1188619"
has_params: true
icon_url: ""
is_vip: false
name: 运动一夏
resource_id: "6984393713208267301"
- effect_id: "634739"
has_params: true
icon_url: ""
is_vip: false
name: 迪斯科
resource_id: "6756113382840996360"
- effect_id: "634089"
has_params: true
icon_url: ""
is_vip: false
name: 迷幻烟雾
resource_id: "6719661667447214605"
- effect_id: "634721"
has_params: true
icon_url: ""
is_vip: false
name: 迷离
resource_id: "6706773549362713095"
- effect_id: "950488"
has_params: true
icon_url: ""
is_vip: false
name: 迷雾
resource_id: "6887505634791526926"
- effect_id: "1218244"
has_params: true
icon_url: ""
is_vip: false
name: 逆光对焦
resource_id: "6992032047959118344"
- effect_id: "635081"
has_params: false
icon_url: ""
is_vip: false
name: 选中框
resource_id: "6712358020417851917"
- effect_id: "1382084"
has_params: true
icon_url: ""
is_vip: false
name: 邮票边框
resource_id: "7012988323387937293"
- effect_id: "1493772"
has_params: true
icon_url: ""
is_vip: false
name: 金属背景
resource_id: "7044853948456374814"
- effect_id: "634229"
has_params: true
icon_url: ""
is_vip: false
name: 金片
resource_id: "6771299796058640908"
- effect_id: "1030626"
has_params: true
icon_url: ""
is_vip: false
name: 金片 II
resource_id: "6924589854269379079"
- effect_id: "972750"
has_params: true
icon_url: ""
is_vip: false
name: 金片炸开
resource_id: "6899747182816006669"
- effect_id: "631215"
has_params: true
icon_url: ""
is_vip: false
name: 金粉
resource_id: "6709706378702754312"
- effect_id: "634289"
has_params: true
icon_url: ""
is_vip: false
name: 金粉 II
resource_id: "6774672940651778573"
- effect_id: "1188618"
has_params: true
icon_url: ""
is_vip: false
name: 金粉 III
resource_id: "6984393847467938335"
- effect_id: "987445"
has_params: true
icon_url: ""
is_vip: false
name: 金粉撒落
resource_id: "6907439016547717646"
- effect_id: "1452336"
has_params: true
icon_url: ""
is_vip: false
name: 金粉旋转
resource_id: "7033654301050278431"
- effect_id: "703245"
has_params: true
icon_url: ""
is_vip: false
name: 金粉聚拢
resource_id: "6806254339821146637"
- effect_id: "1453820"
has_params: true
icon_url: ""
is_vip: false
name: 金粉闪闪
resource_id: "7034048554318434830"
- effect_id: "634097"
has_params: true
icon_url: ""
is_vip: false
name: 钻光
resource_id: "6723824479216079368"
- effect_id: "1639618"
has_params: true
icon_url: ""
is_vip: false
name: 钻石碎片
resource_id: "7077487066476450340"
- effect_id: "1115964"
has_params: false
icon_url: ""
is_vip: false
name: 镜像
resource_id: "6956148985400660517"
- effect_id: "904724"
has_params: true
icon_url: ""
is_vip: false
name: 镜头变焦
resource_id: "6868546663607177736"
- effect_id: "1480896"
has_params: true
icon_url: ""
is_vip: false
name: 镭射边框
resource_id: "7041103833056940574"
- effect_id: "1235644"
has_params: true
icon_url: ""
is_vip: false
name: 长虹玻璃
resource_id: "6992081595976913416"
- effect_id: "634185"
has_params: true
icon_url: ""
is_vip: false
name: 闪亮登场
resource_id: "6760547949349966350"
- effect_id: "958186"
has_params: true
icon_url: ""
is_vip: false
name: 闪亮登场 II
resource_id: "6891946116212855303"
- effect_id: "777760"
has_params: true
icon_url: ""
is_vip: false
name: 闪光灯 Ⅰ
resource_id: "6844432942563856904"
- effect_id: "19279654"
has_params: true
icon_url: ""
is_vip: false
name: 闪光震动
resource_id: "7260437169389441597"
- effect_id: "634725"
has_params: true
icon_url: ""
is_vip: false
name: 闪动
resource_id: "6717639344577843725"
- effect_id: "634181"
has_params: true
icon_url: ""
is_vip: false
name: 闪动光斑
resource_id: "6753169731617821191"
- effect_id: "634729"
has_params: true
icon_url: ""
is_vip: false
name: 闪屏
resource_id: "6758298031608566280"
- effect_id: "635069"
has_params: true
icon_url: ""
is_vip: false
name: 闪电
resource_id: "6734215409513271820"
- effect_id: "634761"
has_params: true
icon_url: ""
is_vip: false
name: 闪白
resource_id: "6706773500792672781"
- effect_id: "634219"
has_params: true
icon_url: ""
is_vip: false
name: 闪耀星光
resource_id: "6784346950385799694"
- effect_id: "909546"
has_params: true
icon_url: ""
is_vip: false
name: 闪闪
resource_id: "6869625970437919246"
- effect_id: "1382870"
has_params: true
icon_url: ""
is_vip: false
name: 闪闪发光 II
resource_id: "7013264306959553060"
- effect_id: "892171"
has_params: true
icon_url: ""
is_vip: false
name: 闪黑
resource_id: "6863327462470717960"
- effect_id: "12078089"
has_params: true
icon_url: ""
is_vip: false
name: 闪黑II
resource_id: "7221377929467400765"
- effect_id: "634035"
has_params: false
icon_url: ""
is_vip: false
name: 闭幕
resource_id: "6725685146323784205"
- effect_id: "634033"
has_params: false
icon_url: ""
is_vip: false
name: 闭幕 II
resource_id: "6729065630013592067"
- effect_id: "1427664"
has_params: true
icon_url: ""
is_vip: false
name: 随机色块
resource_id: "7026674824537707038"
- effect_id: "1441868"
has_params: true
icon_url: ""
is_vip: false
name: 随机色块 II
resource_id: "7030742849134006792"
- effect_id: "1206444"
has_params: true
icon_url: ""
is_vip: false
name: 随机裁剪
resource_id: "6991794787464516127"
- effect_id: "1400804"
has_params: true
icon_url: ""
is_vip: false
name: 隐形人
resource_id: "7020318315310486046"
- effect_id: "1168118"
has_params: true
icon_url: ""
is_vip: false
name: 隔行扫描
resource_id: "6976152376457564708"
- effect_id: "635041"
has_params: true
icon_url: ""
is_vip: false
name: 雨滴晕开
resource_id: "6792488562869670414"
- effect_id: "6431703"
has_params: true
icon_url: ""
is_vip: false
name: 雪窗
resource_id: "7168743948528128548"
- effect_id: "1441796"
has_params: true
icon_url: ""
is_vip: false
name: 雪花
resource_id: "7030728702258319909"
- effect_id: "634203"
has_params: true
icon_url: ""
is_vip: false
name: 雪花冲屏
resource_id: "6769435378806952455"
- effect_id: "634045"
has_params: true
icon_url: ""
is_vip: false
name: 雪花开幕
resource_id: "6730429759425090059"
- effect_id: "785064"
has_params: true
icon_url: ""
is_vip: false
name: 雪花故障
resource_id: "6847689727261282824"
- effect_id: "634201"
has_params: true
icon_url: ""
is_vip: false
name: 雪花细闪
resource_id: "6770604155561054734"
- effect_id: "6470260"
has_params: true
icon_url: ""
is_vip: false
name: 零点解锁
resource_id: "6907054642123772430"
- effect_id: "635049"
has_params: true
icon_url: ""
is_vip: false
name: 雾气
resource_id: "6734619830449607171"
- effect_id: "635045"
has_params: true
icon_url: ""
is_vip: false
name: 雾气 II
resource_id: "6740539818666627588"
- effect_id: "635065"
has_params: true
icon_url: ""
is_vip: false
name: 雾气光线
resource_id: "6715209712129806851"
- effect_id: "634075"
has_params: true
icon_url: ""
is_vip: false
name: 震动
resource_id: "6761645818723176968"
- effect_id: "1552220"
has_params: true
icon_url: ""
is_vip: false
name: 霓虹投影
resource_id: "7058961173743407630"
- effect_id: "1034626"
has_params: true
icon_url: ""
is_vip: false
name: 霓虹摇摆
resource_id: "6925387220073320974"
- effect_id: "742028"
has_params: true
icon_url: ""
is_vip: false
name: 霓虹灯
resource_id: "6829182808485794311"
- effect_id: "1113432"
has_params: false
icon_url: ""
is_vip: false
name: 预警
resource_id: "6955083255825568264"
- effect_id: "892172"
has_params: true
icon_url: ""
is_vip: false
name: 颤抖
resource_id: "6863326875649839623"
- effect_id: "634153"
has_params: true
icon_url: ""
is_vip: false
name: 飘落花瓣
resource_id: "6719658795661791747"
- effect_id: "634165"
has_params: true
icon_url: ""
is_vip: false
name: 飘落闪粉
resource_id: "6720029963602366979"
- effect_id: "634163"
has_params: true
icon_url: ""
is_vip: false
name: 飘落闪粉 II
resource_id: "6720029866504229390"
- effect_id: "635061"
has_params: false
icon_url: ""
is_vip: false
name: 飘雪
resource_id: "6732360625214722572"
- effect_id: "635055"
has_params: true
icon_url: ""
is_vip: false
name: 飘雪 II
resource_id: "6763531573594690061"
- effect_id: "1102992"
has_params: false
icon_url: ""
is_vip: false
name: 飞速计算
resource_id: "6951364383477862948"
- effect_id: "639477"
has_params: true
icon_url: ""
is_vip: false
name: 马赛克
resource_id: "6770564289074827784"
- effect_id: "1113136"
has_params: false
icon_url: ""
is_vip: false
name: 高光瞬间
resource_id: "6955021144156017188"
- effect_id: "705071"
has_params: true
icon_url: ""
is_vip: false
name: 魅力光束
resource_id: "6814668066882851335"
- effect_id: "1232490"
has_params: true
icon_url: ""
is_vip: false
name: 魔法
resource_id: "7000199435372204580"
- effect_id: "1136674"
has_params: true
icon_url: ""
is_vip: false
name: 魔法变身
resource_id: "6964608751231832613"
- effect_id: "1401520"
has_params: false
icon_url: ""
is_vip: false
name: 魔法边框
resource_id: "7020407234798555655"
- effect_id: "1408090"
has_params: false
icon_url: ""
is_vip: false
name: 魔法边框 II
resource_id: "7021795690149843463"
- effect_id: "901430"
has_params: true
icon_url: ""
is_vip: false
name: 鱼眼
resource_id: "6867722963865571854"
- effect_id: "1232996"
has_params: true
icon_url: ""
is_vip: false
name: 黄蓝星芒
resource_id: "7000312634574639653"
- effect_id: "1408072"
has_params: true
icon_url: ""
is_vip: false
name: 黑白VHS
resource_id: "7021795095900852772"
- effect_id: "635017"
has_params: false
icon_url: ""
is_vip: false
name: 黑白三格
resource_id: "6719657002571665934"
- effect_id: "634953"
has_params: true
icon_url: ""
is_vip: false
name: 黑白漫画
resource_id: "6795826673993388551"
- effect_id: "981864"
has_params: true
icon_url: ""
is_vip: false
name: 黑白漫画 II
resource_id: "6904876576735760904"
- effect_id: "634951"
has_params: true
icon_url: ""
is_vip: false
name: 黑白线描
resource_id: "6795430643154031111"
- effect_id: "1155300"
has_params: false
icon_url: ""
is_vip: false
name: 黑线故障
resource_id: "6970572741116170788"
- effect_id: "634151"
has_params: true
icon_url: ""
is_vip: false
name: 黑羽毛
resource_id: "6716441529084285454"
- effect_id: "634149"
has_params: true
icon_url: ""
is_vip: false
name: 黑羽毛 II
resource_id: "6751257389422350860"
- effect_id: "898866"
has_params: true
icon_url: ""
is_vip: false
name: 黑胶边框
resource_id: "6865958778265670151"
- effect_id: "952514"
has_params: true
icon_url: ""
is_vip: false
name: 黑色噪点
resource_id: "6888561214125773326"
- effect_id: "635123"
has_params: true
icon_url: ""
is_vip: false
name: 黑色老电视
resource_id: "6738276072246219277"
- effect_id: "39438457"
has_params: true
icon_url: ""
is_vip: true
name: 2024边框
resource_id: "7322367359967040037"
- effect_id: "101569751"
has_params: true
icon_url: ""
is_vip: true
name: 2025气球泡泡
resource_id: "7460731559339889203"
- effect_id: "87985393"
has_params: true
icon_url: ""
is_vip: true
name: 360运镜
resource_id: "7430701460901335603"
- effect_id: "89453641"
has_params: true
icon_url: ""
is_vip: true
name: 360运镜 II
resource_id: "7434813086239822387"
- effect_id: "101633856"
has_params: true
icon_url: ""
is_vip: true
name: 3D春联
resource_id: "7460821768022790665"
- effect_id: "98657836"
has_params: true
icon_url: ""
is_vip: true
name: 3D环绕
resource_id: "7452986473306919433"
- effect_id: "89952914"
has_params: true
icon_url: ""
is_vip: true
name: 3D环绕屏
resource_id: "7436018394580652553"
- effect_id: "31620429"
has_params: true
icon_url: ""
is_vip: true
name: Bling飘落
resource_id: "7306819369571455515"
- effect_id: "12744891"
has_params: true
icon_url: ""
is_vip: true
name: C300
resource_id: "7226241938649780793"
- effect_id: "11068675"
has_params: true
icon_url: ""
is_vip: true
name: IXUS
resource_id: "7213660933942415930"
- effect_id: "20434943"
has_params: true
icon_url: ""
is_vip: true
name: Ins描边
resource_id: "7265936765175730744"
- effect_id: "88353245"
has_params: true
icon_url: ""
is_vip: true
name: PASSION
resource_id: "7431776147530060314"
- effect_id: "26271784"
has_params: true
icon_url: ""
is_vip: true
name: S形运镜
resource_id: "7291263159023702584"
- effect_id: "12732403"
has_params: true
icon_url: ""
is_vip: true
name: W830
resource_id: "7226197862529372731"
- effect_id: "26002592"
has_params: true
icon_url: ""
is_vip: true
name: 一刀两断
resource_id: "7290460914174661177"
- effect_id: "59474165"
has_params: true
icon_url: ""
is_vip: true
name: 丁达尔旋焦
resource_id: "7361697260960223759"
- effect_id: "82495223"
has_params: true
icon_url: ""
is_vip: true
name: 万向镜像
resource_id: "7414043485189181978"
- effect_id: "96240756"
has_params: true
icon_url: ""
is_vip: true
name: 三段式黑白
resource_id: "7447351620641231369"
- effect_id: "101569718"
has_params: true
icon_url: ""
is_vip: true
name: 上上签
resource_id: "7460731920393966118"
- effect_id: "89190637"
has_params: true
icon_url: ""
is_vip: true
name: 下雨涟漪
resource_id: "7434055685576331786"
- effect_id: "21210786"
has_params: true
icon_url: ""
is_vip: true
name: 丝印涂鸦
resource_id: "7270068054040515131"
- effect_id: "71888371"
has_params: true
icon_url: ""
is_vip: true
name: 丝滑运镜
resource_id: "7382145257607008809"
- effect_id: "1594946"
has_params: true
icon_url: ""
is_vip: true
name: 两屏分割
resource_id: "7069602912057430558"
- effect_id: "12495253"
has_params: true
icon_url: ""
is_vip: true
name: 中轴旋转
resource_id: "7224407224460775994"
- effect_id: "97484026"
has_params: true
icon_url: ""
is_vip: true
name: 二次元运镜
resource_id: "7450031573962887731"
- effect_id: "24962948"
has_params: true
icon_url: ""
is_vip: true
name: 云朵绵绵
resource_id: "7287143540033851964"
- effect_id: "7318779"
has_params: true
icon_url: ""
is_vip: true
name: 五星好评
resource_id: "7176947440350663223"
- effect_id: "26216294"
has_params: true
icon_url: ""
is_vip: true
name: 交叉震闪
resource_id: "7291135461697786423"
- effect_id: "96135790"
has_params: true
icon_url: ""
is_vip: true
name: 仙女棒II
resource_id: "7447044441463853594"
- effect_id: "29478846"
has_params: true
icon_url: ""
is_vip: true
name: 低保真
resource_id: "7300933146923504178"
- effect_id: "26353150"
has_params: true
icon_url: ""
is_vip: true
name: 侧移模糊
resource_id: "7291553469180154423"
- effect_id: "96240755"
has_params: true
icon_url: ""
is_vip: true
name: 信号干扰
resource_id: "7447351621220045338"
- effect_id: "57670397"
has_params: true
icon_url: ""
is_vip: true
name: 倒带
resource_id: "7358381380687893027"
- effect_id: "1485906"
has_params: false
icon_url: ""
is_vip: true
name: 倒计时
resource_id: "7042501782014005773"
- effect_id: "99131598"
has_params: true
icon_url: ""
is_vip: true
name: 倒计时 III
resource_id: "7454157863196299802"
- effect_id: "97150131"
has_params: false
icon_url: ""
is_vip: true
name: 倒计时II
resource_id: "7449262940080837129"
- effect_id: "6940703"
has_params: true
icon_url: ""
is_vip: true
name: 假日闪闪 Ⅱ
resource_id: "7173558602580365838"
- effect_id: "14975389"
has_params: true
icon_url: ""
is_vip: true
name: 像素屏闪
resource_id: "7242581780866273850"
- effect_id: "50297398"
has_params: true
icon_url: ""
is_vip: true
name: 像素扫描
resource_id: "7345080472545792521"
- effect_id: "56071748"
has_params: true
icon_url: ""
is_vip: true
name: 像素拉伸 II
resource_id: "7355396055397044790"
- effect_id: "12385973"
has_params: true
icon_url: ""
is_vip: true
name: 像素排序
resource_id: "7223659432419267132"
- effect_id: "14523597"
has_params: true
icon_url: ""
is_vip: true
name: 像素故障
resource_id: "7239557281942082107"
- effect_id: "1552218"
has_params: true
icon_url: ""
is_vip: true
name: 像素爱心
resource_id: "7058961362550002212"
- effect_id: "52648474"
has_params: true
icon_url: ""
is_vip: true
name: 像素震闪
resource_id: "7349147660290363944"
- effect_id: "1500914"
has_params: true
icon_url: ""
is_vip: true
name: 光线扫描
resource_id: "7047492648587760142"
- effect_id: "17852396"
has_params: true
icon_url: ""
is_vip: true
name: 光线拖影
resource_id: "7254547939194835515"
- effect_id: "18636946"
has_params: true
icon_url: ""
is_vip: true
name: 光谱扫描
resource_id: "7257452387160298021"
- effect_id: "8571129"
has_params: true
icon_url: ""
is_vip: true
name: 兔个好彩头
resource_id: "7187795247936574013"
- effect_id: "8343041"
has_params: true
icon_url: ""
is_vip: true
name: 兔兔碎闪
resource_id: "7184326422612152887"
- effect_id: "8617039"
has_params: true
icon_url: ""
is_vip: true
name: 兔年红包
resource_id: "7189544276651414073"
- effect_id: "96135791"
has_params: false
icon_url: ""
is_vip: true
name: 全屏烟花
resource_id: "7447044440864068105"
- effect_id: "101570129"
has_params: true
icon_url: ""
is_vip: true
name: 全屏祝福语
resource_id: "7460729732548530698"
- effect_id: "15772481"
has_params: true
icon_url: ""
is_vip: true
name: 全息扫描
resource_id: "7246746366108504636"
- effect_id: "96240753"
has_params: true
icon_url: ""
is_vip: true
name: 分区显色
resource_id: "7447351620641231397"
- effect_id: "22335555"
has_params: true
icon_url: ""
is_vip: true
name: 分屏漏光
resource_id: "7276332732051886649"
- effect_id: "100675645"
has_params: true
icon_url: ""
is_vip: true
name: 剪纸窗花
resource_id: "7458222774511735305"
- effect_id: "52247519"
has_params: true
icon_url: ""
is_vip: true
name: 动态侦测
resource_id: "7348407437877056009"
- effect_id: "1570398"
has_params: true
icon_url: ""
is_vip: true
name: 动态格
resource_id: "7065593660921877028"
- effect_id: "5779099"
has_params: true
icon_url: ""
is_vip: true
name: 动感光束
resource_id: "7162091309375689223"
- effect_id: "47239575"
has_params: true
icon_url: ""
is_vip: true
name: 动感变焦
resource_id: "7338707315987583488"
- effect_id: "50636467"
has_params: true
icon_url: ""
is_vip: true
name: 动感扫光
resource_id: "7345724656642429452"
- effect_id: "43472640"
has_params: true
icon_url: ""
is_vip: true
name: 动感推镜
resource_id: "7330964667252085248"
- effect_id: "47905484"
has_params: true
icon_url: ""
is_vip: true
name: 动感竖线
resource_id: "7339899789795922468"
- effect_id: "48296868"
has_params: true
icon_url: ""
is_vip: true
name: 动感运镜
resource_id: "7340866533943415308"
- effect_id: "5508159"
has_params: true
icon_url: ""
is_vip: true
name: 十字模糊
resource_id: "7156060838334304775"
- effect_id: "26443872"
has_params: true
icon_url: ""
is_vip: true
name: 十字爆闪
resource_id: "7291868496558821915"
- effect_id: "12087461"
has_params: true
icon_url: ""
is_vip: true
name: 单向移动
resource_id: "7221408305871065661"
- effect_id: "28007443"
has_params: true
icon_url: ""
is_vip: true
name: 单彩渐变
resource_id: "7296751848508101158"
- effect_id: "3956309"
has_params: true
icon_url: ""
is_vip: true
name: 单色填充
resource_id: "7128329164314120717"
- effect_id: "1498082"
has_params: true
icon_url: ""
is_vip: true
name: 卡机
resource_id: "7046676785693463071"
- effect_id: "57459941"
has_params: true
icon_url: ""
is_vip: true
name: 卡通渲染
resource_id: "7358012370125328937"
- effect_id: "101601751"
has_params: true
icon_url: ""
is_vip: true
name: 卷轴打开
resource_id: "7460778048531468809"
- effect_id: "101633890"
has_params: true
icon_url: ""
is_vip: true
name: 厚卡纸
resource_id: "7460821872972665381"
- effect_id: "78211648"
has_params: true
icon_url: ""
is_vip: true
name: 原相机拉近
resource_id: "7400658188275552804"
- effect_id: "90036897"
has_params: true
icon_url: ""
is_vip: true
name: 原相机滤镜
resource_id: "7436273714724868646"
- effect_id: "90036894"
has_params: true
icon_url: ""
is_vip: true
name: 原相机缩放
resource_id: "7436273714724868634"
- effect_id: "80799118"
has_params: true
icon_url: ""
is_vip: true
name: 双重辉光
resource_id: "7408494348532191807"
- effect_id: "51997290"
has_params: true
icon_url: ""
is_vip: true
name: 发光 II
resource_id: "7347959501246435850"
- effect_id: "20444395"
has_params: true
icon_url: ""
is_vip: true
name: 发光HDR
resource_id: "7265989852099777061"
- effect_id: "4694121"
has_params: true
icon_url: ""
is_vip: true
name: 取景器
resource_id: "7145432172021682725"
- effect_id: "95320464"
has_params: true
icon_url: ""
is_vip: true
name: 变焦烟花
resource_id: "7445177785401741874"
- effect_id: "5418579"
has_params: true
icon_url: ""
is_vip: true
name: 变色狙击
resource_id: "7146096867544142367"
- effect_id: "18628864"
has_params: true
icon_url: ""
is_vip: true
name: 变色闪光
resource_id: "7257436414965453368"
- effect_id: "47074578"
has_params: true
icon_url: ""
is_vip: true
name: 变速推镜
resource_id: "7338347637009027618"
- effect_id: "53195413"
has_params: true
icon_url: ""
is_vip: true
name: 变速推镜II
resource_id: "7349154305045172736"
- effect_id: "97260688"
has_params: false
icon_url: ""
is_vip: true
name: 可爱圣诞
resource_id: "7449596462645645851"
- effect_id: "20662139"
has_params: true
icon_url: ""
is_vip: true
name: 可爱涂鸦
resource_id: "7267137261697765943"
- effect_id: "4884447"
has_params: true
icon_url: ""
is_vip: true
name: 吓到失魂
resource_id: "7149057547792552456"
- effect_id: "101947466"
has_params: false
icon_url: ""
is_vip: true
name: 哈哈镜
resource_id: "7461830381428281893"
- effect_id: "86397729"
has_params: true
icon_url: ""
is_vip: true
name: 噪点屏闪
resource_id: "7425529107548475955"
- effect_id: "4002845"
has_params: true
icon_url: ""
is_vip: true
name: 噪片映射
resource_id: "7130233403898597902"
- effect_id: "28683046"
has_params: true
icon_url: ""
is_vip: true
name: 圆形分屏
resource_id: "7298664552793641522"
- effect_id: "95041383"
has_params: true
icon_url: ""
is_vip: true
name: 圆形烟花
resource_id: "7444470107008406066"
- effect_id: "79985522"
has_params: true
icon_url: ""
is_vip: true
name: 圆形监控
resource_id: "7405798478032409125"
- effect_id: "96135792"
has_params: true
icon_url: ""
is_vip: true
name: 圣诞CD
resource_id: "7447044441430299173"
- effect_id: "95320466"
has_params: true
icon_url: ""
is_vip: true
name: 圣诞Kira
resource_id: "7445177785401741850"
- effect_id: "32448752"
has_params: true
icon_url: ""
is_vip: true
name: 圣诞日记
resource_id: "7308639868085604901"
- effect_id: "95041382"
has_params: true
icon_url: ""
is_vip: true
name: 圣诞明信片
resource_id: "7444470107041960485"
- effect_id: "95912239"
has_params: true
icon_url: ""
is_vip: true
name: 圣诞边框
resource_id: "7446622476928307762"
- effect_id: "97032429"
has_params: true
icon_url: ""
is_vip: true
name: 圣诞限定
resource_id: "7448898555621675529"
- effect_id: "80123254"
has_params: true
icon_url: ""
is_vip: true
name: 复古半调
resource_id: "7406210463857381925"
- effect_id: "21148898"
has_params: true
icon_url: ""
is_vip: true
name: 复古彩虹
resource_id: "7269735872445026877"
- effect_id: "20159886"
has_params: true
icon_url: ""
is_vip: true
name: 复古拼贴
resource_id: "7264510800415429177"
- effect_id: "80123827"
has_params: false
icon_url: ""
is_vip: true
name: 复古撕纸
resource_id: "7406211198057714203"
- effect_id: "80122613"
has_params: false
icon_url: ""
is_vip: true
name: 复古电视
resource_id: "7406209423548355081"
- effect_id: "96135789"
has_params: true
icon_url: ""
is_vip: true
name: 复古电视机
resource_id: "7447044440859873802"
- effect_id: "21870120"
has_params: true
icon_url: ""
is_vip: true
name: 复古紫调
resource_id: "7273707462107075130"
- effect_id: "7308411"
has_params: true
icon_url: ""
is_vip: true
name: 复古红调
resource_id: "7170897764744696356"
- effect_id: "92005922"
has_params: false
icon_url: ""
is_vip: true
name: 复古辉光
resource_id: "7439255870900277811"
- effect_id: "90036896"
has_params: true
icon_url: ""
is_vip: true
name: 复古边框
resource_id: "7436273714729062938"
- effect_id: "1644374"
has_params: true
icon_url: ""
is_vip: true
name: 复古连拍
resource_id: "7078198448045953572"
- effect_id: "1475376"
has_params: true
icon_url: ""
is_vip: true
name: 复古闪闪
resource_id: "7039549945338139150"
- effect_id: "49278125"
has_params: true
icon_url: ""
is_vip: true
name: 复古频闪
resource_id: "7343141676828856844"
- effect_id: "101569841"
has_params: true
icon_url: ""
is_vip: true
name: 大字祝福
resource_id: "7460730608377926195"
- effect_id: "101483768"
has_params: true
icon_url: ""
is_vip: true
name: 大爆竹
resource_id: "7460441486266470938"
- effect_id: "8556597"
has_params: true
icon_url: ""
is_vip: true
name: 失焦CCD
resource_id: "7189438884340568633"
- effect_id: "23238701"
has_params: true
icon_url: ""
is_vip: true
name: 失焦光斑
resource_id: "7280121081208246845"
- effect_id: "96240758"
has_params: true
icon_url: ""
is_vip: true
name: 夸张信号
resource_id: "7447351620645425691"
- effect_id: "39287043"
has_params: true
icon_url: ""
is_vip: true
name: 定格祝福
resource_id: "7321603111791890982"
- effect_id: "63011918"
has_params: true
icon_url: ""
is_vip: true
name: 实况开幕
resource_id: "7367289783153857024"
- effect_id: "77292235"
has_params: true
icon_url: ""
is_vip: true
name: 密码解锁
resource_id: "7398180847427260963"
- effect_id: "9034919"
has_params: true
icon_url: ""
is_vip: true
name: 对焦DV
resource_id: "7195792007309038117"
- effect_id: "29684830"
has_params: true
icon_url: ""
is_vip: true
name: 局部推镜
resource_id: "7301528497577529906"
- effect_id: "1482682"
has_params: true
icon_url: ""
is_vip: true
name: 局部色彩
resource_id: "7041515097927193125"
- effect_id: "21899077"
has_params: true
icon_url: ""
is_vip: true
name: 居中闪切
resource_id: "7273800436128158264"
- effect_id: "3529421"
has_params: true
icon_url: ""
is_vip: true
name: 屏幕律动
resource_id: "7119437097697546782"
- effect_id: "46674042"
has_params: true
icon_url: ""
is_vip: true
name: 幻动光斑
resource_id: "7337641482376974883"
- effect_id: "1005744"
has_params: true
icon_url: ""
is_vip: true
name: 幻彩故障
resource_id: "6912383907191067149"
- effect_id: "10969387"
has_params: true
icon_url: ""
is_vip: true
name: 幻影 I
resource_id: "7212904257043829307"
- effect_id: "87569749"
has_params: true
icon_url: ""
is_vip: true
name: 幻觉 II
resource_id: "7429260401365226021"
- effect_id: "89895356"
has_params: true
icon_url: ""
is_vip: true
name: 广告运镜
resource_id: "7435897594078827034"
- effect_id: "79148302"
has_params: true
icon_url: ""
is_vip: true
name: 弯曲故障
resource_id: "7403295225700946441"
- effect_id: "44400476"
has_params: true
icon_url: ""
is_vip: true
name: 弹动摇镜
resource_id: "7332839146907505215"
- effect_id: "69256604"
has_params: true
icon_url: ""
is_vip: true
name: 弹动旋入
resource_id: "7377307494097359371"
- effect_id: "5718993"
has_params: true
icon_url: ""
is_vip: true
name: 弹性闪动
resource_id: "7161280260435087885"
- effect_id: "75492745"
has_params: true
icon_url: ""
is_vip: true
name: 弹震运镜
resource_id: "7392137368624435752"
- effect_id: "87673618"
has_params: true
icon_url: ""
is_vip: true
name: 彩光幻影
resource_id: "7429623957759726107"
- effect_id: "58342723"
has_params: true
icon_url: ""
is_vip: true
name: 彩光摇晃
resource_id: "7359557508014281268"
- effect_id: "12061167"
has_params: true
icon_url: ""
is_vip: true
name: 彩光频闪
resource_id: "7221126479793361465"
- effect_id: "101569557"
has_params: true
icon_url: ""
is_vip: true
name: 彩带飘落
resource_id: "7460732448666554889"
- effect_id: "17710540"
has_params: true
icon_url: ""
is_vip: true
name: 彩色像素
resource_id: "7254126716489044538"
- effect_id: "15698169"
has_params: true
icon_url: ""
is_vip: true
name: 彩色流光 I
resource_id: "7246400747665887802"
- effect_id: "16940779"
has_params: true
icon_url: ""
is_vip: true
name: 彩色流光 II
resource_id: "7251502652549239354"
- effect_id: "15699849"
has_params: true
icon_url: ""
is_vip: true
name: 彩色流光 III
resource_id: "7246410407399658043"
- effect_id: "1142428"
has_params: true
icon_url: ""
is_vip: true
name: 彩色火焰
resource_id: "6966855040380178981"
- effect_id: "12323189"
has_params: true
icon_url: ""
is_vip: true
name: 彩色珠滴
resource_id: "7223201236621726264"
- effect_id: "22296923"
has_params: true
icon_url: ""
is_vip: true
name: 彩色电光
resource_id: "7275262942348579389"
- effect_id: "7743725"
has_params: true
icon_url: ""
is_vip: true
name: 彩色碎彩
resource_id: "7181402247824151099"
- effect_id: "2148348"
has_params: true
icon_url: ""
is_vip: true
name: 彩色碎片
resource_id: "7101592529811804679"
- effect_id: "2483800"
has_params: true
icon_url: ""
is_vip: true
name: 彩色碎片 II
resource_id: "7104546559747953166"
- effect_id: "95964975"
has_params: true
icon_url: ""
is_vip: true
name: 彩色碎闪
resource_id: "7446672733347254796"
- effect_id: "12297327"
has_params: true
icon_url: ""
is_vip: true
name: 彩色闪烁
resource_id: "7222939637260489274"
- effect_id: "1235380"
has_params: true
icon_url: ""
is_vip: true
name: 彩色雪花
resource_id: "7001001281166774792"
- effect_id: "69089511"
has_params: true
icon_url: ""
is_vip: true
name: 彩虹光影
resource_id: "7377004728208593447"
- effect_id: "9053951"
has_params: true
icon_url: ""
is_vip: true
name: 彩虹棱镜
resource_id: "7195867446429880889"
- effect_id: "10021925"
has_params: true
icon_url: ""
is_vip: true
name: 彩虹泛光
resource_id: "7195112049876144698"
- effect_id: "49499805"
has_params: true
icon_url: ""
is_vip: true
name: 彩虹闪屏
resource_id: "7343557569589285413"
- effect_id: "54679766"
has_params: true
icon_url: ""
is_vip: true
name: 彩边频闪
resource_id: "7352815372510171688"
- effect_id: "102188349"
has_params: true
icon_url: ""
is_vip: true
name: 微信祝福
resource_id: "7462226660188754458"
- effect_id: "69480931"
has_params: true
icon_url: ""
is_vip: true
name: 微震闪黑
resource_id: "7377721589900513818"
- effect_id: "3803337"
has_params: true
icon_url: ""
is_vip: true
name: 心花怒放
resource_id: "7125743711144645127"
- effect_id: "96154625"
has_params: true
icon_url: ""
is_vip: true
name: 心花怒放III
resource_id: "7447067834632376869"
- effect_id: "4478025"
has_params: true
icon_url: ""
is_vip: true
name: 心跳 II
resource_id: "7140620970934407693"
- effect_id: "23539651"
has_params: true
icon_url: ""
is_vip: true
name: 快速变焦
resource_id: "7281494629483024952"
- effect_id: "62251172"
has_params: true
icon_url: ""
is_vip: true
name: 快闪运镜
resource_id: "7366140711969755674"
- effect_id: "79669475"
has_params: true
icon_url: ""
is_vip: true
name: 怀旧画质
resource_id: "7404740894194143763"
- effect_id: "5418578"
has_params: true
icon_url: ""
is_vip: true
name: 恐怖涂鸦
resource_id: "7117142803863310855"
- effect_id: "102289828"
has_params: true
icon_url: ""
is_vip: true
name: 恭喜发财 II
resource_id: "7462352353199395366"
- effect_id: "37514660"
has_params: true
icon_url: ""
is_vip: true
name: 慢门拖影
resource_id: "7317916065353175579"
- effect_id: "3099452"
has_params: true
icon_url: ""
is_vip: true
name: 手写边框
resource_id: "7111253709614486029"
- effect_id: "89308029"
has_params: true
icon_url: ""
is_vip: true
name: 手持运镜
resource_id: "7434412782293881382"
- effect_id: "47079994"
has_params: true
icon_url: ""
is_vip: true
name: 扭动变焦
resource_id: "7338354272280515106"
- effect_id: "28941014"
has_params: true
icon_url: ""
is_vip: true
name: 扭曲变焦
resource_id: "7299392770534281765"
- effect_id: "10694297"
has_params: true
icon_url: ""
is_vip: true
name: 扭曲模糊
resource_id: "7210652297754317367"
- effect_id: "9780487"
has_params: true
icon_url: ""
is_vip: true
name: 抖动模糊
resource_id: "7202812661405323813"
- effect_id: "101494014"
has_params: true
icon_url: ""
is_vip: true
name: 折叠拜年
resource_id: "7460466187265118747"
- effect_id: "54890386"
has_params: true
icon_url: ""
is_vip: true
name: 抽帧拖影
resource_id: "7353197719587918362"
- effect_id: "58077796"
has_params: true
icon_url: ""
is_vip: true
name: 拉伸旋镜
resource_id: "7359100199437865506"
- effect_id: "14603013"
has_params: true
icon_url: ""
is_vip: true
name: 拉扯震动
resource_id: "7240010949938123320"
- effect_id: "48340294"
has_params: true
icon_url: ""
is_vip: true
name: 拉镜开幕
resource_id: "7340923698955686451"
- effect_id: "57913226"
has_params: true
icon_url: ""
is_vip: true
name: 拍照定格
resource_id: "7358795504966177292"
- effect_id: "97589170"
has_params: true
icon_url: ""
is_vip: true
name: 拍立得成像
resource_id: "7450356960953635354"
- effect_id: "42028150"
has_params: true
icon_url: ""
is_vip: true
name: 拖影灯光
resource_id: "7328017754584257075"
- effect_id: "1478160"
has_params: true
icon_url: ""
is_vip: true
name: 拟截图放大镜
resource_id: "7028458557058060831"
- effect_id: "70944695"
has_params: true
icon_url: ""
is_vip: true
name: 推拉跟随
resource_id: "7380236931893826089"
- effect_id: "71865342"
has_params: true
icon_url: ""
is_vip: true
name: 推拉运镜
resource_id: "7382100760630137381"
- effect_id: "89190636"
has_params: true
icon_url: ""
is_vip: true
name: 推近推远
resource_id: "7434055685572137523"
- effect_id: "101601833"
has_params: true
icon_url: ""
is_vip: true
name: 摇摇乐
resource_id: "7460778162570400265"
- effect_id: "31866711"
has_params: true
icon_url: ""
is_vip: true
name: 摇晃叠影
resource_id: "7307264899422360073"
- effect_id: "33958767"
has_params: true
icon_url: ""
is_vip: true
name: 摇晃推镜
resource_id: "7311585733976789554"
- effect_id: "14730265"
has_params: true
icon_url: ""
is_vip: true
name: 摇晃运镜
resource_id: "7241063267357954619"
- effect_id: "81222744"
has_params: true
icon_url: ""
is_vip: true
name: 撕纸定格
resource_id: "7409923919739621898"
- effect_id: "14014573"
has_params: true
icon_url: ""
is_vip: true
name: 撕纸特写
resource_id: "7235886675845452349"
- effect_id: "1647944"
has_params: true
icon_url: ""
is_vip: true
name: 播放界面
resource_id: "7078880636584333838"
- effect_id: "96299420"
has_params: true
icon_url: ""
is_vip: true
name: 放大镜视角
resource_id: "7447417965676335667"
- effect_id: "12383111"
has_params: true
icon_url: ""
is_vip: true
name: 故障定格
resource_id: "7223652101287580216"
- effect_id: "47063402"
has_params: true
icon_url: ""
is_vip: true
name: 故障开幕
resource_id: "7338335435959046656"
- effect_id: "35954280"
has_params: true
icon_url: ""
is_vip: true
name: 故障震闪
resource_id: "7315262223213924873"
- effect_id: "52013378"
has_params: true
icon_url: ""
is_vip: true
name: 散光弹动
resource_id: "7347985147662176807"
- effect_id: "47894032"
has_params: true
icon_url: ""
is_vip: true
name: 散光闪烁
resource_id: "7338348256226710016"
- effect_id: "17852330"
has_params: true
icon_url: ""
is_vip: true
name: 数字矩阵
resource_id: "7254547645903934010"
- effect_id: "81347687"
has_params: true
icon_url: ""
is_vip: true
name: 数学公式
resource_id: "7410350357768835594"
- effect_id: "15332069"
has_params: true
icon_url: ""
is_vip: true
name: 斜线震动
resource_id: "7244511673409606201"
- effect_id: "39297699"
has_params: true
icon_url: ""
is_vip: true
name: 新年仙女棒
resource_id: "7321990419351343653"
- effect_id: "8629763"
has_params: true
icon_url: ""
is_vip: true
name: 新年兔气球
resource_id: "7189956032095851063"
- effect_id: "97032431"
has_params: true
icon_url: ""
is_vip: true
name: 新年投影
resource_id: "7448898555617481267"
- effect_id: "97041325"
has_params: true
icon_url: ""
is_vip: true
name: 新年烟花 II
resource_id: "7448907790933824010"
- effect_id: "101601588"
has_params: true
icon_url: ""
is_vip: true
name: 新年的一封信
resource_id: "7460777723925893683"
- effect_id: "101222490"
has_params: true
icon_url: ""
is_vip: true
name: 新年礼花
resource_id: "7459729290070856229"
- effect_id: "101601911"
has_params: true
icon_url: ""
is_vip: true
name: 新年边框
resource_id: "7460778303587095077"
- effect_id: "100675597"
has_params: true
icon_url: ""
is_vip: true
name: 新春唱片
resource_id: "7458223206294360626"
- effect_id: "102355526"
has_params: true
icon_url: ""
is_vip: true
name: 新春海报
resource_id: "7462629172121178633"
- effect_id: "102355090"
has_params: true
icon_url: ""
is_vip: true
name: 新春边框
resource_id: "7462628644221882906"
- effect_id: "72505526"
has_params: true
icon_url: ""
is_vip: true
name: 方形模糊
resource_id: "7384032238951731739"
- effect_id: "12505491"
has_params: true
icon_url: ""
is_vip: true
name: 旋焦
resource_id: "7224445669698703909"
- effect_id: "53786746"
has_params: true
icon_url: ""
is_vip: true
name: 旋焦推镜
resource_id: "7351324357425107519"
- effect_id: "33928843"
has_params: true
icon_url: ""
is_vip: true
name: 旋转变焦
resource_id: "7311544501057622555"
- effect_id: "49499445"
has_params: true
icon_url: ""
is_vip: true
name: 旋转回弹
resource_id: "7343557174058029568"
- effect_id: "71888863"
has_params: true
icon_url: ""
is_vip: true
name: 旋转圆球
resource_id: "7382147305350107700"
- effect_id: "40324156"
has_params: true
icon_url: ""
is_vip: true
name: 旋转抖动
resource_id: "7324315025558999602"
- effect_id: "51995951"
has_params: true
icon_url: ""
is_vip: true
name: 旋转抖动 II
resource_id: "7347956961318539826"
- effect_id: "96135794"
has_params: true
icon_url: ""
is_vip: true
name: 日进斗金
resource_id: "7447044440868262426"
- effect_id: "76494544"
has_params: true
icon_url: ""
is_vip: true
name: 时尚涂鸦
resource_id: "7395106209155518987"
- effect_id: "78259894"
has_params: true
icon_url: ""
is_vip: true
name: 星光变焦
resource_id: "7400757039498007079"
- effect_id: "6661731"
has_params: true
icon_url: ""
is_vip: true
name: 星星变焦
resource_id: "7169474672671592991"
- effect_id: "19104048"
has_params: true
icon_url: ""
is_vip: true
name: 曝光变焦
resource_id: "7259639809491079737"
- effect_id: "47990686"
has_params: true
icon_url: ""
is_vip: true
name: 曝光扩散
resource_id: "7340136879615906344"
- effect_id: "48215352"
has_params: true
icon_url: ""
is_vip: true
name: 曲线模糊
resource_id: "7340622176065688098"
- effect_id: "49487569"
has_params: true
icon_url: ""
is_vip: true
name: 极速旋转
resource_id: "7343542497651462708"
- effect_id: "16279737"
has_params: true
icon_url: ""
is_vip: true
name: 柔和辉光
resource_id: "7249209626829263421"
- effect_id: "56065875"
has_params: true
icon_url: ""
is_vip: true
name: 梦幻辉光
resource_id: "7355386179308491300"
- effect_id: "53350183"
has_params: true
icon_url: ""
is_vip: true
name: 模拟拍照
resource_id: "7349154734537708084"
- effect_id: "14965785"
has_params: true
icon_url: ""
is_vip: true
name: 横向闪光
resource_id: "7242555690965799483"
- effect_id: "71626094"
has_params: true
icon_url: ""
is_vip: true
name: 横条开幕
resource_id: "7381442168759521792"
- effect_id: "10348463"
has_params: true
icon_url: ""
is_vip: true
name: 樱花飘落
resource_id: "7207718227382637113"
- effect_id: "62749085"
has_params: true
icon_url: ""
is_vip: true
name: 欧根纱II
resource_id: "7366882927801537024"
- effect_id: "97260689"
has_params: true
icon_url: ""
is_vip: true
name: 气球满屏
resource_id: "7449596462649840155"
- effect_id: "13400477"
has_params: true
icon_url: ""
is_vip: true
name: 气球花花
resource_id: "7231385092193522235"
- effect_id: "32599175"
has_params: true
icon_url: ""
is_vip: true
name: 氛围边框
resource_id: "7308944810646180379"
- effect_id: "3687389"
has_params: true
icon_url: ""
is_vip: true
name: 水光影
resource_id: "7122736441053942285"
- effect_id: "35129784"
has_params: true
icon_url: ""
is_vip: true
name: 水波倒影
resource_id: "7313842878847914547"
- effect_id: "1499278"
has_params: true
icon_url: ""
is_vip: true
name: 水波模糊
resource_id: "7047088638932292127"
- effect_id: "16641371"
has_params: true
icon_url: ""
is_vip: true
name: 水波泛起
resource_id: "7250433374882370103"
- effect_id: "4458607"
has_params: true
icon_url: ""
is_vip: true
name: 水波流动
resource_id: "7140273505630687780"
- effect_id: "90036895"
has_params: true
icon_url: ""
is_vip: true
name: 水波负片
resource_id: "7436273714733257267"
- effect_id: "12112703"
has_params: true
icon_url: ""
is_vip: true
name: 水滴扩散
resource_id: "7221508316852130362"
- effect_id: "96257972"
has_params: false
icon_url: ""
is_vip: true
name: 水雾消散
resource_id: "7447371185806905865"
- effect_id: "13537551"
has_params: true
icon_url: ""
is_vip: true
name: 油画模糊
resource_id: "7232232188278739493"
- effect_id: "101601695"
has_params: true
icon_url: ""
is_vip: true
name: 油纸伞
resource_id: "7460777943397044745"
- effect_id: "1747384"
has_params: true
icon_url: ""
is_vip: true
name: 法式暖调
resource_id: "7090546987170271780"
- effect_id: "17395354"
has_params: true
icon_url: ""
is_vip: true
name: 法式涂鸦
resource_id: "7253039682877919803"
- effect_id: "4217252"
has_params: true
icon_url: ""
is_vip: true
name: 泛光扫描
resource_id: "7134989289498087967"
- effect_id: "17821188"
has_params: true
icon_url: ""
is_vip: true
name: 泛光爆闪
resource_id: "7254484266996732476"
- effect_id: "14080033"
has_params: true
icon_url: ""
is_vip: true
name: 泛光闪动
resource_id: "7236298986993226301"
- effect_id: "38547267"
has_params: true
icon_url: ""
is_vip: true
name: 泡泡光斑
resource_id: "7320155012036825610"
- effect_id: "67466796"
has_params: true
icon_url: ""
is_vip: true
name: 泡泡冲屏
resource_id: "7373963046693114387"
- effect_id: "48213992"
has_params: true
icon_url: ""
is_vip: true
name: 波动清晰
resource_id: "7340620060362281512"
- effect_id: "5574521"
has_params: true
icon_url: ""
is_vip: true
name: 波浪
resource_id: "7159183282632921631"
- effect_id: "4880117"
has_params: true
icon_url: ""
is_vip: true
name: 波浪丝印
resource_id: "7146406661249307150"
- effect_id: "44222768"
has_params: true
icon_url: ""
is_vip: true
name: 波纹闪动
resource_id: "7332415663106953769"
- effect_id: "12130415"
has_params: true
icon_url: ""
is_vip: true
name: 流体冲屏
resource_id: "7221730308251456037"
- effect_id: "39315461"
has_params: true
icon_url: ""
is_vip: true
name: 流体荡开
resource_id: "7322018576125137417"
- effect_id: "95069546"
has_params: true
icon_url: ""
is_vip: true
name: 流光碎闪
resource_id: "7444520354703217178"
- effect_id: "95912238"
has_params: true
icon_url: ""
is_vip: true
name: 浪漫烟火
resource_id: "7446622476928324146"
- effect_id: "4118241"
has_params: true
icon_url: ""
is_vip: true
name: 海报描边
resource_id: "7133104392231719431"
- effect_id: "1520896"
has_params: true
icon_url: ""
is_vip: true
name: 海鸥DC
resource_id: "7051853636548170271"
- effect_id: "84197797"
has_params: true
icon_url: ""
is_vip: true
name: 涂鸦vlog
resource_id: "7418860485258252826"
- effect_id: "96240757"
has_params: true
icon_url: ""
is_vip: true
name: 涂鸦切开
resource_id: "7447351620649619994"
- effect_id: "88922989"
has_params: true
icon_url: ""
is_vip: true
name: 涂鸦抽帧
resource_id: "7433322731896050212"
- effect_id: "80566411"
has_params: true
icon_url: ""
is_vip: true
name: 涂鸦拍立得
resource_id: "7407715616225759807"
- effect_id: "14742833"
has_params: true
icon_url: ""
is_vip: true
name: 液态分离
resource_id: "7241096748184113701"
- effect_id: "102385218"
has_params: true
icon_url: ""
is_vip: true
name: 滑动打开
resource_id: "7462679471246545459"
- effect_id: "93990334"
has_params: true
icon_url: ""
is_vip: true
name: 滑动载入
resource_id: "7442210447844971017"
- effect_id: "31585739"
has_params: true
icon_url: ""
is_vip: true
name: 漂浮爱心
resource_id: "7306769922535723558"
- effect_id: "82396172"
has_params: true
icon_url: ""
is_vip: true
name: 漏光闪烁
resource_id: "7413730211969110537"
- effect_id: "89895358"
has_params: true
icon_url: ""
is_vip: true
name: 漫画负片
resource_id: "7435897594070438451"
- effect_id: "53198933"
has_params: true
icon_url: ""
is_vip: true
name: 潮流涂鸦
resource_id: "7350240257914180135"
- effect_id: "54008092"
has_params: true
icon_url: ""
is_vip: true
name: 瀑布开幕
resource_id: "7351689682138174006"
- effect_id: "102169716"
has_params: true
icon_url: ""
is_vip: true
name: 瀑布烟花
resource_id: "7462213415688213001"
- effect_id: "93705701"
has_params: true
icon_url: ""
is_vip: true
name: 灵异幻觉
resource_id: "7441568585081688585"
- effect_id: "28934274"
has_params: true
icon_url: ""
is_vip: true
name: 灵魂出窍 II
resource_id: "7299377358283215398"
- effect_id: "30737307"
has_params: true
icon_url: ""
is_vip: true
name: 灿灿金币
resource_id: "7304546673215148595"
- effect_id: "33271125"
has_params: true
icon_url: ""
is_vip: true
name: 灿金彩带
resource_id: "7308706488686481947"
- effect_id: "1237470"
has_params: true
icon_url: ""
is_vip: true
name: 炫光变焦
resource_id: "7002109122350944781"
- effect_id: "63023070"
has_params: true
icon_url: ""
is_vip: true
name: 炫光扫描
resource_id: "7367314177741820435"
- effect_id: "100663283"
has_params: true
icon_url: ""
is_vip: true
name: 炸蛇烟花
resource_id: "7458204947906040370"
- effect_id: "97260687"
has_params: true
icon_url: ""
is_vip: true
name: 烟火星河
resource_id: "7449596462645645874"
- effect_id: "36744068"
has_params: true
icon_url: ""
is_vip: true
name: 烟花2024
resource_id: "7308706250731033097"
- effect_id: "96021458"
has_params: true
icon_url: ""
is_vip: true
name: 烟花2025
resource_id: "7446764449010029066"
- effect_id: "95320465"
has_params: true
icon_url: ""
is_vip: true
name: 烟花光晕
resource_id: "7445177785410130469"
- effect_id: "101569174"
has_params: true
icon_url: ""
is_vip: true
name: 烟花孔明灯
resource_id: "7460733084413989426"
- effect_id: "101960315"
has_params: true
icon_url: ""
is_vip: true
name: 烟花字
resource_id: "7461841371700138505"
- effect_id: "9062069"
has_params: true
icon_url: ""
is_vip: true
name: 热恋
resource_id: "7195020880018149944"
- effect_id: "101569519"
has_params: true
icon_url: ""
is_vip: true
name: 爆元宝
resource_id: "7460732612668035634"
- effect_id: "12284805"
has_params: true
icon_url: ""
is_vip: true
name: 爆闪锐化
resource_id: "7222907722486780472"
- effect_id: "89190638"
has_params: true
icon_url: ""
is_vip: true
name: 爱心下雪
resource_id: "7434055685559554569"
- effect_id: "39420273"
has_params: true
icon_url: ""
is_vip: true
name: 爱心扫光
resource_id: "7322345920962499123"
- effect_id: "20875808"
has_params: true
icon_url: ""
is_vip: true
name: 爱心气球
resource_id: "7268210584707928634"
- effect_id: "98156320"
has_params: true
icon_url: ""
is_vip: true
name: 爱心烟花Ⅱ
resource_id: "7451813291430515210"
- effect_id: "43774786"
has_params: true
icon_url: ""
is_vip: true
name: 爱心软糖
resource_id: "7331625316885991970"
- effect_id: "1572505"
has_params: true
icon_url: ""
is_vip: true
name: 爱心边框
resource_id: "7065927898833621511"
- effect_id: "102389141"
has_params: true
icon_url: ""
is_vip: true
name: 猫眼迎财
resource_id: "7462694218327134758"
- effect_id: "102609449"
has_params: true
icon_url: ""
is_vip: true
name: 玫瑰冲屏
resource_id: "7463437625777459721"
- effect_id: "20820466"
has_params: true
icon_url: ""
is_vip: true
name: 珠光Kira
resource_id: "7267917946733728314"
- effect_id: "20405527"
has_params: true
icon_url: ""
is_vip: true
name: 珠光碎闪
resource_id: "7265695554640810533"
- effect_id: "31428923"
has_params: true
icon_url: ""
is_vip: true
name: 琉璃拖影
resource_id: "7306400287323853349"
- effect_id: "2721906"
has_params: true
icon_url: ""
is_vip: true
name: 电光描边
resource_id: "7106762731960668703"
- effect_id: "29755128"
has_params: true
icon_url: ""
is_vip: true
name: 电光波动
resource_id: "7301674026173207066"
- effect_id: "31478585"
has_params: true
icon_url: ""
is_vip: true
name: 电光爆闪
resource_id: "7306471467397419547"
- effect_id: "52650215"
has_params: true
icon_url: ""
is_vip: true
name: 电光爆闪 II
resource_id: "7349150013441708559"
- effect_id: "2724410"
has_params: true
icon_url: ""
is_vip: true
name: 电光爱心
resource_id: "7106779118867321357"
- effect_id: "89153641"
has_params: true
icon_url: ""
is_vip: true
name: 电子复古粉
resource_id: "7434001622113456678"
- effect_id: "15772327"
has_params: true
icon_url: ""
is_vip: true
name: 电音故障
resource_id: "7246745900473651773"
- effect_id: "52400085"
has_params: true
icon_url: ""
is_vip: true
name: 画质清晰
resource_id: "7348707427165934107"
- effect_id: "71992424"
has_params: true
icon_url: ""
is_vip: true
name: 白鸽
resource_id: "7382490757770252827"
- effect_id: "92805703"
has_params: true
icon_url: ""
is_vip: true
name: 相机抓拍
resource_id: "7439935845156524583"
- effect_id: "96240754"
has_params: true
icon_url: ""
is_vip: true
name: 相机框抖动
resource_id: "7447351621207462426"
- effect_id: "20350863"
has_params: true
icon_url: ""
is_vip: true
name: 相片定格
resource_id: "7265526511220822586"
- effect_id: "94166372"
has_params: true
icon_url: ""
is_vip: true
name: 真爱至上
resource_id: "7442582812139459110"
- effect_id: "89308030"
has_params: true
icon_url: ""
is_vip: true
name: 矩形闪白
resource_id: "7434412782289703450"
- effect_id: "31403673"
has_params: true
icon_url: ""
is_vip: true
name: 矩阵频闪
resource_id: "7306346511367934491"
- effect_id: "4007289"
has_params: true
icon_url: ""
is_vip: true
name: 碎闪描边
resource_id: "7130585329609740814"
- effect_id: "2211756"
has_params: true
icon_url: ""
is_vip: true
name: 磁带DV
resource_id: "7101987162526061070"
- effect_id: "1729610"
has_params: true
icon_url: ""
is_vip: true
name: 磨砂水晶
resource_id: "7090380952605561381"
- effect_id: "41485429"
has_params: true
icon_url: ""
is_vip: true
name: 神龙纳福
resource_id: "7326853354615738889"
- effect_id: "5408805"
has_params: true
icon_url: ""
is_vip: true
name: 秋日暖阳
resource_id: "7156868464894808583"
- effect_id: "15780929"
has_params: true
icon_url: ""
is_vip: true
name: 移轴模糊
resource_id: "7246784641384845861"
- effect_id: "72501890"
has_params: true
icon_url: ""
is_vip: true
name: 竖向开幕
resource_id: "7384009190836015654"
- effect_id: "10976911"
has_params: true
icon_url: ""
is_vip: true
name: 竖向闪光
resource_id: "7212938795702817338"
- effect_id: "30666842"
has_params: true
icon_url: ""
is_vip: true
name: 竖线屏闪
resource_id: "7304258446658900489"
- effect_id: "26216108"
has_params: true
icon_url: ""
is_vip: true
name: 竖闪模糊
resource_id: "7291135061494075960"
- effect_id: "88507650"
has_params: true
icon_url: ""
is_vip: true
name: 童趣闪电
resource_id: "7432192373163037222"
- effect_id: "28549704"
has_params: true
icon_url: ""
is_vip: true
name: 粉雪
resource_id: "7298283919944716827"
- effect_id: "11587497"
has_params: true
icon_url: ""
is_vip: true
name: 粒子放射
resource_id: "7217716815407878693"
- effect_id: "63611181"
has_params: true
icon_url: ""
is_vip: true
name: 精致辉光
resource_id: "7368344527494451712"
- effect_id: "34184103"
has_params: true
icon_url: ""
is_vip: true
name: 紫光夜
resource_id: "7311995150962528778"
- effect_id: "21150170"
has_params: true
icon_url: ""
is_vip: true
name: 繁花棱镜II
resource_id: "7269749564658160184"
- effect_id: "39289351"
has_params: true
icon_url: ""
is_vip: true
name: 红包来了
resource_id: "7320154851793441307"
- effect_id: "102355143"
has_params: true
icon_url: ""
is_vip: true
name: 红包转转
resource_id: "7462628759770763826"
- effect_id: "3675609"
has_params: true
icon_url: ""
is_vip: true
name: 红蓝魔
resource_id: "7122384870294163975"
- effect_id: "4007601"
has_params: true
icon_url: ""
is_vip: true
name: 红边模糊
resource_id: "7130591331700707876"
- effect_id: "8626971"
has_params: true
icon_url: ""
is_vip: true
name: 纵向跳动
resource_id: "7190200556692967995"
- effect_id: "83272772"
has_params: true
icon_url: ""
is_vip: true
name: 纸质抽帧
resource_id: "7416333380603613737"
- effect_id: "63209940"
has_params: true
icon_url: ""
is_vip: true
name: 线光变速
resource_id: "7367628113062138377"
- effect_id: "95331639"
has_params: true
icon_url: ""
is_vip: true
name: 绚丽光斑
resource_id: "7445196904868090419"
- effect_id: "1607634"
has_params: true
icon_url: ""
is_vip: true
name: 缤纷
resource_id: "7072268839303516709"
- effect_id: "95320463"
has_params: true
icon_url: ""
is_vip: true
name: 缤纷彩带
resource_id: "7445177785405936138"
- effect_id: "35751784"
has_params: true
icon_url: ""
is_vip: true
name: 缤纷烟花
resource_id: "7314928469819789850"
- effect_id: "90036898"
has_params: true
icon_url: ""
is_vip: true
name: 缩放运镜
resource_id: "7436273714733257253"
- effect_id: "4879935"
has_params: true
icon_url: ""
is_vip: true
name: 网点丝印
resource_id: "7146404902971904548"
- effect_id: "51832286"
has_params: true
icon_url: ""
is_vip: true
name: 群蝶飞舞
resource_id: "7347658324956942883"
- effect_id: "70529088"
has_params: true
icon_url: ""
is_vip: true
name: 羽毛飘落
resource_id: "7379513630837969445"
- effect_id: "28934164"
has_params: true
icon_url: ""
is_vip: true
name: 翻转变焦
resource_id: "7299377095107416585"
- effect_id: "14020695"
has_params: true
icon_url: ""
is_vip: true
name: 翻转开幕
resource_id: "7235902836188385852"
- effect_id: "1426168"
has_params: true
icon_url: ""
is_vip: true
name: 老式DV
resource_id: "7026261220961292807"
- effect_id: "101569261"
has_params: true
icon_url: ""
is_vip: true
name: 聚光灯金粉
resource_id: "7460732843547693577"
- effect_id: "88045350"
has_params: true
icon_url: ""
is_vip: true
name: 聚焦色散
resource_id: "7430786234508644875"
- effect_id: "101569809"
has_params: true
icon_url: ""
is_vip: true
name: 胶卷
resource_id: "7460730844018119205"
- effect_id: "5050659"
has_params: true
icon_url: ""
is_vip: true
name: 胶片V
resource_id: "7151967279817691662"
- effect_id: "4837281"
has_params: true
icon_url: ""
is_vip: true
name: 胶片冷绿
resource_id: "7146524414312452645"
- effect_id: "4837280"
has_params: true
icon_url: ""
is_vip: true
name: 胶片暖棕
resource_id: "7145385234320593439"
- effect_id: "1655466"
has_params: true
icon_url: ""
is_vip: true
name: 胶片滚动
resource_id: "7080354236956938782"
- effect_id: "90546418"
has_params: true
icon_url: ""
is_vip: true
name: 胶片漏光III
resource_id: "7437386424036364827"
- effect_id: "87654332"
has_params: true
icon_url: ""
is_vip: true
name: 胶片翻转
resource_id: "7429592751961805348"
- effect_id: "97032432"
has_params: false
icon_url: ""
is_vip: true
name: 胶片边框
resource_id: "7448898555617481243"
- effect_id: "72761923"
has_params: true
icon_url: ""
is_vip: true
name: 胶片闪切
resource_id: "7384745950608101924"
- effect_id: "1522814"
has_params: true
icon_url: ""
is_vip: true
name: 脉搏跳动
resource_id: "7052226294972420621"
- effect_id: "79942991"
has_params: true
icon_url: ""
is_vip: true
name: 腾云驾雾
resource_id: "7405560326650860042"
- effect_id: "55932216"
has_params: true
icon_url: ""
is_vip: true
name: 色差震闪
resource_id: "7355109046694711871"
- effect_id: "67503542"
has_params: true
icon_url: ""
is_vip: true
name: 色散冲击
resource_id: "7374053937369846307"
- effect_id: "14972687"
has_params: true
icon_url: ""
is_vip: true
name: 色散故障
resource_id: "7242574690638631479"
- effect_id: "83369566"
has_params: true
icon_url: ""
is_vip: true
name: 节奏热成像
resource_id: "7416626838232896012"
- effect_id: "86397374"
has_params: true
icon_url: ""
is_vip: true
name: 花屏故障
resource_id: "7425528614847779379"
- effect_id: "75855950"
has_params: true
icon_url: ""
is_vip: true
name: 花屏故障 II
resource_id: "7392894917720150565"
- effect_id: "50608291"
has_params: true
icon_url: ""
is_vip: true
name: 花瓣环绕
resource_id: "7345688874577826342"
- effect_id: "97032428"
has_params: true
icon_url: ""
is_vip: true
name: 荧光星河
resource_id: "7448898556410204681"
- effect_id: "40449614"
has_params: true
icon_url: ""
is_vip: true
name: 菱形光斑
resource_id: "7316813562783994395"
- effect_id: "4841353"
has_params: true
icon_url: ""
is_vip: true
name: 菱形变焦
resource_id: "7147943538120987166"
- effect_id: "5418631"
has_params: true
icon_url: ""
is_vip: true
name: 落叶 II
resource_id: "7153556255263429151"
- effect_id: "25450329"
has_params: true
icon_url: ""
is_vip: true
name: 蓝光爆闪
resource_id: "7288655540341707324"
- effect_id: "4097661"
has_params: true
icon_url: ""
is_vip: true
name: 蓝色丝印
resource_id: "7131985730791805448"
- effect_id: "69273433"
has_params: true
icon_url: ""
is_vip: true
name: 虹光旋入
resource_id: "7377352335028130367"
- effect_id: "101569875"
has_params: true
icon_url: ""
is_vip: true
name: 蛇形走位
resource_id: "7460729982474523163"
- effect_id: "101570158"
has_params: true
icon_url: ""
is_vip: true
name: 蛇蛇涂鸦
resource_id: "7460729365366575667"
- effect_id: "97254884"
has_params: false
icon_url: ""
is_vip: true
name: 西海岸涂鸦
resource_id: "7449588013115380251"
- effect_id: "4668537"
has_params: true
icon_url: ""
is_vip: true
name: 视频播放
resource_id: "7144915597308989988"
- effect_id: "101569592"
has_params: true
icon_url: ""
is_vip: true
name: 记忆存档
resource_id: "7460732200074351142"
- effect_id: "86397483"
has_params: true
icon_url: ""
is_vip: true
name: 诡异故障
resource_id: "7425528781156127258"
- effect_id: "22907949"
has_params: true
icon_url: ""
is_vip: true
name: 负片分屏
resource_id: "7278974994623763003"
- effect_id: "89308031"
has_params: true
icon_url: ""
is_vip: true
name: 负片描边
resource_id: "7434412782285492746"
- effect_id: "5477607"
has_params: true
icon_url: ""
is_vip: true
name: 负片涂鸦
resource_id: "7157966185571553822"
- effect_id: "13379581"
has_params: true
icon_url: ""
is_vip: true
name: 负片涂鸦 II
resource_id: "7231111030028374584"
- effect_id: "20745376"
has_params: true
icon_url: ""
is_vip: true
name: 负片涂鸦 III
resource_id: "7267517097775731261"
- effect_id: "1787254"
has_params: true
icon_url: ""
is_vip: true
name: 负片游移
resource_id: "7091488033555354120"
- effect_id: "5155369"
has_params: true
icon_url: ""
is_vip: true
name: 负片频闪
resource_id: "7153575555554611720"
- effect_id: "83794424"
has_params: true
icon_url: ""
is_vip: true
name: 负片频闪 II
resource_id: "7417726471868781110"
- effect_id: "94976472"
has_params: true
icon_url: ""
is_vip: true
name: 贴身粒子
resource_id: "7444407996911718949"
- effect_id: "6691829"
has_params: true
icon_url: ""
is_vip: true
name: 超大光斑
resource_id: "7171321435200164383"
- effect_id: "3950243"
has_params: true
icon_url: ""
is_vip: true
name: 超强锐化
resource_id: "7129336892121682468"
- effect_id: "28956878"
has_params: true
icon_url: ""
is_vip: true
name: 跟随运镜
resource_id: "7299426452896748042"
- effect_id: "48362872"
has_params: true
icon_url: ""
is_vip: true
name: 跟随运镜 II
resource_id: "7340954638184616467"
- effect_id: "96240759"
has_params: true
icon_url: ""
is_vip: true
name: 跳色四宫格
resource_id: "7447351620641247754"
- effect_id: "4795296"
has_params: true
icon_url: ""
is_vip: true
name: 车窗 II
resource_id: "7109280482025542157"
- effect_id: "101959980"
has_params: true
icon_url: ""
is_vip: true
name: 转运祝福
resource_id: "7461840876596105766"
- effect_id: "86397588"
has_params: true
icon_url: ""
is_vip: true
name: 轻微故障
resource_id: "7425528929454133786"
- effect_id: "47051728"
has_params: true
icon_url: ""
is_vip: true
name: 辉光开幕
resource_id: "7338322046822126114"
- effect_id: "39434745"
has_params: true
icon_url: ""
is_vip: true
name: 边缘扫光
resource_id: "7322363012092793353"
- effect_id: "97032430"
has_params: true
icon_url: ""
is_vip: true
name: 迎接2025
resource_id: "7448898555621675571"
- effect_id: "20440246"
has_params: true
icon_url: ""
is_vip: true
name: 迷幻故障
resource_id: "7265960462330630714"
- effect_id: "12324741"
has_params: true
icon_url: ""
is_vip: true
name: 迷幻荡漾
resource_id: "7223208176206746173"
- effect_id: "14438877"
has_params: true
icon_url: ""
is_vip: true
name: 迷幻震动
resource_id: "7238863029775897148"
- effect_id: "5719311"
has_params: true
icon_url: ""
is_vip: true
name: 重复变焦
resource_id: "7161285099667853831"
- effect_id: "16610415"
has_params: true
icon_url: ""
is_vip: true
name: 重复震闪
resource_id: "7250369682207674938"
- effect_id: "102547299"
has_params: true
icon_url: ""
is_vip: true
name: 金元宝
resource_id: "7463321874349429258"
- effect_id: "96107626"
has_params: true
icon_url: ""
is_vip: true
name: 金币掉落
resource_id: "7447018501778182666"
- effect_id: "100068434"
has_params: true
icon_url: ""
is_vip: true
name: 金粉飘落
resource_id: "7456695082293400115"
- effect_id: "2622164"
has_params: true
icon_url: ""
is_vip: true
name: 金色碎片
resource_id: "7106040163402256927"
- effect_id: "95041384"
has_params: true
icon_url: ""
is_vip: true
name: 金色辉光
resource_id: "7444470107004211763"
- effect_id: "95041381"
has_params: true
icon_url: ""
is_vip: true
name: 金色雪花
resource_id: "7444470107000017435"
- effect_id: "101569782"
has_params: true
icon_url: ""
is_vip: true
name: 金蛇贺岁
resource_id: "7460731076856517129"
- effect_id: "30855689"
has_params: true
icon_url: ""
is_vip: true
name: 金边闪烁
resource_id: "7304832158466576947"
- effect_id: "97573972"
has_params: true
icon_url: ""
is_vip: true
name: 金银珠宝
resource_id: "7450336559141753395"
- effect_id: "98209671"
has_params: true
icon_url: ""
is_vip: true
name: 金鱼漂浮
resource_id: "7451879925545439795"
- effect_id: "81202828"
has_params: true
icon_url: ""
is_vip: true
name: 铅笔涂鸦
resource_id: "7409883232667177499"
- effect_id: "28024643"
has_params: true
icon_url: ""
is_vip: true
name: 银杏飘落
resource_id: "7296789290724364850"
- effect_id: "101977565"
has_params: true
icon_url: ""
is_vip: true
name: 银蛇缠绕
resource_id: "7461865163826663945"
- effect_id: "10660327"
has_params: true
icon_url: ""
is_vip: true
name: 闪光弹跳
resource_id: "7210315941396091447"
- effect_id: "4795220"
has_params: true
icon_url: ""
is_vip: true
name: 闪光灯 II
resource_id: "7143919857539486238"
- effect_id: "22328905"
has_params: true
icon_url: ""
is_vip: true
name: 闪光灯IV
resource_id: "7276317197658493498"
- effect_id: "42913127"
has_params: true
icon_url: ""
is_vip: true
name: 闪电扭曲
resource_id: "7329871968298078759"
- effect_id: "23489443"
has_params: true
icon_url: ""
is_vip: true
name: 闪白 II
resource_id: "7281219213828559397"
- effect_id: "97260690"
has_params: true
icon_url: ""
is_vip: true
name: 闪粉胶片
resource_id: "7449596462658228762"
- effect_id: "20816436"
has_params: true
icon_url: ""
is_vip: true
name: 随机闪切
resource_id: "7267909305519575608"
- effect_id: "29099986"
has_params: true
icon_url: ""
is_vip: true
name: 随机马赛克
resource_id: "7299769859900969510"
- effect_id: "11331317"
has_params: true
icon_url: ""
is_vip: true
name: 隔行DV
resource_id: "7215598241558041125"
- effect_id: "6731496"
has_params: true
icon_url: ""
is_vip: true
name: 雨季 I
resource_id: "7149065282768605732"
- effect_id: "79016931"
has_params: true
icon_url: ""
is_vip: true
name: 雨滴
resource_id: "7402879770079269403"
- effect_id: "81600389"
has_params: true
icon_url: ""
is_vip: true
name: 雨滴2
resource_id: "7411360993369920015"
- effect_id: "27986887"
has_params: true
icon_url: ""
is_vip: true
name: 雪花光斑
resource_id: "7296707597707514406"
- effect_id: "95041385"
has_params: true
icon_url: ""
is_vip: true
name: 雪花变色
resource_id: "7444470107000017417"
- effect_id: "97032426"
has_params: true
icon_url: ""
is_vip: true
name: 雪花散落
resource_id: "7448898556401816115"
- effect_id: "30305488"
has_params: true
icon_url: ""
is_vip: true
name: 雪雾
resource_id: "7303380658934518323"
- effect_id: "89895357"
has_params: true
icon_url: ""
is_vip: true
name: 零帧起手
resource_id: "7435897594070438426"
- effect_id: "6731657"
has_params: true
icon_url: ""
is_vip: true
name: 雾镜 II
resource_id: "7147920433604465159"
- effect_id: "15775885"
has_params: true
icon_url: ""
is_vip: true
name: 震动光束
resource_id: "7246758527992074811"
- effect_id: "16303237"
has_params: true
icon_url: ""
is_vip: true
name: 震动发光
resource_id: "7249264623226982968"
- effect_id: "6733311"
has_params: true
icon_url: ""
is_vip: true
name: 震动屏闪
resource_id: "7171697545154925069"
- effect_id: "67503342"
has_params: true
icon_url: ""
is_vip: true
name: 震动扫光
resource_id: "7374053409546048052"
- effect_id: "50238678"
has_params: true
icon_url: ""
is_vip: true
name: 震动推镜
resource_id: "7345004981029704233"
- effect_id: "30662744"
has_params: true
icon_url: ""
is_vip: true
name: 震闪渐黑
resource_id: "7304249285577544201"
- effect_id: "17710570"
has_params: true
icon_url: ""
is_vip: true
name: 霓虹光线
resource_id: "7254125922222084663"
- effect_id: "50455778"
has_params: true
icon_url: ""
is_vip: true
name: 霓虹闪切
resource_id: "7345353688774349348"
- effect_id: "83837896"
has_params: true
icon_url: ""
is_vip: true
name: 飞机窗
resource_id: "7417827699902648868"
- effect_id: "32503798"
has_params: true
icon_url: ""
is_vip: true
name: 马赛克闪切
resource_id: "7308712918902641203"
- effect_id: "49475327"
has_params: true
icon_url: ""
is_vip: true
name: 高速彩光
resource_id: "7343527966145516042"
- effect_id: "1418072"
has_params: true
icon_url: ""
is_vip: true
name: 鱼眼 II
resource_id: "7023664868083372580"
- effect_id: "1521356"
has_params: true
icon_url: ""
is_vip: true
name: 鱼眼 III
resource_id: "7051881765975101983"
- effect_id: "1790048"
has_params: true
icon_url: ""
is_vip: true
name: 鱼眼 IV
resource_id: "7091597643553444359"
- effect_id: "88503775"
has_params: true
icon_url: ""
is_vip: true
name: 鱼眼星星
resource_id: "7432187089862529546"
- effect_id: "98675391"
has_params: true
icon_url: ""
is_vip: true
name: 鱼眼涂鸦
resource_id: "7453001309596160522"
- effect_id: "88503776"
has_params: true
icon_url: ""
is_vip: true
name: 鱼眼闪电
resource_id: "7432187089858351667"
- effect_id: "1691558"
has_params: true
icon_url: ""
is_vip: true
name: 黑白胶片
resource_id: "7085992144627831326"
get_filters:
value:
ReqExample:
mode: 0
RespExample:
filters:
- effect_id: "7127828208690433311"
has_params: false
is_vip: false
name: "1980"
resource_id: "7127828208690433311"
- effect_id: "7127679308897832206"
has_params: false
is_vip: false
name: ABG
resource_id: "7127679308897832206"
- effect_id: "7195816046077496635"
has_params: false
is_vip: false
name: Ditto
resource_id: "7195816046077496635"
- effect_id: "7127819154018536741"
has_params: false
is_vip: false
name: KE1
resource_id: "7127819154018536741"
- effect_id: "7127578859217620254"
has_params: false
is_vip: false
name: KV5D
resource_id: "7127578859217620254"
- effect_id: "7232216810031025468"
has_params: false
is_vip: false
name: Lofi II
resource_id: "7232216810031025468"
- effect_id: "7127669764905782542"
has_params: false
is_vip: false
name: VHS III
resource_id: "7127669764905782542"
- effect_id: "7127669338089311495"
has_params: false
is_vip: false
name: 三洋VPC
resource_id: "7127669338089311495"
- effect_id: "7368493100127292723"
has_params: true
is_vip: false
name: 书意
resource_id: "7368493100127292723"
- effect_id: "7166472327801097476"
has_params: false
is_vip: false
name: 亢奋
resource_id: "7166472327801097476"
- effect_id: "7505804389395877120"
has_params: true
is_vip: false
name: 亮夏
resource_id: "7505804389395877120"
- effect_id: "7127655008715230495"
has_params: false
is_vip: false
name: 亮肤
resource_id: "7127655008715230495"
- effect_id: "7127675970252754189"
has_params: false
is_vip: false
name: 仲夏绿光
resource_id: "7127675970252754189"
- effect_id: "7188014191834418493"
has_params: false
is_vip: false
name: 似锦
resource_id: "7188014191834418493"
- effect_id: "7304170509661506843"
has_params: false
is_vip: false
name: 低保真
resource_id: "7304170509661506843"
- effect_id: "7127609569416711455"
has_params: false
is_vip: false
name: 侘寂灰
resource_id: "7127609569416711455"
- effect_id: "7457859598221987110"
has_params: true
is_vip: false
name: 元气新年
resource_id: "7457859598221987110"
- effect_id: "7366640728493002018"
has_params: true
is_vip: false
name: 克洛伊
resource_id: "7366640728493002018"
- effect_id: "7101096733958065421"
has_params: false
is_vip: false
name: 入夏
resource_id: "7101096733958065421"
- effect_id: "7449704838763466035"
has_params: true
is_vip: false
name: 冬日烧烤
resource_id: "7449704838763466035"
- effect_id: "7302324323270872346"
has_params: false
is_vip: false
name: 冬漫
resource_id: "7302324323270872346"
- effect_id: "7300786822068571418"
has_params: false
is_vip: false
name: 冬离
resource_id: "7300786822068571418"
- effect_id: "7303812389177265447"
has_params: false
is_vip: false
name: 冰火
resource_id: "7303812389177265447"
- effect_id: "7199089344756370743"
has_params: false
is_vip: false
name: 冰肌
resource_id: "7199089344756370743"
- effect_id: "7263359186883366155"
has_params: false
is_vip: false
name: 冷气机
resource_id: "7263359186883366155"
- effect_id: "7127614731187178783"
has_params: false
is_vip: false
name: 冷白
resource_id: "7127614731187178783"
- effect_id: "7127618237117877518"
has_params: false
is_vip: false
name: 冷蓝
resource_id: "7127618237117877518"
- effect_id: "7411580367452376361"
has_params: true
is_vip: false
name: 净白肤
resource_id: "7411580367452376361"
- effect_id: "7449996162343390473"
has_params: true
is_vip: false
name: 凛冬
resource_id: "7449996162343390473"
- effect_id: "7298279202350976282"
has_params: true
is_vip: false
name: 凝黛
resource_id: "7298279202350976282"
- effect_id: "7195812984306814267"
has_params: false
is_vip: false
name: 初恋
resource_id: "7195812984306814267"
- effect_id: "7127824119294364959"
has_params: false
is_vip: false
name: 千玺IXU
resource_id: "7127824119294364959"
- effect_id: "7208495854938901793"
has_params: false
is_vip: false
name: 千里江山
resource_id: "7208495854938901793"
- effect_id: "7370585884078443802"
has_params: true
is_vip: false
name: 千金妝
resource_id: "7370585884078443802"
- effect_id: "7301224597033192716"
has_params: false
is_vip: false
name: 卡露尔
resource_id: "7301224597033192716"
- effect_id: "7127675868641594654"
has_params: false
is_vip: false
name: 即刻春光
resource_id: "7127675868641594654"
- effect_id: "7127675195812351239"
has_params: false
is_vip: false
name: 原木
resource_id: "7127675195812351239"
- effect_id: "7438854064458239258"
has_params: true
is_vip: false
name: 去黄增质
resource_id: "7438854064458239258"
- effect_id: "7438853477616340250"
has_params: true
is_vip: false
name: 去黄提亮
resource_id: "7438853477616340250"
- effect_id: "7462953965160893723"
has_params: true
is_vip: false
name: 古早韩系
resource_id: "7462953965160893723"
- effect_id: "7473168869222370571"
has_params: true
is_vip: false
name: 古早韩风
resource_id: "7473168869222370571"
- effect_id: "7242212640498568503"
has_params: false
is_vip: false
name: 古罗马
resource_id: "7242212640498568503"
- effect_id: "7404104823563472137"
has_params: true
is_vip: false
name: 古风影视
resource_id: "7404104823563472137"
- effect_id: "7437136821512949007"
has_params: true
is_vip: false
name: 告白
resource_id: "7437136821512949007"
- effect_id: "7185440129442417931"
has_params: false
is_vip: false
name: 喜市
resource_id: "7185440129442417931"
- effect_id: "7451265649273261363"
has_params: true
is_vip: false
name: 喜庆胶片
resource_id: "7451265649273261363"
- effect_id: "7312102522733268251"
has_params: false
is_vip: false
name: 四喜
resource_id: "7312102522733268251"
- effect_id: "7429295645669756195"
has_params: true
is_vip: false
name: 圣诞灯光
resource_id: "7429295645669756195"
- effect_id: "7429295455953046818"
has_params: true
is_vip: false
name: 圣诞灯光II
resource_id: "7429295455953046818"
- effect_id: "7429296137275755810"
has_params: true
is_vip: false
name: 圣诞灯光III
resource_id: "7429296137275755810"
- effect_id: "7127608212483820837"
has_params: false
is_vip: false
name: 复古工业
resource_id: "7127608212483820837"
- effect_id: "7494125821032975642"
has_params: true
is_vip: false
name: 夏日小美好
resource_id: "7494125821032975642"
- effect_id: "7208548640279760140"
has_params: false
is_vip: false
name: 夏日泡泡
resource_id: "7208548640279760140"
- effect_id: "7505632228659973416"
has_params: true
is_vip: false
name: 夏日清凉
resource_id: "7505632228659973416"
- effect_id: "7502729392179776779"
has_params: true
is_vip: false
name: 夏日辣妹
resource_id: "7502729392179776779"
- effect_id: "7127684611802418445"
has_params: false
is_vip: false
name: 夏日风吟
resource_id: "7127684611802418445"
- effect_id: "7244817652424641830"
has_params: true
is_vip: false
name: 夏荷青瓷
resource_id: "7244817652424641830"
- effect_id: "7493423027670109449"
has_params: true
is_vip: false
name: 大唐盛世
resource_id: "7493423027670109449"
- effect_id: "7351684015906147621"
has_params: false
is_vip: false
name: 奈良
resource_id: "7351684015906147621"
- effect_id: "7271142654505766183"
has_params: false
is_vip: false
name: 奥本海默
resource_id: "7271142654505766183"
- effect_id: "7297134192100379938"
has_params: false
is_vip: false
name: 奶杏
resource_id: "7297134192100379938"
- effect_id: "7127618513048571173"
has_params: false
is_vip: false
name: 奶油
resource_id: "7127618513048571173"
- effect_id: "7463296170950020403"
has_params: true
is_vip: false
name: 奶油肤
resource_id: "7463296170950020403"
- effect_id: "7127684319300029733"
has_params: false
is_vip: false
name: 奶绿
resource_id: "7127684319300029733"
- effect_id: "7127624030135389471"
has_params: false
is_vip: false
name: 姜饼红
resource_id: "7127624030135389471"
- effect_id: "7406553962922429735"
has_params: true
is_vip: false
name: 威尼之都
resource_id: "7406553962922429735"
- effect_id: "7190242827543022880"
has_params: false
is_vip: false
name: 安愉
resource_id: "7190242827543022880"
- effect_id: "7500223670678228262"
has_params: true
is_vip: false
name: 宫崎漫夏
resource_id: "7500223670678228262"
- effect_id: "7268561903721401641"
has_params: false
is_vip: false
name: 富士CC II
resource_id: "7268561903721401641"
- effect_id: "7295362817874480425"
has_params: false
is_vip: false
name: 寻荷
resource_id: "7295362817874480425"
- effect_id: "7127654151688965384"
has_params: false
is_vip: false
name: 小镇
resource_id: "7127654151688965384"
- effect_id: "7127662738884545806"
has_params: false
is_vip: false
name: 山系
resource_id: "7127662738884545806"
- effect_id: "7363220647767592243"
has_params: false
is_vip: false
name: 巧克力
resource_id: "7363220647767592243"
- effect_id: "7242208887883992381"
has_params: false
is_vip: false
name: 布兰卡
resource_id: "7242208887883992381"
- effect_id: "7273777590102527290"
has_params: false
is_vip: false
name: 布朗
resource_id: "7273777590102527290"
- effect_id: "7271141541521968396"
has_params: false
is_vip: false
name: 希望
resource_id: "7271141541521968396"
- effect_id: "7330441280016715062"
has_params: true
is_vip: false
name: 幽蓝
resource_id: "7330441280016715062"
- effect_id: "7175101541198679353"
has_params: false
is_vip: false
name: 彩果
resource_id: "7175101541198679353"
- effect_id: "7226234868059917628"
has_params: false
is_vip: false
name: 彩檐
resource_id: "7226234868059917628"
- effect_id: "7349953761059638555"
has_params: false
is_vip: false
name: 影叙
resource_id: "7349953761059638555"
- effect_id: "7338406163848940840"
has_params: true
is_vip: false
name: 微澜
resource_id: "7338406163848940840"
- effect_id: "7127678346472819982"
has_params: false
is_vip: false
name: 德古拉
resource_id: "7127678346472819982"
- effect_id: "7143537677655100709"
has_params: false
is_vip: false
name: 快照I
resource_id: "7143537677655100709"
- effect_id: "7330123964305378586"
has_params: false
is_vip: false
name: 忽风
resource_id: "7330123964305378586"
- effect_id: "7505461557237730598"
has_params: true
is_vip: false
name: 情感电影
resource_id: "7505461557237730598"
- effect_id: "7420000959759224118"
has_params: true
is_vip: false
name: 情绪电影
resource_id: "7420000959759224118"
- effect_id: "7376146305736822028"
has_params: true
is_vip: false
name: 扫街
resource_id: "7376146305736822028"
- effect_id: "7411911267859860746"
has_params: true
is_vip: false
name: 探店博主III
resource_id: "7411911267859860746"
- effect_id: "7437011056653847808"
has_params: true
is_vip: false
name: 摩卡灰
resource_id: "7437011056653847808"
- effect_id: "7127568601921408293"
has_params: false
is_vip: false
name: 敦刻尔克
resource_id: "7127568601921408293"
- effect_id: "7127656350833806622"
has_params: false
is_vip: false
name: 料理
resource_id: "7127656350833806622"
- effect_id: "7445550576210873663"
has_params: true
is_vip: false
name: 新年电影
resource_id: "7445550576210873663"
- effect_id: "7342395072199019803"
has_params: true
is_vip: false
name: 新闪
resource_id: "7342395072199019803"
- effect_id: "7325383700240256296"
has_params: false
is_vip: false
name: 日出
resource_id: "7325383700240256296"
- effect_id: "7127664177870671135"
has_params: false
is_vip: false
name: 日系奶油
resource_id: "7127664177870671135"
- effect_id: "7127669630667066655"
has_params: false
is_vip: false
name: 日落橘
resource_id: "7127669630667066655"
- effect_id: "7505662247407013135"
has_params: true
is_vip: false
name: 日落飞车
resource_id: "7505662247407013135"
- effect_id: "7239977329668263227"
has_params: false
is_vip: false
name: 旧乐园
resource_id: "7239977329668263227"
- effect_id: "7232218563270954300"
has_params: false
is_vip: false
name: 旧时代I
resource_id: "7232218563270954300"
- effect_id: "7367715162964446516"
has_params: true
is_vip: false
name: 明晰
resource_id: "7367715162964446516"
- effect_id: "7127672042069036319"
has_params: false
is_vip: false
name: 星云
resource_id: "7127672042069036319"
- effect_id: "7459274314634775827"
has_params: true
is_vip: false
name: 春日暖阳
resource_id: "7459274314634775827"
- effect_id: "7463345622440037658"
has_params: true
is_vip: false
name: 春日绿妍
resource_id: "7463345622440037658"
- effect_id: "7505660075252485376"
has_params: true
is_vip: false
name: 昭和夏
resource_id: "7505660075252485376"
- effect_id: "7468552996008299791"
has_params: true
is_vip: false
name: 晴好春日
resource_id: "7468552996008299791"
- effect_id: "7342503492311076137"
has_params: true
is_vip: false
name: 晴沐
resource_id: "7342503492311076137"
- effect_id: "7472763263684578572"
has_params: true
is_vip: false
name: 晴研
resource_id: "7472763263684578572"
- effect_id: "7127653100269210916"
has_params: false
is_vip: false
name: 暖食
resource_id: "7127653100269210916"
- effect_id: "7127823728070659358"
has_params: false
is_vip: false
name: 暗夜
resource_id: "7127823728070659358"
- effect_id: "7463118934061993242"
has_params: true
is_vip: false
name: 暗调氛围
resource_id: "7463118934061993242"
- effect_id: "7127656352410848548"
has_params: false
is_vip: false
name: 暗雅
resource_id: "7127656352410848548"
- effect_id: "7242211155131862332"
has_params: false
is_vip: false
name: 暮光
resource_id: "7242211155131862332"
- effect_id: "7127594686541237535"
has_params: false
is_vip: false
name: 暮色
resource_id: "7127594686541237535"
- effect_id: "7127819487419567373"
has_params: false
is_vip: false
name: 月升之国
resource_id: "7127819487419567373"
- effect_id: "7143532202112912670"
has_params: false
is_vip: false
name: 月夜
resource_id: "7143532202112912670"
- effect_id: "7340282260312182050"
has_params: true
is_vip: false
name: 未央
resource_id: "7340282260312182050"
- effect_id: "7299055174880988479"
has_params: true
is_vip: false
name: 朱栗
resource_id: "7299055174880988479"
- effect_id: "7127669342325443854"
has_params: false
is_vip: false
name: 松果棕
resource_id: "7127669342325443854"
- effect_id: "7127663793827564808"
has_params: false
is_vip: false
name: 林间
resource_id: "7127663793827564808"
- effect_id: "7127676358766923016"
has_params: false
is_vip: false
name: 柠檬青
resource_id: "7127676358766923016"
- effect_id: "7345493751416016166"
has_params: false
is_vip: false
name: 梨花白
resource_id: "7345493751416016166"
- effect_id: "7341767383259942155"
has_params: true
is_vip: false
name: 梵时
resource_id: "7341767383259942155"
- effect_id: "7273779209934245179"
has_params: false
is_vip: false
name: 棕咖
resource_id: "7273779209934245179"
- effect_id: "7332348414933421366"
has_params: true
is_vip: false
name: 棕宥
resource_id: "7332348414933421366"
- effect_id: "7329819965920398604"
has_params: false
is_vip: false
name: 棠梨
resource_id: "7329819965920398604"
- effect_id: "7252674515287788856"
has_params: false
is_vip: false
name: 椰林
resource_id: "7252674515287788856"
- effect_id: "7341032461234654475"
has_params: true
is_vip: false
name: 椿和
resource_id: "7341032461234654475"
- effect_id: "7347729407181704498"
has_params: false
is_vip: false
name: 椿来
resource_id: "7347729407181704498"
- effect_id: "7127632545272925470"
has_params: false
is_vip: false
name: 樱粉
resource_id: "7127632545272925470"
- effect_id: "7127657040348040479"
has_params: false
is_vip: false
name: 比佛利
resource_id: "7127657040348040479"
- effect_id: "7127619120761212168"
has_params: false
is_vip: false
name: 气泡水
resource_id: "7127619120761212168"
- effect_id: "7127838224344435981"
has_params: false
is_vip: false
name: 江浙沪
resource_id: "7127838224344435981"
- effect_id: "7454497262480231718"
has_params: true
is_vip: false
name: 治愈萌宠
resource_id: "7454497262480231718"
- effect_id: "7208495760520842529"
has_params: false
is_vip: false
name: 泥金
resource_id: "7208495760520842529"
- effect_id: "7493764749054709001"
has_params: true
is_vip: false
name: 活力夏
resource_id: "7493764749054709001"
- effect_id: "7127675565779307789"
has_params: false
is_vip: false
name: 流光金属
resource_id: "7127675565779307789"
- effect_id: "7281163331245821239"
has_params: false
is_vip: false
name: 浅岛
resource_id: "7281163331245821239"
- effect_id: "7446098658942078258"
has_params: true
is_vip: false
name: 浪漫烟火
resource_id: "7446098658942078258"
- effect_id: "7340687187194678569"
has_params: true
is_vip: false
name: 浮生
resource_id: "7340687187194678569"
- effect_id: "7401018435674688787"
has_params: true
is_vip: false
name: 海浪梦境
resource_id: "7401018435674688787"
- effect_id: "7127615915004366116"
has_params: false
is_vip: false
name: 海街日记
resource_id: "7127615915004366116"
- effect_id: "7189595107610447163"
has_params: false
is_vip: false
name: 海雾
resource_id: "7189595107610447163"
- effect_id: "7127830050786823437"
has_params: false
is_vip: false
name: 海鸥DC
resource_id: "7127830050786823437"
- effect_id: "7414897963752770828"
has_params: true
is_vip: false
name: 深沉
resource_id: "7414897963752770828"
- effect_id: "7295596083101633842"
has_params: false
is_vip: false
name: 深秋
resource_id: "7295596083101633842"
- effect_id: "7127615347703811336"
has_params: false
is_vip: false
name: 深褐
resource_id: "7127615347703811336"
- effect_id: "7405602958748028186"
has_params: true
is_vip: false
name: 清冷
resource_id: "7405602958748028186"
- effect_id: "7449939213430082867"
has_params: true
is_vip: false
name: 清冷冬日
resource_id: "7449939213430082867"
- effect_id: "7469310117079420211"
has_params: true
is_vip: false
name: 清新
resource_id: "7469310117079420211"
- effect_id: "7503936728286252323"
has_params: true
is_vip: false
name: 清新夏颜
resource_id: "7503936728286252323"
- effect_id: "7480517561486953779"
has_params: true
is_vip: false
name: 清新漫和
resource_id: "7480517561486953779"
- effect_id: "7208495962887621899"
has_params: false
is_vip: false
name: 清明上河
resource_id: "7208495962887621899"
- effect_id: "7433813603758722342"
has_params: true
is_vip: false
name: 清晰明亮
resource_id: "7433813603758722342"
- effect_id: "7448652759869525287"
has_params: true
is_vip: false
name: 清晰烟花
resource_id: "7448652759869525287"
- effect_id: "7359419156619332902"
has_params: false
is_vip: false
name: 清澈
resource_id: "7359419156619332902"
- effect_id: "7482047649831570726"
has_params: true
is_vip: false
name: 清透自然
resource_id: "7482047649831570726"
- effect_id: "7351580023742090535"
has_params: false
is_vip: false
name: 温述
resource_id: "7351580023742090535"
- effect_id: "7346017304909581587"
has_params: false
is_vip: false
name: 港历
resource_id: "7346017304909581587"
- effect_id: "7127830945243090184"
has_params: false
is_vip: false
name: 港风
resource_id: "7127830945243090184"
- effect_id: "7396701250764426546"
has_params: true
is_vip: false
name: 演唱会
resource_id: "7396701250764426546"
- effect_id: "7366616947703991571"
has_params: true
is_vip: false
name: 漫夏
resource_id: "7366616947703991571"
- effect_id: "7177269429972045089"
has_params: false
is_vip: false
name: 漫彩
resource_id: "7177269429972045089"
- effect_id: "7332866997128105228"
has_params: true
is_vip: false
name: 漫春
resource_id: "7332866997128105228"
- effect_id: "7263357613050563852"
has_params: false
is_vip: false
name: 漫步
resource_id: "7263357613050563852"
- effect_id: "7312002825054211378"
has_params: false
is_vip: false
name: 漫谷
resource_id: "7312002825054211378"
- effect_id: "7409669784155000090"
has_params: true
is_vip: false
name: 烈焰红
resource_id: "7409669784155000090"
- effect_id: "7127675183246200072"
has_params: false
is_vip: false
name: 烘培
resource_id: "7127675183246200072"
- effect_id: "7341204799590763788"
has_params: true
is_vip: false
name: 烟岚
resource_id: "7341204799590763788"
- effect_id: "7446098755905965338"
has_params: true
is_vip: false
name: 烟火增色
resource_id: "7446098755905965338"
- effect_id: "7444905127871270181"
has_params: true
is_vip: false
name: 烟花增强
resource_id: "7444905127871270181"
- effect_id: "7143533042978524424"
has_params: false
is_vip: false
name: 烟霞
resource_id: "7143533042978524424"
- effect_id: "7471880541189492007"
has_params: true
is_vip: false
name: 热烈
resource_id: "7471880541189492007"
- effect_id: "7297144048903556388"
has_params: false
is_vip: false
name: 煦日
resource_id: "7297144048903556388"
- effect_id: "7143575737881120037"
has_params: false
is_vip: false
name: 熔金
resource_id: "7143575737881120037"
- effect_id: "7248571956860079395"
has_params: false
is_vip: false
name: 燃力
resource_id: "7248571956860079395"
- effect_id: "7127822013074263310"
has_params: false
is_vip: false
name: 牛皮纸
resource_id: "7127822013074263310"
- effect_id: "7127657509501914399"
has_params: false
is_vip: false
name: 珠光蓝
resource_id: "7127657509501914399"
- effect_id: "7213575938615872823"
has_params: false
is_vip: false
name: 珠落
resource_id: "7213575938615872823"
- effect_id: "7291179909718740259"
has_params: false
is_vip: false
name: 病娇
resource_id: "7291179909718740259"
- effect_id: "7359223280714239268"
has_params: false
is_vip: false
name: 盐岚
resource_id: "7359223280714239268"
- effect_id: "7281162649314889015"
has_params: false
is_vip: false
name: 矿野
resource_id: "7281162649314889015"
- effect_id: "7300758676732677427"
has_params: false
is_vip: false
name: 砂红
resource_id: "7300758676732677427"
- effect_id: "7340915058542759219"
has_params: true
is_vip: false
name: 砾绀
resource_id: "7340915058542759219"
- effect_id: "7353555308448419098"
has_params: false
is_vip: false
name: 空灵
resource_id: "7353555308448419098"
- effect_id: "7143532176313699620"
has_params: false
is_vip: false
name: 空谷
resource_id: "7143532176313699620"
- effect_id: "7208496463293320480"
has_params: false
is_vip: false
name: 竹绢
resource_id: "7208496463293320480"
- effect_id: "7221477781043973413"
has_params: false
is_vip: false
name: 米棕
resource_id: "7221477781043973413"
- effect_id: "7127667757998411044"
has_params: false
is_vip: false
name: 粉瓷
resource_id: "7127667757998411044"
- effect_id: "7296493947625557286"
has_params: false
is_vip: false
name: 粉肤
resource_id: "7296493947625557286"
- effect_id: "7373693828328475941"
has_params: true
is_vip: false
name: 粹光
resource_id: "7373693828328475941"
- effect_id: "7127671162758270245"
has_params: false
is_vip: false
name: 素肌
resource_id: "7127671162758270245"
- effect_id: "7127622617699290399"
has_params: false
is_vip: false
name: 红绿
resource_id: "7127622617699290399"
- effect_id: "7127667361456426248"
has_params: false
is_vip: false
name: 绝对红
resource_id: "7127667361456426248"
- effect_id: "7127675252410223909"
has_params: false
is_vip: false
name: 绿妍
resource_id: "7127675252410223909"
- effect_id: "7414142998075690279"
has_params: true
is_vip: false
name: 美味
resource_id: "7414142998075690279"
- effect_id: "7127669912050420999"
has_params: false
is_vip: false
name: 老友记
resource_id: "7127669912050420999"
- effect_id: "7127830961621847310"
has_params: false
is_vip: false
name: 胡桃木
resource_id: "7127830961621847310"
- effect_id: "7127821314198342943"
has_params: false
is_vip: false
name: 自然
resource_id: "7127821314198342943"
- effect_id: "7412691247992671497"
has_params: true
is_vip: false
name: 自然清晰
resource_id: "7412691247992671497"
- effect_id: "7271143155544739108"
has_params: false
is_vip: false
name: 自由
resource_id: "7271143155544739108"
- effect_id: "7306726303594564904"
has_params: false
is_vip: false
name: 臻金
resource_id: "7306726303594564904"
- effect_id: "7226990672190950713"
has_params: false
is_vip: false
name: 花园
resource_id: "7226990672190950713"
- effect_id: "7127539889553427719"
has_params: false
is_vip: false
name: 花椿
resource_id: "7127539889553427719"
- effect_id: "7175071186185964812"
has_params: false
is_vip: false
name: 花火
resource_id: "7175071186185964812"
- effect_id: "7460022261144177957"
has_params: true
is_vip: false
name: 花火夜焰
resource_id: "7460022261144177957"
- effect_id: "7505429510930730275"
has_params: true
is_vip: false
name: 花花世界
resource_id: "7505429510930730275"
- effect_id: "7166494058305670432"
has_params: false
is_vip: false
name: 落日
resource_id: "7166494058305670432"
- effect_id: "7369501986401570099"
has_params: true
is_vip: false
name: 落日海岛
resource_id: "7369501986401570099"
- effect_id: "7350133636890463498"
has_params: false
is_vip: false
name: 落日飞车
resource_id: "7350133636890463498"
- effect_id: "7375415880118783295"
has_params: true
is_vip: false
name: 落牧
resource_id: "7375415880118783295"
- effect_id: "7127671519450320159"
has_params: false
is_vip: false
name: 蒸汽波
resource_id: "7127671519450320159"
- effect_id: "7343782317820857641"
has_params: true
is_vip: false
name: 薄荷
resource_id: "7343782317820857641"
- effect_id: "7127668404764380447"
has_params: false
is_vip: false
name: 褪色
resource_id: "7127668404764380447"
- effect_id: "7331590962696834313"
has_params: false
is_vip: false
name: 西野
resource_id: "7331590962696834313"
- effect_id: "7127668806398315806"
has_params: false
is_vip: false
name: 西餐
resource_id: "7127668806398315806"
- effect_id: "7301212776532380966"
has_params: false
is_vip: false
name: 谧歌
resource_id: "7301212776532380966"
- effect_id: "7127668616991952158"
has_params: false
is_vip: false
name: 贝松绿
resource_id: "7127668616991952158"
- effect_id: "7127653798155209997"
has_params: false
is_vip: false
name: 质感暗调
resource_id: "7127653798155209997"
- effect_id: "7395858604311596299"
has_params: true
is_vip: false
name: 质感电影
resource_id: "7395858604311596299"
- effect_id: "7127657979838516494"
has_params: false
is_vip: false
name: 赛博朋克
resource_id: "7127657979838516494"
- effect_id: "7226251886360300837"
has_params: false
is_vip: false
name: 赤陀
resource_id: "7226251886360300837"
- effect_id: "7127663117508660517"
has_params: false
is_vip: false
name: 赫本
resource_id: "7127663117508660517"
- effect_id: "7302823953406446899"
has_params: false
is_vip: false
name: 赫石
resource_id: "7302823953406446899"
- effect_id: "7127621137705618724"
has_params: false
is_vip: false
name: 轻食
resource_id: "7127621137705618724"
- effect_id: "7300602459356040484"
has_params: true
is_vip: false
name: 达芬妮
resource_id: "7300602459356040484"
- effect_id: "7127684611450178823"
has_params: false
is_vip: false
name: 迈阿密
resource_id: "7127684611450178823"
- effect_id: "7127676762514885919"
has_params: false
is_vip: false
name: 酷白
resource_id: "7127676762514885919"
- effect_id: "7246617998516063527"
has_params: false
is_vip: false
name: 野餐
resource_id: "7246617998516063527"
- effect_id: "7127654151688949000"
has_params: false
is_vip: false
name: 金属
resource_id: "7127654151688949000"
- effect_id: "7364705637931994405"
has_params: false
is_vip: false
name: 闪光灯
resource_id: "7364705637931994405"
- effect_id: "7452726092126833959"
has_params: true
is_vip: false
name: 闪胶回忆
resource_id: "7452726092126833959"
- effect_id: "7127823728267775263"
has_params: false
is_vip: false
name: 闻香识人
resource_id: "7127823728267775263"
- effect_id: "7299130097632627979"
has_params: true
is_vip: false
name: 阿尔菲
resource_id: "7299130097632627979"
- effect_id: "7302796570947243264"
has_params: false
is_vip: false
name: 雪鹿
resource_id: "7302796570947243264"
- effect_id: "7169239634076060960"
has_params: false
is_vip: false
name: 雾瓷
resource_id: "7169239634076060960"
- effect_id: "7505676110412254527"
has_params: true
is_vip: false
name: 青春古早
resource_id: "7505676110412254527"
- effect_id: "7127615575865478430"
has_params: false
is_vip: false
name: 青橙
resource_id: "7127615575865478430"
- effect_id: "7401896022214970650"
has_params: true
is_vip: false
name: 青橙电影
resource_id: "7401896022214970650"
- effect_id: "7281575818621455628"
has_params: false
is_vip: false
name: 青红夜
resource_id: "7281575818621455628"
- effect_id: "7405834787132280079"
has_params: true
is_vip: false
name: 音乐节
resource_id: "7405834787132280079"
- effect_id: "7211001257996127547"
has_params: false
is_vip: false
name: 风铃
resource_id: "7211001257996127547"
- effect_id: "7175094003493309757"
has_params: false
is_vip: false
name: 香松
resource_id: "7175094003493309757"
- effect_id: "7452548610971012379"
has_params: true
is_vip: false
name: 高清4K电影
resource_id: "7452548610971012379"
- effect_id: "7450317804554685708"
has_params: true
is_vip: false
name: 高清冬日
resource_id: "7450317804554685708"
- effect_id: "7434564801990266162"
has_params: true
is_vip: false
name: 高清明亮
resource_id: "7434564801990266162"
- effect_id: "7404503340576410906"
has_params: true
is_vip: false
name: 高清润白
resource_id: "7404503340576410906"
- effect_id: "7446098482013768970"
has_params: true
is_vip: false
name: 高清烟火
resource_id: "7446098482013768970"
- effect_id: "7460008665286855973"
has_params: true
is_vip: false
name: 高清福气
resource_id: "7460008665286855973"
- effect_id: "7127653121966230814"
has_params: false
is_vip: false
name: 高饱和
resource_id: "7127653121966230814"
- effect_id: "7291201164027252024"
has_params: false
is_vip: false
name: 鬼魅
resource_id: "7291201164027252024"
- effect_id: "7441227246326582537"
has_params: true
is_vip: false
name: 鲜亮食光
resource_id: "7441227246326582537"
- effect_id: "7460115630973340940"
has_params: true
is_vip: false
name: 鲜美年味
resource_id: "7460115630973340940"
- effect_id: "7221805176410180921"
has_params: false
is_vip: false
name: 黑胶唱片
resource_id: "7221805176410180921"
- effect_id: "7175100298610871610"
has_params: false
is_vip: false
name: 黑莓
resource_id: "7175100298610871610"
- effect_id: "7202475126485503236"
has_params: false
is_vip: false
name: 黑豹
resource_id: "7202475126485503236"
- effect_id: "7127655037026848031"
has_params: false
is_vip: false
name: 默片
resource_id: "7127655037026848031"
- effect_id: "7190249807682800954"
has_params: false
is_vip: true
name: 160C
resource_id: "7190249807682800954"
- effect_id: "7131347316111314189"
has_params: false
is_vip: true
name: "2077"
resource_id: "7131347316111314189"
- effect_id: "7190236487152127269"
has_params: false
is_vip: true
name: 400H
resource_id: "7190236487152127269"
- effect_id: "7477802799862992138"
has_params: true
is_vip: true
name: 4K画质
resource_id: "7477802799862992138"
- effect_id: "7478641636092775743"
has_params: true
is_vip: true
name: 4K画质电影
resource_id: "7478641636092775743"
- effect_id: "7480203423095213362"
has_params: true
is_vip: true
name: 4K高品质
resource_id: "7480203423095213362"
- effect_id: "7190237757552348471"
has_params: false
is_vip: true
name: 800Z
resource_id: "7190237757552348471"
- effect_id: "7478895015901613375"
has_params: true
is_vip: true
name: 8K画质
resource_id: "7478895015901613375"
- effect_id: "7131366613823114503"
has_params: false
is_vip: true
name: 90s
resource_id: "7131366613823114503"
- effect_id: "7263360572404550931"
has_params: false
is_vip: true
name: City Walk
resource_id: "7263360572404550931"
- effect_id: "7200697197002886404"
has_params: false
is_vip: true
name: EOS3
resource_id: "7200697197002886404"
- effect_id: "7332480052392774975"
has_params: false
is_vip: true
name: FXN
resource_id: "7332480052392774975"
- effect_id: "7168098796860148995"
has_params: false
is_vip: true
name: GR正片
resource_id: "7168098796860148995"
- effect_id: "7168121440141708576"
has_params: false
is_vip: true
name: GR绿
resource_id: "7168121440141708576"
- effect_id: "7168097661160131879"
has_params: false
is_vip: true
name: GR蓝
resource_id: "7168097661160131879"
- effect_id: "7221479156318489893"
has_params: false
is_vip: true
name: IG白
resource_id: "7221479156318489893"
- effect_id: "7438279481191599411"
has_params: true
is_vip: true
name: INS亮肤
resource_id: "7438279481191599411"
- effect_id: "7438279661588581669"
has_params: true
is_vip: true
name: INS晴肤
resource_id: "7438279661588581669"
- effect_id: "7223645151820877093"
has_params: false
is_vip: true
name: INS暗
resource_id: "7223645151820877093"
- effect_id: "7473409650746985779"
has_params: true
is_vip: true
name: INS暗调
resource_id: "7473409650746985779"
- effect_id: "7438646040036789542"
has_params: true
is_vip: true
name: INS柔肤
resource_id: "7438646040036789542"
- effect_id: "7200712753324035339"
has_params: false
is_vip: true
name: KONICA
resource_id: "7200712753324035339"
- effect_id: "7127669605199318280"
has_params: false
is_vip: true
name: KU4
resource_id: "7127669605199318280"
- effect_id: "7200999937960627459"
has_params: false
is_vip: true
name: PENTAX
resource_id: "7200999937960627459"
- effect_id: "7493462285889899803"
has_params: false
is_vip: true
name: Pocket3
resource_id: "7493462285889899803"
- effect_id: "7398034408139230490"
has_params: true
is_vip: true
name: Y3K
resource_id: "7398034408139230490"
- effect_id: "7493542918276320539"
has_params: true
is_vip: true
name: doll感透白
resource_id: "7493542918276320539"
- effect_id: "7393943544089627930"
has_params: true
is_vip: true
name: iPhone6s
resource_id: "7393943544089627930"
- effect_id: "7426749131344841995"
has_params: true
is_vip: true
name: 万圣
resource_id: "7426749131344841995"
- effect_id: "7503602197586791743"
has_params: true
is_vip: true
name: 下雨天
resource_id: "7503602197586791743"
- effect_id: "7202480720843984131"
has_params: false
is_vip: true
name: 不要抬头
resource_id: "7202480720843984131"
- effect_id: "7495673180904885516"
has_params: true
is_vip: true
name: 丝滑皮肤
resource_id: "7495673180904885516"
- effect_id: "7127621445806525704"
has_params: false
is_vip: true
name: 中性
resource_id: "7127621445806525704"
- effect_id: "7312646907908607244"
has_params: false
is_vip: true
name: 中性II
resource_id: "7312646907908607244"
- effect_id: "7297138825359281423"
has_params: false
is_vip: true
name: 丹枫
resource_id: "7297138825359281423"
- effect_id: "7193982146363673856"
has_params: false
is_vip: true
name: 乐游
resource_id: "7193982146363673856"
- effect_id: "7314883649999015231"
has_params: false
is_vip: true
name: 云暖
resource_id: "7314883649999015231"
- effect_id: "7393338906369903910"
has_params: true
is_vip: true
name: 亚裔II
resource_id: "7393338906369903910"
- effect_id: "7127679758581697822"
has_params: false
is_vip: true
name: 京都
resource_id: "7127679758581697822"
- effect_id: "7302325291634920755"
has_params: false
is_vip: true
name: 亭竹
resource_id: "7302325291634920755"
- effect_id: "7413406043608272154"
has_params: true
is_vip: true
name: 亮丽
resource_id: "7413406043608272154"
- effect_id: "7148844086869396743"
has_params: false
is_vip: true
name: 人生之事
resource_id: "7148844086869396743"
- effect_id: "7127575884780817672"
has_params: false
is_vip: true
name: 仲夏
resource_id: "7127575884780817672"
- effect_id: "7281166048273943867"
has_params: false
is_vip: true
name: 仲夏夜
resource_id: "7281166048273943867"
- effect_id: "7503844955467648283"
has_params: true
is_vip: true
name: 仿撕拉片
resource_id: "7503844955467648283"
- effect_id: "7195781682492984636"
has_params: false
is_vip: true
name: 伊豆
resource_id: "7195781682492984636"
- effect_id: "7516859499404119296"
has_params: true
is_vip: true
name: 伤感故事电影
resource_id: "7516859499404119296"
- effect_id: "7498948996816194843"
has_params: true
is_vip: true
name: 伤感电影
resource_id: "7498948996816194843"
- effect_id: "7278616064018107707"
has_params: false
is_vip: true
name: 余晖
resource_id: "7278616064018107707"
- effect_id: "7485292050917657906"
has_params: false
is_vip: true
name: 佳能G12
resource_id: "7485292050917657906"
- effect_id: "7291597100389862707"
has_params: false
is_vip: true
name: 佳能G7X II
resource_id: "7291597100389862707"
- effect_id: "7291595038688136474"
has_params: false
is_vip: true
name: 佳能G7X III
resource_id: "7291595038688136474"
- effect_id: "7394713676789353737"
has_params: true
is_vip: true
name: 俏皮萌宠
resource_id: "7394713676789353737"
- effect_id: "7239235794744003851"
has_params: false
is_vip: true
name: 俱乐部
resource_id: "7239235794744003851"
- effect_id: "7332714336315526409"
has_params: true
is_vip: true
name: 倾森
resource_id: "7332714336315526409"
- effect_id: "7405115979107274020"
has_params: true
is_vip: true
name: 假日海滩
resource_id: "7405115979107274020"
- effect_id: "7517179906292190501"
has_params: true
is_vip: true
name: 假日电影感
resource_id: "7517179906292190501"
- effect_id: "7500860668199914790"
has_params: true
is_vip: true
name: 健身II
resource_id: "7500860668199914790"
- effect_id: "7226990270053649725"
has_params: false
is_vip: true
name: 傍晚
resource_id: "7226990270053649725"
- effect_id: "7467923122545544499"
has_params: true
is_vip: true
name: 元宵祈福
resource_id: "7467923122545544499"
- effect_id: "7472748943953169727"
has_params: true
is_vip: true
name: 元气粉肌
resource_id: "7472748943953169727"
- effect_id: "7233732009070300473"
has_params: true
is_vip: true
name: 光流
resource_id: "7233732009070300473"
- effect_id: "7444960658178821414"
has_params: true
is_vip: true
name: 冬日物语
resource_id: "7444960658178821414"
- effect_id: "7446453265190948132"
has_params: true
is_vip: true
name: 冬日电影II
resource_id: "7446453265190948132"
- effect_id: "7190250133672578316"
has_params: false
is_vip: true
name: 冬禧
resource_id: "7190250133672578316"
- effect_id: "7258221827485486393"
has_params: false
is_vip: true
name: 冰夏
resource_id: "7258221827485486393"
- effect_id: "7494313060480388389"
has_params: true
is_vip: true
name: 冰清蓝
resource_id: "7494313060480388389"
- effect_id: "7196927862056701240"
has_params: false
is_vip: true
name: 冰瀑
resource_id: "7196927862056701240"
- effect_id: "7131399016771800357"
has_params: false
is_vip: true
name: 冰茶
resource_id: "7131399016771800357"
- effect_id: "7462637393783360809"
has_params: true
is_vip: true
name: 冰雪白
resource_id: "7462637393783360809"
- effect_id: "7159132840179895590"
has_params: false
is_vip: true
name: 冷叙
resource_id: "7159132840179895590"
- effect_id: "7300751893813366053"
has_params: false
is_vip: true
name: 冷墨
resource_id: "7300751893813366053"
- effect_id: "7281165355353951543"
has_params: false
is_vip: true
name: 冷月夜
resource_id: "7281165355353951543"
- effect_id: "7446290191557397814"
has_params: true
is_vip: true
name: 冷白圣诞
resource_id: "7446290191557397814"
- effect_id: "7177729481300364548"
has_params: false
is_vip: true
name: 冷萃
resource_id: "7177729481300364548"
- effect_id: "7434467628422270220"
has_params: false
is_vip: true
name: 冷调CCD
resource_id: "7434467628422270220"
- effect_id: "7127667352782572807"
has_params: false
is_vip: true
name: 净白
resource_id: "7127667352782572807"
- effect_id: "7377370212749839667"
has_params: true
is_vip: true
name: 凉夏
resource_id: "7377370212749839667"
- effect_id: "7498004563954322726"
has_params: true
is_vip: true
name: 加州落日
resource_id: "7498004563954322726"
- effect_id: "7248568097660013864"
has_params: false
is_vip: true
name: 劲闯
resource_id: "7248568097660013864"
- effect_id: "7513608221735554330"
has_params: true
is_vip: true
name: 千禧潮酷
resource_id: "7513608221735554330"
- effect_id: "7145391402661334280"
has_params: false
is_vip: true
name: 半衫
resource_id: "7145391402661334280"
- effect_id: "7473037215426153728"
has_params: true
is_vip: true
name: 原生自然
resource_id: "7473037215426153728"
- effect_id: "7271281225115897140"
has_params: false
is_vip: true
name: 原野
resource_id: "7271281225115897140"
- effect_id: "7127559231062002951"
has_params: false
is_vip: true
name: 去灰
resource_id: "7127559231062002951"
- effect_id: "7226991425160858937"
has_params: false
is_vip: true
name: 去灰II
resource_id: "7226991425160858937"
- effect_id: "7436399689764834623"
has_params: true
is_vip: true
name: 去灰明晰
resource_id: "7436399689764834623"
- effect_id: "7436400247540141348"
has_params: true
is_vip: true
name: 去灰高清
resource_id: "7436400247540141348"
- effect_id: "7473437502787816740"
has_params: true
is_vip: true
name: 去雾
resource_id: "7473437502787816740"
- effect_id: "7403222365217295667"
has_params: true
is_vip: true
name: 反差富士
resource_id: "7403222365217295667"
- effect_id: "7434468515576319295"
has_params: true
is_vip: true
name: 发光CCD
resource_id: "7434468515576319295"
- effect_id: "7477960070073027850"
has_params: true
is_vip: true
name: 发光肤
resource_id: "7477960070073027850"
- effect_id: "7148961858320354573"
has_params: false
is_vip: true
name: 叠阳
resource_id: "7148961858320354573"
- effect_id: "7470614335644077375"
has_params: true
is_vip: true
name: 古早像素
resource_id: "7470614335644077375"
- effect_id: "7449798505385790746"
has_params: true
is_vip: true
name: 古早回忆
resource_id: "7449798505385790746"
- effect_id: "7457910812439596339"
has_params: true
is_vip: true
name: 古早复古
resource_id: "7457910812439596339"
- effect_id: "7366562482812456255"
has_params: false
is_vip: true
name: 古早记忆
resource_id: "7366562482812456255"
- effect_id: "7469697255663078694"
has_params: true
is_vip: true
name: 古早韩式
resource_id: "7469697255663078694"
- effect_id: "7127615616525126949"
has_params: false
is_vip: true
name: 古都
resource_id: "7127615616525126949"
- effect_id: "7190241639070174503"
has_params: false
is_vip: true
name: 吉宵
resource_id: "7190241639070174503"
- effect_id: "7281166220794055997"
has_params: false
is_vip: true
name: 味蕾
resource_id: "7281166220794055997"
- effect_id: "7210651068324285754"
has_params: false
is_vip: true
name: 和歌山
resource_id: "7210651068324285754"
- effect_id: "7291596720956329266"
has_params: false
is_vip: true
name: 哈苏I
resource_id: "7291596720956329266"
- effect_id: "7291560741885480250"
has_params: false
is_vip: true
name: 哈苏II
resource_id: "7291560741885480250"
- effect_id: "7361792059109313811"
has_params: true
is_vip: true
name: 哈苏蓝
resource_id: "7361792059109313811"
- effect_id: "7337928347118275890"
has_params: false
is_vip: true
name: 哥谭
resource_id: "7337928347118275890"
- effect_id: "7485986828164599067"
has_params: true
is_vip: true
name: 唤晴II
resource_id: "7485986828164599067"
- effect_id: "7511971221785922826"
has_params: true
is_vip: true
name: 国民旧照
resource_id: "7511971221785922826"
- effect_id: "7507263202682572044"
has_params: true
is_vip: true
name: 国风影视
resource_id: "7507263202682572044"
- effect_id: "7409572381775138067"
has_params: true
is_vip: true
name: 国风电影
resource_id: "7409572381775138067"
- effect_id: "7175100386007584060"
has_params: false
is_vip: true
name: 圣善夜
resource_id: "7175100386007584060"
- effect_id: "7447162094572686592"
has_params: true
is_vip: true
name: 圣诞回忆录
resource_id: "7447162094572686592"
- effect_id: "7428162298436537627"
has_params: true
is_vip: true
name: 圣诞愿景
resource_id: "7428162298436537627"
- effect_id: "7438160882837835018"
has_params: true
is_vip: true
name: 圣诞拍立得
resource_id: "7438160882837835018"
- effect_id: "7446329652706168100"
has_params: true
is_vip: true
name: 圣诞闪胶
resource_id: "7446329652706168100"
- effect_id: "7446329592119332108"
has_params: true
is_vip: true
name: 圣诞闪胶II
resource_id: "7446329592119332108"
- effect_id: "7405206230550973731"
has_params: true
is_vip: true
name: 城市赏月II
resource_id: "7405206230550973731"
- effect_id: "7411476796526300452"
has_params: true
is_vip: true
name: 增色II
resource_id: "7411476796526300452"
- effect_id: "7500847387959708978"
has_params: true
is_vip: true
name: 增质CCD
resource_id: "7500847387959708978"
- effect_id: "7271284653816843554"
has_params: false
is_vip: true
name: 墨林
resource_id: "7271284653816843554"
- effect_id: "7479800436778732863"
has_params: true
is_vip: true
name: 复古电影感
resource_id: "7479800436778732863"
- effect_id: "7449048492665834779"
has_params: true
is_vip: true
name: 复古蓝调
resource_id: "7449048492665834779"
- effect_id: "7258222828581915959"
has_params: false
is_vip: true
name: 夏天岛
resource_id: "7258222828581915959"
- effect_id: "7159140854601469223"
has_params: false
is_vip: true
name: 夏威夷
resource_id: "7159140854601469223"
- effect_id: "7497479023556070693"
has_params: true
is_vip: true
name: 夏日度假
resource_id: "7497479023556070693"
- effect_id: "7503950769758948620"
has_params: true
is_vip: true
name: 夏日物语
resource_id: "7503950769758948620"
- effect_id: "7261469707138518283"
has_params: false
is_vip: true
name: 夏日粉
resource_id: "7261469707138518283"
- effect_id: "7508030199255026970"
has_params: true
is_vip: true
name: 夏日紫霞
resource_id: "7508030199255026970"
- effect_id: "7509774929961684278"
has_params: true
is_vip: true
name: 夏日繁花
resource_id: "7509774929961684278"
- effect_id: "7237441824611224889"
has_params: false
is_vip: true
name: 多巴胺
resource_id: "7237441824611224889"
- effect_id: "7494135245709610275"
has_params: true
is_vip: true
name: 夜拍闪曝
resource_id: "7494135245709610275"
- effect_id: "7462637606052941095"
has_params: false
is_vip: true
name: 夜拍高光
resource_id: "7462637606052941095"
- effect_id: "7493208490832317705"
has_params: true
is_vip: true
name: 夜景人像增强
resource_id: "7493208490832317705"
- effect_id: "7525110001959030042"
has_params: true
is_vip: true
name: 夜景去雾
resource_id: "7525110001959030042"
- effect_id: "7341302999068757259"
has_params: true
is_vip: true
name: 夜景增色
resource_id: "7341302999068757259"
- effect_id: "7411477748130139403"
has_params: true
is_vip: true
name: 夜景增色II
resource_id: "7411477748130139403"
- effect_id: "7185289606600953092"
has_params: false
is_vip: true
name: 夜焰
resource_id: "7185289606600953092"
- effect_id: "7168110568673479948"
has_params: false
is_vip: true
name: 夜雾
resource_id: "7168110568673479948"
- effect_id: "7175076362997288230"
has_params: false
is_vip: true
name: 大吉岭
resource_id: "7175076362997288230"
- effect_id: "7500853613342772507"
has_params: true
is_vip: true
name: 大海增色
resource_id: "7500853613342772507"
- effect_id: "7512706064693988645"
has_params: true
is_vip: true
name: 大疆电影感
resource_id: "7512706064693988645"
- effect_id: "7361792068475325735"
has_params: false
is_vip: true
name: 奥林巴斯
resource_id: "7361792068475325735"
- effect_id: "7269236283019463972"
has_params: true
is_vip: true
name: 奥罗拉
resource_id: "7269236283019463972"
- effect_id: "7395972887133441307"
has_params: true
is_vip: true
name: 奶呼萌宠
resource_id: "7395972887133441307"
- effect_id: "7474592762331942184"
has_params: true
is_vip: true
name: 奶油II
resource_id: "7474592762331942184"
- effect_id: "7501670015859445055"
has_params: true
is_vip: true
name: 奶油原生
resource_id: "7501670015859445055"
- effect_id: "7482412177760996646"
has_params: true
is_vip: true
name: 奶油柔肤
resource_id: "7482412177760996646"
- effect_id: "7398438142321134898"
has_params: true
is_vip: true
name: 奶油白
resource_id: "7398438142321134898"
- effect_id: "7480210942026927423"
has_params: true
is_vip: true
name: 奶油美食
resource_id: "7480210942026927423"
- effect_id: "7510488117430734118"
has_params: true
is_vip: true
name: 奶油风萌宠
resource_id: "7510488117430734118"
- effect_id: "7478708795057753370"
has_params: true
is_vip: true
name: 奶白肌
resource_id: "7478708795057753370"
- effect_id: "7226994281414692155"
has_params: true
is_vip: true
name: 好莱坞I
resource_id: "7226994281414692155"
- effect_id: "7226995248814165308"
has_params: false
is_vip: true
name: 好莱坞II
resource_id: "7226995248814165308"
- effect_id: "7312617341710372107"
has_params: false
is_vip: true
name: 好莱坞III
resource_id: "7312617341710372107"
- effect_id: "7312647197462367524"
has_params: false
is_vip: true
name: 好莱坞IV
resource_id: "7312647197462367524"
- effect_id: "7339908905713143051"
has_params: true
is_vip: true
name: 嫣时
resource_id: "7339908905713143051"
- effect_id: "7300523145818148096"
has_params: false
is_vip: true
name: 嫩肤
resource_id: "7300523145818148096"
- effect_id: "7131431284403981605"
has_params: false
is_vip: true
name: 嬉皮士
resource_id: "7131431284403981605"
- effect_id: "7202480777387445507"
has_params: false
is_vip: true
name: 子弹列车
resource_id: "7202480777387445507"
- effect_id: "7270142995712773415"
has_params: false
is_vip: true
name: 安西娅
resource_id: "7270142995712773415"
- effect_id: "7330584144524643595"
has_params: true
is_vip: true
name: 家宴
resource_id: "7330584144524643595"
- effect_id: "7127822311708691726"
has_params: false
is_vip: true
name: 宿营
resource_id: "7127822311708691726"
- effect_id: "7268561936344780086"
has_params: false
is_vip: true
name: 富士CC I
resource_id: "7268561936344780086"
- effect_id: "7159156535640296737"
has_params: false
is_vip: true
name: 富士NC I
resource_id: "7159156535640296737"
- effect_id: "7159408376378559747"
has_params: false
is_vip: true
name: 富士NC II
resource_id: "7159408376378559747"
- effect_id: "7159134459088899339"
has_params: false
is_vip: true
name: 富士NC III
resource_id: "7159134459088899339"
- effect_id: "7447157317457513743"
has_params: false
is_vip: true
name: 富士NN
resource_id: "7447157317457513743"
- effect_id: "7394357532912782629"
has_params: true
is_vip: true
name: 富士x100
resource_id: "7394357532912782629"
- effect_id: "7497919307628825866"
has_params: true
is_vip: true
name: 富士电影
resource_id: "7497919307628825866"
- effect_id: "7246720031118101816"
has_params: false
is_vip: true
name: 富士蓝
resource_id: "7246720031118101816"
- effect_id: "7226994246471945530"
has_params: false
is_vip: true
name: 富士蓝II
resource_id: "7226994246471945530"
- effect_id: "7226994214029184313"
has_params: false
is_vip: true
name: 富士青
resource_id: "7226994214029184313"
- effect_id: "7208496124779302177"
has_params: false
is_vip: true
name: 富春山居
resource_id: "7208496124779302177"
- effect_id: "7468493795479276835"
has_params: true
is_vip: true
name: 小美好
resource_id: "7468493795479276835"
- effect_id: "7362076973981584691"
has_params: false
is_vip: true
name: 小麦色
resource_id: "7362076973981584691"
- effect_id: "7131630640646081822"
has_params: false
is_vip: true
name: 尘杏
resource_id: "7131630640646081822"
- effect_id: "7148958479326153991"
has_params: false
is_vip: true
name: 尘烟
resource_id: "7148958479326153991"
- effect_id: "7246723856222719269"
has_params: false
is_vip: true
name: 山晴
resource_id: "7246723856222719269"
- effect_id: "7156638423191784735"
has_params: false
is_vip: true
name: 山本
resource_id: "7156638423191784735"
- effect_id: "7260771472107441471"
has_params: false
is_vip: true
name: 岚夏
resource_id: "7260771472107441471"
- effect_id: "7221472488079904060"
has_params: false
is_vip: true
name: 岩灰
resource_id: "7221472488079904060"
- effect_id: "7428504360910376229"
has_params: true
is_vip: true
name: 川秋
resource_id: "7428504360910376229"
- effect_id: "7361032844484857142"
has_params: false
is_vip: true
name: 川野
resource_id: "7361032844484857142"
- effect_id: "7145394707156323591"
has_params: false
is_vip: true
name: 市井
resource_id: "7145394707156323591"
- effect_id: "7262350396566342975"
has_params: false
is_vip: true
name: 幽海
resource_id: "7262350396566342975"
- effect_id: "7336763348492553499"
has_params: true
is_vip: true
name: 底特律
resource_id: "7336763348492553499"
- effect_id: "7185309693131148555"
has_params: false
is_vip: true
name: 庙会
resource_id: "7185309693131148555"
- effect_id: "7148812815246134541"
has_params: false
is_vip: true
name: 弥晖
resource_id: "7148812815246134541"
- effect_id: "7127824109093866760"
has_params: false
is_vip: true
name: 彩光
resource_id: "7127824109093866760"
- effect_id: "7168136171673963787"
has_params: false
is_vip: true
name: 影部
resource_id: "7168136171673963787"
- effect_id: "7266322833800727844"
has_params: false
is_vip: true
name: 往昔
resource_id: "7266322833800727844"
- effect_id: "7268562944093408523"
has_params: false
is_vip: true
name: 徕卡I
resource_id: "7268562944093408523"
- effect_id: "7268563047776587020"
has_params: false
is_vip: true
name: 徕卡II
resource_id: "7268563047776587020"
- effect_id: "7500447762404724018"
has_params: true
is_vip: true
name: 徕卡Q2
resource_id: "7500447762404724018"
- effect_id: "7261461692096220428"
has_params: false
is_vip: true
name: 心动夏
resource_id: "7261461692096220428"
- effect_id: "7271278427309755688"
has_params: true
is_vip: true
name: 忆山
resource_id: "7271278427309755688"
- effect_id: "7266325161433910591"
has_params: false
is_vip: true
name: 忆时
resource_id: "7266325161433910591"
- effect_id: "7143760738765655310"
has_params: false
is_vip: true
name: 快照II
resource_id: "7143760738765655310"
- effect_id: "7494564488704806198"
has_params: true
is_vip: true
name: 怀旧
resource_id: "7494564488704806198"
- effect_id: "7195889899738909990"
has_params: false
is_vip: true
name: 怦然心动
resource_id: "7195889899738909990"
- effect_id: "7237446176629345593"
has_params: true
is_vip: true
name: 恍光
resource_id: "7237446176629345593"
- effect_id: "7509005376835079439"
has_params: true
is_vip: true
name: 情感故事电影
resource_id: "7509005376835079439"
- effect_id: "7398190560701386022"
has_params: true
is_vip: true
name: 情绪暗调
resource_id: "7398190560701386022"
- effect_id: "7329826553477565705"
has_params: false
is_vip: true
name: 情辉
resource_id: "7329826553477565705"
- effect_id: "7261185427703418169"
has_params: false
is_vip: true
name: 慕斯
resource_id: "7261185427703418169"
- effect_id: "7487297020743404810"
has_params: true
is_vip: true
name: 扬帆远航
resource_id: "7487297020743404810"
- effect_id: "7175093825659079991"
has_params: false
is_vip: true
name: 拐杖糖
resource_id: "7175093825659079991"
- effect_id: "7248566556593098024"
has_params: false
is_vip: true
name: 捕风
resource_id: "7248566556593098024"
- effect_id: "7131219052021779719"
has_params: false
is_vip: true
name: 摩登
resource_id: "7131219052021779719"
- effect_id: "7508033223973244187"
has_params: true
is_vip: true
name: 摩登暗银
resource_id: "7508033223973244187"
- effect_id: "7502647335218941220"
has_params: true
is_vip: true
name: 撕拉拍立得
resource_id: "7502647335218941220"
- effect_id: "7195930274918567180"
has_params: false
is_vip: true
name: 攀岩
resource_id: "7195930274918567180"
- effect_id: "7409360036096527670"
has_params: true
is_vip: true
name: 文艺少女
resource_id: "7409360036096527670"
- effect_id: "7493945636518104360"
has_params: true
is_vip: true
name: 新中式电影感
resource_id: "7493945636518104360"
- effect_id: "7210646550974876984"
has_params: false
is_vip: true
name: 新宿
resource_id: "7210646550974876984"
- effect_id: "7452802706139352370"
has_params: true
is_vip: true
name: 新年欢愉
resource_id: "7452802706139352370"
- effect_id: "7449639935717559561"
has_params: true
is_vip: true
name: 新年祈愿
resource_id: "7449639935717559561"
- effect_id: "7457598693915594025"
has_params: true
is_vip: true
name: 新年祈福
resource_id: "7457598693915594025"
- effect_id: "7449579862496431375"
has_params: true
is_vip: true
name: 新年粉肤
resource_id: "7449579862496431375"
- effect_id: "7449639891694112010"
has_params: true
is_vip: true
name: 新年红
resource_id: "7449639891694112010"
- effect_id: "7451471584533040395"
has_params: true
is_vip: true
name: 新年闪胶
resource_id: "7451471584533040395"
- effect_id: "7343499312464137535"
has_params: true
is_vip: true
name: 日与
resource_id: "7343499312464137535"
- effect_id: "7226985203540053305"
has_params: false
is_vip: true
name: 日光吻
resource_id: "7226985203540053305"
- effect_id: "7486736825369840907"
has_params: true
is_vip: true
name: 日光肤
resource_id: "7486736825369840907"
- effect_id: "7526422478206356787"
has_params: true
is_vip: true
name: 日出增色
resource_id: "7526422478206356787"
- effect_id: "7338311462277991718"
has_params: true
is_vip: true
name: 日和
resource_id: "7338311462277991718"
- effect_id: "7507632191380229402"
has_params: true
is_vip: true
name: 日料寿司
resource_id: "7507632191380229402"
- effect_id: "7493804773515316491"
has_params: true
is_vip: true
name: 日漫增色
resource_id: "7493804773515316491"
- effect_id: "7472373777469328667"
has_params: true
is_vip: true
name: 日系增色
resource_id: "7472373777469328667"
- effect_id: "7473805992308837659"
has_params: true
is_vip: true
name: 日系春和
resource_id: "7473805992308837659"
- effect_id: "7496524092779105551"
has_params: true
is_vip: true
name: 日落时刻
resource_id: "7496524092779105551"
- effect_id: "7232217903536409893"
has_params: false
is_vip: true
name: 旧时代II
resource_id: "7232217903536409893"
- effect_id: "7366562830486621459"
has_params: false
is_vip: true
name: 旧时来信
resource_id: "7366562830486621459"
- effect_id: "7266320092386938124"
has_params: true
is_vip: true
name: 旧曲
resource_id: "7266320092386938124"
- effect_id: "7159161900389977382"
has_params: false
is_vip: true
name: 旧金山
resource_id: "7159161900389977382"
- effect_id: "7275698024892943655"
has_params: true
is_vip: true
name: 旷野
resource_id: "7275698024892943655"
- effect_id: "7501717343156981046"
has_params: true
is_vip: true
name: 旷野自然
resource_id: "7501717343156981046"
- effect_id: "7131513310733765918"
has_params: false
is_vip: true
name: 旷野蓝
resource_id: "7131513310733765918"
- effect_id: "7485240505257807138"
has_params: true
is_vip: true
name: 明亮春味
resource_id: "7485240505257807138"
- effect_id: "7470840671763565864"
has_params: true
is_vip: true
name: 明亮焕晴
resource_id: "7470840671763565864"
- effect_id: "7482055184554806566"
has_params: true
is_vip: true
name: 明媚春景
resource_id: "7482055184554806566"
- effect_id: "7480823852470177034"
has_params: true
is_vip: true
name: 明媚自然
resource_id: "7480823852470177034"
- effect_id: "7506413750665121060"
has_params: true
is_vip: true
name: 明媚透亮
resource_id: "7506413750665121060"
- effect_id: "7343287054228327691"
has_params: true
is_vip: true
name: 明煦
resource_id: "7343287054228327691"
- effect_id: "7196921394163141946"
has_params: false
is_vip: true
name: 星沫
resource_id: "7196921394163141946"
- effect_id: "7327596304173944127"
has_params: true
is_vip: true
name: 春和
resource_id: "7327596304173944127"
- effect_id: "7325335963318750515"
has_params: false
is_vip: true
name: 春喜
resource_id: "7325335963318750515"
- effect_id: "7479295356488977679"
has_params: true
is_vip: true
name: 春天淡彩
resource_id: "7479295356488977679"
- effect_id: "7483069698981104947"
has_params: true
is_vip: true
name: 春忆胶卷
resource_id: "7483069698981104947"
- effect_id: "7477922252470652198"
has_params: true
is_vip: true
name: 春日序
resource_id: "7477922252470652198"
- effect_id: "7493076668009958668"
has_params: true
is_vip: true
name: 春日樱
resource_id: "7493076668009958668"
- effect_id: "7477594530104085770"
has_params: true
is_vip: true
name: 春日清晰
resource_id: "7477594530104085770"
- effect_id: "7485293187616066831"
has_params: false
is_vip: true
name: 春日清透
resource_id: "7485293187616066831"
- effect_id: "7486868815364492554"
has_params: true
is_vip: true
name: 春日美食III
resource_id: "7486868815364492554"
- effect_id: "7472064159065132325"
has_params: true
is_vip: true
name: 春日花间
resource_id: "7472064159065132325"
- effect_id: "7481494936836197641"
has_params: true
is_vip: true
name: 春日韩胶
resource_id: "7481494936836197641"
- effect_id: "7483917188638772517"
has_params: true
is_vip: true
name: 春桃肤
resource_id: "7483917188638772517"
- effect_id: "7481693425218194725"
has_params: true
is_vip: true
name: 春橙肤
resource_id: "7481693425218194725"
- effect_id: "7493581083628408102"
has_params: true
is_vip: true
name: 春游踏青
resource_id: "7493581083628408102"
- effect_id: "7332492044327243049"
has_params: true
is_vip: true
name: 春澄
resource_id: "7332492044327243049"
- effect_id: "7148963827239963918"
has_params: false
is_vip: true
name: 春风
resource_id: "7148963827239963918"
- effect_id: "7195780237790154042"
has_params: false
is_vip: true
name: 昭和
resource_id: "7195780237790154042"
- effect_id: "7302041028205333786"
has_params: true
is_vip: true
name: 晚宴
resource_id: "7302041028205333786"
- effect_id: "7297143895408839947"
has_params: false
is_vip: true
name: 晚晴
resource_id: "7297143895408839947"
- effect_id: "7262634564428778752"
has_params: false
is_vip: true
name: 晚柠
resource_id: "7262634564428778752"
- effect_id: "7127609541839129886"
has_params: false
is_vip: true
name: 晚樱
resource_id: "7127609541839129886"
- effect_id: "7392898170524618023"
has_params: true
is_vip: true
name: 晚霞增色
resource_id: "7392898170524618023"
- effect_id: "7279062968501832972"
has_params: true
is_vip: true
name: 晨旭
resource_id: "7279062968501832972"
- effect_id: "7127615578705104135"
has_params: false
is_vip: true
name: 普林斯顿
resource_id: "7127615578705104135"
- effect_id: "7420253131079961868"
has_params: true
is_vip: true
name: 晴天
resource_id: "7420253131079961868"
- effect_id: "7454234032570764581"
has_params: true
is_vip: true
name: 晴天亮丽
resource_id: "7454234032570764581"
- effect_id: "7454234028141497610"
has_params: true
is_vip: true
name: 晴天增色
resource_id: "7454234028141497610"
- effect_id: "7486890449207151891"
has_params: true
is_vip: true
name: '晴天灿烂 '
resource_id: "7486890449207151891"
- effect_id: "7374709776623635724"
has_params: true
is_vip: true
name: 晴好假日
resource_id: "7374709776623635724"
- effect_id: "7475397942715632922"
has_params: true
is_vip: true
name: 晴好风光
resource_id: "7475397942715632922"
- effect_id: "7346542846863887635"
has_params: true
is_vip: true
name: 晴春
resource_id: "7346542846863887635"
- effect_id: "7485769123176254770"
has_params: true
is_vip: true
name: 晴春奶蓝
resource_id: "7485769123176254770"
- effect_id: "7434746357233028390"
has_params: true
is_vip: true
name: 晴朗
resource_id: "7434746357233028390"
- effect_id: "7525755037050539307"
has_params: false
is_vip: true
name: 晴海
resource_id: "7525755037050539307"
- effect_id: "7477810373060611338"
has_params: true
is_vip: true
name: 晴空漫游
resource_id: "7477810373060611338"
- effect_id: "7365842976691604763"
has_params: true
is_vip: true
name: 晴肤
resource_id: "7365842976691604763"
- effect_id: "7307191907514420491"
has_params: false
is_vip: true
name: 晴谷
resource_id: "7307191907514420491"
- effect_id: "7468501080691789094"
has_params: true
is_vip: true
name: 晴颜
resource_id: "7468501080691789094"
- effect_id: "7199095242476293435"
has_params: false
is_vip: true
name: 晶透
resource_id: "7199095242476293435"
- effect_id: "7451897248885099795"
has_params: true
is_vip: true
name: 智能光线
resource_id: "7451897248885099795"
- effect_id: "7312646382395936010"
has_params: false
is_vip: true
name: 暖晨
resource_id: "7312646382395936010"
- effect_id: "7405241190435523866"
has_params: true
is_vip: true
name: 暖棕
resource_id: "7405241190435523866"
- effect_id: "7127830631601458440"
has_params: false
is_vip: true
name: 暖黄
resource_id: "7127830631601458440"
- effect_id: "7446318175991368997"
has_params: false
is_vip: true
name: 暗光提亮
resource_id: "7446318175991368997"
- effect_id: "7159163878822153483"
has_params: false
is_vip: true
name: 暗匣
resource_id: "7159163878822153483"
- effect_id: "7328364126449765671"
has_params: false
is_vip: true
name: 暗夜明肤
resource_id: "7328364126449765671"
- effect_id: "7291203298630159676"
has_params: false
is_vip: true
name: 暗影
resource_id: "7291203298630159676"
- effect_id: "7281163501047991608"
has_params: false
is_vip: true
name: 暗曛
resource_id: "7281163501047991608"
- effect_id: "7485767950314655002"
has_params: true
is_vip: true
name: 暗调人像
resource_id: "7485767950314655002"
- effect_id: "7413717074037525769"
has_params: true
is_vip: true
name: 暗调发光
resource_id: "7413717074037525769"
- effect_id: "7505272278574206219"
has_params: true
is_vip: true
name: 暗调古风
resource_id: "7505272278574206219"
- effect_id: "7494530599202327846"
has_params: true
is_vip: true
name: 暗调复古电影
resource_id: "7494530599202327846"
- effect_id: "7402945560623336758"
has_params: true
is_vip: true
name: 暗调电影
resource_id: "7402945560623336758"
- effect_id: "7493536391431785752"
has_params: true
is_vip: true
name: 暗调纪实电影
resource_id: "7493536391431785752"
- effect_id: "7511619145864187136"
has_params: true
is_vip: true
name: 暗金
resource_id: "7511619145864187136"
- effect_id: "7177725752513793284"
has_params: false
is_vip: true
name: 暗银
resource_id: "7177725752513793284"
- effect_id: "7223630575888780602"
has_params: false
is_vip: true
name: 暗银II
resource_id: "7223630575888780602"
- effect_id: "7279061785922080055"
has_params: false
is_vip: true
name: 暮信
resource_id: "7279061785922080055"
- effect_id: "7262351934785408267"
has_params: true
is_vip: true
name: 暮川
resource_id: "7262351934785408267"
- effect_id: "7341257736983760182"
has_params: true
is_vip: true
name: 暮樱
resource_id: "7341257736983760182"
- effect_id: "7145394582933572878"
has_params: false
is_vip: true
name: 暮涛
resource_id: "7145394582933572878"
- effect_id: "7332396398157090089"
has_params: false
is_vip: true
name: 暮色约会
resource_id: "7332396398157090089"
- effect_id: "7233734975839898940"
has_params: false
is_vip: true
name: 曼波
resource_id: "7233734975839898940"
- effect_id: "7168108694285159719"
has_params: false
is_vip: true
name: 月吟
resource_id: "7168108694285159719"
- effect_id: "7476109983688576290"
has_params: true
is_vip: true
name: 月辉
resource_id: "7476109983688576290"
- effect_id: "7493920442613288219"
has_params: true
is_vip: true
name: 朦胧气质棕
resource_id: "7493920442613288219"
- effect_id: "7233731121610100020"
has_params: false
is_vip: true
name: 木葵
resource_id: "7233731121610100020"
- effect_id: "7506099780947430668"
has_params: true
is_vip: true
name: 末世天使
resource_id: "7506099780947430668"
- effect_id: "7295630593063193865"
has_params: false
is_vip: true
name: 杏铃
resource_id: "7295630593063193865"
- effect_id: "7246723559047941433"
has_params: false
is_vip: true
name: 松绿
resource_id: "7246723559047941433"
- effect_id: "7160594387594972446"
has_params: false
is_vip: true
name: 果酥
resource_id: "7160594387594972446"
- effect_id: "7395596262252334373"
has_params: true
is_vip: true
name: 柔光
resource_id: "7395596262252334373"
- effect_id: "7345412316621442354"
has_params: false
is_vip: true
name: 柔焦
resource_id: "7345412316621442354"
- effect_id: "7258220845041061180"
has_params: false
is_vip: true
name: 柠檬海
resource_id: "7258220845041061180"
- effect_id: "7517685395102977334"
has_params: true
is_vip: true
name: 柯达金200
resource_id: "7517685395102977334"
- effect_id: "7349928965869538570"
has_params: false
is_vip: true
name: 栖海
resource_id: "7349928965869538570"
- effect_id: "7177259623819316519"
has_params: false
is_vip: true
name: 栩栩
resource_id: "7177259623819316519"
- effect_id: "7348301778909252879"
has_params: false
is_vip: true
name: 格金
resource_id: "7348301778909252879"
- effect_id: "7252673818035064124"
has_params: false
is_vip: true
name: 桃木
resource_id: "7252673818035064124"
- effect_id: "7297131749346135331"
has_params: false
is_vip: true
name: 桃粉
resource_id: "7297131749346135331"
- effect_id: "7199093989742562597"
has_params: false
is_vip: true
name: 桃野
resource_id: "7199093989742562597"
- effect_id: "7275699191253339455"
has_params: false
is_vip: true
name: 桐影
resource_id: "7275699191253339455"
- effect_id: "7127675251604917517"
has_params: false
is_vip: true
name: 梦境
resource_id: "7127675251604917517"
- effect_id: "7377370067798985993"
has_params: false
is_vip: true
name: 梦幻夏
resource_id: "7377370067798985993"
- effect_id: "7272341241893768506"
has_params: false
is_vip: true
name: 梦暮
resource_id: "7272341241893768506"
- effect_id: "7261463763344248103"
has_params: false
is_vip: true
name: 梦核紫
resource_id: "7261463763344248103"
- effect_id: "7252676190073392444"
has_params: false
is_vip: true
name: 棕榈
resource_id: "7252676190073392444"
- effect_id: "7242215081663008056"
has_params: false
is_vip: true
name: 森山
resource_id: "7242215081663008056"
- effect_id: "7524262165273005321"
has_params: true
is_vip: true
name: 森林徒步
resource_id: "7524262165273005321"
- effect_id: "7274575376095923497"
has_params: false
is_vip: true
name: 森秋
resource_id: "7274575376095923497"
- effect_id: "7510128089511349555"
has_params: false
is_vip: true
name: 森绿
resource_id: "7510128089511349555"
- effect_id: "7169350167903112451"
has_params: false
is_vip: true
name: 榄白
resource_id: "7169350167903112451"
- effect_id: "7398486193924623628"
has_params: false
is_vip: true
name: 模糊氛围
resource_id: "7398486193924623628"
- effect_id: "7467985496988241204"
has_params: true
is_vip: true
name: 樱花粉肤
resource_id: "7467985496988241204"
- effect_id: "7526948433597336832"
has_params: true
is_vip: true
name: 橘子海
resource_id: "7526948433597336832"
- effect_id: "7278615838628924733"
has_params: false
is_vip: true
name: 橘海
resource_id: "7278615838628924733"
- effect_id: "7127561047048850718"
has_params: false
is_vip: true
name: 橙蓝
resource_id: "7127561047048850718"
- effect_id: "7479295334930205952"
has_params: true
is_vip: true
name: 欧若淡彩
resource_id: "7479295334930205952"
- effect_id: "7510863205011393844"
has_params: true
is_vip: true
name: 毕业胶片
resource_id: "7510863205011393844"
- effect_id: "7417468417852099894"
has_params: true
is_vip: true
name: 气色
resource_id: "7417468417852099894"
- effect_id: "7527311213869403402"
has_params: true
is_vip: true
name: 气色透亮
resource_id: "7527311213869403402"
- effect_id: "7470913918186163468"
has_params: true
is_vip: true
name: 氧气甜白
resource_id: "7470913918186163468"
- effect_id: "7501345307830013222"
has_params: true
is_vip: true
name: 氧气自然
resource_id: "7501345307830013222"
- effect_id: "7210613511133646135"
has_params: false
is_vip: true
name: 水泽
resource_id: "7210613511133646135"
- effect_id: "7148776798715776292"
has_params: false
is_vip: true
name: 沙漫
resource_id: "7148776798715776292"
- effect_id: "7160580722774920461"
has_params: false
is_vip: true
name: 沙砾
resource_id: "7160580722774920461"
- effect_id: "7480196177611230514"
has_params: true
is_vip: true
name: 法式少女
resource_id: "7480196177611230514"
- effect_id: "7480196167372999973"
has_params: true
is_vip: true
name: 法式甜粉
resource_id: "7480196167372999973"
- effect_id: "7127655700532186398"
has_params: false
is_vip: true
name: 法餐
resource_id: "7127655700532186398"
- effect_id: "7476109684169133362"
has_params: true
is_vip: true
name: 洛丽塔粉
resource_id: "7476109684169133362"
- effect_id: "7221481120083283257"
has_params: false
is_vip: true
name: 浅茶
resource_id: "7221481120083283257"
- effect_id: "7195783041376111932"
has_params: false
is_vip: true
name: 浅草
resource_id: "7195783041376111932"
- effect_id: "7499121362351574282"
has_params: true
is_vip: true
name: 浓郁胶卷
resource_id: "7499121362351574282"
- effect_id: "7376495406487801139"
has_params: true
is_vip: true
name: 浪语
resource_id: "7376495406487801139"
- effect_id: "7527721135824211243"
has_params: true
is_vip: true
name: 海上冲浪
resource_id: "7527721135824211243"
- effect_id: "7145394304377163045"
has_params: false
is_vip: true
name: 海松
resource_id: "7145394304377163045"
- effect_id: "7494117715142053130"
has_params: true
is_vip: true
name: 海水正蓝
resource_id: "7494117715142053130"
- effect_id: "7210611719180193083"
has_params: false
is_vip: true
name: 海湾
resource_id: "7210611719180193083"
- effect_id: "7473034636436852031"
has_params: true
is_vip: true
name: 海盐
resource_id: "7473034636436852031"
- effect_id: "7501729703544343820"
has_params: true
is_vip: true
name: 海盐夏日
resource_id: "7501729703544343820"
- effect_id: "7495702685765651775"
has_params: true
is_vip: true
name: 海盐蓝
resource_id: "7495702685765651775"
- effect_id: "7497887075627257114"
has_params: true
is_vip: true
name: 海边胶片
resource_id: "7497887075627257114"
- effect_id: "7199093300526173501"
has_params: false
is_vip: true
name: 润光
resource_id: "7199093300526173501"
- effect_id: "7366518614729493799"
has_params: true
is_vip: true
name: 润白
resource_id: "7366518614729493799"
- effect_id: "7210645355136961852"
has_params: false
is_vip: true
name: 涩谷
resource_id: "7210645355136961852"
- effect_id: "7127668617101020423"
has_params: false
is_vip: true
name: 淡奶油
resource_id: "7127668617101020423"
- effect_id: "7493171130753174835"
has_params: true
is_vip: true
name: 清冷国风
resource_id: "7493171130753174835"
- effect_id: "7398191077364124955"
has_params: true
is_vip: true
name: 清冷暗黑
resource_id: "7398191077364124955"
- effect_id: "7503785630606904630"
has_params: true
is_vip: true
name: 清新度假
resource_id: "7503785630606904630"
- effect_id: "7493819626330017078"
has_params: true
is_vip: true
name: 清新感
resource_id: "7493819626330017078"
- effect_id: "7429759193361435955"
has_params: true
is_vip: true
name: 清新明亮
resource_id: "7429759193361435955"
- effect_id: "7463798716542111030"
has_params: true
is_vip: true
name: 清新春日
resource_id: "7463798716542111030"
- effect_id: "7456482453444726026"
has_params: true
is_vip: true
name: 清新晴空
resource_id: "7456482453444726026"
- effect_id: "7481862972801879346"
has_params: true
is_vip: true
name: 清新暖食
resource_id: "7481862972801879346"
- effect_id: "7459675263652220171"
has_params: true
is_vip: true
name: 清新氧晴
resource_id: "7459675263652220171"
- effect_id: "7436078162217274687"
has_params: true
is_vip: true
name: 清新绿妍
resource_id: "7436078162217274687"
- effect_id: "7478775634630659378"
has_params: true
is_vip: true
name: 清新花妍
resource_id: "7478775634630659378"
- effect_id: "7456482275618835763"
has_params: true
is_vip: true
name: 清新质感
resource_id: "7456482275618835763"
- effect_id: "7439995840799722815"
has_params: true
is_vip: true
name: 清新透亮
resource_id: "7439995840799722815"
- effect_id: "7447719105563610404"
has_params: true
is_vip: true
name: 清晰
resource_id: "7447719105563610404"
- effect_id: "7449939197223243058"
has_params: true
is_vip: true
name: 清晰严冬
resource_id: "7449939197223243058"
- effect_id: "7483183184826420519"
has_params: true
is_vip: true
name: 清晰净透
resource_id: "7483183184826420519"
- effect_id: "7436068361622129929"
has_params: true
is_vip: true
name: 清晰增强
resource_id: "7436068361622129929"
- effect_id: "7428650549572144411"
has_params: true
is_vip: true
name: 清晰增色
resource_id: "7428650549572144411"
- effect_id: "7441960726274559282"
has_params: true
is_vip: true
name: 清晰增质
resource_id: "7441960726274559282"
- effect_id: "7443101069539953931"
has_params: true
is_vip: true
name: 清晰提升
resource_id: "7443101069539953931"
- effect_id: "7435151579029769511"
has_params: true
is_vip: true
name: 清晰电影
resource_id: "7435151579029769511"
- effect_id: "7441541255760284939"
has_params: true
is_vip: true
name: 清晰画质
resource_id: "7441541255760284939"
- effect_id: "7494607226519260442"
has_params: true
is_vip: true
name: 清晰绿妍
resource_id: "7494607226519260442"
- effect_id: "7473805985388317978"
has_params: true
is_vip: true
name: 清晰自然
resource_id: "7473805985388317978"
- effect_id: "7493197626645531928"
has_params: true
is_vip: true
name: 清晰花朵
resource_id: "7493197626645531928"
- effect_id: "7503810545670311206"
has_params: true
is_vip: true
name: 清晰萌宠
resource_id: "7503810545670311206"
- effect_id: "7442390492307836186"
has_params: true
is_vip: true
name: 清晰质感
resource_id: "7442390492307836186"
- effect_id: "7440517981374893327"
has_params: true
is_vip: true
name: 清晰透亮
resource_id: "7440517981374893327"
- effect_id: "7392897785755897100"
has_params: false
is_vip: true
name: 清爽
resource_id: "7392897785755897100"
- effect_id: "7499484084197018889"
has_params: true
is_vip: true
name: 清爽夏颜
resource_id: "7499484084197018889"
- effect_id: "7493540929874218281"
has_params: true
is_vip: true
name: 清透光感
resource_id: "7493540929874218281"
- effect_id: "7496156231392873767"
has_params: true
is_vip: true
name: 清透感
resource_id: "7496156231392873767"
- effect_id: "7403664041945681191"
has_params: true
is_vip: true
name: 清透美食
resource_id: "7403664041945681191"
- effect_id: "7473126624322391308"
has_params: true
is_vip: true
name: 清透萌宠
resource_id: "7473126624322391308"
- effect_id: "7486694625009339689"
has_params: true
is_vip: true
name: 清风绿妍
resource_id: "7486694625009339689"
- effect_id: "7493874443639377164"
has_params: true
is_vip: true
name: 港风复古
resource_id: "7493874443639377164"
- effect_id: "7408952560549104923"
has_params: true
is_vip: true
name: 港风夜景
resource_id: "7408952560549104923"
- effect_id: "7493845947546455307"
has_params: true
is_vip: true
name: 港风电影
resource_id: "7493845947546455307"
- effect_id: "7347670931646549282"
has_params: false
is_vip: true
name: 漠土
resource_id: "7347670931646549282"
- effect_id: "7356883843376221475"
has_params: false
is_vip: true
name: 漫樱
resource_id: "7356883843376221475"
- effect_id: "7210749292888280359"
has_params: false
is_vip: true
name: 漫空
resource_id: "7210749292888280359"
- effect_id: "7210758351595048195"
has_params: false
is_vip: true
name: 漫荫
resource_id: "7210758351595048195"
- effect_id: "7145394477249678606"
has_params: false
is_vip: true
name: 漱石
resource_id: "7145394477249678606"
- effect_id: "7127620215290039566"
has_params: false
is_vip: true
name: 潘多拉
resource_id: "7127620215290039566"
- effect_id: "7145394908608662814"
has_params: false
is_vip: true
name: 灯会
resource_id: "7145394908608662814"
- effect_id: "7262351970193640715"
has_params: true
is_vip: true
name: 灯塔
resource_id: "7262351970193640715"
- effect_id: "7199460195502689574"
has_params: false
is_vip: true
name: 灰芋
resource_id: "7199460195502689574"
- effect_id: "7476126948708617482"
has_params: true
is_vip: true
name: 灰调中性
resource_id: "7476126948708617482"
- effect_id: "7484662695443090715"
has_params: true
is_vip: true
name: 灰调日常
resource_id: "7484662695443090715"
- effect_id: "7312645421271158070"
has_params: false
is_vip: true
name: 灰麻
resource_id: "7312645421271158070"
- effect_id: "7467879231914118412"
has_params: true
is_vip: true
name: 灿金彩带
resource_id: "7467879231914118412"
- effect_id: "7194083900333755704"
has_params: false
is_vip: true
name: 炊烟
resource_id: "7194083900333755704"
- effect_id: "7145395383475113230"
has_params: false
is_vip: true
name: 烈日
resource_id: "7145395383475113230"
- effect_id: "7246722333010824508"
has_params: false
is_vip: true
name: 烈空
resource_id: "7246722333010824508"
- effect_id: "7160598329817091364"
has_params: false
is_vip: true
name: 烘挞
resource_id: "7160598329817091364"
- effect_id: "7131582482608164132"
has_params: false
is_vip: true
name: 烟橙
resource_id: "7131582482608164132"
- effect_id: "7328363415313993001"
has_params: false
is_vip: true
name: 烟花璀璨
resource_id: "7328363415313993001"
- effect_id: "7377368986276646171"
has_params: true
is_vip: true
name: 热带季风
resource_id: "7377368986276646171"
- effect_id: "7463372376038755603"
has_params: true
is_vip: true
name: 热气腾腾
resource_id: "7463372376038755603"
- effect_id: "7447164085122256143"
has_params: false
is_vip: true
name: 热红酒
resource_id: "7447164085122256143"
- effect_id: "7127674287238008078"
has_params: false
is_vip: true
name: 焕肤
resource_id: "7127674287238008078"
- effect_id: "7131539023817936158"
has_params: false
is_vip: true
name: 焰色
resource_id: "7131539023817936158"
- effect_id: "7145395127089909028"
has_params: false
is_vip: true
name: 熏柏
resource_id: "7145395127089909028"
- effect_id: "7328694736565439807"
has_params: true
is_vip: true
name: 爱丽丝
resource_id: "7328694736565439807"
- effect_id: "7131656881805741325"
has_params: false
is_vip: true
name: 爱之城
resource_id: "7131656881805741325"
- effect_id: "7337929076042222899"
has_params: false
is_vip: true
name: 爱之城II
resource_id: "7337929076042222899"
- effect_id: "7172285234296278309"
has_params: false
is_vip: true
name: 牙白
resource_id: "7172285234296278309"
- effect_id: "7473369111490317595"
has_params: true
is_vip: true
name: 牛奶肌
resource_id: "7473369111490317595"
- effect_id: "7397751642390564134"
has_params: true
is_vip: true
name: 牧野
resource_id: "7397751642390564134"
- effect_id: "7202485617026977056"
has_params: false
is_vip: true
name: 独行侠
resource_id: "7202485617026977056"
- effect_id: "7148806074601164062"
has_params: false
is_vip: true
name: 猎梦
resource_id: "7148806074601164062"
- effect_id: "7405509975939894567"
has_params: true
is_vip: true
name: 玄影灵
resource_id: "7405509975939894567"
- effect_id: "7177267248753610023"
has_params: false
is_vip: true
name: 玩趣
resource_id: "7177267248753610023"
- effect_id: "7295599414180138250"
has_params: false
is_vip: true
name: 琥珀
resource_id: "7295599414180138250"
- effect_id: "7468943213143821587"
has_params: true
is_vip: true
name: 璀璨
resource_id: "7468943213143821587"
- effect_id: "7486871767642950966"
has_params: true
is_vip: true
name: 甜妹感
resource_id: "7486871767642950966"
- effect_id: "7505303260148878630"
has_params: true
is_vip: true
name: 甜心芭比
resource_id: "7505303260148878630"
- effect_id: "7374709634088668452"
has_params: true
is_vip: true
name: 田园野餐
resource_id: "7374709634088668452"
- effect_id: "7439365849703550247"
has_params: true
is_vip: true
name: 电影增强
resource_id: "7439365849703550247"
- effect_id: "7435151398783765799"
has_params: true
is_vip: true
name: 电影增质
resource_id: "7435151398783765799"
- effect_id: "7486832436819578151"
has_params: true
is_vip: true
name: 电影感增强
resource_id: "7486832436819578151"
- effect_id: "7447126702137904420"
has_params: true
is_vip: true
name: 电影柔光
resource_id: "7447126702137904420"
- effect_id: "7494169971136711977"
has_params: true
is_vip: true
name: 电影校正
resource_id: "7494169971136711977"
- effect_id: "7472770427245448474"
has_params: true
is_vip: true
name: 电影画质
resource_id: "7472770427245448474"
- effect_id: "7441124730066701604"
has_params: true
is_vip: true
name: 电影雪肤
resource_id: "7441124730066701604"
- effect_id: "7239979137404833083"
has_params: false
is_vip: true
name: 画报
resource_id: "7239979137404833083"
- effect_id: "7507148382536764682"
has_params: true
is_vip: true
name: 画质修复
resource_id: "7507148382536764682"
- effect_id: "7439560136630471963"
has_params: true
is_vip: true
name: 画质高清
resource_id: "7439560136630471963"
- effect_id: "7195925533031435558"
has_params: false
is_vip: true
name: 登高
resource_id: "7195925533031435558"
- effect_id: "7302336985513970963"
has_params: false
is_vip: true
name: 白富美
resource_id: "7302336985513970963"
- effect_id: "7300522962937990415"
has_params: true
is_vip: true
name: 白桃
resource_id: "7300522962937990415"
- effect_id: "7524363630498827530"
has_params: true
is_vip: true
name: 白皙
resource_id: "7524363630498827530"
- effect_id: "7210616269597314362"
has_params: false
is_vip: true
name: 百川
resource_id: "7210616269597314362"
- effect_id: "7127823742830398757"
has_params: false
is_vip: true
name: 盐系
resource_id: "7127823742830398757"
- effect_id: "7500997115917651227"
has_params: true
is_vip: true
name: 盐系清透
resource_id: "7500997115917651227"
- effect_id: "7194091413728922941"
has_params: false
is_vip: true
name: 石山
resource_id: "7194091413728922941"
- effect_id: "7131655685321821477"
has_params: false
is_vip: true
name: 砂金
resource_id: "7131655685321821477"
- effect_id: "7348707347419712794"
has_params: false
is_vip: true
name: 破晓
resource_id: "7348707347419712794"
- effect_id: "7127663097162075399"
has_params: false
is_vip: true
name: 硬朗
resource_id: "7127663097162075399"
- effect_id: "7524592387742567689"
has_params: true
is_vip: true
name: 硬朗男孩
resource_id: "7524592387742567689"
- effect_id: "7148945136280440101"
has_params: false
is_vip: true
name: 碎芒
resource_id: "7148945136280440101"
- effect_id: "7363537225620983067"
has_params: false
is_vip: true
name: 碳烤
resource_id: "7363537225620983067"
- effect_id: "7323020458050260262"
has_params: false
is_vip: true
name: 福桔
resource_id: "7323020458050260262"
- effect_id: "7453122471810714930"
has_params: true
is_vip: true
name: 福运
resource_id: "7453122471810714930"
- effect_id: "7260770496055168310"
has_params: true
is_vip: true
name: 禾美
resource_id: "7260770496055168310"
- effect_id: "7127674303306419464"
has_params: false
is_vip: true
name: 私语
resource_id: "7127674303306419464"
- effect_id: "7404121905780772122"
has_params: true
is_vip: true
name: 秋日物语II
resource_id: "7404121905780772122"
- effect_id: "7145391965717253406"
has_params: false
is_vip: true
name: 秋池
resource_id: "7145391965717253406"
- effect_id: "7196920471043050812"
has_params: false
is_vip: true
name: 秋波
resource_id: "7196920471043050812"
- effect_id: "7493760868576988443"
has_params: true
is_vip: true
name: 秋田胶片
resource_id: "7493760868576988443"
- effect_id: "7502329862581996854"
has_params: true
is_vip: true
name: 科切拉
resource_id: "7502329862581996854"
- effect_id: "7501988309900528935"
has_params: true
is_vip: true
name: 科幻星球
resource_id: "7501988309900528935"
- effect_id: "7127561998556073247"
has_params: false
is_vip: true
name: 简餐
resource_id: "7127561998556073247"
- effect_id: "7503540725334723875"
has_params: true
is_vip: true
name: 粉柔撕拉片
resource_id: "7503540725334723875"
- effect_id: "7131467442789846285"
has_params: false
is_vip: true
name: 粉橘
resource_id: "7131467442789846285"
- effect_id: "7156647258342034702"
has_params: false
is_vip: true
name: 粉白
resource_id: "7156647258342034702"
- effect_id: "7481194247610174757"
has_params: true
is_vip: true
name: 粉白微曝光
resource_id: "7481194247610174757"
- effect_id: "7462636960557927699"
has_params: true
is_vip: true
name: 粉蓝烟花
resource_id: "7462636960557927699"
- effect_id: "7351018816215764233"
has_params: false
is_vip: true
name: 素净
resource_id: "7351018816215764233"
- effect_id: "7300968790391606567"
has_params: false
is_vip: true
name: 素简
resource_id: "7300968790391606567"
- effect_id: "7507920355613248803"
has_params: true
is_vip: true
name: 紫霞时分
resource_id: "7507920355613248803"
- effect_id: "7322666518536359204"
has_params: false
is_vip: true
name: 繁花似锦
resource_id: "7322666518536359204"
- effect_id: "7322665314980859177"
has_params: false
is_vip: true
name: 繁花如梦
resource_id: "7322665314980859177"
- effect_id: "7322665617373351231"
has_params: false
is_vip: true
name: 繁花璀璨
resource_id: "7322665617373351231"
- effect_id: "7325421708809096467"
has_params: false
is_vip: true
name: 红运
resource_id: "7325421708809096467"
- effect_id: "7493535052098358590"
has_params: true
is_vip: true
name: 纪实电影
resource_id: "7493535052098358590"
- effect_id: "7501954865518677267"
has_params: true
is_vip: true
name: 纪实电影胶片
resource_id: "7501954865518677267"
- effect_id: "7260772961462799627"
has_params: false
is_vip: true
name: 纱雾
resource_id: "7260772961462799627"
- effect_id: "7148965677376736542"
has_params: false
is_vip: true
name: 织乐
resource_id: "7148965677376736542"
- effect_id: "7449048410004507914"
has_params: true
is_vip: true
name: 经典港风
resource_id: "7449048410004507914"
- effect_id: "7148796681176288548"
has_params: false
is_vip: true
name: 绮思
resource_id: "7148796681176288548"
- effect_id: "7361401117672066345"
has_params: true
is_vip: true
name: 绿妍II
resource_id: "7361401117672066345"
- effect_id: "7148817459095670029"
has_params: false
is_vip: true
name: 绿野
resource_id: "7148817459095670029"
- effect_id: "7355426069840661798"
has_params: false
is_vip: true
name: 绿野仙踪
resource_id: "7355426069840661798"
- effect_id: "7409674961595518258"
has_params: true
is_vip: true
name: 绿野漫旅
resource_id: "7409674961595518258"
- effect_id: "7494869214751182121"
has_params: true
is_vip: true
name: 美味brunch
resource_id: "7494869214751182121"
- effect_id: "7332345211621887251"
has_params: false
is_vip: true
name: 美好瞬间
resource_id: "7332345211621887251"
- effect_id: "7273782607257685309"
has_params: false
is_vip: true
name: 美拉德
resource_id: "7273782607257685309"
- effect_id: "7495821426562288915"
has_params: true
is_vip: true
name: 美白嫩肤
resource_id: "7495821426562288915"
- effect_id: "7403664465390013735"
has_params: true
is_vip: true
name: 美食增色
resource_id: "7403664465390013735"
- effect_id: "7239236880858877217"
has_params: false
is_vip: true
name: 美高
resource_id: "7239236880858877217"
- effect_id: "7213573482850880827"
has_params: false
is_vip: true
name: 羽梦
resource_id: "7213573482850880827"
- effect_id: "7325416529166732583"
has_params: false
is_vip: true
name: 老街
resource_id: "7325416529166732583"
- effect_id: "7279063581092531510"
has_params: true
is_vip: true
name: 聆时
resource_id: "7279063581092531510"
- effect_id: "7320428711487098153"
has_params: false
is_vip: true
name: 聚焦
resource_id: "7320428711487098153"
- effect_id: "7496103061845249316"
has_params: true
is_vip: true
name: 胶片电影
resource_id: "7496103061845249316"
- effect_id: "7477552975246937380"
has_params: true
is_vip: true
name: 自然增色
resource_id: "7477552975246937380"
- effect_id: "7478210864818965779"
has_params: true
is_vip: true
name: 自然春色
resource_id: "7478210864818965779"
- effect_id: "7446467221666204969"
has_params: true
is_vip: true
name: 自然雪肤
resource_id: "7446467221666204969"
- effect_id: "7226257534313631037"
has_params: true
is_vip: true
name: 舞霞
resource_id: "7226257534313631037"
- effect_id: "7269240546810400011"
has_params: false
is_vip: true
name: 艾丽莎
resource_id: "7269240546810400011"
- effect_id: "7259718549634157882"
has_params: false
is_vip: true
name: 芭比
resource_id: "7259718549634157882"
- effect_id: "7340950375127649577"
has_params: true
is_vip: true
name: 花容
resource_id: "7340950375127649577"
- effect_id: "7446691478761508108"
has_params: true
is_vip: true
name: 花火增色
resource_id: "7446691478761508108"
- effect_id: "7211008985187487036"
has_params: false
is_vip: true
name: 花间
resource_id: "7211008985187487036"
- effect_id: "7356877435184450851"
has_params: false
is_vip: true
name: 花间II
resource_id: "7356877435184450851"
- effect_id: "7261180740283403578"
has_params: false
is_vip: true
name: 花食
resource_id: "7261180740283403578"
- effect_id: "7131605817958075685"
has_params: false
is_vip: true
name: 苍橘
resource_id: "7131605817958075685"
- effect_id: "7493339669950729481"
has_params: true
is_vip: true
name: 苦尽柑来
resource_id: "7493339669950729481"
- effect_id: "7481337713443048755"
has_params: true
is_vip: true
name: 英伦复古
resource_id: "7481337713443048755"
- effect_id: "7177728466354326822"
has_params: false
is_vip: true
name: 茶墨
resource_id: "7177728466354326822"
- effect_id: "7160603159486827783"
has_params: false
is_vip: true
name: 茶酪
resource_id: "7160603159486827783"
- effect_id: "7410401136387132724"
has_params: true
is_vip: true
name: 荒原
resource_id: "7410401136387132724"
- effect_id: "7274241173764525324"
has_params: false
is_vip: true
name: 荷郁
resource_id: "7274241173764525324"
- effect_id: "7131419324622982408"
has_params: false
is_vip: true
name: 莫吉托
resource_id: "7131419324622982408"
- effect_id: "7500930664041172278"
has_params: true
is_vip: true
name: 莫奈花园
resource_id: "7500930664041172278"
- effect_id: "7381020276177276214"
has_params: true
is_vip: true
name: 莱顿
resource_id: "7381020276177276214"
- effect_id: "7394022809317526834"
has_params: true
is_vip: true
name: 萌宠
resource_id: "7394022809317526834"
- effect_id: "7374708995501739305"
has_params: true
is_vip: true
name: 落日派对
resource_id: "7374708995501739305"
- effect_id: "7511197003057990952"
has_params: true
is_vip: true
name: 落日火烧云
resource_id: "7511197003057990952"
- effect_id: "7501223866988039434"
has_params: true
is_vip: true
name: 落日电影
resource_id: "7501223866988039434"
- effect_id: "7368141858603666698"
has_params: true
is_vip: true
name: 落日粉
resource_id: "7368141858603666698"
- effect_id: "7374251948058447158"
has_params: true
is_vip: true
name: 落日鎏金
resource_id: "7374251948058447158"
- effect_id: "7232220370667883837"
has_params: false
is_vip: true
name: 蒸汽机
resource_id: "7232220370667883837"
- effect_id: "7237440664139484473"
has_params: false
is_vip: true
name: 蓝梦核
resource_id: "7237440664139484473"
- effect_id: "7337929426493132058"
has_params: false
is_vip: true
name: 蓝橙II
resource_id: "7337929426493132058"
- effect_id: "7127667757839076645"
has_params: false
is_vip: true
name: 蓝灰
resource_id: "7127667757839076645"
- effect_id: "7127664822921022734"
has_params: false
is_vip: true
name: 蓝调
resource_id: "7127664822921022734"
- effect_id: "7392898023505792319"
has_params: true
is_vip: true
name: 蓝调时刻
resource_id: "7392898023505792319"
- effect_id: "7328363887542209828"
has_params: false
is_vip: true
name: 蓝调烟火
resource_id: "7328363887542209828"
- effect_id: "7366562845120646463"
has_params: false
is_vip: true
name: 蓝调舞曲
resource_id: "7366562845120646463"
- effect_id: "7341300292148907327"
has_params: true
is_vip: true
name: 蓝金
resource_id: "7341300292148907327"
- effect_id: "7487297018998607131"
has_params: true
is_vip: true
name: 蔚蓝海域
resource_id: "7487297018998607131"
- effect_id: "7344374695053102371"
has_params: true
is_vip: true
name: 薄绿
resource_id: "7344374695053102371"
- effect_id: "7478775705195547930"
has_params: true
is_vip: true
name: 薄荷奶绿
resource_id: "7478775705195547930"
- effect_id: "7199458491315145988"
has_params: false
is_vip: true
name: 薄霞
resource_id: "7199458491315145988"
- effect_id: "7199455696017018151"
has_params: false
is_vip: true
name: 薰草
resource_id: "7199455696017018151"
- effect_id: "7159133894975999244"
has_params: false
is_vip: true
name: 藤宅
resource_id: "7159133894975999244"
- effect_id: "7263357855678467364"
has_params: false
is_vip: true
name: 街头
resource_id: "7263357855678467364"
- effect_id: "7127671519450303775"
has_params: false
is_vip: true
name: 裸粉
resource_id: "7127671519450303775"
- effect_id: "7502716416567545099"
has_params: true
is_vip: true
name: 褪色胶卷
resource_id: "7502716416567545099"
- effect_id: "7131899038625975559"
has_params: false
is_vip: true
name: 西冷
resource_id: "7131899038625975559"
- effect_id: "7131488780451663140"
has_params: false
is_vip: true
name: 西西里
resource_id: "7131488780451663140"
- effect_id: "7159175960414194982"
has_params: false
is_vip: true
name: 西雅图
resource_id: "7159175960414194982"
- effect_id: "7330543523042708790"
has_params: true
is_vip: true
name: 诗诺
resource_id: "7330543523042708790"
- effect_id: "7385930407901990153"
has_params: true
is_vip: true
name: 诗野
resource_id: "7385930407901990153"
- effect_id: "7131656881805856013"
has_params: false
is_vip: true
name: 贝果
resource_id: "7131656881805856013"
- effect_id: "7493589321014906162"
has_params: true
is_vip: true
name: 质感增蓝
resource_id: "7493589321014906162"
- effect_id: "7482072671715396901"
has_params: true
is_vip: true
name: 质感婚礼
resource_id: "7482072671715396901"
- effect_id: "7493945660903787803"
has_params: true
is_vip: true
name: 质感新中式
resource_id: "7493945660903787803"
- effect_id: "7486202141447589174"
has_params: true
is_vip: true
name: 质感明亮
resource_id: "7486202141447589174"
- effect_id: "7482408418578271514"
has_params: true
is_vip: true
name: 质感晴春
resource_id: "7482408418578271514"
- effect_id: "7127608379056459015"
has_params: false
is_vip: true
name: 赏味
resource_id: "7127608379056459015"
- effect_id: "7226238039155150139"
has_params: true
is_vip: true
name: 赤墙
resource_id: "7226238039155150139"
- effect_id: "7437195358075145484"
has_params: true
is_vip: true
name: 超清电影
resource_id: "7437195358075145484"
- effect_id: "7475289663381540150"
has_params: true
is_vip: true
name: 超清电影卷
resource_id: "7475289663381540150"
- effect_id: "7460107425375472935"
has_params: true
is_vip: true
name: 超清画质
resource_id: "7460107425375472935"
- effect_id: "7302338645938261287"
has_params: false
is_vip: true
name: 超白
resource_id: "7302338645938261287"
- effect_id: "7471501720732863753"
has_params: true
is_vip: true
name: 超高清
resource_id: "7471501720732863753"
- effect_id: "7193989203930123554"
has_params: false
is_vip: true
name: 越岭
resource_id: "7193989203930123554"
- effect_id: "7195931118166609190"
has_params: false
is_vip: true
name: 越野
resource_id: "7195931118166609190"
- effect_id: "7522455016272121124"
has_params: true
is_vip: true
name: 轻氧夏
resource_id: "7522455016272121124"
- effect_id: "7368463117287804197"
has_params: true
is_vip: true
name: 轻胶少女
resource_id: "7368463117287804197"
- effect_id: "7361791960652238143"
has_params: false
is_vip: true
name: 过期电影卷
resource_id: "7361791960652238143"
- effect_id: "7515060642705952011"
has_params: true
is_vip: true
name: 运动质感
resource_id: "7515060642705952011"
- effect_id: "7233731748545203493"
has_params: false
is_vip: true
name: 迷幻
resource_id: "7233731748545203493"
- effect_id: "7160594413847203085"
has_params: false
is_vip: true
name: 迷雾
resource_id: "7160594413847203085"
- effect_id: "7503403496117521690"
has_params: true
is_vip: true
name: 逆光拯救
resource_id: "7503403496117521690"
- effect_id: "7366260047401323811"
has_params: true
is_vip: true
name: 逆光提亮
resource_id: "7366260047401323811"
- effect_id: "7486780026029870386"
has_params: true
is_vip: true
name: 透氧肌肤
resource_id: "7486780026029870386"
- effect_id: "7530582568769522980"
has_params: true
is_vip: true
name: 通透
resource_id: "7530582568769522980"
- effect_id: "7409674549467352374"
has_params: true
is_vip: true
name: 通透暖食
resource_id: "7409674549467352374"
- effect_id: "7506758417143450890"
has_params: true
is_vip: true
name: 通透氧感
resource_id: "7506758417143450890"
- effect_id: "7271145889119440147"
has_params: false
is_vip: true
name: 邂逅
resource_id: "7271145889119440147"
- effect_id: "7343831195924303123"
has_params: true
is_vip: true
name: 郁金香
resource_id: "7343831195924303123"
- effect_id: "7341296364598480178"
has_params: true
is_vip: true
name: 都卡
resource_id: "7341296364598480178"
- effect_id: "7148817291583474980"
has_params: false
is_vip: true
name: 都城
resource_id: "7148817291583474980"
- effect_id: "7312646683672825100"
has_params: false
is_vip: true
name: 都市
resource_id: "7312646683672825100"
- effect_id: "7406976302122618123"
has_params: true
is_vip: true
name: 都市电影II
resource_id: "7406976302122618123"
- effect_id: "7131322091839753502"
has_params: false
is_vip: true
name: 酚蓝
resource_id: "7131322091839753502"
- effect_id: "7506178551725542696"
has_params: true
is_vip: true
name: 酷感辣妹
resource_id: "7506178551725542696"
- effect_id: "7281165120980454713"
has_params: false
is_vip: true
name: 酷绿
resource_id: "7281165120980454713"
- effect_id: "7211006465358843196"
has_params: false
is_vip: true
name: 醒春
resource_id: "7211006465358843196"
- effect_id: "7131643870714006821"
has_params: false
is_vip: true
name: 里昂
resource_id: "7131643870714006821"
- effect_id: "7395470918245502234"
has_params: true
is_vip: true
name: 野林
resource_id: "7395470918245502234"
- effect_id: "7193983160231742772"
has_params: false
is_vip: true
name: 野趣
resource_id: "7193983160231742772"
- effect_id: "7323022101735083315"
has_params: false
is_vip: true
name: 金喜
resource_id: "7323022101735083315"
- effect_id: "7233733326517832995"
has_params: false
is_vip: true
name: 金姜
resource_id: "7233733326517832995"
- effect_id: "7385416407049194787"
has_params: true
is_vip: true
name: 金照落日
resource_id: "7385416407049194787"
- effect_id: "7145394185108065567"
has_params: false
is_vip: true
name: 金秋
resource_id: "7145394185108065567"
- effect_id: "7376141023656873254"
has_params: true
is_vip: true
name: 金色韶华
resource_id: "7376141023656873254"
- effect_id: "7131509679246675208"
has_params: false
is_vip: true
name: 铅绿
resource_id: "7131509679246675208"
- effect_id: "7145394266209127694"
has_params: false
is_vip: true
name: 银蓝
resource_id: "7145394266209127694"
- effect_id: "7145390299370638600"
has_params: false
is_vip: true
name: 镜粉
resource_id: "7145390299370638600"
- effect_id: "7346450662185569555"
has_params: false
is_vip: true
name: 闪星
resource_id: "7346450662185569555"
- effect_id: "7471169568484953363"
has_params: true
is_vip: true
name: 闪耀派对
resource_id: "7471169568484953363"
- effect_id: "7361399516454604071"
has_params: true
is_vip: true
name: 阴天拯救
resource_id: "7361399516454604071"
- effect_id: "7377370363035979034"
has_params: true
is_vip: true
name: 阿勒泰
resource_id: "7377370363035979034"
- effect_id: "7234793127867878712"
has_params: false
is_vip: true
name: 陶瓷肌
resource_id: "7234793127867878712"
- effect_id: "7271140658071588132"
has_params: false
is_vip: true
name: 随性
resource_id: "7271140658071588132"
- effect_id: "7145394848361729288"
has_params: false
is_vip: true
name: 雀染
resource_id: "7145394848361729288"
- effect_id: "7145678373530946824"
has_params: false
is_vip: true
name: 雨皂
resource_id: "7145678373530946824"
- effect_id: "7196917591909109052"
has_params: false
is_vip: true
name: 雨空
resource_id: "7196917591909109052"
- effect_id: "7431914829876694324"
has_params: true
is_vip: true
name: 雪地胶片
resource_id: "7431914829876694324"
- effect_id: "7431914902177991970"
has_params: true
is_vip: true
name: 雪地胶片II
resource_id: "7431914902177991970"
- effect_id: "7431914955747691810"
has_params: true
is_vip: true
name: 雪地胶片III
resource_id: "7431914955747691810"
- effect_id: "7262376135202327871"
has_params: false
is_vip: true
name: 雪挞
resource_id: "7262376135202327871"
- effect_id: "7426222844872330522"
has_params: true
is_vip: true
name: 雪白肤
resource_id: "7426222844872330522"
- effect_id: "7312646650202262820"
has_params: false
is_vip: true
name: 雾都
resource_id: "7312646650202262820"
- effect_id: "7127823362356727077"
has_params: false
is_vip: true
name: 雾野
resource_id: "7127823362356727077"
- effect_id: "7185425707231644961"
has_params: false
is_vip: true
name: 青巷
resource_id: "7185425707231644961"
- effect_id: "7131290518838938887"
has_params: false
is_vip: true
name: 青提
resource_id: "7131290518838938887"
- effect_id: "7502056246804024611"
has_params: true
is_vip: true
name: 青春
resource_id: "7502056246804024611"
- effect_id: "7513077194952936767"
has_params: true
is_vip: true
name: 青春照
resource_id: "7513077194952936767"
- effect_id: "7511949534042311946"
has_params: true
is_vip: true
name: 青春物语
resource_id: "7511949534042311946"
- effect_id: "7510888042761096459"
has_params: true
is_vip: true
name: 青春胶片
resource_id: "7510888042761096459"
- effect_id: "7495811579095682367"
has_params: true
is_vip: true
name: 青春记忆
resource_id: "7495811579095682367"
- effect_id: "7145390299106381086"
has_params: false
is_vip: true
name: 青森
resource_id: "7145390299106381086"
- effect_id: "7478335987777572137"
has_params: true
is_vip: true
name: 青橙电影感
resource_id: "7478335987777572137"
- effect_id: "7127671508264078599"
has_params: false
is_vip: true
name: 青灰
resource_id: "7127671508264078599"
- effect_id: "7127541821332409630"
has_params: false
is_vip: true
name: 青黄
resource_id: "7127541821332409630"
- effect_id: "7337932621046910262"
has_params: false
is_vip: true
name: 青黄II
resource_id: "7337932621046910262"
- effect_id: "7226989951911562553"
has_params: false
is_vip: true
name: 韦斯
resource_id: "7226989951911562553"
- effect_id: "7186934131484331322"
has_params: false
is_vip: true
name: 顺意
resource_id: "7186934131484331322"
- effect_id: "7484983198800301321"
has_params: true
is_vip: true
name: 颜白
resource_id: "7484983198800301321"
- effect_id: "7330579916272012580"
has_params: true
is_vip: true
name: 风味
resource_id: "7330579916272012580"
- effect_id: "7261466919688015140"
has_params: false
is_vip: true
name: 风铃蓝
resource_id: "7261466919688015140"
- effect_id: "7248568718265978112"
has_params: false
is_vip: true
name: 飒意
resource_id: "7248568718265978112"
- effect_id: "7478181967532543259"
has_params: true
is_vip: true
name: 食光II
resource_id: "7478181967532543259"
- effect_id: "7131644140340776205"
has_params: false
is_vip: true
name: 食色
resource_id: "7131644140340776205"
- effect_id: "7330588808666156307"
has_params: true
is_vip: true
name: 香浓
resource_id: "7330588808666156307"
- effect_id: "7145394213339860261"
has_params: false
is_vip: true
name: 驮月
resource_id: "7145394213339860261"
- effect_id: "7486890470149246219"
has_params: true
is_vip: true
name: 高晴画质
resource_id: "7486890470149246219"
- effect_id: "7447039744229428534"
has_params: true
is_vip: true
name: 高清
resource_id: "7447039744229428534"
- effect_id: "7463103811276655881"
has_params: true
is_vip: true
name: 高清4K
resource_id: "7463103811276655881"
- effect_id: "7454130417562553651"
has_params: true
is_vip: true
name: 高清4k电影
resource_id: "7454130417562553651"
- effect_id: "7325426821267295551"
has_params: false
is_vip: true
name: 高清II
resource_id: "7325426821267295551"
- effect_id: "7476126917280730378"
has_params: true
is_vip: true
name: 高清中性灰
resource_id: "7476126917280730378"
- effect_id: "7474611627338239282"
has_params: true
is_vip: true
name: 高清亮粉
resource_id: "7474611627338239282"
- effect_id: "7471501728546966835"
has_params: true
is_vip: true
name: 高清修复
resource_id: "7471501728546966835"
- effect_id: "7402847660165713190"
has_params: true
is_vip: true
name: 高清修复III
resource_id: "7402847660165713190"
- effect_id: "7446737538967932186"
has_params: true
is_vip: true
name: 高清冷冬
resource_id: "7446737538967932186"
- effect_id: "7478329447545081129"
has_params: true
is_vip: true
name: 高清冷调
resource_id: "7478329447545081129"
- effect_id: "7446290162922818870"
has_params: true
is_vip: true
name: 高清圣诞
resource_id: "7446290162922818870"
- effect_id: "7426668776491453707"
has_params: true
is_vip: true
name: 高清增强
resource_id: "7426668776491453707"
- effect_id: "7440518219409968384"
has_params: true
is_vip: true
name: 高清增色
resource_id: "7440518219409968384"
- effect_id: "7436815358410886435"
has_params: true
is_vip: true
name: 高清增质
resource_id: "7436815358410886435"
- effect_id: "7449684693982743817"
has_params: true
is_vip: true
name: 高清寒冬
resource_id: "7449684693982743817"
- effect_id: "7437098009827036455"
has_params: true
is_vip: true
name: 高清影视
resource_id: "7437098009827036455"
- effect_id: "7414810241453280549"
has_params: true
is_vip: true
name: 高清感
resource_id: "7414810241453280549"
- effect_id: "7414810073731435785"
has_params: true
is_vip: true
name: 高清感II
resource_id: "7414810073731435785"
- effect_id: "7414810202706447625"
has_params: true
is_vip: true
name: 高清感III
resource_id: "7414810202706447625"
- effect_id: "7439995842477428004"
has_params: true
is_vip: true
name: 高清提亮
resource_id: "7439995842477428004"
- effect_id: "7443710725773675803"
has_params: true
is_vip: true
name: 高清提升
resource_id: "7443710725773675803"
- effect_id: "7476104906924100915"
has_params: true
is_vip: true
name: 高清春日
resource_id: "7476104906924100915"
- effect_id: "7442389591140748570"
has_params: true
is_vip: true
name: 高清晴天
resource_id: "7442389591140748570"
- effect_id: "7448290256476065035"
has_params: true
is_vip: true
name: 高清晴日
resource_id: "7448290256476065035"
- effect_id: "7431187754379136266"
has_params: true
is_vip: true
name: 高清暖调
resource_id: "7431187754379136266"
- effect_id: "7428629277110848768"
has_params: true
is_vip: true
name: 高清润颜
resource_id: "7428629277110848768"
- effect_id: "7442344329114422565"
has_params: true
is_vip: true
name: 高清漫晴
resource_id: "7442344329114422565"
- effect_id: "7471955373340101927"
has_params: true
is_vip: true
name: 高清焕晴
resource_id: "7471955373340101927"
- effect_id: "7413062310580800831"
has_params: true
is_vip: true
name: 高清电影
resource_id: "7413062310580800831"
- effect_id: "7452946862581058853"
has_params: true
is_vip: true
name: 高清电影卷
resource_id: "7452946862581058853"
- effect_id: "7465342226118266162"
has_params: true
is_vip: true
name: 高清画质
resource_id: "7465342226118266162"
- effect_id: "7451808659320900891"
has_params: true
is_vip: true
name: 高清绿妍
resource_id: "7451808659320900891"
- effect_id: "7435865312907676978"
has_params: true
is_vip: true
name: 高清美食
resource_id: "7435865312907676978"
- effect_id: "7433451928773807397"
has_params: true
is_vip: true
name: 高清质感
resource_id: "7433451928773807397"
- effect_id: "7444960692853148955"
has_params: true
is_vip: true
name: 高清雪景
resource_id: "7444960692853148955"
- effect_id: "7447397442603076899"
has_params: true
is_vip: true
name: 高清雪肤
resource_id: "7447397442603076899"
- effect_id: "7435675065498275081"
has_params: true
is_vip: true
name: 高清鲜明
resource_id: "7435675065498275081"
- effect_id: "7429744855724641545"
has_params: true
is_vip: true
name: 高清黑白
resource_id: "7429744855724641545"
- effect_id: "7450134286071631141"
has_params: true
is_vip: true
name: 高清默冬
resource_id: "7450134286071631141"
- effect_id: "7513959933310749991"
has_params: true
is_vip: true
name: 高级影视
resource_id: "7513959933310749991"
- effect_id: "7145394469666376991"
has_params: false
is_vip: true
name: 高街
resource_id: "7145394469666376991"
- effect_id: "7175076304058895619"
has_params: false
is_vip: true
name: 魅影
resource_id: "7175076304058895619"
- effect_id: "7166480345666260263"
has_params: false
is_vip: true
name: 魔都
resource_id: "7166480345666260263"
- effect_id: "7428441733123345702"
has_params: true
is_vip: true
name: 鲜亮
resource_id: "7428441733123345702"
- effect_id: "7320434750018047251"
has_params: false
is_vip: true
name: 鲜明
resource_id: "7320434750018047251"
- effect_id: "7361400073533820196"
has_params: true
is_vip: true
name: 鲜明II
resource_id: "7361400073533820196"
- effect_id: "7451608395745889586"
has_params: true
is_vip: true
name: 鲜明增强
resource_id: "7451608395745889586"
- effect_id: "7463798839258909963"
has_params: true
is_vip: true
name: 鲜明增色
resource_id: "7463798839258909963"
- effect_id: "7330581892510649636"
has_params: true
is_vip: true
name: 鲜美
resource_id: "7330581892510649636"
- effect_id: "7497157143502654732"
has_params: true
is_vip: true
name: 鲜艳增色
resource_id: "7497157143502654732"
- effect_id: "7494505446158503179"
has_params: true
is_vip: true
name: 鲜花增彩
resource_id: "7494505446158503179"
- effect_id: "7493083101426453796"
has_params: true
is_vip: true
name: 鲜花增色
resource_id: "7493083101426453796"
- effect_id: "7493457725431631142"
has_params: true
is_vip: true
name: 鲜花增艳
resource_id: "7493457725431631142"
- effect_id: "7308714123913612607"
has_params: false
is_vip: true
name: 鹅冠
resource_id: "7308714123913612607"
- effect_id: "7272330168717430075"
has_params: false
is_vip: true
name: 黄昏
resource_id: "7272330168717430075"
- effect_id: "7418828782020168999"
has_params: true
is_vip: true
name: 黄昏时
resource_id: "7418828782020168999"
- effect_id: "7131522303082466597"
has_params: false
is_vip: true
name: 黑冰
resource_id: "7131522303082466597"
- effect_id: "7408496787398446362"
has_params: false
is_vip: true
name: 黑暗神话
resource_id: "7408496787398446362"
- effect_id: "7223712396769119545"
has_params: false
is_vip: true
name: 黑曜
resource_id: "7223712396769119545"
- effect_id: "7414902721733479699"
has_params: true
is_vip: true
name: 黑金
resource_id: "7414902721733479699"
- effect_id: "7341266486536768831"
has_params: true
is_vip: true
name: 黑金红
resource_id: "7341266486536768831"
- effect_id: "7252674245396942139"
has_params: false
is_vip: true
name: 龙舌兰
resource_id: "7252674245396942139"
get_image_animations:
value:
ReqExample:
mode: 0
type: in
RespExample:
effects:
- category_id: pic_ruchang
category_name: 图片入场
duration: 600000
icon_url: https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fade_in_pic_icon
id: "35395179"
material_type: sticker
name: 渐显出现
panel: ""
path: ""
platform: all
request_id: ""
resource_id: "7314291622525538844"
start: 0
type: in
- category_id: pic_ruchang
category_name: 图片入场
duration: 800000
icon_url: https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/scale_in_pic_icon
id: "77035160"
material_type: sticker
name: 缩放入场
panel: ""
path: ""
platform: all
request_id: ""
resource_id: "7397306443147252234"
start: 0
type: in
- category_id: pic_ruchang
category_name: 图片入场
duration: 700000
icon_url: https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fly_in_pic_icon
id: "12345679"
material_type: sticker
name: 飞入效果
panel: ""
path: ""
platform: all
request_id: ""
resource_id: "7298765432109876544"
start: 0
type: in
- category_id: pic_ruchang
category_name: 图片入场
duration: 900000
icon_url: https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/light_emerge_pic_icon
id: "98765432"
material_type: sticker
name: 光影浮现
panel: ""
path: ""
platform: all
request_id: ""
resource_id: "7456789012345678901"
start: 0
type: in
get_text_animations:
value:
ReqExample:
mode: 0
type: in
RespExample:
effects:
- category_id: ruchang
category_name: 入场
duration: 500000
icon_url: https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/459c196951cadbd024456a63db89481f
id: "35395178"
material_type: sticker
name: 冰雪飘动
panel: ""
path: ""
platform: all
request_id: ""
resource_id: "7314291622525538843"
start: 0
type: in
- category_id: ruchang
category_name: 入场
duration: 500000
icon_url: https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/c15f5c313f8170c558043abf300a0692
id: "77035159"
material_type: sticker
name: 变色输入
panel: ""
path: ""
platform: all
request_id: ""
resource_id: "7397306443147252233"
start: 0
type: in
- category_id: ruchang
category_name: 入场
duration: 750000
icon_url: https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fade_in_icon
id: "12345678"
material_type: sticker
name: 渐显入场
panel: ""
path: ""
platform: all
request_id: ""
resource_id: "7298765432109876543"
start: 0
type: in
get_url:
value:
ReqExample:
output: 中国人https://assets.jcaigc.cn/test1.mp3
RespExample:
output: 中国人https://assets.jcaigc.cn/test1.mp3
imgs_infos:
value:
ReqExample:
height: 1024
imgs:
- https://assets.jcaigc.cn/demo.png
- https://assets.jcaigc.cn/demo1.png
timelines:
- end: 284891428
start: 0
- end: 579578774
start: 284891428
width: 1024
RespExample:
infos: '[{"image_url": "https://assets.jcaigc.cn/demo.png", "start": 0, "end": 284891428, "height": 1024, "width": 1024}, {"image_url": "https://assets.jcaigc.cn/demo1.png", "start": 284891428, "end": 579578774, "height": 1024, "width": 1024}]'
keyframes_infos:
value:
ReqExample:
ctype: KFTypePositionX
height: 1080
offsets: 0|100
segment_infos:
- end: 5000000
id: c1369c795ca64fe38bac1f2a93e8a811
start: 0
values: 1|2
width: 1920
RespExample:
keyframes_infos: '[{"offset": 0, "property": "KFTypePositionX", "segment_id": "c1369c795ca64fe38bac1f2a93e8a811", "value": 0.0005208333333333333}, {"offset": 5000000, "property": "KFTypePositionX", "segment_id": "c1369c795ca64fe38bac1f2a93e8a811", "value": 0.0010416666666666667}]'
objs_to_str_list:
value:
ReqExample:
outputs:
- output: https://assets.jcaigc.cn/max.mp4
- output: https://assets.jcaigc.cn/min.mp4
RespExample:
infos:
- https://assets.jcaigc.cn/max.mp4
- https://assets.jcaigc.cn/min.mp4
save_draft:
value:
ReqExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251126220753b7e35362
RespExample:
draft_url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251126220753b7e35362
message: 成功
search_sticker:
value:
ReqExample:
keyword: 人
RespExample:
data:
- sticker:
large_image:
image_url: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/91ada02f8fec440798fbce5b6c8052f4~tplv-3jr8j4ixpe-image.image?x-expires=1797257777&x-signature=JGLXAdKzUC1SNFOG1DBIj7deSm0%3D
preview_cover: ""
sticker_package:
height_per_frame: 128
size: 2233
width_per_frame: 128
sticker_type: 1
track_thumbnail: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/91ada02f8fec440798fbce5b6c8052f4~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=OlE4ZjEFzZ0%2BZE2hx984dtqX1JY%3D&format=.png
sticker_id: "7128787497496120613"
title: '人物剪影 '
- sticker:
large_image:
image_url: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/dde1931edf4e4026b24b52bdf83cdcc0~tplv-3jr8j4ixpe-resize:1920:1920.png?x-expires=1797257777&x-signature=C69yhUjUgvAfbKC%2B3lnqRj4d4Mo%3D
preview_cover: ""
sticker_package:
height_per_frame: 512
size: 34542
width_per_frame: 512
sticker_type: 1
track_thumbnail: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/dde1931edf4e4026b24b52bdf83cdcc0~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=4zY6CNDljdwTfxWGCcNdI7VX54U%3D&format=.png
sticker_id: "7075169384330726663"
title: 男性卡通手绘人物
- sticker:
large_image:
image_url: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/edbd487bfbe347b49183ac297dece704~tplv-3jr8j4ixpe-resize:1920:1920.png?x-expires=1797257777&x-signature=w%2FYtiqgjYd89ZRiBz0CmlhPaYWg%3D
preview_cover: ""
sticker_package:
height_per_frame: 452
size: 172903
width_per_frame: 256
sticker_type: 1
track_thumbnail: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/edbd487bfbe347b49183ac297dece704~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=GAb5g%2B0hERhVIOqy9HG%2BGzvBR2E%3D&format=.png
sticker_id: "7141375321454021922"
title: 3d 人物
- sticker:
large_image:
image_url: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/e42cb5d3d37146738d2b9b714c9a0ce3~tplv-3jr8j4ixpe-resize:1920:1920.gif?x-expires=1797257777&x-signature=5%2BKU1MAEkt4E6uRzqBiqpG6GPKw%3D
preview_cover: ""
sticker_package:
height_per_frame: 280
size: 122700
width_per_frame: 280
sticker_type: 2
track_thumbnail: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/e42cb5d3d37146738d2b9b714c9a0ce3~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=uF1QWPpgsM62Jc%2BgIpKFkH0PwwM%3D&format=.png
sticker_id: "7002854862090210590"
title: 人挤人
- sticker:
large_image:
image_url: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/d05c664aceba49d2896660562ae5fe4d~tplv-3jr8j4ixpe-resize:1920:1920.png?x-expires=1797257777&x-signature=dTV36p4iN055SxRvTcovbiq9QEs%3D
preview_cover: ""
sticker_package:
height_per_frame: 490
size: 126967
width_per_frame: 463
sticker_type: 1
track_thumbnail: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/d05c664aceba49d2896660562ae5fe4d~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=jmY7LUydyEJr9vVpGFBPQFhYp7Y%3D&format=.png
sticker_id: "6989061706173500703"
title: 人物背影
- sticker:
large_image:
image_url: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/adff9a9ac6b14db291eb1da1964b140f~tplv-3jr8j4ixpe-resize:1920:1920.png?x-expires=1797257777&x-signature=ISDIKQ6grSn9cyZW0TFq%2BF86y5M%3D
preview_cover: ""
sticker_package:
height_per_frame: 419
size: 91220
width_per_frame: 540
sticker_type: 1
track_thumbnail: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/adff9a9ac6b14db291eb1da1964b140f~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=OQokcDqdpZrfjbbJ5I2miMz9vF8%3D&format=.png
sticker_id: "6972844711287524621"
title: 商务人物工作会议人员扁平化职场 (28)
- sticker:
large_image:
image_url: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/656e900a0bb6415db5199c58e8148b55~tplv-3jr8j4ixpe-resize:1920:1920.png?x-expires=1797257777&x-signature=MLWZQjACxbpcUkQyznGMzpyHn9I%3D
preview_cover: ""
sticker_package:
height_per_frame: 512
size: 33884
width_per_frame: 512
sticker_type: 1
track_thumbnail: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/656e900a0bb6415db5199c58e8148b55~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797257777&x-signature=
sticker_id: "6972844711287524622"
title: 商务人物工作会议人员扁平化职场 (29)
- sticker:
large_image:
image_url: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/4f77f60ad9924712baa4e32d534e342c~tplv-3jr8j4ixpe-resize:1920:1920.png?x-expires=1797258668&x-signature=Co7%2B81Xhn880nPNA7UBRlI2UPyE%3D
preview_cover: ""
sticker_package:
height_per_frame: 540
size: 104066
width_per_frame: 540
sticker_type: 1
track_thumbnail: https://p3-heycan-jy-sign.byteimg.com/tos-cn-i-3jr8j4ixpe/4f77f60ad9924712baa4e32d534e342c~tplv-3jr8j4ixpe-resize:120:120.png?x-expires=1797258668&x-signature=V7SlC36041lGmBHWsvY3lYgEuRk%3D&format=.png
sticker_id: "7243670138606718265"
title: 人气爆款标签
message: 成功
str_list_to_objs:
value:
ReqExample:
infos:
- https://assets.jcaigc.cn/min.mp4
- https://assets.jcaigc.cn/max.mp4
RespExample:
infos:
- output: https://assets.jcaigc.cn/min.mp4
- output: https://assets.jcaigc.cn/max.mp4
str_to_list:
value:
ReqExample:
obj: '{ "infos": [ "https://assets.jcaigc.cn/min.mp4", "https://assets.jcaigc.cn/max.mp4" ] }'
RespExample:
infos:
- '{ "infos": [ "https://assets.jcaigc.cn/min.mp4", "https://assets.jcaigc.cn/max.mp4" ] }'
timelines:
value:
ReqExample:
duration: 10000000
num: 2
start: 0
type: 0
RespExample:
all_timelines:
- end: 10000000
start: 0
timelines:
- end: 5000000
start: 0
- end: 10000000
start: 5000000
video_infos:
value:
ReqExample:
height: "1080"
mask: 爱心
timelines:
- end: 284891428
start: 0
- end: 579578774
start: 284891428
transition: 推近
transition_duration: 1
video_urls:
- https://assets.jcaigc.cn/min.mp4
- https://assets.jcaigc.cn/max.mp4
volume: 1
width: 1920
RespExample:
infos: '[{"video_url": "https://assets.jcaigc.cn/min.mp4", "start": 0, "end": 284891428, "duration": 284891428, "width": 1920, "height": 1080, "mask": "爱心", "transition": "推近", "transition_duration": 1, "volume": 1.0}, {"video_url": "https://assets.jcaigc.cn/max.mp4", "start": 284891428, "end": 579578774, "duration": 294687346, "width": 1920, "height": 1080, "mask": "爱心", "transition": "推近", "transition_duration": 1, "volume": 1.0}]'
info:
description: 剪映小助手一个开源且免费的剪映插件,兼容剪映V5.9及以上所有版本。
title: 开源剪映小助手
version: v1
openapi: 3.0.1
paths:
/add_audios:
post:
operationId: add_audios
requestBody:
content:
application/json:
schema:
properties:
audio_infos:
description: '音频信息,示例:[{"audio_url": "http://example.com/audio1.mp3","duration":120,"start":0,"end":12000000,"audio_effect":"教堂"}]'
type: string
draft_url:
description: 草稿地址,使用create_draft输出的draft_url即可
type: string
required:
- draft_url
- audio_infos
type: object
responses:
"200":
content:
application/json:
schema:
properties:
audio_ids:
items:
type: string
type: array
code:
type: number
x-global-disable: true
draft_url:
type: string
message:
type: string
x-global-disable: true
track_id:
type: string
type: object
description: new desc
default:
description: ""
summary: 批量添加音频
/add_captions:
post:
operationId: add_captions
requestBody:
content:
application/json:
schema:
properties:
alignment:
default: 1
description: 文本对齐方式(0-5)
type: integer
alpha:
default: 1
description: 文本透明度(0.0-1.0)
type: number
bold:
default: false
description: 文本加粗开关
type: boolean
border_color:
description: 边框颜色(十六进制)
type: string
captions:
description: JSON字符串格式的字幕信息数组
type: string
draft_url:
description: 剪映草稿URL
type: string
font:
description: 字体名称
type: string
font_size:
default: 15
description: 字体大小
type: integer
has_shadow:
default: false
description: '文本阴影开关(true为打开,false为关闭),如果打开了,但没有填shadow_info,默认就是{ "shadow_color": "#000000", "shadow_alpha": 0.9, "shadow_diffuse": 15, "shadow_distance": 5, "shadow_angle", -45 }'
type: boolean
italic:
default: false
description: 文本斜线开关(true为打开,false为关闭),默认关闭
type: boolean
letter_spacing:
default: 0
description: 字间距
type: number
line_spacing:
default: 0
description: 行间距
type: number
scale_x:
default: 1
description: 水平缩放
type: number
scale_y:
default: 1
description: 垂直缩放
type: number
shadow_info:
description: 文本阴影
properties:
shadow_alpha:
description: 阴影不透明度, 取值范围为[0, 1]
type: number
shadow_angle:
description: 阴影角度, 取值范围为[-180, 180]
type: number
shadow_color:
description: 阴影颜色(十六进制)
type: string
shadow_diffuse:
description: 阴影扩散程度, 取值范围为[0, 100]
type: number
shadow_distance:
description: 阴影距离, 取值范围为[0, 100]
type: number
type: object
style_text:
default: 0
description: 是否使用样式文本
type: integer
text_color:
default: '#ffffff'
description: 文本颜色(十六进制)
type: string
text_effect:
description: 文本花字
type: string
transform_x:
default: 0
description: 水平位移
type: number
transform_y:
default: 0
description: 垂直位移
type: number
underline:
default: false
description: 文本下划线开关(true为打开,false为关闭)
type: boolean
required:
- draft_url
- captions
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
message:
type: string
x-global-disable: true
segment_ids:
items:
type: string
type: array
segment_infos:
items:
properties:
end:
type: number
id:
type: string
start:
type: number
type: object
type: array
text_ids:
items:
type: string
type: array
track_id:
type: string
type: object
description: new desc
default:
description: ""
summary: 批量添加字幕
/add_effects:
post:
operationId: add_effects
requestBody:
content:
application/json:
schema:
properties:
draft_url:
description: 草稿地址,使用create_draft输出的draft_url即可
type: string
effect_infos:
description: 特效数组内容,eg:[{"effect_title":"金粉闪闪","end":5000000,"start":0}]
type: string
required:
- draft_url
- effect_infos
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
effect_ids:
items:
type: string
type: array
message:
type: string
x-global-disable: true
segment_ids:
items:
type: string
type: array
track_id:
type: string
type: object
description: new desc
default:
description: ""
summary: 添加特效
/add_filters:
post:
operationId: add_filters
requestBody:
content:
application/json:
schema:
properties:
draft_url:
description: 草稿地址
type: string
filter_infos:
description: '滤镜信息,示例:[{"filter_title": "清透感", "start": 0, "end": 5000000, "intensity": 100.0}]'
type: string
required:
- draft_url
- filter_infos
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
filter_ids:
items:
type: string
type: array
message:
type: string
x-global-disable: true
segment_ids:
items:
type: string
type: array
track_id:
type: string
type: object
description: new desc
default:
description: ""
summary: 批量添加滤镜。
/add_images:
post:
operationId: add_images
requestBody:
content:
application/json:
schema:
properties:
alpha:
default: 1
description: 图片透明度,值0-1
type: number
draft_url:
description: 草稿地址,使用create_draft输出的draft_url即可
type: string
image_infos:
description: "图片信息,示例:[ \t{ \t\t\"image_url\":\"https://assets.jcaigc.cn/demo.png\", // 图片URL \t\t\"width\":1920, // 宽 \t\t\"height\":1080, // 高 \t\t\"start\":0, // 开始时间,单位:毫秒 \t\t\"end\":5000000,// 结束时间,单位:毫秒 \t\t\"duration\":5000000, // 时长 \t\t\"animation\":\"淡入淡出\", // 动画 \t\t\"transition\":\"溶解\", // 转场 \t\t\"transition_duration\":500000 // 转场时间 \t} "
type: string
scale_x:
default: 1
description: x缩放
type: number
scale_y:
default: 1
description: y缩放
type: number
transform_x:
default: 0
description: 移动transform_x
type: number
transform_y:
default: 0
description: 移动transform_y
type: number
required:
- draft_url
- image_infos
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
image_ids:
items:
type: string
type: array
message:
type: string
x-global-disable: true
segment_ids:
items:
type: string
type: array
segment_infos:
items:
properties:
end:
type: number
id:
type: string
start:
type: number
type: object
type: array
track_id:
type: string
type: object
description: new desc
default:
description: ""
summary: 批量添加图片
/add_keyframes:
post:
operationId: add_keyframes
requestBody:
content:
application/json:
schema:
properties:
draft_url:
description: 草稿地址,使用create_draft输出的draft_url即可
type: string
keyframes:
description: '关键帧数据,格式: [ { "offset": 5000000, "property": "KFTypePositionX", "segment_id": "acc5b516-046b-4eae-a179-f686f35e70a8", "value": 0 } ]'
type: string
required:
- draft_url
- keyframes
type: object
responses:
"200":
content:
application/json:
schema:
properties:
affected_segments:
items:
type: string
type: array
x-global-disable: true
code:
type: number
x-global-disable: true
draft_url:
type: string
keyframes_added:
type: number
x-global-disable: true
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 添加关键帧
/add_masks:
post:
operationId: add_masks
requestBody:
content:
application/json:
schema:
properties:
X:
description: 对应剪映的X位置
type: integer
"Y":
description: 对应剪映的Y位置
type: integer
draft_url:
description: 草稿地址,使用create_draft输出的draft_url即可
type: string
feather:
description: 羽化0-100
type: integer
height:
description: 对应剪映的宽高
type: integer
invert:
description: 是否反转
type: boolean
name:
description: 蒙板类型:线性/镜面/圆形/矩形/爱心/星形
type: string
rotation:
description: 旋转角度0-360
type: integer
roundCorner:
description: 矩形的圆角
type: integer
segment_ids:
description: add_videos或者add_images的返回值
items:
description: 片段id
type: string
type: array
width:
description: 对应剪映的宽高
type: integer
required:
- draft_url
- segment_ids
- name
type: object
responses:
"200":
content:
application/json:
schema:
properties:
affected_segments:
items:
type: string
type: array
x-global-disable: true
code:
type: number
x-global-disable: true
draft_url:
type: string
mask_ids:
items:
type: string
type: array
x-global-disable: true
masks_added:
type: number
x-global-disable: true
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 增加蒙版
/add_sticker:
post:
operationId: add_sticker
requestBody:
content:
application/json:
schema:
properties:
draft_url:
description: 目标草稿的完整URL
type: string
end:
description: 贴纸结束时间(微秒)
type: integer
scale:
default: 1
description: 贴纸缩放比例
type: number
start:
description: 贴纸开始时间(微秒)
type: integer
sticker_id:
description: 贴纸的唯一标识ID
type: string
transform_x:
default: 0
description: X轴位置偏移(像素)
type: integer
transform_y:
default: 0
description: Y轴位置偏移(像素)
type: integer
required:
- draft_url
- end
- start
- sticker_id
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
duration:
type: number
message:
type: string
x-global-disable: true
segment_id:
type: string
sticker_id:
type: string
track_id:
type: string
type: object
description: new desc
default:
description: ""
summary: '添加贴纸,批处理时,并发要设置成1 '
/add_text_style:
post:
operationId: add_text_style
requestBody:
content:
application/json:
schema:
properties:
font_size:
default: 15
description: 普通文本的字体大小
type: integer
keyword:
description: 关键词,多个用 | 分隔
type: string
keyword_color:
default: '#ff7100'
description: 关键词文本颜色(十六进制)
type: string
keyword_font_size:
default: 15
description: 关键词字体大小
type: integer
text:
description: 要处理的文本内容
type: string
required:
- keyword
- text
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
message:
type: string
x-global-disable: true
text_style:
type: string
type: object
description: new desc
default:
description: ""
summary: 创建文本富文本样式
/add_videos:
post:
operationId: add_videos
requestBody:
content:
application/json:
schema:
properties:
alpha:
default: 1
description: 透明度:0-1 ,默认1
type: number
draft_url:
description: 草稿地址,使用create_draft输出的draft_url即可
type: string
scale_x:
default: 1
description: 剪映scale_x 缩放
type: number
scale_y:
default: 1
description: 剪映scale_y 缩放
type: number
scene_timelines:
description: '分镜时间线,自动变速,例如:[{start: 0, end: 6000000}]'
items:
description: 分镜时间线
properties:
curve_speed:
description: 曲线变速参数
type: string
end:
description: 结束时间线
type: integer
start:
description: 开始时间线
type: integer
type: object
type: array
transform_x:
default: 0
description: 剪映x位置
type: number
transform_y:
default: 0
description: 剪映y位置
type: number
video_infos:
description: '[ { "video_url": "https://example.com/video1.mp4", "duration": 12000000, // 视频时长,以秒*1000000为单位 "width": 1920, // 视频宽度 "height": 1080, // 视频高度 "start": 0, // 视频在时间轴上的开始时间 "end": 12000000 // 视频在时间轴上的结束时间 } ]'
type: string
required:
- draft_url
- video_infos
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
message:
type: string
x-global-disable: true
segment_ids:
items:
type: string
type: array
track_id:
type: string
video_ids:
items:
type: string
type: array
type: object
description: new desc
default:
description: ""
summary: 批量添加视频
/audio_infos:
post:
operationId: audio_infos
requestBody:
content:
application/json:
schema:
properties:
audio_effect:
description: 特效音,eg:教堂,默认无
type: string
mp3_urls:
description: 音频列表
items:
description: 音频连接地址
type: string
type: array
timelines:
description: 时间线
items:
description: 时间线对象
properties:
end:
description: 结束时间
type: integer
start:
description: 开始时间
type: integer
required:
- start
- end
type: object
type: array
volume:
description: 音量大小,0-10,默认1
type: number
required:
- mp3_urls
- timelines
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
type: string
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 根据时间线制作音频数据
/audio_timelines:
post:
operationId: audio_timelines
requestBody:
content:
application/json:
schema:
properties:
links:
description: 音频链接列表
items:
description: 音频链接
type: string
type: array
required:
- links
type: object
responses:
"200":
content:
application/json:
schema:
properties:
all_timelines:
items:
properties:
end:
type: number
start:
type: number
type: object
type: array
code:
type: number
x-global-disable: true
message:
type: string
x-global-disable: true
timelines:
items:
properties:
end:
type: number
start:
type: number
type: object
type: array
type: object
description: new desc
default:
description: ""
summary: 从音频列表中获取时间线列表
/caption_infos:
post:
operationId: caption_infos
requestBody:
content:
application/json:
schema:
properties:
font_size:
description: 字体大小
type: integer
in_animation:
description: 入场动画名称
type: string
in_animation_duration:
description: 入场动画时长
type: integer
keyword_border_color:
description: 关键边框颜色,示例:#ff0000
type: string
keyword_color:
description: 关键词颜色
type: string
keyword_font_size:
description: 关键词字大小
type: integer
keywords:
description: 文本里面的重点词列表
items:
description: 重点词
type: string
type: array
loop_animation:
description: 对应剪映的循环动画名字,多个动画请用英文|分割,比如:扫光|晃动
type: string
loop_animation_duration:
description: 循环动画时长
type: integer
out_animation:
description: 对应剪映的出场动画名字,多个动画请用英文|分割,比如:消散|闭幕
type: string
out_animation_duration:
description: 出场动画时长
type: integer
texts:
description: 文本列表
items:
description: 文本
type: string
type: array
timelines:
description: 时间节点,只接收结构:[{"start":0,"end":4612}],一般从audio_timeline节点的输出获取
items:
description: 时间线
properties:
end:
description: 结束时间
type: integer
start:
description: 开始时间
type: integer
required:
- start
- end
type: object
type: array
required:
- texts
- timelines
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
type: string
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 根据时间线制作字幕数据
/create_draft:
post:
operationId: create_draft
requestBody:
content:
application/json:
schema:
properties:
height:
default: 1920
description: 高
type: integer
width:
default: 1080
description: 高
type: integer
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
message:
type: string
x-global-disable: true
tip_url:
type: string
type: object
description: new desc
default:
description: ""
summary: 插件入口-创建草稿
/easy_create_material:
post:
operationId: easy_create_material
requestBody:
content:
application/json:
schema:
properties:
audio_url:
description: 音频文件URL,不能为空或"null"
type: string
draft_url:
description: 目标草稿的完整URL
type: string
font_size:
default: 15
description: 字体大小
type: integer
img_url:
description: 图片文件URL
type: string
text:
description: 要添加的文字内容
type: string
text_color:
default: '#ffffff'
description: 文字颜色(十六进制格式)
type: string
text_transform_y:
default: 0
description: 文字Y轴位置偏移
type: integer
video_url:
description: 视频文件URL
type: string
required:
- audio_url
- draft_url
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
message:
type: string
type: object
description: new desc
default:
description: ""
summary: |-
快速上手,简易创建素材轨道
create_draft+easy_create_material即可
/effect_infos:
post:
operationId: effect_infos
requestBody:
content:
application/json:
schema:
properties:
effects:
description: 特效名字列表
items:
description: 特效名
type: string
type: array
timelines:
description: 时间节点,只接收结构:[{"start":0,"end":4612}],一般从audio_timeline节点的输出获取
items:
description: 时间线
properties:
end:
description: 结束时间
type: integer
start:
description: 开始时间
type: integer
required:
- start
- end
type: object
type: array
required:
- effects
- timelines
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
type: string
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 根据时间线关联特效
/filter_infos:
post:
operationId: filter_infos
requestBody:
content:
application/json:
schema:
properties:
filters:
description: 滤镜名称列表,示例:[ "清透感" ]
items:
description: 滤镜名称,在剪映中查看
type: string
type: array
intensities:
description: 强度列表
items:
description: 强度,取值[0, 100]
type: integer
type: array
timelines:
description: 时间线列表
items:
description: 时间线
properties:
end:
description: 结束时间
type: integer
start:
description: 开始时间
type: integer
required:
- start
- end
type: object
type: array
required:
- filters
- timelines
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
type: string
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 为插件add_filters构造添加滤镜的参数。
/gen_video:
post:
operationId: gen_video
requestBody:
content:
application/json:
schema:
properties:
apiKey:
description: 从官网(www.jcaigc.cn)获取
type: string
draft_url:
description: 剪映草稿地址
type: string
required:
- draft_url
- apiKey
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
message:
type: string
type: object
description: new desc
default:
description: ""
summary: 将剪映草稿导出为视频。
/gen_video_status:
post:
operationId: gen_video_status
requestBody:
content:
application/json:
schema:
properties:
draft_url:
description: 剪映草稿地址
type: string
required:
- draft_url
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
completed_at:
type: string
created_at:
type: string
draft_url:
type: string
error_message:
type: string
message:
type: string
progress:
type: number
started_at:
type: string
status:
type: string
video_url:
type: string
type: object
description: new desc
default:
description: ""
summary: 查询视频导出状态和进度。
/get_audio_duration:
post:
operationId: get_audio_duration
requestBody:
content:
application/json:
schema:
properties:
mp3_url:
description: 音频/视频文件URL
type: string
required:
- mp3_url
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
duration:
type: integer
message:
type: string
type: object
description: new desc
default:
description: ""
summary: 获取音频/视频文件时长
/get_effects:
post:
operationId: get_effects
requestBody:
content:
application/json:
schema:
properties:
mode:
default: 0
description: 特效模式,0=所有,1=VIP,2=免费,默认值为 0
type: integer
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
effects:
items:
properties:
effect_id:
type: string
has_params:
type: boolean
icon_url:
type: string
is_vip:
type: boolean
name:
type: string
resource_id:
type: string
type: object
type: array
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 获取支持的特效列表。
/get_filters:
post:
operationId: get_filters
requestBody:
content:
application/json:
schema:
properties:
mode:
default: 0
description: 滤镜模式,0=所有,1=VIP,2=免费,默认值为 0
type: integer
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
filters:
items:
properties:
effect_id:
type: string
has_params:
type: boolean
is_vip:
type: boolean
name:
type: string
resource_id:
type: string
type: object
type: array
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 获取支持的滤镜列表
/get_image_animations:
post:
operationId: get_image_animations
requestBody:
content:
application/json:
schema:
properties:
mode:
default: 0
description: 默认0 全部 1 vip 2 免费
type: integer
type:
default: in
description: in:入场 ,out:出场,loop:组合
type: string
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
effects:
items:
properties:
category_id:
type: string
category_name:
type: string
duration:
type: number
icon_url:
type: string
id:
type: string
material_type:
type: string
name:
type: string
panel:
type: string
path:
type: string
platform:
type: string
request_id:
type: string
resource_id:
type: string
start:
type: number
type:
type: string
type: object
type: array
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 获取图片出入场动画
/get_text_animations:
post:
operationId: get_text_animations
requestBody:
content:
application/json:
schema:
properties:
mode:
default: 0
description: 0:所有,1:VIP, 2:免费
type: integer
type:
default: in
description: in:入场,out:出场,loop:循环
type: string
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
effects:
items:
properties:
category_id:
type: string
category_name:
type: string
duration:
type: number
icon_url:
type: string
id:
type: string
material_type:
type: string
name:
type: string
panel:
type: string
path:
type: string
platform:
type: string
request_id:
type: string
resource_id:
type: string
start:
type: number
type:
type: string
type: object
type: array
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 获取文字出入场动画
/get_url:
post:
operationId: get_url
requestBody:
content:
application/json:
schema:
properties:
output:
description: 提取内容
type: string
required:
- output
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
message:
type: string
x-global-disable: true
output:
type: string
type: object
description: new desc
default:
description: ""
summary: 提取链接,用于多值返回变成单值返回
/imgs_infos:
post:
operationId: imgs_infos
requestBody:
content:
application/json:
schema:
properties:
height:
default: 1024
description: 图片高
type: integer
imgs:
description: 图片列表
items:
description: 图片地址
type: string
type: array
in_animation:
description: 对应剪映的入场动画名字 可选,多个动画请用英文|分割,比如:动画1|动画2
type: string
in_animation_duration:
description: 对应剪映的入场动画时长 可选
type: integer
loop_animation:
description: 对应剪映的组合动画名字 可选,多个动画请用英文|分割,比如:动画1|动画2
type: string
loop_animation_duration:
description: ' 组合动画时长'
type: integer
out_animation:
description: 对应剪映的出场动画名字。可选,多个动画请用英文|分割,比如:动画1|动画2
type: string
out_animation_duration:
description: 对应剪映的出场动画时长 可选
type: integer
timelines:
description: 时间节点,只接收结构:[{"start":0,"end":4612}],一般从audio_timeline节点的输出获取
items:
description: 时间线
properties:
end:
description: 结束时间
type: integer
start:
description: 开始时间
type: integer
required:
- start
- end
type: object
type: array
transition:
description: 对应剪映的转场动画名字 可选
type: string
transition_duration:
description: 对应剪映的转场动画时长 ,范围是500000-2500000 可选
type: string
width:
default: 1024
description: 图片宽
type: integer
required:
- imgs
- timelines
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
type: string
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 根据时间线制作图片数据
/keyframes_infos:
post:
operationId: keyframes_infos
requestBody:
content:
application/json:
schema:
properties:
ctype:
description: '关键帧类型: KFTypePositionX: X轴移动,需要提供width参数,值会被除以width进行归一化 KFTypePositionY: Y轴移动,需要提供height参数,值会被除以height进行归一化 KFTypeRotation: 旋转角度,值范围必须在0-360度之间 UNIFORM_SCALE: 均匀缩放,值范围必须在0.01-5之间 KFTypeAlpha: 透明度,值范围必须在0-1之间'
type: string
height:
description: 视频高度
type: integer
offsets:
description: 需要放置关键帧的位置比例,eg:0|100 这个就是代表在开始和结尾放置,0|50|100代表在开头,中间,结尾放置3个关键帧
type: string
segment_infos:
description: 轨道数据,add_images节点输出
items:
description: 轨道数据
properties:
end:
description: 结束时间
type: integer
id:
description: 轨道id
type: string
start:
description: 开始时间
type: integer
required:
- id
- start
- end
type: object
type: array
values:
description: 对应offsets的值,长度要一致,比如1|2,或者1|2|1
type: string
width:
description: 视频宽度
type: integer
required:
- ctype
- offsets
- segment_infos
- values
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
keyframes_infos:
type: string
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 关键帧数据生成器
/objs_to_str_list:
post:
operationId: objs_to_str_list
requestBody:
content:
application/json:
schema:
properties:
outputs:
description: 数据对象,接收get_outputs节点的输出
items:
description: 内容
properties:
output:
description: 内容
type: string
required:
- output
type: object
type: array
required:
- outputs
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
items:
type: string
type: array
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 对象列表转化成字符串列表
/save_draft:
post:
operationId: save_draft
requestBody:
content:
application/json:
schema:
properties:
draft_url:
description: 剪映草稿地址,由创建草稿插件create_draft返回。
type: string
required:
- draft_url
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
draft_url:
type: string
message:
type: string
type: object
description: new desc
default:
description: ""
summary: 保存剪映草稿
/search_sticker:
post:
operationId: search_sticker
requestBody:
content:
application/json:
schema:
properties:
keyword:
description: 关键词
type: string
required:
- keyword
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
data:
items:
properties:
sticker:
properties:
large_image:
properties:
image_url:
type: string
type: object
preview_cover:
type: string
sticker_package:
properties:
height_per_frame:
type: number
size:
type: number
width_per_frame:
type: number
type: object
sticker_type:
type: number
track_thumbnail:
type: string
type: object
sticker_id:
type: string
title:
type: string
type: object
type: array
message:
type: string
type: object
description: new desc
default:
description: ""
summary: 查找贴纸
/str_list_to_objs:
post:
operationId: str_list_to_objs
requestBody:
content:
application/json:
schema:
properties:
infos:
description: 列表内容
items:
description: 内容
type: string
type: array
required:
- infos
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
items:
properties:
output:
type: string
type: object
type: array
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 字符串列表转化成对象列表
/str_to_list:
post:
operationId: str_to_list
requestBody:
content:
application/json:
schema:
properties:
obj:
description: 对象内容
type: string
required:
- obj
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
items:
type: string
type: array
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 字符转列表
/timelines:
post:
operationId: timelines
requestBody:
content:
application/json:
schema:
properties:
duration:
description: 总长度,单位微秒,eg:10000000
type: integer
num:
description: 时间线上的个数
type: integer
start:
default: 0
description: 默认开始0,如果设置了,就从start开始
type: integer
type:
default: 0
description: 方式,0平均分,1 随机,默认0
type: integer
required:
- duration
- num
type: object
responses:
"200":
content:
application/json:
schema:
properties:
all_timelines:
items:
properties:
end:
type: number
start:
type: number
type: object
type: array
code:
type: number
x-global-disable: true
message:
type: string
x-global-disable: true
timelines:
items:
properties:
end:
type: number
start:
type: number
type: object
type: array
type: object
description: new desc
default:
description: ""
summary: 自定义创建时间线列表
/video_infos:
post:
operationId: video_infos
requestBody:
content:
application/json:
schema:
properties:
height:
description: 视频高度
type: string
mask:
description: 视频蒙版,可填写值:圆形,矩形,爱心,星形
type: string
timelines:
description: 时间节点,只接收结构:[{"start":0,"end":4612}],一般从audio_timeline节点的输出获取
items:
description: 时间线
properties:
end:
description: 结束时间
type: integer
start:
description: 开始时间
type: integer
required:
- start
- end
type: object
type: array
transition:
description: 转场
type: string
transition_duration:
description: 转场的时长
type: integer
video_urls:
description: 视频列表
items:
description: 视频链接
type: string
type: array
volume:
description: 音量大小,0-10,默认1
type: number
width:
description: 视频宽度
type: integer
required:
- video_urls
- timelines
type: object
responses:
"200":
content:
application/json:
schema:
properties:
code:
type: number
x-global-disable: true
infos:
type: string
message:
type: string
x-global-disable: true
type: object
description: new desc
default:
description: ""
summary: 根据时间线制作视频数据
servers:
- url: https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1
================================================
FILE: pyproject.toml
================================================
[project]
name = "capcut-mate"
version = "1.0.0"
description = "CapCut Mate API Service"
authors = [
{ name = "Hommy", email = "taohongmin51@gmail.com" }
]
requires-python = ">=3.11"
dependencies = [
"email-validator>=2.2.0",
"fastapi>=0.100.0",
"pymediainfo>=7.0.1",
"requests>=2.32.5",
"uvicorn[standard]>=0.35.0",
"cos-python-sdk-v5>=1.9.38",
"oss2",
"imageio>=2.37.3",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
]
windows = [
"pywin32>=311; sys_platform == 'win32'",
"pyautogui>=0.9.54; sys_platform == 'win32'",
"uiautomation>=2.0.29; sys_platform == 'win32'",
]
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["."]
addopts = "-q"
================================================
FILE: src/__init__.py
================================================
# 空文件,标识src为Python包
================================================
FILE: src/middlewares/__init__.py
================================================
# 中间件实现
from .prepare import PrepareMiddleware
from .response import ResponseMiddleware
from .trace_context import TraceContextMiddleware
__all__ = ["PrepareMiddleware", "ResponseMiddleware", "TraceContextMiddleware"]
================================================
FILE: src/middlewares/prepare.py
================================================
# 环境初始化中间件
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
import config
import os
class PrepareMiddleware(BaseHTTPMiddleware):
"""请求前的准备工作中间件
功能:
1. 创建临时目录
2. 创建输出目录
"""
async def dispatch(self, request: Request, call_next):
# 递归创建目录,如果目录存在,就直接跳过创建
os.makedirs(config.DRAFT_DIR, exist_ok=True)
os.makedirs(config.TEMP_DIR, exist_ok=True)
# 继续处理请求
response = await call_next(request)
return response
================================================
FILE: src/middlewares/response.py
================================================
from fastapi import Request
from fastapi.responses import JSONResponse
from exceptions import CustomError, CustomException
from starlette.middleware.base import BaseHTTPMiddleware
from src.utils.logger import logger
import json
class ResponseMiddleware(BaseHTTPMiddleware):
"""统一响应处理中间件
功能:
1. 统一处理业务正常响应,添加code和message字段
2. 统一处理异常,返回标准错误格式
"""
async def dispatch(self, request: Request, call_next):
# 提前初始化 lang 变量,确保在异常处理中可用
lang = 'zh' # 默认语言
try:
lang = self._get_language_from_request(request)
response = await call_next(request)
# 处理非200状态码的响应
if response.status_code != 200:
return await self._handle_non_200_response(response, lang)
# 处理JSON响应
if self._is_json_response(response):
return await self._process_json_response(response, lang)
return response
except CustomException as e:
return self._handle_custom_exception(e, lang)
except Exception as e:
return self._handle_generic_exception(e, lang)
def _get_language_from_request(self, request: Request) -> str:
"""从请求头获取语言偏好"""
try:
# 安全地解析 Accept-Language 头
accept_lang = request.headers.get('Accept-Language', 'zh')
if not accept_lang or not accept_lang.strip():
return 'zh'
# 先按逗号分割,取第一部分
lang_parts = accept_lang.split(',')[0].strip()
if not lang_parts:
return 'zh'
# 再按连字符分割,取语言代码部分
lang_code_parts = lang_parts.split('-')
if not lang_code_parts or not lang_code_parts[0]:
return 'zh'
lang = lang_code_parts[0].lower()
return lang if lang in ['zh', 'en'] else 'zh'
except Exception:
# 如果解析过程中出现任何异常,返回默认语言
return 'zh'
def _handle_422_error(self, body_str: str, lang: str) -> JSONResponse:
"""特殊处理422参数验证错误"""
try:
# 尝试解析422错误的响应体
error_data = json.loads(body_str)
# 提取验证错误的详细信息
validation_messages = []
if "detail" in error_data:
for error in error_data["detail"]:
if "loc" in error and "msg" in error:
# 格式化错误信息
field = ".".join(str(part) for part in error["loc"] if part != "body")
message = f"{field}: {error['msg']}"
validation_messages.append(message)
# 构建统一的422错误响应(不包含data字段)
error_message = "; ".join(validation_messages) if validation_messages else ""
error_response = CustomError.PARAM_VALIDATION_FAILED.as_dict(detail=error_message, lang=lang)
return JSONResponse(status_code=200, content=error_response)
except json.JSONDecodeError:
logger.warning(f"Failed to parse 422 response body: {body_str}")
error_response = CustomError.PARAM_VALIDATION_FAILED.as_dict(detail=body_str, lang=lang)
return JSONResponse(status_code=200, content=error_response)
async def _handle_non_200_response(self, response, lang: str) -> JSONResponse:
"""处理非200状态码的响应"""
body = b""
async for chunk in response.body_iterator:
body += chunk
body_str = body.decode()
# 特殊处理422错误(参数验证错误)
if response.status_code == 422:
return self._handle_422_error(body_str, lang)
# 其它情况不应该发生,每一个错误都应该在前面被处理
logger.error(f"Non-200 response: {response.status_code} - {body_str}")
# 其他非200错误处理
error_response = {
"code": response.status_code,
"message": f"HTTP Error {response.status_code}, detail: {body_str}"
}
return JSONResponse(status_code=200, content=error_response)
def _is_json_response(self, response) -> bool:
"""检查是否为JSON响应"""
return response.headers.get('content-type') == 'application/json'
async def _process_json_response(self, response, lang: str):
"""处理JSON响应并统一格式"""
body = [section async for section in response.body_iterator]
if not body:
return response
body_str = b''.join(body).decode()
try:
data = json.loads(body_str)
# 如果响应已经有统一格式,直接返回
if 'code' in data and 'message' in data:
return response
# 创建统一格式的响应(成功响应保留data字段)
unified_response = {
'code': CustomError.SUCCESS.code,
'message': CustomError.SUCCESS.as_dict(lang=lang)['message'],
**data
}
return JSONResponse(
status_code=response.status_code,
content=unified_response
)
except json.JSONDecodeError:
logger.warning(f"JSON decode error: {body_str}")
return response
def _handle_custom_exception(self, e: CustomException, lang: str) -> JSONResponse:
"""处理自定义异常(不包含data字段)"""
logger.warning(f"Custom exception: {e.err.code} - {e.err.cn_message}" +
(f" ({e.detail})" if e.detail else ""))
# 获取错误信息
error_response = e.err.as_dict(detail=e.detail, lang=lang)
return JSONResponse(status_code=200, content=error_response)
def _handle_generic_exception(self, e: Exception, lang: str) -> JSONResponse:
"""处理通用异常(不包含data字段)"""
logger.warning(f"Internal server error: {str(e)}")
# 获取错误信息
error_response = CustomError.INTERNAL_SERVER_ERROR.as_dict(detail=str(e), lang=lang)
return JSONResponse(status_code=200, content=error_response)
================================================
FILE: src/middlewares/trace_context.py
================================================
"""为每个 HTTP 请求注入 W3C trace 上下文并写入 contextvars。"""
from __future__ import annotations
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.requests import Request
from starlette.responses import Response
from src.utils import trace_context as tc
class TraceContextMiddleware(BaseHTTPMiddleware):
"""
最先执行(应注册为最后 add_middleware):解析/生成 trace_id、span_id,
在响应中返回 traceparent 与 X-Request-ID。
"""
async def dispatch(self, request: Request, call_next) -> Response:
def _get(h: str) -> str | None:
return request.headers.get(h)
trace_id, span_id = tc.resolve_trace_from_headers(_get)
tid_token = tc.trace_id_var.set(trace_id)
sid_token = tc.span_id_var.set(span_id)
request.state.trace_id = trace_id
request.state.span_id = span_id
try:
response = await call_next(request)
finally:
tc.trace_id_var.reset(tid_token)
tc.span_id_var.reset(sid_token)
response.headers["traceparent"] = tc.build_traceparent(trace_id, span_id)
response.headers["X-Request-ID"] = trace_id
return response
================================================
FILE: src/pyJianYingDraft/__init__.py
================================================
import warnings
import sys
from .local_materials import CropSettings, VideoMaterial, AudioMaterial
from .keyframe import KeyframeProperty
from .time_util import Timerange
from .audio_segment import AudioSegment
from .video_segment import VideoSegment, StickerSegment, ClipSettings
from .effect_segment import EffectSegment, FilterSegment
from .text_segment import TextSegment, TextStyle, TextBorder, TextBackground, TextShadow
from .metadata import FontType
from .metadata import MaskType
from .metadata import TransitionType, FilterType
from .metadata import IntroType, OutroType, GroupAnimationType
from .metadata import TextIntro, TextOutro, TextLoopAnim
from .metadata import AudioSceneEffectType
from .metadata import VideoSceneEffectType, VideoCharacterEffectType
from .track import TrackType
from .template_mode import ShrinkMode, ExtendMode
from .script_file import ScriptFile
from .draft_folder import DraftFolder
# 仅在Windows系统下导入jianying_controller
ISWIN = (sys.platform == 'win32')
if ISWIN:
try:
from .jianying_controller import JianyingController, ExportResolution, ExportFramerate
except ImportError:
# 如果缺少Windows依赖,设置为False
ISWIN = False
JianyingController = None
ExportResolution = None
ExportFramerate = None
from .time_util import SEC, tim, trange
def _deprecated_class_warning(old_name: str, new_name: str):
warnings.warn(
f"{old_name} is deprecated and will be removed in a future version. "
f"Use {new_name} instead.",
DeprecationWarning,
stacklevel=3
)
# 保持向后兼容
class Script_file:
"""Deprecated: Use ScriptFile instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Script_file", "ScriptFile")
return ScriptFile(*args, **kwargs)
class Draft_folder:
"""Deprecated: Use DraftFolder instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Draft_folder", "DraftFolder")
return DraftFolder(*args, **kwargs)
class Shrink_mode:
"""Deprecated: Use ShrinkMode instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Shrink_mode", "ShrinkMode")
return ShrinkMode(*args, **kwargs)
class Extend_mode:
"""Deprecated: Use ExtendMode instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Extend_mode", "ExtendMode")
return ExtendMode(*args, **kwargs)
class Clip_settings:
"""Deprecated: Use ClipSettings instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Clip_settings", "ClipSettings")
return ClipSettings(*args, **kwargs)
class Text_style:
"""Deprecated: Use TextStyle instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Text_style", "TextStyle")
return TextStyle(*args, **kwargs)
class Text_border:
"""Deprecated: Use TextBorder instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Text_border", "TextBorder")
return TextBorder(*args, **kwargs)
class Text_background:
"""Deprecated: Use TextBackground instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Text_background", "TextBackground")
return TextBackground(*args, **kwargs)
class Text_segment:
"""Deprecated: Use TextSegment instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Text_segment", "TextSegment")
return TextSegment(*args, **kwargs)
class Audio_segment:
"""Deprecated: Use AudioSegment instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Audio_segment", "AudioSegment")
return AudioSegment(*args, **kwargs)
class Video_segment:
"""Deprecated: Use VideoSegment instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Video_segment", "VideoSegment")
return VideoSegment(*args, **kwargs)
class Sticker_segment:
"""Deprecated: Use StickerSegment instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Sticker_segment", "StickerSegment")
return StickerSegment(*args, **kwargs)
class Effect_segment:
"""Deprecated: Use EffectSegment instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Effect_segment", "EffectSegment")
return EffectSegment(*args, **kwargs)
class Filter_segment:
"""Deprecated: Use FilterSegment instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Filter_segment", "FilterSegment")
return FilterSegment(*args, **kwargs)
class Video_material:
"""Deprecated: Use VideoMaterial instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Video_material", "VideoMaterial")
return VideoMaterial(*args, **kwargs)
class Audio_material:
"""Deprecated: Use AudioMaterial instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Audio_material", "AudioMaterial")
return AudioMaterial(*args, **kwargs)
class Crop_settings:
"""Deprecated: Use CropSettings instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Crop_settings", "CropSettings")
return CropSettings(*args, **kwargs)
# 枚举类的向后兼容 - 使用代理类
class _DeprecatedEnum:
"""带deprecation警告的枚举代理类"""
def __init__(self, original_enum, old_name, new_name):
self._enum = original_enum
self._old_name = old_name
self._new_name = new_name
def __getattr__(self, name):
# 当访问枚举成员时显示警告
_deprecated_class_warning(self._old_name, self._new_name)
return getattr(self._enum, name)
def __getitem__(self, name):
# 当通过索引访问时显示警告
_deprecated_class_warning(self._old_name, self._new_name)
return self._enum[name]
def __repr__(self):
return f""
Track_type = _DeprecatedEnum(TrackType, "Track_type", "TrackType")
Font_type = _DeprecatedEnum(FontType, "Font_type", "FontType")
Mask_type = _DeprecatedEnum(MaskType, "Mask_type", "MaskType")
Filter_type = _DeprecatedEnum(FilterType, "Filter_type", "FilterType")
Transition_type = _DeprecatedEnum(TransitionType, "Transition_type", "TransitionType")
Intro_type = _DeprecatedEnum(IntroType, "Intro_type", "IntroType")
Outro_type = _DeprecatedEnum(OutroType, "Outro_type", "OutroType")
Group_animation_type = _DeprecatedEnum(GroupAnimationType, "Group_animation_type", "GroupAnimationType")
Text_intro = _DeprecatedEnum(TextIntro, "Text_intro", "TextIntro")
Text_outro = _DeprecatedEnum(TextOutro, "Text_outro", "TextOutro")
Text_loop_anim = _DeprecatedEnum(TextLoopAnim, "Text_loop_anim", "TextLoopAnim")
Audio_scene_effect_type = _DeprecatedEnum(AudioSceneEffectType, "Audio_scene_effect_type", "AudioSceneEffectType")
Video_scene_effect_type = _DeprecatedEnum(VideoSceneEffectType, "Video_scene_effect_type", "VideoSceneEffectType")
Video_character_effect_type = _DeprecatedEnum(VideoCharacterEffectType, "Video_character_effect_type", "VideoCharacterEffectType")
Keyframe_property = _DeprecatedEnum(KeyframeProperty, "Keyframe_property", "KeyframeProperty")
# 仅在Windows系统下定义jianying_controller相关的向后兼容类
if ISWIN:
class Jianying_controller:
"""Deprecated: Use JianyingController instead."""
def __new__(cls, *args, **kwargs):
_deprecated_class_warning("Jianying_controller", "JianyingController")
return JianyingController(*args, **kwargs)
Export_resolution = _DeprecatedEnum(ExportResolution, "Export_resolution", "ExportResolution")
Export_framerate = _DeprecatedEnum(ExportFramerate, "Export_framerate", "ExportFramerate")
# 基础__all__列表(所有平台通用)
__all__ = [
"FontType",
"MaskType",
"FilterType",
"TransitionType",
"IntroType",
"OutroType",
"GroupAnimationType",
"TextIntro",
"TextOutro",
"TextLoopAnim",
"AudioSceneEffectType",
"VideoSceneEffectType",
"VideoCharacterEffectType",
"CropSettings",
"VideoMaterial",
"AudioMaterial",
"KeyframeProperty",
"Timerange",
"AudioSegment",
"VideoSegment",
"StickerSegment",
"ClipSettings",
"EffectSegment",
"FilterSegment",
"TextSegment",
"TextStyle",
"TextBorder",
"TextBackground",
"TextShadow",
"TrackType",
"ShrinkMode",
"ExtendMode",
"ScriptFile",
"DraftFolder",
"SEC",
"tim",
"trange",
# 向后兼容的snake_case类
"Script_file",
"Draft_folder",
"Shrink_mode",
"Extend_mode",
"Track_type",
"Font_type",
"Mask_type",
"Filter_type",
"Transition_type",
"Intro_type",
"Outro_type",
"Group_animation_type",
"Text_intro",
"Text_outro",
"Text_loop_anim",
"Audio_scene_effect_type",
"Video_scene_effect_type",
"Video_character_effect_type",
"Clip_settings",
"Text_style",
"Text_border",
"Text_background",
"Text_segment",
"Audio_segment",
"Video_segment",
"Sticker_segment",
"Effect_segment",
"Filter_segment",
"Video_material",
"Audio_material",
"Crop_settings",
"Keyframe_property",
]
# 仅在Windows系统下添加jianying_controller相关的导出
if ISWIN:
__all__.extend([
"JianyingController",
"ExportResolution",
"ExportFramerate",
"Jianying_controller",
"Export_resolution",
"Export_framerate",
])
================================================
FILE: src/pyJianYingDraft/animation.py
================================================
"""定义视频/文本动画相关类"""
import uuid
from typing import Union, Optional
from typing import Literal, Dict, List, Any
from .time_util import Timerange
from .metadata import AnimationMeta
from .metadata import IntroType, OutroType, GroupAnimationType
from .metadata import TextIntro, TextOutro, TextLoopAnim
class Animation:
"""一个视频/文本动画效果"""
name: str
"""动画名称, 默认取为动画效果的名称"""
effect_id: str
"""另一种动画id, 由剪映本身提供"""
animation_type: str
"""动画类型, 在子类中定义"""
resource_id: str
"""资源id, 由剪映本身提供"""
start: int
"""动画相对此片段开头的偏移, 单位为微秒"""
duration: int
"""动画持续时间, 单位为微秒"""
is_video_animation: bool
"""是否为视频动画, 在子类中定义"""
def __init__(self, animation_meta: AnimationMeta, start: int, duration: int):
self.name = animation_meta.title
self.effect_id = animation_meta.effect_id
self.resource_id = animation_meta.resource_id
self.start = start
self.duration = duration
def export_json(self) -> Dict[str, Any]:
return {
"anim_adjust_params": None,
"platform": "all",
"panel": "video" if self.is_video_animation else "",
"material_type": "video" if self.is_video_animation else "sticker",
"name": self.name,
"id": self.effect_id,
"type": self.animation_type,
"resource_id": self.resource_id,
"start": self.start,
"duration": self.duration,
# 不导出path和request_id
}
class VideoAnimation(Animation):
"""一个视频动画效果"""
animation_type: Literal["in", "out", "group"]
def __init__(self, animation_type: Union[IntroType, OutroType, GroupAnimationType],
start: int, duration: int):
super().__init__(animation_type.value, start, duration)
if isinstance(animation_type, IntroType):
self.animation_type = "in"
elif isinstance(animation_type, OutroType):
self.animation_type = "out"
elif isinstance(animation_type, GroupAnimationType):
self.animation_type = "group"
self.is_video_animation = True
class Text_animation(Animation):
"""一个文本动画效果"""
animation_type: Literal["in", "out", "loop"]
def __init__(self, animation_type: Union[TextIntro, TextOutro, TextLoopAnim],
start: int, duration: int):
super().__init__(animation_type.value, start, duration)
if isinstance(animation_type, TextIntro):
self.animation_type = "in"
elif isinstance(animation_type, TextOutro):
self.animation_type = "out"
elif isinstance(animation_type, TextLoopAnim):
self.animation_type = "loop"
self.is_video_animation = False
class SegmentAnimations:
"""附加于某素材上的一系列动画
对视频片段:入场、出场或组合动画;对文本片段:入场、出场或循环动画"""
animation_id: str
"""系列动画的全局id, 自动生成"""
animations: List[Animation]
"""动画列表"""
def __init__(self):
self.animation_id = uuid.uuid4().hex
self.animations = []
def get_animation_trange(self, animation_type: Literal["in", "out", "group", "loop"]) -> Optional[Timerange]:
"""获取指定类型的动画的时间范围"""
for animation in self.animations:
if animation.animation_type == animation_type:
return Timerange(animation.start, animation.duration)
return None
def add_animation(self, animation: Union[VideoAnimation, Text_animation]) -> None:
# 不允许添加超过一个同类型的动画(如两个入场动画)
if animation.animation_type in [ani.animation_type for ani in self.animations]:
raise ValueError(f"当前片段已存在类型为 '{animation.animation_type}' 的动画")
if isinstance(animation, VideoAnimation):
# 不允许组合动画与出入场动画同时出现
if any(ani.animation_type == "group" for ani in self.animations):
raise ValueError("当前片段已存在组合动画, 此时不能添加其它动画")
if animation.animation_type == "group" and len(self.animations) > 0:
raise ValueError("当前片段已存在动画时, 不能添加组合动画")
elif isinstance(animation, Text_animation):
if any(ani.animation_type == "loop" for ani in self.animations):
raise ValueError("当前片段已存在循环动画, 若希望同时使用循环动画和入出场动画, 请先添加出入场动画再添加循环动画")
self.animations.append(animation)
def export_json(self) -> Dict[str, Any]:
return {
"id": self.animation_id,
"type": "sticker_animation",
"multi_language_current": "none",
"animations": [animation.export_json() for animation in self.animations]
}
================================================
FILE: src/pyJianYingDraft/assets/__init__.py
================================================
"""
pyJianYingDraft 的资源管理模块,提供集中管理资源文件的方式,避免硬编码路径
"""
from pathlib import Path
# 获取当前模块所在目录
ASSETS_DIR = Path(__file__).parent
# 资源文件映射表 - 集中管理所有asset文件名
ASSET_FILES = {
# 模板文件
'DRAFT_CONTENT_TEMPLATE': 'draft_content_template.json',
'DRAFT_META_TEMPLATE': 'draft_meta_info.json',
}
def get_asset_path(asset_name: str) -> Path:
"""
获取指定资源文件的完整路径
Args:
asset_name: 资源名称(ASSET_FILES中的key)
Returns:
Path: 资源文件的完整路径
Raises:
KeyError: 资源名称不存在
FileNotFoundError: 文件不存在
"""
if asset_name not in ASSET_FILES:
raise KeyError(f"Asset '{asset_name}' not found. Available assets: {list(ASSET_FILES.keys())}")
file_path = ASSETS_DIR / ASSET_FILES[asset_name]
if not file_path.exists():
raise FileNotFoundError(f"Asset file '{file_path}' does not exist")
return file_path
# 导出主要接口
__all__ = [
'get_asset_path',
'ASSET_FILES'
]
================================================
FILE: src/pyJianYingDraft/assets/draft_content_template.json
================================================
{
"canvas_config": {
"height": 1080,
"ratio": "original",
"width": 1920
},
"color_space": 0,
"config": {
"adjust_max_index": 1,
"attachment_info": [],
"combination_max_index": 1,
"export_range": null,
"extract_audio_last_index": 1,
"lyrics_recognition_id": "",
"lyrics_sync": true,
"lyrics_taskinfo": [],
"maintrack_adsorb": true,
"material_save_mode": 0,
"multi_language_current": "none",
"multi_language_list": [],
"multi_language_main": "none",
"multi_language_mode": "none",
"original_sound_last_index": 1,
"record_audio_last_index": 1,
"sticker_max_index": 1,
"subtitle_keywords_config": null,
"subtitle_recognition_id": "",
"subtitle_sync": true,
"subtitle_taskinfo": [],
"system_font_list": [],
"video_mute": false,
"zoom_info_params": null
},
"cover": null,
"create_time": 0,
"duration": 0,
"extra_info": null,
"fps": 30.0,
"free_render_index_mode_on": false,
"group_container": null,
"id": "91E08AC5-22FB-47e2-9AA0-7DC300FAEA2B",
"keyframe_graph_list": [],
"keyframes": {
"adjusts": [],
"audios": [],
"effects": [],
"filters": [],
"handwrites": [],
"stickers": [],
"texts": [],
"videos": []
},
"last_modified_platform": {
"app_id": 3704,
"app_source": "lv",
"app_version": "5.9.0",
"os": "windows"
},
"platform": {
"app_id": 3704,
"app_source": "lv",
"app_version": "5.9.0",
"os": "windows"
},
"materials": {
"ai_translates": [],
"audio_balances": [],
"audio_effects": [],
"audio_fades": [],
"audio_track_indexes": [],
"audios": [],
"beats": [],
"canvases": [],
"chromas": [],
"color_curves": [],
"digital_humans": [],
"drafts": [],
"effects": [],
"flowers": [],
"green_screens": [],
"handwrites": [],
"hsl": [],
"images": [],
"log_color_wheels": [],
"loudnesses": [],
"manual_deformations": [],
"masks": [],
"material_animations": [],
"material_colors": [],
"multi_language_refs": [],
"placeholders": [],
"plugin_effects": [],
"primary_color_wheels": [],
"realtime_denoises": [],
"shapes": [],
"smart_crops": [],
"smart_relights": [],
"sound_channel_mappings": [],
"speeds": [],
"stickers": [],
"tail_leaders": [],
"text_templates": [],
"texts": [],
"time_marks": [],
"transitions": [],
"video_effects": [],
"video_trackings": [],
"videos": [],
"vocal_beautifys": [],
"vocal_separations": []
},
"mutable_config": null,
"name": "",
"new_version": "110.0.0",
"relationships": [],
"render_index_track_mode_on": false,
"retouch_cover": null,
"source": "default",
"static_cover_image_path": "",
"time_marks": null,
"tracks": [
],
"update_time": 0,
"version": 360000
}
================================================
FILE: src/pyJianYingDraft/assets/draft_meta_info.json
================================================
{
"cloud_package_completed_time": "",
"draft_cloud_capcut_purchase_info": "",
"draft_cloud_last_action_download": false,
"draft_cloud_materials": [],
"draft_cloud_purchase_info": "",
"draft_cloud_template_id": "",
"draft_cloud_tutorial_info": "",
"draft_cloud_videocut_purchase_info": "",
"draft_cover": "",
"draft_deeplink_url": "",
"draft_enterprise_info": {
"draft_enterprise_extra": "",
"draft_enterprise_id": "",
"draft_enterprise_name": "",
"enterprise_material": []
},
"draft_fold_path": "",
"draft_id": "BC69C7CD-7C5E-4185-B284-AF3E1047A664",
"draft_is_ai_packaging_used": false,
"draft_is_ai_shorts": false,
"draft_is_ai_translate": false,
"draft_is_article_video_draft": false,
"draft_is_from_deeplink": "false",
"draft_is_invisible": false,
"draft_materials": [
{
"type": 0,
"value": []
},
{
"type": 1,
"value": []
},
{
"type": 2,
"value": []
},
{
"type": 3,
"value": []
},
{
"type": 6,
"value": []
},
{
"type": 7,
"value": []
},
{
"type": 8,
"value": []
}
],
"draft_materials_copied_info": [],
"draft_name": "",
"draft_new_version": "",
"draft_removable_storage_device": "",
"draft_root_path": "",
"draft_segment_extra_info": [],
"draft_type": "",
"tm_draft_cloud_completed": "",
"tm_draft_cloud_modified": 0,
"tm_draft_removed": 0,
"tm_duration": 0
}
================================================
FILE: src/pyJianYingDraft/audio_segment.py
================================================
"""定义音频片段及其相关类
包含淡入淡出效果、音频特效等相关类
"""
import uuid
from copy import deepcopy
from typing import Optional, Literal, Union
from typing import Dict, List, Any
from .time_util import tim, Timerange
from .segment import MediaSegment
from .local_materials import AudioMaterial
from .keyframe import KeyframeProperty, KeyframeList
from .metadata import EffectParamInstance
from .metadata import AudioSceneEffectType, ToneEffectType, SpeechToSongType
class AudioFade:
"""音频淡入淡出效果"""
fade_id: str
"""淡入淡出效果的全局id, 自动生成"""
in_duration: int
"""淡入时长, 单位为微秒"""
out_duration: int
"""淡出时长, 单位为微秒"""
def __init__(self, in_duration: int, out_duration: int):
"""根据给定的淡入/淡出时长构造一个淡入淡出效果"""
self.fade_id = uuid.uuid4().hex
self.in_duration = in_duration
self.out_duration = out_duration
def export_json(self) -> Dict[str, Any]:
return {
"id": self.fade_id,
"fade_in_duration": self.in_duration,
"fade_out_duration": self.out_duration,
"fade_type": 0,
"type": "audio_fade"
}
class AudioEffect:
"""音频特效对象"""
name: str
"""特效名称"""
effect_id: str
"""特效全局id, 由程序自动生成"""
resource_id: str
"""资源id, 由剪映本身提供"""
category_id: Literal["sound_effect", "tone", "speech_to_song"]
category_name: Literal["场景音", "音色", "声音成曲"]
category_index: Literal[1, 2, 3]
audio_adjust_params: List[EffectParamInstance]
def __init__(self, effect_meta: Union[AudioSceneEffectType, ToneEffectType, SpeechToSongType],
params: Optional[List[Optional[float]]] = None):
"""根据给定的音效元数据及参数列表构造一个音频特效对象, params的范围是0~100"""
self.name = effect_meta.value.name
self.effect_id = uuid.uuid4().hex
self.resource_id = effect_meta.value.resource_id
self.audio_adjust_params = []
if isinstance(effect_meta, AudioSceneEffectType):
self.category_id = "sound_effect"
self.category_name = "场景音"
self.category_index = 1
elif isinstance(effect_meta, ToneEffectType):
self.category_id = "tone"
self.category_name = "音色"
self.category_index = 2
elif isinstance(effect_meta, SpeechToSongType):
self.category_id = "speech_to_song"
self.category_name = "声音成曲"
self.category_index = 3
else:
raise TypeError("不支持的元数据类型 %s" % type(effect_meta))
self.audio_adjust_params = effect_meta.value.parse_params(params)
def export_json(self) -> Dict[str, Any]:
return {
"audio_adjust_params": [param.export_json() for param in self.audio_adjust_params],
"category_id": self.category_id,
"category_name": self.category_name,
"id": self.effect_id,
"is_ugc": False,
"name": self.name,
"production_path": "",
"resource_id": self.resource_id,
"speaker_id": "",
"sub_type": self.category_index,
"time_range": {"duration": 0, "start": 0}, # 似乎并未用到
"type": "audio_effect"
# 不导出path和constant_material_id
}
class AudioSegment(MediaSegment):
"""安放在轨道上的一个音频片段"""
material_instance: AudioMaterial
"""音频素材实例"""
fade: Optional[AudioFade]
"""音频淡入淡出效果, 可能为空
在放入轨道时自动添加到素材列表中
"""
effects: List[AudioEffect]
"""音频特效列表
在放入轨道时自动添加到素材列表中
"""
def __init__(self, material: Union[AudioMaterial, str], target_timerange: Timerange, *,
source_timerange: Optional[Timerange] = None, speed: Optional[float] = None, volume: float = 1.0,
change_pitch: bool = False):
"""利用给定的音频素材构建一个轨道片段, 并指定其时间信息及播放速度/音量
Args:
material (`AudioMaterial` or `str`): 素材实例或素材路径, 若为路径则自动构造素材实例
target_timerange (`Timerange`): 片段在轨道上的目标时间范围
source_timerange (`Timerange`, optional): 截取的素材片段的时间范围, 默认从开头根据`speed`截取与`target_timerange`等长的一部分
speed (`float`, optional): 播放速度, 默认为1.0. 此项与`source_timerange`同时指定时, 将覆盖`target_timerange`中的时长
volume (`float`, optional): 音量, 默认为1.0
change_pitch (`bool`, optional): 是否跟随变速改变音调, 默认为否
Raises:
`ValueError`: 指定的或计算出的`source_timerange`超出了素材的时长范围
"""
if isinstance(material, str):
material = AudioMaterial(material)
if source_timerange is not None and speed is not None:
target_timerange = Timerange(target_timerange.start, round(source_timerange.duration / speed))
elif source_timerange is not None and speed is None:
speed = source_timerange.duration / target_timerange.duration
else: # source_timerange is None
speed = speed if speed is not None else 1.0
source_timerange = Timerange(0, round(target_timerange.duration * speed))
if source_timerange.end > material.duration:
raise ValueError(f"截取的素材时间范围 {source_timerange} 超出了素材时长({material.duration})")
super().__init__(material.material_id, source_timerange, target_timerange, speed, volume, change_pitch)
self.material_instance = deepcopy(material)
self.fade = None
self.effects = []
def add_effect(self, effect_type: Union[AudioSceneEffectType, ToneEffectType, SpeechToSongType],
params: Optional[List[Optional[float]]] = None) -> "AudioSegment":
"""为音频片段添加一个作用于整个片段的音频效果, 目前"声音成曲"效果不能自动被剪映所识别
Args:
effect_type (`AudioSceneEffectType` | `ToneEffectType` | `SpeechToSongType`): 音效类型, 一类音效只能添加一个.
params (`List[Optional[float]]`, optional): 音效参数列表, 参数列表中未提供或为None的项使用默认值.
参数取值范围(0~100)与剪映中一致. 某个特效类型有何参数以及具体参数顺序以枚举类成员的annotation为准.
Raises:
`ValueError`: 试图添加一个已经存在的音效类型、提供的参数数量超过了该音效类型的参数数量, 或参数值超出范围.
"""
if params is not None and len(params) > len(effect_type.value.params):
raise ValueError("为音频效果 %s 传入了过多的参数" % effect_type.value.name)
effect_inst = AudioEffect(effect_type, params)
if effect_inst.category_id in [eff.category_id for eff in self.effects]:
raise ValueError("当前音频片段已经有此类型 (%s) 的音效了" % effect_inst.category_name)
self.effects.append(effect_inst)
self.extra_material_refs.append(effect_inst.effect_id)
return self
def add_fade(self, in_duration: Union[str, int], out_duration: Union[str, int]) -> "AudioSegment":
"""为音频片段添加淡入淡出效果
Args:
in_duration (`int` or `str`): 音频淡入时长, 单位为微秒, 若为字符串则会调用`tim()`函数进行解析
out_duration (`int` or `str`): 音频淡出时长, 单位为微秒, 若为字符串则会调用`tim()`函数进行解析
Raises:
`ValueError`: 当前片段已存在淡入淡出效果
"""
if self.fade is not None:
raise ValueError("当前片段已存在淡入淡出效果")
if isinstance(in_duration, str): in_duration = tim(in_duration)
if isinstance(out_duration, str): out_duration = tim(out_duration)
self.fade = AudioFade(in_duration, out_duration)
self.extra_material_refs.append(self.fade.fade_id)
return self
def add_keyframe(self, time_offset: int, volume: float) -> "AudioSegment":
"""为音频片段创建一个*控制音量*的关键帧, 并自动加入到关键帧列表中
Args:
time_offset (`int`): 关键帧的时间偏移量, 单位为微秒
volume (`float`): 音量在`time_offset`处的值
"""
_property = KeyframeProperty.volume
for kf_list in self.common_keyframes:
if kf_list.keyframe_property == _property:
kf_list.add_keyframe(time_offset, volume)
return self
kf_list = KeyframeList(_property)
kf_list.add_keyframe(time_offset, volume)
self.common_keyframes.append(kf_list)
return self
def export_json(self) -> Dict[str, Any]:
json_dict = super().export_json()
json_dict.update({
"clip": None,
"hdr_settings": None
})
return json_dict
================================================
FILE: src/pyJianYingDraft/draft_folder.py
================================================
"""草稿文件夹管理器"""
import os
import shutil
from typing import List
from . import assets
from .script_file import ScriptFile
class DraftFolder:
"""管理一个文件夹及其内的一系列草稿"""
folder_path: str
"""根路径"""
def __init__(self, folder_path: str):
"""初始化草稿文件夹管理器
Args:
folder_path (`str`): 包含若干草稿的文件夹, 一般取剪映保存草稿的位置即可
Raises:
`FileNotFoundError`: 路径不存在
"""
self.folder_path = folder_path
if not os.path.exists(self.folder_path):
raise FileNotFoundError(f"根文件夹 {self.folder_path} 不存在")
def list_drafts(self) -> List[str]:
"""列出文件夹中所有草稿的名称
注意: 本函数只是如实地列出子文件夹的名称, 并不检查它们是否符合草稿的格式
"""
return [f for f in os.listdir(self.folder_path) if os.path.isdir(os.path.join(self.folder_path, f))]
def has_draft(self, draft_name: str) -> bool:
"""检查文件夹中是否存在指定名称的草稿
注意: 本函数只检查文件夹是否存在, 并不检查草稿是否符合剪映的格式
Args:
draft_name (`str`): 草稿名称, 即相应文件夹名称
"""
return draft_name in self.list_drafts()
def remove(self, draft_name: str) -> None:
"""删除指定名称的草稿
Args:
draft_name (`str`): 草稿名称, 即相应文件夹名称
Raises:
`FileNotFoundError`: 对应的草稿不存在
"""
draft_path = os.path.join(self.folder_path, draft_name)
if not os.path.exists(draft_path):
raise FileNotFoundError(f"草稿文件夹 {draft_name} 不存在")
shutil.rmtree(draft_path)
def create_draft(self, draft_name: str, width: int, height: int, fps: int = 30, *,
maintrack_adsorb: bool = True,
allow_replace: bool = False) -> ScriptFile:
"""创建一个新草稿并开始编辑, 编辑完成后使用`ScriptFile.save()`保存即可
Args:
draft_name (`str`): 草稿名称, 即相应文件夹名称
width (`int`): 视频宽度, 单位为像素
height (`int`): 视频高度, 单位为像素
fps (`int`, optional): 视频帧率. 默认为30.
maintrack_adsorb (`bool`, optional): 是否启用主轨道吸附(主轨磁吸). 默认启用.
allow_replace (`bool`, optional): 是否允许覆盖与`draft_name`重名的草稿. 默认为否.
Raises:
`FileExistsError`: 已存在与`draft_name`重名的草稿, 但不允许覆盖.
"""
draft_path = os.path.join(self.folder_path, draft_name)
if os.path.exists(draft_path):
if not allow_replace:
raise FileExistsError(f"草稿文件夹 {draft_name} 已存在且不允许覆盖")
shutil.rmtree(draft_path)
# 创建草稿文件夹
os.makedirs(draft_path)
shutil.copy(assets.get_asset_path("DRAFT_META_TEMPLATE"), os.path.join(draft_path, "draft_meta_info.json"))
# 创建草稿文件
script_file = ScriptFile(width, height, fps, maintrack_adsorb)
# 设置保存路径为 draft_content.json
draft_content_path = os.path.join(draft_path, "draft_content.json")
script_file.save_path = draft_content_path
# 启用双文件兼容模式
script_file.dual_file_compatibility = True
# 保存到 draft_content.json(会自动同步到 draft_info.json)
script_file.save()
return script_file
def inspect_material(self, draft_name: str) -> None:
"""输出指定名称草稿中的贴纸素材元数据
Args:
draft_name (`str`): 草稿名称, 即相应文件夹名称
Raises:
`FileNotFoundError`: 对应的草稿不存在
"""
draft_path = os.path.join(self.folder_path, draft_name)
if not os.path.exists(draft_path):
raise FileNotFoundError(f"草稿文件夹 {draft_name} 不存在")
script_file = self.load_template(draft_name)
script_file.inspect_material()
def load_template(self, draft_name: str) -> ScriptFile:
"""在文件夹中打开一个草稿作为模板, 并在其上进行编辑
Args:
draft_name (`str`): 草稿名称, 即相应文件夹名称
Returns:
`ScriptFile`: 以模板模式打开的草稿对象
Raises:
`FileNotFoundError`: 对应的草稿不存在
"""
draft_path = os.path.join(self.folder_path, draft_name)
if not os.path.exists(draft_path):
raise FileNotFoundError(f"草稿文件夹 {draft_name} 不存在")
script_file = ScriptFile.load_template(os.path.join(draft_path, "draft_content.json"))
# 启用双文件兼容模式,以便在保存时同时更新两个文件
script_file.dual_file_compatibility = True
return script_file
def duplicate_as_template(self, template_name: str, new_draft_name: str, allow_replace: bool = False) -> ScriptFile:
"""复制一份给定的草稿, 并在复制出的新草稿上进行编辑
Args:
template_name (`str`): 原草稿名称
new_draft_name (`str`): 新草稿名称
allow_replace (`bool`, optional): 是否允许覆盖与`new_draft_name`重名的草稿. 默认为否.
Returns:
`ScriptFile`: 以模板模式打开的**复制后的**草稿对象
Raises:
`FileNotFoundError`: 原始草稿不存在
`FileExistsError`: 已存在与`new_draft_name`重名的草稿, 但不允许覆盖.
"""
template_path = os.path.join(self.folder_path, template_name)
new_draft_path = os.path.join(self.folder_path, new_draft_name)
if not os.path.exists(template_path):
raise FileNotFoundError(f"模板草稿 {template_name} 不存在")
if os.path.exists(new_draft_path) and not allow_replace:
raise FileExistsError(f"新草稿 {new_draft_name} 已存在且不允许覆盖")
# 复制草稿文件夹
shutil.copytree(template_path, new_draft_path, dirs_exist_ok=allow_replace)
# 打开草稿
return self.load_template(new_draft_name)
================================================
FILE: src/pyJianYingDraft/effect_segment.py
================================================
"""定义特效/滤镜片段类"""
from typing import Union, Optional, List
from .time_util import Timerange
from .segment import BaseSegment
from .video_segment import VideoEffect, Filter
from .metadata import VideoSceneEffectType, VideoCharacterEffectType, FilterType
class EffectSegment(BaseSegment):
"""放置在独立特效轨道上的特效片段"""
effect_inst: VideoEffect
"""相应的特效素材
在放入轨道时自动添加到素材列表中
"""
def __init__(self, effect_type: Union[VideoSceneEffectType, VideoCharacterEffectType],
target_timerange: Timerange, params: Optional[List[Optional[float]]] = None):
self.effect_inst = VideoEffect(effect_type, params, apply_target_type=2) # 作用域为全局
super().__init__(self.effect_inst.global_id, target_timerange)
class FilterSegment(BaseSegment):
"""放置在独立滤镜轨道上的滤镜片段"""
material: Filter
"""相应的滤镜素材
在放入轨道时自动添加到素材列表中
"""
def __init__(self, meta: FilterType, target_timerange: Timerange, intensity: float):
self.material = Filter(meta.value, intensity)
super().__init__(self.material.global_id, target_timerange)
================================================
FILE: src/pyJianYingDraft/exceptions.py
================================================
"""自定义异常类"""
class TrackNotFound(NameError):
"""未找到满足条件的轨道"""
class AmbiguousTrack(ValueError):
"""找到多个满足条件的轨道"""
class SegmentOverlap(ValueError):
"""新片段与已有的轨道片段重叠"""
class MaterialNotFound(NameError):
"""未找到满足条件的素材"""
class AmbiguousMaterial(ValueError):
"""找到多个满足条件的素材"""
class ExtensionFailed(ValueError):
"""替换素材时延伸片段失败"""
class DraftNotFound(NameError):
"""未找到草稿"""
class AutomationError(Exception):
"""自动化操作失败"""
class ExportTimeout(Exception):
"""导出超时"""
================================================
FILE: src/pyJianYingDraft/jianying_controller.py
================================================
"""剪映自动化控制,主要与自动导出有关"""
import time
import shutil
import sys
# 平台检查和依赖导入
if sys.platform != "win32":
raise ImportError("JianyingController is only available on Windows platform")
try:
import uiautomation as uia
except ImportError as e:
raise ImportError(f"Missing required Windows dependencies: {e}. Please install with: pip install capcut-mate[windows]")
try:
import pyautogui # pyright: ignore[reportMissingModuleSource]
except ImportError as e:
raise ImportError(f"Missing required Windows dependencies: {e}. Please install with: pip install pyautogui[windows]")
from enum import Enum
from typing import Optional, Literal, Callable
from . import exceptions
from .exceptions import AutomationError
# 添加logger导入
from src.utils.logger import logger
class ExportResolution(Enum):
"""导出分辨率"""
RES_8K = "8K"
RES_4K = "4K"
RES_2K = "2K"
RES_1080P = "1080P"
RES_720P = "720P"
RES_480P = "480P"
class ExportFramerate(Enum):
"""导出帧率"""
FR_24 = "24fps"
FR_25 = "25fps"
FR_30 = "30fps"
FR_50 = "50fps"
FR_60 = "60fps"
class ControlFinder:
"""控件查找器,封装部分与控件查找相关的逻辑"""
@staticmethod
def desc_matcher(target_desc: str, depth: int = 2, exact: bool = False) -> Callable[[uia.Control, int], bool]:
"""根据full_description查找控件的匹配器"""
target_desc = target_desc.lower()
def matcher(control: uia.Control, _depth: int) -> bool:
if _depth != depth:
return False
full_desc: str = control.GetPropertyValue(30159).lower()
return (target_desc == full_desc) if exact else (target_desc in full_desc)
return matcher
@staticmethod
def class_name_matcher(class_name: str, depth: int = 1, exact: bool = False) -> Callable[[uia.Control, int], bool]:
"""根据ClassName查找控件的匹配器"""
class_name = class_name.lower()
def matcher(control: uia.Control, _depth: int) -> bool:
if _depth != depth:
return False
curr_class_name: str = control.ClassName.lower()
return (class_name == curr_class_name) if exact else (class_name in curr_class_name)
return matcher
class JianyingController:
"""剪映控制器"""
# 窗口查找重试:剪映启动较慢、RDP 刚连上、或 UI 树尚未就绪时,瞬时 Exists(0) 易失败
WINDOW_FIND_MAX_RETRIES = 12
WINDOW_FIND_RETRY_INTERVAL = 1.0
app: uia.WindowControl
"""剪映窗口"""
app_status: Literal["home", "edit", "pre_export"]
"""当app_status为pre_export时,app_sub_status表示导出过程中的子状态"""
app_sub_status: Literal["none", "export_start", "exporting", "export_succeed"]
def __init__(self):
"""初始化剪映控制器, 此时剪映应该处于目录页"""
self.get_window()
def find_and_click_draft(self, draft_name: str, max_retries: int = 5, retry_interval: float = 5.0) -> None:
"""查找并点击指定名称的草稿
Args:
draft_name (str): 要查找的草稿名称
max_retries (int): 最大重试次数,默认5次
retry_interval (float): 重试间隔时间(秒),默认5秒
Raises:
DraftNotFound: 未找到指定名称的剪映草稿
"""
last_exception = None
for attempt in range(max_retries):
try:
# 点击对应草稿
draft_name_text = self.app.TextControl(
searchDepth=2,
Compare=ControlFinder.desc_matcher(f"HomePageDraftTitle:{draft_name}", exact=True)
)
if not draft_name_text.Exists(0):
raise exceptions.DraftNotFound(f"未找到名为{draft_name}的剪映草稿")
draft_btn = draft_name_text.GetParentControl()
assert draft_btn is not None
draft_btn.Click(simulateMove=False)
time.sleep(10)
self.get_window()
return # 成功则返回
except exceptions.DraftNotFound as e:
last_exception = e
if attempt < max_retries - 1:
logger.info(
"Draft not found (name=%s), retry %d/%d",
draft_name,
attempt + 1,
max_retries,
)
time.sleep(retry_interval)
# 所有重试都失败,抛出异常
raise last_exception
def click_export_button(self) -> None:
"""点击编辑页面的导出按钮
Raises:
AutomationError: 未找到导出按钮
"""
export_btn = self.app.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("MainWindowTitleBarExportBtn"))
if not export_btn.Exists(0):
raise AutomationError("未在编辑窗口中找到导出按钮")
export_btn.Click(simulateMove=False)
time.sleep(10)
self.get_window()
def get_original_export_path(self) -> str:
"""获取原始导出路径
Returns:
str: 原始导出路径
Raises:
AutomationError: 未找到导出路径框
"""
# 获取原始导出路径(带后缀名)
export_path_sib = self.app.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("ExportPath"))
if not export_path_sib.Exists(0):
raise AutomationError("未找到导出路径框")
export_path_text = export_path_sib.GetSiblingControl(lambda ctrl: True)
assert export_path_text is not None
export_path = export_path_text.GetPropertyValue(30159)
return export_path
def set_export_resolution(self, resolution: Optional[ExportResolution]) -> None:
"""设置导出分辨率
Args:
resolution (Optional[ExportResolution]): 导出分辨率,如果为None则不设置
Raises:
AutomationError: 未找到相关控件
"""
if resolution is not None:
setting_group = self.app.GroupControl(searchDepth=1,
Compare=ControlFinder.class_name_matcher("PanelSettingsGroup_QMLTYPE"))
if not setting_group.Exists(0):
raise AutomationError("未找到导出设置组")
resolution_btn = setting_group.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("ExportSharpnessInput"))
if not resolution_btn.Exists(0.5):
raise AutomationError("未找到导出分辨率下拉框")
resolution_btn.Click(simulateMove=False)
time.sleep(0.5)
resolution_item = self.app.TextControl(
searchDepth=2, Compare=ControlFinder.desc_matcher(resolution.value)
)
if not resolution_item.Exists(0.5):
raise AutomationError(f"未找到{resolution.value}分辨率选项")
resolution_item.Click(simulateMove=False)
time.sleep(0.5)
def set_export_framerate(self, framerate: Optional[ExportFramerate]) -> None:
"""设置导出帧率
Args:
framerate (Optional[ExportFramerate]): 导出帧率,如果为None则不设置
Raises:
AutomationError: 未找到相关控件
"""
if framerate is not None:
setting_group = self.app.GroupControl(searchDepth=1,
Compare=ControlFinder.class_name_matcher("PanelSettingsGroup_QMLTYPE"))
if not setting_group.Exists(0):
raise AutomationError("未找到导出设置组")
framerate_btn = setting_group.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("FrameRateInput"))
if not framerate_btn.Exists(0.5):
raise AutomationError("未找到导出帧率下拉框")
framerate_btn.Click(simulateMove=False)
time.sleep(0.5)
framerate_item = self.app.TextControl(
searchDepth=2, Compare=ControlFinder.desc_matcher(framerate.value)
)
if not framerate_item.Exists(0.5):
raise AutomationError(f"未找到{framerate.value}帧率选项")
framerate_item.Click(simulateMove=False)
time.sleep(0.5)
def click_final_export_button(self) -> None:
"""点击导出窗口的最终导出按钮
Raises:
AutomationError: 未找到导出按钮
"""
export_btn = self.app.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("ExportOkBtn", exact=True))
if not export_btn.Exists(0):
raise AutomationError("未在导出窗口中找到导出按钮")
export_btn.Click(simulateMove=False)
time.sleep(5)
def __ensure_window_focus(self) -> None:
"""在点击前确保窗口有焦点"""
# 1. 确保窗口激活
self.app.SetActive()
time.sleep(1)
# 2. 确保窗口置顶
self.app.SetTopmost()
time.sleep(1)
# 3. 强制获取焦点
try:
self.app.SetFocus()
except:
pass # 某些情况下可能失败,但继续执行
time.sleep(1)
def wait_for_export_completion(self, timeout: float) -> None:
"""等待导出完成
Args:
timeout (float): 超时时间(秒)
Raises:
AutomationError: 导出超时
"""
# 点击继续导出按钮次数
continue_export_click_count = 0
# 等待导出完成
st = time.time()
while True:
self.get_window()
if self.app_status != "pre_export": break
succeed_close_btn = self.app.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("ExportSucceedCloseBtn"))
if succeed_close_btn.Exists(0):
break
if time.time() - st > timeout:
raise AutomationError("导出超时, 时限为%d秒" % timeout)
# 导出过程中,如果出现异常弹窗,则点击继续导出按钮
if continue_export_click_count < 20:
print("pyautogui.size(): ", pyautogui.size(), ", click index: ", continue_export_click_count)
pyautogui.click(x=996, y=597, button="left")
continue_export_click_count += 1
time.sleep(1)
time.sleep(2)
def return_to_home(self) -> None:
"""回到目录页并稍作延迟"""
self.get_window()
self.switch_to_home()
time.sleep(2)
def move_exported_file(self, original_path: str, output_path: Optional[str]) -> None:
"""移动导出的文件到指定位置
Args:
original_path (str): 原始导出路径
output_path (Optional[str]): 目标输出路径,如果为None则不移动
"""
logger.info(f"move {original_path} to {output_path}")
if output_path is not None:
shutil.move(original_path, output_path)
def export_draft(self, draft_name: str, output_path: Optional[str] = None, *,
resolution: Optional[ExportResolution] = None,
framerate: Optional[ExportFramerate] = None,
timeout: float = 1200) -> None:
"""导出指定的剪映草稿, **目前仅支持剪映6及以下版本**
**注意: 需要确认有导出草稿的权限(不使用VIP功能或已开通VIP), 否则可能陷入死循环**
Args:
draft_name (`str`): 要导出的剪映草稿名称
output_path (`str`, optional): 导出路径, 支持指向文件夹或直接指向文件, 不指定则使用剪映默认路径.
resolution (`Export_resolution`, optional): 导出分辨率, 默认不改变剪映导出窗口中的设置.
framerate (`Export_framerate`, optional): 导出帧率, 默认不改变剪映导出窗口中的设置.
timeout (`float`, optional): 导出超时时间(秒), 默认为20分钟.
Raises:
`DraftNotFound`: 未找到指定名称的剪映草稿
`AutomationError`: 剪映操作失败
"""
logger.info(f"start export {draft_name} to {output_path}")
# 初始化准备
self.get_window()
self.switch_to_home()
original_path = None
for i in range(16):
# 确保窗口有焦点
self.__ensure_window_focus()
if self.app_status == "home":
logger.info("[%d]app is already in home page", i)
self.find_and_click_draft(draft_name)
elif self.app_status == "edit":
logger.info("[%d]app is already in edit page", i)
# 点击导出按钮进入导出界面
self.click_export_button()
elif self.app_status == "pre_export":
if self.app_sub_status == "export_start":
logger.info("[%d]app is already in pre_export[export_start] page", i)
# 获取原始导出路径
original_path = self.get_original_export_path()
# 设置分辨率(如果指定)
self.set_export_resolution(resolution)
# 设置帧率(如果指定)
self.set_export_framerate(framerate)
# 点击最终导出按钮
self.click_final_export_button()
# 获取窗口状态
self.get_window()
elif self.app_sub_status == "exporting":
logger.info("[%d]app is already in pre_export[exporting] page", i)
self.wait_for_export_completion(timeout)
elif self.app_sub_status == "export_succeed":
logger.info("[%d]app is already in pre_export[export_succeed] page", i)
self.return_to_home()
break
else:
raise AutomationError("[%d]app is in unknown sub-status: %s" % (i, self.app_sub_status))
else:
raise AutomationError("[%d]app is in unknown status: %s" % (i, self.app_status))
# 移动导出文件到指定路径(如果指定)
self.move_exported_file(original_path, output_path)
logger.info(f"export {draft_name} to {output_path} completed")
def switch_to_home(self) -> None:
"""切换到剪映主页"""
for i in range(8):
if self.app_status == "home":
return
elif self.app_status == "pre_export":
if self.app_sub_status == "export_succeed":
succeed_close_btn = self.app.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("ExportSucceedCloseBtn"))
if succeed_close_btn.Exists(0):
succeed_close_btn.Click(simulateMove=False)
time.sleep(2)
self.get_window()
elif self.app_status == "edit":
close_btn = self.app.GroupControl(searchDepth=1, ClassName="TitleBarButton", foundIndex=3)
close_btn.Click(simulateMove=False)
time.sleep(2)
self.get_window()
else:
raise AutomationError("invalid app status: %s" % self.app_status)
logger.info("Cannot switch to home page after 32 attempts")
def get_window(
self,
max_retries: Optional[int] = None,
retry_interval: Optional[float] = None,
) -> None:
"""寻找剪映窗口并置顶;未找到时按间隔重试以提高容错。"""
if max_retries is None:
max_retries = self.WINDOW_FIND_MAX_RETRIES
if retry_interval is None:
retry_interval = self.WINDOW_FIND_RETRY_INTERVAL
if hasattr(self, "app") and self.app.Exists(0):
self.app.SetTopmost(False)
for attempt in range(max_retries):
self.app = uia.WindowControl(searchDepth=1, Compare=self.__jianying_window_cmp)
if self.app.Exists(0):
if attempt > 0:
logger.info(
"Jianying main window matched on attempt %d/%d",
attempt + 1,
max_retries,
)
break
if attempt < max_retries - 1:
logger.warning(
"Jianying main window not found, retrying in %.1fs (%d/%d)",
retry_interval,
attempt + 1,
max_retries,
)
time.sleep(retry_interval)
else:
raise AutomationError(
"Jianying window not found after %d attempts (%.1fs interval); "
"ensure Jianying Pro is open on the home or edit screen."
% (max_retries, retry_interval)
)
# 寻找可能存在的导出窗口
export_window = self.app.WindowControl(searchDepth=1, Name="导出")
if export_window.Exists(0):
self.app = export_window
self.app_status = "pre_export"
# 初始化导出子状态
self.init_export_sub_status()
logger.info("app_status: %s, app_sub_status: %s", self.app_status, self.app_sub_status)
self.app.SetActive()
self.app.SetTopmost()
# 初始化导出子状态
def init_export_sub_status(self) -> None:
if self.app_status == "pre_export":
# 0. 初始化默认值为导出中
self.app_sub_status = "exporting"
# 1. 检查窗口是否停留在导出开始页面
export_ok_btn = self.app.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("ExportOkBtn", exact=True))
if export_ok_btn.Exists(0):
self.app_sub_status = "export_start"
return
# 2. 检查窗口是否停留在导出完成页面
succeed_close_btn = self.app.TextControl(searchDepth=2, Compare=ControlFinder.desc_matcher("ExportSucceedCloseBtn"))
if succeed_close_btn.Exists(0):
self.app_sub_status = "export_succeed"
return
else:
self.app_sub_status = "none"
def __jianying_window_cmp(self, control: uia.WindowControl, depth: int) -> bool:
if control.Name != "剪映专业版":
return False
if "HomePage".lower() in control.ClassName.lower():
self.app_status = "home"
return True
if "MainWindow".lower() in control.ClassName.lower():
self.app_status = "edit"
return True
logger.info(f"ClassName: {control.ClassName.lower()}, Name: {control.Name.lower()}")
return False
================================================
FILE: src/pyJianYingDraft/keyframe.py
================================================
import uuid
from enum import Enum
from typing import Dict, List, Any
class Keyframe:
"""一个关键帧(关键点), 目前只支持线性插值"""
kf_id: str
"""关键帧全局id, 自动生成"""
time_offset: int
"""相对于素材起始点的时间偏移量"""
values: List[float]
"""关键帧的值, 似乎一般只有一个元素"""
def __init__(self, time_offset: int, value: float):
"""给定时间偏移量及关键值, 初始化关键帧"""
self.kf_id = uuid.uuid4().hex
self.time_offset = time_offset
self.values = [value]
def export_json(self) -> Dict[str, Any]:
return {
# 默认值
"curveType": "Line",
"graphID": "",
"left_control": {"x": 0.0, "y": 0.0},
"right_control": {"x": 0.0, "y": 0.0},
# 自定义属性
"id": self.kf_id,
"time_offset": self.time_offset,
"values": self.values
}
class KeyframeProperty(Enum):
"""关键帧所控制的属性类型"""
position_x = "KFTypePositionX"
"""右移为正, 此处的数值应该为`剪映中显示的值` / `草稿宽度`, 也即单位是半个画布宽"""
position_y = "KFTypePositionY"
"""上移为正, 此处的数值应该为`剪映中显示的值` / `草稿高度`, 也即单位是半个画布高"""
rotation = "KFTypeRotation"
"""顺时针旋转的**角度**"""
scale_x = "KFTypeScaleX"
"""单独控制X轴缩放比例(1.0为不缩放), 与`uniform_scale`互斥"""
scale_y = "KFTypeScaleY"
"""单独控制Y轴缩放比例(1.0为不缩放), 与`uniform_scale`互斥"""
uniform_scale = "UNIFORM_SCALE"
"""同时控制X轴及Y轴缩放比例(1.0为不缩放), 与`scale_x`和`scale_y`互斥"""
alpha = "KFTypeAlpha"
"""不透明度, 1.0为完全不透明, 仅对`VideoSegment`有效"""
saturation = "KFTypeSaturation"
"""饱和度, 0.0为原始饱和度, 范围为-1.0到1.0, 仅对`VideoSegment`有效"""
contrast = "KFTypeContrast"
"""对比度, 0.0为原始对比度, 范围为-1.0到1.0, 仅对`VideoSegment`有效"""
brightness = "KFTypeBrightness"
"""亮度, 0.0为原始亮度, 范围为-1.0到1.0, 仅对`VideoSegment`有效"""
volume = "KFTypeVolume"
"""音量, 1.0为原始音量, 仅对`AudioSegment`和`VideoSegment`有效"""
class KeyframeList:
"""关键帧列表, 记录与某个特定属性相关的一系列关键帧"""
list_id: str
"""关键帧列表全局id, 自动生成"""
keyframe_property: KeyframeProperty
"""关键帧对应的属性"""
keyframes: List[Keyframe]
"""关键帧列表"""
def __init__(self, keyframe_property: KeyframeProperty):
"""为给定的关键帧属性初始化关键帧列表"""
self.list_id = uuid.uuid4().hex
self.keyframe_property = keyframe_property
self.keyframes = []
def add_keyframe(self, time_offset: int, value: float):
"""给定时间偏移量及关键值, 向此关键帧列表中添加一个关键帧"""
keyframe = Keyframe(time_offset, value)
self.keyframes.append(keyframe)
self.keyframes.sort(key=lambda x: x.time_offset)
def export_json(self) -> Dict[str, Any]:
return {
"id": self.list_id,
"keyframe_list": [kf.export_json() for kf in self.keyframes],
"material_id": "",
"property_type": self.keyframe_property.value
}
================================================
FILE: src/pyJianYingDraft/local_materials.py
================================================
import os
import uuid
import pymediainfo
from typing import Optional, Literal
from typing import Dict, Any
class CropSettings:
"""素材的裁剪设置, 各属性均在0-1之间, 注意素材的坐标原点在左上角"""
upper_left_x: float
upper_left_y: float
upper_right_x: float
upper_right_y: float
lower_left_x: float
lower_left_y: float
lower_right_x: float
lower_right_y: float
def __init__(self, *, upper_left_x: float = 0.0, upper_left_y: float = 0.0,
upper_right_x: float = 1.0, upper_right_y: float = 0.0,
lower_left_x: float = 0.0, lower_left_y: float = 1.0,
lower_right_x: float = 1.0, lower_right_y: float = 1.0):
"""初始化裁剪设置, 默认参数表示不裁剪"""
self.upper_left_x = upper_left_x
self.upper_left_y = upper_left_y
self.upper_right_x = upper_right_x
self.upper_right_y = upper_right_y
self.lower_left_x = lower_left_x
self.lower_left_y = lower_left_y
self.lower_right_x = lower_right_x
self.lower_right_y = lower_right_y
def export_json(self) -> Dict[str, Any]:
return {
"upper_left_x": self.upper_left_x,
"upper_left_y": self.upper_left_y,
"upper_right_x": self.upper_right_x,
"upper_right_y": self.upper_right_y,
"lower_left_x": self.lower_left_x,
"lower_left_y": self.lower_left_y,
"lower_right_x": self.lower_right_x,
"lower_right_y": self.lower_right_y
}
class VideoMaterial:
"""本地视频素材(视频或图片), 一份素材可以在多个片段中使用"""
material_id: str
"""素材全局id, 自动生成"""
local_material_id: str
"""素材本地id, 意义暂不明确"""
material_name: str
"""素材名称"""
path: str
"""素材文件路径"""
duration: int
"""素材时长, 单位为微秒"""
height: int
"""素材高度"""
width: int
"""素材宽度"""
crop_settings: CropSettings
"""素材裁剪设置"""
material_type: Literal["video", "photo"]
"""素材类型: 视频或图片"""
def __init__(self, path: str, material_name: Optional[str] = None, crop_settings: CropSettings = CropSettings()):
"""从指定位置加载视频(或图片)素材
Args:
path (`str`): 素材文件路径, 支持mp4, mov, avi等常见视频文件及jpg, jpeg, png等图片文件.
material_name (`str`, optional): 素材名称, 如果不指定, 默认使用文件名作为素材名称.
crop_settings (`CropSettings`, optional): 素材裁剪设置, 默认不裁剪.
Raises:
`FileNotFoundError`: 素材文件不存在.
`ValueError`: 不支持的素材文件类型.
"""
path = os.path.abspath(path)
postfix = os.path.splitext(path)[1]
if not os.path.exists(path):
raise FileNotFoundError(f"找不到 {path}")
self.material_name = material_name if material_name else os.path.basename(path)
self.material_id = uuid.uuid4().hex
self.path = path
self.crop_settings = crop_settings
self.local_material_id = ""
if not pymediainfo.MediaInfo.can_parse():
raise ValueError(f"不支持的视频素材类型 '{postfix}'")
info: pymediainfo.MediaInfo = \
pymediainfo.MediaInfo.parse(path, mediainfo_options={"File_TestContinuousFileNames": "0"}) # type: ignore
# 有视频轨道的视为视频素材
if len(info.video_tracks):
self.material_type = "video"
self.duration = int(info.video_tracks[0].duration * 1e3) # type: ignore
self.width, self.height = info.video_tracks[0].width, info.video_tracks[0].height # type: ignore
# gif文件使用imageio库获取长度
elif postfix.lower() == ".gif":
import imageio
gif = imageio.get_reader(path)
self.material_type = "video"
self.duration = int(round(gif.get_meta_data()['duration'] * gif.get_length() * 1e3))
self.width, self.height = info.image_tracks[0].width, info.image_tracks[0].height # type: ignore
gif.close()
elif len(info.image_tracks):
self.material_type = "photo"
self.duration = 10800000000 # 相当于3h
self.width, self.height = info.image_tracks[0].width, info.image_tracks[0].height # type: ignore
else:
raise ValueError(f"输入的素材文件 {path} 没有视频轨道或图片轨道")
def export_json(self) -> Dict[str, Any]:
video_material_json = {
"audio_fade": None,
"category_id": "",
"category_name": "local",
"check_flag": 63487,
"crop": self.crop_settings.export_json(),
"crop_ratio": "free",
"crop_scale": 1.0,
"duration": self.duration,
"height": self.height,
"id": self.material_id,
"local_material_id": self.local_material_id,
"material_id": self.material_id,
"material_name": self.material_name,
"media_path": "",
"path": self.path,
"type": self.material_type,
"width": self.width
}
return video_material_json
class AudioMaterial:
"""本地音频素材"""
material_id: str
"""素材全局id, 自动生成"""
material_name: str
"""素材名称"""
path: str
"""素材文件路径"""
duration: int
"""素材时长, 单位为微秒"""
def __init__(self, path: str, material_name: Optional[str] = None):
"""从指定位置加载音频素材, 注意视频文件不应该作为音频素材使用
Args:
path (`str`): 素材文件路径, 支持mp3, wav等常见音频文件.
material_name (`str`, optional): 素材名称, 如果不指定, 默认使用文件名作为素材名称.
Raises:
`FileNotFoundError`: 素材文件不存在.
`ValueError`: 不支持的素材文件类型.
"""
path = os.path.abspath(path)
if not os.path.exists(path):
raise FileNotFoundError(f"找不到 {path}")
self.material_name = material_name if material_name else os.path.basename(path)
self.material_id = uuid.uuid4().hex
self.path = path
if not pymediainfo.MediaInfo.can_parse():
raise ValueError("不支持的音频素材类型 %s" % os.path.splitext(path)[1])
info: pymediainfo.MediaInfo = pymediainfo.MediaInfo.parse(path) # type: ignore
if len(info.video_tracks):
raise ValueError("音频素材不应包含视频轨道")
if not len(info.audio_tracks):
raise ValueError(f"给定的素材文件 {path} 没有音频轨道")
self.duration = int(info.audio_tracks[0].duration * 1e3) # type: ignore
def export_json(self) -> Dict[str, Any]:
return {
"app_id": 0,
"category_id": "",
"category_name": "local",
"check_flag": 3,
"copyright_limit_type": "none",
"duration": self.duration,
"effect_id": "",
"formula_id": "",
"id": self.material_id,
"local_material_id": self.material_id,
"music_id": self.material_id,
"name": self.material_name,
"path": self.path,
"source_platform": 0,
"type": "extract_music",
"wave_points": []
}
================================================
FILE: src/pyJianYingDraft/metadata/__init__.py
================================================
"""记录各种特效/音效/滤镜等的元数据
音频相关元数据更新时间:2024
其余元数据更新时间:2026-03
"""
from .effect_meta import EffectMeta, EffectParamInstance
from .effect_meta import AnimationMeta
# 视频特效
from .video_scene_effect import VideoSceneEffectType
from .video_character_effect import VideoCharacterEffectType
# 视频动画
from .video_intro import IntroType
from .video_outro import OutroType
from .video_group_animation import GroupAnimationType
# 音频特效
from .audio_scene_effect import AudioSceneEffectType
from .tone_effect import ToneEffectType
from .speech_to_song import SpeechToSongType
# 文本动画
from .text_intro import TextIntro
from .text_outro import TextOutro
from .text_loop import TextLoopAnim
# 其它
from .font_meta import FontType
from .mask_meta import MaskType, MaskMeta
from .filter_meta import FilterType
from .transition_meta import TransitionType
from .mix_mode_meta import MixModeType
__all__ = [
"AnimationMeta",
"EffectMeta",
"EffectParamInstance",
"MaskType",
"MaskMeta",
"FilterType",
"FontType",
"TransitionType",
"MixModeType",
"IntroType",
"OutroType",
"GroupAnimationType",
"TextIntro",
"TextOutro",
"TextLoopAnim",
"AudioSceneEffectType",
"ToneEffectType",
"SpeechToSongType",
"VideoSceneEffectType",
"VideoCharacterEffectType"
]
================================================
FILE: src/pyJianYingDraft/metadata/audio_scene_effect.py
================================================
"""音频场景特效元数据"""
from .effect_meta import EffectEnum
from .effect_meta import EffectMeta, EffectParam
class AudioSceneEffectType(EffectEnum):
"""音频"场景音"效果枚举"""
# 免费特效
_8bit = EffectMeta("8bit", False, "7161319747584266766", "5723961", "8d24238329ea5c250e33ae241d5adae2", [
EffectParam("change_voice_param_pitch_shift", 0.500, 0.000, 1.000),
EffectParam("change_voice_param_timbre", 1.000, 0.000, 1.000),
EffectParam("change_voice_param_strength", 1.000, 0.000, 1.000)])
"""参数:
change_voice_param_pitch_shift: 默认50%, 0% ~ 100%
change_voice_param_timbre: 默认100%, 0% ~ 100%
change_voice_param_strength: 默认100%, 0% ~ 100%"""
低保真 = EffectMeta("低保真", False, "7024390914537689614", "2672762", "7ddbd39a691a66a021f684cab756a89a", [
EffectParam("强弱", 1.000, 0.000, 1.000)])
"""参数:
强弱: 默认100%, 0% ~ 100%"""
合成器 = EffectMeta("合成器", False, "7018011500577034759", "2672753", "394efea5922637bcd8288e0fb3c2372e", [
EffectParam("强弱", 1.000, 0.000, 1.000)])
"""参数:
强弱: 默认100%, 0% ~ 100%"""
回音 = EffectMeta("回音", False, "7018011608408396325", "5723901", "5377f66109693f2d473df5ea6ec8f791", [
EffectParam("change_voice_param_quantity", 0.800, 0.000, 1.000),
EffectParam("change_voice_param_strength", 0.762, 0.000, 1.000)])
"""参数:
change_voice_param_quantity: 默认80%, 0% ~ 100%
change_voice_param_strength: 默认76%, 0% ~ 100%"""
扩音器 = EffectMeta("扩音器", False, "7018011975514853924", "2672749", "13169f6ab9957ff005d316239bef0045", [
EffectParam("强弱", 1.000, 0.000, 1.000)])
"""参数:
强弱: 默认100%, 0% ~ 100%"""
水下 = EffectMeta("水下", False, "7106404450444513806", "2673077", "53956694a8b68b2855faa2adc043b5b1", [
EffectParam("深度", 0.500, 0.000, 1.000)])
"""参数:
深度: 默认50%, 0% ~ 100%"""
没电了 = EffectMeta("没电了", False, "7018012193769656845", "2672747", "87f91614bac060840ad5a57ef2b0c9ca", [
EffectParam("强弱", 1.000, 0.000, 1.000)])
"""参数:
强弱: 默认100%, 0% ~ 100%"""
环绕音 = EffectMeta("环绕音", False, "7161319847819743780", "5723960", "fa9a4cb20d3488bf79e176571d5841f5", [
EffectParam("change_voice_param_center_position", 0.500, 0.000, 1.000),
EffectParam("change_voice_param_surrounding_frequency", 0.500, 0.000, 1.000)])
"""参数:
change_voice_param_center_position: 默认50%, 0% ~ 100%
change_voice_param_surrounding_frequency: 默认50%, 0% ~ 100%"""
电音 = EffectMeta("电音", False, "7018011438379700773", "2672754", "d893a319d5175d9f09f70ddef1f79980", [
EffectParam("强弱", 1.000, 0.000, 1.000)])
"""参数:
强弱: 默认100%, 0% ~ 100%"""
颤音 = EffectMeta("颤音", False, "7018011370289369637", "2672755", "c5e4874f83337e1cb9f8322fb843c901", [
EffectParam("频率", 0.714, 0.000, 1.000),
EffectParam("幅度", 0.905, 0.000, 1.000)])
"""参数:
频率: 默认71%, 0% ~ 100%
幅度: 默认90%, 0% ~ 100%"""
麦霸 = EffectMeta("麦霸", False, "7018012141332468260", "2672748", "3eedef5ef82b32912203a1f4fb901182", [
EffectParam("空间大小", 0.052, 0.000, 1.000),
EffectParam("强弱", 0.450, 0.000, 1.000)])
"""参数:
空间大小: 默认5%, 0% ~ 100%
强弱: 默认45%, 0% ~ 100%"""
黑胶 = EffectMeta("黑胶", False, "7024391411764040205", "2672761", "59e61d687a0f612bfae43bccf770f090", [
EffectParam("强弱", 1.000, 0.000, 1.000),
EffectParam("噪点", 0.743, 0.000, 1.000)])
"""参数:
强弱: 默认100%, 0% ~ 100%
噪点: 默认74%, 0% ~ 100%"""
# 付费特效
_360度环绕音 = EffectMeta("360度环绕音", True, "7410254975328064040", "81298963", "cc1709e1be9bb76d98cf54f28efda236", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
_3d环绕音 = EffectMeta("3d环绕音", True, "7350214888242811455", "53187169", "577c3d8e5312012b1d98ba5fc0b206d0", [
EffectParam("强度", 0.000, 0.000, 1.000)])
"""参数:
强度: 默认0%, 0% ~ 100%"""
Autotune = EffectMeta("Autotune", True, "7360900806851170828", "58979352", "1477f4ca8307e2fa4ee2243d98d8b837", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
Livehouse = EffectMeta("Livehouse", True, "7413661671941476904", "82364386", "d626c7854922c9fabb2a777e40f05aff", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
下雨 = EffectMeta("下雨", True, "7375069649446113804", "68076030", "0633c88a5d6344a5ac1c00aa05e43d5f", [
EffectParam("strength", 1.000, 0.000, 1.000),
EffectParam("noise", 0.743, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%
noise: 默认74%, 0% ~ 100%"""
乡村大喇叭 = EffectMeta("乡村大喇叭", True, "7282691036197950009", "23897651", "c996243ac50d235f00e5931e5ecadc52", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
人声增强 = EffectMeta("人声增强", True, "7106404399756349983", "2673078", "626f988dbd2cbd17acaa24d08451e314", [
EffectParam("强弱", 1.000, 0.000, 1.000)])
"""参数:
强弱: 默认100%, 0% ~ 100%"""
人声增强3 = EffectMeta("人声增强3", True, "7425556785693463090", "86419033", "9324a8dd6d5f67820bb50577a129a577", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
低保真扩音器 = EffectMeta("低保真扩音器", True, "7467815819540435506", "103845136", "6955de18e7c318f8b0a91c7b06377a69", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
低音增强 = EffectMeta("低音增强", True, "7106404304247853604", "2673080", "e7c09c96d10c163269fc4e35c1f4b1ee", [
EffectParam("change_voice_param_strength", 1.000, 0.000, 1.000)])
"""参数:
change_voice_param_strength: 默认100%, 0% ~ 100%"""
低音增强2 = EffectMeta("低音增强2", True, "7410254814539420195", "81298965", "b5b8e03035ed0e9bc1d23895366869ff", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
停车场 = EffectMeta("停车场", True, "7372150242524795446", "66413024", "d2dd515293081a8573485159db5a71e0", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
冥想 = EffectMeta("冥想", True, "7467815749931766322", "103845143", "1785bb1a52982661c7fc475f130d1b7b", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
冰川之下 = EffectMeta("冰川之下", True, "7375068986829967883", "68076029", "6b9cda93f6d75b9a3b19b2e8eb6ad40f", [
EffectParam("strength", 1.000, 0.000, 1.000),
EffectParam("noise", 0.743, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%
noise: 默认74%, 0% ~ 100%"""
刮风 = EffectMeta("刮风", True, "7375069247275274771", "68076028", "33e99402b2b056ce4f44f820ceac5cb5", [
EffectParam("strength", 1.000, 0.000, 1.000),
EffectParam("noise", 0.743, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%
noise: 默认74%, 0% ~ 100%"""
午夜电台 = EffectMeta("午夜电台", True, "7431088998652580378", "88155751", "94ce3c12b4f9e72469bccbba9d3c020e", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
噪音混响 = EffectMeta("噪音混响", True, "7382844688987853349", "72110975", "3b3b09b530b0a64666f1c5b6d20d4018", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
回声 = EffectMeta("回声", True, "7425556970339308083", "86419034", "edbfe18f8479b3da7e091b6d8bb2b592", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
回忆人声 = EffectMeta("回忆人声", True, "7400653027557773865", "78208789", "5a1681f3a09b861ef3e4a65b2f9b794d", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
地狱 = EffectMeta("地狱", True, "7375069113988682281", "68076027", "5ec03c41ada16530949daa4106c85a90", [
EffectParam("strength", 1.000, 0.000, 1.000),
EffectParam("noise", 0.743, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%
noise: 默认74%, 0% ~ 100%"""
复古收音机 = EffectMeta("复古收音机", True, "7350215379714576907", "53187166", "301d642d131aabff7ea8c3b717b36a79", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
复古收音机2 = EffectMeta("复古收音机2", True, "7431088943560397339", "88155750", "ef070459bb3eb2c02b0d65277369424c", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
复古电视 = EffectMeta("复古电视", True, "7431089082647712282", "88155749", "a2e9b297a1acdb997c3f71bb4273bf77", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
失真电子 = EffectMeta("失真电子", True, "7350215296801575443", "53187167", "a1c00df42076ed1bd6a81f2d30b94566", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
宽阔人声 = EffectMeta("宽阔人声", True, "7400653260320674343", "78208785", "8472328fd44653bd18d871357da26dd7", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
对讲机 = EffectMeta("对讲机", True, "7350214704284832275", "53187168", "016dbdb3c786896c92bb936ece11acf6", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
山洞 = EffectMeta("山洞", True, "7392070412865114659", "75411128", "4335ffa39cfdd4b7635fb6beb49dea80", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
广播 = EffectMeta("广播", True, "7418519152467382794", "84093261", "d3378900221ac03887cb608f1bae981c", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
延迟回声 = EffectMeta("延迟回声", True, "7425556912709571110", "86419029", "26201a59916f7616c4706788aceee188", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
恐怖音效 = EffectMeta("恐怖音效", True, "7431088801579012645", "88155748", "5e8778aa2e2e8270fba1b5e677b8e5fc", [
EffectParam("强度", 1.000, 0.000, 1.000),
EffectParam("背景音", 0.500, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%
背景音: 默认50%, 0% ~ 100%"""
房间 = EffectMeta("房间", True, "7282691385872880165", "23880629", "639f5c0c6b20418aaeb0e144da21151c", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
捂嘴 = EffectMeta("捂嘴", True, "7372405649684042292", "66552320", "9f9a8270c0005a480547d6ddf2a9293a", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
教堂 = EffectMeta("教堂", True, "7282691146759803429", "23882063", "96dc71756d0025e96a504b42d988b2ac", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
教室 = EffectMeta("教室", True, "7282687783833965113", "23897703", "678c14a6f63f75e03daa062a254081f7", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
时光扭曲 = EffectMeta("时光扭曲", True, "7410254477246075407", "81298964", "b4abdda11160d663308aeb0dab6063de", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
森林 = EffectMeta("森林", True, "7413270049080742415", "82210570", "147be719531ade36bd6959338a3caa29", [
EffectParam("强度", 1.000, 0.000, 1.000),
EffectParam("背景音", 0.500, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%
背景音: 默认50%, 0% ~ 100%"""
楼道 = EffectMeta("楼道", True, "7410254596020376064", "81298960", "c1806a2578d126dd74433640f5e09bab", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
楼道回声 = EffectMeta("楼道回声", True, "7425556847509115401", "86419032", "4e418df9c1cb821c20e10fcf304b7e93", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
氦气 = EffectMeta("氦气", True, "7400653188803596836", "78208787", "9c59009886c059e20d3914089afbc82f", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
沙漠 = EffectMeta("沙漠", True, "7375069515530375691", "68076025", "5bd2772879c6273189d3fc7f07581e71", [
EffectParam("strength", 1.000, 0.000, 1.000),
EffectParam("noise", 0.743, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%
noise: 默认74%, 0% ~ 100%"""
洞穴回声 = EffectMeta("洞穴回声", True, "7425557093597319689", "86419031", "bec3da95c2b4c70e8e1202972aeaf8e3", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
派对 = EffectMeta("派对", True, "7381685442795541042", "71718513", "723386ab87f938779a3369436234d903", [
EffectParam("strength", 1.000, 0.000, 1.000),
EffectParam("noise", 0.743, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%
noise: 默认74%, 0% ~ 100%"""
浴室 = EffectMeta("浴室", True, "7392070514686038543", "75411129", "543fa76977e80084f25067c94e4c08a8", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
深海回声 = EffectMeta("深海回声", True, "7350215168413929995", "53187172", "37a16a2dc77540b7d70fe301e482d4f2", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
深邃人声 = EffectMeta("深邃人声", True, "7400653111255110183", "78208786", "1d79f2c0660e1f4a2441255b9e34be6e", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
清澈人声 = EffectMeta("清澈人声", True, "7410254648440787456", "81298967", "b99fbb6dd42a759572f4ba13efb516ae", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
演唱会 = EffectMeta("演唱会", True, "7413661596611777076", "82364387", "8ceb67756bd822b7ee9728903c8e3efa", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
演讲舞台 = EffectMeta("演讲舞台", True, "7431088715092464155", "88155747", "6452fbaa8d66c01c491fc6d5816afc77", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
环绕回声 = EffectMeta("环绕回声", True, "7425557028694659635", "86419030", "0fe55903f86c3fdad33275b04c04cba0", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
电台播音 = EffectMeta("电台播音", True, "7418519267659747877", "84093262", "752c3df02caa20b12bfa3154ed025bff", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
电话 = EffectMeta("电话", True, "7264894634285863483", "20255003", "5da5a98b8c926c0dcc1c3c8bc3f3012f", [
EffectParam("强弱", 0.700, 0.000, 1.000)])
"""参数:
强弱: 默认70%, 0% ~ 100%"""
留声机 = EffectMeta("留声机", True, "7282687663872676408", "23897797", "e692fae669650c948451b5811a04e7e6", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
百老汇 = EffectMeta("百老汇", True, "7372150379150053907", "66413025", "73e3a35496b9766d0400165844be72f1", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
空灵感 = EffectMeta("空灵感", True, "7350215092975178252", "53187171", "aa1887a8b3375d20df6bf9438d62083a", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
空谷回声 = EffectMeta("空谷回声", True, "7350214991628210727", "53187170", "9913daa32167a17c1f41ad2f5596c411", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
立体声 = EffectMeta("立体声", True, "7418519209996456498", "84093260", "4381314f6906919781ea17c0d51f36a0", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
管道 = EffectMeta("管道", True, "7410254536234766863", "81298962", "37233b9d5efed3324a4c6a9d05831f40", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
老式电话 = EffectMeta("老式电话", True, "7282691476843139621", "23880011", "2eb835175e1e72e9d86b09bf513077cf", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
蚊子变声 = EffectMeta("蚊子变声", True, "7467815685876355622", "103845137", "b34cc53f1adf2f9decb0111a0082eb0a", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
言灵术 = EffectMeta("言灵术", True, "7382844601435951653", "72110974", "7184386e75226a36942c60a5d5bb5618", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
豪宅回声 = EffectMeta("豪宅回声", True, "7360900963294515775", "58979353", "7c20b5fba991f3188f14d7cdb0de1fa1", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
超市广播 = EffectMeta("超市广播", True, "7431088660709118514", "88155744", "14a9154302878be941c993ff6dfd0f3d", [
EffectParam("强度", 1.000, 0.000, 1.000),
EffectParam("背景音", 0.500, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%
背景音: 默认50%, 0% ~ 100%"""
超级混响 = EffectMeta("超级混响", True, "7400652941318689299", "78208790", "c1a87e3affc5c812609b4eded7609e81", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
超重低音 = EffectMeta("超重低音", True, "7410254867232461364", "81298961", "db9c654a48e01c71bfb097d70d21a42d", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
迷幻 = EffectMeta("迷幻", True, "7410254415921156643", "81298966", "1f549f0d21a5e7729268e6d443857364", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
迷幻电子 = EffectMeta("迷幻电子", True, "7375069381769826879", "68076026", "65ef01ba4626318fab4f007fec136e1e", [
EffectParam("strength", 1.000, 0.000, 1.000),
EffectParam("noise", 0.743, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%
noise: 默认74%, 0% ~ 100%"""
闷响 = EffectMeta("闷响", True, "7413269872307606016", "82210571", "8d966ef5950315b96dcd02bfc511d5e0", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
震撼全景音 = EffectMeta("震撼全景音", True, "7400653333456753163", "78208788", "1b65723d3e25e82a3ab99af289728498", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
音乐厅 = EffectMeta("音乐厅", True, "7404798608395997723", "79701150", "e819bbe1cd586bd9a2118ca39758ac22", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
颤抖电音 = EffectMeta("颤抖电音", True, "7467815889602089523", "103845138", "8fbf024a96e0c659e8b3d3ca975f1042", [
EffectParam("强度", 1.000, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%"""
马路边 = EffectMeta("马路边", True, "7413269976628335119", "82210569", "1c0c1e3be5ead093b685f451033de74e", [
EffectParam("强度", 1.000, 0.000, 1.000),
EffectParam("背景音", 0.500, 0.000, 1.000)])
"""参数:
强度: 默认100%, 0% ~ 100%
背景音: 默认50%, 0% ~ 100%"""
高解析人声 = EffectMeta("高解析人声", True, "7410254695169528355", "81298968", "3bcf82243ef574064bb53f99a2f59d5d", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
高音增强 = EffectMeta("高音增强", True, "7410254923037676047", "81298959", "59b5cc1fc51c2557d9d20e0d7494edc8", [
EffectParam("strength", 1.000, 0.000, 1.000)])
"""参数:
strength: 默认100%, 0% ~ 100%"""
================================================
FILE: src/pyJianYingDraft/metadata/effect_meta.py
================================================
"""元数据类型定义"""
from enum import Enum
from typing import List, Dict, Any
from typing import TypeVar, Optional
class EffectParam:
"""特效参数信息"""
name: str
"""参数名称"""
default_value: float
"""默认值"""
min_value: float
"""最小值"""
max_value: float
"""最大值"""
def __init__(self, name: str, default_value: float, min_value: float, max_value: float):
self.name = name
self.default_value = default_value
self.min_value = min_value
self.max_value = max_value
class EffectParamInstance(EffectParam):
"""特效参数实例"""
index: int
"""参数索引"""
value: float
"""当前值"""
def __init__(self, meta: EffectParam, index: int, value: float):
super().__init__(meta.name, meta.default_value, meta.min_value, meta.max_value)
self.index = index
self.value = value
def export_json(self) -> Dict[str, Any]:
return {
"default_value": self.default_value,
"max_value": self.max_value,
"min_value": self.min_value,
"name": self.name,
"parameterIndex": self.index,
"portIndex": 0,
"value": self.value
}
# 基础特效元数据, 直接用于滤镜/文字/视频特效
class EffectMeta:
"""特效元数据, 直接用于滤镜/文字/视频特效"""
name: str
"""效果名称"""
is_vip: bool
"""是否为VIP特权"""
resource_id: str
"""资源ID"""
effect_id: str
"""效果ID"""
md5: str
params: List[EffectParam]
"""效果的参数信息"""
def __init__(self, name: str, is_vip: bool, resource_id: str, effect_id: str, md5: str, params: List[EffectParam] = []):
self.name = name
self.is_vip = is_vip
self.resource_id = resource_id
self.effect_id = effect_id
self.md5 = md5
self.params = params
def parse_params(self, params: Optional[List[Optional[float]]]) -> List[EffectParamInstance]:
"""解析参数列表(范围0~100), 返回参数实例列表"""
ret: List[EffectParamInstance] = []
if params is None: params = []
for i, param in enumerate(self.params):
val = param.default_value
if i < len(params):
input_v = params[i]
if input_v is not None:
if input_v < 0 or input_v > 100:
raise ValueError("Invalid parameter value %f within %s" % (input_v, str(param)))
val = param.min_value + (param.max_value - param.min_value) * input_v / 100.0 # 从0~100映射到实际值
ret.append(EffectParamInstance(param, i, val))
return ret
EffectEnumSubclass = TypeVar("EffectEnumSubclass", bound="EffectEnum")
class EffectEnum(Enum):
"""特效枚举基类, 提供一个`from_name`方法用于根据名称获取特效元数据"""
@classmethod
def from_name(cls: "type[EffectEnumSubclass]", name: str) -> EffectEnumSubclass:
"""根据名称获取特效元数据, 忽略大小写、空格和下划线
Args:
name (str): 特效名称
Raises:
`ValueError`: 特效名称不存在
"""
name = name.lower().replace(" ", "").replace("_", "")
for effect in cls:
if effect.name.lower().replace(" ", "").replace("_", "") == name:
return effect
raise ValueError(f"Effect named '{name}' not found")
# 动画元数据
class AnimationMeta:
"""动画元数据, 用于视频/文字片段的入场/出场/组合动画"""
title: str
is_vip: bool
duration: int
"""效果默认时长, 单位为微秒"""
resource_id: str
effect_id: str
md5: str
def __init__(self, title: str, is_vip: bool, duration: float, resource_id: str, effect_id: str, md5: str):
self.title = title
self.is_vip = is_vip
self.duration = int(round(duration * 1e6))
self.resource_id = resource_id
self.effect_id = effect_id
self.md5 = md5
# 蒙版元数据
class MaskMeta:
"""蒙版元数据"""
name: str
"""转场名称"""
resource_type: str
"""资源类型, 与蒙版形状相关"""
resource_id: str
"""资源ID"""
effect_id: str
"""效果ID"""
md5: str
default_aspect_ratio: float
"""默认宽高比(宽高都是相对素材的比例)"""
def __init__(self, name: str, resource_type: str, resource_id: str, effect_id: str, md5: str, default_aspect_ratio: float):
self.name = name
self.resource_type = resource_type
self.resource_id = resource_id
self.effect_id = effect_id
self.md5 = md5
self.default_aspect_ratio = default_aspect_ratio
# 转场元数据
class TransitionMeta:
"""转场元数据"""
name: str
"""转场名称"""
is_vip: bool
"""是否为VIP特权"""
resource_id: str
"""资源ID"""
effect_id: str
"""效果ID"""
md5: str
default_duration: int
"""默认持续时间, 单位为微秒"""
is_overlap: bool
"""是否允许重叠(?)"""
def __init__(self, name: str, is_vip: bool, resource_id: str, effect_id: str, md5: str, default_duration: float, is_overlap: bool):
self.name = name
self.is_vip = is_vip
self.resource_id = resource_id
self.effect_id = effect_id
self.md5 = md5
self.default_duration = int(round(default_duration * 1e6))
self.is_overlap = is_overlap
================================================
FILE: src/pyJianYingDraft/metadata/filter_meta.py
================================================
"""滤镜效果元数据"""
from .effect_meta import EffectEnum
from .effect_meta import EffectMeta, EffectParam
class FilterType(EffectEnum):
"""滤镜效果类型"""
# 免费特效
_1980 = EffectMeta("1980", False, "7127828208690433311", "7127828208690433311", "d3595847ee8348c69c6037b8003a76e9", [])
ABG = EffectMeta("ABG", False, "7127679308897832206", "7127679308897832206", "d07b36b0b8e1893ce49df327ba926804", [])
Ditto = EffectMeta("Ditto", False, "7195816046077496635", "7195816046077496635", "09d18408ca0dee53716c3a4f41dd35e1", [])
KE1 = EffectMeta("KE1", False, "7127819154018536741", "7127819154018536741", "5ece7eff894e25a356b9111e78478c56", [])
KV5D = EffectMeta("KV5D", False, "7127578859217620254", "7127578859217620254", "57940599e2c8d85a7f73824c7360bfca", [])
Lofi_II = EffectMeta("Lofi II", False, "7232216810031025468", "7232216810031025468", "7d5f9e106b93bf758725da54daa1843f", [])
VHS_III = EffectMeta("VHS III", False, "7127669764905782542", "7127669764905782542", "c8d7adad4773fccc2128d8eafa569572", [])
三洋VPC = EffectMeta("三洋VPC", False, "7127669338089311495", "7127669338089311495", "73c77a4b9c5085af6175a523d24bc7c6", [])
书意 = EffectMeta("书意", False, "7368493100127292723", "7368493100127292723", "3e20d8ccc31ca6a495b3f8e2ff116744", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
亢奋 = EffectMeta("亢奋", False, "7166472327801097476", "7166472327801097476", "93c16f48d5d45cb663270a82a06f72b8", [])
亮夏 = EffectMeta("亮夏", False, "7505804389395877120", "7505804389395877120", "839755ea45f49179790ae2d9a00810b3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
亮肤 = EffectMeta("亮肤", False, "7127655008715230495", "7127655008715230495", "2aaa463c5deee34e73384d549edc7c15", [])
仲夏绿光 = EffectMeta("仲夏绿光", False, "7127675970252754189", "7127675970252754189", "970f4b2c797e2890787f7420d8c0613b", [])
似锦 = EffectMeta("似锦", False, "7188014191834418493", "7188014191834418493", "869cb94d6bbec5c6b771092ec1ef8cfe", [])
低保真 = EffectMeta("低保真", False, "7304170509661506843", "7304170509661506843", "db39172ffff69e973886c2e8598dbc75", [])
侘寂灰 = EffectMeta("侘寂灰", False, "7127609569416711455", "7127609569416711455", "17547e013b45f87dc7e4e1f7059d7e62", [])
元气新年 = EffectMeta("元气新年", False, "7457859598221987110", "7457859598221987110", "659b4fa52fb892852dbab15dfc4717e2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
克洛伊 = EffectMeta("克洛伊", False, "7366640728493002018", "7366640728493002018", "2740205bf2c6b79d64d84548a6ed5e21", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冬日烧烤 = EffectMeta("冬日烧烤", False, "7449704838763466035", "7449704838763466035", "bcd542f8af28c382cdacb39b588c4bbe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冬漫 = EffectMeta("冬漫", False, "7302324323270872346", "7302324323270872346", "a883a2e3b66f3e9c7bcaa1672e51ee9a", [])
冬离 = EffectMeta("冬离", False, "7300786822068571418", "7300786822068571418", "b5389102a96557d6c03047e814756936", [])
冰火 = EffectMeta("冰火", False, "7303812389177265447", "7303812389177265447", "61065880d8580b8b1a206de0b0773571", [])
冰肌 = EffectMeta("冰肌", False, "7199089344756370743", "7199089344756370743", "18c6b91685b82ef1cd3d7b7261f997ea", [])
冷气机 = EffectMeta("冷气机", False, "7263359186883366155", "7263359186883366155", "740c1bfa9cb365344bd8a51bf7ef037b", [])
冷白 = EffectMeta("冷白", False, "7127614731187178783", "7127614731187178783", "a47ab1d817480c87ff6de4c9ba10b204", [])
冷蓝 = EffectMeta("冷蓝", False, "7127618237117877518", "7127618237117877518", "accf4492064dabe05dce1c28457b6f89", [])
净白肤 = EffectMeta("净白肤", False, "7411580367452376361", "7411580367452376361", "e03e1f71900c5bc97f5c80059161429a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
凛冬 = EffectMeta("凛冬", False, "7449996162343390473", "7449996162343390473", "f4cf3b6ee689d7dca67dc9e2d3cc2303", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
凝黛 = EffectMeta("凝黛", False, "7298279202350976282", "7298279202350976282", "7bad3476dce5691d9e8f90f50122ed33", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
初恋 = EffectMeta("初恋", False, "7195812984306814267", "7195812984306814267", "9fdc53e8dab072725d9bb088b8930869", [])
千玺IXU = EffectMeta("千玺IXU", False, "7127824119294364959", "7127824119294364959", "12af151fa57d3226ee3781a070ae54a6", [])
千里江山 = EffectMeta("千里江山", False, "7208495854938901793", "7208495854938901793", "e084a0e8da69837502a97b63bf85b0a8", [])
千金妝 = EffectMeta("千金妝", False, "7370585884078443802", "7370585884078443802", "e814069ba1dea090eeb44b397eeac252", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
卡露尔 = EffectMeta("卡露尔", False, "7301224597033192716", "7301224597033192716", "c95b8177a1b57996fcdb4b04d789ac28", [])
即刻春光 = EffectMeta("即刻春光", False, "7127675868641594654", "7127675868641594654", "ba343f6bb3720ba81a8662d669b6b743", [])
原木 = EffectMeta("原木", False, "7127675195812351239", "7127675195812351239", "a2cb1c6dd47c2ce4aeb0dd7303353438", [])
去黄增质 = EffectMeta("去黄增质", False, "7438854064458239258", "7438854064458239258", "008490b1e0c2a608966ab708b176584a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
去黄提亮 = EffectMeta("去黄提亮", False, "7438853477616340250", "7438853477616340250", "db9162c29361fbc85838182ec6a8fd51", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早韩系 = EffectMeta("古早韩系", False, "7462953965160893723", "7462953965160893723", "e59a2644bdd93eba36bfc8b8eb96c9ca", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早韩风 = EffectMeta("古早韩风", False, "7473168869222370571", "7473168869222370571", "2a0b58004ab4c613cf6da21d79143e53", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古罗马 = EffectMeta("古罗马", False, "7242212640498568503", "7242212640498568503", "3d438e293e65d63e71af3db73b03bc4e", [])
古风影视 = EffectMeta("古风影视", False, "7404104823563472137", "7404104823563472137", "42a7457ab2132e7da56676b0112f0a80", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
告白 = EffectMeta("告白", False, "7437136821512949007", "7437136821512949007", "377e1a6c5d32f0ef99839ddd35f8d3aa", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
喜市 = EffectMeta("喜市", False, "7185440129442417931", "7185440129442417931", "5210a45933f4265e5f262d3018a78d64", [])
喜庆胶片 = EffectMeta("喜庆胶片", False, "7451265649273261363", "7451265649273261363", "b507e0b53989990c855e33bbfd18d9f6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
四喜 = EffectMeta("四喜", False, "7312102522733268251", "7312102522733268251", "7ae54f18e5dc446f9269686b7d14f404", [])
圣诞灯光 = EffectMeta("圣诞灯光", False, "7429295645669756195", "7429295645669756195", "d66aa7fafbb00c5b7ebb913cce97583f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞灯光II = EffectMeta("圣诞灯光II", False, "7429295455953046818", "7429295455953046818", "fc1cb16d78ae2d3c57e50d2651e44054", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞灯光III = EffectMeta("圣诞灯光III", False, "7429296137275755810", "7429296137275755810", "804cb9914032bb0bd58ad449e28302e7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
复古工业 = EffectMeta("复古工业", False, "7127608212483820837", "7127608212483820837", "cf8d236e185f6b174544151be3baba93", [])
夏日小美好 = EffectMeta("夏日小美好", False, "7494125821032975642", "7494125821032975642", "985ce1e590cac79022c0b162c10080cf", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夏日清凉 = EffectMeta("夏日清凉", False, "7505632228659973416", "7505632228659973416", "90897cbdc876de7beba905db2d6b3c40", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夏日辣妹 = EffectMeta("夏日辣妹", False, "7502729392179776779", "7502729392179776779", "b617fc9280cb849b8893d052ab937741", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夏日风吟 = EffectMeta("夏日风吟", False, "7127684611802418445", "7127684611802418445", "3120cfc3dd0f1fe2090749012d60a20b", [])
大唐盛世 = EffectMeta("大唐盛世", False, "7493423027670109449", "7493423027670109449", "0dfa10fafe76d2947b7cf1e3e50a5003", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奈良 = EffectMeta("奈良", False, "7351684015906147621", "7351684015906147621", "2a7ada2a5ac7a8742b37c3bc794b07b0", [])
奥本海默 = EffectMeta("奥本海默", False, "7271142654505766183", "7271142654505766183", "2a1f03001d0db5f28f73bee7bc00ccf7", [])
奶杏 = EffectMeta("奶杏", False, "7297134192100379938", "7297134192100379938", "89ae84878534d61d0b7d62ba395fc8b7", [])
奶油 = EffectMeta("奶油", False, "7127618513048571173", "7127618513048571173", "dd39d5622353128e5f7c1de20020359a", [])
奶油肤 = EffectMeta("奶油肤", False, "7463296170950020403", "7463296170950020403", "55291539636f958d2bca4ea9958efbad", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奶绿 = EffectMeta("奶绿", False, "7127684319300029733", "7127684319300029733", "8924565ec41520d2a8a88d846069768f", [])
姜饼红 = EffectMeta("姜饼红", False, "7127624030135389471", "7127624030135389471", "22925be3f36caa278eb5df6a0278c636", [])
威尼之都 = EffectMeta("威尼之都", False, "7406553962922429735", "7406553962922429735", "18606fd2c90ef2689278dc26e2cec94b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
安愉 = EffectMeta("安愉", False, "7190242827543022880", "7190242827543022880", "ed7e951505cbf70dee0f4d144d239828", [])
宫崎漫夏 = EffectMeta("宫崎漫夏", False, "7500223670678228262", "7500223670678228262", "2bb28eb6cdb9fd43ae41937e3a47cdb1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
富士CC_II = EffectMeta("富士CC II", False, "7268561903721401641", "7268561903721401641", "cb92e0b13cd9b9a3aca8bb00b1a9c328", [])
寻荷 = EffectMeta("寻荷", False, "7295362817874480425", "7295362817874480425", "0230f2fb3e9ea72df20f8819542b4410", [])
小镇 = EffectMeta("小镇", False, "7127654151688965384", "7127654151688965384", "fc386676ee752b20918fb61c42c28a7b", [])
山系 = EffectMeta("山系", False, "7127662738884545806", "7127662738884545806", "d9d5332152b0f951229402d7d840263e", [])
巧克力 = EffectMeta("巧克力", False, "7363220647767592243", "7363220647767592243", "6e513d9dcb9357219e35097b945a3881", [])
布兰卡 = EffectMeta("布兰卡", False, "7242208887883992381", "7242208887883992381", "1774e2dd335a10a5f3174062c08403a2", [])
布朗 = EffectMeta("布朗", False, "7273777590102527290", "7273777590102527290", "b6bee72111d56fd16679adcf9543a05a", [])
希望 = EffectMeta("希望", False, "7271141541521968396", "7271141541521968396", "fdb975090cbdc5a5fb2e56ae982514a2", [])
幽蓝 = EffectMeta("幽蓝", False, "7330441280016715062", "7330441280016715062", "9db4cff7dd63bf1a17ced3728ca02e5e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
彩果 = EffectMeta("彩果", False, "7175101541198679353", "7175101541198679353", "b5d50eae497be9aab963a96993a80df1", [])
彩檐 = EffectMeta("彩檐", False, "7226234868059917628", "7226234868059917628", "6c4502f0bd36c8d702db0c2b2f9ad18a", [])
影叙 = EffectMeta("影叙", False, "7349953761059638555", "7349953761059638555", "72e02210098c120bbcddca245656aaca", [])
微澜 = EffectMeta("微澜", False, "7338406163848940840", "7338406163848940840", "7e302ecfc744cbb1d38d71533214b257", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
德古拉 = EffectMeta("德古拉", False, "7127678346472819982", "7127678346472819982", "f8bfba1ebdb6c5054eec4eb1e9433e72", [])
快照I = EffectMeta("快照I", False, "7143537677655100709", "7143537677655100709", "526ce6c2fd2228cda17fc5f64a7267cf", [])
忽风 = EffectMeta("忽风", False, "7330123964305378586", "7330123964305378586", "c455bc6760bd9829f2d467866527a1b1", [])
情感电影 = EffectMeta("情感电影", False, "7505461557237730598", "7505461557237730598", "f587d5a01d40ac69f26b9cc59a969822", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
情绪电影 = EffectMeta("情绪电影", False, "7420000959759224118", "7420000959759224118", "fd27b358349ee85c7a7241316534fef6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
扫街 = EffectMeta("扫街", False, "7376146305736822028", "7376146305736822028", "fd2b6e08a9c7a29d5052c48fe10ecdfb", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
探店博主III = EffectMeta("探店博主III", False, "7411911267859860746", "7411911267859860746", "400bd4f181603f72b4ca0174e0e62781", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
摩卡灰 = EffectMeta("摩卡灰", False, "7437011056653847808", "7437011056653847808", "e45427030aa2609974234c68b336511b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
敦刻尔克 = EffectMeta("敦刻尔克", False, "7127568601921408293", "7127568601921408293", "6b4a7017eecf10aa48e3f93586e04a6a", [])
料理 = EffectMeta("料理", False, "7127656350833806622", "7127656350833806622", "31ebabffaf3ed8653e0db318dfbeaa9d", [])
新年电影 = EffectMeta("新年电影", False, "7445550576210873663", "7445550576210873663", "56bd30429814522169ee00614a7c3a05", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新闪 = EffectMeta("新闪", False, "7342395072199019803", "7342395072199019803", "9c3858dfbdd548bef8a012d55f795b47", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日出 = EffectMeta("日出", False, "7325383700240256296", "7325383700240256296", "628b7f7c8a7fea3f89edaff21f4c9d25", [])
日系奶油 = EffectMeta("日系奶油", False, "7127664177870671135", "7127664177870671135", "8e779b2183d399fb192decf3616f8c27", [])
日落橘 = EffectMeta("日落橘", False, "7127669630667066655", "7127669630667066655", "1ff996d1537f8a485f193314861c6b5b", [])
日落飞车 = EffectMeta("日落飞车", False, "7505662247407013135", "7505662247407013135", "f077d7a11fa93abd6f0bd8786fe17fc0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
旧乐园 = EffectMeta("旧乐园", False, "7239977329668263227", "7239977329668263227", "604ff64bec0ae328aa1d1c19fb89bfa2", [])
旧时代I = EffectMeta("旧时代I", False, "7232218563270954300", "7232218563270954300", "9532fcb213a6eb45c2441d8d0466f9ef", [])
明晰 = EffectMeta("明晰", False, "7367715162964446516", "7367715162964446516", "c622c908228fb2796e141f973b9746e9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
星云 = EffectMeta("星云", False, "7127672042069036319", "7127672042069036319", "b73b7e9c33f8e387cbb579a5c11f01b9", [])
春日绿妍 = EffectMeta("春日绿妍", False, "7463345622440037658", "7463345622440037658", "0fa37f0c990e27a8029d65d07f84be23", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
昭和夏 = EffectMeta("昭和夏", False, "7505660075252485376", "7505660075252485376", "08e5c5e7bfba6a18dd67cd1c8eefeb1e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴好春日 = EffectMeta("晴好春日", False, "7468552996008299791", "7468552996008299791", "6ee5038f6fe86df6b95594bcdbe5075a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴沐 = EffectMeta("晴沐", False, "7342503492311076137", "7342503492311076137", "1280aaabcbcdb3e0f2d5e39947d330d8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴研 = EffectMeta("晴研", False, "7472763263684578572", "7472763263684578572", "696738f25d65091f3a1d77bda171d91c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴颜 = EffectMeta("晴颜", False, "7297968738131873035", "7297968738131873035", "97b54d7d49c75162656379068221e3a1", [])
暖食 = EffectMeta("暖食", False, "7127653100269210916", "7127653100269210916", "47b7c1b9f560b85b528c24f7cbbb6cd4", [])
暗夜 = EffectMeta("暗夜", False, "7127823728070659358", "7127823728070659358", "788c476ccf299db46035bd930d90c342", [])
暗调氛围 = EffectMeta("暗调氛围", False, "7463118934061993242", "7463118934061993242", "b5be681b2126319c4f831d4e0f8cfe31", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗雅 = EffectMeta("暗雅", False, "7127656352410848548", "7127656352410848548", "c5207d449099512b7efd9419c75378f7", [])
暮光 = EffectMeta("暮光", False, "7242211155131862332", "7242211155131862332", "b5e36cb0438d74eac97fb6c7ec66260f", [])
暮色 = EffectMeta("暮色", False, "7127594686541237535", "7127594686541237535", "adbf6d3bbbd6a6d4525300d78323a7d2", [])
月升之国 = EffectMeta("月升之国", False, "7127819487419567373", "7127819487419567373", "46638e887295beddd23c84206af26a1b", [])
月夜 = EffectMeta("月夜", False, "7143532202112912670", "7143532202112912670", "67cfe630584f194d007e3001052f5094", [])
未央 = EffectMeta("未央", False, "7340282260312182050", "7340282260312182050", "901d60cca1c56063279941926ed877be", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
朱栗 = EffectMeta("朱栗", False, "7299055174880988479", "7299055174880988479", "d2fb23b72e1ed1ad368ab20c87ae5271", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
松果棕 = EffectMeta("松果棕", False, "7127669342325443854", "7127669342325443854", "d68bcfc1e312f0e3e52f164a59cff686", [])
林间 = EffectMeta("林间", False, "7127663793827564808", "7127663793827564808", "c1ff0cd2a3eea239334b9604d31b4947", [])
柠檬青 = EffectMeta("柠檬青", False, "7127676358766923016", "7127676358766923016", "0437481ce079dd3f1160351c1038d628", [])
梵时 = EffectMeta("梵时", False, "7341767383259942155", "7341767383259942155", "a8908ae23533d029ea98fd6c5d052143", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
棕咖 = EffectMeta("棕咖", False, "7273779209934245179", "7273779209934245179", "d661b0ee2e5417c12e824af664490161", [])
棕宥 = EffectMeta("棕宥", False, "7332348414933421366", "7332348414933421366", "d3dfad8c9cbc044369c528461bd79f57", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
棠梨 = EffectMeta("棠梨", False, "7329819965920398604", "7329819965920398604", "09c9a4e110dd011c2155a544ecfe4b89", [])
椰林 = EffectMeta("椰林", False, "7252674515287788856", "7252674515287788856", "d0e4bf788a131db36ccf98e09f6cf056", [])
椿和 = EffectMeta("椿和", False, "7341032461234654475", "7341032461234654475", "46b1e432d7075fe6dc2b31d98809dac5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
椿来 = EffectMeta("椿来", False, "7347729407181704498", "7347729407181704498", "13780c3447b3326ab87365015d0d0cb9", [])
樱粉 = EffectMeta("樱粉", False, "7127632545272925470", "7127632545272925470", "a5411e69fdf93e03f1d0c29ee6822173", [])
比佛利 = EffectMeta("比佛利", False, "7127657040348040479", "7127657040348040479", "0b705ff4b8eb7fe5090848b588139e75", [])
气泡水 = EffectMeta("气泡水", False, "7127619120761212168", "7127619120761212168", "4a0b28181b76b9ba2dd4ccdf66aa905a", [])
江浙沪 = EffectMeta("江浙沪", False, "7127838224344435981", "7127838224344435981", "9287d59bc7ff0bce6f4893b0383c4bfe", [])
治愈萌宠 = EffectMeta("治愈萌宠", False, "7454497262480231718", "7454497262480231718", "41f5c01699c2940a8ca8654cdaaf1bcc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
泥金 = EffectMeta("泥金", False, "7208495760520842529", "7208495760520842529", "62be11e3055851b4816ae3a55a7c1106", [])
活力夏 = EffectMeta("活力夏", False, "7493764749054709001", "7493764749054709001", "8ad383deeb6804200d47aa85695d45fd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
流光金属 = EffectMeta("流光金属", False, "7127675565779307789", "7127675565779307789", "0c75bf2670f41bb66be90753649cd4a2", [])
浅岛 = EffectMeta("浅岛", False, "7281163331245821239", "7281163331245821239", "dc6d03248744c082a2929bb29184f820", [])
浪漫烟火 = EffectMeta("浪漫烟火", False, "7446098658942078258", "7446098658942078258", "c69ce4d373a9ad5c212495d951935035", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浮生 = EffectMeta("浮生", False, "7340687187194678569", "7340687187194678569", "f438386d5155971f6ecd2600126fcbb4", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
海浪梦境 = EffectMeta("海浪梦境", False, "7401018435674688787", "7401018435674688787", "ea9788764c806bf56c5442c70d6f1705", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
海街日记 = EffectMeta("海街日记", False, "7127615915004366116", "7127615915004366116", "8ac09d35b39a8b6f289ef5f4330a3d62", [])
海雾 = EffectMeta("海雾", False, "7189595107610447163", "7189595107610447163", "3099b6872219761db76f4c7cc86ea0e5", [])
海鸥DC = EffectMeta("海鸥DC", False, "7127830050786823437", "7127830050786823437", "8cd726548b6275553ce2668cca28f32e", [])
深沉 = EffectMeta("深沉", False, "7414897963752770828", "7414897963752770828", "2b7f9e970de54af1adab089a0006dfae", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
深秋 = EffectMeta("深秋", False, "7295596083101633842", "7295596083101633842", "7f3622e3b0947e47bb12a835bf80c686", [])
深褐 = EffectMeta("深褐", False, "7127615347703811336", "7127615347703811336", "e7e999ed75f9f3a0626cf946b08c4f35", [])
清冷 = EffectMeta("清冷", False, "7405602958748028186", "7405602958748028186", "a70b959036e5b054ae6974045896cef3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清冷冬日 = EffectMeta("清冷冬日", False, "7449939213430082867", "7449939213430082867", "41a819a8662d671d7bb79cf28719e0de", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新 = EffectMeta("清新", False, "7469310117079420211", "7469310117079420211", "245032b4f8f96e0c760a1b2895a82f38", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新漫和 = EffectMeta("清新漫和", False, "7480517561486953779", "7480517561486953779", "5c4f109e0688d3d80d827172811a0a2a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清明上河 = EffectMeta("清明上河", False, "7208495962887621899", "7208495962887621899", "9fa5e1e67f3217c48cb8e64c26469fc1", [])
清晰明亮 = EffectMeta("清晰明亮", False, "7433813603758722342", "7433813603758722342", "79084bba6b177ef0e597583b46ad5d16", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰烟花 = EffectMeta("清晰烟花", False, "7448652759869525287", "7448652759869525287", "e1590847287bd196ebdc5866e395fa78", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清澈 = EffectMeta("清澈", False, "7359419156619332902", "7359419156619332902", "a40f003f9ea1ff5570314e7fa1e0a289", [])
清透自然 = EffectMeta("清透自然", False, "7482047649831570726", "7482047649831570726", "798b1b2fdced376700d7069fed060793", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
温述 = EffectMeta("温述", False, "7351580023742090535", "7351580023742090535", "207610064067f787d8339e8661a19d72", [])
港历 = EffectMeta("港历", False, "7346017304909581587", "7346017304909581587", "a60377ccb7d2eba39c9c9a54178f2869", [])
港风 = EffectMeta("港风", False, "7127830945243090184", "7127830945243090184", "44c277e7933012ecceaa669d4bc64452", [])
演唱会 = EffectMeta("演唱会", False, "7396701250764426546", "7396701250764426546", "9753e98d86b99c2a0a99fb4dbfbfa981", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
漫夏 = EffectMeta("漫夏", False, "7366616947703991571", "7366616947703991571", "3b090944724c8cc1a8d7a5d73be3358f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
漫彩 = EffectMeta("漫彩", False, "7177269429972045089", "7177269429972045089", "71885c8e558e4b6fece843e3d4464e62", [])
漫春 = EffectMeta("漫春", False, "7332866997128105228", "7332866997128105228", "0affb5f75ea91249ecdeb3fa5e255255", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
漫步 = EffectMeta("漫步", False, "7263357613050563852", "7263357613050563852", "de874f8a3993f93bb067593f0dfcfa5a", [])
漫谷 = EffectMeta("漫谷", False, "7312002825054211378", "7312002825054211378", "c201f700471bac64dddec7f4844ee3a7", [])
烈焰红 = EffectMeta("烈焰红", False, "7409669784155000090", "7409669784155000090", "46c99536d5481e0e1e4dbe445ff1144c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烘培 = EffectMeta("烘培", False, "7127675183246200072", "7127675183246200072", "55cb15f600fff6aa4bda19f490aa7548", [])
烟岚 = EffectMeta("烟岚", False, "7341204799590763788", "7341204799590763788", "33937d0f480f994e09bc32adfe352cbd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烟火增色 = EffectMeta("烟火增色", False, "7446098755905965338", "7446098755905965338", "8f844a1d9916774ba105fc26dee5212d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烟花增强 = EffectMeta("烟花增强", False, "7444905127871270181", "7444905127871270181", "aed1cca59d133d454f96f5ce0e6888ed", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烟霞 = EffectMeta("烟霞", False, "7143533042978524424", "7143533042978524424", "e33d66d89891ebab00dabb91a4b4caee", [])
熔金 = EffectMeta("熔金", False, "7143575737881120037", "7143575737881120037", "870a7dad3d5f5aae975be2b353d2ed06", [])
燃力 = EffectMeta("燃力", False, "7248571956860079395", "7248571956860079395", "f8deda9b7cb4ff2f4e6382795c7265a7", [])
牛皮纸 = EffectMeta("牛皮纸", False, "7127822013074263310", "7127822013074263310", "351a03b45cb0cd2e13911113e7b06ca5", [])
珠光蓝 = EffectMeta("珠光蓝", False, "7127657509501914399", "7127657509501914399", "2b91f0f9a4a9cac90b3cd1be50637f58", [])
珠落 = EffectMeta("珠落", False, "7213575938615872823", "7213575938615872823", "9ced1b064be8feb4c3c3b2989b61e286", [])
疼痛文学 = EffectMeta("疼痛文学", False, "7453868314482298122", "7453868314482298122", "71c97b14ca65445c60c7ffd033acd31b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
病娇 = EffectMeta("病娇", False, "7291179909718740259", "7291179909718740259", "5e1e1d48442e9e2fa3bab8e724bce4ad", [])
白皙 = EffectMeta("白皙", False, "7127668617147141413", "7127668617147141413", "d029402b10782b63f67967b4d1bc1c03", [])
盐岚 = EffectMeta("盐岚", False, "7359223280714239268", "7359223280714239268", "e517e2dd0dc2601874ce0ca63c9cc75d", [])
矿野 = EffectMeta("矿野", False, "7281162649314889015", "7281162649314889015", "7e645e33c8e3d019669e9cb5d03d6886", [])
砂红 = EffectMeta("砂红", False, "7300758676732677427", "7300758676732677427", "2f33ad8925eb2079b23900241fcf83a4", [])
砾绀 = EffectMeta("砾绀", False, "7340915058542759219", "7340915058542759219", "d0f6bbafe6d5b1d6d5100e99c79b9e9e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
空灵 = EffectMeta("空灵", False, "7353555308448419098", "7353555308448419098", "341afbfb8058ac32a1994b2dc39be59c", [])
空谷 = EffectMeta("空谷", False, "7143532176313699620", "7143532176313699620", "03d4f2901ecb0ea047b731273f2ee3d0", [])
竹绢 = EffectMeta("竹绢", False, "7208496463293320480", "7208496463293320480", "807ef3820365dbe8c27047bab51ab65d", [])
米棕 = EffectMeta("米棕", False, "7221477781043973413", "7221477781043973413", "e687f0134f6ee01f8f50198bd52ebd00", [])
粉瓷 = EffectMeta("粉瓷", False, "7127667757998411044", "7127667757998411044", "76eac8836f1ddd762af8c6317b1c8c73", [])
粉肤 = EffectMeta("粉肤", False, "7296493947625557286", "7296493947625557286", "1b4893feb8dac4eb014b6e3f52449786", [])
粹光 = EffectMeta("粹光", False, "7373693828328475941", "7373693828328475941", "a3b69c7718dab46fedcd6ceabcb7425b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
素肌 = EffectMeta("素肌", False, "7127671162758270245", "7127671162758270245", "cfb819eefe90e08965021dfea52d402b", [])
红绿 = EffectMeta("红绿", False, "7127622617699290399", "7127622617699290399", "e20b3185492170b68d6c7944270e3f76", [])
绝对红 = EffectMeta("绝对红", False, "7127667361456426248", "7127667361456426248", "cc6084f69428c5a741ea4280ddbfe3c8", [])
绿妍 = EffectMeta("绿妍", False, "7127675252410223909", "7127675252410223909", "46a6f490249d7eabe3a9e8cd8e92cf2d", [])
美味 = EffectMeta("美味", False, "7414142998075690279", "7414142998075690279", "08e7404edc27b9b8c0a9ce51ccbb75dc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
老友记 = EffectMeta("老友记", False, "7127669912050420999", "7127669912050420999", "e45f9a4c50717a3585006591b41e3440", [])
胡桃木 = EffectMeta("胡桃木", False, "7127830961621847310", "7127830961621847310", "5eb7457d0d18cfdf0dcd99725acf2dd9", [])
自然 = EffectMeta("自然", False, "7127821314198342943", "7127821314198342943", "f4a371ed60b7448b146cd1b1c697a9e8", [])
自然清晰 = EffectMeta("自然清晰", False, "7412691247992671497", "7412691247992671497", "b53afa88ca3762e229cdcf982c705d49", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
自由 = EffectMeta("自由", False, "7271143155544739108", "7271143155544739108", "a202f96129bf04064a37cd92f5fda5b9", [])
臻金 = EffectMeta("臻金", False, "7306726303594564904", "7306726303594564904", "6cae1766e18f62be45ddcf4d169da037", [])
花园 = EffectMeta("花园", False, "7226990672190950713", "7226990672190950713", "b235531243327c4b03bdd5495f95d9c6", [])
花椿 = EffectMeta("花椿", False, "7127539889553427719", "7127539889553427719", "6502db5f541da3fdfbedf9161a79e53c", [])
花火 = EffectMeta("花火", False, "7175071186185964812", "7175071186185964812", "cd3a2d3f97bb4874bc9b16f36fec2329", [])
花火夜焰 = EffectMeta("花火夜焰", False, "7460022261144177957", "7460022261144177957", "b78a09cb97225b3fde2575cea820da3e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
花花世界 = EffectMeta("花花世界", False, "7505429510930730275", "7505429510930730275", "e5c8c6ee154d78c75d8236197ae79a9e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
落日 = EffectMeta("落日", False, "7166494058305670432", "7166494058305670432", "a3909c6739bcfffce11c1ed328afdb39", [])
落日海岛 = EffectMeta("落日海岛", False, "7369501986401570099", "7369501986401570099", "0cefc26f8aa950c8934766ad229255bc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
落日飞车 = EffectMeta("落日飞车", False, "7350133636890463498", "7350133636890463498", "c92ce87d49816b7c930d5c1a5f537536", [])
落牧 = EffectMeta("落牧", False, "7375415880118783295", "7375415880118783295", "14f918c1d7bd5d19324268c8e7874cd4", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
蒸汽波 = EffectMeta("蒸汽波", False, "7127671519450320159", "7127671519450320159", "620ed46028278726516be363bdf070de", [])
薄荷 = EffectMeta("薄荷", False, "7343782317820857641", "7343782317820857641", "eed11d695897d0068dc658d09a18f444", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
褪色 = EffectMeta("褪色", False, "7127668404764380447", "7127668404764380447", "13ed65a66841ee746146665f0aa18c6d", [])
西野 = EffectMeta("西野", False, "7331590962696834313", "7331590962696834313", "c5368d1617ac7b8af8b616782b388557", [])
西餐 = EffectMeta("西餐", False, "7127668806398315806", "7127668806398315806", "c447f798e1aaf5a776b40432571e9ee8", [])
谧歌 = EffectMeta("谧歌", False, "7301212776532380966", "7301212776532380966", "229eed4ae519e0c29efe23a2f07ba644", [])
贝松绿 = EffectMeta("贝松绿", False, "7127668616991952158", "7127668616991952158", "5820a95014d61c7b5a45d23ba045d0e1", [])
质感暗调 = EffectMeta("质感暗调", False, "7127653798155209997", "7127653798155209997", "80cc0198c081d823bfbfa08fd5e0c3c6", [])
质感电影 = EffectMeta("质感电影", False, "7395858604311596299", "7395858604311596299", "163feab5aa04b300109d4317cf5c7712", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
赛博朋克 = EffectMeta("赛博朋克", False, "7127657979838516494", "7127657979838516494", "fe6d8ddb41fd8ea4f184ff5d9ca0b77e", [])
赤陀 = EffectMeta("赤陀", False, "7226251886360300837", "7226251886360300837", "f44a2fd63bcdb30bd1cdfd1120ced1e1", [])
赫本 = EffectMeta("赫本", False, "7127663117508660517", "7127663117508660517", "589b59735865a200db3ac561640ed299", [])
赫石 = EffectMeta("赫石", False, "7302823953406446899", "7302823953406446899", "4be5b26f8b932f7fe7a3f8033d5549b2", [])
轻食 = EffectMeta("轻食", False, "7127621137705618724", "7127621137705618724", "27fbb36cf04af9886d4d9e6abcd3691b", [])
达芬妮 = EffectMeta("达芬妮", False, "7300602459356040484", "7300602459356040484", "e9556101678a74dc573133da00401854", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
迈阿密 = EffectMeta("迈阿密", False, "7127684611450178823", "7127684611450178823", "f9f32708f0029a5b043736e64133324f", [])
酷白 = EffectMeta("酷白", False, "7127676762514885919", "7127676762514885919", "e62e07d9ed430226e6afaa96dba3844a", [])
金属 = EffectMeta("金属", False, "7127654151688949000", "7127654151688949000", "7aaae4aad5195f4df6929d9cb2f77fc9", [])
闪光灯 = EffectMeta("闪光灯", False, "7364705637931994405", "7364705637931994405", "5b6fd1621826d837d88c71de0ced5f76", [])
闪胶回忆 = EffectMeta("闪胶回忆", False, "7452726092126833959", "7452726092126833959", "4a1de85787a2fa27ddbe569a73e787e4", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
闻香识人 = EffectMeta("闻香识人", False, "7127823728267775263", "7127823728267775263", "56693fef51ca05d7631f1bf3ae47c3cc", [])
阿尔菲 = EffectMeta("阿尔菲", False, "7299130097632627979", "7299130097632627979", "5225172497e1cd5bd3a8e1162a9c25d0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
雪鹿 = EffectMeta("雪鹿", False, "7302796570947243264", "7302796570947243264", "10ff7e7bc0accc06c5ce3b9c09114b18", [])
雾瓷 = EffectMeta("雾瓷", False, "7169239634076060960", "7169239634076060960", "03e7a58f2d18954a4ced7fec8371cd5e", [])
青春古早 = EffectMeta("青春古早", False, "7505676110412254527", "7505676110412254527", "80742c0b85468f8cb13333db96449c36", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
青橙 = EffectMeta("青橙", False, "7127615575865478430", "7127615575865478430", "58b4c939e727d94fb074ca0a1c0400ad", [])
青橙电影 = EffectMeta("青橙电影", False, "7401896022214970650", "7401896022214970650", "6ccecf9c82c21938ed4bd2751db52b9c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
青红夜 = EffectMeta("青红夜", False, "7281575818621455628", "7281575818621455628", "7b439160a4134076dc70571813ec9cbb", [])
音乐节 = EffectMeta("音乐节", False, "7405834787132280079", "7405834787132280079", "b61e21d4516390ecde868b5d670126d6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
风铃 = EffectMeta("风铃", False, "7211001257996127547", "7211001257996127547", "48d79f8501ade6fd7a33055b83947eb8", [])
香松 = EffectMeta("香松", False, "7175094003493309757", "7175094003493309757", "528e10e4419475bf6acf24488b660dbd", [])
高清4K电影 = EffectMeta("高清4K电影", False, "7452548610971012379", "7452548610971012379", "f23af43c6ec3724a0cb415677dae00c0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清冬日 = EffectMeta("高清冬日", False, "7450317804554685708", "7450317804554685708", "85b6ad6c821ee2361ce32cae5c70acf9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清明亮 = EffectMeta("高清明亮", False, "7434564801990266162", "7434564801990266162", "6a7ba37411cc37d75d9ae20d29b65dee", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清润白 = EffectMeta("高清润白", False, "7404503340576410906", "7404503340576410906", "d454e2c98a89324036eef9c15ebb3590", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清烟火 = EffectMeta("高清烟火", False, "7446098482013768970", "7446098482013768970", "8eeca9ea5018c168413ec0e080655bb5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清福气 = EffectMeta("高清福气", False, "7460008665286855973", "7460008665286855973", "935da93388e6d7542176aa5e614c14f2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高饱和 = EffectMeta("高饱和", False, "7127653121966230814", "7127653121966230814", "a0533d46f3bc544f36e00965b2644067", [])
鬼魅 = EffectMeta("鬼魅", False, "7291201164027252024", "7291201164027252024", "20fd9ce9674e1e0137955e2d74ce252a", [])
鲜亮食光 = EffectMeta("鲜亮食光", False, "7441227246326582537", "7441227246326582537", "7c0143c47f7ffa237d2c84b0e42c9a7a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鲜美年味 = EffectMeta("鲜美年味", False, "7460115630973340940", "7460115630973340940", "862e1a16a282b2ddc8112a317e53d3d7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
黑胶唱片 = EffectMeta("黑胶唱片", False, "7221805176410180921", "7221805176410180921", "97fc59d95cbb611d888bf10da5a1c015", [])
黑莓 = EffectMeta("黑莓", False, "7175100298610871610", "7175100298610871610", "aefe136056b95d5f06b4cbb440961168", [])
黑豹 = EffectMeta("黑豹", False, "7202475126485503236", "7202475126485503236", "9f33e8c52e07d1af8ff00781f7645124", [])
默片 = EffectMeta("默片", False, "7127655037026848031", "7127655037026848031", "81be2b9491c4c805cb4f70a595ab46a6", [])
# 付费特效
_160C = EffectMeta("160C", True, "7190249807682800954", "7190249807682800954", "7505f10b71bc6e346a1696544121ac9e", [])
_2077 = EffectMeta("2077", True, "7131347316111314189", "7131347316111314189", "168cd951f6f51c1fb1cd9ea1658f4012", [])
_400H = EffectMeta("400H", True, "7190236487152127269", "7190236487152127269", "20817f9b1ed37a720c02abea87714655", [])
_4K画质 = EffectMeta("4K画质", True, "7477802799862992138", "7477802799862992138", "857c116e0fde4f429fe4ee0084283843", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
_4K画质电影 = EffectMeta("4K画质电影", True, "7478641636092775743", "7478641636092775743", "46b9cdb1c33433a6eaa8e0ba5ac29322", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
_4K高品质 = EffectMeta("4K高品质", True, "7480203423095213362", "7480203423095213362", "68d93b6b15e95f4c6f39fd659873ef07", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
_800Z = EffectMeta("800Z", True, "7190237757552348471", "7190237757552348471", "53acbe492462a72db57c3f5ed7de9345", [])
_8K画质 = EffectMeta("8K画质", True, "7478895015901613375", "7478895015901613375", "d5a81c57ca772c8456e3f9d53ebaf67e", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%"""
_90s = EffectMeta("90s", True, "7131366613823114503", "7131366613823114503", "ff76a6962c69106eede587fab606fc27", [])
City_Walk = EffectMeta("City Walk", True, "7263360572404550931", "7263360572404550931", "9a183540a03b391b3a17b67970ddc93a", [])
EOS3 = EffectMeta("EOS3", True, "7200697197002886404", "7200697197002886404", "1ea3335f32de0ff87c643bd0df2075e4", [])
FXN = EffectMeta("FXN", True, "7332480052392774975", "7332480052392774975", "01cd75f7c9b5fb3b05bbcb54e53400d4", [])
GR正片 = EffectMeta("GR正片", True, "7168098796860148995", "7168098796860148995", "1f28a387f3f22baff4b1410530d2750f", [])
GR绿 = EffectMeta("GR绿", True, "7168121440141708576", "7168121440141708576", "5ad1db915106f04413a025928b28cdf5", [])
GR蓝 = EffectMeta("GR蓝", True, "7168097661160131879", "7168097661160131879", "c7f40f1f2b5c655d6ca5f45f8d86b52d", [])
IG白 = EffectMeta("IG白", True, "7221479156318489893", "7221479156318489893", "02a7a3a08ed9756bb1ae7b924213c33d", [])
INS暗 = EffectMeta("INS暗", True, "7223645151820877093", "7223645151820877093", "29c393013eddca0fdd0ee0087100915e", [])
INS暗调 = EffectMeta("INS暗调", True, "7473409650746985779", "7473409650746985779", "d15a78d524285235d2aedf03a27a6037", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
KONICA = EffectMeta("KONICA", True, "7200712753324035339", "7200712753324035339", "c05506c48792c883d3ecff9e25e0c677", [])
KU4 = EffectMeta("KU4", True, "7127669605199318280", "7127669605199318280", "b382bdfe54fed4ae7986f5205de60713", [])
PENTAX = EffectMeta("PENTAX", True, "7200999937960627459", "7200999937960627459", "87b401a86d70ae0fd4a5c3b23486c7b5", [])
Pocket3 = EffectMeta("Pocket3", True, "7493462285889899803", "7493462285889899803", "52373abce98c4509bd1bbc5db694cbd2", [])
Y3K = EffectMeta("Y3K", True, "7398034408139230490", "7398034408139230490", "a9dbbc5d01811225842ea0332fa330c1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
iPhone6s = EffectMeta("iPhone6s", True, "7393943544089627930", "7393943544089627930", "a83a14437d060aa093acf5f2441d6dc1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
ins古早味 = EffectMeta("ins古早味", True, "7547377459126209827", "7547377459126209827", "2dc9da09febc490da3787d530df72eb7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
miu系II = EffectMeta("miu系II", True, "7395097767388990756", "7395097767388990756", "cc8ae49411140f244bfc3d3e1bcc9afd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
万圣 = EffectMeta("万圣", True, "7426749131344841995", "7426749131344841995", "9d8d5689c13ca9e44441527c505fb693", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
不要抬头 = EffectMeta("不要抬头", True, "7202480720843984131", "7202480720843984131", "3b3dc994ea819d31555abae026b1cc91", [])
丝滑皮肤 = EffectMeta("丝滑皮肤", True, "7495673180904885516", "7495673180904885516", "7e44f3f603e1f39f46ee4bb552f2e7ac", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
中性 = EffectMeta("中性", True, "7127621445806525704", "7127621445806525704", "8168144d29c35cf186eccb03ec9f3d93", [])
中性II = EffectMeta("中性II", True, "7312646907908607244", "7312646907908607244", "ad71ff12ac0afd02cb6c583d0ee69d8a", [])
中性奶杏 = EffectMeta("中性奶杏", True, "7385203623703137575", "7385203623703137575", "f64b492a7627b07f8f6d01e1c3574311", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
乐游 = EffectMeta("乐游", True, "7193982146363673856", "7193982146363673856", "2a215f5fe9ff6c1a8effea9135bbe3bb", [])
云暖 = EffectMeta("云暖", True, "7314883649999015231", "7314883649999015231", "7819364ae09bf6c6771fce646cde6ec9", [])
京都 = EffectMeta("京都", True, "7127679758581697822", "7127679758581697822", "63e749e3d425d0912123b4d7e53fc446", [])
亭竹 = EffectMeta("亭竹", True, "7302325291634920755", "7302325291634920755", "4bddb2bc6d4ca571e5f45a3dbe3f84dc", [])
亮丽 = EffectMeta("亮丽", True, "7413406043608272154", "7413406043608272154", "46ac28247c5fd004e08d5d970152eb49", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
人生之事 = EffectMeta("人生之事", True, "7148844086869396743", "7148844086869396743", "352419343c715ea1be613980e91f5aa8", [])
仲夏夜 = EffectMeta("仲夏夜", True, "7281166048273943867", "7281166048273943867", "0773453b9c513222ed0b2a629b141b38", [])
仿撕拉片 = EffectMeta("仿撕拉片", True, "7503844955467648283", "7503844955467648283", "184bb2a8f80b693ada67bd80ac38ab1e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
伊豆 = EffectMeta("伊豆", True, "7195781682492984636", "7195781682492984636", "2330a4a65c6f4ab15ef39c10ab063ff7", [])
伤感故事电影 = EffectMeta("伤感故事电影", True, "7516859499404119296", "7516859499404119296", "21b43b02064aef8b87590b2b3ebb67e1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
伤感电影 = EffectMeta("伤感电影", True, "7498948996816194843", "7498948996816194843", "c5ddafa9ebd09886302cc442398ab521", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
余晖 = EffectMeta("余晖", True, "7278616064018107707", "7278616064018107707", "19e8ac930af976579c60df1ad6f4c4fe", [])
佳能G12 = EffectMeta("佳能G12", True, "7485292050917657906", "7485292050917657906", "23ecefd04019e949de483cf913e08771", [])
佳能G7X_II = EffectMeta("佳能G7X II", True, "7291597100389862707", "7291597100389862707", "e9aef9a32a0ed9ebf39c9f23340fd408", [])
佳能G7X_III = EffectMeta("佳能G7X III", True, "7291595038688136474", "7291595038688136474", "3c89208f4754d78ad97df171a1cc1ffc", [])
佳能清透感 = EffectMeta("佳能清透感", True, "7605630861400083763", "7605630861400083763", "07ec403321666b08005246a1a8e36e80", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
俏皮萌宠 = EffectMeta("俏皮萌宠", True, "7394713676789353737", "7394713676789353737", "bba8efffe5600316da5ac027b95fa231", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
俱乐部 = EffectMeta("俱乐部", True, "7239235794744003851", "7239235794744003851", "1f6a4516fb91c8e68217123191dc38ea", [])
倾森 = EffectMeta("倾森", True, "7332714336315526409", "7332714336315526409", "2b0731e9eacb5098ad43bd99ae6f23d7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
假日海滩 = EffectMeta("假日海滩", True, "7405115979107274020", "7405115979107274020", "4ac4228650cb812a80173b56c310aa15", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
假日电影感 = EffectMeta("假日电影感", True, "7517179906292190501", "7517179906292190501", "9c39d9434ea88b9e0614fbd4dd78d240", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
偏振镜 = EffectMeta("偏振镜", True, "7551730483399314751", "7551730483399314751", "0dc90e97114f4e8c7a0a86604739bc6c", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.900, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认70%, 0% ~ 100%
effects_adjust_soft: 默认90%, 0% ~ 100%"""
傍晚 = EffectMeta("傍晚", True, "7226990270053649725", "7226990270053649725", "a1aa29d3a6ea4ca73cb38dac5f5f5d6a", [])
元宵祈福 = EffectMeta("元宵祈福", True, "7467923122545544499", "7467923122545544499", "4567a0899a90932be92a68098082eb1d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
元气春颜 = EffectMeta("元气春颜", True, "7480473626207145254", "7480473626207145254", "b0436359d8d0e84263eba33e8542f82c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
元气焕肤 = EffectMeta("元气焕肤", True, "7475923492119006473", "7475923492119006473", "e3e3177e21009a34a270cffab88bc97e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
元气粉肌 = EffectMeta("元气粉肌", True, "7472748943953169727", "7472748943953169727", "05b894b6fded9f70314c8223cfda6d64", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
光流 = EffectMeta("光流", True, "7233732009070300473", "7233732009070300473", "351346b807ca9bfa063e517f10d96f95", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冬日亮肤 = EffectMeta("冬日亮肤", True, "7446310234596904246", "7446310234596904246", "be77bea4244b6539d794ed24d06b2927", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冬日清寒 = EffectMeta("冬日清寒", True, "7594740512435801380", "7594740512435801380", "af960eaa4c5e1f6f4d07d197ca822d07", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冬日物语 = EffectMeta("冬日物语", True, "7444960658178821414", "7444960658178821414", "e04c7e0b73dda7a63c5fd938ac9946cb", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冬日胶卷 = EffectMeta("冬日胶卷", True, "7447359984167406863", "7447359984167406863", "09979175ea6f74eb9e1e852a9b4f59df", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冬禧 = EffectMeta("冬禧", True, "7190250133672578316", "7190250133672578316", "6423fd745c7ba83613feea71977763fb", [])
冬绪电影 = EffectMeta("冬绪电影", True, "7570270935157148968", "7570270935157148968", "7c2bb9a971e2c88008344c6e101e2d31", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冬雪电影感 = EffectMeta("冬雪电影感", True, "7566134950601297167", "7566134950601297167", "93a53ca3240d4f576a505807f8ff0042", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冰夏 = EffectMeta("冰夏", True, "7258221827485486393", "7258221827485486393", "d6a3a5ee2c52a32842ba9c269e4c7fde", [])
冰清玉洁 = EffectMeta("冰清玉洁", True, "7433451697764158747", "7433451697764158747", "2e90ce70a5ee54d918c7fd1e86fab6b8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冰清蓝 = EffectMeta("冰清蓝", True, "7494313060480388389", "7494313060480388389", "b7e789f7e334a6b4f75dc3037f50fdee", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冰瀑 = EffectMeta("冰瀑", True, "7196927862056701240", "7196927862056701240", "9691bde0838975e3573faad0791d3cdf", [])
冰茶 = EffectMeta("冰茶", True, "7131399016771800357", "7131399016771800357", "ab44066c23ab6639ca6ff5eb2b850582", [])
冰蓝印染 = EffectMeta("冰蓝印染", True, "7585168530518134067", "7585168530518134067", "a754e171fe1866494c6ac890d0e5f018", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冰雪白 = EffectMeta("冰雪白", True, "7462637393783360809", "7462637393783360809", "7dd656b0f9320d3130691567c6ee1645", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冷叙 = EffectMeta("冷叙", True, "7159132840179895590", "7159132840179895590", "c60635dea7f7a6df2ba9b1e08fee006e", [])
冷墨 = EffectMeta("冷墨", True, "7300751893813366053", "7300751893813366053", "e6d9891ef7f02898055a16f11a8750bc", [])
冷月夜 = EffectMeta("冷月夜", True, "7281165355353951543", "7281165355353951543", "0a9aaba6174a6b1a46d78365bd7fa0c4", [])
冷萃 = EffectMeta("冷萃", True, "7177729481300364548", "7177729481300364548", "a7500c67b168c4ff886e0329b3662399", [])
冷调CCD = EffectMeta("冷调CCD", True, "7434467628422270220", "7434467628422270220", "4b508c7a838560659d4acca26a7ffea0", [])
冷调微曝 = EffectMeta("冷调微曝", True, "7528075579602554150", "7528075579602554150", "a60ffcd1574d6f04db2f914e66d74764", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
冷透 = EffectMeta("冷透", True, "7127824802819116302", "7127824802819116302", "06655076bb1cf6ce7c6e3b23d027496f", [])
净白 = EffectMeta("净白", True, "7127667352782572807", "7127667352782572807", "c13995808d8fbfdf9ed2b9f2873dfea7", [])
净透 = EffectMeta("净透", True, "7127666004477414687", "7127666004477414687", "bc8357fb00d1824e2ceaed463bc611b6", [])
凛冬电影感 = EffectMeta("凛冬电影感", True, "7569645361694870818", "7569645361694870818", "d075ebbc8e964539adb965190f6d675d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
初雪电影感 = EffectMeta("初雪电影感", True, "7564852301807078694", "7564852301807078694", "21db6f90b7786c09f34c29e92287deda", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
加州落日 = EffectMeta("加州落日", True, "7498004563954322726", "7498004563954322726", "9274335a725277627eb10c958358f367", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
动漫小镇 = EffectMeta("动漫小镇", True, "7604510820105522468", "7604510820105522468", "f04e4d343f385abbce3b7ac0540e67c6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
劲闯 = EffectMeta("劲闯", True, "7248568097660013864", "7248568097660013864", "9822ae48045e256dfb2ca2369c368d47", [])
北海道II = EffectMeta("北海道II", True, "7563691938076003622", "7563691938076003622", "89c08f8f084f991cbc00ce4fe90b503b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
千禧潮酷 = EffectMeta("千禧潮酷", True, "7513608221735554330", "7513608221735554330", "61e92e952bc3a99617ffabe355fed07e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
半衫 = EffectMeta("半衫", True, "7145391402661334280", "7145391402661334280", "a4d67ea33ac459b1e0c2ab4677ebb3b1", [])
南法午后 = EffectMeta("南法午后", True, "7436724426416131347", "7436724426416131347", "c6a4a88a9d830d19f666b708a231dbdf", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
原生肤 = EffectMeta("原生肤", True, "7366582938638503187", "7366582938638503187", "8dc66d930e2420c9c035182ddbd3d627", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
原生自然 = EffectMeta("原生自然", True, "7473037215426153728", "7473037215426153728", "7db0af0929986a1d6a72425f03c97ec7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
原野 = EffectMeta("原野", True, "7271281225115897140", "7271281225115897140", "fd213d120b3cb62c0128c73f24cba6a9", [])
去灰 = EffectMeta("去灰", True, "7453118140151647538", "7453118140151647538", "52bb13eca2bc17f32a5250a130420e94", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
去灰II = EffectMeta("去灰II", True, "7226991425160858937", "7226991425160858937", "e58c1b8d3539cb1e89c37dc56b934369", [])
去灰高清 = EffectMeta("去灰高清", True, "7436400247540141348", "7436400247540141348", "8fa6afa7dcdaed7d26d2829aece5dca0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
去雾 = EffectMeta("去雾", True, "7564322465548274968", "7564322465548274968", "40ad834a70769697cfa489d615456329", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
去黄 = EffectMeta("去黄", True, "7302338306849656127", "7302338306849656127", "f4fcb8afc69acb229dec8764320e42a3", [])
去黄韩系 = EffectMeta("去黄韩系", True, "7598448281483529510", "7598448281483529510", "eadb59ee11ac606b058f4573daf3604e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
反差富士 = EffectMeta("反差富士", True, "7403222365217295667", "7403222365217295667", "60bcb4eb31327c764963919972a31628", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
反差色 = EffectMeta("反差色", True, "7542896143949106472", "7542896143949106472", "3e8d3b4af537ad3b0dffcc96afde969c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
发光CCD = EffectMeta("发光CCD", True, "7434468515576319295", "7434468515576319295", "56442b377a1b22860018e387ca1d9ea2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
叠阳 = EffectMeta("叠阳", True, "7148961858320354573", "7148961858320354573", "852e9a57b27c6d6f4e71b65be8f43927", [])
古早像素 = EffectMeta("古早像素", True, "7470614335644077375", "7470614335644077375", "c874f99264828b3f179288d81745cf42", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早回忆 = EffectMeta("古早回忆", True, "7449798505385790746", "7449798505385790746", "26a8a7b5705761b5c26d49532a0e74ec", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早回忆录 = EffectMeta("古早回忆录", True, "7594878732377099556", "7594878732377099556", "e22b4ea46238ff1ac9fa7779c5e53d33", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早复古 = EffectMeta("古早复古", True, "7457910812439596339", "7457910812439596339", "b2884dc7ce5cc92bab1179ca2e31db35", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早宝丽来 = EffectMeta("古早宝丽来", True, "7586692127833328896", "7586692127833328896", "4492ecb382f769abb5dbc47e66dbbfc0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早感胶片 = EffectMeta("古早感胶片", True, "7576707005788867875", "7576707005788867875", "4a644380b4e7f7f395abbd77162f855f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早时光 = EffectMeta("古早时光", True, "7560702007405792552", "7560702007405792552", "0d0cf3147b5f99874e0f0d6fa838a191", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早画质 = EffectMeta("古早画质", True, "7557963448068361510", "7557963448068361510", "5e728e8ab18877bb79014a43b28e805e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古早记忆 = EffectMeta("古早记忆", True, "7366562482812456255", "7366562482812456255", "3a6086410283e0166d65d7935faa3809", [])
古早高曝 = EffectMeta("古早高曝", True, "7596354290730552622", "7596354290730552622", "6b64e499637b252f3c34d42dc07b02f3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古罗马电影 = EffectMeta("古罗马电影", True, "7596692097164479807", "7596692097164479807", "ccf1e60405598efb12146a11207a51e7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
古都 = EffectMeta("古都", True, "7127615616525126949", "7127615616525126949", "ce6f674fe7eebb2be94a3784496d2d4f", [])
史诗电影 = EffectMeta("史诗电影", True, "7591041766158109952", "7591041766158109952", "b8c7fb31ac7bc75cbb4634295a5a0531", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
吉宵 = EffectMeta("吉宵", True, "7190241639070174503", "7190241639070174503", "14910132a5caef71f9fa0a1076098026", [])
向晚 = EffectMeta("向晚", True, "7226254370084490554", "7226254370084490554", "f16c7f86eb94ede08374f3485d9de7f6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
味蕾 = EffectMeta("味蕾", True, "7281166220794055997", "7281166220794055997", "04205b3010d2adedb961380ceb679a6b", [])
和歌山 = EffectMeta("和歌山", True, "7210651068324285754", "7210651068324285754", "50e01f465c3dc235b925e5a43ed901eb", [])
哈苏I = EffectMeta("哈苏I", True, "7291596720956329266", "7291596720956329266", "df3882769e455938b11f5596ac569e49", [])
哈苏II = EffectMeta("哈苏II", True, "7291560741885480250", "7291560741885480250", "498b45335903ffa59cef94ac0376fd38", [])
哈苏蓝 = EffectMeta("哈苏蓝", True, "7361792059109313811", "7361792059109313811", "45392b51287027d5fa5249495c6a9007", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
哥谭 = EffectMeta("哥谭", True, "7337928347118275890", "7337928347118275890", "25575caefd72dfcac744d7aa717d4c1f", [])
喜气新春 = EffectMeta("喜气新春", True, "7593257815104359706", "7593257815104359706", "b71e1450a077e3a15964e7713a090b4e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
围炉暖食 = EffectMeta("围炉暖食", True, "7586719222160543017", "7586719222160543017", "dcd16de43df57da7072ca377ae7c1f49", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
国民旧照 = EffectMeta("国民旧照", True, "7511971221785922826", "7511971221785922826", "b188101c8e03b870871faac571033dd9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
国风电影 = EffectMeta("国风电影", True, "7409572381775138067", "7409572381775138067", "8600273a392d0e967d9671cd20ec0899", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣善夜 = EffectMeta("圣善夜", True, "7175100386007584060", "7175100386007584060", "d67a3e3c70791b034ccbd201de89908d", [])
圣诞回忆录 = EffectMeta("圣诞回忆录", True, "7447162094572686592", "7447162094572686592", "58f5e01abfb26b8db86ef923ffc35f9b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞愿景 = EffectMeta("圣诞愿景", True, "7428162298436537627", "7428162298436537627", "beff3bd9341b5517c97c23eafe24983a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞拍立得 = EffectMeta("圣诞拍立得", True, "7438160882837835018", "7438160882837835018", "29632de266432a7808e62d5e4d499637", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞胶片 = EffectMeta("圣诞胶片", True, "7446290147697528076", "7446290147697528076", "3ac6eccb0ca00d99893cfbb531277c19", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞萌宠 = EffectMeta("圣诞萌宠", True, "7582150382516718894", "7582150382516718894", "92c39ebbc96838de2b1969efc2355822", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞闪胶II = EffectMeta("圣诞闪胶II", True, "7446329592119332108", "7446329592119332108", "d2f78c92985d2e02e1ae6819abf6b30f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞闪胶III = EffectMeta("圣诞闪胶III", True, "7446329549283020068", "7446329549283020068", "57a64e2f7d3aef1cc73b9724a37093c3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
城市赏月II = EffectMeta("城市赏月II", True, "7405206230550973731", "7405206230550973731", "86ea7d3bdd6f5605d8d0d7e2e5a92200", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
增色 = EffectMeta("增色", True, "7283013745788357925", "7283013745788357925", "c1dffcebde80cca62c000f8f023065c8", [])
增色II = EffectMeta("增色II", True, "7411476796526300452", "7411476796526300452", "8794bb983e61ab36704bbc7b6c964237", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
增质CCD = EffectMeta("增质CCD", True, "7500847387959708978", "7500847387959708978", "41f83b3a2e4e741112b4b98e83735eb4", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
增质去雾 = EffectMeta("增质去雾", True, "7565956901322706226", "7565956901322706226", "87a0c1800f94528adee80264a2053079", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
墨林 = EffectMeta("墨林", True, "7271284653816843554", "7271284653816843554", "a311fa20eacf38b912c183627e008ff5", [])
墨色胶卷 = EffectMeta("墨色胶卷", True, "7580008561884040473", "7580008561884040473", "7ada28b6fbb803b70e15ba8f56ae31bc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
复古电影感 = EffectMeta("复古电影感", True, "7479800436778732863", "7479800436778732863", "ac5a841a4e7a08b12c69e43da470768f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
复古蓝调 = EffectMeta("复古蓝调", True, "7449048492665834779", "7449048492665834779", "d00d1242160522fdbdb8b5d694549728", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夏威夷 = EffectMeta("夏威夷", True, "7159140854601469223", "7159140854601469223", "616966578de6ebccae6b5eaa5b914d82", [])
夏日粉 = EffectMeta("夏日粉", True, "7261469707138518283", "7261469707138518283", "b667443ab8554ad725bd72bb9cabab2b", [])
夏日紫霞 = EffectMeta("夏日紫霞", True, "7508030199255026970", "7508030199255026970", "e2511ed7c2027e8df0205c3dc96116cf", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
多巴胺 = EffectMeta("多巴胺", True, "7237441824611224889", "7237441824611224889", "83ec0f2e61d762e17830bd55ca08e8d3", [])
夜拍闪曝 = EffectMeta("夜拍闪曝", True, "7494135245709610275", "7494135245709610275", "775c6fd432cc8c187c473b1ea109b0d4", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夜拍高光 = EffectMeta("夜拍高光", True, "7462637606052941095", "7462637606052941095", "f7ba4b96c56acc96fa7c86f1e13f1c43", [])
夜景人像增强 = EffectMeta("夜景人像增强", True, "7493208490832317705", "7493208490832317705", "c2574ae2684de016ee740b78b2c6064d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夜景去雾 = EffectMeta("夜景去雾", True, "7525110001959030042", "7525110001959030042", "c5744f7e50df98655bcdc4101a19b768", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夜景增色II = EffectMeta("夜景增色II", True, "7411477748130139403", "7411477748130139403", "1be937803f18855a2ee12a82c6d8c30a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夜焰 = EffectMeta("夜焰", True, "7185289606600953092", "7185289606600953092", "fdafbb7b837d162b7ff32cbb0f130da4", [])
夜雾 = EffectMeta("夜雾", True, "7168110568673479948", "7168110568673479948", "e6b2ff75ac938639d840ec586264c2f5", [])
大吉岭 = EffectMeta("大吉岭", True, "7175076362997288230", "7175076362997288230", "d6138cfc775b365ce144308d5a7c46d9", [])
大疆4Pro = EffectMeta("大疆4Pro", True, "7534412681785183540", "7534412681785183540", "5a2dba430109143ef37b0547ae287381", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
大疆电影感 = EffectMeta("大疆电影感", True, "7512706064693988645", "7512706064693988645", "2a70d8e43f4cec20b20d602da4e60676", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
大雪纷飞 = EffectMeta("大雪纷飞", True, "7569682767080901897", "7569682767080901897", "7bdb1acf6b3066b67924788e5e773dab", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奥林巴斯 = EffectMeta("奥林巴斯", True, "7361792068475325735", "7361792068475325735", "a523adb5976eb5a39d963683f520551f", [])
奥罗拉 = EffectMeta("奥罗拉", True, "7269236283019463972", "7269236283019463972", "2a04fac3df136d4135b8ea94aa7d604a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奶呼萌宠 = EffectMeta("奶呼萌宠", True, "7395972887133441307", "7395972887133441307", "7278a8d1ae246098e7f8db233bbec459", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奶昔 = EffectMeta("奶昔", True, "7172169921726565670", "7172169921726565670", "ca0cc9a987f8eca36ac97a5b5d6a5327", [])
奶油II = EffectMeta("奶油II", True, "7474592762331942184", "7474592762331942184", "4a972233f7836fd91773131bdba27488", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奶油柔肤 = EffectMeta("奶油柔肤", True, "7482412177760996646", "7482412177760996646", "a64d8790c1f50c529d66b382290fbabc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奶油白 = EffectMeta("奶油白", True, "7398438142321134898", "7398438142321134898", "48358ee1c48f7293c4148609e736337f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奶油白肤 = EffectMeta("奶油白肤", True, "7459030855810387251", "7459030855810387251", "325c15b25296e24fe16c44d4732c939c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奶油美食 = EffectMeta("奶油美食", True, "7480210942026927423", "7480210942026927423", "406786a335a27c96d88acdb491582c6b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
奶油风萌宠 = EffectMeta("奶油风萌宠", True, "7510488117430734118", "7510488117430734118", "9088ec10dbd831542695d8522ba43007", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
好莱坞I = EffectMeta("好莱坞I", True, "7226994281414692155", "7226994281414692155", "b255b7959f2c621cdbc5aa7cda9e7583", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
好莱坞II = EffectMeta("好莱坞II", True, "7226995248814165308", "7226995248814165308", "41348d00e1ab4f1dbe6832f8b6224c13", [])
好莱坞III = EffectMeta("好莱坞III", True, "7312617341710372107", "7312617341710372107", "59b8ade3560f637686d6e4b0f56f97fe", [])
好莱坞IV = EffectMeta("好莱坞IV", True, "7312647197462367524", "7312647197462367524", "12657ebf4545c621bc0ca38944b9712c", [])
嬉皮士 = EffectMeta("嬉皮士", True, "7131431284403981605", "7131431284403981605", "218af350afd9de1bfdd017218e7eeae4", [])
子弹列车 = EffectMeta("子弹列车", True, "7202480777387445507", "7202480777387445507", "ee8aa0105ea992ace4fc114c34b08adc", [])
安塞尔灰调 = EffectMeta("安塞尔灰调", True, "7581301466128780569", "7581301466128780569", "7caa7c44123efa5c56df0953a01a0c86", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
安藤调 = EffectMeta("安藤调", True, "7607806312822443289", "7607806312822443289", "46510f4b879087ceeca71f04fdbe4c67", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
安西娅 = EffectMeta("安西娅", True, "7270142995712773415", "7270142995712773415", "85e046726dee3b398e38a3d31b48e500", [])
宝丽来SX70 = EffectMeta("宝丽来SX70", True, "7600301036787600667", "7600301036787600667", "cfb1689fbd6075cdba01aaa046cf5ca6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
家宴 = EffectMeta("家宴", True, "7330584144524643595", "7330584144524643595", "1cb453a49c768a3f9c086b047321c233", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
宿营 = EffectMeta("宿营", True, "7127822311708691726", "7127822311708691726", "e8ad70a709e7a37282ee64779c874732", [])
富士CC_I = EffectMeta("富士CC I", True, "7268561936344780086", "7268561936344780086", "069ae1d53dc300c85b017cdf6df18550", [])
富士NC_I = EffectMeta("富士NC I", True, "7159156535640296737", "7159156535640296737", "bdce583bf77430b24e9f7d78d40a69eb", [])
富士NC_II = EffectMeta("富士NC II", True, "7159408376378559747", "7159408376378559747", "0fce68168c67f99c11bf1e05e933eb79", [])
富士NC_III = EffectMeta("富士NC III", True, "7159134459088899339", "7159134459088899339", "25f1e0d1d5997b56577a96de8de2005d", [])
富士NN = EffectMeta("富士NN", True, "7447157317457513743", "7447157317457513743", "015e667b8a037ff32dd679f96b40963d", [])
富士XT5 = EffectMeta("富士XT5", True, "7535108076081335606", "7535108076081335606", "fd1d1579efa189af1ce1380e36f78bce", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
富士x100 = EffectMeta("富士x100", True, "7394357532912782629", "7394357532912782629", "fc5765383ceef36fc858b8c4a4430bb8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
富士电影 = EffectMeta("富士电影", True, "7497919307628825866", "7497919307628825866", "50d92e8eabe03ff923e404ab3afdc371", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
富士蓝 = EffectMeta("富士蓝", True, "7246720031118101816", "7246720031118101816", "ca146f44fb50a5c1335149b2c1bd0079", [])
富士蓝II = EffectMeta("富士蓝II", True, "7226994246471945530", "7226994246471945530", "43bee1438c8372b1f4a8857650fab808", [])
富士青 = EffectMeta("富士青", True, "7226994214029184313", "7226994214029184313", "77bfdff2d848539626acd538429cc660", [])
富春山居 = EffectMeta("富春山居", True, "7208496124779302177", "7208496124779302177", "f5ef0379f91fb0004e2886a3bef4e9ce", [])
小清新 = EffectMeta("小清新", True, "7482421927462653220", "7482421927462653220", "b0cd714c67da47fb1fbd05c4c9b9e577", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
小美好 = EffectMeta("小美好", True, "7468493795479276835", "7468493795479276835", "7d678f329443e66ad181f12a46e2df8c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
小麦色 = EffectMeta("小麦色", True, "7362076973981584691", "7362076973981584691", "ea639b8e75457d08c026eb753f8704e5", [])
尘杏 = EffectMeta("尘杏", True, "7131630640646081822", "7131630640646081822", "653c8a4ffafe89ec8a1b2ac30a8b249e", [])
尘烟 = EffectMeta("尘烟", True, "7148958479326153991", "7148958479326153991", "946cbb3cd0096e46d11cd91630bcd1bc", [])
山晴 = EffectMeta("山晴", True, "7246723856222719269", "7246723856222719269", "acbd5fdb5b04114a6eedffdf716ed6b3", [])
山本 = EffectMeta("山本", True, "7156638423191784735", "7156638423191784735", "2516de8cc9f3c5ba7e3d02cc9b7a709e", [])
山海诗篇 = EffectMeta("山海诗篇", True, "7603667447308389657", "7603667447308389657", "e8a63c858f97ec7d7788d0cd76c1f1d6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
岚夏 = EffectMeta("岚夏", True, "7260771472107441471", "7260771472107441471", "5d9760bfa20e1745f2da9d0dddc1f8f3", [])
岩灰 = EffectMeta("岩灰", True, "7221472488079904060", "7221472488079904060", "fdd078505b4a102962d962cf461e9544", [])
川秋电影感 = EffectMeta("川秋电影感", True, "7561143628266065204", "7561143628266065204", "d1b0a5b3e939e062bd3bbb196f7fd3c3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
川野 = EffectMeta("川野", True, "7361032844484857142", "7361032844484857142", "59694a68c2ed99fd1822b9d728532d51", [])
市井 = EffectMeta("市井", True, "7145394707156323591", "7145394707156323591", "3135422526252e5674d585a4d099dd97", [])
幽海 = EffectMeta("幽海", True, "7262350396566342975", "7262350396566342975", "280e721f50df8e0ee622da68f4879f91", [])
底特律 = EffectMeta("底特律", True, "7336763348492553499", "7336763348492553499", "d1bcdfe293f329d701a0df1ef4ab5e16", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
庙会 = EffectMeta("庙会", True, "7185309693131148555", "7185309693131148555", "e36b0d36967b31a89a953c35ca01e387", [])
弥晖 = EffectMeta("弥晖", True, "7148812815246134541", "7148812815246134541", "ad4ca90087a6855a24e76e5bc7bfcf66", [])
强曝光 = EffectMeta("强曝光", True, "7568386153783512335", "7568386153783512335", "fc45f26a2287be60b36ed575393d2e4e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
彩光 = EffectMeta("彩光", True, "7127824109093866760", "7127824109093866760", "0aeae3c00b2ff3d26f0bba78a0f0cda5", [])
影忆 = EffectMeta("影忆", True, "7379137689599167779", "7379137689599167779", "c5613205380a0465924690e83fa63f28", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
影石4k = EffectMeta("影石4k", True, "7604153795639135497", "7604153795639135497", "ef35e24492b097e1c5344cadb8254cf0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
影部 = EffectMeta("影部", True, "7168136171673963787", "7168136171673963787", "57ebfdd7bdad96f19879e1635d823fb8", [])
往事 = EffectMeta("往事", True, "7530879877180919049", "7530879877180919049", "4d90e27eed027ffa92b9f512ee7d0daf", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
徕卡I = EffectMeta("徕卡I", True, "7268562944093408523", "7268562944093408523", "91730e54e94b7eeb40bcfbd8f7c9a3cf", [])
徕卡II = EffectMeta("徕卡II", True, "7268563047776587020", "7268563047776587020", "a75e26160d19e9db7d9be10f6e8056b7", [])
徕卡Q2 = EffectMeta("徕卡Q2", True, "7500447762404724018", "7500447762404724018", "44b1d99f86da8399aeb745061acaf9b5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
徕卡银盐 = EffectMeta("徕卡银盐", True, "7601116367005175067", "7601116367005175067", "ee383f4b01c7e4dcb46c799b2c9ab6f9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
心动夏 = EffectMeta("心动夏", True, "7261461692096220428", "7261461692096220428", "daffbda5fec8238d91024cb36610023d", [])
忆山 = EffectMeta("忆山", True, "7271278427309755688", "7271278427309755688", "919dd48c0590b884f6aabc4f46f63b3f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
忆时 = EffectMeta("忆时", True, "7266325161433910591", "7266325161433910591", "606029f145342308907b3422f6c6872c", [])
快照II = EffectMeta("快照II", True, "7143760738765655310", "7143760738765655310", "94a1e1cdca9b003126ac25d1df655263", [])
怀旧 = EffectMeta("怀旧", True, "7494564488704806198", "7494564488704806198", "a20fb046d1381d7c948151543932f934", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
怦然心动 = EffectMeta("怦然心动", True, "7195889899738909990", "7195889899738909990", "48ce7e2b8db89c5f411f53d6d7750cb7", [])
恍光 = EffectMeta("恍光", True, "7237446176629345593", "7237446176629345593", "9c7e3ff19468cb967d0ff9b0d79ea23d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
情感故事电影 = EffectMeta("情感故事电影", True, "7509005376835079439", "7509005376835079439", "dcc9eccd46b98f0fcf40bfdee83940fe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
情辉 = EffectMeta("情辉", True, "7329826553477565705", "7329826553477565705", "50b73c148b43973bedc2e6168a1638f5", [])
慕斯 = EffectMeta("慕斯", True, "7261185427703418169", "7261185427703418169", "038504b6474c25b4ce735d1d165c4198", [])
扬帆远航 = EffectMeta("扬帆远航", True, "7487297020743404810", "7487297020743404810", "805da3fa2ca3e11f631e4b4534d3230c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
拐杖糖 = EffectMeta("拐杖糖", True, "7175093825659079991", "7175093825659079991", "de11b072c9e793ee23a87de1f7265880", [])
捕风 = EffectMeta("捕风", True, "7248566556593098024", "7248566556593098024", "2ebec31165718f44bbd2ecbc338c175a", [])
摩登 = EffectMeta("摩登", True, "7131219052021779719", "7131219052021779719", "178dab15fb53b396f20c89ccaec799a2", [])
撕拉拍立得 = EffectMeta("撕拉拍立得", True, "7502647335218941220", "7502647335218941220", "604d0b6a7b3b23a0169e1dfd38deccba", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
攀岩 = EffectMeta("攀岩", True, "7195930274918567180", "7195930274918567180", "928cb605e08b3e72110837d55afaa9d9", [])
文艺少女 = EffectMeta("文艺少女", True, "7409360036096527670", "7409360036096527670", "4e871014a6115b63b432b99e127bcfef", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新中式电影感 = EffectMeta("新中式电影感", True, "7493945636518104360", "7493945636518104360", "ea98a825bea08eae7b908e111bb6b428", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新宿 = EffectMeta("新宿", True, "7210646550974876984", "7210646550974876984", "1bb8524cde9b57773015e98ba17e0f7d", [])
新年喜市 = EffectMeta("新年喜市", True, "7449639936292031781", "7449639936292031781", "a2981bc6a7e88a697bfd4135167febbc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新年欢愉 = EffectMeta("新年欢愉", True, "7452802706139352370", "7452802706139352370", "8681ba97d1c52b8bf7cd6bf46d4eb340", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新年电影感 = EffectMeta("新年电影感", True, "7582425874620747008", "7582425874620747008", "3d97863fb08a128b41df65bae1b3f003", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新年红 = EffectMeta("新年红", True, "7449639891694112010", "7449639891694112010", "1f4ee7c68ba5b40b13598d2688815c01", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新年红气 = EffectMeta("新年红气", True, "7586522353278962984", "7586522353278962984", "5aaf75b3818098ad583374700c0830ca", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新年顺意 = EffectMeta("新年顺意", True, "7603025037431541027", "7603025037431541027", "7f5b32c930d643d8d99183d71f2cc51b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新颜 = EffectMeta("新颜", True, "7188018091496951077", "7188018091496951077", "322f374bbff6d0399ee12136889818d9", [])
日光吻 = EffectMeta("日光吻", True, "7226985203540053305", "7226985203540053305", "12c40e5f562e2f080e7ae157b1b925a8", [])
日出增色 = EffectMeta("日出增色", True, "7526422478206356787", "7526422478206356787", "6074c700577f7d04bf32f6a92b48d7b9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日出时刻 = EffectMeta("日出时刻", True, "7551097988878273826", "7551097988878273826", "701dde0ef765472e2db82ab093a560b9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日料寿司 = EffectMeta("日料寿司", True, "7507632191380229402", "7507632191380229402", "60cddb5817475d59ae022444a47f5e7e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日漫增色 = EffectMeta("日漫增色", True, "7493804773515316491", "7493804773515316491", "1e99ad9eaf4572e8a813993ed7971466", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日漫清新 = EffectMeta("日漫清新", True, "7439037715825413413", "7439037715825413413", "583935b5a865d92247472e4ea8fb1a6c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日系增色 = EffectMeta("日系增色", True, "7472373777469328667", "7472373777469328667", "edf1bd45853137dfc8d34657839b082f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日系春和 = EffectMeta("日系春和", True, "7473805992308837659", "7473805992308837659", "345cff234af4dc0b6c906d8def6b11c6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日落增色 = EffectMeta("日落增色", True, "7468875753661173004", "7468875753661173004", "5bc34c329c1eb63913ae46655244495a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日落时刻 = EffectMeta("日落时刻", True, "7496524092779105551", "7496524092779105551", "c2e34cb2efeb788a5899bfffb6989ac8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
日落晚霞 = EffectMeta("日落晚霞", True, "7528332870654414142", "7528332870654414142", "e9bb836a8ab978a2c71a3df73a1f63f9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
旧时代II = EffectMeta("旧时代II", True, "7232217903536409893", "7232217903536409893", "779a72d4b71cd42f470008749a165d93", [])
旧时来信 = EffectMeta("旧时来信", True, "7366562830486621459", "7366562830486621459", "1680dbb9fafa20e0a3c81e56b038508f", [])
旧曲 = EffectMeta("旧曲", True, "7266320092386938124", "7266320092386938124", "d95b63cc01d7d71f705b7a22861bbe08", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
旧金山 = EffectMeta("旧金山", True, "7159161900389977382", "7159161900389977382", "22f238fa32975ad165c124316008ab31", [])
时尚极简 = EffectMeta("时尚极简", True, "7549604752934325556", "7549604752934325556", "d93470ec52e92bb643b5cbfaee42bcbe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
旷野 = EffectMeta("旷野", True, "7275698024892943655", "7275698024892943655", "5d52166c545e774971e36e50cb218f04", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
旷野自然 = EffectMeta("旷野自然", True, "7501717343156981046", "7501717343156981046", "1322b0aef7226539eb2a3cead86fa495", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
旷野蓝 = EffectMeta("旷野蓝", True, "7131513310733765918", "7131513310733765918", "afa609a1dc4092fbb0eeb87363894c76", [])
明亮春味 = EffectMeta("明亮春味", True, "7485240505257807138", "7485240505257807138", "bfb5aa3c2feef58512926f11c85cab93", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
明亮焕晴 = EffectMeta("明亮焕晴", True, "7470840671763565864", "7470840671763565864", "2de92eefc7b02e03fef523e65677073d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
明媚春景 = EffectMeta("明媚春景", True, "7482055184554806566", "7482055184554806566", "377e50499a9d84cd54bf6f326941f492", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
明媚春色 = EffectMeta("明媚春色", True, "7611007721336311046", "7611007721336311046", "5a6408eaf62091f0fbd7dc566eec6268", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
明媚自然 = EffectMeta("明媚自然", True, "7480823852470177034", "7480823852470177034", "5142e281e72f62ec65c1a801e0b88371", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
明媚透亮 = EffectMeta("明媚透亮", True, "7506413750665121060", "7506413750665121060", "707fbbec9a4b7a298c65151f73bbbdd5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春和 = EffectMeta("春和", True, "7327596304173944127", "7327596304173944127", "dc13ebbcf22161cf0053e75c2d3b7f90", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春喜 = EffectMeta("春喜", True, "7325335963318750515", "7325335963318750515", "fba27053f1a0a40cc1c97e91f61bdc19", [])
春天淡彩 = EffectMeta("春天淡彩", True, "7479295356488977679", "7479295356488977679", "518c1fb623f3d4556e087e5f1d2b9b87", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春忆胶卷 = EffectMeta("春忆胶卷", True, "7483069698981104947", "7483069698981104947", "52c2d6550b16560a5b247db65e3c6b8b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春日序 = EffectMeta("春日序", True, "7477922252470652198", "7477922252470652198", "071a79fd559e4b05428cc4c83ac4c755", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春日樱 = EffectMeta("春日樱", True, "7493076668009958668", "7493076668009958668", "442fd0d11f067faeeb2c47e2500d30f7", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%"""
春日清晰 = EffectMeta("春日清晰", True, "7477594530104085770", "7477594530104085770", "d19642d2f9573e92254abf9914e55ce7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春日清透 = EffectMeta("春日清透", True, "7485293187616066831", "7485293187616066831", "848bc05cfb1e5e7b9716ba47552407e8", [])
春日温柔 = EffectMeta("春日温柔", True, "7477942092459773193", "7477942092459773193", "d5b6cb8dbb0c0def9f49055c04bcc942", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春日美食III = EffectMeta("春日美食III", True, "7486868815364492554", "7486868815364492554", "cb202891744256abbd40cfe028092216", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春日花田 = EffectMeta("春日花田", True, "7611799763343789318", "7611799763343789318", "491659913f37f344c2f1f3d9a4b4f412", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春日花间 = EffectMeta("春日花间", True, "7472064159065132325", "7472064159065132325", "59c64d43a532ecebca203a3e4f84b190", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春日韩胶 = EffectMeta("春日韩胶", True, "7481494936836197641", "7481494936836197641", "76e9e0b4346020ba2915cb56eecfcf64", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春桃肤 = EffectMeta("春桃肤", True, "7483917188638772517", "7483917188638772517", "23bead4c25fd90d46521297cc16c6bec", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春橙肤 = EffectMeta("春橙肤", True, "7481693425218194725", "7481693425218194725", "2198cca5453c2bdc16b9e61ac361619f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春游踏青 = EffectMeta("春游踏青", True, "7493581083628408102", "7493581083628408102", "234d177e20bb230887116e469115e40b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春禧电影感 = EffectMeta("春禧电影感", True, "7594482003286838564", "7594482003286838564", "a8ef748c0a0014bfb43aa35163be244f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
春风 = EffectMeta("春风", True, "7148963827239963918", "7148963827239963918", "ae9468b81643a706f5cae5761eff19b8", [])
昭和 = EffectMeta("昭和", True, "7195780237790154042", "7195780237790154042", "211b05e6793f255052a1cc463864ed3d", [])
晚宴 = EffectMeta("晚宴", True, "7302041028205333786", "7302041028205333786", "af499ef2d522dda0857f2be9c7db00d0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晚柠 = EffectMeta("晚柠", True, "7262634564428778752", "7262634564428778752", "b9058248c373fa4f49357e1c878ab6cb", [])
晚樱 = EffectMeta("晚樱", True, "7127609541839129886", "7127609541839129886", "c30e126bfe5accdb5902c5ba63c8579e", [])
晨旭 = EffectMeta("晨旭", True, "7279062968501832972", "7279062968501832972", "7450c20e328d6fc45b648d999806f2e8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
普林斯顿 = EffectMeta("普林斯顿", True, "7127615578705104135", "7127615578705104135", "ab9e14d92af596b94e91fd6253b510cd", [])
景明 = EffectMeta("景明", True, "7329530921755888915", "7329530921755888915", "ba919353aaafdf60651a9189c760142e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴冬暖阳 = EffectMeta("晴冬暖阳", True, "7571508644982902059", "7571508644982902059", "0e657b54dcc856b331f9bc5468f075ba", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴天 = EffectMeta("晴天", True, "7420253131079961868", "7420253131079961868", "df2d876976f447b305a67db1b43d070e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴天亮丽 = EffectMeta("晴天亮丽", True, "7454234032570764581", "7454234032570764581", "590feb6405078fdae397cc40bc72dd7c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴天增色 = EffectMeta("晴天增色", True, "7454234028141497610", "7454234028141497610", "a402e1fe28509c7046627674a1efabf8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴天灿烂 = EffectMeta("晴天灿烂 ", True, "7486890449207151891", "7486890449207151891", "a031700fb1a1b957e763b59c779db325", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴好 = EffectMeta("晴好", True, "7281163707227344189", "7281163707227344189", "8ab42295fd5c3f9671dc860cab4cf822", [])
晴好风光 = EffectMeta("晴好风光", True, "7475397942715632922", "7475397942715632922", "026f69b8fbc1fedb3eb0939366c6617e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴山质感 = EffectMeta("晴山质感", True, "7542495542429879562", "7542495542429879562", "3cbf0062169ef8bfdd1ec2fda7b4a7ed", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴春 = EffectMeta("晴春", True, "7346542846863887635", "7346542846863887635", "ed510f73b526d21d1fcabfc410f664b8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴春奶蓝 = EffectMeta("晴春奶蓝", True, "7485769123176254770", "7485769123176254770", "16093c7dc49cdbf9fc2071831d96db5c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴朗 = EffectMeta("晴朗", True, "7434746357233028390", "7434746357233028390", "c1298ed66eed37d0f9a1ad78fa7239ee", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴海 = EffectMeta("晴海", True, "7363996374083407140", "7363996374083407140", "ccf259f7a3b758c500f93e4ed925587d", [])
晴秋 = EffectMeta("晴秋", True, "7410233668351937846", "7410233668351937846", "df72e5506e6db975a692345ffe3f3e94", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴空 = EffectMeta("晴空", True, "7127558139058179342", "7127558139058179342", "5b5899ce01e0aac5b8f15a2f77c4ee62", [])
晴空漫游 = EffectMeta("晴空漫游", True, "7477810373060611338", "7477810373060611338", "37a68a5bac333f74da7afac747de12bd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴肤 = EffectMeta("晴肤", True, "7365842976691604763", "7365842976691604763", "c3d640b01c7bb7f6ab7ebd598bf92811", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴谷 = EffectMeta("晴谷", True, "7307191907514420491", "7307191907514420491", "2ad917b1c9f293648cf453201987fe5d", [])
晶莹雪肤 = EffectMeta("晶莹雪肤", True, "7592615852252335394", "7592615852252335394", "c8ba6aaf1fb2f851b3596c17088e2909", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晶透 = EffectMeta("晶透", True, "7199095242476293435", "7199095242476293435", "17e30bbde014d6688a3b00203a7a8ea8", [])
智能光线 = EffectMeta("智能光线", True, "7451897248885099795", "7451897248885099795", "79973825711b46f78f955ee564f2b122", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暖晨 = EffectMeta("暖晨", True, "7312646382395936010", "7312646382395936010", "03737fce45a4ba22d225edbe7e36a04c", [])
暖阳冬日 = EffectMeta("暖阳冬日", True, "7572802123021290787", "7572802123021290787", "228d775f95ae46401bd487827c7e6d22", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暖雾晨光 = EffectMeta("暖雾晨光", True, "7595404603575782707", "7595404603575782707", "54794bfd66cf2beeafcc2a48e23b6d5f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暖食增色 = EffectMeta("暖食增色", True, "7533181577170373934", "7533181577170373934", "0355f51d9ff2c44036c5058e7db73ba2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暖黄 = EffectMeta("暖黄", True, "7127830631601458440", "7127830631601458440", "7c7c4a40d7c44698a9db145eb8260156", [])
暗光提亮 = EffectMeta("暗光提亮", True, "7446318175991368997", "7446318175991368997", "f85598ada312c86238f4402d075feb66", [])
暗匣 = EffectMeta("暗匣", True, "7159163878822153483", "7159163878822153483", "00729c25c8b262db946bb5ac80b8d1dc", [])
暗夜明肤 = EffectMeta("暗夜明肤", True, "7328364126449765671", "7328364126449765671", "9fe0da0817604428adb38249ecae911c", [])
暗影 = EffectMeta("暗影", True, "7291203298630159676", "7291203298630159676", "21f3af497daf847e50efadc241f88a1a", [])
暗曛 = EffectMeta("暗曛", True, "7281163501047991608", "7281163501047991608", "893d483cd405343c9420015066e56096", [])
暗蓝电影 = EffectMeta("暗蓝电影", True, "7596691154008132915", "7596691154008132915", "9c176d06f4f1a394a3f3254662e77423", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗蓝电影感 = EffectMeta("暗蓝电影感", True, "7596940217177705779", "7596940217177705779", "76310240f62e24ecdad60f89991a63f0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗调发光 = EffectMeta("暗调发光", True, "7413717074037525769", "7413717074037525769", "7607d3d95aa486b47b9245af5b59fc4a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗调古风 = EffectMeta("暗调古风", True, "7505272278574206219", "7505272278574206219", "113adc91ddc8eb89d24a1f353415a1b6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗调复古电影 = EffectMeta("暗调复古电影", True, "7494530599202327846", "7494530599202327846", "72f3b7b5cc1bc9a247025588e8815dfb", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗调电影 = EffectMeta("暗调电影", True, "7402945560623336758", "7402945560623336758", "bd89a7f21cb380fe362311146462d0fd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗调纪实电影 = EffectMeta("暗调纪实电影", True, "7493536391431785752", "7493536391431785752", "bc7a68297d80f6b3302e2826d66f67fe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗调阴郁 = EffectMeta("暗调阴郁", True, "7596555533230902579", "7596555533230902579", "014d3108cf9855ef67f636f376a80764", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗部漫游 = EffectMeta("暗部漫游", True, "7595398794410347826", "7595398794410347826", "effefb5f0c9b9fc19bf4920b79ae2a31", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗金 = EffectMeta("暗金", True, "7511619145864187136", "7511619145864187136", "725fc1d6b1623309eeee59015a5c6bdc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗银 = EffectMeta("暗银", True, "7177725752513793284", "7177725752513793284", "ad378d530ac056cb2b2e0b0ab171ede8", [])
暗银II = EffectMeta("暗银II", True, "7223630575888780602", "7223630575888780602", "33f209efb496924d6da0c7ad89bea81f", [])
暗黑玫瑰 = EffectMeta("暗黑玫瑰", True, "7562034253412715811", "7562034253412715811", "7f83df0b8fdd6a3563cc89ed19e5d8f3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暮信 = EffectMeta("暮信", True, "7279061785922080055", "7279061785922080055", "0635e0022bfbda491e52a8eef142b33d", [])
暮川 = EffectMeta("暮川", True, "7262351934785408267", "7262351934785408267", "187450ba96a5e11233e9d38396274d87", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暮樱 = EffectMeta("暮樱", True, "7341257736983760182", "7341257736983760182", "470ab88faab84fe2c6de6300af28be5f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暮涛 = EffectMeta("暮涛", True, "7145394582933572878", "7145394582933572878", "a4930081ec4b2a6fc96b85508cae899f", [])
暮色约会 = EffectMeta("暮色约会", True, "7332396398157090089", "7332396398157090089", "920f4d54eb383be7327d76689d96f1a5", [])
曼波 = EffectMeta("曼波", True, "7233734975839898940", "7233734975839898940", "92b9d72c49094fa0280e1763b9002cac", [])
月吟 = EffectMeta("月吟", True, "7168108694285159719", "7168108694285159719", "98ee4013998d056bf434a4d2c62cf548", [])
月辉 = EffectMeta("月辉", True, "7476109983688576290", "7476109983688576290", "8cea6a07e5698d90c0d7ee40efee1f88", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
朦胧气质棕 = EffectMeta("朦胧气质棕", True, "7493920442613288219", "7493920442613288219", "43451fb4b7d714c1d835b9bd8f4254ec", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
木葵 = EffectMeta("木葵", True, "7233731121610100020", "7233731121610100020", "424ca4570f07325b1124b3be3f7dd35f", [])
末世天使 = EffectMeta("末世天使", True, "7506099780947430668", "7506099780947430668", "d7a4f329369b0f8232525d73bf9b9b91", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
杏铃 = EffectMeta("杏铃", True, "7295630593063193865", "7295630593063193865", "2727cb3874cfcc3541fbf4f08052a6da", [])
松绿 = EffectMeta("松绿", True, "7246723559047941433", "7246723559047941433", "1aca4ded18b11bff899309955ed07c5c", [])
果酥 = EffectMeta("果酥", True, "7160594387594972446", "7160594387594972446", "f68ff633bab02132880a03034894d378", [])
柏林 = EffectMeta("柏林", True, "7530690874699713842", "7530690874699713842", "4359ffed00242d8940bab8a902a7f588", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
柔光 = EffectMeta("柔光", True, "7395596262252334373", "7395596262252334373", "01d991f6057be53b6eb319f5c69a1798", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
柔焦 = EffectMeta("柔焦", True, "7345412316621442354", "7345412316621442354", "e9449745f95a354e4d835961cbb0e674", [])
柔雾感 = EffectMeta("柔雾感", True, "7480785731015691539", "7480785731015691539", "c3a6c183bf91b95f792847ced8aa6ad5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
柠青 = EffectMeta("柠青", True, "7127653798272683278", "7127653798272683278", "1689d0cca2119b6ab3d54573e53e1902", [])
柯达金200 = EffectMeta("柯达金200", True, "7517685395102977334", "7517685395102977334", "c28090d8f54cf11516c16126a0efb84d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
栖海 = EffectMeta("栖海", True, "7349928965869538570", "7349928965869538570", "ef900ccea3b5ec0d5cb420b4ee487bcb", [])
栩栩 = EffectMeta("栩栩", True, "7177259623819316519", "7177259623819316519", "09c34a30d79f4c7332267b16eaca664e", [])
格金 = EffectMeta("格金", True, "7348301778909252879", "7348301778909252879", "256144ddabaf723badea240301660868", [])
桃木 = EffectMeta("桃木", True, "7252673818035064124", "7252673818035064124", "7e5d4fb53f764eaa07d6e465fd60588e", [])
桃粉 = EffectMeta("桃粉", True, "7297131749346135331", "7297131749346135331", "80b55b69c2b4662c65835f49ee46ad97", [])
桐影 = EffectMeta("桐影", True, "7275699191253339455", "7275699191253339455", "b77671ede2639384b704eb73722e928a", [])
梦境 = EffectMeta("梦境", True, "7127675251604917517", "7127675251604917517", "12627ad5e79adab77540c65ea8ee7cc2", [])
梦幻夏 = EffectMeta("梦幻夏", True, "7377370067798985993", "7377370067798985993", "3adb502f6928cf41be040b6f52e1a48e", [])
梦核紫 = EffectMeta("梦核紫", True, "7261463763344248103", "7261463763344248103", "41ed7e729f06a288363ca93a928f8a90", [])
梨花白 = EffectMeta("梨花白", True, "7470438095998029066", "7470438095998029066", "307bdbcd9b1e9068e702e47360d10278", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
梨花白皙 = EffectMeta("梨花白皙", True, "7611013816964500788", "7611013816964500788", "ec6e6fb170e90c7b162808e8abe958cb", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
棕榈 = EffectMeta("棕榈", True, "7252676190073392444", "7252676190073392444", "113b463fa3945ef37700c7c52dfc6bb9", [])
森山 = EffectMeta("森山", True, "7242215081663008056", "7242215081663008056", "0dc17be521cf783590bebcf2a5c888df", [])
森林徒步 = EffectMeta("森林徒步", True, "7524262165273005321", "7524262165273005321", "c889505e8e46aaeaa48f792c770ec042", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
森秋 = EffectMeta("森秋", True, "7274575376095923497", "7274575376095923497", "b055e64a58bd8d9b882477c9be6ef3a6", [])
森绿 = EffectMeta("森绿", True, "7510128089511349555", "7510128089511349555", "992abfe865ee701777a6cccdf033dc2b", [])
樱晴 = EffectMeta("樱晴", True, "7274246029824806155", "7274246029824806155", "9c902cf649dd7820589ddb51869bc045", [])
樱花粉肤 = EffectMeta("樱花粉肤", True, "7467985496988241204", "7467985496988241204", "01a1557eeb00bf1f68755765e18b4281", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
橘光 = EffectMeta("橘光", True, "7127675251961384205", "7127675251961384205", "1c0060b506446d78b609c4383b9eba3f", [])
橘海 = EffectMeta("橘海", True, "7278615838628924733", "7278615838628924733", "2c1496f259e375191ad52c8c43c6cf2f", [])
橙蓝 = EffectMeta("橙蓝", True, "7127561047048850718", "7127561047048850718", "4dd590015f2e14265dd5456a91ec86a6", [])
欧若淡彩 = EffectMeta("欧若淡彩", True, "7479295334930205952", "7479295334930205952", "c188665c6348ae65e32b6e70a691151b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
殷粉 = EffectMeta("殷粉", True, "7169357894868061478", "7169357894868061478", "91d27d5647faec40a747359ec6dd6eb4", [])
毕业胶片 = EffectMeta("毕业胶片", True, "7510863205011393844", "7510863205011393844", "a064e9e21ae3fb3664c66b857d792902", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
气色 = EffectMeta("气色", True, "7417468417852099894", "7417468417852099894", "8c94ade25035fdc85d27cb49ff9c85ef", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
气色透亮 = EffectMeta("气色透亮", True, "7527311213869403402", "7527311213869403402", "e87f59cca325712c1302c250448387ef", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
氧气春日 = EffectMeta("氧气春日", True, "7471717864001506587", "7471717864001506587", "51de5abddac2c4cb01f10cbd6d34ac20", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
氧气甜白 = EffectMeta("氧气甜白", True, "7470913918186163468", "7470913918186163468", "d83fe74d8abe64f7bb31e01dc17ab59a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
水光红润 = EffectMeta("水光红润", True, "7546838732532436224", "7546838732532436224", "f3909397f05a0275d5da7a642c6edd9e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
水墨意境 = EffectMeta("水墨意境", True, "7592199246766542104", "7592199246766542104", "c06ae9c8273fd8d3c71e91e4d76b21be", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
沙漫 = EffectMeta("沙漫", True, "7148776798715776292", "7148776798715776292", "b6a48f6276a19984c0e466362bcd0999", [])
沙砾 = EffectMeta("沙砾", True, "7160580722774920461", "7160580722774920461", "a796471629be7b3bfbd649deafca3ddb", [])
沙龙暖调 = EffectMeta("沙龙暖调", True, "7604669372958788900", "7604669372958788900", "4cfa40ea53b69116d5f3bf2dbb345346", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
治愈奶萌 = EffectMeta("治愈奶萌", True, "7535396553368948018", "7535396553368948018", "b0ed204b3cf34517a869cdb4f3c4ba69", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
法式少女 = EffectMeta("法式少女", True, "7480196177611230514", "7480196177611230514", "fcbe6cb7764d3023cd221aaecfdc7d8d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
法式甜粉 = EffectMeta("法式甜粉", True, "7480196167372999973", "7480196167372999973", "418873710a7304cc284104bd32eed187", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
法餐 = EffectMeta("法餐", True, "7127655700532186398", "7127655700532186398", "b8b6d5ae88e12e25be14a2dd85b7cbc6", [])
洋气新年 = EffectMeta("洋气新年", True, "7452802627991129380", "7452802627991129380", "4d13496829650356a30bf7cf96b72dd2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
洛丽塔粉 = EffectMeta("洛丽塔粉", True, "7476109684169133362", "7476109684169133362", "cb02e21da652aa4dabd912a8b009df89", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浅空 = EffectMeta("浅空", True, "7297910428703657227", "7297910428703657227", "dcb2f23d5604acc06982464a227b8e40", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浅绿微曝 = EffectMeta("浅绿微曝", True, "7589518503460310296", "7589518503460310296", "2988956aa2c0578d30b28ce04321a525", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浅茶 = EffectMeta("浅茶", True, "7221481120083283257", "7221481120083283257", "6acf81ddf75fc8c5ddb20f3a927dcaa3", [])
浅草 = EffectMeta("浅草", True, "7195783041376111932", "7195783041376111932", "8c4eb75992a7f07bd07e56c16b388d87", [])
浓咖 = EffectMeta("浓咖", True, "7526564908188568866", "7526564908188568866", "8a8bb532202c25217236311956506247", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浓调电影 = EffectMeta("浓调电影", True, "7608956042701065487", "7608956042701065487", "d44494db028e4a2558182249d23cd46f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浓郁增色 = EffectMeta("浓郁增色", True, "7578511090758192384", "7578511090758192384", "380c1144bde6ebb3bca0d4570be8e25e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浓郁日落 = EffectMeta("浓郁日落", True, "7591499629557075251", "7591499629557075251", "005a8985f0c1721fc6c158bb641a3992", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浓郁电影感 = EffectMeta("浓郁电影感", True, "7602322655651400970", "7602322655651400970", "1008b11504257570fcf75eaf37722544", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浓郁秋意 = EffectMeta("浓郁秋意", True, "7562593990671895808", "7562593990671895808", "0c99beeab4b6b4bee54fb35525055f66", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浓郁胶卷 = EffectMeta("浓郁胶卷", True, "7499121362351574282", "7499121362351574282", "ed6846e943d41e7776b9cfddbb1f0ce6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浪漫质感 = EffectMeta("浪漫质感", True, "7537336415810489619", "7537336415810489619", "1614a827abe09365506b4c097a625b0f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
浪语 = EffectMeta("浪语", True, "7376495406487801139", "7376495406487801139", "3310cabac6dabcb702b1c7ec26831462", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
海上冲浪 = EffectMeta("海上冲浪", True, "7527721135824211243", "7527721135824211243", "ad7160ce93edefe64d911dcd42ead464", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
海山 = EffectMeta("海山", True, "7281162426219859255", "7281162426219859255", "33fb59b0082de5109778483e30235a46", [])
海松 = EffectMeta("海松", True, "7145394304377163045", "7145394304377163045", "d94890916054949103ba41e9eb36e948", [])
海水正蓝 = EffectMeta("海水正蓝", True, "7361398032753020201", "7361398032753020201", "9f61634eccac5b971ce92279a50b9a99", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
海盐 = EffectMeta("海盐", True, "7473034636436852031", "7473034636436852031", "91b796a25fbca315800d4db4c4f4081e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
海盐蓝 = EffectMeta("海盐蓝", True, "7495702685765651775", "7495702685765651775", "bb5eaf7e5063d853dc0392bb7119c74e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
海边胶片 = EffectMeta("海边胶片", True, "7497887075627257114", "7497887075627257114", "05404c80bc61b9cd92805e6016579607", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
润光 = EffectMeta("润光", True, "7199093300526173501", "7199093300526173501", "3916e1d5dc3a3522f4b883c3b1f2b43a", [])
涩谷 = EffectMeta("涩谷", True, "7210645355136961852", "7210645355136961852", "7ca84443c2a14a2e9de11a5708a62a63", [])
淡奶油 = EffectMeta("淡奶油", True, "7127668617101020423", "7127668617101020423", "e53103dabd1bbb6ab4481b18a4c42b2c", [])
深蓝电影感 = EffectMeta("深蓝电影感", True, "7607867444048317706", "7607867444048317706", "f31c8f7ba639041a53ceb2f3e63b3e72", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清冷国风 = EffectMeta("清冷国风", True, "7493171130753174835", "7493171130753174835", "7d053e14ed86f5176b46c2c9408ccd90", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清冷情绪感 = EffectMeta("清冷情绪感", True, "7602661089280560394", "7602661089280560394", "4d2118f02b426a8a1cecc3952df44e68", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清冷暗黑 = EffectMeta("清冷暗黑", True, "7398191077364124955", "7398191077364124955", "ad3d3e686cc83a8d59b097e11da88fec", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清冷破碎III = EffectMeta("清冷破碎III", True, "7415242837555416330", "7415242837555416330", "1b226ab430f4d82233a250b10444227d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新感 = EffectMeta("清新感", True, "7493819626330017078", "7493819626330017078", "35d73b32f29b709f39544491ede0838a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新明亮 = EffectMeta("清新明亮", True, "7429759193361435955", "7429759193361435955", "7bc0e54281c36e6de77a5615f27c4caa", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新春日 = EffectMeta("清新春日", True, "7463798716542111030", "7463798716542111030", "a1d039f3590e2adf5da1004cc2d73eda", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新晴空 = EffectMeta("清新晴空", True, "7456482453444726026", "7456482453444726026", "07019cfc5d2c3256ba47bf3bea3dbb00", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新暖食 = EffectMeta("清新暖食", True, "7481862972801879346", "7481862972801879346", "36c030d9a1c8557e81848189cc1af755", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新氧晴 = EffectMeta("清新氧晴", True, "7459675263652220171", "7459675263652220171", "2b31c0d9bf2a405612888fcb3995f873", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新绿妍 = EffectMeta("清新绿妍", True, "7436078162217274687", "7436078162217274687", "112dd9649310ed413c7408dd8f2f92d0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新花妍 = EffectMeta("清新花妍", True, "7478775634630659378", "7478775634630659378", "a6ccdb6e981df85838d0f41c39465a68", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新质感 = EffectMeta("清新质感", True, "7456482275618835763", "7456482275618835763", "3b08d9fe88051cfafaa416a4c414d7d2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新透亮 = EffectMeta("清新透亮", True, "7439995840799722815", "7439995840799722815", "65bb0c559415d970de0bfc05ae12dcb0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清新雪肤 = EffectMeta("清新雪肤", True, "7441124539016219943", "7441124539016219943", "984a69be99e9c48c3fb48429449c9cfe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰 = EffectMeta("清晰", True, "7447719105563610404", "7447719105563610404", "5f6d758ab20aa947bba241a6b76b85b2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰ll = EffectMeta("清晰ll", True, "7127669764792634637", "7127669764792634637", "7b2ad7edaed946467ab161d016cfca93", [])
清晰严冬 = EffectMeta("清晰严冬", True, "7449939197223243058", "7449939197223243058", "d9d8276e9a3c42cfd6fc7f4ca7a4df81", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰净透 = EffectMeta("清晰净透", True, "7483183184826420519", "7483183184826420519", "8a899113236afdc2c594847f2f6f47a7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰增强 = EffectMeta("清晰增强", True, "7436068361622129929", "7436068361622129929", "04d65d54d326cdac7199f22fcb568546", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰增色 = EffectMeta("清晰增色", True, "7428650549572144411", "7428650549572144411", "70ba95840a5098b3da9177f37d833e3e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰增质 = EffectMeta("清晰增质", True, "7441960726274559282", "7441960726274559282", "b34ce1dffbe825638afca51c302d1e73", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰提升 = EffectMeta("清晰提升", True, "7443101069539953931", "7443101069539953931", "c3d50db262018318dffa816fb21a538b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰电影 = EffectMeta("清晰电影", True, "7435151579029769511", "7435151579029769511", "917f37af833a8ff548f59c513140f62c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰画质 = EffectMeta("清晰画质", True, "7441541255760284939", "7441541255760284939", "9f05ff28c43c9e08a23a0ad7e00783d2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰自然 = EffectMeta("清晰自然", True, "7473805985388317978", "7473805985388317978", "3e1cc9a595ff0c720a894699eb20a9d5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰花朵 = EffectMeta("清晰花朵", True, "7493197626645531928", "7493197626645531928", "dad9279c9aca95f1691b257001998384", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰萌宠 = EffectMeta("清晰萌宠", True, "7503810545670311206", "7503810545670311206", "aa7df625b33d7e1a71b8a631f774b14e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰质感 = EffectMeta("清晰质感", True, "7442390492307836186", "7442390492307836186", "92dd44e1cf31d63da9de52e93f0f9bb1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清晰透亮 = EffectMeta("清晰透亮", True, "7440517981374893327", "7440517981374893327", "142da1059c48af1f07e00b4e2d589545", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清透II = EffectMeta("清透II", True, "7472986633399225635", "7472986633399225635", "9781a0c82f0455cf221e683c0006ec1d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清透光感 = EffectMeta("清透光感", True, "7493540929874218281", "7493540929874218281", "5f5104a97960ff734ecef9eb568c5627", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清透感 = EffectMeta("清透感", True, "7496156231392873767", "7496156231392873767", "b2398ecc78f2a553abf3aa1f6b6e0fbc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清透春日 = EffectMeta("清透春日", True, "7614215952338636058", "7614215952338636058", "dccbb81ecdce0585b38b54afcec883ee", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清透美食 = EffectMeta("清透美食", True, "7403664041945681191", "7403664041945681191", "3121bd38673441c5417ec3e6f0da13a2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
清透萌宠 = EffectMeta("清透萌宠", True, "7473126624322391308", "7473126624322391308", "65f21eb6f46b4bc1620c3b942ccecadc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
港风复古 = EffectMeta("港风复古", True, "7493874443639377164", "7493874443639377164", "c11f61a31f6ee77e6ca00916255a8395", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
港风夜景 = EffectMeta("港风夜景", True, "7408952560549104923", "7408952560549104923", "5ae3b44614fecb8e1e404bea862e3831", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
港风电影 = EffectMeta("港风电影", True, "7493845947546455307", "7493845947546455307", "d64afc32204dd52601a74a7a82dda04e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
湖畔 = EffectMeta("湖畔", True, "7210609383804390711", "7210609383804390711", "e1c8871f6971098d209bfbff648d2044", [])
漠土 = EffectMeta("漠土", True, "7347670931646549282", "7347670931646549282", "9dfde36f1fab0e85773d04fadeb30650", [])
漫樱 = EffectMeta("漫樱", True, "7356883843376221475", "7356883843376221475", "1799ab3b4a9bf0957995b69d27195229", [])
漫空 = EffectMeta("漫空", True, "7210749292888280359", "7210749292888280359", "cd88f8152fffe8033bb5057fc2539319", [])
漫荫 = EffectMeta("漫荫", True, "7210758351595048195", "7210758351595048195", "fc46efdc25a15ca3958126a8c72c1cd8", [])
漫银纪元 = EffectMeta("漫银纪元", True, "7571383496334150937", "7571383496334150937", "d91f6447af1458dfa0b51d593375a687", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
漱石 = EffectMeta("漱石", True, "7145394477249678606", "7145394477249678606", "ac50156682af7d7ce4e76eb731a5a832", [])
潘多拉 = EffectMeta("潘多拉", True, "7127620215290039566", "7127620215290039566", "36e7d537966ee59eb61c326598546cb0", [])
灯会 = EffectMeta("灯会", True, "7145394908608662814", "7145394908608662814", "21472133401674a3e5645f79e9d30ae9", [])
灯塔 = EffectMeta("灯塔", True, "7262351970193640715", "7262351970193640715", "1a07b83501e168fa1d630a0d7891ce47", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
灰芋 = EffectMeta("灰芋", True, "7199460195502689574", "7199460195502689574", "96b986718efbb22647ae5836b2c8ff43", [])
灰调中性 = EffectMeta("灰调中性", True, "7476126948708617482", "7476126948708617482", "0ad9b7ad4e7e37fd3d9db635919c96be", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
灰调日常 = EffectMeta("灰调日常", True, "7484662695443090715", "7484662695443090715", "775159063b0b80ee165739845dd1813c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
灰麻 = EffectMeta("灰麻", True, "7312645421271158070", "7312645421271158070", "38ff7fc68c3ad9d76d9527a6d0b560cb", [])
灿金彩带 = EffectMeta("灿金彩带", True, "7467879231914118412", "7467879231914118412", "6616e3a1d378a44ed14ea50d8d25ca67", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
炊烟 = EffectMeta("炊烟", True, "7194083900333755704", "7194083900333755704", "924d2235bf0485217a6897fb9504b456", [])
烈日 = EffectMeta("烈日", True, "7145395383475113230", "7145395383475113230", "cc04d06002980d31b709b833290441b2", [])
烈空 = EffectMeta("烈空", True, "7246722333010824508", "7246722333010824508", "849e979a487594a0da039ddd33e43c6b", [])
烘挞 = EffectMeta("烘挞", True, "7160598329817091364", "7160598329817091364", "8df6f056381a16178b36fa8ad6e559bf", [])
烛光晚餐 = EffectMeta("烛光晚餐", True, "7575953878076673323", "7575953878076673323", "c9599a6599bd63181d919ccb8b93302c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烟橙 = EffectMeta("烟橙", True, "7131582482608164132", "7131582482608164132", "e958619538087c86308f718045b292f2", [])
烟火年年 = EffectMeta("烟火年年", True, "7582992418941717823", "7582992418941717823", "a2fbff851c2cf4abb37af3610d491b3c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烟火迎春 = EffectMeta("烟火迎春", True, "7595505308848360750", "7595505308848360750", "9870636e51f5bc409077c62208cc4e7f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烟花去雾 = EffectMeta("烟花去雾", True, "7595588267978837282", "7595588267978837282", "1565db93cb09db3e482149ca799753da", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烟花灿烂 = EffectMeta("烟花灿烂", True, "7604545611471408390", "7604545611471408390", "e50d944774217a344777088c3d5c3db1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
烟花璀璨 = EffectMeta("烟花璀璨", True, "7328363415313993001", "7328363415313993001", "0d2282c9172ed09758f861849916ab4b", [])
烟花璀璨_II = EffectMeta("烟花璀璨 II", True, "7462635722969730323", "7462635722969730323", "9b5d3dc3140ea461c77235ceb39df35b", [])
热带季风 = EffectMeta("热带季风", True, "7377368986276646171", "7377368986276646171", "2879146129f3375e8fefc940fe970397", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
热显宝丽来 = EffectMeta("热显宝丽来", True, "7542376153407950095", "7542376153407950095", "c3687961a6970093faa88b7b3ec8b894", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
热气腾腾 = EffectMeta("热气腾腾", True, "7463372376038755603", "7463372376038755603", "7512302ec39fcf1c3fe8eb3d88015094", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
焕肤 = EffectMeta("焕肤", True, "7127674287238008078", "7127674287238008078", "073940956259c1077acaec764f52f31c", [])
焰色 = EffectMeta("焰色", True, "7131539023817936158", "7131539023817936158", "efcc2f7cdccc176ce06f14d9029bcbf2", [])
熏柏 = EffectMeta("熏柏", True, "7145395127089909028", "7145395127089909028", "1081c5bbbf4ed18971b14f24316d1905", [])
燃空 = EffectMeta("燃空", True, "7226265591760358713", "7226265591760358713", "e3bc331ba068b35f92a7fc1c282530fc", [])
爱丽丝 = EffectMeta("爱丽丝", True, "7328694736565439807", "7328694736565439807", "deae47ffa17d61be87aabf804cea348c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
爱之城 = EffectMeta("爱之城", True, "7131656881805741325", "7131656881805741325", "3531cd81550d23dd7d10b4b8ec90ba9f", [])
爱之城II = EffectMeta("爱之城II", True, "7337929076042222899", "7337929076042222899", "1635b6718619a9832177e25c33f1968b", [])
牙白 = EffectMeta("牙白", True, "7172285234296278309", "7172285234296278309", "1c6bd0a57d892c86c845666b44a8f547", [])
牛奶肌 = EffectMeta("牛奶肌", True, "7473369111490317595", "7473369111490317595", "330d7a689e6be431555bbfdb79c40222", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
牧野 = EffectMeta("牧野", True, "7397751642390564134", "7397751642390564134", "9c3719579cfc7ed5c7b1cfb64f83e78e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
独行侠 = EffectMeta("独行侠", True, "7202485617026977056", "7202485617026977056", "50fc4f48bab6acc0b86f42c68a44e3dc", [])
猎梦 = EffectMeta("猎梦", True, "7148806074601164062", "7148806074601164062", "29250207ce609f25ddaad4a5ff618515", [])
玄影灵 = EffectMeta("玄影灵", True, "7405509975939894567", "7405509975939894567", "32ec94003ae4974d96d095884f512660", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
玩趣 = EffectMeta("玩趣", True, "7177267248753610023", "7177267248753610023", "3dd9c3beaf276b96f226c49ac2bcbdd0", [])
琥珀 = EffectMeta("琥珀", True, "7295599414180138250", "7295599414180138250", "4a9ef682fbe7b4214e681796d4b4c77d", [])
璀璨 = EffectMeta("璀璨", True, "7468943213143821587", "7468943213143821587", "da0d70b6d9194b356f971b8fcdaad992", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%"""
甜妹感 = EffectMeta("甜妹感", True, "7486871767642950966", "7486871767642950966", "7eede1d6b72f5c5a56c0a2fc14397ad6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
甜心芭比 = EffectMeta("甜心芭比", True, "7505303260148878630", "7505303260148878630", "2ea342e24a99ce386418d5cb214ce807", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
田园野餐 = EffectMeta("田园野餐", True, "7374709634088668452", "7374709634088668452", "e7d118f203092058bd662381cd81854f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影光感 = EffectMeta("电影光感", True, "7575372908076338457", "7575372908076338457", "f11c4c537cc8c01305d1f1fe2e227353", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影叙事感 = EffectMeta("电影叙事感", True, "7539542018494663975", "7539542018494663975", "52aa2a88fa78c85bee650dfe0087c065", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影境遇 = EffectMeta("电影境遇", True, "7611777721500306723", "7611777721500306723", "cbfb00635fd223ddb16f9b46ac9f63a9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影增强 = EffectMeta("电影增强", True, "7439365849703550247", "7439365849703550247", "61b80862b0f2f60fb42dbf3974ccbcdc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影增质 = EffectMeta("电影增质", True, "7435151398783765799", "7435151398783765799", "41a4b54d9a3918e6466be755a455667e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影大师 = EffectMeta("电影大师", True, "7569903362355891518", "7569903362355891518", "6b2290221ec8c89ef691dd93a17a99c9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影往事 = EffectMeta("电影往事", True, "7604153456365948169", "7604153456365948169", "ed514ff59aa8cb2eebc7ee49df61cabf", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影感增强 = EffectMeta("电影感增强", True, "7486832436819578151", "7486832436819578151", "4c90165bf74665c89b9eba6408ef3bba", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影感大片 = EffectMeta("电影感大片", True, "7575521370369428742", "7575521370369428742", "0c93dec8336a85d615bab1e787f5f07d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影慢镜 = EffectMeta("电影慢镜", True, "7591523217345449279", "7591523217345449279", "de864f5abe14d8319a5c518fa923c654", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影慢镜II = EffectMeta("电影慢镜II", True, "7592642498489503026", "7592642498489503026", "be22ffebcc4a52afd09e0b52273faa62", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影柔光 = EffectMeta("电影柔光", True, "7447126702137904420", "7447126702137904420", "8bc2fa65718e78742c45e937ee513599", [
EffectParam("intensity", 0.180, 0.000, 1.000)])
"""参数:
intensity: 默认18%, 0% ~ 100%"""
电影校正 = EffectMeta("电影校正", True, "7494169971136711977", "7494169971136711977", "8a967a661c33955a914ee2d6741f4abe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影独白 = EffectMeta("电影独白", True, "7595136957605252390", "7595136957605252390", "69cccaa977b143bf9c2884a918360eac", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影画质 = EffectMeta("电影画质", True, "7472770427245448474", "7472770427245448474", "3c17e8775c8ffd2f8875c1b06720a81d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影葡街 = EffectMeta("电影葡街", True, "7589559390106062132", "7589559390106062132", "9e21d6b27e52c0442aea729950266bea", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电影镜头 = EffectMeta("电影镜头", True, "7591844323558165800", "7591844323558165800", "04bd57ed5fd14719cb5896275281716b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
画报 = EffectMeta("画报", True, "7239979137404833083", "7239979137404833083", "267ef83e978e1b8282afa81c88e8dfd4", [])
画质修复 = EffectMeta("画质修复", True, "7507148382536764682", "7507148382536764682", "8839ae43389b979ea5b3af0210940455", [
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认50%, 0% ~ 100%"""
画质增蓝 = EffectMeta("画质增蓝", True, "7525722154726329650", "7525722154726329650", "d4bbe627e3786316720acfda6ba49b23", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
画质高清 = EffectMeta("画质高清", True, "7439560136630471963", "7439560136630471963", "b08bde10ef963cf648e677615667fda3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
登高 = EffectMeta("登高", True, "7195925533031435558", "7195925533031435558", "688df92b416581b9cf33e543ae7ae03b", [])
白富美 = EffectMeta("白富美", True, "7302336985513970963", "7302336985513970963", "9fb4286e708d3bbf2b6bc6af85120be2", [])
白瓷亮肤 = EffectMeta("白瓷亮肤", True, "7545707655537397044", "7545707655537397044", "30d45d50d67e78c4fbceca515f6aeef8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
白皙丝绸 = EffectMeta("白皙丝绸", True, "7600637764823993650", "7600637764823993650", "7e6fb86a203656c5dfcae95bd6ccf5a0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
白皙去黄 = EffectMeta("白皙去黄", True, "7531992666729352482", "7531992666729352482", "d69785c1d162574ce7fc3b74fe3e807d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
百川 = EffectMeta("百川", True, "7210616269597314362", "7210616269597314362", "cd1f1360bd1891f9b31c63542689d8ea", [])
盐系 = EffectMeta("盐系", True, "7127823742830398757", "7127823742830398757", "9d48681f2c1f584e9b93fa37485693d1", [])
石山 = EffectMeta("石山", True, "7194091413728922941", "7194091413728922941", "a9faf4808c5ec06b8d2ecc944a3682c6", [])
砂金 = EffectMeta("砂金", True, "7131655685321821477", "7131655685321821477", "9a4836294cf0cc48fcf84af02d963400", [])
破晓 = EffectMeta("破晓", True, "7348707347419712794", "7348707347419712794", "0f73c6cf0189f4c0e462e76102e46084", [])
硬朗 = EffectMeta("硬朗", True, "7127663097162075399", "7127663097162075399", "7f33d22c16b09c852f48314404c2b532", [])
硬朗男孩 = EffectMeta("硬朗男孩", True, "7524592387742567689", "7524592387742567689", "b998c48b7bc0927ba03a6a0c866fa2d8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
碎芒 = EffectMeta("碎芒", True, "7148945136280440101", "7148945136280440101", "c40eb1ab380e7e22f5a4a71d69520a54", [])
碳烤 = EffectMeta("碳烤", True, "7363537225620983067", "7363537225620983067", "596d7d07b942eff22e9f8aaa47918711", [])
福桔 = EffectMeta("福桔", True, "7323020458050260262", "7323020458050260262", "e0d586addaf8f3b790f011effa361c80", [])
福气新年 = EffectMeta("福气新年", True, "7582612168625982739", "7582612168625982739", "cfbb0a5235f70d9b9377840689dfb210", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
福气新春 = EffectMeta("福气新春", True, "7595423045704027442", "7595423045704027442", "49b3bd7bfd195e8b70e31082f77198e6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
福漫 = EffectMeta("福漫", True, "7602179574549761305", "7602179574549761305", "42c9e43f879101736833459671bfd4ae", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
福运 = EffectMeta("福运", True, "7453122471810714930", "7453122471810714930", "a6ec7e80c2ecff207da782397d0f9068", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
禾美 = EffectMeta("禾美", True, "7260770496055168310", "7260770496055168310", "fce7d45ba040a90176adfc1cc74fb8be", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
私语 = EffectMeta("私语", True, "7127674303306419464", "7127674303306419464", "7f8596dc2626cd91e642c6a17c953390", [])
秋叶黄 = EffectMeta("秋叶黄", True, "7542556208268348712", "7542556208268348712", "161e16336ce1768fc9e7395de07c83b9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
秋季电影感 = EffectMeta("秋季电影感", True, "7540164276858801448", "7540164276858801448", "7f62d804192fe06b9e8c4b3716fa6f62", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
秋意电影感 = EffectMeta("秋意电影感", True, "7551307375555185956", "7551307375555185956", "04899a4d2671dfbcd2a737a750b1272f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
秋日物语II = EffectMeta("秋日物语II", True, "7404121905780772122", "7404121905780772122", "1d70b53cb9e08dd8e5205d1f8d9258b1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
秋日自然 = EffectMeta("秋日自然", True, "7556996788276841791", "7556996788276841791", "ccf27de6fd29f43da006f5ac5d0299bd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
秋池 = EffectMeta("秋池", True, "7145391965717253406", "7145391965717253406", "3a908de0c7ba051b7838f5515d523a2c", [])
秋波 = EffectMeta("秋波", True, "7196920471043050812", "7196920471043050812", "0ce8c8224ab832699cae7ebdbd7034e9", [])
秋田胶片 = EffectMeta("秋田胶片", True, "7493760868576988443", "7493760868576988443", "6ebf281ef0ce140be9ea39457209139a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
科切拉 = EffectMeta("科切拉", True, "7502329862581996854", "7502329862581996854", "ea0880ddab806d8765dce61edba72dbc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
科幻星球 = EffectMeta("科幻星球", True, "7501988309900528935", "7501988309900528935", "5d48a663f0d44ab86af1a5a48a7ac974", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
简餐 = EffectMeta("简餐", True, "7127561998556073247", "7127561998556073247", "0c4b5c50cb8bd668c241a262984f940b", [])
粉柔撕拉片 = EffectMeta("粉柔撕拉片", True, "7503540725334723875", "7503540725334723875", "22bc2bf6c87fab59f75217cd83c21eae", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
粉橘 = EffectMeta("粉橘", True, "7131467442789846285", "7131467442789846285", "1fc9df6984d15546e3d28689ef43c334", [])
粉白 = EffectMeta("粉白", True, "7156647258342034702", "7156647258342034702", "fd5f2b2a42b0c54aa8df8b99c830ab36", [])
粉白微曝光 = EffectMeta("粉白微曝光", True, "7481194247610174757", "7481194247610174757", "14b4910ed81667464beb2264bd80ae2a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
粉蓝烟花 = EffectMeta("粉蓝烟花", True, "7462636960557927699", "7462636960557927699", "92e7bc7ca6f8381bdf25c4540669f28b", [
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认70%, 0% ~ 100%"""
粉霞 = EffectMeta("粉霞", True, "7525754134151105833", "7525754134151105833", "c551709419f57acb321c36d879ed4376", [])
素净 = EffectMeta("素净", True, "7351018816215764233", "7351018816215764233", "3c792ad3327a3b6774aa89990dacf093", [])
素简 = EffectMeta("素简", True, "7300968790391606567", "7300968790391606567", "091f103fae7c3a0480f05be172a0c904", [])
紫霞时分 = EffectMeta("紫霞时分", True, "7507920355613248803", "7507920355613248803", "0666e85ae9821a1ba83106da65094df9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
繁花似锦 = EffectMeta("繁花似锦", True, "7322666518536359204", "7322666518536359204", "f5d1f324f0f06bf4fc783095efd7dc1e", [])
繁花如梦 = EffectMeta("繁花如梦", True, "7322665314980859177", "7322665314980859177", "d8bcaf063ca3ef2cd8d5f1642204a35f", [])
繁花璀璨 = EffectMeta("繁花璀璨", True, "7322665617373351231", "7322665617373351231", "98b0d8c15909c10ef71f187df3e36c9f", [])
红运 = EffectMeta("红运", True, "7325421708809096467", "7325421708809096467", "31a7c3905e75dda75c86e104dcb5d222", [])
纪实电影 = EffectMeta("纪实电影", True, "7493535052098358590", "7493535052098358590", "6270a0d32e121f2f157428a8fa71baf1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
纪实电影胶片 = EffectMeta("纪实电影胶片", True, "7501954865518677267", "7501954865518677267", "8276d9650078c937901324127c6a2733", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
纱雾 = EffectMeta("纱雾", True, "7260772961462799627", "7260772961462799627", "acde0ae9bd3ee0a6684457d562f35e25", [])
织乐 = EffectMeta("织乐", True, "7148965677376736542", "7148965677376736542", "a319e3016fe180b247add4a6898b3cd0", [])
经典港风 = EffectMeta("经典港风", True, "7449048410004507914", "7449048410004507914", "c0bedd6c0adf9e2be04aceb386d79ef3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
绿妍II = EffectMeta("绿妍II", True, "7361401117672066345", "7361401117672066345", "2f29b2a050dc8c75c742e1ffb7be4cf0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
绿野 = EffectMeta("绿野", True, "7148817459095670029", "7148817459095670029", "be31c5c42c288d05bd0a7ba6781c7d55", [])
绿野漫旅 = EffectMeta("绿野漫旅", True, "7409674961595518258", "7409674961595518258", "f4b64f852dc51be8707a058245200c09", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
缎光肌 = EffectMeta("缎光肌", True, "7551730848282742070", "7551730848282742070", "4bca1d9f6da952f5269affa22ac43871", [
EffectParam("effects_adjust_filter", 0.175, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认18%, 0% ~ 100%"""
美味brunch = EffectMeta("美味brunch", True, "7494869214751182121", "7494869214751182121", "3e2f1a0747b5380d3adbbc60118de785", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
美好春日 = EffectMeta("美好春日", True, "7480550244233809189", "7480550244233809189", "ad5934723eb251d50206e74ee43de934", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
美好瞬间 = EffectMeta("美好瞬间", True, "7332345211621887251", "7332345211621887251", "1b989818420007070e3ecdc7df7fba1e", [])
美拉德 = EffectMeta("美拉德", True, "7273782607257685309", "7273782607257685309", "f22f3b6e1ef2d6f6e5b7a9e3b753fe18", [])
美食增色 = EffectMeta("美食增色", True, "7403664465390013735", "7403664465390013735", "ada69091300af58308e5bbdaa2c818dc", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
美高 = EffectMeta("美高", True, "7239236880858877217", "7239236880858877217", "29446ccd642910767b50978b2fe45f4b", [])
羽梦 = EffectMeta("羽梦", True, "7213573482850880827", "7213573482850880827", "ee8c5d6e7808f4e6662d42298104b87b", [])
聆时 = EffectMeta("聆时", True, "7279063581092531510", "7279063581092531510", "9e59d950f575eb8a28d1f789a3b8ab50", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
聚焦 = EffectMeta("聚焦", True, "7320428711487098153", "7320428711487098153", "54fcd82f212e40df18ac882bd748f59c", [])
背景增色 = EffectMeta("背景增色", True, "7538027894447131967", "7538027894447131967", "3d3ae418605554d05b52e82b280aa9db", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
胶片微曝 = EffectMeta("胶片微曝", True, "7578191333169417523", "7578191333169417523", "a5259ff5c583f14d2e8acdd6a483554e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
胶片电影 = EffectMeta("胶片电影", True, "7496103061845249316", "7496103061845249316", "b1ceda65b100e3c6799c576668c9e945", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
自然增色 = EffectMeta("自然增色", True, "7477552975246937380", "7477552975246937380", "f77a303a6b12fff167afa54dbf437e31", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
自然明亮 = EffectMeta("自然明亮", True, "7439995841366035724", "7439995841366035724", "1d53604a9caed4ee27a7e1f8f5fd9785", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
自然春色 = EffectMeta("自然春色", True, "7478210864818965779", "7478210864818965779", "21a8812e6490383c0eaaa6121cc71454", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
艾丽莎 = EffectMeta("艾丽莎", True, "7269240546810400011", "7269240546810400011", "720b5b57295f927d983152d9bffcf33c", [])
芭比 = EffectMeta("芭比", True, "7259718549634157882", "7259718549634157882", "aa97d157fa8642f46808cfda6c777fdd", [])
花容 = EffectMeta("花容", True, "7340950375127649577", "7340950375127649577", "b5d5c5fcaf7d85f5d06e540f69258653", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
花火增色 = EffectMeta("花火增色", True, "7446691478761508108", "7446691478761508108", "08297394b95f037a00a1f169d00fd322", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
花间 = EffectMeta("花间", True, "7211008985187487036", "7211008985187487036", "6acce0fe02d2e0328e597abcb1043de3", [])
花食 = EffectMeta("花食", True, "7261180740283403578", "7261180740283403578", "37b2683488f5e586c98256dab864ab84", [])
苍橘 = EffectMeta("苍橘", True, "7131605817958075685", "7131605817958075685", "43666fcf1f38cb2036f87b7e496ccec4", [])
苏打气泡 = EffectMeta("苏打气泡", True, "7535720421677731098", "7535720421677731098", "a08729a75a9c12cd53d42720ee2c94c3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
苦尽柑来 = EffectMeta("苦尽柑来", True, "7493339669950729481", "7493339669950729481", "72833304e3f98f8a607dc9006676cbcd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
苦檀 = EffectMeta("苦檀", True, "7145391965847162142", "7145391965847162142", "1dad3330806a06ca9abdd9ef20ef9216", [])
英伦复古 = EffectMeta("英伦复古", True, "7481337713443048755", "7481337713443048755", "88568151518cb4c4f5fd605bd7260260", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
茶卡盐湖 = EffectMeta("茶卡盐湖", True, "7526507478738013476", "7526507478738013476", "6a12ea5bd3c3a73148f39425a6512151", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
茶墨 = EffectMeta("茶墨", True, "7177728466354326822", "7177728466354326822", "d80d22c59b7846cfe3a0e8970825b316", [])
茶酪 = EffectMeta("茶酪", True, "7160603159486827783", "7160603159486827783", "3115e57bcd131acf89d8bdef6cd11cbd", [])
荒原风光 = EffectMeta("荒原风光", True, "7531037440736349491", "7531037440736349491", "efa0f0ca6a0f065b891711f0156ceea9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
莫吉托 = EffectMeta("莫吉托", True, "7131419324622982408", "7131419324622982408", "9b6cb49204cfb1ae3b38e70f4f71a0a7", [])
莫奈睡莲 = EffectMeta("莫奈睡莲", True, "7584815680642551102", "7584815680642551102", "bfb2e4a20f924d068ff7d6c7e3e835cf", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
莫奈花园 = EffectMeta("莫奈花园", True, "7500930664041172278", "7500930664041172278", "2a39723f27860f53fe08437092bf9109", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
菁润明肤 = EffectMeta("菁润明肤", True, "7396300458781936906", "7396300458781936906", "7ee2a3e6c8d54cf46fd9789913459e64", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
萌宠 = EffectMeta("萌宠", True, "7394022809317526834", "7394022809317526834", "b12efc22acc27dcad4569d60c4f63a36", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
落日派对 = EffectMeta("落日派对", True, "7374708995501739305", "7374708995501739305", "e00847299fab64d98f8ae309c62b98aa", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
落日电影 = EffectMeta("落日电影", True, "7501223866988039434", "7501223866988039434", "ae92cb31192486980824dce7bf4680fe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
落日粉 = EffectMeta("落日粉", True, "7368141858603666698", "7368141858603666698", "66dd18db6e7d8f042e7cf8cd02e64af4", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
落日鎏金 = EffectMeta("落日鎏金", True, "7374251948058447158", "7374251948058447158", "f5154a29054db9946d66ed823cb58006", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
蒸汽机 = EffectMeta("蒸汽机", True, "7232220370667883837", "7232220370667883837", "c6ccfd3ad46f0c3d4715907b325c0fac", [])
蓝梦核 = EffectMeta("蓝梦核", True, "7237440664139484473", "7237440664139484473", "0d12a669f41b3b92d1a892f42b9e0d9b", [])
蓝橙II = EffectMeta("蓝橙II", True, "7337929426493132058", "7337929426493132058", "40056bb94f392bdc1ab305683e265b2b", [])
蓝灰 = EffectMeta("蓝灰", True, "7127667757839076645", "7127667757839076645", "aa8ef49b3edba824d41f097effe534c0", [])
蓝调 = EffectMeta("蓝调", True, "7127664822921022734", "7127664822921022734", "3f0f50b54a2486b3fe5cfbb68dfaeaae", [])
蓝调烟火 = EffectMeta("蓝调烟火", True, "7328363887542209828", "7328363887542209828", "fe2367155cae2d1d5c07c10a64e3b6ef", [])
蓝调舞曲 = EffectMeta("蓝调舞曲", True, "7366562845120646463", "7366562845120646463", "95d43f9239219401b66eae286f0ccc1c", [])
蓝都 = EffectMeta("蓝都", True, "7166470141494955297", "7166470141494955297", "6b7636f5921c185131dd935a77713dd7", [])
蓝金 = EffectMeta("蓝金", True, "7341300292148907327", "7341300292148907327", "4107fa238d7b56801c9cc3a4a3a15c32", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
蔚蓝海域 = EffectMeta("蔚蓝海域", True, "7487297018998607131", "7487297018998607131", "6e6217924fb9c959e770c2dceb2e8a03", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
薄绿 = EffectMeta("薄绿", True, "7344374695053102371", "7344374695053102371", "4d2965f4455177ada455bd38eec021b8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
薄荷奶绿 = EffectMeta("薄荷奶绿", True, "7478775705195547930", "7478775705195547930", "aa440e34665d6b825e6e5c51daddf4cd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
薰草 = EffectMeta("薰草", True, "7199455696017018151", "7199455696017018151", "9864263dc92e5a276336767b1845a731", [])
藤宅 = EffectMeta("藤宅", True, "7159133894975999244", "7159133894975999244", "50294465be1355e66f9b789711193204", [])
街头 = EffectMeta("街头", True, "7263357855678467364", "7263357855678467364", "cec28e1462ddc4ce254c41bc0465d083", [])
褪色胶卷 = EffectMeta("褪色胶卷", True, "7502716416567545099", "7502716416567545099", "8eee6f53a48048bc43e278fe7455fa6b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
西冷 = EffectMeta("西冷", True, "7131899038625975559", "7131899038625975559", "582a118ed87f8ddfbf2bab6ce6ccbba2", [])
西西里 = EffectMeta("西西里", True, "7131488780451663140", "7131488780451663140", "36c35e9b449bd69a2d186c044c8032c8", [])
西部峡谷 = EffectMeta("西部峡谷", True, "7595798301719694654", "7595798301719694654", "ba098db9df33ac91894368a2420a39a7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
西雅图 = EffectMeta("西雅图", True, "7159175960414194982", "7159175960414194982", "d89963be26099b79db297b25e18011a6", [])
诗诺 = EffectMeta("诗诺", True, "7330543523042708790", "7330543523042708790", "ddc9145845f6f5548aba0c4f5ceb76ed", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
诗野 = EffectMeta("诗野", True, "7385930407901990153", "7385930407901990153", "732ab9949e2fa049eafb47f349a435c5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
贝果 = EffectMeta("贝果", True, "7131656881805856013", "7131656881805856013", "21f8c68e7dd3fe22071ed06d21cc328a", [])
质感增蓝 = EffectMeta("质感增蓝", True, "7493589321014906162", "7493589321014906162", "56ce0511b0a6c57c13b9893e02c8b1d9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
质感新中式 = EffectMeta("质感新中式", True, "7493945660903787803", "7493945660903787803", "4d5b0b65c44336d48392212a0cf39f90", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
质感晴春 = EffectMeta("质感晴春", True, "7482408418578271514", "7482408418578271514", "ebd1b0610f7bd86277a84a4499e608e3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
赏味 = EffectMeta("赏味", True, "7127608379056459015", "7127608379056459015", "d29bc8b2ddd9d018da1309ba9a467517", [])
超清4K = EffectMeta("超清4K", True, "7452918022752275762", "7452918022752275762", "b5f7af272fe9c86eba1ab10dfb30af53", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
超清电影 = EffectMeta("超清电影", True, "7437195358075145484", "7437195358075145484", "b4d4468d83898c1aeb1a9dc4562e9675", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
超清电影卷 = EffectMeta("超清电影卷", True, "7475289663381540150", "7475289663381540150", "1a1a0b6e3a384118c2aec2ce7688b31c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
超清画质 = EffectMeta("超清画质", True, "7460107425375472935", "7460107425375472935", "64488ffa5f279bff5138ab001694354b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
超白 = EffectMeta("超白", True, "7302338645938261287", "7302338645938261287", "08f7a0eb8cd3535a23b4360acc4cc2f0", [])
超透白皙 = EffectMeta("超透白皙", True, "7554056334228917514", "7554056334228917514", "bc71eed566e221f65b3f0ade45e0a7b2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
超高清 = EffectMeta("超高清", True, "7471501720732863753", "7471501720732863753", "fa6384cf3f1bba156d8aa7d8c75707c5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
越岭 = EffectMeta("越岭", True, "7193989203930123554", "7193989203930123554", "80634d76c41bb167ee4c2bec4172235b", [])
越野 = EffectMeta("越野", True, "7195931118166609190", "7195931118166609190", "f8f340ecb359e2dd7f155da84b06f013", [])
轻古早 = EffectMeta("轻古早", True, "7592592527794998580", "7592592527794998580", "4885d22159b8eae574e31fec0f3c086a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
轻氧夏 = EffectMeta("轻氧夏", True, "7522455016272121124", "7522455016272121124", "94ed475a3c59137c13fa00a9775987f2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
轻肤III = EffectMeta("轻肤III", True, "7387063538507975974", "7387063538507975974", "cbdb0b96103a7d22d960553d35bc8ebe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
轻胶少女 = EffectMeta("轻胶少女", True, "7368463117287804197", "7368463117287804197", "5a1420dd511148188fa11d42998052ab", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
过期电影卷 = EffectMeta("过期电影卷", True, "7361791960652238143", "7361791960652238143", "7b98e4262666c36aeb965842cd14d10a", [])
运动质感 = EffectMeta("运动质感", True, "7515060642705952011", "7515060642705952011", "375bb7107af2eadbb68bed5634e0c738", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
迷幻 = EffectMeta("迷幻", True, "7233731748545203493", "7233731748545203493", "6eb7969f4e1becb256c90950b3cb8eb3", [])
迷雾 = EffectMeta("迷雾", True, "7160594413847203085", "7160594413847203085", "5143fc0b35bca33c7b010458ffe8f1d7", [])
逆光拯救 = EffectMeta("逆光拯救", True, "7503403496117521690", "7503403496117521690", "215ef7f95fec78bf8ae7a287704ec22a", [
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认70%, 0% ~ 100%"""
逆光提亮 = EffectMeta("逆光提亮", True, "7524288987129810214", "7524288987129810214", "314431f06e12dda849a2404eae2086cd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
透氧肌肤 = EffectMeta("透氧肌肤", True, "7486780026029870386", "7486780026029870386", "28c30d84ec48ad647c130cd13699640d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
通透 = EffectMeta("通透", True, "7530582568769522980", "7530582568769522980", "91c475f7f652322e83863e2e9105bbc2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
通透暖食 = EffectMeta("通透暖食", True, "7409674549467352374", "7409674549467352374", "cad4cbe7d4bc4b96a84ff02b53733227", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
通透氧感 = EffectMeta("通透氧感", True, "7506758417143450890", "7506758417143450890", "9b272a024e2b804c5c5d1a373b9dddcf", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
邂逅 = EffectMeta("邂逅", True, "7271145889119440147", "7271145889119440147", "6b6957bc110b65e03bc5d9ae65de6d66", [])
郁金香 = EffectMeta("郁金香", True, "7343831195924303123", "7343831195924303123", "15e11e4352b9891fd1a1969ff7841b6b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
都卡 = EffectMeta("都卡", True, "7341296364598480178", "7341296364598480178", "fac476280a61adbc7a731a9ee538b0b1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
都城 = EffectMeta("都城", True, "7148817291583474980", "7148817291583474980", "3c6ec02ca887c9fdca982be6b3916430", [])
都市 = EffectMeta("都市", True, "7312646683672825100", "7312646683672825100", "486a70b4dc6b3cbedf1ad34461022d78", [])
都市电影II = EffectMeta("都市电影II", True, "7406976302122618123", "7406976302122618123", "ac28bc6e0a041b86886720147edbc7cd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
酚蓝 = EffectMeta("酚蓝", True, "7131322091839753502", "7131322091839753502", "29848db45e217e3af6f2ad05a252fea4", [])
酷感辣妹 = EffectMeta("酷感辣妹", True, "7506178551725542696", "7506178551725542696", "89ff083b5e1c9d7fcde3556f6f116025", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
酷绿 = EffectMeta("酷绿", True, "7281165120980454713", "7281165120980454713", "a8c562d272e85ba3920043355e3fdf69", [])
醒春 = EffectMeta("醒春", True, "7211006465358843196", "7211006465358843196", "3544111511d3c365e3068023059ed83e", [])
里昂 = EffectMeta("里昂", True, "7131643870714006821", "7131643870714006821", "634a11a0d1a1b69aa4ac2770aa47c7dc", [])
野林 = EffectMeta("野林", True, "7395470918245502234", "7395470918245502234", "55d1cb1e80f65e9b7de90b4634573223", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
野趣 = EffectMeta("野趣", True, "7193983160231742772", "7193983160231742772", "dc9a0e3b25c1b462e5c684ac64bbb1b7", [])
金姜 = EffectMeta("金姜", True, "7233733326517832995", "7233733326517832995", "5116f63c46a435d34ccb83fd58b3d009", [])
金粉飘落 = EffectMeta("金粉飘落", True, "7456773992901397787", "7456773992901397787", "0367f5e04e48d7526c33f0b210ebb41d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
铅绿 = EffectMeta("铅绿", True, "7131509679246675208", "7131509679246675208", "a2f9487c275619234b3e3ca37badad36", [])
银蓝 = EffectMeta("银蓝", True, "7145394266209127694", "7145394266209127694", "e1f2f32043ab9fd801bfdbc9a9f708d3", [])
镜粉 = EffectMeta("镜粉", True, "7145390299370638600", "7145390299370638600", "26b6e129d49359d3112438c001f22926", [])
闪星 = EffectMeta("闪星", True, "7346450662185569555", "7346450662185569555", "f9bdd96e9282b3783dcc174484aa5fc6", [])
闪耀派对 = EffectMeta("闪耀派对", True, "7471169568484953363", "7471169568484953363", "b188a83453552dc05b8f32619c7e3e40", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
阳光肤 = EffectMeta("阳光肤", True, "7234795543178775868", "7234795543178775868", "116a1adcf464b736d76bf31d679b3d72", [])
阴天拯救 = EffectMeta("阴天拯救", True, "7361399516454604071", "7361399516454604071", "a219fa1f7b74d889f137be1ef3b136a6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
陶瓷肌 = EffectMeta("陶瓷肌", True, "7234793127867878712", "7234793127867878712", "e7b66853ca5dbdb1c049d45225b355cb", [])
随性 = EffectMeta("随性", True, "7271140658071588132", "7271140658071588132", "6619560c233df84381e8c371b7387faa", [])
雀染 = EffectMeta("雀染", True, "7145394848361729288", "7145394848361729288", "c6bc39d80e10c8bfe361164e83585a01", [])
雅西卡 = EffectMeta("雅西卡", True, "7569903893891714329", "7569903893891714329", "2076756290bdcea6bca3040162a47637", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
雨皂 = EffectMeta("雨皂", True, "7145678373530946824", "7145678373530946824", "af2869df0cbd9ea0ac0443206e91b135", [])
雨空 = EffectMeta("雨空", True, "7196917591909109052", "7196917591909109052", "ffe686005136a692517b6e19e4e490e7", [])
雪地胶片 = EffectMeta("雪地胶片", True, "7431914829876694324", "7431914829876694324", "fb5e7ff5746e82dc6a426e2731012359", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
雪地胶片II = EffectMeta("雪地胶片II", True, "7431914902177991970", "7431914902177991970", "e739418605bc306c84cde37fd76b937a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
雪地胶片III = EffectMeta("雪地胶片III", True, "7431914955747691810", "7431914955747691810", "52e66f9849aed0df650660c2cc97a9f5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
雪挞 = EffectMeta("雪挞", True, "7262376135202327871", "7262376135202327871", "319cab31ed6a056c3f5256a357eb9b96", [])
雪白肤III = EffectMeta("雪白肤III", True, "7426223181205146890", "7426223181205146890", "76bb0c72be291d1ea9d9f108b67a70c1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
雪白透亮 = EffectMeta("雪白透亮", True, "7564026160212987190", "7564026160212987190", "cea2e70ffe56f0f03ec4e1be240bd34d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
雾都 = EffectMeta("雾都", True, "7312646650202262820", "7312646650202262820", "00b8522f76bf9a991e0a6090f63747ee", [])
雾野 = EffectMeta("雾野", True, "7127823362356727077", "7127823362356727077", "6fbd00682d2a15e079bc242301e9b757", [])
青提 = EffectMeta("青提", True, "7131290518838938887", "7131290518838938887", "9cd0e0ba2190b96f6eccacbed5151b24", [])
青春照 = EffectMeta("青春照", True, "7513077194952936767", "7513077194952936767", "754dec3e8e77d8fcb6e0902e63a923bd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
青春胶片 = EffectMeta("青春胶片", True, "7510888042761096459", "7510888042761096459", "d7cee0f1454e87ac7735278aef69ebc7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
青森 = EffectMeta("青森", True, "7145390299106381086", "7145390299106381086", "9b0479f9bd81b1c22908e882f16610d8", [])
青橙电影感 = EffectMeta("青橙电影感", True, "7478335987777572137", "7478335987777572137", "0acf322490d8427244fbfda12940b3f6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
青灰 = EffectMeta("青灰", True, "7127671508264078599", "7127671508264078599", "a9b480c9b5bf91d2aa0b5e8388f53746", [])
青蒲 = EffectMeta("青蒲", True, "7145393992673414407", "7145393992673414407", "7cd919e92b66b19e00c95b9f3db9def8", [])
青黄 = EffectMeta("青黄", True, "7127541821332409630", "7127541821332409630", "e777bf266933df88bfc019a84e6dd792", [])
青黄II = EffectMeta("青黄II", True, "7337932621046910262", "7337932621046910262", "059b7e40c1fe52a2451c35bd82e329e5", [])
韦斯 = EffectMeta("韦斯", True, "7226989951911562553", "7226989951911562553", "7162086ae8bf07df55d86ce535bdd75c", [])
韩女古早 = EffectMeta("韩女古早", True, "7538333322636741903", "7538333322636741903", "b6d5cb83bda0447010412e05d9471992", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
韩式古早 = EffectMeta("韩式古早", True, "7592591080688864546", "7592591080688864546", "4b481cd8955cc08bf0daaad898186364", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
韩系INS = EffectMeta("韩系INS", True, "7407460599929572627", "7407460599929572627", "797ac245a94d625e2b38faf848e12fd8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
风味 = EffectMeta("风味", True, "7330579916272012580", "7330579916272012580", "7abbb099b234e92b6a7169f2ae6232b6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
风铃II = EffectMeta("风铃II", True, "7356885346841349410", "7356885346841349410", "7e36a3f345976371e7a668d1e96c7905", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
风铃蓝 = EffectMeta("风铃蓝", True, "7261466919688015140", "7261466919688015140", "5bf0d1478c19629df96ad85b3301ec35", [])
飒意 = EffectMeta("飒意", True, "7248568718265978112", "7248568718265978112", "25a705fe908fad028d75a5b9bf30e4b7", [])
食光II = EffectMeta("食光II", True, "7478181967532543259", "7478181967532543259", "dee8c9a0537f6b78d56eb3b32a5f5de1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
食色 = EffectMeta("食色", True, "7131644140340776205", "7131644140340776205", "8540ba0ddb988c6f5f4b69742ca94136", [])
香浓 = EffectMeta("香浓", True, "7330588808666156307", "7330588808666156307", "480c2599aaaf7be5a800c269dada7cdd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
驮月 = EffectMeta("驮月", True, "7145394213339860261", "7145394213339860261", "ba8a3a6272282d63ee8b46c2e228e09b", [])
高晴画质 = EffectMeta("高晴画质", True, "7486890470149246219", "7486890470149246219", "8bdb640b5e3aa5fcd6c19f31463f36f9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清 = EffectMeta("高清", True, "7447039744229428534", "7447039744229428534", "838ba5b40cfb93c8c8f4ac23489dd0ce", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清4k电影 = EffectMeta("高清4k电影", True, "7454130417562553651", "7454130417562553651", "cc6b3db256e26231e11fa48b17d80b71", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清II = EffectMeta("高清II", True, "7325426821267295551", "7325426821267295551", "17a86357c081e0d080c9d501a66382d0", [])
高清中性灰 = EffectMeta("高清中性灰", True, "7476126917280730378", "7476126917280730378", "34151fd0c9652a96e5debded17f272e9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清亮粉 = EffectMeta("高清亮粉", True, "7474611627338239282", "7474611627338239282", "202d1c83b5a7fa0e2bc1e29f28fd2d5f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清修复 = EffectMeta("高清修复", True, "7471501728546966835", "7471501728546966835", "9703a70d4a78fd4e9185a3cab90259c0", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清修复III = EffectMeta("高清修复III", True, "7402847660165713190", "7402847660165713190", "3bf03425397e50f8a51df7f69fe34138", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清冷冬 = EffectMeta("高清冷冬", True, "7446737538967932186", "7446737538967932186", "a29f0443ce7468781539fe86dc17918a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清圣诞 = EffectMeta("高清圣诞", True, "7446290162922818870", "7446290162922818870", "4e9a65f2fdaa588f544c6b411e998547", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清增强 = EffectMeta("高清增强", True, "7426668776491453707", "7426668776491453707", "c28d7683eb3bbc58cd3b008b380ed551", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清增色 = EffectMeta("高清增色", True, "7440518219409968384", "7440518219409968384", "bdf331387c885b59eb154db384b9f801", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清增质 = EffectMeta("高清增质", True, "7436815358410886435", "7436815358410886435", "b2394c83d83e47b5f21b0307af48ac9e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清寒冬 = EffectMeta("高清寒冬", True, "7449684693982743817", "7449684693982743817", "dfd7cf9a4a54f20c70b2c9b2c5fbc6aa", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清影视 = EffectMeta("高清影视", True, "7437098009827036455", "7437098009827036455", "0cdff3f488d2dff927a695fdae418784", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清感 = EffectMeta("高清感", True, "7414810241453280549", "7414810241453280549", "f26fae62c0f2cc8b44506cd07d6a086e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清感II = EffectMeta("高清感II", True, "7414810073731435785", "7414810073731435785", "b09366ac9d328a2594c8c0953e7f1167", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清感III = EffectMeta("高清感III", True, "7414810202706447625", "7414810202706447625", "8c9985eeeedee5235a4943b845b240cd", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清提亮 = EffectMeta("高清提亮", True, "7439995842477428004", "7439995842477428004", "100906363649af4f5176b8565f27fc39", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清提升 = EffectMeta("高清提升", True, "7443710725773675803", "7443710725773675803", "f65967d1ee75e1d946c95fe6c730240f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清春日 = EffectMeta("高清春日", True, "7476104906924100915", "7476104906924100915", "a0150e0273b470188e19f1b7b24e4ef1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清晴天 = EffectMeta("高清晴天", True, "7442389591140748570", "7442389591140748570", "e7b2e8a233f1d0bc5b71aca1f8fa44ed", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清晴日 = EffectMeta("高清晴日", True, "7448290256476065035", "7448290256476065035", "23940e28ee7ceab734e59b2102fc7904", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清暖调 = EffectMeta("高清暖调", True, "7431187754379136266", "7431187754379136266", "23aea64209982cc3a0a3b1acdd276b3e", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清润颜 = EffectMeta("高清润颜", True, "7428629277110848768", "7428629277110848768", "1df56b348fb1eacd59e730e89e9b0363", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清漫晴 = EffectMeta("高清漫晴", True, "7442344329114422565", "7442344329114422565", "d948e6691c99022bb4cfed02a660245f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清焕晴 = EffectMeta("高清焕晴", True, "7471955373340101927", "7471955373340101927", "734bfe48985cc95384f10bb201f24dbe", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清电影 = EffectMeta("高清电影", True, "7413062310580800831", "7413062310580800831", "c6209556e6b9b723b7a2c7bf83d29051", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清电影卷 = EffectMeta("高清电影卷", True, "7452946862581058853", "7452946862581058853", "4ccd0bcc2434245db6d247397682b534", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清画质 = EffectMeta("高清画质", True, "7465342226118266162", "7465342226118266162", "3450ce5a0c73d4728321ba46ed98aed7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清绿妍 = EffectMeta("高清绿妍", True, "7451808659320900891", "7451808659320900891", "7d50bac0231c7a6538ff64ca8c9d3218", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清美食 = EffectMeta("高清美食", True, "7435865312907676978", "7435865312907676978", "88736302c2c09917ddf9dd6ebef77373", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清自然 = EffectMeta("高清自然", True, "7469688503262039334", "7469688503262039334", "2f74c3aca65c95a3f998812d6e492016", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清质感 = EffectMeta("高清质感", True, "7433451928773807397", "7433451928773807397", "30ae508cfe0edc3ec1f749c243997a2a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清雪景 = EffectMeta("高清雪景", True, "7444960692853148955", "7444960692853148955", "04a4ecbde473119e6b055fcc0d34eb4a", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清雪肤 = EffectMeta("高清雪肤", True, "7447397442603076899", "7447397442603076899", "0fd44648b707fbea89ec49eaa2320b2d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清鲜明 = EffectMeta("高清鲜明", True, "7435675065498275081", "7435675065498275081", "46ab34769df26db38c9a7f84ca66c0d9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清黑白 = EffectMeta("高清黑白", True, "7429744855724641545", "7429744855724641545", "064d56e4db73deb306811f49462fffcb", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高清默冬 = EffectMeta("高清默冬", True, "7450134286071631141", "7450134286071631141", "6d27a4cc883039e86d079f7a80e51b40", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高级影视 = EffectMeta("高级影视", True, "7513959933310749991", "7513959933310749991", "cadf521e0e50c405df615f7c07dbbcb1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高级质感 = EffectMeta("高级质感", True, "7525074000846802227", "7525074000846802227", "bbde98630add7a33bab859fb52a27bf2", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
高街 = EffectMeta("高街", True, "7145394469666376991", "7145394469666376991", "7036694f303647fe7526848bb622947f", [])
高质感电影 = EffectMeta("高质感电影", True, "7528823226357665050", "7528823226357665050", "7372405faae785d55b79a73d6b7723a5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
魅影 = EffectMeta("魅影", True, "7175076304058895619", "7175076304058895619", "361328c4bc995c85053ea003268aefbf", [])
魔都 = EffectMeta("魔都", True, "7166480345666260263", "7166480345666260263", "cf4adfafcc5e59b9bddd8eeb4d20f44e", [])
鲜亮 = EffectMeta("鲜亮", True, "7127615338035858702", "7127615338035858702", "329252a715f5e0f9727810511e0e9832", [])
鲜明 = EffectMeta("鲜明", True, "7320434750018047251", "7320434750018047251", "ba8b7cbf504c97a30c923d0d6a6c2b44", [])
鲜明II = EffectMeta("鲜明II", True, "7361400073533820196", "7361400073533820196", "350ff543fdd150a6f7e571aa3f467640", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鲜明增色 = EffectMeta("鲜明增色", True, "7463798839258909963", "7463798839258909963", "4c2512b58fb8debd1c75ce016a8919a5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鲜美 = EffectMeta("鲜美", True, "7330581892510649636", "7330581892510649636", "0f2146e69f0cf22a0e0aa733be623bd4", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鲜艳增色 = EffectMeta("鲜艳增色", True, "7497157143502654732", "7497157143502654732", "9008c9a3d5200c39fc34090ffca9a3d8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鲜花增彩 = EffectMeta("鲜花增彩", True, "7494505446158503179", "7494505446158503179", "38823b82a91be95b6ac61dd9fe1054e8", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鲜花增色 = EffectMeta("鲜花增色", True, "7493083101426453796", "7493083101426453796", "f5b7e85440654ec13e83c55de61cb8fc", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%"""
鲜花增艳 = EffectMeta("鲜花增艳", True, "7493457725431631142", "7493457725431631142", "bed611a951986953cad10fe37720acd1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鲜花自然 = EffectMeta("鲜花自然", True, "7610447734406941994", "7610447734406941994", "ea05726be30c1ff7645cb754c3df8292", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鲜萃食光 = EffectMeta("鲜萃食光", True, "7580047192463969560", "7580047192463969560", "0cc0343094d17a7136fbbff28bd08a36", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鸿运新春 = EffectMeta("鸿运新春", True, "7595835595054730542", "7595835595054730542", "6ba9471c2fc7de958fde09e2488ff7ba", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
鹅冠 = EffectMeta("鹅冠", True, "7308714123913612607", "7308714123913612607", "37be69ef37633c108a65ab994875d06e", [])
麋鹿 = EffectMeta("麋鹿", True, "7430673747708792075", "7430673747708792075", "80fb6fdd7346e05845f45a7f0966049d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
黄昏 = EffectMeta("黄昏", True, "7272330168717430075", "7272330168717430075", "eebcc8f84ff895bd0d66535d9ad44275", [])
黑冰 = EffectMeta("黑冰", True, "7131522303082466597", "7131522303082466597", "d03c03e8f1e67f5cff0a5671fe96dfb9", [])
黑暗神话 = EffectMeta("黑暗神话", True, "7408496787398446362", "7408496787398446362", "0685a00dcd0068efd472e6019d312774", [])
黑曜 = EffectMeta("黑曜", True, "7223712396769119545", "7223712396769119545", "3b81efb578ddec8efa40dd0c5b754056", [])
黑白记忆 = EffectMeta("黑白记忆", True, "7533265997478808841", "7533265997478808841", "6c0dc5428414f66db73be80c2bc1c012", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
黑金 = EffectMeta("黑金", True, "7414902721733479699", "7414902721733479699", "46eddfebd9864056c59bf8219cb671e9", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
黑金红 = EffectMeta("黑金红", True, "7341266486536768831", "7341266486536768831", "66796ec5de5e85b2cf461fa49b4c0225", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
黛瓦 = EffectMeta("黛瓦", True, "7226247580018019644", "7226247580018019644", "5d96058b7d47716b7c928aca57407cb7", [])
龙舌兰 = EffectMeta("龙舌兰", True, "7252674245396942139", "7252674245396942139", "254083154fd15d41d41cc3763eda9f40", [])
================================================
FILE: src/pyJianYingDraft/metadata/font_meta.py
================================================
"""字体资源元数据"""
from .effect_meta import EffectEnum
from .effect_meta import EffectMeta
class FontType(EffectEnum):
"""字体资源类型"""
# 免费特效
_3D_만화 = EffectMeta("3D 만화", False, "6841117833447870990", "20402387", "9d79db0486d90980a54240b3313ea156", [])
A1明朝 = EffectMeta("A1明朝", False, "7246698168547545602", "20403949", "6eca3b3507bab16aac9ad557fa17a46e", [])
AlexBrush = EffectMeta("AlexBrush", False, "7241838813960475173", "14864426", "6be278d4aef1173e6ca44f9ff96f913a", [])
Alice_Regular = EffectMeta("Alice-Regular", False, "7238874837500826170", "14443129", "2d35398aea443c50ab0f28f32492311d", [])
Alike_Regular = EffectMeta("Alike-Regular", False, "7238879091334582821", "14443547", "51f4b11df2a6423c714ce8e27febf3a8", [])
Allura_Regular = EffectMeta("Allura-Regular", False, "7239181917067678266", "14864457", "db0c6eb393c3b4e0db86ef3f81c2df49", [])
Amble_Regular = EffectMeta("Amble-Regular", False, "7236679983140180539", "14138187", "681c9b484dbc55dc6322de5318773956", [])
Amigate = EffectMeta("Amigate", False, "7042231710112551431", "1485328", "1496029e87060f4208d5fbc127ed5f2c", [])
Anson = EffectMeta("Anson", False, "7312373886476096001", "37083210", "1f6c4b124f1cc0c8dc64e9a8d5d5db1c", [])
Anton = EffectMeta("Anton", False, "6807743423336944142", "643585", "42dd948f3247dc39f802bf951e9be731", [])
Arizonia_Regular = EffectMeta("Arizonia-Regular", False, "7239188828425032252", "14864444", "00b288db92a3de4e612d10a6d73dd551", [])
Arvo = EffectMeta("Arvo", False, "7238901809073361467", "14451489", "a086736a58a78472c0b20dc4ab1e6c86", [])
Ballet = EffectMeta("Ballet", False, "7241838661656908343", "14864427", "fd0c45be63da4eea7647907d22335953", [])
Barrio_Regular = EffectMeta("Barrio-Regular", False, "7239174980292842044", "14471579", "08c0bd8b8b221c5ab1a6c601d03c1643", [])
Belleza_Regular = EffectMeta("Belleza-Regular", False, "7234404156780319288", "13824767", "fe94f7ae72a9ec37f34c25d99835d35b", [])
Bevan_Regular = EffectMeta("Bevan-Regular", False, "7238530249451901496", "14400121", "1d181b88d75b2728ae21ecec60525f01", [])
Bilbo_Regular = EffectMeta("Bilbo-Regular", False, "7239189505289228861", "14864440", "d0619bf78b9ad1b563f44726bf5e6eeb", [])
BlackMango_Regular = EffectMeta("BlackMango-Regular", False, "7306445155244970497", "41472093", "8f91492140c961395923bc1edd9abae8", [])
Blinker_Thin = EffectMeta("Blinker-Thin", False, "7209874013324055098", "10587620", "81c6838b262365f201bbc4e7bd1dd3d4", [])
Boxing = EffectMeta("Boxing", False, "7078972382651617805", "1648729", "bab7d0b17e408bd9098c074825e15fc0", [])
Bungee_Regular = EffectMeta("Bungee-Regular", False, "7314592672792973826", "37039650", "26f72c42742cd487ebafebfa8bc45c4f", [])
Caladea_Regular = EffectMeta("Caladea-Regular", False, "7209874013319860797", "10587623", "2611c4dab5e14627c0d2d0e1da6b2279", [])
Calfine = EffectMeta("Calfine", False, "7076269550299255309", "1632683", "4064e735eb58176895303b2c16b746a0", [])
Candal_Regular = EffectMeta("Candal-Regular", False, "7234514498579599928", "13854523", "a2d487c2f846a1ccda2bf132ed899a0f", [])
Candice = EffectMeta("Candice", False, "7080446593123488286", "1656182", "64df76345cbd40beadae4bd3de9ba3b2", [])
Carattere_Regular = EffectMeta("Carattere-Regular", False, "7277869798401249851", "22621896", "b80aaa34cc2482fbba8d202f881b1405", [])
Cardo_Regular = EffectMeta("Cardo-Regular", False, "7209874013324055101", "10587624", "9ace63fa497bb12601dd89a36864bb3e", [])
Caveat_Bold = EffectMeta("Caveat-Bold", False, "7239187536675869242", "14864446", "4388f5af4caff83b8b322d911bfc54bd", [])
Caveat_Regular = EffectMeta("Caveat-Regular", False, "7277872672304796217", "22621892", "2ad4a79314b4fe122e8ff7599133cf4a", [])
Chonburi_Regular = EffectMeta("Chonburi-Regular", False, "7209944750021939771", "10608872", "77ff38c7d3ea5d01f2f2609a56f12d9e", [])
Cinzel_Regular = EffectMeta("Cinzel-Regular", False, "7209874013324055095", "10587622", "ef50d040311cab144dd0879e9fb17214", [])
Coda_Heavy = EffectMeta("Coda-Heavy", False, "7234514878008922681", "13854593", "e59a0f53b9d8fcf82f0ecc64e6e82b03", [])
Coiny_Regular = EffectMeta("Coiny-Regular", False, "7203293403990200834", "27240316", "027b0038d0184ca86288c22298b82600", [])
Cola = EffectMeta("Cola", False, "7076270486740537863", "1632682", "bb54dd710db7f3d31d747d4f62421710", [])
Cookie_Regular = EffectMeta("Cookie-Regular", False, "7239182754624049720", "14864454", "cf340cf39c31a5b28b85b5f6dec07367", [])
Cormorant_Garamond_Medium = EffectMeta("Cormorant Garamond-Medium", False, "7238899812190392888", "14451211", "f7693a5eb89ce8af8b6b978d89dbc56e", [])
Coustard_Regular = EffectMeta("Coustard-Regular", False, "7209874014028698172", "10587614", "99006417512ae6c9126a739f6cdbeea1", [])
Crimson_SemiboldItalic = EffectMeta("Crimson-SemiboldItalic", False, "7239227834273632827", "14864433", "b6cc62d01a2cc5280c48b7db98db93c4", [])
Dynalight_Regular = EffectMeta("Dynalight-Regular", False, "7239227395088060987", "14864435", "5d5320056f020e023af8d8b2cc437882", [])
Exo = EffectMeta("Exo", False, "7003588519440421413", "1349503", "c7861a7748efe6c7f69b2d864881eeb3", [])
Facon = EffectMeta("Facon", False, "6807743498851193352", "643587", "efbc6d45df587ebb12ed68df89da03ff", [])
FiraSans_Book = EffectMeta("FiraSans-Book", False, "7236005080040739388", "14037099", "d8e3ce7cb329f8fd088ab68593cee7c3", [])
Fraunces_Black = EffectMeta("Fraunces-Black", False, "7209874014221636155", "10587607", "e4eaeb42700c4e326415285bcd62568c", [])
Fulbo_Argenta = EffectMeta("Fulbo-Argenta", False, "7239234097267085861", "14490123", "df542eac625386374be06a4ff47f44bb", [])
Gallery = EffectMeta("Gallery", False, "7030677248797577765", "1441466", "c6c8e230a16440a4df49ae96893c8211", [])
GenWanMinJP_Light_源云明体 = EffectMeta("GenWanMinJP-Light(源云明体)", False, "7265529261530812985", "20356559", "c6088aac4b7825da8d0781b25375b333", [])
GenWanMinJP_Medium_源云明体 = EffectMeta("GenWanMinJP-Medium(源云明体)", False, "7265529620802310713", "20356561", "941698601932e62603a114646b13c8d6", [])
GenWanMinJP_Regular_源云明体 = EffectMeta("GenWanMinJP-Regular(源云明体)", False, "7265529744542667322", "20356563", "62a5403aa320065c8020fff2332606a0", [])
GenWanMinJP_SB_源云明体 = EffectMeta("GenWanMinJP-SB(源云明体)", False, "7265529923547173413", "20356565", "f8f73f5b108d3a2ada9b8bdb5ba230ce", [])
Giveny = EffectMeta("Giveny", False, "7030676531156357645", "1441468", "7499748cd12c31b8e3e5c30fb7184a54", [])
Great_Vibes_Regular = EffectMeta("Great Vibes-Regular", False, "7239229310119187001", "14864431", "055d9f5c35d0a5b803ff9eb94cfd1c9d", [])
Grenze_Thin = EffectMeta("Grenze-Thin", False, "7209874014951445051", "10587602", "654a7647f1fc34d7bd45eaf48bc09f94", [])
HG行書体 = EffectMeta("HG行書体", False, "6808052324217393677", "20402937", "f5db863a8c3d18dd45b27ebf125f3053", [])
HarmonyOSCn_Ltlt = EffectMeta("HarmonyOSCn-Ltlt", False, "7265589159580930621", "20373125", "896d4f7f284c9fac25df861900c40b52", [])
HarmonyOS_Sans_SC_Bold = EffectMeta("HarmonyOS_Sans_SC_Bold", False, "7265594890002633272", "20374146", "43f72102bcc9cf55d485857e81a4b1d0", [])
HarmonyOS_Sans_SC_Light = EffectMeta("HarmonyOS_Sans_SC_Light", False, "7265595050145354295", "20374151", "049f4b5a6101391d7e4b67654a5ba00b", [])
HarmonyOS_Sans_SC_Medium = EffectMeta("HarmonyOS_Sans_SC_Medium", False, "7265595177916437050", "20374140", "b6636326c0e4bd6b7d163210313e36b1", [])
HarmonyOS_Sans_SC_Regular = EffectMeta("HarmonyOS_Sans_SC_Regular", False, "7265595305163231781", "20374142", "ae33e48fc99aa4c8bdf259ec8aa7b768", [])
HarmonyOS_Sans_TC_Bold = EffectMeta("HarmonyOS_Sans_TC_Bold", False, "7265530043495879226", "20356569", "ed1b8e7841ccba0c1a530d4d975a3651", [])
HarmonyOS_Sans_TC_Light = EffectMeta("HarmonyOS_Sans_TC_Light", False, "7265530445658329661", "20356571", "f43d72b12b7ac433a6b9efd13b00e44c", [])
HarmonyOS_Sans_TC_Medium = EffectMeta("HarmonyOS_Sans_TC_Medium", False, "7265530519687795255", "20356573", "116d59aa44e88bda1c3b4652ccc42bc5", [])
HarmonyOS_Sans_TC_Regular = EffectMeta("HarmonyOS_Sans_TC_Regular", False, "7265530629050077754", "20356575", "57cdc99508ebf188ee9107f21c558e1d", [])
HeptaSlab_Light = EffectMeta("HeptaSlab-Light", False, "7277873865001275964", "22621897", "3fd3c1d463fc7ae1918dff1ce91544ae", [])
Inter_SemiBold = EffectMeta("Inter-SemiBold", False, "7314592494006571522", "37039662", "a6c30071ea24cb16a01a3bf1bc6be1fc", [])
Italianno = EffectMeta("Italianno", False, "7241839293499445820", "14864422", "556a3f0ce762e7524a1163ffc59ffd54", [])
Jellee_Bold = EffectMeta("Jellee-Bold", False, "7239233471132996153", "14489881", "d20fff398f68280b5a62d5c6718251ef", [])
Kanit_ExtraBoldItalic = EffectMeta("Kanit-ExtraBoldItalic", False, "7341281330442801665", "48512062", "aebb4a5aba5f9fa5fbc1e108ae58738b", [])
Kanit_Regular = EffectMeta("Kanit-Regular", False, "7341281459799331330", "48512024", "8c53bab543a483f4aea69870952e15b5", [])
KaushanScript = EffectMeta("KaushanScript", False, "7241838959305691707", "14864425", "668f46331e342dbebebb36c127e9d937", [])
Koulen_Regular = EffectMeta("Koulen-Regular", False, "7341281656319250945", "48512036", "7b5c8caefbc8f8c2cf6834e65d10c48a", [])
LXGWWenKai_Bold = EffectMeta("LXGWWenKai-Bold", False, "7265591538472718903", "20373127", "562011555df237de57ff2da20dde5ecc", [])
LXGWWenKai_Light = EffectMeta("LXGWWenKai-Light", False, "7265592227118715448", "20373111", "302ec5cdf24cd8ed486ffdcfc1431c39", [])
LXGWWenKai_Regular = EffectMeta("LXGWWenKai-Regular", False, "7265591946897265212", "20373101", "7bac545cc43d16cfc89b681ba37b06e7", [])
Letter = EffectMeta("Letter", False, "6740438320989344263", "349325", "afe91c6c7dfc29fca46fd33e9900e738", [])
Lexend_Tera_Regular = EffectMeta("Lexend Tera-Regular", False, "7234820388151104061", "13897171", "c80509ef3cbbf1a22e997e028d8d65d7", [])
Lora_Regular = EffectMeta("Lora-Regular", False, "7238875962530599481", "14443153", "b5e90b8f301b01629056e71f3df5a456", [])
Love = EffectMeta("Love", False, "6766522308593979917", "459276", "a329a038511121412865fa841f51dfc3", [])
Luxury = EffectMeta("Luxury", False, "7291876268541219329", "41472051", "8b2c690dc8c0a5124b5536aab2915747", [])
Maler = EffectMeta("Maler", False, "7080115730963763743", "1654362", "bc7bb1a47b0de76584924e455397ec39", [])
Marker = EffectMeta("Marker", False, "6766523474354639373", "459282", "a32ce70017cd4b72adc8aee8768c2380", [])
Mirza_Regular = EffectMeta("Mirza-Regular", False, "7239174396349256249", "14471319", "10d2e66842d9ee555bede8d5b1f0dbe7", [])
Misto = EffectMeta("Misto", False, "7078972749472862757", "1648728", "3a0130cbb7dd5e67908f7c1549f2b16c", [])
Modern = EffectMeta("Modern", False, "6740498577912500749", "349479", "3bd3fe9a9464df4555335393bb266aba", [])
Mokgech = EffectMeta("Mokgech", False, "7042232545433358878", "1485324", "40cd447e9f6cd01454c5754e29d8d277", [])
Montserrat_Black = EffectMeta("Montserrat-Black", False, "7314592902414340609", "37039624", "93753515f71befcab33fb82a861ae668", [])
Montserrat_Thin = EffectMeta("Montserrat-Thin", False, "7209944750529450554", "10608863", "fd322e04efc93ed0b04a5c5eccf8670a", [])
Nunito = EffectMeta("Nunito", False, "6807743644842332685", "643589", "5243915a1b14f5fe467f4d5f10d2ba38", [])
OldStandardTT_Regular = EffectMeta("OldStandardTT-Regular", False, "7277874282493907512", "22621894", "24b6280d5832d9d6cbfada464f5c5a61", [])
Parisienne_Regular = EffectMeta("Parisienne-Regular", False, "7239229422367150652", "14864430", "1198a78a64a487470c2896642867fd4f", [])
Playfair_Display_SC_Re = EffectMeta("Playfair Display SC-Re", False, "7238897435437699639", "14450193", "ad4a8a89cccf34fa545d809eb5fb9e98", [])
PlayfairDisplay_Italic = EffectMeta("PlayfairDisplay-Italic", False, "7238900597125026341", "14451355", "5f2b452050047a6277d4a8e4a0714719", [])
Plunct = EffectMeta("Plunct", False, "7035916496484176421", "1459552", "ba351b572d684c0f8ea9b7d6cab9f500", [])
Polly = EffectMeta("Polly", False, "7078971156350374431", "1648730", "02fb23bcda9f281d4029ef482bb3c1fb", [])
Poppins_Bold = EffectMeta("Poppins-Bold", False, "7312373689708712449", "41472095", "d090413fb1d5672cdf7177fea62fbccd", [])
Poppins_Regular = EffectMeta("Poppins-Regular", False, "7202912523383738881", "41472101", "62f9677bff07407d954efbb810d8273e", [])
Prata = EffectMeta("Prata", False, "6807743776916771335", "643593", "e02d50dc998334eb230ccf6abd8703d2", [])
Quattrocento_Regular = EffectMeta("Quattrocento-Regular", False, "7238898734724026917", "14450839", "a48a832bc5b72fcfedc20c67dfa355ce", [])
RedHatDisplay_BoldItalic = EffectMeta("RedHatDisplay-BoldItalic", False, "7341281783637348865", "48512032", "c24c458d3099c3e7f327635326ba78ce", [])
RedHatDisplay_Light = EffectMeta("RedHatDisplay-Light", False, "7341282109987754497", "48512058", "319e4fda3248900720841a4475234a89", [])
ReenieBeanie_Regular = EffectMeta("ReenieBeanie-Regular", False, "7277866226397745701", "22618063", "c8ce7ac2720c24710aa6972bc2ea6db8", [])
ResourceHanRoundedCN_Bold = EffectMeta("ResourceHanRoundedCN-Bold", False, "7265596195949515319", "20374132", "5cbf4c907356bf12a5eb668b7ed47ae5", [])
ResourceHanRoundedCN_Lt = EffectMeta("ResourceHanRoundedCN-Lt", False, "7265596294683431485", "20374136", "da4650aca66cca11be078688afe61353", [])
ResourceHanRoundedCN_Md = EffectMeta("ResourceHanRoundedCN-Md", False, "7265596408491676197", "20374131", "b21249fcbc5e1d96505fdeb21c1f7e8f", [])
ResourceHanRoundedCN_Nl = EffectMeta("ResourceHanRoundedCN-Nl", False, "7265596514955694649", "20374148", "5df531b829fa804cb520148c5d1e7c85", [])
Rix독도 = EffectMeta("Rix독도", False, "6808056629678838286", "645449", "10fbabdd4c0f2d733c3bac1934e2027b", [])
Romantic = EffectMeta("Romantic", False, "6807743277853315597", "643581", "f0d68fa6c56d1fe75337697635d8d073", [])
Rubik = EffectMeta("Rubik", False, "7003588607231398430", "1349502", "8d5c645a77e132c533bb1988579736de", [])
SansitaSwashed_Regular = EffectMeta("SansitaSwashed-Regular", False, "7314592065168347650", "37108558", "136c05da10e6016965dccd20b017a0ad", [])
SecularOne_Regular = EffectMeta("SecularOne-Regular", False, "7312374157725929986", "37082988", "6b3bb5fe24e5b1df5ed82af22a1b45bd", [])
Serrat = EffectMeta("Serrat", False, "7068208488563872286", "1588332", "a71fc3b2ebc32587189c11b403dc267d", [])
Signature = EffectMeta("Signature", False, "7042230917837885965", "1485330", "4e29c132141a12bbbffb4a6c5b35bac2", [])
Soap = EffectMeta("Soap", False, "7076269202771808804", "1632684", "853e5b6b92915f439228d36ae9be0ddf", [])
SourceHanSansCN_Bold = EffectMeta("SourceHanSansCN-Bold", False, "7265596643066516029", "20374122", "fb70a3667211b2962782b5a2c127b2a6", [])
SourceHanSansCN_Light = EffectMeta("SourceHanSansCN-Light", False, "7265596753926165050", "20374126", "1e5cecf2d7f404937e579b691dd824c5", [])
SourceHanSansCN_Medium = EffectMeta("SourceHanSansCN-Medium", False, "7265596846465094199", "20374144", "6ae9ea8211a7b2df59519cc25bf0e4d3", [])
SourceHanSansCN_Normal = EffectMeta("SourceHanSansCN-Normal", False, "7265596944867660346", "20374137", "0875520d11130e75a7c55db404269fef", [])
SourceHanSansCN_Regular = EffectMeta("SourceHanSansCN-Regular", False, "7265597035946971705", "20374128", "ab9425633f936ad3aee8ce6776a8d785", [])
SourceHanSansTW_Bold = EffectMeta("SourceHanSansTW-Bold", False, "7265530703364756026", "20356585", "068f075fb3e12a9e7d866485e4ec90fd", [])
SourceHanSansTW_Light = EffectMeta("SourceHanSansTW-Light", False, "7265530900580930085", "20356587", "3c658b896e04038f1e64a7b482c09f2e", [])
SourceHanSansTW_Medium = EffectMeta("SourceHanSansTW-Medium", False, "7265530989479203389", "20356589", "3db3cffea241e097cfef7bcef2334d90", [])
SourceHanSansTW_Normal = EffectMeta("SourceHanSansTW-Normal", False, "7265531070680928828", "20356591", "7e3007f207de8eeb029b534fbaf9a13f", [])
SourceHanSansTW_Regular = EffectMeta("SourceHanSansTW-Regular", False, "7265531198548480568", "20356593", "9a228f45a856db7e2acc9844fe12de42", [])
SourceHanSerifCN_Bold = EffectMeta("SourceHanSerifCN-Bold", False, "7265597144600416827", "20374153", "3a3f2f08644467089cadaeb22596a407", [])
SourceHanSerifCN_Light = EffectMeta("SourceHanSerifCN-Light", False, "7265597259708895803", "20374143", "f8733631870deaba746afcb65ef30389", [])
SourceHanSerifCN_Medium = EffectMeta("SourceHanSerifCN-Medium", False, "7265597365539574329", "20374123", "6b1255756261d5ddb9ac40216ee5a2f0", [])
SourceHanSerifCN_Regular = EffectMeta("SourceHanSerifCN-Regular", False, "7265597449262076474", "20374152", "47dc066be4a347aa81c347554fa376a9", [])
SourceHanSerifCN_SemiBold = EffectMeta("SourceHanSerifCN-SemiBold", False, "7265598654294004281", "20374118", "f1b0ad6ceca5ec6bd47b0dacae9fbf97", [])
SourceHanSerifTW_Bold = EffectMeta("SourceHanSerifTW-Bold", False, "7265534770845585980", "20356595", "7de7afb3383bc3c71064e694a8437fed", [])
SourceHanSerifTW_Light = EffectMeta("SourceHanSerifTW-Light", False, "7265535017625850429", "20356597", "78bd0a481bca529b29dadce742f93d4b", [])
SourceHanSerifTW_Medium = EffectMeta("SourceHanSerifTW-Medium", False, "7265535154775396919", "20356599", "13289edc534678e1ac9846ffea550910", [])
SourceHanSerifTW_Regular = EffectMeta("SourceHanSerifTW-Regular", False, "7265535307322233399", "20356601", "8850278849317c50eefc844c086dd455", [])
SourceHanSerifTW_SemiBold = EffectMeta("SourceHanSerifTW-SemiBold", False, "7265535436594876984", "20356603", "2420aafb990c49f9266bfd0bd3d79149", [])
SourceSansPro_Regular = EffectMeta("SourceSansPro-Regular", False, "7235998842880004665", "14035983", "2ded03684e9f6b64a81d74f915b17042", [])
Specta = EffectMeta("Specta", False, "7039992016805040671", "1478300", "86debc3c92b292b162ce399aca9f61f8", [])
Spicy_Rice_Regular = EffectMeta("Spicy Rice-Regular", False, "7239229520828437053", "14864429", "7dbb386a703bd1e6b67376ca92f0fa8c", [])
Staatliches_Regular = EffectMeta("Staatliches-Regular", False, "7312373990083793409", "37083204", "eb3e70b0668eb3e03499cd5162bbf8e3", [])
Sunset = EffectMeta("Sunset", False, "6807743703436759566", "643591", "01365a30a2569e10b160f7bd46e2c8c8", [])
Thrive = EffectMeta("Thrive", False, "7290877082660246071", "26148239", "09aecfbb88990df392ae7dfa53e56b6e", [])
Thunder = EffectMeta("Thunder", False, "7050422198724465189", "1511612", "f68ab331feafe5deac4c9484df686557", [])
Work_Sans_ExtraBoldItalic = EffectMeta("Work Sans-ExtraBoldItalic", False, "7209944751246676517", "10608852", "b4bb205043371da7ac23c095d1a15895", [])
WorkSans_BlackItalic = EffectMeta("WorkSans-BlackItalic", False, "7236677807634387511", "14137039", "b7fe9aff83a587f1bb128d15df0c469e", [])
WorkSans_Regular = EffectMeta("WorkSans-Regular", False, "7242301481699775032", "14963149", "3858f6a8bc6aa06a36b66771b24d8cb9", [])
ZEN丸コ_シック = EffectMeta("ZEN丸ゴシック", False, "7236735800514187831", "20403385", "aa2051cae318b4fb3a736aad88f3fd81", [])
ZEN紅道 = EffectMeta("ZEN紅道", False, "7244104371372298754", "20403919", "a010d51f36e5954e6e4ca9112dcb141d", [])
ZY_Alluring_Regular = EffectMeta("ZY Alluring-Regular", False, "7277862842190008891", "22616627", "4d56dbea0c35acab69a5d51861521b12", [])
ZY_Azure = EffectMeta("ZY Azure", False, "7230715188326961721", "13314774", "92baf67659d39c44e7a7e00f7024ada1", [])
ZY_Bless = EffectMeta("ZY Bless", False, "7229615361967002172", "13168499", "8142200dd17ebb41839e9e580fc80aa4", [])
ZY_Coconut_Regular = EffectMeta("ZY Coconut-Regular", False, "7277865493736722981", "22618062", "882aa39ef38c6acb7244d2712f484194", [])
ZY_Dexterous = EffectMeta("ZY Dexterous", False, "7320169657841750529", "38698692", "fadee671a67e0e552e0d61f480e78348", [])
ZY_Diligent = EffectMeta("ZY Diligent", False, "7270787894317421093", "21346088", "0ca879fd3498f0e7957797dceb6b419f", [])
ZY_Etiquette = EffectMeta("ZY Etiquette", False, "7262284005293167160", "19649099", "5ad3fe6b440cde181cb9240565d1afe5", [])
ZY_Fervent = EffectMeta("ZY Fervent", False, "7325315777014272514", "40751208", "edb351323c1814bbb13fdc1149817b88", [])
ZY_Heaven = EffectMeta("ZY Heaven", False, "7256754129400238649", "18436001", "e90e022bd595d7e598b5fd59e5a12524", [])
ZY_Hope = EffectMeta("ZY Hope", False, "7276364919165948474", "22346588", "645c6d16ec0326ca588ed1b792d722b9", [])
ZY_Innocent = EffectMeta("ZY Innocent", False, "7256754220588601913", "18436002", "81733827a8cb7523177fe2ed96c16d51", [])
ZY_Modest = EffectMeta("ZY Modest", False, "7276365485812224571", "22346583", "9de2f616a80d03ee04c73b7a85023bf1", [])
ZY_Oliver = EffectMeta("ZY Oliver", False, "7230715372683399740", "13314772", "d90b1aaa54e0e1ad23afc2af06c04370", [])
ZY_Panorama = EffectMeta("ZY Panorama", False, "7262284073026982460", "19649101", "9f1b77d60340ae5fe1eb3701a843597e", [])
ZY_Radiance = EffectMeta("ZY Radiance", False, "7248820625366585915", "16174404", "e916bd1b63a326aa68a505e80e3f8a89", [])
ZY_Rainbow = EffectMeta("ZY Rainbow", False, "7276365019292373559", "22346586", "33b44a540525ed9a9662b8b3f7d8f362", [])
ZY_Resolve = EffectMeta("ZY Resolve", False, "7317175475195875841", "37544856", "c7607b2d122df39381457c4680b07498", [])
ZY_Superb_Regular = EffectMeta("ZY Superb-Regular", False, "7277866017231999525", "22618066", "c18fa905465af7ff5aff43bb7e48366c", [])
ZY_Vibrant = EffectMeta("ZY Vibrant", False, "7276365787147801145", "22346584", "9f5bc776b6a68c979628fa4249eda4fe", [])
ZY_Wonder = EffectMeta("ZY Wonder", False, "7270788266683535932", "21346084", "dbfdbb77a913235dac580fc6e9e4c19c", [])
ZYCherish = EffectMeta("ZYCherish", False, "7290485005162123813", "26013701", "0d6080a435603e6b1a392d9202d43dac", [])
Zapfino = EffectMeta("Zapfino", False, "7076271146110292494", "1632681", "efa8ec4bd296ade312a2a64fe6b2d206", [])
いろは角クラシックE = EffectMeta("いろは角クラシックE", False, "7236735800514187833", "20403373", "1afbea968b2e1af6cac0e96a44b0e1b0", [])
いろは角クラシックM = EffectMeta("いろは角クラシックM", False, "7236735800501604924", "20403369", "7b73272b2e422660f156f20d7157ffbb", [])
きさ_はし金陵 = EffectMeta("きざはし金陵", False, "7246698168547545601", "20403943", "489be31b94a06eb438a50032df8d98ec", [])
くり抜く = EffectMeta("くり抜く", False, "6990291609376002562", "20403197", "76d286f7251430218bd24f555bacebbc", [])
しっほ_りアンチック = EffectMeta("しっぽりアンチック", False, "7236735800442884645", "20403443", "c60f6db5714f4db0ffe07794c290c274", [])
すす_むし = EffectMeta("すずむし", False, "7246698168543351297", "20404003", "5a563fdd1daef779b4d4cec65ae07f5e", [])
た_るまと_ろっふ = EffectMeta("だるまどろっぷ", False, "7236735800388358715", "20403579", "5a269c2c702bc230f613c748b94a78d3", [])
つきみ丸コ_かな_B = EffectMeta("つきみ丸ゴかな B", False, "7236735800371581501", "20403581", "826659485cc65dec7d8a16eba3788ad7", [])
つきみ丸コ_かな_R = EffectMeta("つきみ丸ゴかな R", False, "7236735800363192891", "20403643", "b8abadb9a0e3568108d211d1a63b5ae5", [])
はちきるホ_ッフ = EffectMeta("はちきるポップ", False, "7236735799817933368", "20403715", "4f6d841371f92e510afe383f83c73a42", [])
ひな明朝 = EffectMeta("ひな明朝", False, "7236735799817933367", "20403717", "7fe60a5bb3eb2fefeb5080a16ba65df6", [])
ほ_ってり = EffectMeta("ぽってり", False, "7246698168551739906", "20403945", "f194725b8247c3cb01df730b786f1a0f", [])
オとマのヘ = EffectMeta("オとマのペ", False, "7236735800459661861", "20403367", "1502f1c27c0a043f8059eea0d956ad53", [])
キ_カ_丸 = EffectMeta("ギガ丸", False, "7246698169348657665", "20403939", "a9076ef858ae90ccc4019622cc1e69e3", [])
キャビン = EffectMeta("キャビン", False, "6841482472102826510", "20403069", "c76635455780f12a3f869416574d5bb0", [])
クレー_One = EffectMeta("クレー One", False, "7236735800442884667", "20403427", "88612653636506a25508dd36f0a12c1d", [])
コ_シック = EffectMeta("ゴシック", False, "7246698168543367682", "20404037", "18ee639c4dc2b3bf080a2e392d9445a0", [])
コスギ = EffectMeta("コスギ", False, "6808051939150926344", "20402991", "bb28b047f12adc86d81a0ebee5df7b1f", [])
ゴシック = EffectMeta("ゴシック", False, "6766522798685819399", "459278", "130d166479800cd97586de33b3a0b659", [])
タイムマシンわ号 = EffectMeta("タイムマシンわ号", False, "7236735800430301753", "20404343", "d3a2a70a08086775f468ca6f9de97cae", [])
チェリーホ_ム = EffectMeta("チェリーボム", False, "7239261205582320129", "20403877", "b1c1463f54eb6cc0a4905d928e00a9a4", [])
テ_ラコ_シック = EffectMeta("デラゴシック", False, "7236735799822127674", "20403647", "4f71acd43e4a4257985d092c3ced1bea", [])
ト_ットコ_シック_16 = EffectMeta("ドットゴシック 16", False, "7236735799813739069", "20403657", "314f2ce6b496daee67243b39ff58803c", [])
ニューテコ_ミン = EffectMeta("ニューテゴミン", False, "7236735799822127653", "20403683", "7fbbf397f7d96586920ed6f89f328df7", [])
ビジネス = EffectMeta("ビジネス", False, "6808051344142766599", "20402993", "cdc69ab82c994c9a67275b74a413b750", [])
ブロック = EffectMeta("ブロック", False, "6841483116922540558", "20403043", "43b7d680337fd69f13dc5319e2574a6a", [])
ヘ_ンレタ = EffectMeta("ペンレタ", False, "7246698168543384066", "20404089", "a2c0b4b7259aaecf6946a4e257dac5cc", [])
ホ_ッタ = EffectMeta("ポッタ", False, "7236735799817933370", "20404337", "a2acad777dc0bd39f32c890ebb6684bb", [])
ポジティブ = EffectMeta("ポジティブ", False, "7013643531847733761", "20403295", "db889a3e5309902696fdea2b5d3de453", [])
ミンサン書体B = EffectMeta("ミンサン書体B", False, "7239261205586514433", "20403895", "18e32819f3310d8d46d805d31d068635", [])
ミンサン書体R = EffectMeta("ミンサン書体R", False, "7239261205594903041", "20403909", "67ca6787d094e5af727955824f354c39", [])
メモ = EffectMeta("メモ", False, "6841483408602829326", "20403011", "52f2da3304584137f088b77f51acad88", [])
メモ帳 = EffectMeta("メモ帳", False, "6990291446100136449", "20403233", "260fd1ddf7ce925d8f190749f0296049", [])
モッチーホ_ッフ = EffectMeta("モッチーポップ", False, "7236735799813739045", "20403817", "eebab96f0d7f12a6f239d297a395a465", [])
ランハ_ート = EffectMeta("ランパート", False, "7236735799817933373", "20403869", "8f5133ad1859de8ffab89113b4358a50", [])
レケ_エ_One = EffectMeta("レゲエ One", False, "7236735799813739068", "20403871", "b7b2846f2bb8d5910e93a16de58fd6cf", [])
ロックンロール = EffectMeta("ロックンロール", False, "7236735799809544763", "20403875", "da1dc1ac57175d1f5158b469f79897a2", [])
ローマ = EffectMeta("ローマ", False, "6841482587446186509", "20403063", "3ef3c328cef61895e0d17b7265d0a830", [])
中秀体 = EffectMeta("中秀体", False, "6917512631515353607", "1014410", "9561161c74ae03658e101577ec5cfae6", [])
书南体 = EffectMeta("书南体", False, "7290445475461730875", "25998982", "d2602638de94c9006851f0858d567459", [])
云魅手书 = EffectMeta("云魅手书", False, "7174434449080193550", "7048145", "bd4bdc8403280395a79565573a6a3cbb", [])
今宋体 = EffectMeta("今宋体", False, "7216598549809599032", "11443544", "4bd7448e9ba53dd7fe3bd8b73a07e6f4", [])
仓耳与墨W05 = EffectMeta("仓耳与墨W05", False, "7265576717970838076", "20373115", "c0ab4e3f1a478b5867cbd46e00b0f99d", [])
仓耳周珂正大榜书 = EffectMeta("仓耳周珂正大榜书", False, "7265577040110162492", "20373112", "5c78e7cf1982aa68487d1675159b73f6", [])
仓耳小丸子 = EffectMeta("仓耳小丸子", False, "7265576611347436093", "20373117", "3452ca2452f781808f832d67063a659c", [])
仓耳舒圆体W02 = EffectMeta("仓耳舒圆体W02", False, "7265576364948853303", "20373116", "19fd2acae413b58901b2b466dd813785", [])
仓耳非白W02 = EffectMeta("仓耳非白W02", False, "7265576127073096250", "20373124", "ef1fe50ee91c6e00bd928500920a2555", [])
仓耳非白W04 = EffectMeta("仓耳非白W04", False, "7265576259957035579", "20373114", "120bbe030eae22f65fdcf76f587e337d", [])
以梦为马 = EffectMeta("以梦为马", False, "7197366059056239141", "9182767", "56dfcfca94158a7a92263aa5b41f8a84", [])
优设好身体 = EffectMeta("优设好身体", False, "7265610359807939132", "20379296", "254c324257a74cfdcf35d4e9eb5da964", [])
优设标题圆 = EffectMeta("优设标题圆", False, "7260808713844298295", "19366221", "dd565912c20ce61f6f71a33bcb30faf8", [])
优设标题黑 = EffectMeta("优设标题黑", False, "7068207165277737502", "1588336", "d9f1238f50005595eff5f545aa54776c", [])
伯兮体 = EffectMeta("伯兮体", False, "7290440685616894522", "25999024", "521d0621c5cd8e26944ba063ca5dec02", [])
佑字_朴 = EffectMeta("佑字 朴", False, "7236735801042670136", "20403343", "fc90908f8e84e220b04858badd7ef84d", [])
佑字_舞 = EffectMeta("佑字 舞", False, "7236735801021698619", "20403425", "9ebb6e14126e9fc9940f021014ec13b3", [])
佳妙体 = EffectMeta("佳妙体", False, "7290443628554490423", "25998997", "f67bcc4b0cf6483e78bffa6cfd972bf1", [])
俊雅体 = EffectMeta("俊雅体", False, "7078971008769593887", "1648731", "4f96b92a0023d2da2a4c9cb4e09e9565", [])
俪金黑 = EffectMeta("俪金黑", False, "6740499317733200388", "349465", "4ef7d2eb7cdfcff226f086008045131a", [])
像素体 = EffectMeta("像素体", False, "6770944991167517192", "466469", "909e7b4c50b29620fcc42a5f7b27914e", [])
元也 = EffectMeta("元也", False, "6990291473216311809", "20403229", "49f510d2627a0916367c79c11f40a1b1", [])
元气泡泡体 = EffectMeta("元气泡泡体", False, "7203664981080937021", "9898775", "3af8af39c55aa4109263fd49a00f3885", [])
元瑶体 = EffectMeta("元瑶体", False, "7290447082886795832", "25999023", "b981cfd05bb12209521b5aeac9d3740f", [])
先锋体 = EffectMeta("先锋体", False, "7043775345333375519", "1488720", "85da61942dcc96f5eddad1c3826b5f0c", [])
光远体 = EffectMeta("光远体", False, "7290442818584056357", "25999003", "9e1697182672f31f0280e673856738ea", [])
兰亭圆 = EffectMeta("兰亭圆", False, "7173608955527041567", "6949825", "211a5b4aed3f2ac8412d6f9f7e9d8244", [])
凌东齐伋体_combo = EffectMeta("凌东齐伋体-combo", False, "7265611544820453948", "20379306", "6ca3f118d0415aa1f0be2e9ee2800890", [])
凌东齐伋体_fallback = EffectMeta("凌东齐伋体-fallback", False, "7265611310132367931", "20379309", "5717be837d5f541193816ad6b421f7fc", [])
凝琴体 = EffectMeta("凝琴体", False, "7290444849298281021", "25999011", "efa89382ae256d5ce6092a312dddd3fc", [])
刘炳森 = EffectMeta("刘炳森", False, "6852190696930021902", "814922", "1507ce2872918e76320be3647e986dcf", [])
初尘体 = EffectMeta("初尘体", False, "7290441058238861879", "25998986", "ae887a93827cf1730d7b08db606b5b68", [])
匹喏曹 = EffectMeta("匹喏曹", False, "7043773350555947551", "1488716", "4f6d74dc7cb2208981569c0842124038", [])
半梦体 = EffectMeta("半梦体", False, "7290439421625635385", "25999018", "ed70a8440c036e4f95d41ac34846f229", [])
南廱明體 = EffectMeta("南廱明體", False, "7265535751624856101", "20356611", "49934f9817b10611a6824fd80cabf086", [])
卡酷体 = EffectMeta("卡酷体", False, "7045187669847970341", "1494864", "514acd68e036f48781d209d84cc7728e", [])
古典体 = EffectMeta("古典体", False, "7035911487646339598", "1459456", "37cd7f9d7364c200a37c7f9ee2192ae9", [])
古印宋简 = EffectMeta("古印宋简", False, "7216598368791827002", "11443545", "aafc0b7c13e1c5b790d090e57afcff76", [])
古雅体 = EffectMeta("古雅体", False, "7025895760583463438", "1425152", "dc99fbcf0d0a7c179313e6289d95ebaf", [])
古风小楷 = EffectMeta("古风小楷", False, "7216598671016596029", "11443543", "97e1ab8a11b337dc9e8369a40c936e19", [])
台北黑体_Bold = EffectMeta("台北黑体-Bold", False, "7265536086472921658", "20356617", "b4598638d6eba21257d0456ebe2dd161", [])
台北黑体_Light = EffectMeta("台北黑体-Light", False, "7265536169083933242", "20356619", "3367383fa78c478b88ab81a18746ee85", [])
台北黑体_Regular = EffectMeta("台北黑体-Regular", False, "7265536307932172861", "20356621", "640ca1b520ae3f08b77de45dab99ba33", [])
后现代体 = EffectMeta("后现代体", False, "6740435494053614093", "349307", "35b4b7201d26c9a26a038be8813efdd2", [])
启功行楷 = EffectMeta("启功行楷", False, "6852190785740214791", "814921", "6fc51e60d628ca3afb0d3fbdc00f3000", [])
吹き出し = EffectMeta("吹き出し", False, "6841482925955879431", "20403057", "79ef9ad4b06c3f44640e943834cc676f", [])
唐瑜体 = EffectMeta("唐瑜体", False, "7290445542331519525", "25998993", "3158dfc09010810f5c1ab5fbf6d835d0", [])
喜悦体 = EffectMeta("喜悦体", False, "7045187886924173861", "1494856", "71a8ba6a406a0c02fc2a31dceb4921d0", [])
喜鹊万人造字 = EffectMeta("喜鹊万人造字", False, "7208056956471218748", "10379503", "b0781d9e494afdae886bd846fecab2e0", [])
喜鹊梅花楷 = EffectMeta("喜鹊梅花楷", False, "7208056839089427002", "10379504", "80b578cbb1ed9f7f7403150d3910a0bc", [])
喵魂体 = EffectMeta("喵魂体", False, "6740436949040894475", "349315", "f89f9c707b0ed386568e78c9ab3bb176", [])
嘉木体 = EffectMeta("嘉木体", False, "7290443820041245241", "25999016", "a5ac5235fec9d01bbb280ab9b37b7b93", [])
圆体 = EffectMeta("圆体", False, "6740436583247254029", "349313", "6622f87ce830dd89234522a0d9db5104", [])
基础像素 = EffectMeta("基础像素", False, "7203638484752405049", "9893377", "f76ecb363595e5321389d3ed29df1c9f", [])
墩墩体 = EffectMeta("墩墩体", False, "7043772438898807304", "1488712", "377365df3340b4b642a0c199fcbb3882", [])
大字报 = EffectMeta("大字报", False, "7054126026267300382", "1530068", "bb2f51e267dce8ffd369e1721f2a6371", [])
天云体 = EffectMeta("天云体", False, "7290445618533634617", "25998981", "6ae7aeddb05e6b7ea980b99708204100", [])
妙松体 = EffectMeta("妙松体", False, "7290444755811439141", "25998991", "1178bbca3857f8448c766c6f9c6d3bec", [])
妙黑体 = EffectMeta("妙黑体", False, "7203638484756599333", "9893375", "ff39549fdcdf9528ce1d0137384eb906", [])
子どもたち = EffectMeta("子どもたち", False, "6766524209620324877", "20402995", "99ac707c2ba4d141161fcec8a9ea91b7", [])
字制区喜脉体 = EffectMeta("字制区喜脉体", False, "7391765808835203647", "75248650", "9e6dcd6301144426671b86797a1cfd7a", [])
字制区喜脉喜欢体 = EffectMeta("字制区喜脉喜欢体", False, "7391765873716892199", "75248705", "c8402181a043ef9b8c105f8e7bbc03cf", [])
孤月体 = EffectMeta("孤月体", False, "7290441418395357754", "25999015", "e48e0b0bf5ff728a46405176e1d5030f", [])
宋体 = EffectMeta("宋体", False, "6740513279296147982", "349517", "02a4eb96fa9d82bbba5906c35521f6f4", [])
小杉ゴシック = EffectMeta("小杉ゴシック", False, "6841482326321402375", "20403079", "fca4e0440151814d39b1a0a23872224e", [])
小薇体 = EffectMeta("小薇体", False, "7265594602311127607", "20373097", "db03f70f2fc5177f552d46ab3648af3f", [])
尔雅新大黑 = EffectMeta("尔雅新大黑", False, "7217732136894206501", "11593555", "c3dc73e45b7b16cae8e867a0a73f35dd", [])
居酒屋 = EffectMeta("居酒屋", False, "7013643566341689858", "20403285", "ca3edcfff9defcc59e9090cb11ed96d4", [])
山林体 = EffectMeta("山林体", False, "7035912592925135396", "1459484", "2b4b013ad868f43d20de26cc7720083a", [])
岩柚体 = EffectMeta("岩柚体", False, "7290445914571805245", "25999002", "a2300687db587e3801b32c4a7b77dd32", [])
峰骨体 = EffectMeta("峰骨体", False, "7054126189211816462", "1530066", "b5a3bb8585981e629732ca53d6d3be36", [])
幸せ = EffectMeta("幸せ", False, "6990291634747347458", "20403193", "b18c4a35769d204d8ee88db8a06ac471", [])
幼萱体 = EffectMeta("幼萱体", False, "7290446812442268217", "25998999", "ab1b9e358069f4187427aaecbcca1467", [])
庞门正道标题体 = EffectMeta("庞门正道标题体", False, "7265611148060267045", "20379302", "92b17506e2b26dac8716ef305c8bcf06", [])
庞门正道粗书体 = EffectMeta("庞门正道粗书体", False, "7265611032465248805", "20379291", "06caadf2c04504ea78873cfad51447a3", [])
庞门正道轻松体 = EffectMeta("庞门正道轻松体", False, "7265610901795902013", "20379295", "4fe6b6e59c94796b520f5bd5fe83e2ce", [])
张子山体 = EffectMeta("张子山体", False, "6894206029785993736", "961476", "4e3af7fa95351181ba26f1be246c4d43", [])
彼岸体 = EffectMeta("彼岸体", False, "7290440016646378042", "25999019", "9d97a2a66420faa6dc320cd3035b4fe6", [])
得意黑 = EffectMeta("得意黑", False, "7399865900821647935", "77844112", "5219d1f012f4944aaaa2ec19556fdea6", [])
德古拉 = EffectMeta("德古拉", False, "7021353291850191368", "1404774", "0573d513ed964b0a24a02943e469c9e7", [])
快乐体 = EffectMeta("快乐体", False, "7265594331262620217", "20373113", "d3c284bf1c58e72c2ccd5c0c22bfa5e5", [])
快速体 = EffectMeta("快速体", False, "7197366121069023804", "9182766", "462692b2efb28f3cf411edbef8f7f6ff", [])
思源中宋 = EffectMeta("思源中宋", False, "6807743192671195655", "643579", "e8b002bff0884028c9f13a9d6eeb03bc", [])
思源粗宋 = EffectMeta("思源粗宋", False, "6807742980271641102", "643575", "e4387517f584be39bb2e1ca4ede6cbe3", [])
悠悠然 = EffectMeta("悠悠然", False, "7081924596999393805", "1665070", "f38c316a2e5f0e059094bbe18a252ce1", [])
悠然体 = EffectMeta("悠然体", False, "6740436145831678467", "349311", "7f7454ea269cfebfef1b104673f05894", [])
悦妍体 = EffectMeta("悦妍体", False, "7290447167821451813", "25998984", "3c6344b0d77c47511e5b177675761c7b", [])
惊鸿体 = EffectMeta("惊鸿体", False, "7203638484756599356", "9893376", "d06a0ac2a94160c8e6d88bf6d1c436e6", [])
手書 = EffectMeta("手書", False, "7013643615326966273", "20403235", "1d266a4a87b97a7602a4b612465d88e3", [])
抖音美好体 = EffectMeta("抖音美好体", False, "7244518590332801592", "15332487", "1a9c90e65d4ac34436d90a1b19d94d5a", [])
招牌体 = EffectMeta("招牌体", False, "7035914068053463565", "1459526", "d591f14dd0bf7486dc318195299706a4", [])
拼音体 = EffectMeta("拼音体", False, "6740437635287749133", "349319", "1735cfc4e88e38efc9f7b1e3cfd6d035", [])
挥墨体 = EffectMeta("挥墨体", False, "7037018943218782757", "1464398", "162b2fc5a67b2f7b664001030b16828a", [])
教科書 = EffectMeta("教科書", False, "6990291514886722050", "20403203", "b21936cc7b4fbb0191cc0b356d2d4d98", [])
文研体 = EffectMeta("文研体", False, "6990293257540342302", "1203468", "bcadf482b4045f8d47bf373fc01479a0", [])
文艺繁体 = EffectMeta("文艺繁体", False, "6740437797456318983", "349321", "b15dc9e0411a83b2c63f983a2fb3b7a6", [])
文轩体 = EffectMeta("文轩体", False, "7290445778273702455", "25998976", "d5ea95d6a862335c917a93b4fc741c89", [])
文雅体 = EffectMeta("文雅体", False, "7068208151488631309", "1588334", "6f0ccd9662b4b0eb41318fd8547699de", [])
新青年体 = EffectMeta("新青年体", False, "6740435892441190919", "349309", "71a73f7e297831936018c928d61ce2b8", [])
方正王铎行草 = EffectMeta("方正王铎行草", False, "6852191050547597832", "814918", "94c2759eda2591a0e88b5995c13d0d1b", [])
方糖体 = EffectMeta("方糖体", False, "7037017159280628231", "1464396", "49573e8f5bb7ae96ce913040780803e3", [])
无界黑 = EffectMeta("无界黑", False, "7203638485670957629", "9893370", "1e04097242afd9dea436e390c2b8d89d", [])
日式标题 = EffectMeta("日式标题", False, "7081925137355772453", "1665068", "b21c3e5dcee4cbd5aa5606f1e04fe382", [])
星光体 = EffectMeta("星光体", False, "7216598789103030821", "11443542", "cc578f4ebfa6ec1d814f50b8ab99ce5e", [])
晨风体 = EffectMeta("晨风体", False, "7290440791967666725", "25999012", "04a6a353ece14e49884af2b765c4f3d1", [])
景天体 = EffectMeta("景天体", False, "7290444063004693029", "25999010", "071aa83859c9780691a4c2a872d53456", [])
晴雪体 = EffectMeta("晴雪体", False, "7290445254241555005", "25999004", "fb5c70eeca2cbdbd2dcedae3315d9701", [])
書道 = EffectMeta("書道", False, "6990291666124935681", "20403191", "67115dcac0ac0d2311d6a67e1ad1b6a5", [])
有猫在 = EffectMeta("有猫在", False, "6766524065151717901", "459290", "0880173b6edb03abadc473b64ec80316", [])
未来黑 = EffectMeta("未来黑", False, "7081925520866152997", "1665065", "8fbf8914d93137fc79062de3aa99de65", [])
本黑体 = EffectMeta("本黑体", False, "7200743888816968247", "9554613", "fca68b5b94fa66afe5ca424cb5868011", [])
李李体 = EffectMeta("李李体", False, "7203638484752405053", "9893380", "87985cec317b243b34472455eb35e061", [])
极简拼音 = EffectMeta("极简拼音", False, "7070430470667768333", "1600484", "d9bd33e2a246c62cfae5b75504c5d7c0", [])
柏青体 = EffectMeta("柏青体", False, "7187746468785033787", "8393133", "d6d5b5884e999ab9841c65b9af9ad68a", [])
柳公权 = EffectMeta("柳公权", False, "6852190880837669390", "814920", "433c8deaa6b69a9b314b01c44020f95d", [])
梅雨煎茶 = EffectMeta("梅雨煎茶", False, "7081925245099053604", "1665067", "7adeea403a9002c92bdb071f07506f5d", [])
梦寒体 = EffectMeta("梦寒体", False, "7290444357499359781", "25999021", "9e44efeeecc891448419108472e8f719", [])
梦想家 = EffectMeta("梦想家", False, "6914965725543141896", "1005688", "01507865e864281742d0126385a84030", [])
梦桃体 = EffectMeta("梦桃体", False, "7290444545689391653", "25998998", "58f48899950d28f609bef42bcab15575", [])
梦槐体 = EffectMeta("梦槐体", False, "7290444451179139641", "25998996", "4211fd251648fe7089552ac58926b10d", [])
棘薔薇ホ_ールト = EffectMeta("棘薔薇ボールド", False, "7236735801134944823", "20403299", "caa76c8a42b129086bacfbec06a3416e", [])
棘薔薇ライト = EffectMeta("棘薔薇ライト", False, "7236735801105584701", "20403311", "d26d591f8ee3732e6cad13f8eabfb74f", [])
楚辰体 = EffectMeta("楚辰体", False, "7070430593925779981", "1600482", "ced7a98a9bcc8984318a2c215192b0c5", [])
楷書MCBK1 = EffectMeta("楷書MCBK1", False, "7246698168547578369", "20404083", "fb1f997aac1f765ffd9a0567e39ec75b", [])
欣然体 = EffectMeta("欣然体", False, "7068531082265629197", "1589146", "f1d3dde1819db78d7f4bde16daf52fe3", [])
正奇体 = EffectMeta("正奇体", False, "7290447230488547901", "25999005", "0be6ac1d15866b82ab08f2219b772ab5", [])
毛笔行楷 = EffectMeta("毛笔行楷", False, "6912033793700270606", "999616", "112cdf4c20ddf9336f4757e8c42bcc57", [])
毡笔体 = EffectMeta("毡笔体", False, "7035924520854622757", "1459716", "171016edaee58043c22552d32579f154", [])
汇文明朝体 = EffectMeta("汇文明朝体", False, "7444913491762221577", "95241741", "dff19164a0e4822b2320a900db9c1c2e", [])
汉仪英雄体 = EffectMeta("汉仪英雄体", False, "6740499052644798984", "349471", "3f63a7b1ab4699bf11c88b284939e661", [])
汉仪贤二体 = EffectMeta("汉仪贤二体", False, "7265612201199669816", "20379294", "e2016262592025a41b52412055efcae6", [])
江户招牌 = EffectMeta("江户招牌", False, "7080096840875512334", "1654205", "a98a329c2a52154b6c50b06e66d60b12", [])
江湖体 = EffectMeta("江湖体", False, "7080097079397192228", "1654203", "50957d5102cb4f2ea1459e140826eb0c", [])
沈尹默 = EffectMeta("沈尹默", False, "6852190963947803143", "814919", "9af4745e3a8f8b3a8f72f65b43302a98", [])
油性マシ_ック = EffectMeta("油性マジック", False, "7236735801076224568", "20403341", "0c3de71c508fe9eb7027ec49ff2878f0", [])
油漆体 = EffectMeta("油漆体", False, "7035906361040835079", "1459392", "f3f06c4b538c534a498c5e3712a949fa", [])
海岛森林_全字符 = EffectMeta("海岛森林-全字符", False, "7445240658693984805", "95365506", "91a93794d0970a1acdb8822729ae5965", [])
清刻本悦 = EffectMeta("清刻本悦", False, "7086429206543864350", "1698068", "2e70579a0538bde91edc1eaedc68c02f", [])
清酒体 = EffectMeta("清酒体", False, "7290445172834308664", "25999017", "7692c22a862d23bcd09f84c0aa2f7502", [])
渊亭体 = EffectMeta("渊亭体", False, "7290447006659514941", "25999013", "026681bd4e89ed40420e184fd6bfb1fc", [])
温宁体 = EffectMeta("温宁体", False, "7290445705578025529", "25998977", "fdc9d5eb51a0e4f9e1dedc0091402ff5", [])
温柔体 = EffectMeta("温柔体", False, "7050009415155454500", "1511616", "eb4b8ebef19e89895193d930e7c607c1", [])
港风繁体 = EffectMeta("港风繁体", False, "6740438140432945675", "349323", "9bfde9a789862114b6055ed475688908", [])
游园体 = EffectMeta("游园体", False, "7290446760739082789", "25998988", "b9e3537ea657978bc1963e76b66312a9", [])
游思体 = EffectMeta("游思体", False, "7290446655604658748", "25998994", "3fd19c651575d8cfda6ca059f725a6f8", [])
源ノ角コ_シック = EffectMeta("源ノ角ゴシック", False, "7236735800992338487", "20403397", "14e8f41b916c9a3b1d38a334301134e5", [])
漫语体 = EffectMeta("漫语体", False, "7081925440264213000", "1665066", "e91bd31939be0dbbcae085a64d151ad6", [])
澄月 = EffectMeta("澄月", False, "7246698168547561986", "20404007", "5ff03a1ddae1b9a9909926629d4aa63e", [])
瀞ノクーケ_ル明朝 = EffectMeta("瀞ノクーゲル明朝", False, "7236735801088807482", "20403339", "b20759e5aec663c007cc19c16460f819", [])
点宋体 = EffectMeta("点宋体", False, "7080096967543493150", "1654204", "e5338c6ec760fc059b257d8dc31e7279", [])
烈金体 = EffectMeta("烈金体", False, "7043773114546655781", "1488714", "dd0bc895570589984077890ab098ef15", [])
烟波宋 = EffectMeta("烟波宋", False, "7068531367386026526", "1589144", "4ee19f0d46c10ccc70bac084226e6f82", [])
爨宝子碑 = EffectMeta("爨宝子碑", False, "6852191233356337671", "814916", "f2686de98659e4812016cfc41192f726", [])
特黑体 = EffectMeta("特黑体", False, "6740439840254333443", "349329", "92988aefce8a45c8fd7fe58a60fc72cc", [])
玉轩体 = EffectMeta("玉轩体", False, "7290446916402287163", "25999001", "ab11f1f4e5eeb5d783a8ddae06c34225", [])
玩童体 = EffectMeta("玩童体", False, "6766524209620324877", "459292", "99ac707c2ba4d141161fcec8a9ea91b7", [])
琉璃宋 = EffectMeta("琉璃宋", False, "7020719089999942157", "1402720", "a3bd369495563713486e56b7f550af87", [])
瑞意宋 = EffectMeta("瑞意宋", False, "7130447431891685895", "3997461", "a73364889c89bd6be1d08a92cb49245a", [])
瑶蝶体 = EffectMeta("瑶蝶体", False, "7290446536050217532", "25998987", "04e3d3e0eae3de5c859e8c00d2b48759", [])
甜甜圈 = EffectMeta("甜甜圈", False, "7130634783163421215", "4009729", "bbe904649c122449f4ea360030b603a6", [])
白舟武骨 = EffectMeta("白舟武骨", False, "7212913285383852600", "10971151", "2049cc4511ce3d74dbcc2b6678615922", [])
目光体 = EffectMeta("目光体", False, "7035921361348334117", "1459640", "39e69d115d15e598c11d2686067dc70d", [])
真言体 = EffectMeta("真言体", False, "7003588300720050696", "1349505", "9ae1a1787978c3b8e2a06a9d0c55906a", [])
知夏森林 = EffectMeta("知夏森林", False, "7224042336223760954", "12441415", "9d8f09292c3d223bc5a0ac05e373902a", [])
研宋体 = EffectMeta("研宋体", False, "7130644288047682085", "4010355", "06458c13377d445fe3368cd2c786c7a5", [])
研月体 = EffectMeta("研月体", False, "7290446001947546149", "25998978", "7357fd4adcd7d003cc8ce73876e5b660", [])
禅影体 = EffectMeta("禅影体", False, "7278963576167993916", "22902355", "438c78fb511d6993217961e53a281c0a", [])
秀英四号太かな = EffectMeta("秀英四号太かな", False, "7246698168543351298", "20404005", "9ab728019cac814d6634b4f9df2ea909", [])
站酷仓耳渔阳体_W02 = EffectMeta("站酷仓耳渔阳体-W02", False, "7265609366311539237", "20379308", "9a845e092fe17de221ac868374d9744b", [])
站酷仓耳渔阳体_W03 = EffectMeta("站酷仓耳渔阳体-W03", False, "7265610166744125989", "20379299", "4ae46d2552d181b6ad61de16f81a01e6", [])
站酷仓耳渔阳体_W04 = EffectMeta("站酷仓耳渔阳体-W04", False, "7265609848438395449", "20379307", "709d54b0e2a042680ea24ee4705e299e", [])
站酷文艺体 = EffectMeta("站酷文艺体", False, "7265593885475213880", "20373100", "16a1388d7e0219385f7db1afd56d5255", [])
站酷酷黑体 = EffectMeta("站酷酷黑体", False, "7265609486646121018", "20379297", "bf9cb4e27fff8ea1dacdd07ed038f92f", [])
童趣体 = EffectMeta("童趣体", False, "7035888265290846756", "1459176", "07911c7bc89d724503b88c6fbafaccc5", [])
竹柏体 = EffectMeta("竹柏体", False, "7290447547208831544", "25998983", "f1e9985534986c52aebe7cec8116383a", [])
竹风体 = EffectMeta("竹风体", False, "7290447605065060901", "25998973", "b27dc01a8f98a87292b7f6f589dcbe33", [])
简中圆 = EffectMeta("简中圆", False, "7050009066717844005", "1511618", "f26eb8bd135d147bb7700a560f1a5470", [])
糯米团 = EffectMeta("糯米团", False, "6934225430266253837", "1053146", "aee9551fab5ef01c45dbe3335869db1d", [])
結月 = EffectMeta("結月", False, "7013643491003601410", "20403297", "8eb2aac0456da1b04e206fc3fe1d75d8", [])
纯真体 = EffectMeta("纯真体", False, "7045185581772444174", "1494870", "b33e32b8733e27775849ee5d7f92d7e7", [])
细体 = EffectMeta("细体", False, "6740511815358222859", "349521", "3d80be25a18fb67455744136c1262c91", [])
经典雅黑 = EffectMeta("经典雅黑", False, "7043775037559542279", "1488718", "ba7bbfabf030860ee4a23d6596a6c6e3", [])
综艺体 = EffectMeta("综艺体", False, "6740499188347310605", "349467", "8d34d3abe70f2c3c61f9a93b1f85c76b", [])
综艺字 = EffectMeta("综艺字", False, "7130642664080282149", "4010283", "74671c7987f56ba9a6ab93f95856973a", [])
美佳体 = EffectMeta("美佳体", False, "7203665054338650685", "9898774", "69a5666d4ab91113ea146e71bc3e42c9", [])
聚珍体 = EffectMeta("聚珍体", False, "7203638484752405051", "9893381", "7e024261e2d38e87bc78e6843ad2e6b3", [])
胡晓波男神体 = EffectMeta("胡晓波男神体", False, "7265612031825285689", "20379293", "b383909e5988beae9c65d91a451d4db9", [])
胡晓波真帅体 = EffectMeta("胡晓波真帅体", False, "7265611790313067069", "20379292", "4392c7918eaffa6dd9af883ef4b628e2", [])
胡晓波骚包体 = EffectMeta("胡晓波骚包体", False, "7265611912849658429", "20379298", "6fd07e4a429f7ebe39c205aea5962ab6", [])
芋圆体 = EffectMeta("芋圆体", False, "7039989971796628005", "1478272", "c47882a0a6781f00b6b152c456844413", [])
花语手书 = EffectMeta("花语手书", False, "7081925028773630471", "1665069", "d79245bb807ef0f74165afdb07b5f952", [])
芷云体 = EffectMeta("芷云体", False, "7290447317247726139", "25998979", "740074083cab996fa9115efb9ca63eaf", [])
若烟体 = EffectMeta("若烟体", False, "7290445344557503033", "25999000", "001f25aa8dc71e9221433f2ff6c8e540", [])
荔枝体 = EffectMeta("荔枝体", False, "6740498118342611464", "349483", "9beb006988541f18a560f8029d47defa", [])
萌趣体 = EffectMeta("萌趣体", False, "7045186231122006535", "1494868", "005466971691f729c2a0927ffe6f81b7", [])
萧疏体 = EffectMeta("萧疏体", False, "7290445832845791801", "25998989", "70729e571b7729a7be14828f525ce9ef", [])
蒹葭体 = EffectMeta("蒹葭体", False, "7290443923556667959", "25999014", "04660ff6d07b1fd3437128caf3adfbb8", [])
薯条少年 = EffectMeta("薯条少年", False, "7068530728467698213", "1589148", "8842c4ca3fde9cefeaa17fa5bb99a77b", [])
蜡笔体 = EffectMeta("蜡笔体", False, "6932407677234450952", "1049208", "05791deed6ab491bbc32edba7af8fa2e", [])
蝉影隶书 = EffectMeta("蝉影隶书", False, "7045186520738697742", "1494867", "afcec5248968e5b3fd7d7eb3a670eadc", [])
蝶汐体 = EffectMeta("蝶汐体", False, "7290441304029270587", "25999007", "c45854a55e2d3320e47c299633df8c7f", [])
装甲明朝 = EffectMeta("装甲明朝", False, "7265536455655559739", "20356625", "3f334186c4522694108e7ab9534201fd", [])
解星テ_コール = EffectMeta("解星デコール", False, "7236735801088807461", "20403335", "e87c0310b7f95ded9e9466ed5a038d23", [])
谷槐体 = EffectMeta("谷槐体", False, "7290442552933618213", "25999006", "eb56bfc5c186158d60149372192b99ba", [])
谷秋体 = EffectMeta("谷秋体", False, "7290442742822343205", "25999008", "233d1f80de91946da3c59527a61b1c87", [])
超级战甲 = EffectMeta("超级战甲", False, "6970982657576407559", "1156412", "2872dab5c322f42ed7d1d9715013dc36", [])
超重要体 = EffectMeta("超重要体", False, "7203638484752405048", "9893378", "d21f913df460b6a9332a1520f7fe2d0c", [])
轻吟体 = EffectMeta("轻吟体", False, "7035927184275411464", "1459730", "205a76c590ab163af423468e7f416a91", [])
轻烟体 = EffectMeta("轻烟体", False, "7290445091401896507", "25998992", "477c79ab3925eb7eacf381bbc5df9cf8", [])
追光体 = EffectMeta("追光体", False, "7203638485666763325", "9893371", "5e0b49b0a3e33e04769cabbee228f6f4", [])
造字工房朴月体 = EffectMeta("造字工房朴月体", False, "7174426619228983816", "7046698", "7e21275ffaeeacc4472580bad9a95b19", [])
逸致拼音 = EffectMeta("逸致拼音", False, "7070430706689643038", "1600480", "e15bf3763fb346f8b60eebabf04bdeee", [])
醉冬体 = EffectMeta("醉冬体", False, "7290447667463721531", "25998974", "03b90eec6b256b89377e9f0b2936a9fe", [])
醉山体 = EffectMeta("醉山体", False, "7290447771503432250", "25998980", "593e3537fab3af2dee1cff9ef8272571", [])
金陵体 = EffectMeta("金陵体", False, "7086699209738424840", "1698067", "599831579b8aa5b5f0608d5e7d4ec5ce", [])
钟隶体 = EffectMeta("钟隶体", False, "7290447395433747002", "25998975", "986ea2205ab06bf06be49eff695633ab", [])
锦瑟体 = EffectMeta("锦瑟体", False, "7290443998345302586", "25999022", "eb465dc5d9f045c5ff3ce34d480a2529", [])
闘龍 = EffectMeta("闘龍", False, "7246698168547561985", "20403941", "b2552e48bc11cb289ccdf4504e3b771f", [])
陈森田 = EffectMeta("陈森田", False, "6740499585669534215", "349461", "2f460ce688c37123262d25a3cc01771c", [])
雁兰体 = EffectMeta("雁兰体", False, "7290446084780855867", "25998990", "6198e5f40da27fec116ee785c23b837e", [])
雅酷黑简 = EffectMeta("雅酷黑简", False, "7130640934366089758", "4010137", "35ddec41ffa518033484f219e324a6bd", [])
霸燃手书 = EffectMeta("霸燃手书", False, "7045187409960505886", "1494865", "e4f6766608951c7184a5d2a56aa370fa", [])
青松体 = EffectMeta("青松体", False, "7290444911940211237", "25998985", "f4e7026acbdb7edd1003d24561f2add7", [])
青翼体 = EffectMeta("青翼体", False, "7290445024435638842", "25998995", "ed99664d2260c7ea5390f24d9f280a69", [])
风铃悠悠 = EffectMeta("风铃悠悠", False, "6903832640005083655", "979898", "6bec0d77ab4770d730f03611e9ae7f3d", [])
风雅宋 = EffectMeta("风雅宋", False, "7208056673317950011", "10379505", "c4624c3d535a1801e0992ccb25de6ac4", [])
飒爽手写 = EffectMeta("飒爽手写", False, "7054125855676568095", "1530070", "86756c9b0c71fd513bcc163893b56d7e", [])
飞扬行书 = EffectMeta("飞扬行书", False, "7035922620969128479", "1459678", "0532175b5a7a61e379d6b1f23c212f43", [])
飞驰体 = EffectMeta("飞驰体", False, "7045186745100407310", "1494866", "1e9478384005377f087abf035cdffe64", [])
高字标志黑 = EffectMeta("高字标志黑", False, "7268259518427959866", "20885841", "4843f24f22c8d22c984533e347be275a", [])
高字湘黑体 = EffectMeta("高字湘黑体", False, "7268259657167147577", "20885842", "2f0c093261b368846aae47cf8a8f74ba", [])
魏碑体 = EffectMeta("魏碑体", False, "7035925927364137480", "1459722", "86169b46ad4dc73060f2a0b8d4f85a48", [])
鲁迅行书 = EffectMeta("鲁迅行书", False, "6852191147230499341", "814917", "f1e089b61ff8c80ae89a929480c29f9e", [])
鸿朗体 = EffectMeta("鸿朗体", False, "7290443206641062456", "25999020", "f5c0a418632780b008ec6d06476f3a3c", [])
鸿潮榜书 = EffectMeta("鸿潮榜书", False, "7080096689553412615", "1654206", "9bbd5d67cabab4f174289af1c1efbe4c", [])
黄令东齐伋复刻体 = EffectMeta("黄令东齐伋复刻体", False, "7265535655105532476", "20356605", "e7830741b741962e5c43105ea25e3612", [])
黄油体 = EffectMeta("黄油体", False, "7265594455246246456", "20373099", "8d461ee41e8ffba2b77eae73f0a81d77", [])
黄金时代 = EffectMeta("黄金时代", False, "7050010418932093471", "1511614", "269a3b6801b4e0b8e43d2d786f729da5", [])
黎首体 = EffectMeta("黎首体", False, "7290444159842783803", "25999009", "ab6b6d28a350348b62613d3d0107096e", [])
黒明朝 = EffectMeta("黒明朝", False, "7246698169310908930", "20404021", "4bc15cc4aac4d0cd44bb1949573d0cb7", [])
默陌手写 = EffectMeta("默陌手写", False, "7025886295524119053", "1424938", "64b0eee1f99387b2d7a27f9c961e6bba", [])
검 = EffectMeta("검", False, "6841117522335371789", "20402365", "22104eb8b13bb33ff67be66a0a354723", [])
검은_고딕체 = EffectMeta("검은 고딕체", False, "6808056243958059534", "20402283", "eb3c9a93c57d012275f863dc505cd599", [])
고딕 = EffectMeta("고딕", False, "6841143710177038856", "20402461", "4fa8d9e036b07cfb4903758f59f853f4", [])
고딕체 = EffectMeta("고딕체", False, "6808056385679397389", "20402279", "046f11d9049144aa80e3723b5ed93b7a", [])
귀염 = EffectMeta("귀염", False, "6841117240457171470", "20402361", "88e33d4c49ea8e0d3e2a34db33d5baf9", [])
나눔_명조체 = EffectMeta("나눔 명조체", False, "6808057418866496014", "20402271", "98fa1cc813be2355fa176d7ccf67b785", [])
낭만 = EffectMeta("낭만", False, "6841119058838950414", "20402441", "9b3b62befefc316098b5e5dd9396ad25", [])
로맨틱가이 = EffectMeta("로맨틱가이", False, "6808056744258834952", "20402275", "b393bd8032b9567e9111e28cf216156a", [])
로봇 = EffectMeta("로봇", False, "6841119449815192071", "20402445", "55dbee5dae1f9078477c7ecfc2a0be39", [])
룬 = EffectMeta("룬", False, "6841118098964091405", "20402401", "a029f910e187edc554df3f7945c7f022", [])
버터 = EffectMeta("버터", False, "6841119192150708744", "20402443", "c967a8d8bd3640d6e59f02a0277bb04b", [])
성냥개비 = EffectMeta("성냥개비", False, "6841118217641923085", "20402431", "7bfdd9c2dad08600a83f226db3149653", [])
소나무 = EffectMeta("소나무", False, "6841116992846434829", "20402359", "261086435afe50219a1156d1aa3b0004", [])
시트콤 = EffectMeta("시트콤", False, "6841116836445032974", "20402357", "f95108bc596583df9ddc9bfec7813e62", [])
십대 = EffectMeta("십대", False, "6841117356756832776", "20402363", "d589218d3c08ad6e0a4cb1de1bd00f03", [])
아기 = EffectMeta("아기", False, "6808056941458231815", "645451", "79273a8d31ec91b9f110243bd1096291", [])
아이 = EffectMeta("아이", False, "6841118486639415822", "20402433", "c9db70b65b984a4363c15343b2bd2573", [])
유행 = EffectMeta("유행", False, "6841117979371901454", "20402399", "009b2f822e20ece4ed7f2ae3df8e431f", [])
이야기 = EffectMeta("이야기", False, "6841118628025209358", "20402435", "cb58fd3d586a63998dd3a2a9b2c74441", [])
전통 = EffectMeta("전통", False, "6808056067201700360", "20402311", "113f70827a53eb347c4963008442f5e0", [])
초승달 = EffectMeta("초승달", False, "6841117705538376205", "20402369", "ef26b19722edb198afb05dbf1e6aaaf6", [])
추사체 = EffectMeta("추사체", False, "6808057229309121038", "20402301", "03f146063813fef4e276122ec2f9022c", [])
커피 = EffectMeta("커피", False, "6841118775186559495", "20402437", "7a1aae32d9c48be23d5ef99797977c68", [])
필기 = EffectMeta("필기", False, "6766523918946669069", "459288", "b393bd8032b9567e9111e28cf216156a", [])
한드 = EffectMeta("한드", False, "6841118889850442254", "20402439", "398d40463233dfad04e3419248a1f216", [])
행복 = EffectMeta("행복", False, "6841151352597385735", "20402465", "ced999c86d6916f621b8a5c0c2d325af", [])
흑백만 = EffectMeta("흑백만", False, "6841116695759688205", "20402327", "8626c3ab19bd1ea9e6a8cbbbb3ff48dd", [])
アドゴッシク = EffectMeta("アドゴッシク", False, "6841482093025825288", "20403099", "ca0367d4e28ad273f187747c45d27d57", [])
オーバーラップ = EffectMeta("オーバーラップ", False, "6841482806573404680", "20403059", "c771c84fc32ec5f969a8230a54453652", [])
スクリプト = EffectMeta("スクリプト", False, "6841483289438458381", "20403035", "516cd5ca0a4c4fb58e51023e76c95d94", [])
セリフ太字 = EffectMeta("セリフ太字", False, "7020729846334493215", "1402800", "569bf7220b9170da8dd45c2241740140", [])
セリフライト = EffectMeta("セリフライト", False, "6841481513985380872", "20403113", "6448241a16c56d4c8dfa6ecb6b04c1c0", [])
モーダ太字 = EffectMeta("モーダ太字", False, "6841481374243754510", "20403121", "e523f252c437fb3b707044a3a4492899", [])
モーダライト = EffectMeta("モーダライト", False, "6841480712739099150", "20403133", "d0ba57c8c707a5aee48cfbe5214017cf", [])
レギュラー = EffectMeta("レギュラー", False, "6841482701082464776", "20403061", "97c3fa9b7e660481c34e3991449e0886", [])
# 付费特效
Aa之云体 = EffectMeta("Aa之云体", True, "7501533851718521394", "115474299", "c2d2b3f676344b6c60abb1c86490a81a", [])
Aa乌日莫 = EffectMeta("Aa乌日莫", True, "7501234570835006003", "115375585", "3c3abd1d591cebc922f726ca6757bd83", [])
Aa人间蹉跎 = EffectMeta("Aa人间蹉跎", True, "7501532931635024434", "115473709", "3cb617e2815bc9933189305a24d97c4d", [])
Aa全息黑体 = EffectMeta("Aa全息黑体", True, "7497891126481785381", "114156127", "4e1d0e0a88ceac64b296c29fe0a39b3e", [])
Aa刃黑体 = EffectMeta("Aa刃黑体", True, "7497895571210900005", "114159648", "6b49279ad89772018b28ca98a4c45253", [])
Aa剑豪体 = EffectMeta("Aa剑豪体", True, "7501261456420114981", "115395999", "c348d6f9b504581f4eb1f3654272b4fb", [])
Aa动员宋 = EffectMeta("Aa动员宋", True, "7501238408837075483", "115377308", "ebdb43b153a9ffad27012ac91380a2c8", [])
Aa勘亭流 = EffectMeta("Aa勘亭流", True, "7501211609050649115", "115360771", "94d4d50001bfd5b803117535413066bc", [])
Aa厚底黑 = EffectMeta("Aa厚底黑", True, "7174431250067755577", "7047541", "f3b0d37b587cc5b5ee33b5092802c5a7", [])
Aa古线体 = EffectMeta("Aa古线体", True, "7501211793906209331", "115360774", "ddae3345190c1a093966c9c7e3fd63a2", [])
Aa台灣漢字心動信號_简繁 = EffectMeta("Aa台灣漢字心動信號(简繁)", True, "7497889331973984805", "114154846", "6c4a38850eb3b3b52f5a68d682fa430a", [])
Aa封神榜书 = EffectMeta("Aa封神榜书", True, "7501235311461012018", "115375582", "fd1dbebd76b8b781fa4472f4fc86f297", [])
Aa小星星 = EffectMeta("Aa小星星", True, "7501533449530905114", "115474013", "a7543af068a34d006b9d245631c6ac14", [])
Aa居酒屋 = EffectMeta("Aa居酒屋", True, "7501539460945809957", "115478734", "8b7c3464cb22da3b34b1366a3a9db35a", [])
Aa巴洛克 = EffectMeta("Aa巴洛克", True, "7501235648557224498", "115375583", "27819df69cf24dea1b6680e172ff2383", [])
Aa幻想 = EffectMeta("Aa幻想", True, "7501533252969042470", "115473869", "db640c840ec4a3ac277f82651d882a6a", [])
Aa德古拉简 = EffectMeta("Aa德古拉简", True, "7497898575926399498", "114171804", "2b8c71449d9bd07af2b53e39649195aa", [])
Aa放放隶书 = EffectMeta("Aa放放隶书", True, "7497890527145103881", "114155759", "df28a19f3fabcea1714983b641b74f04", [])
Aa新华墨竹体 = EffectMeta("Aa新华墨竹体", True, "7497893640140755494", "114158131", "8f980bd172a4209dffdfe9607eb3479e", [])
Aa新华惊马体 = EffectMeta("Aa新华惊马体", True, "7501238774051902002", "115377540", "6311492d22d45387cc0a7d33175f0509", [])
Aa新怪谈 = EffectMeta("Aa新怪谈", True, "7501235484727710246", "115375584", "09588ce566b7a1e04b8d9e8dad5b9307", [])
Aa方块黑 = EffectMeta("Aa方块黑", True, "7497893873037873714", "114158130", "c05e291a77ad65289700a642af2ac23a", [])
Aa未央宫词 = EffectMeta("Aa未央宫词", True, "7497892647986532914", "114157130", "d09257691cd47c862d817b37a901c5ab", [])
Aa杜康手书 = EffectMeta("Aa杜康手书", True, "7501262679810511370", "115396001", "9a2c0455cdb75dfd2c26cea7a3d2e33d", [])
Aa欢乐堡 = EffectMeta("Aa欢乐堡", True, "7501235116673339954", "115375586", "a4dc41ffdc19e2943272ddd094977633", [])
Aa水玉圆体 = EffectMeta("Aa水玉圆体", True, "7501211417521951270", "115360773", "2b4738a757bafc3a206443c6487eb98a", [])
Aa浮梦体 = EffectMeta("Aa浮梦体", True, "7501212180285493787", "115360769", "91bc40daba8b5cd9c0297ef0e5c2faae", [])
Aa海豹体 = EffectMeta("Aa海豹体", True, "7501212376713138698", "115360770", "24369b05f05fa1f8e503e7e164de413b", [])
Aa清欢圆体 = EffectMeta("Aa清欢圆体", True, "7497893259797074441", "114158127", "0059c8befa5a7e0543e62a3cfb0961e7", [])
Aa漆书 = EffectMeta("Aa漆书", True, "7497890203277726235", "114155607", "5cfd18f135307a803de983307f256203", [])
Aa烈焰隶书 = EffectMeta("Aa烈焰隶书", True, "7501239212855792165", "115378827", "0e784d2d379a3cdefcd88e808df0c89c", [])
Aa狂派手书 = EffectMeta("Aa狂派手书", True, "7501260939212100146", "115396002", "9f70fc1fb883f713d2aad9ec629f891d", [])
Aa疏漫宋 = EffectMeta("Aa疏漫宋", True, "7497897887477535242", "114171805", "0491ac4f070fbe395856d0e19e4f1027", [])
Aa百物语 = EffectMeta("Aa百物语", True, "7501234966815052339", "115375580", "db0dab0965562d57c7770c7d2778d5bb", [])
Aa祝融隶 = EffectMeta("Aa祝融隶", True, "7501262524466074121", "115396000", "75791dafa1036a011a9d23b80c22402a", [])
Aa简正隶黑 = EffectMeta("Aa简正隶黑", True, "7501238583911518729", "115377425", "9b00ec896d0655c5966a80ffb236f2fa", [])
Aa芥末墩 = EffectMeta("Aa芥末墩", True, "7501234746416960050", "115375581", "8dbda4bb6f1f69d6e765aa773e0d93f3", [])
Aa菊花体 = EffectMeta("Aa菊花体", True, "7497894073559159323", "114158129", "08cc7d09f863c337c66601564a73c9db", [])
Aa融融宋 = EffectMeta("Aa融融宋", True, "7501238214691131930", "115377151", "d5ea45ee9325d5f5664d0b9955dfbad6", [])
Aa西风手书 = EffectMeta("Aa西风手书", True, "7497891525213295114", "114156355", "6bfd89309c57db170a8058502ad2dd78", [])
Aa跃然体 = EffectMeta("Aa跃然体", True, "7501262110492463625", "115395996", "0b729ba9eaebde7cffc63b285a55ed4e", [])
Aa醒狮体 = EffectMeta("Aa醒狮体", True, "7501260756655018533", "115395997", "23ffea61da52f50710ad590525ef8b46", [])
Aa金石体 = EffectMeta("Aa金石体", True, "7497891337044234789", "114156237", "f66ddc70f3a7e0b80af776d9b59b2df3", [])
Aa锐智体 = EffectMeta("Aa锐智体", True, "7501238022352933413", "115377035", "41a8ad1e053a994d062f45c303d28855", [])
Aa锐甲黑 = EffectMeta("Aa锐甲黑", True, "7497896024078291482", "114159647", "ce12950846b42d3ca7db007b2702f892", [])
Aa锐雅体 = EffectMeta("Aa锐雅体", True, "7497896536597074483", "114159649", "8d1884ec7380f5aa0c5ed0d6ed248419", [])
Aa镁宋 = EffectMeta("Aa镁宋", True, "7497898052825387530", "114171803", "91ba8555000f2047c56714f96e0129bd", [])
Aa闲云体 = EffectMeta("Aa闲云体", True, "7501261128207438386", "115396003", "38adf19d88cb05a6704ba4885eb44a12", [])
Aa霸道楷 = EffectMeta("Aa霸道楷", True, "7501210878839099930", "115360768", "14d529c19ff5422c2a71c02d2f0942a5", [])
Aa顽宋 = EffectMeta("Aa顽宋", True, "7497896719514866203", "114159645", "b82001265d8c3b358793d30b9a2f501e", [])
Aa鲸潮体 = EffectMeta("Aa鲸潮体", True, "7501261289486815795", "115395998", "ed1adf6e49aa98e72824bf0acd575865", [])
Aa鹅卵石 = EffectMeta("Aa鹅卵石", True, "7497894333161411098", "114158128", "592312dab4297df570ca565b43c17dc1", [])
Aa麟兰宋 = EffectMeta("Aa麟兰宋", True, "7497896347551404595", "114159646", "60b1d9a919f4b30922ce0f3accb15b5c", [])
Aa龙象体 = EffectMeta("Aa龙象体", True, "7501211164332790298", "115360772", "24206940919ae94e22bb052739cfdafb", [])
Atomic_Marker = EffectMeta("Atomic-Marker", True, "7490531359736205834", "111804574", "c3ddb0454628811c3562a03f256a126d", [])
Awelier = EffectMeta("Awelier", True, "7491984624688566835", "112259365", "0e869f12fca5b2af601afec79f64d4ad", [])
CC_Captial = EffectMeta("CC-Captial", True, "7418508570066424330", "84086581", "8ba811d327acd1516615259819da72a2", [])
CC_Chubby = EffectMeta("CC-Chubby", True, "7481130667518988850", "108570272", "7876d2d83e1e2b85bd87e0ba74274802", [])
CC_Decocut = EffectMeta("CC-Decocut", True, "7419969356659954214", "84566362", "bd7466b88b16c19833a1c1151303e016", [])
CC_DerStil = EffectMeta("CC-DerStil", True, "7481130779821478426", "108570258", "c6cc9a5326909d0ca63eac1ab3be6e3d", [])
CC_Element = EffectMeta("CC-Element", True, "7416649778416587274", "83388253", "1e7becc8521b658de14864db8fcbb389", [])
CC_Fluffy = EffectMeta("CC-Fluffy", True, "7412942953905132049", "82112759", "87954588501cc7c35de2789bfe23ab21", [])
CC_Fusion = EffectMeta("CC-Fusion", True, "7441202923708617227", "93510805", "a6e9ea208def5ea9fe2f8177fb03aa8f", [])
CC_Glee = EffectMeta("CC-Glee", True, "7428153662695805478", "87224070", "2f6e2cdb94c3b68451d68916fee6515b", [])
CC_Loopy_Letters = EffectMeta("CC-Loopy Letters", True, "7484186924291199526", "109692383", "898932311d059de4523acad926122499", [])
CC_Manga = EffectMeta("CC-Manga", True, "7484175941208379914", "109692410", "9d6a96d28565c511fc9a96b51c70f7f5", [])
CC_Moderno = EffectMeta("CC-Moderno", True, "7444152681741947403", "94915234", "3bd5f42349aa8b0d3d211b6d2a6c31d4", [])
CC_MonoCut = EffectMeta("CC-MonoCut", True, "7416261331872911881", "83245166", "45a1f04c1214f28081f2cd32c8814a39", [])
CC_Piston = EffectMeta("CC-Piston", True, "7414496688611529255", "82624536", "3b3026dc1324ff59c62f34b02b2d5822", [])
CC_Rapid = EffectMeta("CC-Rapid", True, "7434004568716874259", "89156910", "97e21584fc2f88a0473c3b6dd5abec25", [])
CC_UltraMass = EffectMeta("CC-UltraMass", True, "7481130884687467046", "108570236", "c82dd71f169384002fac0d6f1274b62d", [])
CC_Vita = EffectMeta("CC-Vita", True, "7419969457788817929", "84566385", "cab4d8408ed7788346c73f1237426184", [])
CC_lemon = EffectMeta("CC-lemon", True, "7484188078546883082", "109692355", "0014e25d1ed87857d83f9f46fd8644c1", [])
Clostan = EffectMeta("Clostan", True, "7491985061500162598", "112259661", "499772addc34d3c0c57d0db12a4f3836", [])
Gildan = EffectMeta("Gildan", True, "7491984485504782874", "112260846", "b64a233d2273b4424e3498357764756d", [])
Gildan_It = EffectMeta("Gildan-It", True, "7491984248069427750", "112259122", "2d59c5411a396be79a972abb62bcef23", [])
JYruantang = EffectMeta("JYruantang", True, "7451897289527792178", "98222876", "af78243f78f27dfa80aca4e82c77eb1d", [])
JYshiduo = EffectMeta("JYshiduo", True, "7451897058371310117", "98222874", "24fdaeb998c36d329b423561398ba4e3", [])
JYzhuqingting = EffectMeta("JYzhuqingting", True, "7451897479320048166", "98222875", "921ba2b753807a5fb0d56a967225a352", [])
Mellow = EffectMeta("Mellow", True, "7491984798026568218", "112259480", "7815b9c5cb6e7a5c6bbf9f95416170e7", [])
Merry_Christmas = EffectMeta("Merry Christmas", True, "7451574186692055578", "98103035", "2a8b0f3ec8be1bde50969620603553af", [])
Morska = EffectMeta("Morska", True, "7491984914565304870", "112259573", "5413dba12d4f3832a43d15038a19cdb8", [])
MyFont凌渡哥哥简 = EffectMeta("MyFont凌渡哥哥简", True, "7316825302406009395", "36880890", "cc22c869da3e5aecae2c1ffaf27d3eda", [])
MyFont凌渡猪猪简 = EffectMeta("MyFont凌渡猪猪简", True, "7316826370200310298", "36880879", "991bae1ed498bc17c16056935b73fa9b", [])
Railway_Gank = EffectMeta("Railway-Gank", True, "7490534157064344074", "111805300", "b4f6d043abc325eb5ba55a79d3c8266c", [])
Sugary = EffectMeta("Sugary", True, "7491984099733672485", "112259022", "2dba8f998289f81f20658ad407c4732d", [])
Sugary_Dreams_Italic = EffectMeta("Sugary-Dreams-Italic", True, "7490531151350600219", "111804589", "2dba8f998289f81f20658ad407c4732d", [])
Thinker_Alt1 = EffectMeta("Thinker-Alt1", True, "7490531314752295450", "111804584", "7b5044afab06e051cc2d70a75988e18a", [])
Ugly_Dave_Alternates = EffectMeta("Ugly-Dave-Alternates", True, "7490531414392181258", "111804564", "aa46d2672cecc9d16c4184c804c85d23", [])
Vogue = EffectMeta("Vogue", True, "7491983297870828058", "112258561", "a891f2a60d48be581685f9136e9418ca", [])
ZY_Amity = EffectMeta("ZY Amity", True, "7311977316970664449", "34200643", "d6723285163f5230adc9bab0063530ae", [])
ZY_Balloonbillow = EffectMeta("ZY Balloonbillow", True, "7353574360667394561", "55106512", "f6405bfdefb032ab060c05d9a1a7038a", [])
ZY_Blossom = EffectMeta("ZY Blossom", True, "7304640684311450113", "30910322", "0435212aa54de0bbd8797b877eed75b4", [])
ZY_Brief = EffectMeta("ZY Brief", True, "7311977774799917570", "34200651", "85952d2387016574cb2630d7f6760f4a", [])
ZY_Classical = EffectMeta("ZY Classical", True, "7311977840574992897", "34200639", "65a5e2bf53c01be6ab002d281f2b917d", [])
ZY_Concise = EffectMeta("ZY Concise", True, "7317175365288333826", "37544776", "e1727e1559ea44eef5a79f4d2e0f0901", [])
ZY_Coruscant = EffectMeta("ZY Coruscant", True, "7302355236243378689", "30000836", "13b25f0cefddbd9674fa37821a864ad2", [])
ZY_Courage = EffectMeta("ZY Courage", True, "7304640798488793602", "30910326", "902c396d8481367784495d73620b1a90", [])
ZY_Daisy = EffectMeta("ZY Daisy", True, "7302355415038169601", "30000858", "5694276489bf9e70db025e6f19277508", [])
ZY_Dots_Art = EffectMeta("ZY Dots Art", True, "7407288650473411088", "80464454", "6cf134f84322facd5a889b4cdfd8dde3", [])
ZY_Elegant_Black = EffectMeta("ZY Elegant-Black", True, "7324166053649453570", "40250742", "9ed1afc8f2ba9b8abdec694010254e7b", [])
ZY_Elixir = EffectMeta("ZY Elixir", True, "7302355533313348097", "30000844", "ebd4e8ef85eacc25860cd9c4c7d63d72", [])
ZY_Fabulous = EffectMeta("ZY Fabulous", True, "7302355634538680833", "30000832", "2f673e5e2e8d956e6a0c6d8b28203d05", [])
ZY_Fantasy = EffectMeta("ZY Fantasy", True, "7350189137770582529", "53177510", "09af030c4b206c3b895502f715c80d79", [])
ZY_Flexible = EffectMeta("ZY Flexible", True, "7320169752465248769", "38698722", "7db82031c43cd09a3eb2e4a8cefff9cc", [])
ZY_Flourishing_Italic = EffectMeta("ZY Flourishing-Italic", True, "7330606083335000577", "43287756", "dca57209a301d9119b911bff090262a8", [])
ZY_Fortitude = EffectMeta("ZY Fortitude", True, "7330160852353421825", "43041469", "2db56cf21059b8a0c192f801555df245", [])
ZY_Genial = EffectMeta("ZY Genial", True, "7343835314105881090", "49626244", "880c71fe5718834d2af405079017a334", [])
ZY_Harmony = EffectMeta("ZY Harmony", True, "7311977407244669441", "34200663", "627c4a4271a14a2aaa50e99f55b55061", [])
ZY_Ingenious = EffectMeta("ZY Ingenious", True, "7332772999801606657", "44370268", "ff9c0fcb108f4f2c31521ebfdc4a924b", [])
ZY_Kindly_Breeze = EffectMeta("ZY Kindly Breeze", True, "7407289076090409489", "80464440", "a4e22dd23bf2aa6ae8ceda12400eb900", [])
ZY_Loose = EffectMeta("ZY Loose", True, "7311977919948001793", "34200631", "ee6834207df657453188eba97ee1f260", [])
ZY_Loyalty = EffectMeta("ZY Loyalty", True, "7371704099433091600", "66322554", "1e9b242443a9943a43ccf30604243978", [])
ZY_Majestic = EffectMeta("ZY Majestic", True, "7322744435404444161", "39631829", "5f9cf1ebd52e941a74774df029bd6499", [])
ZY_Modern = EffectMeta("ZY Modern", True, "7347670651626328577", "51844020", "5f5649ec5cd96f1311271d7f84e6151b", [])
ZY_Multiplicity = EffectMeta("ZY Multiplicity", True, "7371704261878485521", "66322523", "f9714cd361ad6ddb6ee5b255d1e8ee21", [])
ZY_Pace = EffectMeta("ZY Pace", True, "7311978000008876546", "34200623", "137b83eac18b26fb4ed9947cdc69f54d", [])
ZY_Panacea = EffectMeta("ZY Panacea", True, "7302355742936273410", "30000850", "dc33e6efcf20202d53ab1818c50216e2", [])
ZY_Relax = EffectMeta("ZY Relax", True, "7311977487469122049", "34200615", "4ac466f1249ffceb8ef9b6f366d42384", [])
ZY_Rhythm = EffectMeta("ZY Rhythm", True, "7311978076647199233", "34200633", "ba8aa30ec13b22027612010c12f6ef4d", [])
ZY_Slender = EffectMeta("ZY Slender", True, "7311977578821063170", "34200655", "bd7e086e303630912f12c4b75f93d139", [])
ZY_Spunk = EffectMeta("ZY Spunk", True, "7304640886703395329", "30910324", "8942384a7e78d2be8b650b0791afdd56", [])
ZY_Squiggle = EffectMeta("ZY Squiggle", True, "7371704357009494529", "66322535", "7b461311c3dae5726d9768969ff26ecf", [])
ZY_Starry = EffectMeta("ZY Starry", True, "7304640983893807618", "31942077", "8558a845c7f82bf81e5b27c654b413e2", [])
ZY_Steady = EffectMeta("ZY Steady", True, "7340237950094938625", "48055822", "2a7d2deb0d59c986f2b7dcec1ba5eafa", [])
ZY_Tactful = EffectMeta("ZY Tactful", True, "7343835205418881537", "49626266", "98526862d30f120428d722f0f482a535", [])
ZY_Timing = EffectMeta("ZY Timing", True, "7304641084833927682", "30910320", "95032638412a83a08c311a83bbcc85bb", [])
ZY_Trend = EffectMeta("ZY Trend", True, "7347670845185069569", "51844010", "0f62f8bfab9d76a74dc281c7f248ac23", [])
ZY_Upright = EffectMeta("ZY Upright", True, "7394802257847390737", "76415424", "7039078ff18119460a7475a4f0855c30", [])
ZY_Vigour = EffectMeta("ZY Vigour", True, "7340906771109646849", "48332840", "e3ec58ae48dacc61639cd3189782397f", [])
ZY_Vision = EffectMeta("ZY Vision", True, "7340906978828358145", "48332846", "d557c7127eb583608295e11d362c7db5", [])
ZYLAA_Demure = EffectMeta("ZYLAA Demure", True, "7313895257991549442", "35459490", "ce4f98f6b9b57daa44336c2489eff940", [])
ZYLAA_Flechazo = EffectMeta("ZYLAA Flechazo", True, "7313895610061427201", "35459194", "271dc59c2571611705199905a1e3720e", [])
ZYLAA_Gambol = EffectMeta("ZYLAA Gambol", True, "7313895522496942593", "35459480", "da0af3552b7d3a02852bb38492ebaf4e", [])
ZYLAA_Infinity = EffectMeta("ZYLAA Infinity", True, "7313895149266801153", "35459464", "89cb2458a15d287b1700e19da8992e6b", [])
ZYLAA_Serein = EffectMeta("ZYLAA Serein", True, "7313895348269748738", "35459448", "e2b7df96431748f6a111df6fa01bd0f2", [])
ZYLAA_lavender = EffectMeta("ZYLAA lavender", True, "7313895433011466754", "35459252", "e5cb066306e46ffbc15dc08eb70bc175", [])
一笔壹画加油体 = EffectMeta("一笔壹画加油体", True, "7390218575979483659", "74697345", "f3020b0f6e2995f787a4fab6faef0e33", [])
一笔壹画潮黑体 = EffectMeta("一笔壹画潮黑体", True, "7390218461990883876", "74696981", "97a3a570222328a8dd97b3921d3716bd", [])
三极云隶体中 = EffectMeta("三极云隶体中", True, "7312720330986885642", "34549534", "6f587feaf3648f708c4da91616e340fd", [])
三极力量体简_粗 = EffectMeta("三极力量体简-粗", True, "7405555944769196595", "79942352", "4c26fb32e20e6796d98a3ee30dfb5635", [])
三极古拙楷书 = EffectMeta("三极古拙楷书", True, "7410300778998403610", "81318534", "03580936bf93675062e50d273fea559d", [])
三极妙漫体 = EffectMeta("三极妙漫体", True, "7405556011081142822", "79942353", "d4ea5fbd89d90037a8d6500469023d96", [])
三极宋黑体超粗 = EffectMeta("三极宋黑体超粗", True, "7312720224510284326", "34549526", "8b847b757e21edd8f0189782f8dd97b4", [])
三极拙墨体 = EffectMeta("三极拙墨体", True, "7405556255906861605", "79942349", "8096b3c9dc67f62af7715b1d266ae1c7", [])
三极拙隶简体 = EffectMeta("三极拙隶简体", True, "7312720520011584038", "34549528", "b53e4ba7b8a1a275b290dc427127296d", [])
三极极宋超粗 = EffectMeta("三极极宋超粗", True, "7494187329054052901", "112957135", "f8122ed54493f8f66c8ebf6c422e6df2", [])
三极榜楷简体 = EffectMeta("三极榜楷简体", True, "7410300778990015027", "81318537", "1b1aadca917f42578fb41d5d95c6539c", [])
三极欢乐体 = EffectMeta("三极欢乐体", True, "7405555876368486939", "79942350", "e4acf0240f647779c23d3cd70452df5b", [])
三极正雅黑粗 = EffectMeta("三极正雅黑粗", True, "7312720421177004571", "34549517", "705aa06a0c64ac4348cf575e3921faf9", [])
三极气泡体 = EffectMeta("三极气泡体", True, "7405556128832033317", "79942351", "f1120030bd9df3fc5e58adfb2be96c26", [])
三极泼墨体 = EffectMeta("三极泼墨体", True, "7405556071848219186", "79942347", "ecbcf36e6184d1306dc75dcc9391f4b7", [])
三极活力黑简体_粗 = EffectMeta("三极活力黑简体 粗", True, "7410300778994209307", "81318539", "6125db74e7f1c5d73848a5359ac0303f", [])
三极浓密仙粗 = EffectMeta("三极浓密仙粗", True, "7312720141865718282", "34549529", "d65312a270f2f970f94b453b0e05949f", [])
三极湘乡体 = EffectMeta("三极湘乡体", True, "7410300778994209289", "81318538", "c817812de4b4be06462070c0af0e9ab0", [])
三极纯真体粗 = EffectMeta("三极纯真体粗", True, "7312719708283736627", "34549518", "c847816a7221cc0d5864e30de0612177", [])
三极罗丽黑简体_粗 = EffectMeta("三极罗丽黑简体-粗", True, "7410300778994209290", "81318535", "4950c4b06f6e7e882374bdd60add5bda", [])
三极萌喵简体 = EffectMeta("三极萌喵简体", True, "7410300778994225674", "81318536", "d56f4a0c1c39de0bc7d5c9fb6e9b1400", [])
三极行楷简体_粗 = EffectMeta("三极行楷简体-粗", True, "7405556194279952905", "79942348", "e901f6b29261b596fc8e7f85b1ea572b", [])
三极铿锵体 = EffectMeta("三极铿锵体", True, "7312720059191792154", "34549521", "9a5cdcda6b00d26af0ecfa9b79250c54", [])
三极黑宋体中粗 = EffectMeta("三极黑宋体中粗", True, "7312719852194501158", "34549520", "4577355bc0adeb1763ad581f05e7c5ea", [])
云书法三行魏碑体 = EffectMeta("云书法三行魏碑体", True, "7316822178538721830", "36880893", "8d1f5570b333f80196ec40fde68fd190", [])
云书法手书建刚静心楷简 = EffectMeta("云书法手书建刚静心楷简", True, "7316823183905002010", "36880886", "5b5b4250553e98394d9e01644ec47320", [])
云书法生如夏花简 = EffectMeta("云书法生如夏花简", True, "7316822784103944713", "36880894", "460bd3cafc980d468c35c960dd50a2d3", [])
云书法罗西硬笔楷书体 = EffectMeta("云书法罗西硬笔楷书体", True, "7316819473019703859", "36880892", "a8554d938efd7655890ddb5c413b1d47", [])
云书法萨瓦迪卡简 = EffectMeta("云书法萨瓦迪卡简", True, "7316821586038755877", "36880889", "b504036de8a8db8ada2082bfaeb6b497", [])
亦然体 = EffectMeta("亦然体", True, "7290457372814742073", "26003134", "a4922f5c3dbd6998261cbbf9dcb51139", [])
仓耳丝柔体 = EffectMeta("仓耳丝柔体", True, "7423616269384946186", "85757836", "4cc0c3a634c7888ada2991778315963c", [])
仓耳丰黑 = EffectMeta("仓耳丰黑", True, "7423616269397545499", "85757844", "efb2ad14a082b876427a3fb696918927", [])
仓耳体 = EffectMeta("仓耳体", True, "7423616268759994890", "85757842", "7d450c06b110c67f359ddbb2a6377ae4", [])
仓耳力士 = EffectMeta("仓耳力士", True, "7423616269326225946", "85757837", "e29302f3d11350964083cc128799dd8e", [])
仓耳明黑 = EffectMeta("仓耳明黑", True, "7423616269552718345", "85757841", "910023dbaae2f88ee799e9893e73ab14", [])
仓耳曙黑 = EffectMeta("仓耳曙黑", True, "7423616268755800603", "85757840", "2d77715e09de6fdcddadaddeee6f21a9", [])
仓耳榜黑 = EffectMeta("仓耳榜黑", True, "7423616269313643035", "85757838", "da389dd735bb6b52d42cf349374a8a82", [])
仓耳状元楷 = EffectMeta("仓耳状元楷", True, "7423616268764189222", "85757849", "d8ca77c9003f4b2dd29cdae84d5f0556", [])
仓耳视频体 = EffectMeta("仓耳视频体", True, "7423616269338808841", "85757847", "406d8ff6e6989818b85510428b118951", [])
仓耳趣黑 = EffectMeta("仓耳趣黑", True, "7423616269397529115", "85757839", "c9472a60029f4de40b7352723b6d645b", [])
仓耳酷黑 = EffectMeta("仓耳酷黑", True, "7423616268759994930", "85757853", "18f24dbd9ac9df2aa5fcce0be1864f68", [])
优设书华体 = EffectMeta("优设书华体", True, "7438524730103042599", "91065725", "3dc2297c2b116a9da29a5cb0ab3d894d", [])
优设字由棒棒体 = EffectMeta("优设字由棒棒体", True, "7311914390259765811", "34131538", "60db6d16ba870996309056ecb1e315b1", [])
优设字美体 = EffectMeta("优设字美体", True, "7438524940153786934", "91065726", "b1cab3de325e719f0e2d446cfa11c99f", [])
优设招牌体 = EffectMeta("优设招牌体", True, "7438524840576815627", "91065727", "fd59ad69d28b184ae30ef8b3571ec38a", [])
修羽体 = EffectMeta("修羽体", True, "7290456770160366139", "26003131", "72f61f22f5ef19cfcadc4995934aa063", [])
凌丝体 = EffectMeta("凌丝体", True, "7290455877864133157", "26003145", "92fc337d10907e56437c0da3f6d10a78", [])
利飞体 = EffectMeta("利飞体", True, "7423616268764189193", "85757848", "b269aadd970b3705e5aaa54d0343117d", [])
剪映专辑 = EffectMeta("剪映专辑", True, "7479022906626806298", "107789541", "56896a93f56d85f79ed19a07c52d4de7", [])
剪映云迹 = EffectMeta("剪映云迹", True, "7502335387969262130", "115815828", "7269f0ee6bcdd0cf8a1184618f65cbba", [])
剪映半山海 = EffectMeta("剪映半山海", True, "7497171321915183625", "113931114", "0597492b4816d447e85e057852c7c038", [])
剪映印章 = EffectMeta("剪映印章", True, "7499001991096439347", "114520924", "93edc0c6b3926ec19bc249779fe0a91a", [])
剪映团子 = EffectMeta("剪映团子", True, "7494617559677800970", "113096610", "fa201c52ba126f103a453b9668f6f442", [])
剪映圆隶 = EffectMeta("剪映圆隶", True, "7497162943239295539", "113927430", "4666460830ba95be46fee85812b702f6", [])
剪映手书 = EffectMeta("剪映手书", True, "7486448265496367625", "110450154", "2e85dc679048a1da139661e050438ec2", [])
剪映新年体 = EffectMeta("剪映新年体", True, "7463380715107783206", "102584862", "259e955ebb6238cf8b3a70e160fc26f9", [])
剪映春日部 = EffectMeta("剪映春日部", True, "7481618551309079077", "108780445", "f6ab639c8895f9778f0b83a231c1126c", [])
剪映狗爬体 = EffectMeta("剪映狗爬体", True, "7485673940988203558", "110206413", "c2090467a91f15c333bcb983403ebac6", [])
剪映细毛笔 = EffectMeta("剪映细毛笔", True, "7502351067770786341", "115825070", "ea98039f50c8807e396522ae2317124f", [])
剪映香蕉 = EffectMeta("剪映香蕉", True, "7497163735652373018", "113927966", "f3f9766b7909e4c92b07a65cdbcbef8b", [])
励字俊林简 = EffectMeta("励字俊林简", True, "7316745865731772955", "36825422", "5f7e14d8bc6853e8d2b38abb9f930495", [])
励字勇敢黑简_大黑 = EffectMeta("励字勇敢黑简 大黑", True, "7316817704143295003", "36880884", "0580e68e5ec975b80ebd9d9d2806cbf8", [])
励字大黑简繁 = EffectMeta("励字大黑简繁", True, "7316745335257174578", "36825420", "78f653837bfd529904d56cfd77521eee", [])
励字姚体简繁 = EffectMeta("励字姚体简繁", True, "7316817407664722441", "36880881", "22b55c6dc66142309168297e2633ec9b", [])
励字小怪兽简 = EffectMeta("励字小怪兽简", True, "7316747164716110345", "36825428", "b33b2fc025a61087d99bd6aaa664dcc1", [])
励字志向黑简_特粗 = EffectMeta("励字志向黑简 特粗", True, "7316819223840297481", "36880880", "ba409eae71d9d99f370175f283002307", [])
励字憨憨简 = EffectMeta("励字憨憨简", True, "7316745679055884837", "36825429", "b316a0c93d766f2bcefb9962ebb92f46", [])
励字敲可爱简_中粗 = EffectMeta("励字敲可爱简 中粗", True, "7316746541820023306", "36825430", "e7226d59672ac424570ad6504c8241a0", [])
励字星宜简 = EffectMeta("励字星宜简", True, "7316747352956473882", "36825423", "9154d1fb2fc607f0fc1c182ed810a8c1", [])
励字玉树临风简 = EffectMeta("励字玉树临风简", True, "7316818084935766565", "36880878", "01db7f1ab40c6daa77271d9a19d90be8", [])
励字行楷简繁 = EffectMeta("励字行楷简繁", True, "7316817018030658075", "36880877", "63abf61c61a93772e2a0feff194c1785", [])
励字趣石简 = EffectMeta("励字趣石简", True, "7316746949489594931", "36825427", "e2dc9006d5e08c9c3714b9107568bddd", [])
励字趣黑简繁 = EffectMeta("励字趣黑简繁", True, "7316746727430558234", "36825424", "393ae2f90543245b132d69f25639e375", [])
励字逆反差圆舞简_超级黑 = EffectMeta("励字逆反差圆舞简 超级黑", True, "7316746365185298981", "36825426", "4d7e99c776b2ed6df04889c6ba0136c5", [])
励字造梦简_特粗 = EffectMeta("励字造梦简 特粗", True, "7316818766493389339", "36880891", "a21754e4d75eaa9ea07f12512f0a1df1", [])
励字隶书简繁 = EffectMeta("励字隶书简繁", True, "7316746076373914139", "36825425", "28d5ed8c5392b325a5f22823917e2aa7", [])
华书体 = EffectMeta("华书体", True, "7290455554504266298", "26003140", "2854f0774cf3b780304708ee46625fa9", [])
听露体 = EffectMeta("听露体", True, "7290456595102700089", "26003132", "adfad625c852fca682e02463bd7d0bbc", [])
唧唧国王 = EffectMeta("唧唧国王", True, "7312719555653014053", "34549532", "b978210e888a28fd7f6b1ac6e864cc03", [])
壮楷体 = EffectMeta("壮楷体", True, "7441547528874496539", "93697432", "1b486bea4bad28409070e70c8d0e10f0", [])
妙如体 = EffectMeta("妙如体", True, "7290456177559736889", "26003137", "d8cdbaf5501f5ec0d2d88a294fafac17", [])
字由爱驾公路体 = EffectMeta("字由爱驾公路体", True, "7311912714970862107", "34131532", "2c6b6b843410224e98e99e3d1ab427e1", [])
字语云黑宋 = EffectMeta("字语云黑宋", True, "7312719287796371978", "34549538", "a0594d2389cf544ca305f467ae7dd4ba", [])
字语俊言体 = EffectMeta("字语俊言体", True, "7495685759022666278", "113453150", "723657e683658cd93c4615cc7b905fb6", [])
字语叙黑体 = EffectMeta("字语叙黑体", True, "7495677959626297907", "113448754", "755374b6c5f1d1e826a4277f38593b2f", [])
字语叙黑体_中粗 = EffectMeta("字语叙黑体-中粗", True, "7495667671212495386", "113443244", "befd16cb73dbaccd9505ecd6e0d5a662", [])
字语叙黑体_常规 = EffectMeta("字语叙黑体-常规", True, "7495679051764339251", "113449404", "11aaa654400d5083897329713a9bb9e8", [])
字语叙黑体_粗体 = EffectMeta("字语叙黑体-粗体", True, "7495676881946022451", "113448362", "d1c7cf4dd7c40614826d680ed5805cdd", [])
字语叙黑体_细体 = EffectMeta("字语叙黑体-细体", True, "7495679735909847589", "113449788", "3b224152eaf416cbeaed7d39917e6fdf", [])
字语叙黑体_超粗 = EffectMeta("字语叙黑体-超粗", True, "7495661432017523250", "113442102", "e8367550c6c832bf3c29b00bd7827cc0", [])
字语古兰体 = EffectMeta("字语古兰体", True, "7312718551096234523", "34549527", "b1130cae36f0b2bad353e96af5850c78", [])
字语古映体 = EffectMeta("字语古映体", True, "7495686582133854730", "113453641", "831fab960b2d97a5ecc8735031aaad2f", [])
字语咏宋体 = EffectMeta("字语咏宋体", True, "7312719367769166386", "34549533", "12fe695be021ad4406276e85f32de4be", [])
字语咏宏体 = EffectMeta("字语咏宏体", True, "7312719426845938203", "34549522", "28ed414e182f0fd35c9a3658d1999e57", [])
字语咏楷体 = EffectMeta("字语咏楷体", True, "7312719210373714459", "34549530", "06ab9abe9d2e6f4d10152bafe691738c", [])
字语嘟嘟体 = EffectMeta("字语嘟嘟体", True, "7312718329347576347", "34549523", "ce70e138b40294d5f159ddbdfd2f5e23", [])
字语圆体 = EffectMeta("字语圆体", True, "7495689259223880202", "113454943", "f625722b0ce881a1182f8ae3d2fc7b9a", [])
字语康宋体 = EffectMeta("字语康宋体", True, "7495657467548799515", "113436253", "8da8fafe9b3517714901f3fc88e7428c", [])
字语康宋体繁体 = EffectMeta("字语康宋体繁体", True, "7495691210900640293", "113456064", "3150de1a5539e1981c6561342af25b88", [])
字语文乐体 = EffectMeta("字语文乐体", True, "7495684286788407818", "113452362", "1f275305f825ffc7a578e1df43146ca4", [])
字语文乐体_粗体 = EffectMeta("字语文乐体-粗体", True, "7495683757769232906", "113452063", "0fd32b402664816baecfab313cb6235f", [])
字语文乐体_细体 = EffectMeta("字语文乐体-细体", True, "7495684762376344091", "113452597", "8031951a036455afe6bc05955b19b650", [])
字语文刻体 = EffectMeta("字语文刻体", True, "7495683056359969306", "113451682", "ea6e2bb9b97f11fb1688a135f9c07688", [])
字语文熙体 = EffectMeta("字语文熙体", True, "7495685451823452723", "113452995", "193086e7036a8379a7b54e3204944ddb", [])
字语文酷体 = EffectMeta("字语文酷体", True, "7312718751328113162", "34549524", "df4da46440a5f0dc20316de2a38445f7", [])
字语文雅体 = EffectMeta("字语文雅体", True, "7312718961991225894", "34549525", "bf9095c601719f1dcaa55eacc4c5d1bd", [])
字语文韬体 = EffectMeta("字语文韬体", True, "7312718857334952498", "34549539", "dc992f2c580c264006a779732bc617b9", [])
字语文韵体 = EffectMeta("字语文韵体", True, "7312719046229627402", "34549537", "bc5a66d2265466330a836fc862b0c518", [])
字语漫雅手书 = EffectMeta("字语漫雅手书", True, "7495686373119103526", "113453534", "f7d92829d54324872f3aa70598dbe169", [])
字语萌酱体 = EffectMeta("字语萌酱体", True, "7495690155840246298", "113455471", "09bb701167bffb3a7544fe31674bce62", [])
字语软糖体 = EffectMeta("字语软糖体", True, "7312718629982704166", "34549535", "a126d5a78f08f65afdcea6f0b6d3928c", [])
字语颖黑体 = EffectMeta("字语颖黑体", True, "7312719121404138021", "34549516", "2c43f4309b450a0fff1c547ec5e96003", [])
宜宋 = EffectMeta("宜宋", True, "7423616269825348122", "85757843", "6b5fdc1a70b0b3a461bff3db1ccbbae7", [])
小可爱体 = EffectMeta("小可爱体", True, "7423616269267505691", "85757845", "0eb3ee4fdd0c5a415e73a7e82dd9dcd8", [])
少年南波万 = EffectMeta("少年南波万", True, "7441547528870302258", "93697433", "fc594dc0e1764159fff35321944e907d", [])
山雁体 = EffectMeta("山雁体", True, "7290456514370736698", "26003150", "c29a5195061ec2b2f72aa4fe97e04f43", [])
幽梦体 = EffectMeta("幽梦体", True, "7290457477873668666", "26003126", "1f23a06aada2e64a9dc3cd490aadaf07", [])
归雁体 = EffectMeta("归雁体", True, "7290455353756488247", "26003136", "5d364212ce7ad920f858d615448a3981", [])
怜秋体 = EffectMeta("怜秋体", True, "7290455783932695100", "26003139", "bfdcaac20b0a81352e95996d7e1a6433", [])
承英体 = EffectMeta("承英体", True, "7290455103704666679", "26003146", "247535da6392b2d1a96e5193fb5d1f03", [])
星汉宋 = EffectMeta("星汉宋", True, "7423616268764189211", "85757834", "47383c4219eac3eaaef23cddd07f8203", [])
景曜体 = EffectMeta("景曜体", True, "7290455645264810555", "26003133", "5320f82421f4ef64d62f27272241b8cf", [])
月亮供电不足 = EffectMeta("月亮供电不足", True, "7312720704959418930", "34549519", "65bb1af80161acd665444de74af896d8", [])
未光体 = EffectMeta("未光体", True, "7290456683027894839", "26003147", "2e77e4633f21a02e0a70b90977a7b01a", [])
毛体行楷 = EffectMeta("毛体行楷", True, "7452649447441306121", "98548489", "06e8ecfb9262f12693c90d29dc501111", [])
毛体行草 = EffectMeta("毛体行草", True, "7452649545395081755", "98548450", "35029f40e40fe5e66090c385ec28be0b", [])
汉字之美棒棒糖粗简 = EffectMeta("汉字之美棒棒糖粗简", True, "7316732709747823114", "36795730", "296fc38d5559dba8cb8ed33daf6ea93f", [])
汉字之美玉龙简 = EffectMeta("汉字之美玉龙简", True, "7316745091178041865", "36825421", "ff8a83fc65133df892ebb680a917d2c6", [])
汉字之美郝刚牡丹体简 = EffectMeta("汉字之美郝刚牡丹体简", True, "7316816467062690330", "36880888", "1b67a99e701e335a08536e499dfe91ff", [])
流苏体 = EffectMeta("流苏体", True, "7290455967735484987", "26003142", "8a3b67cce8e2f0e66c06600c2c6271cf", [])
游乐体 = EffectMeta("游乐体", True, "7290457554574905914", "26003128", "987336c2aff7c968b5d019749a327998", [])
点字佳楷 = EffectMeta("点字佳楷", True, "7311912796520714779", "34131531", "c218de2cbf3e51caf8b425bfaf174bbf", [])
点字奇巧 = EffectMeta("点字奇巧", True, "7311913943188902427", "34131533", "b6ef0e1abe473dd27bde5fbdb12fa6f8", [])
点字小隶书 = EffectMeta("点字小隶书", True, "7311914134109426203", "34131539", "adecd49c062bfd7c94790bf7ba0b16be", [])
点字玄真宋 = EffectMeta("点字玄真宋", True, "7311914225767551498", "34131530", "eb6a86ba326391dc111882da9659f355", [])
点字王者风范 = EffectMeta("点字王者风范", True, "7311914033571959333", "34131529", "db641a69aa72229967d82686d5af0a0f", [])
点字艺圆 = EffectMeta("点字艺圆", True, "7311914298060575283", "34131536", "0cc2de74fd8ed8a72a0c0cbf3bb9b5ff", [])
点字青花楷 = EffectMeta("点字青花楷", True, "7311913734081876506", "34131534", "8de5c66831c1c08a3a0db17abffdc090", [])
点字青花隶 = EffectMeta("点字青花隶", True, "7311913858942112306", "34131535", "1c21f23c85ea5473322cfb2b856c686b", [])
烟客体 = EffectMeta("烟客体", True, "7290457082921226811", "26003138", "b6c9e51a0caeda7546833874c4f6d3f4", [])
爱你是无解命题 = EffectMeta("爱你是无解命题", True, "7311911945655816730", "34131537", "4d2d4673e42ced2e43c6e6d5d4a3d5d6", [])
爱民小楷 = EffectMeta("爱民小楷", True, "7423616268760011314", "85757851", "e1e9bb52f3cc75124b4e668bbbeed5ab", [])
玄鸟体 = EffectMeta("玄鸟体", True, "7290456889668670013", "26003129", "aa8b1188f865f250cce24a09f0105af8", [])
知新体 = EffectMeta("知新体", True, "7423616268952932902", "85757852", "ab6662733ccf500d7de099211e31423c", [])
章鱼小丸子 = EffectMeta("章鱼小丸子", True, "7423616269254922762", "85757850", "96c278e361b5bf39d0e75f50b299bf1d", [])
竹言体 = EffectMeta("竹言体", True, "7423616269850513947", "85757835", "abf26da51a47d5dc399680cc09253f62", [])
花锦体 = EffectMeta("花锦体", True, "7290455460186952251", "26003144", "202627efd4e86fcac13b028297319013", [])
莫雪体 = EffectMeta("莫雪体", True, "7290456347177390629", "26003143", "e6df6d9922211e1b9cd907930569a320", [])
蕴行体 = EffectMeta("蕴行体", True, "7441547528878690867", "93697435", "22d3f23e85385f5c62e0534ea30f9d59", [])
造字侠今朝醉简 = EffectMeta("造字侠今朝醉简", True, "7316824086712160806", "36880876", "2b98cf117f555d4789b65c865d9f5f9a", [])
造字侠寻味江湖简 = EffectMeta("造字侠寻味江湖简", True, "7316824437930594867", "36880883", "8335b615c4eb7b246b7aa564899c368d", [])
造字侠昊仔简繁 = EffectMeta("造字侠昊仔简繁", True, "7316823873930924582", "36880885", "60e524ded7b66c88a3bf39f2a4adb898", [])
造字侠永刚漆书简繁 = EffectMeta("造字侠永刚漆书简繁", True, "7316824945592373770", "36880882", "1ddb9f64db159a46fccaa243917e9bfc", [])
造字侠陈坤风行简繁 = EffectMeta("造字侠陈坤风行简繁", True, "7316823545399480841", "36880887", "c266c8a01c258c85c5f7d022300015e0", [])
锋舞九天 = EffectMeta("锋舞九天", True, "7423616268764205595", "85757854", "456729f9a73f699c04d708ee6c69fdc2", [])
阳华体 = EffectMeta("阳华体", True, "7290457161887388219", "26003127", "6ec8135c696317264510d2725a6fc83a", [])
阳煦体 = EffectMeta("阳煦体", True, "7290457267030200869", "26003130", "4622bd24edf2f817730e108e625b6e05", [])
雅月体 = EffectMeta("雅月体", True, "7423616268764189234", "85757855", "0f70f20df8d9be821e294a862be67304", [])
雅韵体 = EffectMeta("雅韵体", True, "7290456990571041340", "26003135", "99ceebeec763fb4f3a1a59e226b1cf22", [])
青印体 = EffectMeta("青印体", True, "7290456429276697149", "26003149", "8ed939d6940890e3d4f77dff0091a52e", [])
青春加糖体 = EffectMeta("青春加糖体", True, "7441547528874496538", "93697434", "50a5e54e72193f99e46ccbc2b594199b", [])
青禾体 = EffectMeta("青禾体", True, "7423616269275894310", "85757846", "ab3917e6d6b6e57bdbdbdb9d052109f9", [])
青鸟华光中长宋 = EffectMeta("青鸟华光中长宋", True, "7410326723805319706", "81332681", "e4d44cca5db89d96f63fd943ae948a32", [])
青鸟华光书宋2 = EffectMeta("青鸟华光书宋2", True, "7410326723780153893", "81332684", "6850473b134099c8049bd646c990fe44", [])
青鸟华光仿宋2 = EffectMeta("青鸟华光仿宋2", True, "7410326723327185435", "81332685", "96b32125bb5d11e8fe83565b5dc917fe", [])
青鸟华光大标宋 = EffectMeta("青鸟华光大标宋", True, "7410326723322974746", "81332679", "8be414a44e65338d012f2b5493fbc005", [])
青鸟华光报宋2 = EffectMeta("青鸟华光报宋2", True, "7410326723314586149", "81332677", "9f5b177fb5cc6863c9827d31945a068d", [])
青鸟华光标题黑 = EffectMeta("青鸟华光标题黑", True, "7410326723318780467", "81332682", "3642da89ae583761117498dad3edff0b", [])
青鸟华光楷体2 = EffectMeta("青鸟华光楷体2", True, "7410326723318780453", "81332676", "b2f9d6b81eff2e0e2eaef0f3a46890fd", [])
青鸟华光粗黑 = EffectMeta("青鸟华光粗黑", True, "7410326723327169051", "81332680", "ae6c97d96b918637b249f559c665638f", [])
青鸟华光细黑 = EffectMeta("青鸟华光细黑", True, "7410326723792736795", "81332678", "54e6e6a69da14b6a9a4a01e2bc3ba4fb", [])
青鸟华光细黑1 = EffectMeta("青鸟华光细黑1", True, "7410326723796931109", "81332673", "1f764c651b8202f7dadc74fdefc92308", [])
青鸟华光美黑 = EffectMeta("青鸟华光美黑", True, "7410326723327169034", "81332683", "184e84f286db37d6ea31502521740644", [])
青鸟华光黑体 = EffectMeta("青鸟华光黑体", True, "7410326723331363337", "81332674", "ede3bbcf8e6eeb9149395e1117062c7e", [])
青鸟华光黑变 = EffectMeta("青鸟华光黑变", True, "7410326723322991154", "81332672", "6ca836ce90531a01adfd2909d6d119e3", [])
飞鸟集 = EffectMeta("飞鸟集", True, "7130643143719916069", "4010301", "1be94b984920e8ddd125b5c868521448", [])
高字标志圆 = EffectMeta("高字标志圆", True, "7312720780599497225", "34549540", "b063783985f84f53748319de1532b926", [])
鱼太闲躺平体 = EffectMeta("鱼太闲躺平体", True, "7312720611694875162", "34549531", "928979b4f0c9ba5ac430fc2990d0ea9d", [])
鸣翠体 = EffectMeta("鸣翠体", True, "7290456267212984889", "26003148", "7028cfb924701fbb8112cab5ce2ccccd", [])
鹿鸣体 = EffectMeta("鹿鸣体", True, "7290456058328257084", "26003141", "77a62272e2ded59547b213c20adec6ef", [])
黑糖体 = EffectMeta("黑糖体", True, "7070430083919385119", "1600490", "c79b375905670f3012ae371583680109", [])
================================================
FILE: src/pyJianYingDraft/metadata/mask_meta.py
================================================
"""视频蒙版元数据"""
from .effect_meta import EffectEnum, MaskMeta
class MaskType(EffectEnum):
"""蒙版类型"""
线性 = MaskMeta("线性", "line", "6791652175668843016", "636071", "1f467b8b9bb94cecc46d916219b7940a", 1.0)
"""默认遮挡下方部分"""
镜面 = MaskMeta("镜面", "mirror", "6791699060140020232", "636073", "b2c0516d1f737f4542fb9b2862907817", 1.0)
"""默认保留两线之间部分"""
圆形 = MaskMeta("圆形", "circle", "6791700663249146381", "636075", "9a55eae0e99ee6d1ecbc6defaf0501ec", 1.0)
矩形 = MaskMeta("矩形", "rectangle", "6791700809454195207", "636077", "ef361d96c456cd6077c76d737f98898d", 1.0)
爱心 = MaskMeta("爱心", "geometric_shape", "6794051276482023949", "636079", "0bf09fa1e3a32464fed4f71e49a8ab01", 1.115)
星形 = MaskMeta("星形", "geometric_shape", "6794051169434997255", "636081", "155612dee601d3f5422a3fbeabc7610c", 1.05)
================================================
FILE: src/pyJianYingDraft/metadata/mix_mode_meta.py
================================================
"""混合模式元数据"""
from .effect_meta import EffectEnum, EffectMeta
class MixModeType(EffectEnum):
"""混合模式类型"""
正片叠底 = EffectMeta("正片叠底", False, "6758325895519277582", "871333", "8001e07eefc5d8b69572b977ca14bef9", [])
颜色减淡 = EffectMeta("颜色减淡", False, "6758325800031752712", "871334", "f979dd10def50fad3ffb77c7f0df3db7", [])
颜色加深 = EffectMeta("颜色加深", False, "6758325724848853518", "871335", "b76087cda4833f553cf09e82fb81c463", [])
线性加深 = EffectMeta("线性加深", False, "6758325619253056013", "871336", "655f3590dd07ece41209fb312348ffe9", [])
柔光 = EffectMeta("柔光", False, "6758325439212556814", "871337", "042aa15b71b1e17bca0bd928eec6fba7", [])
强光 = EffectMeta("强光", False, "6758325264670790152", "871338", "840ca85a1a33e6fc3ea78bbdb2db8f60", [])
滤色 = EffectMeta("滤色", False, "6758325170760323597", "871339", "d9c1d4ca7ab91df4f48d12b339f2da88", [])
叠加 = EffectMeta("叠加", False, "6758324989931295240", "871340", "e6a48579910dfe831ba53a6acc6737f9", [])
变亮 = EffectMeta("变亮", False, "6758324919789949453", "871341", "b0e90c43dc266a317b05b0cd3ca5bfba", [])
变暗 = EffectMeta("变暗", False, "6758324839670354445", "871342", "420c92a2b480dc8e402d9269a5f83515", [])
================================================
FILE: src/pyJianYingDraft/metadata/speech_to_song.py
================================================
from .effect_meta import EffectEnum
from .effect_meta import EffectMeta
class SpeechToSongType(EffectEnum):
"""剪映自带的音频“声音成曲”效果类型, 此类效果目前不能自动被剪映所识别"""
Lofi = EffectMeta("Lofi", False, "7252917861948068410", "17345060", "8dd8889045e6c065177df791ddb3dfb8", [])
民谣 = EffectMeta("民谣", False, "7251868698170888759", "17046923", "8dd8889045e6c065177df791ddb3dfb8", [])
嘻哈 = EffectMeta("嘻哈", True, "7252918249036190245", "17344948", "8dd8889045e6c065177df791ddb3dfb8", [])
爵士 = EffectMeta("爵士", True, "7264413578860433978", "20120940", "8dd8889045e6c065177df791ddb3dfb8", [])
节奏蓝调 = EffectMeta("节奏蓝调", True, "7252918101958726200", "17345046", "8dd8889045e6c065177df791ddb3dfb8", [])
雷鬼 = EffectMeta("雷鬼", True, "7264413386962637368", "20120864", "8dd8889045e6c065177df791ddb3dfb8", [])
================================================
FILE: src/pyJianYingDraft/metadata/text_intro.py
================================================
"""文字入场动画元数据"""
from .effect_meta import EffectEnum, AnimationMeta
class TextIntro(EffectEnum):
"""文字入场动画, 默认时长为0.5秒"""
# 免费特效
冲屏位移 = AnimationMeta("冲屏位移", False, 0.500, "7078181271393800711", "1643884", "fd73ffc26a3f02fa6d957a94b590623a")
卡拉OK = AnimationMeta("卡拉OK", False, 0.500, "6771294855785091588", "1558840", "46c913b531dcc84e23a2f56003d1daef")
变色输入 = AnimationMeta("变色输入", False, 0.800, "7397306443147252233", "77035159", "e0e29d6ea015f0d1d38b4a852a1b6202")
右上弹入 = AnimationMeta("右上弹入", False, 0.500, "7074854080388010532", "1621978", "932ea0a91ca337bc1fd566aa17cb9aa7")
右下擦开 = AnimationMeta("右下擦开", False, 0.500, "7088576340361744903", "1715294", "70a3ffbff2b02ede796ee38d95b38db2")
向上擦除 = AnimationMeta("向上擦除", False, 0.500, "6774625910067827212", "1644272", "ee74a3a8afb2167f4403dee957338afe")
向上滑动 = AnimationMeta("向上滑动", False, 0.500, "6763470111253729803", "1644267", "22030c473076074288fd01b17d1c6174")
向上翻转 = AnimationMeta("向上翻转", False, 0.500, "7194703971498332727", "8945307", "0cf2050093a2bbe736ab4b2ee9002dcf")
向上重叠 = AnimationMeta("向上重叠", False, 0.500, "7077500533040222756", "1639676", "b3ea1be4937b7cd032f1775d98b1f06e")
向上露出 = AnimationMeta("向上露出", False, 0.500, "7163514358935327268", "5925717", "3786ff3fcc9795eead5fd5629ff7e4e9")
向下擦除 = AnimationMeta("向下擦除", False, 0.500, "6774626192990409224", "1644273", "bfe1add2d59ee32449a979257d4a3448")
向下滑动 = AnimationMeta("向下滑动", False, 0.500, "6724921985282871816", "1644268", "f5506a1b5ebcf9d0636d7809bf3cb81a")
向下露出 = AnimationMeta("向下露出", False, 0.500, "7163514502128865823", "5925716", "a7b05a11c6bdc7010cc4dc7f1d276407")
向下飞入 = AnimationMeta("向下飞入", False, 0.500, "7088942186561016356", "1719670", "4ee5a7a4d9ab7bbd7dd2ad4d8b80db78")
向右擦除 = AnimationMeta("向右擦除", False, 0.500, "6771288500240126478", "1644271", "b4a5ba027822ca3e1c9d83d2f5a58a08")
向右滑动 = AnimationMeta("向右滑动", False, 0.500, "6724920136056181256", "1644266", "fa1d0bc4290f058d0175ee4b4fb5501f")
向右缓入 = AnimationMeta("向右缓入", False, 0.500, "7043778124760224292", "1488722", "2d751bb706b38a030ab7eb3382b2d248")
向右集合 = AnimationMeta("向右集合", False, 0.500, "7081206983461704199", "1661186", "5a78f1024ecdc9a6b69220eac58a0963")
向右露出 = AnimationMeta("向右露出", False, 0.500, "7163514730525495839", "5925714", "6f8e0a5cd98c44b79f9ec09b0b913059")
向左擦除 = AnimationMeta("向左擦除", False, 0.500, "6774626830038077960", "1644270", "4db856992dc60d1220664165d4130042")
向左滑动 = AnimationMeta("向左滑动", False, 0.500, "6763470195894784525", "1644277", "13c954ed3bc583f87e9f79a2325b8e84")
向左露出 = AnimationMeta("向左露出", False, 0.500, "7163514612690719269", "5925715", "b4119cf3405c71bc556e1c5562e22d01")
圆形扫描 = AnimationMeta("圆形扫描", False, 0.500, "6840689010034086407", "1644280", "ac77daf80de65a4beb1164ce44c500c5")
复古打字机 = AnimationMeta("复古打字机", False, 0.800, "7253888335163167291", "17639720", "a69db3276f15fa2affcd98f2236c873d")
居中打字 = AnimationMeta("居中打字", False, 0.500, "7265222187286532667", "20303987", "40f484d3b77321b38d53b30d94c2dce1")
左上弹入 = AnimationMeta("左上弹入", False, 0.500, "7078586233030447629", "1646760", "6467514ec2a8740953d29c3915364a31")
左移弹动 = AnimationMeta("左移弹动", False, 1.000, "7313890082040058406", "35176342", "c21d4019453137cd76e0d847d5d8af96")
开幕 = AnimationMeta("开幕", False, 0.500, "6835571502050447879", "1644279", "c26a12a1cacc6b85f8439a0bc600335d")
弹入 = AnimationMeta("弹入", False, 0.500, "6887482184844710413", "1644313", "0533e3aeb2cda562cdd8a86693815443")
弹弓 = AnimationMeta("弹弓", False, 0.500, "6862897343176380942", "1644305", "f9300b314e5bd7df573063b15a1ab081")
弹性伸缩 = AnimationMeta("弹性伸缩", False, 0.500, "6872642189260755463", "1644311", "7d23b7a68a1bf21c7692a35ffa6ddcdc")
弹簧 = AnimationMeta("弹簧", False, 0.500, "6884154692398486023", "1644312", "34d74f1bf451dac1a23158380a5be322")
彩色映射 = AnimationMeta("彩色映射", False, 0.500, "7039655272222036516", "1476514", "46f37098540b9250abdad9bb1282ec83")
打字机_I = AnimationMeta("打字机 I", False, 0.500, "6724920249654710791", "1644275", "7c7cfe92aa22a8e131c94d20f44e97df")
打字机_II = AnimationMeta("打字机 II", False, 0.500, "6724920636403094028", "1644276", "1c500e93b3b8bdee3cbe1095db5d01ff")
打字机_III = AnimationMeta("打字机 III", False, 0.500, "6724920521462387207", "1644335", "1b21dfb54b0ccd50e50f383f01d0a193")
打字机IV = AnimationMeta("打字机IV", False, 2.000, "7237409385092223525", "14235879", "6828d67634e66ace1e76c4eb7cc2f8e6")
扭曲模糊 = AnimationMeta("扭曲模糊", False, 0.500, "7089261793406620197", "1722114", "40a9fd02e81930bc0289aeb692c382f6")
拖尾 = AnimationMeta("拖尾", False, 0.500, "7244102915239973432", "15259479", "5d0dbb4e66c3261576b47f8766e3eb14")
收拢 = AnimationMeta("收拢", False, 0.500, "6779879712261935619", "1644261", "b173da2fb68d5f8e7dbb2cc000a50bdd")
放大 = AnimationMeta("放大", False, 0.500, "6724919499042066958", "1644264", "cf0f072aa31d3884ba90362af063f55a")
故障打字机 = AnimationMeta("故障打字机", False, 0.500, "6870061463243854350", "1644308", "b4536942105b69e637dabef4c3ebfc6d")
旋入 = AnimationMeta("旋入", False, 0.500, "6763873859402732039", "1644265", "dc3a54158c51f45a0033a16f5763e047")
日出 = AnimationMeta("日出", False, 0.500, "6779084126457696776", "1644269", "9e39257e0d8b60598d1c09bb31fbc62a")
晕开 = AnimationMeta("晕开", False, 0.500, "7088531060341871141", "1714696", "2f7aebf0f525ef21f8b00070c17d2fc2")
模糊 = AnimationMeta("模糊", False, 0.500, "6923094735116571150", "1644338", "0e57ec99758f1e12636a73c6ec4fb6f5")
水墨晕开 = AnimationMeta("水墨晕开", False, 1.200, "7278295995362841145", "22734325", "5c970b17e18e3441b917a7bcba4d043b")
水平翻转 = AnimationMeta("水平翻转", False, 0.500, "7051512227353858590", "1644340", "9403a81925b4886589f745130a67cb05")
波浪弹入 = AnimationMeta("波浪弹入", False, 0.500, "6917178744775905806", "1644316", "301272b44278c3b5ebe228e8baa8d984")
渐显 = AnimationMeta("渐显", False, 0.500, "6724916044072227332", "1644304", "40859aa05ff9f3e3a3f0de7bfead1c42")
溶解 = AnimationMeta("溶解", False, 0.500, "6872642398095151629", "1644310", "b126b2989904ce12e8889a58df8447fc")
滑动上升 = AnimationMeta("滑动上升", False, 1.500, "7275687883011265083", "22226771", "9ab223e5e9a0b9611b04062048173de9")
生长 = AnimationMeta("生长", False, 0.500, "6869302248103481869", "1644307", "b0f76f716f571ecde209056995e96978")
甩出 = AnimationMeta("甩出", False, 0.900, "7244102679851438650", "15261071", "97162e8faa56cf163b8f2c1bfd5ad6e0")
站起 = AnimationMeta("站起", False, 0.800, "7265288917279052344", "20324364", "6f322d7bb7fe6b443197c2bf5d64dd8b")
缩小 = AnimationMeta("缩小", False, 0.500, "6724921217721045515", "1644263", "0b58ad7d0d7cc93080e7bedfd0caa222")
缩小_II = AnimationMeta("缩小 II", False, 0.500, "7041836555903701540", "1644341", "ae803da2a5d2292e0f8be3c8ab3b3788")
羽化向右擦开 = AnimationMeta("羽化向右擦开", False, 0.500, "6897084405781631496", "1644314", "d330712b8f96ce33d450489ea6e459a3")
羽化向左擦开 = AnimationMeta("羽化向左擦开", False, 0.500, "6897084292908716557", "1644315", "a4eefe0afe41cd05acd1beb3d2615b23")
翻动 = AnimationMeta("翻动", False, 1.000, "7308278898330964489", "32283659", "ba570ec241b336204d882fe35f128d5d")
轻微放大 = AnimationMeta("轻微放大", False, 0.500, "6763469998330483213", "1644262", "6f5ec0bb82bfd24a72706e2006c0e806")
逐字旋转 = AnimationMeta("逐字旋转", False, 0.500, "7111643562676064805", "3114660", "17a78b3b5c193a3e30431946a8cbd696")
逐字显影 = AnimationMeta("逐字显影", False, 0.500, "7038882772450021896", "1644339", "2f250516dcea1a591656dabc9c40684f")
逐字翻转 = AnimationMeta("逐字翻转", False, 0.500, "7112241904216969765", "3138860", "cdf2df541dea807f4bcb29ede73dd766")
闪动 = AnimationMeta("闪动", False, 0.500, "7035902226602136071", "1644322", "8a1581c846a5933e8a90204219504892")
随机弹跳 = AnimationMeta("随机弹跳", False, 0.500, "7021831463867781662", "1644321", "d49f117c117e7d6b4dcb53bbe9b5ed4a")
随机飞入 = AnimationMeta("随机飞入", False, 0.500, "6872642542765085191", "1644309", "d9ad3796df2b0881ea144f8dfa44e0b1")
# 付费特效
乱码故障 = AnimationMeta("乱码故障", True, 1.000, "7325648367747338802", "40877554", "00b40103690bfb45e0125592b6ec0f5c")
二段缩放 = AnimationMeta("二段缩放", True, 0.900, "7238519092997526074", "14394713", "a4cba6840c1bf92bc73bb1bcacf7b76e")
便利贴 = AnimationMeta("便利贴", True, 0.800, "7307207886843679283", "31819229", "4e9265ea4703be87feaf640d79b23f7c")
倒数 = AnimationMeta("倒数", True, 1.800, "7314303157360661018", "35401566", "814df0b29746943fe165ae9b16719cc2")
兔子弹跳 = AnimationMeta("兔子弹跳", True, 0.500, "7187785892382118461", "8398145", "5d157129853f479ea15f75075c1ef070")
冰雪飘动 = AnimationMeta("冰雪飘动", True, 1.500, "7314291622525538843", "35395178", "6e3e4d697d85de5b23b3f243a35b7f26")
发光模糊 = AnimationMeta("发光模糊", True, 0.500, "7054482687297327630", "1644342", "ba83061e43e95969f5a19cfa236120b7")
发光闪入 = AnimationMeta("发光闪入", True, 1.800, "7308272157442707978", "32278776", "c30f989a97cddbdc64e43ba96d901b71")
叠影并入 = AnimationMeta("叠影并入", True, 1.000, "7259634012774208059", "19101418", "8358578022cd14c6232a99ddee035824")
向上弹入 = AnimationMeta("向上弹入", True, 0.500, "7123116334677758501", "3704299", "28d9145ead32c23742082a37e511370e")
向下溶解 = AnimationMeta("向下溶解", True, 0.500, "7028458557058060831", "1644318", "09fde2de891d18c74949e025bc0dca07")
向右模糊_II = AnimationMeta("向右模糊 II", True, 0.500, "7254503374622560828", "17830700", "6b3c54ef781f16f20204d766b799abec")
向左模糊 = AnimationMeta("向左模糊", True, 0.500, "7112368349257929230", "3147126", "f99acc8cc6b3fcd2b4ea661670c4c048")
吸入 = AnimationMeta("吸入", True, 0.300, "7120438380453696031", "3576973", "42a0c7e42275986d92a2d3bbe55dd816")
呐喊声波 = AnimationMeta("呐喊声波", True, 0.500, "7199943069385364005", "9432429", "6f5992c1f47cac9d33468c5e60725d0b")
喷绘 = AnimationMeta("喷绘", True, 0.500, "7120131223036367367", "3563651", "77633d8638e177488dcce84086018c8a")
圆柱体滚动 = AnimationMeta("圆柱体滚动", True, 1.200, "7179035729043919397", "7548913", "7ce47010b9b736d12d264cf73f6c294e")
圣诞帽弹跳 = AnimationMeta("圣诞帽弹跳", True, 0.500, "7169419861158793759", "6492065", "e5de917f45c938a685b73a9e0bb464e1")
圣诞树弹跳II = AnimationMeta("圣诞树弹跳II", True, 0.500, "7174706243267727930", "7080877", "c9be0fbb72056234cdc5f8e082f32c40")
弹入跳动 = AnimationMeta("弹入跳动", True, 0.500, "7184797276181631546", "8058189", "7a2b94056fe6c1cba19e27a986cdcb64")
弹性伸缩_II = AnimationMeta("弹性伸缩 II", True, 0.500, "7308272646913790490", "32279178", "9b0bdc149bbc541e93cddaf94b1dcaa0")
心动瞬间 = AnimationMeta("心动瞬间", True, 1.650, "7332519885999706663", "44271866", "2438d9132c7b04552762ae54066f7d94")
慢速放大 = AnimationMeta("慢速放大", True, 60.000, "7205177922280231479", "10063675", "33d85f938bd55928fa16bede8cf7a26b")
打字光标 = AnimationMeta("打字光标", True, 2.000, "7237411357514011192", "14235878", "12196518b89652860631d196d19b6f45")
抖动甩入 = AnimationMeta("抖动甩入", True, 0.500, "7301945752278798885", "29825712", "8e49d8dde0112aaf071d41e8a56527e1")
折叠 = AnimationMeta("折叠", True, 0.500, "7125298122011447816", "3779439", "9f65c45595fa8c0002f7f49a61637ff2")
描边填充 = AnimationMeta("描边填充", True, 0.900, "7308269965453300262", "32278219", "cb8300f18fdf8b9aab7c1eacd33e92c9")
放大震动 = AnimationMeta("放大震动", True, 0.500, "7267849370727354936", "20801300", "e6f8542e114dcb8b7aea821b1c954941")
故障闪动 = AnimationMeta("故障闪动", True, 2.000, "7244101806710592057", "15261571", "f0c64727504b3975b4656ee2b10760fb")
新年打字机 = AnimationMeta("新年打字机", True, 1.000, "7272754730684650045", "21711818", "a5aa35ae2b69f85c944074dfeadd6c89")
旋转缩放 = AnimationMeta("旋转缩放", True, 1.600, "7243633588493619773", "15140845", "cef0ccebe3406f4c53b64f39825b7bfa")
旋转飞入 = AnimationMeta("旋转飞入", True, 0.500, "6775803763652301326", "1644274", "21984d5e90731f925fc58a59fef355ee")
星光闪闪 = AnimationMeta("星光闪闪", True, 1.500, "7309036302962266675", "32665781", "269e1b23d766c0a3c5c9f792dedfd1a9")
星光闪闪_II = AnimationMeta("星光闪闪 II", True, 1.000, "7319873264375829001", "38428077", "8cddcc9ff610948afbd705259cec8fa9")
星星弹跳 = AnimationMeta("星星弹跳", True, 1.100, "7307189517562155547", "31799385", "e5a1520dee5dd3700da60c62743111e4")
模糊发光 = AnimationMeta("模糊发光", True, 1.800, "7301535952101446170", "29690460", "ea9d91ad5b58f1f9a1e95264f77e9a15")
模糊滚动 = AnimationMeta("模糊滚动", True, 0.800, "7264501462187643450", "20154968", "3eaa7038a9148548a6b2cc6673f77944")
模糊缩小 = AnimationMeta("模糊缩小", True, 1.500, "7294147761765618186", "27144470", "7226ef3bab9d89a32e8becb2dcc5faac")
汇聚 = AnimationMeta("汇聚", True, 0.500, "6986931575199896094", "5529369", "2774ee332a759084eaa558bad0cb3a44")
波浪弹跳 = AnimationMeta("波浪弹跳", True, 1.000, "7317536986691015218", "37303562", "e5b79c83b4a12edb15d2389a83c51476")
流光扩散 = AnimationMeta("流光扩散", True, 2.000, "7314566361642963493", "35505526", "ee3e3d741c85017b94b5f2139edb7177")
滚入 = AnimationMeta("滚入", True, 0.500, "7026674824537707038", "1644320", "d631585b87e866b31fe20fa8d578b7cd")
激光雕刻 = AnimationMeta("激光雕刻", True, 3.000, "7244102612700631589", "15261101", "affa14b4f89ceb4dd01a69a24b42651f")
爱心弹跳 = AnimationMeta("爱心弹跳", True, 0.500, "6845191009861636616", "1644337", "711434e690c1a1d7ebca4f13b1712f85")
玩雪 = AnimationMeta("玩雪", True, 60.000, "7304943429962699290", "30904546", "501ea62f0702ab65569aa0e923bd8182")
环绕滑入 = AnimationMeta("环绕滑入", True, 1.000, "7261858654561767973", "19562189", "672aae4e963ac36d9b898cb32c964995")
生长_II = AnimationMeta("生长 II", True, 0.800, "7210312869282320933", "10659499", "562300bfab6b00c4853118b058f429a2")
电光 = AnimationMeta("电光", True, 1.500, "7296051582246851109", "27769111", "5fbc2c019454b3420c8e8c6c0a42dad5")
电光_II = AnimationMeta("电光 II", True, 1.000, "7299364098788037171", "28928614", "8c30a310e9ce5bf2b7b5a324c9426b7c")
碰碰车 = AnimationMeta("碰碰车", True, 0.600, "7338602211041088027", "47157536", "ce6822887e702ad1a4b762e267148e38")
空翻 = AnimationMeta("空翻", True, 0.500, "6865175746420150792", "1644306", "c16d544824d736ad0be1a5e109aafc04")
缤纷冲屏 = AnimationMeta("缤纷冲屏", True, 2.000, "7116829842271638053", "3894473", "f6b8859c215e255b61f70cdbcc239b98")
缩放_III = AnimationMeta("缩放 III", True, 1.600, "7211036012401660473", "10743073", "d625a4ef458b7e8c5928cdf04ab952ac")
翻页II = AnimationMeta("翻页II", True, 1.200, "7170343439832191519", "6599721", "69d372ee41a3c968e0a7b55382eb23ff")
背景滑入 = AnimationMeta("背景滑入", True, 1.500, "7306794354255860250", "31601883", "69c170b50c062f8106c01b37682fe19f")
色散拖影 = AnimationMeta("色散拖影", True, 1.100, "7340513927651922458", "48159236", "422b57c27cfd659d0756303189e11599")
螺旋上升 = AnimationMeta("螺旋上升", True, 0.500, "6799873891352187406", "1644278", "d3e255df67130866e0d2de42a703637c")
跃进 = AnimationMeta("跃进", True, 1.200, "7220685840442200634", "11996999", "40bdc1263417f53c712c54cb32438008")
跳跳捣蛋鬼 = AnimationMeta("跳跳捣蛋鬼", True, 1.800, "7200340219109839419", "9503089", "897a0c194e07ace6813a2eba797ac22f")
跳跳糖 = AnimationMeta("跳跳糖", True, 1.267, "7329815894933115432", "42866461", "c8ecf2f107002df92dcefec6ea988843")
辉光 = AnimationMeta("辉光", True, 1.000, "7258179345192063525", "18786330", "5bf3d95b86ac00f59c51dd3822d2b569")
辉光扫描 = AnimationMeta("辉光扫描", True, 1.800, "7316878401590006323", "36927710", "f9a2c9ae931b916a81f204a1b9c31f7c")
逐字弹跳 = AnimationMeta("逐字弹跳", True, 0.500, "7197615431673188921", "9195301", "52b151b0021d9fa91a42e65c2a392517")
逐字旋入 = AnimationMeta("逐字旋入", True, 1.500, "7229520427196879421", "13137035", "9838c6772ddbd48126f30baf74200f99")
金粉飘落 = AnimationMeta("金粉飘落", True, 2.000, "7330561002922054196", "43242964", "2add1c3882b2aaab841070f7bfd5ae66")
镂空跳入 = AnimationMeta("镂空跳入", True, 1.200, "7311620091060163082", "33984693", "cb98c7b01005954ba9cc4bc78a4c59a7")
闪烁集合 = AnimationMeta("闪烁集合", True, 1.500, "7267886380439573029", "20805754", "6d86be731c4d735a5e612a45b0c8631a")
随机上升 = AnimationMeta("随机上升", True, 1.500, "7233662263805088314", "13720553", "98142c53838b5a382f79cc2d89e30c04")
随机弹跳_II = AnimationMeta("随机弹跳 II", True, 0.500, "7114189305781686797", "3241034", "ff0761c602fa5ec8cc31c48ce57ea003")
随机打字机 = AnimationMeta("随机打字机", True, 0.500, "6926718978064650760", "1644317", "e1f7899554d34dfa3e1e4924f82acc69")
随机落下 = AnimationMeta("随机落下", True, 1.200, "7231443875406025275", "13416707", "a3aa7aa5991ef3c6a3d83a2e1fc6b748")
随机集合 = AnimationMeta("随机集合", True, 2.500, "7223959789175312954", "12416139", "4d1fa3b7aac9aeab107743db10372029")
雪光模糊 = AnimationMeta("雪光模糊", True, 1.200, "7314614905196253705", "35545508", "cb35d22175f67f734290b48bdaf93dd6")
音符弹跳 = AnimationMeta("音符弹跳", True, 0.500, "6841115718172283406", "1644336", "86c6e9061b14fd43049b6232ffc113fa")
顶出 = AnimationMeta("顶出", True, 1.100, "7268221856618910264", "20880936", "7fd6da0e6ff8a46276648dc43faa4f95")
预览打字 = AnimationMeta("预览打字", True, 0.800, "7268152375536259639", "20853726", "964a6cb51a01c0ddeb839010765023a6")
飞入 = AnimationMeta("飞入", True, 0.500, "7029231035007111710", "1644319", "9980148af0641a8501561320ec8f967b")
鼠标点击 = AnimationMeta("鼠标点击", True, 1.650, "7350128013637325353", "53149407", "1ba2fbaaeb30f7756ecd92e0121b7ac0")
================================================
FILE: src/pyJianYingDraft/metadata/text_loop.py
================================================
"""文字循环动画元数据"""
from .effect_meta import EffectEnum, AnimationMeta
class TextLoopAnim(EffectEnum):
"""文字循环动画"""
# 免费特效
VHS = AnimationMeta("VHS", False, 2.000, "7399879467457319463", "77851352", "f82d0f25b2cc4f0696dce7d97c7b02be")
上弧 = AnimationMeta("上弧", False, 0.500, "7075224569421763079", "1626238", "a0362ebaa2f5016487abfab05d47605b")
刷屏 = AnimationMeta("刷屏", False, 0.500, "7308280358691148315", "32284703", "e92c576feca5efb75feda14004b269c5")
发光模糊多行 = AnimationMeta("发光模糊多行", False, 0.800, "7397688001356108339", "77132594", "ee68176782c8b62a207c04f4a979957a")
吹泡泡 = AnimationMeta("吹泡泡", False, 0.500, "7045155566003425823", "1644539", "6db3746838af18903d01968e6af07185")
吹泡泡_II = AnimationMeta("吹泡泡 II", False, 0.500, "7052257626897256968", "1644528", "b378734fd7a0e8ec78e53987823fad79")
呐喊 = AnimationMeta("呐喊", False, 0.500, "7119024816480326157", "4002167", "04933b5e575c54cbf09c57c5e933f0ec")
复古涂鸦 = AnimationMeta("复古涂鸦", False, 1.000, "7400234025392017956", "77997810", "4bc57fba68e0cce14e2ea8ab652dabc2")
字体变换 = AnimationMeta("字体变换", False, 0.800, "7402185694732358170", "78763194", "06c685c00a9c1a7a484c7841ac45742a")
弹幕滚动 = AnimationMeta("弹幕滚动", False, 0.500, "6790247082155315719", "1644518", "4ca7b3a27da98849561b21c9c6d964fc")
彩虹 = AnimationMeta("彩虹", False, 0.500, "6908592625406710280", "990096", "fac0ebef55c57c31b3142f5840299b03")
彩虹_情人节 = AnimationMeta("彩虹-情人节", False, 0.500, "6916820108211917325", "1012617", "c45282c8e30b8639a71345769060f3d5")
彩虹_新年 = AnimationMeta("彩虹-新年", False, 0.500, "6916820045519655432", "1012618", "dd9fcbbcfc17cad31ab42e886769c66e")
彩虹_马卡龙 = AnimationMeta("彩虹-马卡龙", False, 0.500, "6921528300573561358", "1022790", "a614b3dd7d4b852f1a126afe4c5ee50f")
扫光 = AnimationMeta("扫光", False, 0.500, "7051843475892867598", "1520868", "0495742cdb3a26ff28dfabf7f8ef236b")
投影颤抖_II = AnimationMeta("投影颤抖 II", False, 0.500, "7070332370963927559", "1599696", "673aa54d5519360162ea8ec38986ea1c")
折叠 = AnimationMeta("折叠", False, 0.500, "7064823078542381581", "1567212", "c9b3ef10e455a3916dbef47a7f711eaa")
拼贴纹理 = AnimationMeta("拼贴纹理", False, 0.800, "7399983060806013479", "77918388", "922ca4e87c7eed7e60d062c18e928bc6")
描边粉笔 = AnimationMeta("描边粉笔", False, 2.000, "7399879712140431883", "77851433", "05c3c10997b885c71ed0dd64aff14dd2")
摇摆 = AnimationMeta("摇摆", False, 0.500, "6724920869363126795", "1644515", "8af4da60a802e3ca6c9fe2184fbe22d0")
摇荡 = AnimationMeta("摇荡", False, 0.500, "6840710593289130503", "1644523", "61f24344eb8bf86582d6140ad985ef14")
故障闪动 = AnimationMeta("故障闪动", False, 0.500, "6857714281136263687", "1644524", "51d9ee83fbaf2dfa049885676ec2d5d9")
旋转 = AnimationMeta("旋转", False, 0.500, "6763900973946507784", "1644510", "151421d4de4d49e65b050cb413482cd5")
晃动 = AnimationMeta("晃动", False, 0.500, "6790246693674684942", "1644520", "383dabd75d7fe7985d990ebb34d63732")
爆闪 = AnimationMeta("爆闪", False, 0.500, "7308279705252139530", "32284413", "61951bd303975761bc99f187bdb8fdab")
环绕 = AnimationMeta("环绕", False, 0.500, "6980916124976157220", "1644542", "e81fcebf0885fa5d698f6ca7d027a556")
翻转 = AnimationMeta("翻转", False, 0.500, "6763897586328801805", "1644511", "e4983ce92d02628087780832ef631c7d")
色差故障 = AnimationMeta("色差故障", False, 0.500, "6835878163575214605", "1644522", "e0295a9f4f19fe21692c405f7c00d1e5")
蓝黄滑动 = AnimationMeta("蓝黄滑动", False, 2.000, "7398492769628459539", "77383265", "bb717e125d34532ec904d1bc01ec25da")
超强晃动 = AnimationMeta("超强晃动", False, 0.500, "7065208406633615909", "1568854", "b129b0e6bed4f9835f871848db646763")
超强晃动_II = AnimationMeta("超强晃动 II", False, 0.500, "7069965879437431303", "1597286", "daec618afd4429f3f97085d3b7029bcc")
超强波浪 = AnimationMeta("超强波浪", False, 0.500, "6857036499389518349", "872098", "87f7332abda9ac46d5dc81f69c48daab")
超强波浪_II = AnimationMeta("超强波浪 II", False, 0.500, "7065219379687854623", "1568964", "bdd007527d0eda9d64bfbf6aef103e97")
跳动 = AnimationMeta("跳动", False, 0.500, "6724920002958332420", "1644512", "784250e657b472a46a3b3ce0a838e4f7")
轻微跳动 = AnimationMeta("轻微跳动", False, 0.500, "6884155832838132231", "1644525", "ac5c4160fae860fd74e5b7ab6d053252")
钟摆 = AnimationMeta("钟摆", False, 0.500, "6724921579517514248", "1644516", "320b71150105629f7ab1b318716181eb")
闪烁 = AnimationMeta("闪烁", False, 0.500, "6724921437930394120", "1644514", "6fe3f0fcd14e11e70b7510f42444b86c")
雨刷 = AnimationMeta("雨刷", False, 0.500, "6799874389669057037", "1644521", "6a4c40e24db5027cb42892d8ade9df38")
频闪边框 = AnimationMeta("频闪边框", False, 0.500, "7308280718302384690", "32284883", "36184bd37eae10c2d8247fb5bd59c6f2")
颤抖 = AnimationMeta("颤抖", False, 0.500, "6764189482871689742", "1644509", "9d16d8998abe172511399c3158bddddd")
颤抖_III = AnimationMeta("颤抖 III", False, 0.500, "7070036604429013535", "1598082", "c6f744d4c3d208abf97a3af3afe9d356")
# 付费特效
加字符 = AnimationMeta("加字符", True, 0.800, "7441532971082846758", "93688629", "f9c72d34da0c6e7b2b4263a37892ae6c")
喷涌 = AnimationMeta("喷涌", True, 0.500, "7134190113780666887", "4175399", "76cc53a7bb20385d208c858a13cf06fd")
喷绘 = AnimationMeta("喷绘", True, 0.500, "7110160318529016350", "2999942", "fbd35399a1880d2637731d20eb619d29")
圆形涂鸦 = AnimationMeta("圆形涂鸦", True, 0.800, "7276420462131810874", "22362181", "696d3b443b4c6ed8b9f0f28825c08a8c")
声波震动 = AnimationMeta("声波震动", True, 2.000, "7239526343833031223", "14518651", "9098085cd316045cf912e54a73d845a4")
字幕滚动 = AnimationMeta("字幕滚动", True, 0.500, "6790246884683289102", "1644519", "9aa4e0d045c61892c2b2e3fdfaf1b093")
尾巴摇摆 = AnimationMeta("尾巴摇摆", True, 1.600, "7212897307782550053", "10967121", "c1585ff28130b111d0458c6490d20ef2")
弹幕 = AnimationMeta("弹幕", True, 0.500, "7107592133472686606", "2795622", "8d0a44c1f51ea9cd7a8174f72751d2b7")
弹幕_II = AnimationMeta("弹幕 II", True, 0.500, "7096375845773644318", "1826548", "11bcd8965488f2c70e27c8dc5112c6cb")
强调三遍 = AnimationMeta("强调三遍", True, 0.500, "7129767866894651917", "3966601", "f34d9d771c836c5e4e836d4789788a82")
彩色切换 = AnimationMeta("彩色切换", True, 1.500, "7303430211519910451", "30322872", "e2c7f4ec20555abe1e50c1920e81a0f9")
彩色火焰 = AnimationMeta("彩色火焰", True, 0.500, "7308278472541999654", "32283417", "94dd9722a4b46d248c5e1d3d4b7c71fb")
影像叠加 = AnimationMeta("影像叠加", True, 0.500, "7193989785319379515", "8882439", "018a39f66ba7ceb39f4d61e4446624f8")
心跳 = AnimationMeta("心跳", True, 1.500, "7210283971316290085", "10650869", "3c2c6a7f6b8b102e9ae5f918600f83c0")
急了 = AnimationMeta("急了", True, 2.400, "7134634461588623909", "4200435", "4f01b8c42b2d4a26a89aa528e6cc1544")
悸动 = AnimationMeta("悸动", True, 1.200, "7229526981807706680", "13139395", "dc1aa28b54954465640c40928fae55f7")
情绪加载 = AnimationMeta("情绪加载", True, 2.200, "7130142075995034119", "3983735", "6293429c9f4e12407d38089ee43b77cd")
扩音器 = AnimationMeta("扩音器", True, 1.200, "7277870806552547895", "22619881", "ba24954b91039982fabf75ad533e7ff1")
扭动 = AnimationMeta("扭动", True, 0.500, "7123093247672455711", "3733565", "5380b570671074788541d13e389daa4f")
投影颤抖 = AnimationMeta("投影颤抖", True, 0.500, "7070332284934558245", "1599698", "4f4bebc9ab74f05801dca7b9b2ffa047")
抖动故障 = AnimationMeta("抖动故障", True, 0.800, "7283103017526628921", "23998441", "55749de55fe55fc230a31952790142f3")
拉住 = AnimationMeta("拉住", True, 1.200, "7221747595884892731", "12135594", "98db2339ea77225948ed8b7f8d72fc36")
拉开 = AnimationMeta("拉开", True, 60.000, "7223675733606928957", "12390761", "41f672adaa1cdccdb81c8d0b2b1124a4")
排队入场 = AnimationMeta("排队入场", True, 1.000, "7225496399817740855", "12628547", "0a7a9cb49305092f638d65888f149348")
摇摆_I = AnimationMeta("摇摆 I", True, 0.500, "6908281696253121038", "1520478", "ea2f688a517d18a9de5912fa09f3bd56")
放大缩小 = AnimationMeta("放大缩小", True, 0.500, "7224077152587616805", "12453543", "3e1538ad9a9f723238bb922423e20aed")
放大镜 = AnimationMeta("放大镜", True, 0.800, "7272339163142165050", "21635790", "e9f8437306ec0f948c1eb485f09692a3")
文字泛光 = AnimationMeta("文字泛光", True, 0.500, "7124226995231134239", "3740251", "879231435782ed4b72f278290070f20a")
波浪 = AnimationMeta("波浪", True, 0.500, "6724927688047333891", "1644517", "176a075543ef82c04df1dd40d181ac5b")
波浪_II = AnimationMeta("波浪 II", True, 0.500, "7067046171381862919", "1576246", "62245c9799544b75258689eb1ff222bb")
波浪_III = AnimationMeta("波浪 III", True, 0.500, "7067812686557352456", "1583302", "b57dd58b3c8090eae268bae843655c79")
流光 = AnimationMeta("流光", True, 1.600, "7308277700492268042", "32283005", "fd7091c4e298df2433e9433c8d58a427")
涂鸦手绘 = AnimationMeta("涂鸦手绘", True, 0.500, "7276407256965452346", "22361305", "1ae8ceff3f65dd62f36b3eb43baff6b4")
涂鸦手绘_II = AnimationMeta("涂鸦手绘 II", True, 0.500, "7276407576625943100", "22361304", "f72282b1f43b0d5e59144bbca7fbeda8")
渐变拖尾 = AnimationMeta("渐变拖尾", True, 0.800, "7308277117622424090", "32282151", "950687cffad02a7b17bc9b672c9585f2")
漂浮 = AnimationMeta("漂浮", True, 1.500, "7213291988500615738", "11017729", "451fbb332b33ec6ba683dc9d22055810")
漩涡 = AnimationMeta("漩涡", True, 0.500, "7099419657290912286", "1936778", "416be3d42ae0d037597209d2a2f843c4")
环形滚动 = AnimationMeta("环形滚动", True, 1.200, "7179135028343870012", "7564487", "e167e03db93ab98c4917ff53f59162c1")
环绕_II = AnimationMeta("环绕 II", True, 0.500, "7114181846086193701", "3240866", "6df622ca3b91909a8d23ae24f1c2a675")
甜甜圈 = AnimationMeta("甜甜圈", True, 0.500, "7070415354656199181", "1600378", "23a8cee8851ad7e169a094cee8ca9513")
福袋炸开 = AnimationMeta("福袋炸开", True, 1.500, "7047088638932292127", "1531460", "2646a21f26faeb4103acacaa74c171f6")
空间翻转_I = AnimationMeta("空间翻转 I", True, 1.500, "7163896186972148261", "5965291", "540b96331793d162cf80a099cd00dc55")
空间翻转_II = AnimationMeta("空间翻转 II", True, 1.100, "7163901901589713444", "5966503", "ce769779dfa1d9c69eb593318bf1bc28")
空间翻转_III = AnimationMeta("空间翻转 III", True, 0.500, "7163892769176424991", "5964737", "f9c82b94ebd990e6734ddef5ebba68cb")
竖向渐变 = AnimationMeta("竖向渐变", True, 2.200, "7430669972088558090", "87963946", "db87c31a4c3252000f04f61d814e96d0")
翻页I = AnimationMeta("翻页I", True, 1.200, "7168819879183651359", "6443365", "6f49e16f12b0518b2c3b38a12d07466d")
调皮 = AnimationMeta("调皮", True, 0.500, "6917143282690560526", "1644527", "b832fcbb8ea3bcc64ddbd70c56166956")
逐字放大 = AnimationMeta("逐字放大", True, 0.500, "6908592686781960717", "1644526", "4cd5a5c4144a3a713469043722579306")
错位 = AnimationMeta("错位", True, 3.000, "7243633488249754173", "15140783", "cc869e81ac3b5d769afa6836bab5937b")
随机弹跳 = AnimationMeta("随机弹跳", True, 0.500, "7045150354672980516", "1644538", "8656e9848f862adf1adfa30c26113a80")
颤抖_II = AnimationMeta("颤抖 II", True, 0.500, "6986920909927879199", "1446098", "8c985874e1b508c4bfb9552735228143")
飘起 = AnimationMeta("飘起", True, 3.000, "7211060597352305189", "10749797", "1ab6d9a8761c108da6989633b933647e")
================================================
FILE: src/pyJianYingDraft/metadata/text_outro.py
================================================
"""文字出场动画元数据"""
from .effect_meta import EffectEnum, AnimationMeta
class TextOutro(EffectEnum):
"""文字出场动画, 默认时长为0.5秒"""
# 免费特效
右上弹出 = AnimationMeta("右上弹出", False, 0.500, "7076006676951732767", "1631524", "7b65a6e8a2ef7015dc780dec3524af60")
右下擦除 = AnimationMeta("右下擦除", False, 0.500, "7090146831836910110", "1729286", "5e99fcba0a90d5bde52a85e034469aea")
向上擦除 = AnimationMeta("向上擦除", False, 0.500, "6774625752794010115", "1644609", "d9b04e37f86d6b5cf456f396648e11d4")
向上溶解 = AnimationMeta("向上溶解", False, 0.500, "7026619708627489293", "1644655", "7422f3de89f894522a0b45f3f2196131")
向上滑动 = AnimationMeta("向上滑动", False, 0.500, "6763873533115240968", "1644605", "bbec5aa1ddf8df26276b99cfd9996d76")
向下擦除 = AnimationMeta("向下擦除", False, 0.500, "6774626081791021576", "1644610", "4dafd6a7cbde862044fcbc543ecd818a")
向下滑动 = AnimationMeta("向下滑动", False, 0.500, "6724919284893487619", "1644606", "4b1190ca81551d872f1d6b0e2ce5db2b")
向右擦除 = AnimationMeta("向右擦除", False, 0.500, "6783908820176343566", "1644615", "a48325fce55a7a419b351c8a9826c7a0")
向右滑动 = AnimationMeta("向右滑动", False, 0.500, "6724920744431587853", "1644614", "4026a211f18b0fc6ab9e10d09c8922ba")
向右缓出 = AnimationMeta("向右缓出", False, 0.500, "7023684632591733284", "1451688", "59d06eeae650eb154920e1d07ef6b123")
向左擦除 = AnimationMeta("向左擦除", False, 0.500, "6774626748177846791", "1644608", "1160d9bcc8a158a65441bcfc9603bd00")
向左滑动 = AnimationMeta("向左滑动", False, 0.500, "6763873602476446221", "1644613", "a193ecedf73b2b27616ee7da4f599b9b")
向左解散 = AnimationMeta("向左解散", False, 0.500, "7083752251742753287", "1674332", "46b117e1d9fc552e574958fcde072a53")
圆形扫描 = AnimationMeta("圆形扫描", False, 0.500, "6840698265277567496", "1644617", "84c8a6772ba3199c3fdba0c171f0f2fc")
居中打字 = AnimationMeta("居中打字", False, 0.500, "7265222263174074937", "20304017", "39cf0ff875a8825a82377a11e8b89d6a")
展开 = AnimationMeta("展开", False, 0.500, "6779879836916650509", "1644599", "cc9805cb2f96e99eec6c0f1978b03f70")
左上弹出 = AnimationMeta("左上弹出", False, 0.500, "7078587337998864926", "1646758", "6cb5717740976cd9e65544d93bb8a8be")
左移弹动 = AnimationMeta("左移弹动", False, 1.000, "7313890212529050138", "35176386", "26cd4509db97923ac2fb11eca5947750")
弹出 = AnimationMeta("弹出", False, 0.500, "6887482090351235592", "1644648", "ee214499310cb2a55d2370534fd0c02b")
弹弓 = AnimationMeta("弹弓", False, 0.500, "6862897350478664200", "1644618", "45f66e1fa1a3b79968b3749275bab10c")
弹性伸缩 = AnimationMeta("弹性伸缩", False, 0.500, "6872642084977775118", "1644646", "f2882bcfc0abc3b0c53b39649a2c4224")
弹簧 = AnimationMeta("弹簧", False, 0.500, "6884154487246688776", "1644647", "15c4e6b0a27360bab5d6f5d421bbbe1e")
打字机_I = AnimationMeta("打字机 I", False, 0.500, "6763469696260903435", "1644611", "19a09f5625ae9001db6ce17d850da691")
打字机_II = AnimationMeta("打字机 II", False, 0.500, "6763469767555682823", "1644612", "f3ab4aa9eefc616bd928de6ca9936fb3")
打字机_III = AnimationMeta("打字机 III", False, 0.500, "6763469838368117256", "1644664", "3f77a87e46ee1b50cd0ac207809c4c24")
扭曲模糊 = AnimationMeta("扭曲模糊", False, 0.500, "7090122015603954189", "1729226", "2e58579b330dbccc4491c5f0a8cf4a8a")
拖尾 = AnimationMeta("拖尾", False, 0.500, "7244102819731477049", "15260277", "178d1715bc49ea8303d3a9831e14ea84")
放大 = AnimationMeta("放大", False, 0.500, "6724919767200698884", "1644603", "e818fb0699073a734ecead7c2768d827")
放大_II = AnimationMeta("放大 II", False, 0.500, "7042278078415901192", "1644666", "1d6882ba11b67fff13c98493bc644027")
故障打字机 = AnimationMeta("故障打字机", False, 0.500, "6870061326698287624", "1644643", "71a23656184bc8438f4fa22425192185")
旋出 = AnimationMeta("旋出", False, 0.500, "6763873732143354376", "1644604", "ffc35db86b29aee7a0a4342ea5ed059f")
日落 = AnimationMeta("日落", False, 0.500, "6779084194392838670", "1644607", "662eea25ba7d450d9a91febf43f22f7f")
晕开 = AnimationMeta("晕开", False, 0.500, "7090059095134179877", "1727994", "3f2770aa65e01746967c8289e193021b")
模糊 = AnimationMeta("模糊", False, 0.500, "6923094772907250189", "1644652", "72f73d5e9fd970ccee4918008b5a9d9a")
水墨晕开 = AnimationMeta("水墨晕开", False, 1.200, "7278296130432012857", "22734371", "2705529afbf57f101c042d3a96ca2795")
水平翻转 = AnimationMeta("水平翻转", False, 0.500, "7052633346936934942", "1644667", "8719853b159397ea64fc2102c61e52e4")
波浪弹出 = AnimationMeta("波浪弹出", False, 0.500, "6917178803521327630", "1644651", "c60021c62c10eab0aa4f408ed602405c")
渐隐 = AnimationMeta("渐隐", False, 0.500, "6724919382104871427", "1644600", "11004616098603d847593ce9ede05a62")
溶解 = AnimationMeta("溶解", False, 0.500, "6872642354898014728", "1644645", "46389f9f5f72e1b58020a0b8293a23b9")
滑动下落 = AnimationMeta("滑动下落", False, 1.500, "7270726693277405733", "21330850", "fa4aaf84b182425eed4e330ac03ecdbd")
生长 = AnimationMeta("生长", False, 0.500, "6869302139584254477", "1644642", "e6ae4e1fc5ade7bd8765ef6d918f5f6f")
缩小 = AnimationMeta("缩小", False, 0.500, "6724921351385125387", "1644602", "6c679c75b88d8c69335c9faefbcd635a")
羽化向右擦除 = AnimationMeta("羽化向右擦除", False, 0.500, "6897085341811872270", "1644649", "9d4c77cbae673b97c629890c6687bc71")
羽化向左擦除 = AnimationMeta("羽化向左擦除", False, 0.500, "6897085246206906893", "1644650", "865d4874f9e21f104881bd3f1f1e02fa")
翻动 = AnimationMeta("翻动", False, 1.000, "7308279288061497865", "32283993", "04cba0b253ac17aba55979be72a1a322")
躺下 = AnimationMeta("躺下", False, 0.800, "7265288999470633509", "20324365", "dc012ae6bfd6482bb0e52d02328016c8")
轻微放大 = AnimationMeta("轻微放大", False, 0.500, "6763469915518145032", "1644601", "1e293df954586a261a11576481dd8454")
闪动 = AnimationMeta("闪动", False, 0.500, "7039245189638001183", "1644658", "6b16591d61fa6ee68eef9148dbf0aa31")
闭幕 = AnimationMeta("闭幕", False, 0.500, "6834511218552607239", "1644616", "02a28db581b74aac8547c2479cb219bc")
随机弹跳 = AnimationMeta("随机弹跳", False, 0.500, "7026617357300666893", "1644665", "c260caa85b16e7d471ddeb2015cdf3f3")
随机飞出 = AnimationMeta("随机飞出", False, 0.500, "6872642497013617159", "1644644", "d1292de2cfc57d0ca12fdbafb4e0bca2")
# 付费特效
二段缩放 = AnimationMeta("二段缩放", True, 1.500, "7238519014866031162", "14394793", "bc54fc23dff39b105104f5bb15043ff9")
发光闪出 = AnimationMeta("发光闪出", True, 1.800, "7308275717505028617", "32281161", "980fe827d603f3785e69854b6e5967a4")
叠影并出 = AnimationMeta("叠影并出", True, 1.000, "7259634082760364603", "19101496", "1cc4801fbe64f100872abd1d502ac121")
向上飞出 = AnimationMeta("向上飞出", True, 0.500, "7090139631861109278", "1730928", "3513093fd914fcccfa87cb98a410062e")
向下弹出 = AnimationMeta("向下弹出", True, 0.500, "7127158940151845390", "3859743", "751b7e005e3ec297f5d3d2c40664f585")
向下翻转 = AnimationMeta("向下翻转", True, 0.500, "7198395913948107301", "9282213", "860c71ba47b9cf749ac977cb437ae1a8")
向左模糊 = AnimationMeta("向左模糊", True, 0.500, "7112703727336690189", "3176752", "2115519d6d8226853c4c7faf8ad61b18")
向左模糊_II = AnimationMeta("向左模糊 II", True, 0.500, "7254503584732025381", "17830676", "b01dbbd36097f1d37e4dde2fd4380a13")
吸出 = AnimationMeta("吸出", True, 0.300, "7121986743141667358", "3647465", "27d43c1a8f3bb21f88f25fadfd74e113")
喷绘 = AnimationMeta("喷绘", True, 0.500, "7120131305303446029", "3563649", "a2efafd9407094f2706c38b5ea2867c0")
复古打字机 = AnimationMeta("复古打字机", True, 0.800, "7252619798108967484", "17250228", "38ce74d50ed5abdebf4ba9cff80f644c")
弹出跳动 = AnimationMeta("弹出跳动", True, 0.500, "7184797189627974200", "8058215", "dffb8966b47b6eae5fb9ef0e0fe6e6b9")
弹性伸缩_II = AnimationMeta("弹性伸缩 II", True, 0.500, "7308276711039177225", "32281815", "9b225f4fafa2341876eec98ba91c89ee")
打字光标 = AnimationMeta("打字光标", True, 2.000, "7237411511755346491", "14235852", "1285f4e58d3989468cc7c7679145e155")
打字机IV = AnimationMeta("打字机IV", True, 2.000, "7237411448303915557", "14235853", "3f2d4916f48390652f4abaff69742c0b")
折叠 = AnimationMeta("折叠", True, 0.500, "7124961998919438884", "3769517", "ccce629bcf7f98a8de4d4e1a2228d11a")
描边填充 = AnimationMeta("描边填充", True, 0.900, "7308273254127374874", "32279531", "9dc334dd67a2ace030c8d0f0d01ecede")
收缩震动 = AnimationMeta("收缩震动", True, 0.500, "7268214314022998588", "20877442", "c95da61de0632a74d061f03806a8ea9b")
故障 = AnimationMeta("故障", True, 0.500, "7091567288385540622", "1789138", "b106b2d684134a06b033aa2ba70baea2")
故障闪动 = AnimationMeta("故障闪动", True, 2.000, "7244102414377161276", "15261509", "ba766fab0ea8b838f1c64973aee2b54b")
旋转缩放 = AnimationMeta("旋转缩放", True, 1.600, "7243633648237285949", "15140857", "37af568e3f004232b19507b24d5438c1")
旋转飞出 = AnimationMeta("旋转飞出", True, 0.500, "6775804032318444045", "1644639", "802b2078b18d70ecd073ffacff59c1d8")
模糊发光 = AnimationMeta("模糊发光", True, 1.800, "7301536173959156274", "29690520", "a21891cf3eff128b2a5190cad5356d69")
模糊滚动 = AnimationMeta("模糊滚动", True, 0.800, "7264501549240422949", "20154980", "9c07a1d5d75f675d32f8917dc76f7381")
波浪弹跳 = AnimationMeta("波浪弹跳", True, 1.000, "7317637880799564297", "37396324", "17dc7c4e6498440fcafc56dfbe3fb4fe")
消散 = AnimationMeta("消散", True, 0.500, "7155790075794559525", "5323563", "21888446c8d15d56c60864985328652b")
滚出 = AnimationMeta("滚出", True, 0.500, "7023684709737566728", "1644656", "f25af0cdef9584d588584b3765350f64")
激光雕刻 = AnimationMeta("激光雕刻", True, 1.200, "7244102529573720635", "15261103", "bb0ab89c7396d11d5663b0071296f27d")
炸开 = AnimationMeta("炸开", True, 0.500, "7142816577971294734", "4577477", "15ced8e31e8d57f8932820fe99f96391")
炸开_II = AnimationMeta("炸开 II", True, 0.500, "7148309755121898015", "4834739", "bff4571b77bca8598b6ce8ba65d93252")
炸开_Ⅲ = AnimationMeta("炸开 Ⅲ", True, 1.200, "7308274161992864266", "32280237", "0060b15237436dc553a3a050825d18a6")
环绕滑出 = AnimationMeta("环绕滑出", True, 1.000, "7261858590808347193", "19562193", "c88f30f314faade1a6e71884234a380b")
甩回 = AnimationMeta("甩回", True, 0.600, "7244102747698500156", "15261069", "0203e194e3bcf10f7f96fde73dc350f3")
空翻 = AnimationMeta("空翻", True, 0.500, "6865176065514410503", "1644641", "f578720479df7746fa067199a1e4ea8b")
螺旋下降 = AnimationMeta("螺旋下降", True, 0.500, "6799874105710481927", "1644640", "e6e1a2239d894b408e41341a6ca578ca")
逐字旋出 = AnimationMeta("逐字旋出", True, 1.500, "7229520513586958908", "13137113", "3df3f26182ac9c6359be95dfb443d5da")
逐字旋转 = AnimationMeta("逐字旋转", True, 0.500, "7112021029085516319", "3129838", "ee29d8b9e06a471972f36734c53dbea8")
逐字翻转 = AnimationMeta("逐字翻转", True, 0.500, "7112274846326723086", "3139394", "ffc81a4b0c44427fbfd60984f7ddcdc2")
逐字虚影 = AnimationMeta("逐字虚影", True, 0.500, "7034717113130422791", "1644657", "fe2cfbc08c330517caa8b602187ced07")
镂空跳出 = AnimationMeta("镂空跳出", True, 1.200, "7312331703903588902", "34383204", "9ee4277be6f23033bf1b80fd0e6e8d27")
闪烁散开 = AnimationMeta("闪烁散开", True, 1.000, "7268169968204649020", "20860262", "b58f8939e94946a70c35188819a65a78")
随机弹跳_II = AnimationMeta("随机弹跳 II", True, 0.500, "7114191629346411016", "3241116", "0f0b492622513301a7cd8f30b035a056")
随机打字机 = AnimationMeta("随机打字机", True, 0.500, "6926719087158497806", "1644653", "9db48fc9916b5b8554ce7262bb90f18f")
顶出 = AnimationMeta("顶出", True, 1.100, "7268231069768356408", "20882164", "98ad0ec3b5980352e4709158def77960")
预览打字 = AnimationMeta("预览打字", True, 0.800, "7268216065337856572", "20878188", "360d883bb43dab551defd1e94b9730d6")
飞出 = AnimationMeta("飞出", True, 0.500, "7029522072724312612", "1644654", "324c695abdd43e1ec3506364fce0a087")
================================================
FILE: src/pyJianYingDraft/metadata/tone_effect.py
================================================
from .effect_meta import EffectEnum
from .effect_meta import EffectMeta, EffectParam
class ToneEffectType(EffectEnum):
"""剪映自带的音频“音色”效果类型"""
# 免费
台湾小哥 = EffectMeta("台湾小哥", False, "7255565276819755576", "18149602", "8dd8889045e6c065177df791ddb3dfb8", [])
圣诞精灵 = EffectMeta("圣诞精灵", False, "7310059412062736946", "33214695", "8dd8889045e6c065177df791ddb3dfb8", [])
圣诞老人 = EffectMeta("圣诞老人", False, "7310059178133819930", "33214489", "8dd8889045e6c065177df791ddb3dfb8", [])
广告男声 = EffectMeta("广告男声", False, "7328088579811316263", "42060748", "f554735f65a98cc4da17a1c53ef6a886", [])
港普男声 = EffectMeta("港普男声", False, "7328087687548637732", "42060743", "f554735f65a98cc4da17a1c53ef6a886", [])
老婆婆 = EffectMeta("老婆婆", False, "7328089253114548799", "42060746", "f554735f65a98cc4da17a1c53ef6a886", [])
解说小帅 = EffectMeta("解说小帅", False, "7332473259369173540", "44254166", "f554735f65a98cc4da17a1c53ef6a886", [])
大叔 = EffectMeta("大叔", False, "7020344898033291790", "2672760", "2509bbd71e127b04a29f52a54e82c53c", [
EffectParam("音调", 0.834, 0.000, 1.000),
EffectParam("音色", 1.000, 0.000, 1.000)])
"""参数:
- 音调: 默认0.83, 0.00 ~ 1.00
- 音色: 默认1.00, 0.00 ~ 1.00
"""
女生 = EffectMeta("女生", False, "7020345715901600270", "2672757", "0ce1aade5958506c97bffea150772b6e", [
EffectParam("音调", 0.834, 0.000, 1.000),
EffectParam("音色", 0.334, 0.000, 1.000)])
"""参数:
- 音调: 默认0.83, 0.00 ~ 1.00
- 音色: 默认0.33, 0.00 ~ 1.00
"""
怪物 = EffectMeta("怪物", False, "7020344978794615327", "2672759", "2130ffa21e5980196e014ec0baade179", [
EffectParam("音调", 0.650, 0.000, 1.000),
EffectParam("音色", 0.780, 0.000, 1.000)])
"""参数:
- 音调: 默认0.65, 0.00 ~ 1.00
- 音色: 默认0.78, 0.00 ~ 1.00
"""
机器人 = EffectMeta("机器人", False, "7018011705414259213", "2672750", "4b87db25aecd2f6f71927930110c4a1e", [
EffectParam("强弱", 1.000, 0.000, 1.000)])
"""参数:
- 强弱: 默认1.00, 0.00 ~ 1.00
"""
男生 = EffectMeta("男生", False, "7020345085233467917", "2672758", "ffd7a609207fd849efc9f63bf31697b1", [
EffectParam("音调", 0.375, 0.000, 1.000),
EffectParam("音色", 0.250, 0.000, 1.000)])
"""参数:
- 音调: 默认0.38, 0.00 ~ 1.00
- 音色: 默认0.25, 0.00 ~ 1.00
"""
花栗鼠 = EffectMeta("花栗鼠", False, "7018011553081332231", "2672752", "e30b1922b8300423f21f9f84eff41ced", [
EffectParam("音调", 0.500, 0.000, 1.000),
EffectParam("音色", 0.500, 0.000, 1.000)])
"""参数:
- 音调: 默认0.50, 0.00 ~ 1.00
- 音色: 默认0.50, 0.00 ~ 1.00
"""
萝莉 = EffectMeta("萝莉", False, "7020345789599715848", "2672756", "00b7ed2ccfe4d6076f78c8d751347a53", [
EffectParam("音调", 0.750, 0.000, 1.000),
EffectParam("音色", 0.600, 0.000, 1.000)])
"""参数:
- 音调: 默认0.75, 0.00 ~ 1.00
- 音色: 默认0.60, 0.00 ~ 1.00
"""
# 付费
TVB女声 = EffectMeta("TVB女声", True, "7260024060417937978", "19186454", "8dd8889045e6c065177df791ddb3dfb8", [])
东厂公公 = EffectMeta("东厂公公", True, "7328092524612948491", "42060742", "f554735f65a98cc4da17a1c53ef6a886", [])
云龙哥 = EffectMeta("云龙哥", True, "7376558114830553612", "68856989", "f554735f65a98cc4da17a1c53ef6a886", [])
侠客 = EffectMeta("侠客", True, "7328089134331859468", "42060738", "f554735f65a98cc4da17a1c53ef6a886", [])
做作夹子音 = EffectMeta("做作夹子音", True, "7367676929496846911", "63231108", "f554735f65a98cc4da17a1c53ef6a886", [])
八戒 = EffectMeta("八戒", True, "7265891792766112314", "20427371", "8dd8889045e6c065177df791ddb3dfb8", [])
军事解说 = EffectMeta("军事解说", True, "7328092289480266252", "42060734", "f554735f65a98cc4da17a1c53ef6a886", [])
动漫小新 = EffectMeta("动漫小新", True, "7360901047662940708", "58979441", "f554735f65a98cc4da17a1c53ef6a886", [])
动漫海绵 = EffectMeta("动漫海绵", True, "7367676859883983379", "63231109", "f554735f65a98cc4da17a1c53ef6a886", [])
咆哮哥 = EffectMeta("咆哮哥", True, "7332473122605503039", "44254278", "f554735f65a98cc4da17a1c53ef6a886", [])
商务殷语 = EffectMeta("商务殷语", True, "7328085477267870249", "42060747", "f554735f65a98cc4da17a1c53ef6a886", [])
四郎 = EffectMeta("四郎", True, "7250403044414722621", "16627073", "8dd8889045e6c065177df791ddb3dfb8", [])
太白 = EffectMeta("太白", True, "7328091247308968484", "42060736", "f554735f65a98cc4da17a1c53ef6a886", [])
如来佛祖 = EffectMeta("如来佛祖", True, "7376558174049931830", "68856990", "f554735f65a98cc4da17a1c53ef6a886", [])
姜饼人 = EffectMeta("姜饼人", True, "7310059267384414747", "33214539", "8dd8889045e6c065177df791ddb3dfb8", [])
容嬷嬷 = EffectMeta("容嬷嬷", True, "7332472945366798860", "44254320", "f554735f65a98cc4da17a1c53ef6a886", [])
小孩 = EffectMeta("小孩", True, "7262648951948448315", "19716244", "8dd8889045e6c065177df791ddb3dfb8", [])
强势妹 = EffectMeta("强势妹", True, "7328091624427229759", "42060740", "f554735f65a98cc4da17a1c53ef6a886", [])
快板 = EffectMeta("快板", True, "7328088454183522827", "42060741", "f554735f65a98cc4da17a1c53ef6a886", [])
恐怖电影 = EffectMeta("恐怖电影", True, "7325710953247412787", "40932465", "f554735f65a98cc4da17a1c53ef6a886", [])
悬疑解说 = EffectMeta("悬疑解说", True, "7325711304390349362", "40932811", "f554735f65a98cc4da17a1c53ef6a886", [])
懒小羊 = EffectMeta("懒小羊", True, "7332473035116515859", "44254304", "f554735f65a98cc4da17a1c53ef6a886", [])
搞笑解说 = EffectMeta("搞笑解说", True, "7262648842238038584", "19716150", "8dd8889045e6c065177df791ddb3dfb8", [])
文艺女声 = EffectMeta("文艺女声", True, "7379565719991620132", "70562787", "f554735f65a98cc4da17a1c53ef6a886", [])
樱桃丸子 = EffectMeta("樱桃丸子", True, "7325709643332719113", "40931609", "f554735f65a98cc4da17a1c53ef6a886", [])
樱花小哥 = EffectMeta("樱花小哥", True, "7328091741678998055", "42060735", "f554735f65a98cc4da17a1c53ef6a886", [])
武则天 = EffectMeta("武则天", True, "7328088300474864167", "42060744", "f554735f65a98cc4da17a1c53ef6a886", [])
沉稳解说 = EffectMeta("沉稳解说", True, "7367676791164506636", "63231110", "f554735f65a98cc4da17a1c53ef6a886", [])
温柔姐姐 = EffectMeta("温柔姐姐", True, "7379565769190806079", "70562785", "f554735f65a98cc4da17a1c53ef6a886", [])
熊二 = EffectMeta("熊二", True, "7250403222798471740", "16627311", "8dd8889045e6c065177df791ddb3dfb8", [])
猴哥 = EffectMeta("猴哥", True, "7236944659547689531", "14477015", "4f6a1fbc0000e178c724d355efea1d9f", [])
甜美悦悦 = EffectMeta("甜美悦悦", True, "7325710673978069530", "40932253", "f554735f65a98cc4da17a1c53ef6a886", [])
生活小妙招 = EffectMeta("生活小妙招", True, "7328092409525441065", "42060737", "f554735f65a98cc4da17a1c53ef6a886", [])
电竞解说 = EffectMeta("电竞解说", True, "7325711893551649330", "40933559", "f554735f65a98cc4da17a1c53ef6a886", [])
电视广告 = EffectMeta("电视广告", True, "7360901109667336743", "58979440", "f554735f65a98cc4da17a1c53ef6a886", [])
紫薇 = EffectMeta("紫薇", True, "7281175506391667257", "23475307", "8dd8889045e6c065177df791ddb3dfb8", [])
舌尖解说 = EffectMeta("舌尖解说", True, "7328091500753982015", "42060739", "f554735f65a98cc4da17a1c53ef6a886", [])
蜡笔小妮 = EffectMeta("蜡笔小妮", True, "7379565670398169619", "70562786", "f554735f65a98cc4da17a1c53ef6a886", [])
语音助手 = EffectMeta("语音助手", True, "7325710335455793714", "40931973", "f554735f65a98cc4da17a1c53ef6a886", [])
那姐 = EffectMeta("那姐", True, "7369177370873303587", "64206631", "f554735f65a98cc4da17a1c53ef6a886", [])
锤子哥 = EffectMeta("锤子哥", True, "7328091348098093580", "42060745", "f554735f65a98cc4da17a1c53ef6a886", [])
顾姐 = EffectMeta("顾姐", True, "7250403134923608631", "16627197", "8dd8889045e6c065177df791ddb3dfb8", [])
黛玉 = EffectMeta("黛玉", True, "7255565592093004343", "18149634", "8dd8889045e6c065177df791ddb3dfb8", [])
================================================
FILE: src/pyJianYingDraft/metadata/transition_meta.py
================================================
"""转场效果元数据"""
from .effect_meta import EffectEnum, TransitionMeta
class TransitionType(EffectEnum):
"""转场类型"""
# 免费特效
_3D空间 = TransitionMeta("3D空间", False, "7049979667406656014", "1506926", "aaecc038f6543411f601608fc5539f0b", 1.500, True)
"""默认时长: 1.50s"""
上下翻页 = TransitionMeta("上下翻页", False, "7397337005387944457", "77055399", "091f7995a43fc66fd0a95b2a6b88834f", 1.000, True)
"""默认时长: 1.00s"""
上移 = TransitionMeta("上移", False, "6724846395116753416", "2917279", "df9bc16697464de201a4924de49234a2", 0.500, True)
"""默认时长: 0.50s"""
下移 = TransitionMeta("下移", False, "6724849276100284942", "2917280", "9c042543d4846e7c17e8f950ce6f91c2", 0.500, True)
"""默认时长: 0.50s"""
中心旋转 = TransitionMeta("中心旋转", False, "6858191434294497805", "878914", "b43f5b2e59f966a3b110222773c2942d", 0.500, False)
"""默认时长: 0.50s"""
云朵 = TransitionMeta("云朵", False, "6955722927161479694", "2912469", "283bb4bbe729f19f933cb705024a0983", 0.500, True)
"""默认时长: 0.50s"""
倒影 = TransitionMeta("倒影", False, "6748313807031898627", "369691", "0ee10b771dc0443c41a90bb9fd6b3c25", 0.500, True)
"""默认时长: 0.50s"""
冰雪结晶 = TransitionMeta("冰雪结晶", False, "6919369228701143559", "1017910", "a0fd9d6eb0cb5596cac4f54d0ba59eaf", 0.500, False)
"""默认时长: 0.50s"""
冲鸭 = TransitionMeta("冲鸭", False, "7030714241359286821", "1441672", "784b284f040f61ae95f4e8e660f3a873", 0.500, False)
"""默认时长: 0.50s"""
分割 = TransitionMeta("分割", False, "6968372308419285540", "4211683", "ca45695f29bacf2dc29a6eb959e9e968", 0.500, True)
"""默认时长: 0.50s"""
分割_II = TransitionMeta("分割 II", False, "6969782622868214302", "4211740", "5ba1cb89bcf4a0898f86494864348e13", 0.500, True)
"""默认时长: 0.50s"""
分割_III = TransitionMeta("分割 III", False, "6969793843403166215", "4211739", "942fd71d67ca576384b2cd068157ca45", 0.500, True)
"""默认时长: 0.50s"""
分割_IV = TransitionMeta("分割 IV", False, "6969793934356648455", "4211738", "62d08c08542fe62e6a8429f9501e76fa", 0.500, True)
"""默认时长: 0.50s"""
前后对比_II = TransitionMeta("前后对比 II", False, "7299290706277831218", "28895844", "64e8f4a060901fd4349301f97fbdd172", 0.800, True)
"""默认时长: 0.80s"""
动漫云朵 = TransitionMeta("动漫云朵", False, "6777178865119793678", "2911876", "e835cbc7fa7b15af90a2a7090bbf68c3", 0.500, False)
"""默认时长: 0.50s"""
动漫漩涡 = TransitionMeta("动漫漩涡", False, "6858191448827761160", "878913", "fa7ba99b13036c0ff167ea3b7d5c31a2", 0.500, False)
"""默认时长: 0.50s"""
动漫火焰 = TransitionMeta("动漫火焰", False, "6777178765643485709", "2911875", "8e7c247c5ebd58aa5c3582273e9c840b", 0.500, False)
"""默认时长: 0.50s"""
动漫闪电 = TransitionMeta("动漫闪电", False, "6777178696609436174", "2911874", "3fd5d0c7c48668ba5305c57ac0b5d596", 0.500, False)
"""默认时长: 0.50s"""
压缩 = TransitionMeta("压缩", False, "6751618376780485133", "4212466", "337d4cd9be4e1860bd1e7e50a9a93841", 0.500, True)
"""默认时长: 0.50s"""
叠加 = TransitionMeta("叠加", False, "6914112332205396488", "1003369", "4f7e4bd421e382860b49e3e34eb4e4aa", 1.000, True)
"""默认时长: 1.00s"""
叠化 = TransitionMeta("叠化", False, "6724845717472416269", "322577", "2d641adc4bb63e37e3a0067d8c8cc3c3", 0.500, True)
"""默认时长: 0.50s"""
右移 = TransitionMeta("右移", False, "6726711296063967748", "2917287", "4cfd965c25e33c7df9b2c1b3b4cbdf31", 1.000, True)
"""默认时长: 1.00s"""
向上 = TransitionMeta("向上", False, "6724227090872275463", "359459", "349746a951e130fe896415f51c9eb36a", 1.000, False)
"""默认时长: 1.00s"""
向上擦除 = TransitionMeta("向上擦除", False, "6724849456891564557", "2917281", "9a2e4ebf7309c80be332e3c62594dcd6", 0.500, True)
"""默认时长: 0.50s"""
向下 = TransitionMeta("向下", False, "6724227330190873100", "359449", "9c263958ef3b5762db6ffd94a665f9e8", 1.000, False)
"""默认时长: 1.00s"""
向下擦除 = TransitionMeta("向下擦除", False, "6724849752921346573", "2917282", "ce1fb8739d1fbff3d86498fc18321933", 0.500, True)
"""默认时长: 0.50s"""
向下流动 = TransitionMeta("向下流动", False, "6858191469807669773", "878912", "45f28ed2995ca15cfe027784b55d34f2", 0.500, False)
"""默认时长: 0.50s"""
向右 = TransitionMeta("向右", False, "6724227599616184836", "359527", "55af58a9b04ff458c3a9ae3ddb358152", 1.000, False)
"""默认时长: 1.00s"""
向右上 = TransitionMeta("向右上", False, "6724227870559834635", "359567", "19d72649fe9bc3b272e1d874a93a0e9b", 0.500, True)
"""默认时长: 0.50s"""
向右下 = TransitionMeta("向右下", False, "6724228621742903815", "359537", "4291e21aefc6d87a232441d38cabacc5", 0.500, True)
"""默认时长: 0.50s"""
向右拉伸 = TransitionMeta("向右拉伸", False, "6987299127025472031", "4211782", "6c3d17aa182e6238ee3a48c2fdf4a627", 0.500, True)
"""默认时长: 0.50s"""
向右擦除 = TransitionMeta("向右擦除", False, "6724849898857959950", "2917284", "a10153bd2b569c49ddd7c055e8c9eba9", 0.500, True)
"""默认时长: 0.50s"""
向右流动 = TransitionMeta("向右流动", False, "6858191483573375495", "878911", "8d3508f6e570dc73d3e771d234796cb8", 0.500, False)
"""默认时长: 0.50s"""
向左 = TransitionMeta("向左", False, "6724227717195108867", "359529", "323fadc45da03741e6b393b3e3b34e75", 0.500, False)
"""默认时长: 0.50s"""
向左上 = TransitionMeta("向左上", False, "6724230442679013902", "359533", "4ed73d43829eb496f6885ac0b882a391", 0.500, True)
"""默认时长: 0.50s"""
向左下 = TransitionMeta("向左下", False, "6724230577211314695", "359535", "c76650d4ea9bc4e3b0530c9b9f05f28e", 0.500, True)
"""默认时长: 0.50s"""
向左拉伸 = TransitionMeta("向左拉伸", False, "6987201429622493732", "4211781", "b0dd96c3c203104a2df46d83dd91b7bd", 0.500, True)
"""默认时长: 0.50s"""
向左擦除 = TransitionMeta("向左擦除", False, "6724849999336706573", "2917283", "316c2a1c1783f51505c793b13381b445", 0.500, True)
"""默认时长: 0.50s"""
吸入 = TransitionMeta("吸入", False, "7246288124110705209", "15653345", "fb75bf696e19a04795ae9a06b43a09f2", 1.000, True)
"""默认时长: 1.00s"""
回忆下滑 = TransitionMeta("回忆下滑", False, "7309840407406318117", "33106283", "7e8f1b10bb9979d7ed184d29f301b93d", 1.000, True)
"""默认时长: 1.00s"""
圆形分割_II = TransitionMeta("圆形分割 II", False, "7317206886053319194", "37127313", "05017adee9a3798b4fb207bb3206187e", 0.800, True)
"""默认时长: 0.80s"""
圆形扫描 = TransitionMeta("圆形扫描", False, "6851775006418932238", "813992", "0260ab98d7a840c3344cb5b3e70b7d4b", 1.000, True)
"""默认时长: 1.00s"""
圆形遮罩 = TransitionMeta("圆形遮罩", False, "6725767129519362573", "2916676", "a7eb1d47f97049b17f49669622d07f3d", 0.500, True)
"""默认时长: 0.50s"""
圆形遮罩_II = TransitionMeta("圆形遮罩 II", False, "6724850215364334083", "2916675", "2772ad7c8c7e30c6421be7c2e5dd3f15", 1.000, True)
"""默认时长: 1.00s"""
复古放映 = TransitionMeta("复古放映", False, "7237068402945167909", "14192091", "44c3d405f4961d843c74c69e241df643", 0.600, True)
"""默认时长: 0.60s"""
岁月的痕迹 = TransitionMeta("岁月的痕迹", False, "6982750240663147044", "1185194", "0b228af1ebde4909bb6ff545ddd89023", 1.000, True)
"""默认时长: 1.00s"""
左下角_II = TransitionMeta("左下角 II", False, "7304868316252738098", "30874190", "e0296196f0ec6666a33b33fead4f63d6", 0.700, True)
"""默认时长: 0.70s"""
左移 = TransitionMeta("左移", False, "6726711499676455435", "2917286", "9562c0ea301229d43f9dca6f6590f306", 1.000, True)
"""默认时长: 1.00s"""
开幕 = TransitionMeta("开幕", False, "6750893890712113677", "391781", "d5f097e701ddaa984a590249896fc51a", 0.500, True)
"""默认时长: 0.50s"""
弹幕转场 = TransitionMeta("弹幕转场", False, "7028877116259176974", "1433950", "7b5385070a42a218f194d9daddb59f32", 4.000, False)
"""默认时长: 4.00s"""
弹跳 = TransitionMeta("弹跳", False, "6747865141120864779", "368205", "4b3b8b53bc1f947d57a30489d81387eb", 0.500, True)
"""默认时长: 0.50s"""
打板转场_I = TransitionMeta("打板转场 I", False, "7028143517570437668", "1432322", "355d5c4df581f6c4940c9b999e010f81", 4.000, False)
"""默认时长: 4.00s"""
打板转场_II = TransitionMeta("打板转场 II", False, "7029592645538157086", "1437264", "021dfc9a6541d8d08bac631749f9e87d", 4.000, False)
"""默认时长: 4.00s"""
抖动 = TransitionMeta("抖动", False, "7252544245444121148", "17223925", "a1b79bbc99afca7c9e5372cd050ad61d", 0.800, True)
"""默认时长: 0.80s"""
抖动_II = TransitionMeta("抖动 II", False, "7252544309830881851", "17223924", "37319b02a398332e7159f323ea93ba88", 0.800, True)
"""默认时长: 0.80s"""
抠像旋转 = TransitionMeta("抠像旋转", False, "7386584387128660506", "73423370", "290a8f067f8039b1060df3d1e8d07ca0", 0.800, True)
"""默认时长: 0.80s"""
拉伸 = TransitionMeta("拉伸", False, "7231391397717217851", "13402655", "4fd21b4a2e6382ee8851c51c8f65ed73", 1.200, True)
"""默认时长: 1.20s"""
拉伸_II = TransitionMeta("拉伸 II", False, "7259735372039459389", "19137130", "d28fee612c51edf28da804983d220f8d", 0.600, True)
"""默认时长: 0.60s"""
拉远 = TransitionMeta("拉远", False, "6724226338418332167", "359365", "9661d5321722495c0a98959a0d617b0f", 1.000, False)
"""默认时长: 1.00s"""
拍摄器 = TransitionMeta("拍摄器", False, "7100849808784495135", "2057168", "b64bebe75d492161875d4fd54725b31d", 0.500, True)
"""默认时长: 0.50s"""
推近 = TransitionMeta("推近", False, "6724226861666144779", "359359", "4d5a316f2eae582e7d0604b47feb8c32", 1.000, False)
"""默认时长: 1.00s"""
撕纸拉屏 = TransitionMeta("撕纸拉屏", False, "7254847807465460280", "17934952", "c500d2310388b63f3a4e66ff0b15f6dc", 0.700, True)
"""默认时长: 0.70s"""
放射 = TransitionMeta("放射", False, "6724239584663704071", "4212630", "06cc8d49c558d57e21207f68a6a7dbc0", 1.000, True)
"""默认时长: 1.00s"""
故障 = TransitionMeta("故障", False, "6725771847444468236", "2918080", "7bec08ae5dae8806e3ba0c66622d0fd3", 1.000, False)
"""默认时长: 1.00s"""
故障拼贴 = TransitionMeta("故障拼贴", False, "7397337004507140618", "77055395", "305fc94470ded4f5b633c80fb4112582", 1.000, True)
"""默认时长: 1.00s"""
斜向分割 = TransitionMeta("斜向分割", False, "7085250093527339557", "4211687", "6ae9eb3ee4b08afa67e3d079a2ece505", 0.500, True)
"""默认时长: 0.50s"""
星星 = TransitionMeta("星星", False, "6751564373317128708", "2916678", "5ad3a484b1784e3f5391bf3fa7b188f4", 0.500, True)
"""默认时长: 0.50s"""
星星_II = TransitionMeta("星星 II", False, "6789847494898487822", "2916679", "16a4697aef243c1524e9581fb2f038c9", 0.500, True)
"""默认时长: 0.50s"""
模糊 = TransitionMeta("模糊", False, "6911569618171597320", "4212596", "fc1352435f88c6f284b6c6dce8552ffe", 0.500, True)
"""默认时长: 0.50s"""
横向分割 = TransitionMeta("横向分割", False, "7083771238564237861", "4211685", "aa0aa4a72fc236611d3fd4bf75a12ca3", 0.500, True)
"""默认时长: 0.50s"""
横向拉幕 = TransitionMeta("横向拉幕", False, "6724492948144132621", "2917278", "de63aa2d5225bb6a65b5bab8702aa1f5", 1.000, True)
"""默认时长: 1.00s"""
横向模糊 = TransitionMeta("横向模糊", False, "7450031573958660645", "97482744", "38f584c24f4383e9d10037ad4ce6fa00", 0.500, True)
"""默认时长: 0.50s"""
横线 = TransitionMeta("横线", False, "6724845810892149251", "2918076", "36c1c8edb0171ea082c98d38ffa8bd36", 0.500, True)
"""默认时长: 0.50s"""
气泡转场 = TransitionMeta("气泡转场", False, "7028880945671311903", "1433968", "66489506132d1314f3c7264bcd947cad", 4.000, False)
"""默认时长: 4.00s"""
水墨 = TransitionMeta("水墨", False, "6789847231873683976", "521328", "d1dd3dd8905f0b96be756bd34be1a84d", 0.500, True)
"""默认时长: 0.50s"""
水波卷动 = TransitionMeta("水波卷动", False, "6858191497280360973", "878910", "cf9bac91349a227a6155eca9d94a8af8", 0.500, False)
"""默认时长: 0.50s"""
水波向右 = TransitionMeta("水波向右", False, "6858191510865711629", "878909", "e9301bacebc6dc444aa4e6f835dd4a31", 0.500, False)
"""默认时长: 0.50s"""
水波向左 = TransitionMeta("水波向左", False, "6858191524312650248", "878908", "6b6499879310b6d29e9595799829cb15", 0.500, False)
"""默认时长: 0.50s"""
泛光 = TransitionMeta("泛光", False, "6914112263645303303", "4202527", "c978e2e22e9a9768813f5fd8d486b792", 1.000, True)
"""默认时长: 1.00s"""
泛白 = TransitionMeta("泛白", False, "6949828109663212045", "4202528", "1bf6b83628ff6416a4d87865107b739e", 1.000, False)
"""默认时长: 1.00s"""
波点向右 = TransitionMeta("波点向右", False, "6858191541706428941", "878907", "74c13e6250cdff7a4e860625d1098e0c", 0.500, False)
"""默认时长: 0.50s"""
渐变擦除 = TransitionMeta("渐变擦除", False, "6919369138800431629", "1017911", "2fff9b60c929559bce574ab8ef2c14a7", 1.000, True)
"""默认时长: 1.00s"""
滑动 = TransitionMeta("滑动", False, "6757982416649851399", "4212349", "b99916e2936aeb2e56892ca617888694", 1.000, True)
"""默认时长: 1.00s"""
漩涡 = TransitionMeta("漩涡", False, "6851810799510360583", "4211780", "31d2de43e6711a9eeb831d60529d0393", 1.000, False)
"""默认时长: 1.00s"""
烟雾转场 = TransitionMeta("烟雾转场", False, "7450031574923350555", "97482746", "67dc647cf7b1c45ada91d32bebc2bde7", 1.500, True)
"""默认时长: 1.50s"""
爱心 = TransitionMeta("爱心", False, "6748289440130535947", "2916677", "2382e2096918b63a0f8e75f720d7d892", 0.500, True)
"""默认时长: 0.50s"""
爱心_II = TransitionMeta("爱心 II", False, "6789846472343949837", "2916682", "0c04684566638932cb6f6d86cdfabda6", 0.500, True)
"""默认时长: 0.50s"""
爱心上升 = TransitionMeta("爱心上升", False, "6789846246069637640", "2916681", "2a3c5439ce79e6113843a2b7135bd21a", 0.500, True)
"""默认时长: 0.50s"""
电视故障_I = TransitionMeta("电视故障 I", False, "7046293801123451405", "2918081", "feaf2e85b909a123ea71728f9b61fb03", 1.600, True)
"""默认时长: 1.60s"""
电视故障_II = TransitionMeta("电视故障 II", False, "7042278078415901192", "2918082", "a082bdaea1122bbf1aba730278d50250", 1.600, True)
"""默认时长: 1.60s"""
画笔擦除 = TransitionMeta("画笔擦除", False, "6789846828788486664", "2912467", "4fafb5343d5c9e726278e90b5e0c1c93", 0.500, True)
"""默认时长: 0.50s"""
白光快闪 = TransitionMeta("白光快闪", False, "7343136487182963211", "49272367", "c1f7073a94d22565ace1ab3023d1c154", 0.400, True)
"""默认时长: 0.40s"""
白色墨花 = TransitionMeta("白色墨花", False, "6858191556055142919", "878906", "775ccf71576e2b8fb075f0e61e980923", 0.500, False)
"""默认时长: 0.50s"""
白色烟雾 = TransitionMeta("白色烟雾", False, "6885646856672514567", "947664", "9b679b32ec03c42932fa37b10c141bda", 0.500, False)
"""默认时长: 0.50s"""
百叶窗 = TransitionMeta("百叶窗", False, "6789847331060584974", "521326", "9f37c3f6f5e84b37b3a0560803a16c30", 0.500, True)
"""默认时长: 0.50s"""
眨眼 = TransitionMeta("眨眼", False, "6864867302936941064", "2917719", "bf695506c8091f7a01ee7b1323a4d601", 0.500, True)
"""默认时长: 0.50s"""
矩形分割 = TransitionMeta("矩形分割", False, "6858191571196580359", "878905", "82d6235324f8c5f830f8ccf7b1cc036b", 0.500, False)
"""默认时长: 0.50s"""
窗格 = TransitionMeta("窗格", False, "6747989545448378888", "368721", "cd6a7ff53319efa1c57690f61c8737a0", 0.500, True)
"""默认时长: 0.50s"""
立方体 = TransitionMeta("立方体", False, "6785042367498949127", "519784", "be45578bb628a21eaae268a8d8df868f", 0.500, True)
"""默认时长: 0.50s"""
竖向分割 = TransitionMeta("竖向分割", False, "7083771107706147364", "4211686", "7cc017d4e1b6ab58ec4b6900432522ff", 0.500, True)
"""默认时长: 0.50s"""
竖向拉幕 = TransitionMeta("竖向拉幕", False, "6726711903684399619", "2917285", "84f91be5a43cc6a9d03505a465418206", 1.000, True)
"""默认时长: 1.00s"""
竖向模糊 = TransitionMeta("竖向模糊", False, "7125661387568714247", "3796327", "cda4099e3f207ef1509f27d0b1ab01c1", 0.800, True)
"""默认时长: 0.80s"""
竖向模糊_II = TransitionMeta("竖向模糊 II", False, "7280837008421818936", "23404229", "85e381982a94778e003f3acc9527d5cf", 0.660, True)
"""默认时长: 0.66s"""
竖线 = TransitionMeta("竖线", False, "6724846536041173511", "2918077", "75019c1486b2366675d95602f58430e2", 0.500, True)
"""默认时长: 0.50s"""
箭头向右 = TransitionMeta("箭头向右", False, "6858191587554365966", "878904", "fa0cfb9e822393af86c6df4a8477cd63", 0.500, False)
"""默认时长: 0.50s"""
粒子 = TransitionMeta("粒子", False, "6855565313715474952", "4212632", "389d08f0700dd3e646a1e92289d84d58", 0.500, True)
"""默认时长: 0.50s"""
翻篇 = TransitionMeta("翻篇", False, "7034446419641504264", "4212350", "e3a2c5e0bd63416b5f64e489beb8a702", 1.300, True)
"""默认时长: 1.30s"""
翻页 = TransitionMeta("翻页", False, "6747979085894390279", "368701", "2f157ee5d78c197efc26f8ed37490573", 0.500, True)
"""默认时长: 0.50s"""
色差逆时针 = TransitionMeta("色差逆时针", False, "6940500629013926413", "1069274", "b235f0bc4c9eb6e090358c09c7b0ffb0", 1.000, False)
"""默认时长: 1.00s"""
色差顺时针 = TransitionMeta("色差顺时针", False, "6940520116035523080", "1069374", "8661a7a8b19762d35506cd6513d8ed3e", 1.000, False)
"""默认时长: 1.00s"""
色彩溶解 = TransitionMeta("色彩溶解", False, "6724846004274729480", "322583", "b5f962a334dcc141bbc3dae0f5777564", 0.500, True)
"""默认时长: 0.50s"""
色彩溶解_II = TransitionMeta("色彩溶解 II", False, "6724866927933526542", "322625", "8179e342f9b24dd1817c56f7ef1f8f9b", 1.000, True)
"""默认时长: 1.00s"""
色彩溶解_III = TransitionMeta("色彩溶解 III", False, "6724867032312975875", "322627", "293a03bd140d09b0c616f879bda235e1", 1.000, True)
"""默认时长: 1.00s"""
蓝色线条 = TransitionMeta("蓝色线条", False, "6858191605384352263", "878903", "d4d2996c3f6cf97fb8602f825d98a4da", 0.500, False)
"""默认时长: 0.50s"""
逆时针旋转 = TransitionMeta("逆时针旋转", False, "6724226603372515853", "359437", "048170ae8df06f9d6964691b1e472c6a", 0.500, True)
"""默认时长: 0.50s"""
逆时针旋转_II = TransitionMeta("逆时针旋转 II", False, "7252544659245765179", "17224251", "1b2c634ea54e81de34cb6d31848908af", 0.800, True)
"""默认时长: 0.80s"""
镜像翻转 = TransitionMeta("镜像翻转", False, "6848792278710882824", "2917288", "1109c08965141f90b9174c38e85c8cab", 1.000, False)
"""默认时长: 1.00s"""
闪白 = TransitionMeta("闪白", False, "6724845376098013708", "322575", "9732e719b858a6dbb648d4fb459fde08", 0.500, False)
"""默认时长: 0.50s"""
闪白_II = TransitionMeta("闪白 II", False, "7306818286413419017", "31619869", "9a1089fc9fefe2a79a71c37c1bc5831a", 0.300, True)
"""默认时长: 0.30s"""
闪黑 = TransitionMeta("闪黑", False, "6724239388189921806", "321493", "3bca53e9f3dfa2c184fbee96438ea097", 0.500, False)
"""默认时长: 0.50s"""
雪花故障 = TransitionMeta("雪花故障", False, "6724866446842663431", "2918079", "71cabe836d9c88afd44f43654ba67fa7", 1.000, False)
"""默认时长: 1.00s"""
雾化 = TransitionMeta("雾化", False, "7216171159589491259", "11387229", "945e1560e2c65277b4bd4127cd479746", 1.200, True)
"""默认时长: 1.20s"""
震动 = TransitionMeta("震动", False, "7198100561235808825", "9261771", "e46204ca1e4fcf76d1b1c86e852e862d", 1.000, True)
"""默认时长: 1.00s"""
顺时针旋转 = TransitionMeta("顺时针旋转", False, "6724226684721041932", "359421", "d6d0c76fb82ca2a355de138d94a94780", 0.500, True)
"""默认时长: 0.50s"""
顺时针旋转_II = TransitionMeta("顺时针旋转 II", False, "7252544556799889975", "17224317", "5e81c58bf217a2bdaf479275e412ea93", 0.800, True)
"""默认时长: 0.80s"""
频闪 = TransitionMeta("频闪", False, "7083767957662208549", "1674710", "35a76b77dd0812f7012911109db35799", 0.500, True)
"""默认时长: 0.50s"""
风车 = TransitionMeta("风车", False, "6748286529921094157", "369485", "367b8b51b2eeb63eb2009bf5b356bc2f", 0.500, True)
"""默认时长: 0.50s"""
马赛克 = TransitionMeta("马赛克", False, "6724866519022440967", "4212631", "eed93b26d9cd6296b10d2f5065ee396e", 1.000, True)
"""默认时长: 1.00s"""
黑色块 = TransitionMeta("黑色块", False, "6724866346569437710", "2918078", "357e865f3bb0c6529ee882ebf279d7c6", 0.500, True)
"""默认时长: 0.50s"""
黑色烟雾 = TransitionMeta("黑色烟雾", False, "6885647017452769805", "947663", "fa02f80c28a9671a206c2ccf17b41c58", 0.500, False)
"""默认时长: 0.50s"""
# 付费特效
_2024回忆流 = TransitionMeta("2024回忆流", True, "7448898555617481225", "97032533", "e21c31c4d68bb535ab10905af32a8486", 2.000, True)
"""默认时长: 2.00s"""
X形震闪 = TransitionMeta("X形震闪", True, "7403208545111380531", "79087478", "07f3707be8fced05b149f16252c3aabc", 1.000, True)
"""默认时长: 1.00s"""
万花筒 = TransitionMeta("万花筒", True, "7257806429086552632", "18722268", "0aa1d28fdb90725586089436e6ccd243", 0.800, True)
"""默认时长: 0.80s"""
三屏放大 = TransitionMeta("三屏放大", True, "7320254175466492467", "38586528", "b59a3df958aeeba78f1ceb075be189f0", 1.000, True)
"""默认时长: 1.00s"""
三屏滑入 = TransitionMeta("三屏滑入", True, "7312438185261273650", "34443818", "09dc4fee56acca3e6f1c104277b8695d", 1.000, True)
"""默认时长: 1.00s"""
三屏闪切 = TransitionMeta("三屏闪切", True, "7252599996254523959", "17242682", "2bc234d945f15d93f3d292e64042d69d", 0.800, True)
"""默认时长: 0.80s"""
下滑 = TransitionMeta("下滑", True, "7309694074015977993", "32998125", "9c54ccb7b27ab98f7c3bb03a5d4acc4b", 0.550, True)
"""默认时长: 0.55s"""
中心切开 = TransitionMeta("中心切开", True, "7450031574931739146", "97482739", "bd58325fc11ddc0a5b865da741d48215", 2.000, True)
"""默认时长: 2.00s"""
二次元烟效 = TransitionMeta("二次元烟效", True, "7436273714729062921", "90037010", "e4a8dcb9c3a3244f38fbafd54df1875d", 1.920, True)
"""默认时长: 1.92s"""
云朵_II = TransitionMeta("云朵 II", True, "6955760408737092132", "2912470", "5a8914a3658f88265bbeda060a7c79aa", 0.500, True)
"""默认时长: 0.50s"""
亮点模糊 = TransitionMeta("亮点模糊", True, "7123135366504124936", "3705757", "b48f47c097e83842d1c0f919d9c67af6", 1.000, True)
"""默认时长: 1.00s"""
便利贴 = TransitionMeta("便利贴", True, "7302023728441856549", "29871972", "a5a04de1e339c4d4907e26ff6b229563", 1.100, True)
"""默认时长: 1.10s"""
信号故障 = TransitionMeta("信号故障", True, "7288149307197231676", "25265947", "f23f60f3bee4fac6368268a1406ccaf7", 0.500, True)
"""默认时长: 0.50s"""
信号故障_II = TransitionMeta("信号故障 II", True, "7342791345162949183", "49094731", "b5537d48d5d72d9707bb4641d51ecc73", 0.670, False)
"""默认时长: 0.67s"""
倾斜拉伸 = TransitionMeta("倾斜拉伸", True, "7383960886131560960", "72481265", "c87e594192131b1b82e1c34cd383f807", 0.800, True)
"""默认时长: 0.80s"""
倾斜拉开 = TransitionMeta("倾斜拉开", True, "7450031573958660646", "97482745", "5e528175496005ab698956e2ae692828", 2.000, True)
"""默认时长: 2.00s"""
倾斜模糊 = TransitionMeta("倾斜模糊", True, "7355762441533264394", "56268173", "0b88f86366c21c3ebd2bcc8df140810d", 0.800, True)
"""默认时长: 0.80s"""
像素冲屏 = TransitionMeta("像素冲屏", True, "6981689835534684702", "1182216", "b7f8e6cd03560d1f52e1270dcf7c9ba4", 0.800, True)
"""默认时长: 0.80s"""
光束 = TransitionMeta("光束", True, "6982127832042312206", "4202531", "84525ee78728b5cce44c8404d9f50b0d", 0.500, True)
"""默认时长: 0.50s"""
全息投影 = TransitionMeta("全息投影", True, "7298230450768581129", "28518430", "95a2a049736e0843b5984e0090276f7b", 0.400, True)
"""默认时长: 0.40s"""
六边形变焦 = TransitionMeta("六边形变焦", True, "7182413216276812346", "7824963", "faf521d87b90c79031bfd08d687df52a", 1.000, True)
"""默认时长: 1.00s"""
冲屏扭曲 = TransitionMeta("冲屏扭曲", True, "7359133728313971227", "58099421", "2fb5734ab118c745bfa0596264533e54", 0.900, True)
"""默认时长: 0.90s"""
几何分割 = TransitionMeta("几何分割", True, "7130139199394550303", "3985085", "4f6209fcc7e8746a7c1e43d8a1704827", 0.500, True)
"""默认时长: 0.50s"""
几何滑动 = TransitionMeta("几何滑动", True, "7437386424036364837", "90546381", "954c56284f79c2d01b291802cc6449e1", 1.000, True)
"""默认时长: 1.00s"""
分屏下滑 = TransitionMeta("分屏下滑", True, "7337974537683735080", "46873416", "eb4e4368773f40a8c807e77497acab4f", 0.900, True)
"""默认时长: 0.90s"""
前后对比 = TransitionMeta("前后对比", True, "7205856572994490935", "10139297", "f38bc39938f58a4ee3f9c7bfcf4f524f", 1.200, True)
"""默认时长: 1.20s"""
剧烈摇晃 = TransitionMeta("剧烈摇晃", True, "7367356130307084838", "63047898", "4ffdc4b55688e65262a229d5e7b987ca", 0.900, True)
"""默认时长: 0.90s"""
卡片弹出 = TransitionMeta("卡片弹出", True, "7384334283659285032", "72605929", "67660fa9cdb387454a59d3a747cff6ef", 1.000, True)
"""默认时长: 1.00s"""
发光变焦 = TransitionMeta("发光变焦", True, "7402999668767986191", "79046595", "9faeac55ef029bce5e933ff4022dfe1d", 1.000, True)
"""默认时长: 1.00s"""
叠化扭曲 = TransitionMeta("叠化扭曲", True, "7439255870896083466", "92006146", "c0d00a409f16dab9ebe8a94802a3a757", 0.500, True)
"""默认时长: 0.50s"""
可爱爆炸 = TransitionMeta("可爱爆炸", True, "7187674415268631101", "8375167", "75942cf09b7e84526a357898a47c18bb", 0.800, True)
"""默认时长: 0.80s"""
可爱龙龙 = TransitionMeta("可爱龙龙", True, "7332697146929451546", "44314889", "9a498314d92e4fc192efe64608b40b60", 1.000, True)
"""默认时长: 1.00s"""
吃掉 = TransitionMeta("吃掉", True, "7372506069328728585", "66629623", "64b8f472cc109cccd9c50e210331af43", 0.900, True)
"""默认时长: 0.90s"""
后台切换 = TransitionMeta("后台切换", True, "7320129407799005734", "38530921", "c5092413343f5e808ffc27ab8b02e7c4", 0.800, True)
"""默认时长: 0.80s"""
向上波动 = TransitionMeta("向上波动", True, "7148734739807998495", "4861515", "69a520845b900b142b203cf2e677abd5", 5.000, True)
"""默认时长: 5.00s"""
向下抖动 = TransitionMeta("向下抖动", True, "7338709911791997480", "47241669", "1a44879e265bc89746e30f59d2ff0245", 1.300, True)
"""默认时长: 1.30s"""
向下拖拽 = TransitionMeta("向下拖拽", True, "7199528468244075067", "9382531", "f1d490e1e2a87013bee63a8aa4191f9f", 0.800, True)
"""默认时长: 0.80s"""
向左拉屏 = TransitionMeta("向左拉屏", True, "7089311972235153950", "1722934", "21538bc8fa278603f8e944fc405a65c9", 0.500, True)
"""默认时长: 0.50s"""
向左波动 = TransitionMeta("向左波动", True, "7126772940451877406", "3971081", "cbffe80a580575becb3beb3bcbd5cc09", 5.000, True)
"""默认时长: 5.00s"""
喜欢 = TransitionMeta("喜欢", True, "7070430644563612191", "1600478", "945ee55ddc4b7c9762b55c0ee302bdce", 0.500, True)
"""默认时长: 0.50s"""
四屏转换 = TransitionMeta("四屏转换", True, "7337612480610308649", "46644610", "e7bd3aacd0daeafdf20d93d4a171a846", 1.000, True)
"""默认时长: 1.00s"""
四格展开 = TransitionMeta("四格展开", True, "7412560964198863394", "81987893", "d204cd232ac137532ff751ff09b5d0a7", 0.500, True)
"""默认时长: 0.50s"""
回忆 = TransitionMeta("回忆", True, "6748220149284737550", "4211778", "48a73d2ca44a59d8faf88ab0c4bb39f6", 0.500, True)
"""默认时长: 0.50s"""
回忆_II = TransitionMeta("回忆 II", True, "6748220462746046989", "4211779", "bfb17d87ed3db6332a6e0855299809d9", 0.500, True)
"""默认时长: 0.50s"""
回忆拉屏 = TransitionMeta("回忆拉屏", True, "7184682990901924410", "8027945", "3bc26bcea93ea43b349c60c28bea394f", 1.000, True)
"""默认时长: 1.00s"""
回忆拉屏_II = TransitionMeta("回忆拉屏 II", True, "7306440470119322139", "31456359", "2464d4afc9c5f43072935915c6a86c29", 0.700, True)
"""默认时长: 0.70s"""
图片放大 = TransitionMeta("图片放大", True, "7434055685576348170", "89190525", "4974e799766ed1567d4e5bfafa79e14f", 1.000, True)
"""默认时长: 1.00s"""
圆形分割 = TransitionMeta("圆形分割", True, "7083435788322476581", "4211684", "2bb3ad90a4eb3a2563b87c300e0ae8a1", 1.500, False)
"""默认时长: 1.50s"""
圆盘旋转 = TransitionMeta("圆盘旋转", True, "7341334144485429810", "48516414", "835a263f9afbb614cfc5467343968642", 0.700, True)
"""默认时长: 0.70s"""
圣诞光斑 = TransitionMeta("圣诞光斑", True, "7450334536455426569", "97572058", "431fcb4417f60f17fbc7f1e8ed95c33c", 1.030, True)
"""默认时长: 1.03s"""
圣诞光斑II = TransitionMeta("圣诞光斑II", True, "7451488401062105610", "98049569", "c98322f188fcf08cfe380380da7d4e3b", 1.030, True)
"""默认时长: 1.03s"""
圣诞树 = TransitionMeta("圣诞树", True, "7302357935902954035", "29976594", "8c40262df8758d19446264aa5749008a", 0.700, True)
"""默认时长: 0.70s"""
圣诞礼盒 = TransitionMeta("圣诞礼盒", True, "7447067834628182578", "96154390", "6da15163fec7a5af3ab7a25e44f94da9", 1.500, True)
"""默认时长: 1.50s"""
复古叠影 = TransitionMeta("复古叠影", True, "7200638304591548985", "9529419", "078be6db2b8d8abded47cbd72f5635df", 1.000, True)
"""默认时长: 1.00s"""
复古放映_II = TransitionMeta("复古放映 II", True, "7240050497804046908", "14607947", "9891a08898646c3795cab650979bf0dc", 1.000, True)
"""默认时长: 1.00s"""
复古漏光 = TransitionMeta("复古漏光", True, "7181752495150993957", "8104139", "0af78adb0da721bbe253b096b8152851", 0.800, True)
"""默认时长: 0.80s"""
复古漏光_II = TransitionMeta("复古漏光 II", True, "7287881053534949943", "25193261", "1789e06f18340fbcbd30e6757f10ba75", 0.600, True)
"""默认时长: 0.60s"""
复古胶片 = TransitionMeta("复古胶片", True, "7261814111816651322", "19552395", "c5686c7e832a5e8c178c5cadb42d9ab4", 1.000, True)
"""默认时长: 1.00s"""
多层环形 = TransitionMeta("多层环形", True, "7373523970538082866", "67116644", "cf6da6be1066054f86c4524fa6494d8e", 1.500, True)
"""默认时长: 1.50s"""
多屏定格 = TransitionMeta("多屏定格", True, "7287860606395224613", "25184085", "c12aeac3828eb06fd5d0f865ee7041d1", 0.800, True)
"""默认时长: 0.80s"""
大圆盘 = TransitionMeta("大圆盘", True, "7362104359682839055", "59713023", "9d6a02b47846369cec6d19a35826570d", 0.800, True)
"""默认时长: 0.80s"""
大波浪 = TransitionMeta("大波浪", True, "7426688369653977638", "86769062", "e63143bff5e6394a018f2b802e1d832e", 0.833, True)
"""默认时长: 0.83s"""
字母拼贴 = TransitionMeta("字母拼贴", True, "7314304549575987749", "35402126", "24be4f664fcf760c00d897362194e276", 1.000, True)
"""默认时长: 1.00s"""
射灯 = TransitionMeta("射灯", True, "7368775489445433883", "63886272", "23706ad60c2258a524da320eca564d12", 1.600, True)
"""默认时长: 1.60s"""
小喇叭 = TransitionMeta("小喇叭", True, "7070430823597478407", "1600476", "3707101142d3069789f3d821cdb7bc35", 0.500, True)
"""默认时长: 0.50s"""
小恶魔 = TransitionMeta("小恶魔", True, "7075598043252265509", "1628344", "c9a87dfafa58fbc0d401fc182fbaf6fc", 1.000, True)
"""默认时长: 1.00s"""
左移弹动 = TransitionMeta("左移弹动", True, "7312690473108247078", "34525642", "fa3f7df94e7fc6a7dfaee203590aff47", 0.800, True)
"""默认时长: 0.80s"""
幻影 = TransitionMeta("幻影", True, "7218040359715082809", "11634125", "4a1a61e615eb94e37e2c198dd4602107", 0.800, True)
"""默认时长: 0.80s"""
幻觉 = TransitionMeta("幻觉", True, "7395044376621093391", "76465118", "cb9796c59a719185df8c9c5d1922b061", 1.000, True)
"""默认时长: 1.00s"""
开心 = TransitionMeta("开心", True, "7073053544839909919", "1610838", "0d80e7d2b7171236732668e91b849120", 0.500, False)
"""默认时长: 0.50s"""
弹出 = TransitionMeta("弹出", True, "7394709307842892303", "76381219", "5c7ab5f82d4253e2225b57ba734edd3a", 0.900, True)
"""默认时长: 0.90s"""
弹动发光 = TransitionMeta("弹动发光", True, "7347897562436735503", "51950360", "31bdfcfe5852df71426d22fc02293698", 0.800, True)
"""默认时长: 0.80s"""
彩色像素 = TransitionMeta("彩色像素", True, "7096015235953201701", "4212518", "d91c7ef4be8808bddec8a1a119f78da7", 0.500, False)
"""默认时长: 0.50s"""
彩色滑片 = TransitionMeta("彩色滑片", True, "7437386424036381234", "90546380", "08a7fd3434943bdd3dc0c2f6d9714989", 1.500, True)
"""默认时长: 1.50s"""
往上翻页 = TransitionMeta("往上翻页", True, "7461951141333439013", "102053853", "ef160e3ca5fdb97a5919130b278bd745", 1.040, True)
"""默认时长: 1.04s"""
微抖动 = TransitionMeta("微抖动", True, "7368739347845091877", "63860874", "9870ae40f2c8a325debc06d25ef46895", 1.500, True)
"""默认时长: 1.50s"""
心形叠化 = TransitionMeta("心形叠化", True, "7264829174601224764", "20224653", "24559e84f2cfae6bbfd86d47bb8f60f9", 1.000, True)
"""默认时长: 1.00s"""
快涂擦除 = TransitionMeta("快涂擦除", True, "7450031573954466331", "97482742", "584bed7ede0c38de9d86fb5e9199ec29", 0.500, True)
"""默认时长: 0.50s"""
快速缩放 = TransitionMeta("快速缩放", True, "7382154814144123392", "71890617", "bbedbf5ac1b865d1e1395d4d402ce5fa", 1.000, True)
"""默认时长: 1.00s"""
快速震闪 = TransitionMeta("快速震闪", True, "7403364394404418074", "79172318", "5d1d93e09913898ffd9140351d7a9224", 1.000, True)
"""默认时长: 1.00s"""
快门 = TransitionMeta("快门", True, "6882983860615778823", "2917720", "2df569fefb5004c041af5509c10d6c53", 0.500, True)
"""默认时长: 0.50s"""
惊悚屏闪 = TransitionMeta("惊悚屏闪", True, "7425528298395931187", "86397088", "7bad249a916e313a5e2f422291e9d4e9", 1.000, True)
"""默认时长: 1.00s"""
手机屏放大 = TransitionMeta("手机屏放大", True, "7447351620649620005", "96240495", "47f7a2d93348de0cc3363f8bed9e27b8", 2.000, True)
"""默认时长: 2.00s"""
扫光 = TransitionMeta("扫光", True, "7106765945305043463", "4202535", "333aa7e9d8b24e358ea60784ce47b6fe", 0.500, True)
"""默认时长: 0.50s"""
扭曲弹动 = TransitionMeta("扭曲弹动", True, "7402970650379293199", "79044291", "014956443b20f5c5e87edf79fe2aa5e3", 1.000, True)
"""默认时长: 1.00s"""
扭曲旋入 = TransitionMeta("扭曲旋入", True, "7373640088091103763", "67190756", "2f0a8143624bfc061ae9db4cb785029f", 1.000, True)
"""默认时长: 1.00s"""
扭曲溶解 = TransitionMeta("扭曲溶解", True, "7374259106502152741", "67617874", "756df14869da51538ed41e2bfac3b779", 1.000, True)
"""默认时长: 1.00s"""
扭转弹动 = TransitionMeta("扭转弹动", True, "7344986966145896994", "50231600", "e5d36f065e3f0e8801c43a625a7d9947", 1.500, True)
"""默认时长: 1.50s"""
抖动放大 = TransitionMeta("抖动放大", True, "7260415521852494397", "19272888", "e4cafc076ecab223a39a26fe6f05b6db", 0.800, True)
"""默认时长: 0.80s"""
抖动缩小 = TransitionMeta("抖动缩小", True, "7291972229087105563", "26488746", "6e78a0c97c60562573a30342882a240f", 0.700, True)
"""默认时长: 0.70s"""
抖动缩小_II = TransitionMeta("抖动缩小 II", True, "7316783851206873651", "36841926", "137d3f03fbd4dddbc6a2a0dd1f371e17", 1.000, True)
"""默认时长: 1.00s"""
折痕胶带 = TransitionMeta("折痕胶带", True, "7436273714733257225", "90037011", "949b5a139458534e713b4751f89cc366", 1.000, True)
"""默认时长: 1.00s"""
抽象前景 = TransitionMeta("抽象前景", True, "7104215831919202853", "2459634", "88b3ead3e00313684cd868d51c1173c9", 0.500, True)
"""默认时长: 0.50s"""
抽象前景_II = TransitionMeta("抽象前景 II", True, "7108564115529929229", "2870170", "b8628f4b1d6fc27447dfad6a5f25beb4", 0.500, True)
"""默认时长: 0.50s"""
拉开 = TransitionMeta("拉开", True, "7384323685026370098", "72601002", "828b81127e669508f999900bff18cf2a", 0.600, True)
"""默认时长: 0.60s"""
拉框入屏 = TransitionMeta("拉框入屏", True, "7297077423487586826", "28115429", "bfc8a51d2b304be3dd36a68331f8d0f8", 1.000, True)
"""默认时长: 1.00s"""
拍摄器_II = TransitionMeta("拍摄器 II", True, "7109727014780670495", "2958464", "5483f878a302c6d7879bd566cebab543", 0.900, True)
"""默认时长: 0.90s"""
拍摄器_III = TransitionMeta("拍摄器 III", True, "7107542030976291336", "2792048", "36c9b870a00e16365421398ac4e51652", 0.800, True)
"""默认时长: 0.80s"""
挤压分屏 = TransitionMeta("挤压分屏", True, "7435897594074632713", "89895302", "ca0072e8c95318ca9babfa5a6d699cac", 0.830, True)
"""默认时长: 0.83s"""
推近_II = TransitionMeta("推近 II", True, "7290852476259930685", "26135688", "94815943a86e741a5fec1737fbb46d60", 0.900, True)
"""默认时长: 0.90s"""
推远_II = TransitionMeta("推远 II", True, "7360987817066893862", "59043083", "0a10553e75180add06fd336bf16fa8aa", 1.000, True)
"""默认时长: 1.00s"""
摄像机 = TransitionMeta("摄像机", True, "7070047850960261668", "1598384", "bb0b9fa428e5a3fde828c03022b5082d", 0.500, True)
"""默认时长: 0.50s"""
摇晃描边 = TransitionMeta("摇晃描边", True, "7372137986877559335", "66403340", "0a5449cf1ca4c9fb473ff664ea23185b", 1.000, True)
"""默认时长: 1.00s"""
摇晃震动 = TransitionMeta("摇晃震动", True, "7343618757530489379", "49545855", "c911cc41c158afbd43636d1aa465e1d2", 1.300, True)
"""默认时长: 1.30s"""
摇镜 = TransitionMeta("摇镜", True, "7305969268259033609", "31254345", "f215c106100f76dcf6c550d0f8217ecb", 0.700, True)
"""默认时长: 0.70s"""
撕纸 = TransitionMeta("撕纸", True, "6875627914444935694", "2912468", "131ae40c737ab9f5c79e35e3639a4bad", 0.500, True)
"""默认时长: 0.50s"""
撕纸掉落 = TransitionMeta("撕纸掉落", True, "7218114518314914365", "11661051", "42fa2f7a99a392e2801ad5ec5f62d73a", 1.200, True)
"""默认时长: 1.20s"""
收缩抖动 = TransitionMeta("收缩抖动", True, "7347676775633130024", "51859926", "88939867fef0a71b39f549558d724d31", 1.000, True)
"""默认时长: 1.00s"""
放大左移 = TransitionMeta("放大左移", True, "7347582471111709236", "51784590", "a2c4ddc0f96c5694e941d738ed52cdf4", 1.300, True)
"""默认时长: 1.30s"""
放大镜 = TransitionMeta("放大镜", True, "7313974602156216858", "35244988", "91aee5fc06c85dda958101a677f19c0b", 0.700, True)
"""默认时长: 0.70s"""
故障扫描 = TransitionMeta("故障扫描", True, "7425528124013548059", "86396968", "87bd40bfa4f188fa096a161d68c35037", 1.000, True)
"""默认时长: 1.00s"""
故障模糊 = TransitionMeta("故障模糊", True, "7302270954602762789", "29927992", "fc3fae70595c7bb6f943aca08dc7b9f1", 0.700, True)
"""默认时长: 0.70s"""
数字矩阵 = TransitionMeta("数字矩阵", True, "7268870949548593725", "20983534", "f39bf079c6066cbfee7c5eca1491b276", 1.000, True)
"""默认时长: 1.00s"""
斜向模糊 = TransitionMeta("斜向模糊", True, "7125661284762128910", "3796323", "b14d9650ca6eef79d6b19c16c65166d3", 0.800, True)
"""默认时长: 0.80s"""
斜向闪光 = TransitionMeta("斜向闪光", True, "7384331194978013711", "72603864", "eba796256a96c4ff0d1b331a8819c6f2", 0.700, True)
"""默认时长: 0.70s"""
斜线翻页 = TransitionMeta("斜线翻页", True, "7339900424956154403", "47905855", "46d525166125a781ce8cf9c6e6370454", 0.700, True)
"""默认时长: 0.70s"""
新篇章 = TransitionMeta("新篇章", True, "7174756125902901797", "7089439", "74716b2d52b85799f78903818eb3c98f", 0.800, True)
"""默认时长: 0.80s"""
新篇章_II = TransitionMeta("新篇章 II", True, "7174754977544409657", "7089435", "6c1c52a50f842600c69417cf38adc113", 1.600, True)
"""默认时长: 1.60s"""
方形分割 = TransitionMeta("方形分割", True, "7127901205820346917", "3895735", "9f29e50ac72b66f4b0320ee1ea9d112f", 0.500, True)
"""默认时长: 0.50s"""
方形变焦 = TransitionMeta("方形变焦", True, "7398512469884277260", "77388758", "93317b58455482c7f5213b943a7e01ce", 1.000, True)
"""默认时长: 1.00s"""
方形模糊 = TransitionMeta("方形模糊", True, "7122721406210544164", "3686479", "8e3579bda4787d20d8c8ab1b0c68112d", 1.000, True)
"""默认时长: 1.00s"""
方形模糊_II = TransitionMeta("方形模糊 II", True, "7384005295770440201", "72501238", "301fe868bf7b1549d6d07af9405beb4a", 1.000, True)
"""默认时长: 1.00s"""
方片翻转 = TransitionMeta("方片翻转", True, "7451501266246570534", "98063100", "418d4795972e2f70533f05304e796c22", 1.100, True)
"""默认时长: 1.10s"""
旋焦 = TransitionMeta("旋焦", True, "7215424325036282428", "11286537", "917c209246e975d4f10d9b8c8c78035f", 0.500, True)
"""默认时长: 0.50s"""
旋转圆球 = TransitionMeta("旋转圆球", True, "7377722094806635048", "69481298", "34211e59f420adb42bc00b9a8d36bb6a", 0.800, True)
"""默认时长: 0.80s"""
旋转圆盘 = TransitionMeta("旋转圆盘", True, "7261828356386067005", "19556167", "792fd505220632cdca8d727ecafa9866", 1.000, True)
"""默认时长: 1.00s"""
旋转圆盘_II = TransitionMeta("旋转圆盘 II", True, "7262674749258469949", "19727008", "17d1ac181dd7b623059b8aed82d2ef13", 1.000, True)
"""默认时长: 1.00s"""
旋转快门 = TransitionMeta("旋转快门", True, "7350577049968316979", "53358879", "f2b536b7d3f17bc58e0e4957f517ece0", 1.000, True)
"""默认时长: 1.00s"""
旋转拨盘 = TransitionMeta("旋转拨盘", True, "7368844683256009242", "63924504", "88ac2494e5cdec7f874c4157555d2d2b", 1.000, True)
"""默认时长: 1.00s"""
旋转模糊 = TransitionMeta("旋转模糊", True, "7332480491058106943", "44259414", "1a28e7fbb2a177240786bd945fb9ca7e", 1.200, True)
"""默认时长: 1.20s"""
旋转穿越 = TransitionMeta("旋转穿越", True, "7343092798993732148", "49228871", "e05493559e59bf7f4c4a9ea5a5d212de", 1.800, True)
"""默认时长: 1.80s"""
旋转纵深 = TransitionMeta("旋转纵深", True, "7368687055225754153", "63822177", "e717dfe6ccb3c6a6c6a6f70987b1a894", 0.900, True)
"""默认时长: 0.90s"""
旋转翻页 = TransitionMeta("旋转翻页", True, "7320577375752688165", "38717232", "31a897fbdd402adaf84724fb28ef606b", 0.800, True)
"""默认时长: 0.80s"""
旋转震动 = TransitionMeta("旋转震动", True, "7326861725213397514", "41492871", "70bea2644a8dc8bc2b24102d8fa90ca4", 0.600, True)
"""默认时长: 0.60s"""
无缝撕裂 = TransitionMeta("无缝撕裂", True, "7439255870896083506", "92006145", "afcefb6980d7212c51229927c39c89e0", 1.500, True)
"""默认时长: 1.50s"""
无限穿越_I = TransitionMeta("无限穿越 I", True, "7036984568536109581", "1465694", "3ee3fc9318dc2315d250f0baa1763e5b", 1.600, True)
"""默认时长: 1.60s"""
无限穿越_II = TransitionMeta("无限穿越 II", True, "7034717113130422791", "1458828", "b87498756c478952cf7c804234f97bbb", 1.600, True)
"""默认时长: 1.60s"""
日历转场 = TransitionMeta("日历转场", True, "7460472998944838154", "101496138", "ca48c1fe6e5b7cdcc100469f5294820b", 2.000, True)
"""默认时长: 2.00s"""
旧胶片 = TransitionMeta("旧胶片", True, "7099310030138118687", "1933296", "782110cae96a4f9ed73f6a85d0610a7a", 0.500, False)
"""默认时长: 0.50s"""
旧胶片_II = TransitionMeta("旧胶片 II", True, "7111634884153578014", "3114014", "79901fab61f0b8c2960c73a78e84e5a3", 0.500, True)
"""默认时长: 0.50s"""
时光穿梭 = TransitionMeta("时光穿梭", True, "7306853312400200229", "31645629", "74eab27c1dc1a568b851a2e543682058", 1.100, True)
"""默认时长: 1.10s"""
星光 = TransitionMeta("星光", True, "7177201869612126777", "7339355", "2215320b9ba4138c53f1f7b9d0c58b54", 1.500, True)
"""默认时长: 1.50s"""
星光叠化 = TransitionMeta("星光叠化", True, "7321658733497422363", "39173243", "f6d691dd1f991655b2826964c3883772", 0.800, True)
"""默认时长: 0.80s"""
星光炸开 = TransitionMeta("星光炸开", True, "7306852010320466483", "31644713", "b7523d4d583c515035937de1c191c808", 1.300, True)
"""默认时长: 1.30s"""
星星_III = TransitionMeta("星星 III", True, "7293358903176204851", "26885516", "1ece838a7bfd2c8b1b0daf25d5776d22", 0.500, True)
"""默认时长: 0.50s"""
星星变焦 = TransitionMeta("星星变焦", True, "7452559875839627786", "98464024", "7eeeca7c07e67b54519995ebdf71d6fc", 1.000, True)
"""默认时长: 1.00s"""
星星吸入 = TransitionMeta("星星吸入", True, "7312716430875562506", "34540914", "6ce2a58bc6a3df532a3c1ca890c97394", 1.000, True)
"""默认时长: 1.00s"""
星星模糊 = TransitionMeta("星星模糊", True, "7206157339253019197", "10169537", "28556f2cabd470e0da1a9ddf16d76198", 0.800, True)
"""默认时长: 0.80s"""
春日光斑 = TransitionMeta("春日光斑", True, "7330599151685603875", "43351778", "16080e0cc9aa32e4342335d60dd5dfae", 1.000, True)
"""默认时长: 1.00s"""
暧昧光晕 = TransitionMeta("暧昧光晕", True, "7268613185337299513", "20954940", "ab82749d799477631ae63c081ad569d1", 0.800, True)
"""默认时长: 0.80s"""
曝光拉丝 = TransitionMeta("曝光拉丝", True, "7308617539452408358", "32432969", "56eaaf319007193c199f17554890abb4", 2.000, True)
"""默认时长: 2.00s"""
曝光摇镜 = TransitionMeta("曝光摇镜", True, "7283720497513108025", "24147753", "e0ee1d0a29d1138f7a3b673ffbad91d5", 0.700, True)
"""默认时长: 0.70s"""
未来光谱 = TransitionMeta("未来光谱", True, "7176890183940313658", "7307905", "7974c984bf60d60079cc03be5928f74d", 0.800, True)
"""默认时长: 0.80s"""
未来光谱II = TransitionMeta("未来光谱II", True, "7176914791267570232", "7312585", "524895c4bce265b44ffa8ac92bf0dd6a", 0.800, True)
"""默认时长: 0.80s"""
条形模糊 = TransitionMeta("条形模糊", True, "7122387202725646862", "3675841", "0a5742430e336b3a1e1b6ff9983c5d25", 1.000, True)
"""默认时长: 1.00s"""
模糊放大 = TransitionMeta("模糊放大", True, "7301280654015074842", "29614872", "7c0ef1a54495f7cd9343efe2acc57b26", 1.000, True)
"""默认时长: 1.00s"""
模糊细闪 = TransitionMeta("模糊细闪", True, "7452559875839627785", "98464023", "486a1593cc532d15663279bd4a127a45", 1.170, True)
"""默认时长: 1.17s"""
模糊缩小 = TransitionMeta("模糊缩小", True, "7297133348567126566", "28141206", "742e708ac73c3a335a41133684c488ed", 1.200, True)
"""默认时长: 1.20s"""
横向分屏 = TransitionMeta("横向分屏", True, "7351341191184519699", "53798168", "9b32def73cc4e91d29a92bd640a92e81", 1.000, True)
"""默认时长: 1.00s"""
横向滑动 = TransitionMeta("横向滑动", True, "7433711910727455242", "89071753", "9023b03b64ddd87133a3ed36e60d14a1", 1.530, True)
"""默认时长: 1.53s"""
横向震动 = TransitionMeta("横向震动", True, "7403329110597964340", "79166394", "c3c9b35342f9cc1daa938cb512a71baa", 1.000, True)
"""默认时长: 1.00s"""
横条挤压 = TransitionMeta("横条挤压", True, "7369507828668568116", "64687184", "6bbc30d59ef4fd16e4ba6656129cfd95", 1.200, True)
"""默认时长: 1.20s"""
横移模糊 = TransitionMeta("横移模糊", True, "7316901787762430491", "36950128", "aa2ce5c9b13a62881d04f9c23aa30678", 0.800, True)
"""默认时长: 0.80s"""
樱花飞舞 = TransitionMeta("樱花飞舞", True, "7462198817211814426", "102144538", "ecd91f7ebaa7817d7eab538a50147fb4", 2.000, True)
"""默认时长: 2.00s"""
水滴 = TransitionMeta("水滴", True, "7218875183413596730", "11765299", "d5fa6a1daecd2c45b0414626a69e7674", 0.500, True)
"""默认时长: 0.50s"""
水滴_II = TransitionMeta("水滴 II", True, "7231860840452854332", "13482623", "eebf40246476d57ccbf8bbdf15864864", 0.900, True)
"""默认时长: 0.90s"""
水滴_III = TransitionMeta("水滴 III", True, "7337571999885038130", "46608908", "32eea5171000b838f2eb74941fb751d7", 1.100, True)
"""默认时长: 1.10s"""
水滴溶解 = TransitionMeta("水滴溶解", True, "7397337004507140646", "77055389", "ea2d35628f0f6cbc703f7632fbc0588e", 1.000, True)
"""默认时长: 1.00s"""
汇聚 = TransitionMeta("汇聚", True, "7308666709932511753", "32470148", "3bb1668888e7e87764d03b15733370fb", 1.000, True)
"""默认时长: 1.00s"""
泡泡模糊 = TransitionMeta("泡泡模糊", True, "7159097688955294222", "5663559", "10478b300821fa6eccadf67b07b63208", 1.000, True)
"""默认时长: 1.00s"""
波光粼粼 = TransitionMeta("波光粼粼", True, "7361758664182469157", "59511491", "da913924bc6975821de103b371d540ff", 1.167, True)
"""默认时长: 1.17s"""
波动 = TransitionMeta("波动", True, "7169480114860724773", "6500749", "af314da6343d025cc0f5d668d2fa0a7b", 0.500, True)
"""默认时长: 0.50s"""
波动_II = TransitionMeta("波动 II", True, "7308652550574576138", "32459394", "dd709d2dd83add664f3cbd45893438f7", 0.400, True)
"""默认时长: 0.40s"""
波动故障 = TransitionMeta("波动故障", True, "7223312837320380983", "12349835", "bd7d819531a9d2b044f823080aa0fc1c", 0.600, True)
"""默认时长: 0.60s"""
泼墨晕染 = TransitionMeta("泼墨晕染", True, "7424057373741814298", "85924530", "7b36ddff84bae2afa85432cb5fdac1f4", 0.700, True)
"""默认时长: 0.70s"""
流光 = TransitionMeta("流光", True, "7316789832833831461", "36847370", "686a5ae873f34ac400ee8ad6a8658d68", 1.000, True)
"""默认时长: 1.00s"""
涂鸦放大 = TransitionMeta("涂鸦放大", True, "7239925851335168569", "14573363", "2a29109cf3c013e6f7770a28cba4154a", 1.500, True)
"""默认时长: 1.50s"""
溶解推进 = TransitionMeta("溶解推进", True, "7348406367394206271", "52246665", "e6c9fda251c612d8cdf69ddef055e410", 0.806, True)
"""默认时长: 0.81s"""
滑动压迫感 = TransitionMeta("滑动压迫感", True, "7447351620641231387", "96240496", "dd49d44cfd3e5f5b14e3275876fcc79c", 2.000, True)
"""默认时长: 2.00s"""
滑动弹出 = TransitionMeta("滑动弹出", True, "7343237606043292200", "49343171", "bb190e71a692bc20d9060b22b4311896", 1.000, True)
"""默认时长: 1.00s"""
滑动放大 = TransitionMeta("滑动放大", True, "7327132595190239759", "41576555", "a746b6b7c2e83275d90864d0b28173aa", 1.000, True)
"""默认时长: 1.00s"""
滑块拼贴 = TransitionMeta("滑块拼贴", True, "7239990715307004477", "14594823", "c8552ba32a7e8804013a8a1b977e23c1", 1.500, True)
"""默认时长: 1.50s"""
滚动立方 = TransitionMeta("滚动立方", True, "7471167302029808138", "105115378", "376cd96ec36e56b7ea5b921f402fa7f3", 0.733, True)
"""默认时长: 0.73s"""
漩涡扭曲 = TransitionMeta("漩涡扭曲", True, "7308653984888132123", "32460372", "fedeb478c6e4d39282dfe1ad13ee653a", 0.700, True)
"""默认时长: 0.70s"""
漫画撕纸 = TransitionMeta("漫画撕纸", True, "7429283264424055305", "87580719", "ac08c5a486921431e4bb175cc9b31432", 0.800, True)
"""默认时长: 0.80s"""
火焰湍流 = TransitionMeta("火焰湍流", True, "7397337005375361562", "77055404", "133e52c43b2639f2a202b3b1394846bf", 1.000, True)
"""默认时长: 1.00s"""
炫光 = TransitionMeta("炫光", True, "6726707814028284423", "4202524", "a3fd6266c293496fd9480884a93fb90e", 0.500, True)
"""默认时长: 0.50s"""
炫光_II = TransitionMeta("炫光 II", True, "6950255790762496548", "4202530", "aafb556352016d087cddd1939ada20f8", 0.500, False)
"""默认时长: 0.50s"""
炫光_III = TransitionMeta("炫光 III", True, "6950255930160189988", "4202529", "5ed29701053e9f7640ecf8dcfc34c7cc", 0.500, False)
"""默认时长: 0.50s"""
炫光弹动 = TransitionMeta("炫光弹动", True, "7348337133838406194", "52201950", "113a7490b314d57a7dea4826e056ff99", 1.000, True)
"""默认时长: 1.00s"""
炫光扫描 = TransitionMeta("炫光扫描", True, "7371717412736995903", "66131585", "4bd676f9001765af20ac02b252da5575", 1.467, True)
"""默认时长: 1.47s"""
炫光扭动 = TransitionMeta("炫光扭动", True, "7435897594703778330", "89895303", "a1fef85b1aaae8625494711a77ac1903", 0.700, True)
"""默认时长: 0.70s"""
炸弹 = TransitionMeta("炸弹", True, "7076321483282190878", "1632990", "e0a1a6b556395c054ce97d73b6d1ef25", 0.500, True)
"""默认时长: 0.50s"""
烟花光斑 = TransitionMeta("烟花光斑", True, "7449596462670811686", "97260760", "e7db0e4df4fad1aeb19413ebdb8e940d", 2.000, True)
"""默认时长: 2.00s"""
烟雾弹 = TransitionMeta("烟雾弹", True, "7366189026677625359", "62284094", "58dced44162cefabdc709058b7583d65", 1.400, True)
"""默认时长: 1.40s"""
热成像 = TransitionMeta("热成像", True, "7435897594074632742", "89895304", "ed973037edcf37c1c8272776af27ef7b", 1.000, True)
"""默认时长: 1.00s"""
燃烧 = TransitionMeta("燃烧", True, "7089309494550729253", "1722848", "0f42e514001c30186e1c9c68e1ebfee9", 0.500, True)
"""默认时长: 0.50s"""
燃烧_II = TransitionMeta("燃烧 II", True, "7089307363806548510", "1722824", "164c1073bde892dcd9f21d8026fb3cbd", 0.500, True)
"""默认时长: 0.50s"""
燃烧_III = TransitionMeta("燃烧 III", True, "7088523814102897188", "1714536", "da10f2f4ae0aa70ad4d61b2c750aef6b", 0.500, True)
"""默认时长: 0.50s"""
爆米花 = TransitionMeta("爆米花", True, "7075173004560306724", "1623902", "3b70ab38b467c15d463b018b05a420e2", 0.500, True)
"""默认时长: 0.50s"""
爆闪 = TransitionMeta("爆闪", True, "7255132261584998969", "18010162", "c533ae1fe681ec0903b6d631fec5caf6", 1.000, True)
"""默认时长: 1.00s"""
爆闪_II = TransitionMeta("爆闪 II", True, "7259635767096382011", "19102212", "96e672a98b09ef157224e8b1399ae316", 0.600, True)
"""默认时长: 0.60s"""
爱心冲击 = TransitionMeta("爱心冲击", True, "7405941767867994624", "80045036", "b9cc7fee0ef181378b070ddd3b96c08f", 1.500, True)
"""默认时长: 1.50s"""
爱心模糊 = TransitionMeta("爱心模糊", True, "7226945634312393274", "12851969", "3dfdf5cbfe44b5271b9e41acb15ddc37", 0.600, True)
"""默认时长: 0.60s"""
爱心气球 = TransitionMeta("爱心气球", True, "7267895649599754808", "20810100", "6b969705ffc616c0ad03c1e0fc039bd7", 1.000, True)
"""默认时长: 1.00s"""
爱心软糖 = TransitionMeta("爱心软糖", True, "7330845783006122515", "43363938", "ef23b64fbbf32418248446c9f4703589", 1.500, True)
"""默认时长: 1.50s"""
爱心遮罩 = TransitionMeta("爱心遮罩", True, "7468589287299093029", "104143934", "c4e6d4a6c68554cc17b620d2ffa8c41e", 2.000, True)
"""默认时长: 2.00s"""
环回推近 = TransitionMeta("环回推近", True, "7449266731089924658", "97152408", "3ad22aeec6b193f1d3718330bafdb4ac", 1.533, True)
"""默认时长: 1.53s"""
环形色散 = TransitionMeta("环形色散", True, "7384745397022888488", "72761824", "608a4f0f4729821ff115f72bfb57a909", 0.900, True)
"""默认时长: 0.90s"""
玻璃破碎 = TransitionMeta("玻璃破碎", True, "7242225450628420133", "14930013", "55aa86f7d52f2e3471574b51aedfffe8", 1.000, True)
"""默认时长: 1.00s"""
玻璃破碎_II = TransitionMeta("玻璃破碎 II", True, "7249622034878042661", "16373363", "f77fe839adb1ca6cddc086834a514b79", 1.000, True)
"""默认时长: 1.00s"""
珠光模糊 = TransitionMeta("珠光模糊", True, "7181370814594290234", "7738323", "75984d0cab40abfd59ec5d7ede711496", 1.000, True)
"""默认时长: 1.00s"""
生气 = TransitionMeta("生气", True, "7070430937900651016", "1600475", "be7a4f8a24aafb10db343e51e72fead2", 0.500, False)
"""默认时长: 0.50s"""
电光 = TransitionMeta("电光", True, "7186953120490983997", "8298317", "6142261f8bd0361a56d15a3d408c20ab", 1.000, True)
"""默认时长: 1.00s"""
电光_II = TransitionMeta("电光 II", True, "7292990637350064690", "26773684", "e8a9edb89dae57afad5dfd6b707a6b57", 1.300, True)
"""默认时长: 1.30s"""
电流 = TransitionMeta("电流", True, "7402545346741539365", "78884363", "435f3111d5b73043c9da4fb52bc1c5aa", 1.167, True)
"""默认时长: 1.17s"""
畸变回弹 = TransitionMeta("畸变回弹", True, "7434746460186350130", "89406897", "3b87acb614610bef693ceeb28833378b", 2.000, True)
"""默认时长: 2.00s"""
百叶窗_II = TransitionMeta("百叶窗 II", True, "7389190159989740072", "74345085", "0786c1d4057bf47fbdb5f6bfeab8a0f3", 0.800, True)
"""默认时长: 0.80s"""
相机缩小 = TransitionMeta("相机缩小", True, "7462628239286997531", "102354878", "5a4bcb0da1b9aa3a412230ecf4009cf2", 2.000, True)
"""默认时长: 2.00s"""
相片切换 = TransitionMeta("相片切换", True, "7324946677305971226", "40583461", "0bcab7309cd00dc17a95071b62282d0a", 0.700, True)
"""默认时长: 0.70s"""
相片拼贴 = TransitionMeta("相片拼贴", True, "7212523710685647420", "10917367", "bdff0041ed99b812568c15e5a7c5d798", 0.600, True)
"""默认时长: 0.60s"""
礼物落下 = TransitionMeta("礼物落下", True, "7462627865197023782", "102354705", "bc569b8205db8dad3eb195df697dfda8", 2.000, True)
"""默认时长: 2.00s"""
空间上移 = TransitionMeta("空间上移", True, "7405560276180800009", "79942985", "7043746b8dd5592ffa7e5e8baec3e504", 0.500, True)
"""默认时长: 0.50s"""
空间弹动 = TransitionMeta("空间弹动", True, "7265321906830578235", "20330329", "e86c774726c177ee17fd90f63750cf78", 1.000, False)
"""默认时长: 1.00s"""
空间弹动_II = TransitionMeta("空间弹动 II", True, "7269664953584325179", "21121644", "adf0c9abb5c1399909318bb603f28ad1", 1.000, False)
"""默认时长: 1.00s"""
空间弹动_III = TransitionMeta("空间弹动 III", True, "7265322078276948535", "20330339", "d8c4ad960be7cfbe8093fa26076ce000", 1.000, False)
"""默认时长: 1.00s"""
空间弹动_IV = TransitionMeta("空间弹动 IV", True, "7270393974517404215", "21261060", "fb42b8f0a30fe4a0c81c292460aabdbd", 1.000, False)
"""默认时长: 1.00s"""
空间旋转 = TransitionMeta("空间旋转", True, "7127563142359421471", "3878325", "07c37c8bcf40b83415aa6f223de2cd8a", 1.000, True)
"""默认时长: 1.00s"""
空间旋转_II = TransitionMeta("空间旋转 II", True, "7137983390896099871", "4360464", "43927ed137278ab2c3cf8a4933cb4169", 1.000, True)
"""默认时长: 1.00s"""
空间旋转_III = TransitionMeta("空间旋转 III", True, "7138602593751667207", "4382158", "7baa76e42959ee273c278389d359fc59", 1.000, True)
"""默认时长: 1.00s"""
空间翻转 = TransitionMeta("空间翻转", True, "7218870491400901157", "11764147", "0ea4c7c316341196f21440967330f063", 1.200, True)
"""默认时长: 1.20s"""
空间翻转_II = TransitionMeta("空间翻转 II", True, "7223591053973000761", "12371701", "ee9309f01cc53522243198c4ba69ab96", 1.200, True)
"""默认时长: 1.20s"""
空间跳跃 = TransitionMeta("空间跳跃", True, "7309399317662405146", "32858947", "82c5ef6e77c7178c7ca45d8549b87578", 0.633, True)
"""默认时长: 0.63s"""
穿越 = TransitionMeta("穿越", True, "7152422191944962567", "5083535", "80fb974789637e8175557c7c3e649c0e", 1.000, True)
"""默认时长: 1.00s"""
穿越_II = TransitionMeta("穿越 II", True, "7152354215132664357", "5076093", "aa3181f829fe16f72540cc0ec7dfb171", 1.000, True)
"""默认时长: 1.00s"""
穿越_III = TransitionMeta("穿越 III", True, "7341295618863665690", "48498880", "6d6fa95fe1414d4b4a45db9ddec0ee9b", 0.800, True)
"""默认时长: 0.80s"""
立体旋转 = TransitionMeta("立体旋转", True, "7397337004511334962", "77055394", "dc1ea47698728162001d4f8ee1f22a80", 1.000, True)
"""默认时长: 1.00s"""
立体翻转 = TransitionMeta("立体翻转", True, "7353088031705797159", "54820217", "3746e458c37ab10f2aaa1ac83dee99f6", 0.800, True)
"""默认时长: 0.80s"""
立体翻页 = TransitionMeta("立体翻页", True, "7156512800867619335", "5379189", "ac010354774404d6b8e092120ab76772", 0.800, True)
"""默认时长: 0.80s"""
立体翻页_II = TransitionMeta("立体翻页 II", True, "7156527319274754568", "5381749", "a033fe7038252ba812a4377ff3326acf", 0.800, True)
"""默认时长: 0.80s"""
立方旋转 = TransitionMeta("立方旋转", True, "7400668689411871251", "78218811", "31c50d0386413970443a6b592b201fd5", 1.000, True)
"""默认时长: 1.00s"""
竖向拉伸 = TransitionMeta("竖向拉伸", True, "7384005384349946418", "72501228", "ac2563343aceb1b399c6b97b2b21f567", 1.000, True)
"""默认时长: 1.00s"""
竖移模糊 = TransitionMeta("竖移模糊", True, "7270505237935297085", "21300860", "4f77c735f448ec5f6df27f21d88e4ee6", 0.600, True)
"""默认时长: 0.60s"""
笔迹涂抹 = TransitionMeta("笔迹涂抹", True, "7435897594078843419", "89895305", "0de59ee84b2fc1195497ade8dea6d5ed", 2.000, True)
"""默认时长: 2.00s"""
粉色反转片 = TransitionMeta("粉色反转片", True, "7200360240393491000", "9504701", "80529c6e270d25d9fa6e4babb45346c7", 0.800, True)
"""默认时长: 0.80s"""
红包雨 = TransitionMeta("红包雨", True, "7321942209752732186", "39261991", "3a4c80e1aebeea0ebf65d4d4fee96481", 1.500, True)
"""默认时长: 1.50s"""
纵向滑动 = TransitionMeta("纵向滑动", True, "7433711910727455259", "89071754", "9359f18a23d5ebfafc54489696912f2b", 1.330, True)
"""默认时长: 1.33s"""
纸团 = TransitionMeta("纸团", True, "7238905266912105019", "14451527", "283ecb29f26d13d371658f0b8b476776", 0.700, True)
"""默认时长: 0.70s"""
翻书转场 = TransitionMeta("翻书转场", True, "7440002160588231194", "92891048", "5fa1b17f1b45a942f90b13486fef2211", 1.600, True)
"""默认时长: 1.60s"""
翻转冲屏 = TransitionMeta("翻转冲屏", True, "7275914638267519525", "22253379", "c1ebaab317335c387d342a3d0b42a65b", 1.200, True)
"""默认时长: 1.20s"""
翻页_II = TransitionMeta("翻页 II", True, "7221478593803588152", "12108759", "7720214c69eaa3203c3edda2027b28d4", 0.900, True)
"""默认时长: 0.90s"""
聚光灯 = TransitionMeta("聚光灯", True, "7325700559556579878", "40923539", "43853a772e195442e07760b04fb236dd", 1.100, True)
"""默认时长: 1.10s"""
胶卷滑动 = TransitionMeta("胶卷滑动", True, "7437386424032170547", "90546382", "ebbf5882c3c8bcaec96da67a69dbb9b4", 2.000, True)
"""默认时长: 2.00s"""
胶片切闪 = TransitionMeta("胶片切闪", True, "7468603557348905510", "104151439", "a4efe5e3a9fd8ce07b1760f5e998acc4", 1.330, True)
"""默认时长: 1.33s"""
胶片定格 = TransitionMeta("胶片定格", True, "7211146962513433147", "10764691", "1a96476b4a04acd24a1b5a7f293fc2eb", 1.000, True)
"""默认时长: 1.00s"""
胶片擦除 = TransitionMeta("胶片擦除", True, "7308265370480022026", "32274061", "4bbb3dcb507832529d7a18020c8fc88d", 0.800, True)
"""默认时长: 0.80s"""
胶片融化 = TransitionMeta("胶片融化", True, "7346474643827462667", "51067351", "563d0dfa49528bb59646384d8a18552a", 0.700, True)
"""默认时长: 0.70s"""
胶片闪光 = TransitionMeta("胶片闪光", True, "7356486482271408666", "56656394", "d3eb0fe7d4088694cc0f9ca02cad07b2", 1.000, True)
"""默认时长: 1.00s"""
色块故障 = TransitionMeta("色块故障", True, "7104539089629614606", "2483334", "1f60c6b995a4cf2212dfd9038f738706", 3.000, False)
"""默认时长: 3.00s"""
色差故障 = TransitionMeta("色差故障", True, "6724239785205961228", "2918075", "9de90519d59e432b81c38423aa0393d7", 1.000, False)
"""默认时长: 1.00s"""
色彩溶解_IV = TransitionMeta("色彩溶解 IV", True, "7171714374912971271", "6736571", "a113cd4e04b969f3d988d76899885d42", 0.800, True)
"""默认时长: 0.80s"""
色彩溶解_V = TransitionMeta("色彩溶解 V", True, "7171714652248740365", "6736575", "da37129b95501377039f01acfded91fc", 0.800, True)
"""默认时长: 0.80s"""
色彩负片 = TransitionMeta("色彩负片", True, "7438535170317095451", "91077958", "c33d27f49534075f9076aa97ad06351f", 2.000, True)
"""默认时长: 2.00s"""
色散晃镜 = TransitionMeta("色散晃镜", True, "7340477409478578738", "48127374", "554ea6d10cd7fbb24ccd24bd91d8c7e1", 0.600, True)
"""默认时长: 0.60s"""
色散波纹 = TransitionMeta("色散波纹", True, "7385028833356812840", "72834771", "b56e5f23bd777160a81809df42933b8f", 1.000, True)
"""默认时长: 1.00s"""
色散漩涡 = TransitionMeta("色散漩涡", True, "7402904919188967963", "79026278", "15a84ee616e08311c77dffe269288c63", 0.800, True)
"""默认时长: 0.80s"""
色散闪烁 = TransitionMeta("色散闪烁", True, "7234416277974946365", "13830295", "2d9f72076aeefe8f52dfd1a012cd5127", 0.800, True)
"""默认时长: 0.80s"""
色散闪烁_II = TransitionMeta("色散闪烁 II", True, "7281584246882308665", "23586159", "5f501bb3da1bcbd2ffadca8b916eba81", 0.700, True)
"""默认时长: 0.70s"""
草图转场 = TransitionMeta("草图转场", True, "7439255870891889162", "92006144", "fba0166dc7c61408454dc5e60071dda7", 1.000, True)
"""默认时长: 1.00s"""
荧光爆闪 = TransitionMeta("荧光爆闪", True, "7342499359503684150", "48938221", "a2d70591b5f8dcc52298426ca626c931", 0.800, True)
"""默认时长: 0.80s"""
菱格翻转 = TransitionMeta("菱格翻转", True, "6983867136510792206", "1187052", "99c0d1524575c7f7020cd77d36a6b008", 1.450, True)
"""默认时长: 1.45s"""
蓝光扫描 = TransitionMeta("蓝光扫描", True, "7275176500381356599", "22119723", "95462badbbb87bd7dc4e1d7b04e58306", 1.000, True)
"""默认时长: 1.00s"""
蓝色反转片 = TransitionMeta("蓝色反转片", True, "7200358812316865085", "9504705", "41e718fd6dbac560c6c7a23afc66e50b", 0.800, True)
"""默认时长: 0.80s"""
虹光旋入 = TransitionMeta("虹光旋入", True, "7401039727761035815", "78355265", "59aaa373c4205aadd62cae40f80df9b5", 1.000, True)
"""默认时长: 1.00s"""
融化 = TransitionMeta("融化", True, "7198096122970116663", "9261283", "a0db335169668ca09f5244aa487730c0", 1.000, True)
"""默认时长: 1.00s"""
融化_II = TransitionMeta("融化 II", True, "7200339965442527803", "9503051", "74a83d45bdccf5d27bd4b55ddd2733f3", 1.000, True)
"""默认时长: 1.00s"""
课本转场 = TransitionMeta("课本转场", True, "7440040705499599411", "92924027", "98a03de05f89c064dc28e31ddf3690ad", 1.600, True)
"""默认时长: 1.60s"""
负片下滑 = TransitionMeta("负片下滑", True, "7302412902181376539", "29999964", "e2db0036d057c27aea3460f3442aedf9", 0.600, True)
"""默认时长: 0.60s"""
赛博马赛克 = TransitionMeta("赛博马赛克", True, "7450031573962854963", "97482741", "b6858b185f28ea0995283665badf7a5a", 2.000, True)
"""默认时长: 2.00s"""
超赞 = TransitionMeta("超赞", True, "7070430749547041293", "1600477", "e0bd13b237d73eb121473c442c752a23", 0.500, True)
"""默认时长: 0.50s"""
边框切换 = TransitionMeta("边框切换", True, "7434412782285509157", "89307364", "0c5440042359e1d8affab2b2631c23f8", 2.000, True)
"""默认时长: 2.00s"""
运镜压缩 = TransitionMeta("运镜压缩", True, "7447351621266182665", "96240499", "43f8c66c156a4bc8cf48809a908c8f14", 2.000, True)
"""默认时长: 2.00s"""
迷幻波纹 = TransitionMeta("迷幻波纹", True, "7441523705835950619", "93683056", "45b2ac1b9cea1a001a43e673151d1e34", 1.000, True)
"""默认时长: 1.00s"""
迷幻频闪 = TransitionMeta("迷幻频闪", True, "7436273714733257242", "90037012", "74e7013b196e25699e436052c3a3a39f", 1.000, True)
"""默认时长: 1.00s"""
透镜故障 = TransitionMeta("透镜故障", True, "7097849004062413343", "1889546", "bc652327bcde0e6bf9db8a89d371dd05", 0.500, True)
"""默认时长: 0.50s"""
重叠上滑 = TransitionMeta("重叠上滑", True, "7232587870672785980", "13582109", "aea42365eeb8cd0df3e4e422cde45e8a", 1.200, True)
"""默认时长: 1.20s"""
金币祝福 = TransitionMeta("金币祝福", True, "7326856503963423282", "41488441", "64d858d0716bb9fc9f5b4497afab8206", 1.500, True)
"""默认时长: 1.50s"""
金沙 = TransitionMeta("金沙", True, "7439681605804757541", "92634974", "21a5ca5fc6862b1baa4813f2c0ff294d", 1.740, True)
"""默认时长: 1.74s"""
金色光斑 = TransitionMeta("金色光斑", True, "7317211103652483621", "37131315", "f9224f91ef353fefa3bae96af26a447e", 0.800, True)
"""默认时长: 0.80s"""
钱兔无量 = TransitionMeta("钱兔无量", True, "7189608212193088060", "8605167", "a6c068f7790c563231b8df2b5796d60c", 1.500, True)
"""默认时长: 1.50s"""
镜头速移 = TransitionMeta("镜头速移", True, "7418201851507511849", "83974069", "30be83d2e7ed1f2f1fe74b9cfe51c206", 0.567, True)
"""默认时长: 0.57s"""
长曝光 = TransitionMeta("长曝光", True, "7306435255286633010", "31452163", "c239e26c5f99cf83cabd28f63d04b93f", 1.000, True)
"""默认时长: 1.00s"""
闪光灯 = TransitionMeta("闪光灯", True, "6986584807543149063", "4202532", "9abfb7452d046a1dafd4d9525b58ec3a", 1.000, True)
"""默认时长: 1.00s"""
闪光灯_II = TransitionMeta("闪光灯 II", True, "7244074212158083641", "15250161", "1fcc7fccf7829d94f2747938fcb84706", 1.900, True)
"""默认时长: 1.90s"""
闪光灯_III = TransitionMeta("闪光灯 III", True, "7246234663755190839", "15638113", "5af30d0f877301d5235b925ccbda0703", 0.800, True)
"""默认时长: 0.80s"""
闪动光斑 = TransitionMeta("闪动光斑", True, "6777178510050988551", "4202525", "06560e9ea51f532b18b7e5ae23bd2b9c", 0.500, False)
"""默认时长: 0.50s"""
闪动光斑_II = TransitionMeta("闪动光斑 II", True, "7148374073716773407", "4840333", "ffeb2bd8b46b0a212c1fbf004aeac626", 1.000, True)
"""默认时长: 1.00s"""
闪回 = TransitionMeta("闪回", True, "7250427149318885945", "16638473", "0a22de17ce5c2fd97f2bd77aa115de77", 0.200, True)
"""默认时长: 0.20s"""
闪屏故障 = TransitionMeta("闪屏故障", True, "7348352782744687130", "52211013", "a76337e1d1e2301f5d13fd7c90c41282", 1.000, True)
"""默认时长: 1.00s"""
闪黑_II = TransitionMeta("闪黑 II", True, "7264932863613604412", "20257185", "1ecd9bf4057919c5aa78002f97e715de", 0.600, True)
"""默认时长: 0.60s"""
闹钟 = TransitionMeta("闹钟", True, "7074854214479909390", "1621980", "eabbd46c7d68fe93406dd55d4178a574", 0.500, False)
"""默认时长: 0.50s"""
雨刷转场 = TransitionMeta("雨刷转场", True, "7447351621249405477", "96240497", "2fc9fdbde5b730255e5ffd39c610d735", 2.000, True)
"""默认时长: 2.00s"""
雪花叠化 = TransitionMeta("雪花叠化", True, "7447044441472242185", "96135908", "e30717b01c4d6ace8c1071a5b7537c0d", 3.000, True)
"""默认时长: 3.00s"""
雪花四散 = TransitionMeta("雪花四散", True, "7445177785405936165", "95320371", "3982224ea3c1b93e9d6aab2f3039dc78", 2.000, True)
"""默认时长: 2.00s"""
雪花环绕 = TransitionMeta("雪花环绕", True, "7445177785397547547", "95320370", "b6b74d907b71741dab39e489ce7ec387", 2.000, True)
"""默认时长: 2.00s"""
雪雾 = TransitionMeta("雪雾", True, "7309372378096603699", "32838061", "776c40711e9f0f6f32570bc12ea50f91", 1.700, True)
"""默认时长: 1.70s"""
震动_II = TransitionMeta("震动 II", True, "7195815265337086520", "9041507", "f5685f90de96d6541417f0331f84de8a", 1.000, True)
"""默认时长: 1.00s"""
震动缩小 = TransitionMeta("震动缩小", True, "7339865466506056207", "47887388", "3cb961ebfd78ef43742e78bca2d04d06", 1.100, True)
"""默认时长: 1.10s"""
霓虹闪光 = TransitionMeta("霓虹闪光", True, "7337938801882305074", "46839548", "60cee393e1ddf8c117ca6856e474d47d", 0.600, True)
"""默认时长: 0.60s"""
霓虹闪光_II = TransitionMeta("霓虹闪光 II", True, "7337946710041170470", "46846588", "b87a9bf7d6c8e93cc9873ccb47ffc4d0", 0.500, True)
"""默认时长: 0.50s"""
顺时针三角 = TransitionMeta("顺时针三角", True, "7450031573962854939", "97482743", "d02963275288ab14e24791ad2c0edd78", 1.500, True)
"""默认时长: 1.50s"""
飘雪 = TransitionMeta("飘雪", True, "7169510140138230285", "6506905", "b373d6de281f9cc9cec4b52b0f498517", 2.000, True)
"""默认时长: 2.00s"""
飘雪_II = TransitionMeta("飘雪 II", True, "7170983464416580133", "6658449", "f6e6d83024f30ae2ecf739e15e98813a", 2.000, True)
"""默认时长: 2.00s"""
马赛克_II = TransitionMeta("马赛克 II", True, "7322278354579624486", "39369063", "c2c4fdb0da65e27a073eaba6fcf8dd2a", 0.800, True)
"""默认时长: 0.80s"""
马赛克III = TransitionMeta("马赛克III", True, "7397337004502946314", "77055400", "38bcfd99a2076493d72e2544eeb95811", 1.000, True)
"""默认时长: 1.00s"""
鱼眼 = TransitionMeta("鱼眼", True, "7158359902950265352", "5508285", "0319d3f53fd0e79e7e7165f27d7eb9bb", 0.800, True)
"""默认时长: 0.80s"""
鱼眼_II = TransitionMeta("鱼眼 II", True, "7152723523721499167", "5096381", "6705e7c01ad8518db1428a34b1357d8f", 0.800, True)
"""默认时长: 0.80s"""
鱼眼_III = TransitionMeta("鱼眼 III", True, "7270399429297836605", "21261750", "cdaf9cd4712f5f8061110dfed13738fd", 1.333, True)
"""默认时长: 1.33s"""
鱼眼波纹 = TransitionMeta("鱼眼波纹", True, "7433711910731649563", "89071756", "f6d9afd9764c5fc849db3ca346d81997", 0.600, True)
"""默认时长: 0.60s"""
鸿运四叶草 = TransitionMeta("鸿运四叶草", True, "7460402504589644326", "101453156", "107619867b318820747866cf632d2dee", 2.000, True)
"""默认时长: 2.00s"""
黑板擦除 = TransitionMeta("黑板擦除", True, "7433711910723260979", "89071755", "783cfcdc22f1067cd50142b6731f0b92", 2.000, True)
"""默认时长: 2.00s"""
黑白摇镜 = TransitionMeta("黑白摇镜", True, "7306819191724577331", "31620427", "cc6bea0aa49c6824aa42d0448d6d0080", 0.700, True)
"""默认时长: 0.70s"""
黑色反转片 = TransitionMeta("黑色反转片", True, "7202075814085530149", "9683173", "8e31bcdedda0fe123ad1a71a967ecaa1", 0.800, True)
"""默认时长: 0.80s"""
================================================
FILE: src/pyJianYingDraft/metadata/video_character_effect.py
================================================
"""视频人物特效元数据"""
from .effect_meta import EffectEnum
from .effect_meta import EffectMeta, EffectParam
class VideoCharacterEffectType(EffectEnum):
"""视频人物特效枚举"""
# 免费特效
BOOM = EffectMeta("BOOM!", False, "6999560597230588429", "1378605", "a7d5d3fbae39950e51bff93b92ad7792", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
X = EffectMeta("X", False, "7037006820749087246", "1464226", "ec38784544361583ed45aa333ebdf2c9", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
crash = EffectMeta("crash!", False, "6999887184018805285", "1378609", "47b6f315a86918e23d94d35c69946fe1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
中刀 = EffectMeta("中刀", False, "7029514054179754510", "1436386", "ad3377fb7ed70663017b8f4dcecc8441", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
主体冲破屏幕 = EffectMeta("主体冲破屏幕", False, "7390265515056304681", "74731169", "f36c6922e91c3036495591591aba39d9", [])
九尾狐 = EffectMeta("九尾狐", False, "7011416501160776228", "1404740", "12afdb69b18ec5127874f04d6f3fdefd", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
人影爆闪 = EffectMeta("人影爆闪", False, "7260741462269104697", "19799492", "f307677e792d2970045b653267fca93b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认45%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%"""
光环_I = EffectMeta("光环 I", False, "6999584193848021535", "1378551", "ce2098aa7d557cfc63d896fc63ec2846", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
光环_II = EffectMeta("光环 II", False, "6999882629893853726", "1378552", "adb70b2ea060371bb7d91ec43c031989", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
几何拖尾_I = EffectMeta("几何拖尾 I", False, "6985081270208303653", "1404702", "dbc19689b9dae201897fce9e894ce5fe", [])
几何拖尾_II = EffectMeta("几何拖尾 II", False, "7008079206181507615", "1404705", "9c57ea460222d55e1bbab56600ca3b71", [])
击中 = EffectMeta("击中", False, "7008009586581967397", "1404729", "b0a79d87265c9f181f9875a626ad7c66", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%"""
分头行动 = EffectMeta("分头行动", False, "7065570293552517646", "1570064", "50b8be675fac5e23d3bc5d96013c027e", [
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
分身 = EffectMeta("分身", False, "7194734735434715704", "9010351", "dca7518f6eb90654d1c2473406db2890", [
EffectParam("effects_adjust_distortion", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
动感爱心 = EffectMeta("动感爱心", False, "6998039666024780318", "1238121", "9d3838036dedfd21be7f340273fde034", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
卡通脸 = EffectMeta("卡通脸", False, "7205481536240489019", "10092161", "d01b570f71818e6f6d04bc6c9b1ef766", [])
变身 = EffectMeta("变身", False, "6998018272557797924", "1238120", "f78c282c0147f997f1c7624bda919cc3", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
可爱女生 = EffectMeta("可爱女生", False, "6971317732948054542", "1182270", "305aaa38fa724b8fceba4a0be1bd49a8", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
可爱猪 = EffectMeta("可爱猪", False, "6971317650219602446", "1182274", "483efc4867b85d9bf7c39a6b1d878b8d", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
吻痕坏笑 = EffectMeta("吻痕坏笑", False, "7197741530751177274", "9392743", "df256252c27055c7434212ca51caf7d0", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
哈哈哈 = EffectMeta("哈哈哈", False, "6993187958685700638", "1217040", "803508bffb42714235dcdbddb1d30834", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
图腾 = EffectMeta("图腾", False, "6999820560528052743", "1378608", "006d822d0f49a4e20e539d18ed6cda96", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
圣诞小熊 = EffectMeta("圣诞小熊", False, "7175084803874624061", "7126277", "c66c5f67cc2eeb2827a24fd5558cedfe", [
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
圣诞帽 = EffectMeta("圣诞帽", False, "7034784053609894430", "1457102", "b3bf8d22530db2a310a8c38abed2fd09", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认30%, 0% ~ 100%"""
圣诞树 = EffectMeta("圣诞树", False, "7173942106061279781", "6993587", "865c067b3fc9fd7d8fb9d32bfe88cea3", [])
圣诞胡子 = EffectMeta("圣诞胡子", False, "7034831862597947918", "1457484", "35b6dc4b15d10db2100509cf349f5b5c", [
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.770, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认30%, 0% ~ 100%
effects_adjust_vertical_shift: 默认77%, 0% ~ 100%"""
圣诞辣妹 = EffectMeta("圣诞辣妹", False, "7165705324777705992", "7406471", "7c9b779e2382630c01d33528a013b8fb", [
EffectParam("effects_adjust_texture", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
圣诞铃铛 = EffectMeta("圣诞铃铛", False, "7175084694940160568", "7126337", "5b59cf441d783d507c2b4b3a0aabf4e9", [
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
声波 = EffectMeta("声波", False, "7008055446397260319", "1404731", "f0e9e247eabb12c558de273a8e51c515", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%"""
多屏圣诞树 = EffectMeta("多屏圣诞树", False, "7175084576950194725", "7126387", "1a70506d54ba37021e8dd157358aa76a", [
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
大头 = EffectMeta("大头", False, "6986556887818834462", "1201644", "7518e7eb3e186350b688bf712b960c97", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
大眼睛 = EffectMeta("大眼睛", False, "7044080818544710152", "1489516", "b53f3fda1f03d0d1f703fb71a009d790", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
天使环 = EffectMeta("天使环", False, "7019228748775952933", "1400400", "5782ef42472fd9771f9113d98b6e4e58", [])
太阳神 = EffectMeta("太阳神", False, "7009186849444860453", "1404735", "9c009ca6bf736eba0dd3152bb863fc6d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
好吃 = EffectMeta("好吃", False, "7075218981442818596", "1626122", "6a55240ce1f00f078b50fd5e34b5afd3", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.200),
EffectParam("effects_adjust_horizontal_shift", 0.600, 0.300, 2.600),
EffectParam("effects_adjust_size", 0.500, 0.300, 2.000),
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 120%
effects_adjust_horizontal_shift: 默认60%, 30% ~ 260%
effects_adjust_size: 默认50%, 30% ~ 200%
sticker: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
妖气 = EffectMeta("妖气", False, "6729410038047183364", "1558942", "8ff658c7bcf3814f91693f906d5eba8b", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
委屈丑丑脸 = EffectMeta("委屈丑丑脸", False, "7130874026733343268", "4192363", "596971eaa17dbe64f62f52fc75c9998a", [])
害羞 = EffectMeta("害羞", False, "6979931248890221069", "1187976", "6904d753832ee54a39f46fb23e0c47fc", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%"""
小恶魔 = EffectMeta("小恶魔", False, "6995534946311868958", "1225626", "7dba67f137a50da13db71188fc6df71f", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%"""
小鹿角 = EffectMeta("小鹿角", False, "7035938555683672612", "1459882", "a77b46457ff3ea5a5c75c0d127e9cdd2", [])
尴尬住了 = EffectMeta("尴尬住了", False, "7156141357008949790", "5481035", "cc08bdab9e913aa015d61631abf8fa7d", [])
局部扭曲 = EffectMeta("局部扭曲", False, "7038521452668129822", "1470210", "da8f3f99ca659d2710b2f9dcecf5fe4c", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
局部马赛克 = EffectMeta("局部马赛克", False, "7034092576726585869", "1454112", "6f37c16b7d7904bc8489e66455f6d78b", [
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
巴哥犬 = EffectMeta("巴哥犬", False, "6971317662567633421", "1182273", "6764c992938b5c0e62dfc6e46255bde7", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
帅气男生 = EffectMeta("帅气男生", False, "6971317748542476814", "1182269", "71d88fb7f6ae9e19df3f8b491b7355bf", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
幻影_I = EffectMeta("幻影 I", False, "7212904257043829307", "11357751", "6699feabadc4f59732b8087620fc95a6", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
幽灵 = EffectMeta("幽灵", False, "7000630410275197470", "1378554", "9f6758469c2a948cadfbeff53bbc5b6d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
弥散流光 = EffectMeta("弥散流光", False, "7034508334157795876", "1455764", "eabd69cd578279cf0dc892e088f60da6", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认0%, 0% ~ 100%"""
彩色负片 = EffectMeta("彩色负片", False, "7035876641083494926", "1459050", "2cd6462bd0bde3023d5f7069cd549b17", [
EffectParam("effects_adjust_size", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
彩色重影 = EffectMeta("彩色重影", False, "6995746173772370469", "1235614", "99b7fa2ef6210832f1d6dccfce4ed759", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
微笑摇摆头 = EffectMeta("微笑摇摆头", False, "7166825483902915109", "6253239", "ff4053845ced3ff3b9fbe9d1429a908b", [
EffectParam("effects_adjust_size", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认45%, 0% ~ 100%
effects_adjust_speed: 默认75%, 0% ~ 100%
effects_adjust_range: 默认35%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
心动 = EffectMeta("心动", False, "6986186073814602277", "1204190", "bab33144cacb0cdade5a3d1f18d9c6e7", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认75%, 0% ~ 100%"""
心动信号 = EffectMeta("心动信号", False, "7040012457842053662", "1478394", "a4758810ef78bfca76c45486faeac99d", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
心心眼 = EffectMeta("心心眼", False, "7196943722523660858", "9126233", "aebda718fd41b71cbef713df0b12ac0f", [
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认100%, 0% ~ 100%"""
恶灵骑士 = EffectMeta("恶灵骑士", False, "7000301210993431053", "1378618", "c0f232fc4435c4bf8a4861efa6bcf671", [
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
恶魔印记 = EffectMeta("恶魔印记", False, "7000647554337608222", "1378619", "abab6563284c7ef292d1acaaf5a1be3e", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
恶魔尾巴 = EffectMeta("恶魔尾巴", False, "7001021232371995149", "1404725", "7ab5f92c75beb4747dc81731b447f53c", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认100%, 0% ~ 100%"""
恶魔角 = EffectMeta("恶魔角", False, "7019228817549955597", "1400399", "e3331ccd99a663f0561f82ac87441dcf", [])
惨 = EffectMeta("惨", False, "6992836065245532680", "1225625", "f5f8238bef302a2a27cae95c0d2304f1", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%"""
意识流 = EffectMeta("意识流", False, "7000629338529862151", "1378555", "17dcd65459f769802c3d02fa00af0a48", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认60%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
憔悴 = EffectMeta("憔悴", False, "6986160256103485989", "1197947", "709a178794856095bfcc215cabc3f91c", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认75%, 0% ~ 100%"""
懵 = EffectMeta("懵", False, "6980272649066779143", "1187977", "32325e03b4b27a426af4f3c3916cd718", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%"""
我不听 = EffectMeta("我不听", False, "7001058741571293709", "1353102", "a56ac41521ef7b1e1ad7e09ec2253082", [
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
我服了 = EffectMeta("我服了", False, "7029509874862002724", "1436336", "6ec666bfc6a45aa53f82f794d75d9976", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%"""
手印涂抹 = EffectMeta("手印涂抹", False, "7153950763348136478", "5190085", "c617ff4e68e61de777f52149851b782c", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
手绘描边 = EffectMeta("手绘描边", False, "7406177019404227109", "80106342", "07d72dd2e34f4fd41cbdabe05464454d", [])
打击 = EffectMeta("打击", False, "6971302911317905956", "1169502", "b310c3ede33e6e0819859dbc67ffab7e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.550, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认55%, 0% ~ 100%"""
打脸 = EffectMeta("打脸", False, "6992915114051506725", "1217039", "ade99f5a3c5dc73639e55dbf4157b0eb", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
扫描_II = EffectMeta("扫描 II", False, "7000630959565443614", "1378580", "c6c224fb2fec72f0a0432ccad29546aa", [
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
拼贴抽帧 = EffectMeta("拼贴抽帧", False, "7142777693707178533", "4574525", "602c047f7cafe02427da4b327fd260cf", [
EffectParam("effects_adjust_vertical_chromatic", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.661, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_chromatic: 默认0%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认10%, 0% ~ 100%
effects_adjust_size: 默认30%, 0% ~ 100%
effects_adjust_texture: 默认66%, 0% ~ 100%
effects_adjust_filter: 默认65%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
拼贴风暴 = EffectMeta("拼贴风暴", False, "7037019101402763806", "1464400", "1a39707de66987a9048c2e495b5a1c96", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认75%, 0% ~ 100%"""
拽酷红眼 = EffectMeta("拽酷红眼", False, "6979861988935471623", "1185226", "3528fdf176336d1ae503e85611d96347", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%"""
掉小珍珠啦 = EffectMeta("掉小珍珠啦", False, "7132336135748981255", "4080159", "91cb59a743f8089684fcf7c420861e74", [])
故障描边_I = EffectMeta("故障描边 I", False, "6998080413587477005", "1238132", "226bca50364904c231246c72b0a9e5c1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
敲打 = EffectMeta("敲打", False, "6986918523704447501", "1197949", "67737d95f8256e6915b26c3efd41f305", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
新年星黛露 = EffectMeta("新年星黛露", False, "7182406780733887033", "7823781", "6e4e73454d92da43cd9e90cf7c350c7d", [
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
无信号 = EffectMeta("无信号", False, "7039965830192304671", "1478054", "c6c413df67a97d81b29355a0e1e89f16", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
日系大头贴 = EffectMeta("日系大头贴", False, "7309039877796925978", "32668223", "04f1ebf5bf63743f1bb12f518ede4b5e", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.700, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认10%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_distortion: 默认70%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%"""
星光放射 = EffectMeta("星光放射", False, "6999904379822150158", "1378610", "aa85bd31e3f47e7bd01383b6aacc9508", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
星星拖尾 = EffectMeta("星星拖尾", False, "7007679689388986888", "1404703", "7dabcaa49244e8faeaf61bfa184d53fb", [])
未来眼镜 = EffectMeta("未来眼镜", False, "6989160247034122789", "1238126", "66983702ac8ca5f68aa9ec32c92c4b3b", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%"""
机械几何 = EffectMeta("机械几何", False, "6997682380454498824", "1238116", "2b469e181b8e5be26a0e09678a9974b0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
机械姬_I = EffectMeta("机械姬 I", False, "6978809529215488548", "1238098", "11d60d8c8de82453c697bed883e64671", [])
机械姬_II = EffectMeta("机械姬 II", False, "6997969810822795813", "1238099", "601bc1f8fd6dfcb9226fa7e54aba9f14", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
机灵怪 = EffectMeta("机灵怪", False, "7158373218724614664", "5510681", "6fa4f54d22b420c8c0a3e59246d1c8b7", [])
欧美女性 = EffectMeta("欧美女性", False, "6971317800098861576", "1182266", "6d9b6990df1d66bad249c5defd435576", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
欧美男性 = EffectMeta("欧美男性", False, "6971317784085008909", "1182267", "b09c7a6c2134a95aeac139f06217cdde", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
气泡_I = EffectMeta("气泡 I", False, "6999560743653741087", "1378604", "53133594bcb0ca9cf9cb48b80aa8eec1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
气泡_II = EffectMeta("气泡 II", False, "6999560859986956813", "1378603", "1b75e11acadf9069723dc387751d68c5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
气波 = EffectMeta("气波", False, "7008459080452805133", "1404693", "d49684beffa531728f6d0b2f5823a465", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
氛围大头贴 = EffectMeta("氛围大头贴", False, "7309480138486321715", "32919263", "13daa7e7f44f245155737d4a8017d0e2", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.700, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认10%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_distortion: 默认70%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%"""
沉沦 = EffectMeta("沉沦", False, "7000286535568331294", "1378579", "7f1cef9ddfd657188f2ae2f069c9433b", [
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
流光描边 = EffectMeta("流光描边", False, "7156203771352060424", "6699941", "43de1121773eea81624460ed929b17e8", [
EffectParam("effects_adjust_intensity", 0.850, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认85%, 0% ~ 100%
effects_adjust_size: 默认15%, 0% ~ 100%
effects_adjust_range: 默认33%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认25%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
流口水 = EffectMeta("流口水", False, "7072912940101276196", "1610044", "50dec319b04a96990ed59c7a237ed700", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.400, 0.700),
EffectParam("effects_adjust_size", 0.800, 0.500, 1.200)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 40% ~ 70%
effects_adjust_size: 默认80%, 50% ~ 120%"""
漩涡 = EffectMeta("漩涡", False, "7007639691797205511", "1404726", "c027fc134ee686578a887120774ae49b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
潮流入侵 = EffectMeta("潮流入侵", False, "7039588403897176583", "1475552", "fff9a2112e2f1befcbe793a348d9b49e", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
潮酷女孩 = EffectMeta("潮酷女孩", False, "6973998028587799076", "1182282", "43567fd71493d00bc90873169a742c7b", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
潮酷男孩 = EffectMeta("潮酷男孩", False, "6971317770835202574", "1182268", "8db29277f098685e305a341ae6256482", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
激光几何 = EffectMeta("激光几何", False, "6998130105188880909", "1238146", "3b57818e4d021368a6a71792ff5efffd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
火焰拖尾 = EffectMeta("火焰拖尾", False, "7008060347789611551", "1404704", "f5e51b968426e15e4e185285a4e8558f", [])
火焰环绕 = EffectMeta("火焰环绕", False, "7009186695157387784", "1404737", "0336f00d05b706cf8ab9742af8ee16c7", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
火焰翅膀_I = EffectMeta("火焰翅膀 I", False, "7009186539762618910", "1404738", "bab3b65e0ca81daf7fbef82971d57527", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
火焰翅膀_II = EffectMeta("火焰翅膀 II", False, "7007998245511107108", "1404728", "93fa02d91dd5f7fd2c41314358ba462d", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%"""
灵机一动 = EffectMeta("灵机一动", False, "6982806720867209765", "1187978", "9a0be515180211c4c30a1757d3622ca0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.600, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认60%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
灵魂出走 = EffectMeta("灵魂出走", False, "6994263736991093278", "1220234", "b78e2e42d51b354ad3a2c9af04da43f1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%"""
爱心光波 = EffectMeta("爱心光波", False, "7058944699737838116", "1552114", "2198438e43c9ff1147958bf750b61b90", [
EffectParam("effects_adjust_texture", 0.204, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.753, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认20%, 0% ~ 100%
effects_adjust_size: 默认75%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
爱心焰火 = EffectMeta("爱心焰火", False, "6999550440639566350", "1378601", "2f8b37a399b2b45ca57717a6244c3c9f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
狼人 = EffectMeta("狼人", False, "7156899280374993416", "5413619", "f3d6cf02114d17bad33a3003557f5ff5", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%"""
猩猩脸 = EffectMeta("猩猩脸", False, "7112786295771894285", "3186064", "3afa515823ec425b359bf9102a7cfa28", [])
猫耳女孩 = EffectMeta("猫耳女孩", False, "6971317673699316261", "1182272", "486df1ec5de1ca0a69210b844b912534", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
电光描边 = EffectMeta("电光描边", False, "7171723380003967496", "6738041", "1a5266ab56ea0645c20f0160aee7743e", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_range: 默认90%, 0% ~ 100%
effects_adjust_distortion: 默认70%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
电光放射 = EffectMeta("电光放射", False, "7011414375130993188", "1404739", "092db1dc71adf758d4ab5b19b5b43873", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
电击 = EffectMeta("电击", False, "6999560974638256671", "1378602", "b1659d113dda06df2115cd948ed09e23", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
电子屏故障 = EffectMeta("电子屏故障", False, "6997976386413531661", "1238119", "05d9292d4d2ef2ea3b84854f4771ff25", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
真的会谢 = EffectMeta("真的会谢", False, "7179493200904589881", "7600931", "bdfc580a5e4155e95c3568dcea50d341", [])
真香 = EffectMeta("真香", False, "6995535089975169549", "1225627", "81a9d2b55a363059acb95c637e49d65d", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%"""
破碎的心 = EffectMeta("破碎的心", False, "7008077860397126158", "1404734", "7ddd6f7b9c206935ac79bfc814467ae4", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
神明少女 = EffectMeta("神明少女", False, "6906817277316829703", "1169466", "20a22b74a6a7a30f2dcab48dbc5276b6", [
EffectParam("effects_adjust_soft", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_soft: 默认25%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
科技氛围_I = EffectMeta("科技氛围 I", False, "6989160173826740767", "1238115", "bdfd8e3165875ca7084b62d7e6204079", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
科技氛围_III = EffectMeta("科技氛围 III", False, "6983927792010269214", "1238118", "8e1024fd3f6bd41f09d16cf27de0f210", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
秘密 = EffectMeta("秘密", False, "7023684632591733284", "1418782", "72f525012ca8744325138a89981b3e84", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
箭头环绕 = EffectMeta("箭头环绕", False, "6999943971162034702", "1378553", "c4543904bdf336051dee6e64c8b5ebdd", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
粉色便便 = EffectMeta("粉色便便", False, "6971317685216875044", "1182271", "0c843a5ba39df7e037f4995040f79263", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
背景拖影 = EffectMeta("背景拖影", False, "7012512877038801415", "1379270", "e6c9f05435c8a8912b1321bfa9f39a4a", [
EffectParam("effects_adjust_horizontal_shift", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.850, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认85%, 0% ~ 100%"""
背景氛围II = EffectMeta("背景氛围II", False, "7007713075486790152", "1404727", "f69d913fb2414b485d7d03770049a5fa", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
脸红 = EffectMeta("脸红", False, "7025808257306333732", "1424210", "9946c014663314c93786a0a8fc27b347", [
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.802, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
sticker: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
脸绿了 = EffectMeta("脸绿了", False, "7023661644853023263", "1418056", "a4af7d2a30dac7d4be34f96c8d27f556", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.802, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%"""
脸部故障 = EffectMeta("脸部故障", False, "7260774105073324602", "19351944", "b00871e8d7e141731a2fe3ca29bb857a", [
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_color: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
舞者 = EffectMeta("舞者", False, "6978809631678140935", "1238134", "80d431c5d76932b3f3fb8418267afdb5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
舞者_II = EffectMeta("舞者 II", False, "7000629698401145352", "1378611", "de4d77dc2f920e92503d9553c0cf1a21", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认60%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
萤火 = EffectMeta("萤火", False, "6979415063106949639", "1378556", "000701418e2acde7230cfdcc680ef895", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
虚拟人生_I = EffectMeta("虚拟人生 I", False, "6998017546452472351", "1238100", "54fd9f289f28e1a2f060f4e569c31359", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
虚拟人生_II = EffectMeta("虚拟人生 II", False, "6998017726589440519", "1238101", "2bc7ecc4b79a372c9fed9a86b850d8a5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
衰 = EffectMeta("衰", False, "6995855600764588557", "1225628", "80bb667cb6e39b17554321df89c41a86", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%"""
视线遮挡 = EffectMeta("视线遮挡", False, "7034507846305714696", "1455754", "9d6829ecbc85a6653ca44ccd18c9243f", [
EffectParam("effects_adjust_speed", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认0%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
赛博朋克_I = EffectMeta("赛博朋克 I", False, "6975112087659876895", "1238114", "3f5f8d770decd3fe853778e00f3ab589", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
赛博朋克_II = EffectMeta("赛博朋克 II", False, "6997261680803582494", "1238113", "0bbcda72ffc36a7aa6dc7d5ec7cdc0b6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
赛博眼镜 = EffectMeta("赛博眼镜", False, "7055586958050857503", "1536126", "ce551db43d4cd0e9abf3e69a35513113", [])
轻金属 = EffectMeta("轻金属", False, "7036946127320519182", "1463702", "6f5edc9d13d681afe8ee4f3224014a1e", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认75%, 0% ~ 100%"""
运动轨迹 = EffectMeta("运动轨迹", False, "7389547512987652658", "74470467", "91ac684d7b70b28e9fd1f3c1f99c97e9", [
EffectParam("effects_adjust_number", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认40%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
迷茫 = EffectMeta("迷茫", False, "6979931594408595975", "1185225", "19618c1e22b607642e7b27dc2602832f", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
闪影 = EffectMeta("闪影", False, "7090458377901314568", "1825212", "864dcb150b85814ca7615946c7265941", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
闪烁 = EffectMeta("闪烁", False, "7008060861528936991", "1404733", "b8648c0ede65749dcc4af04b7d5fa54c", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%"""
闪电炸裂 = EffectMeta("闪电炸裂", False, "6999539022812942884", "1378606", "be8011441a484bf6661aa33604cd06bd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
阳光 = EffectMeta("阳光", False, "6986176759725036039", "1197948", "7ea97e6b6156a1066459a400f0c26692", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认75%, 0% ~ 100%"""
阴云密布 = EffectMeta("阴云密布", False, "7025527915320185375", "1427592", "25dc89f2e7cbe9ffb52d1da8f2cade5c", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
阴暗面 = EffectMeta("阴暗面", False, "7000679723906896397", "1378620", "f1efe71ae45c60bc94d1fcb168b8bf4d", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
难吃 = EffectMeta("难吃", False, "7075326356585714207", "1627088", "22f5c7f78d72ed2767d8673414519e4b", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.200),
EffectParam("effects_adjust_horizontal_shift", 0.550, 0.300, 2.600),
EffectParam("effects_adjust_size", 0.500, 0.300, 2.000),
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 120%
effects_adjust_horizontal_shift: 默认55%, 30% ~ 260%
effects_adjust_size: 默认50%, 30% ~ 200%
sticker: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
难过 = EffectMeta("难过", False, "6979931396827517477", "1187975", "0d1f3c1ea1287cd2de9193f5a6c55d20", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%"""
雪花眼泪 = EffectMeta("雪花眼泪", False, "7174694873897898553", "7078531", "b078f5583b67f9bfa95e30bf612e3482", [
EffectParam("effects_adjust_intensity", 0.850, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认85%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_sharpen: 默认25%, 0% ~ 100%"""
霓虹特技 = EffectMeta("霓虹特技", False, "7389546043534217778", "74469969", "a30c2949ccfc35417421caf68261ae0b", [
EffectParam("effects_adjust_size", 0.510, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认51%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认0%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%"""
音符拖尾 = EffectMeta("音符拖尾", False, "7008458769675850248", "1404706", "7c1a10956911f225d514aab1ecfb7aeb", [])
音符拖尾_II = EffectMeta("音符拖尾 II", False, "7002176395312894494", "1238188", "c768fa0ad974298284a8adb66678e93a", [])
飓风 = EffectMeta("飓风", False, "7008458952451035678", "1404694", "a0bf72f591c6dbba8a211894f618976f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
飞翔的帽子 = EffectMeta("飞翔的帽子", False, "6999892125697446414", "1404708", "ec71eec4c8788ed43133f0a5a775e0c6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
鬼火 = EffectMeta("鬼火", False, "7008470453366821389", "1404696", "6dcf3bafc5efbf4f3509dae601f57f54", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
黑人女孩 = EffectMeta("黑人女孩", False, "6971317836648026661", "1182265", "bde6e304a5de9614c0f44644fd3d15be", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
黑人男生 = EffectMeta("黑人男生", False, "6971317847318336031", "1182264", "a6e9afde1f86efbb91c49ecd9d6a8fdc", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%"""
鼻血 = EffectMeta("鼻血", False, "7153900212623249950", "5182539", "fc3d1f3cca541ced7f24b226eff114ee", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
# 付费特效
_3D兔兔 = EffectMeta("3D兔兔", True, "7098954198204551716", "1924176", "78c9a5106ea815c821911a10f7631163", [
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
sticker: 默认100%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
Love_u = EffectMeta("Love u", True, "7058892012358996510", "1551894", "2aa9298939a522ca05e5219ab6e91cf6", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_size: 默认80%, 0% ~ 100%
effects_adjust_color: 默认30%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%"""
X瞬移 = EffectMeta("X瞬移", True, "7265629618424517157", "20387617", "366528fe2ee5c5c851a694073cf4b855", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%"""
分身_III = EffectMeta("分身 III", True, "7281245666309837349", "23497249", "5b218df611d57e62c26029c0df884b13", [
EffectParam("effects_adjust_speed", 0.300, 0.000, 0.600),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认30%, 0% ~ 60%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
分身ll = EffectMeta("分身ll", True, "7207269616299545149", "10287363", "a42da906cd114315f798ba59b1692264", [
EffectParam("effects_adjust_vertical_shift", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.620, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认30%, 0% ~ 100%
effects_adjust_size: 默认62%, 0% ~ 100%
effects_adjust_range: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认55%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认30%, 0% ~ 100%"""
发光分身 = EffectMeta("发光分身", True, "7233250530292666939", "13661053", "dbff6732319cf9488da4816c188d9f1a", [
EffectParam("effects_adjust_color", 0.840, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.102, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认84%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认35%, 0% ~ 100%
effects_adjust_size: 默认10%, 0% ~ 100%
effects_adjust_distortion: 默认30%, 0% ~ 100%"""
变老_美颜 = EffectMeta("变老-美颜", True, "7226689898118386237", "12825757", "bd4037e779bb8ecd6ac12258853974b2", [])
可爱龙龙 = EffectMeta("可爱龙龙", True, "7327508217590714931", "41751981", "9ac3a781a5aa5b33ddc73be905a2b270", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
吸血鬼 = EffectMeta("吸血鬼", True, "7154356694376518158", "5226581", "c560f8982d276a2824147698951751cd", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
哥特 = EffectMeta("哥特", True, "7154061273838129672", "5199947", "94bd5a2ec19553d8e91423ab41b1bfee", [
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认100%, 0% ~ 100%"""
嘻哈眼镜 = EffectMeta("嘻哈眼镜", True, "6998017895024300557", "1238128", "3a23ea8d16fe9ec18850783595877e4b", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认60%, 0% ~ 100%"""
天使 = EffectMeta("天使", True, "7156481333189939720", "5374123", "14336b246c295332eee8b29c5dc807c4", [
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.900, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认90%, 0% ~ 100%"""
天使翅膀 = EffectMeta("天使翅膀", True, "6999514637767021070", "1378600", "f7acdf6cab043dbe7401ac89e572f6ff", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
奇行种 = EffectMeta("奇行种", True, "7168749461206733342", "6432361", "ca795d0b1827bcd27231c7c5a10825e3", [])
局部模糊 = EffectMeta("局部模糊", True, "7036282000780562981", "1461580", "d61e04351e9ead6669cb6db1f4bdce05", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认75%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%"""
幻彩流光 = EffectMeta("幻彩流光", True, "7303422113812058633", "30319544", "5926b9713b3de1fe23a6b1790ba5d204", [
EffectParam("effects_adjust_texture", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.950, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认80%, 0% ~ 100%
effects_adjust_luminance: 默认20%, 0% ~ 100%
effects_adjust_intensity: 默认95%, 0% ~ 100%
effects_adjust_color: 默认20%, 0% ~ 100%"""
幻影平移 = EffectMeta("幻影平移", True, "7259667629357404730", "19114588", "4f4946b896cb4675e8514fa8d5af517a", [
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
彩虹流体 = EffectMeta("彩虹流体", True, "7273753115604554295", "21883974", "2725088e1378997bea428c8b04e2b15f", [
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认90%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
彩虹边缘 = EffectMeta("彩虹边缘", True, "7306769922535723558", "31771661", "e59040f43c25146de23341ac4b47a8bf", [
EffectParam("effects_adjust_intensity", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认55%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_rotate: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认15%, 0% ~ 100%"""
影分身 = EffectMeta("影分身", True, "7306822259186864691", "31622417", "8088e845f5e6b8aecd6a9245cf033cfb", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
恶魔之翼 = EffectMeta("恶魔之翼", True, "7008049313305596446", "1404730", "99cdde82bb5587966f1a2bac10d024f2", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%"""
情绪定格 = EffectMeta("情绪定格", True, "7298250619167445531", "28662656", "b60fd80757a580b75be83ea1b8905ef3", [
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_range: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认10%, 0% ~ 100%"""
我太可爱了 = EffectMeta("我太可爱了", True, "7132773677086544398", "4104909", "76739264135fb0471d1ac7d9fa8b2027", [])
我爱了 = EffectMeta("我爱了", True, "7182098630935843385", "9267743", "9ea5207040ca8a6c673eee1c8f4213e9", [])
我麻了 = EffectMeta("我麻了", True, "7030722591358718494", "1441766", "b3078ea7691c02789dec4360d7ebd5a5", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
手写描边 = EffectMeta("手写描边", True, "7108559446065811998", "2869818", "59694d712050ddb032105f620b50ffe6", [
EffectParam("effects_adjust_color", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.210, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认20%, 0% ~ 100%
effects_adjust_size: 默认21%, 0% ~ 100%
effects_adjust_vertical_shift: 默认20%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
捕梦 = EffectMeta("捕梦", True, "7038866261677183524", "1471454", "24df2e977ac4752adaeb8f4495e98aeb", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
撕纸拼贴 = EffectMeta("撕纸拼贴", True, "7406207253583237682", "80787899", "e2b5e11e2f24940b65c91615723613f6", [])
旋转分身 = EffectMeta("旋转分身", True, "7259667753731101244", "19114658", "f2a47eb17a20c6272e939350cf2268d3", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.300, 0.000, 0.750),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_range: 默认30%, 0% ~ 75%
effects_adjust_blur: 默认40%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%"""
无限穿越 = EffectMeta("无限穿越", True, "7293870099738399269", "27074734", "f6bed6028a99ff60118167854f1f6ed1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_number: 默认0%, 0% ~ 100%"""
有事吗 = EffectMeta("有事吗?", True, "7322382230930592266", "39451195", "2cab81a0a4cad0393890f3eaad56a191", [
EffectParam("effects_adjust_texture", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认60%, 0% ~ 100%"""
机械环绕_I = EffectMeta("机械环绕 I", True, "6986465789259813406", "1238184", "bff38e9886478c86635d990f78ca68cd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
机械环绕_II = EffectMeta("机械环绕 II", True, "6997731822104744478", "1238185", "66eb2b1b98e4ada7cacba9c39d37be74", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
梦境 = EffectMeta("梦境", True, "7039963252612141598", "1478040", "9f78e88b23ebbef1edc3439c2fc34c52", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
气炸了 = EffectMeta("气炸了", True, "7026548629498237454", "1426832", "979ebc680f1241a86545102632c79dff", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
波点分身 = EffectMeta("波点分身", True, "7086779590768595469", "1826180", "47f63e0ad4dd5f9c3d2045075b6795d4", [
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认60%, 0% ~ 100%
effects_adjust_intensity: 默认25%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
流体故障 = EffectMeta("流体故障", True, "7287114240089920061", "24949284", "f6cfc884ea840da552785ed2c1a3309b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认70%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认80%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%"""
涂鸦鬼影 = EffectMeta("涂鸦鬼影", True, "7153917024723276325", "5185037", "9570d183c3973de1498c638834c5136d", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
漩涡溶解 = EffectMeta("漩涡溶解", True, "7201020527501120057", "9583557", "3281d02205f102f70c4b07021be5bc71", [
EffectParam("effects_adjust_distortion", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.450, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认45%, 0% ~ 100%
effects_adjust_speed: 默认45%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认45%, 0% ~ 100%
effects_adjust_vertical_shift: 默认25%, 0% ~ 100%
effects_adjust_size: 默认45%, 0% ~ 100%
effects_adjust_range: 默认45%, 0% ~ 100%"""
火焰图腾 = EffectMeta("火焰图腾", True, "7009186785662079524", "1404736", "35e9cbe081d47066558a717ce3a774d8", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
点赞 = EffectMeta("点赞", True, "7072663671096218143", "1609620", "9f934cf082ec4d56a6f86e6e1aa2c8f6", [
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认25%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%"""
热力光谱_I = EffectMeta("热力光谱 I", True, "7033284501253919268", "1451182", "b578d3e33d8c650dc445c19875f9613f", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.801, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
热力光谱_II = EffectMeta("热力光谱 II", True, "7033338062113346056", "1451606", "b711586fdabf06e7975e4bc2f2d906e6", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.801, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
焰火 = EffectMeta("焰火", True, "7008459945590919716", "1404695", "3dc040bd8a6d3853428cc18030e7872a", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
熬夜冠军 = EffectMeta("熬夜冠军", True, "7330555999801053746", "43238686", "071e4eb6e85a9778b415bcb9303fd867", [
EffectParam("effects_adjust_texture", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认80%, 0% ~ 100%"""
爱心 = EffectMeta("爱心", True, "7068191600148484638", "1587990", "cda6bba22c1e6038233c0aaf3ec7c0ee", [
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
爱心发射 = EffectMeta("爱心发射", True, "7057403623004705294", "1551876", "665453673ccb652b012a46f63d32109d", [
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.350, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认35%, 0% ~ 100%"""
爱心泡泡 = EffectMeta("爱心泡泡", True, "7055592805174874632", "1551930", "62cf1078f3a0e623c349cb4200f3de26", [
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
爱心眼 = EffectMeta("爱心眼", True, "7104647986176594463", "2491250", "aeee56c74c823b2afda571c023d0f992", [
EffectParam("effects_adjust_color", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.050, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认15%, 0% ~ 100%
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_range: 默认5%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%"""
爱心美瞳 = EffectMeta("爱心美瞳", True, "7194734371872444965", "8950197", "23b70724f639f5020f4a4f6a53011868", [
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
狱火 = EffectMeta("狱火", True, "7007676026406834725", "1404692", "29903a65ede13673b23ac1eedc118b5d", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
生气 = EffectMeta("生气", True, "7068227476035473928", "1588764", "5c652a8c8a664b41ec7c59fa569ee3e8", [
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
电光描边_II = EffectMeta("电光描边 II", True, "7265989852099777061", "20444547", "3a3aee848d3e7c13822281957ef09093", [
EffectParam("effects_adjust_luminance", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.110, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认75%, 0% ~ 100%
effects_adjust_distortion: 默认65%, 0% ~ 100%
effects_adjust_size: 默认75%, 0% ~ 100%
effects_adjust_color: 默认11%, 0% ~ 100%
effects_adjust_range: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%"""
电光灼烧 = EffectMeta("电光灼烧", True, "7259649795571061305", "19106834", "3e5d0b31ae925f24539d89b017879815", [
EffectParam("effects_adjust_rotate", 0.730, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_rotate: 默认73%, 0% ~ 100%
effects_adjust_color: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_distortion: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
电光眼 = EffectMeta("电光眼", True, "7106778883143242271", "2724384", "12aed71e7e62dafe99b6ff5ef264a36d", [
EffectParam("effects_adjust_color", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认25%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认25%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
电光耳机 = EffectMeta("电光耳机", True, "6998018067154342408", "1238127", "19a87efa0bebe59cdf36eda727a66664", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%"""
眼神光 = EffectMeta("眼神光", True, "7091874262364983815", "1793042", "665fec8aacac1d793e7917a0a0ec3ab3", [
EffectParam("effects_adjust_intensity", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.850, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认75%, 0% ~ 100%
effects_adjust_range: 默认85%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
瞬移 = EffectMeta("瞬移", True, "7322735107280736805", "39618119", "29e526f7936cb5e985f77da6c51498ef", [
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%"""
碎片分身 = EffectMeta("碎片分身", True, "7207691092655870523", "10339835", "86532426a7e3c08c229dd518c51a893c", [
EffectParam("effects_adjust_range", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.950, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认10%, 0% ~ 100%
effects_adjust_intensity: 默认95%, 0% ~ 100%
effects_adjust_speed: 默认0%, 0% ~ 100%"""
碎闪边缘 = EffectMeta("碎闪边缘", True, "7306471467397419547", "31771693", "7c1311ff7b01577587a28252b3cd5d46", [
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认15%, 0% ~ 100%"""
科技氛围_II = EffectMeta("科技氛围 II", True, "6982572496356643359", "1238117", "d4b1ba4f4bb11a26860cd7f493853661", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
移形回位 = EffectMeta("移形回位", True, "7270801008094089784", "21811668", "4d2d96869fab0fa65766a52360c9fcef", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认30%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
移形幻影_I = EffectMeta("移形幻影 I", True, "7201010922742092325", "9583559", "c89c34b83924f3fb5c88f2ece2e095b8", [
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认100%, 0% ~ 100%"""
移形幻影_II = EffectMeta("移形幻影 II", True, "7194734891353772603", "9010339", "c4ce763e7fcd977c98e4b4a8be0b85a1", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
空气流体 = EffectMeta("空气流体", True, "7283548311217246781", "24123133", "9882eb0caf97221ac6bd4161ead3a263", [
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.720, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.660, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认72%, 0% ~ 100%
effects_adjust_size: 默认66%, 0% ~ 100%"""
笑哭 = EffectMeta("笑哭", True, "7072173200418804231", "1606772", "9b86bc9942f7848d7ee7e7e74a077a4b", [
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认25%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%"""
粒子弥散 = EffectMeta("粒子弥散", True, "7283038170826936892", "23970537", "7a72cd5b5950e933ca7f6df425537c21", [
EffectParam("effects_adjust_horizontal_shift", 0.660, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认66%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
美味召唤 = EffectMeta("美味召唤", True, "7073398095186235935", "1612792", "1e09bf5fc9f3bc36e9fdb479c832365b", [
EffectParam("effects_adjust_vertical_shift", 0.600, 0.000, 1.200),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认60%, 0% ~ 120%
effects_adjust_size: 默认50%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
蝴蝶翅膀 = EffectMeta("蝴蝶翅膀", True, "6999567409677865486", "1378607", "69eaf245462b3777f94dfc5aabe18791", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
轮廓扫描 = EffectMeta("轮廓扫描", True, "7260773990178755129", "19351962", "82f3b4a76091dda533a0ca1b0b2265e8", [
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_soft: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
迷幻分身 = EffectMeta("迷幻分身", True, "7280421849974968889", "23303207", "e2bd87ba0c294b5340a8b74cf7c3f954", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.850, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认90%, 0% ~ 100%
effects_adjust_size: 默认85%, 0% ~ 100%"""
金币掉落 = EffectMeta("金币掉落", True, "7021362776404660743", "1543838", "06be5783fa794fc209023a283a47a7d3", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
镭射眼_I = EffectMeta("镭射眼 I", True, "7106778448344912421", "2724386", "ea9d0666a569334a0c6b27c14ade2674", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_color: 默认90%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
镭射眼_II = EffectMeta("镭射眼 II", True, "7106778621326397983", "2724385", "3891948240e1594b7ea8025222341a9d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.620, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_color: 默认62%, 0% ~ 100%"""
闪光放大 = EffectMeta("闪光放大", True, "7304912977180758537", "33838202", "a64dcdf7a22d382739051486535a4704", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_distortion: 默认70%, 0% ~ 100%"""
闪电 = EffectMeta("闪电", True, "7088198349324554766", "1711412", "9c97ab760617a5c3bc75491b3ad8406b", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认10%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%"""
闪电环绕 = EffectMeta("闪电环绕", True, "6998102186068546078", "1238186", "d2459fb754b3d9dbb469d29f6af77423", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
闪电眼 = EffectMeta("闪电眼", True, "7106763566262260231", "2722184", "6b6b4e9eb53581fea08118f62d55c1a9", [
EffectParam("effects_adjust_color", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.850, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认25%, 0% ~ 100%
effects_adjust_luminance: 默认25%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_range: 默认85%, 0% ~ 100%"""
霓虹爱心 = EffectMeta("霓虹爱心", True, "7194734553288675895", "9221893", "cf3b121f71539f6fc039062473db7c43", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
高光人物 = EffectMeta("高光人物", True, "7406179353362436645", "80107647", "4264ef0b6e1ada149ba0580b36001e2c", [])
黑色眼泪 = EffectMeta("黑色眼泪", True, "7154231632604434981", "5208347", "0343aabd4b0ef59cc829bd1732be0bbd", [
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
================================================
FILE: src/pyJianYingDraft/metadata/video_group_animation.py
================================================
"""视频组合动画元数据"""
from .effect_meta import EffectEnum, AnimationMeta
class GroupAnimationType(EffectEnum):
"""视频组合动画类型"""
# 免费特效
三分割 = AnimationMeta("三分割", False, 0.500, "6873360856541827591", "922958", "558aba214155c31df287c64d9dc2b8e2")
三分割_II = AnimationMeta("三分割 II", False, 0.500, "6873360923646497293", "922957", "d7baaf62e894ef166fe291bb84332165")
上下分割 = AnimationMeta("上下分割", False, 0.500, "6875935836177699335", "931224", "496fa5c31da1899de0cb0165138cd73f")
上下分割_II = AnimationMeta("上下分割 II", False, 0.500, "6875935919661126157", "3144548", "a6be02d01e9aa7277d023f063553543a")
上升旋转 = AnimationMeta("上升旋转", False, 0.500, "6813965595915063815", "691841", "0cf52f154d94db3611b8dac8001fde2c")
下降向右 = AnimationMeta("下降向右", False, 0.500, "6781683518222111239", "503140", "b5d536ab5791ef12d262982817b6ea0d")
下降向左 = AnimationMeta("下降向左", False, 0.500, "6759351225772151303", "446392", "a1e5635da8aaa68df0eee59e202789dd")
中间分割 = AnimationMeta("中间分割", False, 0.500, "6856970350270353928", "871868", "b2913d6efb446bda8d753430b8a13a82")
中间分割_II = AnimationMeta("中间分割 II", False, 0.500, "6856970411352003080", "871867", "3f62adfd71f2d308f59d4c3651fe5659")
叠叠乐 = AnimationMeta("叠叠乐", False, 0.500, "6836319728038842894", "872824", "63c0c0634a0c5f99ec74f839421018b0")
叠叠乐_II = AnimationMeta("叠叠乐 II", False, 0.500, "6836319649844433415", "872826", "464c1a4bb1176029ffa3f1b6b7ae25be")
叠叠乐_III = AnimationMeta("叠叠乐 III", False, 0.500, "6836319781004513805", "872828", "8c55f6c4f5abf7d41e55a77fc8f5fdad")
叠叠乐_IV = AnimationMeta("叠叠乐 IV", False, 0.500, "6836319828656001550", "872830", "1b59e3f39c921c7b45f2cfa2daa6c71d")
叠叠乐_V = AnimationMeta("叠叠乐 V", False, 0.500, "6836319888827486728", "872834", "9d5c1a042586999b720b9c4582f15256")
叠叠乐_Ⅵ = AnimationMeta("叠叠乐 Ⅵ", False, 0.500, "6839582631345000967", "872836", "1c05ec01a8c9e8fc640a7b095ccf361d")
右拉镜 = AnimationMeta("右拉镜", False, 0.500, "6772415374165021191", "471347", "1034060f611109671482d36f4d31fb17")
向右下降 = AnimationMeta("向右下降", False, 0.500, "6781683438396117517", "503138", "3076ad170eb3bfc352c857e588defb4c")
向右缩小 = AnimationMeta("向右缩小", False, 0.500, "6772415063216099848", "471341", "f5995769a9513563c0417cfe9b916183")
向左下降 = AnimationMeta("向左下降", False, 0.500, "6760223716392571395", "447588", "9ba3825d7883b956d5e73f43f59db545")
向左缩小 = AnimationMeta("向左缩小", False, 0.500, "6772415148423385607", "471343", "5c2a1617a5aa2f274bc12be4a41eed88")
哈哈镜 = AnimationMeta("哈哈镜", False, 0.500, "6832226792556728846", "748348", "d6586e3b2806e4f4930ac34624c2967c")
哈哈镜_II = AnimationMeta("哈哈镜 II", False, 0.500, "6832226909875606029", "748350", "8eae60bc0b8c8d210f9f4b059c24ab64")
四格滑动 = AnimationMeta("四格滑动", False, 0.500, "6883727868451361293", "945730", "1e8fc914a15209bc51eb0505f2e67816")
四格翻转 = AnimationMeta("四格翻转", False, 0.500, "6865578846393995784", "1362932", "88c1ed96cfa3f182a341c27adc7edfdb")
四格转动 = AnimationMeta("四格转动", False, 0.500, "6891835548688716302", "957940", "c849845a30f5df0c3b7f4b1620b5c248")
四格转动_II = AnimationMeta("四格转动 II", False, 0.500, "6891835601067184653", "957939", "087665cb644cb25f0ffbc99c8cb18237")
回弹伸缩 = AnimationMeta("回弹伸缩", False, 0.500, "6795425591014199822", "530249", "2b125e477d54adb475d9834eb209f8c1")
夹心饼干 = AnimationMeta("夹心饼干", False, 0.500, "6868146033247916558", "1362936", "23091e7d56610c4253a186488657cd30")
夹心饼干_II = AnimationMeta("夹心饼干 II", False, 0.500, "6868146123710665223", "1362934", "09b29b56757a17ad7ca31a57eb8b5726")
小火车 = AnimationMeta("小火车", False, 0.500, "6860405888784536072", "885144", "b302925aabfc7ad44b7ff56cf3eeb1af")
小火车_II = AnimationMeta("小火车 II", False, 0.500, "6860406007160377863", "885143", "dc3796c0b273ece45e7b919f4e95b13e")
小火车_III = AnimationMeta("小火车 III", False, 0.500, "6860406091700769293", "885142", "665257a20f1d22af2ec8d5a22c57c35c")
小火车_IV = AnimationMeta("小火车 IV", False, 0.500, "6860406196130550286", "885141", "44d91b6dc8026eb108a2d58de508605a")
小陀螺 = AnimationMeta("小陀螺", False, 0.500, "6874487656969933325", "923592", "a2ca54bf1fe5f095558e59d119f89dbb")
小陀螺_II = AnimationMeta("小陀螺 II", False, 0.500, "6874487735059485198", "923591", "decf2dddea3ff279910af80c73ec7e9e")
左右分割 = AnimationMeta("左右分割", False, 0.500, "6886282872680878599", "948476", "2950fd3e74e3e251a83de19f46d12072")
左右分割_II = AnimationMeta("左右分割 II", False, 0.500, "6886282936048423431", "948475", "43bd89b22b945308fe5b7f722cf68c09")
左拉镜 = AnimationMeta("左拉镜", False, 0.500, "6772415248973435395", "471345", "81d1a0c1b959c9910f775497cf55cffa")
弹入旋转 = AnimationMeta("弹入旋转", False, 0.500, "6810286558826992136", "669963", "03a824f3bfa5b694a0ccbb8e83cc8c93")
形变右缩 = AnimationMeta("形变右缩", False, 0.500, "6851395907804467720", "813139", "9add6fd7e0ee139401cb703b95bb307d")
形变左缩 = AnimationMeta("形变左缩", False, 0.500, "6851395726937690637", "813140", "114b8e787f082f3fec108ee4b3f1be18")
形变缩小 = AnimationMeta("形变缩小", False, 0.500, "6777260789263766030", "487587", "307f8bcc9b47ed8c20e5ac4822bb4659")
悠悠球 = AnimationMeta("悠悠球", False, 0.500, "6821451358101574152", "717346", "7f09519094e625c0af9868f528821ad1")
悠悠球_II = AnimationMeta("悠悠球 II", False, 0.500, "6821451462904648200", "717348", "5505c62331247b24a5ce39730bcb9051")
手机 = AnimationMeta("手机", False, 0.500, "6861892418334102030", "1362928", "55fd386ec6f779110e3b12b89deaa79c")
手机_II = AnimationMeta("手机 II", False, 0.500, "6862918279183208973", "1362926", "b861f8270870663e5c3f8bbb1fced93a")
手机_III = AnimationMeta("手机 III", False, 0.500, "6862918366550561294", "1362924", "e056d0f8601d91d70e20e61bd63793f5")
扭曲拉伸 = AnimationMeta("扭曲拉伸", False, 0.500, "7026278592623415822", "1426278", "ca0a43e525601adf9d14089393610d9c")
抖入放大 = AnimationMeta("抖入放大", False, 0.500, "6761360765925462536", "450264", "dcf80421b0f2682c13b062d0c599aac4")
拉伸扭曲 = AnimationMeta("拉伸扭曲", False, 0.500, "7025952723027628557", "1425496", "39862f9fa5c934d72d36923f2368de4a")
放大弹动 = AnimationMeta("放大弹动", False, 0.500, "7023931891363353101", "1418682", "8ba074c2bba2e21717e17f4e80fb80d7")
斜转 = AnimationMeta("斜转", False, 0.500, "6847734302193488392", "872874", "4cc2597d961bafbd3c7877bc3f75f79a")
斜转_II = AnimationMeta("斜转 II", False, 0.500, "6847734360636920327", "872876", "b37e163c186d88db144aacd6280c0811")
方片转动 = AnimationMeta("方片转动", False, 0.500, "6897114113726485000", "968162", "dfc6082d56863c5e700a0a5a17102abc")
方片转动_II = AnimationMeta("方片转动 II", False, 0.500, "6897114201702011405", "968161", "afdb5e78ddf7d480e78cabb527db9241")
旋入晃动 = AnimationMeta("旋入晃动", False, 0.500, "6789167874511475207", "519840", "f791a333e80fb4d7c2646c394adc2d25")
旋出渐隐 = AnimationMeta("旋出渐隐", False, 0.500, "6824302025698710024", "719940", "40cee4a8c1457ab5e4f15645532fd23e")
旋转上升 = AnimationMeta("旋转上升", False, 0.500, "6813965670716281352", "691843", "982059c400ca42676d02f9847d281e1e")
旋转伸缩 = AnimationMeta("旋转伸缩", False, 0.500, "6795425422046663182", "530247", "2c211882b63c7115a7c687faf3c79237")
旋转回吸 = AnimationMeta("旋转回吸", False, 0.500, "6810286613898203661", "669965", "57c2c2e50d57bc5ea10b8c32f8e850cb")
旋转缩小 = AnimationMeta("旋转缩小", False, 0.500, "6759046644462785037", "445858", "a6749bbbebb7a8fb3ad27679989b7401")
旋转降落 = AnimationMeta("旋转降落", False, 0.500, "6759046515521491464", "445856", "7c87f107b2dbc7d9abe648f4f6e86e58")
晃动旋出 = AnimationMeta("晃动旋出", False, 0.500, "6789167998700622350", "519842", "49fa06c52e99c0fe974343b4da58e94c")
水晶 = AnimationMeta("水晶", False, 0.500, "6857333749718192654", "1362920", "de28fd5ff1c5fa607cc09306a5de1fc9")
水晶_II = AnimationMeta("水晶 II", False, 0.500, "6857333869541069325", "1362922", "66d0f40fad32ba15e72d6687f12604f8")
波动滑出 = AnimationMeta("波动滑出", False, 0.500, "7017646605671076359", "1392376", "c546f43ce65a4977ee11010063ee7b50")
海盗船 = AnimationMeta("海盗船", False, 0.500, "6830302168751280648", "1362866", "a5e464c4bb091e8e43077aa05a1b20a8")
海盗船_II = AnimationMeta("海盗船 II", False, 0.500, "6830302282995732999", "1362868", "e4b5dc8efea09d3b0f0a7f8e780e489c")
海盗船_III = AnimationMeta("海盗船 III", False, 0.500, "6830302335047045639", "1362872", "59258d3cbc5c09058d95ee8721dd83f4")
海盗船_IV = AnimationMeta("海盗船 IV", False, 0.500, "6830302424826122765", "1362870", "fa532cb7a9d382c56927facf5cea657b")
滑入波动 = AnimationMeta("滑入波动", False, 0.500, "7023747922718102023", "1418546", "7c4a80c235da2050b672f66a0a9e54b3")
滑滑梯 = AnimationMeta("滑滑梯", False, 0.500, "6828829568879563271", "741020", "4727fafafc252616d70342eac1117dea")
滑滑梯_II = AnimationMeta("滑滑梯 II", False, 0.500, "6828829741013799432", "741022", "1ae8aa09ca773e05cd96aed6569e49a1")
百叶窗 = AnimationMeta("百叶窗", False, 0.500, "6771299961171612174", "467361", "f4cf50145a6c09ce363ca7d49ecbc05f")
百叶窗_II = AnimationMeta("百叶窗 II", False, 0.500, "6782101071402635790", "506768", "4ad738f1e4cfcde6caca3c405fc54da7")
碎块滑动 = AnimationMeta("碎块滑动", False, 0.500, "6778405418969338382", "490068", "408dbd74e95497bd0323693a477ab2a3")
碎块滑动_II = AnimationMeta("碎块滑动 II", False, 0.500, "6778300107113632269", "489860", "6f301b82e6b6b1ece2a98e182f6768ba")
立方体 = AnimationMeta("立方体", False, 0.500, "6837352063496622599", "872856", "71ae450afeb88ae2620473ab790acf0e")
立方体_II = AnimationMeta("立方体 II", False, 0.500, "6834812485023830535", "872858", "efc0e23b864f5fcfbaa77723044c4957")
立方体_III = AnimationMeta("立方体 III", False, 0.500, "6834812541118452237", "872860", "dfc2e372bc454764f0b355904542e228")
立方体_IV = AnimationMeta("立方体 IV", False, 0.500, "6841793140949520910", "872864", "c66bf1692fe1e6bd6dd2e49eddfcd0c0")
立方体_V = AnimationMeta("立方体 V", False, 0.500, "6841793224663634446", "873096", "e3935dbcaf28be18a598eebb8fb79161")
绕圈圈 = AnimationMeta("绕圈圈", False, 0.500, "6850287838441771534", "872868", "98bfd8ca3177b85246b18502832232f0")
绕圈圈_II = AnimationMeta("绕圈圈 II", False, 0.500, "6850287920255865357", "872872", "10eaa3db7b761a9846764a53912d7c77")
绕圈圈_III = AnimationMeta("绕圈圈 III", False, 0.500, "6854782718975152653", "872918", "c2e7ff02916f19a13ada361abddb8f98")
绕圈圈_IV = AnimationMeta("绕圈圈 IV", False, 0.500, "6854782786553778695", "872920", "1e7d503bcf05a17f175759e5c6cfbe7b")
缩小弹动 = AnimationMeta("缩小弹动", False, 0.500, "7017689072978104869", "1392530", "8ff952ad209f2beac6dfa82b103f769e")
缩小旋转 = AnimationMeta("缩小旋转", False, 0.500, "6760119657429996046", "447318", "8fdf7f5cf2dbd5754e523198d71dff49")
缩小转出 = AnimationMeta("缩小转出", False, 0.500, "6805018974070247950", "638823", "1e9ab706223c64254aa89156a993a3d7")
缩放 = AnimationMeta("缩放", False, 0.500, "6759078592740594184", "446078", "79b143942a4f8b4b9c80b08e37994e00")
缩放_II = AnimationMeta("缩放 II", False, 0.500, "6779083172429697544", "493000", "e70e98fcda08b4c01969e1878d7fe9a0")
翻转 = AnimationMeta("翻转", False, 0.500, "6843309964732142094", "872838", "5f153d35f1c3098fef8325badc40c5e8")
翻转_II = AnimationMeta("翻转 II", False, 0.500, "6843310029689328135", "872840", "befc44f24a2747201d1d75e6a29753ce")
翻转_III = AnimationMeta("翻转 III", False, 0.500, "6843310084743762446", "872842", "b8167fc9e9deb2f638788bfc7539ed7f")
翻转_IV = AnimationMeta("翻转 IV", False, 0.500, "6843310129736061447", "872844", "9636ccab84e8f2c357812a38b785f6e0")
翻转_V = AnimationMeta("翻转 V", False, 0.500, "6843310237902967304", "872848", "4d27983b5b2899b46334d3fd999bc7d8")
翻转_VI = AnimationMeta("翻转 VI", False, 0.500, "6843310299991249421", "872850", "8807b174b58ee897667c08e6bee1a4f8")
荡秋千 = AnimationMeta("荡秋千", False, 0.500, "6811007755785081357", "680643", "738c6740ca709cafb7045c4e3037cff0")
荡秋千_II = AnimationMeta("荡秋千 II", False, 0.500, "6811007833069326862", "680645", "bf46ce3a5478399205c1fc4bbfd7ded0")
转入转出 = AnimationMeta("转入转出", False, 0.500, "6805012562174808590", "638793", "bb04a13adc846f9b35a4054c06e5ac59")
转入转出_II = AnimationMeta("转入转出 II", False, 0.500, "6818747242258633224", "701967", "e1415d8f52a5837cef9bc29e6c17cc57")
转圈圈 = AnimationMeta("转圈圈", False, 0.500, "6829129745226011144", "741502", "234577a311bb87ef23c9b7d82174f584")
过山车 = AnimationMeta("过山车", False, 0.500, "6870060878234915342", "911862", "64e30d2e2577f6a95313ed806807baa7")
过山车_II = AnimationMeta("过山车 II", False, 0.500, "6870060932928639501", "911861", "240042ee2b35aaa7f30b6e0c03e9ac4c")
降落旋转 = AnimationMeta("降落旋转", False, 0.500, "6759075297091392007", "446076", "9c7be518c1cc63a947fdc2e311b724e9")
魔方 = AnimationMeta("魔方", False, 0.500, "6870060995365048840", "1362938", "b104d21e0f1b7eb044946f6bf0be1133")
魔方_II = AnimationMeta("魔方 II", False, 0.500, "6870061049559650829", "1362940", "53bc750124a30d746adbf44151116fde")
# 付费特效
分身 = AnimationMeta("分身", True, 0.500, "6883761132645913096", "945872", "438dd3c43be7ac470cbcca81169f2cfc")
分身_II = AnimationMeta("分身 II", True, 0.500, "6883761226950644231", "945871", "7dbd67e473fbe25e024e0ccc91c48f29")
动感摇晃I = AnimationMeta("动感摇晃I", True, 0.500, "7173927429394666020", "6983415", "ceb6b5bf10aab23f1066481cefd5adfb")
动感摇晃II = AnimationMeta("动感摇晃II", True, 100.000, "7175103054956466744", "7129471", "4e88c30adc92ca2809d285ab67276467")
四格滑动_II = AnimationMeta("四格滑动 II", True, 0.500, "6883727923845534216", "945729", "1e04f7d49030244ee10eafeb832f372e")
四格翻转_II = AnimationMeta("四格翻转 II", True, 0.500, "6865579178599649806", "1362930", "840aa022c0a9b3b6b4876dd7084372b7")
回忆旋转 = AnimationMeta("回忆旋转", True, 0.500, "7186961278022193722", "8300599", "fa3c068a56733a2149d5c0d03560aad8")
坠落 = AnimationMeta("坠落", True, 0.500, "7235902373971890747", "14020637", "0049e2c104b1ae46dbf717ea73b71234")
弹动冲屏 = AnimationMeta("弹动冲屏", True, 0.500, "7200308690904158778", "9491799", "179cec03f1ad01245c554a599699d9ad")
波动吸收 = AnimationMeta("波动吸收", True, 0.500, "7107468232390349349", "2786424", "ddbc0f962c69263480e6d188bf2f4b63")
波动放大 = AnimationMeta("波动放大", True, 0.500, "7111631619768717860", "3113716", "90f87e49deba3845d73b5855dc3fa442")
相框滑动 = AnimationMeta("相框滑动", True, 0.500, "7206139216038728248", "10166295", "517a71d78782ebc9a9718acfb865fba9")
红酒摇晃 = AnimationMeta("红酒摇晃", True, 0.800, "6903771548436402702", "1417022", "95d79896a437524c4f94dc2902bb3b6c")
跳跳糖 = AnimationMeta("跳跳糖", True, 0.700, "7199944821098680890", "9432783", "fc4e0cc6a2f2c775659fa9493cff9fe8")
闪光放大 = AnimationMeta("闪光放大", True, 0.500, "7166437469909422623", "6210029", "d73e12e5f219c298b59fcca7f34fadac")
闪光放大_II = AnimationMeta("闪光放大 II", True, 0.500, "7166437532568130055", "6210033", "0abf6172e49e9aab880f6a2283ffe5e2")
================================================
FILE: src/pyJianYingDraft/metadata/video_intro.py
================================================
"""视频片段入场动画元数据"""
from .effect_meta import EffectEnum, AnimationMeta
class IntroType(EffectEnum):
"""视频/图片入场动画类型"""
# 免费特效
Kira游动 = AnimationMeta("Kira游动", False, 2.267, "7311984593387655731", "34176967", "05daa2cb2b53e1830a0e657ede749daf")
上下抖动 = AnimationMeta("上下抖动", False, 0.500, "6739418390030455300", "431652", "bff95de5e1e4803ea64a52632bcfb361")
动感放大 = AnimationMeta("动感放大", False, 0.500, "6740867832570974733", "431662", "3d880239a1fa70fbaedcc7fd20794e22")
动感缩小 = AnimationMeta("动感缩小", False, 0.500, "6740868384637850120", "431658", "8357dd30914ef6ba1ba89dd12a83dc3e")
向上滑动 = AnimationMeta("向上滑动", False, 0.500, "6798333487523828238", "624739", "91285fcdbc398dd776994fd67b3c93fb")
向上转入 = AnimationMeta("向上转入", False, 0.500, "6808401616564130312", "645307", "5bf5677a81740d903c673d6647979f92")
向上转入_II = AnimationMeta("向上转入 II", False, 0.500, "6818747060649464327", "701961", "4f2fac081f3d5f7e28c9ba131a397e83")
向下滑动 = AnimationMeta("向下滑动", False, 0.500, "6798333705401143816", "624735", "1b122a36e9704adc7ed708dc38b5cde3")
向下甩入 = AnimationMeta("向下甩入", False, 0.500, "6739338374441603598", "431638", "afb5afec3c42fa627a007ff609c83792")
向右上甩入 = AnimationMeta("向右上甩入", False, 0.500, "6740122731418751495", "431644", "12ae5b6cc0b2bff43e958d5ca2d574fe")
向右下甩入 = AnimationMeta("向右下甩入", False, 0.500, "6739395718223499787", "431640", "f821a402edb042a9d68d825cb804ac6e")
向右滑动 = AnimationMeta("向右滑动", False, 0.500, "6798333076469453320", "624743", "47da2c90ea02fe7fe43964d6f1a4763e")
向右甩入 = AnimationMeta("向右甩入", False, 0.500, "6739338727866241539", "431636", "228f76b86355e74087a9a80647236b88")
向右转入 = AnimationMeta("向右转入", False, 0.500, "6805019065761927694", "638825", "6c3e6841393ea481e24f9609795ffdad")
向左上甩入 = AnimationMeta("向左上甩入", False, 0.500, "6740122563692728844", "431648", "aa97897803351debd46c9182132c64c5")
向左下甩入 = AnimationMeta("向左下甩入", False, 0.500, "6739395445346275853", "431642", "269d5e19ed83faa5f5c72a1401e4564b")
向左滑动 = AnimationMeta("向左滑动", False, 0.500, "6798332871267324423", "624747", "5b60ce256ff3e027d8faac4cbf9b333a")
向左转入 = AnimationMeta("向左转入", False, 0.500, "6816560956647150093", "699157", "154e410f1e8b2e36a30ff4d5201c8146")
左右抖动 = AnimationMeta("左右抖动", False, 0.500, "6739418540421419524", "431654", "7572d7461e38d73c578aa8e4dca7163a")
抖动下降 = AnimationMeta("抖动下降", False, 0.500, "6991764455931515422", "1206320", "4e6015e353a96bce299925a8c9fbc1d9")
折叠开幕 = AnimationMeta("折叠开幕", False, 1.500, "7239273897491698232", "14506065", "1a5f55beade9f0bcfc16abb0cc048bb0")
放大 = AnimationMeta("放大", False, 0.500, "6798332733694153230", "624751", "028a77e121c22a4dd130a46a0ed90714")
斜切 = AnimationMeta("斜切", False, 0.700, "7210657307938525751", "10696371", "a385761197d457f4599d231421045230")
旋转 = AnimationMeta("旋转", False, 0.500, "6798334070653719054", "624731", "1b4ac2773d9c05ffb34dca05cf91b030")
旋转开幕 = AnimationMeta("旋转开幕", False, 1.000, "7186944542409495099", "8295043", "407822a27a67612c3caa3e4223aa32d3")
渐显 = AnimationMeta("渐显", False, 0.500, "6798320778182922760", "624705", "ee269b77e45a2466bd3e9cab0cff7137")
漩涡旋转 = AnimationMeta("漩涡旋转", False, 0.500, "6782010677520241165", "703281", "edc6024d7570bc32b857956c1535209f")
缩小 = AnimationMeta("缩小", False, 0.500, "6798332584276267527", "624755", "280a82a500b34c3d84b078b2475803ff")
翻入 = AnimationMeta("翻入", False, 1.170, "7452407076417966619", "98430529", "bd0a96cbfbb58eb67c5f4e86f537b858")
跳转开幕 = AnimationMeta("跳转开幕", False, 0.733, "7279999334001676857", "23185431", "817876a62d2d05e4eef9ac4cfa9c70fe")
轻微抖动 = AnimationMeta("轻微抖动", False, 0.500, "6739418227031413256", "431664", "7ec99bda70fa6922395d65235991f9e5")
轻微抖动_II = AnimationMeta("轻微抖动 II", False, 0.500, "6739418677910704651", "431650", "8e29ab0a86dac5719300064821e8b63d")
轻微抖动_III = AnimationMeta("轻微抖动 III", False, 0.500, "6781683302672634382", "503136", "e25fa4efce8d2c62016bc11a0e0d4904")
轻微放大 = AnimationMeta("轻微放大", False, 0.500, "6800268825611735559", "629085", "a8eddffa64b3bf8b6befe1e4e6e91df9")
钟摆 = AnimationMeta("钟摆", False, 0.500, "6803260897117606414", "636115", "31439e9447cd9709309fd44a22c1ad1c")
镜像翻转 = AnimationMeta("镜像翻转", False, 0.500, "6797338697625768455", "646003", "55ec076a5d62f7e80655e60c43f68f80")
雨刷 = AnimationMeta("雨刷", False, 0.500, "6802871256849846791", "634681", "3d08753b4ef1c5b6cd560872c13f25ad")
雨刷_II = AnimationMeta("雨刷 II", False, 0.500, "6805748897768542727", "640101", "aef16d1fb0f1275265a780b309628d32")
# 付费特效
_2024 = AnimationMeta("2024", True, 1.500, "7309774750677471794", "33056565", "d68370ce25f28ec80d9c0bb7e51e2324")
_2025 = AnimationMeta("2025", True, 1.500, "7446306216038371891", "95801149", "58944f40a06bd8f495878ecdcb571345")
PASSION = AnimationMeta("PASSION", True, 2.000, "7432237078705869362", "88544178", "a080de8fb1526e31a9dee3e45e459c4e")
三屏下滑 = AnimationMeta("三屏下滑", True, 1.830, "7436273289170784818", "90036560", "381d876d9928eb62bde9747611283907")
三屏切闪 = AnimationMeta("三屏切闪", True, 1.040, "7434412782289687066", "89308508", "c75441422682a6328f53c83b67d30979")
九宫格 = AnimationMeta("九宫格", True, 2.000, "7434746460186350090", "90178902", "9eb29d05c1cd6329ec504d4fa2c57b09")
交叉震动 = AnimationMeta("交叉震动", True, 0.833, "7222990639984546360", "12309329", "cde910202607be12ac747e2e76316e7f")
交错开幕 = AnimationMeta("交错开幕", True, 1.100, "7280797339042714169", "23387955", "123322fa9ce7c37f0c2c35819f00b524")
侧滑 = AnimationMeta("侧滑", True, 0.600, "7239559299196785209", "14524393", "c67d95e820752346af44e2cb515c0115")
便利贴 = AnimationMeta("便利贴", True, 0.900, "7379456870265655859", "70486392", "06613663efa8ef29beadf8746019c823")
冬季雪花 = AnimationMeta("冬季雪花", True, 2.000, "7447044440868262451", "96136129", "088d30b9eee734c026dcb2d8f11618f4")
冰块 = AnimationMeta("冰块", True, 1.300, "7413325383308677683", "82268315", "2224a7b3f79152b77566727a1290f706")
冰雪融化 = AnimationMeta("冰雪融化", True, 2.920, "7447044440868278794", "96136131", "0508ed7e6fe8ff42ab78164ffb629836")
冲撞 = AnimationMeta("冲撞", True, 2.000, "7215530662986519096", "11320895", "aeadb248c06d074a2d98f425a57999f0")
分屏横移 = AnimationMeta("分屏横移", True, 1.000, "7257878167023522365", "18746326", "dcadf2284399fe6200f77fad9a1ec41a")
分屏组合 = AnimationMeta("分屏组合", True, 2.960, "7434746460186366515", "89406819", "2defa48676a2b511bbb333ca7d69d72c")
分屏翻转 = AnimationMeta("分屏翻转", True, 0.700, "7257782721575916088", "18711457", "013f6255cb0672198f26962bff3f788b")
分身模糊 = AnimationMeta("分身模糊", True, 1.500, "7434746460186350131", "89406818", "3573d7a9a1fa61187b074920225113df")
划水 = AnimationMeta("划水", True, 0.800, "7226632607939695161", "12811781", "57a259c58a4daddacc897c75ec9c10a4")
区域色块滑动 = AnimationMeta("区域色块滑动", True, 2.000, "7436273288608748042", "90036562", "c6f4273c83dfdedaf158bb5e337dce56")
十字震动 = AnimationMeta("十字震动", True, 0.800, "7352824361625063987", "54686020", "33d4a2ff79aa2fb88fadd45aee1998e9")
卡片扫光 = AnimationMeta("卡片扫光", True, 1.830, "7437386424032186931", "90546137", "9f873b0475f78fe43bbc5f9d58cbcbf7")
发光矩形 = AnimationMeta("发光矩形", True, 1.033, "7346511208171704841", "51093680", "64852509d7cb2a578469b3438b94df52")
变速扩大 = AnimationMeta("变速扩大", True, 0.960, "7450031573954466314", "97484920", "60a1846c0d3b9fc2e695f8fa442a1061")
变速时空 = AnimationMeta("变速时空", True, 1.210, "7437386424036364850", "90546138", "71b1183be83d398f726b090d3fc7b00d")
向上滚动 = AnimationMeta("向上滚动", True, 1.000, "7312341574988337690", "34388476", "14e7c85bfa04ecbacc1e63ee386840b7")
向上闪入 = AnimationMeta("向上闪入", True, 0.700, "7273389803532456504", "21816946", "ecaffca7c7e1d7744fa296a29f65b366")
向下甩动 = AnimationMeta("向下甩动", True, 1.400, "7338320641306661410", "47050546", "060ee66b7f59d3d2c8064be5ae32171c")
四屏转换 = AnimationMeta("四屏转换", True, 1.000, "7341283787143123507", "48492378", "fdd9abc8f2abadc0ae6e909779f282e6")
圆形开幕 = AnimationMeta("圆形开幕", True, 0.900, "7218210014949806647", "11680735", "2c171ce2c85042bb518cbdc08ced9709")
多层环形 = AnimationMeta("多层环形", True, 2.000, "7329444938960081460", "42686363", "54801ad31b13853ad1e3ccf945e89973")
多屏分割I = AnimationMeta("多屏分割I", True, 1.420, "7434055685572137509", "89192703", "945cf7d06a8e4cb96900930b8f53b153")
多屏分割II = AnimationMeta("多屏分割II", True, 1.830, "7434055685572137499", "89192705", "8772c91f6a723135cee240f40e7c866c")
多维空间 = AnimationMeta("多维空间", True, 1.380, "7449596462645645850", "97260799", "905ade2435f618aa8a43a8a63093ac89")
展开 = AnimationMeta("展开", True, 0.500, "7221413342257091133", "12088589", "553acdb325d76533d6ecbd6d621d9b9e")
幸运圣诞树 = AnimationMeta("幸运圣诞树", True, 2.000, "7447044441371578906", "96136128", "8f367e116b1b08096d810239e5901626")
开辟2025 = AnimationMeta("开辟2025", True, 2.000, "7461839463879021083", "101958682", "cc2e0b3ccac6d3c77b4bd6f4004a2f78")
弹力分割 = AnimationMeta("弹力分割", True, 1.060, "7267827357627454013", "35994464", "9f5878effce0a857900a4f050ea52318")
弹近 = AnimationMeta("弹近", True, 1.500, "7314144465944318502", "35289246", "30c62d3ccb969173e5fa43511894116b")
录像带分屏 = AnimationMeta("录像带分屏", True, 2.000, "7436273288600359474", "90036561", "6408ea1b75c87ae2e38b2aed16669434")
心形放大 = AnimationMeta("心形放大", True, 1.500, "7042968847070007844", "1487080", "3bb1bb084e5ebf25e67fc078d3c6a119")
快速翻页 = AnimationMeta("快速翻页", True, 0.167, "7296381392340914715", "27878991", "6e1d71ff694a87526f9c5bb2c01c927d")
手写云朵 = AnimationMeta("手写云朵", True, 1.530, "7468589903001948681", "104144357", "7a0c9770e836caeb1c815acbb4e5f3f5")
手机倒数 = AnimationMeta("手机倒数", True, 6.920, "7448898555617497610", "97032631", "276125acc604618051e1bd314beb51d3")
扫描 = AnimationMeta("扫描", True, 0.600, "7312335732721324554", "34385508", "191401f0b79c28d7569dfc356ba827b6")
抖动变焦 = AnimationMeta("抖动变焦", True, 0.800, "7156911481563386381", "5414507", "04365018fdc27b7e1175b709a739f800")
抖动横移 = AnimationMeta("抖动横移", True, 0.567, "7265946978792510010", "20437845", "e4951e1d7abcdbd4e8bf1cf33430def7")
报纸拼贴 = AnimationMeta("报纸拼贴", True, 1.500, "7449589619034690074", "97255882", "2f6b5f1c14c895aa722a73de7a5b8a46")
报纸拼贴Ⅱ = AnimationMeta("报纸拼贴Ⅱ", True, 1.500, "7449589619038884390", "97255883", "f02f54523dc3088f4d86b2360009b795")
拉丝滑入 = AnimationMeta("拉丝滑入", True, 0.500, "7112725640901562887", "3179668", "913b99e9012d50f629c59a31e030b143")
拼图 = AnimationMeta("拼图", True, 1.067, "7369889381357720102", "64963350", "4b721a1559eb3451d6cc358468537c49")
探灯聚焦 = AnimationMeta("探灯聚焦", True, 2.000, "7435897594074649114", "89895075", "7ec962a4e0a18e6058b890ff3cfa5f4f")
斜向拉丝 = AnimationMeta("斜向拉丝", True, 0.667, "7360531434487943743", "58777551", "60ba474a0460cb7e999830c02943e977")
旋转圆球 = AnimationMeta("旋转圆球", True, 0.800, "7380298290140549647", "70989966", "19b93b0edea19a73d2cf7f818ace3265")
时间倒计时 = AnimationMeta("时间倒计时", True, 2.000, "7448898555617481242", "97032629", "68b1e9bfc8e536dbe58411bb5ceee60b")
晃动抽帧 = AnimationMeta("晃动抽帧", True, 2.960, "7435897594070438438", "89895076", "2e2a13b5a090fc91017dd5152d04a682")
曝光放射 = AnimationMeta("曝光放射", True, 0.800, "7158737452939612703", "5529363", "09df65728356189436974e08c42bc578")
果冻_I = AnimationMeta("果冻 I", True, 0.800, "7171640017574433294", "6725401", "4ef7f9da6b1331109620381229d55429")
果冻_II = AnimationMeta("果冻 II", True, 0.800, "7171690870788329992", "6732061", "01d346b0f37b87c25c17a53309189432")
枫叶遮罩 = AnimationMeta("枫叶遮罩", True, 2.300, "7436273288612942363", "90036564", "877f92396eab2601eaca2fb422dd8d78")
模糊聚焦 = AnimationMeta("模糊聚焦", True, 1.200, "7337937899704291866", "46838778", "38841ccaef6186af6d516eeea116b3c6")
横向模糊 = AnimationMeta("横向模糊", True, 0.500, "7301896031673782835", "29805902", "b8b953ad94b16c47601af887d4ccc8c9")
水墨 = AnimationMeta("水墨", True, 2.433, "7321672946466951731", "39180627", "9c74b6af409178e996b8e0ed792568bf")
水滴遮罩 = AnimationMeta("水滴遮罩", True, 1.960, "7441475431309513267", "93637608", "710525364edbf1465373b6e14c83baba")
油画描边变色 = AnimationMeta("油画描边变色", True, 2.000, "7439276108022813193", "92053880", "6284442b7ed8abd5d8e8f6614f97b37e")
波纹弹动 = AnimationMeta("波纹弹动", True, 1.200, "7345731405663441460", "50640360", "b29c4c4dbac023b27bac5d32e642f6bb")
流金 = AnimationMeta("流金", True, 1.500, "7322367212142989850", "39438403", "6654a74eb923c201fe18765f18d4b367")
游蛇开幕 = AnimationMeta("游蛇开幕", True, 2.000, "7461845576447955506", "101962292", "22c162cc37bdf21a5a15421950b68ce4")
滑片滑动 = AnimationMeta("滑片滑动", True, 1.400, "7447351620641247781", "96240861", "c0dfe6ccb8f4c5e08a4607fdd10f18db")
灼烧出现 = AnimationMeta("灼烧出现", True, 2.880, "7447044441388356106", "96136130", "37f3e9ceaabb3b3a50a353d223149ba3")
点开 = AnimationMeta("点开", True, 1.300, "7436667461837001267", "90252347", "d96f9c34b6cb885e6e15bb7ddeceac96")
烟雾弹 = AnimationMeta("烟雾弹", True, 1.200, "7226641244938572346", "12815013", "8c5e4642b824c252b5a556bbbcbae767")
照片回忆 = AnimationMeta("照片回忆", True, 2.000, "7436273289170784806", "90036563", "991dbb7aaa14639551cdca16c0883ad7")
爱心碰撞 = AnimationMeta("爱心碰撞", True, 2.667, "7327872475453198848", "41910725", "119e873890708ee4817c9778dcb20b69")
玫瑰 = AnimationMeta("玫瑰", True, 1.533, "7397370569856913947", "77061084", "c3988af5cd8a2ac4e70974fa84cf732a")
玻璃聚集 = AnimationMeta("玻璃聚集", True, 1.700, "7340265236101861915", "48072242", "68c8e8f1eba4f4b2e3d35472f8b4822c")
画出爱心 = AnimationMeta("画出爱心", True, 1.600, "7248901535894082105", "16211481", "6e5cdc1e7ece582da904ac520440e88a")
画面擦除 = AnimationMeta("画面擦除", True, 2.000, "7448898555617481226", "97032630", "a37e8b30f8debf2be5c931369dee8408")
砸出波纹 = AnimationMeta("砸出波纹", True, 1.560, "7255594501694034490", "18159482", "644483b024fc852955dd807da067d8e9")
神奇弹窗 = AnimationMeta("神奇弹窗", True, 0.500, "7467842885740663306", "103860744", "b2a515917204b3170e9f62a744b5cabd")
空间扭曲 = AnimationMeta("空间扭曲", True, 1.160, "7298688232294715931", "28693486", "da3a08519a9315e3625173b71a4d8ee3")
立体交叉 = AnimationMeta("立体交叉", True, 0.670, "7434746460190544435", "89406816", "37139f633f7571596e353fc87aa05e48")
立体翻转 = AnimationMeta("立体翻转", True, 1.100, "7346505124820292150", "51089258", "bad88fa72b42b3c12099c31654575952")
立方分体 = AnimationMeta("立方分体", True, 1.800, "7402167652220670514", "78751449", "d0b7a46baedbeea7461f75308b2f45e4")
竖向拼接 = AnimationMeta("竖向拼接", True, 2.460, "7434412782302269962", "89308509", "d52a15d1d7d21a8b3e74496e048d708b")
粒子爱心 = AnimationMeta("粒子爱心", True, 3.000, "7468589731727544882", "104144327", "567e5354ca37d56d1bceb25db0b31961")
翻书 = AnimationMeta("翻书", True, 1.600, "7452662871550333477", "98557334", "18d7c2ae3935e215ab347f57412511ba")
翻卡 = AnimationMeta("翻卡", True, 1.000, "7431502518753956403", "88299576", "3a81e284b4864161bf8a0dd1ecbc2d02")
老电视 = AnimationMeta("老电视", True, 1.400, "7290754106417746491", "26091602", "4cbe6bdc6da704e481a40f44266cee0b")
聚合 = AnimationMeta("聚合", True, 2.000, "7303524763589153306", "30391788", "c3293067129322c884d0865b99cb11bd")
能量立方 = AnimationMeta("能量立方", True, 1.333, "7359472053998588425", "58285135", "301b4ffff8510c87b7174161b2642ca3")
脉冲 = AnimationMeta("脉冲", True, 0.900, "7379909514847326732", "70764198", "ae7fac0214409e340db6a600e97303da")
色散波纹 = AnimationMeta("色散波纹", True, 0.830, "7299029942870741542", "28824874", "2ce459ce040280d7c4f36ab78a3612e5")
荧光爆闪 = AnimationMeta("荧光爆闪", True, 1.000, "7347948517471556096", "51992419", "84d6cfae125a71855b500604748f1e19")
负片闪屏 = AnimationMeta("负片闪屏", True, 1.500, "7434055685576331785", "89192704", "4539b2ba073f714f67c5d55846969b3d")
转圈圈 = AnimationMeta("转圈圈", True, 0.800, "7246643852411408952", "15726741", "f2c920e366c3c733f1d86a8473aff310")
迷幻流光 = AnimationMeta("迷幻流光", True, 1.800, "7395178910083715638", "76511457", "07fc56d6ae64a5569a4d29241ae4ed4e")
金沙 = AnimationMeta("金沙", True, 2.000, "7441139821747114523", "93472473", "e0a60138ee45dbbaffe99037bea1f649")
钱币遮罩 = AnimationMeta("钱币遮罩", True, 2.000, "7461942207482696242", "102049088", "cb8e64195318a300777e13b2c0222733")
镜面组成 = AnimationMeta("镜面组成", True, 1.500, "7350282290984915491", "53224111", "b7bc1db5951ce591ae1597930163300e")
闪屏 = AnimationMeta("闪屏", True, 1.200, "7242155802209817147", "14904085", "c2f368ce853ab863a12c686bb99bb41e")
闪现 = AnimationMeta("闪现", True, 0.440, "7210363235906622012", "10668047", "6a680c49cd11a05f3eb0e5a3fed165f7")
闪电分屏 = AnimationMeta("闪电分屏", True, 2.000, "7437386424032170505", "90546139", "1c963b5daf0a51d593daa20f721bf00e")
雪花遮罩 = AnimationMeta("雪花遮罩", True, 1.750, "7442590758760092198", "94174749", "7e3d713bc1cbca8485fafe45e991926f")
震动波纹 = AnimationMeta("震动波纹", True, 1.500, "7307196313148330547", "31806105", "95760b6f7efe0016546e38852a981f49")
震撼倒数 = AnimationMeta("震撼倒数", True, 3.000, "7446622476928291365", "95912088", "1de39133273edb6e9d4fe9d09fa1a614")
震波 = AnimationMeta("震波", True, 0.800, "7115301367786246692", "3297068", "8aaccb8f112aa3cacd80fa79fcc1690f")
震波_II = AnimationMeta("震波 II", True, 0.833, "7211042099737662009", "10744265", "f8f236cd1279af3680bcc71dda889d97")
震波_III = AnimationMeta("震波 III", True, 1.700, "7288985830578721336", "25545977", "3be0a1f04cf38bf05ed301ebaeb47ef8")
鞭炮遮罩 = AnimationMeta("鞭炮遮罩", True, 2.000, "7461915994215158299", "102019912", "f6f0ab25c8fcfedaaf9eef2810f904ed")
音量大小 = AnimationMeta("音量大小", True, 2.000, "7462226433700532745", "102188589", "b14936183e0d2fe5f93bd9dd69c35d7f")
飞近 = AnimationMeta("飞近", True, 1.600, "7394717122653327910", "76385331", "494edea80cf2f3df65f35b1ea01bdd11")
马赛克 = AnimationMeta("马赛克", True, 1.000, "7282703408383922745", "23885083", "273c4952c915c9250f0b9edadac34148")
魔方_III = AnimationMeta("魔方 III", True, 1.100, "7432135739745243686", "88465764", "180602469260e0c4d602d42b07077dd7")
魔法粒子I = AnimationMeta("魔法粒子I", True, 3.000, "7446622476928291379", "95912089", "5acc75119eb941cf0645b69d2d0fdc7e")
魔法粒子II = AnimationMeta("魔法粒子II", True, 3.000, "7446673584296038949", "95966017", "6daa910b7beacaa1fe83f0fe20a793f1")
黑白画中画 = AnimationMeta("黑白画中画", True, 2.000, "7436273288608764442", "90036559", "3b710c8ca2702e2a42144d12ff5bd05e")
================================================
FILE: src/pyJianYingDraft/metadata/video_outro.py
================================================
"""视频片段出场动画元数据"""
from .effect_meta import EffectEnum, AnimationMeta
class OutroType(EffectEnum):
"""视频/图片出场动画类型"""
# 免费特效
Kira游动 = AnimationMeta("Kira游动", False, 2.267, "7312343337199997450", "34389264", "2cefeb684db271dc288ec225f0854264")
冰雪融化 = AnimationMeta("冰雪融化", False, 2.830, "7447044440864068122", "96136047", "c3806ca50307f798df80d69543b14233")
向上滑动 = AnimationMeta("向上滑动", False, 0.500, "6798333612958683656", "624737", "43ef6ea305ccdd352da4b99ad32e38db")
向上转出 = AnimationMeta("向上转出", False, 0.500, "6818747115934585357", "701963", "1df50f9f9efc23d2851835537221b787")
向上转出_II = AnimationMeta("向上转出 II", False, 0.500, "6818747169017696781", "701965", "c79f370e70e40c577391e4a59da76c70")
向下滑动 = AnimationMeta("向下滑动", False, 0.500, "6798333787986989576", "624733", "d39ba8884ffc4004118c2fa801d6ea97")
向右滑动 = AnimationMeta("向右滑动", False, 0.500, "6798333350487527950", "624741", "b768f38810fc11df947c6196a6d882ec")
向左滑动 = AnimationMeta("向左滑动", False, 0.500, "6798332972098392584", "624745", "2d14982cf9f87f4eda4e5443df0b4b9e")
折叠闭幕 = AnimationMeta("折叠闭幕", False, 1.500, "7239273967310082621", "14506017", "340da8c2704438c157adff1a55f3df0f")
放大 = AnimationMeta("放大", False, 0.500, "6798332801864176142", "624749", "01497dc221d288e623a10cac94a5ceca")
斜切 = AnimationMeta("斜切", False, 0.700, "7210659943051956797", "10697199", "93fd7d9c4f059c26cd3681dd512c20ed")
旋转 = AnimationMeta("旋转", False, 0.500, "6798334141323547143", "624729", "ae8bdfafbae781ad29bc60b438ff461c")
旋转闭幕 = AnimationMeta("旋转闭幕", False, 1.000, "6942482728335970823", "1221132", "b235b8a2a8647a211494856315cde2a9")
渐隐 = AnimationMeta("渐隐", False, 0.500, "6798320902548230669", "624707", "07d916d9179660641ae0f427315c5591")
漩涡旋转 = AnimationMeta("漩涡旋转", False, 0.500, "6778418947361346061", "634701", "1af131118c1c8f0f97898aeebcb4c38e")
灼烧出现 = AnimationMeta("灼烧出现", False, 2.960, "7447044440859873801", "96136048", "cfae1a683f11299f0c1d133d436b2746")
缩小 = AnimationMeta("缩小", False, 0.500, "6798332648814023181", "624753", "2ef923500a3c5501236774f26ea6855c")
翻出 = AnimationMeta("翻出", False, 1.170, "7452359860659687986", "98425486", "a8e91c830363162a11e80acb6665e426")
跳转闭幕 = AnimationMeta("跳转闭幕", False, 0.733, "7280420767378969143", "23302677", "82992a12a8ae1227579be0f66d87d75f")
轻微放大 = AnimationMeta("轻微放大", False, 0.500, "6800268611807089166", "629083", "fb575b5c3655a74e8cccb6bdf5d54230")
镜像翻转 = AnimationMeta("镜像翻转", False, 0.500, "6738353628215513613", "645999", "a24594428fdd0c8078b74659fc1f2679")
# 付费特效
_2024 = AnimationMeta("2024", True, 1.000, "7311958876406944266", "34158075", "93bcb64554588e6f3a0a4ffffa0bb3b5")
_2025 = AnimationMeta("2025", True, 1.000, "7446306392748593714", "95801179", "2717769c8ba0483349180e1c46e95baf")
PASSION = AnimationMeta("PASSION", True, 1.500, "7432237078710063643", "88544141", "ed1934d9148fbc73e8edf76c7ddb45cd")
三屏下滑 = AnimationMeta("三屏下滑", True, 1.830, "7436273288604553766", "90036503", "11fafef6fa74aabd1c2b99bd29ee4f78")
三屏切闪 = AnimationMeta("三屏切闪", True, 1.040, "7434412782293881395", "89308379", "604869cd6d8c9b0a932d2000c906d3c6")
九宫格 = AnimationMeta("九宫格", True, 2.000, "7434746460190544411", "89406874", "f832a0fb8b57751e82f0ffcef0fb0317")
交叉震动 = AnimationMeta("交叉震动", True, 0.466, "7223227564670587452", "12330095", "3a711c053dcadb7856d19778f72a58c1")
交错闭幕 = AnimationMeta("交错闭幕", True, 1.100, "7280797214186672701", "23387942", "1804a8bb6a3eb61c8e5720428d4648e7")
侧滑 = AnimationMeta("侧滑", True, 0.400, "7239559574095663671", "14524385", "1a661b1d0728177d889353174bfb0bf8")
便利贴 = AnimationMeta("便利贴", True, 0.800, "7379884133268328996", "70741835", "ce8f5846f77edba5099b042ef7b6958b")
冬季雪花 = AnimationMeta("冬季雪花", True, 2.000, "7447044440868262410", "96136049", "fe72ee1d6384b9f5a489a56beb5dacd6")
冰块 = AnimationMeta("冰块", True, 1.300, "7413731112406487604", "82396222", "103cbd9c8058716c95bf41fd65a182a8")
冲撞 = AnimationMeta("冲撞", True, 0.767, "7215555273501446716", "11325221", "16e01aa5454653bc89d3b1d8e86ce3a2")
分屏横移 = AnimationMeta("分屏横移", True, 0.880, "7257879855063110205", "18746674", "7382c7210c95548bfc88486be3964284")
分屏组合 = AnimationMeta("分屏组合", True, 2.960, "7434746460186350117", "89406873", "eacdb5c2875d937855253ffea04ac13e")
分屏翻转 = AnimationMeta("分屏翻转", True, 0.560, "7259341241031070268", "19063130", "392b91fd262e9b95e1dcd18274297393")
分身模糊 = AnimationMeta("分身模糊", True, 1.500, "7434746460182155827", "89406876", "3ee97e0d0ed3a62f4b0d3a218e669418")
划水 = AnimationMeta("划水", True, 0.800, "7226632692354257445", "12811717", "f30ab9f83934eafedb4ee01a3d87a995")
区域色块滑动 = AnimationMeta("区域色块滑动", True, 2.000, "7436273288604553755", "90036504", "0f266778630aeea62a69ed0dd471fff5")
十字震动 = AnimationMeta("十字震动", True, 0.533, "7352824282289803814", "54685998", "969e17d5d65494d0b10b9111d66802d8")
卡片扫光 = AnimationMeta("卡片扫光", True, 1.830, "7437386424036381211", "90546052", "e2711c17d261ee1aef022bbb2110be51")
发光矩形 = AnimationMeta("发光矩形", True, 1.133, "7346510998771077659", "51093596", "ccac330a683da920a9638b597ce1f869")
变速扩大 = AnimationMeta("变速扩大", True, 1.000, "7450031573958660617", "97484974", "430709c96a8a5fb7cc6e7d36f5babf5b")
变速时空 = AnimationMeta("变速时空", True, 1.210, "7437386424027976230", "90546051", "9ef1912cc3f221218c32bc41bb61a548")
向上滚动 = AnimationMeta("向上滚动", True, 1.000, "7312341715220697650", "34388502", "92d44450f8557fc1d8d93eb6cbe2a832")
向上闪出 = AnimationMeta("向上闪出", True, 0.700, "7273389599978689079", "21816912", "4e39075df8d20d1d938c5bf23b2604fb")
向下甩动 = AnimationMeta("向下甩动", True, 1.000, "7338638617322983976", "47191669", "178fe900252c316f5301d805a735ce8e")
四屏转换 = AnimationMeta("四屏转换", True, 0.900, "7341284613165158921", "48492502", "cf7d3bd0e7973868861d1e466cb238eb")
圆形闭幕 = AnimationMeta("圆形闭幕", True, 0.900, "7218210114052821561", "11680737", "0acd6d992db52febb66a63a3cfc6ea00")
多层环形 = AnimationMeta("多层环形", True, 1.633, "7329445038604161536", "42686393", "c684bdf866bada10acb647e5339397a3")
多屏分割I = AnimationMeta("多屏分割I", True, 1.460, "7434055685572153907", "89192583", "e1697eeef0685ec658e50900df941cf4")
多屏分割II = AnimationMeta("多屏分割II", True, 2.040, "7434055685572137482", "89192581", "f892339326d234719c3069399b6b3e76")
多维空间 = AnimationMeta("多维空间", True, 1.380, "7449596462645662235", "97260826", "90d9f339bfada65f43af655eb0905427")
幕布 = AnimationMeta("幕布", True, 2.000, "7448986761297924618", "97077809", "b393d8f37b6df766bb7df35fca846169")
幸运圣诞树 = AnimationMeta("幸运圣诞树", True, 2.000, "7447044440868262450", "96136050", "177e050b5e468a62a4f36e7c7de7811c")
弹力分割 = AnimationMeta("弹力分割", True, 1.060, "7343902820808004123", "49678364", "62adcd0cd61c98d0640e657e63b0be8a")
弹远 = AnimationMeta("弹远", True, 1.200, "7314925770181186075", "35749432", "310e6755e6441af5d3405bc80a3be26d")
录像带分屏 = AnimationMeta("录像带分屏", True, 2.000, "7436273288608748041", "90036505", "a7bead6f8b55f1cbcbfcffcbd88fb573")
心形缩小 = AnimationMeta("心形缩小", True, 1.000, "7034346969086562824", "1463778", "677ec2564241df326a921fa9dc58bd81")
快速翻页 = AnimationMeta("快速翻页", True, 0.200, "7296416099606729225", "27895223", "00b26549833daf565f2660d0abcb0462")
手写云朵 = AnimationMeta("手写云朵", True, 1.530, "7468589970832232997", "104144380", "e975928331a96536e27764fbc53f6315")
扫描 = AnimationMeta("扫描", True, 0.633, "7316816362305753609", "36871694", "a89a479b5228737e62ccd7e77059315f")
抖动变焦 = AnimationMeta("抖动变焦", True, 0.500, "7153942002696983047", "5188733", "6e14698c240bfa454836d26eaa44d3bc")
抖动横移 = AnimationMeta("抖动横移", True, 0.400, "7265946879060349477", "20437843", "bcebbe81fc2243a3685ab8e550e3415f")
折叠 = AnimationMeta("折叠", True, 0.300, "7221420528148419133", "12091673", "7968ce8b7391c3725f2b7667d0e0f80a")
报纸拼贴 = AnimationMeta("报纸拼贴", True, 1.500, "7449589619038884389", "97255862", "248c4117dda85e37e36b9174c7f7ec42")
报纸拼贴Ⅱ = AnimationMeta("报纸拼贴Ⅱ", True, 1.500, "7449589619038884378", "97255861", "1d139e5602c9b848ae55d3132739c0e5")
拉丝滑出 = AnimationMeta("拉丝滑出", True, 0.500, "7114172789287817758", "3240292", "e3018d5ee625a58fdeaa5ccd75d0e2e2")
拼图 = AnimationMeta("拼图", True, 1.100, "7369889275233440265", "64963293", "9e1b296804c2f10ce26fcf727d1dd9af")
探灯聚焦 = AnimationMeta("探灯聚焦", True, 2.000, "7435897594074632730", "89895171", "3bd76848821228cc1c1a35e4da0f9ea8")
斜向拉丝 = AnimationMeta("斜向拉丝", True, 0.500, "7360531353458184715", "58777523", "71a267bc37d3dc0afa3aaae12ec995e7")
旋转圆球 = AnimationMeta("旋转圆球", True, 0.800, "7381753028732260916", "71750513", "e824e3d74a50eba64dd87ac11b9bbfb8")
晃动抽帧 = AnimationMeta("晃动抽帧", True, 2.960, "7435897594078827035", "89895170", "91c1553757cd96ea14e8cb88fc5d40be")
曝光放射 = AnimationMeta("曝光放射", True, 0.500, "7158753896624558628", "5529791", "70911371ae8ec475600c4e30c9db8994")
枫叶遮罩 = AnimationMeta("枫叶遮罩", True, 2.300, "7436273288608748058", "90036506", "b4061ff63d82958d6d828f54682b9527")
模糊聚焦 = AnimationMeta("模糊聚焦", True, 0.833, "7338742568592609801", "47267179", "2cf9380884a5e9853ecdbb4869b01b0e")
横向模糊 = AnimationMeta("横向模糊", True, 0.500, "7301943351320777267", "29824130", "294f0f8ecbe4b4a8b8f2c01f579739f1")
水墨 = AnimationMeta("水墨", True, 2.033, "7322073757080621606", "39326538", "533ce039619091d6b9886c2c78ac4aa2")
水滴遮罩 = AnimationMeta("水滴遮罩", True, 1.960, "7441475431309513254", "93637552", "06ee7696792a5aa607cecc0d14e7dd91")
油画描边变色 = AnimationMeta("油画描边变色", True, 2.000, "7439276108022813235", "92053923", "eb20d401959db40399b8fa89b27e7f38")
波纹弹动 = AnimationMeta("波纹弹动", True, 1.200, "7345803511390540288", "50691424", "660ff84eabd735769a72978914e8e82d")
流金 = AnimationMeta("流金", True, 1.133, "7322857522648322586", "39682247", "646fc008978735fbf5b5d3cde382fc22")
滑片滑动 = AnimationMeta("滑片滑动", True, 1.200, "7447351620637037106", "96240814", "0e879f2bb18535b827df1e78eca89f90")
烟雾弹 = AnimationMeta("烟雾弹", True, 0.900, "7229149181762343484", "13090999", "e70e26e7aa770d0deedca54e3eac0323")
照片回忆 = AnimationMeta("照片回忆", True, 2.000, "7436273288612942386", "90036502", "b78111677093071510de457f1a8f2019")
爱心碰撞 = AnimationMeta("爱心碰撞", True, 2.300, "7328249133079204352", "42112174", "1cf69aac7b9478f5628413aada8c0707")
玫瑰 = AnimationMeta("玫瑰", True, 1.400, "7397378784028004891", "77061996", "e19beddf933ed59e1f1d85c8273d9cb1")
玻璃爆开 = AnimationMeta("玻璃爆开", True, 0.733, "7347865496508699170", "51922869", "620f6fe34184e1f3cc2284d830c3d1e8")
画出爱心 = AnimationMeta("画出爱心", True, 1.100, "7248951676420231735", "16231427", "ad5c127255cc8f2c941f7406f8a36f19")
画面擦除 = AnimationMeta("画面擦除", True, 2.000, "7448898555617497626", "97032678", "0ac1cfe94bb7f54b8a38dc0de67b05ca")
砸出波纹 = AnimationMeta("砸出波纹", True, 1.366, "7255599483226952249", "18161234", "87e9baa63de40d76f862bb8aa4349de3")
空间扭曲 = AnimationMeta("空间扭曲", True, 0.930, "7298918355841323529", "28775864", "04c885b1dbbcf51bcc01e4df931bff72")
立体交叉 = AnimationMeta("立体交叉", True, 0.670, "7434746460190544394", "89406875", "75e703c9c10c62dfab467c17f0439261")
立体翻转 = AnimationMeta("立体翻转", True, 1.100, "7351333213068857892", "53792520", "82f13f68eb475cfaabaf2a674b50ac8a")
立方合体 = AnimationMeta("立方合体", True, 1.600, "7405509410396574242", "79925188", "75c1649483edeac1c8defd88b45839cf")
竖向拼接 = AnimationMeta("竖向拼接", True, 2.460, "7434412782285492773", "89308380", "3536cc7c83df33546ece9319b2fcd3ec")
粒子爱心 = AnimationMeta("粒子爱心", True, 3.000, "7468589804356112946", "104144349", "1410ac0223ef9473376a151bcabacdfa")
翻卡 = AnimationMeta("翻卡", True, 1.000, "7431509039437058586", "88301520", "bd316e6651f053f591dee39cc1460662")
老电视 = AnimationMeta("老电视", True, 1.600, "7283429462924857914", "24079477", "50d67778f791d56b12ab5c6da30c37b6")
能量立方 = AnimationMeta("能量立方", True, 1.133, "7361364150229930506", "59265410", "f6c5b98ea69f3b2c3265bb3249973250")
脉冲 = AnimationMeta("脉冲", True, 0.800, "7379909625870553654", "70764127", "f916cc354e9c5b80698d612397a0c4f7")
色散波纹 = AnimationMeta("色散波纹", True, 0.767, "7305961286762762790", "31248281", "5477505f844e9bad12dc9074631564b1")
荧光爆闪 = AnimationMeta("荧光爆闪", True, 0.800, "7347994415576650255", "52020801", "6558ab016ce06546d3c380b43480baab")
负片闪屏 = AnimationMeta("负片闪屏", True, 1.500, "7434055685567943194", "89192582", "15fe80d4264c5a689efd712535ce51c7")
转圈圈 = AnimationMeta("转圈圈", True, 0.800, "7246706359381529125", "15754757", "c03fc00075c5b7e53f8bdc0c6f5c360f")
迷幻流光 = AnimationMeta("迷幻流光", True, 1.500, "7395482925006852647", "76594275", "4095d8d554571c3356eefa787c7cdfe9")
金沙 = AnimationMeta("金沙", True, 2.000, "7441139691694330378", "93472419", "8eb1d7a9fbcbc2c8df45affa0c13e8a9")
钱币遮罩 = AnimationMeta("钱币遮罩", True, 2.000, "7461942340328886835", "102049160", "65b2eab128ce90c90193c62c29013f22")
镜面拆分 = AnimationMeta("镜面拆分", True, 1.500, "7405495700961628683", "79917713", "5e549cebedbc7a9453bfc24490b94e67")
闪屏 = AnimationMeta("闪屏", True, 0.833, "7243999104114627132", "15215961", "e4ef6b01ae37409046d089c73cd16702")
闪现 = AnimationMeta("闪现", True, 0.250, "7186978468087730749", "8303609", "f170e9020eaf5a6f6180c6fd30775400")
闪电分屏 = AnimationMeta("闪电分屏", True, 2.000, "7437386424032170506", "90546050", "e9950ce2750bab69fe23a91b4e803473")
雪花遮罩 = AnimationMeta("雪花遮罩", True, 1.750, "7442590863349256754", "94174789", "11b7e97fceba9cf1d7babfe764d1bdcb")
震动波纹 = AnimationMeta("震动波纹", True, 1.500, "7307196476340310554", "31806349", "cdb162bc674e495b24d38a2cf4bd04b6")
震波_III = AnimationMeta("震波 III", True, 0.733, "7289005562124046907", "25555607", "70a42c94712b15ff4fbf198be0336400")
鞭炮遮罩 = AnimationMeta("鞭炮遮罩", True, 2.000, "7461923788343480841", "102029466", "0e395a1c73b9bb3e83ae101d4df3f850")
音量大小 = AnimationMeta("音量大小", True, 2.000, "7462226526260433418", "102188408", "210be278f95cc7cce8fde314de29ab07")
飘散 = AnimationMeta("飘散", True, 2.000, "7305957010518839846", "31245441", "286553fb78795b8044746938e4327d5e")
飞远 = AnimationMeta("飞远", True, 1.600, "7394730499492549158", "76392667", "d897f0f656870ca1469ac30d61e9490a")
马赛克 = AnimationMeta("马赛克", True, 1.000, "7283415427328250405", "24073041", "6be9c2fd05f76e3902a9967139706468")
魔法粒子I = AnimationMeta("魔法粒子I", True, 3.000, "7446622476928291378", "95912176", "118e1dc5094d45b278111675f99fe4d7")
魔法粒子II = AnimationMeta("魔法粒子II", True, 3.000, "7446673724146717221", "95966045", "ff56bdebbd3863db982d845635b3c42e")
黑白画中画 = AnimationMeta("黑白画中画", True, 2.000, "7436273288612942374", "90036501", "3bdba83de89cf27167d319f5e727647f")
================================================
FILE: src/pyJianYingDraft/metadata/video_scene_effect.py
================================================
"""视频画面特效元数据"""
from .effect_meta import EffectEnum
from .effect_meta import EffectMeta, EffectParam
class VideoSceneEffectType(EffectEnum):
"""视频画面特效枚举"""
# 免费特效
_1998 = EffectMeta("1998", False, "6981791065204331044", "1183068", "d53096e8139dd33f7a2be6adcd7ce56b", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
_70s = EffectMeta("70s", False, "6706773500792689165", "634717", "0fe827460716d30e76cb3f244b9b1010", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
_90s画质 = EffectMeta("90s画质", False, "6760946510910722564", "634889", "d2b4c0ed72e66c6ae61e0ebbc7d008bf", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.630, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.580, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.510, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认63%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认58%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认51%, 0% ~ 100%"""
CCD闪光 = EffectMeta("CCD闪光", False, "7130585796020539941", "4007303", "cf66e86f715060df7a2e9268382697d4", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.950, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认65%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认95%, 0% ~ 100%"""
DV录制框 = EffectMeta("DV录制框", False, "6878115805498708493", "934600", "4828fe3f6a8bdf99e57febe27006d33b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认20%, 0% ~ 100%"""
DV界面 = EffectMeta("DV界面", False, "6974600764027048462", "1164160", "ed29f490b4ccb7f00138f400b05459b5", [])
I_Lose_You = EffectMeta("I Lose You", False, "6899746903735407117", "972753", "8486881738dcb661bcd49f490a548d47", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
I_Love_You = EffectMeta("I Love You", False, "6899746786294895112", "972754", "dfa377da1cc1858ae5d5126488c5cb67", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
JVC = EffectMeta("JVC", False, "7102302420310430215", "2254788", "6060fe9faac1a35dd89c4362c57bd451", [
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.900, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认35%, 0% ~ 100%
effects_adjust_filter: 默认90%, 0% ~ 100%"""
List边框 = EffectMeta("List边框", False, "6981463637676266020", "1181892", "80a8d14e52a06b47dbb24ddeb7b65f1c", [])
MV封面 = EffectMeta("MV封面", False, "6925314612204147214", "1033288", "658b5a2a87b51d71f8f968546790257a", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
New_Year = EffectMeta("New Year", False, "7041771617315197453", "1483460", "b3322fbbf99e1d4c9da1fb0b1e97d1a6", [
EffectParam("effects_adjust_size", 0.160, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.339, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认16%, 0% ~ 100%
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认34%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
PS边框 = EffectMeta("PS边框", False, "6860306184595837448", "884226", "a787cee77871e18ae45ccd09fa7f6ac9", [])
RGB描边 = EffectMeta("RGB描边", False, "6922698007653650957", "1025970", "175536eb523aae867ae4b8cb94f09211", [
EffectParam("effects_adjust_speed", 0.670, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认67%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
VCR = EffectMeta("VCR", False, "6876012864679711245", "931458", "6b5dfc171f7c82078c76ffbcb2f6c003", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_sharpen: 默认30%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
X_Signal = EffectMeta("X-Signal", False, "6709706971638927875", "634719", "218223a1507ca3cac6b93dd8335882a0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
X开幕 = EffectMeta("X开幕", False, "6974024838000153096", "1162978", "59be0a7455162145039e48179ef42c20", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
betamax = EffectMeta("betamax", False, "7239937281937642041", "14578173", "6cae0f338637ffcf210bbb45015d9538", [
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_blur: 默认65%, 0% ~ 100%
effects_adjust_sharpen: 默认25%, 0% ~ 100%
effects_adjust_distortion: 默认40%, 0% ~ 100%
effects_adjust_texture: 默认55%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%"""
emoji钻石 = EffectMeta("emoji钻石", False, "7078694071245476366", "1647776", "afa5891d090fe132e4cf0a7196895863", [
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.548, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认55%, 0% ~ 100%
effects_adjust_rotate: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
ins界面 = EffectMeta("ins界面", False, "6761646727142314509", "635133", "1081a3f864316cb7e8ee977d44a90a70", [])
ins风放大镜 = EffectMeta("ins风放大镜", False, "6992465511455920676", "1380488", "afe7daae94e810f06b339c96deafb5f8", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%"""
kirakira = EffectMeta("kirakira", False, "6706773500142555656", "693883", "b41ed4895d84eb917581d0d5d57cc0af", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_number: 默认33%, 0% ~ 100%"""
ktv灯光 = EffectMeta("ktv灯光", False, "6771299914891661832", "634197", "0654e68b3db41a82a1abf02e48375e88", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
ktv灯光_II = EffectMeta("ktv灯光 II", False, "6934938159763427876", "1054906", "53248914c97ddf4722860554d68cac9d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
windows弹窗关闭 = EffectMeta("windows弹窗关闭", False, "6976562270071427598", "1169934", "f4d45d9888b6d0d78a147417e4851189", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
windows弹窗打开 = EffectMeta("windows弹窗打开", False, "6976538396290191880", "1169728", "6989cff6be738ec6a047871320d3bd9f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
丁达尔光线 = EffectMeta("丁达尔光线", False, "6834008866137575950", "768190", "858aa00b8938e4f0dde79225ef119f60", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
万圣emoji = EffectMeta("万圣emoji", False, "7021363005052948999", "1405514", "0b226c96ee570ed8c649d97f45879faa", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
万圣夜 = EffectMeta("万圣夜", False, "6888280327949652493", "951616", "ccd9f93a03f5849a5d5cb96729bb5bec", [
EffectParam("effects_adjust_blur", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认25%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
三屏 = EffectMeta("三屏", False, "6706773500209664515", "635029", "a753c93aef7a37f2e86870529f2cd06c", [])
三格漫画 = EffectMeta("三格漫画", False, "6795825532668744206", "635007", "5b738f1286b9929b36bc6a540f11ddd5", [])
下雨 = EffectMeta("下雨", False, "6734619419890160131", "635039", "40a59ce61692a825c049cd5b15bc6ded", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
不对劲 = EffectMeta("不对劲", False, "6940134524642660895", "1068128", "0be37b64dad56d5f6f89c69165d092fd", [])
不规则黑框 = EffectMeta("不规则黑框", False, "6865921530488951309", "898673", "2457889e649132e1a427ccd9c258e51e", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
两屏 = EffectMeta("两屏", False, "6706773500796867075", "635025", "69926ac7983e4e234c1b833e8c50896a", [])
中枪了 = EffectMeta("中枪了", False, "6950894972291781127", "1100950", "ee96dc698c6213303442b30b963978ba", [])
乌鸦飞过 = EffectMeta("乌鸦飞过", False, "6955028776094798366", "1113160", "a2583447f1ec5767bf063a831b893b9e", [])
九屏 = EffectMeta("九屏", False, "6719657094741496333", "635011", "8abb86f5699f22f9d2c8d1647458b55a", [])
九屏跑马灯 = EffectMeta("九屏跑马灯", False, "6726773973683540491", "635031", "0bc85f7544b92909bfef4d20ad17c256", [])
五彩纸屑 = EffectMeta("五彩纸屑", False, "7055567263029531143", "1535868", "f0afbedd02a658dec54e2fb588cf8b69", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.801, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
五彩缤纷 = EffectMeta("五彩缤纷", False, "7055594981683106312", "1543542", "d191e6184008984688f26f4797ec94b7", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.801, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_rotate: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
亮片 = EffectMeta("亮片", False, "6715209448521994755", "634129", "b27dcf2220fd8d3ff7216d9364d07b62", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
人鱼滤镜 = EffectMeta("人鱼滤镜", False, "6766876614862049795", "634199", "f97bd68cfc43174bcb30406a6fc46952", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认75%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%"""
仙女变身 = EffectMeta("仙女变身", False, "6746483363567112707", "634173", "b45f02e327c3c242c54f91655798d9c0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
仙女变身_II = EffectMeta("仙女变身 II", False, "6747515070114173447", "634171", "6963f2dab25279d695f581922ce9f87f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
仙女棒 = EffectMeta("仙女棒", False, "7314565034586149403", "35504704", "322d997e0f5a8a9af19acd3c871b98ff", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
仙尘闪闪 = EffectMeta("仙尘闪闪", False, "6963476143370408485", "1133662", "8b9da7f7b3cdd95bd73cc2444433017e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
低像素 = EffectMeta("低像素", False, "6810945511005098509", "703237", "07980fba1cb9edb304a39feaa92f009c", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
低像素_II = EffectMeta("低像素 II", False, "6811399125544735245", "703239", "01c40b95e4a5b8f850bad330a1864f6a", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
倒计时_II = EffectMeta("倒计时 II", False, "7051887173276013093", "1521390", "e01f6dadb794566d1ea3364d564f3f59", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
像素画 = EffectMeta("像素画", False, "7081557169539125791", "1663132", "0e6597e2bcbc35fe670bd05501ff37ed", [
EffectParam("effects_adjust_color", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.755, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.688, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_size: 默认76%, 0% ~ 100%
effects_adjust_number: 默认69%, 0% ~ 100%
effects_adjust_background_animation: 默认0%, 0% ~ 100%"""
像素纹理 = EffectMeta("像素纹理", False, "6763903685983474189", "634785", "d132cd0508064d64e92b946adfa5c8be", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
光斑虚化 = EffectMeta("光斑虚化", False, "7297154514262430259", "28151372", "2748cc7e4a94448bddefe35749cce1db", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%"""
光斑飘落 = EffectMeta("光斑飘落", False, "6899747276718084622", "972749", "5106ce263097acfbe5f8319841bc1e7a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
光晕 = EffectMeta("光晕", False, "6714239617916211716", "634095", "91a3d5329874b35dad2cf9fbf82956af", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
光晕_II = EffectMeta("光晕 II", False, "6709701759398318604", "634093", "24ade7e79a0d72d1fe5792997640e15f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
全剧终 = EffectMeta("全剧终", False, "6710109932122804750", "634079", "b756f1d59534d07571ab6fac16d8bfda", [])
六屏 = EffectMeta("六屏", False, "6719657243039502851", "635013", "95d23405c9441a388784c0749ab99471", [])
关月亮 = EffectMeta("关月亮", False, "6774656266833760780", "634277", "af6c277f693f08679dc142591bc97c52", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认33%, 0% ~ 100%"""
冰冷实验室 = EffectMeta("冰冷实验室", False, "7019265849047388680", "1398372", "0ba96868fd684b80b4cb82f058f35dc9", [
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.267, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认27%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
冰霜 = EffectMeta("冰霜", False, "6896417042090430989", "966514", "17d279016b1f0961c4e0167f2554b0f5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
冰霜_II = EffectMeta("冰霜 II", False, "7047048873897890334", "1499080", "f278e4a04de56a4fbe693e2014f5da9e", [
EffectParam("effects_adjust_speed", 0.530, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认53%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
冲击波 = EffectMeta("冲击波", False, "6967180577875169799", "1146394", "ad8e0a154e7a3c78dc23407ec23da9b2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
冲刺 = EffectMeta("冲刺", False, "6790536507905020430", "635003", "7efa92b9cc009384af9b207474f52b24", [])
冲刺_II = EffectMeta("冲刺 II", False, "6781392637216690700", "635001", "5781353d9e23652896b0dd8c43a51162", [])
冲刺_III = EffectMeta("冲刺 III", False, "6774324121783243271", "634981", "a2794140abd30a19ba136059f9f89e88", [])
冲屏闪粉 = EffectMeta("冲屏闪粉", False, "6858138911487562248", "875969", "98753cc737cac50d460ec6f204cdae5b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
凄凉 = EffectMeta("凄凉", False, "6955021464684728846", "1113134", "0491da81159994e95a68b3087a8709f3", [])
几何图形 = EffectMeta("几何图形", False, "6871054818241155592", "920550", "0c558210a312c46568635767a3600a08", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
刀光剑影 = EffectMeta("刀光剑影", False, "6740539604509659662", "634741", "8017d7de152a4083d0607b903d716943", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
分屏开幕 = EffectMeta("分屏开幕", False, "7232198317671715385", "13525811", "98ecc4fbd0e619bddad881dc93a94964", [
EffectParam("effects_adjust_speed", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认70%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%"""
初雪_I = EffectMeta("初雪 I", False, "7173558688605540901", "6940749", "8bbb39ead793c59a4baec469890be670", [
EffectParam("effects_adjust_speed", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认75%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%"""
剪纸边框 = EffectMeta("剪纸边框", False, "6926456664228893191", "1038710", "c6596eaf8591e6a1298731ead45d6861", [])
加载甜蜜 = EffectMeta("加载甜蜜", False, "6924873263994638856", "1031291", "224dafbed2fc8e3711e1cecacf68a95c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
动感模糊 = EffectMeta("动感模糊", False, "7009120603055591943", "1368758", "167deb8c5b35d5a3097cb107693c62c3", [
EffectParam("effects_adjust_horizontal_shift", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.850, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认85%, 0% ~ 100%"""
动感色卡 = EffectMeta("动感色卡", False, "7052644171240182280", "1524680", "8ad3539910485cadfc27eb3f8853317e", [
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
动感荧光 = EffectMeta("动感荧光", False, "6755761739242934798", "635125", "d9f1ac0e1677dcd4475235ea113f03fa", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
动感蓝带 = EffectMeta("动感蓝带", False, "6970598283378954765", "1155430", "28edc10c2a172ca68f6be21037700538", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
单色涂鸦 = EffectMeta("单色涂鸦", False, "7265798651019006521", "20412423", "8a63108339eeb62c0a26122e2f22a850", [
EffectParam("effects_adjust_color", 0.300, 0.050, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.570, 0.000, 0.810),
EffectParam("effects_adjust_horizontal_shift", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认30%, 5% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_number: 默认57%, 0% ~ 81%
effects_adjust_horizontal_shift: 默认70%, 0% ~ 100%
effects_adjust_background_animation: 默认70%, 0% ~ 100%
effects_adjust_size: 默认10%, 0% ~ 100%
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%"""
南瓜光斑 = EffectMeta("南瓜光斑", False, "6992844454453318157", "1403930", "3626a4cba39f68ed0bbf43b58c023e07", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
南瓜笑脸 = EffectMeta("南瓜笑脸", False, "6888208083202347534", "951196", "e28abcdb93864f4d4c1d340e9ce567a5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
卷动 = EffectMeta("卷动", False, "6719657168292811278", "634735", "613ab501b1260fee424d266c6a214b5e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
原相机 = EffectMeta("原相机", False, "6753416178909057549", "635137", "bc6e1e30a3e6efd3ad60939a09e66323", [])
友友商店 = EffectMeta("友友商店", False, "6977709836993565220", "1173234", "6fd942a59a1b4010a23b19f74a8fb08a", [])
反转片_I = EffectMeta("反转片 I", False, "7153084450593575454", "5114825", "442b39ec01b7ddefd1a2dfe1ce66d00e", [
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认0%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
发光 = EffectMeta("发光", False, "6961701455262650916", "1126104", "43648253eed7fb8ea727d167d28cd768", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认40%, 0% ~ 100%"""
取景框 = EffectMeta("取景框", False, "6712739398984667651", "635089", "1915e124716f1967476f78970f6e90b9", [
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
取景框_II = EffectMeta("取景框 II", False, "6871187132195541517", "920935", "a8af25fab9ceb2a477fb007d3dfc72b1", [])
变形了 = EffectMeta("变形了", False, "6940134629282157064", "1068127", "45a40940622ed9173d57e23ff1b3ddee", [])
变彩色 = EffectMeta("变彩色", False, "6720492336788279815", "634053", "0178a55e4f8c7deec8786d78d875d45e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
变清晰 = EffectMeta("变清晰", False, "6719658716750156291", "634019", "5aac9b2c125c7660728e4bf390a6c8ab", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认25%, 0% ~ 100%"""
变清晰_II = EffectMeta("变清晰 II", False, "6948352810895282724", "1146596", "da0c95a0f050f7e26e672dfdcbddc226", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
变焦推镜 = EffectMeta("变焦推镜", False, "7296418835429593651", "27896191", "1ef600710b33cc1e4d6f858c47e4b98a", [
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
变秋天 = EffectMeta("变秋天", False, "7012941093520020004", "1381700", "c7aaafd076935ba5a0a42e58365a49cf", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
变黑白 = EffectMeta("变黑白", False, "6730911849706951179", "634055", "d38bd3379c22f994fc3f0819998962c9", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
告白氛围 = EffectMeta("告白氛围", False, "6798021156331852295", "635005", "ed6536056d82bcd5849014db48d9d912", [])
咔嚓 = EffectMeta("咔嚓", False, "6752780026900386317", "634073", "c742af6913646f7c936642aae51d58d2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
哈哈弹幕 = EffectMeta("哈哈弹幕", False, "6952852858656002590", "1106302", "777c2c44707c03f6e541c8d954b21f8a", [])
哈苏胶片 = EffectMeta("哈苏胶片", False, "7078598928056193566", "1646830", "2eead808b8408e1fa4b74b6ad3c74b8d", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认30%, 0% ~ 100%"""
唱片 = EffectMeta("唱片", False, "6978764021637845541", "1174596", "d4fef5476754cbe563d5004097369290", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
唱片封面 = EffectMeta("唱片封面", False, "6987741974455390734", "1196734", "11ca22f7daac786267a46f99dad47be3", [])
啊啊啊啊 = EffectMeta("啊啊啊啊", False, "6951661272827957790", "1104164", "cec37f504863cc89308c256482286660", [])
噪点 = EffectMeta("噪点", False, "6706773498510971404", "634061", "3e5fc04a3ddff85aadb6b52681f00bcd", [
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_noise: 默认50%, 0% ~ 100%"""
四屏 = EffectMeta("四屏", False, "6706773500490682888", "635027", "f0074ead79e0a8dd9a10518667beb0f1", [])
回弹摇摆 = EffectMeta("回弹摇摆", False, "7146090225855369742", "4720539", "e13659f2365eb5bc295f93342e50139f", [
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认0%, 0% ~ 100%"""
回忆文件夹 = EffectMeta("回忆文件夹", False, "6998352498062791205", "1227934", "cf7de583f8e09da1476df20d95fc85f2", [])
回忆胶片 = EffectMeta("回忆胶片", False, "6987725478912070174", "1196624", "3f4f6d7ce71f67e1e61b91d366da4e19", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%"""
圆形虚线放大镜 = EffectMeta("圆形虚线放大镜", False, "7065242222068765198", "1569306", "44370286a32ad2e26535a6af4842aa0b", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%"""
圣诞光斑 = EffectMeta("圣诞光斑", False, "6769436675958379021", "634209", "dd982dabe21c82f51a9815df29f83f09", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
圣诞星光 = EffectMeta("圣诞星光", False, "6767219683901837832", "634207", "3e41badb29cc40f017f2ece636d26557", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
地狱使者 = EffectMeta("地狱使者", False, "7007684840506003999", "1406882", "2338b8056d16c87a210717ef9bdc28b5", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
基础黑框 = EffectMeta("基础黑框", False, "6712316216905568772", "635127", "534a1c475b222dfc97420bbaf85b7540", [])
塑料封面 = EffectMeta("塑料封面", False, "6814664313496670728", "703221", "4df02db49968718592fe29998506b8e2", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
塑料封面_II = EffectMeta("塑料封面 II", False, "6814664561082241550", "703219", "204ce6bc753bbc228d489e580c799768", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
塑料封面III = EffectMeta("塑料封面III", False, "6815457699505902087", "703217", "48d99133cab78a4a9b178d8f7fe7be66", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
复古DV = EffectMeta("复古DV", False, "6865959646092333576", "898868", "19e1584168d4d3570a91185b8149ad03", [
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%"""
复古DV_II = EffectMeta("复古DV II", False, "6869650937841979911", "909740", "6979960d3bda8144b3406dee17e7255a", [
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%"""
复古DV_III = EffectMeta("复古DV III", False, "6986958810619318792", "1194896", "ff4ee88f3d727ac817750ae84df099cc", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
复古DV_IV = EffectMeta("复古DV IV", False, "6994703188611830303", "1217306", "d97c48bb4c8048cbeb2ec8ca8e16e43e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.550, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认55%, 0% ~ 100%"""
复古发光 = EffectMeta("复古发光", False, "6993267867214942733", "1212776", "cfea69839054bf3cd30f7a2ac3727ea4", [
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_range: 默认60%, 0% ~ 100%"""
复古多格 = EffectMeta("复古多格", False, "6875631945510818318", "926324", "19a3d5873d394ff550d6a4367ef18a45", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%"""
复古弹窗_I = EffectMeta("复古弹窗 I", False, "6709708058852856327", "635103", "2c2502e679630278461b6ad9d8482928", [
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_noise: 默认100%, 0% ~ 100%"""
复古弹窗_II = EffectMeta("复古弹窗 II", False, "6764667280681865731", "635143", "168f6b6dfc18d80bf35853d6b7774030", [])
复古漫画 = EffectMeta("复古漫画", False, "6847440397027774984", "784724", "1f89b68447a46e9feb69654e4dc97a7f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
复古甜心 = EffectMeta("复古甜心", False, "6926817888632312333", "1039434", "80dbaf8bbb2d7cecdaff271656a58126", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
复古碎钻 = EffectMeta("复古碎钻", False, "6948700335481295374", "1094804", "56f3d29724754f5fc9d50c7bf6c02e28", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
复古蓝调 = EffectMeta("复古蓝调", False, "7078935944459457061", "1648234", "971c462f47f17dd2827ad4fde77fc015", [
EffectParam("effects_adjust_sharpen", 0.630, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.630, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_sharpen: 默认63%, 0% ~ 100%
effects_adjust_blur: 默认35%, 0% ~ 100%
effects_adjust_luminance: 默认63%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夏日冰块 = EffectMeta("夏日冰块", False, "7237437172733710909", "14244311", "46b643fafe2c93bfc6607b2fe5fdd429", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.230, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认20%, 0% ~ 100%
effects_adjust_number: 默认23%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
夏日泡泡_I = EffectMeta("夏日泡泡 I", False, "7104624152044114462", "2488948", "9f8219296472225136b6e73bc4c23206", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认15%, 0% ~ 100%
effects_adjust_speed: 默认34%, 0% ~ 100%"""
夕阳 = EffectMeta("夕阳", False, "6820595030743323149", "719376", "766398e7682640dc13bceb3f448847dc", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
夕阳_II = EffectMeta("夕阳 II", False, "6823659895221391886", "720788", "eea48333e37961c63e8d45077552de5a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
夕阳_III = EffectMeta("夕阳 III", False, "6836996542310650381", "762382", "6deca5bd30382b52c6a7985cee5c4ca2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
夜蝶 = EffectMeta("夜蝶", False, "6748376019524129292", "634175", "8a1a97c0b237adfb31c8ae55faa64e74", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
夜视框 = EffectMeta("夜视框", False, "6733023209978860035", "635131", "cef5df7500848aeee3f4ea15c6cdaa5b", [])
大雪 = EffectMeta("大雪", False, "6767148963503018503", "635063", "950d1e82cf0093f609e864d11f8a005d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
大雪纷飞 = EffectMeta("大雪纷飞", False, "6894517304487318024", "961896", "84aa80de0bf14d5924dab46be29f7b5a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
天使光 = EffectMeta("天使光", False, "6721949326022545928", "634143", "37c4098ac98fc25188a5a727064a7729", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
天使降临 = EffectMeta("天使降临", False, "7020715912596558366", "1402689", "be7a34ae22c8b39d1750a602757e4867", [])
失焦 = EffectMeta("失焦", False, "6984625607376114190", "1188938", "468cbf025f095d34bc7dd08462c94eae", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
夸夸弹幕 = EffectMeta("夸夸弹幕", False, "6956147849356644894", "1115952", "9a0e752e8d60267d088a2ade9fb7299d", [])
夺冠 = EffectMeta("夺冠", False, "6986857922076611080", "1194360", "fae722df471ae30a898ace2990cbbf3d", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%"""
孔明灯 = EffectMeta("孔明灯", False, "6734215575196668428", "635037", "f701053aea29c2163b02f98fd9c755ec", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
孔明灯_II = EffectMeta("孔明灯 II", False, "7008056576514724365", "1363340", "c1a6557f355c41e09fa4c2723d5f5f3e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%"""
字幕投影 = EffectMeta("字幕投影", False, "6828021842695950856", "747802", "ad0ff707e15d0e2dedcc23ef0c57c29a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
字幕投影_II = EffectMeta("字幕投影 II", False, "6829181074954785294", "747910", "d6388dec46d30dda96d8a273616978eb", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
字幕投影_III = EffectMeta("字幕投影 III", False, "6847378675894063623", "784366", "5c5ede6eb3a35e275167b8845c7ee7d5", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.670, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认67%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
字幕投影_IV = EffectMeta("字幕投影 IV", False, "6858139153020752397", "875967", "ebd3c54c9dbfe73027fd9d480c175888", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
定格闪烁 = EffectMeta("定格闪烁", False, "6998099471565328926", "1227402", "03704af752f236eec942f78ae1190d41", [
EffectParam("effects_adjust_speed", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
小剧场 = EffectMeta("小剧场", False, "6955083477708444174", "1113428", "602daf84aef020a2dcba8cbd52182b66", [])
小动物 = EffectMeta("小动物", False, "6965381784674505246", "1138384", "93e09d8cd1a85e9faae8da2212be88eb", [])
小花花 = EffectMeta("小花花", False, "6926823177670627848", "1039448", "6fe0a146c0133191fd663c439f213236", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
少女心 = EffectMeta("少女心", False, "6992842225541452325", "1209684", "41607b261ff3c0999a2c43370dd8c442", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%"""
少女心事 = EffectMeta("少女心事", False, "6924872492381114894", "1031294", "ebba75bb53013a6347814b486c6063eb", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
少女星闪 = EffectMeta("少女星闪", False, "6805098811694780942", "703255", "830c6652734b4d6c12604e6f5832c6a1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
左右摇晃 = EffectMeta("左右摇晃", False, "7166435460321907207", "6209717", "02b826db1b4f972ec812d76b50a49e05", [
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_distortion: 默认25%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%"""
布拉格 = EffectMeta("布拉格", False, "6869626257709994510", "909545", "b9b8d37e73f8a5a1c0abff8d6c7cd1b0", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
幻彩文字 = EffectMeta("幻彩文字", False, "6760975890806477319", "634737", "0d367c9f530e2fe08aef913cf1451443", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%"""
幻影 = EffectMeta("幻影", False, "6723059630676644364", "634751", "44cb0b2f810fa3119f2c9f1ae396db9d", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%"""
幻影_II = EffectMeta("幻影 II", False, "6898958754792870413", "971332", "14e6364b3a6a1485f2583bdfc32b9f9a", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%"""
幻术摇摆 = EffectMeta("幻术摇摆", False, "6926400232615842318", "1038152", "3bb76ef02392a04f5b387dbd46942458", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
幻觉 = EffectMeta("幻觉", False, "6709706311455478285", "634723", "1fa56d867a4651cbefbf6a4f669aeafc", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
广角 = EffectMeta("广角", False, "7086792017837036046", "1700284", "646ffb6188a447622926872c4fc453d6", [
EffectParam("effects_adjust_intensity", 0.450, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认45%, 0% ~ 100%"""
庆祝彩带 = EffectMeta("庆祝彩带", False, "6984685757508096520", "1189232", "42197cc2549fafa41c4854c4ee086074", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
开幕 = EffectMeta("开幕", False, "6706773534074491403", "631211", "7afa9c82c3d221742bb42a3b01d4fce7", [])
开幕_II = EffectMeta("开幕 II", False, "6708899027976458760", "631213", "9fd3ee125c1319e1a3d2345849bef96b", [])
强锐化 = EffectMeta("强锐化", False, "6711567084741988876", "634783", "c9ae5be2cd096747898e905fe2b6836b", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.620, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认62%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
录像带 = EffectMeta("录像带", False, "6706773534074475012", "634887", "c880d7f9eb6b4f94bf4e8f790fcf3dc0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认45%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认40%, 0% ~ 100%"""
录像带_II = EffectMeta("录像带 II", False, "6771299859803673101", "634811", "12b20ba900b09a9cd833ffb15eec5f74", [
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%"""
录像带_III = EffectMeta("录像带 III", False, "6804357689859117581", "703251", "de0caa2ec7151990960b56f62fedd3fc", [])
录制框 = EffectMeta("录制框", False, "6709725898762883595", "634801", "bbed85838ac97f63298e51e2f2b0bb03", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.670, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认67%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
录制边框 = EffectMeta("录制边框", False, "6720541178044879367", "635121", "5a388c880fe2fec47424d62a1e81c2c1", [])
录制边框_II = EffectMeta("录制边框 II", False, "6720541079080276484", "635119", "aeb6eaaa2881ed69afb5ece40c7c4eb4", [])
录制边框_III = EffectMeta("录制边框 III", False, "6894451240382501389", "961624", "bc759f18216aac435a0cf29b69bb5051", [])
录制边框_IIII = EffectMeta("录制边框 IIII", False, "6723065859260027403", "634063", "93297cd4887ae225ecc81f79e89c156b", [])
彩信 = EffectMeta("彩信", False, "7023692066152518152", "1418386", "d019bb0c5188a75893b08562c9951a4f", [
EffectParam("effects_adjust_vertical_shift", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认70%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认70%, 0% ~ 100%"""
彩噪画质 = EffectMeta("彩噪画质", False, "7135711291473138184", "4253680", "fbdce889885763ee82ffa7138de4d36b", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认15%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认15%, 0% ~ 100%
effects_adjust_sharpen: 默认35%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%"""
彩带 = EffectMeta("彩带", False, "7012933493663470088", "1381644", "c8b3549975f0ddca9247553c2ce79564", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
彩色描边 = EffectMeta("彩色描边", False, "6966904744564494878", "1143666", "28ab5ad6e46d74bc6cc36c8aed7bf3ee", [])
彩色漫画 = EffectMeta("彩色漫画", False, "6795430958737658382", "634947", "329880da582a412ad4db0451755a2065", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
彩色负片 = EffectMeta("彩色负片", False, "6914995893653475847", "1005840", "a78b49205a5d3b7fbc04a19aebce80ea", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
彩虹光 = EffectMeta("彩虹光", False, "6719758141573042692", "634161", "e39f46b0d21562c05fecfd9404d5a22f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
彩虹光_II = EffectMeta("彩虹光 II", False, "6738279134692119047", "634159", "03814fa76660bb3db88128e2a5ef000f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
彩虹光晕 = EffectMeta("彩虹光晕", False, "6768721870360416782", "634213", "3f04c39cc212c63ac3caa048f6c34588", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
彩虹射线 = EffectMeta("彩虹射线", False, "6808837459728667144", "703249", "5c817bb9e37fafa3f03966051050040c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
彩虹幻影 = EffectMeta("彩虹幻影", False, "6756845151630397960", "634281", "a5f61f00265cbcf6fbc430780f5b4c03", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
彩虹气泡 = EffectMeta("彩虹气泡", False, "6717434470128947725", "634127", "cf2687ea75161551a44016ef2ee4782d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
彩虹爱心 = EffectMeta("彩虹爱心", False, "6924873147053249031", "1031292", "235be137b3284f3d586e03f021951dac", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
彩钻 = EffectMeta("彩钻", False, "6986188114490298888", "1192480", "ba1ae230f2b24fe3383802194fb18e5d", [
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
心河 = EffectMeta("心河", False, "6740821434307711496", "634273", "e01e24abb316c5d1ef6f71946aeb1f16", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
心跳 = EffectMeta("心跳", False, "6723068356821258764", "634753", "905af212d43a1e42756b068af6c0c087", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
心跳黑框 = EffectMeta("心跳黑框", False, "6732383404991451656", "634049", "167ba80ce0571ba3d1d17d59f5ef5ea1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
必杀技 = EffectMeta("必杀技", False, "6797658471840879111", "634979", "ac8846e43b1fec25f2afe182d13feb24", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
必杀技_II = EffectMeta("必杀技 II", False, "6797346848391565831", "634977", "4e3e9d5edd2dc99af5881e3ca3d9344e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
怀旧边框 = EffectMeta("怀旧边框", False, "7113820806446060040", "3222474", "6d93d853611744ad573e113f8acd3ba6", [
EffectParam("effects_adjust_size", 0.636, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("sticker", 0.630, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认64%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
sticker: 默认63%, 0% ~ 100%"""
怀旧边框_II = EffectMeta("怀旧边框 II", False, "7039331384183230989", "1475190", "97076a8938d8f45a233d97fd240951c3", [])
怦然心动 = EffectMeta("怦然心动", False, "6924872657083044359", "1031293", "d5e216a1700db22637509d2966004b16", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
恐怖故事 = EffectMeta("恐怖故事", False, "6888563496133333511", "952539", "5ffc4c3a4ee71dd9aa5f728da300e0f2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
恐怖故事_II = EffectMeta("恐怖故事 II", False, "6888562369627165191", "952540", "900c63e3517b6fb24b9ed1b66c29efe0", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
恐怖故事_III = EffectMeta("恐怖故事 III", False, "6888594040959275527", "952742", "472194dc4d5622347368fc59c753d827", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
恐怖综艺 = EffectMeta("恐怖综艺", False, "7023349285592764941", "1416842", "733e0831b3facd0931d6e648e1b381fd", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.802, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
恭喜发财 = EffectMeta("恭喜发财", False, "6920164595214586381", "1020210", "6721627a5a76e4ef49ebfcbba8714305", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
恶灵冲屏 = EffectMeta("恶灵冲屏", False, "7022838857221542414", "1413882", "c440724a491336aba4e24910d5c7f6f1", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
愛 = EffectMeta("愛", False, "6831487239164269064", "756184", "310f9f3c69c75cbb8eb25011d01d5ac4", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
我酸了 = EffectMeta("我酸了", False, "6955083374054609444", "1113430", "393059e1b508041d77792ef44ffc007b", [])
手帐边框 = EffectMeta("手帐边框", False, "6761336384117543438", "635113", "737114bc5ff9b162c7f6fc403e308d63", [])
手电筒 = EffectMeta("手电筒", False, "6860757586220683790", "886132", "42bd8193cfc9d60fdf4392ffaf3c5baa", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
手绘拍摄器 = EffectMeta("手绘拍摄器", False, "6997608849750364708", "1225274", "4bf0e18f35a6ce0778455fdce692415d", [])
手绘边框_II = EffectMeta("手绘边框 II", False, "6723044276625740296", "635101", "28cf85153cd70aa39187c96a74dd82e1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
扫描光条 = EffectMeta("扫描光条", False, "6798379345783034382", "703271", "6b14aef1e0c5759061bc35cbf33ccd9f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
抖动 = EffectMeta("抖动", False, "6706773500796867084", "634759", "950894d4ae28d859d9b7136a73265ee6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认75%, 0% ~ 100%"""
折痕 = EffectMeta("折痕", False, "6810944968396378638", "703227", "3f7adc8176999d58e232b5fa456088d5", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
折痕_II = EffectMeta("折痕 II", False, "6925250879259939336", "1032270", "4efd4758f897b1d364549a688129e5d5", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
折痕_III = EffectMeta("折痕 III", False, "6925288456943833608", "1032322", "7d4cb9c576864bc421faa8d9d2f4d67e", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
折痕_IV = EffectMeta("折痕 IV", False, "6925288650011841031", "1032321", "b04966da3a2bbd9212aec61aaa995c33", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
折痕_V = EffectMeta("折痕 V", False, "6925292438391099912", "1032418", "1530211bc181cd4003243fa6265574db", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
报纸_今日热门 = EffectMeta("报纸:今日热门", False, "6711575336955417095", "635091", "d10a4d42b6b91f3f899a1692bddfca08", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
摇摆 = EffectMeta("摇摆", False, "6709706542674874888", "634743", "bb8e9483313416d32bea215d57855490", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%"""
摇摆_II = EffectMeta("摇摆 II", False, "6821460674577699342", "717392", "332436443a8cbe9014d6bf7c8531ff60", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%"""
撒星星 = EffectMeta("撒星星", False, "6839514681044898311", "768182", "620d63550356df332ba5c014b310d6d2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
撒星星_II = EffectMeta("撒星星 II", False, "6849588023714124295", "788728", "5c5349039a938e2348ae58a7dee34302", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
撕纸涂鸦边框 = EffectMeta("撕纸涂鸦边框", False, "6969851947306193416", "1153996", "592359a5945a5723aa7ed8b50e8b5ef4", [])
播放器 = EffectMeta("播放器", False, "6758630566578360845", "635141", "187409b4bd22026b48df1bacdf2f3cfa", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%"""
播放器_II = EffectMeta("播放器 II", False, "6792819149945967111", "635139", "38b3630f57f017191fb1d1bbbf9185f1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
擦拭开幕 = EffectMeta("擦拭开幕", False, "6841459176510591496", "773560", "6725bf6b227fc208a7bd343661637320", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
放大镜 = EffectMeta("放大镜", False, "7051836120224502308", "1520514", "5f89a973e9cea025690bdb37a293a959", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%"""
放映机 = EffectMeta("放映机", False, "7067049946049942030", "1576250", "a8bffa5b39a0ff0c1cdc278216e5041d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.801, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.339, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认34%, 0% ~ 100%"""
放映机卡顿 = EffectMeta("放映机卡顿", False, "6706773499031081483", "634775", "53f4a563209223baecaaec2cfff02afe", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
放映机抖动 = EffectMeta("放映机抖动", False, "6771320983065203213", "634787", "3d7d53f809b52f7370380f358ef6081c", [
EffectParam("effects_adjust_range", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认25%, 0% ~ 100%"""
放映滚动 = EffectMeta("放映滚动", False, "6970890075907297806", "1155966", "d29c13ced2fda5dca2a486dc9d5b1c6f", [])
故障 = EffectMeta("故障", False, "6707050322696606222", "634797", "ec4f1908b716eec1e47b48b9c1ac836f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%"""
故障_II = EffectMeta("故障 II", False, "6738265357825348103", "634795", "d4435f333055899ab5140a4cc69aced6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
故障读条 = EffectMeta("故障读条", False, "6912013942097187336", "999316", "1ae904081a2d916d6d893e538304494c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.620, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认62%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%"""
文字闪动 = EffectMeta("文字闪动", False, "6886710931150082573", "949372", "417b001671b78236d47f16351c7fff85", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
斑斓 = EffectMeta("斑斓", False, "7072258619646939679", "1607458", "7030b50aec89e949ea9ce706cfb1512c", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.040, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_number: 默认4%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
斜向模糊 = EffectMeta("斜向模糊", False, "6871185301071467015", "920936", "7865be92e2a2b811cea9639d08dab0c0", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认25%, 0% ~ 100%"""
新年倒数 = EffectMeta("新年倒数", False, "6921952071247729165", "1024106", "9daf33bd3465df6f5bfe131318211461", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%"""
新年开幕 = EffectMeta("新年开幕", False, "6911144014624330248", "995666", "d7d65b8cc72db4aa83c01d74796af055", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
新年快乐 = EffectMeta("新年快乐", False, "6899747094840480269", "972751", "5fb6810c877c28869573c081b92ac8a4", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
新春杂志 = EffectMeta("新春杂志", False, "7189543383222719034", "8573753", "40e13fa6203f4484b64b8a7bf0c180e8", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
新春祝福 = EffectMeta("新春祝福", False, "7189586707035984441", "8578565", "1779394ed10f0aafa3240006828f34f3", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.625, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_size: 默认62%, 0% ~ 100%"""
方形取景器 = EffectMeta("方形取景器", False, "6706773499031097868", "635099", "23af10c231cf1b88104e206ca5b6d9ad", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.660, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认66%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
方形开幕 = EffectMeta("方形开幕", False, "6729055410835165708", "634043", "c216a88587da0864bfe1f477f2fd1880", [])
旋转方块 = EffectMeta("旋转方块", False, "7041504567648850445", "1482636", "d41b7b274f570518ad7aedb88e7b687e", [
EffectParam("effects_adjust_size", 0.714, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认71%, 0% ~ 100%
effects_adjust_speed: 默认25%, 0% ~ 100%"""
日式DV = EffectMeta("日式DV", False, "6965747262165094942", "1146392", "2ba4db88748088d60090705ab0d921fd", [])
日文字幕 = EffectMeta("日文字幕", False, "6858954575701873160", "881783", "1943875bfc98f928d2d60ac63c1a7271", [
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
sticker: 默认100%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
日落灯 = EffectMeta("日落灯", False, "6920147678248571406", "1020046", "0a5d6dc144c4a488cc223c14ef092d05", [
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.560, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.610, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.640, 0.000, 1.000)])
"""参数:
sticker: 默认100%, 0% ~ 100%
effects_adjust_size: 默认56%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认61%, 0% ~ 100%
effects_adjust_vertical_shift: 默认64%, 0% ~ 100%"""
时光碎片 = EffectMeta("时光碎片", False, "6971332934288544286", "1157058", "97a217ce3f6f5c8a4729912f1b77ec23", [])
时间停止 = EffectMeta("时间停止", False, "6948722700286169631", "1095262", "dce8f128927e797533d59dc0b1fb6c7d", [])
星光 = EffectMeta("星光", False, "6717433583289504268", "634117", "18ca299d377f85452542449185ccdcd9", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星光_II = EffectMeta("星光 II", False, "6715209934738297358", "634113", "c0629f8eb980bc1cc9853fd15fcb49cd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星光绽放 = EffectMeta("星光绽放", False, "6760243564598268420", "634195", "af1fc6a5b22f4357b4f86ad314510851", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星光闪耀 = EffectMeta("星光闪耀", False, "6967255188730024455", "1146750", "3650ba757a4c5be9accd956d8dd47df1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星光闪闪 = EffectMeta("星光闪闪", False, "6871055398107877902", "920549", "6fe220ca67a2f626ffd888b28172bc29", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星夜 = EffectMeta("星夜", False, "7008149210159649294", "1364164", "1c75b4cf948ba65efeb1af5a25b41a7e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星星冲屏 = EffectMeta("星星冲屏", False, "6769007480652435982", "634193", "52685a9660f7ddc2e9223f437485f4b2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
星星坠落 = EffectMeta("星星坠落", False, "6977257384120947213", "1171606", "8b8d284d0ea56e0ffc07a2e6710d990f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
星星彩绘 = EffectMeta("星星彩绘", False, "7395533077130252863", "76607736", "70c6dc5c306b59d80f68c8fae3c528f7", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%"""
星星投影 = EffectMeta("星星投影", False, "6826530141586330120", "741906", "cfbf1b6be6d23e3575caf3a026f54082", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星星灯 = EffectMeta("星星灯", False, "6903072502369489422", "977478", "9a20a02448ef8d95a81c3b16ca881742", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星星闪烁 = EffectMeta("星星闪烁", False, "6778285088485413384", "634215", "f75821b85d4f8e7be6eb42ca17f2e343", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星星闪烁_II = EffectMeta("星星闪烁 II", False, "6834010357728547335", "755806", "469b87318cdd87cefbb54223cd4633fd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星星闪烁_III = EffectMeta("星星闪烁 III", False, "6871167583991632391", "920916", "ccdcf8be8c2d54b0c029ece6f85e4d51", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星月童话 = EffectMeta("星月童话", False, "6967255330958873124", "1146749", "310fe4000e5635f13ec28570736b60e3", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星河 = EffectMeta("星河", False, "6734498838410695175", "634265", "5d1c03757b50feee9ef6bb4ac4d4d99c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星河_II = EffectMeta("星河 II", False, "7010648091049071135", "1372810", "2273947aec8664bd5c7a0f410c8bebfb", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%"""
星火 = EffectMeta("星火", False, "6715209198109463054", "634103", "c2811a4bdeb4394ae95f3aa9875dc4dc", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星火_II = EffectMeta("星火 II", False, "6907053209173365256", "986477", "43a04949ebd13d27d7b38f5083882322", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星火炸开 = EffectMeta("星火炸开", False, "6808838081420988942", "703243", "bf25e21e5b4a025e984e2eed0a00345d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星移 = EffectMeta("星移", False, "6778284619499311623", "634267", "f1c6583c2a7227b6ccf002863fdfdf65", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星空 = EffectMeta("星空", False, "6734587005872640519", "635035", "dc11bf828dc298c85256509f24f0451d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星辰 = EffectMeta("星辰", False, "6761722814157296141", "634271", "572ed0caff4d1d4ee69b8ab9914ae69a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
星辰_I = EffectMeta("星辰 I", False, "6946113717100614158", "1087622", "3c8c6e57ebbcca08e0202a2ce489a109", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
星辰_II = EffectMeta("星辰 II", False, "6946453051368542727", "1089758", "4776e97efe2b615622586f9eba683b81", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认100%, 0% ~ 100%"""
星辰_III = EffectMeta("星辰 III", False, "6948700154874565156", "1094800", "7e62c362c751a7d4bc806e5036e1ce45", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%"""
星雨 = EffectMeta("星雨", False, "6766488666261950989", "634187", "ec147993b7ce136beccd018d179fae2c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
春日樱花 = EffectMeta("春日樱花", False, "6927185086685123086", "1041304", "0e308be06e990da9322e807a8a4b3783", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
春日边框 = EffectMeta("春日边框", False, "6942800783737885198", "1076064", "a8f4b178a0c820ab601f742ce4eb286a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
晴天光线 = EffectMeta("晴天光线", False, "6740540037563159047", "635071", "1d65a16823fdd3130901b3687f0107d0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
暗夜 = EffectMeta("暗夜", False, "6886698114258833934", "949350", "17b5b34a9580eca1b093e3b9b730b5ad", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%"""
暗夜归来 = EffectMeta("暗夜归来", False, "7020715691355410951", "1402690", "7e0d21432508fde619dad195088275b8", [])
暗夜彩虹 = EffectMeta("暗夜彩虹", False, "6823658782090859022", "720808", "123ffb581708c8e5df875d30fdf26b66", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
暗夜彩虹_II = EffectMeta("暗夜彩虹 II", False, "6824046488419570184", "741832", "8411467f9cf5520fdb9cc14151bef011", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
暗夜彩虹III = EffectMeta("暗夜彩虹III", False, "6824047157369115150", "741860", "3b1f50d0c90f48a42cdb0071beedb4a9", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
暗夜精灵 = EffectMeta("暗夜精灵", False, "6888573576870367751", "952536", "fd84a50ad750ae84e3b2ce62cd22a6e5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
暗夜蝙蝠 = EffectMeta("暗夜蝙蝠", False, "7021786820153184775", "1407954", "bbe314aced3bb2ab605a2c7c6b0adf93", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
暗角 = EffectMeta("暗角", False, "6723086142658318860", "634057", "ef7abad9671e2f3da7993b7673ece5fc", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
暗黑剪影 = EffectMeta("暗黑剪影", False, "6886718600233619982", "949388", "e31ade9f9b38b5721fb601ad187bb163", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.670, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认67%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
暗黑噪点 = EffectMeta("暗黑噪点", False, "7022896066559218183", "1414024", "fae125ebf95a6bb9d8a4233ea9b3dced", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.801, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.801, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%"""
暗黑蝙蝠 = EffectMeta("暗黑蝙蝠", False, "6749064512390828548", "634179", "934fcfaf5b153a5a0fc91951b9d7d61b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认60%, 0% ~ 100%"""
曝光 = EffectMeta("曝光", False, "6992043513365926408", "1207064", "e961c201b279f5ef164f119aa7ab2a78", [
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_texture: 默认60%, 0% ~ 100%"""
曝光降低 = EffectMeta("曝光降低", False, "6765766949382132232", "634659", "be1c0676764ee83d32b63afc46272c28", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
月亮投影 = EffectMeta("月亮投影", False, "6826529572536717837", "741892", "c71386afba5abc8a66cd05a5c21fab2c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
月亮闪闪 = EffectMeta("月亮闪闪", False, "6876339287038628359", "931823", "11d24cd11738137f080ab6b050337f8f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
月光闪闪 = EffectMeta("月光闪闪", False, "6906802979861434887", "986344", "72e1573314be95270038e193db1def8d", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认75%, 0% ~ 100%"""
望远镜 = EffectMeta("望远镜", False, "6834012604759806472", "761578", "63e50736865f6248f87b6280c5b0d88b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
未来主义 = EffectMeta("未来主义", False, "6982870068069667365", "1185624", "5c8d55dd2769674a7c05099020ca1000", [])
杂志 = EffectMeta("杂志", False, "6810945952451400200", "703235", "c2d0a5d79d37501fb8d49502783145e6", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
树影 = EffectMeta("树影", False, "6815830852035940872", "703215", "e94e1952adee72678c426490036dae61", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
树影_II = EffectMeta("树影 II", False, "6820591707617235464", "719372", "068b6e28050ccaa8d0832419a0a185c4", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
格纹纸质 = EffectMeta("格纹纸质", False, "6815834305084789262", "703223", "722c3de2c3639bbcaa23b0e8ff7b9486", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
格纹纸质_II = EffectMeta("格纹纸质 II", False, "6815834434726531597", "703225", "af3ab7ecf7d9e53618301ea7652027e7", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
梦境 = EffectMeta("梦境", False, "6841460732639318542", "773088", "37faa88347805d59c7d7db2e2267e0c9", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
梦境_II = EffectMeta("梦境 II", False, "6849235870130639368", "788039", "715227fc796386820c16198a57fd5249", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
梦境_III = EffectMeta("梦境 III", False, "6843319622385537544", "774964", "ae67e41be59533a1fa5de82ad641563a", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
梦境_IV = EffectMeta("梦境 IV", False, "6841460608248844813", "773086", "23336e6ee5aef71cc59e7b072fede43b", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_soft", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_soft: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
梦幻雪花 = EffectMeta("梦幻雪花", False, "6894208129534267912", "961480", "0d95d3c97bfac92fd5abc0f5c04431a5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
梦蝶 = EffectMeta("梦蝶", False, "6998050316528652831", "1406766", "9a471302029b78e4ed7404a08d835467", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
梦魇 = EffectMeta("梦魇", False, "7024080087163081229", "1419974", "b678d12a5275aa28637557b455299c5c", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
梵高背景 = EffectMeta("梵高背景", False, "6967354298275467807", "1147066", "52e5b1690a75d4e6ca88c7f18f47b7e7", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
模糊 = EffectMeta("模糊", False, "6739752823140913675", "634025", "abb0b0e8472b73a42e796086c708d216", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%"""
模糊开幕 = EffectMeta("模糊开幕", False, "6758752103092457991", "634071", "c0827630f211d83cc2a8258ce59d8c78", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认25%, 0% ~ 100%"""
模糊星光 = EffectMeta("模糊星光", False, "6771299961171612174", "634255", "f40e2044c0482290ab34e4db7dfdabcb", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认75%, 0% ~ 100%"""
模糊星光_II = EffectMeta("模糊星光 II", False, "6806254134619017741", "703247", "5f0825e579151faded0b25cdac27324f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
模糊闭幕 = EffectMeta("模糊闭幕", False, "6821460725517521416", "717394", "b42ba749d552dbb865daa4c0a8e8ae6d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认25%, 0% ~ 100%"""
横向闭幕 = EffectMeta("横向闭幕", False, "6876339694825640455", "931822", "b7abe840af4f942b11e0ccda971d4df7", [])
横纹故障 = EffectMeta("横纹故障", False, "6806254428358709767", "703269", "fbc084265465ab0db5ba8e2b3624c4d0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
横纹故障_II = EffectMeta("横纹故障 II", False, "6815093228216259079", "703267", "a9061d0f59a826dc552e96ecc38c94c4", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
樱花朵朵 = EffectMeta("樱花朵朵", False, "6940448547137393159", "1069014", "3c1cb50f953aea57451da040eeade612", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
橘色负片 = EffectMeta("橘色负片", False, "6914995976608420365", "1005839", "95ddc63de88b65e1782c88c300c7e90e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
欧根纱 = EffectMeta("欧根纱", False, "7273334324106105403", "21803568", "08e90c7652fb03ccbc30f7e92519bb65", [
EffectParam("effects_adjust_size", 0.300, 0.000, 0.600),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.280, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.125, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认30%, 0% ~ 60%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认28%, 0% ~ 100%
effects_adjust_rotate: 默认12%, 0% ~ 100%"""
毛刺 = EffectMeta("毛刺", False, "6709706457543086605", "634711", "08b418c92900f56a493cd0efb570f0e1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
毛玻璃 = EffectMeta("毛玻璃", False, "7031846864198570532", "1445528", "a846bba99039c2625c15da18fa265960", [])
水墨晕染 = EffectMeta("水墨晕染", False, "6746486938137530884", "634101", "561b55373df7ee5e9e6f10d5cb235190", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
水彩晕染 = EffectMeta("水彩晕染", False, "6733378866686988803", "634099", "85757609b1d1f799ebf542aec9662fce", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
水波纹 = EffectMeta("水波纹", False, "6940173521905521159", "1068390", "61ab10b10def92e31b0400ac87e43088", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%"""
水波纹投影 = EffectMeta("水波纹投影", False, "6847018706887774727", "783644", "4b0042213e23e9050cfb066f2365564b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
水滴模糊 = EffectMeta("水滴模糊", False, "6911935918433636871", "998722", "99d7b39f93c993e17cca03313041aa8d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
水滴滚动 = EffectMeta("水滴滚动", False, "6863328348920091144", "892170", "25bf851759c3c6ebdf2036ee357866d3", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
油画泼墨 = EffectMeta("油画泼墨", False, "7398059491545059876", "77243667", "8fd86200709777bc0ff0c5ff3af2af22", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认30%, 0% ~ 100%"""
油画纹理 = EffectMeta("油画纹理", False, "6808442362314887693", "645833", "e3fc6aa919c13ff59280907da88d2bf3", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
泡泡 = EffectMeta("泡泡", False, "6806254230614053383", "703241", "060b8178d3ac554eaa0d22e04989e70c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
泡泡变焦 = EffectMeta("泡泡变焦", False, "7133105682881974821", "4118383", "84c9bae7a15dc1118072ee3ab1ddf3c2", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%"""
波点彩绘 = EffectMeta("波点彩绘", False, "7398099732884623908", "77269362", "12ab8828a3361cffb159f67f2d098d71", [
EffectParam("effects_adjust_color", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认70%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
波纹扭曲 = EffectMeta("波纹扭曲", False, "7368745372081984035", "63865672", "c0db14b731d4f04c95332348a0488089", [
EffectParam("effects_adjust_sharpen", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.550, 0.000, 1.000)])
"""参数:
effects_adjust_sharpen: 默认35%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_distortion: 默认55%, 0% ~ 100%"""
波纹色差 = EffectMeta("波纹色差", False, "6709347834690277892", "634285", "57d2f602616ff3f9ce589e2b3150e364", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%"""
流动烟雾 = EffectMeta("流动烟雾", False, "7257495407712801317", "18648774", "ab6aa4d420ef1cf322d25b24a054a7c6", [
EffectParam("effects_adjust_size", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.900, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认90%, 0% ~ 100%
effects_adjust_texture: 默认90%, 0% ~ 100%
effects_adjust_color: 默认90%, 0% ~ 100%"""
流星雨 = EffectMeta("流星雨", False, "6974750495415996936", "1164794", "fa635717b7c3eeefed138087de04c267", [])
浓雾 = EffectMeta("浓雾", False, "6751566830206194190", "635047", "b69f839d17cd1fa3ca2b67df18b95519", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
浪漫氛围 = EffectMeta("浪漫氛围", False, "6790533020215415304", "634253", "af18c87e794b96c831549e8406c8f8c5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
浪漫氛围_II = EffectMeta("浪漫氛围 II", False, "6814667933684339207", "705081", "7021b0ea7b01f0dc0be39b091c3431a2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
涂鸦切割边框 = EffectMeta("涂鸦切割边框", False, "6969850948969566756", "1153998", "e477d2fe74226d0905247b351722848c", [])
淡彩边框 = EffectMeta("淡彩边框", False, "6753512270598246925", "635117", "3da6d9d4146803479ed0b4ab840219a2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
清新绿格子 = EffectMeta("清新绿格子", False, "6966132680211567135", "1141780", "add7f1470b3da2f309c52f337722fe1b", [])
渐显开幕 = EffectMeta("渐显开幕", False, "6722343568188379661", "634041", "a299b022ab4d7a1830ac72dce3d21d95", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
渐渐放大 = EffectMeta("渐渐放大", False, "6730912024596845063", "634067", "56b46f1ebc45c47730d3f7c2569200fc", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.660, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认66%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
渐隐闭幕 = EffectMeta("渐隐闭幕", False, "6723050814006366734", "634039", "05c17ac3298c0521cd91a720850a27de", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
温柔细闪 = EffectMeta("温柔细闪", False, "6995497812221760030", "1220300", "90a28bc4dcde319ec961b8f07a81c817", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
游戏界面 = EffectMeta("游戏界面", False, "6983877697524994567", "1187140", "79fc508b1d127dc744a0b6bf9d63c8ea", [])
满屏问号 = EffectMeta("满屏问号", False, "6950902993294201358", "1101078", "168794f69f32cdb6011ebca4b5bf3382", [])
漏光噪点 = EffectMeta("漏光噪点", False, "6810944598874001934", "703229", "2e08fe198f1c351fb6d19ded110a5a84", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
火光 = EffectMeta("火光", False, "6748623656181568011", "634167", "8ae6b74e205a7ba0e3fcd3f01e93b72d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
火光刷过 = EffectMeta("火光刷过", False, "6803160938603090440", "705085", "94e472584aebf6d8fe65675b50184165", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
火光包围 = EffectMeta("火光包围", False, "6803162714148442632", "705033", "3d4fa21f005a3526c2f3189f29c03d0a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
火光翻滚 = EffectMeta("火光翻滚", False, "6809889314860700173", "703263", "b613ef50916282ef8dca4babe5d1006d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
火光蔓延 = EffectMeta("火光蔓延", False, "6803162375148016135", "703265", "eca67ce53f0d86e643af3dc6de2b8a0a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
灵魂出窍 = EffectMeta("灵魂出窍", False, "6706773500784284172", "634709", "7cd3e52c6ee775c334f44bec43b54325", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%"""
炫彩 = EffectMeta("炫彩", False, "6732693992225378828", "634091", "c58f672e5d95a2ee49b3659006871671", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
炫彩_II = EffectMeta("炫彩 II", False, "6933131104274616840", "1145374", "3c4e2ce8a947354ca1e0687b9b2b3810", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
烟花 = EffectMeta("烟花", False, "6782461740274684424", "635073", "4e7301f2c6232050b71d95e750d67861", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
烟花_II = EffectMeta("烟花 II", False, "7010666068997837342", "1373018", "4037759ec478f5a033d160f1bab07f90", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
烟花_III = EffectMeta("烟花 III", False, "7052201781241057805", "1522424", "5d6d7516368c1dcdfb2bb274c2600416", [
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认34%, 0% ~ 100%"""
烟雾 = EffectMeta("烟雾", False, "6733145063997575694", "634145", "f7e8f3aee8e513dc63a56c43f58b0287", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
烟雾炸开 = EffectMeta("烟雾炸开", False, "6804317747351130638", "703261", "c4687b9722a4e7299039fd06f7956742", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
爆炸 = EffectMeta("爆炸", False, "6740540228194275844", "635067", "7b4df7ff18f6e6ccb1b49bf58611499e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心Kira = EffectMeta("爱心Kira", False, "6896058666357625351", "965696", "565508851b78d5a08f2abfb2bed717fd", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
爱心bling = EffectMeta("爱心bling", False, "6709706255105004045", "634133", "182cd7556ffdc70c9a8fdb98947f9d8c", [
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
爱心光斑 = EffectMeta("爱心光斑", False, "6709706178340852236", "634135", "58c897c26fa3df544d100541167c02b8", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心光斑_II = EffectMeta("爱心光斑 II", False, "6791647108974776839", "634261", "85619b11f963ebd32b545b069cd75221", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心光波 = EffectMeta("爱心光波", False, "6746014633942848007", "634191", "6d42bba28607f45ca90a7359b7c6ab74", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
爱心啵啵 = EffectMeta("爱心啵啵", False, "6924869659476890125", "1031295", "dce0f289716b6e4c4c7256a4ab364188", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心射线 = EffectMeta("爱心射线", False, "6805099653730669070", "703257", "d75a8189380e55c63785b24d8050f9c6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
爱心投影 = EffectMeta("爱心投影", False, "6828020234876621325", "741958", "7515290b9cb341d5816bc502bafaabab", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心方块 = EffectMeta("爱心方块", False, "7041103714647544334", "1480898", "076a41421bbc4a6419fcccdc3c1ce80c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.634, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认63%, 0% ~ 100%"""
爱心暗角 = EffectMeta("爱心暗角", False, "6925342127807271431", "1033842", "1991e877ef3ba32d48bcbe62a2e326cb", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.670, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认67%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
爱心气泡 = EffectMeta("爱心气泡", False, "6792405144655893005", "634235", "3b6d673988e3e82046b3159f59a5c12a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心泡泡 = EffectMeta("爱心泡泡", False, "6886709503136371207", "949386", "bc428e7342600fc4cf0daa1515f3aac6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心爆炸 = EffectMeta("爱心爆炸", False, "6855563744123032071", "824444", "39dfc6d5b4e0a4fa623d5d5e959c4095", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
爱心缤纷 = EffectMeta("爱心缤纷", False, "6790534436153725448", "634259", "5cd7d926814e4c5b6baca975bf3f8a80", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心缤纷_II = EffectMeta("爱心缤纷 II", False, "6792092999468716558", "634257", "d7391e2297dbeea1409bd53de6f2064e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
爱心跳动 = EffectMeta("爱心跳动", False, "6790547496394297863", "634275", "68b31593ac0e5c661e1d610ce540d64b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
爱心跳动_II = EffectMeta("爱心跳动 II", False, "6858138763290219021", "875970", "e246526e1234846c538b718d4be7dbf2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
爱心闪烁 = EffectMeta("爱心闪烁", False, "6792109800135070222", "634231", "e8eb70ffb513761efe8662314e411974", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
牛皮纸关闭 = EffectMeta("牛皮纸关闭", False, "6966139059194303013", "1140082", "f2fb4e0bf0ea133b39eb068152acce74", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
牛皮纸打开 = EffectMeta("牛皮纸打开", False, "6966136913010889223", "1140078", "bc67263387f709f884b84337e67fe6d6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
牛皮纸边框_I = EffectMeta("牛皮纸边框 I", False, "6966139444382405134", "1140086", "db111daab71339846516a5c01402752e", [])
牛皮纸边框_II = EffectMeta("牛皮纸边框 II", False, "6966139579912950286", "1140085", "e91bd852184f4ac248f6291a4c8d1826", [])
玫瑰花瓣 = EffectMeta("玫瑰花瓣", False, "6734619627051028996", "635051", "abd9d7c89fa42048f1ad1fe68b867ba0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
玻璃破碎 = EffectMeta("玻璃破碎", False, "6912015453892121102", "999326", "cb76d83cf3c3b3674b2207c33bcaf67d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
甜心投影 = EffectMeta("甜心投影", False, "7058961500060258847", "1552216", "24068e8b49b64d8802e7d62ca05acc07", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.435, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_number: 默认10%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认44%, 0% ~ 100%
effects_adjust_blur: 默认20%, 0% ~ 100%"""
生日快乐 = EffectMeta("生日快乐", False, "6899747371593241096", "972748", "7e2e3e9671c48ebdd4abf0f8efa0b3eb", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
电光包围 = EffectMeta("电光包围", False, "6809889225144537613", "703259", "41db536d57ca3c1d547f13b658c2386d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
电光漩涡 = EffectMeta("电光漩涡", False, "6797341815377760782", "634975", "363d8c0772a4e49a3f51f233748dd86b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
电子屏 = EffectMeta("电子屏", False, "6847692508449739278", "785074", "7e3720dced915006968402e0f245f955", [
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
电影刮花 = EffectMeta("电影刮花", False, "6722366799003783692", "634789", "10c7d224fcc46291509c22a902efeb6e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
电影感 = EffectMeta("电影感", False, "6719333680713568771", "634029", "1beeb560b0796fc181f265df1e83fa66", [])
电影感画幅 = EffectMeta("电影感画幅", False, "6746135410218373646", "634083", "f37cf7f307b394d1d496d5264c7b2a86", [
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认50%, 0% ~ 100%"""
电脑桌面 = EffectMeta("电脑桌面", False, "7026619341839798820", "1482288", "1625f25739fdc13d63b9867589929cae", [
EffectParam("effects_adjust_color", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认10%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
电视关机 = EffectMeta("电视关机", False, "6719656840646365707", "634805", "c2ef989d8286f4b2e5a747bca129602a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认60%, 0% ~ 100%"""
电视开机 = EffectMeta("电视开机", False, "6719661856434164237", "634807", "b7f303766220a86078204b79a4db2566", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认60%, 0% ~ 100%"""
电视彩虹屏 = EffectMeta("电视彩虹屏", False, "6852503085672043021", "815546", "d6ef86b7e37c1996e336d6541f5c4d7a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
电视纹理 = EffectMeta("电视纹理", False, "6763933311933878791", "634803", "12829eb28e30b3c046bcb9ce3fdd8641", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%"""
画展边框 = EffectMeta("画展边框", False, "6839527903424680456", "768176", "594fd22d6effa8153b7a619746b1dd0f", [])
白噪点边框 = EffectMeta("白噪点边框", False, "6970599572976439839", "1155426", "ffe0f3ffa043687873060dabb41e45ac", [])
白胶边框 = EffectMeta("白胶边框", False, "6865979592264389127", "898956", "77fb2991364f2882ef4b61317f7a10dc", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
白色描边 = EffectMeta("白色描边", False, "6953169122649707045", "1107244", "647776c50dafcbfab55f1dcb36d28792", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
白色渐显 = EffectMeta("白色渐显", False, "6723790385069429262", "634037", "94b1df840d30218f14e8a5e509df5c8e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
白色爱心 = EffectMeta("白色爱心", False, "6868556923503907342", "904792", "6fbffdaff4f4a6f3894af0a29f5fe8cc", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
白色线框 = EffectMeta("白色线框", False, "6753512551536923149", "635109", "66d6c8dffd954669fbb74410f28ac6c0", [])
白色边框 = EffectMeta("白色边框", False, "6974602583411266079", "1164159", "799ac5c78fddad12e395047e180f4328", [])
百叶窗 = EffectMeta("百叶窗", False, "6823654892872143367", "719380", "bde8d2cb9d033a45c92615f9b18b47a1", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
百叶窗_II = EffectMeta("百叶窗 II", False, "6823656768334205454", "719404", "380df1dbfbfb93a560b389d5683043e7", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
监控 = EffectMeta("监控", False, "6773542922030682632", "634941", "82748b8ee1cc9a6619aa3571c5e59183", [
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认40%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%"""
盗梦空间 = EffectMeta("盗梦空间", False, "7024053604596060680", "1419276", "ab8caff5408905d424c23bef34af0853", [
EffectParam("effects_adjust_size", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.667, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.801, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认34%, 0% ~ 100%
effects_adjust_distortion: 默认70%, 0% ~ 100%
effects_adjust_rotate: 默认67%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%"""
盛世美颜 = EffectMeta("盛世美颜", False, "6860757421283873293", "886130", "16d39197cd79d2753ce8c58f409c78a2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
相机网格 = EffectMeta("相机网格", False, "6725730715138265612", "634051", "7569da277fd0c96d1a8ab45a024baa96", [])
相纸 = EffectMeta("相纸", False, "6713856991086776835", "635093", "14d50603fdd87a40a787e71172901a56", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_soft: 默认70%, 0% ~ 100%"""
瞬间模糊 = EffectMeta("瞬间模糊", False, "6903409009210954253", "979300", "eae568b2fa0c05249efc7dbcbfcf8e2e", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%"""
破冰 = EffectMeta("破冰", False, "7047049192832766477", "1499079", "35814c493387bfc7af1eadf958e28d71", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
磨砂纹理 = EffectMeta("磨砂纹理", False, "6732693826135134734", "634027", "4ea2d570ea1d66a407d6973006c199a0", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
祝福环绕 = EffectMeta("祝福环绕", False, "7324617866056045106", "40453164", "f04f5974c31731224645e5d0374e3e04", [
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("sticker", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认60%, 0% ~ 100%
effects_adjust_size: 默认75%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
sticker: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认40%, 0% ~ 100%"""
福气满满 = EffectMeta("福气满满", False, "6922029632040473095", "1024408", "d4f990d1dd3aa556526945fae1bafcab", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
秋日暖黄 = EffectMeta("秋日暖黄", False, "7005090271696261640", "1352364", "962a7be1764e7dcdb8ab54198a6bde14", [])
空灵 = EffectMeta("空灵", False, "7021096050899292680", "1404120", "c0bbb93750bb7fe5b9b2900ff853adb6", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
窗格 = EffectMeta("窗格", False, "6719656757175521800", "634781", "6c832fb174c39c2c7f8af853987e89e4", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
窗格光 = EffectMeta("窗格光", False, "6823659309428118030", "719378", "6bd27e2b68879bb788d7ef0265648795", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
简约边框 = EffectMeta("简约边框", False, "7039329234170417701", "1475188", "a130a890772cc684fc987dcf2ec22124", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%"""
箭头放大镜 = EffectMeta("箭头放大镜", False, "7067461440960991752", "1579942", "e0540ac533119123deb057f99419b6dc", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认75%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%"""
粉红老电视 = EffectMeta("粉红老电视", False, "6839596824936845838", "770876", "10efcbd56eb7d9dd9cea22bb55bf443c", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
粉红芭比边框 = EffectMeta("粉红芭比边框", False, "6986591867999621668", "1193772", "3500630cec44ef4028af9ea40b325c99", [])
粉色闪粉 = EffectMeta("粉色闪粉", False, "6858953149974057486", "881784", "e0294c868dacfeb1f83c406d4e21e121", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
粉黄渐变 = EffectMeta("粉黄渐变", False, "7008413208721494559", "1365502", "36f666ce547c61a8bbe9fc634cb79b69", [])
精灵闪粉 = EffectMeta("精灵闪粉", False, "6967274435963261476", "1146790", "4a4d26ee6fcb0a71ee15666b8864498f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
精细锐化 = EffectMeta("精细锐化", False, "7250368600911909413", "16609879", "df34b01300ddefbfd8b04bee900ae432", [
EffectParam("effects_adjust_blur", 0.120, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.080, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认12%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%
effects_adjust_size: 默认8%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%"""
糖果纸 = EffectMeta("糖果纸", False, "6782100631638249998", "634217", "37ae35224ded86cd0e5d5bc2d58e3cc8", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
紫色波纹 = EffectMeta("紫色波纹", False, "6987321998036701704", "1195758", "4e80d6d461e093799fa7ce721d7dbd89", [])
紫色负片 = EffectMeta("紫色负片", False, "6915313694884762125", "1007834", "a21c94f366e16f2aa8bd9e491ec226c5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
紫雾 = EffectMeta("紫雾", False, "6886335679681270279", "948716", "bf106ce53d50ff0a7ebabe323a69b097", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
繁星点点 = EffectMeta("繁星点点", False, "6839577027939406344", "768166", "5342526311c51bc957c5abc25b2f5280", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
红晕 = EffectMeta("红晕", False, "7011032152380805640", "1373928", "70d59f036e08cfdaad5ff191d8db7b00", [])
纵向开幕 = EffectMeta("纵向开幕", False, "6876338988437737997", "931824", "d75e138469226782f6d918983725d700", [])
纵向模糊 = EffectMeta("纵向模糊", False, "6716684911840858628", "634137", "ad65a8717a75208aaa742e099b91a881", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%"""
纸膜边框_I = EffectMeta("纸膜边框 I", False, "6981464043542286879", "1181888", "d76f129d3e1a3c4a0350a6537c382c13", [])
纸膜边框_II = EffectMeta("纸膜边框 II", False, "6981464169736311327", "1181886", "b95690afb9846aeacdfccd0cb05cef27", [])
纸质撕边 = EffectMeta("纸质撕边", False, "6843686214025875981", "784032", "fd5588f68a681b8eba1449a5d0240097", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
纸质边框 = EffectMeta("纸质边框", False, "6844765419853582856", "780656", "554d4d330b4d17f0b404e598a66f05c9", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
纸质边框_II = EffectMeta("纸质边框 II", False, "6844832937272152589", "780658", "b3fbce0bfe68298555ab18ed39fc817a", [])
纸醉金迷 = EffectMeta("纸醉金迷", False, "7050402737174876702", "1511534", "dcfb9e8703b3ac243e73afdb664c2b2e", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.801, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_rotate: 默认80%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
细闪 = EffectMeta("细闪", False, "6847773569435308558", "785536", "9f35060cd9e36abab8c5ebb80d8efbf6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
细闪_II = EffectMeta("细闪 II", False, "6893002658420888078", "959412", "186c623a413a10ddbf28bfa0215a55f4", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
细闪_III = EffectMeta("细闪 III", False, "6963598424113418783", "1134290", "432b12f72fe1b0f081dc292bc415dbb0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
美式 = EffectMeta("美式", False, "6849214832856535560", "787752", "d3c405c7369854dd009dd63f6a4b2b46", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%"""
美式_II = EffectMeta("美式 II", False, "6843320153900323335", "774972", "cd7423d39d5a115fc4d5d7f5db43658c", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
美式_III = EffectMeta("美式 III", False, "6843319785522991623", "774968", "d936f602060a9b010a261e85166b5a14", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
美式_IV = EffectMeta("美式 IV", False, "6850006476472193543", "812078", "0bddd63da76f2f117140ff240c57daee", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.620, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认62%, 0% ~ 100%"""
美式_V = EffectMeta("美式 V", False, "6849225862588404237", "787968", "26f287cc23166dc878589197c5800842", [
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
美漫 = EffectMeta("美漫", False, "6981339244547543560", "1181360", "d17c9fedb83124be5b0f758d90eea0be", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
羽毛 = EffectMeta("羽毛", False, "6709706658815152643", "634295", "135a9b19d3a4d08dfdd5bb1c9eabbfec", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
老照片 = EffectMeta("老照片", False, "6815764475375784462", "703231", "140119b43a843a5732e5b4064a58576e", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
老照片_II = EffectMeta("老照片 II", False, "6815767788490068494", "703233", "25921facf51181e20ad0947556517792", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
老照片_III = EffectMeta("老照片 III", False, "6813924503148564999", "719374", "e199463a70a8b3840f248dbc9fac6769", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
老电影 = EffectMeta("老电影", False, "6706773498506777095", "635095", "3ffab78abca09b413e5b7178511f903d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
老电影_II = EffectMeta("老电影 II", False, "6865921078858879496", "898674", "62b508cb16fd1c0da7a2989da5bd49fd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
老电视卡顿 = EffectMeta("老电视卡顿", False, "6706773499052036615", "634771", "da767092b3d91fa36fae380e90f11cdd", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
聚光灯 = EffectMeta("聚光灯", False, "6750075966053159427", "634081", "49c61bf16894adb9926b79d18993c3bd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
聚焦 = EffectMeta("聚焦", False, "6710056993287049742", "635083", "97b20e018b0bdd4ff12025b5358a6e81", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
胡言乱语 = EffectMeta("胡言乱语", False, "6951364520048595492", "1102990", "2b069d3c512bb55aa56b9837d6244eee", [])
胶片 = EffectMeta("胶片", False, "6708624565657932292", "635097", "c85a5c6d8841e2e6dd65813cbe60505c", [
EffectParam("effects_adjust_noise", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_noise: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
胶片_II = EffectMeta("胶片 II", False, "6710090540643258891", "635087", "9c4e00c766b4fd4f603bed3a720397b9", [
EffectParam("effects_adjust_horizontal_chromatic", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.550, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_chromatic: 默认55%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认55%, 0% ~ 100%"""
胶片_III = EffectMeta("胶片 III", False, "6841053178406900231", "773562", "2413a56c73f8432072f1cf4429648193", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
胶片_IV = EffectMeta("胶片 IV", False, "6896439221179912718", "966552", "9f76eb0fd12192188a8ace928de37416", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
胶片抖动 = EffectMeta("胶片抖动", False, "7075213848558440990", "1625760", "86c6710992682fa9d51b9bfea52d2b47", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%"""
胶片显影 = EffectMeta("胶片显影", False, "6830336944111620616", "744244", "a09195689037df58fd23db7f28d3a2b6", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_soft", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_soft: 默认100%, 0% ~ 100%"""
胶片框 = EffectMeta("胶片框", False, "6974600629268255262", "1164161", "393b58c3e98a33f92ea16ac611919909", [])
胶片框_II = EffectMeta("胶片框 II", False, "6974600475999998477", "1164162", "fd84488800ef5683555188564886ab76", [])
胶片框_III = EffectMeta("胶片框 III", False, "6987714956401578510", "1196596", "d0169ca7d23e5196df0e4604bcfbe2c1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
胶片漏光 = EffectMeta("胶片漏光", False, "6815093106841489934", "705083", "179080155bccbfd7ddf7e37137eb2747", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
胶片漏光_II = EffectMeta("胶片漏光 II", False, "6814743838964322829", "718872", "0a0b12f5a4e442871708fcbf14fdec5d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
胶片连拍 = EffectMeta("胶片连拍", False, "6994787976613990925", "1218011", "cb017def5c29fc1af5de0041469d4ff4", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
自然 = EffectMeta("自然", False, "6843319885339038216", "774970", "b692892ba55b4cbd18c97704102b9938", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
自然_II = EffectMeta("自然 II", False, "6841460795394494990", "773090", "7196a6d5e3b895f781a453e70abb971a", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
自然_III = EffectMeta("自然 III", False, "6843680748856152584", "775998", "6d80537f452debf98b09f2df79080e37", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
自然_IV = EffectMeta("自然 IV", False, "6843680812584407559", "776000", "29800968f49ad39520d47e999024becb", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
自然_V = EffectMeta("自然 V", False, "6843319715499086343", "774966", "6ff4d109673eb689778b2be2f5af1c3e", [
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
色差 = EffectMeta("色差", False, "6706773498561303044", "634059", "737c54ea0dcf628cc78714a77eef52a3", [
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
色差开幕 = EffectMeta("色差开幕", False, "6868546720783929870", "904723", "fc98a601f63bacc514067ecfa2849137", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.670, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认67%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%"""
色差放大 = EffectMeta("色差放大", False, "6883360769992299016", "945036", "894bef97217ae4bab59ae710228bdf40", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%"""
色差放射 = EffectMeta("色差放射", False, "6716422405511713287", "634777", "e6a7d2cfcb41ea58d450dc08d17828e0", [
EffectParam("effects_adjust_blur", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.550, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认25%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认55%, 0% ~ 100%"""
色差故障 = EffectMeta("色差故障", False, "6706773498922013191", "634773", "6ee1a1ab0be0849602a3c983a025c47a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.670, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认67%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
色差故障_II = EffectMeta("色差故障 II", False, "6706773498561319428", "634769", "638565d68ac2845eb2c552497efec3d8", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
色差星闪 = EffectMeta("色差星闪", False, "6904921853635072520", "982304", "c13d9ca825a2adb976c429456af2ead0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%"""
色差默片 = EffectMeta("色差默片", False, "6719362972239532548", "634793", "82cc4ec1b530fc13e1af9be9e4b63c4f", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认75%, 0% ~ 100%"""
节日彩带 = EffectMeta("节日彩带", False, "6907438556793278983", "987446", "47ca5466c833a9287af563c9890f8159", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
花火 = EffectMeta("花火", False, "6767147410671014407", "634223", "4e7b79927a6067a2080ce6b61da8faf9", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
花火_II = EffectMeta("花火 II", False, "6907051960180937229", "986478", "8a3f34e4c9650409a8aa6059f8610e14", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
花瓣飘落 = EffectMeta("花瓣飘落", False, "6796905369932141064", "635059", "a772c059e7fb8304292e7ebb870e8eb3", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
花瓣飞扬 = EffectMeta("花瓣飞扬", False, "6796903619762328072", "635057", "24c3c52fe9d54c8677ee514c0530528c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
荡漾_II = EffectMeta("荡漾 II", False, "7140929198763282980", "4493526", "7a08a3c5aa067e55cd0f638cd3161a1b", [
EffectParam("effects_adjust_range", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.350, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认35%, 0% ~ 100%
effects_adjust_intensity: 默认35%, 0% ~ 100%"""
荡秋千 = EffectMeta("荡秋千", False, "7388040405465436722", "73935190", "bee293df8d3c2a62e722c60eca82aab3", [])
荧光扫描 = EffectMeta("荧光扫描", False, "7041474808986472967", "1482382", "4c6263913593bbf1fc06f01e8c3fcf8b", [
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
荧光爱心 = EffectMeta("荧光爱心", False, "6792095053360665096", "634227", "b9b9be20aed7761f81c6757a4428a034", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
荧光线描 = EffectMeta("荧光线描", False, "6795826477590909454", "634945", "8f9738a2f4d1a9de9d844dc27c84361a", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
荧光绿 = EffectMeta("荧光绿", False, "6858138988834722312", "875968", "7cbaffedca388899dec7c7219592074c", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
荧光蝙蝠 = EffectMeta("荧光蝙蝠", False, "6886339116561076749", "948715", "ad61d53ca404616d198bc766e6c64df8", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
荧幕噪点 = EffectMeta("荧幕噪点", False, "6706773534066086413", "634779", "f090492c306fe35f917eed1216f14f8c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
荧幕噪点_II = EffectMeta("荧幕噪点 II", False, "6803161742789579277", "703253", "53ff3188476c74715a73aa34f08a1edf", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
萤光 = EffectMeta("萤光", False, "6715209844216828420", "634107", "59a3ea0709d076e3043555a7d5d40945", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
萤光飞舞 = EffectMeta("萤光飞舞", False, "6877098783209951751", "932242", "d34177a4c2caf9581e67b0206cf6a919", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
萤火 = EffectMeta("萤火", False, "7006265184050221576", "1357502", "d473ca7fa127312a7651ec1523a6e880", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
落叶 = EffectMeta("落叶", False, "6740863535674298888", "635043", "5e8db93a52a15e7254dc7e1c115c145c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
落樱 = EffectMeta("落樱", False, "6924859706661933576", "1031296", "7372d9708980266944aec9650ccde843", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
蒸汽波 = EffectMeta("蒸汽波", False, "6719658860539286020", "634147", "08d620dca82aea6bf5d71d48ba4a6b3d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
蒸汽波投影 = EffectMeta("蒸汽波投影", False, "6830351103272423949", "747926", "83c74d3a0dd8f6d11d3cc3063f1eadfa", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
蒸汽波路灯 = EffectMeta("蒸汽波路灯", False, "6829184472349413895", "755808", "564a4710d8ece86ade31f9eee89deb01", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
蒸汽腾腾 = EffectMeta("蒸汽腾腾", False, "6894200076227318286", "961482", "f852e42917f0ea29be56bbb12891c920", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
蓝光扫描 = EffectMeta("蓝光扫描", False, "7254126209540297274", "17710554", "5f9918f9606b3dfbb8e8c8b7b90ca0e3", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认30%, 0% ~ 100%
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认70%, 0% ~ 100%"""
蓝线模糊 = EffectMeta("蓝线模糊", False, "6920136330563293704", "1019968", "770dd5360aa3cfc96d97738f62627957", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%"""
蓝色负片 = EffectMeta("蓝色负片", False, "6914996050382033421", "1005838", "c40c9ca0a5c2ea1a22c54a3dc943b3de", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
蓝色闪电边框 = EffectMeta("蓝色闪电边框", False, "6989911842575356446", "1201878", "f69acdd1cea097f4db0bf01ed015559b", [])
蔡国强烟花 = EffectMeta("蔡国强烟花", False, "7187218013710455354", "8311325", "045edeb9b6908325a6cc04edda428a8a", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.930, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认93%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
虚化 = EffectMeta("虚化", False, "6756397840785740295", "634065", "5b22f93757ce6807874cc5e1530db8b3", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
蝙蝠Kira = EffectMeta("蝙蝠Kira", False, "6888977985697747463", "953420", "408ee7831b71cbae827138898d26c934", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%"""
蝴蝶 = EffectMeta("蝴蝶", False, "6706773499836404228", "634157", "559a055318e1a9940281c8eb31954ee9", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
蝴蝶_II = EffectMeta("蝴蝶 II", False, "6747586717672280584", "634155", "014a7aa25087ad6a6bfa14ca6146bedd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
蝴蝶光斑 = EffectMeta("蝴蝶光斑", False, "6748307256959308299", "634183", "45377639fc1c0b29cc889f71f6ca2fd0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
蝶舞 = EffectMeta("蝶舞", False, "6747946665312784910", "634177", "b6c530af2bd744d77df4d5b70e3497f8", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
表面模糊 = EffectMeta("表面模糊", False, "7244073793562350140", "15249743", "8629e4a00fdb51b73c98842bc7a6f0c5", [
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_sharpen: 默认70%, 0% ~ 100%"""
裂开了 = EffectMeta("裂开了", False, "6944914067702157861", "1082654", "48084a37dbea8252814a0d96520dcaee", [])
视频分割 = EffectMeta("视频分割", False, "6729023693739004419", "634747", "a9338d60042f719860346409954ed387", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.670, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认67%, 0% ~ 100%"""
视频界面 = EffectMeta("视频界面", False, "6752799091941446147", "635135", "ecbdf02c28278b4436c1dfaf3b733650", [])
诡异分割 = EffectMeta("诡异分割", False, "7021800634621891109", "1408118", "2755d9f7c9b46356a832ef58ef405df7", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.630, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认63%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认70%, 0% ~ 100%"""
负片闪烁 = EffectMeta("负片闪烁", False, "6863353894152442375", "892686", "ed476f61f551e99709b62ce8ed922323", [
EffectParam("effects_adjust_speed", 0.560, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认56%, 0% ~ 100%"""
财富满满 = EffectMeta("财富满满", False, "6920520407179072007", "1020906", "e4d25768a4e675f98501b34454a2fb79", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
财富满满_II = EffectMeta("财富满满 II", False, "6925663127845474830", "1036164", "0b9127c39f743a166ea4783b0afd2df1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
赞赞赞 = EffectMeta("赞赞赞", False, "7057055647472292359", "1543072", "a927f8d9d6b8fcefd4671cb53455d8d5", [])
蹦迪光 = EffectMeta("蹦迪光", False, "6716419849544798723", "634733", "5b3449fa5476bfd93851d0b4cce7b8c9", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%"""
蹦迪彩光 = EffectMeta("蹦迪彩光", False, "6716450942285255182", "634731", "355d46c4bff8c9b6286f3324fb6e27b7", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
车窗 = EffectMeta("车窗", False, "7012926200767058463", "1381596", "e16d42dbe728d95e6cdc2585a817a3e2", [])
车窗影 = EffectMeta("车窗影", False, "6834006887415943694", "761222", "d37540d91f173eaeef40a3ac6a2de42e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
轻微抖动 = EffectMeta("轻微抖动", False, "7258208250896585274", "18798726", "b5235343ec32572db40123246a22fefa", [
EffectParam("effects_adjust_range", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认15%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
轻微放大 = EffectMeta("轻微放大", False, "6791743223522923021", "634077", "c09004507723569a3e762494d4ffda7d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%"""
边缘glitch = EffectMeta("边缘glitch", False, "6777238992816443912", "634749", "516eb9ef0e22a58d17984712a9301b23", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%"""
边缘加色 = EffectMeta("边缘加色", False, "6781315516909752844", "634757", "1d5ac14cba4e6e8559cacd2c37d62c43", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
边缘加色_II = EffectMeta("边缘加色 II", False, "6790180635555140109", "634755", "ff84c6f908752eda1298021c2e382e0f", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
边缘加色_III = EffectMeta("边缘加色 III", False, "6901190770473046535", "974844", "91c834c21a94810977500c0f0f0d406b", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
边缘发光 = EffectMeta("边缘发光", False, "6769065553207235086", "634069", "656e16d4aff7d609ff25c2ff8abc156c", [
EffectParam("effects_adjust_luminance", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认25%, 0% ~ 100%"""
边缘荧光 = EffectMeta("边缘荧光", False, "6903064458008990215", "977454", "270610eeb2c6810b2cd43743033bebee", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
运动一夏 = EffectMeta("运动一夏", False, "6984393713208267301", "1188619", "c78c14c0ce8641f5de8ba5a03f8dce29", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
迪斯科 = EffectMeta("迪斯科", False, "6756113382840996360", "634739", "975bfbd37de349a6c2390576a61d243e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
迷幻烟雾 = EffectMeta("迷幻烟雾", False, "6719661667447214605", "634089", "d03e2cc41acde9dd8e3eab333c43ba2c", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
迷离 = EffectMeta("迷离", False, "6706773549362713095", "634721", "7c2f3180ded615ee30e6d1a5bafc5392", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%"""
迷雾 = EffectMeta("迷雾", False, "6887505634791526926", "950488", "057c2404619359f8ceec96e20eee0f2f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
逆光对焦 = EffectMeta("逆光对焦", False, "6992032047959118344", "1218244", "ff6610f6b575f0038d39736972b8e695", [
EffectParam("effects_adjust_soft", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_soft: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认33%, 0% ~ 100%"""
选中框 = EffectMeta("选中框", False, "6712358020417851917", "635081", "f65a653528911a459a3011c647b68cf4", [])
邮票边框 = EffectMeta("邮票边框", False, "7012988323387937293", "1382084", "f14c0b2288f110621f814c237c5471a6", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认20%, 0% ~ 100%"""
金属背景 = EffectMeta("金属背景", False, "7044853948456374814", "1493772", "44ec1abb4102d0886e6cb4e60a80ae72", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.505, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.710, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认51%, 0% ~ 100%
effects_adjust_intensity: 默认71%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
金片 = EffectMeta("金片", False, "6771299796058640908", "634229", "5ff7544cd83c2ec196b1acc8f47bf51c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金片_II = EffectMeta("金片 II", False, "6924589854269379079", "1030626", "3100003d53722ae2d1e8ca0bde4a1043", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金片炸开 = EffectMeta("金片炸开", False, "6899747182816006669", "972750", "075cfd56ba9a170c62a6ad8150d4845d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金粉 = EffectMeta("金粉", False, "6709706378702754312", "631215", "0443a82ca7b709b643abaf8da7051cca", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金粉_II = EffectMeta("金粉 II", False, "6774672940651778573", "634289", "75dc8419d6ebcca570bb85b0daeb883f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金粉_III = EffectMeta("金粉 III", False, "6984393847467938335", "1188618", "752d69c565983fbed6bb13c3d8542ca7", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金粉撒落 = EffectMeta("金粉撒落", False, "6907439016547717646", "987445", "c84cfe1f31a1a79e5a9b362bc744d3d3", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金粉旋转 = EffectMeta("金粉旋转", False, "7033654301050278431", "1452336", "14fd0f24372acd5be33505ee5759ca11", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金粉聚拢 = EffectMeta("金粉聚拢", False, "6806254339821146637", "703245", "a4d9c4c3bde58e6aa6db39fcef692108", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
金粉闪闪 = EffectMeta("金粉闪闪", False, "7034048554318434830", "1453820", "a552dfa820b5aba27e4f09e3d83b8643", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
钻光 = EffectMeta("钻光", False, "6723824479216079368", "634097", "c9c730b13ac00e7b8b16af1d882fe31c", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
钻石碎片 = EffectMeta("钻石碎片", False, "7077487066476450340", "1639618", "7c201b5477a02796bddb330377b7fce7", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%"""
镜像 = EffectMeta("镜像", False, "6956148985400660517", "1115964", "0e68989382af0ece7e1e864cc2107c67", [])
镜头变焦 = EffectMeta("镜头变焦", False, "6868546663607177736", "904724", "59273e718263fae7a1001c65fe44ad3a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认30%, 0% ~ 100%"""
镭射边框 = EffectMeta("镭射边框", False, "7041103833056940574", "1480896", "bfb7e1244b2c158ad9ebb311c33e6463", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
长虹玻璃 = EffectMeta("长虹玻璃", False, "6992081595976913416", "1235644", "2f5917be32e664eef67419212e54cad0", [
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认0%, 0% ~ 100%
effects_adjust_blur: 默认20%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
闪亮登场 = EffectMeta("闪亮登场", False, "6760547949349966350", "634185", "a1c096efd5f98b438ab0f762bea9c41a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
闪亮登场_II = EffectMeta("闪亮登场 II", False, "6891946116212855303", "958186", "0a249f3cd35bef5ca846a49680248812", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
闪光灯_Ⅰ = EffectMeta("闪光灯 Ⅰ", False, "6844432942563856904", "777760", "c602afac7537de506bb822c37e9f2191", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
闪光震动 = EffectMeta("闪光震动", False, "7260437169389441597", "19279654", "17416edf590446330a683c9eb4f5c9e3", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.580, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_range: 默认58%, 0% ~ 100%
effects_adjust_background_animation: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
闪动 = EffectMeta("闪动", False, "6717639344577843725", "634725", "0bc9ee34335ba4f9d75e4a2b21f4d6e5", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
闪动光斑 = EffectMeta("闪动光斑", False, "6753169731617821191", "634181", "d7c42c303074967c0cad7c7a6adfe896", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
闪屏 = EffectMeta("闪屏", False, "6758298031608566280", "634729", "51b2af1e78502e00abb3d47b21a55796", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
闪电 = EffectMeta("闪电", False, "6734215409513271820", "635069", "6191fcf13bfd15e4288a81a174ba0ed8", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
闪白 = EffectMeta("闪白", False, "6706773500792672781", "634761", "f0804cb2cb4e88a036ecf87dcf031cf0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
闪耀星光 = EffectMeta("闪耀星光", False, "6784346950385799694", "634219", "93c0a1e7829ec10d8502466ea74846dd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
闪闪 = EffectMeta("闪闪", False, "6869625970437919246", "909546", "29a49337bf58c7a042d7b19b5c8a3262", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
闪闪发光_II = EffectMeta("闪闪发光 II", False, "7013264306959553060", "1382870", "9a723996777d5f56d3802b53c8cc46bb", [
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认100%, 0% ~ 100%"""
闪黑 = EffectMeta("闪黑", False, "6863327462470717960", "892171", "383b8ace93434f0c5d17689933140422", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
闪黑II = EffectMeta("闪黑II", False, "7221377929467400765", "12078089", "3c25ccac35121fe42e647b119e37a21f", [
EffectParam("effects_adjust_speed", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_size: 默认25%, 0% ~ 100%
effects_adjust_distortion: 默认40%, 0% ~ 100%"""
闭幕 = EffectMeta("闭幕", False, "6725685146323784205", "634035", "6a59cb9db4036a187d4b1ca3a2cab8f3", [])
闭幕_II = EffectMeta("闭幕 II", False, "6729065630013592067", "634033", "47ad4fe486fe97a4529998d53e5e93b3", [])
随机色块 = EffectMeta("随机色块", False, "7026674824537707038", "1427664", "a7e3cf890d40734c1b44172eff546c41", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_number: 默认30%, 0% ~ 100%
effects_adjust_color: 默认60%, 0% ~ 100%"""
随机色块_II = EffectMeta("随机色块 II", False, "7030742849134006792", "1441868", "0d5b2c847554024c4bd5dbaf06d842fb", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_number: 默认30%, 0% ~ 100%
effects_adjust_color: 默认60%, 0% ~ 100%"""
随机裁剪 = EffectMeta("随机裁剪", False, "6991794787464516127", "1206444", "348f8137cc25a994e2a676a5639d3bd9", [
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认50%, 0% ~ 100%"""
隐形人 = EffectMeta("隐形人", False, "7020318315310486046", "1400804", "2cf16035b605ce73f4b44bcd650adfb3", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.350, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认35%, 0% ~ 100%"""
隔行扫描 = EffectMeta("隔行扫描", False, "6976152376457564708", "1168118", "e8349feb07866b44bbce9c9effa6f51a", [
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
雨滴晕开 = EffectMeta("雨滴晕开", False, "6792488562869670414", "635041", "2bded973503eaa2ce5644ef44354d90d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
雪窗 = EffectMeta("雪窗", False, "7168743948528128548", "6431703", "823ecc00612b35e63837f9ce6f4f4af5", [
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
雪花 = EffectMeta("雪花", False, "7030728702258319909", "1441796", "aa711f9666bdc3e51ff72de0d7c073a8", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
雪花冲屏 = EffectMeta("雪花冲屏", False, "6769435378806952455", "634203", "2c07239e54041e85518b111b1ad8eb86", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
雪花开幕 = EffectMeta("雪花开幕", False, "6730429759425090059", "634045", "8c3a0db33fda83398b66a5a8ab64cc41", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
雪花故障 = EffectMeta("雪花故障", False, "6847689727261282824", "785064", "f24f4cebfa22bc28d74c9b30aa17f1a0", [
EffectParam("effects_adjust_range", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.550, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认15%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认55%, 0% ~ 100%"""
雪花细闪 = EffectMeta("雪花细闪", False, "6770604155561054734", "634201", "3eab18374e64043e209c3deac2bbe56d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
零点解锁 = EffectMeta("零点解锁", False, "6907054642123772430", "6470260", "e3628803155db5b9d465c9fbf5db249d", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%"""
雾气 = EffectMeta("雾气", False, "6734619830449607171", "635049", "add061ec46e4f013ed3482a6dc87c9b9", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
雾气_II = EffectMeta("雾气 II", False, "6740539818666627588", "635045", "6e963a8a2e1fd100e7ac3d2f21100a8a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
雾气光线 = EffectMeta("雾气光线", False, "6715209712129806851", "635065", "607f77fe518da5a26e7457ea932f5ad7", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
震动 = EffectMeta("震动", False, "6761645818723176968", "634075", "d11532bfbfbd6f9af59026c2c42f2570", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
霓虹投影 = EffectMeta("霓虹投影", False, "7058961173743407630", "1552220", "46a3a7dbb114d888726b1cf9a22189c2", [
EffectParam("effects_adjust_soft", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_soft: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认80%, 0% ~ 100%
effects_adjust_size: 默认30%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%"""
霓虹摇摆 = EffectMeta("霓虹摇摆", False, "6925387220073320974", "1034626", "f7ce2e949d495d22dab8f6a2b032a9b9", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%"""
霓虹灯 = EffectMeta("霓虹灯", False, "6829182808485794311", "742028", "35a6f9b3c544b0f97ccbf3fea89e6010", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
预警 = EffectMeta("预警", False, "6955083255825568264", "1113432", "3dfcefd286a1684818c543e17b7d5bc6", [])
颤抖 = EffectMeta("颤抖", False, "6863326875649839623", "892172", "7cb6c1646c43d86a394245e194e3f451", [
EffectParam("effects_adjust_range", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认15%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
飘落花瓣 = EffectMeta("飘落花瓣", False, "6719658795661791747", "634153", "c39b069df62f67308de64f86b920dbbd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
飘落闪粉 = EffectMeta("飘落闪粉", False, "6720029963602366979", "634165", "517bbcd8e398072ce95c0d9763c4c914", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
飘落闪粉_II = EffectMeta("飘落闪粉 II", False, "6720029866504229390", "634163", "6bd90b0f33d3722d759b0fc2d5ddc9bd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
飘雪 = EffectMeta("飘雪", False, "6732360625214722572", "635061", "8e2909d8fe6a77833f62fccf73630aa7", [])
飘雪_II = EffectMeta("飘雪 II", False, "6763531573594690061", "635055", "e4c07894c4f11edbbc580486b50f4b8e", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
飞速计算 = EffectMeta("飞速计算", False, "6951364383477862948", "1102992", "b08f9e05c86b2e980444d336d9db7427", [])
马赛克 = EffectMeta("马赛克", False, "6770564289074827784", "639477", "c9f3bf5b93d53bdc514be0d9c480fcf0", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%"""
高光瞬间 = EffectMeta("高光瞬间", False, "6955021144156017188", "1113136", "7e50ea3473876ee7bbc0f9105cc6c65e", [])
魅力光束 = EffectMeta("魅力光束", False, "6814668066882851335", "705071", "8c305048985cc4cd8236d08b716c2d16", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
魔法 = EffectMeta("魔法", False, "7000199435372204580", "1232490", "98296a4bc028cef2bb3b06ffbb490faf", [
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.802, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
魔法变身 = EffectMeta("魔法变身", False, "6964608751231832613", "1136674", "4ec729c610f93a85cd08b9a9474aaecf", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
魔法边框 = EffectMeta("魔法边框", False, "7020407234798555655", "1401520", "f995faa8d65405b92637e54d90d4d9a9", [])
魔法边框_II = EffectMeta("魔法边框 II", False, "7021795690149843463", "1408090", "6f23fdea097c9e547d934e0c134cd0c9", [])
鱼眼 = EffectMeta("鱼眼", False, "6867722963865571854", "901430", "d72c01234779615a8d370861bcc305c9", [
EffectParam("effects_adjust_distortion", 0.770, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认77%, 0% ~ 100%"""
黄蓝星芒 = EffectMeta("黄蓝星芒", False, "7000312634574639653", "1232996", "290f59cb09438e3b8681f055a9b4a967", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
黑白VHS = EffectMeta("黑白VHS", False, "7021795095900852772", "1408072", "1a53630780dee01e236cff7233d35d01", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.530, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.430, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认53%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认43%, 0% ~ 100%"""
黑白三格 = EffectMeta("黑白三格", False, "6719657002571665934", "635017", "e4022fb9e226f41f58c33d255c647eed", [])
黑白漫画 = EffectMeta("黑白漫画", False, "6795826673993388551", "634953", "f5e6a157bc591221429ad4d0af4764b3", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
黑白漫画_II = EffectMeta("黑白漫画 II", False, "6904876576735760904", "981864", "93e7188b36f51f6aa660cf2cf44569b7", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%"""
黑白线描 = EffectMeta("黑白线描", False, "6795430643154031111", "634951", "68c0d3c64a515b7cdc99b2cf0b6914fe", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
黑线故障 = EffectMeta("黑线故障", False, "6970572741116170788", "1155300", "fc0dca637063d415f92ab45869d9f8d5", [])
黑羽毛 = EffectMeta("黑羽毛", False, "6716441529084285454", "634151", "9be9c2290cd7574af6d47f1779e4519a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
黑羽毛_II = EffectMeta("黑羽毛 II", False, "6751257389422350860", "634149", "8e20f4ef27e5d50c3839eabcde5c292d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
黑胶边框 = EffectMeta("黑胶边框", False, "6865958778265670151", "898866", "30c353317f11b9a5dcdf5b64708955ad", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
黑色噪点 = EffectMeta("黑色噪点", False, "6888561214125773326", "952514", "e7baebcf969437d4d5cdb607578bbf89", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
黑色老电视 = EffectMeta("黑色老电视", False, "6738276072246219277", "635123", "87b8b83900d283b06e02ead6f09111e5", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
# 付费特效
_2024边框 = EffectMeta("2024边框", True, "7322367359967040037", "39438457", "7f263af44c94942d8f67e6709926c0d1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认30%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
_2025气球泡泡 = EffectMeta("2025气球泡泡", True, "7460731559339889203", "101569751", "8ad80a536f2d8737e637efa7242e9ae5", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
_360运镜 = EffectMeta("360运镜", True, "7430701460901335603", "87985393", "d2035259bb0765fc66c528e0e13a2f70", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
_360运镜_II = EffectMeta("360运镜 II", True, "7434813086239822387", "89453641", "ac75ef9cb8e94297b5b2537e9e9f9edf", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认10%, 0% ~ 100%"""
_3D春联 = EffectMeta("3D春联", True, "7460821768022790665", "101633856", "27c92fc147dc89671963d45d58f1e28b", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
_3D环绕 = EffectMeta("3D环绕", True, "7452986473306919433", "98657836", "96d33ee88360e17d149d61e53f71bcf3", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
_3D环绕屏 = EffectMeta("3D环绕屏", True, "7436018394580652553", "89952914", "58f30d06f89764104d9917d3e0b0a99e", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.320, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_size: 默认32%, 0% ~ 100%"""
Bling飘落 = EffectMeta("Bling飘落", True, "7306819369571455515", "31620429", "5425c855f5395166464034278b51afc2", [
EffectParam("effects_adjust_speed", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.450, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认15%, 0% ~ 100%
effects_adjust_number: 默认45%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认90%, 0% ~ 100%
effects_adjust_filter: 默认45%, 0% ~ 100%"""
C300 = EffectMeta("C300", True, "7226241938649780793", "12744891", "3bc3db89a7d77cbeb49d42a9566b575f", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.550, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_soft: 默认40%, 0% ~ 100%
effects_adjust_noise: 默认20%, 0% ~ 100%
effects_adjust_sharpen: 默认30%, 0% ~ 100%
effects_adjust_blur: 默认55%, 0% ~ 100%"""
IXUS = EffectMeta("IXUS", True, "7213660933942415930", "11068675", "b2f6c464c625ce63c950298627775e0f", [
EffectParam("effects_adjust_intensity", 0.440, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认44%, 0% ~ 100%
effects_adjust_texture: 默认30%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认15%, 0% ~ 100%"""
Ins描边 = EffectMeta("Ins描边", True, "7265936765175730744", "20434943", "402b239494189ae949538500b9fd6e50", [
EffectParam("effects_adjust_color", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.460, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认10%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认70%, 0% ~ 100%
effects_adjust_range: 默认70%, 0% ~ 100%
effects_adjust_size: 默认80%, 0% ~ 100%
effects_adjust_number: 默认46%, 0% ~ 100%
effects_adjust_filter: 默认30%, 0% ~ 100%"""
PASSION = EffectMeta("PASSION", True, "7431776147530060314", "88353245", "2c1f3566c8ff77f26376e2ab562ad200", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
S形运镜 = EffectMeta("S形运镜", True, "7291263159023702584", "26271784", "1a137ba40b56a10809190892c3850f95", [
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_rotate: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_size: 默认40%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
W830 = EffectMeta("W830", True, "7226197862529372731", "12732403", "ba2c08dcaa80a24edf38a0d69ccff56d", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认80%, 0% ~ 100%"""
一刀两断 = EffectMeta("一刀两断", True, "7290460914174661177", "26002592", "6e66b782a69fa0c2712deeaf50d4aadf", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_size: 默认40%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
丁达尔旋焦 = EffectMeta("丁达尔旋焦", True, "7361697260960223759", "59474165", "815fe4564516ccb104dd6a12682e6ac2", [
EffectParam("effects_adjust_texture", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认40%, 0% ~ 100%
effects_adjust_luminance: 默认55%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%
effects_adjust_range: 默认40%, 0% ~ 100%
effects_adjust_background_animation: 默认30%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%"""
万向镜像 = EffectMeta("万向镜像", True, "7414043485189181978", "82495223", "bf6fa505f4a9e6ebe3685196fa35e3e5", [
EffectParam("effects_adjust_rotate", 0.120, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_rotate: 默认12%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认10%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
三段式黑白 = EffectMeta("三段式黑白", True, "7447351620641231369", "96240756", "5a47368758c30ac86bead6f943caf268", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
上上签 = EffectMeta("上上签", True, "7460731920393966118", "101569718", "aae06fb86ca90f297dfb0556002f0399", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
下雨涟漪 = EffectMeta("下雨涟漪", True, "7434055685576331786", "89190637", "611edf767c951b6f31a2b4de0457db2d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
丝印涂鸦 = EffectMeta("丝印涂鸦", True, "7270068054040515131", "21210786", "0e342cccb5b95dafc6e99f0f51603b04", [
EffectParam("effects_adjust_color", 0.200, 0.050, 1.000),
EffectParam("effects_adjust_intensity", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.570, 0.000, 0.810),
EffectParam("effects_adjust_speed", 0.430, 0.000, 0.700),
EffectParam("effects_adjust_texture", 0.120, 0.000, 0.500)])
"""参数:
effects_adjust_color: 默认20%, 5% ~ 100%
effects_adjust_intensity: 默认25%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_number: 默认57%, 0% ~ 81%
effects_adjust_speed: 默认43%, 0% ~ 70%
effects_adjust_texture: 默认12%, 0% ~ 50%"""
丝滑运镜 = EffectMeta("丝滑运镜", True, "7382145257607008809", "71888371", "9333197e30c47f6aab8eb7b6bba7bd38", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.667, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认67%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%"""
两屏分割 = EffectMeta("两屏分割", True, "7069602912057430558", "1594946", "2eba26aa15c0e44d2c258ce63a38d243", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_range: 默认10%, 0% ~ 100%"""
中轴旋转 = EffectMeta("中轴旋转", True, "7224407224460775994", "12495253", "16c94e8b38c2d306c11b0d4cfb63dec9", [
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
二次元运镜 = EffectMeta("二次元运镜", True, "7450031573962887731", "97484026", "eb9c27e0a6820a5378dfa46271a05a1f", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
云朵绵绵 = EffectMeta("云朵绵绵", True, "7287143540033851964", "24962948", "66f0d5b98e5c703d596c6d5053b36a73", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
五星好评 = EffectMeta("五星好评", True, "7176947440350663223", "7318779", "68b302b2bea8da7aea6db5fef3da518e", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
交叉震闪 = EffectMeta("交叉震闪", True, "7291135461697786423", "26216294", "c008c7e122d99b87378292db514ed6cb", [
EffectParam("effects_adjust_color", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认30%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_distortion: 默认30%, 0% ~ 100%"""
仙女棒II = EffectMeta("仙女棒II", True, "7447044441463853594", "96135790", "d8d59ffd556810c73d7a65dd0aa8f523", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
低保真 = EffectMeta("低保真", True, "7300933146923504178", "29478846", "afb3e21fb90b170bc431dd088513b2ed", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认70%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认75%, 0% ~ 100%
effects_adjust_sharpen: 默认20%, 0% ~ 100%"""
侧移模糊 = EffectMeta("侧移模糊", True, "7291553469180154423", "26353150", "7b7baa2a697b1d7a119902167b7bff4a", [
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认30%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
信号干扰 = EffectMeta("信号干扰", True, "7447351621220045338", "96240755", "49f0a32af467b676f274dc00af78e562", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
倒带 = EffectMeta("倒带", True, "7358381380687893027", "57670397", "7eb38d3b30ae8e18748fcd3ed726aab2", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认20%, 0% ~ 100%"""
倒计时 = EffectMeta("倒计时", True, "7042501782014005773", "1485906", "06c20494725c2b5873c5aac7fcea3205", [])
倒计时_III = EffectMeta("倒计时 III", True, "7454157863196299802", "99131598", "7bd1e54fade0f0560b63b4ec3f76a6f4", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.375, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_size: 默认38%, 0% ~ 100%"""
倒计时II = EffectMeta("倒计时II", True, "7449262940080837129", "97150131", "f3a56b61e8254873d4d29dd2651db54c", [])
假日闪闪_Ⅱ = EffectMeta("假日闪闪 Ⅱ", True, "7173558602580365838", "6940703", "ee3bcd824b78992d1a9ee05289f724bb", [
EffectParam("effects_adjust_size", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.650, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认55%, 0% ~ 100%
effects_adjust_number: 默认15%, 0% ~ 100%
effects_adjust_rotate: 默认25%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认65%, 0% ~ 100%"""
像素屏闪 = EffectMeta("像素屏闪", True, "7242581780866273850", "14975389", "a0b46f005c19589d83743e33b8f7f05c", [
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认65%, 0% ~ 100%
effects_adjust_color: 默认15%, 0% ~ 100%
effects_adjust_soft: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
像素扫描 = EffectMeta("像素扫描", True, "7345080472545792521", "50297398", "a37ca96c39e545f397ec3ff4c6c9a5b1", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_color: 默认30%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%"""
像素拉伸_II = EffectMeta("像素拉伸 II", True, "7355396055397044790", "56071748", "867a13e17bbab1fff0bc2344a41c4559", [
EffectParam("effects_adjust_rotate", 0.600, 0.200, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_rotate: 默认60%, 20% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%"""
像素排序 = EffectMeta("像素排序", True, "7223659432419267132", "12385973", "24e9de1fa2c77ec26045f7113fdc79f9", [
EffectParam("effects_adjust_number", 0.940, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认94%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_noise: 默认0%, 0% ~ 100%"""
像素故障 = EffectMeta("像素故障", True, "7239557281942082107", "14523597", "964299673ae36eb232abec3452f50624", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
像素爱心 = EffectMeta("像素爱心", True, "7058961362550002212", "1552218", "cbf62902df7101761116f28616cbbabc", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
像素震闪 = EffectMeta("像素震闪", True, "7349147660290363944", "52648474", "5eed2819a04cfccafd198a00309ad2a0", [
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
光线扫描 = EffectMeta("光线扫描", True, "7047492648587760142", "1500914", "815e6f766c2f5ba2e6b6eea27844b2d1", [
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.380, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_color: 默认38%, 0% ~ 100%
effects_adjust_distortion: 默认70%, 0% ~ 100%
effects_adjust_number: 默认15%, 0% ~ 100%"""
光线拖影 = EffectMeta("光线拖影", True, "7254547939194835515", "17852396", "1cee833d647541e86d24bb2f7b7635ea", [
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.340, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_blur: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认34%, 0% ~ 100%"""
光谱扫描 = EffectMeta("光谱扫描", True, "7257452387160298021", "18636946", "67af44e346aa4efe5ff5bbac34c5075d", [
EffectParam("effects_adjust_background_animation", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.614, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.642, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认61%, 0% ~ 100%
effects_adjust_luminance: 默认64%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认33%, 0% ~ 100%"""
兔个好彩头 = EffectMeta("兔个好彩头", True, "7187795247936574013", "8571129", "6a1d2107432c6421a9a3cbfe6a755f04", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%"""
兔兔碎闪 = EffectMeta("兔兔碎闪", True, "7184326422612152887", "8343041", "375943efb400de1f186e9701e1f4b8e6", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_number: 默认80%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
兔年红包 = EffectMeta("兔年红包", True, "7189544276651414073", "8617039", "24bafcb7079b6e420ed621476a35f362", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%"""
全屏烟花 = EffectMeta("全屏烟花", True, "7447044440864068105", "96135791", "710288319a7e330e78098399b22c7728", [])
全屏祝福语 = EffectMeta("全屏祝福语", True, "7460729732548530698", "101570129", "02d2e5b7be8c0f7d663486c9f64f7414", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
全息扫描 = EffectMeta("全息扫描", True, "7246746366108504636", "15772481", "7de6cab0dbc13aaaa9ccc25e1259c3da", [
EffectParam("effects_adjust_luminance", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.260, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.570, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认75%, 0% ~ 100%
effects_adjust_blur: 默认26%, 0% ~ 100%
effects_adjust_background_animation: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认57%, 0% ~ 100%
effects_adjust_vertical_shift: 默认60%, 0% ~ 100%"""
分区显色 = EffectMeta("分区显色", True, "7447351620641231397", "96240753", "bd5c91e7d8ab94c0133cba9a839470f4", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
分屏漏光 = EffectMeta("分屏漏光", True, "7276332732051886649", "22335555", "b19b89d0f4daf5988d2f390e5364077e", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("sticker", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
sticker: 默认0%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
剪纸窗花 = EffectMeta("剪纸窗花", True, "7458222774511735305", "100675645", "29b8ba1503b6a8eb59522c8b21b753e1", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
动态侦测 = EffectMeta("动态侦测", True, "7348407437877056009", "52247519", "930511ab136c4558e75177f724587990", [
EffectParam("effects_adjust_speed", 55.000, 0.000, 100.000),
EffectParam("effects_adjust_number", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.980, 0.000, 1.000),
EffectParam("sticker", 0.240, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认5500%, 0% ~ 10000%
effects_adjust_number: 默认70%, 0% ~ 100%
effects_adjust_color: 默认98%, 0% ~ 100%
sticker: 默认24%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认20%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_texture: 默认20%, 0% ~ 100%
effects_adjust_size: 默认10%, 0% ~ 100%"""
动态格 = EffectMeta("动态格", True, "7065593660921877028", "1570398", "eb35001e4b8d3d9e2c7b797578d1e97c", [
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
动感光束 = EffectMeta("动感光束", True, "7162091309375689223", "5779099", "89af4a6484b09943dd5ce0313b6f3300", [
EffectParam("effects_adjust_intensity", 0.581, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.398, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认58%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认80%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认40%, 0% ~ 100%"""
动感变焦 = EffectMeta("动感变焦", True, "7338707315987583488", "47239575", "a36edfb925cbfa69a86a5bdd53f7237f", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
动感扫光 = EffectMeta("动感扫光", True, "7345724656642429452", "50636467", "8df52caeaddcd571a2b6bb325b7209ae", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_size: 默认25%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_color: 默认10%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认30%, 0% ~ 100%"""
动感推镜 = EffectMeta("动感推镜", True, "7330964667252085248", "43472640", "f482dc307814b8b0697bbf9aa678b5e8", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认60%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
动感竖线 = EffectMeta("动感竖线", True, "7339899789795922468", "47905484", "798630fbe18ab78b9a751a48341aed8b", [
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.210, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认21%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_soft: 默认40%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%"""
动感运镜 = EffectMeta("动感运镜", True, "7340866533943415308", "48296868", "e258bc9e064d90c2b65ec5fed2320885", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
十字模糊 = EffectMeta("十字模糊", True, "7156060838334304775", "5508159", "1855e87e914fb04b0aae6a4e8bfe8eb0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%"""
十字爆闪 = EffectMeta("十字爆闪", True, "7291868496558821915", "26443872", "04a1a4ff3dec382e6c2b00586ceb301a", [
EffectParam("effects_adjust_intensity", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认33%, 0% ~ 100%
effects_adjust_range: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认33%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%"""
单向移动 = EffectMeta("单向移动", True, "7221408305871065661", "12087461", "1efa77e2563de9f51ecf4c8639a995bc", [
EffectParam("effects_adjust_speed", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.490, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认80%, 0% ~ 100%
effects_adjust_rotate: 默认49%, 0% ~ 100%"""
单彩渐变 = EffectMeta("单彩渐变", True, "7296751848508101158", "28007443", "bb064dadbd40eda875b9a632d07c4e3f", [
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_rotate: 默认90%, 0% ~ 100%
effects_adjust_filter: 默认10%, 0% ~ 100%
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%"""
单色填充 = EffectMeta("单色填充", True, "7128329164314120717", "3956309", "7647e2c7607c75922abb4cd232e83dff", [
EffectParam("effects_adjust_range", 0.760, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.360, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认76%, 0% ~ 100%
effects_adjust_color: 默认36%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
卡机 = EffectMeta("卡机", True, "7046676785693463071", "1498082", "ea84ea931c93434b86263b92aabbadd4", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
卡通渲染 = EffectMeta("卡通渲染", True, "7358012370125328937", "57459941", "a0b8524e28d2e4cb243ae5c6a0448fb1", [
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认30%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%
effects_adjust_color: 默认90%, 0% ~ 100%
effects_adjust_filter: 默认75%, 0% ~ 100%
effects_adjust_range: 默认30%, 0% ~ 100%"""
卷轴打开 = EffectMeta("卷轴打开", True, "7460778048531468809", "101601751", "c46d2acf47c8fc4a53f671c9e8ab1f0b", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%"""
厚卡纸 = EffectMeta("厚卡纸", True, "7460821872972665381", "101633890", "88ccfab321b305013a9d1726faa2c55c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
原相机拉近 = EffectMeta("原相机拉近", True, "7400658188275552804", "78211648", "fb068afb4095572e738a13599a8a95f6", [
EffectParam("effects_adjust_speed", 0.318, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.780, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认32%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_size: 默认78%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
原相机滤镜 = EffectMeta("原相机滤镜", True, "7436273714724868646", "90036897", "ce1631792d44856de5c592b5915cf796", [
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认20%, 0% ~ 100%"""
原相机缩放 = EffectMeta("原相机缩放", True, "7436273714724868634", "90036894", "0df47b4b88ed4bf2468491698c35e21d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
双重辉光 = EffectMeta("双重辉光", True, "7408494348532191807", "80799118", "cc39c639f79823193a72fb2af2510b41", [
EffectParam("effects_adjust_range", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认30%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认30%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认70%, 0% ~ 100%
effects_adjust_blur: 默认80%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%"""
发光_II = EffectMeta("发光 II", True, "7347959501246435850", "51997290", "7ea9db818289cf323dc4eff20e79a23f", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
发光HDR = EffectMeta("发光HDR", True, "7265989852099777061", "20444395", "013d2a977c61215ad11af89fb35ea160", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_range: 默认60%, 0% ~ 100%
effects_adjust_size: 默认45%, 0% ~ 100%
effects_adjust_sharpen: 默认70%, 0% ~ 100%
effects_adjust_background_animation: 默认90%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认15%, 0% ~ 100%"""
取景器 = EffectMeta("取景器", True, "7145432172021682725", "4694121", "76868b9a58758e29212eb76abe18eef2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.802, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认34%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
变焦烟花 = EffectMeta("变焦烟花", True, "7445177785401741874", "95320464", "be0a829782f17e209e1192f25347e784", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
变色狙击 = EffectMeta("变色狙击", True, "7146096867544142367", "5418579", "f4876e6aa0a710888c0dded6dd35879c", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
变色闪光 = EffectMeta("变色闪光", True, "7257436414965453368", "18628864", "3f06e59c32f2e12dd4b63686844a0121", [
EffectParam("effects_adjust_range", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.850, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认65%, 0% ~ 100%
effects_adjust_size: 默认25%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认90%, 0% ~ 100%
effects_adjust_blur: 默认85%, 0% ~ 100%"""
变速推镜 = EffectMeta("变速推镜", True, "7338347637009027618", "47074578", "81bb946b8dfe47610a322d7f2d2496d9", [
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 2.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 2.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 2.000),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 200%
effects_adjust_background_animation: 默认100%, 0% ~ 200%
effects_adjust_luminance: 默认100%, 0% ~ 200%
effects_adjust_range: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
变速推镜II = EffectMeta("变速推镜II", True, "7349154305045172736", "53195413", "5b71a4a5390f261a4e400c0dd2e31d0f", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认70%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
可爱圣诞 = EffectMeta("可爱圣诞", True, "7449596462645645851", "97260688", "f670d3c8ddc82f751f03376f08b09885", [])
可爱涂鸦 = EffectMeta("可爱涂鸦", True, "7267137261697765943", "20662139", "3b8f6203dfedcd2ff5d17ff6ac6bef78", [
EffectParam("sticker", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.180, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000)])
"""参数:
sticker: 默认40%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_range: 默认18%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%"""
吓到失魂 = EffectMeta("吓到失魂", True, "7149057547792552456", "4884447", "2ce39d4b185862a94ebaf6d9ca871b96", [
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.707, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认71%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_blur: 默认10%, 0% ~ 100%"""
哈哈镜 = EffectMeta("哈哈镜", True, "7461830381428281893", "101947466", "9e2e04882505dca562eeab6dcf200f8a", [])
噪点屏闪 = EffectMeta("噪点屏闪", True, "7425529107548475955", "86397729", "c7eb0a537b7ec9317a0f4f5912fc95eb", [
EffectParam("effects_adjust_speed", 0.091, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认9%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
噪片映射 = EffectMeta("噪片映射", True, "7130233403898597902", "4002845", "e974f7b6381909e805e37d72c955ab1f", [
EffectParam("effects_adjust_noise", 0.343, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_noise: 默认34%, 0% ~ 100%
effects_adjust_size: 默认10%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
圆形分屏 = EffectMeta("圆形分屏", True, "7298664552793641522", "28683046", "3674e65bf11eb5b60c9ebcb4f7591dbd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认10%, 0% ~ 100%"""
圆形烟花 = EffectMeta("圆形烟花", True, "7444470107008406066", "95041383", "b2b498726f30b8dd06294896cdfba566", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
圆形监控 = EffectMeta("圆形监控", True, "7405798478032409125", "79985522", "5487531876f19bc15620efc82dc648e7", [
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_size: 默认40%, 0% ~ 100%
effects_adjust_noise: 默认80%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
圣诞CD = EffectMeta("圣诞CD", True, "7447044441430299173", "96135792", "4198b6fa3293c7f12dc0bbc4873420c5", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
圣诞Kira = EffectMeta("圣诞Kira", True, "7445177785401741850", "95320466", "6e2013b11ab5a18c0084a6795bd6cc2f", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
圣诞日记 = EffectMeta("圣诞日记", True, "7308639868085604901", "32448752", "360c82d08c822cecb16e79b201768177", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.780, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_size: 默认78%, 0% ~ 100%
effects_adjust_filter: 默认10%, 0% ~ 100%
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
圣诞明信片 = EffectMeta("圣诞明信片", True, "7444470107041960485", "95041382", "f3e9fa3f91efcdec4d9521e800da3b98", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
圣诞边框 = EffectMeta("圣诞边框", True, "7446622476928307762", "95912239", "67f5d6ad7ae49110f1fbb5fe49b0f412", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.003, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认0%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
圣诞限定 = EffectMeta("圣诞限定", True, "7448898555621675529", "97032429", "a170baca7a422904e3482c6d72b8d5dd", [
EffectParam("effects_adjust_speed", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认0%, 0% ~ 100%"""
复古半调 = EffectMeta("复古半调", True, "7406210463857381925", "80123254", "e298eec847f6bd958611ce434786745d", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%"""
复古彩虹 = EffectMeta("复古彩虹", True, "7269735872445026877", "21148898", "75886bbc57543881343141e58e0c3871", [
EffectParam("effects_adjust_size", 0.720, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 0.800),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.900, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认72%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 80%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_texture: 默认90%, 0% ~ 100%"""
复古拼贴 = EffectMeta("复古拼贴", True, "7264510800415429177", "20159886", "8628c4e9455115f3c9fac5411de3241e", [
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.440, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_texture: 默认60%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认10%, 0% ~ 100%
effects_adjust_intensity: 默认44%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%"""
复古撕纸 = EffectMeta("复古撕纸", True, "7406211198057714203", "80123827", "0a64aeaaafa89349b0b22f65042178bf", [])
复古电视 = EffectMeta("复古电视", True, "7406209423548355081", "80122613", "f4def18f6cc20d9e7f52e9b4aedf17f3", [])
复古电视机 = EffectMeta("复古电视机", True, "7447044440859873802", "96135789", "548f22047b7f7a55884c3b5efa25039d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
复古紫调 = EffectMeta("复古紫调", True, "7273707462107075130", "21870120", "eb8220e91369535e0cd5a471fd98b2a2", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.340, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.380, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.260, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.560, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认34%, 0% ~ 100%
effects_adjust_sharpen: 默认38%, 0% ~ 100%
effects_adjust_intensity: 默认26%, 0% ~ 100%
effects_adjust_filter: 默认56%, 0% ~ 100%"""
复古红调 = EffectMeta("复古红调", True, "7170897764744696356", "7308411", "2a96e0c8e739c577b3f3860bad1d0c0a", [
EffectParam("effects_adjust_size", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认80%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认80%, 0% ~ 100%
effects_adjust_sharpen: 默认70%, 0% ~ 100%"""
复古辉光 = EffectMeta("复古辉光", True, "7439255870900277811", "92005922", "d0e35be65f4fae73654b72609bc01edc", [])
复古边框 = EffectMeta("复古边框", True, "7436273714729062938", "90036896", "62ce0da2496c633476e7fc2f11a22578", [
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
复古连拍 = EffectMeta("复古连拍", True, "7078198448045953572", "1644374", "154f59ff4dd71886d96aa36391656a64", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.160, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认16%, 0% ~ 100%"""
复古闪闪 = EffectMeta("复古闪闪", True, "7039549945338139150", "1475376", "bd1494bd893e3e113ef7ca922f2db8a5", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_number: 默认30%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
复古频闪 = EffectMeta("复古频闪", True, "7343141676828856844", "49278125", "83e65027b467568dbc6dd666658e07d8", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.850, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认85%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
大字祝福 = EffectMeta("大字祝福", True, "7460730608377926195", "101569841", "c1e66f467f49c72e96c416b90246e72f", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
大爆竹 = EffectMeta("大爆竹", True, "7460441486266470938", "101483768", "0369cd7b627d9abd3a67d561f4dba61d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%"""
失焦CCD = EffectMeta("失焦CCD", True, "7189438884340568633", "8556597", "e08db3117c2c608d3c1ea94129ff6b27", [
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认30%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_soft: 默认30%, 0% ~ 100%
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%"""
失焦光斑 = EffectMeta("失焦光斑", True, "7280121081208246845", "23238701", "01947e259c3fa9990faa6c58345af775", [
EffectParam("effects_adjust_size", 0.120, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.850, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.340, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认12%, 0% ~ 100%
effects_adjust_number: 默认85%, 0% ~ 100%
effects_adjust_filter: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认34%, 0% ~ 100%"""
夸张信号 = EffectMeta("夸张信号", True, "7447351620645425691", "96240758", "887f0d435a6721395ac38d90bcd1bfec", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
定格祝福 = EffectMeta("定格祝福", True, "7321603111791890982", "39287043", "6ec72c24a543383a74db927a3022e5c1", [
EffectParam("effects_adjust_color", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认55%, 0% ~ 100%
effects_adjust_filter: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认70%, 0% ~ 100%"""
实况开幕 = EffectMeta("实况开幕", True, "7367289783153857024", "63011918", "58a0d76b10a23a76f1d7834f097e888a", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认30%, 0% ~ 100%"""
密码解锁 = EffectMeta("密码解锁", True, "7398180847427260963", "77292235", "08292b54063b060925b648edafb79afd", [
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.560, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_size: 默认56%, 0% ~ 100%
effects_adjust_intensity: 默认10%, 0% ~ 100%
effects_adjust_luminance: 默认20%, 0% ~ 100%
effects_adjust_blur: 默认60%, 0% ~ 100%"""
对焦DV = EffectMeta("对焦DV", True, "7195792007309038117", "9034919", "e9646eb7d4a371f41bd5e3c151f65589", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_blur: 默认20%, 0% ~ 100%
effects_adjust_sharpen: 默认45%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认20%, 0% ~ 100%"""
局部推镜 = EffectMeta("局部推镜", True, "7301528497577529906", "29684830", "a607e28c273a94691df816231b0d5f3c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认40%, 0% ~ 100%
effects_adjust_distortion: 默认30%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
局部色彩 = EffectMeta("局部色彩", True, "7041515097927193125", "1482682", "5a629b9f88febe47a6c99a5113c02d06", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
居中闪切 = EffectMeta("居中闪切", True, "7273800436128158264", "21899077", "aa9b2f9a5fc0d35455795069117748c6", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认0%, 0% ~ 100%"""
屏幕律动 = EffectMeta("屏幕律动", True, "7119437097697546782", "3529421", "0736478f60e481067bdeadeb1c620e00", [
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%"""
幻动光斑 = EffectMeta("幻动光斑", True, "7337641482376974883", "46674042", "5ee226902be5ac3294d53fb015b428d8", [
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_size: 默认30%, 0% ~ 100%"""
幻彩故障 = EffectMeta("幻彩故障", True, "6912383907191067149", "1005744", "76f90178a99f63e7c95869f597c568cd", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
幻影_I = EffectMeta("幻影 I", True, "7212904257043829307", "10969387", "6699feabadc4f59732b8087620fc95a6", [
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
幻觉_II = EffectMeta("幻觉 II", True, "7429260401365226021", "87569749", "3060aba349dbdf58c4a44c06843c8ad3", [
EffectParam("effects_adjust_speed", 0.120, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.050, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认12%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_size: 默认25%, 0% ~ 100%
effects_adjust_soft: 默认5%, 0% ~ 100%"""
广告运镜 = EffectMeta("广告运镜", True, "7435897594078827034", "89895356", "6003cb85205bfa86f67ffa3a7e8a8b6d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
弯曲故障 = EffectMeta("弯曲故障", True, "7403295225700946441", "79148302", "46b05fc90d596733bf661ec54a35c88c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.699, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认20%, 0% ~ 100%
effects_adjust_texture: 默认20%, 0% ~ 100%
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_range: 默认25%, 0% ~ 100%"""
弹动摇镜 = EffectMeta("弹动摇镜", True, "7332839146907505215", "44400476", "79ba3b0f0b1687e56a7514a0301e6af0", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%"""
弹动旋入 = EffectMeta("弹动旋入", True, "7377307494097359371", "69256604", "cc9bb0039ebba34a0951ff9c9b8118c4", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%"""
弹性闪动 = EffectMeta("弹性闪动", True, "7161280260435087885", "5718993", "a852817db39ecb51dd2217523a53a032", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认30%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_range: 默认45%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%"""
弹震运镜 = EffectMeta("弹震运镜", True, "7392137368624435752", "75492745", "80e4086c6478ade8690a96c80d2e549e", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.667, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认67%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
彩光幻影 = EffectMeta("彩光幻影", True, "7429623957759726107", "87673618", "722df70196f3b1e98da6dda3c6184a37", [
EffectParam("effects_adjust_speed", 0.474, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.714, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.667, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认47%, 0% ~ 100%
effects_adjust_luminance: 默认71%, 0% ~ 100%
effects_adjust_distortion: 默认67%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
彩光摇晃 = EffectMeta("彩光摇晃", True, "7359557508014281268", "58342723", "b5ec6622597ef93c0ec5c983c2da730b", [
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%"""
彩光频闪 = EffectMeta("彩光频闪", True, "7221126479793361465", "12061167", "41afdc49bdf68220c2a01997091e5cf5", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.850, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.260, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_range: 默认40%, 0% ~ 100%
effects_adjust_blur: 默认85%, 0% ~ 100%
effects_adjust_color: 默认26%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
彩带飘落 = EffectMeta("彩带飘落", True, "7460732448666554889", "101569557", "ab1fd30d61d7eb0b5a17a9a91f1a59a9", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
彩色像素 = EffectMeta("彩色像素", True, "7254126716489044538", "17710540", "8073d46c5c3b46cee867e6a3c0f86154", [
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.270, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_blur: 默认15%, 0% ~ 100%
effects_adjust_background_animation: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认70%, 0% ~ 100%
effects_adjust_number: 默认70%, 0% ~ 100%
effects_adjust_size: 默认27%, 0% ~ 100%"""
彩色流光_I = EffectMeta("彩色流光 I", True, "7246400747665887802", "15698169", "77ec3549e15d944b01992551e3e0c35e", [
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.590, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_color: 默认59%, 0% ~ 100%
effects_adjust_rotate: 默认70%, 0% ~ 100%
effects_adjust_distortion: 默认0%, 0% ~ 100%"""
彩色流光_II = EffectMeta("彩色流光 II", True, "7251502652549239354", "16940779", "eb006a9670d27e811c07bd7b689bbd99", [
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.030, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认30%, 0% ~ 100%
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_color: 默认3%, 0% ~ 100%
effects_adjust_blur: 默认65%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%"""
彩色流光_III = EffectMeta("彩色流光 III", True, "7246410407399658043", "15699849", "c605c345e8bfc8d98d054f577d31dc55", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_color: 默认60%, 0% ~ 100%
effects_adjust_range: 默认20%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认60%, 0% ~ 100%"""
彩色火焰 = EffectMeta("彩色火焰", True, "6966855040380178981", "1142428", "dc42fa8bd976690e7b99d72532400a54", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
彩色珠滴 = EffectMeta("彩色珠滴", True, "7223201236621726264", "12323189", "68bfe7d647af605724dbff1911ad05f6", [
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.260, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_background_animation: 默认90%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_size: 默认26%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
彩色电光 = EffectMeta("彩色电光", True, "7275262942348579389", "22296923", "4486aefcbd511057cafcdcbc13e4f057", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.680, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认68%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
彩色碎彩 = EffectMeta("彩色碎彩", True, "7181402247824151099", "7743725", "4638f92e49b284396403035e0d9f543f", [
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%"""
彩色碎片 = EffectMeta("彩色碎片", True, "7101592529811804679", "2148348", "48d0dd4f0d70a5d8c6b4846792068335", [
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
sticker: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%"""
彩色碎片_II = EffectMeta("彩色碎片 II", True, "7104546559747953166", "2483800", "0a021da140d56312adf53a90ea3780e5", [
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_noise: 默认20%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%"""
彩色碎闪 = EffectMeta("彩色碎闪", True, "7446672733347254796", "95964975", "b5a00d871b742cbb145d598df80f8a1d", [
EffectParam("effects_adjust_number", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.660, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认45%, 0% ~ 100%
effects_adjust_intensity: 默认66%, 0% ~ 100%
effects_adjust_size: 默认65%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认25%, 0% ~ 100%"""
彩色闪烁 = EffectMeta("彩色闪烁", True, "7222939637260489274", "12297327", "c6596eb98732614cf8a13a639cfde78c", [
EffectParam("effects_adjust_color", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认55%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_sharpen: 默认15%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
彩色雪花 = EffectMeta("彩色雪花", True, "7001001281166774792", "1235380", "510005a5c6cffd42ad6eb21b2a056aef", [
EffectParam("effects_adjust_color", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.660, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认75%, 0% ~ 100%
effects_adjust_number: 默认66%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_background_animation: 默认80%, 0% ~ 100%"""
彩虹光影 = EffectMeta("彩虹光影", True, "7377004728208593447", "69089511", "122551eb93dd49877b59586f7d66d42f", [
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.660, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认40%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_size: 默认66%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
彩虹棱镜 = EffectMeta("彩虹棱镜", True, "7195867446429880889", "9053951", "c96f1eba3950dc1bbe134a216ef4a6bb", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_range: 默认40%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_luminance: 默认30%, 0% ~ 100%"""
彩虹泛光 = EffectMeta("彩虹泛光", True, "7195112049876144698", "10021925", "75a2d417b48815ffec602d06baa28e02", [
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_number: 默认70%, 0% ~ 100%
effects_adjust_range: 默认40%, 0% ~ 100%"""
彩虹闪屏 = EffectMeta("彩虹闪屏", True, "7343557569589285413", "49499805", "aaeae77e0c74db18769bd2cbab83360a", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
彩边频闪 = EffectMeta("彩边频闪", True, "7352815372510171688", "54679766", "9ddcc579cbfbb6350934ea279f7f9f50", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
微信祝福 = EffectMeta("微信祝福", True, "7462226660188754458", "102188349", "64e1e8f4869f8567ce5665f9386979d6", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
微震闪黑 = EffectMeta("微震闪黑", True, "7377721589900513818", "69480931", "28471a0d035b66c5b99d954cbcbf496a", [
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%"""
心花怒放 = EffectMeta("心花怒放", True, "7125743711144645127", "3803337", "2fcb974444894c6e83dd18cb5e01bb1c", [
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认15%, 0% ~ 100%"""
心花怒放III = EffectMeta("心花怒放III", True, "7447067834632376869", "96154625", "602d96dfa15a42e76945665b3b958ef4", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
心跳_II = EffectMeta("心跳 II", True, "7140620970934407693", "4478025", "e940e6b4377d03450c4a53ab618b99f0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.360, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_distortion: 默认70%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认36%, 0% ~ 100%"""
快速变焦 = EffectMeta("快速变焦", True, "7281494629483024952", "23539651", "9af1277c92286811b1890ebe1d682237", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.285, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认28%, 0% ~ 100%"""
快闪运镜 = EffectMeta("快闪运镜", True, "7366140711969755674", "62251172", "4e85edcb46572136ce3343e9cdc197d2", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%"""
怀旧画质 = EffectMeta("怀旧画质", True, "7404740894194143763", "79669475", "1889895837632cf260ba340813aa0dae", [
EffectParam("effects_adjust_texture", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认33%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认30%, 0% ~ 100%
effects_adjust_color: 默认30%, 0% ~ 100%"""
恐怖涂鸦 = EffectMeta("恐怖涂鸦", True, "7117142803863310855", "5418578", "b37405a2ca50f0059744dae5b66ff997", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.220, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.900, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认22%, 0% ~ 100%
effects_adjust_filter: 默认90%, 0% ~ 100%"""
恭喜发财_II = EffectMeta("恭喜发财 II", True, "7462352353199395366", "102289828", "28b09e5e04e27962f904b486dff9149f", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_vertical_shift: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
慢门拖影 = EffectMeta("慢门拖影", True, "7317916065353175579", "37514660", "0bc4e48d7665268ab0f911979fbec195", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.140, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认14%, 0% ~ 100%"""
手写边框 = EffectMeta("手写边框", True, "7111253709614486029", "3099452", "1562db9ef86c866cdd951885f1fa26f4", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.260, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认26%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%"""
手持运镜 = EffectMeta("手持运镜", True, "7434412782293881382", "89308029", "e83d397fd1b2c5fc0a3099a9a535c493", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
扭动变焦 = EffectMeta("扭动变焦", True, "7338354272280515106", "47079994", "83df4a1fadf009b94e737565720debef", [
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认30%, 0% ~ 100%
effects_adjust_distortion: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认30%, 0% ~ 100%"""
扭曲变焦 = EffectMeta("扭曲变焦", True, "7299392770534281765", "28941014", "643635cac6435ea88dd6c4a9ae91303f", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认20%, 0% ~ 100%
effects_adjust_vertical_shift: 默认0%, 0% ~ 100%"""
扭曲模糊 = EffectMeta("扭曲模糊", True, "7210652297754317367", "10694297", "a48e3fb197688fb20a959a961ab54383", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.455, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认45%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%"""
抖动模糊 = EffectMeta("抖动模糊", True, "7202812661405323813", "9780487", "416a2f55681bf6951f25fd3c7336025b", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认20%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_range: 默认20%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
折叠拜年 = EffectMeta("折叠拜年", True, "7460466187265118747", "101494014", "21c575c35d432b01784a501ec8e2b4f0", [
EffectParam("effects_adjust_horizontal_shift", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认33%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_distortion: 默认75%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认75%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
抽帧拖影 = EffectMeta("抽帧拖影", True, "7353197719587918362", "54890386", "000c2f583ffa31993308fef29dea7913", [
EffectParam("effects_adjust_blur", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认75%, 0% ~ 100%
effects_adjust_range: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认20%, 0% ~ 100%"""
拉伸旋镜 = EffectMeta("拉伸旋镜", True, "7359100199437865506", "58077796", "8dd1ef0645dddee8170190583a1ff51a", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.670, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_distortion: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认67%, 0% ~ 100%"""
拉扯震动 = EffectMeta("拉扯震动", True, "7240010949938123320", "14603013", "3fb05905a15df5a9b23f36a940016e4e", [
EffectParam("effects_adjust_distortion", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认40%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%"""
拉镜开幕 = EffectMeta("拉镜开幕", True, "7340923698955686451", "48340294", "5e3de3ba75f157a19687d84df4545bb0", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认60%, 0% ~ 100%"""
拍照定格 = EffectMeta("拍照定格", True, "7358795504966177292", "57913226", "49d70fec464c90afff087cb5854997dd", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%"""
拍立得成像 = EffectMeta("拍立得成像", True, "7450356960953635354", "97589170", "7dea9b0c5f44ad7eeb623dd11fe65d7b", [
EffectParam("effects_adjust_speed", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认35%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
拖影灯光 = EffectMeta("拖影灯光", True, "7328017754584257075", "42028150", "3e1f119bd6387d1495fe234cf746e5f8", [
EffectParam("effects_adjust_number", 0.698, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认90%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
拟截图放大镜 = EffectMeta("拟截图放大镜", True, "7028458557058060831", "1478160", "4c962a1294de796686ec24a81a63fe7e", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%"""
推拉跟随 = EffectMeta("推拉跟随", True, "7380236931893826089", "70944695", "a6fb9367f095b33fa0047a43c2161e74", [
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
推拉运镜 = EffectMeta("推拉运镜", True, "7382100760630137381", "71865342", "4b123b8db48a337b91327c2871ca81e0", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.656, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.849, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认66%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认85%, 0% ~ 100%"""
推近推远 = EffectMeta("推近推远", True, "7434055685572137523", "89190636", "946248ab05631310e821625cee0948bf", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
摇摇乐 = EffectMeta("摇摇乐", True, "7460778162570400265", "101601833", "e29bb4e98d1ded7bd67ba9a769154c1c", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%"""
摇晃叠影 = EffectMeta("摇晃叠影", True, "7307264899422360073", "31866711", "2f82ba674fd1d78a14ccb5d384ee3704", [
EffectParam("effects_adjust_speed", 0.350, 0.100, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认35%, 10% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
摇晃推镜 = EffectMeta("摇晃推镜", True, "7311585733976789554", "33958767", "2b806738c3a5e3126a2013cebc2c4913", [
EffectParam("effects_adjust_range", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
摇晃运镜 = EffectMeta("摇晃运镜", True, "7241063267357954619", "14730265", "bbc5f812f50b8ea1aadb3fd6ac2dd6f0", [
EffectParam("effects_adjust_speed", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认35%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_size: 默认80%, 0% ~ 100%"""
撕纸定格 = EffectMeta("撕纸定格", True, "7409923919739621898", "81222744", "c2740a0fe86e96022287dd56ffe2f926", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
撕纸特写 = EffectMeta("撕纸特写", True, "7235886675845452349", "14014573", "c322a330e87f550e0e56c7cef60e6465", [
EffectParam("effects_adjust_speed", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认35%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
播放界面 = EffectMeta("播放界面", True, "7078880636584333838", "1647944", "ce6641cd0add17ae5b20286b8a8ff72f", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认20%, 0% ~ 100%"""
放大镜视角 = EffectMeta("放大镜视角", True, "7447417965676335667", "96299420", "31143fd0a3da22429e96c2540f45727c", [
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
故障定格 = EffectMeta("故障定格", True, "7223652101287580216", "12383111", "18c3c5143edfcf076876fc70566fd521", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
故障开幕 = EffectMeta("故障开幕", True, "7338335435959046656", "47063402", "43a746efc920f57c2b2196446992f4cf", [
EffectParam("effects_adjust_sharpen", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_sharpen: 默认20%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
故障震闪 = EffectMeta("故障震闪", True, "7315262223213924873", "35954280", "510623ce6e6c3d77151024fe04eb30dd", [
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.714, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认71%, 0% ~ 100%"""
散光弹动 = EffectMeta("散光弹动", True, "7347985147662176807", "52013378", "1d1f9cc33d051f8c2942cbc86de9f6dd", [
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%"""
散光闪烁 = EffectMeta("散光闪烁", True, "7338348256226710016", "47894032", "6353300f8b3c913e3a1d60321fd2cc21", [
EffectParam("effects_adjust_intensity", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
数字矩阵 = EffectMeta("数字矩阵", True, "7254547645903934010", "17852330", "933acfd32f6fa44785c5ba93e42cbc59", [
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认20%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认35%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_range: 默认33%, 0% ~ 100%"""
数学公式 = EffectMeta("数学公式", True, "7410350357768835594", "81347687", "13e4c5b8e054e552385a7d38d0804e5d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
斜线震动 = EffectMeta("斜线震动", True, "7244511673409606201", "15332069", "154a4e843d36fe8660f15624a330d2a1", [
EffectParam("effects_adjust_size", 0.409, 0.000, 1.000),
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.704, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.339, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认41%, 0% ~ 100%
effects_adjust_speed: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认34%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
新年仙女棒 = EffectMeta("新年仙女棒", True, "7321990419351343653", "39297699", "878e6aaf1e19c6de170d4544c22c38b2", [
EffectParam("effects_adjust_size", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.480, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.780, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认45%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认48%, 0% ~ 100%
effects_adjust_vertical_shift: 默认78%, 0% ~ 100%
effects_adjust_range: 默认55%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认0%, 0% ~ 100%"""
新年兔气球 = EffectMeta("新年兔气球", True, "7189956032095851063", "8629763", "94b2f47fa2a2115f935f82d5d6c902c0", [
EffectParam("effects_adjust_size", 0.070, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认7%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
新年投影 = EffectMeta("新年投影", True, "7448898555617481267", "97032431", "5222b9d02e697ad7515c61fd87e4e842", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
新年烟花_II = EffectMeta("新年烟花 II", True, "7448907790933824010", "97041325", "09b16968309c9a38e7bf8f26a9eba800", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认75%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
新年的一封信 = EffectMeta("新年的一封信", True, "7460777723925893683", "101601588", "d721c0ff24cc69c74ec34dcad63a8603", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
新年礼花 = EffectMeta("新年礼花", True, "7459729290070856229", "101222490", "f7cf5ec7f6c00d06238237d05f024477", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%"""
新年边框 = EffectMeta("新年边框", True, "7460778303587095077", "101601911", "7e084ec7bf88a95753793f83b4a99be3", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
新春唱片 = EffectMeta("新春唱片", True, "7458223206294360626", "100675597", "a1783c8c9c16e73e17e4752fa8e4518b", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
新春海报 = EffectMeta("新春海报", True, "7462629172121178633", "102355526", "7b0e7ca4d976cf8e9499b58ea1d29d0a", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认10%, 0% ~ 100%
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_noise: 默认100%, 0% ~ 100%"""
新春边框 = EffectMeta("新春边框", True, "7462628644221882906", "102355090", "af8866b274da11d7bffb54b8c85b0fc6", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
方形模糊 = EffectMeta("方形模糊", True, "7384032238951731739", "72505526", "0883434b90fbeaf428ac86a0f87cb4fe", [
EffectParam("effects_adjust_blur", 0.877, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.450, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认88%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_color: 默认25%, 0% ~ 100%
effects_adjust_luminance: 默认45%, 0% ~ 100%"""
旋焦 = EffectMeta("旋焦", True, "7224445669698703909", "12505491", "c83771425ffddd97d3389480f0f68927", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
旋焦推镜 = EffectMeta("旋焦推镜", True, "7351324357425107519", "53786746", "bfffafcc16a30af7d6faaf7816bd09cf", [
EffectParam("effects_adjust_intensity", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认0%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
旋转变焦 = EffectMeta("旋转变焦", True, "7311544501057622555", "33928843", "46f6856d1b6c40a7d6b7c6da0ae24439", [
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认15%, 0% ~ 100%
effects_adjust_filter: 默认15%, 0% ~ 100%"""
旋转回弹 = EffectMeta("旋转回弹", True, "7343557174058029568", "49499445", "fcc043da345af8e07d700f1d13d32dd8", [
EffectParam("effects_adjust_speed", 0.660, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认66%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_range: 默认70%, 0% ~ 100%
effects_adjust_blur: 默认60%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%"""
旋转圆球 = EffectMeta("旋转圆球", True, "7382147305350107700", "71888863", "bc332eeb63f21a5f48f90221ed709196", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
旋转抖动 = EffectMeta("旋转抖动", True, "7324315025558999602", "40324156", "a2df1870a268dac31ac369382c42cf43", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%"""
旋转抖动_II = EffectMeta("旋转抖动 II", True, "7347956961318539826", "51995951", "a080eeb37e5c98ff3a510c395463727a", [
EffectParam("effects_adjust_speed", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认45%, 0% ~ 100%
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_rotate: 默认80%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认80%, 0% ~ 100%"""
日进斗金 = EffectMeta("日进斗金", True, "7447044440868262426", "96135794", "9016efc4f35a98308a39209cbeb43f86", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
时尚涂鸦 = EffectMeta("时尚涂鸦", True, "7395106209155518987", "76494544", "90de3d14a2ed928534e397c20ddb6213", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
星光变焦 = EffectMeta("星光变焦", True, "7400757039498007079", "78259894", "8f4aef341a825f2a61f14caa75f6e377", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
星星变焦 = EffectMeta("星星变焦", True, "7169474672671592991", "6661731", "daedab920b87b778c4f7c672928dbf96", [
EffectParam("effects_adjust_size", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认70%, 0% ~ 100%"""
曝光变焦 = EffectMeta("曝光变焦", True, "7259639809491079737", "19104048", "b66ceb2594aee2fd5a1ace6a67e4db0f", [
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_soft: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
曝光扩散 = EffectMeta("曝光扩散", True, "7340136879615906344", "47990686", "f01002b2853ba8736b02ee943e132421", [
EffectParam("effects_adjust_luminance", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认33%, 0% ~ 100%
effects_adjust_soft: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
曲线模糊 = EffectMeta("曲线模糊", True, "7340622176065688098", "48215352", "b140dc7906477e7462636a93f5c9fe3c", [
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.366, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.425, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认35%, 0% ~ 100%
effects_adjust_rotate: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认37%, 0% ~ 100%
effects_adjust_vertical_shift: 默认42%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%"""
极速旋转 = EffectMeta("极速旋转", True, "7343542497651462708", "49487569", "c6f8519f592a44f74424411e304bd46b", [
EffectParam("effects_adjust_speed", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%"""
柔和辉光 = EffectMeta("柔和辉光", True, "7249209626829263421", "16279737", "805d415643265f3625c1fb9d55822e32", [
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_range: 默认55%, 0% ~ 100%
effects_adjust_size: 默认25%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
梦幻辉光 = EffectMeta("梦幻辉光", True, "7355386179308491300", "56065875", "4f0997824f81dc66309050646ce45bae", [
EffectParam("effects_adjust_luminance", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.300, 0.000, 2.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.500)])
"""参数:
effects_adjust_luminance: 默认55%, 0% ~ 100%
effects_adjust_range: 默认65%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_soft: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_sharpen: 默认30%, 0% ~ 200%
effects_adjust_blur: 默认20%, 0% ~ 150%"""
模拟拍照 = EffectMeta("模拟拍照", True, "7349154734537708084", "53350183", "2cb9807eebb8a358bc01e02e4a1d48b9", [
EffectParam("effects_adjust_blur", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认10%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%"""
横向闪光 = EffectMeta("横向闪光", True, "7242555690965799483", "14965785", "0e48afbc4e9aa05505644493cbb7156a", [
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_range: 默认20%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
横条开幕 = EffectMeta("横条开幕", True, "7381442168759521792", "71626094", "5fa33938a1ad4a956bbac1b3e9805969", [
EffectParam("effects_adjust_speed", 0.667, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认67%, 0% ~ 100%
effects_adjust_luminance: 默认55%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
樱花飘落 = EffectMeta("樱花飘落", True, "7207718227382637113", "10348463", "3aec4aa18e09e74760fc39d63c8de932", [
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认10%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%"""
欧根纱II = EffectMeta("欧根纱II", True, "7366882927801537024", "62749085", "aebc534e02b822de7d014b33d5ac103c", [
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_range: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认35%, 0% ~ 100%
effects_adjust_number: 默认40%, 0% ~ 100%"""
气球满屏 = EffectMeta("气球满屏", True, "7449596462649840155", "97260689", "64a41fdbb893cc4da9a8a58428ab18c2", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
气球花花 = EffectMeta("气球花花", True, "7231385092193522235", "13400477", "bd2685c4dba13e0e4e44cd4f0a9ff834", [
EffectParam("effects_adjust_speed", 0.700, 0.000, 1.000),
EffectParam("sticker", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认70%, 0% ~ 100%
sticker: 默认100%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
氛围边框 = EffectMeta("氛围边框", True, "7308944810646180379", "32599175", "657d08f76bf5e462d0acb066315d7e32", [
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.800),
EffectParam("effects_adjust_luminance", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_background_animation: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认100%, 0% ~ 180%
effects_adjust_luminance: 默认10%, 0% ~ 100%"""
水光影 = EffectMeta("水光影", True, "7122736441053942285", "3687389", "0e8f5cf28c600c62140c2f3666dbe18b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_distortion: 默认15%, 0% ~ 100%"""
水波倒影 = EffectMeta("水波倒影", True, "7313842878847914547", "35129784", "22ba205844e9fd4ed60701a2c04e213f", [
EffectParam("effects_adjust_vertical_shift", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认35%, 0% ~ 100%
effects_adjust_size: 默认80%, 0% ~ 100%
effects_adjust_distortion: 默认30%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%"""
水波模糊 = EffectMeta("水波模糊", True, "7047088638932292127", "1499278", "99199baa75373b4a0faa08aa1c27a37a", [
EffectParam("effects_adjust_horizontal_chromatic", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_horizontal_chromatic: 默认70%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_blur: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%"""
水波泛起 = EffectMeta("水波泛起", True, "7250433374882370103", "16641371", "eda468a5537c139c6355e5abd75004de", [
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.440, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.460, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认10%, 0% ~ 100%
effects_adjust_number: 默认44%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认46%, 0% ~ 100%"""
水波流动 = EffectMeta("水波流动", True, "7140273505630687780", "4458607", "7dd5dbc55d5db8553d233fee727c40ac", [
EffectParam("effects_adjust_distortion", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认35%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_number: 默认60%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认65%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%"""
水波负片 = EffectMeta("水波负片", True, "7436273714733257267", "90036895", "0e8047d765b4a29f10881df2c8137250", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%"""
水滴扩散 = EffectMeta("水滴扩散", True, "7221508316852130362", "12112703", "b4690abcdd92f98e3291fdcb74444f5b", [
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认0%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认100%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认20%, 0% ~ 100%"""
水雾消散 = EffectMeta("水雾消散", True, "7447371185806905865", "96257972", "1370588adcfb47e9aab36a8d160c1c6b", [])
油画模糊 = EffectMeta("油画模糊", True, "7232232188278739493", "13537551", "f727569dc65078e90f66c9e63d3f9712", [
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.403, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_soft: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_texture: 默认40%, 0% ~ 100%"""
油纸伞 = EffectMeta("油纸伞", True, "7460777943397044745", "101601695", "3dcddee973d2d2f61d3435f403aa7f1c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
法式暖调 = EffectMeta("法式暖调", True, "7090546987170271780", "1747384", "f47d4affff8b734ed6c3b9042e81f7a4", [
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认30%, 0% ~ 100%
effects_adjust_number: 默认30%, 0% ~ 100%
effects_adjust_range: 默认20%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
法式涂鸦 = EffectMeta("法式涂鸦", True, "7253039682877919803", "17395354", "2519d69e2fe1fbe64a653b570e786a0c", [
EffectParam("effects_adjust_color", 0.610, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.661, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.720, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认61%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_number: 默认70%, 0% ~ 100%
effects_adjust_size: 默认30%, 0% ~ 100%
effects_adjust_texture: 默认66%, 0% ~ 100%
effects_adjust_speed: 默认72%, 0% ~ 100%"""
泛光扫描 = EffectMeta("泛光扫描", True, "7134989289498087967", "4217252", "5c2fe2a8c4212ee879c16bea71b31e96", [
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_luminance: 默认75%, 0% ~ 100%
effects_adjust_blur: 默认80%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_background_animation: 默认33%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认0%, 0% ~ 100%"""
泛光爆闪 = EffectMeta("泛光爆闪", True, "7254484266996732476", "17821188", "7eeab42db5ca9a73186fe4f445b7613c", [
EffectParam("effects_adjust_luminance", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认70%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%"""
泛光闪动 = EffectMeta("泛光闪动", True, "7236298986993226301", "14080033", "82e10f464ddcc64d401a2c6bf5897bf7", [
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认35%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
泡泡光斑 = EffectMeta("泡泡光斑", True, "7320155012036825610", "38547267", "a8ef5cdbe91838c8092a05a4ee2abf28", [
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_number: 默认25%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_color: 默认10%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认30%, 0% ~ 100%
effects_adjust_soft: 默认30%, 0% ~ 100%"""
泡泡冲屏 = EffectMeta("泡泡冲屏", True, "7373963046693114387", "67466796", "51ea34188c370cae7e764a47be73d6a3", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 0.800)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 80%"""
波动清晰 = EffectMeta("波动清晰", True, "7340620060362281512", "48213992", "d4009f4188b7c8293760896d5a606f0f", [
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_distortion: 默认25%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认60%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%"""
波浪 = EffectMeta("波浪", True, "7159183282632921631", "5574521", "2d803403ccfbeb2328a811014a55081f", [
EffectParam("effects_adjust_speed", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.780, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认90%, 0% ~ 100%
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_intensity: 默认78%, 0% ~ 100%
effects_adjust_blur: 默认60%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认80%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
波浪丝印 = EffectMeta("波浪丝印", True, "7146406661249307150", "4880117", "cf32c231aa6b092d39cbcd7c346db5a3", [
EffectParam("effects_adjust_texture", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_size: 默认10%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%"""
波纹闪动 = EffectMeta("波纹闪动", True, "7332415663106953769", "44222768", "7efba1463deb33955572e53ec6bd71be", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
流体冲屏 = EffectMeta("流体冲屏", True, "7221730308251456037", "12130415", "958711bf2dc7393f39862e7952f6b5c5", [
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_distortion: 默认40%, 0% ~ 100%
effects_adjust_background_animation: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
流体荡开 = EffectMeta("流体荡开", True, "7322018576125137417", "39315461", "fa0a0cd4b5446445108d6b4d44466739", [
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
流光碎闪 = EffectMeta("流光碎闪", True, "7444520354703217178", "95069546", "a89658eda82aaec1e5de5e4b88e74473", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%"""
浪漫烟火 = EffectMeta("浪漫烟火", True, "7446622476928324146", "95912238", "cbc7a73ca7cc18db127f52f834615faa", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
海报描边 = EffectMeta("海报描边", True, "7133104392231719431", "4118241", "9b6e240d941ae5e77e573cd584265e77", [
EffectParam("effects_adjust_noise", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_noise: 默认100%, 0% ~ 100%
effects_adjust_size: 默认25%, 0% ~ 100%
effects_adjust_number: 默认90%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_distortion: 默认30%, 0% ~ 100%"""
海鸥DC = EffectMeta("海鸥DC", True, "7051853636548170271", "1520896", "b9dc0143d875fbff52cb26f363f45d14", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认70%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%"""
涂鸦vlog = EffectMeta("涂鸦vlog", True, "7418860485258252826", "84197797", "e54edfaf2aa2a1026478bd4500353185", [
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
涂鸦切开 = EffectMeta("涂鸦切开", True, "7447351620649619994", "96240757", "ccb6d40ed8fdddeed18ac38d78463cd9", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
涂鸦抽帧 = EffectMeta("涂鸦抽帧", True, "7433322731896050212", "88922989", "f0656a8c99219b086ce5d16260ba0883", [
EffectParam("effects_adjust_speed", 0.310, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认31%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
涂鸦拍立得 = EffectMeta("涂鸦拍立得", True, "7407715616225759807", "80566411", "9defe8f1bb3caa8a507c0955dec179ab", [
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_background_animation: 默认30%, 0% ~ 100%"""
液态分离 = EffectMeta("液态分离", True, "7241096748184113701", "14742833", "c24d9c1a2bf816e305645ee216b75e30", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%"""
滑动打开 = EffectMeta("滑动打开", True, "7462679471246545459", "102385218", "2f405480a8abd75bf48ca89814dbfc75", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
滑动载入 = EffectMeta("滑动载入", True, "7442210447844971017", "93990334", "138bb98faf97cb00a770bc807533a6a7", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认75%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认25%, 0% ~ 100%"""
漂浮爱心 = EffectMeta("漂浮爱心", True, "7306769922535723558", "31585739", "2a84ea537b525994b2803d6a538960e1", [
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_color: 默认20%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
漏光闪烁 = EffectMeta("漏光闪烁", True, "7413730211969110537", "82396172", "f772864cb56f826fa1cf67a00c4c55ae", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
漫画负片 = EffectMeta("漫画负片", True, "7435897594070438451", "89895358", "2e09d555c348a0208d7ea1d7fe2afb67", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
潮流涂鸦 = EffectMeta("潮流涂鸦", True, "7350240257914180135", "53198933", "9d284a90662cd32eeb4e8228a379c441", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
瀑布开幕 = EffectMeta("瀑布开幕", True, "7351689682138174006", "54008092", "ecd11cf24ab2644cc93ae00f4ad1a7d3", [
EffectParam("effects_adjust_speed", 0.570, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.260, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认57%, 0% ~ 100%
effects_adjust_intensity: 默认65%, 0% ~ 100%
effects_adjust_texture: 默认0%, 0% ~ 100%
effects_adjust_distortion: 默认26%, 0% ~ 100%
effects_adjust_range: 默认25%, 0% ~ 100%
effects_adjust_blur: 默认60%, 0% ~ 100%"""
瀑布烟花 = EffectMeta("瀑布烟花", True, "7462213415688213001", "102169716", "4ab7dac6b5d24bf7b1c4a91fc64081bf", [
EffectParam("effects_adjust_size", 0.201, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认10%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
灵异幻觉 = EffectMeta("灵异幻觉", True, "7441568585081688585", "93705701", "38de70b802f171882f6f657e68bd247f", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认33%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%"""
灵魂出窍_II = EffectMeta("灵魂出窍 II", True, "7299377358283215398", "28934274", "4e2c3e0ff21146736ddfeea23e6affaa", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.850, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_distortion: 默认60%, 0% ~ 100%
effects_adjust_background_animation: 默认85%, 0% ~ 100%"""
灿灿金币 = EffectMeta("灿灿金币", True, "7304546673215148595", "30737307", "921df9ceada99345eff8e577b1e10722", [
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_soft: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认80%, 0% ~ 100%"""
灿金彩带 = EffectMeta("灿金彩带", True, "7308706488686481947", "33271125", "22171c77551d5769904778e3bd386859", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.250, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_luminance: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认25%, 0% ~ 100%"""
炫光变焦 = EffectMeta("炫光变焦", True, "7002109122350944781", "1237470", "8b94fb6f9bacb3eab0d44fc8bad3ddd1", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.753, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_range: 默认75%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
炫光扫描 = EffectMeta("炫光扫描", True, "7367314177741820435", "63023070", "79582fc0a97afe1fcd4fb0199d07bc7d", [
EffectParam("effects_adjust_speed", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.660, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认35%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认66%, 0% ~ 100%"""
炸蛇烟花 = EffectMeta("炸蛇烟花", True, "7458204947906040370", "100663283", "64fa5d34972162e45edfece47484fb67", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
烟火星河 = EffectMeta("烟火星河", True, "7449596462645645874", "97260687", "1d22ca051967621891fa576a8a3ba63d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
烟花2024 = EffectMeta("烟花2024", True, "7308706250731033097", "36744068", "511dd4d1de63c4839c5912c69711e8cf", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.770, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.625, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认77%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_range: 默认62%, 0% ~ 100%"""
烟花2025 = EffectMeta("烟花2025", True, "7446764449010029066", "96021458", "c4ab56394260f08f331e3c52b4a3095b", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.770, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.625, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认77%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_range: 默认62%, 0% ~ 100%"""
烟花光晕 = EffectMeta("烟花光晕", True, "7445177785410130469", "95320465", "947ce77334e34be7c1747c3d3aab9dc5", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
烟花孔明灯 = EffectMeta("烟花孔明灯", True, "7460733084413989426", "101569174", "413ec432f79d18bf48e11af240bd6793", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
烟花字 = EffectMeta("烟花字", True, "7461841371700138505", "101960315", "e5757b05917d698d8706fdb12754ec70", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%"""
热恋 = EffectMeta("热恋", True, "7195020880018149944", "9062069", "d4a9c95961f95536f3fc44096bf62cbd", [
EffectParam("effects_adjust_size", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.060, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认45%, 0% ~ 100%
effects_adjust_number: 默认45%, 0% ~ 100%
effects_adjust_rotate: 默认6%, 0% ~ 100%
effects_adjust_blur: 默认20%, 0% ~ 100%
effects_adjust_range: 默认55%, 0% ~ 100%
effects_adjust_sharpen: 默认75%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
爆元宝 = EffectMeta("爆元宝", True, "7460732612668035634", "101569519", "c7ab795e6d3821b60e96983ca3d18a73", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
爆闪锐化 = EffectMeta("爆闪锐化", True, "7222907722486780472", "12284805", "27d81a8d1668c51e45ebbf291e966d80", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认70%, 0% ~ 100%"""
爱心下雪 = EffectMeta("爱心下雪", True, "7434055685559554569", "89190638", "04b88d33955445219fe653beffedf9fe", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
爱心扫光 = EffectMeta("爱心扫光", True, "7322345920962499123", "39420273", "e1629600c228ebd43732cb589c245168", [
EffectParam("effects_adjust_luminance", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认55%, 0% ~ 100%
effects_adjust_soft: 默认30%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_size: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
爱心气球 = EffectMeta("爱心气球", True, "7268210584707928634", "20875808", "ec80143a43c12596d99f8c31043c6a8b", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
爱心烟花Ⅱ = EffectMeta("爱心烟花Ⅱ", True, "7451813291430515210", "98156320", "f961167fa67429d688cab96b4ec7fac9", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
爱心软糖 = EffectMeta("爱心软糖", True, "7331625316885991970", "43774786", "0bab0476804fd6ac903bda686f49f3cb", [
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.900, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认90%, 0% ~ 100%"""
爱心边框 = EffectMeta("爱心边框", True, "7065927898833621511", "1572505", "2f62bf787eb44535dbd128d60f46a29c", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%"""
猫眼迎财 = EffectMeta("猫眼迎财", True, "7462694218327134758", "102389141", "452e5072f25c9dc56af900706c06629e", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
玫瑰冲屏 = EffectMeta("玫瑰冲屏", True, "7463437625777459721", "102609449", "9909e3be25c7759aff9131551e92dc01", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
珠光Kira = EffectMeta("珠光Kira", True, "7267917946733728314", "20820466", "235af2aa5680584b232598629e70b990", [
EffectParam("effects_adjust_number", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认60%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%
effects_adjust_vertical_shift: 默认30%, 0% ~ 100%
effects_adjust_range: 默认70%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%"""
珠光碎闪 = EffectMeta("珠光碎闪", True, "7265695554640810533", "20405527", "325258e144f2c6417f123d48886356de", [
EffectParam("effects_adjust_filter", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认55%, 0% ~ 100%
effects_adjust_range: 默认75%, 0% ~ 100%
effects_adjust_size: 默认65%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_blur: 默认15%, 0% ~ 100%"""
琉璃拖影 = EffectMeta("琉璃拖影", True, "7306400287323853349", "31428923", "25ac2f9f90dae5ffb9155b73d984d9e4", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_range: 默认45%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%"""
电光描边 = EffectMeta("电光描边", True, "7106762731960668703", "2721906", "15153b69c032c89f4087d12ef7a613ca", [
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%"""
电光波动 = EffectMeta("电光波动", True, "7301674026173207066", "29755128", "9d7a93ea28f697fbc109cd26377d025d", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 2.000),
EffectParam("effects_adjust_color", 0.030, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 200%
effects_adjust_color: 默认3%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
电光爆闪 = EffectMeta("电光爆闪", True, "7306471467397419547", "31478585", "dfc0eec30caaa1a9f992332a85e89a7b", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_distortion: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
电光爆闪_II = EffectMeta("电光爆闪 II", True, "7349150013441708559", "52650215", "8129e3f83ad6973ba9e6613dbf7afb88", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%"""
电光爱心 = EffectMeta("电光爱心", True, "7106779118867321357", "2724410", "04883bbcc4ce20a240d5f90dc34db76f", [
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.419, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.473, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.590, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认42%, 0% ~ 100%
effects_adjust_intensity: 默认47%, 0% ~ 100%
effects_adjust_color: 默认59%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认100%, 0% ~ 100%"""
电子复古粉 = EffectMeta("电子复古粉", True, "7434001622113456678", "89153641", "2102c9c79f38d0d3b802a5d09e5b36f0", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
电音故障 = EffectMeta("电音故障", True, "7246745900473651773", "15772327", "fdec63c54f10bf1b8b557a3709196eff", [
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.580, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认58%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
画质清晰 = EffectMeta("画质清晰", True, "7348707427165934107", "52400085", "4a35ff3b8a83d2cec2d56e5651f9e04a", [
EffectParam("effects_adjust_luminance", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.800, 0.000, 2.000),
EffectParam("effects_adjust_blur", 0.300, 0.000, 1.500),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认25%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_sharpen: 默认80%, 0% ~ 200%
effects_adjust_blur: 默认30%, 0% ~ 150%
effects_adjust_range: 默认70%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_soft: 默认33%, 0% ~ 100%"""
白鸽 = EffectMeta("白鸽", True, "7382490757770252827", "71992424", "3e6056fb9e3a1829a666c6680f7eab83", [
EffectParam("effects_adjust_size", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
相机抓拍 = EffectMeta("相机抓拍", True, "7439935845156524583", "92805703", "afed56c097d6e532405e1988f89073c7", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.420, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认42%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%"""
相机框抖动 = EffectMeta("相机框抖动", True, "7447351621207462426", "96240754", "aa7ee627cd11bbf4d8c83ae2b90f59ca", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
相片定格 = EffectMeta("相片定格", True, "7265526511220822586", "20350863", "a58e3178d3a498edac53074a3c3a7542", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.850, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认85%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
真爱至上 = EffectMeta("真爱至上", True, "7442582812139459110", "94166372", "8c1fda9166cda42b28966135c1d4241c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
矩形闪白 = EffectMeta("矩形闪白", True, "7434412782289703450", "89308030", "160ed769f0845a0e2d3f8944f14708ae", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
矩阵频闪 = EffectMeta("矩阵频闪", True, "7306346511367934491", "31403673", "51763569c67e833ffcb37bd41a365c75", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.880, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认33%, 0% ~ 100%
effects_adjust_color: 默认88%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%"""
碎闪描边 = EffectMeta("碎闪描边", True, "7130585329609740814", "4007289", "0962a641c7d9fd4cc075a305752f8c62", [
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_color: 默认55%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%"""
磁带DV = EffectMeta("磁带DV", True, "7101987162526061070", "2211756", "b6b5848678e71593cf7e5112874b9939", [
EffectParam("effects_adjust_sharpen", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_sharpen: 默认30%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%
effects_adjust_size: 默认10%, 0% ~ 100%
effects_adjust_color: 默认60%, 0% ~ 100%
effects_adjust_texture: 默认30%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
磨砂水晶 = EffectMeta("磨砂水晶", True, "7090380952605561381", "1729610", "f0d404000523379787cffd6e1db715c2", [
EffectParam("effects_adjust_vertical_shift", 0.000, -1.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.000, -1.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_vertical_shift: 默认0%, -100% ~ 100%
effects_adjust_horizontal_shift: 默认0%, -100% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%"""
神龙纳福 = EffectMeta("神龙纳福", True, "7326853354615738889", "41485429", "de1999f4a3c33b823bd0ab1b24142adb", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认65%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%"""
秋日暖阳 = EffectMeta("秋日暖阳", True, "7156868464894808583", "5408805", "43110d01b43a3f0b2c3f9c0600c07c4a", [
EffectParam("effects_adjust_blur", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认45%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%"""
移轴模糊 = EffectMeta("移轴模糊", True, "7246784641384845861", "15780929", "ceae265f1f63d74a4816f647710885a3", [
EffectParam("effects_adjust_range", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认10%, 0% ~ 100%
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认0%, 0% ~ 100%"""
竖向开幕 = EffectMeta("竖向开幕", True, "7384009190836015654", "72501890", "26c9cc8d460d2639fe4fbb0bbd012d41", [
EffectParam("effects_adjust_blur", 0.877, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认88%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_distortion: 默认60%, 0% ~ 100%"""
竖向闪光 = EffectMeta("竖向闪光", True, "7212938795702817338", "10976911", "7529d488cc18a6fb4a7e58c4ef3af378", [
EffectParam("effects_adjust_number", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.690, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认80%, 0% ~ 100%
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_range: 默认69%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
竖线屏闪 = EffectMeta("竖线屏闪", True, "7304258446658900489", "30666842", "4444e09ba223f94827fb9d423f445a71", [
EffectParam("effects_adjust_luminance", 1.700, 0.000, 2.300),
EffectParam("effects_adjust_blur", 1.000, 0.000, 2.500),
EffectParam("effects_adjust_range", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 2.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认170%, 0% ~ 230%
effects_adjust_blur: 默认100%, 0% ~ 250%
effects_adjust_range: 默认15%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 200%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
竖闪模糊 = EffectMeta("竖闪模糊", True, "7291135061494075960", "26216108", "795af3daacce29e8d7732e5b2223e01a", [
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%"""
童趣闪电 = EffectMeta("童趣闪电", True, "7432192373163037222", "88507650", "e95493493cc5a1390dc01cabc124640c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
粉雪 = EffectMeta("粉雪", True, "7298283919944716827", "28549704", "273f611315ca2f66e370a3a77de6185c", [
EffectParam("effects_adjust_background_animation", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.950, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认40%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认95%, 0% ~ 100%"""
粒子放射 = EffectMeta("粒子放射", True, "7217716815407878693", "11587497", "df109cf35978de6bcc3803f559b14b07", [
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
精致辉光 = EffectMeta("精致辉光", True, "7368344527494451712", "63611181", "e9ce7af10b21bf8ece1dd5ec44d86fc6", [
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.850, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_range: 默认85%, 0% ~ 100%
effects_adjust_size: 默认40%, 0% ~ 100%
effects_adjust_soft: 默认60%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认40%, 0% ~ 100%"""
紫光夜 = EffectMeta("紫光夜", True, "7311995150962528778", "34184103", "1a4c76312950f09d8fd14e68de775bd8", [
EffectParam("effects_adjust_number", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认100%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_rotate: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
繁花棱镜II = EffectMeta("繁花棱镜II", True, "7269749564658160184", "21150170", "f0d388c9f42348261ed7b6871cfaa86e", [
EffectParam("effects_adjust_background_animation", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认80%, 0% ~ 100%
effects_adjust_filter: 默认20%, 0% ~ 100%
effects_adjust_intensity: 默认80%, 0% ~ 100%
effects_adjust_range: 默认40%, 0% ~ 100%
effects_adjust_luminance: 默认30%, 0% ~ 100%"""
红包来了 = EffectMeta("红包来了", True, "7320154851793441307", "39289351", "d18aae7751367cc8827100959dc62c14", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%"""
红包转转 = EffectMeta("红包转转", True, "7462628759770763826", "102355143", "1312fcc268256aa4503c0c0f9612c2ba", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
红蓝魔 = EffectMeta("红蓝魔", True, "7122384870294163975", "3675609", "0c7634532abc28facafe3afe024a4fbc", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
红边模糊 = EffectMeta("红边模糊", True, "7130591331700707876", "4007601", "1afa6bef0ff1ddd4e54c13a2d6a7c59a", [
EffectParam("effects_adjust_blur", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.900, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认90%, 0% ~ 100%
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_filter: 默认90%, 0% ~ 100%"""
纵向跳动 = EffectMeta("纵向跳动", True, "7190200556692967995", "8626971", "95f1d0f51d2eb529ac7b97c8cddbfaf1", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认100%, 0% ~ 100%"""
纸质抽帧 = EffectMeta("纸质抽帧", True, "7416333380603613737", "83272772", "199b1039f81ea6245c0b470230d05614", [
EffectParam("effects_adjust_speed", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认10%, 0% ~ 100%
effects_adjust_size: 默认33%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
线光变速 = EffectMeta("线光变速", True, "7367628113062138377", "63209940", "87a99c8ae0f9e333abaef48b79a96c90", [
EffectParam("effects_adjust_intensity", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认30%, 0% ~ 100%
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认60%, 0% ~ 100%
effects_adjust_number: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%"""
绚丽光斑 = EffectMeta("绚丽光斑", True, "7445196904868090419", "95331639", "4581a1c623e15aa42888ec59ce87b11a", [
EffectParam("effects_adjust_speed", 0.670, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认67%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认75%, 0% ~ 100%"""
缤纷 = EffectMeta("缤纷", True, "7072268839303516709", "1607634", "4294dd203d48821ed92525b79f704231", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_number: 默认30%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
缤纷彩带 = EffectMeta("缤纷彩带", True, "7445177785405936138", "95320463", "bd76e2e89ffe2698d6e2f15a0e7918fa", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
缤纷烟花 = EffectMeta("缤纷烟花", True, "7314928469819789850", "35751784", "34cfcdc1840ef8c1ffab2bd3f0180ded", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.770, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认77%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
缩放运镜 = EffectMeta("缩放运镜", True, "7436273714733257253", "90036898", "cd385576887865cd23acfbad20a95440", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
网点丝印 = EffectMeta("网点丝印", True, "7146404902971904548", "4879935", "01312233fbabf72f4f66ac30f84c020c", [
EffectParam("effects_adjust_texture", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%"""
群蝶飞舞 = EffectMeta("群蝶飞舞", True, "7347658324956942883", "51832286", "88f861bb14eac5dae7fe7e5df123d718", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
羽毛飘落 = EffectMeta("羽毛飘落", True, "7379513630837969445", "70529088", "46f1c56f6fcd3a2abd80ff7d701f6eb0", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.260, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.108, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认35%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认26%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认11%, 0% ~ 100%"""
翻转变焦 = EffectMeta("翻转变焦", True, "7299377095107416585", "28934164", "fd70d11eb7a16891bd6f7c848455da9c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_intensity: 默认45%, 0% ~ 100%
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_sharpen: 默认40%, 0% ~ 100%
effects_adjust_luminance: 默认40%, 0% ~ 100%"""
翻转开幕 = EffectMeta("翻转开幕", True, "7235902836188385852", "14020695", "a4d3d6cc942a659f39cc5bbcb90b516e", [
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_color: 默认10%, 0% ~ 100%"""
老式DV = EffectMeta("老式DV", True, "7026261220961292807", "1426168", "9b7fc1e4ed44a38366a37377d7003192", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.630, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_sharpen: 默认63%, 0% ~ 100%
effects_adjust_noise: 默认30%, 0% ~ 100%"""
聚光灯金粉 = EffectMeta("聚光灯金粉", True, "7460732843547693577", "101569261", "e67767facff37c3f8b3e91230652b627", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
聚焦色散 = EffectMeta("聚焦色散", True, "7430786234508644875", "88045350", "9eeaa1bba5cd7bfa9c72bc0ce4d922a7", [
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.125, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认12%, 0% ~ 100%
effects_adjust_sharpen: 默认20%, 0% ~ 100%"""
胶卷 = EffectMeta("胶卷", True, "7460730844018119205", "101569809", "1278b39eb118bacf343a32dc3d638558", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
胶片V = EffectMeta("胶片V", True, "7151967279817691662", "5050659", "e8dabb72421c2773120bfc6d4d3785f0", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
胶片冷绿 = EffectMeta("胶片冷绿", True, "7146524414312452645", "4837281", "52a78b591b893502154b101c757877db", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%"""
胶片暖棕 = EffectMeta("胶片暖棕", True, "7145385234320593439", "4837280", "bcb9ebf14085e77e8b0e1cd1cf0a87f8", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%"""
胶片滚动 = EffectMeta("胶片滚动", True, "7080354236956938782", "1655466", "a05a7b82f4d36066ef3d6630bb1be809", [
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
胶片漏光III = EffectMeta("胶片漏光III", True, "7437386424036364827", "90546418", "ae1e56523970804e5171769ff23ff2fa", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
胶片翻转 = EffectMeta("胶片翻转", True, "7429592751961805348", "87654332", "564433ca46bf2bfbb5a7f4876e682632", [
EffectParam("effects_adjust_speed", 0.480, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认48%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
胶片边框 = EffectMeta("胶片边框", True, "7448898555617481243", "97032432", "024763692a9bc969e04c88f1341f6043", [])
胶片闪切 = EffectMeta("胶片闪切", True, "7384745950608101924", "72761923", "347713d7f8a7b69b1885ee9d38cd8de6", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认100%, 0% ~ 100%"""
脉搏跳动 = EffectMeta("脉搏跳动", True, "7052226294972420621", "1522814", "c65fc5a267dde559e80e16c8fcc9cd6c", [
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认90%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_range: 默认70%, 0% ~ 100%"""
腾云驾雾 = EffectMeta("腾云驾雾", True, "7405560326650860042", "79942991", "2c871332504a40b7dbe9e8e9e0c9283b", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认0%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认0%, 0% ~ 100%"""
色差震闪 = EffectMeta("色差震闪", True, "7355109046694711871", "55932216", "b4d72c47be1ca1238cddf0790a8a0c55", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_color: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
色散冲击 = EffectMeta("色散冲击", True, "7374053937369846307", "67503542", "ed2771a77992c0f8d0958bbaadbba53e", [
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_vertical_chromatic", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认60%, 0% ~ 100%
effects_adjust_vertical_chromatic: 默认60%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%"""
色散故障 = EffectMeta("色散故障", True, "7242574690638631479", "14972687", "5989d49ac22b81107c9741367ae6651d", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
节奏热成像 = EffectMeta("节奏热成像", True, "7416626838232896012", "83369566", "a56e9c4eb9b81ab28f6eb68e8a3afef0", [
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_size: 默认60%, 0% ~ 100%
effects_adjust_luminance: 默认40%, 0% ~ 100%"""
花屏故障 = EffectMeta("花屏故障", True, "7425528614847779379", "86397374", "1f7b111effe937c3ec574a0791866cf9", [
EffectParam("effects_adjust_speed", 0.091, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认9%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
花屏故障_II = EffectMeta("花屏故障 II", True, "7392894917720150565", "75855950", "429436b9a9eac2edd4fea857b3074432", [
EffectParam("effects_adjust_intensity", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认75%, 0% ~ 100%
effects_adjust_luminance: 默认0%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%"""
花瓣环绕 = EffectMeta("花瓣环绕", True, "7345688874577826342", "50608291", "d954d5148a1d1ec24016499b38b85d1d", [
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认33%, 0% ~ 100%"""
荧光星河 = EffectMeta("荧光星河", True, "7448898556410204681", "97032428", "22ec77257edf26222b3bb9704b261908", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
菱形光斑 = EffectMeta("菱形光斑", True, "7316813562783994395", "40449614", "8baa04aecc7a8e40d9c71cb3c7a91f33", [
EffectParam("effects_adjust_filter", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.230, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认55%, 0% ~ 100%
effects_adjust_range: 默认25%, 0% ~ 100%
effects_adjust_color: 默认23%, 0% ~ 100%
effects_adjust_blur: 默认65%, 0% ~ 100%
effects_adjust_speed: 默认45%, 0% ~ 100%
effects_adjust_vertical_shift: 默认75%, 0% ~ 100%"""
菱形变焦 = EffectMeta("菱形变焦", True, "7147943538120987166", "4841353", "fda851ab65ee2b7bd6bb568a0e8bc544", [
EffectParam("effects_adjust_size", 0.521, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.720, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认52%, 0% ~ 100%
effects_adjust_intensity: 默认72%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认33%, 0% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%"""
落叶_II = EffectMeta("落叶 II", True, "7153556255263429151", "5418631", "a7658052127fea9d33b12696e2d71ca4", [
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
蓝光爆闪 = EffectMeta("蓝光爆闪", True, "7288655540341707324", "25450329", "363de1da61a76d9d902e62a7bed611e6", [
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.650, 0.010, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_speed: 默认65%, 1% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_color: 默认80%, 0% ~ 100%"""
蓝色丝印 = EffectMeta("蓝色丝印", True, "7131985730791805448", "4097661", "0fceb871b844d51454db5d59da3636ef", [
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_size: 默认70%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%"""
虹光旋入 = EffectMeta("虹光旋入", True, "7377352335028130367", "69273433", "bf6fb74a7290e9a8d31dc36453736b66", [
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.660, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认66%, 0% ~ 100%"""
蛇形走位 = EffectMeta("蛇形走位", True, "7460729982474523163", "101569875", "878cb7c373d66f7e5125e8b86de851c4", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
蛇蛇涂鸦 = EffectMeta("蛇蛇涂鸦", True, "7460729365366575667", "101570158", "0021e6a04c4c7567201fbb592a934482", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
西海岸涂鸦 = EffectMeta("西海岸涂鸦", True, "7449588013115380251", "97254884", "cd245412884199a350400bffdb8a6ea8", [])
视频播放 = EffectMeta("视频播放", True, "7144915597308989988", "4668537", "7a18d00c453615e8415306a7f1f37396", [
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认80%, 0% ~ 100%"""
记忆存档 = EffectMeta("记忆存档", True, "7460732200074351142", "101569592", "9fb4f7c351cd80f0f9383eb9c5c6ce24", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
诡异故障 = EffectMeta("诡异故障", True, "7425528781156127258", "86397483", "eec29209c7ab182a5fa9335ee5b7d933", [
EffectParam("effects_adjust_speed", 0.091, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认9%, 0% ~ 100%"""
负片分屏 = EffectMeta("负片分屏", True, "7278974994623763003", "22907949", "5a980a6a4a707fc1ad13caff77e3926a", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认33%, 0% ~ 100%"""
负片描边 = EffectMeta("负片描边", True, "7434412782285492746", "89308031", "08ff70bd94ad0dc1ffac10995fca7b75", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
负片涂鸦 = EffectMeta("负片涂鸦", True, "7157966185571553822", "5477607", "c622911e77150d8ec0e9c4ecde458c02", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
负片涂鸦_II = EffectMeta("负片涂鸦 II", True, "7231111030028374584", "13379581", "02590242d94571bb62a8635b4fd5a3f7", [
EffectParam("effects_adjust_texture", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.320, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认60%, 0% ~ 100%
effects_adjust_size: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认75%, 0% ~ 100%
effects_adjust_noise: 默认32%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
负片涂鸦_III = EffectMeta("负片涂鸦 III", True, "7267517097775731261", "20745376", "96a028c1ac17f22a452c1e012d47f3ed", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认0%, 0% ~ 100%"""
负片游移 = EffectMeta("负片游移", True, "7091488033555354120", "1787254", "bc811feeac5b5e4608cbb80c99a07d46", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.000, -1.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.000, -1.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_vertical_shift: 默认0%, -100% ~ 100%
effects_adjust_horizontal_shift: 默认0%, -100% ~ 100%"""
负片频闪 = EffectMeta("负片频闪", True, "7153575555554611720", "5155369", "c737112d913d14f6cc8871dbc51c8013", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.850, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认45%, 0% ~ 100%
effects_adjust_filter: 默认85%, 0% ~ 100%"""
负片频闪_II = EffectMeta("负片频闪 II", True, "7417726471868781110", "83794424", "037aa3ce6e5b17d6623bf2d718104ac4", [
EffectParam("effects_adjust_speed", 0.091, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认9%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%"""
贴身粒子 = EffectMeta("贴身粒子", True, "7444407996911718949", "94976472", "4b9ac9961fe8d2e32413f562b7267d80", [
EffectParam("effects_adjust_number", 0.180, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.340, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.180, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.240, 0.000, 1.000)])
"""参数:
effects_adjust_number: 默认18%, 0% ~ 100%
effects_adjust_speed: 默认34%, 0% ~ 100%
effects_adjust_size: 默认18%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_distortion: 默认24%, 0% ~ 100%"""
超大光斑 = EffectMeta("超大光斑", True, "7171321435200164383", "6691829", "8f525928d0c73912e59702928d728ef2", [
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.100, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_number: 默认10%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认20%, 0% ~ 100%"""
超强锐化 = EffectMeta("超强锐化", True, "7129336892121682468", "3950243", "f5d68fac1d5f2d24144d143772c4d41b", [
EffectParam("effects_adjust_sharpen", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_sharpen: 默认80%, 0% ~ 100%
effects_adjust_intensity: 默认35%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
跟随运镜 = EffectMeta("跟随运镜", True, "7299426452896748042", "28956878", "4c501e2a054c24f4268b4daa44460f90", [
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认15%, 0% ~ 100%
effects_adjust_vertical_shift: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认15%, 0% ~ 100%"""
跟随运镜_II = EffectMeta("跟随运镜 II", True, "7340954638184616467", "48362872", "d34cbcf01362bf60945dafa56ec5704b", [
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.400, 0.100, 1.000),
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认40%, 10% ~ 100%
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认80%, 0% ~ 100%"""
跳色四宫格 = EffectMeta("跳色四宫格", True, "7447351620641247754", "96240759", "7472057d48afda752984c3d22d84cb03", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
车窗_II = EffectMeta("车窗 II", True, "7109280482025542157", "4795296", "524d63374811aa883cd29b6b1413d03c", [
EffectParam("effects_adjust_range", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("sticker", 0.350, 0.000, 1.000)])
"""参数:
effects_adjust_range: 默认55%, 0% ~ 100%
effects_adjust_intensity: 默认45%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
sticker: 默认35%, 0% ~ 100%"""
转运祝福 = EffectMeta("转运祝福", True, "7461840876596105766", "101959980", "519971ccd154c80416915efafe537d59", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%"""
轻微故障 = EffectMeta("轻微故障", True, "7425528929454133786", "86397588", "437d6da122ab141fd4988472a2150aa9", [
EffectParam("effects_adjust_speed", 0.091, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认9%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_sharpen: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
辉光开幕 = EffectMeta("辉光开幕", True, "7338322046822126114", "47051728", "a37854eb4a70d1f149c417ce3269a8f5", [
EffectParam("effects_adjust_texture", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.270, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_texture: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_luminance: 默认75%, 0% ~ 100%
effects_adjust_color: 默认27%, 0% ~ 100%
effects_adjust_blur: 默认40%, 0% ~ 100%"""
边缘扫光 = EffectMeta("边缘扫光", True, "7322363012092793353", "39434745", "8b7a9733b393b42cf018ce2efdebca2a", [
EffectParam("effects_adjust_soft", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_color", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_soft: 默认75%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_color: 默认100%, 0% ~ 100%
effects_adjust_blur: 默认60%, 0% ~ 100%
effects_adjust_range: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
迎接2025 = EffectMeta("迎接2025", True, "7448898555621675571", "97032430", "0c7b8af999acaf2183f5ea7d94c475ca", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
迷幻故障 = EffectMeta("迷幻故障", True, "7265960462330630714", "20440246", "5ddfb1bd3479179af2c0ec0026b57e3e", [
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%"""
迷幻荡漾 = EffectMeta("迷幻荡漾", True, "7223208176206746173", "12324741", "1ab6e40160a674cd19de3ade157a3d0b", [
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.550, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认55%, 0% ~ 100%
effects_adjust_speed: 默认70%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%"""
迷幻震动 = EffectMeta("迷幻震动", True, "7238863029775897148", "14438877", "e28a153a03d2dcf1a12384712196bc07", [
EffectParam("effects_adjust_distortion", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.750, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_distortion: 默认65%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认75%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_color: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认40%, 0% ~ 100%"""
重复变焦 = EffectMeta("重复变焦", True, "7161285099667853831", "5719311", "ae41555c055c73d2089f1d681f2bcc20", [
EffectParam("effects_adjust_size", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_texture: 默认65%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
重复震闪 = EffectMeta("重复震闪", True, "7250369682207674938", "16610415", "63a7958ffc3e6a73d3b9556f7ca04381", [
EffectParam("effects_adjust_luminance", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.250, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认80%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_blur: 默认70%, 0% ~ 100%
effects_adjust_range: 默认25%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
金元宝 = EffectMeta("金元宝", True, "7463321874349429258", "102547299", "3b173a55740a811374860b78f94c823c", [
EffectParam("effects_adjust_rotate", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_rotate: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_size: 默认90%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认30%, 0% ~ 100%"""
金币掉落 = EffectMeta("金币掉落", True, "7447018501778182666", "96107626", "59929527c3e70f362d91cb94e7f54eb4", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
金粉飘落 = EffectMeta("金粉飘落", True, "7456695082293400115", "100068434", "42caa24a03273a301ac8664df1f2b375", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.150, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.150, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_filter: 默认15%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_size: 默认15%, 0% ~ 100%"""
金色碎片 = EffectMeta("金色碎片", True, "7106040163402256927", "2622164", "a24eabdabec50f5d52f7e6fb099c899c", [
EffectParam("effects_adjust_speed", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认20%, 0% ~ 100%
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_noise: 默认30%, 0% ~ 100%"""
金色辉光 = EffectMeta("金色辉光", True, "7444470107004211763", "95041384", "cd968a21dec5e06bf4b85ea87c0312df", [
EffectParam("effects_adjust_filter", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%"""
金色雪花 = EffectMeta("金色雪花", True, "7444470107000017435", "95041381", "ce3f81491144281f1f4d2bdb20f1090a", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
金蛇贺岁 = EffectMeta("金蛇贺岁", True, "7460731076856517129", "101569782", "f578b37eaaea19ad739ab28fe3c62ffe", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
金边闪烁 = EffectMeta("金边闪烁", True, "7304832158466576947", "30855689", "46b93ae5afcb00ecface4fd485014d9c", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认50%, 0% ~ 100%
effects_adjust_vertical_shift: 默认50%, 0% ~ 100%"""
金银珠宝 = EffectMeta("金银珠宝", True, "7450336559141753395", "97573972", "e6e9308745fb6c5c9fa5d63f08eebb8a", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
金鱼漂浮 = EffectMeta("金鱼漂浮", True, "7451879925545439795", "98209671", "5d85a32986794f9d1f11f9aadf02240c", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
铅笔涂鸦 = EffectMeta("铅笔涂鸦", True, "7409883232667177499", "81202828", "c76bc693a18e8dd16ff56d359564fecf", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
银杏飘落 = EffectMeta("银杏飘落", True, "7296789290724364850", "28024643", "00a7373f5eb307f5a6e9b3032c1916e0", [
EffectParam("effects_adjust_luminance", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.000, 0.100, 1.000),
EffectParam("effects_adjust_size", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.100, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认40%, 0% ~ 100%
effects_adjust_range: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_speed: 默认0%, 10% ~ 100%
effects_adjust_size: 默认20%, 0% ~ 100%
effects_adjust_blur: 默认10%, 0% ~ 100%"""
银蛇缠绕 = EffectMeta("银蛇缠绕", True, "7461865163826663945", "101977565", "518cdd4993d2998a608580bb4a529939", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
闪光弹跳 = EffectMeta("闪光弹跳", True, "7210315941396091447", "10660327", "982ccb302cc81c13762eb31a25c54de5", [
EffectParam("effects_adjust_speed", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认20%, 0% ~ 100%"""
闪光灯_II = EffectMeta("闪光灯 II", True, "7143919857539486238", "4795220", "1b9f1a3ee39a65820ae21d72793c89a9", [
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_intensity: 默认65%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%"""
闪光灯IV = EffectMeta("闪光灯IV", True, "7276317197658493498", "22328905", "db710dc6b5ea5b2f46595480d06d0d7d", [
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认100%, 0% ~ 100%"""
闪电扭曲 = EffectMeta("闪电扭曲", True, "7329871968298078759", "42913127", "244819f79dffa729f9c9caeeb15a7698", [
EffectParam("effects_adjust_luminance", 0.666, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认67%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
闪白_II = EffectMeta("闪白 II", True, "7281219213828559397", "23489443", "631162213ead8ced21aa7936bae06390", [
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 2.000)])
"""参数:
effects_adjust_speed: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 200%"""
闪粉胶片 = EffectMeta("闪粉胶片", True, "7449596462658228762", "97260690", "bc79e33a6136c9f82ea8f42f3b60b942", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
随机闪切 = EffectMeta("随机闪切", True, "7267909305519575608", "20816436", "6a5fa04981e50a2c7bd67a4e03e4d3e6", [
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认20%, 0% ~ 100%"""
随机马赛克 = EffectMeta("随机马赛克", True, "7299769859900969510", "29099986", "190ec4ff873df478cd8842c1c9a9f967", [
EffectParam("effects_adjust_size", 0.280, 0.000, 1.000),
EffectParam("effects_adjust_number", 0.220, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认28%, 0% ~ 100%
effects_adjust_number: 默认22%, 0% ~ 100%
effects_adjust_filter: 默认30%, 0% ~ 100%
effects_adjust_color: 默认90%, 0% ~ 100%
effects_adjust_background_animation: 默认90%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%"""
隔行DV = EffectMeta("隔行DV", True, "7215598241558041125", "11331317", "3429986a54fc1d15cc29f7340103540d", [
EffectParam("effects_adjust_blur", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_sharpen", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.200, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认40%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_sharpen: 默认20%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认20%, 0% ~ 100%"""
雨季_I = EffectMeta("雨季 I", True, "7149065282768605732", "6731496", "fe78f4e40b597e3170f46831622f8e06", [
EffectParam("effects_adjust_blur", 0.160, 0.000, 0.800),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.336, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认16%, 0% ~ 80%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认34%, 0% ~ 100%"""
雨滴 = EffectMeta("雨滴", True, "7402879770079269403", "79016931", "9bf3286a900e44e5aac9887f4f4da71c", [
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%"""
雨滴2 = EffectMeta("雨滴2", True, "7411360993369920015", "81600389", "2ed20557bb6b691f66e05aafdbb13595", [
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_noise", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_texture: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认0%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_noise: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_range: 默认0%, 0% ~ 100%"""
雪花光斑 = EffectMeta("雪花光斑", True, "7296707597707514406", "27986887", "b6b5e079f2c4079d72185fb43cfc7521", [
EffectParam("effects_adjust_background_animation", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.100, 0.000, 1.000),
EffectParam("sticker", 0.600, 0.000, 1.000)])
"""参数:
effects_adjust_background_animation: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_filter: 默认30%, 0% ~ 100%
effects_adjust_color: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认10%, 0% ~ 100%
sticker: 默认60%, 0% ~ 100%"""
雪花变色 = EffectMeta("雪花变色", True, "7444470107000017417", "95041385", "8ede7d0c27d9423da48f3226a8384f95", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%"""
雪花散落 = EffectMeta("雪花散落", True, "7448898556401816115", "97032426", "2ad9203b34bf8f5fd8bd1672f62dcbc8", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
雪雾 = EffectMeta("雪雾", True, "7303380658934518323", "30305488", "bc0e8be4f1a2d7171824311ce9e57c44", [
EffectParam("sticker", 0.280, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.900, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 0.300, 0.000, 1.000)])
"""参数:
sticker: 默认28%, 0% ~ 100%
effects_adjust_filter: 默认90%, 0% ~ 100%
effects_adjust_texture: 默认90%, 0% ~ 100%
effects_adjust_background_animation: 默认30%, 0% ~ 100%"""
零帧起手 = EffectMeta("零帧起手", True, "7435897594070438426", "89895357", "d648bf579b3f003ca76c46068faadd70", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
雾镜_II = EffectMeta("雾镜 II", True, "7147920433604465159", "6731657", "627544f24ff53bde600ab918cb51a17d", [
EffectParam("effects_adjust_blur", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_background_animation", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_blur: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认80%, 0% ~ 100%
effects_adjust_background_animation: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认50%, 0% ~ 100%"""
震动光束 = EffectMeta("震动光束", True, "7246758527992074811", "15775885", "5c4feafe4eb534961c0df1cadb899e83", [
EffectParam("effects_adjust_intensity", 0.420, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.160, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.490, 0.000, 1.000),
EffectParam("effects_adjust_blur", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.750, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认42%, 0% ~ 100%
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_vertical_shift: 默认16%, 0% ~ 100%
effects_adjust_luminance: 默认49%, 0% ~ 100%
effects_adjust_blur: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_range: 默认75%, 0% ~ 100%"""
震动发光 = EffectMeta("震动发光", True, "7249264623226982968", "16303237", "ce596725c52c5cfa0e8205c1cbc00585", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_soft", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_soft: 默认60%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认80%, 0% ~ 100%
effects_adjust_luminance: 默认60%, 0% ~ 100%
effects_adjust_distortion: 默认50%, 0% ~ 100%"""
震动屏闪 = EffectMeta("震动屏闪", True, "7171697545154925069", "6733311", "c83c072fdbd9921701f12498c0c00cfc", [
EffectParam("effects_adjust_speed", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.700, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认30%, 0% ~ 100%
effects_adjust_intensity: 默认70%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_range: 默认70%, 0% ~ 100%"""
震动扫光 = EffectMeta("震动扫光", True, "7374053409546048052", "67503342", "3b86c556d5a92c8937b1120823bc34b2", [
EffectParam("effects_adjust_intensity", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_vertical_shift", 0.400, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认60%, 0% ~ 100%
effects_adjust_color: 默认20%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认40%, 0% ~ 100%
effects_adjust_vertical_shift: 默认40%, 0% ~ 100%"""
震动推镜 = EffectMeta("震动推镜", True, "7345004981029704233", "50238678", "47b846ada207d95dce6bc0501102db85", [
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.220, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认22%, 0% ~ 100%"""
震闪渐黑 = EffectMeta("震闪渐黑", True, "7304249285577544201", "30662744", "dfddc3aedd22941d50e768623fbd60ba", [
EffectParam("effects_adjust_intensity", 0.200, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.300, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.500, 0.100, 1.000),
EffectParam("effects_adjust_background_animation", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认20%, 0% ~ 100%
effects_adjust_luminance: 默认100%, 0% ~ 100%
effects_adjust_range: 默认30%, 0% ~ 100%
effects_adjust_speed: 默认50%, 10% ~ 100%
effects_adjust_background_animation: 默认50%, 0% ~ 100%"""
霓虹光线 = EffectMeta("霓虹光线", True, "7254125922222084663", "17710570", "c2274095125803b495db0623740fcb22", [
EffectParam("effects_adjust_luminance", 0.450, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_shift", 0.000, 0.000, 1.000)])
"""参数:
effects_adjust_luminance: 默认45%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认80%, 0% ~ 100%
effects_adjust_range: 默认80%, 0% ~ 100%
effects_adjust_horizontal_shift: 默认0%, 0% ~ 100%"""
霓虹闪切 = EffectMeta("霓虹闪切", True, "7345353688774349348", "50455778", "32ab9ae1b2f18168bb5d78bfdfda9176", [
EffectParam("effects_adjust_speed", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.825, 0.000, 1.000),
EffectParam("effects_adjust_horizontal_chromatic", 1.000, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认40%, 0% ~ 100%
effects_adjust_intensity: 默认100%, 0% ~ 100%
effects_adjust_luminance: 默认82%, 0% ~ 100%
effects_adjust_horizontal_chromatic: 默认100%, 0% ~ 100%"""
飞机窗 = EffectMeta("飞机窗", True, "7417827699902648868", "83837896", "0d51cdd7ce2a165449df548e86d6ce08", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.000, 0.000, 0.700),
EffectParam("effects_adjust_luminance", 0.350, 0.000, 0.700)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_size: 默认0%, 0% ~ 70%
effects_adjust_luminance: 默认35%, 0% ~ 70%"""
马赛克闪切 = EffectMeta("马赛克闪切", True, "7308712918902641203", "32503798", "6b0566a1868f7a088935c8835052db63", [
EffectParam("effects_adjust_size", 0.400, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.800, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.130, 0.000, 1.000)])
"""参数:
effects_adjust_size: 默认40%, 0% ~ 100%
effects_adjust_speed: 默认80%, 0% ~ 100%
effects_adjust_range: 默认13%, 0% ~ 100%"""
高速彩光 = EffectMeta("高速彩光", True, "7343527966145516042", "49475327", "e92f5749fec01ea61ad9d6747d808f82", [
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000),
EffectParam("effects_adjust_color", 0.650, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_luminance", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_blur", 0.500, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%
effects_adjust_color: 默认65%, 0% ~ 100%
effects_adjust_intensity: 默认50%, 0% ~ 100%
effects_adjust_luminance: 默认50%, 0% ~ 100%
effects_adjust_blur: 默认50%, 0% ~ 100%"""
鱼眼_II = EffectMeta("鱼眼 II", True, "7023664868083372580", "1418072", "3961e7c38420d89d64c5d267a3068254", [
EffectParam("effects_adjust_speed", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.500, 0.000, 1.000),
EffectParam("effects_adjust_size", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 0.800, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_range: 默认50%, 0% ~ 100%
effects_adjust_size: 默认100%, 0% ~ 100%
effects_adjust_distortion: 默认80%, 0% ~ 100%"""
鱼眼_III = EffectMeta("鱼眼 III", True, "7051881765975101983", "1521356", "b2620a812f8a4e48121a0e18cf36233e", [
EffectParam("effects_adjust_color", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.700, 0.000, 1.000),
EffectParam("effects_adjust_intensity", 0.000, 0.000, 1.000),
EffectParam("effects_adjust_distortion", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_range", 0.300, 0.000, 1.000)])
"""参数:
effects_adjust_color: 默认0%, 0% ~ 100%
effects_adjust_filter: 默认70%, 0% ~ 100%
effects_adjust_intensity: 默认0%, 0% ~ 100%
effects_adjust_distortion: 默认100%, 0% ~ 100%
effects_adjust_range: 默认30%, 0% ~ 100%"""
鱼眼_IV = EffectMeta("鱼眼 IV", True, "7091597643553444359", "1790048", "5977716750083a4ded0565086be43e07", [
EffectParam("effects_adjust_intensity", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_filter", 0.600, 0.000, 1.000),
EffectParam("effects_adjust_size", 0.350, 0.000, 1.000),
EffectParam("effects_adjust_texture", 0.550, 0.000, 1.000)])
"""参数:
effects_adjust_intensity: 默认60%, 0% ~ 100%
effects_adjust_filter: 默认60%, 0% ~ 100%
effects_adjust_size: 默认35%, 0% ~ 100%
effects_adjust_texture: 默认55%, 0% ~ 100%"""
鱼眼星星 = EffectMeta("鱼眼星星", True, "7432187089862529546", "88503775", "9653ef598f10bfa680a4101317029663", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
鱼眼涂鸦 = EffectMeta("鱼眼涂鸦", True, "7453001309596160522", "98675391", "c043e3b26fac7d72d5db13d66a9b9049", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
鱼眼闪电 = EffectMeta("鱼眼闪电", True, "7432187089858351667", "88503776", "46b23446c66aa5fc8f91bc468724eeed", [
EffectParam("effects_adjust_speed", 0.333, 0.000, 1.000)])
"""参数:
effects_adjust_speed: 默认33%, 0% ~ 100%"""
黑白胶片 = EffectMeta("黑白胶片", True, "7085992144627831326", "1691558", "708a2e34f1ecf5774e910d8da7099304", [
EffectParam("effects_adjust_filter", 1.000, 0.000, 1.000),
EffectParam("effects_adjust_speed", 0.330, 0.000, 1.000)])
"""参数:
effects_adjust_filter: 默认100%, 0% ~ 100%
effects_adjust_speed: 默认33%, 0% ~ 100%"""
================================================
FILE: src/pyJianYingDraft/script_file.py
================================================
import os
import json
import math
from copy import deepcopy
from typing import Optional, Literal, Union, overload
from typing import Type, Dict, List, Any
from . import util
from . import assets
from . import exceptions
from .template_mode import ImportedTrack, EditableTrack, ImportedMediaTrack, ImportedTextTrack, ShrinkMode, ExtendMode, import_track
from .time_util import Timerange, tim, srt_tstamp
from .local_materials import VideoMaterial, AudioMaterial
from .segment import BaseSegment, Speed, ClipSettings
from .audio_segment import AudioSegment, AudioFade, AudioEffect
from .video_segment import VideoSegment, StickerSegment, SegmentAnimations, VideoEffect, Transition, Filter, BackgroundFilling, MixMode
from .effect_segment import EffectSegment, FilterSegment
from .text_segment import TextSegment, TextStyle, TextBubble
from .track import TrackType, BaseTrack, Track
from .metadata import VideoSceneEffectType, VideoCharacterEffectType, FilterType
class ScriptMaterial:
"""草稿文件中的素材信息部分"""
audios: List[AudioMaterial]
"""音频素材列表"""
videos: List[VideoMaterial]
"""视频素材列表"""
stickers: List[Dict[str, Any]]
"""贴纸素材列表"""
texts: List[Dict[str, Any]]
"""文本素材列表"""
audio_effects: List[AudioEffect]
"""音频特效列表"""
audio_fades: List[AudioFade]
"""音频淡入淡出效果列表"""
animations: List[SegmentAnimations]
"""动画素材列表"""
video_effects: List[VideoEffect]
"""视频特效列表"""
speeds: List[Speed]
"""变速列表"""
masks: List[Dict[str, Any]]
"""蒙版列表"""
transitions: List[Transition]
"""转场效果列表"""
filters: List[Union[Filter, TextBubble]]
"""滤镜/文本花字/文本气泡列表, 导出到`effects`中"""
mix_modes: List[MixMode]
"""混合模式列表, 导出到`effects`中"""
canvases: List[BackgroundFilling]
"""背景填充列表"""
def __init__(self):
self.audios = []
self.videos = []
self.stickers = []
self.texts = []
self.audio_effects = []
self.audio_fades = []
self.animations = []
self.video_effects = []
self.speeds = []
self.masks = []
self.transitions = []
self.filters = []
self.mix_modes = []
self.canvases = []
@overload
def __contains__(self, item: Union[VideoMaterial, AudioMaterial]) -> bool: ...
@overload
def __contains__(self, item: Union[AudioFade, AudioEffect]) -> bool: ...
@overload
def __contains__(self, item: Union[SegmentAnimations, VideoEffect, Transition, Filter]) -> bool: ...
def __contains__(self, item) -> bool:
if isinstance(item, VideoMaterial):
return item.material_id in [video.material_id for video in self.videos]
elif isinstance(item, AudioMaterial):
return item.material_id in [audio.material_id for audio in self.audios]
elif isinstance(item, AudioFade):
return item.fade_id in [fade.fade_id for fade in self.audio_fades]
elif isinstance(item, AudioEffect):
return item.effect_id in [effect.effect_id for effect in self.audio_effects]
elif isinstance(item, SegmentAnimations):
return item.animation_id in [ani.animation_id for ani in self.animations]
elif isinstance(item, VideoEffect):
return item.global_id in [effect.global_id for effect in self.video_effects]
elif isinstance(item, Transition):
return item.global_id in [transition.global_id for transition in self.transitions]
elif isinstance(item, Filter):
return item.global_id in [filter_.global_id for filter_ in self.filters]
elif isinstance(item, MixMode):
return item.global_id in [mix_mode.global_id for mix_mode in self.mix_modes]
else:
raise TypeError("Invalid argument type '%s'" % type(item))
def export_json(self) -> Dict[str, List[Any]]:
return {
"ai_translates": [],
"audio_balances": [],
"audio_effects": [effect.export_json() for effect in self.audio_effects],
"audio_fades": [fade.export_json() for fade in self.audio_fades],
"audio_track_indexes": [],
"audios": [audio.export_json() for audio in self.audios],
"beats": [],
"canvases": [canvas.export_json() for canvas in self.canvases],
"chromas": [],
"color_curves": [],
"digital_humans": [],
"drafts": [],
"effects": [_filter.export_json() for _filter in self.filters] + [mix_mode.export_json() for mix_mode in self.mix_modes],
"flowers": [],
"green_screens": [],
"handwrites": [],
"hsl": [],
"images": [],
"log_color_wheels": [],
"loudnesses": [],
"manual_deformations": [],
"masks": self.masks,
"material_animations": [ani.export_json() for ani in self.animations],
"material_colors": [],
"multi_language_refs": [],
"placeholders": [],
"plugin_effects": [],
"primary_color_wheels": [],
"realtime_denoises": [],
"shapes": [],
"smart_crops": [],
"smart_relights": [],
"sound_channel_mappings": [],
"speeds": [spd.export_json() for spd in self.speeds],
"stickers": self.stickers,
"tail_leaders": [],
"text_templates": [],
"texts": self.texts,
"time_marks": [],
"transitions": [transition.export_json() for transition in self.transitions],
"video_effects": [effect.export_json() for effect in self.video_effects],
"video_trackings": [],
"videos": [video.export_json() for video in self.videos],
"vocal_beautifys": [],
"vocal_separations": []
}
class ScriptFile:
"""剪映草稿文件, 大部分接口定义在此"""
save_path: Optional[str]
"""草稿文件保存路径, 仅在模板模式下有效"""
content: Dict[str, Any]
"""草稿文件内容"""
width: int
"""视频的宽度, 单位为像素"""
height: int
"""视频的高度, 单位为像素"""
fps: int
"""视频的帧率"""
duration: int
"""视频的总时长, 单位为微秒"""
maintrack_adsorb: bool
"""是否启用主轨道吸附(主轨磁吸)"""
materials: ScriptMaterial
"""草稿文件中的素材信息部分"""
tracks: Dict[str, Track]
"""轨道信息"""
imported_materials: Dict[str, List[Dict[str, Any]]]
"""导入的素材信息"""
imported_tracks: List[ImportedTrack]
"""导入的轨道信息"""
dual_file_compatibility: bool
"""双文件兼容模式,启用时同时保存到 draft_content.json 和 draft_info.json"""
def __init__(self, width: int, height: int, fps: int, maintrack_adsorb: bool):
"""**创建剪映草稿推荐使用`DraftFolder.create_draft()`而非此方法**
Args:
width (int): 视频宽度, 单位为像素
height (int): 视频高度, 单位为像素
fps (int): 视频帧率
maintrack_adsorb (bool): 是否启用主轨道吸附(主轨磁吸)
"""
self.save_path = None
self.width = width
self.height = height
self.fps = fps
self.duration = 0
self.maintrack_adsorb = maintrack_adsorb
self.materials = ScriptMaterial()
self.tracks = {}
self.imported_materials = {}
self.imported_tracks = []
self.dual_file_compatibility = True # 启用双文件兼容模式
with open(assets.get_asset_path('DRAFT_CONTENT_TEMPLATE'), "r", encoding="utf-8") as f:
self.content = json.load(f)
@staticmethod
def load_template(json_path: str) -> "ScriptFile":
"""从JSON文件加载草稿模板
Args:
json_path (str): JSON文件路径
Raises:
`FileNotFoundError`: JSON文件不存在
"""
obj = ScriptFile(**util.provide_ctor_defaults(ScriptFile))
obj.save_path = json_path
if not os.path.exists(json_path):
raise FileNotFoundError("JSON文件 '%s' 不存在" % json_path)
with open(json_path, "r", encoding="utf-8") as f:
obj.content = json.load(f)
util.assign_attr_with_json(obj, ["fps", "duration"], obj.content)
util.assign_attr_with_json(obj, ["maintrack_adsorb"], obj.content["config"])
util.assign_attr_with_json(obj, ["width", "height"], obj.content["canvas_config"])
obj.imported_materials = deepcopy(obj.content["materials"])
obj.imported_tracks = [import_track(track_data) for track_data in obj.content["tracks"]]
return obj
def add_material(self, material: Union[VideoMaterial, AudioMaterial]) -> "ScriptFile":
"""向草稿文件中添加一个素材"""
if material in self.materials: # 素材已存在
return self
if isinstance(material, VideoMaterial):
self.materials.videos.append(material)
elif isinstance(material, AudioMaterial):
self.materials.audios.append(material)
else:
raise TypeError("错误的素材类型: '%s'" % type(material))
return self
def next_track_render_index(self) -> int:
"""为即将追加的新轨道分配 ``render_index``,保证叠在现有所有轨道之上(数值越大越接近前景)。"""
if not self.tracks:
return 0
return max(track.render_index for track in self.tracks.values()) + 1
def add_track_ordered(self, track_type: TrackType, track_name: Optional[str] = None, *,
mute: bool = False) -> "ScriptFile":
"""追加新轨道,``render_index`` 取 ``next_track_render_index()``,多接口按调用先后自下而上叠层。"""
return self.add_track(track_type, track_name, mute=mute, absolute_index=self.next_track_render_index())
def add_track(self, track_type: TrackType, track_name: Optional[str] = None, *,
mute: bool = False,
relative_index: int = 0, absolute_index: Optional[int] = None) -> "ScriptFile":
"""向草稿文件中添加一个指定类型、指定名称的轨道, 可以自定义轨道层级
注意: 主视频轨道(最底层的视频轨道)上的视频片段必须从0s开始, 否则会被剪映强制对齐至0s.
为避免混淆, 仅在创建第一个同类型轨道时允许不指定名称
Args:
track_type (TrackType): 轨道类型
track_name (str, optional): 轨道名称. 仅在创建第一个同类型轨道时允许不指定.
mute (bool, optional): 轨道是否静音. 默认不静音.
relative_index (int, optional): 相对(同类型轨道的)图层位置, 越高越接近前景. 默认为0.
absolute_index (int, optional): 绝对图层位置, 越高越接近前景. 此参数将直接覆盖相应片段的`render_index`属性, 供有经验的用户使用.
此参数不能与`relative_index`同时使用.
Raises:
`NameError`: 已存在同类型轨道且未指定名称, 或已存在同名轨道
"""
if track_name is None:
if track_type in [track.track_type for track in self.tracks.values()]:
raise NameError("'%s' 类型的轨道已存在, 请为新轨道指定名称以避免混淆" % track_type)
track_name = track_type.name
if track_name in [track.name for track in self.tracks.values()]:
raise NameError("名为 '%s' 的轨道已存在" % track_name)
render_index = track_type.value.render_index + relative_index
if absolute_index is not None:
render_index = absolute_index
self.tracks[track_name] = Track(track_type, track_name, render_index, mute)
return self
def _get_track(self, segment_type: Type[BaseSegment], track_name: Optional[str]) -> Track:
# 指定轨道名称
if track_name is not None:
if track_name not in self.tracks:
raise NameError("不存在名为 '%s' 的轨道" % track_name)
return self.tracks[track_name]
# 寻找唯一的同类型的轨道
count = sum([1 for track in self.tracks.values() if track.accept_segment_type == segment_type])
if count == 0: raise NameError("不存在接受 '%s' 的轨道" % segment_type)
if count > 1: raise NameError("存在多个接受 '%s' 的轨道, 请指定轨道名称" % segment_type)
return next(track for track in self.tracks.values() if track.accept_segment_type == segment_type)
def add_segment(self, segment: Union[VideoSegment, StickerSegment, AudioSegment, TextSegment, EffectSegment, FilterSegment],
track_name: Optional[str] = None) -> "ScriptFile":
"""向指定轨道中添加一个片段
Args:
segment (`VideoSegment`, `StickerSegment`, `AudioSegment`, `TextSegment`, or `EffectSegment`): 要添加的片段
track_name (`str`, optional): 添加到的轨道名称. 当此类型的轨道仅有一条时可省略.
Raises:
`NameError`: 未找到指定名称的轨道, 或必须提供`track_name`参数时未提供
`TypeError`: 片段类型不匹配轨道类型
`SegmentOverlap`: 新片段与已有片段重叠
"""
target = self._get_track(type(segment), track_name)
# 加入轨道并更新时长
target.add_segment(segment)
self.duration = max(self.duration, segment.end)
# 自动添加相关素材
if isinstance(segment, VideoSegment):
# 出入场等动画
if (segment.animations_instance is not None) and (segment.animations_instance not in self.materials):
self.materials.animations.append(segment.animations_instance)
# 特效
for effect in segment.effects:
if effect not in self.materials:
self.materials.video_effects.append(effect)
# 滤镜
for filter_ in segment.filters:
if filter_ not in self.materials:
self.materials.filters.append(filter_)
# 混合模式
for mix_mode in segment.mix_modes:
if mix_mode not in self.materials:
self.materials.mix_modes.append(mix_mode)
# 蒙版
if segment.mask is not None:
self.materials.masks.append(segment.mask.export_json())
# 转场
if (segment.transition is not None) and (segment.transition not in self.materials):
self.materials.transitions.append(segment.transition)
# 背景填充
if segment.background_filling is not None:
self.materials.canvases.append(segment.background_filling)
# 音频淡入淡出
if (segment.fade is not None) and (segment.fade not in self.materials):
self.materials.audio_fades.append(segment.fade)
self.materials.speeds.append(segment.speed)
elif isinstance(segment, StickerSegment):
self.materials.stickers.append(segment.export_material())
elif isinstance(segment, AudioSegment):
# 淡入淡出
if (segment.fade is not None) and (segment.fade not in self.materials):
self.materials.audio_fades.append(segment.fade)
# 特效
for effect in segment.effects:
if effect not in self.materials:
self.materials.audio_effects.append(effect)
self.materials.speeds.append(segment.speed)
elif isinstance(segment, TextSegment):
# 出入场等动画
if (segment.animations_instance is not None) and (segment.animations_instance not in self.materials):
self.materials.animations.append(segment.animations_instance)
# 气泡效果
if segment.bubble is not None:
self.materials.filters.append(segment.bubble)
# 花字效果
if segment.effect is not None:
self.materials.filters.append(segment.effect)
# 字体样式
self.materials.texts.append(segment.export_material())
elif isinstance(segment, EffectSegment):
# 特效素材
if segment.effect_inst not in self.materials:
self.materials.video_effects.append(segment.effect_inst)
elif isinstance(segment, FilterSegment):
# 滤镜素材
if segment.material not in self.materials:
self.materials.filters.append(segment.material)
# 添加片段素材
if isinstance(segment, (VideoSegment, AudioSegment)):
self.add_material(segment.material_instance)
return self
def add_effect(self, effect: Union[VideoSceneEffectType, VideoCharacterEffectType],
t_range: Timerange, track_name: Optional[str] = None, *,
params: Optional[List[Optional[float]]] = None) -> "ScriptFile":
"""向指定的特效轨道中添加一个特效片段
Args:
effect (`VideoSceneEffectType` or `VideoCharacterEffectType`): 特效类型
t_range (`Timerange`): 特效片段的时间范围
track_name (`str`, optional): 添加到的轨道名称. 当特效轨道仅有一条时可省略.
params (`List[Optional[float]]`, optional): 特效参数列表, 参数列表中未提供或为None的项使用默认值.
参数取值范围(0~100)与剪映中一致. 某个特效类型有何参数以及具体参数顺序以枚举类成员的annotation为准.
Raises:
`NameError`: 未找到指定名称的轨道, 或必须提供`track_name`参数时未提供
`TypeError`: 指定的轨道不是特效轨道
`ValueError`: 新片段与已有片段重叠、提供的参数数量超过了该特效类型的参数数量, 或参数值超出范围.
"""
target = self._get_track(EffectSegment, track_name)
# 加入轨道并更新时长
segment = EffectSegment(effect, t_range, params)
target.add_segment(segment)
self.duration = max(self.duration, t_range.start + t_range.duration)
# 自动添加相关素材
if segment.effect_inst not in self.materials:
self.materials.video_effects.append(segment.effect_inst)
return self
def add_filter(self, filter_meta: FilterType, t_range: Timerange,
track_name: Optional[str] = None, intensity: float = 100.0) -> "ScriptFile":
"""向指定的滤镜轨道中添加一个滤镜片段
Args:
filter_meta (`FilterType`): 滤镜类型
t_range (`Timerange`): 滤镜片段的时间范围
track_name (`str`, optional): 添加到的轨道名称. 当滤镜轨道仅有一条时可省略.
intensity (`float`, optional): 滤镜强度(0-100). 仅当所选滤镜能够调节强度时有效. 默认为100.
Raises:
`NameError`: 未找到指定名称的轨道, 或必须提供`track_name`参数时未提供
`TypeError`: 指定的轨道不是滤镜轨道
`ValueError`: 新片段与已有片段重叠
"""
target = self._get_track(FilterSegment, track_name)
# 加入轨道并更新时长
segment = FilterSegment(filter_meta, t_range, intensity / 100.0) # 转换为0-1范围
target.add_segment(segment)
self.duration = max(self.duration, t_range.end)
# 自动添加相关素材
self.materials.filters.append(segment.material)
return self
def import_srt(self, srt_path: str, track_name: str, *,
time_offset: Union[str, float] = 0.0,
style_reference: Optional[TextSegment] = None,
text_style: TextStyle = TextStyle(size=5, align=1, auto_wrapping=True),
clip_settings: Optional[ClipSettings] = ClipSettings(transform_y=-0.8)) -> "ScriptFile":
"""从SRT文件中导入字幕, 支持传入一个`TextSegment`作为样式参考
注意: 默认不会使用参考片段的`clip_settings`属性, 若需要请显式为此函数传入`clip_settings=None`
Args:
srt_path (`str`): SRT文件路径
track_name (`str`): 导入到的文本轨道名称, 若不存在则自动创建
style_reference (`TextSegment`, optional): 作为样式参考的文本片段, 若提供则使用其样式.
time_offset (`Union[str, float]`, optional): 字幕整体时间偏移, 单位为微秒, 默认为0.
text_style (`TextStyle`, optional): 字幕样式, 默认模仿剪映导入字幕时的样式, 会被`style_reference`覆盖.
clip_settings (`ClipSettings`, optional): 图像调节设置, 默认模仿剪映导入字幕时的设置, 会覆盖`style_reference`的设置除非指定为`None`.
Raises:
`NameError`: 已存在同名轨道
`TypeError`: 轨道类型不匹配
"""
if style_reference is None and clip_settings is None:
raise ValueError("未提供样式参考时请提供`clip_settings`参数")
time_offset = tim(time_offset)
if track_name not in self.tracks:
self.add_track(TrackType.text, track_name, relative_index=999) # 在所有文本轨道的最上层
with open(srt_path, "r", encoding="utf-8-sig") as srt_file:
lines = srt_file.readlines()
def __add_text_segment(text: str, t_range: Timerange) -> None:
if style_reference:
seg = TextSegment.create_from_template(text, t_range, style_reference)
if clip_settings is not None:
seg.clip_settings = deepcopy(clip_settings)
else:
seg = TextSegment(text, t_range, style=text_style, clip_settings=clip_settings)
self.add_segment(seg, track_name)
index = 0
text: str = ""
text_trange: Timerange
read_state: Literal["index", "timestamp", "content"] = "index"
while index < len(lines):
line = lines[index].strip()
if read_state == "index":
if len(line) == 0:
index += 1
continue
if not line.isdigit():
raise ValueError("Expected a number at line %d, got '%s'" % (index+1, line))
index += 1
read_state = "timestamp"
elif read_state == "timestamp":
# 读取时间戳
start_str, end_str = line.split(" --> ")
start, end = srt_tstamp(start_str), srt_tstamp(end_str)
text_trange = Timerange(start + time_offset, end - start)
index += 1
read_state = "content"
elif read_state == "content":
# 内容结束, 生成片段
if len(line) == 0:
__add_text_segment(text.strip(), text_trange)
text = ""
read_state = "index"
else:
text += line + "\n"
index += 1
# 添加最后一个片段
if len(text) > 0:
__add_text_segment(text.strip(), text_trange)
return self
def get_imported_track(self, track_type: Literal[TrackType.video, TrackType.audio, TrackType.text],
name: Optional[str] = None, index: Optional[int] = None) -> EditableTrack:
"""获取指定类型的导入轨道, 以便在其上进行替换
推荐使用轨道名称进行筛选(若已知轨道名称)
Args:
track_type (`TrackType.video`, `TrackType.audio` or `TrackType.text`): 轨道类型, 目前只支持音视频和文本轨道
name (`str`, optional): 轨道名称, 不指定则不根据名称筛选.
index (`int`, optional): 轨道在**同类型的导入轨道**中的下标, 以0为最下层轨道. 不指定则不根据下标筛选.
Raises:
`TrackNotFound`: 未找到满足条件的轨道
`AmbiguousTrack`: 找到多个满足条件的轨道
"""
tracks_of_same_type: List[EditableTrack] = []
for track in self.imported_tracks:
if track.track_type == track_type:
assert isinstance(track, EditableTrack)
tracks_of_same_type.append(track)
ret: List[EditableTrack] = []
for ind, track in enumerate(tracks_of_same_type):
if (name is not None) and (track.name != name): continue
if (index is not None) and (ind != index): continue
ret.append(track)
if len(ret) == 0:
raise exceptions.TrackNotFound(
"没有找到满足条件的轨道: track_type=%s, name=%s, index=%s" % (track_type, name, index))
if len(ret) > 1:
raise exceptions.AmbiguousTrack(
"找到多个满足条件的轨道: track_type=%s, name=%s, index=%s" % (track_type, name, index))
return ret[0]
def import_track(self, source_file: "ScriptFile", track: EditableTrack, *,
offset: Union[str, int] = 0,
new_name: Optional[str] = None, relative_index: Optional[int] = None) -> "ScriptFile":
"""将一个`EditableTrack`导入到当前`ScriptFile`中, 如从模板草稿中导入特定的文本或视频轨道到当前正在编辑的草稿文件中
注意: 本方法会保留各片段及其素材的id, 因而不支持向同一草稿多次导入同一轨道
Args:
source_file (`ScriptFile`): 源文件,包含要导入的轨道
track (`EditableTrack`): 要导入的轨道, 可通过`get_imported_track`方法获取.
offset (`str | int`, optional): 轨道的时间偏移量(微秒), 可以是整数微秒值或时间字符串(如"1s"). 默认不添加偏移.
new_name (`str`, optional): 新轨道名称, 默认使用源轨道名称.
relative_index (`int`, optional): 相对索引,用于调整导入轨道的渲染层级. 默认保持原有层级.
"""
# 直接拷贝原始轨道结构, 按需修改渲染层级
imported_track = deepcopy(track)
if relative_index is not None:
imported_track.render_index = track.track_type.value.render_index + relative_index
if new_name is not None:
imported_track.name = new_name
# 应用偏移量
offset_us = tim(offset)
if offset_us != 0:
for seg in imported_track.segments:
seg.target_timerange.start = max(0, seg.target_timerange.start + offset_us)
self.imported_tracks.append(imported_track)
# 收集所有需要复制的素材ID
material_ids = set()
segments: List[Dict[str, Any]] = track.raw_data.get("segments", [])
for segment in segments:
# 主素材ID
material_id = segment.get("material_id")
if material_id:
material_ids.add(material_id)
# extra_material_refs中的素材ID
extra_refs: List[str] = segment.get("extra_material_refs", [])
material_ids.update(extra_refs)
# 复制素材
for material_type, material_list in source_file.imported_materials.items():
for material in material_list:
if material.get("id") in material_ids:
if material_type not in self.imported_materials:
self.imported_materials[material_type] = []
self.imported_materials[material_type].append(deepcopy(material))
material_ids.remove(material.get("id"))
assert len(material_ids) == 0, "未找到以下素材: %s" % material_ids
# 更新总时长
self.duration = max(self.duration, track.end_time)
return self
def replace_material_by_name(self, material_name: str, material: Union[VideoMaterial, AudioMaterial],
replace_crop: bool = False) -> "ScriptFile":
"""替换指定名称的素材, 并影响所有引用它的片段
这种方法不会改变相应片段的时长和引用范围(`source_timerange`), 尤其适合于图片素材
Args:
material_name (`str`): 要替换的素材名称
material (`VideoMaterial` or `AudioMaterial`): 新素材, 目前只支持视频和音频
replace_crop (`bool`, optional): 是否替换原素材的裁剪设置, 默认为否. 仅对视频素材有效.
Raises:
`MaterialNotFound`: 根据指定名称未找到与新素材同类的素材
`AmbiguousMaterial`: 根据指定名称找到多个与新素材同类的素材
"""
video_mode = isinstance(material, VideoMaterial)
# 查找素材
target_json_obj: Optional[Dict[str, Any]] = None
target_material_list = self.imported_materials["videos" if video_mode else "audios"]
name_key = "material_name" if video_mode else "name"
for mat in target_material_list:
if mat[name_key] == material_name:
if target_json_obj is not None:
raise exceptions.AmbiguousMaterial(
"找到多个名为 '%s', 类型为 '%s' 的素材" % (material_name, type(material)))
target_json_obj = mat
if target_json_obj is None:
raise exceptions.MaterialNotFound("没有找到名为 '%s', 类型为 '%s' 的素材" % (material_name, type(material)))
# 更新素材信息
target_json_obj.update({name_key: material.material_name, "path": material.path, "duration": material.duration})
if video_mode:
target_json_obj.update({"width": material.width, "height": material.height, "material_type": material.material_type})
if replace_crop:
target_json_obj.update({"crop": material.crop_settings.export_json()})
return self
def replace_material_by_seg(self, track: EditableTrack, segment_index: int, material: Union[VideoMaterial, AudioMaterial],
source_timerange: Optional[Timerange] = None, *,
handle_shrink: ShrinkMode = ShrinkMode.cut_tail,
handle_extend: Union[ExtendMode, List[ExtendMode]] = ExtendMode.cut_material_tail) -> "ScriptFile":
"""替换指定音视频轨道上指定片段的素材, 暂不支持变速片段的素材替换
Args:
track (`EditableTrack`): 要替换素材的轨道, 由`get_imported_track`获取
segment_index (`int`): 要替换素材的片段下标, 从0开始
material (`VideoMaterial` or `AudioMaterial`): 新素材, 必须与原素材类型一致
source_timerange (`Timerange`, optional): 从原素材中截取的时间范围, 默认为全时段, 若是图片素材则默认与原片段等长.
handle_shrink (`Shrink_mode`, optional): 新素材比原素材短时的处理方式, 默认为裁剪尾部, 使片段长度与素材一致.
handle_extend (`Extend_mode` or `List[Extend_mode]`, optional): 新素材比原素材长时的处理方式, 将按顺序逐个尝试直至成功或抛出异常.
默认为截断素材尾部, 使片段维持原长不变
Raises:
`IndexError`: `segment_index`越界
`TypeError`: 轨道或素材类型不正确
`ExtensionFailed`: 新素材比原素材长时处理失败
"""
if not isinstance(track, ImportedMediaTrack):
raise TypeError("指定的轨道(类型为 %s)不支持素材替换" % track.track_type)
if not 0 <= segment_index < len(track):
raise IndexError("片段下标 %d 超出 [0, %d) 的范围" % (segment_index, len(track)))
if not track.check_material_type(material):
raise TypeError("指定的素材类型 %s 不匹配轨道类型 %s", (type(material), track.track_type))
seg = track.segments[segment_index]
if isinstance(handle_extend, ExtendMode):
handle_extend = [handle_extend]
if source_timerange is None:
if isinstance(material, VideoMaterial) and (material.material_type == "photo"):
source_timerange = Timerange(0, seg.duration)
else:
source_timerange = Timerange(0, material.duration)
# 处理时间变化
track.process_timerange(segment_index, source_timerange, handle_shrink, handle_extend)
# 最后替换素材链接
track.segments[segment_index].material_id = material.material_id
self.add_material(material)
# TODO: 更新总长
return self
def replace_text(self, track: EditableTrack, segment_index: int, text: Union[str, List[str]],
recalc_style: bool = True) -> "ScriptFile":
"""替换指定文本轨道上指定片段的文字内容, 支持普通文本片段或文本模板片段
Args:
track (`EditableTrack`): 要替换文字的文本轨道, 由`get_imported_track`获取
segment_index (`int`): 要替换文字的片段下标, 从0开始
text (`str` or `List[str]`): 新的文字内容, 对于文本模板而言应传入一个字符串列表.
recalc_style (`bool`): 是否重新计算字体样式分布, 即调整各字体样式应用范围以尽量维持原有占比不变, 默认开启.
Raises:
`IndexError`: `segment_index`越界
`TypeError`: 轨道类型不正确
`ValueError`: 文本模板片段的文本数量不匹配
"""
if not isinstance(track, ImportedTextTrack):
raise TypeError("指定的轨道(类型为 %s)不支持文本内容替换" % track.track_type)
if not 0 <= segment_index < len(track):
raise IndexError("片段下标 %d 超出 [0, %d) 的范围" % (segment_index, len(track)))
def __recalc_style_range(old_len: int, new_len: int, styles: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""调整字体样式分布"""
new_styles: List[Dict[str, Any]] = []
for style in styles:
start = math.ceil(style["range"][0] / old_len * new_len)
end = math.ceil(style["range"][1] / old_len * new_len)
style["range"] = [start, end]
if start != end:
new_styles.append(style)
return new_styles
replaced: bool = False
material_id: str = track.segments[segment_index].material_id
# 尝试在文本素材中替换
for mat in self.imported_materials["texts"]:
if mat["id"] != material_id:
continue
if isinstance(text, list):
if len(text) != 1:
raise ValueError(f"正常文本片段只能有一个文字内容, 但替换内容是 {text}")
text = text[0]
content = json.loads(mat["content"])
if recalc_style:
content["styles"] = __recalc_style_range(len(content["text"]), len(text), content["styles"])
content["text"] = text
mat["content"] = json.dumps(content, ensure_ascii=False)
replaced = True
break
if replaced:
return self
# 尝试在文本模板中替换
for template in self.imported_materials["text_templates"]:
if template["id"] != material_id:
continue
resources = template["text_info_resources"]
if isinstance(text, str):
text = [text]
if len(text) > len(resources):
raise ValueError(f"文字模板'{template['name']}'只有{len(resources)}段文本, 但提供了{len(text)}段替换内容")
for sub_material_id, new_text in zip(map(lambda x: x["text_material_id"], resources), text):
for mat in self.imported_materials["texts"]:
if mat["id"] != sub_material_id:
continue
try:
content = json.loads(mat["content"])
if recalc_style:
content["styles"] = __recalc_style_range(len(content["text"]), len(new_text), content["styles"])
content["text"] = new_text
mat["content"] = json.dumps(content, ensure_ascii=False)
except json.JSONDecodeError:
mat["content"] = new_text
except TypeError:
mat["content"] = new_text
break
replaced = True
break
assert replaced, f"未找到指定片段的素材 {material_id}"
return self
def inspect_material(self) -> None:
"""输出草稿中导入的贴纸、文本气泡以及花字素材的元数据"""
print("贴纸素材:")
for sticker in self.imported_materials["stickers"]:
print("\tResource id: %s '%s'" % (sticker["resource_id"], sticker.get("name", "")))
print("文字气泡效果:")
for effect in self.imported_materials["effects"]:
if effect["type"] == "text_shape":
print("\tEffect id: %s ,Resource id: %s '%s'" %
(effect["effect_id"], effect["resource_id"], effect.get("name", "")))
print("花字效果:")
for effect in self.imported_materials["effects"]:
if effect["type"] == "text_effect":
print("\tResource id: %s '%s'" % (effect["resource_id"], effect.get("name", "")))
def dumps(self) -> str:
"""将草稿文件内容导出为JSON字符串"""
self.content["fps"] = self.fps
self.content["duration"] = self.duration
self.content["config"]["maintrack_adsorb"] = self.maintrack_adsorb
self.content["canvas_config"] = {"width": self.width, "height": self.height, "ratio": "original"}
self.content["materials"] = self.materials.export_json()
# 合并导入的素材
for material_type, material_list in self.imported_materials.items():
if material_type not in self.content["materials"]:
self.content["materials"][material_type] = material_list
else:
self.content["materials"][material_type].extend(material_list)
# 对轨道排序并导出
track_list: List[BaseTrack] = list(self.imported_tracks + list(self.tracks.values())) # 新加入的轨道在列表末尾(上层)
track_list.sort(key=lambda track: track.render_index)
self.content["tracks"] = [track.export_json() for track in track_list]
return json.dumps(self.content, ensure_ascii=False, indent=4)
def dump(self, file_path: str) -> None:
"""将草稿文件内容写入文件"""
with open(file_path, "w", encoding="utf-8") as f:
f.write(self.dumps())
def save(self) -> None:
"""保存草稿文件至打开时的路径
Raises:
`ValueError`: 没有设置保存路径
"""
if self.save_path is None:
raise ValueError("没有设置保存路径, 可能不在模板模式下")
# 保存到主要文件
self.dump(self.save_path)
# 如果启用了双文件兼容模式,同时保存到另一个文件
if self.dual_file_compatibility:
draft_dir = os.path.dirname(self.save_path)
if "draft_content.json" in self.save_path and "draft_info.json" not in self.save_path:
# 当前保存的是 draft_content.json,同时保存到 draft_info.json
alt_path = os.path.join(draft_dir, "draft_info.json")
self.dump(alt_path)
elif "draft_info.json" in self.save_path and "draft_content.json" not in self.save_path:
# 当前保存的是 draft_info.json,同时保存到 draft_content.json
alt_path = os.path.join(draft_dir, "draft_content.json")
self.dump(alt_path)
================================================
FILE: src/pyJianYingDraft/segment.py
================================================
"""定义片段基类及部分比较通用的属性类"""
import uuid
from typing import Optional, Dict, List, Any, Union
from .animation import SegmentAnimations
from .time_util import Timerange, tim
from .keyframe import KeyframeList, KeyframeProperty
class BaseSegment:
"""片段基类"""
segment_id: str
"""片段全局id, 由程序自动生成"""
material_id: str
"""使用的素材id"""
target_timerange: Timerange
"""片段在轨道上的时间范围"""
common_keyframes: List[KeyframeList]
"""各属性的关键帧列表"""
def __init__(self, material_id: str, target_timerange: Timerange):
self.segment_id = uuid.uuid4().hex
self.material_id = material_id
self.target_timerange = target_timerange
self.common_keyframes = []
@property
def start(self) -> int:
"""片段开始时间, 单位为微秒"""
return self.target_timerange.start
@start.setter
def start(self, value: int):
self.target_timerange.start = value
@property
def duration(self) -> int:
"""片段持续时间, 单位为微秒"""
return self.target_timerange.duration
@duration.setter
def duration(self, value: int):
self.target_timerange.duration = value
@property
def end(self) -> int:
"""片段结束时间, 单位为微秒"""
return self.target_timerange.end
def overlaps(self, other: "BaseSegment") -> bool:
"""判断是否与另一个片段有重叠"""
return self.target_timerange.overlaps(other.target_timerange)
def export_json(self) -> Dict[str, Any]:
"""返回通用于各种片段的属性"""
return {
"enable_adjust": True,
"enable_color_correct_adjust": False,
"enable_color_curves": True,
"enable_color_match_adjust": False,
"enable_color_wheels": True,
"enable_lut": True,
"enable_smart_color_adjust": False,
"last_nonzero_volume": 1.0,
"reverse": False,
"track_attribute": 0,
"track_render_index": 0,
"visible": True,
# 写入自定义字段
"id": self.segment_id,
"material_id": self.material_id,
"target_timerange": self.target_timerange.export_json(),
"common_keyframes": [kf_list.export_json() for kf_list in self.common_keyframes],
"keyframe_refs": [], # 意义不明
}
class Speed:
"""播放速度对象, 目前只支持固定速度"""
global_id: str
"""全局id, 由程序自动生成"""
speed: float
"""播放速度"""
def __init__(self, speed: float):
self.global_id = uuid.uuid4().hex
self.speed = speed
def export_json(self) -> Dict[str, Any]:
return {
"curve_speed": None,
"id": self.global_id,
"mode": 0,
"speed": self.speed,
"type": "speed"
}
class AudioFade:
"""音频淡入淡出效果"""
fade_id: str
"""淡入淡出效果的全局id, 自动生成"""
in_duration: int
"""淡入时长, 单位为微秒"""
out_duration: int
"""淡出时长, 单位为微秒"""
def __init__(self, in_duration: int, out_duration: int):
"""根据给定的淡入/淡出时长构造一个淡入淡出效果"""
self.fade_id = uuid.uuid4().hex
self.in_duration = in_duration
self.out_duration = out_duration
def export_json(self) -> Dict[str, Any]:
return {
"id": self.fade_id,
"fade_in_duration": self.in_duration,
"fade_out_duration": self.out_duration,
"fade_type": 0,
"type": "audio_fade"
}
class ClipSettings:
"""素材片段的图像调节设置"""
alpha: float
"""图像不透明度, 0-1"""
flip_horizontal: bool
"""是否水平翻转"""
flip_vertical: bool
"""是否垂直翻转"""
rotation: float
"""顺时针旋转的**角度**, 可正可负"""
scale_x: float
"""水平缩放比例"""
scale_y: float
"""垂直缩放比例"""
transform_x: float
"""水平位移, 单位为半个画布宽"""
transform_y: float
"""垂直位移, 单位为半个画布高"""
def __init__(self, *, alpha: float = 1.0,
flip_horizontal: bool = False, flip_vertical: bool = False,
rotation: float = 0.0,
scale_x: float = 1.0, scale_y: float = 1.0,
transform_x: float = 0.0, transform_y: float = 0.0):
"""初始化图像调节设置, 默认不作任何图像变换
Args:
alpha (float, optional): 图像不透明度, 0-1. 默认为1.0.
flip_horizontal (bool, optional): 是否水平翻转. 默认为False.
flip_vertical (bool, optional): 是否垂直翻转. 默认为False.
rotation (float, optional): 顺时针旋转的**角度**, 可正可负. 默认为0.0.
scale_x (float, optional): 水平缩放比例. 默认为1.0.
scale_y (float, optional): 垂直缩放比例. 默认为1.0.
transform_x (float, optional): 水平位移, 单位为半个画布宽. 默认为0.0.
transform_y (float, optional): 垂直位移, 单位为半个画布高. 默认为0.0.
参考: 剪映导入的字幕似乎取此值为-0.8
"""
self.alpha = alpha
self.flip_horizontal, self.flip_vertical = flip_horizontal, flip_vertical
self.rotation = rotation
self.scale_x, self.scale_y = scale_x, scale_y
self.transform_x, self.transform_y = transform_x, transform_y
def export_json(self) -> Dict[str, Any]:
clip_settings_json = {
"alpha": self.alpha,
"flip": {"horizontal": self.flip_horizontal, "vertical": self.flip_vertical},
"rotation": self.rotation,
"scale": {"x": self.scale_x, "y": self.scale_y},
"transform": {"x": self.transform_x, "y": self.transform_y}
}
return clip_settings_json
class MediaSegment(BaseSegment):
"""媒体片段基类"""
source_timerange: Optional[Timerange]
"""截取的素材片段的时间范围, 对贴纸而言不存在"""
speed: Speed
"""播放速度设置"""
volume: float
"""音量"""
change_pitch: bool
"""是否跟随变速改变音调"""
extra_material_refs: List[str]
"""附加的素材id列表, 用于链接动画/特效等"""
def __init__(self, material_id: str, source_timerange: Optional[Timerange], target_timerange: Timerange,
speed: float, volume: float, change_pitch: bool):
super().__init__(material_id, target_timerange)
self.source_timerange = source_timerange
self.speed = Speed(speed)
self.volume = volume
self.change_pitch = change_pitch
self.extra_material_refs = [self.speed.global_id]
def export_json(self) -> Dict[str, Any]:
"""返回通用于音频和视频片段的默认属性"""
ret = super().export_json()
ret.update({
"source_timerange": self.source_timerange.export_json() if self.source_timerange else None,
"speed": self.speed.speed,
"volume": self.volume,
"extra_material_refs": self.extra_material_refs,
"is_tone_modify": self.change_pitch,
})
return ret
class VisualSegment(MediaSegment):
"""视觉片段基类,用于处理所有可见片段(视频、贴纸、文本)的共同属性和行为"""
clip_settings: ClipSettings
"""图像调节设置, 其效果可被关键帧覆盖"""
uniform_scale: bool
"""是否锁定XY轴缩放比例"""
animations_instance: Optional[SegmentAnimations]
"""动画实例, 可能为空
在放入轨道时自动添加到素材列表中
"""
def __init__(self, material_id: str, source_timerange: Optional[Timerange], target_timerange: Timerange,
speed: float, volume: float, change_pitch: bool, *, clip_settings: Optional[ClipSettings]):
"""初始化视觉片段基类
Args:
material_id (`str`): 素材id
source_timerange (`Timerange`, optional): 截取的素材片段的时间范围
target_timerange (`Timerange`): 片段在轨道上的目标时间范围
speed (`float`): 播放速度
volume (`float`): 音量
change_pitch (`bool`): 是否跟随变速改变音调
clip_settings (`ClipSettings`, optional): 图像调节设置, 默认不作任何变换
"""
super().__init__(material_id, source_timerange, target_timerange, speed, volume, change_pitch)
self.clip_settings = clip_settings if clip_settings is not None else ClipSettings()
self.uniform_scale = True
self.animations_instance = None
def add_keyframe(self, _property: KeyframeProperty, time_offset: Union[int, str], value: float) -> "VisualSegment":
"""为给定属性创建一个关键帧, 并自动加入到关键帧列表中
Args:
_property (`KeyframeProperty`): 要控制的属性
time_offset (`int` or `str`): 关键帧的时间偏移量, 单位为微秒. 若传入字符串则会调用`tim()`函数进行解析.
value (`float`): 属性在`time_offset`处的值
Raises:
`ValueError`: 试图同时设置`uniform_scale`以及`scale_x`或`scale_y`其中一者
"""
if (_property == KeyframeProperty.scale_x or _property == KeyframeProperty.scale_y) and self.uniform_scale:
self.uniform_scale = False
elif _property == KeyframeProperty.uniform_scale:
if not self.uniform_scale:
raise ValueError("已设置 scale_x 或 scale_y 时, 不能再设置 uniform_scale")
_property = KeyframeProperty.scale_x
if isinstance(time_offset, str): time_offset = tim(time_offset)
for kf_list in self.common_keyframes:
if kf_list.keyframe_property == _property:
kf_list.add_keyframe(time_offset, value)
return self
kf_list = KeyframeList(_property)
kf_list.add_keyframe(time_offset, value)
self.common_keyframes.append(kf_list)
return self
def export_json(self) -> Dict[str, Any]:
"""导出通用于所有视觉片段的JSON数据"""
json_dict = super().export_json()
json_dict.update({
"clip": self.clip_settings.export_json(),
"uniform_scale": {"on": self.uniform_scale, "value": 1.0},
})
return json_dict
================================================
FILE: src/pyJianYingDraft/template_mode.py
================================================
"""与模板模式相关的类及函数等"""
from enum import Enum
from copy import deepcopy
from . import util
from . import exceptions
from .time_util import Timerange
from .segment import BaseSegment
from .track import BaseTrack, TrackType
from .local_materials import VideoMaterial, AudioMaterial
from typing import List, Dict, Any
class ShrinkMode(Enum):
"""处理替换素材时素材变短情况的方法"""
cut_head = "cut_head"
"""裁剪头部, 即后移片段起始点"""
cut_tail = "cut_tail"
"""裁剪尾部, 即前移片段终止点"""
cut_tail_align = "cut_tail_align"
"""裁剪尾部并消除间隙, 即前移片段终止点, 后续片段也依次前移"""
shrink = "shrink"
"""保持中间点不变, 两端点向中间靠拢"""
class ExtendMode(Enum):
"""处理替换素材时素材变长情况的方法"""
cut_material_tail = "cut_material_tail"
"""裁剪素材尾部(覆盖`source_timerange`参数), 使得片段维持原长不变, 此方法总是成功"""
extend_head = "extend_head"
"""延伸头部, 即尝试前移片段起始点, 与前续片段重合时失败"""
extend_tail = "extend_tail"
"""延伸尾部, 即尝试后移片段终止点, 与后续片段重合时失败"""
push_tail = "push_tail"
"""延伸尾部, 若有必要则依次后移后续片段, 此方法总是成功"""
class ImportedSegment(BaseSegment):
"""导入的片段"""
raw_data: Dict[str, Any]
"""原始json数据"""
__DATA_ATTRS = ["material_id", "target_timerange"]
def __init__(self, json_data: Dict[str, Any]):
self.raw_data = deepcopy(json_data)
util.assign_attr_with_json(self, self.__DATA_ATTRS, json_data)
def export_json(self) -> Dict[str, Any]:
json_data = deepcopy(self.raw_data)
json_data.update(util.export_attr_to_json(self, self.__DATA_ATTRS))
return json_data
class ImportedMediaSegment(ImportedSegment):
"""导入的视频/音频片段"""
source_timerange: Timerange
"""片段取用的素材时间范围"""
__DATA_ATTRS = ["source_timerange"]
def __init__(self, json_data: Dict[str, Any]):
super().__init__(json_data)
util.assign_attr_with_json(self, self.__DATA_ATTRS, json_data)
def export_json(self) -> Dict[str, Any]:
json_data = super().export_json()
json_data.update(util.export_attr_to_json(self, self.__DATA_ATTRS))
return json_data
class ImportedTrack(BaseTrack):
"""模板模式下导入的轨道"""
raw_data: Dict[str, Any]
"""原始轨道数据"""
def __init__(self, json_data: Dict[str, Any]):
self.track_type = TrackType.from_name(json_data["type"])
self.name = json_data["name"]
self.track_id = json_data["id"]
self.render_index = max([int(seg["render_index"]) for seg in json_data["segments"]], default=0)
self.raw_data = deepcopy(json_data)
def export_json(self) -> Dict[str, Any]:
ret = deepcopy(self.raw_data)
ret.update({
"name": self.name,
"id": self.track_id
})
return ret
class EditableTrack(ImportedTrack):
"""模板模式下导入且可修改的轨道(音视频及文本轨道)"""
segments: List[ImportedSegment]
"""该轨道包含的片段列表"""
def __len__(self):
return len(self.segments)
@property
def start_time(self) -> int:
"""轨道起始时间, 微秒"""
if len(self.segments) == 0:
return 0
return self.segments[0].target_timerange.start
@property
def end_time(self) -> int:
"""轨道结束时间, 微秒"""
if len(self.segments) == 0:
return 0
return self.segments[-1].target_timerange.end
def export_json(self) -> Dict[str, Any]:
ret = super().export_json()
# 为每个片段写入render_index
segment_exports = [seg.export_json() for seg in self.segments]
for seg in segment_exports:
seg["render_index"] = self.render_index
ret["segments"] = segment_exports
return ret
class ImportedTextTrack(EditableTrack):
"""模板模式下导入的文本轨道"""
def __init__(self, json_data: Dict[str, Any]):
super().__init__(json_data)
self.segments = [ImportedSegment(seg) for seg in json_data["segments"]]
class ImportedMediaTrack(EditableTrack):
"""模板模式下导入的音频/视频轨道"""
segments: List[ImportedMediaSegment]
"""该轨道包含的片段列表"""
def __init__(self, json_data: Dict[str, Any]):
super().__init__(json_data)
self.segments = [ImportedMediaSegment(seg) for seg in json_data["segments"]]
def check_material_type(self, material: object) -> bool:
"""检查素材类型是否与轨道类型匹配"""
if self.track_type == TrackType.video and isinstance(material, VideoMaterial):
return True
if self.track_type == TrackType.audio and isinstance(material, AudioMaterial):
return True
return False
def process_timerange(self, seg_index: int, src_timerange: Timerange,
shrink: ShrinkMode, extend: List[ExtendMode]) -> None:
"""处理素材替换的时间范围变更"""
seg = self.segments[seg_index]
new_duration = src_timerange.duration
# 时长变短
delta_duration = abs(new_duration - seg.duration)
if new_duration < seg.duration:
if shrink == ShrinkMode.cut_head:
seg.start += delta_duration
elif shrink == ShrinkMode.cut_tail:
seg.duration -= delta_duration
elif shrink == ShrinkMode.cut_tail_align:
seg.duration -= delta_duration
for i in range(seg_index+1, len(self.segments)): # 后续片段也依次前移相应值(保持间隙)
self.segments[i].start -= delta_duration
elif shrink == ShrinkMode.shrink:
seg.duration -= delta_duration
seg.start += delta_duration // 2
else:
raise ValueError(f"Unsupported shrink mode: {shrink}")
# 时长变长
elif new_duration > seg.duration:
success_flag = False
prev_seg_end = int(0) if seg_index == 0 else self.segments[seg_index-1].target_timerange.end
next_seg_start = int(1e15) if seg_index == len(self.segments)-1 else self.segments[seg_index+1].start
for mode in extend:
if mode == ExtendMode.extend_head:
if seg.start - delta_duration >= prev_seg_end:
seg.start -= delta_duration
success_flag = True
elif mode == ExtendMode.extend_tail:
if seg.target_timerange.end + delta_duration <= next_seg_start:
seg.duration += delta_duration
success_flag = True
elif mode == ExtendMode.push_tail:
shift_duration = max(0, seg.target_timerange.end + delta_duration - next_seg_start)
seg.duration += delta_duration
if shift_duration > 0: # 有必要时后移后续片段
for i in range(seg_index+1, len(self.segments)):
self.segments[i].start += shift_duration
success_flag = True
elif mode == ExtendMode.cut_material_tail:
src_timerange.duration = seg.duration
success_flag = True
else:
raise ValueError(f"Unsupported extend mode: {mode}")
if success_flag:
break
if not success_flag:
raise exceptions.ExtensionFailed(f"未能将片段延长至 {new_duration}μs, 尝试过以下方法: {extend}")
# 写入素材时间范围
seg.source_timerange = src_timerange
def import_track(json_data: Dict[str, Any]) -> ImportedTrack:
"""导入轨道"""
track_type = TrackType.from_name(json_data["type"])
if not track_type.value.allow_modify:
return ImportedTrack(json_data)
if track_type == TrackType.text:
return ImportedTextTrack(json_data)
return ImportedMediaTrack(json_data)
================================================
FILE: src/pyJianYingDraft/text_segment.py
================================================
"""定义文本片段及其相关类"""
import json
import uuid
from copy import deepcopy
from typing import Dict, Tuple, Any, List
from typing import Union, Optional, Literal
from .time_util import Timerange, tim
from .segment import ClipSettings, VisualSegment
from .animation import SegmentAnimations, Text_animation
from .metadata import FontType, EffectMeta
from .metadata import TextIntro, TextOutro, TextLoopAnim
class TextStyle:
"""字体样式类"""
size: float
"""字体大小"""
bold: bool
"""是否加粗"""
italic: bool
"""是否斜体"""
underline: bool
"""是否加下划线"""
color: Tuple[float, float, float]
"""字体颜色, RGB三元组, 取值范围为[0, 1]"""
alpha: float
"""字体不透明度"""
align: Literal[0, 1, 2]
"""对齐方式"""
vertical: bool
"""是否为竖排文本"""
letter_spacing: int
"""字符间距"""
line_spacing: int
"""行间距"""
auto_wrapping: bool
"""是否自动换行"""
max_line_width: float
"""最大行宽, 取值范围为[0, 1]"""
def __init__(self, *, size: float = 8.0, bold: bool = False, italic: bool = False, underline: bool = False,
color: Tuple[float, float, float] = (1.0, 1.0, 1.0), alpha: float = 1.0,
align: Literal[0, 1, 2] = 0, vertical: bool = False,
letter_spacing: int = 0, line_spacing: int = 0,
auto_wrapping: bool = False, max_line_width: float = 0.82):
"""
Args:
size (`float`, optional): 字体大小, 默认为8.0
bold (`bool`, optional): 是否加粗, 默认为否
italic (`bool`, optional): 是否斜体, 默认为否
underline (`bool`, optional): 是否加下划线, 默认为否
color (`Tuple[float, float, float]`, optional): 字体颜色, RGB三元组, 取值范围为[0, 1], 默认为白色
alpha (`float`, optional): 字体不透明度, 取值范围[0, 1], 默认不透明
align (`int`, optional): 对齐方式, 0: 左对齐, 1: 居中, 2: 右对齐, 默认为左对齐
vertical (`bool`, optional): 是否为竖排文本, 默认为否
letter_spacing (`int`, optional): 字符间距, 定义与剪映中一致, 默认为0
line_spacing (`int`, optional): 行间距, 定义与剪映中一致, 默认为0
auto_wrapping (`bool`, optional): 是否自动换行, 默认关闭
max_line_width (`float`, optional): 每行最大行宽占屏幕宽度比例, 取值范围为[0, 1], 默认为0.82
"""
self.size = size
self.bold = bold
self.italic = italic
self.underline = underline
self.color = color
self.alpha = alpha
self.align = align
self.vertical = vertical
self.letter_spacing = letter_spacing
self.line_spacing = line_spacing
self.auto_wrapping = auto_wrapping
self.max_line_width = max_line_width
class TextBorder:
"""文本描边的参数"""
alpha: float
"""描边不透明度"""
color: Tuple[float, float, float]
"""描边颜色, RGB三元组, 取值范围为[0, 1]"""
width: float
"""描边宽度"""
def __init__(self, *, alpha: float = 1.0, color: Tuple[float, float, float] = (0.0, 0.0, 0.0), width: float = 40.0):
"""
Args:
alpha (`float`, optional): 描边不透明度, 取值范围[0, 1], 默认为1.0
color (`Tuple[float, float, float]`, optional): 描边颜色, RGB三元组, 取值范围为[0, 1], 默认为黑色
width (`float`, optional): 描边宽度, 与剪映中一致, 取值范围为[0, 100], 默认为40.0
"""
self.alpha = alpha
self.color = color
self.width = width / 100.0 * 0.2 # 此映射可能不完全正确
def export_json(self) -> Dict[str, Any]:
"""导出JSON数据, 放置在素材content的styles中"""
return {
"content": {
"solid": {
"alpha": self.alpha,
"color": list(self.color),
}
},
"width": self.width
}
class TextBackground:
"""文本背景参数"""
style: Literal[1, 2]
"""背景样式"""
alpha: float
"""背景不透明度"""
color: str
"""背景颜色, 格式为'#RRGGBB'"""
round_radius: float
"""背景圆角半径"""
height: float
"""背景高度"""
width: float
"""背景宽度"""
horizontal_offset: float
"""背景水平偏移"""
vertical_offset: float
"""背景竖直偏移"""
def __init__(self, *, color: str, style: Literal[1, 2] = 1, alpha: float = 1.0, round_radius: float = 0.0,
height: float = 0.14, width: float = 0.14,
horizontal_offset: float = 0.5, vertical_offset: float = 0.5):
"""
Args:
color (`str`): 背景颜色, 格式为'#RRGGBB'
style (`int`, optional): 背景样式, 1和2分别对应剪映中的两种样式, 默认为1
alpha (`float`, optional): 背景不透明度, 与剪映中一致, 取值范围[0, 1], 默认为1.0
round_radius (`float`, optional): 背景圆角半径, 与剪映中一致, 取值范围[0, 1], 默认为0.0
height (`float`, optional): 背景高度, 与剪映中一致, 取值范围为[0, 1], 默认为0.14
width (`float`, optional): 背景宽度, 与剪映中一致, 取值范围为[0, 1], 默认为0.14
horizontal_offset (`float`, optional): 背景水平偏移, 与剪映中一致, 取值范围为[0, 1], 默认为0.5
vertical_offset (`float`, optional): 背景竖直偏移, 与剪映中一致, 取值范围为[0, 1], 默认为0.5
"""
self.style = style
self.alpha = alpha
self.color = color
self.round_radius = round_radius
self.height = height
self.width = width
self.horizontal_offset = horizontal_offset * 2 - 1
self.vertical_offset = vertical_offset * 2 - 1
def export_json(self) -> Dict[str, Any]:
"""生成子JSON数据, 在TextSegment导出时合并到其中"""
return {
"background_style": self.style,
"background_color": self.color,
"background_alpha": self.alpha,
"background_round_radius": self.round_radius,
"background_height": self.height,
"background_width": self.width,
"background_horizontal_offset": self.horizontal_offset,
"background_vertical_offset": self.vertical_offset,
}
class TextBubble:
"""文本气泡素材, 与滤镜素材本质上一致"""
global_id: str
"""气泡全局id, 由程序自动生成"""
effect_id: str
resource_id: str
def __init__(self, effect_id: str, resource_id: str):
self.global_id = uuid.uuid4().hex
self.effect_id = effect_id
self.resource_id = resource_id
def export_json(self) -> Dict[str, Any]:
return {
"apply_target_type": 0,
"effect_id": self.effect_id,
"id": self.global_id,
"resource_id": self.resource_id,
"type": "text_shape",
"value": 1.0,
# 不导出path和request_id
}
class TextEffect(TextBubble):
"""文本花字素材, 与滤镜素材本质上也一致"""
def export_json(self) -> Dict[str, Any]:
ret = super().export_json()
ret["type"] = "text_effect"
ret["source_platform"] = 1
return ret
class TextShadow:
"""文本阴影参数"""
alpha: float
"""阴影不透明度, 取值范围为[0, 1]"""
color: Tuple[float, float, float]
"""阴影颜色, RGB三元组, 取值范围为[0, 1]"""
diffuse: float
"""阴影扩散程度, 此处定义与剪映中一致, 取值范围为[0, 100]"""
distance: float
"""阴影距离, 取值范围为[0, 100]"""
angle: float
"""阴影角度, 取值范围为[-180, 180]"""
def __init__(self, *, alpha: float = 1.0, color: Tuple[float, float, float] = (0.0, 0.0, 0.0),
diffuse: float = 15.0, distance: float = 5.0, angle: float = -45.0):
"""
Args:
alpha (`float`, optional): 阴影不透明度, 取值范围为[0, 1], 默认为1.0
color (`Tuple[float, float, float]`, optional): 阴影颜色, RGB三元组, 取值范围为[0, 1], 默认为黑色
diffuse (`float`, optional): 阴影扩散程度, 此处定义与剪映中一致, 取值范围为[0, 100], 默认为15.0
distance (`float`, optional): 阴影距离, 取值范围为[0, 100], 默认为5.0
angle (`float`, optional): 阴影角度, 取值范围为[-180, 180], 默认为-45.0
"""
self.alpha = alpha
self.color = color
self.diffuse = diffuse
self.distance = distance
self.angle = angle
def export_json(self) -> Dict[str, Any]:
return {
"diffuse": self.diffuse / 100.0 / 6, # /6是剪映自带的映射
"alpha": self.alpha,
"distance": self.distance,
"content": {
"solid": {
"color": list(self.color),
}
},
"angle": self.angle
}
class TextSegment(VisualSegment):
"""文本片段类, 目前仅支持设置基本的字体样式"""
text: str
"""文本内容"""
font: Optional[EffectMeta]
"""字体类型"""
style: TextStyle
"""字体样式"""
border: Optional[TextBorder]
"""文本描边参数, None表示无描边"""
background: Optional[TextBackground]
"""文本背景参数, None表示无背景"""
shadow: Optional[TextShadow]
"""文本阴影参数, None表示无阴影"""
bubble: Optional[TextBubble]
"""文本气泡效果, 在放入轨道时加入素材列表中"""
effect: Optional[TextEffect]
"""文本花字效果, 在放入轨道时加入素材列表中, 目前仅支持一部分花字效果"""
extra_styles: List[Dict[str, Any]]
"""额外的文本样式,用于关键词高亮等特殊样式"""
def __init__(self, text: str, timerange: Timerange, *,
font: Optional[FontType] = None,
style: Optional[TextStyle] = None, clip_settings: Optional[ClipSettings] = None,
border: Optional[TextBorder] = None, background: Optional[TextBackground] = None,
shadow: Optional[TextShadow] = None):
"""创建文本片段, 并指定其时间信息、字体样式及图像调节设置
片段创建完成后, 可通过`ScriptFile.add_segment`方法将其添加到轨道中
Args:
text (`str`): 文本内容
timerange (`Timerange`): 片段在轨道上的时间范围
font (`Font_type`, optional): 字体类型, 默认为系统字体
style (`TextStyle`, optional): 字体样式, 包含大小/颜色/对齐/透明度等.
clip_settings (`ClipSettings`, optional): 图像调节设置, 默认不做任何变换
border (`TextBorder`, optional): 文本描边参数, 默认无描边
background (`TextBackground`, optional): 文本背景参数, 默认无背景
shadow (`TextShadow`, optional): 文本阴影参数, 默认无阴影
"""
super().__init__(uuid.uuid4().hex, None, timerange, 1.0, 1.0, False, clip_settings=clip_settings)
self.text = text
self.font = font.value if font else None
self.style = style or TextStyle()
self.border = border
self.background = background
self.shadow = shadow
self.bubble = None
self.effect = None
self.extra_styles = []
@classmethod
def create_from_template(cls, text: str, timerange: Timerange, template: "TextSegment") -> "TextSegment":
"""根据模板创建新的文本片段, 并指定其文本内容"""
new_segment = cls(text, timerange, style=deepcopy(template.style), clip_settings=deepcopy(template.clip_settings),
border=deepcopy(template.border), background=deepcopy(template.background),
shadow=deepcopy(template.shadow))
new_segment.font = deepcopy(template.font)
# 处理动画等
if template.animations_instance:
new_segment.animations_instance = deepcopy(template.animations_instance)
new_segment.animations_instance.animation_id = uuid.uuid4().hex
new_segment.extra_material_refs.append(new_segment.animations_instance.animation_id)
if template.bubble:
new_segment.add_bubble(template.bubble.effect_id, template.bubble.resource_id)
if template.effect:
new_segment.add_effect(template.effect.effect_id)
return new_segment
def add_animation(self, animation_type: Union[TextIntro, TextOutro, TextLoopAnim],
duration: Union[str, float, int, None] = None) -> "TextSegment":
"""将给定的入场/出场/循环动画添加到此片段的动画列表中, 出入场动画的持续时间可以自行设置.
循环动画为剪映中的「循环」类型: ``duration`` 表示**单次循环**时长(微秒), 与 ``get_text_animations``
里 loop 的 ``duration`` 一致; 未指定时使用该动画元数据默认值. 循环从**入场结束之后**开始,
至出场之前结束, 中间时段由剪映按该时长重复播放.
注意: 若希望同时使用循环动画和入出场动画, 请**先添加出入场动画再添加循环动画**
Args:
animation_type (`TextIntro`, `TextOutro` or `TextLoopAnim`): 文本动画类型.
duration (`str`, `int`, `float`, optional): 微秒; 字符串则调用 ``tim()`` 解析.
对入场/出场为各自动画段时长; 对循环动画为单次循环时长.
"""
if duration is None:
duration = animation_type.value.duration
duration = min(tim(duration), self.target_timerange.duration)
if isinstance(animation_type, TextIntro):
start = 0
elif isinstance(animation_type, TextOutro):
start = self.target_timerange.duration - duration
elif isinstance(animation_type, TextLoopAnim):
intro_trange = self.animations_instance and self.animations_instance.get_animation_trange("in")
outro_trange = self.animations_instance and self.animations_instance.get_animation_trange("out")
start = intro_trange.end if intro_trange else 0
outro_dur = outro_trange.duration if outro_trange else 0
available = self.target_timerange.duration - start - outro_dur
cycle = duration
span_cap = max(1, available)
duration = max(1, min(cycle, span_cap))
else:
raise TypeError("Invalid animation type %s" % type(animation_type))
if self.animations_instance is None:
self.animations_instance = SegmentAnimations()
self.extra_material_refs.append(self.animations_instance.animation_id)
self.animations_instance.add_animation(Text_animation(animation_type, start, duration))
return self
def add_bubble(self, effect_id: str, resource_id: str) -> "TextSegment":
"""根据素材信息添加气泡效果, 相应素材信息可通过`ScriptFile.inspect_material`从模板中获取
Args:
effect_id (`str`): 气泡效果的effect_id
resource_id (`str`): 气泡效果的resource_id
"""
self.bubble = TextBubble(effect_id, resource_id)
self.extra_material_refs.append(self.bubble.global_id)
return self
def add_effect(self, effect_id: str) -> "TextSegment":
"""根据素材信息添加花字效果, 相应素材信息可通过`ScriptFile.inspect_material`从模板中获取
Args:
effect_id (`str`): 花字效果的effect_id, 也同时是其resource_id
"""
self.effect = TextEffect(effect_id, effect_id)
self.extra_material_refs.append(self.effect.global_id)
return self
def export_material(self) -> Dict[str, Any]:
"""与此文本片段联系的素材, 以此不再单独定义Text_material类"""
# 叠加各类效果的flag
check_flag: int = 7
if self.border:
check_flag |= 8
if self.background:
check_flag |= 16
if self.shadow:
check_flag |= 32
# 创建基础样式
base_style = {
"fill": {
"alpha": 1.0,
"content": {
"render_type": "solid",
"solid": {
"alpha": 1.0,
"color": list(self.style.color)
}
}
},
"range": [0, len(self.text.encode('utf-16-le'))],
"size": self.style.size,
"bold": self.style.bold,
"italic": self.style.italic,
"underline": self.style.underline,
"strokes": [self.border.export_json()] if self.border else []
}
# 合并基础样式和额外样式
styles = [base_style] + self.extra_styles
content_json = {
"styles": styles,
"text": self.text
}
if self.font:
content_json["styles"][0]["font"] = {
"id": self.font.resource_id,
"path": "D:" # 并不会真正在此处放置字体文件
}
if self.effect:
content_json["styles"][0]["effectStyle"] = {
"id": self.effect.effect_id,
"path": "C:" # 并不会真正在此处放置素材文件
}
if self.shadow:
content_json["styles"][0]["shadows"] = [self.shadow.export_json()]
ret = {
"id": self.material_id,
"content": json.dumps(content_json, ensure_ascii=False),
"typesetting": int(self.style.vertical),
"alignment": self.style.align,
"letter_spacing": self.style.letter_spacing * 0.05,
"line_spacing": 0.02 + self.style.line_spacing * 0.05,
"line_feed": 1,
"line_max_width": self.style.max_line_width,
"force_apply_line_max_width": False,
"check_flag": check_flag,
"type": "subtitle" if self.style.auto_wrapping else "text",
# 混合 (+4)
"global_alpha": self.style.alpha,
# 发光 (+64),属性由extra_material_refs记录
}
if self.background:
ret.update(self.background.export_json())
return ret
================================================
FILE: src/pyJianYingDraft/time_util.py
================================================
"""定义时间范围类以及与时间相关的辅助函数"""
from typing import Union
from typing import Dict
SEC = 1000000
"""一秒=1e6微秒"""
def tim(inp: Union[str, float]) -> int:
"""将输入的字符串转换为微秒, 也可直接输入微秒数
支持类似 "1h52m3s" 或 "0.15s" 这样的格式, 可包含负号以表示负偏移
"""
if isinstance(inp, (int, float)):
return int(round(inp))
sign: int = 1
inp = inp.strip().lower()
if inp.startswith("-"):
sign = -1
inp = inp[1:]
last_index: int = 0
total_time: float = 0
for unit, factor in zip(["h", "m", "s"], [3600*SEC, 60*SEC, SEC]):
unit_index = inp.find(unit)
if unit_index == -1: continue
total_time += float(inp[last_index:unit_index]) * factor
last_index = unit_index + 1
return int(round(total_time) * sign)
class Timerange:
"""记录了起始时间及持续长度的时间范围"""
start: int
"""起始时间, 单位为微秒"""
duration: int
"""持续长度, 单位为微秒"""
def __init__(self, start: int, duration: int):
"""构造一个时间范围
Args:
start (int): 起始时间, 单位为微秒
duration (int): 持续长度, 单位为微秒
"""
self.start = start
self.duration = duration
@classmethod
def import_json(cls, json_obj: Dict[str, str]) -> "Timerange":
"""从json对象中恢复Timerange"""
return cls(int(json_obj["start"]), int(json_obj["duration"]))
@property
def end(self) -> int:
"""结束时间, 单位为微秒"""
return self.start + self.duration
def __eq__(self, other: object) -> bool:
if not isinstance(other, Timerange):
return False
return self.start == other.start and self.duration == other.duration
def overlaps(self, other: "Timerange") -> bool:
"""判断两个时间范围是否有重叠"""
return not (self.end <= other.start or other.end <= self.start)
def __repr__(self) -> str:
return f"Timerange(start={self.start}, duration={self.duration})"
def __str__(self) -> str:
return f"[start={self.start}, end={self.end}]"
def export_json(self) -> Dict[str, int]:
return {"start": self.start, "duration": self.duration}
def trange(start: Union[str, float], duration: Union[str, float]) -> Timerange:
"""Timerange的简便构造函数, 接受字符串或微秒数作为参数
支持类似 "1h52m3s" 或 "0.15s" 这样的格式
Args:
start (Union[str, float]): 起始时间
duration (Union[str, float]): 持续长度, 注意**不是结束时间**
"""
return Timerange(tim(start), tim(duration))
def srt_tstamp(srt_tstamp: str) -> int:
"""解析srt中的时间戳字符串, 返回微秒数"""
sec_str, ms_str = srt_tstamp.split(",")
parts = sec_str.split(":") + [ms_str]
total_time = 0
for value, factor in zip(parts, [3600*SEC, 60*SEC, SEC, 1000]):
total_time += int(value) * factor
return total_time
================================================
FILE: src/pyJianYingDraft/track.py
================================================
"""轨道类及其元数据"""
import uuid
from enum import Enum
from typing import TypeVar, Generic, Type
from typing import Dict, List, Any, Union
from dataclasses import dataclass
from abc import ABC, abstractmethod
from .exceptions import SegmentOverlap
from .segment import BaseSegment
from .video_segment import VideoSegment, StickerSegment
from .audio_segment import AudioSegment
from .text_segment import TextSegment
from .effect_segment import EffectSegment, FilterSegment
@dataclass
class Track_meta:
"""与轨道类型关联的轨道元数据"""
segment_type: Union[Type[VideoSegment], Type[AudioSegment],
Type[EffectSegment], Type[FilterSegment],
Type[TextSegment], Type[StickerSegment], None]
"""与轨道关联的片段类型"""
render_index: int
"""默认渲染顺序, 值越大越接近前景"""
allow_modify: bool
"""当被导入时, 是否允许修改"""
class TrackType(Enum):
"""轨道类型枚举
变量名对应type属性, 值表示相应的轨道元数据
"""
video = Track_meta(VideoSegment, 0, True)
audio = Track_meta(AudioSegment, 0, True)
effect = Track_meta(EffectSegment, 10000, False)
filter = Track_meta(FilterSegment, 11000, False)
sticker = Track_meta(StickerSegment, 14000, False)
text = Track_meta(TextSegment, 15000, True) # 原本是14000, 避免与sticker冲突改为15000
adjust = Track_meta(None, 0, False)
"""仅供导入时使用, 不要尝试新建此类型的轨道"""
@staticmethod
def from_name(name: str) -> "TrackType":
"""根据名称获取轨道类型枚举"""
for t in TrackType:
if t.name == name:
return t
raise ValueError("Invalid track type: %s" % name)
class BaseTrack(ABC):
"""轨道基类"""
track_type: TrackType
"""轨道类型"""
name: str
"""轨道名称"""
track_id: str
"""轨道全局ID"""
render_index: int
"""渲染顺序, 值越大越接近前景"""
@abstractmethod
def export_json(self) -> Dict[str, Any]: ...
Seg_type = TypeVar("Seg_type", bound=BaseSegment)
class Track(BaseTrack, Generic[Seg_type]):
"""非模板模式下的轨道"""
mute: bool
"""是否静音"""
segments: List[Seg_type]
"""该轨道包含的片段列表"""
def __init__(self, track_type: TrackType, name: str, render_index: int, mute: bool):
self.track_type = track_type
self.name = name
self.track_id = uuid.uuid4().hex
self.render_index = render_index
self.mute = mute
self.segments = []
@property
def end_time(self) -> int:
"""轨道结束时间, 微秒"""
if len(self.segments) == 0:
return 0
return self.segments[-1].target_timerange.end
@property
def accept_segment_type(self) -> Type[Seg_type]:
"""返回该轨道允许的片段类型"""
return self.track_type.value.segment_type # type: ignore
def add_segment(self, segment: Seg_type) -> "Track[Seg_type]":
"""向轨道中添加一个片段, 添加的片段必须匹配轨道类型且不与现有片段重叠
Args:
segment (Seg_type): 要添加的片段
Raises:
`TypeError`: 新片段类型与轨道类型不匹配
`SegmentOverlap`: 新片段与现有片段重叠
"""
if not isinstance(segment, self.accept_segment_type):
raise TypeError("New segment (%s) is not of the same type as the track (%s)" % (type(segment), self.accept_segment_type))
# 检查片段是否重叠
for seg in self.segments:
if seg.overlaps(segment):
raise SegmentOverlap("New segment overlaps with existing segment [start: {}, end: {}]"
.format(segment.target_timerange.start, segment.target_timerange.end))
self.segments.append(segment)
return self
def export_json(self) -> Dict[str, Any]:
# 为每个片段写入render_index
segment_exports = [seg.export_json() for seg in self.segments]
for seg in segment_exports:
seg["render_index"] = self.render_index
return {
"attribute": int(self.mute),
"flag": 0,
"id": self.track_id,
"is_default_name": len(self.name) == 0,
"name": self.name,
"segments": segment_exports,
"type": self.track_type.name
}
================================================
FILE: src/pyJianYingDraft/util.py
================================================
"""辅助函数,主要与模板模式有关"""
import inspect
from typing import Union, Type
from typing import List, Dict, Any
JsonExportable = Union[int, float, bool, str, List["JsonExportable"], Dict[str, "JsonExportable"]]
def provide_ctor_defaults(cls: Type) -> Dict[str, Any]:
"""为构造函数提供默认值,以绕开构造函数的参数限制"""
signature = inspect.signature(cls.__init__)
provided_defaults: Dict[str, Any] = {}
for name, param in signature.parameters.items():
if name == 'self': continue
if param.default is not inspect.Parameter.empty: continue
if param.annotation is int or param.annotation is float:
provided_defaults[name] = 0
elif param.annotation is str:
provided_defaults[name] = ""
elif param.annotation is bool:
provided_defaults[name] = False
else:
raise ValueError(f"Unsupported parameter type: {param.annotation}")
return provided_defaults
def assign_attr_with_json(obj: object, attrs: List[str], json_data: Dict[str, Any]):
"""根据json数据赋值给指定的对象属性
若有复杂类型,则尝试调用其`import_json`方法进行构造
"""
type_hints: Dict[str, Type] = {}
for cls in obj.__class__.__mro__:
if '__annotations__' in cls.__dict__:
type_hints.update(cls.__annotations__)
for attr in attrs:
if hasattr(type_hints[attr], 'import_json'):
obj.__setattr__(attr, type_hints[attr].import_json(json_data[attr]))
else:
obj.__setattr__(attr, type_hints[attr](json_data[attr]))
def export_attr_to_json(obj: object, attrs: List[str]) -> Dict[str, JsonExportable]:
"""将对象属性导出为json数据
若有复杂类型,则尝试调用其`export_json`方法进行导出
"""
json_data: Dict[str, Any] = {}
for attr in attrs:
if hasattr(getattr(obj, attr), 'export_json'):
json_data[attr] = getattr(obj, attr).export_json()
else:
json_data[attr] = getattr(obj, attr)
return json_data
================================================
FILE: src/pyJianYingDraft/video_segment.py
================================================
"""定义视频片段及其相关类
包含图像调节设置、动画效果、特效、转场等相关类
"""
import uuid
from copy import deepcopy
from typing import Optional, Literal, Union
from typing import Dict, List, Tuple, Any
from .time_util import tim, Timerange
from .segment import VisualSegment, ClipSettings, AudioFade
from .local_materials import VideoMaterial
from .animation import SegmentAnimations, VideoAnimation
from .metadata import EffectMeta, EffectParamInstance
from .metadata import MaskMeta, MaskType, FilterType, TransitionType
from .metadata import IntroType, OutroType, GroupAnimationType
from .metadata import VideoSceneEffectType, VideoCharacterEffectType
from .metadata.mix_mode_meta import MixModeType
class Mask:
"""蒙版对象"""
mask_meta: MaskMeta
"""蒙版元数据"""
global_id: str
"""蒙版全局id, 由程序自动生成"""
center_x: float
"""蒙版中心x坐标, 以半素材宽为单位"""
center_y: float
"""蒙版中心y坐标, 以半素材高为单位"""
width: float
height: float
aspect_ratio: float
rotation: float
invert: bool
feather: float
"""羽化程度, 0-1"""
round_corner: float
"""矩形蒙版的圆角, 0-1"""
def __init__(self, mask_meta: MaskMeta,
cx: float, cy: float, w: float, h: float,
ratio: float, rot: float, inv: bool, feather: float, round_corner: float):
self.mask_meta = mask_meta
self.global_id = uuid.uuid4().hex
self.center_x, self.center_y = cx, cy
self.width, self.height = w, h
self.aspect_ratio = ratio
self.rotation = rot
self.invert = inv
self.feather = feather
self.round_corner = round_corner
def export_json(self) -> Dict[str, Any]:
return {
"config": {
"aspectRatio": self.aspect_ratio,
"centerX": self.center_x,
"centerY": self.center_y,
"feather": self.feather,
"height": self.height,
"invert": self.invert,
"rotation": self.rotation,
"roundCorner": self.round_corner,
"width": self.width
},
"id": self.global_id,
"name": self.mask_meta.name,
"platform": "all",
"position_info": "",
"resource_type": self.mask_meta.resource_type,
"resource_id": self.mask_meta.resource_id,
"type": "mask"
# 不导出path字段
}
class VideoEffect:
"""视频特效素材"""
name: str
"""特效名称"""
global_id: str
"""特效全局id, 由程序自动生成"""
effect_id: str
"""某种特效id, 由剪映本身提供"""
resource_id: str
"""资源id, 由剪映本身提供"""
effect_type: Literal["video_effect", "face_effect"]
apply_target_type: Literal[0, 2]
"""应用目标类型, 0: 片段, 2: 全局"""
adjust_params: List[EffectParamInstance]
def __init__(self, effect_meta: Union[VideoSceneEffectType, VideoCharacterEffectType],
params: Optional[List[Optional[float]]] = None, *,
apply_target_type: Literal[0, 2] = 0):
"""根据给定的特效元数据及参数列表构造一个视频特效对象, params的范围是0~100"""
self.name = effect_meta.value.name
self.global_id = uuid.uuid4().hex
self.effect_id = effect_meta.value.effect_id
self.resource_id = effect_meta.value.resource_id
self.adjust_params = []
if isinstance(effect_meta, VideoSceneEffectType):
self.effect_type = "video_effect"
elif isinstance(effect_meta, VideoCharacterEffectType):
self.effect_type = "face_effect"
else:
raise TypeError("Invalid effect meta type %s" % type(effect_meta))
self.apply_target_type = apply_target_type
self.adjust_params = effect_meta.value.parse_params(params)
def export_json(self) -> Dict[str, Any]:
return {
"adjust_params": [param.export_json() for param in self.adjust_params],
"apply_target_type": self.apply_target_type,
"apply_time_range": None,
"category_id": "", # 一律设为空
"category_name": "", # 一律设为空
"common_keyframes": [],
"disable_effect_faces": [],
"effect_id": self.effect_id,
"formula_id": "",
"id": self.global_id,
"name": self.name,
"platform": "all",
"render_index": 11000,
"resource_id": self.resource_id,
"source_platform": 0,
"time_range": None,
"track_render_index": 0,
"type": self.effect_type,
"value": 1.0,
"version": ""
# 不导出path、request_id和algorithm_artifact_path字段
}
class Filter:
"""滤镜素材"""
global_id: str
"""滤镜全局id, 由程序自动生成"""
effect_meta: EffectMeta
"""滤镜的元数据"""
intensity: float
"""滤镜强度(滤镜的唯一参数)"""
apply_target_type: Literal[0, 2]
"""应用目标类型, 0: 片段, 2: 全局"""
def __init__(self, meta: EffectMeta, intensity: float, *,
apply_target_type: Literal[0, 2] = 0):
"""根据给定的滤镜元数据及强度构造滤镜素材对象"""
self.global_id = uuid.uuid4().hex
self.effect_meta = meta
self.intensity = intensity
self.apply_target_type = apply_target_type
def export_json(self) -> Dict[str, Any]:
return {
"adjust_params": [],
"algorithm_artifact_path": "",
"apply_target_type": self.apply_target_type,
"bloom_params": None,
"category_id": "", # 一律设为空
"category_name": "", # 一律设为空
"color_match_info": {
"source_feature_path": "",
"target_feature_path": "",
"target_image_path": ""
},
"effect_id": self.effect_meta.effect_id,
"enable_skin_tone_correction": False,
"exclusion_group": [],
"face_adjust_params": [],
"formula_id": "",
"id": self.global_id,
"intensity_key": "",
"multi_language_current": "",
"name": self.effect_meta.name,
"panel_id": "",
"platform": "all",
"resource_id": self.effect_meta.resource_id,
"source_platform": 1,
"sub_type": "none",
"time_range": None,
"type": "filter",
"value": self.intensity,
"version": ""
# 不导出path和request_id
}
class Transition:
"""转场对象"""
name: str
"""转场名称"""
global_id: str
"""转场全局id, 由程序自动生成"""
effect_id: str
"""转场效果id, 由剪映本身提供"""
resource_id: str
"""资源id, 由剪映本身提供"""
duration: int
"""转场持续时间, 单位为微秒"""
is_overlap: bool
"""是否与上一个片段重叠(?)"""
def __init__(self, effect_meta: TransitionType, duration: Optional[int] = None):
"""根据给定的转场元数据及持续时间构造一个转场对象"""
self.name = effect_meta.value.name
self.global_id = uuid.uuid4().hex
self.effect_id = effect_meta.value.effect_id
self.resource_id = effect_meta.value.resource_id
self.duration = duration if duration is not None else effect_meta.value.default_duration
self.is_overlap = effect_meta.value.is_overlap
def export_json(self) -> Dict[str, Any]:
return {
"category_id": "", # 一律设为空
"category_name": "", # 一律设为空
"duration": self.duration,
"effect_id": self.effect_id,
"id": self.global_id,
"is_overlap": self.is_overlap,
"name": self.name,
"platform": "all",
"resource_id": self.resource_id,
"type": "transition"
# 不导出path和request_id字段
}
class BackgroundFilling:
"""背景填充对象"""
global_id: str
"""背景填充全局id, 由程序自动生成"""
fill_type: Literal["canvas_blur", "canvas_color"]
"""背景填充类型"""
blur: float
"""模糊程度, 0-1"""
color: str
"""背景颜色, 格式为'#RRGGBBAA'"""
def __init__(self, fill_type: Literal["canvas_blur", "canvas_color"], blur: float, color: str):
self.global_id = uuid.uuid4().hex
self.fill_type = fill_type
self.blur = blur
self.color = color
def export_json(self) -> Dict[str, Any]:
return {
"id": self.global_id,
"type": self.fill_type,
"blur": self.blur,
"color": self.color,
"source_platform": 0,
}
class MixMode:
"""混合模式对象"""
global_id: str
"""混合模式全局id, 由程序自动生成"""
effect_meta: EffectMeta
"""混合模式的元数据"""
apply_target_type: Literal[0, 2]
"""应用目标类型, 0: 片段, 2: 全局
对混合模式而言应该一直是0
"""
def __init__(self, meta: EffectMeta, *,
apply_target_type: Literal[0, 2] = 0):
"""根据给定的混合模式元数据构造混合模式对象"""
self.global_id = uuid.uuid4().hex
self.effect_meta = meta
self.apply_target_type = apply_target_type
def export_json(self) -> Dict[str, Any]:
return {
"type": "mix_mode",
"name": self.effect_meta.name,
"effect_id": self.effect_meta.effect_id,
"resource_id": self.effect_meta.resource_id,
"value": 1.0,
"apply_target_type": self.apply_target_type,
"platform": "all",
"source_platform": 0,
"category_id": "",
"category_name": "",
"sub_type": "none",
"time_range": None,
"id": self.global_id
}
class VideoSegment(VisualSegment):
"""安放在轨道上的一个视频/图片片段"""
material_instance: VideoMaterial
"""素材实例"""
material_size: Tuple[int, int]
"""素材尺寸"""
fade: Optional[AudioFade]
"""音频淡入淡出效果, 可能为空
在放入轨道时自动添加到素材列表中
"""
effects: List[VideoEffect]
"""特效列表
在放入轨道时自动添加到素材列表中
"""
filters: List[Filter]
"""滤镜列表
在放入轨道时自动添加到素材列表中
"""
mix_modes: List[MixMode]
"""混合模式列表
在放入轨道时自动添加到素材列表中
"""
mask: Optional[Mask]
"""蒙版实例, 可能为空
在放入轨道时自动添加到素材列表中
"""
transition: Optional[Transition]
"""转场实例, 可能为空
在放入轨道时自动添加到素材列表中
"""
background_filling: Optional[BackgroundFilling]
"""背景填充实例, 可能为空
在放入轨道时自动添加到素材列表中
"""
def __init__(self, material: Union[VideoMaterial, str], target_timerange: Timerange, *,
source_timerange: Optional[Timerange] = None, speed: Optional[float] = None, volume: float = 1.0,
change_pitch: bool = False, clip_settings: Optional[ClipSettings] = None):
"""利用给定的视频/图片素材构建一个轨道片段, 并指定其时间信息及图像调节设置
Args:
material (`VideoMaterial` or `str`): 素材实例或素材路径, 若为路径则自动构造素材实例(此时不能指定`cropSettings`参数)
target_timerange (`Timerange`): 片段在轨道上的目标时间范围
source_timerange (`Timerange`, optional): 截取的素材片段的时间范围, 默认从开头根据`speed`截取与`target_timerange`等长的一部分
speed (`float`, optional): 播放速度, 默认为1.0. 此项与`source_timerange`同时指定时, 将覆盖`target_timerange`中的时长
volume (`float`, optional): 音量, 默认为1.0
change_pitch (`bool`, optional): 是否跟随变速改变音调, 默认为否
clip_settings (`ClipSettings`, optional): 图像调节设置, 默认不作任何变换
Raises:
`ValueError`: 指定的或计算出的`source_timerange`超出了素材的时长范围
"""
if isinstance(material, str):
material = VideoMaterial(material)
if source_timerange is not None and speed is not None:
target_timerange = Timerange(target_timerange.start, round(source_timerange.duration / speed))
elif source_timerange is not None and speed is None:
speed = source_timerange.duration / target_timerange.duration
else: # source_timerange is None
speed = speed if speed is not None else 1.0
source_timerange = Timerange(0, round(target_timerange.duration * speed))
if source_timerange.end > material.duration:
raise ValueError(f"截取的素材时间范围 {source_timerange} 超出了素材时长({material.duration})")
super().__init__(material.material_id, source_timerange, target_timerange, speed,
volume, change_pitch, clip_settings=clip_settings)
self.material_instance = deepcopy(material)
self.material_size = (material.width, material.height)
self.effects = []
self.filters = []
self.mix_modes = []
self.transition = None
self.mask = None
self.background_filling = None
self.fade = None
def add_animation(self, animation_type: Union[IntroType, OutroType, GroupAnimationType],
duration: Optional[Union[int, str]] = None) -> "VideoSegment":
"""将给定的入场/出场/组合动画添加到此片段的动画列表中
Args:
animation_type (`IntroType`, `OutroType`, or `GroupAnimationType`): 动画类型
duration (`int` or `str`, optional): 动画持续时间, 单位为微秒. 若传入字符串则会调用`tim()`函数进行解析.
若不指定则使用动画类型定义的默认值. 理论上只适用于入场和出场动画.
"""
if duration is not None:
duration = tim(duration)
if isinstance(animation_type, IntroType):
start = 0
duration = duration or animation_type.value.duration
elif isinstance(animation_type, OutroType):
duration = duration or animation_type.value.duration
start = self.target_timerange.duration - duration
elif isinstance(animation_type, GroupAnimationType):
start = 0
duration = duration or self.target_timerange.duration
else:
raise TypeError("Invalid animation type %s" % type(animation_type))
if self.animations_instance is None:
self.animations_instance = SegmentAnimations()
self.extra_material_refs.append(self.animations_instance.animation_id)
self.animations_instance.add_animation(VideoAnimation(animation_type, start, duration))
return self
def add_effect(self, effect_type: Union[VideoSceneEffectType, VideoCharacterEffectType],
params: Optional[List[Optional[float]]] = None) -> "VideoSegment":
"""为视频片段添加一个作用于整个片段的特效
Args:
effect_type (`VideoSceneEffectType` or `VideoCharacterEffectType`): 特效类型
params (`List[Optional[float]]`, optional): 特效参数列表, 参数列表中未提供或为None的项使用默认值.
参数取值范围(0~100)与剪映中一致. 某个特效类型有何参数以及具体参数顺序以枚举类成员的annotation为准.
Raises:
`ValueError`: 提供的参数数量超过了该特效类型的参数数量, 或参数值超出范围.
"""
if params is not None and len(params) > len(effect_type.value.params):
raise ValueError("为音频效果 %s 传入了过多的参数" % effect_type.value.name)
effect_inst = VideoEffect(effect_type, params)
self.effects.append(effect_inst)
self.extra_material_refs.append(effect_inst.global_id)
return self
def add_fade(self, in_duration: Union[str, int], out_duration: Union[str, int]) -> "VideoSegment":
"""为视频片段添加音频淡入淡出效果, 仅对有音轨的视频片段有效
Args:
in_duration (`int` or `str`): 音频淡入时长, 单位为微秒, 若为字符串则会调用`tim()`函数进行解析
out_duration (`int` or `str`): 音频淡出时长, 单位为微秒, 若为字符串则会调用`tim()`函数进行解析
Raises:
`ValueError`: 当前片段已存在淡入淡出效果
"""
if self.fade is not None:
raise ValueError("当前片段已存在淡入淡出效果")
if isinstance(in_duration, str): in_duration = tim(in_duration)
if isinstance(out_duration, str): out_duration = tim(out_duration)
self.fade = AudioFade(in_duration, out_duration)
self.extra_material_refs.append(self.fade.fade_id)
return self
def add_filter(self, filter_type: FilterType, intensity: float = 100.0) -> "VideoSegment":
"""为视频片段添加一个滤镜
Args:
filter_type (`FilterType`): 滤镜类型
intensity (`float`, optional): 滤镜强度(0-100), 仅当所选滤镜能够调节强度时有效. 默认为100.
"""
filter_inst = Filter(filter_type.value, intensity / 100.0) # 转化为0~1范围
self.filters.append(filter_inst)
self.extra_material_refs.append(filter_inst.global_id)
return self
def set_mix_mode(self, mode: MixModeType) -> "VideoSegment":
"""为视频片段设置混合模式
Args:
mode (`MixModeType`): 混合模式类型
"""
mix_mode_inst = MixMode(mode.value)
self.mix_modes.append(mix_mode_inst)
self.extra_material_refs.append(mix_mode_inst.global_id)
return self
def add_mask(self, mask_type: MaskType, *, center_x: float = 0.0, center_y: float = 0.0, size: float = 0.5,
rotation: float = 0.0, feather: float = 0.0, invert: bool = False,
rect_width: Optional[float] = None, round_corner: Optional[float] = None) -> "VideoSegment":
"""为视频片段添加蒙版
Args:
mask_type (`MaskType`): 蒙版类型
center_x (`float`, optional): 蒙版中心点X坐标(以素材的像素为单位), 默认设置在素材中心
center_y (`float`, optional): 蒙版中心点Y坐标(以素材的像素为单位), 默认设置在素材中心
size (`float`, optional): 蒙版的"主要尺寸"(镜面的可视部分高度/圆形直径/爱心高度等), 以占素材高度的比例表示, 默认为0.5
rotation (`float`, optional): 蒙版顺时针旋转的**角度**, 默认不旋转
feather (`float`, optional): 蒙版的羽化参数, 取值范围0~100, 默认无羽化
invert (`bool`, optional): 是否反转蒙版, 默认不反转
rect_width (`float`, optional): 矩形蒙版的宽度, 仅在蒙版类型为矩形时允许设置, 以占素材宽度的比例表示, 默认与`size`相同
round_corner (`float`, optional): 矩形蒙版的圆角参数, 仅在蒙版类型为矩形时允许设置, 取值范围0~100, 默认为0
Raises:
`ValueError`: 试图添加多个蒙版或不正确地设置了`rect_width`及`round_corner`
"""
if self.mask is not None:
raise ValueError("当前片段已有蒙版, 不能再添加新的蒙版")
if (rect_width is not None or round_corner is not None) and mask_type != MaskType.矩形:
raise ValueError("`rect_width` 以及 `round_corner` 仅在蒙版类型为矩形时允许设置")
if rect_width is None and mask_type == MaskType.矩形:
rect_width = size
if round_corner is None:
round_corner = 0
width = rect_width or size * self.material_size[1] * mask_type.value.default_aspect_ratio / self.material_size[0]
self.mask = Mask(mask_type.value, center_x / (self.material_size[0] / 2), center_y / (self.material_size[1] / 2),
w=width, h=size, ratio=mask_type.value.default_aspect_ratio,
rot=rotation, inv=invert, feather=feather/100, round_corner=round_corner/100)
self.extra_material_refs.append(self.mask.global_id)
return self
def add_transition(self, transition_type: TransitionType, *, duration: Optional[Union[int, str]] = None) -> "VideoSegment":
"""为视频片段添加转场, 注意转场应当添加在**前面的**片段上
Args:
transition_type (`TransitionType`): 转场类型
duration (`int` or `str`, optional): 转场持续时间, 单位为微秒. 若传入字符串则会调用`tim()`函数进行解析. 若不指定则使用转场类型定义的默认值.
Raises:
`ValueError`: 试图添加多个转场.
"""
if self.transition is not None:
raise ValueError("当前片段已有转场, 不能再添加新的转场")
if isinstance(duration, str): duration = tim(duration)
self.transition = Transition(transition_type, duration)
self.extra_material_refs.append(self.transition.global_id)
return self
def add_background_filling(self, fill_type: Literal["blur", "color"], blur: float = 0.0625, color: str = "#00000000") -> "VideoSegment":
"""为视频片段添加背景填充
注意: 背景填充仅对底层视频轨道上的片段生效
Args:
fill_type (`blur` or `color`): 填充类型, `blur`表示模糊, `color`表示颜色.
blur (`float`, optional): 模糊程度, 0.0-1.0. 仅在`fill_type`为`blur`时有效. 剪映中的四档模糊数值分别为0.0625, 0.375, 0.75和1.0, 默认为0.0625.
color (`str`, optional): 填充颜色, 格式为'#RRGGBBAA'. 仅在`fill_type`为`color`时有效.
Raises:
`ValueError`: 当前片段已有背景填充效果或`fill_type`无效.
"""
if self.background_filling is not None:
raise ValueError("当前片段已有背景填充效果")
if fill_type == "blur":
self.background_filling = BackgroundFilling("canvas_blur", blur, color)
elif fill_type == "color":
self.background_filling = BackgroundFilling("canvas_color", blur, color)
else:
raise ValueError(f"无效的背景填充类型 {fill_type}")
self.extra_material_refs.append(self.background_filling.global_id)
return self
def export_json(self) -> Dict[str, Any]:
json_dict = super().export_json()
json_dict.update({
"hdr_settings": {"intensity": 1.0, "mode": 1, "nits": 1000},
})
return json_dict
class StickerSegment(VisualSegment):
"""安放在轨道上的一个贴纸片段"""
resource_id: str
"""贴纸资源id"""
def __init__(self, resource_id: str, target_timerange: Timerange, *, clip_settings: Optional[ClipSettings] = None):
"""根据贴纸resource_id构建一个贴纸片段, 并指定其时间信息及图像调节设置
片段创建完成后, 可通过`ScriptFile.add_segment`方法将其添加到轨道中
Args:
resource_id (`str`): 贴纸resource_id, 可通过`ScriptFile.inspect_material`从模板中获取
target_timerange (`Timerange`): 片段在轨道上的目标时间范围
clip_settings (`ClipSettings`, optional): 图像调节设置, 默认不作任何变换
"""
super().__init__(uuid.uuid4().hex, None, target_timerange, 1.0, 1.0, False, clip_settings=clip_settings)
self.resource_id = resource_id
def export_material(self) -> Dict[str, Any]:
"""创建极简的贴纸素材对象, 以此不再单独定义贴纸素材类"""
return {
"id": self.material_id,
"resource_id": self.resource_id,
"sticker_id": self.resource_id,
"source_platform": 1,
"type": "sticker",
}
================================================
FILE: src/router/__init__.py
================================================
from .v1 import router as v1_router
__all__ = ["v1_router"]
================================================
FILE: src/router/v1.py
================================================
from src.schemas.gen_video import GenVideoResponse
from src.schemas.get_draft import GetDraftResponse
from src.schemas.add_videos import AddVideosResponse
from src.schemas.add_audios import AddAudiosResponse
from src.schemas.add_images import AddImagesResponse
from src.schemas.add_sticker import AddStickerResponse
from src.schemas.add_keyframes import AddKeyframesResponse
from src.schemas.add_captions import AddCaptionsResponse
from src.schemas.add_effects import AddEffectsResponse
from src.schemas.add_filters import AddFiltersResponse
from src.schemas.add_masks import AddMasksResponse
from src.schemas.add_text_style import AddTextStyleResponse
from src.schemas.get_text_animations import GetTextAnimationsResponse
from src.schemas.get_image_animations import GetImageAnimationsResponse
from src.schemas.easy_create_material import EasyCreateMaterialResponse
from src.schemas.save_draft import SaveDraftResponse
from src.schemas.create_draft import CreateDraftResponse
from fastapi import APIRouter, Request, Depends
import asyncio
from src.schemas.create_draft import CreateDraftRequest, CreateDraftResponse
from src.schemas.add_videos import AddVideosRequest, AddVideosResponse
from src.schemas.add_audios import AddAudiosRequest, AddAudiosResponse
from src.schemas.add_images import AddImagesRequest, AddImagesResponse
from src.schemas.add_sticker import AddStickerRequest, AddStickerResponse
from src.schemas.add_keyframes import AddKeyframesRequest, AddKeyframesResponse
from src.schemas.add_captions import AddCaptionsRequest, AddCaptionsResponse
from src.schemas.add_effects import AddEffectsRequest, AddEffectsResponse
from src.schemas.add_filters import AddFiltersRequest, AddFiltersResponse
from src.schemas.add_masks import AddMasksRequest, AddMasksResponse
from src.schemas.add_text_style import AddTextStyleRequest, AddTextStyleResponse
from src.schemas.get_text_animations import GetTextAnimationsRequest, GetTextAnimationsResponse
from src.schemas.get_image_animations import GetImageAnimationsRequest, GetImageAnimationsResponse
from src.schemas.easy_create_material import EasyCreateMaterialRequest, EasyCreateMaterialResponse
from src.schemas.save_draft import SaveDraftRequest, SaveDraftResponse
from src.schemas.gen_video import GenVideoRequest, GenVideoResponse
from src.schemas.gen_video_status import GenVideoStatusRequest, GenVideoStatusResponse
from src.schemas.gen_video_active_count import GenVideoActiveCountResponse
from src.schemas.get_draft import GetDraftRequest, GetDraftResponse
from src.schemas.get_audio_duration import GetAudioDurationRequest, GetAudioDurationResponse
from src.schemas.timelines import TimelinesRequest, TimelinesResponse
from src.schemas.audio_timelines import AudioTimelinesRequest, AudioTimelinesResponse
from src.schemas.audio_infos import AudioInfosRequest, AudioInfosResponse
from src.schemas.imgs_infos import ImgsInfosRequest, ImgsInfosResponse
from src.schemas.caption_infos import CaptionInfosRequest, CaptionInfosResponse
from src.schemas.effect_infos import EffectInfosRequest, EffectInfosResponse
from src.schemas.filter_infos import FilterInfosRequest, FilterInfosResponse
from src.schemas.get_filters import GetFiltersRequest, GetFiltersResponse
from src.schemas.get_text_effects import GetTextEffectsRequest, GetTextEffectsResponse
from src.schemas.get_effects import GetEffectsRequest, GetEffectsResponse
from src.schemas.keyframes_infos import KeyframesInfosRequest, KeyframesInfosResponse
from src.schemas.video_infos import VideoInfosRequest, VideoInfosResponse
from src.schemas.search_sticker import SearchStickerRequest, SearchStickerResponse
from src.schemas.get_url import GetUrlRequest, GetUrlResponse
from src.schemas.str_list_to_objs import StrListToObjsRequest, StrListToObjsResponse
from src.schemas.str_to_list import StrToListRequest, StrToListResponse
from src.schemas.objs_to_str_list import ObjsToStrListRequest, ObjsToStrListResponse
from src import service
from src.service.get_text_effects import get_text_effects as get_text_effects_service
from typing import Annotated
from src.utils.logger import logger
import config
router = APIRouter(prefix="/v1", tags=["v1"])
@router.post(path="/create_draft", response_model=CreateDraftResponse)
def create_draft(cdr: CreateDraftRequest) -> CreateDraftResponse:
"""
创建剪映草稿 (v1版本)
"""
# 调用service层处理业务逻辑
draft_url = service.create_draft(
width=cdr.width,
height=cdr.height
)
return CreateDraftResponse(draft_url=draft_url, tip_url=config.TIP_URL)
@router.post(path="/save_draft", response_model=SaveDraftResponse)
async def save_draft(sdr: SaveDraftRequest) -> SaveDraftResponse:
"""
保存剪映草稿 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url = await service.save_draft_async(
draft_url=sdr.draft_url,
lock_timeout=30.0 # 30 秒超时
)
return SaveDraftResponse(draft_url=draft_url)
@router.post(path="/add_videos", response_model=AddVideosResponse)
async def add_videos(avr: AddVideosRequest) -> AddVideosResponse:
"""
向剪映草稿添加视频 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, track_id, video_ids, segment_ids, segment_infos = await service.add_videos_async(
draft_url=avr.draft_url,
video_infos=avr.video_infos,
scene_timelines=[{"start": t.start, "end": t.end} for t in avr.scene_timelines] if avr.scene_timelines else None,
alpha=avr.alpha,
scale_x=avr.scale_x,
scale_y=avr.scale_y,
transform_x=avr.transform_x,
transform_y=avr.transform_y,
lock_timeout=30.0 # 30 秒超时
)
return AddVideosResponse(
draft_url=draft_url,
track_id=track_id,
video_ids=video_ids,
segment_ids=segment_ids,
segment_infos=segment_infos,
)
@router.post(path="/add_audios", response_model=AddAudiosResponse)
async def add_audios(aar: AddAudiosRequest) -> AddAudiosResponse:
"""
向剪映草稿批量添加音频 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, track_id, audio_ids = await service.add_audios_async(
draft_url=aar.draft_url,
audio_infos=aar.audio_infos,
lock_timeout=30.0 # 30 秒超时
)
return AddAudiosResponse(draft_url=draft_url, track_id=track_id, audio_ids=audio_ids)
@router.post(path="/add_images", response_model=AddImagesResponse)
async def add_images(air: AddImagesRequest) -> AddImagesResponse:
"""
向剪映草稿批量添加图片 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, track_id, image_ids, segment_ids, segment_infos = await service.add_images_async(
draft_url=air.draft_url,
image_infos=air.image_infos,
alpha=air.alpha,
scale_x=air.scale_x,
scale_y=air.scale_y,
transform_x=air.transform_x,
transform_y=air.transform_y,
lock_timeout=30.0 # 30 秒超时
)
return AddImagesResponse(
draft_url=draft_url,
track_id=track_id,
image_ids=image_ids,
segment_ids=segment_ids,
segment_infos=segment_infos
)
@router.post(path="/add_sticker", response_model=AddStickerResponse)
async def add_sticker(asr: AddStickerRequest) -> AddStickerResponse:
"""
向剪映草稿添加贴纸 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, sticker_id, track_id, segment_id, duration = await service.add_sticker_async(
draft_url=asr.draft_url,
sticker_id=asr.sticker_id,
start=asr.start,
end=asr.end,
scale=asr.scale,
transform_x=asr.transform_x,
transform_y=asr.transform_y,
lock_timeout=30.0 # 30 秒超时
)
return AddStickerResponse(
draft_url=draft_url,
sticker_id=sticker_id,
track_id=track_id,
segment_id=segment_id,
duration=duration
)
@router.post(path="/add_keyframes", response_model=AddKeyframesResponse)
async def add_keyframes(akr: AddKeyframesRequest) -> AddKeyframesResponse:
"""
向剪映草稿添加关键帧 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, keyframes_added, affected_segments = await service.add_keyframes_async(
draft_url=akr.draft_url,
keyframes=akr.keyframes,
lock_timeout=30.0 # 30 秒超时
)
return AddKeyframesResponse(
draft_url=draft_url,
keyframes_added=keyframes_added,
affected_segments=affected_segments
)
@router.post(path="/add_captions", response_model=AddCaptionsResponse)
async def add_captions(acr: AddCaptionsRequest) -> AddCaptionsResponse:
"""
向剪映草稿批量添加字幕 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 添加日志打印参数值
logger.info(f"add_captions request params: {acr.model_dump_json()}")
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, track_id, text_ids, segment_ids, segment_infos = await service.add_captions_async(
draft_url=acr.draft_url,
captions=acr.captions,
text_color=acr.text_color,
border_color=acr.border_color,
alignment=acr.alignment,
alpha=acr.alpha,
font=acr.font,
font_size=acr.font_size,
letter_spacing=acr.letter_spacing,
line_spacing=acr.line_spacing,
scale_x=acr.scale_x,
scale_y=acr.scale_y,
transform_x=acr.transform_x,
transform_y=acr.transform_y,
style_text=acr.style_text,
underline=acr.underline,
italic=acr.italic,
bold=acr.bold,
has_shadow=acr.has_shadow,
shadow_info=acr.shadow_info,
text_effect=acr.text_effect,
lock_timeout=30.0 # 30 秒超时
)
return AddCaptionsResponse(
draft_url=draft_url,
track_id=track_id,
text_ids=text_ids,
segment_ids=segment_ids,
segment_infos=segment_infos
)
@router.post(path="/add_effects", response_model=AddEffectsResponse)
async def add_effects(aer: AddEffectsRequest) -> AddEffectsResponse:
"""
向剪映草稿添加特效 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, track_id, effect_ids, segment_ids = await service.add_effects_async(
draft_url=aer.draft_url,
effect_infos=aer.effect_infos,
lock_timeout=30.0 # 30 秒超时
)
return AddEffectsResponse(
draft_url=draft_url,
track_id=track_id,
effect_ids=effect_ids,
segment_ids=segment_ids
)
@router.post(path="/add_filters", response_model=AddFiltersResponse)
async def add_filters(afr: AddFiltersRequest) -> AddFiltersResponse:
"""
向剪映草稿添加滤镜 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, track_id, filter_ids, segment_ids = await service.add_filters_async(
draft_url=afr.draft_url,
filter_infos=afr.filter_infos,
lock_timeout=30.0 # 30 秒超时
)
return AddFiltersResponse(
draft_url=draft_url,
track_id=track_id,
filter_ids=filter_ids,
segment_ids=segment_ids
)
@router.post(path="/add_masks", response_model=AddMasksResponse)
async def add_masks(amr: AddMasksRequest) -> AddMasksResponse:
"""
向剪映草稿添加遮罩 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url, masks_added, affected_segments, mask_ids = await service.add_masks_async(
draft_url=amr.draft_url,
segment_ids=amr.segment_ids,
name=amr.name,
X=amr.X,
Y=amr.Y,
width=amr.width,
height=amr.height,
feather=amr.feather,
rotation=amr.rotation,
invert=amr.invert,
roundCorner=amr.roundCorner,
lock_timeout=30.0 # 30 秒超时
)
return AddMasksResponse(
draft_url=draft_url,
masks_added=masks_added,
affected_segments=affected_segments,
mask_ids=mask_ids
)
@router.post(path="/add_text_style", response_model=AddTextStyleResponse)
def add_text_style(atsr: AddTextStyleRequest) -> AddTextStyleResponse:
"""
为文本创建富文本样式 (v1版本)
"""
# 调用service层处理业务逻辑
text_style = service.add_text_style(
text=atsr.text,
keyword=atsr.keyword,
font_size=atsr.font_size,
keyword_color=atsr.keyword_color,
keyword_font_size=atsr.keyword_font_size
)
return AddTextStyleResponse(
text_style=text_style
)
@router.post(path="/easy_create_material", response_model=EasyCreateMaterialResponse)
async def easy_create_material(ecmr: EasyCreateMaterialRequest) -> EasyCreateMaterialResponse:
"""
快速创建素材轨道 (v1 版本,带并发锁保护)
使用异步锁机制防止同一草稿的并发写操作导致文件损坏
"""
# 调用 service 层处理业务逻辑(异步版本,带锁保护)
draft_url = await service.easy_create_material_async(
draft_url=ecmr.draft_url,
audio_url=ecmr.audio_url,
text=ecmr.text,
img_url=ecmr.img_url,
video_url=ecmr.video_url,
text_color=ecmr.text_color,
font_size=ecmr.font_size,
text_transform_y=ecmr.text_transform_y,
lock_timeout=30.0 # 30 秒超时
)
return EasyCreateMaterialResponse(
draft_url=draft_url
)
@router.post(path="/get_text_animations", response_model=GetTextAnimationsResponse)
def get_text_animations(gtar: GetTextAnimationsRequest) -> GetTextAnimationsResponse:
"""
获取文字出入场动画 (v1版本)
"""
# 调用service层处理业务逻辑
effects = service.get_text_animations(
mode=gtar.mode,
type=gtar.type
)
# 直接返回对象数组,Pydantic会自动处理序列化
return GetTextAnimationsResponse(
effects=effects
)
@router.post(path="/get_image_animations", response_model=GetImageAnimationsResponse)
def get_image_animations(giar: GetImageAnimationsRequest) -> GetImageAnimationsResponse:
"""
获取图片出入场动画 (v1 版本)
"""
# 调用 service 层处理业务逻辑
effects = service.get_image_animations(
mode=giar.mode,
type=giar.type
)
# 直接返回对象数组,Pydantic 会自动处理序列化
return GetImageAnimationsResponse(
effects=effects
)
@router.post(path="/get_filters", response_model=GetFiltersResponse)
def get_filters(gfr: GetFiltersRequest) -> GetFiltersResponse:
"""
获取滤镜列表 (v1 版本)
"""
# 调用 service 层处理业务逻辑
filters = service.get_filters(
mode=gfr.mode
)
# 直接返回对象数组,Pydantic 会自动处理序列化
return GetFiltersResponse(
filters=filters
)
@router.post(path="/get_text_effects", response_model=GetTextEffectsResponse)
def get_text_effects(gter: GetTextEffectsRequest) -> GetTextEffectsResponse:
"""
获取花字效果列表 (v1 版本)
返回所有支持的花字效果,支持按 VIP/免费筛选
"""
# 调用 service 层处理业务逻辑
text_effects = get_text_effects_service(
mode=gter.mode
)
# 返回响应,由 middleware 统一添加 code 和 message
return GetTextEffectsResponse(
text_effects=text_effects
)
@router.post(path="/get_effects", response_model=GetEffectsResponse)
def get_effects(ger: GetEffectsRequest) -> GetEffectsResponse:
"""
获取特效列表 (v1 版本)
"""
# 调用 service 层处理业务逻辑
effects = service.get_effects(
mode=ger.mode
)
# 直接返回对象数组,Pydantic 会自动处理序列化
return GetEffectsResponse(
effects=effects
)
@router.get(path="/get_draft", response_model=GetDraftResponse)
def get_draft(params: Annotated[GetDraftRequest, Depends()]) -> GetDraftResponse:
"""
获取草稿 - 获取所有文件列表
"""
# 调用service层处理业务逻辑
files = service.get_draft(
draft_id=params.draft_id,
)
return GetDraftResponse(files=files)
# 生成视频 - 根据草稿URL,导出视频
@router.post(path="/gen_video", response_model=GenVideoResponse)
def gen_video(request: Request, gvr: GenVideoRequest) -> GenVideoResponse:
"""
生成视频 - 根据草稿URL,导出视频
"""
# 调用service层处理业务逻辑
message = service.gen_video(
draft_url=gvr.draft_url,
apiKey=gvr.apiKey
)
return GenVideoResponse(message=message)
@router.post(path="/gen_video_status", response_model=GenVideoStatusResponse)
def gen_video_status(gvsr: GenVideoStatusRequest) -> GenVideoStatusResponse:
"""
查询视频生成任务状态 (v1版本)
"""
# 调用service层处理业务逻辑
status_info = service.gen_video_status(
draft_url=gvsr.draft_url
)
return GenVideoStatusResponse(**status_info)
@router.get(path="/gen_video_active_count", response_model=GenVideoActiveCountResponse)
def gen_video_active_count() -> GenVideoActiveCountResponse:
"""
查询当前进行中的云渲染草稿数量(排队中 + 渲染中,不含已完成/失败)。
"""
count = service.get_gen_video_active_count()
return GenVideoActiveCountResponse(count=count)
@router.post(path="/get_audio_duration", response_model=GetAudioDurationResponse)
def get_audio_duration(gadr: GetAudioDurationRequest) -> GetAudioDurationResponse:
"""
获取音频文件时长 (v1版本)
"""
# 调用service层处理业务逻辑
duration = service.get_audio_duration(
mp3_url=gadr.mp3_url
)
return GetAudioDurationResponse(duration=duration)
@router.post(path="/timelines", response_model=TimelinesResponse)
def timelines(request: TimelinesRequest) -> TimelinesResponse:
"""
创建时间线 (v1版本)
"""
logger.info("Received request to calculate timelines")
# 调用service层处理业务逻辑
timelines, all_timelines = service.timelines(
duration=request.duration,
num=request.num,
start=request.start,
type=request.type
)
return TimelinesResponse(timelines=timelines, all_timelines=all_timelines)
@router.post(path="/audio_timelines", response_model=AudioTimelinesResponse)
def audio_timelines(request: AudioTimelinesRequest) -> AudioTimelinesResponse:
"""
根据音频文件时长计算时间线 (v1版本)
"""
logger.info("Received request to calculate audio timelines")
# 调用service层处理业务逻辑
timelines, all_timelines = service.audio_timelines(
links=request.links
)
return AudioTimelinesResponse(timelines=timelines, all_timelines=all_timelines)
@router.post(path="/audio_infos", response_model=AudioInfosResponse)
def audio_infos(request: AudioInfosRequest) -> AudioInfosResponse:
"""
根据音频URL和时间线生成音频信息 (v1版本)
"""
logger.info("Received request to generate audio infos")
# 调用service层处理业务逻辑
infos_json = service.audio_infos(
mp3_urls=request.mp3_urls,
timelines=[{"start": t.start, "end": t.end} for t in request.timelines],
audio_effect=request.audio_effect,
volume=request.volume
)
return AudioInfosResponse(infos=infos_json)
@router.post(path="/imgs_infos", response_model=ImgsInfosResponse)
def imgs_infos(request: ImgsInfosRequest) -> ImgsInfosResponse:
"""
根据图片URL和时间线生成图片信息 (v1版本)
"""
logger.info("Received request to generate image infos")
# 调用service层处理业务逻辑
infos_json = service.imgs_infos(
imgs=request.imgs,
timelines=[{"start": t.start, "end": t.end} for t in request.timelines],
height=request.height,
width=request.width,
in_animation=request.in_animation,
in_animation_duration=request.in_animation_duration,
loop_animation=request.loop_animation,
loop_animation_duration=request.loop_animation_duration,
out_animation=request.out_animation,
out_animation_duration=request.out_animation_duration,
transition=request.transition,
transition_duration=request.transition_duration
)
return ImgsInfosResponse(infos=infos_json)
@router.post(path="/caption_infos", response_model=CaptionInfosResponse)
def caption_infos(request: CaptionInfosRequest) -> CaptionInfosResponse:
"""
根据文本和时间线生成字幕信息 (v1版本)
"""
logger.info("Received request to generate caption infos")
# 调用service层处理业务逻辑
infos_json = service.caption_infos(
texts=request.texts,
timelines=[{"start": t.start, "end": t.end} for t in request.timelines],
font_size=request.font_size,
keyword_color=request.keyword_color,
keyword_border_color=request.keyword_border_color,
keyword_font_size=request.keyword_font_size,
keywords=request.keywords,
in_animation=request.in_animation,
in_animation_duration=request.in_animation_duration,
loop_animation=request.loop_animation,
loop_animation_duration=request.loop_animation_duration,
out_animation=request.out_animation,
out_animation_duration=request.out_animation_duration,
transition=request.transition,
transition_duration=request.transition_duration
)
return CaptionInfosResponse(infos=infos_json)
@router.post(path="/effect_infos", response_model=EffectInfosResponse)
def effect_infos(request: EffectInfosRequest) -> EffectInfosResponse:
"""
根据特效名称和时间线生成特效信息 (v1版本)
"""
logger.info("Received request to generate effect infos")
# 调用service层处理业务逻辑
infos_json = service.effect_infos(
effects=request.effects,
timelines=[{"start": t.start, "end": t.end} for t in request.timelines]
)
return EffectInfosResponse(infos=infos_json)
@router.post(path="/filter_infos", response_model=FilterInfosResponse)
def filter_infos(request: FilterInfosRequest) -> FilterInfosResponse:
"""
根据滤镜名称、时间线和强度生成滤镜信息 (v1版本)
"""
logger.info("Received request to generate filter infos")
# 调用service层处理业务逻辑
infos_json = service.filter_infos(
filters=request.filters,
timelines=[{"start": t.start, "end": t.end} for t in request.timelines],
intensities=request.intensities
)
return FilterInfosResponse(infos=infos_json)
@router.post(path="/keyframes_infos", response_model=KeyframesInfosResponse)
def keyframes_infos(request: KeyframesInfosRequest) -> KeyframesInfosResponse:
"""
根据关键帧类型、位置比例和值生成关键帧信息 (v1版本)
"""
logger.info("Received request to generate keyframes infos")
# 调用service层处理业务逻辑
keyframes_json = service.keyframes_infos(
ctype=request.ctype,
offsets=request.offsets,
values=request.values,
segment_infos=[{"id": s.id, "start": s.start, "end": s.end} for s in request.segment_infos],
height=request.height,
width=request.width
)
return KeyframesInfosResponse(keyframes_infos=keyframes_json)
@router.post(path="/video_infos", response_model=VideoInfosResponse)
def video_infos(request: VideoInfosRequest) -> VideoInfosResponse:
"""
根据视频URL和时间线生成视频信息 (v1版本)
"""
logger.info("Received request to generate video infos")
# 调用service层处理业务逻辑
infos_json = service.video_infos(
video_urls=request.video_urls,
timelines=[{"start": t.start, "end": t.end} for t in request.timelines],
height=request.height,
width=request.width,
mask=request.mask,
transition=request.transition,
transition_duration=request.transition_duration,
volume=request.volume
)
return VideoInfosResponse(infos=infos_json)
@router.post(path="/search_sticker", response_model=SearchStickerResponse)
def search_sticker(ssr: SearchStickerRequest) -> SearchStickerResponse:
"""
搜索贴纸 (v1版本)
"""
# 调用service层处理业务逻辑
data = service.search_sticker(
keyword=ssr.keyword
)
return SearchStickerResponse(data=data)
@router.post(path="/get_url", response_model=GetUrlResponse)
def get_url(gur: GetUrlRequest) -> GetUrlResponse:
"""
提取链接 (v1版本)
"""
# 调用service层处理业务逻辑
output = service.get_url(
output=gur.output
)
return GetUrlResponse(output=output)
@router.post(path="/str_list_to_objs", response_model=StrListToObjsResponse)
def str_list_to_objs(slto: StrListToObjsRequest) -> StrListToObjsResponse:
"""
字符串列表转化成对象列表 (v1版本)
"""
# 调用service层处理业务逻辑
infos = service.str_list_to_objs(
infos=slto.infos
)
return StrListToObjsResponse(infos=infos)
@router.post(path="/str_to_list", response_model=StrToListResponse)
def str_to_list(stl: StrToListRequest) -> StrToListResponse:
"""
字符转列表 (v1版本)
"""
# 调用service层处理业务逻辑
infos = service.str_to_list(
obj=stl.obj
)
return StrToListResponse(infos=infos)
@router.post(path="/objs_to_str_list", response_model=ObjsToStrListResponse)
def objs_to_str_list(otl: ObjsToStrListRequest) -> ObjsToStrListResponse:
"""
对象列表转化成字符串列表 (v1版本)
"""
# 调用service层处理业务逻辑
infos = service.objs_to_str_list(
outputs=[obj.dict() for obj in otl.outputs]
)
return ObjsToStrListResponse(infos=infos)
================================================
FILE: src/schemas/__init__.py
================================================
from .create_draft import CreateDraftRequest, CreateDraftResponse
from .add_videos import AddVideosRequest, AddVideosResponse
from .gen_video import GenVideoRequest, GenVideoResponse
from .save_draft import SaveDraftRequest, SaveDraftResponse
from .get_draft import GetDraftRequest, GetDraftResponse
from .get_audio_duration import GetAudioDurationRequest, GetAudioDurationResponse
__all__ = [
"CreateDraftRequest",
"CreateDraftResponse",
"AddVideosRequest",
"AddVideosResponse",
"GenVideoRequest",
"GenVideoResponse",
"SaveDraftRequest",
"SaveDraftResponse",
"GetDraftRequest",
"GetDraftResponse",
"GetAudioDurationRequest",
"GetAudioDurationResponse"
]
================================================
FILE: src/schemas/add_audios.py
================================================
import json
from pydantic import BaseModel, Field, field_validator
from typing import List
class AddAudiosRequest(BaseModel):
"""批量添加音频请求参数"""
draft_url: str = Field(..., description="草稿URL")
audio_infos: str = Field(..., description="音频信息列表, 用JSON字符串表示")
@field_validator("audio_infos")
@classmethod
def validate_audio_infos_http_urls(cls, value: str) -> str:
"""在 schema 层校验 audio_url 必须为 http/https。"""
try:
data = json.loads(value)
except json.JSONDecodeError as exc:
raise ValueError(f"audio_infos JSON parse error: {exc.msg}") from exc
if not isinstance(data, list):
raise ValueError("audio_infos should be a list")
for idx, item in enumerate(data):
if not isinstance(item, dict):
raise ValueError(f"audio_infos[{idx}] should be an object")
audio_url = item.get("audio_url")
if not isinstance(audio_url, str) or not audio_url.startswith(("http://", "https://")):
raise ValueError(f"audio_infos[{idx}].audio_url must start with http:// or https://")
return value
class AddAudiosResponse(BaseModel):
"""添加音频响应参数"""
draft_url: str = Field(default="", description="草稿URL")
track_id: str = Field(default="", description="音频轨道ID")
audio_ids: List[str] = Field(default=[], description="音频ID列表")
================================================
FILE: src/schemas/add_captions.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class ShadowInfo(BaseModel):
"""文本阴影参数"""
shadow_alpha: float = Field(default=1.0, ge=0.0, le=1.0, description="阴影不透明度, 取值范围为[0, 1]")
shadow_color: str = Field(default="#000000", description="阴影颜色(十六进制)")
shadow_diffuse: float = Field(default=15.0, ge=0.0, le=100.0, description="阴影扩散程度, 取值范围为[0, 100]")
shadow_distance: float = Field(default=5.0, ge=0.0, le=100.0, description="阴影距离, 取值范围为[0, 100]")
shadow_angle: float = Field(default=-45.0, ge=-180.0, le=180.0, description="阴影角度, 取值范围为[-180, 180]")
class AddCaptionsRequest(BaseModel):
"""批量添加字幕请求参数"""
draft_url: str = Field(default="", description="草稿URL")
captions: str = Field(default="", description="字幕信息列表, 用JSON字符串表示")
text_color: str = Field(default="#ffffff", description="文本颜色(十六进制)")
border_color: Optional[str] = Field(default=None, description="边框颜色(十六进制)")
alignment: int = Field(default=1, ge=0, le=5, description="文本对齐方式(0-5)")
alpha: float = Field(default=1.0, ge=0.0, le=1.0, description="文本透明度(0.0-1.0)")
font: Optional[str] = Field(default=None, description="字体名称")
font_size: int = Field(default=15, ge=1, description="字体大小")
letter_spacing: Optional[float] = Field(default=None, description="字间距")
line_spacing: Optional[float] = Field(default=None, description="行间距")
scale_x: float = Field(default=1.0, description="水平缩放")
scale_y: float = Field(default=1.0, description="垂直缩放")
transform_x: float = Field(default=0.0, description="水平位移")
transform_y: float = Field(default=0.0, description="垂直位移")
style_text: bool = Field(default=False, description="是否使用样式文本")
underline: bool = Field(default=False, description="文字下划线开关")
italic: bool = Field(default=False, description="文本斜体开关")
bold: bool = Field(default=False, description="文本加粗开关")
has_shadow: bool = Field(default=False, description="是否启用文本阴影")
shadow_info: Optional[ShadowInfo] = Field(default=None, description="文本阴影参数")
text_effect: Optional[str] = Field(default=None, description="花字效果名称或 effect_id,例如:'白字橘色发光花字'")
class CaptionItem(BaseModel):
"""单个字幕信息"""
start: int = Field(..., description="字幕开始时间(微秒)")
end: int = Field(..., description="字幕结束时间(微秒)")
text: str = Field(..., description="字幕文本内容")
keyword: Optional[str] = Field(default=None, description="关键词(用|分隔多个关键词)")
keyword_color: str = Field(default="#ff7100", description="关键词颜色")
keyword_border_color: Optional[str] = Field(default=None, description="关键词边框颜色")
keyword_font_size: int = Field(default=15, ge=1, description="关键词字体大小")
font_size: int = Field(default=15, ge=1, description="文本字体大小")
in_animation: Optional[str] = Field(default=None, description="入场动画")
out_animation: Optional[str] = Field(default=None, description="出场动画")
loop_animation: Optional[str] = Field(default=None, description="循环动画")
in_animation_duration: Optional[int] = Field(default=None, description="入场动画时长")
out_animation_duration: Optional[int] = Field(default=None, description="出场动画时长")
loop_animation_duration: Optional[int] = Field(
default=None,
description="循环动画单次循环时长(微秒),与 get_text_animations 中 loop 的 duration 一致;不填则用该动画默认值",
)
text_effect: Optional[str] = Field(default=None, description="花字效果名称或 effect_id,例如:'白字橘色发光花字'")
class SegmentInfo(BaseModel):
"""片段信息"""
id: str = Field(..., description="片段ID")
start: int = Field(..., description="片段开始时间(微秒)")
end: int = Field(..., description="片段结束时间(微秒)")
class AddCaptionsResponse(BaseModel):
"""添加字幕响应参数"""
draft_url: str = Field(default="", description="草稿URL")
track_id: str = Field(default="", description="字幕轨道ID")
text_ids: List[str] = Field(default=[], description="字幕ID列表")
segment_ids: List[str] = Field(default=[], description="字幕片段ID列表")
segment_infos: List[SegmentInfo] = Field(default=[], description="片段信息列表")
================================================
FILE: src/schemas/add_effects.py
================================================
from pydantic import BaseModel, Field
from typing import List
class AddEffectsRequest(BaseModel):
"""添加特效请求参数"""
draft_url: str = Field(default="", description="草稿URL")
effect_infos: str = Field(default="", description="特效信息列表, 用JSON字符串表示")
class EffectItem(BaseModel):
"""单个特效信息"""
effect_title: str = Field(..., description="特效名称/标题")
start: int = Field(..., description="特效开始时间(微秒)")
end: int = Field(..., description="特效结束时间(微秒)")
class AddEffectsResponse(BaseModel):
"""添加特效响应参数"""
draft_url: str = Field(default="", description="草稿URL")
track_id: str = Field(default="", description="特效轨道ID")
effect_ids: List[str] = Field(default=[], description="特效ID列表")
segment_ids: List[str] = Field(default=[], description="特效片段ID列表")
================================================
FILE: src/schemas/add_filters.py
================================================
from pydantic import BaseModel, Field
from typing import List
class AddFiltersRequest(BaseModel):
"""添加滤镜请求参数"""
draft_url: str = Field(default="", description="草稿URL")
filter_infos: str = Field(default="", description="滤镜信息列表, 用JSON字符串表示")
class FilterItem(BaseModel):
"""单个滤镜信息"""
filter_title: str = Field(..., description="滤镜名称/标题")
start: int = Field(..., description="滤镜开始时间(微秒)")
end: int = Field(..., description="滤镜结束时间(微秒)")
intensity: float = Field(default=100.0, ge=0, le=100, description="滤镜强度(0-100)")
class AddFiltersResponse(BaseModel):
"""添加滤镜响应参数"""
draft_url: str = Field(default="", description="草稿URL")
track_id: str = Field(default="", description="滤镜轨道ID")
filter_ids: List[str] = Field(default=[], description="滤镜ID列表")
segment_ids: List[str] = Field(default=[], description="滤镜片段ID列表")
================================================
FILE: src/schemas/add_images.py
================================================
import json
from pydantic import BaseModel, Field, field_validator
from typing import List, Dict, Any
class AddImagesRequest(BaseModel):
"""批量添加图片请求参数"""
draft_url: str = Field(..., description="草稿URL")
image_infos: str = Field(..., description="图片信息列表, 用JSON字符串表示")
alpha: float = Field(default=1.0, description="全局透明度[0, 1]")
scale_x: float = Field(default=1.0, description="X轴缩放比例")
scale_y: float = Field(default=1.0, description="Y轴缩放比例")
transform_x: int = Field(default=0, description="X轴位置偏移(像素)")
transform_y: int = Field(default=0, description="Y轴位置偏移(像素)")
@field_validator("image_infos")
@classmethod
def validate_image_infos_http_urls(cls, value: str) -> str:
"""在 schema 层校验 image_url 必须为 http/https。"""
try:
data = json.loads(value)
except json.JSONDecodeError as exc:
raise ValueError(f"image_infos JSON parse error: {exc.msg}") from exc
if not isinstance(data, list):
raise ValueError("image_infos should be a list")
for idx, item in enumerate(data):
if not isinstance(item, dict):
raise ValueError(f"image_infos[{idx}] should be an object")
image_url = item.get("image_url")
if not isinstance(image_url, str) or not image_url.startswith(("http://", "https://")):
raise ValueError(f"image_infos[{idx}].image_url must start with http:// or https://")
return value
class SegmentInfo(BaseModel):
"""片段信息"""
id: str = Field(..., description="片段ID")
start: int = Field(..., description="开始时间(微秒)")
end: int = Field(..., description="结束时间(微秒)")
class AddImagesResponse(BaseModel):
"""添加图片响应参数"""
draft_url: str = Field(default="", description="草稿URL")
track_id: str = Field(default="", description="视频轨道ID")
image_ids: List[str] = Field(default=[], description="图片ID列表")
segment_ids: List[str] = Field(default=[], description="片段ID列表")
segment_infos: List[SegmentInfo] = Field(default=[], description="片段信息列表")
================================================
FILE: src/schemas/add_keyframes.py
================================================
from pydantic import BaseModel, Field
from typing import List
class AddKeyframesRequest(BaseModel):
"""添加关键帧请求参数"""
draft_url: str = Field(default="", description="草稿URL")
keyframes: str = Field(default="", description="关键帧信息列表, 用JSON字符串表示")
class KeyframeItem(BaseModel):
"""单个关键帧信息"""
segment_id: str = Field(..., description="目标片段的唯一标识ID")
property: str = Field(..., description="动画属性类型 (KFTypePositionX, KFTypePositionY, KFTypeScaleX, KFTypeScaleY, KFTypeRotation, KFTypeAlpha)")
offset: float = Field(..., ge=0.0, le=1.0, description="关键帧在片段中的时间偏移 (0-1范围)")
value: float = Field(..., description="属性在该时间点的值")
class AddKeyframesResponse(BaseModel):
"""添加关键帧响应参数"""
draft_url: str = Field(default="", description="草稿URL")
keyframes_added: int = Field(default=0, description="添加的关键帧数量")
affected_segments: List[str] = Field(default=[], description="受影响的片段ID列表")
================================================
FILE: src/schemas/add_masks.py
================================================
from pydantic import BaseModel, Field
from typing import List
class AddMasksRequest(BaseModel):
"""添加遮罩请求参数"""
draft_url: str = Field(default="", description="草稿URL")
segment_ids: List[str] = Field(default=[], description="要应用遮罩的片段ID数组")
name: str = Field(default="线性", description="遮罩类型名称")
X: int = Field(default=0, description="遮罩中心X坐标(像素)")
Y: int = Field(default=0, description="遮罩中心Y坐标(像素)")
width: int = Field(default=512, description="遮罩宽度(像素)")
height: int = Field(default=512, description="遮罩高度(像素)")
feather: int = Field(default=0, description="羽化程度(0-100)")
rotation: int = Field(default=0, description="旋转角度(度)")
invert: bool = Field(default=False, description="是否反转遮罩")
roundCorner: int = Field(default=0, description="圆角半径(0-100)")
class AddMasksResponse(BaseModel):
"""添加遮罩响应参数"""
draft_url: str = Field(default="", description="草稿URL")
masks_added: int = Field(default=0, description="成功添加的遮罩数量")
affected_segments: List[str] = Field(default=[], description="受影响的片段ID列表")
mask_ids: List[str] = Field(default=[], description="遮罩ID列表")
================================================
FILE: src/schemas/add_sticker.py
================================================
from pydantic import BaseModel, Field
from typing import List
class AddStickerRequest(BaseModel):
"""添加贴纸请求参数"""
draft_url: str = Field(..., description="草稿URL")
sticker_id: str = Field(..., description="贴纸的唯一标识ID")
start: int = Field(..., description="贴纸开始时间(微秒)")
end: int = Field(..., description="贴纸结束时间(微秒)")
scale: float = Field(default=1.0, description="贴纸缩放比例,建议范围[0.1, 5.0]")
transform_x: int = Field(default=0, description="X轴位置偏移(像素),以画布中心为原点")
transform_y: int = Field(default=0, description="Y轴位置偏移(像素),以画布中心为原点")
class AddStickerResponse(BaseModel):
"""添加贴纸响应参数"""
draft_url: str = Field(default="", description="草稿URL")
sticker_id: str = Field(default="", description="贴纸的唯一标识ID")
track_id: str = Field(default="", description="轨道ID")
segment_id: str = Field(default="", description="片段ID")
duration: int = Field(default=0, description="贴纸显示时长(微秒)")
================================================
FILE: src/schemas/add_text_style.py
================================================
from pydantic import BaseModel, Field
class AddTextStyleRequest(BaseModel):
"""创建文本富文本样式请求参数"""
text: str = Field(..., description="要处理的文本内容")
keyword: str = Field(..., description="关键词,多个用 | 分隔")
font_size: int = Field(default=12, description="普通文本的字体大小")
keyword_color: str = Field(default="#ff7100", description="关键词文本颜色(十六进制)")
keyword_font_size: int = Field(default=15, description="关键词字体大小")
class AddTextStyleResponse(BaseModel):
"""创建文本富文本样式响应参数"""
text_style: str = Field(default="", description="文本样式JSON字符串")
================================================
FILE: src/schemas/add_videos.py
================================================
import json
from pydantic import BaseModel, Field, field_validator
from typing import List, Optional
class SceneTimelineItem(BaseModel):
"""场景时间线项"""
start: int = Field(..., description="场景开始时间(微秒)")
end: int = Field(..., description="场景结束时间(微秒)")
class AddVideosRequest(BaseModel):
"""批量添加视频请求参数"""
draft_url: str = Field(default="", description="草稿URL")
video_infos: str = Field(default="", description="视频信息列表, 用JSON字符串表示")
scene_timelines: Optional[List[SceneTimelineItem]] = Field(default=None, description="场景时间线列表,用于视频变速")
alpha: float = Field(default=1.0, description="全局透明度[0, 1]")
scale_x: float = Field(default=1.0, description="X轴缩放比例, 建议范围[0.1, 5.0]")
scale_y: float = Field(default=1.0, description="Y轴缩放比例, 建议范围[0.1, 5.0]")
transform_x: int = Field(default=0, description="X轴位置偏移(像素)")
transform_y: int = Field(default=0, description="Y轴位置偏移(像素)")
@field_validator("video_infos")
@classmethod
def validate_video_infos_http_urls(cls, value: str) -> str:
"""在 schema 层校验 video_url 必须为 http/https。"""
try:
data = json.loads(value)
except json.JSONDecodeError as exc:
raise ValueError(f"video_infos JSON parse error: {exc.msg}") from exc
if not isinstance(data, list):
raise ValueError("video_infos should be a list")
for idx, item in enumerate(data):
if not isinstance(item, dict):
raise ValueError(f"video_infos[{idx}] should be an object")
video_url = item.get("video_url")
if not isinstance(video_url, str) or not video_url.startswith(("http://", "https://")):
raise ValueError(f"video_infos[{idx}].video_url must start with http:// or https://")
return value
class SegmentInfo(BaseModel):
"""片段信息"""
id: str = Field(..., description="片段ID")
start: int = Field(..., description="开始时间(微秒)")
end: int = Field(..., description="结束时间(微秒)")
class AddVideosResponse(BaseModel):
"""添加视频响应参数"""
draft_url: str = Field(default="", description="草稿URL")
track_id: str = Field(default="", description="轨道ID")
video_ids: List[str] = Field(default=[], description="视频ID列表")
segment_ids: List[str] = Field(default=[], description="片段ID列表")
segment_infos: List[SegmentInfo] = Field(default=[], description="片段信息列表")
================================================
FILE: src/schemas/audio_infos.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional, Any
from .audio_timelines import TimelineItem
class AudioInfosRequest(BaseModel):
"""音频信息请求参数"""
mp3_urls: List[str] = Field(..., description="音频文件URL数组")
timelines: List[TimelineItem] = Field(..., description="时间线数组")
audio_effect: Optional[str] = Field(None, description="音频效果")
volume: Optional[float] = Field(None, description="音量")
class AudioInfosResponse(BaseModel):
"""音频信息响应参数"""
infos: str = Field(..., description="JSON字符串格式的音频信息")
================================================
FILE: src/schemas/audio_timelines.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class AudioTimelinesRequest(BaseModel):
"""音频时间线请求参数"""
links: List[str] = Field(..., description="音频文件URL数组")
class TimelineItem(BaseModel):
"""时间线项"""
start: int = Field(..., description="开始时间(微秒)")
end: int = Field(..., description="结束时间(微秒)")
class AudioTimelinesResponse(BaseModel):
"""音频时间线响应参数"""
timelines: List[TimelineItem] = Field(..., description="分割后的时间线列表")
all_timelines: List[TimelineItem] = Field(..., description="完整的时间线列表")
================================================
FILE: src/schemas/caption_infos.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
from .audio_timelines import TimelineItem
class CaptionInfosRequest(BaseModel):
"""字幕信息请求参数"""
texts: List[str] = Field(..., description="文本列表")
timelines: List[TimelineItem] = Field(..., description="时间线数组")
font_size: Optional[int] = Field(None, description="字体大小")
keyword_color: Optional[str] = Field(None, description="关键词颜色")
keyword_border_color: Optional[str] = Field(None, description="关键词边框颜色")
keyword_font_size: Optional[int] = Field(None, description="关键词字体大小")
keywords: Optional[List[str]] = Field(None, description="文本里面的重点词列表")
in_animation: Optional[str] = Field(None, description="入场动画名称")
in_animation_duration: Optional[int] = Field(None, description="入场动画时长")
loop_animation: Optional[str] = Field(None, description="组合动画名称")
loop_animation_duration: Optional[int] = Field(
None, description="循环动画单次循环时长(微秒),与 get_text_animations 中 loop 的 duration 一致"
)
out_animation: Optional[str] = Field(None, description="出场动画名称")
out_animation_duration: Optional[int] = Field(None, description="出场动画时长")
transition: Optional[str] = Field(None, description="转场名称")
transition_duration: Optional[int] = Field(None, description="转场时长")
class CaptionInfosResponse(BaseModel):
"""字幕信息响应参数"""
infos: str = Field(..., description="JSON字符串格式的字幕信息")
================================================
FILE: src/schemas/create_draft.py
================================================
from pydantic import BaseModel, Field
class CreateDraftRequest(BaseModel):
"""创建草稿请求参数"""
height: int = Field(default=1080, ge=1, description="视频高度")
width: int = Field(default=1920, ge=1, description="视频宽度")
class CreateDraftResponse(BaseModel):
"""创建草稿响应参数"""
draft_url: str = Field(default="", description="草稿URL")
tip_url: str = Field(default="", description="草稿提示URL,获取帮助文档")
================================================
FILE: src/schemas/easy_create_material.py
================================================
from pydantic import BaseModel, Field, field_validator
from typing import Optional
class EasyCreateMaterialRequest(BaseModel):
"""快速创建素材轨道请求参数"""
draft_url: str = Field(..., description="目标草稿的完整URL")
audio_url: str = Field(..., description="音频文件URL,不能为空或null")
text: Optional[str] = Field(default=None, description="要添加的文字内容")
img_url: Optional[str] = Field(default=None, description="图片文件URL")
video_url: Optional[str] = Field(default=None, description="视频文件URL")
text_color: str = Field(default="#ffffff", description="文字颜色(十六进制格式)")
font_size: int = Field(default=15, description="字体大小")
text_transform_y: int = Field(default=0, description="文字Y轴位置偏移")
@staticmethod
def _is_http_url(url: str) -> bool:
return isinstance(url, str) and url.startswith(("http://", "https://"))
@field_validator("audio_url")
@classmethod
def validate_audio_url(cls, value: str) -> str:
"""音频 URL 必须为 http/https。"""
if not cls._is_http_url(value):
raise ValueError("audio_url must start with http:// or https://")
return value
@field_validator("img_url", "video_url")
@classmethod
def validate_optional_media_url(cls, value: Optional[str]) -> Optional[str]:
"""可选图片/视频 URL 如有传值,必须为 http/https。"""
if value is None:
return value
if not cls._is_http_url(value):
raise ValueError("optional media URL must start with http:// or https://")
return value
class EasyCreateMaterialResponse(BaseModel):
"""快速创建素材轨道响应参数"""
draft_url: str = Field(default="", description="草稿URL")
================================================
FILE: src/schemas/effect_infos.py
================================================
from pydantic import BaseModel, Field
from typing import List
from .audio_timelines import TimelineItem
class EffectInfosRequest(BaseModel):
"""特效信息请求参数"""
effects: List[str] = Field(..., description="特效名称列表")
timelines: List[TimelineItem] = Field(..., description="时间线数组")
class EffectInfosResponse(BaseModel):
"""特效信息响应参数"""
infos: str = Field(..., description="JSON字符串格式的特效信息")
================================================
FILE: src/schemas/filter_infos.py
================================================
from pydantic import BaseModel, Field, field_validator
from typing import List, Optional
from .audio_timelines import TimelineItem
class FilterInfosRequest(BaseModel):
"""滤镜信息请求参数"""
filters: List[str] = Field(..., description="滤镜名称列表")
timelines: List[TimelineItem] = Field(..., description="时间线数组")
intensities: Optional[List[float]] = Field(default=None, description="滤镜强度列表(0-100),可选")
@field_validator('intensities', mode='before')
@classmethod
def validate_intensities(cls, v):
"""验证并限制 intensities 数组中的每个值在 0-100 范围内"""
if v is None:
return v
return [max(0, min(100, val)) for val in v]
class FilterInfosResponse(BaseModel):
"""滤镜信息响应参数"""
infos: str = Field(..., description="JSON字符串格式的滤镜信息")
================================================
FILE: src/schemas/gen_video.py
================================================
import uuid
from pydantic import BaseModel, Field
from pydantic.functional_validators import field_validator
from typing import Optional
class GenVideoRequest(BaseModel):
"""根据草稿导出视频"""
draft_url: str = Field(default="", description="草稿URL")
apiKey: Optional[str] = Field(default=None, description="apiKey必须是合法的UUID格式")
@field_validator('apiKey')
@classmethod
def validate_api_key(cls, v):
if v is None or v == "":
return None
try:
uuid.UUID(v)
except ValueError:
raise ValueError('API密钥格式不正确,必须是合法的UUID')
return v
class GenVideoResponse(BaseModel):
"""生成视频响应参数"""
message: str = Field(..., description="响应消息")
================================================
FILE: src/schemas/gen_video_active_count.py
================================================
"""云渲染进行中数量查询"""
from pydantic import BaseModel, Field
class GenVideoActiveCountResponse(BaseModel):
"""当前排队与渲染中的云渲染草稿数量"""
count: int = Field(..., description="排队中(pending)与渲染中(processing)的草稿数量,不含已完成/失败")
================================================
FILE: src/schemas/gen_video_status.py
================================================
"""
视频生成状态查询的数据模型定义
"""
from typing import Optional
from pydantic import BaseModel, Field
class GenVideoStatusRequest(BaseModel):
"""查询视频生成状态的请求模型"""
draft_url: str = Field(..., description="草稿URL")
class GenVideoStatusResponse(BaseModel):
"""查询视频生成状态的响应模型"""
draft_url: str = Field(..., description="草稿URL")
status: str = Field(..., description="任务状态:pending=等待中,processing=处理中,completed=已完成,failed=失败")
progress: int = Field(..., description="任务进度(0-100)")
video_url: str = Field(default="", description="生成的视频URL(仅在completed状态时有值)")
error_message: str = Field(default="", description="错误信息(仅在failed状态时有值)")
created_at: Optional[str] = Field(default=None, description="任务创建时间")
started_at: Optional[str] = Field(default=None, description="任务开始时间")
completed_at: Optional[str] = Field(default=None, description="任务完成时间")
================================================
FILE: src/schemas/get_audio_duration.py
================================================
from pydantic import BaseModel, Field, HttpUrl
class GetAudioDurationRequest(BaseModel):
"""获取音频时长请求参数"""
mp3_url: HttpUrl = Field(
...,
description="音频文件URL,支持mp3、wav、m4a等常见音频格式"
)
class Config:
json_schema_extra = {
"example": {
"mp3_url": "https://www.soundjay.com/misc/sounds/bell-ringing-05.wav"
}
}
class GetAudioDurationResponse(BaseModel):
"""获取音频时长响应参数"""
duration: int = Field(
...,
description="音频时长,单位:微秒",
ge=0
)
class Config:
json_schema_extra = {
"example": {
"duration": 2325333
}
}
================================================
FILE: src/schemas/get_draft.py
================================================
from pydantic import BaseModel, Field
from typing import List
class GetDraftRequest(BaseModel):
"""获取草稿请求参数"""
draft_id: str = Field(..., min_length=20, max_length=32, description="草稿ID")
class GetDraftResponse(BaseModel):
"""获取草稿响应参数"""
files: List[str] = Field(default=[], description="文件列表")
================================================
FILE: src/schemas/get_effects.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class GetEffectsRequest(BaseModel):
"""获取特效列表请求参数"""
mode: Optional[int] = Field(default=0, ge=0, le=2, description="特效模式,0=所有,1=VIP,2=免费,默认值为 0")
class EffectItem(BaseModel):
"""特效信息项"""
name: str = Field(..., description="特效名称")
is_vip: bool = Field(..., description="是否为 VIP 特效")
resource_id: str = Field(..., description="资源 ID")
effect_id: str = Field(..., description="效果 ID")
icon_url: str = Field(..., description="图标 URL")
has_params: bool = Field(..., description="是否有额外参数")
class GetEffectsResponse(BaseModel):
"""获取特效列表响应参数"""
effects: List[EffectItem] = Field(..., description="特效对象数组")
================================================
FILE: src/schemas/get_filters.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class GetFiltersRequest(BaseModel):
"""获取滤镜列表请求参数"""
mode: Optional[int] = Field(default=0, ge=0, le=2, description="滤镜模式,0=所有,1=VIP,2=免费,默认值为 0")
class FilterItem(BaseModel):
"""滤镜信息项"""
name: str = Field(..., description="滤镜名称")
is_vip: bool = Field(..., description="是否为 VIP 滤镜")
resource_id: str = Field(..., description="资源 ID")
effect_id: str = Field(..., description="效果 ID")
has_params: bool = Field(..., description="是否有额外参数")
class GetFiltersResponse(BaseModel):
"""获取滤镜列表响应参数"""
filters: List[FilterItem] = Field(..., description="滤镜对象数组")
================================================
FILE: src/schemas/get_image_animations.py
================================================
"""
获取图片出入场动画的数据模型定义
"""
from typing import Literal, List, Dict, Any
from pydantic import BaseModel, Field
class GetImageAnimationsRequest(BaseModel):
"""获取图片出入场动画的请求模型"""
mode: int = Field(default=0, description="动画模式:0=所有,1=VIP,2=免费")
type: Literal["in", "out", "loop"] = Field(..., description="动画类型:in=入场,out=出场,loop=循环")
class ImageAnimationItem(BaseModel):
"""单个图片动画项的数据模型"""
resource_id: str = Field(..., description="动画资源ID")
type: str = Field(..., description="动画类型")
category_id: str = Field(..., description="动画分类ID")
category_name: str = Field(..., description="动画分类名称")
duration: int = Field(..., description="动画时长(微秒)")
id: str = Field(..., description="动画唯一标识ID")
name: str = Field(..., description="动画名称")
request_id: str = Field(default="", description="请求ID")
start: int = Field(default=0, description="动画开始时间")
icon_url: str = Field(..., description="动画图标URL")
material_type: str = Field(default="sticker", description="素材类型")
panel: str = Field(default="", description="面板信息")
path: str = Field(default="", description="路径信息")
platform: str = Field(default="all", description="支持平台")
class GetImageAnimationsResponse(BaseModel):
"""获取图片出入场动画的响应模型"""
effects: List[ImageAnimationItem] = Field(..., description="图片出入场动画对象数组")
================================================
FILE: src/schemas/get_text_animations.py
================================================
"""
获取文字出入场动画的数据模型定义
"""
from typing import Literal, List, Dict, Any
from pydantic import BaseModel, Field
class GetTextAnimationsRequest(BaseModel):
"""获取文字出入场动画的请求模型"""
mode: int = Field(default=0, description="动画模式:0=所有,1=VIP,2=免费")
type: Literal["in", "out", "loop"] = Field(..., description="动画类型:in=入场,out=出场,loop=循环")
class TextAnimationItem(BaseModel):
"""单个文字动画项的数据模型"""
resource_id: str = Field(..., description="动画资源ID")
type: str = Field(..., description="动画类型")
category_id: str = Field(..., description="动画分类ID")
category_name: str = Field(..., description="动画分类名称")
duration: int = Field(..., description="动画时长(微秒)")
id: str = Field(..., description="动画唯一标识ID")
name: str = Field(..., description="动画名称")
request_id: str = Field(default="", description="请求ID")
start: int = Field(default=0, description="动画开始时间")
icon_url: str = Field(..., description="动画图标URL")
material_type: str = Field(default="sticker", description="素材类型")
panel: str = Field(default="", description="面板信息")
path: str = Field(default="", description="路径信息")
platform: str = Field(default="all", description="支持平台")
class GetTextAnimationsResponse(BaseModel):
"""获取文字出入场动画的响应模型"""
effects: List[TextAnimationItem] = Field(..., description="文字出入场动画对象数组")
================================================
FILE: src/schemas/get_text_effects.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class GetTextEffectsRequest(BaseModel):
"""获取花字效果列表请求参数"""
mode: Optional[int] = Field(default=0, ge=0, le=2, description="花字效果模式,0=所有,1=VIP,2=免费,默认值为 0")
class TextEffectItem(BaseModel):
"""花字效果信息项"""
id: str = Field(..., description="花字效果 ID")
title: str = Field(..., description="花字效果名称")
is_vip: bool = Field(..., description="是否为 VIP 效果")
class GetTextEffectsResponse(BaseModel):
"""获取花字效果列表响应参数"""
text_effects: List[TextEffectItem] = Field(..., description="花字效果对象数组")
================================================
FILE: src/schemas/get_url.py
================================================
from pydantic import BaseModel, Field
class GetUrlRequest(BaseModel):
"""提取链接请求参数"""
output: str = Field(..., description='提取内容')
class GetUrlResponse(BaseModel):
"""提取链接响应参数"""
output: str = Field(..., description='提取内容')
================================================
FILE: src/schemas/imgs_infos.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
from .audio_timelines import TimelineItem
class ImgsInfosRequest(BaseModel):
"""图片信息请求参数"""
imgs: List[str] = Field(..., description="图片URL列表")
timelines: List[TimelineItem] = Field(..., description="时间线数组")
height: Optional[int] = Field(None, description="视频高度")
width: Optional[int] = Field(None, description="视频宽度")
in_animation: Optional[str] = Field(None, description="入场动画名称,支持多个动画用|分隔")
in_animation_duration: Optional[int] = Field(None, description="入场动画时长")
loop_animation: Optional[str] = Field(None, description="组合动画名称,支持多个动画用|分隔")
loop_animation_duration: Optional[int] = Field(None, description="组合动画时长")
out_animation: Optional[str] = Field(None, description="出场动画名称,支持多个动画用|分隔")
out_animation_duration: Optional[int] = Field(None, description="出场动画时长")
transition: Optional[str] = Field(None, description="转场名称")
transition_duration: Optional[int] = Field(None, description="转场时长")
class ImgsInfosResponse(BaseModel):
"""图片信息响应参数"""
infos: str = Field(..., description="JSON字符串格式的图片信息")
================================================
FILE: src/schemas/keyframes_infos.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class SegmentInfoItem(BaseModel):
"""轨道数据项"""
id: str = Field(..., description="片段ID")
start: int = Field(..., description="开始时间(微秒)")
end: int = Field(..., description="结束时间(微秒)")
class KeyframesInfosRequest(BaseModel):
"""关键帧信息请求参数"""
ctype: str = Field(..., description="关键帧类型:KFTypePositionX: X轴移动,需要提供width参数,值会被除以width进行归一化 KFTypePositionY: Y轴移动,需要提供height参数,值会被除以height进行归一化 KFTypeRotation: 旋转角度,值范围必须在0-360度之间 UNIFORM_SCALE: 均匀缩放,值范围必须在0.01-5之间 KFTypeAlpha: 透明度,值范围必须在0-1之间")
offsets: str = Field(..., description="需要放置关键帧的位置比例,eg:0|100 这个就是代表在开始和结尾放置,0|50|100代表在开头,中间,结尾放置3个关键帧")
values: str = Field(..., description="对应offsets的值,长度要一致,比如1|2,或者1|2|1")
segment_infos: List[SegmentInfoItem] = Field(..., description="轨道数据,对象数组")
height: Optional[int] = Field(None, description="视频高,可选参数")
width: Optional[int] = Field(None, description="视频宽,可选参数")
class KeyframesInfosResponse(BaseModel):
"""关键帧信息响应参数"""
keyframes_infos: str = Field(..., description="JSON字符串格式的关键帧信息")
================================================
FILE: src/schemas/objs_to_str_list.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class ObjItem(BaseModel):
"""对象项"""
output: str = Field(..., description="URL地址")
class ObjsToStrListRequest(BaseModel):
"""对象列表转化成字符串列表请求参数"""
outputs: List[ObjItem] = Field(..., description="数据对象")
class ObjsToStrListResponse(BaseModel):
"""对象列表转化成字符串列表响应参数"""
infos: List[str] = Field(..., description="字符串列表")
================================================
FILE: src/schemas/save_draft.py
================================================
from pydantic import BaseModel, Field
class SaveDraftRequest(BaseModel):
"""创建草稿请求参数"""
draft_url: str = Field(default="", description="草稿URL")
class SaveDraftResponse(BaseModel):
"""创建草稿响应参数"""
draft_url: str = Field(default="", description="草稿URL")
================================================
FILE: src/schemas/search_sticker.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class StickerPackage(BaseModel):
"""贴纸包信息"""
height_per_frame: int = Field(..., description="每帧高度")
size: int = Field(..., description="贴纸包大小")
width_per_frame: int = Field(..., description="每帧宽度")
class LargeImage(BaseModel):
"""大图信息"""
image_url: str = Field(..., description="图片URL")
class StickerInfo(BaseModel):
"""贴纸信息"""
large_image: LargeImage = Field(..., description="大图信息")
preview_cover: str = Field(..., description="预览封面")
sticker_package: StickerPackage = Field(..., description="贴纸包信息")
sticker_type: int = Field(..., description="贴纸类型")
track_thumbnail: str = Field(..., description="轨道缩略图")
class StickerItem(BaseModel):
"""贴纸项"""
sticker: StickerInfo = Field(..., description="贴纸信息")
sticker_id: str = Field(..., description="贴纸ID")
title: str = Field(..., description="贴纸标题")
class SearchStickerRequest(BaseModel):
"""搜索贴纸请求参数"""
keyword: str = Field(..., description="关键词,必选参数")
class SearchStickerResponse(BaseModel):
"""搜索贴纸响应参数"""
data: List[StickerItem] = Field(..., description="贴纸数据列表")
================================================
FILE: src/schemas/str_list_to_objs.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
class StrListToObjsItem(BaseModel):
"""字符串列表转对象列表项"""
output: str = Field(..., description="URL地址")
class StrListToObjsRequest(BaseModel):
"""字符串列表转对象列表请求参数"""
infos: List[str] = Field(..., description="字符串列表")
class StrListToObjsResponse(BaseModel):
"""字符串列表转对象列表响应参数"""
infos: List[StrListToObjsItem] = Field(..., description="对象列表")
================================================
FILE: src/schemas/str_to_list.py
================================================
from pydantic import BaseModel, Field
from typing import List
class StrToListRequest(BaseModel):
"""字符转列表请求参数"""
obj: str = Field(..., description="对象内容")
class StrToListResponse(BaseModel):
"""字符转列表响应参数"""
infos: List[str] = Field(..., description="字符串列表")
================================================
FILE: src/schemas/timelines.py
================================================
from pydantic import BaseModel, Field
from typing import List
class TimelineItem(BaseModel):
"""时间线项"""
start: int = Field(..., description="开始时间")
end: int = Field(..., description="结束时间")
class TimelinesRequest(BaseModel):
"""时间线请求参数"""
duration: int = Field(..., description="总时长")
num: int = Field(..., description="时间线的个数,值为2即表示将总时长分为2个小段")
start: int = Field(..., description="开始时间")
type: int = Field(..., description="0: 平均分,1:随机")
class TimelinesResponse(BaseModel):
"""时间线响应参数"""
timelines: List[TimelineItem] = Field(..., description="分割后的时间线列表")
all_timelines: List[TimelineItem] = Field(..., description="完整的时间线列表")
================================================
FILE: src/schemas/video_infos.py
================================================
from pydantic import BaseModel, Field
from typing import List, Optional
from .audio_timelines import TimelineItem
class VideoInfosRequest(BaseModel):
"""视频信息请求参数"""
video_urls: List[str] = Field(..., description="视频列表")
timelines: List[TimelineItem] = Field(..., description="时间线数组")
height: Optional[int] = Field(None, description="视频高")
width: Optional[int] = Field(None, description="视频宽")
mask: Optional[str] = Field(None, description="视频蒙版,可填写值:圆形,矩形,爱心,星形")
transition: Optional[str] = Field(None, description="转场名称")
transition_duration: Optional[int] = Field(None, description="转场时长,整数")
volume: Optional[float] = Field(1.0, description="float类型,音量大小,0-10,默认1")
class VideoInfosResponse(BaseModel):
"""视频信息响应参数"""
infos: str = Field(..., description="JSON字符串格式的视频信息")
================================================
FILE: src/service/__init__.py
================================================
from .create_draft import create_draft
from .add_videos import add_videos, add_videos_async, _add_videos_internal
from .add_audios import add_audios, add_audios_async
from .add_images import add_images, add_images_async
from .add_sticker import add_sticker, add_sticker_async
from .add_keyframes import add_keyframes, add_keyframes_async
from .add_captions import add_captions, add_captions_async
from .add_effects import add_effects, add_effects_async
from .add_filters import add_filters, add_filters_async
from .add_masks import add_masks, add_masks_async
from .add_text_style import add_text_style
from .get_text_animations import get_text_animations
from .get_image_animations import get_image_animations
from .get_filters import get_filters
from .get_effects import get_effects
from .easy_create_material import easy_create_material, easy_create_material_async
from .save_draft import save_draft, save_draft_async
from .gen_video import gen_video, gen_video_status, get_gen_video_active_count
from .get_draft import get_draft
from .get_audio_duration import get_audio_duration
from .timelines import timelines
from .audio_timelines import audio_timelines
from .audio_infos import audio_infos
from .imgs_infos import imgs_infos
from .caption_infos import caption_infos
from .effect_infos import effect_infos
from .filter_infos import filter_infos
from .keyframes_infos import keyframes_infos
from .video_infos import video_infos
from .search_sticker import search_sticker
from .get_url import get_url
from .str_list_to_objs import str_list_to_objs
from .str_to_list import str_to_list
from .objs_to_str_list import objs_to_str_list
__all__ = ["create_draft", "add_videos", "add_audios", "add_images", "add_sticker", "add_keyframes", "add_captions", "add_effects", "add_filters", "add_masks", "add_text_style", "get_text_animations", "get_image_animations", "get_filters", "get_effects", "easy_create_material", "save_draft", "gen_video", "gen_video_status", "get_gen_video_active_count", "get_draft", "get_audio_duration", "timelines", "audio_timelines", "audio_infos", "imgs_infos", "caption_infos", "effect_infos", "filter_infos", "keyframes_infos", "video_infos", "search_sticker", "get_url", "str_list_to_objs", "str_to_list", "objs_to_str_list", "add_videos_async", "add_audios_async", "add_images_async", "add_sticker_async", "add_keyframes_async", "add_captions_async", "add_effects_async", "add_filters_async", "add_masks_async", "easy_create_material_async", "save_draft_async"]
================================================
FILE: src/service/add_audios.py
================================================
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, trange, AudioSceneEffectType, VideoSceneEffectType, VideoCharacterEffectType
import src.pyJianYingDraft as draft
from src.pyJianYingDraft.local_materials import AudioMaterial
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
import os
from src.utils import helper
from src.utils.download import download
import config
import json
import asyncio
import time
from typing import List, Dict, Any, Tuple, Optional
from src.utils.draft_lock_manager import DraftLockManager
def add_audios(
draft_url: str,
audio_infos: str
) -> Tuple[str, str, List[str]]:
"""
添加音频到剪映草稿的业务逻辑
Args:
draft_url: 草稿URL,必选参数
audio_infos: 音频信息JSON字符串
Returns:
draft_url: 草稿URL
track_id: 音频轨道ID(非主轨道)
audio_ids: 音频ID列表
Raises:
CustomException: 音频批量添加失败
"""
return _add_audios_internal(draft_url, audio_infos, prepared_audios=None)
def _prepare_audios_local_files(draft_url: str, audio_infos: str) -> List[Dict[str, Any]]:
"""
校验草稿、解析 audio_infos 并下载素材到草稿目录。
不修改 ScriptFile,可在草稿写锁外调用。
"""
draft_id = validate_and_get_draft_id(draft_url)
draft_audio_dir = create_audio_directory(draft_id)
audios = parse_audio_data(json_str=audio_infos)
validate_audio_data(audios, draft_id)
for audio in audios:
audio["local_audio_path"] = download_audio_file(audio, draft_audio_dir)
return audios
def _add_audios_internal(
draft_url: str,
audio_infos: str,
prepared_audios: Optional[List[Dict[str, Any]]] = None,
) -> Tuple[str, str, List[str]]:
logger.info(f"add_audios, draft_url: {draft_url}, audio_infos: {audio_infos}")
draft_id = validate_and_get_draft_id(draft_url)
script: ScriptFile = DRAFT_CACHE[draft_id]
draft_audio_dir = create_audio_directory(draft_id)
if prepared_audios is not None:
audios = prepared_audios
else:
audios = parse_audio_data(json_str=audio_infos)
validate_audio_data(audios, draft_id)
track_name = add_audio_track(script)
audio_ids = add_audio_segments(script, track_name, draft_audio_dir, audios)
script.save()
logger.info(f"Draft saved successfully")
track_id = get_track_id(script, track_name)
logger.info(f"Audio track created, draft_id: {draft_id}, track_id: {track_id}")
return draft_url, track_id, audio_ids
async def add_audios_async(
draft_url: str,
audio_infos: str,
lock_timeout: float = 30.0
) -> Tuple[str, str, List[str]]:
"""
添加音频到剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
4. 音频下载在获取锁之前完成,持锁阶段仅修改草稿与写盘
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
audio_infos: JSON 字符串,包含音频信息列表,详见 add_audios 函数
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, track_id, audio_ids)
Raises:
CustomException: 音频添加失败,或 `DRAFT_LOCK_TIMEOUT`(获取写锁超时)
Example:
>>> result = await add_audios_async(
... draft_url="http://.../draft_id=123",
... audio_infos='[{"audio_url":"...", "start":0, "end":5000000}]'
... )
"""
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
logger.info(f"[flow:add_audios] prep_start, draft_id: {draft_id}")
# 下载与预处理放到线程池,避免阻塞事件循环导致锁超时漂移
prep_started_at = time.monotonic()
prepared_audios = await asyncio.to_thread(
_prepare_audios_local_files,
draft_url,
audio_infos,
)
logger.info(
f"[flow:add_audios] prep_done, draft_id: {draft_id}, "
f"count: {len(prepared_audios)}, elapsed: {time.monotonic() - prep_started_at:.3f}s"
)
lock_manager = DraftLockManager()
logger.info(f"[flow:add_audios] lock_wait_start, draft_id: {draft_id}, timeout: {lock_timeout}s")
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"[flow:add_audios] lock_acquired, draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s",
)
try:
return _add_audios_internal(
draft_url=draft_url,
audio_infos=audio_infos,
prepared_audios=prepared_audios,
)
finally:
await lock_manager.release_lock(draft_id)
logger.info(f"[flow:add_audios] lock_released, draft_id: {draft_id}")
def validate_and_get_draft_id(draft_url: str) -> str:
"""验证草稿URL并提取草稿ID"""
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft URL or draft not found in cache, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
return draft_id
def create_audio_directory(draft_id: str) -> str:
"""创建音频资源存储目录"""
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
draft_audio_dir = os.path.join(draft_dir, "assets", "audios")
os.makedirs(name=draft_audio_dir, exist_ok=True)
logger.info(f"Created audio directory: {draft_audio_dir}")
return draft_audio_dir
def validate_audio_data(audios: List[Dict[str, Any]], draft_id: str):
"""验证音频数据是否为空"""
if len(audios) == 0:
logger.error(f"No audio info provided, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_AUDIO_INFO)
logger.info(f"Parsed {len(audios)} audio items")
def add_audio_track(script: ScriptFile) -> str:
"""添加音频轨道到草稿"""
track_name = f"audio_track_{helper.gen_unique_id()}"
# 设置 relative_index=10 确保音频轨道在主音频轨道之上,避免与主轨道冲突
script.add_track(track_type=draft.TrackType.audio, track_name=track_name, relative_index=10)
logger.info(f"Added audio track (non-main track): {track_name}")
return track_name
def add_audio_segments(script: ScriptFile, track_name: str, draft_audio_dir: str, audios: List[Dict[str, Any]]) -> List[str]:
"""批量添加音频片段到指定轨道"""
audio_ids = []
for i, audio in enumerate(audios):
try:
audio_id = add_audio_to_draft(script, track_name, draft_audio_dir=draft_audio_dir, audio=audio)
audio_ids.append(audio_id)
logger.info(f"Added audio {i+1}/{len(audios)}, audio_id: {audio_id}")
except Exception as e:
logger.error(f"Failed to add audio {i+1}/{len(audios)}, error: {str(e)}")
raise
return audio_ids
def get_track_id(script: ScriptFile, track_name: str) -> str:
"""根据轨道名称获取轨道ID"""
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
track_id = script.tracks[key].track_id
break
return track_id
def find_audio_effect_type(audio_effect: str):
"""
根据音频效果名称查找对应的效果类型
Args:
audio_effect: 音频效果名称
Returns:
effect_type: 对应的效果类型对象,如果未找到则返回None
"""
effect_type = None
# 查找对应的音频效果类型
for effect_name, effect_meta in AudioSceneEffectType.__members__.items():
if effect_meta.value.name == audio_effect:
effect_type = effect_meta
break
# 如果没找到,则尝试在VideoSceneEffectType中查找
if effect_type is None:
for effect_name, effect_meta in VideoSceneEffectType.__members__.items():
if effect_meta.value.name == audio_effect:
effect_type = effect_meta
break
# 如果没找到,则尝试在VideoCharacterEffectType中查找
if effect_type is None:
for effect_name, effect_meta in VideoCharacterEffectType.__members__.items():
if effect_meta.value.name == audio_effect:
effect_type = effect_meta
break
return effect_type
def convert_params_to_range(effect_type) -> list:
"""
将效果参数转换为0-100范围内的值列表
Args:
effect_type: 效果类型对象
Returns:
params_list: 转换后的参数值列表
"""
params_list = []
for param in effect_type.value.params:
# 将实际默认值转换为0-100范围内的值
if param.min_value != param.max_value:
# 计算参数值在0-100范围内的对应值
param_value = ((param.default_value - param.min_value) / (param.max_value - param.min_value)) * 100
else:
# 如果参数范围是固定值,则使用50作为默认值
param_value = 50
params_list.append(param_value)
return params_list
def add_audio_effect(audio_segment, audio_effect: str):
"""
为音频片段添加音频效果
Args:
audio_segment: 音频片段对象
audio_effect: 音频效果名称
"""
effect_type = find_audio_effect_type(audio_effect)
# 如果找到了对应的效果类型,则添加效果
if effect_type:
params_list = convert_params_to_range(effect_type)
# 添加效果
audio_segment.add_effect(
effect_type=effect_type,
params=params_list
)
logger.info(f"Added audio effect: {audio_effect} with params: {params_list}")
else:
logger.warning(f"Unknown audio effect: {audio_effect}")
def add_audio_to_draft(
script: ScriptFile,
track_name: str,
draft_audio_dir: str,
audio: dict
) -> str:
"""
向剪映草稿中添加单个音频
Args:
script: 草稿文件对象
track_name: 音频轨道名称
draft_audio_dir: 音频资源目录
audio: 音频信息字典,包含以下字段:
audio_url: 音频URL
duration: 音频总时长(微秒),可选字段
start: 开始时间(微秒)
end: 结束时间(微秒)
volume: 音量[0.0, 2.0]
audio_effect: 音频效果名称(可选)
Returns:
material_id: 音频素材ID
Raises:
CustomException: 添加音频失败
"""
try:
audio_path = audio.get("local_audio_path")
if audio_path:
if not os.path.isfile(audio_path):
raise CustomException(
CustomError.AUDIO_ADD_FAILED,
f"Missing local file: {audio_path}",
)
logger.info(f"Using local audio: {audio_path}")
else:
audio_path = download_audio_file(audio, draft_audio_dir)
actual_duration = get_audio_actual_duration(audio_path)
# 2. 处理音频时长参数
process_audio_duration(audio, actual_duration)
# 3. 计算并调整音频片段时间范围
start_time, end_time, segment_duration = calculate_adjusted_time_range(audio, actual_duration)
# 4. 更新音频对象中的时间参数
update_audio_time_params(audio, start_time, end_time)
# 5. 创建音频片段
audio_segment = create_audio_segment(audio_path, start_time, segment_duration, audio)
# 6. 添加音频效果(如果指定了)
if audio.get('audio_effect'):
add_audio_effect(audio_segment, audio['audio_effect'])
logger.info(f"Created audio segment, material_id: {audio_segment.material_instance.material_id}")
logger.info(f"Audio segment details - start: {start_time}, duration: {segment_duration}, volume: {audio['volume']}")
# 7. 添加片段到轨道(带重叠处理)
add_segment_with_overlap_handling(script, track_name, audio_segment, audio_path, start_time, segment_duration, audio)
return audio_segment.material_instance.material_id
except CustomException:
logger.error(f"Add audio to draft failed, draft_audio_dir: {draft_audio_dir}, audio: {audio}")
raise
except Exception as e:
logger.error(f"Add audio to draft failed, error: {str(e)}")
raise CustomException(err=CustomError.AUDIO_ADD_FAILED)
def download_audio_file(audio: dict, draft_audio_dir: str) -> str:
"""下载音频文件"""
audio_path = download(url=audio['audio_url'], save_dir=draft_audio_dir)
logger.info(f"Downloaded audio from {audio['audio_url']} to {audio_path}")
return audio_path
def get_audio_actual_duration(audio_path: str) -> int:
"""获取音频的实际时长"""
temp_material = AudioMaterial(audio_path)
actual_duration = temp_material.duration
logger.info(f"Actual audio duration: {actual_duration} microseconds")
return actual_duration
def process_audio_duration(audio: dict, actual_duration: int):
"""处理音频时长参数,如果没有提供duration,则使用实际检测到的时长"""
if audio.get('duration') is None:
audio['duration'] = actual_duration
logger.info(f"Using detected audio duration: {actual_duration} microseconds")
def calculate_adjusted_time_range(audio: dict, actual_duration: int):
"""计算并调整音频片段时间范围"""
start_time = audio['start']
requested_end_time = audio['end']
requested_duration = requested_end_time - start_time
# 检查并修正开始时间,确保不小于0
if start_time < 0:
logger.warning(f"Start time {start_time} is negative, setting to 0")
start_time = 0
# 根据实际音频时长和请求的时长进行智能处理
if actual_duration < requested_duration:
# 情况1: 音频实际长度不够(小于end - start)时,使用音频实际时长
logger.warning(f"Audio actual duration {actual_duration} is less than requested duration {requested_duration}, using actual duration")
# 使用音频实际时长,但保持起始时间不变
segment_duration = actual_duration
end_time = start_time + segment_duration
else:
# 情况2: 音频实际时长足够时,使用指定的end作为结束时间(但不超过音频实际时长)
calculated_end_time = min(requested_end_time, start_time + actual_duration)
segment_duration = calculated_end_time - start_time
end_time = calculated_end_time
# 确保片段至少有最小持续时间,避免0持续时间导致的问题
if segment_duration <= 0:
logger.warning(f"Segment duration is zero or negative ({segment_duration}), setting to minimum duration")
# 设置最小持续时间,比如100微秒,这样可以避免重叠问题
segment_duration = 100
end_time = start_time + segment_duration
logger.info(f"Adjusted audio segment: start={start_time}, end={end_time}, duration={segment_duration}, requested_duration={requested_duration}")
return start_time, end_time, segment_duration
def update_audio_time_params(audio: dict, start_time: int, end_time: int):
"""更新音频对象中的时间参数"""
audio['start'] = start_time
audio['end'] = end_time
def create_audio_segment(audio_path: str, start_time: int, segment_duration: int, audio: dict):
"""创建音频片段对象"""
audio_segment = draft.AudioSegment(
material=audio_path,
target_timerange=trange(start=start_time, duration=segment_duration),
volume=audio['volume']
)
return audio_segment
def add_segment_with_overlap_handling(script: ScriptFile, track_name: str, audio_segment, audio_path: str, start_time: int, segment_duration: int, audio: dict):
"""添加片段到轨道,处理可能的重叠问题"""
try:
script.add_segment(audio_segment, track_name)
except Exception as e:
# 如果添加片段时出现重叠错误,尝试调整片段位置
if "overlaps" in str(e) or "overlap" in str(e).lower():
logger.warning(f"Segment overlap detected: {str(e)}, attempting to adjust")
# 稍微调整片段的开始时间,避免重叠
# 逐步增加偏移量,直到不再重叠
offset = 100
max_attempts = 10
attempts = 0
while attempts < max_attempts:
try:
adjusted_start = start_time + offset
logger.info(f"Attempt {attempts + 1}: Adjusting segment start time from {start_time} to {adjusted_start}")
# 重新创建片段,使用调整后的时间
adjusted_audio_segment = draft.AudioSegment(
material=audio_path,
target_timerange=trange(start=adjusted_start, duration=segment_duration),
volume=audio['volume']
)
# 再次尝试添加片段
script.add_segment(adjusted_audio_segment, track_name)
logger.info(f"Successfully added adjusted segment with start time {adjusted_start}")
break # 成功添加,跳出循环
except Exception as retry_e:
if "overlaps" in str(retry_e) or "overlap" in str(retry_e).lower():
attempts += 1
offset += 100 # 增加偏移量
logger.info(f"Still overlapping, increasing offset to {offset}")
else:
# 如果不是重叠错误,重新抛出异常
raise
if attempts >= max_attempts:
logger.error(f"Failed to add segment after {max_attempts} attempts, giving up")
raise
else:
# 如果不是重叠错误,重新抛出异常
raise
def parse_audio_data(json_str: str) -> List[Dict[str, Any]]:
"""
解析音频数据的JSON字符串,处理可选字段的默认值
Args:
json_str: 包含音频数据的JSON字符串
Returns:
包含音频对象的数组,每个对象都处理了默认值
Raises:
CustomException: 当JSON格式错误或缺少必选字段时抛出
"""
# 解析JSON字符串
data = parse_json_string(json_str)
# 验证数据格式
validate_input_format(data)
# 处理音频项列表
result = []
for i, item in enumerate(data):
processed_item = process_single_audio_item(item, i)
result.append(processed_item)
return result
def parse_json_string(json_str: str) -> List[Dict[str, Any]]:
"""解析JSON字符串"""
try:
data = json.loads(json_str)
logger.info(f"Successfully parsed JSON with {len(data) if isinstance(data, list) else 1} items")
return data
except json.JSONDecodeError as e:
logger.error(f"JSON parse error: {e.msg}")
raise CustomException(CustomError.INVALID_AUDIO_INFO, f"JSON parse error: {e.msg}")
def validate_input_format(data: Any):
"""验证输入数据格式"""
if not isinstance(data, list):
logger.error("Audio infos should be a list")
raise CustomException(CustomError.INVALID_AUDIO_INFO, "audio_infos should be a list")
def process_single_audio_item(item: Any, index: int) -> Dict[str, Any]:
"""处理单个音频项"""
# 验证单个项的数据类型
validate_item_type(item, index)
# 验证必选字段
validate_required_fields(item, index)
# 创建处理后的对象,设置默认值
processed_item = create_processed_item(item)
# 验证数值范围
validate_numeric_ranges(processed_item, index)
logger.debug(f"Processed audio item {index+1}: {processed_item}")
return processed_item
def validate_item_type(item: Any, index: int):
"""验证单个项的数据类型"""
if not isinstance(item, dict):
logger.error(f"The {index}th item should be a dict")
raise CustomException(CustomError.INVALID_AUDIO_INFO, f"the {index}th item should be a dict")
def validate_required_fields(item: Dict[str, Any], index: int):
"""验证必选字段"""
required_fields = ["audio_url", "start", "end"]
missing_fields = [field for field in required_fields if field not in item]
if missing_fields:
logger.error(f"The {index}th item is missing required fields: {', '.join(missing_fields)}")
raise CustomException(CustomError.INVALID_AUDIO_INFO, f"the {index}th item is missing required fields: {', '.join(missing_fields)}")
def create_processed_item(item: Dict[str, Any]) -> Dict[str, Any]:
"""创建处理后的音频项,设置默认值"""
return {
"audio_url": item["audio_url"],
"duration": item.get("duration"), # duration变为可选字段
"start": item["start"],
"end": item["end"],
"volume": item.get("volume", 1.0), # 默认音量 1.0
"audio_effect": item.get("audio_effect", None) # 默认无音频效果
}
def validate_numeric_ranges(processed_item: Dict[str, Any], index: int):
"""验证数值范围"""
if processed_item["volume"] < 0.0 or processed_item["volume"] > 2.0:
logger.warning(f"Volume value {processed_item['volume']} out of range [0.0, 2.0], using default 1.0")
processed_item["volume"] = 1.0
# 如果提供了 duration 且小于等于 0,则报错
if processed_item["duration"] is not None and processed_item["duration"] <= 0:
logger.error(f"Invalid duration: {processed_item['duration']}")
raise CustomException(CustomError.INVALID_AUDIO_INFO, f"the {index}th item has invalid duration")
================================================
FILE: src/service/add_captions.py
================================================
import json
from typing import List, Dict, Any, Tuple, Optional, Literal
import asyncio
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, TrackType, TextSegment, TextStyle, ClipSettings, Timerange, FontType, TextBorder, TextShadow
from src.pyJianYingDraft.metadata import TextIntro, TextOutro, TextLoopAnim
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
from src.utils import helper
from src.schemas.add_captions import ShadowInfo
from src.service.get_text_effects import resolve_text_effect
from src.utils.draft_lock_manager import DraftLockManager
FONT_ALIAS_MAP = {
"志向黑": "励字志向黑简_特粗",
"励字志向黑": "励字志向黑简_特粗",
"励字志向黑简": "励字志向黑简_特粗",
}
def resolve_font_type(font_name: str) -> Optional[FontType]:
"""
解析用户传入的字体名称,支持:
1. FontType 枚举字段名
2. 预定义别名(例如“志向黑”)
3. 字体展示名(EffectMeta.name)
4. 唯一的模糊包含匹配
"""
if not font_name:
return None
raw_name = font_name.strip()
if not raw_name:
return None
# 1) 直接按枚举字段名匹配
direct_match = getattr(FontType, raw_name, None)
if isinstance(direct_match, FontType):
return direct_match
# 2) 优先走别名映射
normalized_name = raw_name.strip()
alias_key = FONT_ALIAS_MAP.get(raw_name)
if alias_key is None:
for key, value in FONT_ALIAS_MAP.items():
if key.strip() == normalized_name:
alias_key = value
break
if alias_key:
alias_match = getattr(FontType, alias_key, None)
if isinstance(alias_match, FontType):
return alias_match
# 3) 枚举自带名称匹配(忽略空格/下划线)
try:
return FontType.from_name(raw_name)
except ValueError:
pass
# 4) 按展示名/枚举名做容错匹配
exact_candidates: List[FontType] = []
fuzzy_candidates: List[FontType] = []
for font_type in FontType:
normalized_enum_name = font_type.name.strip()
normalized_display_name = font_type.value.name.strip()
if normalized_name in (normalized_enum_name, normalized_display_name):
exact_candidates.append(font_type)
continue
if normalized_name and (
normalized_name in normalized_enum_name or normalized_name in normalized_display_name
):
fuzzy_candidates.append(font_type)
if len(exact_candidates) == 1:
return exact_candidates[0]
if len(exact_candidates) > 1:
logger.warning(f"Font '{font_name}' matched multiple exact candidates, using default font")
return None
if len(fuzzy_candidates) == 1:
logger.info(f"Font '{font_name}' resolved to '{fuzzy_candidates[0].name}' via fuzzy match")
return fuzzy_candidates[0]
if len(fuzzy_candidates) > 1:
logger.warning(f"Font '{font_name}' matched multiple fuzzy candidates, using default font")
return None
return None
def add_captions(
draft_url: str,
captions: str,
text_color: str = "#ffffff",
border_color: Optional[str] = None,
alignment: int = 1,
alpha: float = 1.0,
font: Optional[str] = None,
font_size: int = 15,
letter_spacing: Optional[float] = None,
line_spacing: Optional[float] = None,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: float = 0.0,
transform_y: float = 0.0,
style_text: bool = False,
underline: bool = False,
italic: bool = False,
bold: bool = False,
has_shadow: bool = False,
shadow_info: Optional[ShadowInfo] = None,
text_effect: Optional[str] = None
) -> Tuple[str, str, List[str], List[str], List[dict]]:
"""
批量添加字幕到剪映草稿的业务逻辑
Args:
draft_url: 草稿 URL
captions: 字幕信息列表的 JSON 字符串,格式如下:
[
{
"start": 0, # 字幕开始时间(微秒)
"end": 10000000, # 字幕结束时间(微秒)
"text": "你好,剪映", # 字幕文本内容
"keyword": "好", # 关键词(用 | 分隔多个关键词),可选参数
"keyword_color": "#457616", # 关键词颜色,可选参数
"keyword_border_color": "#000000", # 关键词边框颜色,可选参数
"keyword_font_size": 15, # 关键词字体大小,可选参数
"font_size": 15, # 文本字体大小,可选参数
"in_animation": None, # 入场动画,可选参数
"out_animation": None, # 出场动画,可选参数
"loop_animation": None, # 循环动画,可选参数
"in_animation_duration": None, # 入场动画时长,可选参数
"out_animation_duration": None, # 出场动画时长,可选参数
"loop_animation_duration": None, # 循环动画时长,可选参数
}
]
text_color: 文本颜色(十六进制),默认"#ffffff"
border_color: 边框颜色(十六进制),默认 None
alignment: 文本对齐方式(0-5),默认 1
alpha: 文本透明度(0.0-1.0),默认 1.0
font: 字体名称,默认 None
font_size: 字体大小,默认 15
letter_spacing: 字间距,默认 None
line_spacing: 行间距,默认 None
scale_x: 水平缩放,默认 1.0
scale_y: 垂直缩放,默认 1.0
transform_x: 水平位移,默认 0.0
transform_y: 垂直位移,默认 0.0
style_text: 是否使用样式文本,默认 False
underline: 文字下划线开关,默认 False
italic: 文本斜体开关,默认 False
bold: 文本加粗开关,默认 False
has_shadow: 是否启用文本阴影,默认 False
shadow_info: 文本阴影参数,默认 None
text_effect: 花字效果名称或 effect_id,默认 None
Returns:
draft_url: 草稿 URL
track_id: 字幕轨道 ID
text_ids: 字幕 ID 列表
segment_ids: 字幕片段 ID 列表
segment_infos: 片段信息列表
Raises:
CustomException: 字幕添加失败
"""
# 记录函数入口参数,便于调试
logger.info(f"add_captions started, draft_url: {draft_url}")
logger.debug(f"Function parameters - text_color: {text_color}, border_color: {border_color}, "
f"alignment: {alignment}, alpha: {alpha}, font: {font}, font_size: {font_size}, "
f"scale_x: {scale_x}, scale_y: {scale_y}, transform_x: {transform_x}, transform_y: {transform_y}, "
f"style_text: {style_text}, underline: {underline}, italic: {italic}, bold: {bold}, has_shadow: {has_shadow}, shadow_info: {shadow_info}")
try:
# 1. 提取草稿ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft_url or draft not found in cache: {draft_url}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 2. 解析字幕信息
caption_items = parse_captions_data(json_str=captions)
if len(caption_items) == 0:
logger.info(f"No caption info provided, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_CAPTION_INFO)
logger.info(f"Parsed {len(caption_items)} caption items")
# 3. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 4. 添加字幕轨道(与其它素材接口一致:按全局接口调用顺序叠层,后调用者在上)
track_name = f"caption_track_{helper.gen_unique_id()}"
script.add_track_ordered(track_type=TrackType.text, track_name=track_name)
logger.info(f"Added caption track: {track_name}")
# 5. 遍历字幕信息,添加字幕到草稿中的指定轨道,收集片段ID
segment_ids = []
text_ids = []
segment_infos = []
for i, caption in enumerate(caption_items):
try:
logger.info(f"Processing caption {i+1}/{len(caption_items)}, text: {caption['text'][:20]}...")
segment_id, text_id, segment_info = add_caption_to_draft(
script, track_name,
caption=caption,
text_color=text_color,
border_color=border_color,
alignment=alignment,
alpha=alpha,
font=font,
font_size=font_size,
letter_spacing=letter_spacing,
line_spacing=line_spacing,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x,
transform_y=transform_y,
style_text=style_text,
underline=underline,
italic=italic,
bold=bold,
has_shadow=has_shadow,
shadow_info=shadow_info,
text_effect=text_effect
)
segment_ids.append(segment_id)
text_ids.append(text_id)
segment_infos.append(segment_info)
logger.info(f"Added caption {i+1}/{len(caption_items)}, segment_id: {segment_id}")
except Exception as e:
logger.error(f"Failed to add caption {i+1}/{len(caption_items)}, error: {str(e)}")
raise
# 6. 保存草稿
script.save()
logger.info(f"Draft saved successfully")
# 7. 获取当前字幕轨道ID
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
track_id = script.tracks[key].track_id
break
logger.info(f"Caption track created, draft_id: {draft_id}, track_id: {track_id}")
logger.info(f"add_captions completed successfully - draft_id: {draft_id}, track_id: {track_id}, captions_added: {len(caption_items)}")
return draft_url, track_id, text_ids, segment_ids, segment_infos
except CustomException:
# 重新抛出自定义异常
raise
except Exception as e:
# 捕获其他未预期的异常并转换为自定义异常
logger.error(f"Unexpected error in add_captions: {str(e)}")
raise CustomException(CustomError.CAPTION_ADD_FAILED, f"Unexpected error: {str(e)}")
async def add_captions_async(
draft_url: str,
captions: str,
text_color: str = "#ffffff",
border_color: Optional[str] = None,
alignment: int = 1,
alpha: float = 1.0,
font: Optional[str] = None,
font_size: int = 15,
letter_spacing: Optional[float] = None,
line_spacing: Optional[float] = None,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: float = 0.0,
transform_y: float = 0.0,
style_text: bool = False,
underline: bool = False,
italic: bool = False,
bold: bool = False,
has_shadow: bool = False,
shadow_info: Optional[ShadowInfo] = None,
text_effect: Optional[str] = None,
lock_timeout: float = 30.0
) -> Tuple[str, str, List[str], List[str], List[dict]]:
"""
批量添加字幕到剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
captions: JSON 字符串,包含字幕信息列表,详见 add_captions 函数
text_color: 文本颜色(十六进制),默认"#ffffff"
border_color: 边框颜色(十六进制),默认 None
alignment: 文本对齐方式(0-5),默认 1
alpha: 文本透明度(0.0-1.0),默认 1.0
font: 字体名称,默认 None
font_size: 字体大小,默认 15
letter_spacing: 字间距,默认 None
line_spacing: 行间距,默认 None
scale_x: 水平缩放,默认 1.0
scale_y: 垂直缩放,默认 1.0
transform_x: 水平位移,默认 0.0
transform_y: 垂直位移,默认 0.0
style_text: 是否使用样式文本,默认 False
underline: 文字下划线开关,默认 False
italic: 文本斜体开关,默认 False
bold: 文本加粗开关,默认 False
has_shadow: 是否启用文本阴影,默认 False
shadow_info: 文本阴影参数,默认 None
text_effect: 花字效果名称或 effect_id,默认 None
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, track_id, text_ids, segment_ids, segment_infos)
Raises:
CustomException: 字幕添加失败或获取锁超时
asyncio.TimeoutError: 等待锁超时时抛出
Example:
>>> result = await add_captions_async(
... draft_url="http://.../draft_id=123",
... captions='[{"start":0, "end":5000000, "text":"你好"}]'
... )
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 获取锁管理器
lock_manager = DraftLockManager()
# 尝试获取锁
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"Lock acquired for draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s"
)
try:
# 调用内部处理函数(不获取锁,由外层控制)
return add_captions(
draft_url=draft_url,
captions=captions,
text_color=text_color,
border_color=border_color,
alignment=alignment,
alpha=alpha,
font=font,
font_size=font_size,
letter_spacing=letter_spacing,
line_spacing=line_spacing,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x,
transform_y=transform_y,
style_text=style_text,
underline=underline,
italic=italic,
bold=bold,
has_shadow=has_shadow,
shadow_info=shadow_info,
text_effect=text_effect
)
finally:
# 释放锁
await lock_manager.release_lock(draft_id)
logger.info(f"Lock released for draft_id: {draft_id}")
def add_caption_to_draft(
script: ScriptFile,
track_name: str,
caption: dict,
text_color: str = "#ffffff",
border_color: Optional[str] = None,
alignment: int = 1,
alpha: float = 1.0,
font: Optional[str] = None,
font_size: int = 15,
letter_spacing: Optional[float] = None,
line_spacing: Optional[float] = None,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: float = 0.0,
transform_y: float = 0.0,
style_text: bool = False,
underline: bool = False,
italic: bool = False,
bold: bool = False,
has_shadow: bool = False,
shadow_info: Optional[ShadowInfo] = None,
text_effect: Optional[str] = None
) -> Tuple[str, str, dict]:
"""
向剪映草稿中添加单个字幕
Args:
script: 草稿文件对象
track_name: 字幕轨道名称
caption: 字幕信息字典,包含以下字段:
start: 字幕开始时间(微秒)
end: 字幕结束时间(微秒)
text: 字幕文本内容
keyword: 关键词(用 | 分隔多个关键词),可选
keyword_color: 关键词颜色,可选
keyword_border_color: 关键词边框颜色,可选
keyword_font_size: 关键词字体大小,可选
font_size: 文本字体大小,可选
in_animation: 入场动画,可选
out_animation: 出场动画,可选
loop_animation: 循环动画,可选
in_animation_duration: 入场动画时长,可选
out_animation_duration: 出场动画时长,可选
loop_animation_duration: 循环动画时长,可选
text_color: 文本颜色(十六进制),默认"#ffffff"
border_color: 边框颜色(十六进制),默认 None
alignment: 文本对齐方式(0-5),默认 1
alpha: 文本透明度(0.0-1.0),默认 1.0
font: 字体名称,默认 None
font_size: 字体大小,默认 15
letter_spacing: 字间距,默认 None
line_spacing: 行间距,默认 None
scale_x: 水平缩放,默认 1.0
scale_y: 垂直缩放,默认 1.0
transform_x: 水平位移,默认 0.0
transform_y: 垂直位移,默认 0.0
style_text: 是否使用样式文本,默认 False
underline: 文字下划线开关,默认 False
italic: 文本斜体开关,默认 False
bold: 文本加粗开关,默认 False
has_shadow: 是否启用文本阴影,默认 False
shadow_info: 文本阴影参数,默认 None
text_effect: 花字效果名称或 effect_id,默认 None
Returns:
segment_id: 片段 ID
text_id: 文本 ID(material_id)
segment_info: 片段信息字典,包含 id、start、end
Raises:
CustomException: 添加字幕失败
"""
try:
# 记录函数入口参数,便于调试
logger.debug(f"add_caption_to_draft called with caption: {caption}")
# 0. 在函数开头统一处理参数约束:
# 当花字有效时,直接将 text_color / border_color / has_shadow 重置为默认值
if text_effect:
try:
if resolve_text_effect(text_effect):
logger.info(
f"Valid text effect detected: {text_effect}, "
f"resetting text_color/border_color/has_shadow to defaults"
)
text_color = "#ffffff"
border_color = None
has_shadow = False
else:
logger.warning(f"Text effect not found: {text_effect}")
except Exception as e:
logger.error(f"Failed to resolve text effect '{text_effect}': {str(e)}")
# 1. 创建时间范围
caption_duration = caption['end'] - caption['start']
timerange = Timerange(start=caption['start'], duration=caption_duration)
# 2. 解析颜色
rgb_color = hex_to_rgb(text_color)
# 3. 创建文本样式
align_value: Literal[0, 1, 2] = 0
if alignment == 1:
align_value = 1
elif alignment == 2:
align_value = 2
# 根据需求修改:只有当caption中明确指定了font_size时才使用,否则不设置默认值
font_size_value = font_size
if 'font_size' in caption and caption['font_size'] is not None:
font_size_value = float(caption['font_size'])
# 创建TextStyle对象
text_style = TextStyle(
size=font_size_value,
color=rgb_color,
alpha=alpha,
align=align_value,
letter_spacing=int(letter_spacing) if letter_spacing is not None else 0,
line_spacing=int(line_spacing) if line_spacing is not None else 0,
auto_wrapping=True, # 字幕默认开启自动换行
underline=underline,
italic=italic,
bold=bold
)
logger.info(f"Created text style, text_style.size: {text_style.size}, font_size from caption: {font_size}")
# 4. 创建文本描边(如果提供了border_color)
text_border = None
if border_color:
border_rgb_color = hex_to_rgb(border_color)
text_border = TextBorder(color=border_rgb_color)
# 5. 创建字体(如果提供了font)
font_type = None
if font:
font_type = resolve_font_type(font)
if font_type is None:
logger.warning(f"Font '{font}' not found, using default font")
# 6. 创建图像调节设置
clip_settings = ClipSettings(
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x / script.width, # 转换为画布宽度单位
transform_y=transform_y / script.height # 转换为画布高度单位
)
# 7. 创建文本阴影(如果启用了阴影)
text_shadow = None
if has_shadow:
# 如果启用了阴影但没有提供shadow_info,则使用默认值
if shadow_info is None:
# 创建默认的阴影配置
shadow_rgb_color = hex_to_rgb("#000000")
text_shadow = TextShadow(
alpha=0.9,
color=shadow_rgb_color,
diffuse=15.0,
distance=5.0,
angle=-45.0
)
else:
# 使用提供的shadow_info配置
shadow_rgb_color = hex_to_rgb(shadow_info.shadow_color)
text_shadow = TextShadow(
alpha=shadow_info.shadow_alpha,
color=shadow_rgb_color,
diffuse=shadow_info.shadow_diffuse,
distance=shadow_info.shadow_distance,
angle=shadow_info.shadow_angle
)
# 8. 创建文本片段
text_segment = TextSegment(
text=caption['text'],
timerange=timerange,
style=text_style,
border=text_border, # 添加边框
font=font_type, # 添加字体
shadow=text_shadow, # 添加阴影
clip_settings=clip_settings
)
logger.info(f"Created text segment, material_id: {text_segment.material_id}")
logger.info(f"Text segment details - start: {caption['start']}, duration: {caption_duration}, text: {caption['text'][:50]}")
# 10. 处理花字效果
if text_effect:
try:
resolved_effect = resolve_text_effect(text_effect)
if resolved_effect:
text_segment.add_effect(resolved_effect['effect_id'])
logger.info(f"Added text effect: {text_effect} (effect_id: {resolved_effect['effect_id']})")
except Exception as e:
logger.error(f"Failed to add text effect '{text_effect}': {str(e)}")
# 11. 处理动画效果
if caption.get('keyword'):
keyword_color = caption.get('keyword_color', '#ff7100') # 默认橙色
keyword_rgb_color = hex_to_rgb(keyword_color)
keyword_font_size = caption.get('keyword_font_size') # 获取关键词字体大小
keyword_border_color = caption.get('keyword_border_color') # 获取关键词边框颜色
# 优先使用keyword_border_color,如果没有指定则使用border_color
if keyword_border_color:
keyword_border_rgb_color = hex_to_rgb(keyword_border_color)
elif border_color:
keyword_border_rgb_color = hex_to_rgb(border_color)
else:
keyword_border_rgb_color = None
# 应用关键词颜色和字体大小到文本样式中
apply_keyword_highlight(text_segment, caption['keyword'], keyword_rgb_color, keyword_font_size, keyword_border_rgb_color)
logger.info(f"Applied keyword highlighting: {caption['keyword']} with color {keyword_color}, font size {keyword_font_size}, border color {keyword_border_color or border_color}")
# 10. 处理动画效果
if caption.get('in_animation'):
in_animation_name = caption['in_animation']
in_animation_enum = map_animation_name_to_enum(in_animation_name, "in")
if in_animation_enum:
# 获取动画时长,优先使用指定时长,否则使用默认时长
in_duration = caption.get('in_animation_duration')
try:
text_segment.add_animation(in_animation_enum, duration=in_duration)
logger.info(f"Added in animation: {in_animation_name}")
except Exception as e:
logger.error(f"Failed to add in animation '{in_animation_name}': {str(e)}")
else:
logger.warning(f"In animation not found: {in_animation_name}")
if caption.get('out_animation'):
out_animation_name = caption['out_animation']
out_animation_enum = map_animation_name_to_enum(out_animation_name, "out")
if out_animation_enum:
# 获取动画时长,优先使用指定时长,否则使用默认时长
out_duration = caption.get('out_animation_duration')
try:
text_segment.add_animation(out_animation_enum, duration=out_duration)
logger.info(f"Added out animation: {out_animation_name}")
except Exception as e:
logger.error(f"Failed to add out animation '{out_animation_name}': {str(e)}")
else:
logger.warning(f"Out animation not found: {out_animation_name}")
if caption.get('loop_animation'):
loop_animation_name = caption['loop_animation']
loop_animation_enum = map_animation_name_to_enum(loop_animation_name, "loop")
if loop_animation_enum:
# 获取动画时长,优先使用指定时长,否则使用默认时长
loop_duration = caption.get('loop_animation_duration')
try:
text_segment.add_animation(loop_animation_enum, duration=loop_duration)
logger.info(f"Added loop animation: {loop_animation_name}")
except Exception as e:
logger.error(f"Failed to add loop animation '{loop_animation_name}': {str(e)}")
else:
logger.warning(f"Loop animation not found: {loop_animation_name}")
# 12. 向指定轨道添加片段
script.add_segment(text_segment, track_name)
# 13. 构造片段信息
segment_info = {
"id": text_segment.segment_id,
"start": caption['start'],
"end": caption['end']
}
return text_segment.segment_id, text_segment.material_id, segment_info
except CustomException:
# 重新抛出自定义异常
raise
except Exception as e:
# 捕获其他未预期的异常并转换为自定义异常
logger.error(f"Unexpected error in add_caption_to_draft: {str(e)}")
raise CustomException(CustomError.CAPTION_ADD_FAILED)
def apply_keyword_highlight(text_segment: TextSegment, keywords: str, keyword_color: tuple, keyword_font_size: float = None, keyword_border_color: tuple = None):
"""
应用关键词高亮到文本片段
Args:
text_segment: 文本片段对象
keywords: 关键词字符串,用'|'分隔多个关键词
keyword_color: 关键词颜色的RGB元组 (0-1范围)
keyword_font_size: 关键词字体大小,默认为None,使用文本默认字体大小
keyword_border_color: 关键词边框颜色的RGB元组 (0-1范围),默认为None
"""
# 分割关键词
keyword_list = keywords.split('|')
text = text_segment.text
# 使用关键词字体大小,如果没有指定则使用文本默认字体大小
font_size = keyword_font_size if keyword_font_size is not None else text_segment.style.size
# 为每个关键词创建高亮样式
for keyword in keyword_list:
keyword = keyword.strip()
if not keyword:
continue
# 查找所有匹配的关键词位置
start_pos = 0
while start_pos < len(text):
start_pos = text.find(keyword, start_pos)
if start_pos == -1:
break
end_pos = start_pos + len(keyword)
# 创建关键词高亮样式
highlight_style = {
"fill": {
"alpha": 1.0,
"content": {
"render_type": "solid",
"solid": {
"alpha": 1.0,
"color": list(keyword_color) # 使用关键词颜色
}
}
},
"range": [start_pos, end_pos],
"size": font_size, # 使用关键词字体大小
"bold": text_segment.style.bold,
"italic": text_segment.style.italic,
"underline": text_segment.style.underline
}
# 处理关键词边框颜色:当keyword_border_color不为None时添加描边
# keyword_border_color的值由调用方决定:优先使用keyword_border_color参数,否则使用border_color
if keyword_border_color is not None:
# 使用指定的关键词边框颜色创建描边
# 注意:剪映的stroke格式需要包含content.solid结构
highlight_style["strokes"] = [{
"content": {
"solid": {
"alpha": 1.0,
"color": list(keyword_border_color)
}
},
"width": 0.08 # 默认边框宽度(与剪映内部表示一致)
}]
# 注意:当keyword_border_color为None时(即既没有指定keyword_border_color也没有指定border_color),不添加描边
# 添加到文本片段的额外样式中
text_segment.extra_styles.append(highlight_style)
start_pos = end_pos
def parse_captions_data(json_str: str) -> List[Dict[str, Any]]:
"""
解析字幕数据的JSON字符串,处理可选字段的默认值
Args:
json_str: 包含字幕数据的JSON字符串,格式如下:
[
{
"start": 0, # [必选] 字幕开始时间(微秒)
"end": 10000000, # [必选] 字幕结束时间(微秒)
"text": "你好,剪映", # [必选] 字幕文本内容
"keyword": "好", # [可选] 关键词(用|分隔多个关键词)
"keyword_color": "#457616", # [可选] 关键词颜色,默认"#ff7100"
"keyword_border_color": "#000000", # [可选] 关键词边框颜色,默认None
"keyword_font_size": 15, # [可选] 关键词字体大小,默认15
"font_size": 15, # [可选] 文本字体大小,默认15
"in_animation": None, # [可选] 入场动画,默认None
"out_animation": None, # [可选] 出场动画,默认None
"loop_animation": None, # [可选] 循环动画,默认None
"in_animation_duration": None, # [可选] 入场动画时长,默认None
"out_animation_duration": None, # [可选] 出场动画时长,默认None
"loop_animation_duration": None # [可选] 循环动画时长,默认None
}
]
Returns:
包含字幕对象的数组,每个对象都处理了默认值
Raises:
CustomException: 当JSON格式错误或缺少必选字段时抛出
"""
try:
# 解析JSON字符串
data = json.loads(json_str)
logger.debug(f"Parsed JSON data: {data}")
except json.JSONDecodeError as e:
logger.error(f"JSON parse error: {e.msg}")
raise CustomException(CustomError.INVALID_CAPTION_INFO, f"JSON parse error: {e.msg}")
# 确保输入是列表
if not isinstance(data, list):
logger.error("captions should be a list")
raise CustomException(CustomError.INVALID_CAPTION_INFO, "captions should be a list")
result = []
for i, item in enumerate(data):
if not isinstance(item, dict):
logger.error(f"the {i}th item should be a dict")
raise CustomException(CustomError.INVALID_CAPTION_INFO, f"the {i}th item should be a dict")
# 检查必选字段
required_fields = ["start", "end", "text"]
missing_fields = [field for field in required_fields if field not in item]
if missing_fields:
logger.error(f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
raise CustomException(CustomError.INVALID_CAPTION_INFO, f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
# 创建处理后的对象,设置默认值
processed_item = {
"start": item["start"],
"end": item["end"],
"text": item["text"],
"keyword": item.get("keyword", None),
"keyword_color": item.get("keyword_color", "#ff7100"),
"keyword_border_color": item.get("keyword_border_color", None),
"keyword_font_size": item.get("keyword_font_size", 15),
"font_size": item.get("font_size", None),
"in_animation": item.get("in_animation", None),
"out_animation": item.get("out_animation", None),
"loop_animation": item.get("loop_animation", None),
"in_animation_duration": item.get("in_animation_duration", None),
"out_animation_duration": item.get("out_animation_duration", None),
"loop_animation_duration": item.get("loop_animation_duration", None)
}
# 验证数值类型和范围
if not isinstance(processed_item["start"], (int, float)) or processed_item["start"] < 0:
logger.error(f"the {i}th item has invalid start time: {processed_item['start']}")
raise CustomException(CustomError.INVALID_CAPTION_INFO, f"the {i}th item has invalid start time")
if not isinstance(processed_item["end"], (int, float)) or processed_item["end"] <= processed_item["start"]:
logger.error(f"the {i}th item has invalid end time: {processed_item['end']}")
raise CustomException(CustomError.INVALID_CAPTION_INFO, f"the {i}th item has invalid end time")
if not isinstance(processed_item["text"], str) or len(processed_item["text"].strip()) == 0:
logger.error(f"the {i}th item has invalid text: {processed_item['text']}")
raise CustomException(CustomError.INVALID_CAPTION_INFO, f"the {i}th item has invalid text")
# 验证keyword_font_size参数
if processed_item["keyword_font_size"] is not None and (
not isinstance(processed_item["keyword_font_size"], (int, float)) or
processed_item["keyword_font_size"] <= 0):
logger.warning(f"the {i}th item has invalid keyword_font_size: {processed_item['keyword_font_size']}, using default value 15")
processed_item["keyword_font_size"] = 15
result.append(processed_item)
logger.info(f"Successfully parsed {len(result)} caption items")
return result
def map_animation_name_to_enum(animation_name: str, animation_type: str):
"""
将动画名称字符串映射到对应的枚举值
Args:
animation_name: 动画名称字符串
animation_type: 动画类型 ("in", "out", "loop")
Returns:
对应的动画枚举值,如果未找到则返回None
"""
# 入场动画映射
in_animation_map = {}
for attr_name in dir(TextIntro):
attr = getattr(TextIntro, attr_name)
if isinstance(attr, TextIntro):
in_animation_map[attr.value.title] = attr
# 出场动画映射
out_animation_map = {}
for attr_name in dir(TextOutro):
attr = getattr(TextOutro, attr_name)
if isinstance(attr, TextOutro):
out_animation_map[attr.value.title] = attr
# 循环动画映射
loop_animation_map = {}
for attr_name in dir(TextLoopAnim):
attr = getattr(TextLoopAnim, attr_name)
if isinstance(attr, TextLoopAnim):
loop_animation_map[attr.value.title] = attr
if animation_type == "in":
return in_animation_map.get(animation_name)
elif animation_type == "out":
return out_animation_map.get(animation_name)
elif animation_type == "loop":
return loop_animation_map.get(animation_name)
return None
def hex_to_rgb(hex_color: str) -> tuple:
"""
将十六进制颜色值转换为RGB三元组(0-1范围)
Args:
hex_color: 十六进制颜色值,如"#ffffff"或"ffffff"
Returns:
RGB三元组,取值范围为[0, 1]
"""
# 去掉首尾空白后再处理 #,否则 " #RRGGBB" 会 lstrip 不到 # 导致长度校验失败
hex_color = hex_color.strip().lstrip('#')
# 确保是6位十六进制
if len(hex_color) != 6:
logger.warning(f"Invalid hex color format: {hex_color}, using white as default")
return (1.0, 1.0, 1.0)
try:
# 转换为RGB值(0-255)
r = int(hex_color[0:2], 16)
g = int(hex_color[2:4], 16)
b = int(hex_color[4:6], 16)
# 转换为0-1范围
return (r / 255.0, g / 255.0, b / 255.0)
except ValueError:
logger.warning(f"Invalid hex color format: {hex_color}, using white as default")
return (1.0, 1.0, 1.0)
================================================
FILE: src/service/add_effects.py
================================================
import json
from typing import List, Dict, Any, Tuple, Optional, Union
import asyncio
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, TrackType, EffectSegment, Timerange
from src.pyJianYingDraft.metadata import VideoSceneEffectType, VideoCharacterEffectType
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
from src.utils import helper
from src.utils.draft_lock_manager import DraftLockManager
def add_effects(
draft_url: str,
effect_infos: str
) -> Tuple[str, str, List[str], List[str]]:
"""
添加特效到剪映草稿的业务逻辑
Args:
draft_url: 草稿URL
effect_infos: 特效信息列表的JSON字符串,格式如下:
[
{
"effect_title": "录制边框 III", # 特效名称/标题,必选参数
"start": 0, # 特效开始时间(微秒),必选参数
"end": 5000000 # 特效结束时间(微秒),必选参数
}
]
Returns:
draft_url: 草稿URL
track_id: 特效轨道ID
effect_ids: 特效ID列表
segment_ids: 特效片段ID列表
Raises:
CustomException: 特效添加失败
"""
logger.info(f"add_effects started, draft_url: {draft_url}, effects count: {len(json.loads(effect_infos) if effect_infos else [])}")
# 1. 提取草稿ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft_url or draft not found in cache: {draft_url}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 2. 解析特效信息
effect_items = parse_effects_data(json_str=effect_infos)
if len(effect_items) == 0:
logger.info(f"No effect info provided, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_EFFECT_INFO)
logger.info(f"Parsed {len(effect_items)} effect items")
# 3. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 4. 添加特效轨道(与其它素材接口一致:按全局调用顺序叠层)
track_name = f"effect_track_{helper.gen_unique_id()}"
script.add_track_ordered(track_type=TrackType.effect, track_name=track_name)
logger.info(f"Added effect track: {track_name}")
# 5. 遍历特效信息,添加特效到草稿中的指定轨道,收集片段ID
segment_ids = []
effect_ids = []
for i, effect in enumerate(effect_items):
try:
logger.info(f"Processing effect {i+1}/{len(effect_items)}, title: {effect['effect_title']}")
segment_id, effect_id = add_effect_to_draft(
script, track_name, effect=effect
)
segment_ids.append(segment_id)
effect_ids.append(effect_id)
logger.info(f"Added effect {i+1}/{len(effect_items)}, segment_id: {segment_id}")
except Exception as e:
logger.error(f"Failed to add effect {i+1}/{len(effect_items)}, error: {str(e)}")
raise
# 6. 保存草稿
script.save()
logger.info(f"Draft saved successfully")
# 7. 获取当前特效轨道ID
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
track_id = script.tracks[key].track_id
break
logger.info(f"Effect track created, draft_id: {draft_id}, track_id: {track_id}")
logger.info(f"add_effects completed successfully - draft_id: {draft_id}, track_id: {track_id}, effects_added: {len(effect_items)}")
return draft_url, track_id, effect_ids, segment_ids
async def add_effects_async(
draft_url: str,
effect_infos: str,
lock_timeout: float = 30.0
) -> Tuple[str, str, List[str], List[str]]:
"""
添加特效到剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
effect_infos: JSON 字符串,包含特效信息列表,详见 add_effects 函数
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, track_id, effect_ids, segment_ids)
Raises:
CustomException: 特效添加失败或获取锁超时
asyncio.TimeoutError: 等待锁超时时抛出
Example:
>>> result = await add_effects_async(
... draft_url="http://.../draft_id=123",
... effect_infos='[{"effect_title":"录制边框 III", "start":0, "end":5000000}]'
... )
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 获取锁管理器
lock_manager = DraftLockManager()
# 尝试获取锁
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"Lock acquired for draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s"
)
try:
# 调用内部处理函数(不获取锁,由外层控制)
return add_effects(
draft_url=draft_url,
effect_infos=effect_infos
)
finally:
# 释放锁
await lock_manager.release_lock(draft_id)
logger.info(f"Lock released for draft_id: {draft_id}")
def add_effect_to_draft(
script: ScriptFile,
track_name: str,
effect: dict
) -> Tuple[str, str]:
"""
向剪映草稿中添加单个特效
Args:
script: 草稿文件对象
track_name: 特效轨道名称
effect: 特效信息字典,包含以下字段:
effect_title: 特效名称/标题
start: 特效开始时间(微秒)
end: 特效结束时间(微秒)
Returns:
segment_id: 片段ID
effect_id: 特效ID(material_id)
Raises:
CustomException: 添加特效失败
"""
try:
# 1. 查找特效类型
effect_type = find_effect_type_by_name(effect['effect_title'])
if effect_type is None:
logger.error(f"Effect type not found for title: {effect['effect_title']}")
raise CustomException(CustomError.EFFECT_NOT_FOUND)
# 2. 创建时间范围
effect_duration = effect['end'] - effect['start']
timerange = Timerange(start=effect['start'], duration=effect_duration)
# 3. 创建特效片段
effect_segment = EffectSegment(
effect_type=effect_type,
target_timerange=timerange
)
logger.info(f"Created effect segment, effect_id: {effect_segment.effect_inst.global_id}")
logger.info(f"Effect segment details - start: {effect['start']}, duration: {effect_duration}, title: {effect['effect_title']}")
# 4. 向指定轨道添加片段
script.add_segment(effect_segment, track_name)
return effect_segment.segment_id, effect_segment.effect_inst.global_id
except CustomException:
logger.error(f"Add effect to draft failed, effect: {effect}")
raise
except Exception as e:
logger.error(f"Add effect to draft failed, error: {str(e)}")
raise CustomException(CustomError.EFFECT_ADD_FAILED)
def find_effect_type_by_name(effect_title: str) -> Optional[Union[VideoSceneEffectType, VideoCharacterEffectType]]:
"""
根据特效名称查找对应的特效类型
Args:
effect_title: 特效名称/标题
Returns:
对应的特效类型枚举,如果未找到则返回None
"""
logger.info(f"Searching for effect type with title: {effect_title}")
# 搜索VideoSceneEffectType中的特效
for effect_type in VideoSceneEffectType:
if effect_type.value.name == effect_title:
logger.info(f"Found scene effect: {effect_title}")
return effect_type
# 搜索VideoCharacterEffectType中的特效
for effect_type in VideoCharacterEffectType:
if effect_type.value.name == effect_title:
logger.info(f"Found character effect: {effect_title}")
return effect_type
logger.warning(f"Effect type not found for title: {effect_title}")
return None
def parse_effects_data(json_str: str) -> List[Dict[str, Any]]:
"""
解析特效数据的JSON字符串,验证必选字段和数值范围
Args:
json_str: 包含特效数据的JSON字符串,格式如下:
[
{
"effect_title": "录制边框 III", # [必选] 特效名称/标题
"start": 0, # [必选] 特效开始时间(微秒)
"end": 5000000 # [必选] 特效结束时间(微秒)
}
]
Returns:
包含特效对象的数组,每个对象都验证过格式和范围
Raises:
CustomException: 当JSON格式错误或缺少必选字段时抛出
"""
try:
# 解析JSON字符串
data = json.loads(json_str)
except json.JSONDecodeError as e:
logger.error(f"JSON parse error: {e.msg}")
raise CustomException(CustomError.INVALID_EFFECT_INFO, f"JSON parse error: {e.msg}")
# 确保输入是列表
if not isinstance(data, list):
logger.error("effect_infos should be a list")
raise CustomException(CustomError.INVALID_EFFECT_INFO, "effect_infos should be a list")
result = []
for i, item in enumerate(data):
if not isinstance(item, dict):
logger.error(f"the {i}th item should be a dict")
raise CustomException(CustomError.INVALID_EFFECT_INFO, f"the {i}th item should be a dict")
# 检查必选字段
required_fields = ["effect_title", "start", "end"]
missing_fields = [field for field in required_fields if field not in item]
if missing_fields:
logger.error(f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
raise CustomException(CustomError.INVALID_EFFECT_INFO, f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
# 创建处理后的对象
processed_item = {
"effect_title": str(item["effect_title"]),
"start": item["start"],
"end": item["end"]
}
# 验证数值类型和范围
if not isinstance(processed_item["start"], (int, float)) or processed_item["start"] < 0:
logger.error(f"the {i}th item has invalid start time: {processed_item['start']}")
raise CustomException(CustomError.INVALID_EFFECT_INFO, f"the {i}th item has invalid start time")
if not isinstance(processed_item["end"], (int, float)) or processed_item["end"] <= processed_item["start"]:
logger.error(f"the {i}th item has invalid end time: {processed_item['end']}")
raise CustomException(CustomError.INVALID_EFFECT_INFO, f"the {i}th item has invalid end time")
# 验证特效名称
if len(processed_item["effect_title"].strip()) == 0:
logger.error(f"the {i}th item has invalid effect_title: {processed_item['effect_title']}")
raise CustomException(CustomError.INVALID_EFFECT_INFO, f"the {i}th item has invalid effect_title")
# 将时间转换为整数(微秒)
processed_item["start"] = int(processed_item["start"])
processed_item["end"] = int(processed_item["end"])
result.append(processed_item)
logger.info(f"Successfully parsed {len(result)} effect items")
return result
================================================
FILE: src/service/add_filters.py
================================================
import json
from typing import List, Dict, Any, Tuple, Optional
import asyncio
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, TrackType, FilterSegment, Timerange
from src.pyJianYingDraft.metadata import FilterType
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
from src.utils import helper
from src.utils.draft_lock_manager import DraftLockManager
def add_filters(
draft_url: str,
filter_infos: str
) -> Tuple[str, str, List[str], List[str]]:
"""
添加滤镜到剪映草稿的业务逻辑
Args:
draft_url: 草稿URL
filter_infos: 滤镜信息列表的JSON字符串,格式如下:
[
{
"filter_title": "复古", # 滤镜名称/标题,必选参数
"start": 0, # 滤镜开始时间(微秒),必选参数
"end": 5000000, # 滤镜结束时间(微秒),必选参数
"intensity": 100 # 滤镜强度(0-100),可选参数,默认100
}
]
Returns:
draft_url: 草稿URL
track_id: 滤镜轨道ID
filter_ids: 滤镜ID列表
segment_ids: 滤镜片段ID列表
Raises:
CustomException: 滤镜添加失败
"""
logger.info(f"add_filters started, draft_url: {draft_url}, filters count: {len(json.loads(filter_infos) if filter_infos else [])}")
# 1. 提取草稿ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft_url or draft not found in cache: {draft_url}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 2. 解析滤镜信息
filter_items = parse_filters_data(json_str=filter_infos)
if len(filter_items) == 0:
logger.info(f"No filter info provided, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_FILTER_INFO)
logger.info(f"Parsed {len(filter_items)} filter items")
# 3. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 4. 添加滤镜轨道(按全局接口调用顺序叠层,与 add_videos / add_images / add_captions 等一致)
track_name = f"filter_track_{helper.gen_unique_id()}"
script.add_track_ordered(track_type=TrackType.filter, track_name=track_name)
logger.info(f"Added filter track: {track_name}")
# 5. 遍历滤镜信息,添加滤镜到草稿中的指定轨道,收集片段ID
segment_ids = []
filter_ids = []
for i, filter_item in enumerate(filter_items):
try:
logger.info(f"Processing filter {i+1}/{len(filter_items)}, title: {filter_item['filter_title']}")
segment_id, filter_id = add_filter_to_draft(
script, track_name, filter_item=filter_item
)
segment_ids.append(segment_id)
filter_ids.append(filter_id)
logger.info(f"Added filter {i+1}/{len(filter_items)}, segment_id: {segment_id}")
except Exception as e:
logger.error(f"Failed to add filter {i+1}/{len(filter_items)}, error: {str(e)}")
raise
# 6. 保存草稿
script.save()
logger.info("Draft saved successfully")
# 7. 获取当前滤镜轨道ID
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
track_id = script.tracks[key].track_id
break
logger.info(f"Filter track created, draft_id: {draft_id}, track_id: {track_id}")
logger.info(f"add_filters completed successfully - draft_id: {draft_id}, track_id: {track_id}, filters_added: {len(filter_items)}")
return draft_url, track_id, filter_ids, segment_ids
async def add_filters_async(
draft_url: str,
filter_infos: str,
lock_timeout: float = 30.0
) -> Tuple[str, str, List[str], List[str]]:
"""
添加滤镜到剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
filter_infos: JSON 字符串,包含滤镜信息列表,详见 add_filters 函数
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, track_id, filter_ids, segment_ids)
Raises:
CustomException: 滤镜添加失败或获取锁超时
asyncio.TimeoutError: 等待锁超时时抛出
Example:
>>> result = await add_filters_async(
... draft_url="http://.../draft_id=123",
... filter_infos='[{"filter_title":"复古", "start":0, "end":5000000}]'
... )
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 获取锁管理器
lock_manager = DraftLockManager()
# 尝试获取锁
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"Lock acquired for draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s"
)
try:
# 调用内部处理函数(不获取锁,由外层控制)
return add_filters(
draft_url=draft_url,
filter_infos=filter_infos
)
finally:
# 释放锁
await lock_manager.release_lock(draft_id)
logger.info(f"Lock released for draft_id: {draft_id}")
def add_filter_to_draft(
script: ScriptFile,
track_name: str,
filter_item: dict
) -> Tuple[str, str]:
"""
向剪映草稿中添加单个滤镜
Args:
script: 草稿文件对象
track_name: 滤镜轨道名称
filter_item: 滤镜信息字典,包含以下字段:
filter_title: 滤镜名称/标题
start: 滤镜开始时间(微秒)
end: 滤镜结束时间(微秒)
intensity: 滤镜强度(0-100),可选,默认100
Returns:
segment_id: 片段ID
filter_id: 滤镜ID(material_id)
Raises:
CustomException: 添加滤镜失败
"""
try:
# 1. 查找滤镜类型
filter_type = find_filter_type_by_name(filter_item['filter_title'])
if filter_type is None:
logger.error(f"Filter type not found for title: {filter_item['filter_title']}")
raise CustomException(CustomError.FILTER_NOT_FOUND)
# 2. 创建时间范围
filter_duration = filter_item['end'] - filter_item['start']
timerange = Timerange(start=filter_item['start'], duration=filter_duration)
# 3. 获取滤镜强度(默认100)
intensity = filter_item.get('intensity', 100.0)
# 4. 创建滤镜片段
filter_segment = FilterSegment(
meta=filter_type,
target_timerange=timerange,
intensity=intensity / 100.0 # 转换为0-1范围
)
logger.info(f"Created filter segment, filter_id: {filter_segment.material.global_id}")
logger.info(f"Filter segment details - start: {filter_item['start']}, duration: {filter_duration}, title: {filter_item['filter_title']}, intensity: {intensity}")
# 5. 向指定轨道添加片段
script.add_segment(filter_segment, track_name)
return filter_segment.segment_id, filter_segment.material.global_id
except CustomException:
logger.error(f"Add filter to draft failed, filter: {filter_item}")
raise
except Exception as e:
logger.error(f"Add filter to draft failed, error: {str(e)}")
raise CustomException(CustomError.FILTER_ADD_FAILED)
def find_filter_type_by_name(filter_title: str) -> Optional[FilterType]:
"""
根据滤镜名称查找对应的滤镜类型
Args:
filter_title: 滤镜名称/标题
Returns:
对应的滤镜类型枚举,如果未找到则返回None
"""
logger.info(f"Searching for filter type with title: {filter_title}")
# 搜索FilterType中的滤镜
for filter_type in FilterType:
if filter_type.value.name == filter_title:
logger.info(f"Found filter: {filter_title}")
return filter_type
logger.warning(f"Filter type not found for title: {filter_title}")
return None
def parse_filters_data(json_str: str) -> List[Dict[str, Any]]:
"""
解析滤镜数据的JSON字符串,验证必选字段和数值范围
Args:
json_str: 包含滤镜数据的JSON字符串,格式如下:
[
{
"filter_title": "复古", # [必选] 滤镜名称/标题
"start": 0, # [必选] 滤镜开始时间(微秒)
"end": 5000000, # [必选] 滤镜结束时间(微秒)
"intensity": 100 # [可选] 滤镜强度(0-100),默认100
}
]
Returns:
包含滤镜对象的数组,每个对象都验证过格式和范围
Raises:
CustomException: 当JSON格式错误或缺少必选字段时抛出
"""
try:
# 解析JSON字符串
data = json.loads(json_str)
except json.JSONDecodeError as e:
logger.error(f"JSON parse error: {e.msg}")
raise CustomException(CustomError.INVALID_FILTER_INFO, f"JSON parse error: {e.msg}")
# 确保输入是列表
if not isinstance(data, list):
logger.error("filter_infos should be a list")
raise CustomException(CustomError.INVALID_FILTER_INFO, "filter_infos should be a list")
result = []
for i, item in enumerate(data):
if not isinstance(item, dict):
logger.error(f"the {i}th item should be a dict")
raise CustomException(CustomError.INVALID_FILTER_INFO, f"the {i}th item should be a dict")
# 检查必选字段
required_fields = ["filter_title", "start", "end"]
missing_fields = [field for field in required_fields if field not in item]
if missing_fields:
logger.error(f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
raise CustomException(CustomError.INVALID_FILTER_INFO, f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
# 创建处理后的对象
processed_item = {
"filter_title": str(item["filter_title"]),
"start": item["start"],
"end": item["end"],
"intensity": item.get("intensity", 100.0) # 默认强度为100
}
# 验证数值类型和范围
if not isinstance(processed_item["start"], (int, float)) or processed_item["start"] < 0:
logger.error(f"the {i}th item has invalid start time: {processed_item['start']}")
raise CustomException(CustomError.INVALID_FILTER_INFO, f"the {i}th item has invalid start time")
if not isinstance(processed_item["end"], (int, float)) or processed_item["end"] <= processed_item["start"]:
logger.error(f"the {i}th item has invalid end time: {processed_item['end']}")
raise CustomException(CustomError.INVALID_FILTER_INFO, f"the {i}th item has invalid end time")
# 验证滤镜名称
if len(processed_item["filter_title"].strip()) == 0:
logger.error(f"the {i}th item has invalid filter_title: {processed_item['filter_title']}")
raise CustomException(CustomError.INVALID_FILTER_INFO, f"the {i}th item has invalid filter_title")
# 验证强度范围
if not isinstance(processed_item["intensity"], (int, float)) or processed_item["intensity"] < 0 or processed_item["intensity"] > 100:
logger.error(f"the {i}th item has invalid intensity: {processed_item['intensity']}")
raise CustomException(CustomError.INVALID_FILTER_INFO, f"the {i}th item has invalid intensity (must be 0-100)")
# 将时间转换为整数(微秒)
processed_item["start"] = int(processed_item["start"])
processed_item["end"] = int(processed_item["end"])
processed_item["intensity"] = float(processed_item["intensity"])
result.append(processed_item)
logger.info(f"Successfully parsed {len(result)} filter items")
return result
================================================
FILE: src/service/add_images.py
================================================
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, trange
import src.pyJianYingDraft as draft
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
from src.schemas.add_images import SegmentInfo
import os
from src.utils import helper
from src.utils.download import download
import config
import json
import asyncio
import time
from typing import List, Dict, Any, Tuple, Optional
from src.utils.draft_lock_manager import DraftLockManager
from src.pyJianYingDraft.metadata import IntroType, OutroType, GroupAnimationType, TransitionType
def add_images(
draft_url: str,
image_infos: str,
alpha: float = 1.0,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: int = 0,
transform_y: int = 0
) -> Tuple[str, str, List[str], List[str], List[SegmentInfo]]:
"""
添加图片到剪映草稿的业务逻辑
Args:
draft_url: 草稿URL,必选参数
image_infos: 图片信息JSON字符串,格式如下:
[
{
"image_url": "https://s.coze.cn/t/XpufYwc2_u4/", // [必选] 图片文件URL
"width": 1920, // [可选] 图片宽度(像素),不传则使用草稿画布尺寸
"height": 1080, // [可选] 图片高度(像素),不传则使用草稿画布尺寸
"start": 0, // [必选] 显示开始时间(微秒)
"end": 1000000, // [必选] 显示结束时间(微秒)
"in_animation": "", // [可选] 入场动画类型
"out_animation": "", // [可选] 出场动画类型
"loop_animation": "", // [可选] 循环动画类型
"in_animation_duration": "", // [可选] 入场动画时长(微秒)
"out_animation_duration": "", // [可选] 出场动画时长(微秒)
"loop_animation_duration": "", // [可选] 循环动画时长(微秒)
"transition": "", // [可选] 转场效果类型
"transition_duration": 500000 // [可选] 转场效果时长(微秒,范围100000-2500000)
}
]
alpha: 全局透明度[0, 1],默认值为1.0
scale_x: X轴缩放比例,默认值为1.0
scale_y: Y轴缩放比例,默认值为1.0
transform_x: X轴位置偏移(像素),默认值为0
transform_y: Y轴位置偏移(像素),默认值为0
Returns:
draft_url: 草稿URL
track_id: 图片轨道ID(非主轨道)
image_ids: 图片ID列表
segment_ids: 片段ID列表
segment_infos: 片段信息列表,包含每个片段的ID、开始时间和结束时间
Raises:
CustomException: 图片批量添加失败
"""
return _add_images_internal(
draft_url=draft_url,
image_infos=image_infos,
alpha=alpha,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x,
transform_y=transform_y,
prepared_images=None,
)
def _prepare_images_local_files(draft_url: str, image_infos: str) -> List[Dict[str, Any]]:
"""
校验草稿、解析 image_infos 并下载素材到草稿目录。
不修改 ScriptFile,可在草稿写锁外调用。
"""
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft URL or draft not found in cache, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
draft_image_dir = os.path.join(draft_dir, "assets", "images")
os.makedirs(name=draft_image_dir, exist_ok=True)
logger.info(f"Created image directory: {draft_image_dir}")
images = parse_image_data(json_str=image_infos)
if len(images) == 0:
logger.error(f"No image info provided, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_IMAGE_INFO)
for image in images:
image["local_image_path"] = download(url=image["image_url"], save_dir=draft_image_dir)
return images
def _add_images_internal(
draft_url: str,
image_infos: str,
alpha: float = 1.0,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: int = 0,
transform_y: int = 0,
prepared_images: Optional[List[Dict[str, Any]]] = None,
) -> Tuple[str, str, List[str], List[str], List[SegmentInfo]]:
logger.info(
f"add_images started, draft_url: {draft_url}, alpha: {alpha}, scale_x: {scale_x}, "
f"scale_y: {scale_y}, transform_x: {transform_x}, transform_y: {transform_y}"
)
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft URL or draft not found in cache, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
draft_image_dir = os.path.join(draft_dir, "assets", "images")
os.makedirs(name=draft_image_dir, exist_ok=True)
logger.info(f"Using image directory: {draft_image_dir}")
if prepared_images is not None:
images = prepared_images
else:
images = parse_image_data(json_str=image_infos)
if len(images) == 0:
logger.error(f"No image info provided, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_IMAGE_INFO)
logger.info(f"Using {len(images)} image items")
script: ScriptFile = DRAFT_CACHE[draft_id]
track_name = f"image_track_{helper.gen_unique_id()}"
# 与 add_videos / add_captions / add_filters 等一致:按全局接口调用顺序叠层(后调用在上)
script.add_track_ordered(track_type=draft.TrackType.video, track_name=track_name)
logger.info(f"Added image track (non-main track): {track_name}")
segment_ids = []
segment_infos = []
for i, image in enumerate(images):
try:
segment_id, segment_info = add_image_to_draft(
script, track_name,
draft_image_dir=draft_image_dir,
image=image,
alpha=alpha,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x,
transform_y=transform_y,
)
segment_ids.append(segment_id)
segment_infos.append(segment_info)
logger.info(f"Added image {i+1}/{len(images)}, segment_id: {segment_id}")
except Exception as e:
logger.error(f"Failed to add image {i+1}/{len(images)}, error: {str(e)}")
raise
script.save()
logger.info(f"Draft saved successfully")
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
track_id = script.tracks[key].track_id
break
logger.info(f"Image track created, draft_id: {draft_id}, track_id: {track_id}")
image_ids = [video.material_id for video in script.materials.videos if video.material_type == "photo"]
logger.info(f"Image track completed, draft_id: {draft_id}, image_ids: {image_ids}")
return draft_url, track_id, image_ids, segment_ids, segment_infos
async def add_images_async(
draft_url: str,
image_infos: str,
alpha: float = 1.0,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: int = 0,
transform_y: int = 0,
lock_timeout: float = 30.0
) -> Tuple[str, str, List[str], List[str], List[SegmentInfo]]:
"""
添加图片到剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
4. 图片下载在获取锁之前完成,持锁阶段仅修改草稿与写盘
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
image_infos: JSON 字符串,包含图片信息列表,详见 add_images 函数
alpha: 全局透明度 [0, 1],默认 1.0
scale_x: X 轴缩放比例,默认 1.0
scale_y: Y 轴缩放比例,默认 1.0
transform_x: X 轴位置偏移(像素),默认 0
transform_y: Y 轴位置偏移(像素),默认 0
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, track_id, image_ids, segment_ids, segment_infos)
Raises:
CustomException: 图片添加失败,或 `DRAFT_LOCK_TIMEOUT`(获取写锁超时)
Example:
>>> result = await add_images_async(
... draft_url="http://.../draft_id=123",
... image_infos='[{"image_url":"...", "width":1024, "height":1024, "start":0, "end":5000000}]'
... )
"""
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
logger.info(f"[flow:add_images] prep_start, draft_id: {draft_id}")
# 下载与预处理放到线程池,避免阻塞事件循环导致锁超时漂移
prep_started_at = time.monotonic()
prepared_images = await asyncio.to_thread(
_prepare_images_local_files,
draft_url,
image_infos,
)
logger.info(
f"[flow:add_images] prep_done, draft_id: {draft_id}, "
f"count: {len(prepared_images)}, elapsed: {time.monotonic() - prep_started_at:.3f}s"
)
lock_manager = DraftLockManager()
logger.info(f"[flow:add_images] lock_wait_start, draft_id: {draft_id}, timeout: {lock_timeout}s")
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"[flow:add_images] lock_acquired, draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s",
)
try:
return _add_images_internal(
draft_url=draft_url,
image_infos=image_infos,
alpha=alpha,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x,
transform_y=transform_y,
prepared_images=prepared_images,
)
finally:
await lock_manager.release_lock(draft_id)
logger.info(f"[flow:add_images] lock_released, draft_id: {draft_id}")
def add_image_to_draft(
script: ScriptFile,
track_name: str,
draft_image_dir: str,
image: dict,
alpha: float = 1.0,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: int = 0,
transform_y: int = 0
) -> Tuple[str, SegmentInfo]:
"""
向剪映草稿中添加单个图片
Args:
script: 草稿文件对象
track_name: 视频轨道名称
draft_image_dir: 图片资源目录
image: 图片信息字典,包含以下字段:
image_url: 图片URL
width: 图片宽度(像素,可选,不传则使用草稿画布尺寸)
height: 图片高度(像素,可选,不传则使用草稿画布尺寸)
start: 显示开始时间(微秒)
end: 显示结束时间(微秒)
in_animation: 入场动画类型(可选)
out_animation: 出场动画类型(可选)
loop_animation: 循环动画类型(可选)
in_animation_duration: 入场动画时长(微秒,可选)
out_animation_duration: 出场动画时长(微秒,可选)
loop_animation_duration: 循环动画时长(微秒,可选)
transition: 转场效果类型(可选)
transition_duration: 转场效果时长(微秒,可选)
alpha: 图片透明度
scale_x: 横向缩放
scale_y: 纵向缩放
transform_x: X轴位置偏移(像素)
transform_y: Y轴位置偏移(像素)
Returns:
segment_id: 片段ID
segment_info: 片段信息字典,包含id、start、end
Raises:
CustomException: 添加图片失败
"""
try:
image_path = image.get("local_image_path")
if image_path:
if not os.path.isfile(image_path):
raise CustomException(CustomError.IMAGE_ADD_FAILED, f"Missing local file: {image_path}")
logger.info(f"Using local image: {image_path}")
else:
image_path = download(url=image["image_url"], save_dir=draft_image_dir)
logger.info(f"Downloaded image from {image['image_url']} to {image_path}")
# 2. 创建图片素材并添加到草稿
segment_duration = image['end'] - image['start']
# 获取草稿的宽高用于transform坐标转换
draft_width = script.width
draft_height = script.height
image_width = int(image.get("width") or draft_width)
image_height = int(image.get("height") or draft_height)
logger.info(
f"draft size: {draft_width}x{draft_height}, image size: {image_width}x{image_height}, "
f"transform_x: {transform_x}, transform_y: {transform_y}"
)
# 创建图像调节设置
clip_settings = draft.ClipSettings(
alpha=alpha,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x / draft_width, # 转为半画布宽单位
transform_y=transform_y / draft_height # 转换为半画布高单位
)
# 创建视频片段(图片使用VideoSegment)
video_segment = draft.VideoSegment(
material=image_path,
target_timerange=trange(start=image['start'], duration=segment_duration),
clip_settings=clip_settings
)
# 3. 添加动画效果(如果指定了)
if image.get('in_animation'):
try:
in_duration = image.get('in_animation_duration')
if in_duration is not None and in_duration != "":
in_duration = int(in_duration)
else:
in_duration = None
intro_enum = map_video_animation_name_to_enum(image['in_animation'], 'in')
if intro_enum:
video_segment.add_animation(intro_enum, duration=in_duration)
logger.info(f"Successfully added in animation '{image['in_animation']}' to image segment")
else:
logger.warning(f"In animation '{image['in_animation']}' not found in available animations")
except Exception as e:
logger.warning(f"Failed to add in animation '{image['in_animation']}': {str(e)}")
if image.get('out_animation'):
try:
out_duration = image.get('out_animation_duration')
if out_duration is not None and out_duration != "":
out_duration = int(out_duration)
else:
out_duration = None
outro_enum = map_video_animation_name_to_enum(image['out_animation'], 'out')
if outro_enum:
video_segment.add_animation(outro_enum, duration=out_duration)
logger.info(f"Successfully added out animation '{image['out_animation']}' to image segment")
else:
logger.warning(f"Out animation '{image['out_animation']}' not found in available animations")
except Exception as e:
logger.warning(f"Failed to add out animation '{image['out_animation']}': {str(e)}")
# 注意:对于图片,循环动画通常不适用,所以这里处理为组合动画
if image.get('loop_animation'):
try:
group_duration = image.get('loop_animation_duration')
if group_duration is not None and group_duration != "":
group_duration = int(group_duration)
else:
group_duration = None
group_enum = map_video_animation_name_to_enum(image['loop_animation'], 'group')
if group_enum:
video_segment.add_animation(group_enum, duration=group_duration)
logger.info(f"Successfully added group animation '{image['loop_animation']}' to image segment")
else:
logger.warning(f"Group animation '{image['loop_animation']}' not found in available animations")
except Exception as e:
logger.warning(f"Failed to add group animation '{image['loop_animation']}': {str(e)}")
# 4. 添加转场效果(如果指定了)
if image.get('transition'):
try:
# 遍历TransitionType中的所有转场效果
transition_enum = None
for attr_name in dir(TransitionType):
attr = getattr(TransitionType, attr_name)
if isinstance(attr, TransitionType) and attr.value.name == image['transition']:
transition_enum = attr
break
if transition_enum:
transition_duration = image.get('transition_duration')
if transition_duration is not None:
transition_duration = int(transition_duration)
video_segment.add_transition(transition_enum, duration=transition_duration)
logger.info(f"Successfully added transition '{image['transition']}' to image segment")
else:
logger.warning(f"Transition '{image['transition']}' not found in available transitions")
except Exception as e:
logger.warning(f"Failed to add transition '{image['transition']}': {str(e)}")
logger.info(f"Created image segment, material_id: {video_segment.material_instance.material_id}")
logger.info(f"Image segment details - start: {image['start']}, duration: {segment_duration}, size: {image_width}x{image_height}")
# 5. 向指定轨道添加片段
script.add_segment(video_segment, track_name)
# 6. 构造片段信息
segment_info = SegmentInfo(
id=video_segment.segment_id,
start=image['start'],
end=image['end']
)
return video_segment.segment_id, segment_info
except CustomException:
logger.error(f"Add image to draft failed, draft_image_dir: {draft_image_dir}, image: {image}")
raise
except Exception as e:
logger.error(f"Add image to draft failed, error: {str(e)}")
raise CustomException(err=CustomError.IMAGE_ADD_FAILED)
def map_video_animation_name_to_enum(animation_name: str, animation_type: str):
"""
将视频动画名称字符串映射到对应的枚举值
Args:
animation_name: 动画名称字符串
animation_type: 动画类型 ("in", "out", "group")
Returns:
对应的动画枚举值,如果未找到则返回None
"""
# 入场动画映射
in_animation_map = {}
for attr_name in dir(IntroType):
attr = getattr(IntroType, attr_name)
if isinstance(attr, IntroType):
in_animation_map[attr.value.title] = attr
# 出场动画映射
out_animation_map = {}
for attr_name in dir(OutroType):
attr = getattr(OutroType, attr_name)
if isinstance(attr, OutroType):
out_animation_map[attr.value.title] = attr
# 组合动画映射
group_animation_map = {}
for attr_name in dir(GroupAnimationType):
attr = getattr(GroupAnimationType, attr_name)
if isinstance(attr, GroupAnimationType):
group_animation_map[attr.value.title] = attr
if animation_type == "in":
return in_animation_map.get(animation_name)
elif animation_type == "out":
return out_animation_map.get(animation_name)
elif animation_type == "group":
return group_animation_map.get(animation_name)
return None
def parse_image_data(json_str: str) -> List[Dict[str, Any]]:
"""
解析图片数据的JSON字符串,处理可选字段的默认值
Args:
json_str: 包含图片数据的JSON字符串,格式如下:
[
{
"image_url": "https://s.coze.cn/t/XpufYwc2_u4/", // [必选] 图片文件URL
"width": 1920, // [可选] 图片宽度(像素),不传则使用草稿画布尺寸
"height": 1080, // [可选] 图片高度(像素),不传则使用草稿画布尺寸
"start": 0, // [必选] 显示开始时间(微秒)
"end": 1000000, // [必选] 显示结束时间(微秒)
"in_animation": "", // [可选] 入场动画类型
"out_animation": "", // [可选] 出场动画类型
"loop_animation": "", // [可选] 循环动画类型
"in_animation_duration": "", // [可选] 入场动画时长(微秒)
"out_animation_duration": "", // [可选] 出场动画时长(微秒)
"loop_animation_duration": "", // [可选] 循环动画时长(微秒)
"transition": "", // [可选] 转场效果类型
"transition_duration": 500000 // [可选] 转场效果时长(微秒,范围100000-2500000)
}
]
Returns:
包含图片对象的数组,每个对象都处理了默认值
Raises:
CustomException: 当JSON格式错误或缺少必选字段时抛出
"""
try:
# 解析JSON字符串
data = json.loads(json_str)
logger.info(f"Successfully parsed JSON with {len(data) if isinstance(data, list) else 1} items")
except json.JSONDecodeError as e:
logger.error(f"JSON parse error: {e.msg}")
raise CustomException(CustomError.INVALID_IMAGE_INFO, f"JSON parse error: {e.msg}")
# 确保输入是列表
if not isinstance(data, list):
logger.error("Image infos should be a list")
raise CustomException(CustomError.INVALID_IMAGE_INFO, "image_infos should be a list")
result = []
for i, item in enumerate(data):
if not isinstance(item, dict):
logger.error(f"The {i}th item should be a dict")
raise CustomException(CustomError.INVALID_IMAGE_INFO, f"the {i}th item should be a dict")
# 检查必选字段(width/height 可选,未传时在 add_image_to_draft 中使用草稿画布尺寸)
required_fields = ["image_url", "start", "end"]
missing_fields = [field for field in required_fields if field not in item]
if missing_fields:
logger.error(f"The {i}th item is missing required fields: {', '.join(missing_fields)}")
raise CustomException(CustomError.INVALID_IMAGE_INFO, f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
width = item.get("width")
height = item.get("height")
if width is not None:
width = int(width)
if height is not None:
height = int(height)
# 创建处理后的对象,设置默认值
processed_item = {
"image_url": item["image_url"],
"width": width,
"height": height,
"start": int(item["start"]),
"end": int(item["end"]),
"in_animation": item.get("in_animation", None), # 默认无入场动画
"out_animation": item.get("out_animation", None), # 默认无出场动画
"loop_animation": item.get("loop_animation", None), # 默认无循环动画
"in_animation_duration": item.get("in_animation_duration", None), # 默认无入场动画时长
"out_animation_duration": item.get("out_animation_duration", None), # 默认无出场动画时长
"loop_animation_duration": item.get("loop_animation_duration", None), # 默认无循环动画时长
"transition": item.get("transition", None), # 默认无转场
"transition_duration": item.get("transition_duration", 500000) # 默认转场时长500000微秒
}
# 验证数值范围(仅校验显式传入的尺寸)
if (processed_item["width"] is not None and processed_item["width"] <= 0) or (
processed_item["height"] is not None and processed_item["height"] <= 0
):
logger.error(
f"Invalid image dimensions: width={processed_item['width']}, height={processed_item['height']}"
)
raise CustomException(CustomError.INVALID_IMAGE_INFO, f"the {i}th item has invalid image dimensions")
if processed_item["start"] < 0 or processed_item["end"] <= processed_item["start"]:
logger.error(f"Invalid time range: start={processed_item['start']}, end={processed_item['end']}")
raise CustomException(CustomError.INVALID_IMAGE_INFO, f"the {i}th item has invalid time range")
# 验证转场时长范围
if processed_item["transition_duration"] < 100000 or processed_item["transition_duration"] > 2500000:
logger.warning(f"Transition duration {processed_item['transition_duration']} out of range [100000, 2500000], using default 500000")
processed_item["transition_duration"] = 500000
result.append(processed_item)
logger.debug(f"Processed image item {i+1}: {processed_item}")
return result
================================================
FILE: src/service/add_keyframes.py
================================================
import json
from typing import List, Dict, Any, Tuple, Optional
import asyncio
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile
from src.pyJianYingDraft.keyframe import KeyframeProperty
from src.pyJianYingDraft.segment import VisualSegment
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
from src.utils import helper
from src.utils.draft_lock_manager import DraftLockManager
from src.utils.keyframe_value import normalize_keyframe_value
def add_keyframes(
draft_url: str,
keyframes: str
) -> Tuple[str, int, List[str]]:
"""
添加关键帧到剪映草稿的业务逻辑
Args:
draft_url: 草稿URL
keyframes: 关键帧信息列表的JSON字符串,格式如下:
[
{
"segment_id": "d62994b4-25fe-422a-a123-87ef05038558", # 目标片段的唯一标识ID
"property": "KFTypePositionX", # 动画属性类型
"offset": 0.5, # 关键帧在片段中的时间偏移(0-1范围)
"value": -0.1 # 属性在该时间点的值
}
]
Returns:
draft_url: 草稿URL
keyframes_added: 添加的关键帧数量
affected_segments: 受影响的片段ID列表
Raises:
CustomException: 关键帧添加失败
"""
logger.info(f"add_keyframes started, draft_url: {draft_url}, keyframes: {keyframes}")
# 1. 提取草稿ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft_url or draft not found in cache: {draft_url}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 2. 解析关键帧信息
keyframe_items = parse_keyframes_data(json_str=keyframes)
if len(keyframe_items) == 0:
logger.info(f"No keyframe info provided, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_KEYFRAME_INFO)
logger.info(f"Parsed {len(keyframe_items)} keyframe items")
# 3. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 4. 处理每个关键帧
keyframes_added = 0
affected_segments: List[str] = []
failed_keyframes = 0 # 记录失败的关键帧数量
for i, keyframe_item in enumerate(keyframe_items):
try:
logger.info(f"Processing keyframe {i+1}/{len(keyframe_items)}, segment_id: {keyframe_item['segment_id']}, property: {keyframe_item['property']}")
# 查找片段
segment = find_segment_by_id(script, keyframe_item['segment_id'])
if segment is None:
logger.error(f"Segment not found: {keyframe_item['segment_id']}, skipping this keyframe")
failed_keyframes += 1
continue # 继续处理下一个关键帧
# 验证片段类型
if not isinstance(segment, VisualSegment):
logger.error(f"Segment {keyframe_item['segment_id']} is not a visual segment, cannot add keyframes, skipping this keyframe")
failed_keyframes += 1
continue # 继续处理下一个关键帧
# 验证动画属性类型
try:
property_enum = KeyframeProperty(keyframe_item['property'])
except ValueError:
logger.error(f"Invalid property type: {keyframe_item['property']}, skipping this keyframe")
failed_keyframes += 1
continue # 继续处理下一个关键帧
# 处理offset值:只支持微秒绝对时间,需要转换为相对时间
segment_duration = segment.duration
offset_value = keyframe_item['offset']
# 将微秒绝对时间转换为相对时间(0-1范围)
relative_offset = offset_value / segment_duration
# 确保相对时间在有效范围内
relative_offset = max(0.0, min(1.0, relative_offset))
logger.info(f"Converting absolute offset {offset_value} microseconds to relative offset {relative_offset} for segment duration {segment_duration}")
# 计算时间偏移(将相对位置转换为微秒)
time_offset = int(relative_offset * segment_duration)
raw_value = keyframe_item['value']
normalized_value = normalize_keyframe_value(
keyframe_item['property'],
raw_value,
width=script.width,
height=script.height,
)
if normalized_value != raw_value:
logger.info(
f"Normalized keyframe value for {keyframe_item['property']}: "
f"{raw_value} -> {normalized_value} "
f"(canvas {script.width}x{script.height})"
)
logger.info(
f"Adding keyframe to segment {keyframe_item['segment_id']}: "
f"property={property_enum.value}, time_offset={time_offset}, value={normalized_value}"
)
segment.add_keyframe(property_enum, time_offset, normalized_value)
keyframes_added += 1
if keyframe_item['segment_id'] not in affected_segments:
affected_segments.append(keyframe_item['segment_id'])
logger.info(f"Successfully added keyframe {i+1}, total added: {keyframes_added}")
except Exception as e:
logger.error(f"Failed to add keyframe {i+1}, error: {str(e)}, skipping this keyframe")
failed_keyframes += 1
# 继续处理下一个关键帧,而不是抛出异常
# 5. 保存草稿
try:
script.save()
logger.info(f"Draft saved successfully, keyframes_added: {keyframes_added}, failed_keyframes: {failed_keyframes}")
except Exception as e:
logger.error(f"Failed to save draft: {str(e)}")
raise CustomException(CustomError.KEYFRAME_ADD_FAILED)
logger.info(f"add_keyframes completed - draft_id: {draft_id}, keyframes_added: {keyframes_added}, affected_segments: {affected_segments}, failed_keyframes: {failed_keyframes}")
return draft_url, keyframes_added, affected_segments
async def add_keyframes_async(
draft_url: str,
keyframes: str,
lock_timeout: float = 30.0
) -> Tuple[str, int, List[str]]:
"""
添加关键帧到剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
keyframes: JSON 字符串,包含关键帧信息列表,详见 add_keyframes 函数
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, keyframes_added, affected_segments)
Raises:
CustomException: 关键帧添加失败或获取锁超时
asyncio.TimeoutError: 等待锁超时时抛出
Example:
>>> result = await add_keyframes_async(
... draft_url="http://.../draft_id=123",
... keyframes='[{"segment_id":"...", "property":"KFTypePositionX", "offset":0.5, "value":-0.1}]'
... )
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 获取锁管理器
lock_manager = DraftLockManager()
# 尝试获取锁
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"Lock acquired for draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s"
)
try:
# 调用内部处理函数(不获取锁,由外层控制)
return add_keyframes(
draft_url=draft_url,
keyframes=keyframes
)
finally:
# 释放锁
await lock_manager.release_lock(draft_id)
logger.info(f"Lock released for draft_id: {draft_id}")
def find_segment_by_id(script: ScriptFile, segment_id: str) -> Optional[VisualSegment]:
"""
通过segment_id在草稿中查找对应的片段
Args:
script: 草稿文件对象
segment_id: 片段ID
Returns:
找到的片段对象,如果未找到则返回None
"""
logger.info(f"Searching for segment with id: {segment_id}")
# 遍历所有轨道
for track_name, track in script.tracks.items():
logger.info(f"Searching in track: {track_name}, segments count: {len(track.segments)}")
# 遍历轨道中的所有片段
for segment in track.segments:
if segment.segment_id == segment_id:
logger.info(f"Found segment {segment_id} in track {track_name}")
return segment
logger.warning(f"Segment {segment_id} not found in any track")
return None
def parse_keyframes_data(json_str: str) -> List[Dict[str, Any]]:
"""
解析关键帧数据的JSON字符串,验证必选字段和数值范围
Args:
json_str: 包含关键帧数据的JSON字符串,格式如下:
[
{
"segment_id": "d62994b4-25fe-422a-a123-87ef05038558", # [必选] 目标片段的唯一标识ID
"property": "KFTypePositionX", # [必选] 动画属性类型
"offset": 5000000, # [必选] 关键帧在片段中的时间偏移(微秒绝对时间)
"value": -0.1 # [必选] 属性在该时间点的值
}
]
Returns:
包含关键帧对象的数组,每个对象都验证过格式和范围
Raises:
CustomException: 当JSON格式错误或缺少必选字段时抛出
"""
try:
# 解析JSON字符串
data = json.loads(json_str)
except json.JSONDecodeError as e:
logger.error(f"JSON parse error: {e.msg}")
raise CustomException(CustomError.INVALID_KEYFRAME_INFO, f"JSON parse error: {e.msg}")
# 确保输入是列表
if not isinstance(data, list):
logger.error("keyframes should be a list")
raise CustomException(CustomError.INVALID_KEYFRAME_INFO, "keyframes should be a list")
result = []
# 支持的动画属性类型
supported_properties = {
"KFTypePositionX", "KFTypePositionY", "KFTypeScaleX",
"KFTypeScaleY", "KFTypeRotation", "KFTypeAlpha", "UNIFORM_SCALE",
"KFTypeSaturation", "KFTypeContrast", "KFTypeBrightness", "KFTypeVolume"
}
for i, item in enumerate(data):
if not isinstance(item, dict):
logger.error(f"the {i}th item should be a dict")
raise CustomException(CustomError.INVALID_KEYFRAME_INFO, f"the {i}th item should be a dict")
# 检查必选字段
required_fields = ["segment_id", "property", "offset", "value"]
missing_fields = [field for field in required_fields if field not in item]
if missing_fields:
logger.error(f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
raise CustomException(CustomError.INVALID_KEYFRAME_INFO, f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
# 验证动画属性类型
if item["property"] not in supported_properties:
logger.error(f"the {i}th item has unsupported property type: {item['property']}")
raise CustomException(CustomError.INVALID_KEYFRAME_INFO, f"the {i}th item has unsupported property type: {item['property']}")
# 验证offset是数字类型且为非负数
if not isinstance(item["offset"], (int, float)) or item["offset"] < 0:
logger.error(f"the {i}th item has invalid offset type or value: {item['offset']}, must be a non-negative number")
raise CustomException(CustomError.INVALID_KEYFRAME_INFO, f"the {i}th item has invalid offset type or value: {item['offset']}")
# 验证value是数字类型
if not isinstance(item["value"], (int, float)):
logger.error(f"the {i}th item has invalid value type: {type(item['value'])}, must be a number")
raise CustomException(CustomError.INVALID_KEYFRAME_INFO, f"the {i}th item has invalid value type: {type(item['value'])}")
# 创建处理后的对象
processed_item = {
"segment_id": str(item["segment_id"]),
"property": item["property"],
"offset": float(item["offset"]), # 保持原始微秒值,在主函数中转换为相对时间
"value": float(item["value"])
}
result.append(processed_item)
logger.info(f"Successfully parsed {len(result)} keyframe items")
return result
================================================
FILE: src/service/add_masks.py
================================================
from typing import List, Dict, Any, Tuple, Optional
import asyncio
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, MaskType
from src.pyJianYingDraft.video_segment import VideoSegment
from src.pyJianYingDraft.segment import VisualSegment
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
from src.utils import helper
from src.utils.draft_lock_manager import DraftLockManager
def add_masks(
draft_url: str,
segment_ids: List[str],
name: str = "线性",
X: int = 0,
Y: int = 0,
width: int = 512,
height: int = 512,
feather: int = 0,
rotation: int = 0,
invert: bool = False,
roundCorner: int = 0
) -> Tuple[str, int, List[str], List[str]]:
"""
向现有草稿中的指定片段添加遮罩效果的业务逻辑
Args:
draft_url: 草稿URL,必选参数
segment_ids: 要应用遮罩的片段ID数组,必选参数
name: 遮罩类型名称,默认值:"线性"。支持:"线性", "镜面", "圆形", "矩形", "爱心", "星形"
X: 遮罩中心X坐标(像素),默认值:0
Y: 遮罩中心Y坐标(像素),默认值:0
width: 遮罩宽度(像素),默认值:512
height: 遮罩高度(像素),默认值:512
feather: 羽化程度(0-100),默认值:0
rotation: 旋转角度(度),默认值:0
invert: 是否反转遮罩,默认值:false
roundCorner: 圆角半径(0-100),默认值:0
Returns:
Tuple[str, int, List[str], List[str]]: 返回元组包含以下信息
- draft_url: 草稿URL
- masks_added: 成功添加的遮罩数量
- affected_segments: 受影响的片段ID列表
- mask_ids: 遮罩ID列表
Raises:
CustomException: 遮罩添加失败
"""
logger.info(f"add_masks started, draft_url: {draft_url}, segment_ids: {segment_ids}, mask_name: {name}")
# 1. 提取草稿ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft_url or draft not found in cache: {draft_url}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 2. 验证片段ID列表
if not segment_ids or len(segment_ids) == 0:
logger.error("No segment_ids provided")
raise CustomException(CustomError.INVALID_MASK_INFO)
logger.info(f"Processing {len(segment_ids)} segments for mask addition")
# 3. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 4. 查找遮罩类型
mask_type = find_mask_type_by_name(name)
if mask_type is None:
logger.error(f"Mask type not found for name: {name}")
raise CustomException(CustomError.MASK_NOT_FOUND)
# 5. 遍历片段ID,为每个片段添加遮罩
masks_added = 0
affected_segments: List[str] = []
mask_ids: List[str] = []
for i, segment_id in enumerate(segment_ids):
try:
logger.info(f"Processing segment {i+1}/{len(segment_ids)}, segment_id: {segment_id}")
mask_id = add_mask_to_segment(
script=script,
segment_id=segment_id,
mask_type=mask_type,
center_x=X,
center_y=Y,
width=width,
height=height,
feather=feather,
rotation=rotation,
invert=invert,
round_corner=roundCorner
)
masks_added += 1
affected_segments.append(segment_id)
mask_ids.append(mask_id)
logger.info(f"Added mask to segment {i+1}/{len(segment_ids)}, mask_id: {mask_id}")
except Exception as e:
logger.error(f"Failed to add mask to segment {i+1}/{len(segment_ids)}, segment_id: {segment_id}, error: {str(e)}")
raise
# 6. 保存草稿
script.save()
logger.info(f"Draft saved successfully")
logger.info(f"add_masks completed successfully - draft_id: {draft_id}, masks_added: {masks_added}")
return draft_url, masks_added, affected_segments, mask_ids
async def add_masks_async(
draft_url: str,
segment_ids: List[str],
name: str = "线性",
X: int = 0,
Y: int = 0,
width: int = 512,
height: int = 512,
feather: int = 0,
rotation: int = 0,
invert: bool = False,
roundCorner: int = 0,
lock_timeout: float = 30.0
) -> Tuple[str, int, List[str], List[str]]:
"""
向现有草稿中的指定片段添加遮罩效果的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
segment_ids: 要应用遮罩的片段 ID 数组
name: 遮罩类型名称,默认值:"线性"
X: 遮罩中心 X 坐标(像素),默认值:0
Y: 遮罩中心 Y 坐标(像素),默认值:0
width: 遮罩宽度(像素),默认值:512
height: 遮罩高度(像素),默认值:512
feather: 羽化程度(0-100),默认值:0
rotation: 旋转角度(度),默认值:0
invert: 是否反转遮罩,默认值:false
roundCorner: 圆角半径(0-100),默认值:0
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, masks_added, affected_segments, mask_ids)
Raises:
CustomException: 遮罩添加失败或获取锁超时
asyncio.TimeoutError: 等待锁超时时抛出
Example:
>>> result = await add_masks_async(
... draft_url="http://.../draft_id=123",
... segment_ids=["segment-uuid"],
... name="线性"
... )
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 获取锁管理器
lock_manager = DraftLockManager()
# 尝试获取锁
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"Lock acquired for draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s"
)
try:
# 调用内部处理函数(不获取锁,由外层控制)
return add_masks(
draft_url=draft_url,
segment_ids=segment_ids,
name=name,
X=X,
Y=Y,
width=width,
height=height,
feather=feather,
rotation=rotation,
invert=invert,
roundCorner=roundCorner
)
finally:
# 释放锁
await lock_manager.release_lock(draft_id)
logger.info(f"Lock released for draft_id: {draft_id}")
def add_mask_to_segment(
script: ScriptFile,
segment_id: str,
mask_type: MaskType,
center_x: int = 0,
center_y: int = 0,
width: int = 512,
height: int = 512,
feather: int = 0,
rotation: int = 0,
invert: bool = False,
round_corner: int = 0
) -> str:
"""
向指定片段添加遮罩
Args:
script: 草稿文件对象
segment_id: 目标片段ID
mask_type: 遮罩类型
center_x: 遮罩中心X坐标(像素)
center_y: 遮罩中心Y坐标(像素)
width: 遮罩宽度(像素)
height: 遮罩高度(像素)
feather: 羽化程度(0-100)
rotation: 旋转角度(度)
invert: 是否反转遮罩
round_corner: 圆角半径(0-100)
Returns:
mask_id: 遮罩ID
Raises:
CustomException: 添加遮罩失败
"""
try:
# 1. 查找片段
segment = find_segment_by_id(script, segment_id)
if segment is None:
logger.error(f"Segment not found: {segment_id}")
raise CustomException(CustomError.SEGMENT_NOT_FOUND)
# 2. 验证片段类型(只有VideoSegment支持遮罩)
if not isinstance(segment, VideoSegment):
logger.error(f"Segment {segment_id} is not a video segment, cannot add mask")
raise CustomException(CustomError.INVALID_SEGMENT_TYPE)
# 3. 检查片段是否已有遮罩
if segment.mask is not None:
logger.info(f"Segment {segment_id} already has a mask, returning existing mask id")
# 如果片段已经有遮罩,直接返回现有的遮罩ID而不是抛出异常
return segment.mask.global_id
# 4. 计算遮罩尺寸参数
material_width, material_height = segment.material_size
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
logger.info(f"Adding mask to segment {segment_id}: type={mask_type.value.name}, center=({center_x}, {center_y}), size={size}")
logger.info(f"Mask details - width: {width}, height: {height}, feather: {feather}, rotation: {rotation}, invert: {invert}, round_corner: {round_corner}")
# 5. 添加遮罩到片段
if mask_type == MaskType.矩形:
# 矩形遮罩可以使用所有参数
segment.add_mask(
mask_type=mask_type,
center_x=float(center_x),
center_y=float(center_y),
size=size,
rotation=float(rotation),
feather=float(feather),
invert=invert,
rect_width=rect_width,
round_corner=float(round_corner)
)
else:
# 非矩形遮罩不能使用 rect_width 和 round_corner 参数
segment.add_mask(
mask_type=mask_type,
center_x=float(center_x),
center_y=float(center_y),
size=size,
rotation=float(rotation),
feather=float(feather),
invert=invert
)
# ⭐⭐⭐ 关键修复:手动将蒙版添加到 script.materials.masks ⭐⭐⭐
if segment.mask is not None:
# 检查是否已存在(避免重复添加)
mask_exists = False
for existing_mask in script.materials.masks:
if existing_mask.get("id") == segment.mask.global_id:
mask_exists = True
break
if not mask_exists:
script.materials.masks.append(segment.mask.export_json())
logger.info(f"Registered mask to materials.masks, mask_id: {segment.mask.global_id}")
mask_id = segment.mask.global_id if segment.mask is not None else ""
if not mask_id:
logger.error(f"Failed to create mask for segment {segment_id}")
raise CustomException(CustomError.MASK_ADD_FAILED)
logger.info(f"Successfully added mask to segment {segment_id}, mask_id: {mask_id}")
return mask_id
except CustomException:
logger.error(f"Add mask to segment failed, segment_id: {segment_id}")
raise
except Exception as e:
logger.error(f"Add mask to segment failed, error: {str(e)}")
raise CustomException(CustomError.MASK_ADD_FAILED)
def find_segment_by_id(script: ScriptFile, segment_id: str) -> Optional[VisualSegment]:
"""
通过segment_id在草稿中查找对应的片段
Args:
script: 草稿文件对象
segment_id: 片段ID
Returns:
找到的片段对象,如果未找到则返回None
"""
logger.info(f"Searching for segment with id: {segment_id}")
# 遍历所有轨道
for track_name, track in script.tracks.items():
logger.info(f"Searching in track: {track_name}, segments count: {len(track.segments)}")
# 遍历轨道中的所有片段
for segment in track.segments:
if segment.segment_id == segment_id:
logger.info(f"Found segment {segment_id} in track {track_name}")
return segment
logger.warning(f"Segment {segment_id} not found in any track")
return None
def calculate_mask_size_params(
mask_type: MaskType,
width: int,
height: int,
material_width: int,
material_height: int
) -> Tuple[float, Optional[float]]:
"""
计算遮罩的尺寸参数
Args:
mask_type: 遮罩类型
width: 遮罩宽度(像素)
height: 遮罩高度(像素)
material_width: 素材宽度(像素)
material_height: 素材高度(像素)
Returns:
Tuple[float, Optional[float]]:
- size: 遮罩的主要尺寸比例
- rect_width: 矩形遮罩的宽度比例(仅矩形遮罩有效)
"""
# 计算高度比例作为主要尺寸
size = height / material_height
# 仅矩形遮罩需要计算宽度比例
if mask_type == MaskType.矩形:
rect_width = width / material_width
return size, rect_width
# 其他遮罩类型不需要设置 rect_width
return size, None
def find_mask_type_by_name(mask_name: str) -> Optional[MaskType]:
"""
根据遮罩名称查找对应的遮罩类型
Args:
mask_name: 遮罩名称
Returns:
对应的遮罩类型枚举,如果未找到则返回None
"""
logger.info(f"Searching for mask type with name: {mask_name}")
# 搜索MaskType中的遮罩
for mask_type in MaskType:
if mask_type.value.name == mask_name:
logger.info(f"Found mask type: {mask_name}")
return mask_type
logger.warning(f"Mask type not found for name: {mask_name}")
return None
================================================
FILE: src/service/add_sticker.py
================================================
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, trange, StickerSegment, ClipSettings
import src.pyJianYingDraft as draft
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
import os
from src.utils import helper
import config
import asyncio
from typing import Tuple
from src.utils.draft_lock_manager import DraftLockManager
def add_sticker(
draft_url: str,
sticker_id: str,
start: int,
end: int,
scale: float = 1.0,
transform_x: int = 0,
transform_y: int = 0
) -> Tuple[str, str, str, str, int]:
"""
添加贴纸到剪映草稿的业务逻辑
Args:
draft_url: 草稿URL,必选参数
sticker_id: 贴纸的唯一标识ID,必选参数
start: 贴纸开始时间(微秒),必选参数
end: 贴纸结束时间(微秒),必选参数
scale: 贴纸缩放比例,默认1.0,可选参数。1.0=原始大小,0.5=缩小一半,2.0=放大两倍,建议范围[0.1, 5.0]
transform_x: X轴位置偏移(像素),默认值0,可选参数。正值向右移动,负值向左移动,以画布中心为原点
transform_y: Y轴位置偏移(像素),默认值0,可选参数。正值向下移动,负值向上移动,以画布中心为原点
Returns:
Tuple[str, str, str, str, int]: 返回元组包含以下信息
- draft_url: 草稿URL
- sticker_id: 贴纸的唯一标识ID
- track_id: 轨道ID
- segment_id: 片段ID
- duration: 贴纸显示时长(微秒)
Raises:
CustomException: 贴纸添加失败
"""
logger.info(f"add_sticker starting, draft_url: {draft_url}, sticker_id: {sticker_id}, start: {start}, end: {end}, scale: {scale}, transform_x: {transform_x}, transform_y: {transform_y}")
# 1. 验证时间参数
if end <= start:
logger.error(f"Invalid time range: end ({end}) must be greater than start ({start})")
raise CustomException(CustomError.INVALID_STICKER_INFO)
# 计算贴纸显示时长
duration = end - start
logger.info(f"Calculated sticker duration: {duration} microseconds")
# 2. 提取草稿ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft_url or draft not found in cache, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 3. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
logger.info(f"Retrieved script from cache, draft_id: {draft_id}")
# 4. 创建贴纸轨道(如果不存在)
track_name = f"sticker_track_{helper.gen_unique_id()}"
try:
script.add_track(track_type=draft.TrackType.sticker, track_name=track_name)
logger.info(f"Created sticker track: {track_name}")
except Exception as e:
logger.error(f"Failed to create sticker track: {str(e)}")
raise CustomException(CustomError.STICKER_ADD_FAILED)
# 5. 创建图像调节设置
# 获取草稿的宽高用于transform坐标转换
draft_width = script.width
draft_height = script.height
logger.info(f"draft size: {draft_width}x{draft_height}, transform_x: {transform_x}, transform_y: {transform_y}")
clip_settings = ClipSettings(
scale_x=scale,
scale_y=scale,
transform_x=transform_x / draft_width, # 转换为半画布宽单位
transform_y=transform_y / draft_height # 转换为半画布高单位
)
logger.info(f"Created clip settings - scale: {scale}, transform_x: {transform_x/draft_width}, transform_y: {transform_y/draft_height}")
# 6. 创建贴纸片段
try:
sticker_segment = StickerSegment(
resource_id=sticker_id,
target_timerange=trange(start=start, duration=duration),
clip_settings=clip_settings
)
logger.info(f"Created sticker segment, segment_id: {sticker_segment.segment_id}, resource_id: {sticker_id}")
except Exception as e:
logger.error(f"Failed to create sticker segment: {str(e)}")
raise CustomException(CustomError.STICKER_ADD_FAILED)
# 7. 向指定轨道添加贴纸片段
try:
script.add_segment(sticker_segment, track_name)
logger.info(f"Added sticker segment to track: {track_name}")
except Exception as e:
logger.error(f"Failed to add sticker segment to track: {str(e)}")
raise CustomException(CustomError.STICKER_ADD_FAILED)
# 8. 保存草稿
try:
script.save()
logger.info(f"Saved script successfully, draft_id: {draft_id}")
except Exception as e:
logger.error(f"Failed to save script: {str(e)}")
raise CustomException(CustomError.STICKER_ADD_FAILED)
# 9. 获取轨道ID
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
track_id = script.tracks[key].track_id
break
if not track_id:
logger.error(f"Failed to retrieve track_id for track: {track_name}")
raise CustomException(CustomError.STICKER_ADD_FAILED)
logger.info(f"Retrieved track_id: {track_id}")
# 10. 获取片段ID
segment_id = sticker_segment.segment_id
logger.info(f"Final segment_id: {segment_id}")
logger.info(f"add_sticker completed successfully - draft_id: {draft_id}, track_id: {track_id}, segment_id: {segment_id}, duration: {duration}")
return draft_url, sticker_id, track_id, segment_id, duration
async def add_sticker_async(
draft_url: str,
sticker_id: str,
start: int,
end: int,
scale: float = 1.0,
transform_x: int = 0,
transform_y: int = 0,
lock_timeout: float = 30.0
) -> Tuple[str, str, str, str, int]:
"""
添加贴纸到剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
sticker_id: 贴纸的唯一标识 ID,必选参数
start: 贴纸开始时间(微秒),必选参数
end: 贴纸结束时间(微秒),必选参数
scale: 贴纸缩放比例,默认 1.0
transform_x: X 轴位置偏移(像素),默认 0
transform_y: Y 轴位置偏移(像素),默认 0
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, sticker_id, track_id, segment_id, duration)
Raises:
CustomException: 贴纸添加失败或获取锁超时
asyncio.TimeoutError: 等待锁超时时抛出
Example:
>>> result = await add_sticker_async(
... draft_url="http://.../draft_id=123",
... sticker_id="sticker-uuid",
... start=0,
... end=5000000
... )
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 获取锁管理器
lock_manager = DraftLockManager()
# 尝试获取锁
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"Lock acquired for draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s"
)
try:
# 调用内部处理函数(不获取锁,由外层控制)
return add_sticker(
draft_url=draft_url,
sticker_id=sticker_id,
start=start,
end=end,
scale=scale,
transform_x=transform_x,
transform_y=transform_y
)
finally:
# 释放锁
await lock_manager.release_lock(draft_id)
logger.info(f"Lock released for draft_id: {draft_id}")
================================================
FILE: src/service/add_text_style.py
================================================
import json
import re
from typing import List, Dict, Any, Tuple
from src.utils.logger import logger
def add_text_style(
text: str,
keyword: str,
font_size: int = 12,
keyword_color: str = "#ff7100",
keyword_font_size: int = 15
) -> str:
"""
为文本创建富文本样式,支持关键词高亮、颜色设置、字体大小调整等功能
Args:
text: 要处理的文本内容,必选参数
keyword: 关键词,多个用 | 分隔,必选参数
font_size: 普通文本的字体大小,默认值:12
keyword_color: 关键词文本颜色(十六进制),默认值:"#ff7100"
keyword_font_size: 关键词字体大小,默认值:15
Returns:
text_style: 文本样式JSON字符串,包含styles数组和text字段
Raises:
Exception: 文本样式处理失败
"""
logger.info(f"add_text_style started, text: {text[:20]}..., keyword: {keyword}")
try:
# 1. 解析关键词
keywords = parse_keywords(keyword)
if not keywords:
logger.warning("No valid keywords found")
return create_simple_text_style(text, font_size)
logger.info(f"Parsed {len(keywords)} keywords: {keywords}")
# 2. 查找关键词位置
keyword_positions = find_keyword_positions(text, keywords)
logger.info(f"Found {len(keyword_positions)} keyword matches")
# 3. 解析颜色
keyword_rgb = hex_to_rgb(keyword_color)
normal_rgb = [1.0, 1.0, 1.0] # 默认白色
logger.info(f"Keyword color RGB: {keyword_rgb}")
# 4. 生成文本样式
styles = generate_text_styles(
text,
keyword_positions,
font_size,
keyword_font_size,
normal_rgb,
keyword_rgb
)
# 5. 构建响应对象
result = {
"text": text,
"styles": styles
}
# 6. 转换为JSON字符串
text_style_json = json.dumps(result, ensure_ascii=False, separators=(',', ':'))
logger.info(f"add_text_style completed successfully, generated {len(styles)} style segments")
return text_style_json
except Exception as e:
logger.error(f"add_text_style failed, error: {str(e)}")
raise
def parse_keywords(keyword_str: str) -> List[str]:
"""
解析关键词字符串,支持多个关键词用 | 分隔
Args:
keyword_str: 关键词字符串,格式如 "快乐|顶级思维"
Returns:
关键词列表,按长度降序排列(先匹配长关键词)
"""
if not keyword_str or not keyword_str.strip():
return []
# 分割关键词,去除空白
keywords = [kw.strip() for kw in keyword_str.split('|') if kw.strip()]
# 按长度降序排列,优先匹配长关键词
keywords.sort(key=len, reverse=True)
logger.info(f"Parsed keywords: {keywords}")
return keywords
def find_keyword_positions(text: str, keywords: List[str]) -> List[Tuple[int, int, str]]:
"""
在文本中查找所有关键词的位置
Args:
text: 目标文本
keywords: 关键词列表
Returns:
位置列表,每个元素为 (start_pos, end_pos, keyword) 的元组
"""
positions = []
used_positions = set() # 记录已使用的字符位置,避免重叠
for keyword in keywords:
# 使用正则表达式查找所有匹配位置
for match in re.finditer(re.escape(keyword), text):
start_pos = match.start()
end_pos = match.end()
# 检查是否与已有匹配重叠
is_overlap = any(pos in used_positions for pos in range(start_pos, end_pos))
if not is_overlap:
positions.append((start_pos, end_pos, keyword))
# 标记这些位置为已使用
used_positions.update(range(start_pos, end_pos))
logger.info(f"Found keyword '{keyword}' at position [{start_pos}, {end_pos})")
# 按起始位置排序
positions.sort(key=lambda x: x[0])
return positions
def hex_to_rgb(hex_color: str) -> List[float]:
"""
将十六进制颜色转换为RGB浮点数组
Args:
hex_color: 十六进制颜色,如 "#ff7100"
Returns:
RGB数组,值范围为0-1,如 [1.0, 0.44, 0.0]
"""
# 移除 # 前缀
hex_color = hex_color.lstrip('#')
# 确保是6位十六进制
if len(hex_color) != 6:
logger.warning(f"Invalid hex color: {hex_color}, using default orange")
hex_color = "ff7100" # 默认橙色
try:
# 转换为RGB
r = int(hex_color[0:2], 16) / 255.0
g = int(hex_color[2:4], 16) / 255.0
b = int(hex_color[4:6], 16) / 255.0
return [r, g, b]
except ValueError:
logger.warning(f"Failed to parse hex color: {hex_color}, using default orange")
return [1.0, 0.44313725490196076, 0.0] # 默认橙色
def generate_text_styles(
text: str,
keyword_positions: List[Tuple[int, int, str]],
normal_font_size: int,
keyword_font_size: int,
normal_color: List[float],
keyword_color: List[float]
) -> List[Dict[str, Any]]:
"""
生成文本样式数组
Args:
text: 原始文本
keyword_positions: 关键词位置列表
normal_font_size: 普通文本字体大小
keyword_font_size: 关键词字体大小
normal_color: 普通文本颜色RGB
keyword_color: 关键词颜色RGB
Returns:
样式数组,每个元素包含range、size、fill等属性
"""
styles = []
current_pos = 0
for start_pos, end_pos, keyword in keyword_positions:
# 添加关键词前的普通文本样式
if current_pos < start_pos:
normal_style = create_text_style_segment(
start=current_pos,
end=start_pos,
font_size=normal_font_size,
color=normal_color,
use_letter_color=False
)
styles.append(normal_style)
logger.info(f"Added normal text style: [{current_pos}, {start_pos})")
# 添加关键词样式
keyword_style = create_text_style_segment(
start=start_pos,
end=end_pos,
font_size=keyword_font_size,
color=keyword_color,
use_letter_color=True
)
styles.append(keyword_style)
logger.info(f"Added keyword style for '{keyword}': [{start_pos}, {end_pos})")
current_pos = end_pos
# 添加最后剩余的普通文本样式
if current_pos < len(text):
normal_style = create_text_style_segment(
start=current_pos,
end=len(text),
font_size=normal_font_size,
color=normal_color,
use_letter_color=False
)
styles.append(normal_style)
logger.info(f"Added final normal text style: [{current_pos}, {len(text)})")
return styles
def create_text_style_segment(
start: int,
end: int,
font_size: int,
color: List[float],
use_letter_color: bool = False
) -> Dict[str, Any]:
"""
创建单个文本样式片段
Args:
start: 起始位置
end: 结束位置
font_size: 字体大小
color: 颜色RGB数组
use_letter_color: 是否使用字母颜色
Returns:
样式片段字典
"""
style = {
"fill": {
"content": {
"solid": {
"color": color
}
}
},
"range": [start, end],
"size": font_size,
"font": {
"id": "",
"path": ""
}
}
if use_letter_color:
style["useLetterColor"] = True
return style
def create_simple_text_style(text: str, font_size: int) -> str:
"""
创建简单的文本样式(无关键词高亮)
Args:
text: 文本内容
font_size: 字体大小
Returns:
简单的文本样式JSON字符串
"""
result = {
"text": text,
"styles": [
{
"fill": {
"content": {
"solid": {
"color": [1.0, 1.0, 1.0] # 白色
}
}
},
"range": [0, len(text)],
"size": font_size,
"font": {
"id": "",
"path": ""
}
}
]
}
return json.dumps(result, ensure_ascii=False, separators=(',', ':'))
================================================
FILE: src/service/add_videos.py
================================================
from src.pyJianYingDraft.video_segment import VideoSegment
import asyncio
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, trange, IntroType
import src.pyJianYingDraft as draft
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
import os
from src.schemas.add_videos import SegmentInfo
from src.utils import helper
from src.utils.download import download
import config
import json
import time
from typing import List, Dict, Any, Tuple, Optional
from src.utils.draft_lock_manager import get_draft_lock_manager
def add_videos(
draft_url: str,
video_infos: str,
scene_timelines: Optional[List[Dict[str, int]]] = None,
alpha: float = 1.0,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: int = 0,
transform_y: int = 0
) -> Tuple[str, str, List[str], List[str], List[SegmentInfo]]:
"""
添加视频到剪映草稿的业务逻辑(同步版本,兼容旧代码)
Args:
draft_url: "" // [必选] 草稿 URL
video_infos: [
{
"video_url": "https://example.com/video1.mp4", // [必选] 视频文件的 URL 地址
"width": 1920, // [可选] 视频宽度,不传则自动获取视频文件尺寸
"height": 1080, // [可选] 视频高度,不传则自动获取视频文件尺寸
"start": 0.0, // [必选] 视频在时间轴上的开始时间 (微秒)
"end": 12000000.0, // [必选] 视频在时间轴上的结束时间 (微秒)
"duration": 12000000.0, // [可选] 视频总时长 (微秒),如果不传则默认为 end-start
"mask": "", // 遮罩类型 [可选],默认值为 None
"transition": "", // 转场效果名称 [可选],默认值为 None
"transition_duration": 500000.0, // 转场持续时间 (微秒)[可选],默认值为 500000
"volume": 1.0, // 音量大小 [0, 10][可选],默认值为 1.0,10 为最大音量
}
] // [必选]
scene_timelines: [ // [可选] 场景时间线数组,用于视频变速,与 video_infos 一一对应
{
"start": 0, // [必选] 场景开始时间 (微秒)
"end": 6000000 // [必选] 场景结束时间 (微秒)
}
]
// 变速原理:speed = (video.end - video.start) / (scene_timeline.end - scene_timeline.start)
// 示例:视频时间轴 0-2000000(2 秒),场景时间线 0-1000000(1 秒),则视频以 2 倍速播放
// 如果不提供 scene_timelines 或对应项为 None,视频以正常速度 (1.0 倍) 播放
alpha: 全局透明度 [0, 1][可选],默认值为 1.0
scale_x: X 轴缩放比例 [可选],默认值为 1.0
scale_y: Y 轴缩放比例 [可选],默认值为 1.0
transform_x: X 轴位置偏移 (像素)[可选],默认值为 0
transform_y: Y 轴位置偏移 (像素)[可选],默认值为 0
Returns:
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=...",
"track_id": "video-track-uuid",
"video_ids": ["video1-uuid", "video2-uuid", "video3-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid", "segment3-uuid"],
"segment_infos": 片段信息列表,包含每个片段的ID、开始时间和结束时间
Raises:
CustomException: 视频批量添加失败
"""
# 调用内部处理函数(不获取锁,由外层控制)
return _add_videos_internal(
draft_url=draft_url,
video_infos=video_infos,
scene_timelines=scene_timelines,
alpha=alpha,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x,
transform_y=transform_y,
prepared_videos=None,
)
def _prepare_videos_local_files(draft_url: str, video_infos: str) -> List[Dict[str, Any]]:
"""
校验草稿、解析 video_infos、规范化时间字段并下载素材到草稿目录。
不含对 ScriptFile 的修改,可在草稿写锁外调用。
"""
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
raise CustomException(CustomError.INVALID_DRAFT_URL)
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
draft_video_dir = os.path.join(draft_dir, "assets", "videos")
os.makedirs(name=draft_video_dir, exist_ok=True)
videos = parse_video_data(json_str=video_infos)
if len(videos) == 0:
logger.info(f"No video info, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_VIDEO_INFO)
for video in videos:
video["original_start"] = video["start"]
video["original_end"] = video["end"]
video["local_video_path"] = download(url=video["video_url"], save_dir=draft_video_dir)
return videos
async def add_videos_async(
draft_url: str,
video_infos: str,
scene_timelines: Optional[List[Dict[str, int]]] = None,
alpha: float = 1.0,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: int = 0,
transform_y: int = 0,
lock_timeout: float = 30.0
) -> Tuple[str, str, List[str], List[str], List[SegmentInfo]]:
"""
添加视频到剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
4. 视频下载在获取锁之前完成,持锁阶段仅修改草稿与写盘
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
video_infos: JSON 字符串,包含视频信息列表,详见 add_videos 函数
scene_timelines: 场景时间线列表,用于视频变速,与 video_infos 一一对应
alpha: 全局透明度 [0, 1],默认 1.0
scale_x: X 轴缩放比例,默认 1.0
scale_y: Y 轴缩放比例,默认 1.0
transform_x: X 轴位置偏移(像素),默认 0
transform_y: Y 轴位置偏移(像素),默认 0
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
tuple: (draft_url, track_id, video_ids, segment_ids, segment_infos)
Raises:
CustomException: 视频添加失败,或 `DRAFT_LOCK_TIMEOUT`(获取写锁超时)
Example:
>>> result = await add_videos_async(
... draft_url="http://.../draft_id=123",
... video_infos='[{"video_url":"...", "start":0, "end":5000000}]'
... )
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
logger.info(f"[flow:add_videos] prep_start, draft_id: {draft_id}")
# 解析、规范化与下载在锁外完成,缩短持锁时间
# 下载与预处理放到线程池,避免阻塞事件循环导致锁超时漂移
prep_started_at = time.monotonic()
prepared_videos = await asyncio.to_thread(
_prepare_videos_local_files,
draft_url,
video_infos,
)
logger.info(
f"[flow:add_videos] prep_done, draft_id: {draft_id}, "
f"count: {len(prepared_videos)}, elapsed: {time.monotonic() - prep_started_at:.3f}s"
)
lock_manager = get_draft_lock_manager()
logger.info(f"[flow:add_videos] lock_wait_start, draft_id: {draft_id}, timeout: {lock_timeout}s")
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"[flow:add_videos] lock_acquired, draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} after {lock_timeout}s",
)
try:
return _add_videos_internal(
draft_url=draft_url,
video_infos=video_infos,
scene_timelines=scene_timelines,
alpha=alpha,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x,
transform_y=transform_y,
prepared_videos=prepared_videos,
)
finally:
await lock_manager.release_lock(draft_id)
logger.info(f"[flow:add_videos] lock_released, draft_id: {draft_id}")
def _add_videos_internal(
draft_url: str,
video_infos: str,
scene_timelines: Optional[List[Dict[str, int]]] = None,
alpha: float = 1.0,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: int = 0,
transform_y: int = 0,
prepared_videos: Optional[List[Dict[str, Any]]] = None,
) -> Tuple[str, str, List[str], List[str], List[SegmentInfo]]:
"""
添加视频的内部处理函数(无锁,需外层控制并发)
此函数不包含锁机制,必须在已获取锁的情况下调用
Args:
draft_url: 草稿 URL
video_infos: 视频信息 JSON 字符串(当 prepared_videos 为 None 时参与解析)
scene_timelines: 场景时间线列表
alpha: 全局透明度
scale_x: X 轴缩放比例
scale_y: Y 轴缩放比例
transform_x: X 轴位置偏移
transform_y: Y 轴位置偏移
prepared_videos: 若已在外部完成解析与下载(含 local_video_path),则直接使用,跳过下载
Returns:
tuple: (draft_url, track_id, video_ids, segment_ids, segment_infos)
"""
logger.info(f"_add_videos_internal, draft_url: {draft_url}")
# 1. 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 2. 创建保存视频资源的目录
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
draft_video_dir = os.path.join(draft_dir, "assets", "videos")
os.makedirs(name=draft_video_dir, exist_ok=True)
if prepared_videos is not None:
videos = prepared_videos
else:
videos = parse_video_data(json_str=video_infos)
if len(videos) == 0:
logger.info(f"No video info, draft_id: {draft_id}")
raise CustomException(CustomError.INVALID_VIDEO_INFO)
for video in videos:
video["original_start"] = video["start"]
video["original_end"] = video["end"]
logger.info(f"Parsed {len(videos)} videos, scene_timelines: {scene_timelines}")
# 4. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 5. 添加视频轨道(非主轨;叠层与 add_images / add_captions / add_filters 等一致,按全局调用顺序递增 render_index)
track_name = f"video_track_{helper.gen_unique_id()}"
script.add_track_ordered(track_type=draft.TrackType.video, track_name=track_name)
# 6. 遍历视频信息,添加视频到草稿中的指定轨道,收集片段 ID 与片段信息
segment_ids = []
segment_infos = []
current_track_end = 0 # 跟踪当前轨道上的实际结束位置(用于处理变速后的连续性)
should_keep_continuity = _has_valid_scene_timelines(scene_timelines, len(videos))
logger.info(
f"Timeline placement mode, should_keep_continuity={should_keep_continuity}, "
f"scene_timelines_count={len(scene_timelines) if scene_timelines else 0}"
)
for i, video in enumerate(videos):
# 获取对应的场景时间线(如果有)
scene_timeline = scene_timelines[i] if scene_timelines and i < len(scene_timelines) else None
# 仅在 scene_timelines 有效时,沿用历史行为:自动连续拼接(处理变速后的间隙问题)
# 否则严格使用 video_infos 里传入的 start/end。
if should_keep_continuity and i > 0 and current_track_end > 0:
# 使用原始时长计算新的 end
original_duration = video['original_end'] - video['original_start']
video['start'] = current_track_end
video['end'] = video['start'] + original_duration
logger.info(f"Adjusted video {i} start time to {video['start']} for continuity, original_duration: {original_duration}")
segment_id, segment_info, actual_duration = add_video_to_draft(
script, track_name, draft_video_dir=draft_video_dir, video=video,
scene_timeline=scene_timeline,
alpha=alpha, scale_x=scale_x, scale_y=scale_y,
transform_x=transform_x, transform_y=transform_y)
segment_ids.append(segment_id)
segment_infos.append(segment_info)
# 更新当前轨道结束位置(使用实际播放时长,而非原始时间轴时长)
current_track_end = video['start'] + actual_duration
logger.info(f"Video {i} added, track end position: {current_track_end}, actual_duration: {actual_duration}")
logger.info(f"segment_ids: {segment_ids}")
# 7. 保存草稿
script.save()
# 8. 获取当前视频轨道 id
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
track_id = script.tracks[key].track_id
break
logger.info(f"draft_id: {draft_id}, track_id: {track_id}")
# 9. 获取当前所有视频资源 ID(全局唯一 ID)
video_ids = [video.material_id for video in script.materials.videos]
logger.info(f"draft_id: {draft_id}, video_ids: {video_ids}")
# TODO: 这里还是有点小问题,为什么得到的 video_ids 与 segment_ids 的结果一样
return draft_url, track_id, video_ids, segment_ids, segment_infos
def _is_valid_scene_timeline(scene_timeline: Any) -> bool:
"""
判断单个 scene_timeline 是否为有效值。
有效条件:必须是字典,且包含 start/end,且 end > start。
"""
if not isinstance(scene_timeline, dict):
return False
if "start" not in scene_timeline or "end" not in scene_timeline:
return False
return scene_timeline["end"] > scene_timeline["start"]
def _has_valid_scene_timelines(
scene_timelines: Optional[List[Dict[str, int]]],
video_count: int,
) -> bool:
"""
判断 scene_timelines 是否“指定了有效值”。
当且仅当每个视频都存在对应且有效的 scene_timeline 时,返回 True。
"""
if not scene_timelines:
return False
if len(scene_timelines) < video_count:
return False
return all(_is_valid_scene_timeline(scene_timelines[i]) for i in range(video_count))
def add_video_to_draft(
script: ScriptFile,
track_name: str,
draft_video_dir: str,
video: dict,
scene_timeline: Optional[Dict[str, int]] = None,
alpha: float = 1.0,
scale_x: float = 1.0,
scale_y: float = 1.0,
transform_x: int = 0,
transform_y: int = 0
) -> Tuple[str, SegmentInfo, int]:
"""
向剪映草稿中添加视频
Args:
script: 草稿文件对象
track_name: 视频轨道名称
draft_video_dir: 视频资源目录
video: 视频信息字典,包含以下字段:
video_url: 视频URL
width: 视频宽度(像素)
height: 视频高度(像素)
start: 视频在时间轴上的开始时间(微秒)
end: 视频在时间轴上的结束时间(微秒)
duration: 视频总时长(微秒),可选,默认为end-start
mask: 遮罩类型(可选)
transition: 转场效果(可选)
transition_duration: 转场持续时间(可选)
volume: 音量大小(可选)
scene_timeline: 场景时间线字典,包含以下字段:
start: 场景开始时间(微秒)
end: 场景结束时间(微秒)
用于计算视频变速:speed = (video.end - video.start) / (scene_timeline.end - scene_timeline.start)
alpha: 视频透明度
scale_x: 横向缩放
scale_y: 纵向缩放
transform_x: X轴位置偏移(像素)
transform_y: Y轴位置偏移(像素)
Returns:
segment_id: 片段ID
segment_info: 片段信息,包含 id、start、end(与 add_images 一致,使用放置后的时间轴起止)
actual_duration: 视频在轨道上的实际播放时长(微秒),考虑变速后的时长
"""
try:
video_path = video.get("local_video_path")
if video_path:
if not os.path.isfile(video_path):
raise CustomException(CustomError.VIDEO_ADD_FAILED, f"Missing local file: {video_path}")
else:
video_path = download(url=video["video_url"], save_dir=draft_video_dir)
# 1. 创建视频素材
video_material = draft.VideoMaterial(video_path)
# 2. 获取视频播放时长(target duration)
target_duration = video.get('duration', video['end'] - video['start'])
# 获取草稿的宽高用于transform坐标转换
draft_width = script.width
draft_height = script.height
logger.info(f"draft size: {draft_width}x{draft_height}, transform_x: {transform_x}, transform_y: {transform_y}")
# 4. 创建图像调节设置
clip_settings = draft.ClipSettings(
alpha=alpha,
scale_x=scale_x,
scale_y=scale_y,
transform_x=transform_x / draft_width, #半画布宽单位
transform_y=transform_y / draft_height #为半画布高单位
)
# 5. 计算在时间轴上的显示时长(source duration)
display_duration = video['end'] - video['start']
# 5.5 计算变速(如果提供了场景时间线)
speed = 1.0
actual_duration = display_duration # 默认实际时长等于显示时长
if scene_timeline:
scene_duration = scene_timeline['end'] - scene_timeline['start']
if scene_duration > 0:
# speed = 时间轴时长 / 场景时长
# 例如:时间轴2秒,场景1秒,则speed=2(2倍速)
speed = display_duration / scene_duration
actual_duration = scene_duration # 实际播放时长为场景时长
logger.info(f"Video speed calculated: {speed}x (display_duration={display_duration}, scene_duration={scene_duration})")
# 6. 创建视频片段
# 用户传入 volume 范围为 [0, 10],剪映内部范围为 [0, 10]
raw_volume = video.get('volume', 1.0)
video_segment = draft.VideoSegment(
material=video_material,
target_timerange=trange(start=video['start'], duration=display_duration),
source_timerange=trange(start=0, duration=min(video_material.duration, display_duration)),
speed=speed, # 使用计算出的速度
volume=raw_volume,
clip_settings=clip_settings
)
logger.info(f"video_path: {video_path}, start: {video['start']}, target_duration: {target_duration}, display_duration: {display_duration}, speed: {speed}, raw_volume: {raw_volume}")
# 6. 添加转场效果(如果指定了)
transition_name = video.get('transition')
if transition_name:
transition_type = find_transition_type_by_name(transition_name)
if transition_type:
transition_duration = video.get('transition_duration', 500000) # 默认500ms
try:
video_segment.add_transition(transition_type, duration=transition_duration)
logger.info(f"Added transition '{transition_name}' with duration {transition_duration}us")
except Exception as e:
logger.warning(f"Failed to add transition '{transition_name}': {str(e)}")
else:
logger.warning(f"Transition type not found for name: {transition_name}")
# 7. 向指定轨道添加片段
script.add_segment(video_segment, track_name)
segment_info = SegmentInfo(
id=video_segment.segment_id,
start=video['start'],
end=video['end'],
)
return video_segment.segment_id, segment_info, actual_duration
except CustomException:
logger.info(f"Add video to draft failed, draft_video_dir: {draft_video_dir}, video: {video}")
raise
except Exception as e:
logger.error(f"Add video to draft failed, error: {str(e)}")
raise CustomException(err=CustomError.VIDEO_ADD_FAILED)
def find_transition_type_by_name(transition_name: str) -> Optional[draft.TransitionType]:
"""
根据转场名称查找对应的转场类型
Args:
transition_name: 转场名称
Returns:
对应的转场类型枚举,如果未找到则返回None
"""
if not transition_name:
return None
try:
return draft.TransitionType.from_name(transition_name)
except ValueError:
logger.warning(f"Transition type not found for name: {transition_name}")
return None
def parse_video_data(json_str: str) -> List[Dict[str, Any]]:
"""
解析视频数据的JSON字符串,处理可选字段的默认值
Args:
json_str: 包含视频数据的JSON字符串,格式如下:
[
{
"video_url": "https://example.com/video1.mp4", // [必选] 视频文件的URL地址
"width": 1920, // [可选] 视频宽度,不传则自动获取视频文件尺寸
"height": 1080, // [可选] 视频高度,不传则自动获取视频文件尺寸
"start": 0.0, // [必选] 视频在时间轴上的开始时间
"end": 12000000.0, // [必选] 视频在时间轴上的结束时间
"duration": 12000000.0, // [可选] 视频总时长(微秒),如果不传则默认为end-start
"mask": "", // 遮罩类型[可选],默认值为None
"transition": "", // 转场效果名称[可选],默认值为None
"transition_duration": 500000.0, // 转场持续时间(微秒)[可选],默认值为500000
"volume": 1.0, // 音量大小[0, 10][可选],默认值为1.0,10为最大音量
}
]
Returns:
包含视频对象的数组,每个对象都处理了默认值
Raises:
json.JSONDecodeError: 当JSON格式错误时抛出
KeyError: 当缺少必选字段时抛出
"""
try:
# 解析JSON字符串
data = json.loads(json_str)
except json.JSONDecodeError as e:
raise CustomException(CustomError.INVALID_VIDEO_INFO, f"JSON parse error: {e.msg}")
# 确保输入是列表
if not isinstance(data, list):
raise CustomException(CustomError.INVALID_VIDEO_INFO, "video_infos should be a list")
result = []
for i, item in enumerate(data):
if not isinstance(item, dict):
raise CustomException(CustomError.INVALID_VIDEO_INFO, f"the {i}th item should be a dict")
# 检查必选字段(移除width和height,因为它们现在是可选的)
required_fields = ["video_url", "start", "end"]
missing_fields = [field for field in required_fields if field not in item]
if missing_fields:
raise CustomException(CustomError.INVALID_VIDEO_INFO, f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
# 如果没有提供duration,则计算为end-start
duration = item.get("duration", item["end"] - item["start"])
# 创建处理后的对象,设置默认值
processed_item = {
"video_url": item["video_url"],
"width": item.get("width"), # 可选参数
"height": item.get("height"), # 可选参数
"start": item["start"],
"end": item["end"],
"duration": duration,
"mask": item.get("mask", None), # 默认值 None
"transition": item.get("transition", None), # 默认值 None
"transition_duration": item.get("transition_duration", 500000), # 默认值 500000
"volume": item.get("volume", 1.0) # 默认值 1.0
}
# 验证数值范围:用户传入范围 [0, 10],超范围时给默认值
if processed_item["volume"] < 0 or processed_item["volume"] > 10:
logger.warning(f"Volume {processed_item['volume']} out of range [0, 10], using default 1.0")
processed_item["volume"] = 1.0
if processed_item["transition_duration"] < 0:
# 转场持续时间必须为非负数,给默认值
processed_item["transition_duration"] = 500000
result.append(processed_item)
return result
================================================
FILE: src/service/audio_infos.py
================================================
from src.utils.logger import logger
import json
from typing import List, Optional, Dict, Any
def audio_infos(
mp3_urls: List[str],
timelines: List[Dict[str, int]],
audio_effect: Optional[str] = None,
volume: Optional[float] = None
) -> str:
"""
根据音频URL和时间线生成音频信息JSON字符串
Args:
mp3_urls: 音频文件URL数组
timelines: 时间线数组
audio_effect: 音频效果(可选)
volume: 音量(可选)
Returns:
str: JSON字符串格式的音频信息
Raises:
无异常抛出,长度不匹配时以最短的为准
"""
logger.info(f"audio_infos called with {len(mp3_urls)} audio files and {len(timelines)} timelines")
# 长度不相等时以最短的为准
if len(mp3_urls) != len(timelines):
min_len = min(len(mp3_urls), len(timelines))
logger.warning(f"mp3_urls length ({len(mp3_urls)}) does not match timelines length ({len(timelines)}), using shorter length: {min_len}")
mp3_urls = mp3_urls[:min_len]
timelines = timelines[:min_len]
# 构建音频信息列表
infos = []
for i, (audio_url, timeline) in enumerate(zip(mp3_urls, timelines)):
info = {
"audio_url": audio_url,
"start": timeline["start"],
"end": timeline["end"]
}
# 添加可选参数
if audio_effect is not None:
info["audio_effect"] = audio_effect
if volume is not None:
info["volume"] = volume
infos.append(info)
logger.info(f"Processed audio info {i+1}: {info}")
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
logger.info(f"Generated audio infos JSON with {len(infos)} items")
return infos_json
================================================
FILE: src/service/audio_timelines.py
================================================
from src.utils.logger import logger
from src.utils.download import download
from src.utils.media import get_media_duration
from exceptions import CustomException, CustomError
import config
import os
from typing import List, Tuple, Optional
def audio_timelines(links: List[str]) -> Tuple[List[dict], List[dict]]:
"""
根据音频文件时长计算时间线分割点
Args:
links: 音频文件URL数组
Returns:
tuple: (timelines, all_timelines)
Raises:
CustomException: 处理过程中出现错误
"""
logger.info(f"audio_timelines called with {len(links)} audio files")
if not links:
logger.warning("No audio links provided")
return [], [{"start": 0, "end": 0}]
temp_files = []
durations = []
try:
# 1. 下载所有音频文件并获取时长
for i, link in enumerate(links):
logger.info(f"Processing audio file {i+1}/{len(links)}: {link}")
temp_file_path = None
try:
# 下载音频文件
temp_file_path = download(link, config.TEMP_DIR)
temp_files.append(temp_file_path)
# 获取音频时长
duration_microseconds = get_media_duration(temp_file_path)
if duration_microseconds is None:
raise CustomException(CustomError.AUDIO_DURATION_GET_FAILED, f"Failed to get duration for audio: {link}")
durations.append(duration_microseconds)
logger.info(f"Audio {i+1} duration: {duration_microseconds} microseconds")
except CustomException:
raise
except Exception as e:
logger.error(f"Error processing audio file {link}: {str(e)}")
raise CustomException(CustomError.AUDIO_DURATION_GET_FAILED, f"Error processing audio file {link}: {str(e)}")
# 2. 计算时间线
timelines, all_timelines = _calculate_timelines(durations)
logger.info(f"Calculated timelines for {len(links)} audio files")
return timelines, all_timelines
finally:
# 3. 清理临时文件
_cleanup_temp_files(temp_files)
def _calculate_timelines(durations: List[int]) -> Tuple[List[dict], List[dict]]:
"""
根据音频时长计算时间线
Args:
durations: 音频时长列表(微秒)
Returns:
tuple: (timelines, all_timelines)
"""
if not durations:
return [], [{"start": 0, "end": 0}]
# 计算累积时长
cumulative_durations = []
cumulative = 0
for duration in durations:
cumulative_durations.append({
"start": cumulative,
"end": cumulative + duration
})
cumulative += duration
# 返回结果
return cumulative_durations, [{"start": 0, "end": cumulative}]
def _cleanup_temp_files(temp_files: List[str]) -> None:
"""
清理临时文件
Args:
temp_files: 临时文件路径列表
"""
for temp_file_path in temp_files:
if temp_file_path and os.path.exists(temp_file_path):
try:
os.remove(temp_file_path)
logger.info(f"Temporary file removed: {temp_file_path}")
except Exception as cleanup_error:
logger.warning(f"Failed to cleanup temporary file {temp_file_path}: {cleanup_error}")
================================================
FILE: src/service/caption_infos.py
================================================
from src.utils.logger import logger
import json
from typing import List, Optional, Dict, Any
def caption_infos(
texts: List[str],
timelines: List[Dict[str, int]],
font_size: Optional[int] = None,
keyword_color: Optional[str] = None,
keyword_border_color: Optional[str] = None,
keyword_font_size: Optional[int] = None,
keywords: Optional[List[str]] = None,
in_animation: Optional[str] = None,
in_animation_duration: Optional[int] = None,
loop_animation: Optional[str] = None,
loop_animation_duration: Optional[int] = None,
out_animation: Optional[str] = None,
out_animation_duration: Optional[int] = None,
transition: Optional[str] = None,
transition_duration: Optional[int] = None
) -> str:
"""
根据文本和时间线生成字幕信息JSON字符串
Args:
texts: 文本列表
timelines: 时间线数组
font_size: 字体大小(可选)
keyword_color: 关键词颜色(可选)
keyword_border_color: 关键词边框颜色(可选)
keyword_font_size: 关键词字体大小(可选)
keywords: 文本里面的重点词列表(可选)
in_animation: 入场动画名称(可选)
in_animation_duration: 入场动画时长(可选)
loop_animation: 组合动画名称(可选)
loop_animation_duration: 循环动画单次循环时长,微秒(可选)
out_animation: 出场动画名称(可选)
out_animation_duration: 出场动画时长(可选)
transition: 转场名称(可选)
transition_duration: 转场时长(可选)
Returns:
str: JSON字符串格式的字幕信息
Raises:
无异常抛出,长度不匹配时以最短的为准
"""
logger.info(f"caption_infos called with {len(texts)} texts and {len(timelines)} timelines")
# 长度不相等时以最短的为准
if len(texts) != len(timelines):
min_len = min(len(texts), len(timelines))
logger.warning(f"texts length ({len(texts)}) does not match timelines length ({len(timelines)}), using shorter length: {min_len}")
texts = texts[:min_len]
timelines = timelines[:min_len]
# 构建字幕信息列表
infos = []
for i, (text, timeline) in enumerate(zip(texts, timelines)):
info = _build_caption_info(text, timeline, i, keywords,
font_size, keyword_color, keyword_border_color, keyword_font_size,
in_animation, in_animation_duration,
loop_animation, loop_animation_duration,
out_animation, out_animation_duration,
transition, transition_duration)
infos.append(info)
logger.info(f"Processed caption info {i+1}: {info}")
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
logger.info(f"Generated caption infos JSON with {len(infos)} items")
return infos_json
def _build_caption_info(text, timeline, index, keywords,
font_size, keyword_color, keyword_border_color, keyword_font_size,
in_animation, in_animation_duration,
loop_animation, loop_animation_duration,
out_animation, out_animation_duration,
transition, transition_duration):
"""构建单个字幕信息字典"""
info = {
"start": timeline["start"],
"end": timeline["end"],
"text": text
}
# 添加关键词信息,如果keywords存在且有足够的关键词,则按索引分配
# 如果keywords数量少于文本数量,只有前几个文本有关键词,其余为空字符串
if keywords is not None and len(keywords) > 0:
if index < len(keywords):
info["keyword"] = keywords[index]
else:
info["keyword"] = "" # 当关键词不够时,后续文本关键词设为空字符串
# 添加可选参数
if keyword_color is not None:
info["keyword_color"] = keyword_color
if keyword_border_color is not None:
info["keyword_border_color"] = keyword_border_color
if keyword_font_size is not None:
info["keyword_font_size"] = keyword_font_size
if font_size is not None:
info["font_size"] = font_size
# 添加动画参数
if in_animation is not None:
info["in_animation"] = in_animation
if in_animation_duration is not None:
info["in_animation_duration"] = in_animation_duration
if loop_animation is not None:
info["loop_animation"] = loop_animation
if loop_animation_duration is not None:
info["loop_animation_duration"] = loop_animation_duration
if out_animation is not None:
info["out_animation"] = out_animation
if out_animation_duration is not None:
info["out_animation_duration"] = out_animation_duration
if transition is not None:
info["transition"] = transition
if transition_duration is not None:
info["transition_duration"] = transition_duration
return info
================================================
FILE: src/service/create_draft.py
================================================
from src.utils.logger import logger
import config
import src.pyJianYingDraft as draft
from src.utils.draft_cache import update_cache
from exceptions import CustomException, CustomError
import datetime
import uuid
import os
import shutil
def create_draft(width: int, height: int) -> str:
"""
基于模板创建剪映草稿的业务逻辑
Args:
width: 草稿宽度
height: 草稿高度
Returns:
draft_url: 草稿URL
Raises:
CustomException: 草稿创建失败
"""
# 生成一个草稿ID
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
unique_id = uuid.uuid4().hex[:8]
draft_id = f"{timestamp}{unique_id}"
logger.info(f"draft_id: {draft_id}, width: {width}, height: {height}")
# 使用模板创建草稿
try:
# 复制模板到新草稿目录
template_path = os.path.join(config.TEMPLATE_DIR, "default2")
draft_path = os.path.join(config.DRAFT_DIR, draft_id)
if os.path.exists(draft_path): shutil.rmtree(draft_path)
shutil.copytree(template_path, draft_path)
# 在创建草稿时,确保两个文件都存在且内容相同
draft_info_path = os.path.join(draft_path, "draft_info.json")
draft_content_path = os.path.join(draft_path, "draft_content.json")
# 加载模板草稿,然后修改配置
script = draft.ScriptFile.load_template(draft_info_path)
# 启用双文件兼容模式,这样保存时会自动同步两个文件
script.dual_file_compatibility = True
script.width, script.height = width, height
script.content["canvas_config"]["width"], script.content["canvas_config"]["height"] = width, height
# 保存修改后的草稿(会自动同步到两个文件)
script.save_path = draft_content_path
script.save()
# 添加空的主轨道(仅当没有主轨道时添加)
main_track_name = "main_track"
script.add_track(track_type=draft.TrackType.video, track_name=main_track_name, relative_index=0)
logger.info(f"Added empty main track: {main_track_name}")
script.save()
except Exception as e:
logger.error(f"create draft failed: {e}")
raise CustomException(CustomError.DRAFT_CREATE_FAILED)
# 缓存草稿并返回URL
update_cache(draft_id, script)
logger.info(f"create draft success: {draft_id}")
return config.DRAFT_URL + "?draft_id=" + draft_id
================================================
FILE: src/service/easy_create_material.py
================================================
import json
import os
from typing import Optional
from urllib.parse import urlparse
import asyncio
from src.utils.logger import logger
from src.pyJianYingDraft import ScriptFile, TrackType, trange, TextSegment, TextStyle, ClipSettings
import src.pyJianYingDraft as draft
from src.utils.draft_cache import DRAFT_CACHE
from exceptions import CustomException, CustomError
from src.utils import helper
import config
from src.utils.draft_lock_manager import DraftLockManager
def easy_create_material(
draft_url: str,
audio_url: str,
text: Optional[str] = None,
img_url: Optional[str] = None,
video_url: Optional[str] = None,
text_color: str = "#ffffff",
font_size: int = 15,
text_transform_y: int = 0
) -> str:
"""
在现有草稿中添加多种类型的素材内容,包括音频、视频、图片和文字
Args:
draft_url: 目标草稿的完整URL,必选参数
audio_url: 音频文件URL,必选参数,不能为空或"null"
text: 要添加的文字内容,可选参数,默认为None
img_url: 图片文件URL,可选参数,默认为None
video_url: 视频文件URL,可选参数,默认为None
text_color: 文字颜色(十六进制格式),默认值:"#ffffff"
font_size: 字体大小,默认值:15
text_transform_y: 文字Y轴位置偏移,默认值:0
Returns:
draft_url: 草稿URL
Raises:
CustomException: 素材创建失败
"""
logger.info(f"easy_create_material started, draft_url: {draft_url}, audio_url: {audio_url}")
logger.info(f"Materials to add - text: {text is not None}, img_url: {img_url is not None}, video_url: {video_url is not None}")
# 1. 提取草稿ID并验证
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.error(f"Invalid draft_url or draft not found in cache: {draft_url}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 2. 验证音频URL(必选参数)
if not audio_url or audio_url.lower() == "null" or audio_url.strip() == "":
logger.error("Audio URL is required and cannot be empty or null")
raise CustomException(CustomError.MATERIAL_CREATE_FAILED)
# 3. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
logger.info(f"Retrieved script from cache, draft_id: {draft_id}")
try:
# 4. 添加音频(必须的)
audio_added = add_audio_material(script, draft_id, audio_url)
logger.info(f"Audio material added: {audio_added}")
# 5. 添加视频(如果提供)
if video_url and video_url.strip() and video_url.lower() != "null":
video_added = add_video_material(script, draft_id, video_url)
logger.info(f"Video material added: {video_added}")
# 6. 添加图片(如果提供)
if img_url and img_url.strip() and img_url.lower() != "null":
image_added = add_image_material(script, draft_id, img_url)
logger.info(f"Image material added: {image_added}")
# 7. 添加文字(如果提供)
if text and text.strip():
text_added = add_text_material(script, text, text_color, font_size, text_transform_y)
logger.info(f"Text material added: {text_added}")
# 8. 保存草稿
script.save()
logger.info(f"Draft saved successfully")
logger.info(f"easy_create_material completed successfully - draft_id: {draft_id}")
return draft_url
except Exception as e:
logger.error(f"Failed to create materials: {str(e)}")
raise CustomException(CustomError.MATERIAL_CREATE_FAILED)
async def easy_create_material_async(
draft_url: str,
audio_url: str,
text: Optional[str] = None,
img_url: Optional[str] = None,
video_url: Optional[str] = None,
text_color: str = "#ffffff",
font_size: int = 15,
text_transform_y: int = 0,
lock_timeout: float = 30.0
) -> str:
"""
在现有草稿中添加多种类型的素材内容的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
Args:
draft_url: 目标草稿的完整 URL,必选参数
audio_url: 音频文件 URL,必选参数,不能为空或"null"
text: 要添加的文字内容,可选参数,默认为 None
img_url: 图片文件 URL,可选参数,默认为 None
video_url: 视频文件 URL,可选参数,默认为 None
text_color: 文字颜色(十六进制格式),默认值:"#ffffff"
font_size: 字体大小,默认值:15
text_transform_y: 文字 Y 轴位置偏移,默认值:0
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
draft_url: 草稿 URL
Raises:
CustomException: 素材创建失败或获取锁超时
asyncio.TimeoutError: 等待锁超时时抛出
Example:
>>> result = await easy_create_material_async(
... draft_url="http://.../draft_id=123",
... audio_url="https://.../audio.mp3",
... text="Hello"
... )
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 获取锁管理器
lock_manager = DraftLockManager()
# 尝试获取锁
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"Lock acquired for draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s"
)
try:
# 调用内部处理函数(不获取锁,由外层控制)
return easy_create_material(
draft_url=draft_url,
audio_url=audio_url,
text=text,
img_url=img_url,
video_url=video_url,
text_color=text_color,
font_size=font_size,
text_transform_y=text_transform_y
)
finally:
# 释放锁
await lock_manager.release_lock(draft_id)
logger.info(f"Lock released for draft_id: {draft_id}")
def add_video_material(script: ScriptFile, draft_id: str, video_url: str) -> bool:
"""
添加视频素材到草稿(固定5秒时长)
与add_videos接口保持一致的处理方式:
1. 创建规范的视频资源目录
2. 使用parse_video_data解析视频信息
3. 调用add_video_to_draft添加视频
Args:
script: 草稿文件对象
draft_id: 草稿ID
video_url: 视频文件URL
Returns:
是否成功添加
"""
try:
logger.info(f"Adding video material: {video_url}")
# 1. 创建视频资源目录(与add_videos保持一致)
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
draft_video_dir = os.path.join(draft_dir, "assets", "videos")
os.makedirs(name=draft_video_dir, exist_ok=True)
logger.info(f"Created video directory: {draft_video_dir}")
# 2. 构造视频信息JSON(固定5秒时长)
video_infos = json.dumps([{
"video_url": video_url,
"width": 1920,
"height": 1080,
"start": 0,
"end": 5000000, # 5秒(5 * 1000000微秒)
"duration": 5000000,
"volume": 1.0
}])
# 3. 解析视频信息
from src.service.add_videos import parse_video_data, add_video_to_draft
video_items = parse_video_data(video_infos)
if not video_items:
logger.error("No video items parsed")
return False
# 4. 添加视频轨道(与 add_videos 一致:add_track_ordered 按全局调用顺序叠层)
track_name = f"video_track_{helper.gen_unique_id()}"
script.add_track_ordered(track_type=TrackType.video, track_name=track_name)
logger.info(f"Added video track: {track_name}")
# 5. 添加视频到轨道(传递正确的视频资源目录)
add_video_to_draft(script, track_name, draft_video_dir, video_items[0])
return True
except Exception as e:
logger.error(f"Failed to add video material: {str(e)}")
return False
def add_image_material(script: ScriptFile, draft_id: str, img_url: str) -> bool:
"""
添加图片素材到草稿
与add_images接口保持一致的处理方式:
1. 创建规范的图片资源目录
2. 使用parse_image_data解析图片信息
3. 调用add_image_to_draft添加图片
Args:
script: 草稿文件对象
draft_id: 草稿ID
img_url: 图片文件URL
Returns:
是否成功添加
"""
try:
logger.info(f"Adding image material: {img_url}")
# 1. 创建图片资源目录(与add_images保持一致)
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
draft_image_dir = os.path.join(draft_dir, "assets", "images")
os.makedirs(name=draft_image_dir, exist_ok=True)
logger.info(f"Created image directory: {draft_image_dir}")
# 2. 构造图片信息JSON(默认尺寸和3秒显示时长)
image_infos = json.dumps([{
"image_url": img_url,
"width": 1024,
"height": 1024,
"start": 0,
"end": 3000000, # 3秒(3 * 1000000微秒)
}])
# 3. 解析图片信息
from src.service.add_images import parse_image_data, add_image_to_draft
image_items = parse_image_data(image_infos)
if not image_items:
logger.error("No image items parsed")
return False
# 4. 添加图片轨道(与 add_images 一致:add_track_ordered 按全局调用顺序叠层)
track_name = f"image_track_{helper.gen_unique_id()}"
script.add_track_ordered(track_type=TrackType.video, track_name=track_name)
logger.info(f"Added image track: {track_name}")
# 5. 添加图片到轨道(传递正确的图片资源目录)
add_image_to_draft(script, track_name, draft_image_dir, image_items[0])
return True
except Exception as e:
logger.error(f"Failed to add image material: {str(e)}")
return False
def add_audio_material(script: ScriptFile, draft_id: str, audio_url: str) -> bool:
"""
添加音频素材到草稿(固定5秒时长)
与add_audios接口保持一致的处理方式:
1. 创建规范的音频资源目录
2. 使用parse_audio_data解析音频信息
3. 调用add_audio_to_draft添加音频
Args:
script: 草稿文件对象
draft_id: 草稿ID
audio_url: 音频文件URL
Returns:
是否成功添加
"""
try:
logger.info(f"Adding audio material: {audio_url}")
# 1. 创建音频资源目录(与add_audios保持一致)
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
draft_audio_dir = os.path.join(draft_dir, "assets", "audios")
os.makedirs(name=draft_audio_dir, exist_ok=True)
logger.info(f"Created audio directory: {draft_audio_dir}")
# 2. 构造音频信息JSON(固定5秒时长)
audio_infos = json.dumps([{
"audio_url": audio_url,
"start": 0,
"end": 5000000, # 5秒(5 * 1000000微秒)
"volume": 1.0
}])
# 3. 解析音频信息
from src.service.add_audios import parse_audio_data, add_audio_to_draft
audio_items = parse_audio_data(audio_infos)
if not audio_items:
logger.error("No audio items parsed")
return False
# 4. 添加音频轨道
track_name = f"audio_track_{helper.gen_unique_id()}"
script.add_track(track_type=TrackType.audio, track_name=track_name, relative_index=10)
logger.info(f"Added audio track: {track_name}")
# 5. 添加音频到轨道(传递正确的音频资源目录)
add_audio_to_draft(script, track_name, draft_audio_dir, audio_items[0])
return True
except Exception as e:
logger.error(f"Failed to add audio material: {str(e)}")
return False
def add_text_material(
script: ScriptFile,
text: str,
text_color: str = "#ffffff",
font_size: int = 15,
text_transform_y: int = 0
) -> bool:
"""
添加文字素材到草稿
Args:
script: 草稿文件对象
text: 文字内容
text_color: 文字颜色
font_size: 字体大小
text_transform_y: Y轴位置偏移
Returns:
是否成功添加
"""
try:
logger.info(f"Adding text material: {text[:20]}...")
# 创建文字轨道(与 add_captions 等一致:按调用顺序叠在当前最上层之上)
track_name = f"text_track_{helper.gen_unique_id()}"
script.add_track_ordered(track_type=TrackType.text, track_name=track_name)
# 创建图像调节设置
# 获取草稿的高用于transform坐标转换
draft_height = script.height
logger.info(f"draft height: {draft_height}, text_transform_y: {text_transform_y}")
clip_settings = ClipSettings(
transform_y=text_transform_y / draft_height # 转换为半画布高单位
)
# 创建文本样式
rgb_color = hex_to_rgb(text_color)
text_style = TextStyle(
align=1, # 1为居中对齐
color=(rgb_color[0], rgb_color[1], rgb_color[2]),
size=font_size
)
# 创建文本片段(默认5秒显示时长)
text_segment = TextSegment(
text=text,
timerange=trange(start=0, duration=5000000), # 5秒
style=text_style,
clip_settings=clip_settings
)
# 向轨道添加文本片段
script.add_segment(text_segment, track_name)
logger.info(f"Text segment created and added, text: {text}")
return True
except Exception as e:
logger.error(f"Failed to add text material: {str(e)}")
return False
def hex_to_rgb(hex_color: str) -> list:
"""
将十六进制颜色转换为RGB数组
Args:
hex_color: 十六进制颜色,如 "#ffffff"
Returns:
RGB数组,值范围为0-1
"""
# 移除 # 前缀
hex_color = hex_color.lstrip('#')
# 确保是6位十六进制
if len(hex_color) != 6:
logger.warning(f"Invalid hex color: {hex_color}, using default white")
hex_color = "ffffff" # 默认白色
try:
# 转换为RGB
r = int(hex_color[0:2], 16) / 255.0
g = int(hex_color[2:4], 16) / 255.0
b = int(hex_color[4:6], 16) / 255.0
return [r, g, b]
except ValueError:
logger.warning(f"Failed to parse hex color: {hex_color}, using default white")
return [1.0, 1.0, 1.0] # 默认白色
def validate_url(url: str) -> bool:
"""
验证URL格式是否正确
Args:
url: 待验证的URL
Returns:
URL是否有效
"""
try:
result = urlparse(url)
return all([result.scheme, result.netloc])
except Exception:
return False
================================================
FILE: src/service/effect_infos.py
================================================
from src.utils.logger import logger
import json
from typing import List, Dict
def effect_infos(
effects: List[str],
timelines: List[Dict[str, int]]
) -> str:
"""
根据特效名称和时间线生成特效信息JSON字符串
Args:
effects: 特效名称列表
timelines: 时间线数组
Returns:
str: JSON字符串格式的特效信息
Raises:
无异常抛出,长度不匹配时以最短的为准
"""
logger.info(f"effect_infos called with {len(effects)} effects and {len(timelines)} timelines")
# 长度不相等时以最短的为准
if len(effects) != len(timelines):
min_len = min(len(effects), len(timelines))
logger.warning(f"effects length ({len(effects)}) does not match timelines length ({len(timelines)}), using shorter length: {min_len}")
effects = effects[:min_len]
timelines = timelines[:min_len]
# 构建特效信息列表
infos = []
for i, (effect, timeline) in enumerate(zip(effects, timelines)):
info = {
"effect_title": effect,
"start": timeline["start"],
"end": timeline["end"]
}
infos.append(info)
logger.info(f"Processed effect info {i+1}: {info}")
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
logger.info(f"Generated effect infos JSON with {len(infos)} items")
return infos_json
================================================
FILE: src/service/filter_infos.py
================================================
from src.utils.logger import logger
import json
from typing import List, Dict, Optional
def filter_infos(
filters: List[str],
timelines: List[Dict[str, int]],
intensities: Optional[List[float]] = None
) -> str:
"""
根据滤镜名称、时间线和强度生成滤镜信息JSON字符串
Args:
filters: 滤镜名称列表
timelines: 时间线数组
intensities: 滤镜强度列表(0-100),可选,默认为100
Returns:
str: JSON字符串格式的滤镜信息
Raises:
无异常抛出,长度不匹配时以最短的为准
"""
logger.info(f"filter_infos called with {len(filters)} filters, {len(timelines)} timelines, intensities: {intensities}")
# 确定最终处理长度(以最短的为准)
min_len = min(len(filters), len(timelines))
if intensities is not None:
min_len = min(min_len, len(intensities))
if len(filters) != len(timelines) or (intensities is not None and len(intensities) != len(filters)):
logger.warning(f"Length mismatch - filters: {len(filters)}, timelines: {len(timelines)}, intensities: {intensities}, using shorter length: {min_len}")
filters = filters[:min_len]
timelines = timelines[:min_len]
if intensities is not None:
intensities = intensities[:min_len]
# 构建滤镜信息列表
infos = []
for i, (filter_name, timeline) in enumerate(zip(filters, timelines)):
info = {
"filter_title": filter_name,
"start": timeline["start"],
"end": timeline["end"],
"intensity": intensities[i] if intensities else 100.0
}
infos.append(info)
logger.info(f"Processed filter info {i+1}: {info}")
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
logger.info(f"Generated filter infos JSON with {len(infos)} items")
return infos_json
================================================
FILE: src/service/gen_video.py
================================================
from src.utils.logger import logger
from src.utils.video_task_manager import task_manager
from src.utils.points import get_user_points
from exceptions import CustomException, CustomError
import config
def gen_video(draft_url: str, apiKey: str = None) -> str:
"""
提交视频生成任务(异步处理)。
多任务可并行下载;剪映导出全局串行;上传在后台进行且不阻塞其它任务的下载与导出;
每个 draft_url 对应独立的 VideoGenTask,保证草稿地址与成片一一对应。
Args:
draft_url: 草稿URL
apiKey: 可选的API密钥,必须是合法的UUID格式,可以为空
Returns:
message: 响应消息
"""
logger.info(f"gen_video called with draft_url: {draft_url}, apiKey provided: {apiKey is not None}")
try:
if config.ENABLE_APIKEY:
if apiKey == "": # 开启API密钥验证
raise CustomException(CustomError.INVALID_APIKEY)
# 查询用户积分
user_points = get_user_points(apiKey)
# 检查积分是否足够(需要大于1)
if user_points <= 1:
logger.error(f"Insufficient account balance: {user_points} for API key: {apiKey[:8]}***")
raise CustomException(CustomError.INSUFFICIENT_ACCOUNT_BALANCE)
# 验证草稿URL格式
validate_draft_url(draft_url)
# 提交任务到队列,传递API密钥用于计费
task_manager.submit_task(draft_url, apiKey)
logger.info(f"Video generation task submitted for draft_url: {draft_url}")
return "视频生成任务已提交,请使用draft_url查询进度"
except CustomException as e:
# 如果是自定义异常,直接抛出
raise e
except ValueError as e:
logger.error(f"Invalid draft_url: {draft_url}, error: {e}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
except Exception as e:
logger.error(f"Submit video generation task failed: {e}")
# 如果get_user_points失败,也抛出系统内部错误
raise CustomException(CustomError.INTERNAL_SERVER_ERROR)
def validate_draft_url(draft_url: str) -> None:
"""
验证草稿URL格式是否有效
Args:
draft_url: 草稿URL
Raises:
ValueError: 当URL格式无效时
"""
if not draft_url or not isinstance(draft_url, str):
raise ValueError("草稿URL不能为空")
draft_id = extract_draft_id_from_url(draft_url)
if not draft_id:
raise ValueError("无法从URL中提取draft_id")
def extract_draft_id_from_url(draft_url: str) -> str:
"""
从草稿URL中提取draft_id
Args:
draft_url: 草稿URL
Returns:
draft_id: 草稿ID
"""
from src.utils import helper
return helper.get_url_param(draft_url, "draft_id")
def gen_video_status(draft_url: str) -> dict:
"""
查询视频生成任务状态
Args:
draft_url: 草稿URL
Returns:
任务状态信息
"""
logger.debug(f"gen_video_status called with draft_url: {draft_url}")
try:
# 查询任务状态
status_info = get_task_status_info(draft_url)
logger.debug(f"Task status retrieved for draft_url: {draft_url}, status={status_info['status']}")
return status_info
except CustomException:
raise
except Exception as e:
logger.error(f"Get video generation status failed: {e}")
raise CustomException(CustomError.VIDEO_STATUS_QUERY_FAILED)
def get_task_status_info(draft_url: str) -> dict:
"""
获取任务状态信息
Args:
draft_url: 草稿URL
Returns:
任务状态信息
Raises:
CustomException: 当任务不存在时
"""
status_info = task_manager.get_task_status(draft_url)
if status_info is None:
logger.warning(f"No task found for draft_url: {draft_url}")
raise CustomException(CustomError.VIDEO_TASK_NOT_FOUND)
return status_info
def get_gen_video_active_count() -> int:
"""返回当前排队中 + 渲染中的云渲染草稿数量(不含已完成/失败)。"""
return task_manager.get_active_render_count()
================================================
FILE: src/service/get_audio_duration.py
================================================
from src.utils.logger import logger
from src.utils.download import download
from src.utils.media import get_media_duration
from exceptions import CustomException, CustomError
import config
import os
from typing import Optional
def get_audio_duration(mp3_url: str) -> int:
"""
获取音频文件的时长
Args:
mp3_url: 音频文件URL,支持mp3等常见音频格式
Returns:
duration: 音频时长,单位:微秒
Raises:
CustomException: 获取音频时长失败
"""
logger.info(f"get_audio_duration called with mp3_url: {mp3_url}")
temp_file_path = None
try:
# 1. 下载音频文件到临时目录
logger.info(f"Starting to download audio file from URL: {mp3_url}")
temp_file_path = download(mp3_url, config.TEMP_DIR)
# 2. 使用我们新创建的工具函数获取媒体时长
duration_microseconds = get_media_duration(temp_file_path)
if duration_microseconds is None:
logger.error("Failed to get audio duration")
raise CustomException(CustomError.AUDIO_DURATION_GET_FAILED, "Failed to get audio duration")
logger.info(f"Audio duration extracted successfully: {duration_microseconds/1_000_000:.6f}s ({duration_microseconds} microseconds)")
return duration_microseconds
except CustomException:
# CustomException 直接重新抛出,保持原有的错误信息
raise
except Exception as e:
logger.error(f"Get audio duration failed with unexpected error: {str(e)}")
raise CustomException(CustomError.AUDIO_DURATION_GET_FAILED, f"Unexpected error: {str(e)}")
finally:
# 3. 清理临时文件
_cleanup_temp_file(temp_file_path)
def _cleanup_temp_file(temp_file_path: Optional[str]) -> None:
"""
清理临时文件
Args:
temp_file_path: 临时文件路径,可能为None
"""
if temp_file_path and os.path.exists(temp_file_path):
try:
os.remove(temp_file_path)
logger.info(f"Temporary file removed: {temp_file_path}")
except Exception as cleanup_error:
logger.warning(f"Failed to cleanup temporary file {temp_file_path}: {cleanup_error}")
================================================
FILE: src/service/get_draft.py
================================================
from exceptions import CustomException, CustomError
from src.utils.logger import logger
from src.utils import helper
from typing import List
import config
import os
def gen_download_url(file_path: str) -> str:
"""
生成下载URL,将文件路径中的/app/替换成DOWNLOAD_URL
Args:
file_path: 文件路径
Returns:
download_url: 下载URL
"""
try:
relative_path = os.path.relpath(file_path, config.PROJECT_ROOT)
except ValueError:
# 如果路径不在同一驱动器等情况
relative_path = file_path
# 将系统路径分隔符转换为URL的正斜杠
relative_path = relative_path.replace(os.sep, "/")
# 拼接URL
base_url = config.DOWNLOAD_URL.rstrip("/")
download_url = f"{base_url}/{relative_path}"
return download_url
def batch_gen_download_url(file_paths: List[str]) -> List[str]:
"""
批量生成下载URL
Args:
file_paths: 文件路径列表
Returns:
download_urls: 下载URL列表
"""
download_urls = []
for file_path in file_paths:
download_url = gen_download_url(file_path)
download_urls.append(download_url)
return download_urls
def get_draft(draft_id: str) -> List[str]:
"""
获取剪映草稿的业务逻辑
Args:
draft_url: 草稿URL
Returns:
files: 文件列表
Raises:
CustomException: 自定义异常
"""
# 1. 从URL中提取草稿ID
if not draft_id:
logger.info("draft_id is empty")
raise CustomException(CustomError.INVALID_DRAFT_URL)
draft_dir = os.path.join(config.DRAFT_DIR, draft_id)
if not os.path.exists(draft_dir):
logger.info(f"draft_dir not exists: {draft_dir}")
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 2. 从草稿目录中获取文件列表
files = helper.get_all_files(draft_dir)
# 3. 批量生成下载URL
download_urls = batch_gen_download_url(files)
logger.info(f"get draft success: {draft_id}, download urls: {download_urls}")
return download_urls
================================================
FILE: src/service/get_effects.py
================================================
"""
获取特效列表的业务逻辑处理模块
"""
import json
from typing import List, Dict, Any
from src.utils.logger import logger
from exceptions import CustomException, CustomError
def get_effects(mode: int = 0) -> List[Dict[str, Any]]:
"""
获取特效列表
Args:
mode: 特效模式,0=所有,1=VIP,2=免费,默认值为 0
Returns:
effects: 特效对象数组
Raises:
CustomException: 获取特效列表失败
"""
logger.info(f"get_effects called with mode: {mode}")
try:
# 1. 参数验证
if mode not in [0, 1, 2]:
logger.error(f"Invalid mode: {mode}")
raise CustomException(CustomError.EFFECT_GET_FAILED)
# 2. 根据模式获取特效数据
effects = _get_effects_by_mode(mode=mode)
logger.info(f"Found {len(effects)} effects for mode: {mode}")
# 3. 直接返回对象数组
logger.info(f"Successfully returned effects array with {len(effects)} items")
return effects
except CustomException:
logger.error(f"Get effects failed for mode: {mode}")
raise
except Exception as e:
logger.error(f"Unexpected error in get_effects: {str(e)}")
raise CustomException(CustomError.EFFECT_GET_FAILED)
def _get_effects_by_mode(mode: int) -> List[Dict[str, Any]]:
"""
根据模式获取对应的特效数据
Args:
mode: 特效模式(0=所有,1=VIP,2=免费)
Returns:
包含特效信息的列表
"""
logger.info(f"Getting effects for mode: {mode}")
# 从 VideoSceneEffectType 枚举中获取所有特效
from src.pyJianYingDraft.metadata.video_scene_effect import VideoSceneEffectType
all_effects = []
for effect_type in VideoSceneEffectType:
effect_info = {
"name": effect_type.value.name,
"is_vip": effect_type.value.is_vip,
"resource_id": effect_type.value.resource_id,
"effect_id": effect_type.value.effect_id,
"icon_url": "", # 特效元数据中没有 icon_url
"has_params": len(effect_type.value.params) > 0
}
all_effects.append(effect_info)
logger.info(f"Total effects loaded: {len(all_effects)}")
# 根据模式过滤
if mode == 0: # 所有
result = all_effects
elif mode == 1: # VIP
result = [e for e in all_effects if e.get("is_vip", False)]
elif mode == 2: # 免费
result = [e for e in all_effects if not e.get("is_vip", False)]
else:
result = []
logger.info(f"Final filtered result: {len(result)} effects")
return result
================================================
FILE: src/service/get_filters.py
================================================
"""
获取滤镜列表的业务逻辑处理模块
"""
import json
from typing import List, Dict, Any
from src.utils.logger import logger
from exceptions import CustomException, CustomError
def get_filters(mode: int = 0) -> List[Dict[str, Any]]:
"""
获取滤镜列表
Args:
mode: 滤镜模式,0=所有,1=VIP,2=免费,默认值为 0
Returns:
filters: 滤镜对象数组
Raises:
CustomException: 获取滤镜列表失败
"""
logger.info(f"get_filters called with mode: {mode}")
try:
# 1. 参数验证
if mode not in [0, 1, 2]:
logger.error(f"Invalid mode: {mode}")
raise CustomException(CustomError.FILTER_GET_FAILED)
# 2. 根据模式获取滤镜数据
filters = _get_filters_by_mode(mode=mode)
logger.info(f"Found {len(filters)} filters for mode: {mode}")
# 3. 直接返回对象数组
logger.info(f"Successfully returned filters array with {len(filters)} items")
return filters
except CustomException:
logger.error(f"Get filters failed for mode: {mode}")
raise
except Exception as e:
logger.error(f"Unexpected error in get_filters: {str(e)}")
raise CustomException(CustomError.FILTER_GET_FAILED)
def _get_filters_by_mode(mode: int) -> List[Dict[str, Any]]:
"""
根据模式获取对应的滤镜数据
Args:
mode: 滤镜模式(0=所有,1=VIP,2=免费)
Returns:
包含滤镜信息的列表
"""
logger.info(f"Getting filters for mode: {mode}")
# 从 FilterType 枚举中获取所有滤镜
from src.pyJianYingDraft.metadata.filter_meta import FilterType
all_filters = []
for filter_type in FilterType:
filter_info = {
"name": filter_type.value.name,
"is_vip": filter_type.value.is_vip,
"resource_id": filter_type.value.resource_id,
"effect_id": filter_type.value.effect_id,
"has_params": len(filter_type.value.params) > 0
}
all_filters.append(filter_info)
logger.info(f"Total filters loaded: {len(all_filters)}")
# 根据模式过滤
if mode == 0: # 所有
result = all_filters
elif mode == 1: # VIP
result = [f for f in all_filters if f.get("is_vip", False)]
elif mode == 2: # 免费
result = [f for f in all_filters if not f.get("is_vip", False)]
else:
result = []
logger.info(f"Final filtered result: {len(result)} filters")
return result
================================================
FILE: src/service/get_image_animations.py
================================================
"""
获取图片出入场动画的业务逻辑处理模块
"""
import json
from typing import List, Dict, Any
from src.utils.logger import logger
from exceptions import CustomException, CustomError
def get_image_animations(mode: int = 0, type: str = "in") -> List[Dict[str, Any]]:
"""
获取图片出入场动画列表
Args:
mode: 动画模式,0=所有,1=VIP,2=免费,默认值为0
type: 动画类型,in=入场,out=出场,loop=循环,默认值为"in"
Returns:
effects: 图片出入场动画对象数组
Raises:
CustomException: 获取图片动画失败
"""
logger.info(f"get_image_animations called with mode: {mode}, type: {type}")
try:
# 1. 参数验证
if type not in ["in", "out", "loop"]:
logger.error(f"Invalid animation type: {type}")
raise CustomException(CustomError.IMAGE_ANIMATION_GET_FAILED)
if mode not in [0, 1, 2]:
logger.error(f"Invalid mode: {mode}")
raise CustomException(CustomError.IMAGE_ANIMATION_GET_FAILED)
# 2. 根据类型和模式获取动画数据
animations = _get_animations_by_type_and_mode(type=type, mode=mode)
logger.info(f"Found {len(animations)} image animations for type: {type}, mode: {mode}")
# 3. 直接返回对象数组(不再转换为JSON字符串)
logger.info(f"Successfully returned image animations array with {len(animations)} items")
return animations
except CustomException:
logger.error(f"Get image animations failed for type: {type}, mode: {mode}")
raise
except Exception as e:
logger.error(f"Unexpected error in get_image_animations: {str(e)}")
raise CustomException(CustomError.IMAGE_ANIMATION_GET_FAILED)
def _get_animations_by_type_and_mode(type: str, mode: int) -> List[Dict[str, Any]]:
"""
根据动画类型和模式获取对应的图片动画数据
Args:
type: 动画类型(in/out/loop)
mode: 动画模式(0=所有,1=VIP,2=免费)
Returns:
包含图片动画信息的列表
"""
logger.info(f"Getting image animations for type: {type}, mode: {mode}")
# 模拟图片动画数据库(实际项目中应该从数据库或API获取)
all_animations = _get_mock_image_animation_data()
# 1. 根据类型过滤
filtered_by_type = [anim for anim in all_animations if anim["type"] == type]
logger.info(f"Filtered by type '{type}': {len(filtered_by_type)} image animations")
# 2. 根据模式过滤
if mode == 0: # 所有
result = filtered_by_type
elif mode == 1: # VIP
result = [anim for anim in filtered_by_type if anim.get("is_vip", False)]
elif mode == 2: # 免费
result = [anim for anim in filtered_by_type if not anim.get("is_vip", False)]
else:
result = []
logger.info(f"Final filtered image animation result: {len(result)} animations")
return result
def _get_mock_image_animation_data() -> List[Dict[str, Any]]:
"""
获取模拟的图片动画数据(实际项目中应该从真实数据源获取)
Returns:
包含所有图片动画数据的列表
"""
return [
# 入场动画
{
"resource_id": "7314291622525538844",
"type": "in",
"category_id": "pic_ruchang",
"category_name": "图片入场",
"duration": 600000,
"id": "35395179",
"name": "渐显出现",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fade_in_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
{
"resource_id": "7397306443147252234",
"type": "in",
"category_id": "pic_ruchang",
"category_name": "图片入场",
"duration": 800000,
"id": "77035160",
"name": "缩放入场",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/scale_in_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": True
},
{
"resource_id": "7298765432109876544",
"type": "in",
"category_id": "pic_ruchang",
"category_name": "图片入场",
"duration": 700000,
"id": "12345679",
"name": "飞入效果",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fly_in_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
{
"resource_id": "7456789012345678901",
"type": "in",
"category_id": "pic_ruchang",
"category_name": "图片入场",
"duration": 900000,
"id": "98765432",
"name": "光影浮现",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/light_emerge_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": True
},
# 出场动画
{
"resource_id": "7314291622525538845",
"type": "out",
"category_id": "pic_chuchang",
"category_name": "图片出场",
"duration": 650000,
"id": "35395180",
"name": "渐隐消失",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fade_out_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
{
"resource_id": "7397306443147252235",
"type": "out",
"category_id": "pic_chuchang",
"category_name": "图片出场",
"duration": 750000,
"id": "77035161",
"name": "翻转消失",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/flip_out_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": True
},
{
"resource_id": "7123456789012345678",
"type": "out",
"category_id": "pic_chuchang",
"category_name": "图片出场",
"duration": 550000,
"id": "11223344",
"name": "碎片散落",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/shatter_out_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
# 循环动画
{
"resource_id": "7314291622525538846",
"type": "loop",
"category_id": "pic_xunhuan",
"category_name": "图片循环",
"duration": 1200000,
"id": "35395181",
"name": "轻微摆动",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/sway_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
{
"resource_id": "7397306443147252236",
"type": "loop",
"category_id": "pic_xunhuan",
"category_name": "图片循环",
"duration": 1500000,
"id": "77035162",
"name": "呼吸缩放",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/breath_scale_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": True
},
{
"resource_id": "7987654321098765432",
"type": "loop",
"category_id": "pic_xunhuan",
"category_name": "图片循环",
"duration": 1000000,
"id": "55667788",
"name": "光晕流转",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/halo_flow_pic_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
}
]
================================================
FILE: src/service/get_text_animations.py
================================================
"""
获取文字出入场动画的业务逻辑处理模块
"""
import json
from typing import List, Dict, Any
from src.utils.logger import logger
from exceptions import CustomException, CustomError
def get_text_animations(mode: int = 0, type: str = "in") -> List[Dict[str, Any]]:
"""
获取文字出入场动画列表
Args:
mode: 动画模式,0=所有,1=VIP,2=免费,默认值为0
type: 动画类型,in=入场,out=出场,loop=循环,默认值为"in"
Returns:
effects: 文字出入场动画对象数组
Raises:
CustomException: 获取文字动画失败
"""
logger.info(f"get_text_animations called with mode: {mode}, type: {type}")
try:
# 1. 参数验证
if type not in ["in", "out", "loop"]:
logger.error(f"Invalid animation type: {type}")
raise CustomException(CustomError.TEXT_ANIMATION_GET_FAILED)
if mode not in [0, 1, 2]:
logger.error(f"Invalid mode: {mode}")
raise CustomException(CustomError.TEXT_ANIMATION_GET_FAILED)
# 2. 根据类型和模式获取动画数据
animations = _get_animations_by_type_and_mode(type=type, mode=mode)
logger.info(f"Found {len(animations)} animations for type: {type}, mode: {mode}")
# 3. 直接返回对象数组(不再转换为JSON字符串)
logger.info(f"Successfully returned animations array with {len(animations)} items")
return animations
except CustomException:
logger.error(f"Get text animations failed for type: {type}, mode: {mode}")
raise
except Exception as e:
logger.error(f"Unexpected error in get_text_animations: {str(e)}")
raise CustomException(CustomError.TEXT_ANIMATION_GET_FAILED)
def _get_animations_by_type_and_mode(type: str, mode: int) -> List[Dict[str, Any]]:
"""
根据动画类型和模式获取对应的动画数据
Args:
type: 动画类型(in/out/loop)
mode: 动画模式(0=所有,1=VIP,2=免费)
Returns:
包含动画信息的列表
"""
logger.info(f"Getting animations for type: {type}, mode: {mode}")
# 模拟动画数据库(实际项目中应该从数据库或API获取)
all_animations = _get_mock_animation_data()
# 1. 根据类型过滤
filtered_by_type = [anim for anim in all_animations if anim["type"] == type]
logger.info(f"Filtered by type '{type}': {len(filtered_by_type)} animations")
# 2. 根据模式过滤
if mode == 0: # 所有
result = filtered_by_type
elif mode == 1: # VIP
result = [anim for anim in filtered_by_type if anim.get("is_vip", False)]
elif mode == 2: # 免费
result = [anim for anim in filtered_by_type if not anim.get("is_vip", False)]
else:
result = []
logger.info(f"Final filtered result: {len(result)} animations")
return result
def _get_mock_animation_data() -> List[Dict[str, Any]]:
"""
获取模拟的动画数据(实际项目中应该从真实数据源获取)
Returns:
包含所有动画数据的列表
"""
return [
# 入场动画
{
"resource_id": "7314291622525538843",
"type": "in",
"category_id": "ruchang",
"category_name": "入场",
"duration": 500000,
"id": "35395178",
"name": "冰雪飘动",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/459c196951cadbd024456a63db89481f",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
{
"resource_id": "7397306443147252233",
"type": "in",
"category_id": "ruchang",
"category_name": "入场",
"duration": 500000,
"id": "77035159",
"name": "变色输入",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/c15f5c313f8170c558043abf300a0692",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": True
},
{
"resource_id": "7298765432109876543",
"type": "in",
"category_id": "ruchang",
"category_name": "入场",
"duration": 750000,
"id": "12345678",
"name": "渐显入场",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fade_in_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
# 出场动画
{
"resource_id": "7314291622525538844",
"type": "out",
"category_id": "chuchang",
"category_name": "出场",
"duration": 600000,
"id": "35395179",
"name": "渐隐出场",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/fade_out_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
{
"resource_id": "7397306443147252234",
"type": "out",
"category_id": "chuchang",
"category_name": "出场",
"duration": 800000,
"id": "77035160",
"name": "旋转消失",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/rotate_out_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": True
},
# 循环动画
{
"resource_id": "7314291622525538845",
"type": "loop",
"category_id": "xunhuan",
"category_name": "循环",
"duration": 1000000,
"id": "35395180",
"name": "心跳跳动",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/heartbeat_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": False
},
{
"resource_id": "7397306443147252235",
"type": "loop",
"category_id": "xunhuan",
"category_name": "循环",
"duration": 1200000,
"id": "77035161",
"name": "闪烁效果",
"request_id": "",
"start": 0,
"icon_url": "https://lf5-hl-hw-effectcdn-tos.byteeffecttos.com/obj/ies.fe.effect/blink_icon",
"material_type": "sticker",
"panel": "",
"path": "",
"platform": "all",
"is_vip": True
}
]
================================================
FILE: src/service/get_text_effects.py
================================================
"""
获取花字效果列表和解析花字效果标识符的业务逻辑处理模块
"""
import json
from typing import List, Dict, Any, Optional
from src.utils.logger import logger
from exceptions import CustomException, CustomError
from config import HUAZI_CONFIG_PATH
# 进程启动时加载花字数据到内存
_HUAZI_DATA: List[Dict[str, Any]] = []
_HUAZI_MAP_BY_NAME: Dict[str, Dict[str, Any]] = {}
_HUAZI_MAP_BY_ID: Dict[str, Dict[str, Any]] = {}
def _load_huazi_data() -> None:
"""在进程启动时加载花字数据到内存"""
global _HUAZI_DATA, _HUAZI_MAP_BY_NAME, _HUAZI_MAP_BY_ID
try:
with open(HUAZI_CONFIG_PATH, "r", encoding="utf-8") as f:
_HUAZI_DATA = json.load(f)
# 构建映射表以便快速查找
for item in _HUAZI_DATA:
title = item.get("title", "")
resource_id = item.get("id", "")
# 标准化花字数据格式(匹配接口返回格式)
effect_data = {
"id": resource_id,
"title": title,
"is_vip": item.get("is_vip", False)
}
if title:
_HUAZI_MAP_BY_NAME[title] = effect_data
if resource_id:
_HUAZI_MAP_BY_ID[resource_id] = effect_data
logger.info(f"成功加载 {len(_HUAZI_DATA)} 个花字效果到内存")
except Exception as e:
logger.error(f"加载花字数据失败: {str(e)}")
_HUAZI_DATA = []
_HUAZI_MAP_BY_NAME = {}
_HUAZI_MAP_BY_ID = {}
# 模块导入时自动加载数据
_load_huazi_data()
def resolve_text_effect(effect_identifier: str) -> Optional[Dict[str, Any]]:
"""
解析花字效果标识符,返回对应的效果信息
Args:
effect_identifier: 可以是 effect_id(数字字符串)或效果名称(中文名称)
Returns:
花字效果信息字典,包含 effect_id 和 resource_id,如果未找到则返回 None
"""
logger.debug(f"Resolving text effect: {effect_identifier}")
# 1. 尝试作为 effect_id 查找
if effect_identifier in _HUAZI_MAP_BY_ID:
effect_data = _HUAZI_MAP_BY_ID[effect_identifier]
return {
"resource_id": effect_data["id"],
"effect_id": effect_data["id"]
}
# 2. 尝试作为中文名称查找
if effect_identifier in _HUAZI_MAP_BY_NAME:
effect_data = _HUAZI_MAP_BY_NAME[effect_identifier]
return {
"resource_id": effect_data["id"],
"effect_id": effect_data["id"]
}
# 3. 如果是纯数字但不在映射表中,直接使用(可能是新的 effect_id)
if effect_identifier.isdigit():
return {
"resource_id": effect_identifier,
"effect_id": effect_identifier
}
# 4. 未找到
logger.warning(f"Text effect not found: {effect_identifier}")
return None
def get_text_effects(mode: int = 0) -> List[Dict[str, Any]]:
"""
获取花字效果列表
Args:
mode: 花字效果模式,0=所有,1=VIP,2=免费,默认值为 0
Returns:
text_effects: 花字效果对象数组
Raises:
CustomException: 获取花字效果列表失败
"""
logger.info(f"get_text_effects called with mode: {mode}")
try:
# 1. 参数验证
if mode not in [0, 1, 2]:
logger.error(f"Invalid mode: {mode}")
raise CustomException(CustomError.FILTER_GET_FAILED)
# 2. 根据模式获取花字效果数据
text_effects = _get_text_effects_by_mode(mode=mode)
logger.info(f"Found {len(text_effects)} text effects for mode: {mode}")
# 3. 直接返回对象数组
logger.info(f"Successfully returned text effects array with {len(text_effects)} items")
return text_effects
except CustomException:
logger.error(f"Get text effects failed for mode: {mode}")
raise
except Exception as e:
logger.error(f"Unexpected error in get_text_effects: {str(e)}")
raise CustomException(CustomError.FILTER_GET_FAILED)
def _get_text_effects_by_mode(mode: int) -> List[Dict[str, Any]]:
"""
根据模式获取对应的花字效果数据
Args:
mode: 花字效果模式(0=所有,1=VIP,2=免费)
Returns:
包含花字效果信息的列表
"""
logger.info(f"Getting text effects for mode: {mode}")
# 从内存中直接获取所有花字效果
all_text_effects = list(_HUAZI_MAP_BY_NAME.values())
logger.info(f"Total text effects loaded from memory: {len(all_text_effects)}")
# 根据模式过滤
if mode == 0: # 所有
result = all_text_effects
elif mode == 1: # VIP
result = [f for f in all_text_effects if f.get("is_vip", False)]
elif mode == 2: # 免费
result = [f for f in all_text_effects if not f.get("is_vip", False)]
else:
result = []
logger.info(f"Final filtered result: {len(result)} text effects")
return result
================================================
FILE: src/service/get_url.py
================================================
from src.utils.logger import logger
from exceptions import CustomException, CustomError
import re
def get_url(output: str) -> str:
"""
提取链接的业务逻辑
Args:
output: 提取内容
Returns:
str: 提取结果
Raises:
CustomException: 提取失败
"""
logger.info(f"get_url starting, output: {output}")
try:
# 直接返回输入的内容,不做任何处理
# 根据需求描述,这个接口的作用是"用于多值返回变成单值返回"
# 在实际应用中,这里可能会有一些处理逻辑
result = output
logger.info(f"get_url completed successfully, result: {result}")
return result
except Exception as e:
logger.error(f"get_url failed: {str(e)}")
raise CustomException(CustomError.UNKNOWN_ERROR)
================================================
FILE: src/service/imgs_infos.py
================================================
from src.utils.logger import logger
import json
from typing import List, Optional, Dict, Any
def imgs_infos(
imgs: List[str],
timelines: List[Dict[str, int]],
height: Optional[int] = None,
width: Optional[int] = None,
in_animation: Optional[str] = None,
in_animation_duration: Optional[int] = None,
loop_animation: Optional[str] = None,
loop_animation_duration: Optional[int] = None,
out_animation: Optional[str] = None,
out_animation_duration: Optional[int] = None,
transition: Optional[str] = None,
transition_duration: Optional[int] = None
) -> str:
"""
根据图片URL和时间线生成图片信息JSON字符串
Args:
imgs: 图片URL列表
timelines: 时间线数组
height: 视频高度(可选)
width: 视频宽度(可选)
in_animation: 入场动画名称(可选),支持多个动画用|分隔
in_animation_duration: 入场动画时长(可选)
loop_animation: 组合动画名称(可选),支持多个动画用|分隔
loop_animation_duration: 组合动画时长(可选)
out_animation: 出场动画名称(可选),支持多个动画用|分隔
out_animation_duration: 出场动画时长(可选)
transition: 转场名称(可选)
transition_duration: 转场时长(可选)
Returns:
str: JSON字符串格式的图片信息
Raises:
无异常抛出,长度不匹配时以最短的为准
"""
logger.info(f"imgs_infos called with {len(imgs)} images and {len(timelines)} timelines")
# 长度不相等时以最短的为准
if len(imgs) != len(timelines):
min_len = min(len(imgs), len(timelines))
logger.warning(f"imgs length ({len(imgs)}) does not match timelines length ({len(timelines)}), using shorter length: {min_len}")
imgs = imgs[:min_len]
timelines = timelines[:min_len]
# 解析动画参数
parsed_animations = _parse_animation_params(in_animation, out_animation, loop_animation, transition)
in_animations, out_animations, loop_animations, transition_animations = parsed_animations
# 构建图片信息列表
infos = []
for i, (img_url, timeline) in enumerate(zip(imgs, timelines)):
info = _build_image_info(img_url, timeline, height, width, i,
in_animations, out_animations, loop_animations, transition_animations,
in_animation_duration, out_animation_duration,
loop_animation_duration, transition_duration)
infos.append(info)
logger.info(f"Processed image info {i+1}: {info}")
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
logger.info(f"Generated image infos JSON with {len(infos)} items")
return infos_json
def _parse_animation_params(in_animation, out_animation, loop_animation, transition):
"""解析动画参数,将用|分隔的字符串转换为列表,并处理扩展逻辑"""
def parse_single_param(param):
if param is not None and isinstance(param, str):
return [anim.strip() for anim in param.split('|') if anim.strip()]
return []
in_animations = parse_single_param(in_animation)
out_animations = parse_single_param(out_animation)
loop_animations = parse_single_param(loop_animation)
transition_animations = parse_single_param(transition)
return in_animations, out_animations, loop_animations, transition_animations
def _build_image_info(img_url, timeline, height, width, i,
in_animations, out_animations, loop_animations, transition_animations,
in_animation_duration, out_animation_duration,
loop_animation_duration, transition_duration):
"""构建单个图片信息字典"""
info = {
"image_url": img_url,
"start": timeline["start"],
"end": timeline["end"]
}
# 添加尺寸参数
if height is not None:
info["height"] = height
if width is not None:
info["width"] = width
# 添加动画参数,支持多动画分配逻辑
_add_animation_with_extension_logic(info, "in_animation", in_animations, i, in_animation_duration)
_add_animation_with_extension_logic(info, "out_animation", out_animations, i, out_animation_duration)
_add_animation_with_extension_logic(info, "loop_animation", loop_animations, i, loop_animation_duration)
_add_animation_with_extension_logic(info, "transition", transition_animations, i, transition_duration)
return info
def _add_animation_with_extension_logic(info, animation_key, animations, index, duration):
"""添加动画参数,支持扩展逻辑:动画不足时使用最后一个,动画过多时忽略多余"""
if animations:
# 如果索引超出动画列表长度,使用最后一个动画
if index < len(animations):
selected_animation = animations[index]
else:
selected_animation = animations[-1] # 使用最后一个动画
logger.info(f"Index {index} exceeds animation list length {len(animations)}, using last animation: {selected_animation}")
info[animation_key] = selected_animation
# 只有当动画存在时才添加对应的duration
if duration is not None:
duration_key = animation_key + "_duration"
info[duration_key] = duration
================================================
FILE: src/service/keyframes_infos.py
================================================
from src.utils.logger import logger
from src.utils.keyframe_value import normalize_keyframe_value
import json
from typing import List, Dict, Any
def calculate_relative_time_offset(offset_percent: int, duration: int) -> int:
"""
根据百分比和持续时间计算相对时间偏移
Args:
offset_percent: 时间百分比 (0-100)
duration: 片段持续时间(微秒)
Returns:
int: 相对时间偏移(微秒)
"""
return int((offset_percent / 100.0) * duration)
def keyframes_infos(
ctype: str,
offsets: str,
values: str,
segment_infos: List[Dict[str, Any]],
height: int = None,
width: int = None
) -> str:
"""
根据关键帧类型、位置比例和值生成关键帧信息JSON字符串
Args:
ctype: 关键帧类型
offsets: 需要放置关键帧的位置比例
values: 对应offsets的值
segment_infos: 轨道数据数组
height: 视频高,可选参数
width: 视频宽,可选参数
Returns:
str: JSON字符串格式的关键帧信息
Raises:
ValueError: 当offsets和values长度不匹配时,或其他参数验证失败时
"""
logger.info(f"keyframes_infos called with ctype={ctype}, offsets={offsets}, values={values}")
# 解析offsets和values
offset_list = [int(x) for x in offsets.split("|")]
value_list = [float(x) for x in values.split("|")]
# 检查offsets和values长度是否匹配
if len(offset_list) != len(value_list):
raise ValueError(f"offsets length ({len(offset_list)}) does not match values length ({len(value_list)})")
# 构建关键帧信息列表
keyframes = []
# 处理每个片段信息
for segment_info in segment_infos:
segment_id = segment_info["id"]
start = segment_info["start"]
end = segment_info["end"]
duration = end - start
# 为每个offset创建关键帧
for offset_percent, value in zip(offset_list, value_list):
# 计算片段内的相对时间偏移(微秒)
relative_time_offset = calculate_relative_time_offset(offset_percent, duration)
# 根据关键帧类型处理值的归一化
normalized_value = normalize_keyframe_value(
ctype, value, width, height, assume_pixel=True
)
keyframe = {
"offset": relative_time_offset, # 使用片段相对时间而不是轨道绝对时间
"property": ctype,
"segment_id": segment_id,
"value": normalized_value
}
keyframes.append(keyframe)
logger.info(f"Processed keyframe: {keyframe}")
# 转换为JSON字符串
keyframes_json = json.dumps(keyframes, ensure_ascii=False)
logger.info(f"Generated keyframes infos JSON with {len(keyframes)} items")
return keyframes_json
================================================
FILE: src/service/objs_to_str_list.py
================================================
from src.utils.logger import logger
from exceptions import CustomException, CustomError
from typing import List, Dict, Any
def objs_to_str_list(outputs: List[Dict[str, Any]]) -> List[str]:
"""
对象列表转化成字符串列表的业务逻辑
Args:
outputs: 数据对象列表
Returns:
List[str]: 字符串列表
Raises:
CustomException: 转换失败
"""
logger.info(f"objs_to_str_list starting, outputs count: {len(outputs)}")
try:
# 将对象列表中的output字段提取出来组成字符串列表
result = []
for obj in outputs:
result.append(obj.get("output", ""))
logger.info(f"objs_to_str_list completed successfully, result count: {len(result)}")
return result
except Exception as e:
logger.error(f"objs_to_str_list failed: {str(e)}")
raise CustomException(CustomError.UNKNOWN_ERROR)
================================================
FILE: src/service/save_draft.py
================================================
from src.utils.logger import logger
import src.pyJianYingDraft as draft
from src.utils.draft_cache import DRAFT_CACHE
from src.utils import helper
from exceptions import CustomException, CustomError
import config
import os
import asyncio
from src.utils.draft_lock_manager import DraftLockManager
def save_draft(draft_url: str) -> str:
"""
保存剪映草稿的业务逻辑
Args:
draft_url: 草稿URL
Returns:
draft_url: 草稿URL
message: 响应消息,如果成功就返回"草稿保存成功",失败就返回具体错误信息
"""
# 从URL中提取草稿ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if (not draft_id) or (draft_id not in DRAFT_CACHE):
logger.info("invalid draft url: %s", draft_url)
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 从缓存中获取草稿
script = DRAFT_CACHE[draft_id]
# 保存草稿
script.save()
logger.info(f"save draft success: %s", os.path.join(config.DRAFT_DIR, draft_id))
return draft_url
async def save_draft_async(draft_url: str, lock_timeout: float = 30.0) -> str:
"""
保存剪映草稿的异步版本(带并发锁保护)
功能:
1. 使用 DraftLockManager 防止同一草稿的并发写操作
2. 支持超时控制,避免无限等待
3. 自动释放锁,即使发生异常
Args:
draft_url: 草稿 URL,格式:".../get_draft?draft_id=xxx"
lock_timeout: 获取锁的超时时间(秒),默认 30 秒
Returns:
draft_url: 草稿 URL
Raises:
CustomException: 草稿保存失败或获取锁超时
asyncio.TimeoutError: 等待锁超时时抛出
Example:
>>> result = await save_draft_async(draft_url="http://.../draft_id=123")
"""
# 提取草稿 ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise CustomException(CustomError.INVALID_DRAFT_URL)
# 获取锁管理器
lock_manager = DraftLockManager()
# 尝试获取锁
try:
await lock_manager.acquire_lock(draft_id, timeout=lock_timeout)
logger.info(f"Lock acquired for draft_id: {draft_id}")
except asyncio.TimeoutError:
logger.error(f"Timeout waiting for lock on draft_id: {draft_id}")
raise CustomException(
CustomError.DRAFT_LOCK_TIMEOUT,
f"Failed to acquire lock for draft {draft_id} within {lock_timeout}s"
)
try:
# 调用内部处理函数(不获取锁,由外层控制)
return save_draft(draft_url=draft_url)
finally:
# 释放锁
await lock_manager.release_lock(draft_id)
logger.info(f"Lock released for draft_id: {draft_id}")
================================================
FILE: src/service/search_sticker.py
================================================
from src.utils.logger import logger
from typing import List, Dict, Any
from src.schemas.search_sticker import StickerItem, StickerInfo, StickerPackage, LargeImage
import json
import config
import random
def search_sticker(keyword: str) -> List[Dict[str, Any]]:
"""
搜索贴纸的业务逻辑
Args:
keyword: 搜索关键词
Returns:
List[Dict[str, Any]]: 贴纸数据列表,最多返回50条记录
"""
logger.info(f"Searching stickers with keyword: {keyword}")
# 从配置文件中读取贴纸数据
try:
with open(config.STICKER_CONFIG_PATH, 'r', encoding='utf-8') as f:
sticker_data = json.load(f)
except FileNotFoundError:
logger.error(f"Sticker config file not found: {config.STICKER_CONFIG_PATH}")
return []
except json.JSONDecodeError as e:
logger.error(f"Failed to parse sticker config file: {e}")
return []
except Exception as e:
logger.error(f"Failed to read sticker config file: {e}")
return []
# 根据关键词过滤数据(简单匹配标题)
filtered_data = []
for item in sticker_data:
if keyword in item["title"]:
filtered_data.append(item)
logger.info(f"Found {len(filtered_data)} stickers matching keyword: {keyword}")
# 如果没有找到匹配的贴纸,随机返回50条记录
if not filtered_data:
logger.info("No matching stickers found, returning 50 random stickers")
# 确保不会超出总数据量
sample_size = min(50, len(sticker_data))
filtered_data = random.sample(sticker_data, sample_size)
# 如果找到的贴纸超过50条,只返回前50条
if len(filtered_data) > 50:
logger.info(f"Too many matching stickers ({len(filtered_data)}), returning only 50")
filtered_data = filtered_data[:50]
return filtered_data
================================================
FILE: src/service/str_list_to_objs.py
================================================
from src.utils.logger import logger
from exceptions import CustomException, CustomError
from typing import List, Dict, Any
def str_list_to_objs(infos: List[str]) -> List[Dict[str, Any]]:
"""
字符串列表转化成对象列表的业务逻辑
Args:
infos: 字符串列表
Returns:
List[Dict[str, Any]]: 对象列表
Raises:
CustomException: 转换失败
"""
logger.info(f"str_list_to_objs starting, infos: {infos}")
try:
# 将字符串列表转换为对象列表
result = []
for info in infos:
result.append({"output": info})
logger.info(f"str_list_to_objs completed successfully, result count: {len(result)}")
return result
except Exception as e:
logger.error(f"str_list_to_objs failed: {str(e)}")
raise CustomException(CustomError.UNKNOWN_ERROR)
================================================
FILE: src/service/str_to_list.py
================================================
from src.utils.logger import logger
from exceptions import CustomException, CustomError
from typing import List
import json
def str_to_list(obj: str) -> List[str]:
"""
字符转列表的业务逻辑
Args:
obj: 对象内容(JSON字符串)
Returns:
List[str]: 字符串列表
Raises:
CustomException: 转换失败
"""
logger.info(f"str_to_list starting, obj: {obj}")
try:
# 将输入的字符串作为单个元素返回到列表中
# 根据需求描述,这里是将整个输入字符串作为一个元素返回
result = [obj]
logger.info(f"str_to_list completed successfully, result count: {len(result)}")
return result
except Exception as e:
logger.error(f"str_to_list failed: {str(e)}")
raise CustomException(CustomError.UNKNOWN_ERROR)
================================================
FILE: src/service/text_effect_map_generated.py
================================================
TEXT_EFFECT_MAP = {
"红黄火焰综艺花字": {
"resource_id": "7539407429763796249",
"effect_id": "7539407429763796249",
"name": "红黄火焰综艺花字",
"is_vip": True
},
"综艺-黑暗斑驳红色": {
"resource_id": "7351316503771368713",
"effect_id": "7351316503771368713",
"name": "综艺-黑暗斑驳红色",
"is_vip": True
},
"蓝白色立体综艺描边花字": {
"resource_id": "7403923146862087424",
"effect_id": "7403923146862087424",
"name": "蓝白色立体综艺描边花字",
"is_vip": True
},
"花字": {
"resource_id": "7527336771223407934",
"effect_id": "7527336771223407934",
"name": "花字",
"is_vip": True
},
"黄字橙光花字": {
"resource_id": "7506878563723840783",
"effect_id": "7506878563723840783",
"name": "黄字橙光花字",
"is_vip": True
},
"综艺-我看看 太夸张了吧!!": {
"resource_id": "7351314020114124068",
"effect_id": "7351314020114124068",
"name": "综艺-我看看 太夸张了吧!!",
"is_vip": True
},
"黑色描边花字": {
"resource_id": "7404884940837473590",
"effect_id": "7404884940837473590",
"name": "黑色描边花字",
"is_vip": True
},
"音乐节-超粗描边": {
"resource_id": "7272728092529986827",
"effect_id": "7272728092529986827",
"name": "音乐节-超粗描边",
"is_vip": True
},
"潮酷橙底黄色渐变立体花字": {
"resource_id": "7160594825933262087",
"effect_id": "7160594825933262087",
"name": "潮酷橙底黄色渐变立体花字",
"is_vip": True
},
"美食-肉": {
"resource_id": "7212892794778668345",
"effect_id": "7212892794778668345",
"name": "美食-肉",
"is_vip": True
},
"蓝白渐变立体花字": {
"resource_id": "7405155739943079178",
"effect_id": "7405155739943079178",
"name": "蓝白渐变立体花字",
"is_vip": True
},
"橙黄色描边立体花字": {
"resource_id": "7477040473454939454",
"effect_id": "7477040473454939454",
"name": "橙黄色描边立体花字",
"is_vip": True
},
"动感黄色发光故障风花字": {
"resource_id": "7406159958045232435",
"effect_id": "7406159958045232435",
"name": "动感黄色发光故障风花字",
"is_vip": True
},
"渐变黄红色发光字": {
"resource_id": "7404758577623289123",
"effect_id": "7404758577623289123",
"name": "渐变黄红色发光字",
"is_vip": True
},
"黄色渐变红描边发光字": {
"resource_id": "7403930784630967604",
"effect_id": "7403930784630967604",
"name": "黄色渐变红描边发光字",
"is_vip": True
},
"火焰燃烧花字": {
"resource_id": "7371391474404986150",
"effect_id": "7371391474404986150",
"name": "火焰燃烧花字",
"is_vip": True
},
"618立体": {
"resource_id": "7508541988401368345",
"effect_id": "7508541988401368345",
"name": "618立体",
"is_vip": True
},
"花字": {
"resource_id": "7545767280450227481",
"effect_id": "7545767280450227481",
"name": "花字",
"is_vip": True
},
"渐变黄色立体描边花字": {
"resource_id": "7404010442118515994",
"effect_id": "7404010442118515994",
"name": "渐变黄色立体描边花字",
"is_vip": True
},
"金箔纹理字": {
"resource_id": "7546806821701504281",
"effect_id": "7546806821701504281",
"name": "金箔纹理字",
"is_vip": True
},
"蓝色质感渐变立体": {
"resource_id": "7406646972330953994",
"effect_id": "7406646972330953994",
"name": "蓝色质感渐变立体",
"is_vip": True
},
"蓝字黄背景字": {
"resource_id": "7431415454515612963",
"effect_id": "7431415454515612963",
"name": "蓝字黄背景字",
"is_vip": True
},
"白色蓝边立体花字": {
"resource_id": "7403728277036125449",
"effect_id": "7403728277036125449",
"name": "白色蓝边立体花字",
"is_vip": True
},
"黄色渐变描边花字": {
"resource_id": "7404668885196131603",
"effect_id": "7404668885196131603",
"name": "黄色渐变描边花字",
"is_vip": True
},
"黄色花字": {
"resource_id": "7508204538659310872",
"effect_id": "7508204538659310872",
"name": "黄色花字",
"is_vip": True
},
"白色纹理花字": {
"resource_id": "7405520166701813018",
"effect_id": "7405520166701813018",
"name": "白色纹理花字",
"is_vip": True
},
"蓝色冰块立体花字": {
"resource_id": "7371423297289866505",
"effect_id": "7371423297289866505",
"name": "蓝色冰块立体花字",
"is_vip": True
},
"黄红色渐变立体花字": {
"resource_id": "7477792820707757336",
"effect_id": "7477792820707757336",
"name": "黄红色渐变立体花字",
"is_vip": True
},
"黄橙渐变立体秋日花字": {
"resource_id": "7533685266033347902",
"effect_id": "7533685266033347902",
"name": "黄橙渐变立体秋日花字",
"is_vip": True
},
"红金立体发光花字": {
"resource_id": "7548286146946616600",
"effect_id": "7548286146946616600",
"name": "红金立体发光花字",
"is_vip": True
},
"花字": {
"resource_id": "7430745422412549385",
"effect_id": "7430745422412549385",
"name": "花字",
"is_vip": True
},
"蓝色渐变花光字": {
"resource_id": "7406860981114015014",
"effect_id": "7406860981114015014",
"name": "蓝色渐变花光字",
"is_vip": True
},
"黄色立体字(秋天)": {
"resource_id": "7405788077832080659",
"effect_id": "7405788077832080659",
"name": "黄色立体字(秋天)",
"is_vip": True
},
"裂缝纹理投影": {
"resource_id": "7450158325188070668",
"effect_id": "7450158325188070668",
"name": "裂缝纹理投影",
"is_vip": True
},
"元旦新年氛围金色闪粉发光花字": {
"resource_id": "7441868112556739849",
"effect_id": "7441868112556739849",
"name": "元旦新年氛围金色闪粉发光花字",
"is_vip": True
},
"红黄描边立体": {
"resource_id": "7479056232117062937",
"effect_id": "7479056232117062937",
"name": "红黄描边立体",
"is_vip": True
},
"金色发光镂空花字": {
"resource_id": "7406015916380605733",
"effect_id": "7406015916380605733",
"name": "金色发光镂空花字",
"is_vip": True
},
"运动教程-花字": {
"resource_id": "7311259207590776075",
"effect_id": "7311259207590776075",
"name": "运动教程-花字",
"is_vip": True
},
"综艺风红色渐变纹理立体花字": {
"resource_id": "7478970969026022680",
"effect_id": "7478970969026022680",
"name": "综艺风红色渐变纹理立体花字",
"is_vip": True
},
"蓝色立体描边文字": {
"resource_id": "7406221865171111208",
"effect_id": "7406221865171111208",
"name": "蓝色立体描边文字",
"is_vip": True
},
"25元旦-晕染红描边": {
"resource_id": "7447932873845247286",
"effect_id": "7447932873845247286",
"name": "25元旦-晕染红描边",
"is_vip": True
},
"蓝色蜡笔纹理立体花字": {
"resource_id": "7404700591949204799",
"effect_id": "7404700591949204799",
"name": "蓝色蜡笔纹理立体花字",
"is_vip": True
},
"粉笔拼贴花字(教师节)": {
"resource_id": "7403915995569474870",
"effect_id": "7403915995569474870",
"name": "粉笔拼贴花字(教师节)",
"is_vip": True
},
"黄色渐变粉蓝描边立体花字": {
"resource_id": "7523881114054970648",
"effect_id": "7523881114054970648",
"name": "黄色渐变粉蓝描边立体花字",
"is_vip": True
},
"蓝色花字": {
"resource_id": "7480494571168795966",
"effect_id": "7480494571168795966",
"name": "蓝色花字",
"is_vip": True
},
"轻复古": {
"resource_id": "7350889130865265970",
"effect_id": "7350889130865265970",
"name": "轻复古",
"is_vip": True
},
"综艺 红色渐变": {
"resource_id": "7127681027346058503",
"effect_id": "7127681027346058503",
"name": "综艺 红色渐变",
"is_vip": True
},
"蓝白霓虹灯镂空效果发光花字": {
"resource_id": "7404140347892305202",
"effect_id": "7404140347892305202",
"name": "蓝白霓虹灯镂空效果发光花字",
"is_vip": True
},
"黄色立体描边多彩花字": {
"resource_id": "7404837954532789523",
"effect_id": "7404837954532789523",
"name": "黄色立体描边多彩花字",
"is_vip": True
},
"黄字彩色多层投影文字": {
"resource_id": "7406655431940033792",
"effect_id": "7406655431940033792",
"name": "黄字彩色多层投影文字",
"is_vip": True
},
"红色紫色渐变立体描边花字": {
"resource_id": "7506824081531243801",
"effect_id": "7506824081531243801",
"name": "红色紫色渐变立体描边花字",
"is_vip": True
},
"黄色渐变立体花字": {
"resource_id": "7347907413363789094",
"effect_id": "7347907413363789094",
"name": "黄色渐变立体花字",
"is_vip": True
},
"美食-发光白": {
"resource_id": "7212896770370571557",
"effect_id": "7212896770370571557",
"name": "美食-发光白",
"is_vip": True
},
"复古橙黄渐变醒目": {
"resource_id": "7400711954731371786",
"effect_id": "7400711954731371786",
"name": "复古橙黄渐变醒目",
"is_vip": True
},
"冬至立体": {
"resource_id": "7430861390933413130",
"effect_id": "7430861390933413130",
"name": "冬至立体",
"is_vip": True
},
"黑底白色立体花字": {
"resource_id": "7278242937488690493",
"effect_id": "7278242937488690493",
"name": "黑底白色立体花字",
"is_vip": True
},
"金边浮雕文字": {
"resource_id": "7405521516131093795",
"effect_id": "7405521516131093795",
"name": "金边浮雕文字",
"is_vip": True
},
"橘黄色渐变温柔发光花字": {
"resource_id": "7467426470714051902",
"effect_id": "7467426470714051902",
"name": "橘黄色渐变温柔发光花字",
"is_vip": True
},
"蓝色闪粉星光闪闪发光划走": {
"resource_id": "7496504150797274393",
"effect_id": "7496504150797274393",
"name": "蓝色闪粉星光闪闪发光划走",
"is_vip": True
},
"上下错落发光花字": {
"resource_id": "7368866329337580851",
"effect_id": "7368866329337580851",
"name": "上下错落发光花字",
"is_vip": True
},
"蓝色立体": {
"resource_id": "7362931435809901859",
"effect_id": "7362931435809901859",
"name": "蓝色立体",
"is_vip": True
},
"蓝字白边蓝光花字": {
"resource_id": "7231501825311116577",
"effect_id": "7231501825311116577",
"name": "蓝字白边蓝光花字",
"is_vip": True
},
"岩石花字": {
"resource_id": "7477883005953051928",
"effect_id": "7477883005953051928",
"name": "岩石花字",
"is_vip": True
},
"618-红紫渐变": {
"resource_id": "7375227839542480191",
"effect_id": "7375227839542480191",
"name": "618-红紫渐变",
"is_vip": True
},
"简约黄蓝方块综艺花字": {
"resource_id": "7494576393569733913",
"effect_id": "7494576393569733913",
"name": "简约黄蓝方块综艺花字",
"is_vip": True
},
"红色": {
"resource_id": "7511243674546867518",
"effect_id": "7511243674546867518",
"name": "红色",
"is_vip": True
},
"运动教程-花字": {
"resource_id": "7311259516392197439",
"effect_id": "7311259516392197439",
"name": "运动教程-花字",
"is_vip": True
},
"3D蓝字黄边立体综艺花字": {
"resource_id": "7404134454844788018",
"effect_id": "7404134454844788018",
"name": "3D蓝字黄边立体综艺花字",
"is_vip": True
},
"黄色渐变纹理粉蓝立体花字": {
"resource_id": "7485579082764225817",
"effect_id": "7485579082764225817",
"name": "黄色渐变纹理粉蓝立体花字",
"is_vip": True
},
"JP冬日-结霜字": {
"resource_id": "7303813440127126836",
"effect_id": "7303813440127126836",
"name": "JP冬日-结霜字",
"is_vip": True
},
"红粉渐变花字": {
"resource_id": "7405872381320842515",
"effect_id": "7405872381320842515",
"name": "红粉渐变花字",
"is_vip": True
},
"紫色阴森情绪发光花字": {
"resource_id": "7406170424935058726",
"effect_id": "7406170424935058726",
"name": "紫色阴森情绪发光花字",
"is_vip": True
},
"黄底字": {
"resource_id": "7343614179732966691",
"effect_id": "7343614179732966691",
"name": "黄底字",
"is_vip": True
},
"黄色渐变立体花字": {
"resource_id": "7298566943722851594",
"effect_id": "7298566943722851594",
"name": "黄色渐变立体花字",
"is_vip": True
},
"红黄渐变背景花字": {
"resource_id": "7404440675225292083",
"effect_id": "7404440675225292083",
"name": "红黄渐变背景花字",
"is_vip": True
},
"渐变黄字红边星光立体花字": {
"resource_id": "7404352881861659931",
"effect_id": "7404352881861659931",
"name": "渐变黄字红边星光立体花字",
"is_vip": True
},
"黄紫撞色复古立体字": {
"resource_id": "7405221368561700148",
"effect_id": "7405221368561700148",
"name": "黄紫撞色复古立体字",
"is_vip": True
},
"霓虹灯花字": {
"resource_id": "7404008412607958323",
"effect_id": "7404008412607958323",
"name": "霓虹灯花字",
"is_vip": True
},
"红色渐变白霜立体花字": {
"resource_id": "7308367002253544741",
"effect_id": "7308367002253544741",
"name": "红色渐变白霜立体花字",
"is_vip": True
},
"红色复古投影字": {
"resource_id": "7405906746461424930",
"effect_id": "7405906746461424930",
"name": "红色复古投影字",
"is_vip": True
},
"像素化花字": {
"resource_id": "7488151895048211736",
"effect_id": "7488151895048211736",
"name": "像素化花字",
"is_vip": True
},
"蓝橙色立体花字": {
"resource_id": "7492933140210666776",
"effect_id": "7492933140210666776",
"name": "蓝橙色立体花字",
"is_vip": True
},
"拼贴多色": {
"resource_id": "7360526293596671273",
"effect_id": "7360526293596671273",
"name": "拼贴多色",
"is_vip": True
},
"黄蓝紫渐变立体花字": {
"resource_id": "7546405848860511513",
"effect_id": "7546405848860511513",
"name": "黄蓝紫渐变立体花字",
"is_vip": True
},
"复古红色发光立体花字": {
"resource_id": "7160599091750161671",
"effect_id": "7160599091750161671",
"name": "复古红色发光立体花字",
"is_vip": True
},
"综艺红黄立体": {
"resource_id": "7434585603439742218",
"effect_id": "7434585603439742218",
"name": "综艺红黄立体",
"is_vip": True
},
"综艺-巅峰 厉害!!真是太火爆了!!!2": {
"resource_id": "7351319129124506930",
"effect_id": "7351319129124506930",
"name": "综艺-巅峰 厉害!!真是太火爆了!!!2",
"is_vip": True
},
"黄红蓝边立体花字": {
"resource_id": "7525867881331215640",
"effect_id": "7525867881331215640",
"name": "黄红蓝边立体花字",
"is_vip": True
},
"复古黄色立体": {
"resource_id": "7406970077368618274",
"effect_id": "7406970077368618274",
"name": "复古黄色立体",
"is_vip": True
},
"黄蓝立体字": {
"resource_id": "7431490038736702760",
"effect_id": "7431490038736702760",
"name": "黄蓝立体字",
"is_vip": True
},
"花字": {
"resource_id": "7533790251915955518",
"effect_id": "7533790251915955518",
"name": "花字",
"is_vip": True
},
"黄色霓虹灯发光花字": {
"resource_id": "7408956728529751333",
"effect_id": "7408956728529751333",
"name": "黄色霓虹灯发光花字",
"is_vip": True
},
"花字": {
"resource_id": "7532883085390548286",
"effect_id": "7532883085390548286",
"name": "花字",
"is_vip": True
},
"黄色马卡龙": {
"resource_id": "7509743284898794777",
"effect_id": "7509743284898794777",
"name": "黄色马卡龙",
"is_vip": True
},
"撞色描边立体字": {
"resource_id": "7406334288930557218",
"effect_id": "7406334288930557218",
"name": "撞色描边立体字",
"is_vip": True
},
"游戏像素文字效果花字": {
"resource_id": "7405871504769961254",
"effect_id": "7405871504769961254",
"name": "游戏像素文字效果花字",
"is_vip": True
},
"粉色立体字": {
"resource_id": "7475271686095506712",
"effect_id": "7475271686095506712",
"name": "粉色立体字",
"is_vip": True
},
"霓虹灯花字": {
"resource_id": "7330423055900069155",
"effect_id": "7330423055900069155",
"name": "霓虹灯花字",
"is_vip": True
},
"黄色红色": {
"resource_id": "7389147072064179506",
"effect_id": "7389147072064179506",
"name": "黄色红色",
"is_vip": True
},
"红樱桃": {
"resource_id": "7539187400808123672",
"effect_id": "7539187400808123672",
"name": "红樱桃",
"is_vip": True
},
"粉紫描边立体": {
"resource_id": "7474511004676803902",
"effect_id": "7474511004676803902",
"name": "粉紫描边立体",
"is_vip": True
},
"花字": {
"resource_id": "7495665652816956697",
"effect_id": "7495665652816956697",
"name": "花字",
"is_vip": True
},
"渐变黄色中秋圆底花字": {
"resource_id": "7405070516706381092",
"effect_id": "7405070516706381092",
"name": "渐变黄色中秋圆底花字",
"is_vip": True
},
"复古背景字": {
"resource_id": "7430809868333780259",
"effect_id": "7430809868333780259",
"name": "复古背景字",
"is_vip": True
},
"蓝紫色粗体描边花字": {
"resource_id": "7259922491185958203",
"effect_id": "7259922491185958203",
"name": "蓝紫色粗体描边花字",
"is_vip": True
},
"黄绿发光字": {
"resource_id": "7403962881252805903",
"effect_id": "7403962881252805903",
"name": "黄绿发光字",
"is_vip": True
},
"粉蓝色渐变立体发光花字": {
"resource_id": "7366086107366182153",
"effect_id": "7366086107366182153",
"name": "粉蓝色渐变立体发光花字",
"is_vip": True
},
"花字": {
"resource_id": "7525463353603640601",
"effect_id": "7525463353603640601",
"name": "花字",
"is_vip": True
},
"粉色描边白色字": {
"resource_id": "7474605929825193240",
"effect_id": "7474605929825193240",
"name": "粉色描边白色字",
"is_vip": True
},
"穿搭立体": {
"resource_id": "7536671491740634392",
"effect_id": "7536671491740634392",
"name": "穿搭立体",
"is_vip": True
},
"好物美妆-黄白跳色": {
"resource_id": "7264547410817387795",
"effect_id": "7264547410817387795",
"name": "好物美妆-黄白跳色",
"is_vip": True
},
"绿色东南亚": {
"resource_id": "7411032759457631515",
"effect_id": "7411032759457631515",
"name": "绿色东南亚",
"is_vip": True
},
"蓝色纸纹纹理花字": {
"resource_id": "7520663448003415358",
"effect_id": "7520663448003415358",
"name": "蓝色纸纹纹理花字",
"is_vip": True
},
"红黄渐变发光字": {
"resource_id": "7406976068789210403",
"effect_id": "7406976068789210403",
"name": "红黄渐变发光字",
"is_vip": True
},
"粉色星空花字": {
"resource_id": "7396798321739730226",
"effect_id": "7396798321739730226",
"name": "粉色星空花字",
"is_vip": True
},
"粉色立体字": {
"resource_id": "7404321887817452800",
"effect_id": "7404321887817452800",
"name": "粉色立体字",
"is_vip": True
},
"金属划痕暗黑立体字": {
"resource_id": "7405501393248881960",
"effect_id": "7405501393248881960",
"name": "金属划痕暗黑立体字",
"is_vip": True
},
"粉色": {
"resource_id": "7507145578984361241",
"effect_id": "7507145578984361241",
"name": "粉色",
"is_vip": True
},
"橘黄色立体字": {
"resource_id": "7407078807309503744",
"effect_id": "7407078807309503744",
"name": "橘黄色立体字",
"is_vip": True
},
"双色爱心花字": {
"resource_id": "7362054905256758591",
"effect_id": "7362054905256758591",
"name": "双色爱心花字",
"is_vip": True
},
"三花猫配色": {
"resource_id": "7532428202199797016",
"effect_id": "7532428202199797016",
"name": "三花猫配色",
"is_vip": True
},
"绿色立体花字": {
"resource_id": "7477511783801163032",
"effect_id": "7477511783801163032",
"name": "绿色立体花字",
"is_vip": True
},
"高级幻彩花紫字": {
"resource_id": "7293329973694172435",
"effect_id": "7293329973694172435",
"name": "高级幻彩花紫字",
"is_vip": True
},
"红绿撞色发光字": {
"resource_id": "7406650793631223075",
"effect_id": "7406650793631223075",
"name": "红绿撞色发光字",
"is_vip": True
},
"绿色发光花字": {
"resource_id": "7265723229216525620",
"effect_id": "7265723229216525620",
"name": "绿色发光花字",
"is_vip": True
},
"绿色渐变背景字": {
"resource_id": "7404290078723312931",
"effect_id": "7404290078723312931",
"name": "绿色渐变背景字",
"is_vip": True
},
"蓝绿纹理花字": {
"resource_id": "7527597707930799422",
"effect_id": "7527597707930799422",
"name": "蓝绿纹理花字",
"is_vip": True
},
"粉色立体渐变": {
"resource_id": "7376607395046231331",
"effect_id": "7376607395046231331",
"name": "粉色立体渐变",
"is_vip": True
},
"黄色立体花字": {
"resource_id": "7405087980685167922",
"effect_id": "7405087980685167922",
"name": "黄色立体花字",
"is_vip": True
},
"花字": {
"resource_id": "7478268728992419096",
"effect_id": "7478268728992419096",
"name": "花字",
"is_vip": True
},
"#花字招募令 彩虹花字": {
"resource_id": "7398456039634406666",
"effect_id": "7398456039634406666",
"name": "#花字招募令 彩虹花字",
"is_vip": True
},
"少女粉星星花字": {
"resource_id": "7404459246961577257",
"effect_id": "7404459246961577257",
"name": "少女粉星星花字",
"is_vip": True
},
"未来科技感发光花字": {
"resource_id": "7404471553607421222",
"effect_id": "7404471553607421222",
"name": "未来科技感发光花字",
"is_vip": True
},
"潮流紫色荧光花字": {
"resource_id": "7241759007952735491",
"effect_id": "7241759007952735491",
"name": "潮流紫色荧光花字",
"is_vip": True
},
"橙色渐变花字": {
"resource_id": "7404263174230297882",
"effect_id": "7404263174230297882",
"name": "橙色渐变花字",
"is_vip": True
},
"可爱花字": {
"resource_id": "7430667459683831079",
"effect_id": "7430667459683831079",
"name": "可爱花字",
"is_vip": True
},
"渐变综艺发光花字": {
"resource_id": "7539752808367574297",
"effect_id": "7539752808367574297",
"name": "渐变综艺发光花字",
"is_vip": True
},
"橙色万圣花字": {
"resource_id": "7293140122332122368",
"effect_id": "7293140122332122368",
"name": "橙色万圣花字",
"is_vip": True
},
"棕色立体粗描边": {
"resource_id": "7406388990837886234",
"effect_id": "7406388990837886234",
"name": "棕色立体粗描边",
"is_vip": True
},
"立体字": {
"resource_id": "7260043007997562149",
"effect_id": "7260043007997562149",
"name": "立体字",
"is_vip": True
},
"酸性质感花字": {
"resource_id": "7481664682638560537",
"effect_id": "7481664682638560537",
"name": "酸性质感花字",
"is_vip": True
},
"绿色渐变立体花字": {
"resource_id": "7492430244570303806",
"effect_id": "7492430244570303806",
"name": "绿色渐变立体花字",
"is_vip": True
},
"赛博朋克风故障字": {
"resource_id": "7404304312135896360",
"effect_id": "7404304312135896360",
"name": "赛博朋克风故障字",
"is_vip": True
},
"粉色立体花字": {
"resource_id": "7404522256929459494",
"effect_id": "7404522256929459494",
"name": "粉色立体花字",
"is_vip": True
},
"粉橙立体花字": {
"resource_id": "7475398432807521561",
"effect_id": "7475398432807521561",
"name": "粉橙立体花字",
"is_vip": True
},
"复古牛皮纸花字": {
"resource_id": "7362833837627378944",
"effect_id": "7362833837627378944",
"name": "复古牛皮纸花字",
"is_vip": True
},
"黑色纹理立体花字": {
"resource_id": "7306894668795612442",
"effect_id": "7306894668795612442",
"name": "黑色纹理立体花字",
"is_vip": True
},
"圆环花字": {
"resource_id": "7349078136480386345",
"effect_id": "7349078136480386345",
"name": "圆环花字",
"is_vip": True
},
"薰衣草": {
"resource_id": "7509044952912055614",
"effect_id": "7509044952912055614",
"name": "薰衣草",
"is_vip": True
},
"清新条纹投影纹理花字": {
"resource_id": "7404757226583362854",
"effect_id": "7404757226583362854",
"name": "清新条纹投影纹理花字",
"is_vip": True
},
"马卡龙色渐变文字": {
"resource_id": "7406238235141213440",
"effect_id": "7406238235141213440",
"name": "马卡龙色渐变文字",
"is_vip": True
},
"白字红光花字": {
"resource_id": "7351431205692181786",
"effect_id": "7351431205692181786",
"name": "白字红光花字",
"is_vip": True
},
"纹理花字": {
"resource_id": "7333249201419160868",
"effect_id": "7333249201419160868",
"name": "纹理花字",
"is_vip": True
},
"描边橙色黄色双色立体花字": {
"resource_id": "7405049138867424523",
"effect_id": "7405049138867424523",
"name": "描边橙色黄色双色立体花字",
"is_vip": True
},
"粉色渐变": {
"resource_id": "7491540791689530686",
"effect_id": "7491540791689530686",
"name": "粉色渐变",
"is_vip": True
},
"黄粉色立体渐变花字": {
"resource_id": "7371110382393494793",
"effect_id": "7371110382393494793",
"name": "黄粉色立体渐变花字",
"is_vip": True
},
"低饱和紫色渐变综艺花字": {
"resource_id": "7388017781117160745",
"effect_id": "7388017781117160745",
"name": "低饱和紫色渐变综艺花字",
"is_vip": True
},
"莫兰迪清新蓝色描边花字": {
"resource_id": "7404083693003853096",
"effect_id": "7404083693003853096",
"name": "莫兰迪清新蓝色描边花字",
"is_vip": True
},
"节日花字": {
"resource_id": "7405888865132711220",
"effect_id": "7405888865132711220",
"name": "节日花字",
"is_vip": True
},
"3D多层渐变红": {
"resource_id": "7174401031399312670",
"effect_id": "7174401031399312670",
"name": "3D多层渐变红",
"is_vip": True
},
"红色": {
"resource_id": "7389185223600114995",
"effect_id": "7389185223600114995",
"name": "红色",
"is_vip": True
},
"多色渐变花字": {
"resource_id": "7405856965332585764",
"effect_id": "7405856965332585764",
"name": "多色渐变花字",
"is_vip": True
},
"3D腮绿": {
"resource_id": "7173927171881323789",
"effect_id": "7173927171881323789",
"name": "3D腮绿",
"is_vip": True
},
"黄色渐变纹理花字": {
"resource_id": "7431429108791266611",
"effect_id": "7431429108791266611",
"name": "黄色渐变纹理花字",
"is_vip": True
},
"黄绿色立体纹理花字": {
"resource_id": "7404772432323546422",
"effect_id": "7404772432323546422",
"name": "黄绿色立体纹理花字",
"is_vip": True
},
"白字橘色描边立体花字": {
"resource_id": "7371117571757641011",
"effect_id": "7371117571757641011",
"name": "白字橘色描边立体花字",
"is_vip": True
},
"蓝色纹理白描边花字": {
"resource_id": "7378313478852906280",
"effect_id": "7378313478852906280",
"name": "蓝色纹理白描边花字",
"is_vip": True
},
"桃红色渐变立体花字": {
"resource_id": "7388024664980770060",
"effect_id": "7388024664980770060",
"name": "桃红色渐变立体花字",
"is_vip": True
},
"潮酷粉黄撞色立体花字": {
"resource_id": "7404058441481866511",
"effect_id": "7404058441481866511",
"name": "潮酷粉黄撞色立体花字",
"is_vip": True
},
"复古镂空花字": {
"resource_id": "7345391635267603753",
"effect_id": "7345391635267603753",
"name": "复古镂空花字",
"is_vip": True
},
"粉黄渐变立体字": {
"resource_id": "7405944611430092066",
"effect_id": "7405944611430092066",
"name": "粉黄渐变立体字",
"is_vip": True
},
"绿橙花字": {
"resource_id": "7392196588426382629",
"effect_id": "7392196588426382629",
"name": "绿橙花字",
"is_vip": True
},
"中式背景框文字": {
"resource_id": "7406225575712443663",
"effect_id": "7406225575712443663",
"name": "中式背景框文字",
"is_vip": True
},
"彩色花边花字": {
"resource_id": "7366911458824752410",
"effect_id": "7366911458824752410",
"name": "彩色花边花字",
"is_vip": True
},
"节日粉色渐变立体描边花字": {
"resource_id": "7539491294188440857",
"effect_id": "7539491294188440857",
"name": "节日粉色渐变立体描边花字",
"is_vip": True
},
"黄绿综艺花字": {
"resource_id": "7476505479364201753",
"effect_id": "7476505479364201753",
"name": "黄绿综艺花字",
"is_vip": True
},
"抹茶绿多层描边立体花字": {
"resource_id": "7405039371037986089",
"effect_id": "7405039371037986089",
"name": "抹茶绿多层描边立体花字",
"is_vip": True
},
"粉紫色渐变立体发光花字": {
"resource_id": "7407013513979251978",
"effect_id": "7407013513979251978",
"name": "粉紫色渐变立体发光花字",
"is_vip": True
},
"红粉色渐变立体发光花字": {
"resource_id": "7475276656626863385",
"effect_id": "7475276656626863385",
"name": "红粉色渐变立体发光花字",
"is_vip": True
},
"花字": {
"resource_id": "7543043727103675673",
"effect_id": "7543043727103675673",
"name": "花字",
"is_vip": True
},
"粉色亮晶晶花字": {
"resource_id": "7265614497119735040",
"effect_id": "7265614497119735040",
"name": "粉色亮晶晶花字",
"is_vip": True
},
"樱花粉 粉色花字": {
"resource_id": "7336859597287804169",
"effect_id": "7336859597287804169",
"name": "樱花粉 粉色花字",
"is_vip": True
},
"蓝绿立体花字": {
"resource_id": "7405924713400126747",
"effect_id": "7405924713400126747",
"name": "蓝绿立体花字",
"is_vip": True
},
"万圣紫色花字": {
"resource_id": "7293778917603822848",
"effect_id": "7293778917603822848",
"name": "万圣紫色花字",
"is_vip": True
},
"3D粉色立体花字": {
"resource_id": "7350157127207456037",
"effect_id": "7350157127207456037",
"name": "3D粉色立体花字",
"is_vip": True
},
"粉蓝色渐变爱心底花字": {
"resource_id": "7542084187285703998",
"effect_id": "7542084187285703998",
"name": "粉蓝色渐变爱心底花字",
"is_vip": True
},
"五一立体": {
"resource_id": "7359406447718862131",
"effect_id": "7359406447718862131",
"name": "五一立体",
"is_vip": True
},
"粉色紫边立体字": {
"resource_id": "7409954407321783586",
"effect_id": "7409954407321783586",
"name": "粉色紫边立体字",
"is_vip": True
},
"立体黄蓝纹理花字": {
"resource_id": "7537970908221394238",
"effect_id": "7537970908221394238",
"name": "立体黄蓝纹理花字",
"is_vip": True
},
"3D粉色渐变立体花字": {
"resource_id": "7403948957547760906",
"effect_id": "7403948957547760906",
"name": "3D粉色渐变立体花字",
"is_vip": True
},
"浅蓝黄渐变立体花字": {
"resource_id": "7312845270671232294",
"effect_id": "7312845270671232294",
"name": "浅蓝黄渐变立体花字",
"is_vip": True
},
"复古红色立体花字": {
"resource_id": "7480506672746794264",
"effect_id": "7480506672746794264",
"name": "复古红色立体花字",
"is_vip": True
},
"绿色花字": {
"resource_id": "7431433243922107689",
"effect_id": "7431433243922107689",
"name": "绿色花字",
"is_vip": True
},
"美妆纹理": {
"resource_id": "7411406288350874917",
"effect_id": "7411406288350874917",
"name": "美妆纹理",
"is_vip": True
},
"黄绿花字": {
"resource_id": "7404294636656774451",
"effect_id": "7404294636656774451",
"name": "黄绿花字",
"is_vip": True
},
"糖果色彩色渐变描边花字": {
"resource_id": "7404705863442713910",
"effect_id": "7404705863442713910",
"name": "糖果色彩色渐变描边花字",
"is_vip": True
},
"粉色立体花字": {
"resource_id": "7298637894481169701",
"effect_id": "7298637894481169701",
"name": "粉色立体花字",
"is_vip": True
},
"蓝色渐变花字": {
"resource_id": "7252284645998464288",
"effect_id": "7252284645998464288",
"name": "蓝色渐变花字",
"is_vip": True
},
"纹理花字": {
"resource_id": "7339054041458036006",
"effect_id": "7339054041458036006",
"name": "纹理花字",
"is_vip": True
},
"纹理复古深色字": {
"resource_id": "7404307108625206563",
"effect_id": "7404307108625206563",
"name": "纹理复古深色字",
"is_vip": True
},
"红色描边黄色花字": {
"resource_id": "7404774919315197195",
"effect_id": "7404774919315197195",
"name": "红色描边黄色花字",
"is_vip": True
},
"白字黑边裂痕综艺花字": {
"resource_id": "7404884426150235418",
"effect_id": "7404884426150235418",
"name": "白字黑边裂痕综艺花字",
"is_vip": True
},
"黄字红边立体粗描边花字": {
"resource_id": "7404394775664708901",
"effect_id": "7404394775664708901",
"name": "黄字红边立体粗描边花字",
"is_vip": True
},
"国风水墨": {
"resource_id": "7405990788053683482",
"effect_id": "7405990788053683482",
"name": "国风水墨",
"is_vip": True
},
"火焰立体": {
"resource_id": "7407352720815836443",
"effect_id": "7407352720815836443",
"name": "火焰立体",
"is_vip": True
},
"红色描边纹理立体字": {
"resource_id": "7405218557342059816",
"effect_id": "7405218557342059816",
"name": "红色描边纹理立体字",
"is_vip": True
},
"蓝色渐变阴影立体花字": {
"resource_id": "7495216846946274584",
"effect_id": "7495216846946274584",
"name": "蓝色渐变阴影立体花字",
"is_vip": True
},
"红色立体纹理花字": {
"resource_id": "7405838293843070234",
"effect_id": "7405838293843070234",
"name": "红色立体纹理花字",
"is_vip": True
},
"渐变花字": {
"resource_id": "7368685720325655817",
"effect_id": "7368685720325655817",
"name": "渐变花字",
"is_vip": True
},
"纸质": {
"resource_id": "7360556929959087397",
"effect_id": "7360556929959087397",
"name": "纸质",
"is_vip": True
},
"蓝白色渐变立体花字": {
"resource_id": "7404520330502458674",
"effect_id": "7404520330502458674",
"name": "蓝白色渐变立体花字",
"is_vip": True
},
"花字": {
"resource_id": "7547970729258519833",
"effect_id": "7547970729258519833",
"name": "花字",
"is_vip": True
},
"蓝色": {
"resource_id": "7507097456283274520",
"effect_id": "7507097456283274520",
"name": "蓝色",
"is_vip": True
},
"黑白线条花字": {
"resource_id": "7404819849140063551",
"effect_id": "7404819849140063551",
"name": "黑白线条花字",
"is_vip": True
},
"愚人节立体": {
"resource_id": "7482688482754694462",
"effect_id": "7482688482754694462",
"name": "愚人节立体",
"is_vip": True
},
"中秋桂花花字": {
"resource_id": "7406740764207713577",
"effect_id": "7406740764207713577",
"name": "中秋桂花花字",
"is_vip": True
},
"花字": {
"resource_id": "7455608333563874585",
"effect_id": "7455608333563874585",
"name": "花字",
"is_vip": True
},
"双十一红黄立体": {
"resource_id": "7430822256806284594",
"effect_id": "7430822256806284594",
"name": "双十一红黄立体",
"is_vip": True
},
"金色渐变立体红边发光花字": {
"resource_id": "7459686003079630104",
"effect_id": "7459686003079630104",
"name": "金色渐变立体红边发光花字",
"is_vip": True
},
"银色渐变描边发光花字": {
"resource_id": "7405031205877419305",
"effect_id": "7405031205877419305",
"name": "银色渐变描边发光花字",
"is_vip": True
},
"白色立体花字": {
"resource_id": "7474543369054702910",
"effect_id": "7474543369054702910",
"name": "白色立体花字",
"is_vip": True
},
"蓝色渐变镂空描边花字": {
"resource_id": "7405927551417306378",
"effect_id": "7405927551417306378",
"name": "蓝色渐变镂空描边花字",
"is_vip": True
},
"蓝白立体花字": {
"resource_id": "7405716848106310931",
"effect_id": "7405716848106310931",
"name": "蓝白立体花字",
"is_vip": True
},
"白色发光花字": {
"resource_id": "7371368226606943514",
"effect_id": "7371368226606943514",
"name": "白色发光花字",
"is_vip": True
},
"金红纸纹理发光字": {
"resource_id": "7404877070158908698",
"effect_id": "7404877070158908698",
"name": "金红纸纹理发光字",
"is_vip": True
},
"橙白渐变花字 黑白描边花字": {
"resource_id": "7241953374780804410",
"effect_id": "7241953374780804410",
"name": "橙白渐变花字 黑白描边花字",
"is_vip": True
},
"云纹金箔字": {
"resource_id": "7405518341814668544",
"effect_id": "7405518341814668544",
"name": "云纹金箔字",
"is_vip": True
},
"综艺风黄色渐变纹理立体花字": {
"resource_id": "7478934394141527358",
"effect_id": "7478934394141527358",
"name": "综艺风黄色渐变纹理立体花字",
"is_vip": True
},
"蓝红色立体综艺花字": {
"resource_id": "7371410942061546803",
"effect_id": "7371410942061546803",
"name": "蓝红色立体综艺花字",
"is_vip": True
},
"红金国风花字": {
"resource_id": "7507460201549843736",
"effect_id": "7507460201549843736",
"name": "红金国风花字",
"is_vip": True
},
"黄色渐变描边立体花字": {
"resource_id": "7404667171537767699",
"effect_id": "7404667171537767699",
"name": "黄色渐变描边立体花字",
"is_vip": True
},
"白纸纹理蓝阴影花字": {
"resource_id": "7509041829556522265",
"effect_id": "7509041829556522265",
"name": "白纸纹理蓝阴影花字",
"is_vip": True
},
"国风花字": {
"resource_id": "7406648659976260903",
"effect_id": "7406648659976260903",
"name": "国风花字",
"is_vip": True
},
"黑色拼贴方底花字": {
"resource_id": "7405933257776172314",
"effect_id": "7405933257776172314",
"name": "黑色拼贴方底花字",
"is_vip": True
},
"描边字": {
"resource_id": "7360986749046213928",
"effect_id": "7360986749046213928",
"name": "描边字",
"is_vip": True
},
"花字": {
"resource_id": "7465177921276136766",
"effect_id": "7465177921276136766",
"name": "花字",
"is_vip": True
},
"点金花字": {
"resource_id": "7406200724171787574",
"effect_id": "7406200724171787574",
"name": "点金花字",
"is_vip": True
},
"白字内发光蓝边字": {
"resource_id": "7406693646592003366",
"effect_id": "7406693646592003366",
"name": "白字内发光蓝边字",
"is_vip": True
},
"米白厚底立体花字": {
"resource_id": "7371351770045484338",
"effect_id": "7371351770045484338",
"name": "米白厚底立体花字",
"is_vip": True
},
"水墨红底白色花字": {
"resource_id": "7405529606859607347",
"effect_id": "7405529606859607347",
"name": "水墨红底白色花字",
"is_vip": True
},
"条纹纹理黄色立体花字": {
"resource_id": "7404709465209064745",
"effect_id": "7404709465209064745",
"name": "条纹纹理黄色立体花字",
"is_vip": True
},
"红色恐怖氛围纹理花字": {
"resource_id": "7404872280662166834",
"effect_id": "7404872280662166834",
"name": "红色恐怖氛围纹理花字",
"is_vip": True
},
"蓝色折纸": {
"resource_id": "7459675119116373272",
"effect_id": "7459675119116373272",
"name": "蓝色折纸",
"is_vip": True
},
"港风立体": {
"resource_id": "7434560086166490418",
"effect_id": "7434560086166490418",
"name": "港风立体",
"is_vip": True
},
"红色发光花字": {
"resource_id": "7431445423283244297",
"effect_id": "7431445423283244297",
"name": "红色发光花字",
"is_vip": True
},
"黄色渐变立体字": {
"resource_id": "7404696990510042402",
"effect_id": "7404696990510042402",
"name": "黄色渐变立体字",
"is_vip": True
},
"蓝莓奶酪": {
"resource_id": "7506829483878649150",
"effect_id": "7506829483878649150",
"name": "蓝莓奶酪",
"is_vip": True
},
"新年立体花字": {
"resource_id": "7451570972550991166",
"effect_id": "7451570972550991166",
"name": "新年立体花字",
"is_vip": True
},
"花字": {
"resource_id": "7430745414313332006",
"effect_id": "7430745414313332006",
"name": "花字",
"is_vip": True
},
"25元旦-红花背景花字": {
"resource_id": "7447831886874938678",
"effect_id": "7447831886874938678",
"name": "25元旦-红花背景花字",
"is_vip": True
},
"黑色金箔描边立体花字": {
"resource_id": "7404523157400472869",
"effect_id": "7404523157400472869",
"name": "黑色金箔描边立体花字",
"is_vip": True
},
"灰白水墨国风花字": {
"resource_id": "7405537335850306853",
"effect_id": "7405537335850306853",
"name": "灰白水墨国风花字",
"is_vip": True
},
"科技感朋克发光立体标题花字": {
"resource_id": "7405801186286259466",
"effect_id": "7405801186286259466",
"name": "科技感朋克发光立体标题花字",
"is_vip": True
},
"田字格图案蜡笔纹理花字": {
"resource_id": "7405067510053211446",
"effect_id": "7405067510053211446",
"name": "田字格图案蜡笔纹理花字",
"is_vip": True
},
"黄红撞色立体": {
"resource_id": "7406637506977877299",
"effect_id": "7406637506977877299",
"name": "黄红撞色立体",
"is_vip": True
},
"中式背景文字": {
"resource_id": "7405203982286720256",
"effect_id": "7405203982286720256",
"name": "中式背景文字",
"is_vip": True
},
"日综蓝白方框字": {
"resource_id": "7472013339640614206",
"effect_id": "7472013339640614206",
"name": "日综蓝白方框字",
"is_vip": True
},
"综艺蓝黄立体": {
"resource_id": "7436409520848522546",
"effect_id": "7436409520848522546",
"name": "综艺蓝黄立体",
"is_vip": True
},
"水墨风白字黑边红墨点花字": {
"resource_id": "7405514240779357449",
"effect_id": "7405514240779357449",
"name": "水墨风白字黑边红墨点花字",
"is_vip": True
},
"创意立体黄色花字高级感主题文字封面标题字": {
"resource_id": "7507075178447359282",
"effect_id": "7507075178447359282",
"name": "创意立体黄色花字高级感主题文字封面标题字",
"is_vip": True
},
"白色": {
"resource_id": "7509055757908806937",
"effect_id": "7509055757908806937",
"name": "白色",
"is_vip": True
},
"黄字黑边": {
"resource_id": "7406683118108806437",
"effect_id": "7406683118108806437",
"name": "黄字黑边",
"is_vip": True
},
"大理石花纹字": {
"resource_id": "7411036229677878554",
"effect_id": "7411036229677878554",
"name": "大理石花纹字",
"is_vip": True
},
"中秋黄色字": {
"resource_id": "7404409329991879988",
"effect_id": "7404409329991879988",
"name": "中秋黄色字",
"is_vip": True
},
"综艺感黄色立体描边花字": {
"resource_id": "7481983816001834265",
"effect_id": "7481983816001834265",
"name": "综艺感黄色立体描边花字",
"is_vip": True
},
"月饼花字": {
"resource_id": "7548895672402185497",
"effect_id": "7548895672402185497",
"name": "月饼花字",
"is_vip": True
},
"蓝色渐变微立体花字": {
"resource_id": "7406980293233560859",
"effect_id": "7406980293233560859",
"name": "蓝色渐变微立体花字",
"is_vip": True
},
"白字橘色发光花字": {
"resource_id": "7371372494336396570",
"effect_id": "7371372494336396570",
"name": "白字橘色发光花字",
"is_vip": True
},
"几何纹理黑色阴影花字": {
"resource_id": "7404700217553063209",
"effect_id": "7404700217553063209",
"name": "几何纹理黑色阴影花字",
"is_vip": True
},
"悬疑剧字幕": {
"resource_id": "7411046109285485861",
"effect_id": "7411046109285485861",
"name": "悬疑剧字幕",
"is_vip": True
},
"蓝色纹理花字": {
"resource_id": "7479073211918044441",
"effect_id": "7479073211918044441",
"name": "蓝色纹理花字",
"is_vip": True
},
"划重点花字": {
"resource_id": "7369127125569342731",
"effect_id": "7369127125569342731",
"name": "划重点花字",
"is_vip": True
},
"橙色底纹花字": {
"resource_id": "7533453859830713662",
"effect_id": "7533453859830713662",
"name": "橙色底纹花字",
"is_vip": True
},
"雪花图案渐变蓝色立体花字": {
"resource_id": "7405034038135655719",
"effect_id": "7405034038135655719",
"name": "雪花图案渐变蓝色立体花字",
"is_vip": True
},
"蓝色渐变描边简约风格花字": {
"resource_id": "7455983000291937586",
"effect_id": "7455983000291937586",
"name": "蓝色渐变描边简约风格花字",
"is_vip": True
},
"黄色渐变橘色阴影立体花字": {
"resource_id": "7495033287438781758",
"effect_id": "7495033287438781758",
"name": "黄色渐变橘色阴影立体花字",
"is_vip": True
},
"双十一-立体紫色": {
"resource_id": "7296357486490144036",
"effect_id": "7296357486490144036",
"name": "双十一-立体紫色",
"is_vip": True
},
"黄色贴纸描边字效": {
"resource_id": "7533293069123390744",
"effect_id": "7533293069123390744",
"name": "黄色贴纸描边字效",
"is_vip": True
},
"渐变蓝色阴影": {
"resource_id": "7283715592316554555",
"effect_id": "7283715592316554555",
"name": "渐变蓝色阴影",
"is_vip": True
},
"黑白水墨花字": {
"resource_id": "7405536862133046565",
"effect_id": "7405536862133046565",
"name": "黑白水墨花字",
"is_vip": True
},
"复古黄沙水彩纹理花字": {
"resource_id": "7405517504128273676",
"effect_id": "7405517504128273676",
"name": "复古黄沙水彩纹理花字",
"is_vip": True
},
"红色渐变": {
"resource_id": "7461550488073538841",
"effect_id": "7461550488073538841",
"name": "红色渐变",
"is_vip": True
},
"潮酷背景字": {
"resource_id": "7431460080228257039",
"effect_id": "7431460080228257039",
"name": "潮酷背景字",
"is_vip": True
},
"撞色描边字": {
"resource_id": "7404391553164135715",
"effect_id": "7404391553164135715",
"name": "撞色描边字",
"is_vip": True
},
"紫色立体花字": {
"resource_id": "7406690026009972004",
"effect_id": "7406690026009972004",
"name": "紫色立体花字",
"is_vip": True
},
"冬季渐变蓝色立体花字": {
"resource_id": "7431012567369125161",
"effect_id": "7431012567369125161",
"name": "冬季渐变蓝色立体花字",
"is_vip": True
},
"红黄复古浮雕纹理字": {
"resource_id": "7405414031072169250",
"effect_id": "7405414031072169250",
"name": "红黄复古浮雕纹理字",
"is_vip": True
},
"3D渐变橘红色立体花字": {
"resource_id": "7404702615671508263",
"effect_id": "7404702615671508263",
"name": "3D渐变橘红色立体花字",
"is_vip": True
},
"粉蓝渐变花字": {
"resource_id": "7404522414941424923",
"effect_id": "7404522414941424923",
"name": "粉蓝渐变花字",
"is_vip": True
},
"花字": {
"resource_id": "7511273485730237758",
"effect_id": "7511273485730237758",
"name": "花字",
"is_vip": True
},
"花字": {
"resource_id": "7491617722359565630",
"effect_id": "7491617722359565630",
"name": "花字",
"is_vip": True
},
"黑紫星空花字": {
"resource_id": "7405795232748490025",
"effect_id": "7405795232748490025",
"name": "黑紫星空花字",
"is_vip": True
},
"冷色调简单花字": {
"resource_id": "7430642926293732658",
"effect_id": "7430642926293732658",
"name": "冷色调简单花字",
"is_vip": True
},
"金色渐变立体花字": {
"resource_id": "7371420451526020389",
"effect_id": "7371420451526020389",
"name": "金色渐变立体花字",
"is_vip": True
},
"红色金箔纹理立体花字": {
"resource_id": "7404507481205984539",
"effect_id": "7404507481205984539",
"name": "红色金箔纹理立体花字",
"is_vip": True
},
"黄蓝撞色纹理立体花字": {
"resource_id": "7405570848041487666",
"effect_id": "7405570848041487666",
"name": "黄蓝撞色纹理立体花字",
"is_vip": True
},
"花字": {
"resource_id": "7365356770652376330",
"effect_id": "7365356770652376330",
"name": "花字",
"is_vip": True
},
"渐变圆底花字": {
"resource_id": "7406353145938382130",
"effect_id": "7406353145938382130",
"name": "渐变圆底花字",
"is_vip": True
},
"白字蓝粉相间底色花字": {
"resource_id": "7444510136296541465",
"effect_id": "7444510136296541465",
"name": "白字蓝粉相间底色花字",
"is_vip": True
},
"综艺风黄色立体描边花字": {
"resource_id": "7505458612001852697",
"effect_id": "7505458612001852697",
"name": "综艺风黄色立体描边花字",
"is_vip": True
},
"蓝色纸张质感立体花字": {
"resource_id": "7430855417703435529",
"effect_id": "7430855417703435529",
"name": "蓝色纸张质感立体花字",
"is_vip": True
},
"彩色带图案花字": {
"resource_id": "7407037141584203059",
"effect_id": "7407037141584203059",
"name": "彩色带图案花字",
"is_vip": True
},
"红蓝橙描边立体花字": {
"resource_id": "7481302843849329982",
"effect_id": "7481302843849329982",
"name": "红蓝橙描边立体花字",
"is_vip": True
},
"红色印章花字": {
"resource_id": "7407464175347272998",
"effect_id": "7407464175347272998",
"name": "红色印章花字",
"is_vip": True
},
"五一立体": {
"resource_id": "7493107948286250302",
"effect_id": "7493107948286250302",
"name": "五一立体",
"is_vip": True
},
"淡黄色渐变发光花字": {
"resource_id": "7371414308770647346",
"effect_id": "7371414308770647346",
"name": "淡黄色渐变发光花字",
"is_vip": True
},
"白色方底拼贴花字": {
"resource_id": "7405931282632412442",
"effect_id": "7405931282632412442",
"name": "白色方底拼贴花字",
"is_vip": True
},
"红金立体国风花字": {
"resource_id": "7548337425781935422",
"effect_id": "7548337425781935422",
"name": "红金立体国风花字",
"is_vip": True
},
"暗黑金泼墨风花字": {
"resource_id": "7405492993878281510",
"effect_id": "7405492993878281510",
"name": "暗黑金泼墨风花字",
"is_vip": True
},
"花字": {
"resource_id": "7545366362924043582",
"effect_id": "7545366362924043582",
"name": "花字",
"is_vip": True
},
"红色描边花字": {
"resource_id": "7442261279013604644",
"effect_id": "7442261279013604644",
"name": "红色描边花字",
"is_vip": True
},
"金色渐变立体花字": {
"resource_id": "7506868020917226777",
"effect_id": "7506868020917226777",
"name": "金色渐变立体花字",
"is_vip": True
},
"橙色立体花字": {
"resource_id": "7405152529522101531",
"effect_id": "7405152529522101531",
"name": "橙色立体花字",
"is_vip": True
},
"红色锈迹文字": {
"resource_id": "7412523765768178944",
"effect_id": "7412523765768178944",
"name": "红色锈迹文字",
"is_vip": True
},
"紫色渐变": {
"resource_id": "7398455661513674035",
"effect_id": "7398455661513674035",
"name": "紫色渐变",
"is_vip": True
},
"黄色": {
"resource_id": "7398454655505763593",
"effect_id": "7398454655505763593",
"name": "黄色",
"is_vip": True
},
"黑色渐变白蓝描边": {
"resource_id": "7406687421921791282",
"effect_id": "7406687421921791282",
"name": "黑色渐变白蓝描边",
"is_vip": True
},
"端午61立体字效": {
"resource_id": "7506872589642665240",
"effect_id": "7506872589642665240",
"name": "端午61立体字效",
"is_vip": True
},
"黄色立体文字": {
"resource_id": "7405120470477065507",
"effect_id": "7405120470477065507",
"name": "黄色立体文字",
"is_vip": True
},
"花字": {
"resource_id": "7431452163181792524",
"effect_id": "7431452163181792524",
"name": "花字",
"is_vip": True
},
"炫彩模糊花字": {
"resource_id": "7236984607575461154",
"effect_id": "7236984607575461154",
"name": "炫彩模糊花字",
"is_vip": True
},
"五四青年立体": {
"resource_id": "7494656119529393470",
"effect_id": "7494656119529393470",
"name": "五四青年立体",
"is_vip": True
},
"复古方底立体": {
"resource_id": "7406389812925680933",
"effect_id": "7406389812925680933",
"name": "复古方底立体",
"is_vip": True
},
"喜庆花字": {
"resource_id": "7467033569848839486",
"effect_id": "7467033569848839486",
"name": "喜庆花字",
"is_vip": True
},
"中秋黄白立体字效": {
"resource_id": "7546585357555649816",
"effect_id": "7546585357555649816",
"name": "中秋黄白立体字效",
"is_vip": True
},
"黄蓝色立体综艺描边花字": {
"resource_id": "7403927160563551528",
"effect_id": "7403927160563551528",
"name": "黄蓝色立体综艺描边花字",
"is_vip": True
},
"白紫色立体花字": {
"resource_id": "7405229843220106534",
"effect_id": "7405229843220106534",
"name": "白紫色立体花字",
"is_vip": True
},
"金色渐变立体发光花字": {
"resource_id": "7372363920864005386",
"effect_id": "7372363920864005386",
"name": "金色渐变立体发光花字",
"is_vip": True
},
"花字": {
"resource_id": "7547731905500794174",
"effect_id": "7547731905500794174",
"name": "花字",
"is_vip": True
},
"蓝色描边立体花字": {
"resource_id": "7471910410766109977",
"effect_id": "7471910410766109977",
"name": "蓝色描边立体花字",
"is_vip": True
},
"黄色白色": {
"resource_id": "7505771535878098200",
"effect_id": "7505771535878098200",
"name": "黄色白色",
"is_vip": True
},
"渐变色白边立体花字": {
"resource_id": "7406364344176414003",
"effect_id": "7406364344176414003",
"name": "渐变色白边立体花字",
"is_vip": True
},
"橘猫花字": {
"resource_id": "7403728040653573387",
"effect_id": "7403728040653573387",
"name": "橘猫花字",
"is_vip": True
},
"综艺字立体": {
"resource_id": "7409333268195101979",
"effect_id": "7409333268195101979",
"name": "综艺字立体",
"is_vip": True
},
"红橘新年花字": {
"resource_id": "7455529495043525950",
"effect_id": "7455529495043525950",
"name": "红橘新年花字",
"is_vip": True
},
"红包花字": {
"resource_id": "7449034603760749839",
"effect_id": "7449034603760749839",
"name": "红包花字",
"is_vip": True
},
"花字 经典黄色加深蓝经典配色凸显文字": {
"resource_id": "7231489008126266679",
"effect_id": "7231489008126266679",
"name": "花字 经典黄色加深蓝经典配色凸显文字",
"is_vip": True
},
"橙色花字": {
"resource_id": "7519880279205448984",
"effect_id": "7519880279205448984",
"name": "橙色花字",
"is_vip": True
},
"淡蓝色渐变发光花字": {
"resource_id": "7371415414817000754",
"effect_id": "7371415414817000754",
"name": "淡蓝色渐变发光花字",
"is_vip": True
},
"紫色双层描边花字": {
"resource_id": "7406385391265156362",
"effect_id": "7406385391265156362",
"name": "紫色双层描边花字",
"is_vip": True
},
"新年红金花字": {
"resource_id": "7455254263888104766",
"effect_id": "7455254263888104766",
"name": "新年红金花字",
"is_vip": True
},
"晕染蓝": {
"resource_id": "7357027100324367627",
"effect_id": "7357027100324367627",
"name": "晕染蓝",
"is_vip": True
},
"黑色渐变立体花字": {
"resource_id": "7431440010152316169",
"effect_id": "7431440010152316169",
"name": "黑色渐变立体花字",
"is_vip": True
},
"拼贴绿": {
"resource_id": "7360540744035142953",
"effect_id": "7360540744035142953",
"name": "拼贴绿",
"is_vip": True
},
"橘黄色波点渐变发光花字": {
"resource_id": "7404370982238014747",
"effect_id": "7404370982238014747",
"name": "橘黄色波点渐变发光花字",
"is_vip": True
},
"红黄白多层渐变立体花字": {
"resource_id": "7403764204420730122",
"effect_id": "7403764204420730122",
"name": "红黄白多层渐变立体花字",
"is_vip": True
},
"蓝色渐变": {
"resource_id": "7364604452323495204",
"effect_id": "7364604452323495204",
"name": "蓝色渐变",
"is_vip": True
},
"黄绿高饱和多重描边字": {
"resource_id": "7404415905066782004",
"effect_id": "7404415905066782004",
"name": "黄绿高饱和多重描边字",
"is_vip": True
},
"粉色发光花字": {
"resource_id": "7400335293565455679",
"effect_id": "7400335293565455679",
"name": "粉色发光花字",
"is_vip": True
},
"简约雪纹理立体花字": {
"resource_id": "7430397468082228543",
"effect_id": "7430397468082228543",
"name": "简约雪纹理立体花字",
"is_vip": True
},
"白字红边重影风格花字": {
"resource_id": "7450496790354234674",
"effect_id": "7450496790354234674",
"name": "白字红边重影风格花字",
"is_vip": True
},
"蓝色渐变": {
"resource_id": "7385227292521418018",
"effect_id": "7385227292521418018",
"name": "蓝色渐变",
"is_vip": True
},
"粉蓝色渐变立体发光花字": {
"resource_id": "7366060581410901286",
"effect_id": "7366060581410901286",
"name": "粉蓝色渐变立体发光花字",
"is_vip": True
},
"黄色奶酪字": {
"resource_id": "7405831511003417871",
"effect_id": "7405831511003417871",
"name": "黄色奶酪字",
"is_vip": True
},
"彩虹色描边白字": {
"resource_id": "7406673678412418354",
"effect_id": "7406673678412418354",
"name": "彩虹色描边白字",
"is_vip": True
},
"橙黄色渐变立体花字": {
"resource_id": "7406360821216988416",
"effect_id": "7406360821216988416",
"name": "橙黄色渐变立体花字",
"is_vip": True
},
"蓝色纸张质感黄底花字": {
"resource_id": "7430856547934211379",
"effect_id": "7430856547934211379",
"name": "蓝色纸张质感黄底花字",
"is_vip": True
},
"花字": {
"resource_id": "7533174868930645273",
"effect_id": "7533174868930645273",
"name": "花字",
"is_vip": True
},
"粉色爱心立体字": {
"resource_id": "7474476846223101209",
"effect_id": "7474476846223101209",
"name": "粉色爱心立体字",
"is_vip": True
},
"蓝色纹理立体描边花字": {
"resource_id": "7406335734044577035",
"effect_id": "7406335734044577035",
"name": "蓝色纹理立体描边花字",
"is_vip": True
},
"拼贴浅红": {
"resource_id": "7360960769703398695",
"effect_id": "7360960769703398695",
"name": "拼贴浅红",
"is_vip": True
},
"红色花字 ": {
"resource_id": "7359358208286215464",
"effect_id": "7359358208286215464",
"name": "红色花字 ",
"is_vip": True
},
"故障字": {
"resource_id": "7347989608908606783",
"effect_id": "7347989608908606783",
"name": "故障字",
"is_vip": True
},
"橙色秋叶立体花字": {
"resource_id": "7538998611628084542",
"effect_id": "7538998611628084542",
"name": "橙色秋叶立体花字",
"is_vip": True
},
"国庆黄红立体字效": {
"resource_id": "7546423084874599705",
"effect_id": "7546423084874599705",
"name": "国庆黄红立体字效",
"is_vip": True
},
"黄红渐变纹理花字": {
"resource_id": "7548711671317974334",
"effect_id": "7548711671317974334",
"name": "黄红渐变纹理花字",
"is_vip": True
},
"黄橙玻璃质感秋日花字": {
"resource_id": "7538711238725946649",
"effect_id": "7538711238725946649",
"name": "黄橙玻璃质感秋日花字",
"is_vip": True
},
"复古黄色方底背景": {
"resource_id": "7406380674057358642",
"effect_id": "7406380674057358642",
"name": "复古黄色方底背景",
"is_vip": True
},
"花字": {
"resource_id": "7539626317688425753",
"effect_id": "7539626317688425753",
"name": "花字",
"is_vip": True
},
"花字": {
"resource_id": "7548813025013419289",
"effect_id": "7548813025013419289",
"name": "花字",
"is_vip": True
},
"花字": {
"resource_id": "7540868241737141529",
"effect_id": "7540868241737141529",
"name": "花字",
"is_vip": True
},
"立体桔黄": {
"resource_id": "7546349045032439102",
"effect_id": "7546349045032439102",
"name": "立体桔黄",
"is_vip": True
},
"花字": {
"resource_id": "7538719944897236286",
"effect_id": "7538719944897236286",
"name": "花字",
"is_vip": True
},
"618黑边": {
"resource_id": "7509793945480613144",
"effect_id": "7509793945480613144",
"name": "618黑边",
"is_vip": True
},
"综艺风红色立体描边花字": {
"resource_id": "7508042807811280190",
"effect_id": "7508042807811280190",
"name": "综艺风红色立体描边花字",
"is_vip": True
},
"高考立体": {
"resource_id": "7509930498681163032",
"effect_id": "7509930498681163032",
"name": "高考立体",
"is_vip": True
},
"糖炒栗子": {
"resource_id": "7545871911138577726",
"effect_id": "7545871911138577726",
"name": "糖炒栗子",
"is_vip": True
},
"花字": {
"resource_id": "7540131523937357118",
"effect_id": "7540131523937357118",
"name": "花字",
"is_vip": True
},
"花字": {
"resource_id": "7546127896943840536",
"effect_id": "7546127896943840536",
"name": "花字",
"is_vip": True
},
"斜纹花字": {
"resource_id": "7546131418620071192",
"effect_id": "7546131418620071192",
"name": "斜纹花字",
"is_vip": True
},
"黄色渐变蓝色描边立体花字": {
"resource_id": "7507853100984667416",
"effect_id": "7507853100984667416",
"name": "黄色渐变蓝色描边立体花字",
"is_vip": True
},
"三原色": {
"resource_id": "7527398816782454040",
"effect_id": "7527398816782454040",
"name": "三原色",
"is_vip": True
},
"糖炒栗子": {
"resource_id": "7546032665510841662",
"effect_id": "7546032665510841662",
"name": "糖炒栗子",
"is_vip": True
},
"花字": {
"resource_id": "7544777148205190425",
"effect_id": "7544777148205190425",
"name": "花字",
"is_vip": True
},
"黄色纹理蓝棕色阴影描边立体花字": {
"resource_id": "7511339634761420057",
"effect_id": "7511339634761420057",
"name": "黄色纹理蓝棕色阴影描边立体花字",
"is_vip": True
},
"橙色渐变立体花字": {
"resource_id": "7533092158820142360",
"effect_id": "7533092158820142360",
"name": "橙色渐变立体花字",
"is_vip": True
},
"立体花字": {
"resource_id": "7532701961364278553",
"effect_id": "7532701961364278553",
"name": "立体花字",
"is_vip": True
},
"毛绒字": {
"resource_id": "7535694140227456280",
"effect_id": "7535694140227456280",
"name": "毛绒字",
"is_vip": True
},
"我的潮流指南": {
"resource_id": "7506898516468370750",
"effect_id": "7506898516468370750",
"name": "我的潮流指南",
"is_vip": True
},
"蓝莓奶酪": {
"resource_id": "7507101495339568446",
"effect_id": "7507101495339568446",
"name": "蓝莓奶酪",
"is_vip": True
},
"综艺风蓝色立体描边花字": {
"resource_id": "7495312625169911065",
"effect_id": "7495312625169911065",
"name": "综艺风蓝色立体描边花字",
"is_vip": True
},
"彩铅渐变黄色花字": {
"resource_id": "7477620313522703678",
"effect_id": "7477620313522703678",
"name": "彩铅渐变黄色花字",
"is_vip": True
},
"彩色": {
"resource_id": "7474582555853901080",
"effect_id": "7474582555853901080",
"name": "彩色",
"is_vip": True
},
"膨胀感字": {
"resource_id": "7480089681586130238",
"effect_id": "7480089681586130238",
"name": "膨胀感字",
"is_vip": True
},
"花字": {
"resource_id": "7492216396290542873",
"effect_id": "7492216396290542873",
"name": "花字",
"is_vip": True
},
"花字": {
"resource_id": "7507526398710435097",
"effect_id": "7507526398710435097",
"name": "花字",
"is_vip": True
},
"花字": {
"resource_id": "7482733632910675262",
"effect_id": "7482733632910675262",
"name": "花字",
"is_vip": True
},
"蓝紫色混合花字": {
"resource_id": "7236599551984028939",
"effect_id": "7236599551984028939",
"name": "蓝紫色混合花字",
"is_vip": True
},
"蓝色": {
"resource_id": "7481665617796369689",
"effect_id": "7481665617796369689",
"name": "蓝色",
"is_vip": True
},
"彩铅渐变粉色花字": {
"resource_id": "7477756249665342744",
"effect_id": "7477756249665342744",
"name": "彩铅渐变粉色花字",
"is_vip": True
},
"渐变花字": {
"resource_id": "7260020603044826427",
"effect_id": "7260020603044826427",
"name": "渐变花字",
"is_vip": True
},
"绿色花字发光": {
"resource_id": "7506874577159572755",
"effect_id": "7506874577159572755",
"name": "绿色花字发光",
"is_vip": True
},
"可爱彩色涂鸦花字": {
"resource_id": "7350563191123938611",
"effect_id": "7350563191123938611",
"name": "可爱彩色涂鸦花字",
"is_vip": True
},
"花字": {
"resource_id": "7508005459065097497",
"effect_id": "7508005459065097497",
"name": "花字",
"is_vip": True
},
"粉色闪闪芭比花字": {
"resource_id": "7507082793592032536",
"effect_id": "7507082793592032536",
"name": "粉色闪闪芭比花字",
"is_vip": True
},
"粉色渐变": {
"resource_id": "7469677410414382398",
"effect_id": "7469677410414382398",
"name": "粉色渐变",
"is_vip": True
},
"马卡龙": {
"resource_id": "7509757725908225304",
"effect_id": "7509757725908225304",
"name": "马卡龙",
"is_vip": True
},
"发光字": {
"resource_id": "7348369625215749388",
"effect_id": "7348369625215749388",
"name": "发光字",
"is_vip": True
},
"粉笔字": {
"resource_id": "7403964791372533027",
"effect_id": "7403964791372533027",
"name": "粉笔字",
"is_vip": True
},
"蓝白": {
"resource_id": "7508363172798270744",
"effect_id": "7508363172798270744",
"name": "蓝白",
"is_vip": True
},
"黄绿渐变立体字": {
"resource_id": "7477149973520583961",
"effect_id": "7477149973520583961",
"name": "黄绿渐变立体字",
"is_vip": True
},
"花字": {
"resource_id": "7495692617561181502",
"effect_id": "7495692617561181502",
"name": "花字",
"is_vip": True
},
"多层描边彩色多巴胺花字": {
"resource_id": "7494493486155042110",
"effect_id": "7494493486155042110",
"name": "多层描边彩色多巴胺花字",
"is_vip": True
},
"蓝粉": {
"resource_id": "7492310644704841022",
"effect_id": "7492310644704841022",
"name": "蓝粉",
"is_vip": True
},
"节日绿色立体描边花字": {
"resource_id": "7507164704448679193",
"effect_id": "7507164704448679193",
"name": "节日绿色立体描边花字",
"is_vip": True
},
"蓝绿色花字": {
"resource_id": "7347171058488823066",
"effect_id": "7347171058488823066",
"name": "蓝绿色花字",
"is_vip": True
},
"粉色立体拼贴花字": {
"resource_id": "7405934415567736074",
"effect_id": "7405934415567736074",
"name": "粉色立体拼贴花字",
"is_vip": True
},
"彩色描边立体可爱花字": {
"resource_id": "7492411773329476889",
"effect_id": "7492411773329476889",
"name": "彩色描边立体可爱花字",
"is_vip": True
},
"绿色立体": {
"resource_id": "7492716248091004222",
"effect_id": "7492716248091004222",
"name": "绿色立体",
"is_vip": True
},
"花字": {
"resource_id": "7471905506001669401",
"effect_id": "7471905506001669401",
"name": "花字",
"is_vip": True
},
"春日综艺感渐变纹理花字": {
"resource_id": "7479683834464898329",
"effect_id": "7479683834464898329",
"name": "春日综艺感渐变纹理花字",
"is_vip": True
},
"绿紫黄紫立体字": {
"resource_id": "7478608447794187582",
"effect_id": "7478608447794187582",
"name": "绿紫黄紫立体字",
"is_vip": True
},
"膨胀感字": {
"resource_id": "7480097920361073945",
"effect_id": "7480097920361073945",
"name": "膨胀感字",
"is_vip": True
},
"立体综艺花字": {
"resource_id": "7403676308145802522",
"effect_id": "7403676308145802522",
"name": "立体综艺花字",
"is_vip": False
},
"白色纹理描边花字": {
"resource_id": "7405202500493610275",
"effect_id": "7405202500493610275",
"name": "白色纹理描边花字",
"is_vip": False
},
"复古淡黄花字": {
"resource_id": "7441152469352090889",
"effect_id": "7441152469352090889",
"name": "复古淡黄花字",
"is_vip": False
},
"白色发光字": {
"resource_id": "7405564299122429219",
"effect_id": "7405564299122429219",
"name": "白色发光字",
"is_vip": False
},
"黄色渐变立体白描边花字": {
"resource_id": "7403679510702378278",
"effect_id": "7403679510702378278",
"name": "黄色渐变立体白描边花字",
"is_vip": False
},
"白字红边立体字": {
"resource_id": "7403960732490157364",
"effect_id": "7403960732490157364",
"name": "白字红边立体字",
"is_vip": False
},
"蓝色立体字": {
"resource_id": "7405107629137186082",
"effect_id": "7405107629137186082",
"name": "蓝色立体字",
"is_vip": False
},
"美拉德立体文字": {
"resource_id": "7410649194110733602",
"effect_id": "7410649194110733602",
"name": "美拉德立体文字",
"is_vip": False
},
"绿色立体通用花字": {
"resource_id": "7404477237837270299",
"effect_id": "7404477237837270299",
"name": "绿色立体通用花字",
"is_vip": False
},
"绿色镂空透明文字": {
"resource_id": "7405105991651544360",
"effect_id": "7405105991651544360",
"name": "绿色镂空透明文字",
"is_vip": False
},
"绿色描边投影字": {
"resource_id": "7405410790867586344",
"effect_id": "7405410790867586344",
"name": "绿色描边投影字",
"is_vip": False
},
"绿色透明纹理花字": {
"resource_id": "7405203773066415360",
"effect_id": "7405203773066415360",
"name": "绿色透明纹理花字",
"is_vip": False
},
"综艺火焰": {
"resource_id": "7543157780769803582",
"effect_id": "7543157780769803582",
"name": "综艺火焰",
"is_vip": True
},
"系统故障字": {
"resource_id": "7347967906669415716",
"effect_id": "7347967906669415716",
"name": "系统故障字",
"is_vip": True
},
"蓝色黄色渐变立体描边花字": {
"resource_id": "7532041202787487038",
"effect_id": "7532041202787487038",
"name": "蓝色黄色渐变立体描边花字",
"is_vip": True
},
"综艺 黄色": {
"resource_id": "7127670164996328740",
"effect_id": "7127670164996328740",
"name": "综艺 黄色",
"is_vip": True
},
"黑白黄色花字": {
"resource_id": "7260340249581128996",
"effect_id": "7260340249581128996",
"name": "黑白黄色花字",
"is_vip": True
},
"红色火焰燃烧花字": {
"resource_id": "7405896759987227931",
"effect_id": "7405896759987227931",
"name": "红色火焰燃烧花字",
"is_vip": True
},
"复古紫光蓝色渐变立体花字": {
"resource_id": "7160595602236116232",
"effect_id": "7160595602236116232",
"name": "复古紫光蓝色渐变立体花字",
"is_vip": True
},
"综艺风蓝色描边立体花字": {
"resource_id": "7494932494253608216",
"effect_id": "7494932494253608216",
"name": "综艺风蓝色描边立体花字",
"is_vip": True
},
"喷溅红立体": {
"resource_id": "7411046111760125211",
"effect_id": "7411046111760125211",
"name": "喷溅红立体",
"is_vip": True
},
"红黄渐变纹理立体花字": {
"resource_id": "7313160248175398154",
"effect_id": "7313160248175398154",
"name": "红黄渐变纹理立体花字",
"is_vip": True
},
"白字蓝框综艺花字": {
"resource_id": "7403899942944705819",
"effect_id": "7403899942944705819",
"name": "白字蓝框综艺花字",
"is_vip": True
},
"美食-金色渐变": {
"resource_id": "7205144150390443301",
"effect_id": "7205144150390443301",
"name": "美食-金色渐变",
"is_vip": True
},
"红色火焰字": {
"resource_id": "7406328633205312820",
"effect_id": "7406328633205312820",
"name": "红色火焰字",
"is_vip": True
},
"镂空发光字": {
"resource_id": "7404690754590821632",
"effect_id": "7404690754590821632",
"name": "镂空发光字",
"is_vip": True
},
"蓝色纹理花字": {
"resource_id": "7405902936175381787",
"effect_id": "7405902936175381787",
"name": "蓝色纹理花字",
"is_vip": True
},
"白色质感纹理立体花字": {
"resource_id": "7310113812168871177",
"effect_id": "7310113812168871177",
"name": "白色质感纹理立体花字",
"is_vip": True
},
"黄色花字": {
"resource_id": "7430781079058976026",
"effect_id": "7430781079058976026",
"name": "黄色花字",
"is_vip": True
},
"综艺立体": {
"resource_id": "7448962185159609625",
"effect_id": "7448962185159609625",
"name": "综艺立体",
"is_vip": True
},
"五一复古立体": {
"resource_id": "7494493305716378905",
"effect_id": "7494493305716378905",
"name": "五一复古立体",
"is_vip": True
},
"好物美妆-双层投影": {
"resource_id": "7264501278175202572",
"effect_id": "7264501278175202572",
"name": "好物美妆-双层投影",
"is_vip": True
},
"白字绿底花字": {
"resource_id": "7350578203905232166",
"effect_id": "7350578203905232166",
"name": "白字绿底花字",
"is_vip": True
},
"渐变错位花字": {
"resource_id": "7406249723423640871",
"effect_id": "7406249723423640871",
"name": "渐变错位花字",
"is_vip": True
},
"彩色": {
"resource_id": "7474546033763224894",
"effect_id": "7474546033763224894",
"name": "彩色",
"is_vip": True
},
"像素格背景字": {
"resource_id": "7406866881144966409",
"effect_id": "7406866881144966409",
"name": "像素格背景字",
"is_vip": True
},
"橙黄渐变花字": {
"resource_id": "7404777689518738728",
"effect_id": "7404777689518738728",
"name": "橙黄渐变花字",
"is_vip": True
},
"彩色手绘线条花字": {
"resource_id": "7342020000812731658",
"effect_id": "7342020000812731658",
"name": "彩色手绘线条花字",
"is_vip": True
},
"立体麻布花纹字体": {
"resource_id": "7262979013637967119",
"effect_id": "7262979013637967119",
"name": "立体麻布花纹字体",
"is_vip": True
},
"红色渐变波点底纹立体花字": {
"resource_id": "7406013385969569062",
"effect_id": "7406013385969569062",
"name": "红色渐变波点底纹立体花字",
"is_vip": True
},
"综艺风蓝色渐变纹理立体花字": {
"resource_id": "7478945314318241086",
"effect_id": "7478945314318241086",
"name": "综艺风蓝色渐变纹理立体花字",
"is_vip": True
},
"高饱和彩虹字": {
"resource_id": "7404293089377930536",
"effect_id": "7404293089377930536",
"name": "高饱和彩虹字",
"is_vip": True
},
"3D蓝红色立体综艺花字": {
"resource_id": "7404132140365008179",
"effect_id": "7404132140365008179",
"name": "3D蓝红色立体综艺花字",
"is_vip": True
},
"音乐节-杂点黄字": {
"resource_id": "7272729157895769355",
"effect_id": "7272729157895769355",
"name": "音乐节-杂点黄字",
"is_vip": True
},
"拼贴位移字": {
"resource_id": "7343806780583038247",
"effect_id": "7343806780583038247",
"name": "拼贴位移字",
"is_vip": True
},
"彩色立体底框花字": {
"resource_id": "7347548073897364746",
"effect_id": "7347548073897364746",
"name": "彩色立体底框花字",
"is_vip": True
},
"综艺风蓝色立体描边花字": {
"resource_id": "7495656020006669592",
"effect_id": "7495656020006669592",
"name": "综艺风蓝色立体描边花字",
"is_vip": True
},
"黑字底红光": {
"resource_id": "7230694221513035020",
"effect_id": "7230694221513035020",
"name": "黑字底红光",
"is_vip": True
},
"海浪卡通立体字": {
"resource_id": "7405947244395924770",
"effect_id": "7405947244395924770",
"name": "海浪卡通立体字",
"is_vip": True
},
"浪花紫": {
"resource_id": "7261598257762045219",
"effect_id": "7261598257762045219",
"name": "浪花紫",
"is_vip": True
},
"裂纹立体文字": {
"resource_id": "7405953030996184335",
"effect_id": "7405953030996184335",
"name": "裂纹立体文字",
"is_vip": True
},
"漫画层叠花字": {
"resource_id": "7406307881865301258",
"effect_id": "7406307881865301258",
"name": "漫画层叠花字",
"is_vip": True
},
"节点营销直播主题立体字蓝色": {
"resource_id": "7403686755486010634",
"effect_id": "7403686755486010634",
"name": "节点营销直播主题立体字蓝色",
"is_vip": True
},
"黑色立体投影紫色发光镭射纹理花字 艺术字体": {
"resource_id": "7251715329162841347",
"effect_id": "7251715329162841347",
"name": "黑色立体投影紫色发光镭射纹理花字 艺术字体",
"is_vip": True
},
"复古白蓝色立体花字": {
"resource_id": "7405563025169632562",
"effect_id": "7405563025169632562",
"name": "复古白蓝色立体花字",
"is_vip": True
},
"爆款热卖": {
"resource_id": "7430816571443940659",
"effect_id": "7430816571443940659",
"name": "爆款热卖",
"is_vip": True
},
"蓝紫渐变多重投影字": {
"resource_id": "7403937403397885184",
"effect_id": "7403937403397885184",
"name": "蓝紫渐变多重投影字",
"is_vip": True
},
"综艺白色立体描边纹理花字": {
"resource_id": "7404868077101255988",
"effect_id": "7404868077101255988",
"name": "综艺白色立体描边纹理花字",
"is_vip": True
},
"红金渐变国风立体花字": {
"resource_id": "7547984081930161470",
"effect_id": "7547984081930161470",
"name": "红金渐变国风立体花字",
"is_vip": True
},
"立体字粉色背景": {
"resource_id": "7409964157296020751",
"effect_id": "7409964157296020751",
"name": "立体字粉色背景",
"is_vip": True
},
"金色渐变红底立体花字": {
"resource_id": "7330165240576970021",
"effect_id": "7330165240576970021",
"name": "金色渐变红底立体花字",
"is_vip": True
},
"热销字体": {
"resource_id": "7431487397017226507",
"effect_id": "7431487397017226507",
"name": "热销字体",
"is_vip": True
},
"位移字": {
"resource_id": "7343541738537061651",
"effect_id": "7343541738537061651",
"name": "位移字",
"is_vip": True
},
"美食-立体描边": {
"resource_id": "7205148909730024762",
"effect_id": "7205148909730024762",
"name": "美食-立体描边",
"is_vip": True
},
"格子背景双色字": {
"resource_id": "7404037981952068879",
"effect_id": "7404037981952068879",
"name": "格子背景双色字",
"is_vip": True
},
"落日鸡尾酒": {
"resource_id": "7174051263578000678",
"effect_id": "7174051263578000678",
"name": "落日鸡尾酒",
"is_vip": True
},
"春节-半透明": {
"resource_id": "7187622568717749565",
"effect_id": "7187622568717749565",
"name": "春节-半透明",
"is_vip": True
},
"黑色综艺花字": {
"resource_id": "7241429233287925044",
"effect_id": "7241429233287925044",
"name": "黑色综艺花字",
"is_vip": True
},
"白/黄方块图案质感花字": {
"resource_id": "7405060175322795276",
"effect_id": "7405060175322795276",
"name": "白/黄方块图案质感花字",
"is_vip": True
},
"时尚黑蓝粉": {
"resource_id": "7284906593399950647",
"effect_id": "7284906593399950647",
"name": "时尚黑蓝粉",
"is_vip": True
},
"3D蓝色渐变综艺花字": {
"resource_id": "7403911656587234597",
"effect_id": "7403911656587234597",
"name": "3D蓝色渐变综艺花字",
"is_vip": True
},
"白色蓝色描边红色荧光花字": {
"resource_id": "7241398402125253903",
"effect_id": "7241398402125253903",
"name": "白色蓝色描边红色荧光花字",
"is_vip": True
},
"白色仿3D立体花字": {
"resource_id": "7371129776494365990",
"effect_id": "7371129776494365990",
"name": "白色仿3D立体花字",
"is_vip": True
},
"蓝色立体描边花字": {
"resource_id": "7406357450166635776",
"effect_id": "7406357450166635776",
"name": "蓝色立体描边花字",
"is_vip": True
},
"破碎裂开文字": {
"resource_id": "7404701167156088116",
"effect_id": "7404701167156088116",
"name": "破碎裂开文字",
"is_vip": True
},
"黄边黑字立体花字": {
"resource_id": "7270881305070423356",
"effect_id": "7270881305070423356",
"name": "黄边黑字立体花字",
"is_vip": True
},
"立体星星花字": {
"resource_id": "7405886722011172150",
"effect_id": "7405886722011172150",
"name": "立体星星花字",
"is_vip": True
},
"多色花字": {
"resource_id": "7405917295421263158",
"effect_id": "7405917295421263158",
"name": "多色花字",
"is_vip": True
},
"立体方块花字": {
"resource_id": "7481488244421741848",
"effect_id": "7481488244421741848",
"name": "立体方块花字",
"is_vip": True
},
"水墨纹花字": {
"resource_id": "7252151198805986572",
"effect_id": "7252151198805986572",
"name": "水墨纹花字",
"is_vip": True
},
"花字": {
"resource_id": "7529442177953352985",
"effect_id": "7529442177953352985",
"name": "花字",
"is_vip": True
},
"白字蓝底花字": {
"resource_id": "7368858909295136010",
"effect_id": "7368858909295136010",
"name": "白字蓝底花字",
"is_vip": True
},
"橙色纹理立体发光花字": {
"resource_id": "7430724518248729919",
"effect_id": "7430724518248729919",
"name": "橙色纹理立体发光花字",
"is_vip": True
},
"红黄绿复古花字": {
"resource_id": "7407014154613116210",
"effect_id": "7407014154613116210",
"name": "红黄绿复古花字",
"is_vip": True
},
"橙黄色渐变立体描边花字": {
"resource_id": "7404037530980453647",
"effect_id": "7404037530980453647",
"name": "橙黄色渐变立体描边花字",
"is_vip": True
},
"潮酷薄膜纹理字": {
"resource_id": "7404380953893735714",
"effect_id": "7404380953893735714",
"name": "潮酷薄膜纹理字",
"is_vip": True
},
"粉色贝壳光泽花字": {
"resource_id": "7265614510084443444",
"effect_id": "7265614510084443444",
"name": "粉色贝壳光泽花字",
"is_vip": True
},
"四色蜡笔花字": {
"resource_id": "7348679900477279507",
"effect_id": "7348679900477279507",
"name": "四色蜡笔花字",
"is_vip": True
},
"蓝色立体描边发光花字": {
"resource_id": "7404828145255288075",
"effect_id": "7404828145255288075",
"name": "蓝色立体描边发光花字",
"is_vip": True
},
"限时抢购": {
"resource_id": "7510183639066627352",
"effect_id": "7510183639066627352",
"name": "限时抢购",
"is_vip": True
},
"游戏综艺风蓝色波点渐变花字": {
"resource_id": "7404883759012597030",
"effect_id": "7404883759012597030",
"name": "游戏综艺风蓝色波点渐变花字",
"is_vip": True
},
"紫色梦幻 白字紫底红醒目花字": {
"resource_id": "7334687695660272947",
"effect_id": "7334687695660272947",
"name": "紫色梦幻 白字紫底红醒目花字",
"is_vip": True
},
"蓝色渐变综艺": {
"resource_id": "7435551949266701580",
"effect_id": "7435551949266701580",
"name": "蓝色渐变综艺",
"is_vip": True
},
"黑色粉色阴影花字": {
"resource_id": "7289732660077874491",
"effect_id": "7289732660077874491",
"name": "黑色粉色阴影花字",
"is_vip": True
},
"黑体蓝紫边发光花字": {
"resource_id": "7259399609452088637",
"effect_id": "7259399609452088637",
"name": "黑体蓝紫边发光花字",
"is_vip": True
},
"粉笔涂鸦花字(教师节)": {
"resource_id": "7405546666498985227",
"effect_id": "7405546666498985227",
"name": "粉笔涂鸦花字(教师节)",
"is_vip": True
},
"可爱花字": {
"resource_id": "7430667612146666764",
"effect_id": "7430667612146666764",
"name": "可爱花字",
"is_vip": True
},
"黑粉甜酷拼贴文字": {
"resource_id": "7431814893415812362",
"effect_id": "7431814893415812362",
"name": "黑粉甜酷拼贴文字",
"is_vip": True
},
"彩色立体": {
"resource_id": "7506818824885390616",
"effect_id": "7506818824885390616",
"name": "彩色立体",
"is_vip": True
},
"浅棕色描边花字": {
"resource_id": "7328771445960592640",
"effect_id": "7328771445960592640",
"name": "浅棕色描边花字",
"is_vip": True
},
"蓝红蜡笔质感纹理花字": {
"resource_id": "7543482227871599896",
"effect_id": "7543482227871599896",
"name": "蓝红蜡笔质感纹理花字",
"is_vip": True
},
"黄色渐变": {
"resource_id": "7410369831503006988",
"effect_id": "7410369831503006988",
"name": "黄色渐变",
"is_vip": True
},
"综艺风方块背景立体花字": {
"resource_id": "7404072480870026534",
"effect_id": "7404072480870026534",
"name": "综艺风方块背景立体花字",
"is_vip": True
},
"彩色花字": {
"resource_id": "7252116303329217824",
"effect_id": "7252116303329217824",
"name": "彩色花字",
"is_vip": True
},
"综艺感蓝色立体描边花字": {
"resource_id": "7482027387266469145",
"effect_id": "7482027387266469145",
"name": "综艺感蓝色立体描边花字",
"is_vip": True
},
"彩色透明花字": {
"resource_id": "7406321401969364264",
"effect_id": "7406321401969364264",
"name": "彩色透明花字",
"is_vip": True
},
"橙色蓝色花字": {
"resource_id": "7369415539795529012",
"effect_id": "7369415539795529012",
"name": "橙色蓝色花字",
"is_vip": True
},
"黑字黄绿拼贴花字": {
"resource_id": "7406010573961317670",
"effect_id": "7406010573961317670",
"name": "黑字黄绿拼贴花字",
"is_vip": True
},
"蓝橙白立体花字": {
"resource_id": "7504864758944927001",
"effect_id": "7504864758944927001",
"name": "蓝橙白立体花字",
"is_vip": True
},
"黄蓝撞色描边字": {
"resource_id": "7435272797611429172",
"effect_id": "7435272797611429172",
"name": "黄蓝撞色描边字",
"is_vip": True
},
"玫粉黑花字": {
"resource_id": "7407015583444782375",
"effect_id": "7407015583444782375",
"name": "玫粉黑花字",
"is_vip": True
},
"芭比粉背景白字": {
"resource_id": "7405183112906378522",
"effect_id": "7405183112906378522",
"name": "芭比粉背景白字",
"is_vip": True
},
"万圣节多色花字": {
"resource_id": "7407047445240139071",
"effect_id": "7407047445240139071",
"name": "万圣节多色花字",
"is_vip": True
},
"复古风花字": {
"resource_id": "7406318872862674185",
"effect_id": "7406318872862674185",
"name": "复古风花字",
"is_vip": True
},
"深红白边黄影立体花字": {
"resource_id": "7231502419723603239",
"effect_id": "7231502419723603239",
"name": "深红白边黄影立体花字",
"is_vip": True
},
"APT花字": {
"resource_id": "7431429796434890021",
"effect_id": "7431429796434890021",
"name": "APT花字",
"is_vip": True
},
"粉底黄边黑色立体花字": {
"resource_id": "7270171712136776997",
"effect_id": "7270171712136776997",
"name": "粉底黄边黑色立体花字",
"is_vip": True
},
"未来科技感立体厚重标题花字": {
"resource_id": "7405789476561095986",
"effect_id": "7405789476561095986",
"name": "未来科技感立体厚重标题花字",
"is_vip": True
},
"白字带描边花字": {
"resource_id": "7405944078992559411",
"effect_id": "7405944078992559411",
"name": "白字带描边花字",
"is_vip": True
},
"美妆方底": {
"resource_id": "7411583332707863835",
"effect_id": "7411583332707863835",
"name": "美妆方底",
"is_vip": True
},
"酒红风格 黄字酒红底色花字": {
"resource_id": "7337839774079798566",
"effect_id": "7337839774079798566",
"name": "酒红风格 黄字酒红底色花字",
"is_vip": True
},
"多色花字": {
"resource_id": "7406589254157061439",
"effect_id": "7406589254157061439",
"name": "多色花字",
"is_vip": True
},
"黄绿撕纸拼贴质感花字": {
"resource_id": "7405065396648283455",
"effect_id": "7405065396648283455",
"name": "黄绿撕纸拼贴质感花字",
"is_vip": True
},
"橙黄色立体霓虹花字": {
"resource_id": "7405186414284999971",
"effect_id": "7405186414284999971",
"name": "橙黄色立体霓虹花字",
"is_vip": True
},
"黄色渐变粉色花朵底纹立体花字": {
"resource_id": "7544660134732057881",
"effect_id": "7544660134732057881",
"name": "黄色渐变粉色花朵底纹立体花字",
"is_vip": True
},
"青团底纹花字": {
"resource_id": "7348639844198878515",
"effect_id": "7348639844198878515",
"name": "青团底纹花字",
"is_vip": True
},
"黄蓝渐变立体字": {
"resource_id": "7382058294157774107",
"effect_id": "7382058294157774107",
"name": "黄蓝渐变立体字",
"is_vip": True
},
"紫色描边发光小字体": {
"resource_id": "7252346023656394042",
"effect_id": "7252346023656394042",
"name": "紫色描边发光小字体",
"is_vip": True
},
"粉蓝色渐变黑边立体花字": {
"resource_id": "7404290790391860530",
"effect_id": "7404290790391860530",
"name": "粉蓝色渐变黑边立体花字",
"is_vip": True
},
"红色渐变黄绿描边": {
"resource_id": "7406979682911931657",
"effect_id": "7406979682911931657",
"name": "红色渐变黄绿描边",
"is_vip": True
},
"美妆拼贴": {
"resource_id": "7411563961381817610",
"effect_id": "7411563961381817610",
"name": "美妆拼贴",
"is_vip": True
},
"游戏综艺风黄红紫渐变花字": {
"resource_id": "7404883418774818086",
"effect_id": "7404883418774818086",
"name": "游戏综艺风黄红紫渐变花字",
"is_vip": True
},
"彩色花字": {
"resource_id": "7430759634757061926",
"effect_id": "7430759634757061926",
"name": "彩色花字",
"is_vip": True
},
"蓝橙波点纹理玻璃质感立体花字": {
"resource_id": "7543299507744967960",
"effect_id": "7543299507744967960",
"name": "蓝橙波点纹理玻璃质感立体花字",
"is_vip": True
},
"蓝色纹理立体花字": {
"resource_id": "7406011366865161481",
"effect_id": "7406011366865161481",
"name": "蓝色纹理立体花字",
"is_vip": True
},
"放射背景字": {
"resource_id": "7404009350399937792",
"effect_id": "7404009350399937792",
"name": "放射背景字",
"is_vip": True
},
"白字黄绿拼贴花字": {
"resource_id": "7406011150829194546",
"effect_id": "7406011150829194546",
"name": "白字黄绿拼贴花字",
"is_vip": True
},
"夏日蓝描边立体": {
"resource_id": "7548102481977593113",
"effect_id": "7548102481977593113",
"name": "夏日蓝描边立体",
"is_vip": True
},
"白色国风水墨花字": {
"resource_id": "7405537186436648201",
"effect_id": "7405537186436648201",
"name": "白色国风水墨花字",
"is_vip": True
},
"金箔纹理阴影花字": {
"resource_id": "7405530102324415807",
"effect_id": "7405530102324415807",
"name": "金箔纹理阴影花字",
"is_vip": True
},
"书法墨迹白色花字": {
"resource_id": "7405519026367122727",
"effect_id": "7405519026367122727",
"name": "书法墨迹白色花字",
"is_vip": True
},
"泼墨书法纹理花字": {
"resource_id": "7405512855434382611",
"effect_id": "7405512855434382611",
"name": "泼墨书法纹理花字",
"is_vip": True
},
"红色斑驳": {
"resource_id": "7475566213477977368",
"effect_id": "7475566213477977368",
"name": "红色斑驳",
"is_vip": True
},
"红色立体": {
"resource_id": "7546579616576720152",
"effect_id": "7546579616576720152",
"name": "红色立体",
"is_vip": True
},
"金色质感立体花字": {
"resource_id": "7405499580399357210",
"effect_id": "7405499580399357210",
"name": "金色质感立体花字",
"is_vip": True
},
"国风花字": {
"resource_id": "7406643508242582825",
"effect_id": "7406643508242582825",
"name": "国风花字",
"is_vip": True
},
"黑白水墨字": {
"resource_id": "7405516433863511348",
"effect_id": "7405516433863511348",
"name": "黑白水墨字",
"is_vip": True
},
"复古红色立体花字": {
"resource_id": "7435884430620691739",
"effect_id": "7435884430620691739",
"name": "复古红色立体花字",
"is_vip": True
},
"国风花字": {
"resource_id": "7406646658768882983",
"effect_id": "7406646658768882983",
"name": "国风花字",
"is_vip": True
},
"水墨风晕染花字": {
"resource_id": "7405497799036407090",
"effect_id": "7405497799036407090",
"name": "水墨风晕染花字",
"is_vip": True
},
"白金花字": {
"resource_id": "7405510219633036555",
"effect_id": "7405510219633036555",
"name": "白金花字",
"is_vip": True
},
"古风质感花字": {
"resource_id": "7483351934074817817",
"effect_id": "7483351934074817817",
"name": "古风质感花字",
"is_vip": True
},
"暗黑系红色火焰纹理花字": {
"resource_id": "7405504415408409865",
"effect_id": "7405504415408409865",
"name": "暗黑系红色火焰纹理花字",
"is_vip": True
},
"红金国风花字": {
"resource_id": "7405500731253411108",
"effect_id": "7405500731253411108",
"name": "红金国风花字",
"is_vip": True
},
"点墨金银花字": {
"resource_id": "7405517111231073575",
"effect_id": "7405517111231073575",
"name": "点墨金银花字",
"is_vip": True
},
"春节新年福字背景花字": {
"resource_id": "7404078955344448777",
"effect_id": "7404078955344448777",
"name": "春节新年福字背景花字",
"is_vip": True
},
"银色花字": {
"resource_id": "7405512551879970067",
"effect_id": "7405512551879970067",
"name": "银色花字",
"is_vip": True
},
"红色暗黑花字": {
"resource_id": "7405501851887586611",
"effect_id": "7405501851887586611",
"name": "红色暗黑花字",
"is_vip": True
},
"国风花字": {
"resource_id": "7406643758231571766",
"effect_id": "7406643758231571766",
"name": "国风花字",
"is_vip": True
},
"黑红渐变立体描边花字": {
"resource_id": "7405506413524569363",
"effect_id": "7405506413524569363",
"name": "黑红渐变立体描边花字",
"is_vip": True
},
"书法水痕阴影花字": {
"resource_id": "7405527291209469196",
"effect_id": "7405527291209469196",
"name": "书法水痕阴影花字",
"is_vip": True
},
"水墨背景白色花字": {
"resource_id": "7405534702221790515",
"effect_id": "7405534702221790515",
"name": "水墨背景白色花字",
"is_vip": True
},
"国风金红花字": {
"resource_id": "7405499186109533494",
"effect_id": "7405499186109533494",
"name": "国风金红花字",
"is_vip": True
},
"红金国风花字": {
"resource_id": "7507132514088062233",
"effect_id": "7507132514088062233",
"name": "红金国风花字",
"is_vip": True
},
"黑白水墨花字": {
"resource_id": "7405498270568418611",
"effect_id": "7405498270568418611",
"name": "黑白水墨花字",
"is_vip": True
},
"暗黑红色立体花字": {
"resource_id": "7405503477444644106",
"effect_id": "7405503477444644106",
"name": "暗黑红色立体花字",
"is_vip": True
},
"暗黑墨迹字": {
"resource_id": "7405513478645091636",
"effect_id": "7405513478645091636",
"name": "暗黑墨迹字",
"is_vip": True
},
"青绿色水墨风古典边框花字": {
"resource_id": "7405879747340700937",
"effect_id": "7405879747340700937",
"name": "青绿色水墨风古典边框花字",
"is_vip": True
},
"水墨书法纹理花字": {
"resource_id": "7405514792724745484",
"effect_id": "7405514792724745484",
"name": "水墨书法纹理花字",
"is_vip": True
},
"黑灰色质感立体花字": {
"resource_id": "7405500890620120358",
"effect_id": "7405500890620120358",
"name": "黑灰色质感立体花字",
"is_vip": True
},
"暗黑火焰红边花字": {
"resource_id": "7405494488019275059",
"effect_id": "7405494488019275059",
"name": "暗黑火焰红边花字",
"is_vip": True
},
"暗红色墨痕书法花字": {
"resource_id": "7405528972135583030",
"effect_id": "7405528972135583030",
"name": "暗红色墨痕书法花字",
"is_vip": True
},
"银色国风花字": {
"resource_id": "7405504097429867815",
"effect_id": "7405504097429867815",
"name": "银色国风花字",
"is_vip": True
},
"书法墨环图案花字": {
"resource_id": "7405524745959034124",
"effect_id": "7405524745959034124",
"name": "书法墨环图案花字",
"is_vip": False
},
"金箔描边书法水墨花字": {
"resource_id": "7405523665145613631",
"effect_id": "7405523665145613631",
"name": "金箔描边书法水墨花字",
"is_vip": False
},
"综艺金色花字": {
"resource_id": "7127823728267791647",
"effect_id": "7127823728267791647",
"name": "综艺金色花字",
"is_vip": True
},
"潮酷发光立体花字": {
"resource_id": "7160598356237012261",
"effect_id": "7160598356237012261",
"name": "潮酷发光立体花字",
"is_vip": True
},
"潮酷金色发光花字": {
"resource_id": "7160595759375666446",
"effect_id": "7160595759375666446",
"name": "潮酷金色发光花字",
"is_vip": True
},
"光芒万丈": {
"resource_id": "7269602984844102947",
"effect_id": "7269602984844102947",
"name": "光芒万丈",
"is_vip": True
},
"综艺立体花字": {
"resource_id": "7160596923781598472",
"effect_id": "7160596923781598472",
"name": "综艺立体花字",
"is_vip": True
},
"美食-渐变小字": {
"resource_id": "7205150731035266341",
"effect_id": "7205150731035266341",
"name": "美食-渐变小字",
"is_vip": True
},
"金色渐变立体发光花字": {
"resource_id": "7406007163417529638",
"effect_id": "7406007163417529638",
"name": "金色渐变立体发光花字",
"is_vip": True
},
"粉色花字": {
"resource_id": "7127655008715296031",
"effect_id": "7127655008715296031",
"name": "粉色花字",
"is_vip": True
},
"粉色发光字": {
"resource_id": "7403924857282432271",
"effect_id": "7403924857282432271",
"name": "粉色发光字",
"is_vip": True
},
"蓝色发光": {
"resource_id": "7346895765458947366",
"effect_id": "7346895765458947366",
"name": "蓝色发光",
"is_vip": True
},
"元旦透明燥点花字-2022元旦": {
"resource_id": "7179606734166592825",
"effect_id": "7179606734166592825",
"name": "元旦透明燥点花字-2022元旦",
"is_vip": True
},
"红色渐变黄色发光花字": {
"resource_id": "7406005354070379802",
"effect_id": "7406005354070379802",
"name": "红色渐变黄色发光花字",
"is_vip": True
},
"蓝色霓虹灯发光花字": {
"resource_id": "7408957503892884774",
"effect_id": "7408957503892884774",
"name": "蓝色霓虹灯发光花字",
"is_vip": True
},
"黄色发光花字": {
"resource_id": "7404896582182767908",
"effect_id": "7404896582182767908",
"name": "黄色发光花字",
"is_vip": True
},
"金色渐变立体发光花字": {
"resource_id": "7459717947620363582",
"effect_id": "7459717947620363582",
"name": "金色渐变立体发光花字",
"is_vip": True
},
"蓝色发光花字": {
"resource_id": "7404751791503576339",
"effect_id": "7404751791503576339",
"name": "蓝色发光花字",
"is_vip": True
},
"圣诞红白条": {
"resource_id": "7174330567222185253",
"effect_id": "7174330567222185253",
"name": "圣诞红白条",
"is_vip": True
},
"粉色花字": {
"resource_id": "7127839722893774087",
"effect_id": "7127839722893774087",
"name": "粉色花字",
"is_vip": True
},
"潮酷白色发光立体花字": {
"resource_id": "7160597532043644174",
"effect_id": "7160597532043644174",
"name": "潮酷白色发光立体花字",
"is_vip": True
},
"综艺立体渐变": {
"resource_id": "7160596088011951373",
"effect_id": "7160596088011951373",
"name": "综艺立体渐变",
"is_vip": True
},
"黄色渐变花字": {
"resource_id": "7273017604837625151",
"effect_id": "7273017604837625151",
"name": "黄色渐变花字",
"is_vip": True
},
"发光": {
"resource_id": "7346916622247955763",
"effect_id": "7346916622247955763",
"name": "发光",
"is_vip": True
},
"闪光的新年花字-2022元旦": {
"resource_id": "7179634097906519356",
"effect_id": "7179634097906519356",
"name": "闪光的新年花字-2022元旦",
"is_vip": True
},
"红色渐变描边花字": {
"resource_id": "7265622933702184232",
"effect_id": "7265622933702184232",
"name": "红色渐变描边花字",
"is_vip": True
},
"粉色发光": {
"resource_id": "7362142403416952115",
"effect_id": "7362142403416952115",
"name": "粉色发光",
"is_vip": True
},
"霓虹灯黄红发光花字": {
"resource_id": "7322482076958149914",
"effect_id": "7322482076958149914",
"name": "霓虹灯黄红发光花字",
"is_vip": True
},
"洒金粉花字-2022元旦": {
"resource_id": "7179628047832730941",
"effect_id": "7179628047832730941",
"name": "洒金粉花字-2022元旦",
"is_vip": True
},
"元旦透明飘雪花字-2022元旦": {
"resource_id": "7179616970399124795",
"effect_id": "7179616970399124795",
"name": "元旦透明飘雪花字-2022元旦",
"is_vip": True
},
"浅蓝色发光花字": {
"resource_id": "7281951975275597114",
"effect_id": "7281951975275597114",
"name": "浅蓝色发光花字",
"is_vip": True
},
"红色内发光文字": {
"resource_id": "7405197593808096527",
"effect_id": "7405197593808096527",
"name": "红色内发光文字",
"is_vip": True
},
"克莱因蓝发光字体": {
"resource_id": "7240995033393007931",
"effect_id": "7240995033393007931",
"name": "克莱因蓝发光字体",
"is_vip": True
},
"红黄配色花字": {
"resource_id": "7403941808302066979",
"effect_id": "7403941808302066979",
"name": "红黄配色花字",
"is_vip": True
},
"红色发光花字": {
"resource_id": "7128327279804976397",
"effect_id": "7128327279804976397",
"name": "红色发光花字",
"is_vip": True
},
"黄色橙色描边花字": {
"resource_id": "7241397134128352551",
"effect_id": "7241397134128352551",
"name": "黄色橙色描边花字",
"is_vip": True
},
"霓虹灯发光红黄花字": {
"resource_id": "7404014524900199706",
"effect_id": "7404014524900199706",
"name": "霓虹灯发光红黄花字",
"is_vip": True
},
"薄荷冰花字": {
"resource_id": "7312709252928277812",
"effect_id": "7312709252928277812",
"name": "薄荷冰花字",
"is_vip": True
},
"荧光绿炫酷字体": {
"resource_id": "7241480073759575357",
"effect_id": "7241480073759575357",
"name": "荧光绿炫酷字体",
"is_vip": True
},
"渐变花字": {
"resource_id": "7260439366953110825",
"effect_id": "7260439366953110825",
"name": "渐变花字",
"is_vip": True
},
"烟雾纹理花字": {
"resource_id": "7245610210386136357",
"effect_id": "7245610210386136357",
"name": "烟雾纹理花字",
"is_vip": True
},
"红配蓝发光炫酷字体": {
"resource_id": "7243255465822506255",
"effect_id": "7243255465822506255",
"name": "红配蓝发光炫酷字体",
"is_vip": True
},
"潮酷发光立体花字": {
"resource_id": "7160595918226525453",
"effect_id": "7160595918226525453",
"name": "潮酷发光立体花字",
"is_vip": True
},
"电商节日直播贴片标题立体字": {
"resource_id": "7406289529096719625",
"effect_id": "7406289529096719625",
"name": "电商节日直播贴片标题立体字",
"is_vip": True
},
"渐变 蓝紫色花字": {
"resource_id": "7336848964819504434",
"effect_id": "7336848964819504434",
"name": "渐变 蓝紫色花字",
"is_vip": True
},
"蓝色渐变花字": {
"resource_id": "7241432857447583028",
"effect_id": "7241432857447583028",
"name": "蓝色渐变花字",
"is_vip": True
},
"黄色字荧光描边花字": {
"resource_id": "7241389070943866164",
"effect_id": "7241389070943866164",
"name": "黄色字荧光描边花字",
"is_vip": True
},
"粉色渐变描边花字": {
"resource_id": "7265621281838533923",
"effect_id": "7265621281838533923",
"name": "粉色渐变描边花字",
"is_vip": True
},
"圆环发光花字": {
"resource_id": "7322679348106906918",
"effect_id": "7322679348106906918",
"name": "圆环发光花字",
"is_vip": True
},
"绿色渐变描边花字": {
"resource_id": "7265622422022262051",
"effect_id": "7265622422022262051",
"name": "绿色渐变描边花字",
"is_vip": True
},
"白紫立体发光": {
"resource_id": "7390410514976804122",
"effect_id": "7390410514976804122",
"name": "白紫立体发光",
"is_vip": True
},
"甜粉": {
"resource_id": "7266447274115419449",
"effect_id": "7266447274115419449",
"name": "甜粉",
"is_vip": True
},
"红色霓虹灯发光花字": {
"resource_id": "7408956912089206067",
"effect_id": "7408956912089206067",
"name": "红色霓虹灯发光花字",
"is_vip": True
},
"金色花字": {
"resource_id": "7266696486363106616",
"effect_id": "7266696486363106616",
"name": "金色花字",
"is_vip": True
},
"空心白色描边发光花字": {
"resource_id": "7404503527617301770",
"effect_id": "7404503527617301770",
"name": "空心白色描边发光花字",
"is_vip": True
},
"白字蓝光花字": {
"resource_id": "7351422706086169866",
"effect_id": "7351422706086169866",
"name": "白字蓝光花字",
"is_vip": True
},
"亮黄字橙色描边发光花字": {
"resource_id": "7404047060221037851",
"effect_id": "7404047060221037851",
"name": "亮黄字橙色描边发光花字",
"is_vip": True
},
"冬季发光": {
"resource_id": "7434806614781168947",
"effect_id": "7434806614781168947",
"name": "冬季发光",
"is_vip": True
},
"黄的红边花字重叠": {
"resource_id": "7231824394559982886",
"effect_id": "7231824394559982886",
"name": "黄的红边花字重叠",
"is_vip": True
},
"渐变彩虹色发光花字": {
"resource_id": "7405056348200684827",
"effect_id": "7405056348200684827",
"name": "渐变彩虹色发光花字",
"is_vip": True
},
"霓虹灯发光花字": {
"resource_id": "7322881735522290995",
"effect_id": "7322881735522290995",
"name": "霓虹灯发光花字",
"is_vip": True
},
"绿色纹理立体花字": {
"resource_id": "7391283375606156585",
"effect_id": "7391283375606156585",
"name": "绿色纹理立体花字",
"is_vip": True
},
"红色霓虹灯发光字": {
"resource_id": "7322678574719339802",
"effect_id": "7322678574719339802",
"name": "红色霓虹灯发光字",
"is_vip": True
},
"星空": {
"resource_id": "7266724384205786427",
"effect_id": "7266724384205786427",
"name": "星空",
"is_vip": True
},
"美食-中间渐变": {
"resource_id": "7212896736849841467",
"effect_id": "7212896736849841467",
"name": "美食-中间渐变",
"is_vip": True
},
"夏日的亮丽 ": {
"resource_id": "7259709733790125366",
"effect_id": "7259709733790125366",
"name": "夏日的亮丽 ",
"is_vip": True
},
"纯黑底色,荧光绿和黑色描边 立体 发光 花字": {
"resource_id": "7274035971207744824",
"effect_id": "7274035971207744824",
"name": "纯黑底色,荧光绿和黑色描边 立体 发光 花字",
"is_vip": True
},
"黄色蓝色发发光花字": {
"resource_id": "7241392284686683395",
"effect_id": "7241392284686683395",
"name": "黄色蓝色发发光花字",
"is_vip": True
},
"梦幻蓝紫色简约渐变花字": {
"resource_id": "7241477841567649080",
"effect_id": "7241477841567649080",
"name": "梦幻蓝紫色简约渐变花字",
"is_vip": True
},
"红色荧光花字": {
"resource_id": "7241410291521670400",
"effect_id": "7241410291521670400",
"name": "红色荧光花字",
"is_vip": True
},
"彩色发光立体": {
"resource_id": "7390315130128452890",
"effect_id": "7390315130128452890",
"name": "彩色发光立体",
"is_vip": True
},
"黄色渐变发光字": {
"resource_id": "7404001083665812771",
"effect_id": "7404001083665812771",
"name": "黄色渐变发光字",
"is_vip": True
},
"发光灯箱感红色花字": {
"resource_id": "6926827744189779207",
"effect_id": "6926827744189779207",
"name": "发光灯箱感红色花字",
"is_vip": True
},
"霓虹灯发光花字": {
"resource_id": "7322422789355392265",
"effect_id": "7322422789355392265",
"name": "霓虹灯发光花字",
"is_vip": True
},
"黑色红边柔光花字": {
"resource_id": "7231468045976292645",
"effect_id": "7231468045976292645",
"name": "黑色红边柔光花字",
"is_vip": True
},
"粉色渐变温柔发光花字": {
"resource_id": "7404385123975613706",
"effect_id": "7404385123975613706",
"name": "粉色渐变温柔发光花字",
"is_vip": True
},
"渐变紫色花字": {
"resource_id": "7241393396575735040",
"effect_id": "7241393396575735040",
"name": "渐变紫色花字",
"is_vip": True
},
"红配绿发光拼色字体": {
"resource_id": "7243262147210267944",
"effect_id": "7243262147210267944",
"name": "红配绿发光拼色字体",
"is_vip": True
},
"黑底荧光绿描边 发光 花字": {
"resource_id": "7273831317136035133",
"effect_id": "7273831317136035133",
"name": "黑底荧光绿描边 发光 花字",
"is_vip": True
},
"霓虹灯发光花字": {
"resource_id": "7322380988430994715",
"effect_id": "7322380988430994715",
"name": "霓虹灯发光花字",
"is_vip": True
},
"绿字蓝白描边荧光字": {
"resource_id": "7403932533995425039",
"effect_id": "7403932533995425039",
"name": "绿字蓝白描边荧光字",
"is_vip": True
},
"粉色渐变双层立体发光花字": {
"resource_id": "7494822504427539737",
"effect_id": "7494822504427539737",
"name": "粉色渐变双层立体发光花字",
"is_vip": True
},
"东南亚渐变": {
"resource_id": "7411034104415685939",
"effect_id": "7411034104415685939",
"name": "东南亚渐变",
"is_vip": True
},
"蓝色渐变花字": {
"resource_id": "7241398727125011746",
"effect_id": "7241398727125011746",
"name": "蓝色渐变花字",
"is_vip": True
},
"黄红色霓虹灯镂空发光花字": {
"resource_id": "7404089520070593843",
"effect_id": "7404089520070593843",
"name": "黄红色霓虹灯镂空发光花字",
"is_vip": True
},
"粉色渐变圆圈": {
"resource_id": "7403922592194710834",
"effect_id": "7403922592194710834",
"name": "粉色渐变圆圈",
"is_vip": True
},
"紫色发光花字": {
"resource_id": "7248870704752397579",
"effect_id": "7248870704752397579",
"name": "紫色发光花字",
"is_vip": True
},
"粉色发光": {
"resource_id": "7361004787967495462",
"effect_id": "7361004787967495462",
"name": "粉色发光",
"is_vip": True
},
"纯色黄色字体": {
"resource_id": "7260373127249595687",
"effect_id": "7260373127249595687",
"name": "纯色黄色字体",
"is_vip": True
},
"紫色发光字": {
"resource_id": "7403992509212314920",
"effect_id": "7403992509212314920",
"name": "紫色发光字",
"is_vip": True
},
"粉色闪粉星光闪闪发光划走": {
"resource_id": "7496497861224516926",
"effect_id": "7496497861224516926",
"name": "粉色闪粉星光闪闪发光划走",
"is_vip": True
},
"绿底黑边黄色立体花字": {
"resource_id": "7270129109974469945",
"effect_id": "7270129109974469945",
"name": "绿底黑边黄色立体花字",
"is_vip": True
},
"简约蓝": {
"resource_id": "7264481843301354813",
"effect_id": "7264481843301354813",
"name": "简约蓝",
"is_vip": True
},
"花粉绿": {
"resource_id": "7241230847741791521",
"effect_id": "7241230847741791521",
"name": "花粉绿",
"is_vip": True
},
"粉色发光立体花字": {
"resource_id": "7404070348263607603",
"effect_id": "7404070348263607603",
"name": "粉色发光立体花字",
"is_vip": True
},
"绿色渐变立体描边花字": {
"resource_id": "7406241968847670569",
"effect_id": "7406241968847670569",
"name": "绿色渐变立体描边花字",
"is_vip": True
},
"粉色糖果风格花字": {
"resource_id": "7291429737774255412",
"effect_id": "7291429737774255412",
"name": "粉色糖果风格花字",
"is_vip": True
},
"紫色花字": {
"resource_id": "7355608527144062217",
"effect_id": "7355608527144062217",
"name": "紫色花字",
"is_vip": True
},
"渐变发光花字": {
"resource_id": "7238624559178485031",
"effect_id": "7238624559178485031",
"name": "渐变发光花字",
"is_vip": True
},
"荧光绿线条发光字": {
"resource_id": "7405916937353465128",
"effect_id": "7405916937353465128",
"name": "荧光绿线条发光字",
"is_vip": True
},
"渐变花字": {
"resource_id": "7270718850256211259",
"effect_id": "7270718850256211259",
"name": "渐变花字",
"is_vip": True
},
"粉色发光花字": {
"resource_id": "7274771737999379749",
"effect_id": "7274771737999379749",
"name": "粉色发光花字",
"is_vip": True
},
"粉色闪粉白色描边发光花字": {
"resource_id": "7404388775264030003",
"effect_id": "7404388775264030003",
"name": "粉色闪粉白色描边发光花字",
"is_vip": True
},
"紫红发光字": {
"resource_id": "7405417769446968610",
"effect_id": "7405417769446968610",
"name": "紫红发光字",
"is_vip": True
},
"彩色渐变花字": {
"resource_id": "7248130865094561036",
"effect_id": "7248130865094561036",
"name": "彩色渐变花字",
"is_vip": True
},
"绿色立体花字": {
"resource_id": "7241415162345852194",
"effect_id": "7241415162345852194",
"name": "绿色立体花字",
"is_vip": True
},
"条纹黄色综艺发光花字": {
"resource_id": "7275250557386788156",
"effect_id": "7275250557386788156",
"name": "条纹黄色综艺发光花字",
"is_vip": True
},
"梦幻紫星光双层立体花字": {
"resource_id": "7404321217110396187",
"effect_id": "7404321217110396187",
"name": "梦幻紫星光双层立体花字",
"is_vip": True
},
"粉色闪闪": {
"resource_id": "7529808923725925657",
"effect_id": "7529808923725925657",
"name": "粉色闪闪",
"is_vip": True
},
"荧光线条发光字": {
"resource_id": "7405939554047233295",
"effect_id": "7405939554047233295",
"name": "荧光线条发光字",
"is_vip": True
},
"机械装甲绿色科技感文字标题": {
"resource_id": "7327845943305358646",
"effect_id": "7327845943305358646",
"name": "机械装甲绿色科技感文字标题",
"is_vip": True
},
"发光灯箱感绿色描边立体花字": {
"resource_id": "7404100687820229922",
"effect_id": "7404100687820229922",
"name": "发光灯箱感绿色描边立体花字",
"is_vip": True
},
"白花纹发光花字": {
"resource_id": "7259233733964811572",
"effect_id": "7259233733964811572",
"name": "白花纹发光花字",
"is_vip": True
},
"清新绿色 绿色花字": {
"resource_id": "7334225752663149850",
"effect_id": "7334225752663149850",
"name": "清新绿色 绿色花字",
"is_vip": True
},
"浅绿色 绿色花字底发光": {
"resource_id": "7334229773402606886",
"effect_id": "7334229773402606886",
"name": "浅绿色 绿色花字底发光",
"is_vip": True
},
"夏日青春派对": {
"resource_id": "7249749880611015988",
"effect_id": "7249749880611015988",
"name": "夏日青春派对",
"is_vip": True
},
"紫色发光字": {
"resource_id": "7406201706456960256",
"effect_id": "7406201706456960256",
"name": "紫色发光字",
"is_vip": True
},
"白色描边芭比粉发光花字": {
"resource_id": "7404708538926353700",
"effect_id": "7404708538926353700",
"name": "白色描边芭比粉发光花字",
"is_vip": True
},
"花字-雪花彩粉渐变立体字": {
"resource_id": "7232089500518862140",
"effect_id": "7232089500518862140",
"name": "花字-雪花彩粉渐变立体字",
"is_vip": True
},
"赛博朋克纹理发光字": {
"resource_id": "7405875861712342307",
"effect_id": "7405875861712342307",
"name": "赛博朋克纹理发光字",
"is_vip": True
},
"浅梦幻少女色": {
"resource_id": "7281283804235402533",
"effect_id": "7281283804235402533",
"name": "浅梦幻少女色",
"is_vip": True
},
"彩色镭射渐变花字": {
"resource_id": "7404330497574309129",
"effect_id": "7404330497574309129",
"name": "彩色镭射渐变花字",
"is_vip": True
},
"紫色发光立体花字": {
"resource_id": "7245923862574009635",
"effect_id": "7245923862574009635",
"name": "紫色发光立体花字",
"is_vip": True
},
"薄荷绿花字": {
"resource_id": "7404021791427005723",
"effect_id": "7404021791427005723",
"name": "薄荷绿花字",
"is_vip": True
},
"青色 红色 荧光花字": {
"resource_id": "7241393660334574848",
"effect_id": "7241393660334574848",
"name": "青色 红色 荧光花字",
"is_vip": True
},
"绿色花字": {
"resource_id": "7351303614104636699",
"effect_id": "7351303614104636699",
"name": "绿色花字",
"is_vip": True
},
"紫宝石": {
"resource_id": "7241904291722693944",
"effect_id": "7241904291722693944",
"name": "紫宝石",
"is_vip": True
},
"粉橙色花字": {
"resource_id": "7241388504381541666",
"effect_id": "7241388504381541666",
"name": "粉橙色花字",
"is_vip": True
},
"格子纹理花字": {
"resource_id": "7260122300564000012",
"effect_id": "7260122300564000012",
"name": "格子纹理花字",
"is_vip": True
},
"复古格子清新蓝花字": {
"resource_id": "7297906734755073319",
"effect_id": "7297906734755073319",
"name": "复古格子清新蓝花字",
"is_vip": True
},
"深绿色黑边紫光花字": {
"resource_id": "7231501962041117955",
"effect_id": "7231501962041117955",
"name": "深绿色黑边紫光花字",
"is_vip": True
},
"紫色粉边花字": {
"resource_id": "7291157036098735401",
"effect_id": "7291157036098735401",
"name": "紫色粉边花字",
"is_vip": True
},
"清新蓝色发光花字": {
"resource_id": "6896138122774514951",
"effect_id": "6896138122774514951",
"name": "清新蓝色发光花字",
"is_vip": False
},
"潮酷 白色橙边": {
"resource_id": "7127615338035924238",
"effect_id": "7127615338035924238",
"name": "潮酷 白色橙边",
"is_vip": False
},
"简约白色发光立体花字": {
"resource_id": "7166445713029729568",
"effect_id": "7166445713029729568",
"name": "简约白色发光立体花字",
"is_vip": False
},
"超酷发光镂空花字、潮人必备": {
"resource_id": "6896141886055107854",
"effect_id": "6896141886055107854",
"name": "超酷发光镂空花字、潮人必备",
"is_vip": False
},
"潮酷蓝色发光镂空花字": {
"resource_id": "6896141886055091470",
"effect_id": "6896141886055091470",
"name": "潮酷蓝色发光镂空花字",
"is_vip": False
},
"综艺 橙色": {
"resource_id": "7127654126997048607",
"effect_id": "7127654126997048607",
"name": "综艺 橙色",
"is_vip": False
},
"清新粉色发光灯箱感花字": {
"resource_id": "6896138122774531335",
"effect_id": "6896138122774531335",
"name": "清新粉色发光灯箱感花字",
"is_vip": False
},
"炫彩发光跳色花字,": {
"resource_id": "6896141886055058702",
"effect_id": "6896141886055058702",
"name": "炫彩发光跳色花字,",
"is_vip": False
},
"潮酷 橙色": {
"resource_id": "7127817897061125413",
"effect_id": "7127817897061125413",
"name": "潮酷 橙色",
"is_vip": False
},
"潮酷黄色霓虹灯花字": {
"resource_id": "6926796566346960141",
"effect_id": "6926796566346960141",
"name": "潮酷黄色霓虹灯花字",
"is_vip": False
},
"红色镂空发光花字": {
"resource_id": "6926825801258126599",
"effect_id": "6926825801258126599",
"name": "红色镂空发光花字",
"is_vip": False
},
"潮酷蓝色霓虹灯发光花字": {
"resource_id": "6926827744189795591",
"effect_id": "6926827744189795591",
"name": "潮酷蓝色霓虹灯发光花字",
"is_vip": False
},
"潮酷黄底白色发光立体花字": {
"resource_id": "7187616139642522936",
"effect_id": "7187616139642522936",
"name": "潮酷黄底白色发光立体花字",
"is_vip": False
},
"蓝色镂空发光花字": {
"resource_id": "6927159112887176459",
"effect_id": "6927159112887176459",
"name": "蓝色镂空发光花字",
"is_vip": False
},
"潮酷 白色粉边": {
"resource_id": "7127819154018602277",
"effect_id": "7127819154018602277",
"name": "潮酷 白色粉边",
"is_vip": False
},
"暗黑潮酷黑色花字": {
"resource_id": "6926825801258159367",
"effect_id": "6926825801258159367",
"name": "暗黑潮酷黑色花字",
"is_vip": False
},
"超酷黄色发光花字": {
"resource_id": "6896143968241798408",
"effect_id": "6896143968241798408",
"name": "超酷黄色发光花字",
"is_vip": False
},
"小清新 白色": {
"resource_id": "7127680616283295006",
"effect_id": "7127680616283295006",
"name": "小清新 白色",
"is_vip": False
},
"黄色发光字": {
"resource_id": "7405565480678739200",
"effect_id": "7405565480678739200",
"name": "黄色发光字",
"is_vip": False
},
"炫彩发光花字,跳字变色": {
"resource_id": "6896141886055075086",
"effect_id": "6896141886055075086",
"name": "炫彩发光花字,跳字变色",
"is_vip": False
},
"发光灯箱感绿色花字": {
"resource_id": "6896144021568179469",
"effect_id": "6896144021568179469",
"name": "发光灯箱感绿色花字",
"is_vip": False
},
"潮酷黄色发光花字": {
"resource_id": "6926825801384021256",
"effect_id": "6926825801384021256",
"name": "潮酷黄色发光花字",
"is_vip": False
},
"复古 红色": {
"resource_id": "7127827287826779428",
"effect_id": "7127827287826779428",
"name": "复古 红色",
"is_vip": False
},
"赛博朋克未来科技感立体发光花字": {
"resource_id": "7404088879780826406",
"effect_id": "7404088879780826406",
"name": "赛博朋克未来科技感立体发光花字",
"is_vip": False
},
"红色潮酷外发光花字": {
"resource_id": "6927160254996253967",
"effect_id": "6927160254996253967",
"name": "红色潮酷外发光花字",
"is_vip": False
},
"红色朦胧港风复古花字": {
"resource_id": "6927160144421866752",
"effect_id": "6927160144421866752",
"name": "红色朦胧港风复古花字",
"is_vip": False
},
"Y2k粉色立体灯箱发光花字": {
"resource_id": "7127675252410289445",
"effect_id": "7127675252410289445",
"name": "Y2k粉色立体灯箱发光花字",
"is_vip": False
},
"潮酷粉色发光镂空花字": {
"resource_id": "6896143968241782024",
"effect_id": "6896143968241782024",
"name": "潮酷粉色发光镂空花字",
"is_vip": False
},
"梦幻粉色发光立体花字": {
"resource_id": "7197333872466611513",
"effect_id": "7197333872466611513",
"name": "梦幻粉色发光立体花字",
"is_vip": False
},
"潮酷发光青色": {
"resource_id": "7127669605199351048",
"effect_id": "7127669605199351048",
"name": "潮酷发光青色",
"is_vip": False
},
"黄橙渐变黑红描边立体字": {
"resource_id": "7403926640260123944",
"effect_id": "7403926640260123944",
"name": "黄橙渐变黑红描边立体字",
"is_vip": True
},
"蓝色纹理立体发光花字": {
"resource_id": "7430703360409554212",
"effect_id": "7430703360409554212",
"name": "蓝色纹理立体发光花字",
"is_vip": True
},
"黄色渐变红边发光花字": {
"resource_id": "7407014765907774747",
"effect_id": "7407014765907774747",
"name": "黄色渐变红边发光花字",
"is_vip": True
},
"潮酷发光立体花字": {
"resource_id": "7160596855456320776",
"effect_id": "7160596855456320776",
"name": "潮酷发光立体花字",
"is_vip": True
},
"立体金属字": {
"resource_id": "7317088712154696969",
"effect_id": "7317088712154696969",
"name": "立体金属字",
"is_vip": True
},
"黑金色立体花字": {
"resource_id": "7244940532298829090",
"effect_id": "7244940532298829090",
"name": "黑金色立体花字",
"is_vip": True
},
"黑灰色花字【严肃】": {
"resource_id": "7281947750139219257",
"effect_id": "7281947750139219257",
"name": "黑灰色花字【严肃】",
"is_vip": True
},
"美食-黄网格": {
"resource_id": "7212896770370587941",
"effect_id": "7212896770370587941",
"name": "美食-黄网格",
"is_vip": True
},
"金属灰渐变立体白边花字": {
"resource_id": "7388020661312146751",
"effect_id": "7388020661312146751",
"name": "金属灰渐变立体白边花字",
"is_vip": True
},
"一窝时光标题花字字体设计美食海报大气简约醒目小龙虾": {
"resource_id": "7260358084772547903",
"effect_id": "7260358084772547903",
"name": "一窝时光标题花字字体设计美食海报大气简约醒目小龙虾",
"is_vip": True
},
"蓝色渐变3D立体花字": {
"resource_id": "7405125461438762267",
"effect_id": "7405125461438762267",
"name": "蓝色渐变3D立体花字",
"is_vip": True
},
"立体效果": {
"resource_id": "7274581371975142710",
"effect_id": "7274581371975142710",
"name": "立体效果",
"is_vip": True
},
"美食-金色网格": {
"resource_id": "7212897121249283383",
"effect_id": "7212897121249283383",
"name": "美食-金色网格",
"is_vip": True
},
"土酷蓝色渐变立体花字": {
"resource_id": "7160599091750145287",
"effect_id": "7160599091750145287",
"name": "土酷蓝色渐变立体花字",
"is_vip": True
},
"蓝色渐变花字": {
"resource_id": "7220003213171281192",
"effect_id": "7220003213171281192",
"name": "蓝色渐变花字",
"is_vip": True
},
"黄色渐变花字": {
"resource_id": "7265625223381273891",
"effect_id": "7265625223381273891",
"name": "黄色渐变花字",
"is_vip": True
},
"黄色渐变花字": {
"resource_id": "7493083674158796094",
"effect_id": "7493083674158796094",
"name": "黄色渐变花字",
"is_vip": True
},
"黄白涂鸦花字": {
"resource_id": "7369091570345282866",
"effect_id": "7369091570345282866",
"name": "黄白涂鸦花字",
"is_vip": True
},
"黑灰渐变": {
"resource_id": "7224762483448237345",
"effect_id": "7224762483448237345",
"name": "黑灰渐变",
"is_vip": True
},
"彩色渐变描边": {
"resource_id": "7369985913310448911",
"effect_id": "7369985913310448911",
"name": "彩色渐变描边",
"is_vip": True
},
"黄色渐变花字": {
"resource_id": "7439987370033728807",
"effect_id": "7439987370033728807",
"name": "黄色渐变花字",
"is_vip": True
},
"橘黄色渐变波点底纹立体花字": {
"resource_id": "7405889740081237285",
"effect_id": "7405889740081237285",
"name": "橘黄色渐变波点底纹立体花字",
"is_vip": True
},
"大雪渐变": {
"resource_id": "7431533312738348314",
"effect_id": "7431533312738348314",
"name": "大雪渐变",
"is_vip": True
},
"黑白配": {
"resource_id": "7268912246900772135",
"effect_id": "7268912246900772135",
"name": "黑白配",
"is_vip": True
},
"美食-黄白跳色": {
"resource_id": "7252679635027168567",
"effect_id": "7252679635027168567",
"name": "美食-黄白跳色",
"is_vip": True
},
"蓝色渐变立体描边花字": {
"resource_id": "7511237110914125080",
"effect_id": "7511237110914125080",
"name": "蓝色渐变立体描边花字",
"is_vip": True
},
"美食-弹幕": {
"resource_id": "7212885712495070519",
"effect_id": "7212885712495070519",
"name": "美食-弹幕",
"is_vip": True
},
"蓝色花字": {
"resource_id": "7264536942832848165",
"effect_id": "7264536942832848165",
"name": "蓝色花字",
"is_vip": True
},
"橘色渐变描边花字": {
"resource_id": "7265622781008629032",
"effect_id": "7265622781008629032",
"name": "橘色渐变描边花字",
"is_vip": True
},
"黄橙色渐变描边立体花字": {
"resource_id": "7405056217225104681",
"effect_id": "7405056217225104681",
"name": "黄橙色渐变描边立体花字",
"is_vip": True
},
"金色渐变 金灿灿花字 富贵": {
"resource_id": "7328610126296796468",
"effect_id": "7328610126296796468",
"name": "金色渐变 金灿灿花字 富贵",
"is_vip": True
},
"花字": {
"resource_id": "7491562659268119870",
"effect_id": "7491562659268119870",
"name": "花字",
"is_vip": True
},
"暗黑红黑渐立体花字": {
"resource_id": "7205151372805754167",
"effect_id": "7205151372805754167",
"name": "暗黑红黑渐立体花字",
"is_vip": True
},
"粉色渐变红色底花字": {
"resource_id": "7404684532756073791",
"effect_id": "7404684532756073791",
"name": "粉色渐变红色底花字",
"is_vip": True
},
"黄色渐变立体花字": {
"resource_id": "7313119295792352539",
"effect_id": "7313119295792352539",
"name": "黄色渐变立体花字",
"is_vip": True
},
"综艺立体花字": {
"resource_id": "7160601969629891847",
"effect_id": "7160601969629891847",
"name": "综艺立体花字",
"is_vip": True
},
"扁平化请新白蓝": {
"resource_id": "7233363221497842977",
"effect_id": "7233363221497842977",
"name": "扁平化请新白蓝",
"is_vip": True
},
"春节-兔彩头-银色立体": {
"resource_id": "7187770975822433594",
"effect_id": "7187770975822433594",
"name": "春节-兔彩头-银色立体",
"is_vip": True
},
"蓝色渐变花字": {
"resource_id": "7404899700970753321",
"effect_id": "7404899700970753321",
"name": "蓝色渐变花字",
"is_vip": True
},
"花字": {
"resource_id": "7530918113899105561",
"effect_id": "7530918113899105561",
"name": "花字",
"is_vip": True
},
"七夕-粉白渐变": {
"resource_id": "7265298421341277452",
"effect_id": "7265298421341277452",
"name": "七夕-粉白渐变",
"is_vip": True
},
"金色红底春节喜庆花字": {
"resource_id": "7324218891222240522",
"effect_id": "7324218891222240522",
"name": "金色红底春节喜庆花字",
"is_vip": True
},
"花字": {
"resource_id": "7431462520835099955",
"effect_id": "7431462520835099955",
"name": "花字",
"is_vip": True
},
"金色渐变红底立体花字": {
"resource_id": "7324255228310654235",
"effect_id": "7324255228310654235",
"name": "金色渐变红底立体花字",
"is_vip": True
},
"黄红渐变黑边立体花字": {
"resource_id": "7431549062475762959",
"effect_id": "7431549062475762959",
"name": "黄红渐变黑边立体花字",
"is_vip": True
},
"美食-红黄渐变": {
"resource_id": "7205154202757172541",
"effect_id": "7205154202757172541",
"name": "美食-红黄渐变",
"is_vip": True
},
"美食-划痕渐变": {
"resource_id": "7212896808798801213",
"effect_id": "7212896808798801213",
"name": "美食-划痕渐变",
"is_vip": True
},
"蓝色渐变白色描边花字": {
"resource_id": "7330967545240964404",
"effect_id": "7330967545240964404",
"name": "蓝色渐变白色描边花字",
"is_vip": True
},
"渐变蓝色花字": {
"resource_id": "7384325883584056617",
"effect_id": "7384325883584056617",
"name": "渐变蓝色花字",
"is_vip": True
},
"红色描边双色渐变立体花字": {
"resource_id": "7391023993802804521",
"effect_id": "7391023993802804521",
"name": "红色描边双色渐变立体花字",
"is_vip": True
},
"橙色渐变波点双层立体花字": {
"resource_id": "7404880919582018854",
"effect_id": "7404880919582018854",
"name": "橙色渐变波点双层立体花字",
"is_vip": True
},
"浅蓝粉渐变立体花字": {
"resource_id": "7312840128949505307",
"effect_id": "7312840128949505307",
"name": "浅蓝粉渐变立体花字",
"is_vip": True
},
"紫色立体花字": {
"resource_id": "7399918916232826123",
"effect_id": "7399918916232826123",
"name": "紫色立体花字",
"is_vip": True
},
"简约蓝色渐变立体花字": {
"resource_id": "7248118492111703357",
"effect_id": "7248118492111703357",
"name": "简约蓝色渐变立体花字",
"is_vip": True
},
"黄蓝撞色渐变立体花字": {
"resource_id": "7405583007098195237",
"effect_id": "7405583007098195237",
"name": "黄蓝撞色渐变立体花字",
"is_vip": True
},
"彩色渐变": {
"resource_id": "7369988046277594383",
"effect_id": "7369988046277594383",
"name": "彩色渐变",
"is_vip": True
},
"黄橘渐变": {
"resource_id": "7410717398510128424",
"effect_id": "7410717398510128424",
"name": "黄橘渐变",
"is_vip": True
},
"红色渐变透明花字": {
"resource_id": "7405253473299696931",
"effect_id": "7405253473299696931",
"name": "红色渐变透明花字",
"is_vip": True
},
"雪花字": {
"resource_id": "7298358091664362793",
"effect_id": "7298358091664362793",
"name": "雪花字",
"is_vip": True
},
"美食-辣": {
"resource_id": "7205147811573271864",
"effect_id": "7205147811573271864",
"name": "美食-辣",
"is_vip": True
},
"黄白色渐变立体花字": {
"resource_id": "7493079330654899480",
"effect_id": "7493079330654899480",
"name": "黄白色渐变立体花字",
"is_vip": True
},
"彩色": {
"resource_id": "7369460089767480614",
"effect_id": "7369460089767480614",
"name": "彩色",
"is_vip": True
},
"白字霓虹灯渐变花字": {
"resource_id": "7406294702212877619",
"effect_id": "7406294702212877619",
"name": "白字霓虹灯渐变花字",
"is_vip": True
},
"冬日寒冷发光花字": {
"resource_id": "7263267444020596005",
"effect_id": "7263267444020596005",
"name": "冬日寒冷发光花字",
"is_vip": True
},
"彩色渐变花字": {
"resource_id": "7405953290271198491",
"effect_id": "7405953290271198491",
"name": "彩色渐变花字",
"is_vip": True
},
"黄绿渐变发光字": {
"resource_id": "7406253347746876706",
"effect_id": "7406253347746876706",
"name": "黄绿渐变发光字",
"is_vip": True
},
"黄色渐变描边立体花字": {
"resource_id": "7383803879730842931",
"effect_id": "7383803879730842931",
"name": "黄色渐变描边立体花字",
"is_vip": True
},
"简约渐变花字": {
"resource_id": "7236638821901733175",
"effect_id": "7236638821901733175",
"name": "简约渐变花字",
"is_vip": True
},
"黄色渐变橙蓝色描边立体花字": {
"resource_id": "7505100141288901950",
"effect_id": "7505100141288901950",
"name": "黄色渐变橙蓝色描边立体花字",
"is_vip": True
},
"白绿紫渐变": {
"resource_id": "7127664822887402759",
"effect_id": "7127664822887402759",
"name": "白绿紫渐变",
"is_vip": True
},
"蓝绿渐变花字": {
"resource_id": "7391445684953681192",
"effect_id": "7391445684953681192",
"name": "蓝绿渐变花字",
"is_vip": True
},
"紫色立体渐变": {
"resource_id": "7376115629230673204",
"effect_id": "7376115629230673204",
"name": "紫色立体渐变",
"is_vip": True
},
"蓝色纹理发光立体花字": {
"resource_id": "7430709931411623204",
"effect_id": "7430709931411623204",
"name": "蓝色纹理发光立体花字",
"is_vip": True
},
"黄色渐变双色描边花字": {
"resource_id": "7265636111211449634",
"effect_id": "7265636111211449634",
"name": "黄色渐变双色描边花字",
"is_vip": True
},
"蓝色渐变花字": {
"resource_id": "7285696655989411133",
"effect_id": "7285696655989411133",
"name": "蓝色渐变花字",
"is_vip": True
},
"黄绿花纹立体字": {
"resource_id": "7404026606869613864",
"effect_id": "7404026606869613864",
"name": "黄绿花纹立体字",
"is_vip": True
},
"星空梦幻炫彩立体花字": {
"resource_id": "7404369195875487016",
"effect_id": "7404369195875487016",
"name": "星空梦幻炫彩立体花字",
"is_vip": True
},
"紫色 立体 渐变 花字": {
"resource_id": "7527575726220987672",
"effect_id": "7527575726220987672",
"name": "紫色 立体 渐变 花字",
"is_vip": True
},
"花字": {
"resource_id": "7241433848943365436",
"effect_id": "7241433848943365436",
"name": "花字",
"is_vip": True
},
"蓝字彩虹渐变描边花字": {
"resource_id": "7404026005389708595",
"effect_id": "7404026005389708595",
"name": "蓝字彩虹渐变描边花字",
"is_vip": True
},
"国风粉色渐变": {
"resource_id": "7406640534036532490",
"effect_id": "7406640534036532490",
"name": "国风粉色渐变",
"is_vip": True
},
"多色渐变花字": {
"resource_id": "7405867875317173516",
"effect_id": "7405867875317173516",
"name": "多色渐变花字",
"is_vip": True
},
"蓝色渐变立体花字": {
"resource_id": "7371124565839301925",
"effect_id": "7371124565839301925",
"name": "蓝色渐变立体花字",
"is_vip": True
},
"渐变白色描边花字": {
"resource_id": "7405949704904658203",
"effect_id": "7405949704904658203",
"name": "渐变白色描边花字",
"is_vip": True
},
"黄色手绘蜡笔质感花字": {
"resource_id": "7366899343451852058",
"effect_id": "7366899343451852058",
"name": "黄色手绘蜡笔质感花字",
"is_vip": True
},
"3D渐变绿色立体花字": {
"resource_id": "7404710833344892196",
"effect_id": "7404710833344892196",
"name": "3D渐变绿色立体花字",
"is_vip": True
},
"简约双层描边蓝色渐变花字": {
"resource_id": "7497111940762995993",
"effect_id": "7497111940762995993",
"name": "简约双层描边蓝色渐变花字",
"is_vip": True
},
"五色花字": {
"resource_id": "7430992115376704819",
"effect_id": "7430992115376704819",
"name": "五色花字",
"is_vip": True
},
"炫彩星空花字": {
"resource_id": "6896143862222327047",
"effect_id": "6896143862222327047",
"name": "炫彩星空花字",
"is_vip": True
},
"美妆立体": {
"resource_id": "7482318463755734334",
"effect_id": "7482318463755734334",
"name": "美妆立体",
"is_vip": True
},
"忧郁蓝": {
"resource_id": "7481306716752219417",
"effect_id": "7481306716752219417",
"name": "忧郁蓝",
"is_vip": True
},
"黑底纹粉渐变描边发光花字": {
"resource_id": "7407010177842482459",
"effect_id": "7407010177842482459",
"name": "黑底纹粉渐变描边发光花字",
"is_vip": True
},
"粉色渐变镂空描边": {
"resource_id": "7406359623545933093",
"effect_id": "7406359623545933093",
"name": "粉色渐变镂空描边",
"is_vip": True
},
"金色渐变描边花字": {
"resource_id": "7391015553818692927",
"effect_id": "7391015553818692927",
"name": "金色渐变描边花字",
"is_vip": True
},
"白字花字": {
"resource_id": "7404038278057332005",
"effect_id": "7404038278057332005",
"name": "白字花字",
"is_vip": True
},
"暗色花字": {
"resource_id": "7249649958297783589",
"effect_id": "7249649958297783589",
"name": "暗色花字",
"is_vip": True
},
"双十一-彩色立体字": {
"resource_id": "7296106361153293618",
"effect_id": "7296106361153293618",
"name": "双十一-彩色立体字",
"is_vip": True
},
"天蓝色渐变花字": {
"resource_id": "7241433473796394255",
"effect_id": "7241433473796394255",
"name": "天蓝色渐变花字",
"is_vip": True
},
"红色渐变立体文字": {
"resource_id": "7406232498734157090",
"effect_id": "7406232498734157090",
"name": "红色渐变立体文字",
"is_vip": True
},
"粉色梦幻立体": {
"resource_id": "7404129182244031782",
"effect_id": "7404129182244031782",
"name": "粉色梦幻立体",
"is_vip": True
},
"粉色渐变发光花字": {
"resource_id": "7405578926489160998",
"effect_id": "7405578926489160998",
"name": "粉色渐变发光花字",
"is_vip": True
},
"彩色": {
"resource_id": "7369459252290718986",
"effect_id": "7369459252290718986",
"name": "彩色",
"is_vip": True
},
"黄色渐变粉色阴影立体花字": {
"resource_id": "7495776303799618878",
"effect_id": "7495776303799618878",
"name": "黄色渐变粉色阴影立体花字",
"is_vip": True
},
"低饱和蓝色渐变立体白边花字": {
"resource_id": "7388019320686693686",
"effect_id": "7388019320686693686",
"name": "低饱和蓝色渐变立体白边花字",
"is_vip": True
},
"绿色渐变蓝紫色描边花字": {
"resource_id": "7315437477425155368",
"effect_id": "7315437477425155368",
"name": "绿色渐变蓝紫色描边花字",
"is_vip": True
},
"粉色渐变": {
"resource_id": "7475023258228788505",
"effect_id": "7475023258228788505",
"name": "粉色渐变",
"is_vip": True
},
"红色燃烧花字": {
"resource_id": "7405837403782384906",
"effect_id": "7405837403782384906",
"name": "红色燃烧花字",
"is_vip": True
},
"春节喜庆金字红边立体花字": {
"resource_id": "7460547039252909337",
"effect_id": "7460547039252909337",
"name": "春节喜庆金字红边立体花字",
"is_vip": True
},
"斜线纹理黑白漫画感花字": {
"resource_id": "7405244303586397476",
"effect_id": "7405244303586397476",
"name": "斜线纹理黑白漫画感花字",
"is_vip": True
},
"白纸纹理蓝边拼贴花字": {
"resource_id": "7509039282737302808",
"effect_id": "7509039282737302808",
"name": "白纸纹理蓝边拼贴花字",
"is_vip": True
},
"花字": {
"resource_id": "7545325777781280024",
"effect_id": "7545325777781280024",
"name": "花字",
"is_vip": True
},
"粉笔质感纸张花字": {
"resource_id": "7538694611150130457",
"effect_id": "7538694611150130457",
"name": "粉笔质感纸张花字",
"is_vip": True
},
"黄色立体纹理花字": {
"resource_id": "7405846768010661157",
"effect_id": "7405846768010661157",
"name": "黄色立体纹理花字",
"is_vip": True
},
"像素化花字": {
"resource_id": "7488161196357487934",
"effect_id": "7488161196357487934",
"name": "像素化花字",
"is_vip": True
},
"白色纸质纹理立体": {
"resource_id": "7406014922078965001",
"effect_id": "7406014922078965001",
"name": "白色纸质纹理立体",
"is_vip": True
},
"黄红立体字": {
"resource_id": "7492626374239243545",
"effect_id": "7492626374239243545",
"name": "黄红立体字",
"is_vip": True
},
"像素化花字": {
"resource_id": "7482734426015730968",
"effect_id": "7482734426015730968",
"name": "像素化花字",
"is_vip": True
},
"花字": {
"resource_id": "7480452404811615512",
"effect_id": "7480452404811615512",
"name": "花字",
"is_vip": True
},
"金属质感硬朗立体花字": {
"resource_id": "7405140394662530354",
"effect_id": "7405140394662530354",
"name": "金属质感硬朗立体花字",
"is_vip": True
},
"冰雪大世界立体雪花字": {
"resource_id": "7407272554445999411",
"effect_id": "7407272554445999411",
"name": "冰雪大世界立体雪花字",
"is_vip": True
},
"不织布新年红": {
"resource_id": "7449585330547625228",
"effect_id": "7449585330547625228",
"name": "不织布新年红",
"is_vip": True
},
"复古纸张纹理字": {
"resource_id": "7404377624690101544",
"effect_id": "7404377624690101544",
"name": "复古纸张纹理字",
"is_vip": True
},
"花字": {
"resource_id": "7541849024001740056",
"effect_id": "7541849024001740056",
"name": "花字",
"is_vip": True
},
"像素化游戏花字": {
"resource_id": "7482761022504275262",
"effect_id": "7482761022504275262",
"name": "像素化游戏花字",
"is_vip": True
},
"未来科技感赛博斜体字": {
"resource_id": "7405126783332404517",
"effect_id": "7405126783332404517",
"name": "未来科技感赛博斜体字",
"is_vip": True
},
"复古格纹立体花字": {
"resource_id": "7406192655488519433",
"effect_id": "7406192655488519433",
"name": "复古格纹立体花字",
"is_vip": True
},
"清爽冰块纹理字": {
"resource_id": "7405853759911333172",
"effect_id": "7405853759911333172",
"name": "清爽冰块纹理字",
"is_vip": True
},
"绿叶绿色纹理花字": {
"resource_id": "7435107467366878503",
"effect_id": "7435107467366878503",
"name": "绿叶绿色纹理花字",
"is_vip": True
},
"港风图案纹理花字": {
"resource_id": "7451442109753675070",
"effect_id": "7451442109753675070",
"name": "港风图案纹理花字",
"is_vip": True
},
"冰块立体字": {
"resource_id": "7405824092479196431",
"effect_id": "7405824092479196431",
"name": "冰块立体字",
"is_vip": True
},
"蓝色星空花字": {
"resource_id": "7405857800208928037",
"effect_id": "7405857800208928037",
"name": "蓝色星空花字",
"is_vip": True
},
"红色纹理立体花字": {
"resource_id": "7405855842072808755",
"effect_id": "7405855842072808755",
"name": "红色纹理立体花字",
"is_vip": True
},
"复古红轴": {
"resource_id": "7483893116274117950",
"effect_id": "7483893116274117950",
"name": "复古红轴",
"is_vip": True
},
"红黄质感立体花字": {
"resource_id": "7481535145284160792",
"effect_id": "7481535145284160792",
"name": "红黄质感立体花字",
"is_vip": True
},
"蓝紫色发光纹理花字": {
"resource_id": "7405843250960993586",
"effect_id": "7405843250960993586",
"name": "蓝紫色发光纹理花字",
"is_vip": True
},
"牛奶花字": {
"resource_id": "7532883438072778008",
"effect_id": "7532883438072778008",
"name": "牛奶花字",
"is_vip": True
},
"木纹雕刻立体字": {
"resource_id": "7405870250916384015",
"effect_id": "7405870250916384015",
"name": "木纹雕刻立体字",
"is_vip": True
},
"像素化花字": {
"resource_id": "7486311409861528894",
"effect_id": "7486311409861528894",
"name": "像素化花字",
"is_vip": True
},
"粉笔黑板花字(教师节)": {
"resource_id": "7405550386234281235",
"effect_id": "7405550386234281235",
"name": "粉笔黑板花字(教师节)",
"is_vip": True
},
"梦幻爱心纹理底花字": {
"resource_id": "7330983004631878964",
"effect_id": "7330983004631878964",
"name": "梦幻爱心纹理底花字",
"is_vip": True
},
"流光立体花字": {
"resource_id": "7405693659536051492",
"effect_id": "7405693659536051492",
"name": "流光立体花字",
"is_vip": True
},
"蓝色渐变DIY纹理立体花字": {
"resource_id": "7371332005948083494",
"effect_id": "7371332005948083494",
"name": "蓝色渐变DIY纹理立体花字",
"is_vip": True
},
"冬日冰花": {
"resource_id": "7407265065272937778",
"effect_id": "7407265065272937778",
"name": "冬日冰花",
"is_vip": True
},
"红色黑条纹字": {
"resource_id": "7406984542742924582",
"effect_id": "7406984542742924582",
"name": "红色黑条纹字",
"is_vip": True
},
"蓝色天空纹理立体花字": {
"resource_id": "7406190866626366770",
"effect_id": "7406190866626366770",
"name": "蓝色天空纹理立体花字",
"is_vip": True
},
"荧光紫渐变字": {
"resource_id": "7404383053906267392",
"effect_id": "7404383053906267392",
"name": "荧光紫渐变字",
"is_vip": True
},
"红色洒墨花字(书法古风)": {
"resource_id": "7405523650423639308",
"effect_id": "7405523650423639308",
"name": "红色洒墨花字(书法古风)",
"is_vip": True
},
"蓝色渐变立体描边花字": {
"resource_id": "7405919974411242791",
"effect_id": "7405919974411242791",
"name": "蓝色渐变立体描边花字",
"is_vip": True
},
"圣诞-四色纹理": {
"resource_id": "7306473747953863975",
"effect_id": "7306473747953863975",
"name": "圣诞-四色纹理",
"is_vip": True
},
"渐变纹理花字": {
"resource_id": "7506817303296675123",
"effect_id": "7506817303296675123",
"name": "渐变纹理花字",
"is_vip": True
},
"游戏像素化花字": {
"resource_id": "7486231125992623385",
"effect_id": "7486231125992623385",
"name": "游戏像素化花字",
"is_vip": True
},
"花石榴": {
"resource_id": "7471979945447836952",
"effect_id": "7471979945447836952",
"name": "花石榴",
"is_vip": True
},
"紫色纹理描边立体花字": {
"resource_id": "7405866412570348836",
"effect_id": "7405866412570348836",
"name": "紫色纹理描边立体花字",
"is_vip": True
},
"蓝色毛毡绒毛立体花字": {
"resource_id": "7404145370399329587",
"effect_id": "7404145370399329587",
"name": "蓝色毛毡绒毛立体花字",
"is_vip": True
},
"紫色纹理立体发光花字": {
"resource_id": "7430717597039054143",
"effect_id": "7430717597039054143",
"name": "紫色纹理立体发光花字",
"is_vip": True
},
"粉笔蓝白色立体花字": {
"resource_id": "7405201103903624463",
"effect_id": "7405201103903624463",
"name": "粉笔蓝白色立体花字",
"is_vip": True
},
"绿粉圈圈纹理综艺花字": {
"resource_id": "7546407203654159678",
"effect_id": "7546407203654159678",
"name": "绿粉圈圈纹理综艺花字",
"is_vip": True
},
"红色棋盘格纹理立体花字": {
"resource_id": "7405573811107663155",
"effect_id": "7405573811107663155",
"name": "红色棋盘格纹理立体花字",
"is_vip": True
},
"方块游戏花字": {
"resource_id": "7477911542575516952",
"effect_id": "7477911542575516952",
"name": "方块游戏花字",
"is_vip": True
},
"彩色纹理花字": {
"resource_id": "7406205168200568115",
"effect_id": "7406205168200568115",
"name": "彩色纹理花字",
"is_vip": True
},
"绿色粉笔描边花字": {
"resource_id": "7405201692775451904",
"effect_id": "7405201692775451904",
"name": "绿色粉笔描边花字",
"is_vip": True
},
"3D蓝粉色渐变立体花字": {
"resource_id": "7406173713428745509",
"effect_id": "7406173713428745509",
"name": "3D蓝粉色渐变立体花字",
"is_vip": True
},
"红砖纹理立体花字": {
"resource_id": "7405864219809287433",
"effect_id": "7405864219809287433",
"name": "红砖纹理立体花字",
"is_vip": True
},
"蓝黄拼色立体花字": {
"resource_id": "7405917544126647602",
"effect_id": "7405917544126647602",
"name": "蓝黄拼色立体花字",
"is_vip": True
},
"红色花字": {
"resource_id": "7481938079507418430",
"effect_id": "7481938079507418430",
"name": "红色花字",
"is_vip": True
}
}
================================================
FILE: src/service/timelines.py
================================================
from src.utils.logger import logger
from typing import List, Dict, Tuple
def timelines(duration: int, num: int, start: int, type: int) -> Tuple[List[Dict[str, int]], List[Dict[str, int]]]:
"""
计算时间线分割点
Args:
duration: 总时长
num: 分割段数
start: 开始时间
type: 分割类型 (0: 平均分, 1: 随机)
Returns:
tuple: (timelines, all_timelines)
"""
logger.info(f"timelines, duration: {duration}, num: {num}, start: {start}, type: {type}")
timelines = []
all_timelines = [{"start": start, "end": start + duration}]
if num <= 0:
return [], all_timelines
if type == 0: # 平均分
segment_duration = duration // num
for i in range(num):
seg_start = start + i * segment_duration
seg_end = start + (i + 1) * segment_duration if i < num - 1 else start + duration
timelines.append({"start": seg_start, "end": seg_end})
else: # 随机分 (简化实现,实际可能需要更复杂的随机算法)
import random
random.seed(42) # 固定种子以便测试
points = sorted([random.randint(start, start + duration) for _ in range(num - 1)])
points = [start] + points + [start + duration]
for i in range(len(points) - 1):
timelines.append({"start": points[i], "end": points[i + 1]})
return timelines, all_timelines
================================================
FILE: src/service/video_infos.py
================================================
from src.utils.logger import logger
import json
from typing import List, Optional, Dict, Any
def video_infos(
video_urls: List[str],
timelines: List[Dict[str, int]],
height: Optional[int] = None,
width: Optional[int] = None,
mask: Optional[str] = None,
transition: Optional[str] = None,
transition_duration: Optional[int] = None,
volume: float = 1.0
) -> str:
"""
根据视频URL和时间线生成视频信息JSON字符串
Args:
video_urls: 视频URL列表
timelines: 时间线数组
height: 视频高(可选)
width: 视频宽(可选)
mask: 视频蒙版(可选)
transition: 转场名称(可选)
transition_duration: 转场时长(可选)
volume: 音量大小,默认1.0
Returns:
str: JSON字符串格式的视频信息
Raises:
无异常抛出,长度不匹配时以最短的为准
"""
logger.info(f"video_infos called with {len(video_urls)} videos and {len(timelines)} timelines")
# 长度不相等时以最短的为准
if len(video_urls) != len(timelines):
min_len = min(len(video_urls), len(timelines))
logger.warning(f"video_urls length ({len(video_urls)}) does not match timelines length ({len(timelines)}), using shorter length: {min_len}")
video_urls = video_urls[:min_len]
timelines = timelines[:min_len]
# 构建视频信息列表
infos = []
for i, (video_url, timeline) in enumerate(zip(video_urls, timelines)):
start = timeline["start"]
end = timeline["end"]
duration = end - start
info = {
"video_url": video_url,
"start": start,
"end": end,
"duration": duration
}
# 添加可选参数
if width is not None:
info["width"] = width
if height is not None:
info["height"] = height
if mask is not None:
info["mask"] = mask
if transition is not None:
info["transition"] = transition
if transition_duration is not None:
info["transition_duration"] = transition_duration
if volume is not None:
info["volume"] = volume
infos.append(info)
logger.info(f"Processed video info {i+1}: {info}")
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
logger.info(f"Generated video infos JSON with {len(infos)} items")
return infos_json
================================================
FILE: src/utils/__init__.py
================================================
# 工具实现
from .media import get_media_duration, get_media_duration_formatted
__all__ = ['get_media_duration', 'get_media_duration_formatted']
================================================
FILE: src/utils/cos.py
================================================
# 实现腾讯云对象存储(COS)的上传功能
import os
import time
import datetime
from typing import Optional
import config
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from src.utils.logger import logger
from src.utils.storage_upload_retry import run_with_storage_retry
from exceptions import CustomException, CustomError
def cos_upload_file(file_path: str, expire_days: Optional[int] = None) -> str:
"""
上传文件到COS,返回带签名的临时URL,链接在指定天数后失效(见 config.VIDEO_GEN_RETENTION_DAYS)。
Args:
file_path: 文件路径
expire_days: URL 有效期天数;为 None 时使用 config.VIDEO_GEN_RETENTION_DAYS(视频生成任务默认)
Returns:
str: 带签名的临时下载URL(有效期为 expire_days 天)
Raises:
CustomException: 上传失败
"""
if expire_days is None:
expire_days = config.VIDEO_GEN_RETENTION_DAYS
now = datetime.datetime.now()
current_date = now.strftime("%Y-%m-%d")
current_hour = now.strftime("%H")
filename = os.path.basename(file_path)
key = f"{current_date}/{current_hour}/{filename}"
cfg = CosConfig(
Region=config.COS_REGION,
SecretId=config.COS_SECRET_ID,
SecretKey=config.COS_SECRET_KEY,
Token=None
)
def do_upload() -> str:
# SDK 内 retry;业务层在 storage_upload_retry 中再套一层
cli = CosS3Client(cfg, retry=5)
expire_time = datetime.datetime.now() + datetime.timedelta(days=expire_days)
expire_time_str = expire_time.strftime("%Y-%m-%dT%H:%M:%S.000Z")
response = cli.upload_file(
Bucket=config.COS_BUCKET_NAME,
Key=key,
LocalFilePath=file_path
)
logger.info(f"COS upload success, key: {key}, expire time: {expire_time_str}, response: {response}")
signed_url = cli.get_presigned_url(
Method='GET',
Bucket=config.COS_BUCKET_NAME,
Key=key,
Expired=expire_days * 24 * 3600
)
logger.info(f"Generated COS signed URL valid for {expire_days} day(s), URL: {signed_url[:100]}...")
return signed_url
_t0 = time.perf_counter()
success = False
try:
result = run_with_storage_retry(do_upload, context="COS")
success = True
return result
except Exception as e:
logger.error(f"COS upload failed: {e}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, "COS upload failed")
finally:
elapsed = time.perf_counter() - _t0
logger.info(
"COS upload %s, file=%s, key=%s, total_duration_sec=%.3f",
"success" if success else "failed",
file_path,
key,
elapsed,
)
================================================
FILE: src/utils/download.py
================================================
import os
import requests
import mimetypes
import time
from typing import Dict, Any, Optional
from src.utils import helper
from src.utils.logger import logger
from exceptions import CustomException, CustomError
import config
# 常量配置
DEFAULT_FILE_SIZE_LIMIT = config.DOWNLOAD_FILE_SIZE_LIMIT # 文件下载大小限制,默认200MB,可通过环境变量DOWNLOAD_FILE_SIZE_LIMIT配置
DEFAULT_DOWNLOAD_TIMEOUT = 90 # 总下载超时时间90秒(用户要求)
DEFAULT_CONNECT_TIMEOUT = 10 # 连接超时10秒,快速失败
DEFAULT_READ_TIMEOUT = 15 # 读取超时15秒,平衡稳定性和速度
DEFAULT_API_TIMEOUT = 30 # 30秒
DEFAULT_FFPROBE_TIMEOUT = 30 # 30秒
DEFAULT_RETRY_COUNT = 3 # 重试次数改为3次,在90秒内完成
CHUNK_SIZE = 32768 # 32KB,增加块大小提高效率
CHUNK_READ_TIMEOUT = 10 # 每个块的读取超时10秒,快速检测网络中断
CONNECTION_RETRY_DELAY = 1 # 连接重试间隔时间(秒)
MAX_RETRY_DELAY = 8 # 最大重试等待时间8秒,控制总时间
MIN_PARTIAL_SIZE = 1024 # 最小部分下载大小(字节),小于此尺寸不使用断点续传
# 网络质量评估阈值
NETWORK_GOOD_THRESHOLD = 0.5 # 0.5秒内响应认为网络良好
NETWORK_MEDIUM_THRESHOLD = 2.0 # 2秒内响应认为网络中等
# HTTP连接池配置
CONNECTION_POOL_SIZE = 3 # 连接池大小
CONNECTION_POOL_MAXSIZE = 5 # 连接池最大连接数
# HTTP请求头(优化网络稳定性)
DOWNLOAD_HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Accept-Encoding': 'gzip, deflate', # 支持压缩提高传输效率
'Connection': 'keep-alive', # 保持连接
'Cache-Control': 'no-cache', # 不使用缓存
'Pragma': 'no-cache', # 兼容性缓存控制
'Keep-Alive': 'timeout=30, max=3' # Keep-Alive配置
}
def download(url: str, save_dir: str, limit: int = DEFAULT_FILE_SIZE_LIMIT,
timeout: int = DEFAULT_DOWNLOAD_TIMEOUT, retry: int = DEFAULT_RETRY_COUNT) -> str:
"""
下载文件并根据Content-Type判断文件类型,支持高度稳定的断点续传和智能重试机制
Args:
url: 文件的URL地址
save_dir: 文件保存目录
limit: 文件大小限制(字节),默认300MB
timeout: 整体下载超时时间(秒),默认5分钟
retry: 下载失败时的重试次数,默认5次
Returns:
str: 完整的文件路径
Raises:
CustomException: 下载失败时抛出异常
"""
# 兼容 Pydantic HttpUrl 等类型,避免切片/解析时下标报错
url = str(url)
# 初始化下载环境
download_context = _prepare_download_context(url, save_dir, timeout)
# 执行带重试的下载流程
return _execute_download_with_retry(download_context, limit, retry)
def cleanup_temp_file(temp_file_path: Optional[str]) -> None:
"""
清理临时文件
Args:
temp_file_path: 临时文件路径,可能为None
"""
if temp_file_path and os.path.exists(temp_file_path):
try:
os.remove(temp_file_path)
logger.info(f"Temporary file removed: {temp_file_path}")
except Exception as cleanup_error:
logger.warning(f"Failed to cleanup temporary file {temp_file_path}: {cleanup_error}")
def _prepare_download_context(url: str, save_dir: str, timeout: int) -> dict:
"""
准备下载上下文信息
Args:
url: 文件URL
save_dir: 保存目录
timeout: 超时时间
Returns:
dict: 下载上下文字典
"""
# 生成唯一的文件路径
base_filename = helper.gen_unique_id()
temp_save_path = os.path.join(save_dir, base_filename)
# 评估网络环境
network_quality = _assess_network_quality(url)
supports_range = _check_range_support_with_retry(url)
logger.info(f"Preparing download environment - Network quality: {network_quality}, Range support: {supports_range}, URL: {url}")
# 计算自适应超时参数
adaptive_timeouts = _calculate_adaptive_timeouts(network_quality, timeout)
return {
'url': url,
'save_path': temp_save_path,
'network_quality': network_quality,
'supports_range': supports_range,
'timeouts': adaptive_timeouts
}
def _execute_download_with_retry(context: dict, limit: int, retry: int) -> str:
"""
执行带重试机制的下载流程
Args:
context: 下载上下文
limit: 文件大小限制
retry: 重试次数
Returns:
str: 下载成功的文件路径
Raises:
CustomException: 下载失败时抛出异常
"""
url = context['url']
temp_save_path = context['save_path']
supports_range = context['supports_range']
timeouts = context['timeouts']
last_exception = None
consecutive_failures = 0 # 连续失败计数器
for attempt in range(retry + 1): # 总共尝试 retry + 1 次
response = None
try:
logger.info(f"Starting download attempt {attempt + 1}/{retry + 1}, URL: {url}")
# 检查断点续传条件
resume_info = _check_resume_conditions(temp_save_path, supports_range,
attempt, consecutive_failures)
# 执行单次下载
response = _execute_single_download(url, resume_info, timeouts)
# 确定最终文件路径(首次下载时添加扩展名)
if resume_info['existing_size'] == 0:
temp_save_path = _determine_file_path_with_extension(response, temp_save_path)
context['save_path'] = temp_save_path
# 下载文件内容
_download_file_with_enhanced_stability(
response, temp_save_path, limit, url, timeouts,
resume_info['existing_size'], resume_info['use_resume']
)
# 验证下载完整性
_validate_download_integrity_with_resume(response, temp_save_path,
url, resume_info['use_resume'])
logger.info(f"Download completed successfully, attempts: {attempt + 1}, file path: {temp_save_path}")
return temp_save_path
except Exception as e:
last_exception = e
consecutive_failures += 1
# 处理下载异常
if not _handle_download_exception(e, attempt, retry, temp_save_path,
supports_range, consecutive_failures, context):
break # 致命错误,停止重试
finally:
# 统一关闭 response/session,避免连接资源滞留
if response is not None:
try:
response.close()
except Exception:
pass
session = getattr(response, "_capcut_session", None)
if session is not None:
try:
session.close()
except Exception:
pass
# 所有重试都失败,抛出异常
return _handle_final_failure(last_exception, url)
def _check_resume_conditions(save_path: str, supports_range: bool,
attempt: int, consecutive_failures: int) -> dict:
"""
检查断点续传条件
Args:
save_path: 保存路径
supports_range: 是否支持范围请求
attempt: 当前尝试次数
consecutive_failures: 连续失败次数
Returns:
dict: 断点续传信息字典
"""
existing_size = 0
if os.path.exists(save_path):
existing_size = os.path.getsize(save_path)
logger.info(f"Found existing partial file: {save_path}, size: {existing_size} bytes")
# 判断是否使用断点续传(增强条件判断)
use_resume = (
supports_range and
existing_size >= MIN_PARTIAL_SIZE and
attempt > 0 and
consecutive_failures <= 2 # 连续失败不超过2次才使用断点续传
)
return {
'existing_size': existing_size,
'use_resume': use_resume
}
def _execute_single_download(url: str, resume_info: dict, timeouts: dict) -> requests.Response:
"""
执行单次下载操作
Args:
url: 文件URL
resume_info: 断点续传信息
timeouts: 超时配置
Returns:
requests.Response: HTTP响应对象
"""
if resume_info['use_resume']:
logger.info(f"Using resume download from byte {resume_info['existing_size']}")
return _download_with_resume_enhanced(url, resume_info['existing_size'], timeouts)
else:
logger.info("Starting fresh download")
return _download_fresh_enhanced(url, timeouts)
def _handle_download_exception(exception: Exception, attempt: int, retry: int,
save_path: str, supports_range: bool,
consecutive_failures: int, context: dict) -> bool:
"""
处理下载异常
Args:
exception: 异常对象
attempt: 当前尝试次数
retry: 总重试次数
save_path: 保存路径
supports_range: 是否支持范围请求
consecutive_failures: 连续失败次数
context: 下载上下文
Returns:
bool: True表示可以继续重试,False表示应该停止
"""
url = context['url']
# 错误分类
error_category = _classify_download_error(exception)
# 致命错误直接停止
if error_category == 'fatal':
if os.path.exists(save_path):
_safe_remove_file(save_path)
logger.error(f"Fatal error encountered, stopping retry, URL: {url}, error: {str(exception)}")
raise exception
# 非最后一次尝试,继续重试
if attempt < retry:
logger.warning(f"Download attempt {attempt + 1} failed, URL: {url}, error: {str(exception)}, category: {error_category}")
# 决定是否清理文件
should_cleanup = _should_cleanup_on_error(error_category, supports_range, consecutive_failures)
if should_cleanup and os.path.exists(save_path):
_safe_remove_file(save_path)
logger.debug(f"Cleaned up partial download file: {save_path}")
# 执行重试等待
_execute_retry_wait(attempt, error_category, consecutive_failures, context)
return True
else:
logger.error(f"All retry attempts failed, URL: {url}, final error: {str(exception)}")
if os.path.exists(save_path):
_safe_remove_file(save_path)
return False
def _execute_retry_wait(attempt: int, error_category: str, consecutive_failures: int, context: dict) -> None:
"""
执行重试等待逻辑
Args:
attempt: 当前尝试次数
error_category: 错误类型
consecutive_failures: 连续失败次数
context: 下载上下文
"""
# 计算等待时间
wait_time = _calculate_retry_delay(attempt, error_category, consecutive_failures)
logger.info(f"Waiting {wait_time} seconds before retry...")
time.sleep(wait_time)
# 网络错误后重新评估网络质量
if error_category == 'network':
url = context['url']
network_quality = _assess_network_quality(url)
context['timeouts'] = _calculate_adaptive_timeouts(network_quality,
context['timeouts']['total_timeout'])
logger.info(f"Re-assessed network quality: {network_quality}")
def _handle_final_failure(last_exception: Optional[Exception], url: str) -> str:
"""
处理最终失败情况
Args:
last_exception: 最后一次异常(可能为None)
url: 文件URL
Raises:
CustomException: 总是抛出异常
"""
if last_exception and isinstance(last_exception, CustomException):
raise last_exception
error_detail = str(last_exception) if last_exception else "Unknown error"
logger.error(f"All retries failed, URL: {url}, last error: {error_detail}")
raise CustomException(CustomError.DOWNLOAD_FILE_FAILED)
def _determine_file_path_with_extension(response: requests.Response, save_path: str) -> str:
"""
根据HTTP响应的Content-Type确定文件路径和扩展名
Args:
response: HTTP响应对象
save_path: 原始保存路径
Returns:
str: 带扩展名的文件路径
"""
content_type = response.headers.get('Content-Type', '').split(';')[0].strip()
extension = mimetypes.guess_extension(content_type)
if extension:
return save_path + extension
return save_path
def _parse_api_response(response: requests.Response) -> Dict[str, Any]:
"""
解析API响应的JSON数据
Args:
response: HTTP响应对象
Returns:
Dict[str, Any]: 解析后的JSON数据
Raises:
CustomException: JSON解析失败时
"""
try:
return response.json()
except ValueError:
logger.error(f"Failed to parse API response as JSON: {response.text}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, detail="API response format error")
def _validate_download_integrity_with_resume(
response: requests.Response,
save_path: str,
url: str,
is_resume: bool = False
) -> None:
"""
验证下载文件的完整性(支持断点续传)
Args:
response: HTTP响应对象
save_path: 文件保存路径
url: 文件URL(用于日志)
is_resume: 是否为断点续传
Raises:
CustomException: 文件不完整时抛出
"""
actual_size = os.path.getsize(save_path)
if is_resume:
# 断点续传时,检查Content-Range头
content_range = response.headers.get('Content-Range')
if content_range:
# Content-Range: bytes 1024-2047/2048
try:
range_info = content_range.split('/')[-1]
if range_info != '*':
expected_total_size = int(range_info)
if actual_size != expected_total_size:
os.remove(save_path)
logger.warning(
f"Resume download failed, url: {url}, "
f"error: File download incomplete: expected {expected_total_size} bytes, "
f"actual {actual_size} bytes"
)
raise CustomException(CustomError.DOWNLOAD_FILE_FAILED)
except (ValueError, IndexError) as e:
logger.warning(f"Failed to parse Content-Range header: {content_range}, error: {e}")
else:
# 全新下载时,检查Content-Length头
content_length = response.headers.get('Content-Length')
if content_length:
expected_size = int(content_length)
if actual_size != expected_size:
os.remove(save_path)
logger.warning(
f"Download failed, url: {url}, "
f"error: File download incomplete: expected {expected_size} bytes, "
f"actual {actual_size} bytes"
)
raise CustomException(CustomError.DOWNLOAD_FILE_FAILED)
def _safe_remove_file(file_path: str) -> None:
"""
安全删除文件,忽略删除错误
Args:
file_path: 要删除的文件路径
"""
try:
if os.path.exists(file_path):
os.remove(file_path)
logger.debug(f"Successfully removed file: {file_path}")
except Exception as e:
logger.warning(f"Failed to remove file {file_path}: {e}")
def _assess_network_quality(url: str) -> str:
"""
评估网络质量(优化版)
Args:
url: 测试URL
Returns:
str: 网络质量 ('good', 'medium', 'poor')
"""
response = None
try:
# 兼容 pydantic HttpUrl 等对象,避免出现 decode 属性错误
url = str(url)
import urllib.parse
parsed_url = urllib.parse.urlparse(url)
test_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
start_time = time.time()
# 使用较短的超时时间快速测试
response = requests.head(
test_url,
timeout=(3, 5), # 更短的超时测试
headers={'User-Agent': DOWNLOAD_HEADERS['User-Agent']},
allow_redirects=True
)
response_time = time.time() - start_time
# 根据响应时间判断网络质量
if response_time < NETWORK_GOOD_THRESHOLD:
logger.debug(f"Network quality: good ({response_time:.2f}s)")
return 'good'
elif response_time < NETWORK_MEDIUM_THRESHOLD:
logger.debug(f"Network quality: medium ({response_time:.2f}s)")
return 'medium'
else:
logger.debug(f"Network quality: poor ({response_time:.2f}s)")
return 'poor'
except Exception as e:
logger.info(f"Failed to assess network quality, fallback to poor: {e}")
return 'poor' # 默认为较差的网络环境
finally:
if response is not None:
try:
response.close()
except Exception:
pass
def _check_range_support_with_retry(url: str, max_retries: int = 2) -> bool:
"""
带重试的范围请求支持检测
某些服务器(如Pixabay CDN)对HEAD请求返回403,但对GET请求正常响应。
当HEAD请求失败时,尝试使用GET请求检测Range支持。
Args:
url: 文件URL
max_retries: 最大重试次数
Returns:
bool: 是否支持Range请求
"""
url = str(url)
# 首先尝试HEAD请求
for attempt in range(max_retries + 1):
response = None
try:
response = requests.head(
url,
timeout=(DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT),
headers=DOWNLOAD_HEADERS
)
response.raise_for_status()
accept_ranges = response.headers.get('Accept-Ranges', '').lower()
supports_ranges = accept_ranges == 'bytes'
logger.info(f"Range support check (HEAD) attempt {attempt + 1}: Accept-Ranges={accept_ranges}, supports={supports_ranges}")
return supports_ranges
except Exception as e:
if attempt < max_retries:
logger.info(f"Range support check (HEAD) attempt {attempt + 1} failed: {e}, retrying...")
time.sleep(1)
else:
logger.info(f"HEAD request failed after {max_retries + 1} attempts: {e}, trying GET request...")
finally:
if response is not None:
try:
response.close()
except Exception:
pass
# HEAD请求失败,尝试使用GET请求检测(只读取响应头,不下载内容)
session = None
response = None
try:
session = _create_optimized_session()
session.headers.update(DOWNLOAD_HEADERS)
# 使用Range请求测试服务器是否支持断点续传
headers = DOWNLOAD_HEADERS.copy()
headers['Range'] = 'bytes=0-0'
response = session.get(
url,
headers=headers,
stream=True,
timeout=(DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT)
)
# 如果返回206 Partial Content,说明支持Range请求
if response.status_code == 206:
logger.info("Range support check (GET): Server supports Range requests (status 206)")
return True
elif response.status_code == 200:
# 返回200说明服务器忽略Range头,不支持断点续传
logger.info("Range support check (GET): Server does not support Range requests (status 200)")
return False
else:
response.raise_for_status()
except Exception as e:
logger.info(f"Range support check (GET) failed: {e}, assuming no range support")
return False
finally:
if response is not None:
try:
response.close()
except Exception:
pass
if session is not None:
try:
session.close()
except Exception:
pass
return False
def _calculate_adaptive_timeouts(network_quality: str, base_timeout: int) -> dict:
"""
根据网络质量计算自适应超时参数(优化版)
Args:
network_quality: 网络质量 ('good', 'medium', 'poor')
base_timeout: 基础超时时间
Returns:
dict: 超时参数字典
"""
if network_quality == 'good':
# 网络良好,使用较短超时
connect_multiplier = 0.8
read_multiplier = 0.8
chunk_multiplier = 0.7
elif network_quality == 'medium':
# 网络中等,使用默认超时
connect_multiplier = 1.0
read_multiplier = 1.0
chunk_multiplier = 1.0
else: # poor
# 网络较差,适度增加超时但不过大
connect_multiplier = 1.3
read_multiplier = 1.2
chunk_multiplier = 1.5
return {
'connect_timeout': max(5, int(DEFAULT_CONNECT_TIMEOUT * connect_multiplier)),
'read_timeout': max(8, int(DEFAULT_READ_TIMEOUT * read_multiplier)),
'total_timeout': base_timeout, # 保持90秒限制
'chunk_timeout': max(5, int(CHUNK_READ_TIMEOUT * chunk_multiplier))
}
def _create_optimized_session() -> requests.Session:
"""
创建优化的requests session,支持连接池和重试
Returns:
requests.Session: 配置好的session对象
"""
session = requests.Session()
# 设置重试适配器
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
# 配置重试策略
retry_strategy = Retry(
total=0, # 在session层级不做重试,由外层控制
backoff_factor=0.5,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["GET", "HEAD"],
raise_on_status=False
)
# 设置连接池
adapter = HTTPAdapter(
max_retries=retry_strategy,
pool_connections=CONNECTION_POOL_SIZE,
pool_maxsize=CONNECTION_POOL_MAXSIZE,
pool_block=False
)
session.mount("http://", adapter)
session.mount("https://", adapter)
return session
def _download_with_resume_enhanced(url: str, resume_pos: int, timeouts: dict) -> requests.Response:
"""
增强版的断点续传下载(优化HTTP协议)
Args:
url: 文件URL
resume_pos: 断点续传的起始位置
timeouts: 超时参数字典
Returns:
requests.Response: HTTP响应对象
"""
headers = DOWNLOAD_HEADERS.copy()
headers['Range'] = f'bytes={resume_pos}-'
# 使用优化的session
session = _create_optimized_session()
session.headers.update(headers)
# 快速重试机制(2次尝试)
for attempt in range(2):
try:
logger.debug(f"Resume download attempt {attempt + 1}, position: {resume_pos}")
response = session.get(
url,
stream=True,
timeout=(timeouts['connect_timeout'], timeouts['read_timeout'])
)
response._capcut_session = session
if response.status_code == 206:
logger.info(f"Resume download successful, status: {response.status_code}")
return response
elif response.status_code == 200:
logger.warning("Server returned 200 instead of 206, treating as fresh download")
return response
else:
response.raise_for_status()
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
if attempt < 1:
logger.warning(f"Resume download attempt {attempt + 1} failed: {e}, retrying...")
time.sleep(CONNECTION_RETRY_DELAY)
else:
logger.error(f"Resume download failed after {attempt + 1} attempts: {e}")
session.close()
raise
except Exception as e:
logger.error(f"Resume download unexpected error: {e}")
session.close()
raise
session.close()
raise requests.exceptions.RequestException("Failed to establish resume connection after retries")
def _download_fresh_enhanced(url: str, timeouts: dict) -> requests.Response:
"""
增强版的全新下载(优化HTTP协议)
Args:
url: 文件URL
timeouts: 超时参数字典
Returns:
requests.Response: HTTP响应对象
"""
# 使用优化的session
session = _create_optimized_session()
session.headers.update(DOWNLOAD_HEADERS)
# 快速重试机制(2次尝试)
for attempt in range(2):
try:
logger.debug(f"Fresh download attempt {attempt + 1}")
response = session.get(
url,
stream=True,
timeout=(timeouts['connect_timeout'], timeouts['read_timeout'])
)
response._capcut_session = session
response.raise_for_status()
logger.info(f"Fresh download successful, status: {response.status_code}")
return response
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
if attempt < 1:
logger.warning(f"Fresh download attempt {attempt + 1} failed: {e}, retrying...")
time.sleep(CONNECTION_RETRY_DELAY)
else:
logger.error(f"Fresh download failed after {attempt + 1} attempts: {e}")
session.close()
raise
except Exception as e:
logger.error(f"Fresh download unexpected error: {e}")
session.close()
raise
session.close()
raise requests.exceptions.RequestException("Failed to establish fresh connection after retries")
def _download_file_with_enhanced_stability(
response: requests.Response,
save_path: str,
limit: int,
url: str,
timeouts: dict,
existing_size: int = 0,
is_resume: bool = False
) -> None:
"""
增强稳定性的文件下载(优化版)
Args:
response: HTTP响应对象
save_path: 文件保存路径
limit: 文件大小限制
url: 文件URL
timeouts: 超时参数字典
existing_size: 已存在的文件大小
is_resume: 是否为断点续传
"""
downloaded_size = existing_size
start_time = time.time()
last_chunk_time = start_time
last_progress_time = start_time
stall_count = 0 # 停滞计数器
# 调试日志:打印超时配置
logger.info(f"Download timeouts config: total={timeouts.get('total_timeout')}, "
f"connect={timeouts.get('connect_timeout')}, read={timeouts.get('read_timeout')}, "
f"chunk={timeouts.get('chunk_timeout')}")
file_mode = 'ab' if is_resume else 'wb'
try:
with open(save_path, file_mode) as f:
for chunk in response.iter_content(chunk_size=CHUNK_SIZE):
current_time = time.time()
# 检查总体超时(严格90秒限制)
if current_time - start_time > timeouts['total_timeout']:
logger.error(f"Download total timeout: {current_time - start_time:.1f}s > {timeouts['total_timeout']}s")
raise CustomException(
CustomError.DOWNLOAD_FILE_FAILED,
detail=f"Download timeout, total time {current_time - start_time:.1f}s"
)
# 检查单个块的读取超时(网络停滞检测)
chunk_interval = current_time - last_chunk_time
if chunk_interval > timeouts['chunk_timeout']:
stall_count += 1
logger.warning(f"Network stall detected: {chunk_interval:.1f}s, count: {stall_count}")
# 连续停滞超过阈值则抛出异常
if stall_count >= 3:
raise CustomException(
CustomError.DOWNLOAD_FILE_FAILED,
detail=f"Network connection unstable, multiple stalls detected"
)
if chunk:
f.write(chunk)
downloaded_size += len(chunk)
last_chunk_time = current_time
# 重置停滞计数器
if len(chunk) > 0:
stall_count = 0
# 检查文件大小是否超过限制
if downloaded_size > limit:
raise CustomException(
CustomError.FILE_SIZE_LIMIT_EXCEEDED,
detail=f"{limit / 1024 / 1024:.2f} MB"
)
# 更频繁的进度日志(15秒间隔)
if current_time - last_progress_time >= 15:
progress_percent = (downloaded_size / limit) * 100 if limit > 0 else 0
speed_mbps = (downloaded_size - existing_size) / (current_time - start_time) / 1024 / 1024
logger.info(
f"Download progress: {downloaded_size / 1024 / 1024:.1f}MB "
f"({progress_percent:.1f}%), speed: {speed_mbps:.2f}MB/s, URL: {str(url)[:50]}..."
)
last_progress_time = current_time
except requests.exceptions.ChunkedEncodingError as e:
raise CustomException(
CustomError.DOWNLOAD_FILE_FAILED,
detail=f"Data transfer error: {str(e)}"
)
except Exception as e:
if isinstance(e, CustomException):
raise e
raise CustomException(
CustomError.DOWNLOAD_FILE_FAILED,
detail=f"Error occurred during download: {str(e)}"
)
def _classify_download_error(error: Exception) -> str:
"""
分类下载错误类型
Args:
error: 异常对象
Returns:
str: 错误类型 ('network', 'server', 'fatal', 'unknown')
"""
if isinstance(error, CustomException):
if error.err == CustomError.FILE_SIZE_LIMIT_EXCEEDED:
return 'fatal'
elif error.err == CustomError.DOWNLOAD_FILE_FAILED:
return 'network'
else:
return 'server'
if isinstance(error, (requests.exceptions.ConnectionError,
requests.exceptions.Timeout,
requests.exceptions.ChunkedEncodingError)):
return 'network'
if isinstance(error, requests.exceptions.HTTPError):
status_code = getattr(error.response, 'status_code', None)
if status_code in [500, 502, 503, 504]: # 服务器错误
return 'server'
elif status_code in [404, 403, 401]: # 客户端错误
return 'fatal'
else:
return 'server'
return 'unknown'
def _should_cleanup_on_error(error_category: str, supports_range: bool, consecutive_failures: int) -> bool:
"""
决定错误后是否清理文件
Args:
error_category: 错误类型
supports_range: 是否支持断点续传
consecutive_failures: 连续失败次数
Returns:
bool: 是否应该清理文件
"""
# 致命错误始终清理
if error_category == 'fatal':
return True
# 不支持断点续传时清理
if not supports_range:
return True
# 连续失败太多次时清理(可能是文件损坏)
if consecutive_failures >= 3:
return True
# 网络和服务器错误保留文件
return False
def _calculate_retry_delay(attempt: int, error_category: str, consecutive_failures: int) -> int:
"""
计算重试等待时间(优化版,控制总时间在90秒内)
Args:
attempt: 当前尝试次数
error_category: 错误类型
consecutive_failures: 连续失败次数
Returns:
int: 等待时间(秒)
"""
# 更短的基础等待时间,确保90秒内完成
base_delays = [1, 2, 4] # 递增延迟
base_delay = base_delays[min(attempt, len(base_delays) - 1)]
# 根据错误类型调整(幅度更小)
if error_category == 'network':
# 网络错误需要稍微更长的等待时间
multiplier = 1.2
elif error_category == 'server':
# 服务器错误稍微等待
multiplier = 1.1
else:
multiplier = 1.0
# 连续失败次数调整(幅度更小)
if consecutive_failures >= 2:
multiplier *= 1.1
final_delay = min(int(base_delay * multiplier), MAX_RETRY_DELAY)
return max(final_delay, 1) # 最少等待1秒
================================================
FILE: src/utils/draft_cache.py
================================================
from collections import OrderedDict
import src.pyJianYingDraft as draft
from typing import Dict
# Modify global variable, use OrderedDict to implement LRU cache, limit the maximum number to 10000
DRAFT_CACHE: Dict[str, 'draft.ScriptFile'] = OrderedDict() # Use Dict for type hinting
MAX_CACHE_SIZE = 100
def update_cache(key: str, value: draft.ScriptFile) -> None:
"""Update LRU cache"""
if key in DRAFT_CACHE:
# 如果当前key已经存在,就删除旧的
DRAFT_CACHE.pop(key)
elif len(DRAFT_CACHE) >= MAX_CACHE_SIZE:
print(f"{key}, Cache is full, deleting the least recently used item")
# 如果缓存已满,就删除最近最少使用的项(即第一个项)
DRAFT_CACHE.popitem(last=False)
# 添加到缓存的末尾(最近使用的)
DRAFT_CACHE[key] = value
================================================
FILE: src/utils/draft_cleanup.py
================================================
"""
草稿目录定期清理:超出数量上限时按创建时间从旧到新删除目录,并跳过受保护、
已加锁、仍在内存缓存中的草稿,避免影响正常读写。
"""
from __future__ import annotations
import asyncio
import datetime
import os
import re
import shutil
from typing import Iterable, Optional
import config
from src.utils.draft_cache import DRAFT_CACHE
from src.utils.draft_lock_manager import get_draft_lock_manager
from src.utils.logger import logger
# 草稿清理策略(本模块内定义;保留数量可由环境变量 DRAFT_CLEANUP_MAX_DRAFT_COUNT 覆盖,默认 1000)
DRAFT_CLEANUP_MAX_DRAFT_COUNT = max(0, int(os.getenv("DRAFT_CLEANUP_MAX_DRAFT_COUNT", "1000")))
DRAFT_CLEANUP_INTERVAL_SECONDS = 3600
DRAFT_CLEANUP_PROTECTED_DRAFT_IDS = frozenset(
{
"20251204214904ccb1af38",
"2025120421372636a27729",
}
)
_DRAFT_ID_RE = re.compile(r"^\d{14}[a-f0-9]{8}$")
def is_draft_directory_name(name: str) -> bool:
return bool(_DRAFT_ID_RE.match(name))
def _draft_sort_key(draft_id: str) -> tuple[datetime.datetime, str]:
ts = draft_id[:14]
dt = datetime.datetime.strptime(ts, "%Y%m%d%H%M%S")
return dt, draft_id
def list_sorted_draft_ids(draft_dir: str) -> list[str]:
if not os.path.isdir(draft_dir):
return []
names: list[str] = []
with os.scandir(draft_dir) as it:
for ent in it:
if ent.is_dir() and is_draft_directory_name(ent.name):
names.append(ent.name)
names.sort(key=_draft_sort_key)
return names
def select_drafts_for_deletion(
sorted_oldest_first: list[str], max_keep: int, skip_ids: set[str]
) -> list[str]:
n = len(sorted_oldest_first)
need = max(0, n - max_keep)
if need == 0:
return []
out: list[str] = []
for did in sorted_oldest_first:
if len(out) >= need:
break
if did in skip_ids:
continue
out.append(did)
return out
def delete_draft_folders(draft_dir: str, draft_ids: Iterable[str]) -> list[str]:
deleted: list[str] = []
for did in draft_ids:
path = os.path.join(draft_dir, did)
logger.info(
"DRAFT_CLEANUP_DELETE draft_id=%s path=%s action=shutil.rmtree",
did,
path,
)
try:
shutil.rmtree(path, ignore_errors=False)
deleted.append(did)
logger.info(
"DRAFT_CLEANUP_DELETED draft_id=%s path=%s status=success",
did,
path,
)
except OSError as e:
logger.warning(
"DRAFT_CLEANUP_DELETE_FAILED draft_id=%s path=%s error=%s",
did,
path,
e,
)
return deleted
def run_one_draft_cleanup(
draft_dir: Optional[str] = None,
max_keep: Optional[int] = None,
protected_ids: Optional[Iterable[str]] = None,
locked_ids: Optional[Iterable[str]] = None,
cached_ids: Optional[Iterable[str]] = None,
) -> list[str]:
base = draft_dir if draft_dir is not None else config.DRAFT_DIR
limit = max_keep if max_keep is not None else DRAFT_CLEANUP_MAX_DRAFT_COUNT
protected = frozenset(
protected_ids
if protected_ids is not None
else DRAFT_CLEANUP_PROTECTED_DRAFT_IDS
)
locked = (
set(locked_ids)
if locked_ids is not None
else set(get_draft_lock_manager().get_all_locked_drafts())
)
cached = set(cached_ids) if cached_ids is not None else set(DRAFT_CACHE.keys())
skip = set(protected) | locked | cached
sorted_ids = list_sorted_draft_ids(base)
to_remove = select_drafts_for_deletion(sorted_ids, limit, skip)
if not to_remove:
reason = "under_limit" if len(sorted_ids) <= limit else "all_excess_protected_or_active"
logger.info(
"DRAFT_CLEANUP_SKIP total_drafts=%s max_keep=%s skip_count=%s reason=%s",
len(sorted_ids),
limit,
len(skip),
reason,
)
return []
logger.info(
"DRAFT_CLEANUP_PLAN total_drafts=%s max_keep=%s to_delete=%s protected=%s locked=%s cached=%s",
len(sorted_ids),
limit,
len(to_remove),
len(protected),
len(locked),
len(cached),
)
return delete_draft_folders(base, to_remove)
async def draft_cleanup_background_loop() -> None:
interval = DRAFT_CLEANUP_INTERVAL_SECONDS
while True:
try:
run_one_draft_cleanup()
except Exception:
logger.exception("DRAFT_CLEANUP_ERROR phase=run_one_draft_cleanup")
await asyncio.sleep(interval)
================================================
FILE: src/utils/draft_downloader.py
================================================
"""
草稿下载工具
用于从API下载草稿文件并保存到指定目录
"""
import os
import re
import json
import time
import requests
from urllib.parse import urlparse, parse_qs
from typing import Optional, Dict, Any, List
from src.utils.logger import logger
import config
import subprocess
import os
_REQUEST_CONNECT_TIMEOUT = 10
_REQUEST_READ_TIMEOUT = 30
_MAX_RETRIES = 5
# 网关/上游暂不可用,适合退避重试(含用户关心的 503)
_RETRYABLE_GATEWAY_HTTP_STATUSES = frozenset({502, 503, 504})
def _sleep_gateway_backoff(retry_no: int) -> None:
"""网关类错误退避:1s 起指数增长,上限 32s。retry_no 为从 1 开始的本次重试序号。"""
delay = min(2 ** (retry_no - 1), 32)
time.sleep(delay)
def safe_write_file(file_path: str, file_content: bytes, is_binary: bool = True):
"""
安全写入文件,使用 O_EXCL 标志确保原子创建
Args:
file_path: 文件路径
file_content: 文件内容
is_binary: 是否为二进制内容
"""
# 使用 O_EXCL 标志确保原子创建
if is_binary:
flags = os.O_CREAT | os.O_EXCL | os.O_RDWR | getattr(os, "O_BINARY", 0)
else:
flags = os.O_CREAT | os.O_EXCL | os.O_RDWR
try:
fd = os.open(file_path, flags)
# 写入内容
if file_content:
if isinstance(file_content, str):
os.write(fd, file_content.encode('utf-8'))
else:
os.write(fd, file_content)
# 强制同步到磁盘
os.fsync(fd)
os.close(fd)
except FileExistsError:
# 如果文件已存在,先删除再重新创建
if os.path.exists(file_path):
os.remove(file_path)
fd = os.open(file_path, flags)
# 写入内容
if file_content:
if isinstance(file_content, str):
os.write(fd, file_content.encode('utf-8'))
else:
os.write(fd, file_content)
# 强制同步到磁盘
os.fsync(fd)
os.close(fd)
def extract_draft_id_from_url(url: str) -> Optional[str]:
"""
从URL中提取draft_id参数
Args:
url: 草稿URL
Returns:
draft_id: 草稿ID,如果找不到则返回None
"""
try:
parsed_url = urlparse(url)
query_params = parse_qs(parsed_url.query)
draft_ids = query_params.get('draft_id', [])
return draft_ids[0] if draft_ids else None
except Exception as e:
logger.error(f"Failed to parse URL: {url}, error: {e}")
return None
def download_draft(draft_url: str, save_path: Optional[str] = None) -> bool:
"""
下载草稿文件到指定目录
Args:
draft_url: 草稿URL
save_path: 保存路径,默认为config.DRAFT_SAVE_PATH
Returns:
bool: 下载是否成功
"""
# 提取draft_id
draft_id = extract_draft_id_from_url(draft_url)
if not draft_id:
logger.error(f"Cannot extract draft_id from URL: {draft_url}")
return False
# 设置保存路径
if save_path is None:
save_path = config.DRAFT_SAVE_PATH
# 构建并创建目标目录
target_dir = prepare_target_directory(save_path, draft_id)
logger.info(f"Downloading draft {draft_id} to {target_dir}")
# 获取草稿文件列表
files = get_draft_files_list(draft_url)
if not files:
logger.error(f"Cannot get draft file list: {draft_id}")
return False
# 下载所有文件
return download_all_files(files, target_dir, draft_id)
def get_draft_files_list(draft_url: str) -> list:
"""
获取草稿文件列表
Args:
draft_url: 草稿URL
Returns:
list: 文件URL列表
"""
for attempt in range(_MAX_RETRIES + 1):
try:
response = requests.get(
draft_url,
timeout=(_REQUEST_CONNECT_TIMEOUT, _REQUEST_READ_TIMEOUT),
)
if response.status_code != 200:
if (
response.status_code in _RETRYABLE_GATEWAY_HTTP_STATUSES
and attempt < _MAX_RETRIES
):
retry_no = attempt + 1
logger.warning(
"Gateway HTTP %s while fetching draft file list, retry (%s/%s)",
response.status_code,
retry_no,
_MAX_RETRIES,
)
response.close()
_sleep_gateway_backoff(retry_no)
continue
logger.error(
f"Failed to get draft file list, HTTP status: {response.status_code}"
)
response.close()
return []
# 解析JSON响应
try:
json_data = response.json()
except json.JSONDecodeError as e:
logger.error(f"Failed to parse draft list JSON: {e}")
return []
# 检查响应状态
if json_data.get('code') != 0:
logger.error(
f"Failed to get draft file list: {json_data.get('message', 'unknown error')}"
)
return []
# 返回files列表
files = json_data.get('files', [])
logger.info(f"Fetched {len(files)} draft file(s)")
return files
except requests.exceptions.RequestException as e:
if attempt >= _MAX_RETRIES:
logger.error(
f"Network error while fetching draft file list after {_MAX_RETRIES} retries: {e}"
)
return []
retry_no = attempt + 1
backoff_seconds = retry_no
logger.warning(
f"Network error while fetching draft file list, retry ({retry_no}/{_MAX_RETRIES}): {e}"
)
time.sleep(backoff_seconds)
except Exception as e:
logger.error(f"Unexpected error while fetching draft file list: {e}")
return []
def download_all_files(files: list, target_dir: str, draft_id: str) -> bool:
"""
下载所有草稿文件
Args:
files: 文件URL列表
target_dir: 目标目录
draft_id: 草稿ID
Returns:
bool: 是否全部下载成功
"""
success_count = 0
total_files = len(files)
for file_url in files:
if download_single_file(file_url, target_dir):
success_count += 1
else:
logger.error(f"Failed to download file: {file_url}")
trigger_directory_scan_with_robocopy(target_dir)
logger.info(
f"Draft {draft_id} download finished: total={total_files}, "
f"ok={success_count}, failed={total_files - success_count}"
)
return success_count == total_files
def download_single_file(file_url: str, target_dir: str) -> bool:
"""
下载单个文件并保持目录结构
Args:
file_url: 文件URL
target_dir: 目标目录
Returns:
bool: 是否下载成功
"""
max_retries = 5
retry_count = 0
# 仅从 URL 解析目标路径,避免请求挂起时无效等待;与原先路径规则一致
parsed_url = urlparse(file_url)
path_parts = parsed_url.path.split("/")
url_draft_id = None
for part in path_parts:
if re.match(r"^\d{8,}.*$", part) and len(part) >= 10:
url_draft_id = part
break
draft_id_index = -1
if url_draft_id:
for i, part in enumerate(path_parts):
if url_draft_id in part:
draft_id_index = i
break
if draft_id_index != -1:
rel_path_parts = path_parts[draft_id_index + 1:]
rel_path = os.path.join(*rel_path_parts)
else:
rel_path = os.path.join(*path_parts[1:])
full_file_path = os.path.join(target_dir, rel_path)
while retry_count <= max_retries:
try:
response = requests.get(
file_url,
timeout=(_REQUEST_CONNECT_TIMEOUT, _REQUEST_READ_TIMEOUT),
stream=True,
)
try:
if response.status_code != 200:
if response.status_code in _RETRYABLE_GATEWAY_HTTP_STATUSES:
retry_count += 1
if retry_count > max_retries:
logger.error(
"Gateway HTTP %s, download failed after %s retries, URL: %s",
response.status_code,
max_retries,
file_url,
)
return False
logger.warning(
"Gateway HTTP %s, retry (%s/%s), URL: %s",
response.status_code,
retry_count,
max_retries,
file_url,
)
_sleep_gateway_backoff(retry_count)
continue
logger.error(
f"Download failed, HTTP status: {response.status_code}, URL: {file_url}"
)
return False
parent_dir = os.path.dirname(full_file_path)
if parent_dir:
os.makedirs(parent_dir, exist_ok=True)
with open(full_file_path, "wb") as out:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
out.write(chunk)
finally:
response.close()
# draft_info / draft_content:路径重写与 URL 素材本地化;失败则本文件下载失败
if full_file_path.endswith(("draft_info.json", "draft_content.json")):
if not update_json_file_paths(full_file_path, target_dir, url_draft_id):
return False
return True
except requests.exceptions.RequestException as e:
retry_count += 1
if retry_count > max_retries:
logger.error(
f"Network error, download failed after {max_retries} retries: {e}, URL: {file_url}"
)
return False
else:
logger.warning(
f"Network error, retry ({retry_count}/{max_retries}): {e}, URL: {file_url}"
)
time.sleep(1 * retry_count) # 递增延迟
except OSError as e:
logger.error(f"File write error, download failed: {e}, URL: {file_url}")
return False
except Exception as e:
logger.error(f"Unexpected error while downloading file: {e}, URL: {file_url}")
return False
def update_json_file_paths(json_file_path: str, target_dir: str, draft_id: str) -> bool:
"""将服务端路径前缀换成本地,并下载 materials 中的 URL 素材;失败返回 False。"""
try:
# 读取JSON文件
with open(json_file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 构造替换路径
remote_prefix = f"/app/output/draft/{draft_id}/"
local_prefix = os.path.join(config.DRAFT_SAVE_PATH, draft_id).replace('/', os.sep) + os.sep
# 更新数据中的路径(服务端草稿内本地路径 -> 客户端目标路径)
updated_data = update_material_paths(data, remote_prefix, local_prefix)
# materials 中仍为 URL 的 path:下载到本地并回写;任一失败则整稿失败且不写回
if not localize_remote_material_paths(updated_data, target_dir):
logger.error(
f"Remote material localization failed after retries; skip JSON update: {json_file_path}"
)
return False
# 写回 JSON
json_content = json.dumps(updated_data, ensure_ascii=False, indent=2)
safe_write_file(json_file_path, json_content, is_binary=False)
logger.debug(f"Updated paths in JSON file: {json_file_path}")
return True
except json.JSONDecodeError as e:
logger.error(f"JSON decode error: {e}, file: {json_file_path}")
return False
except Exception as e:
logger.error(f"Failed to update JSON paths: {e}, file: {json_file_path}")
return False
def update_material_paths(data, remote_prefix: str, local_prefix: str):
"""
更新材料路径,处理JSON中materials下的音频和视频路径
Args:
data: JSON数据
remote_prefix: 远程路径前缀
local_prefix: 本地路径前缀
Returns:
更新后的数据
"""
if isinstance(data, dict):
# 检查是否是materials结构
if 'materials' in data:
materials = data.get('materials', {})
if isinstance(materials, dict):
# 处理音频和视频路径
audios = materials.get('audios', [])
videos = materials.get('videos', [])
# 更新音频路径
for audio in audios:
if isinstance(audio, dict) and 'path' in audio:
audio['path'] = update_single_path(audio['path'], remote_prefix, local_prefix)
# 更新视频路径
for video in videos:
if isinstance(video, dict) and 'path' in video:
video['path'] = update_single_path(video['path'], remote_prefix, local_prefix)
# 递归处理其他键值
updated_dict = {}
for key, value in data.items():
updated_dict[key] = update_material_paths(value, remote_prefix, local_prefix)
return updated_dict
elif isinstance(data, list):
# 处理列表中的每个元素
return [update_material_paths(item, remote_prefix, local_prefix) for item in data]
elif isinstance(data, str):
# 检查是否是以远程路径开头的路径
if data.startswith(remote_prefix):
# 提取远程前缀后的相对路径部分
relative_path = data[len(remote_prefix):]
# 将相对路径部分从Linux风格转换为Windows风格
relative_path_windows = relative_path.replace('/', os.sep)
# 组合成本地路径
new_path = local_prefix + relative_path_windows
# 验证文件是否存在
if not os.path.exists(new_path):
logger.warning(f"File missing after path rewrite: {new_path}")
return new_path
return data
else:
# 其他类型的数据保持不变
return data
def update_single_path(path: str, remote_prefix: str, local_prefix: str) -> str:
"""
更新单个路径值
Args:
path: 原始路径
remote_prefix: 远程路径前缀
local_prefix: 本地路径前缀
Returns:
更新后的路径
"""
if isinstance(path, str) and path.startswith(remote_prefix):
# 提取远程前缀后的相对路径部分
relative_path = path[len(remote_prefix):]
# 将相对路径部分从Linux风格转换为Windows风格
relative_path_windows = relative_path.replace('/', os.sep)
# 组合成本地路径
new_path = local_prefix + relative_path_windows
return new_path
return path
def _is_http_url(value: Any) -> bool:
if not isinstance(value, str) or not value:
return False
parsed = urlparse(value)
return parsed.scheme in ("http", "https") and bool(parsed.netloc)
def _safe_name(name: str) -> str:
return re.sub(r'[\\/:*?"<>|]+', "_", name).strip(" .") or "material"
def _infer_local_subdir(material_type: str, material: Dict[str, Any]) -> str:
if material_type == "audios":
return "audios"
if material_type == "videos":
return "images" if material.get("type") == "photo" else "videos"
return "misc"
def _infer_ext_from_url(url: str, fallback: str) -> str:
try:
ext = os.path.splitext(urlparse(url).path)[1]
return ext if ext else fallback
except Exception:
return fallback
def _download_remote_file(file_url: str, local_path: str) -> bool:
"""下载单个 URL 素材;网络异常或非 200 时最多重试 _MAX_RETRIES 次。"""
for attempt in range(_MAX_RETRIES + 1):
try:
response = requests.get(
file_url,
timeout=(_REQUEST_CONNECT_TIMEOUT, _REQUEST_READ_TIMEOUT),
stream=True,
)
if response.status_code != 200:
if attempt >= _MAX_RETRIES:
logger.error(
f"Remote material download failed (HTTP {response.status_code}) "
f"after {_MAX_RETRIES} retries: {file_url}"
)
return False
retry_no = attempt + 1
logger.warning(
f"Remote material download non-200, retry ({retry_no}/{_MAX_RETRIES}): {file_url}"
)
if response.status_code in _RETRYABLE_GATEWAY_HTTP_STATUSES:
_sleep_gateway_backoff(retry_no)
else:
time.sleep(retry_no)
response.close()
continue
parent_dir = os.path.dirname(local_path)
if parent_dir:
os.makedirs(parent_dir, exist_ok=True)
with open(local_path, "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
return True
except requests.exceptions.RequestException as e:
if attempt >= _MAX_RETRIES:
logger.error(
f"Remote material download failed after {_MAX_RETRIES} retries: {file_url}, error: {e}"
)
return False
retry_no = attempt + 1
logger.warning(
f"Remote material download network error, retry ({retry_no}/{_MAX_RETRIES}): "
f"{file_url}, {e}"
)
time.sleep(retry_no)
except OSError as e:
logger.error(f"Failed to write remote material to disk: {local_path}, {e}")
return False
return False
def localize_remote_material_paths(data: Dict[str, Any], target_dir: str) -> bool:
"""
将 materials 里仍为 URL 的 path 下载到本地并回写。
同一 URL 只拉取一次;任一 URL 重试仍失败则返回 False,且不写 JSON(由上层中止下载与导出)。
"""
materials = data.get("materials", {}) if isinstance(data, dict) else {}
if not isinstance(materials, dict):
return True
url_cache: Dict[str, str] = {}
failed_urls: set = set()
target_lists: Dict[str, List[Dict[str, Any]]] = {
"audios": materials.get("audios", []),
"videos": materials.get("videos", []),
}
for material_type, items in target_lists.items():
if not isinstance(items, list):
continue
for item in items:
if not isinstance(item, dict):
continue
remote_path = item.get("path")
if not _is_http_url(remote_path):
continue
if remote_path in failed_urls:
continue
if remote_path in url_cache:
item["path"] = url_cache[remote_path]
continue
sub_dir = _infer_local_subdir(material_type, item)
fallback_ext = ".mp3" if material_type == "audios" else ".mp4"
ext = _infer_ext_from_url(remote_path, fallback_ext)
base_name = _safe_name(str(item.get("material_name") or item.get("name") or item.get("id") or "material"))
filename = base_name if base_name.lower().endswith(ext.lower()) else f"{base_name}{ext}"
local_path = os.path.join(target_dir, "assets", sub_dir, filename)
if not _download_remote_file(remote_path, local_path):
failed_urls.add(remote_path)
logger.error(
f"Remote material localization failed (draft download will fail): {remote_path}"
)
continue
logger.info(f"Remote material saved and path updated: {remote_path} -> {local_path}")
item["path"] = local_path
url_cache[remote_path] = local_path
return len(failed_urls) == 0
def trigger_directory_scan_with_robocopy(target_dir: str):
"""
使用robocopy触发目录扫描,专门用于激活剪映的目录发现机制
Args:
target_dir: 目录路径
"""
if target_dir and os.path.exists(target_dir):
# 使用robocopy复制目录以触发剪映的目录扫描机制
copy_with_robocopy(target_dir, target_dir + ".tmp")
# 清理临时目录
tmp_dir = target_dir + ".tmp"
if os.path.exists(tmp_dir):
try:
import shutil
shutil.rmtree(tmp_dir)
except Exception as e:
logger.warning(f"Failed to remove temp directory {tmp_dir}: {e}")
def copy_with_robocopy(src: str, dst: str, verbose: bool = False) -> bool:
"""
使用robocopy复制目录,参数已验证可用
参数:
src: 源目录路径
dst: 目标目录路径
verbose: 是否显示详细输出,默认为False
返回:
成功返回True,失败返回False
robocopy参数说明:
/E: 复制所有子目录,包括空目录(递归复制)
/COPY:DAT: 复制数据、属性和时间戳(无需管理员权限)
/R:1: 失败重试1次
/W:1: 重试等待1秒
/NP: 不显示进度百分比(静默模式)
/NJH: 不显示作业头(静默模式)
/NJS: 不显示作业摘要(静默模式)
"""
# 确保路径是字符串类型
src = str(src)
dst = str(dst)
# 检查源目录是否存在
if not os.path.exists(src):
logger.error(f"Source directory does not exist - {src}")
return False
# 构建robocopy命令 - 使用已验证的参数组合
cmd = [
"robocopy",
src,
dst,
"/E", # 递归复制所有子目录
"/COPY:DAT", # 复制数据、属性和时间戳(无需管理员权限)
"/R:1", # 失败重试1次
"/W:1", # 重试等待1秒
"/NP", # 不显示进度百分比
"/NJH", # 不显示作业头
"/NJS", # 不显示作业摘要
]
if verbose:
logger.info(f"Executing command: {' '.join(cmd)}")
# 在verbose模式下,不添加静默参数,以便看到输出
cmd = cmd[:-3] # 移除/NP, /NJH, /NJS参数
try:
if verbose:
# 详细模式下,实时输出结果
logger.info(f"Starting copy: {src} → {dst}")
logger.info("-" * 50)
result = subprocess.run(
cmd,
capture_output=False, # 实时显示输出
text=True,
check=False,
encoding='gbk' # Windows命令行通常使用GBK编码
)
# 获取返回码
return_code = result.returncode
logger.info("-" * 50)
else:
# 静默模式下,捕获输出但不显示
result = subprocess.run(
cmd,
capture_output=True,
text=True,
check=False,
encoding='gbk'
)
return_code = result.returncode
# 即使静默模式,如果出错也要显示错误
if return_code >= 8:
logger.error(f"Copy failed! Return code: {return_code}")
if result.stderr:
logger.error(f"Error message: {result.stderr}")
elif result.stdout:
logger.error(f"Output message: {result.stdout}")
# robocopy返回码处理:
# 0-7: 成功或部分成功(0=无变化,1-7=有文件操作)
# 8+: 严重错误
if return_code <= 7:
if verbose:
logger.info(f"Copy completed! Return code: {return_code}")
if return_code == 0:
logger.info("Return code 0 means no files need to be copied (source and target are the same)")
elif return_code == 1:
logger.info("Return code 1 means some files were successfully copied")
elif return_code == 2:
logger.info("Return code 2 means some files were skipped (may be temporary files or inaccessible)")
elif return_code == 3:
logger.info("Return code 3 means some files were copied and some were skipped")
return True
else:
# 返回码8+表示有严重错误
error_messages = {
8: "Files/directories copy failed",
9: "Parameter error",
10: "Source directory does not exist or no access permission",
11: "Target directory creation failed",
12: "File is in use and cannot be copied",
13: "Insufficient disk space",
14: "Source is a file instead of a directory",
15: "Target is a file instead of a directory",
16: "General error"
}
error_msg = error_messages.get(return_code, f"Unknown error (return code: {return_code})")
logger.error(f"Copy failed! {error_msg}")
# 显示更多信息(如果有)
if not verbose and result.stderr:
logger.error(f"Detailed error: {result.stderr}")
return False
except FileNotFoundError:
logger.error("Error: robocopy command not found. Please ensure running on Windows system.")
logger.info("Hint: robocopy is a built-in tool for Windows Vista and later versions.")
return False
except Exception as e:
logger.error(f"An unknown error occurred during execution: {e}")
return False
def prepare_target_directory(save_path: str, draft_id: str) -> str:
"""
准备目标下载目录
Args:
save_path: 基础保存路径
draft_id: 草稿ID
Returns:
str: 目标目录路径
"""
target_dir = os.path.join(save_path, draft_id)
os.makedirs(target_dir, exist_ok=True)
return target_dir
def execute_download(draft_url: str, target_dir: str, draft_id: str) -> bool:
"""
执行下载操作
Args:
draft_url: 草稿URL
target_dir: 目标目录
draft_id: 草稿ID
Returns:
bool: 下载是否成功
"""
try:
response = requests.get(
draft_url,
timeout=(_REQUEST_CONNECT_TIMEOUT, _REQUEST_READ_TIMEOUT),
stream=True,
)
try:
if response.status_code != 200:
logger.error(f"Draft download failed: {draft_id}, HTTP status: {response.status_code}")
return False
file_path = get_file_path(response, target_dir, draft_id)
parent_dir = os.path.dirname(file_path)
if parent_dir:
os.makedirs(parent_dir, exist_ok=True)
with open(file_path, "wb") as out:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
out.write(chunk)
logger.info(f"Draft downloaded: {file_path}")
return True
finally:
response.close()
except requests.exceptions.RequestException as e:
logger.error(f"Network error, draft download failed: {draft_id}, error: {e}")
return False
except IOError as e:
logger.error(f"File write error, draft download failed: {draft_id}, error: {e}")
return False
except Exception as e:
logger.error(f"Unexpected error, draft download failed: {draft_id}, error: {e}")
return False
def get_file_path(response: requests.Response, target_dir: str, draft_id: str) -> str:
"""
根据响应头或默认规则确定文件路径
Args:
response: HTTP响应对象
target_dir: 目标目录
draft_id: 草稿ID
Returns:
str: 完整的文件路径
"""
filename = extract_filename_from_response(response, draft_id)
filename = sanitize_filename(filename)
return os.path.join(target_dir, filename)
def extract_filename_from_response(response: requests.Response, draft_id: str) -> str:
"""
从HTTP响应头中提取文件名
Args:
response: HTTP响应对象
draft_id: 草稿ID
Returns:
str: 文件名
"""
content_disposition = response.headers.get('content-disposition', '')
if content_disposition:
import re
fname_match = re.search(r'filename[^;=\n]*=(([\'\"]).*?\2|[^;\n]*)', content_disposition)
if fname_match:
return fname_match.group(1).strip('\'"')
# 如果没有从响应头获取到文件名,使用默认名称
return f"{draft_id}.draft"
def sanitize_filename(filename: str) -> str:
"""
清理文件名,移除不安全的字符
Args:
filename: 原始文件名
Returns:
str: 清理后的文件名
"""
# 替换不安全的字符
unsafe_chars = ['<', '>', ':', '"', '|', '?', '*']
safe_filename = filename
for char in unsafe_chars:
safe_filename = safe_filename.replace(char, '_')
# 移除开头和结尾的空格和点号
safe_filename = safe_filename.strip(' .')
return safe_filename
def batch_download_drafts(draft_urls: list, save_path: Optional[str] = None) -> dict:
"""
批量下载草稿
Args:
draft_urls: 草稿URL列表
save_path: 保存路径
Returns:
dict: 包含成功和失败统计的字典
"""
results = initialize_batch_results()
for url in draft_urls:
process_single_draft(url, save_path, results)
finalize_batch_results(results, draft_urls)
return results
def initialize_batch_results() -> dict:
"""
初始化批量下载结果字典
Returns:
dict: 初始化的结果字典
"""
return {
'success': [],
'failure': [],
'summary': {}
}
def process_single_draft(url: str, save_path: Optional[str], results: dict) -> None:
"""
处理单个草稿下载
Args:
url: 草稿URL
save_path: 保存路径
results: 结果统计字典
"""
draft_id = extract_draft_id_from_url(url)
if draft_id and download_draft(url, save_path):
results['success'].append(draft_id)
logger.info(f"Batch download succeeded: {draft_id}")
else:
results['failure'].append({'url': url, 'draft_id': draft_id})
logger.error(f"Batch download failed: {draft_id or url}")
def finalize_batch_results(results: dict, draft_urls: list) -> None:
"""
完成批量下载结果统计
Args:
results: 结果统计字典
draft_urls: 草稿URL列表
"""
total = len(draft_urls)
success_count = len(results['success'])
failure_count = len(results['failure'])
results['summary'] = {
'total': total,
'success': success_count,
'failure': failure_count
}
logger.info(
f"Batch download finished: total={total}, ok={success_count}, failed={failure_count}"
)
================================================
FILE: src/utils/draft_lock_manager.py
================================================
"""
草稿并发锁管理器
用于防止同一草稿的并发写操作导致文件损坏
"""
import asyncio
import time
from typing import Dict, Optional
from src.utils.logger import logger
class DraftLockManager:
"""
草稿锁管理器 - 单例模式
功能:
1. 为每个草稿 ID 维护一个独立的锁
2. 支持异步获取和释放锁
3. 自动清理已释放的锁以节省内存
4. 提供锁状态查询功能
使用场景:
- add_videos: 防止并发写入同一草稿文件
- add_audios: 防止并发修改同一草稿配置
- save_draft: 防止并发保存导致数据丢失
"""
_instance = None
_init_lock = asyncio.Lock()
def __new__(cls):
"""确保单例模式"""
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
"""初始化管理器"""
# 如果已经初始化过,则跳过
if hasattr(self, '_initialized') and self._initialized:
return
# 存储每个草稿的锁:{draft_id: asyncio.Lock}
self._locks: Dict[str, asyncio.Lock] = {}
# 存储每个锁的持有者数量(用于引用计数)
self._lock_counts: Dict[str, int] = {}
# 诊断信息:记录最近持有者与持锁开始时间(用于定位“为什么会等满timeout”)
self._lock_owner: Dict[str, str] = {}
self._lock_acquired_at: Dict[str, float] = {}
# 初始化锁(用于保护_locks 字典的修改)
self._manager_lock = asyncio.Lock()
# 标记初始化完成
self._initialized = True
logger.info("DraftLockManager initialized")
async def acquire_lock(self, draft_id: str, timeout: Optional[float] = None) -> bool:
"""
获取指定草稿的锁
Args:
draft_id: 草稿 ID
timeout: 超时时间(秒),None 表示无限等待
Returns:
bool: 是否成功获取锁
Raises:
asyncio.TimeoutError: 等待超时时抛出
Example:
>>> lock_manager = DraftLockManager()
>>> success = await lock_manager.acquire_lock("2025092811473036584258", timeout=5.0)
>>> if success:
... try:
... # 执行草稿写操作
... pass
... finally:
... await lock_manager.release_lock("2025092811473036584258")
"""
async with self._manager_lock:
# 如果草稿 ID 没有锁,则创建新锁
if draft_id not in self._locks:
self._locks[draft_id] = asyncio.Lock()
self._lock_counts[draft_id] = 0
lock = self._locks[draft_id]
# 尝试获取锁(带超时)
wait_started_at = time.monotonic()
try:
if timeout is not None:
# 使用 wait_for 实现超时
await asyncio.wait_for(lock.acquire(), timeout=timeout)
else:
# 无限等待
await lock.acquire()
# 增加引用计数
async with self._manager_lock:
self._lock_counts[draft_id] = self._lock_counts.get(draft_id, 0) + 1
task = asyncio.current_task()
task_name = task.get_name() if task and hasattr(task, "get_name") else None
self._lock_owner[draft_id] = task_name or "unknown"
self._lock_acquired_at[draft_id] = time.monotonic()
waited = time.monotonic() - wait_started_at
logger.info(
f"Lock acquired for draft_id: {draft_id}, waited: {waited:.3f}s, count: {self._lock_counts[draft_id]}"
)
return True
except asyncio.TimeoutError:
waited = time.monotonic() - wait_started_at
async with self._manager_lock:
owner = self._lock_owner.get(draft_id)
acquired_at = self._lock_acquired_at.get(draft_id)
held_for = (time.monotonic() - acquired_at) if acquired_at else None
count = self._lock_counts.get(draft_id, 0)
locked = self._locks.get(draft_id).locked() if draft_id in self._locks else False
if held_for is not None:
logger.warning(
f"Timeout waiting for lock on draft_id: {draft_id}, waited: {waited:.3f}s, "
f"locked: {locked}, holders: {count}, owner: {owner}, held_for: {held_for:.3f}s"
)
else:
logger.warning(
f"Timeout waiting for lock on draft_id: {draft_id}, waited: {waited:.3f}s, "
f"locked: {locked}, holders: {count}, owner: {owner}"
)
raise
async def release_lock(self, draft_id: str) -> None:
"""
释放指定草稿的锁
Args:
draft_id: 草稿 ID
Raises:
RuntimeError: 当尝试释放未持有的锁时抛出
KeyError: 当草稿 ID 不存在时抛出
Example:
>>> lock_manager = DraftLockManager()
>>> await lock_manager.acquire_lock("draft-123")
>>> try:
... # 执行写操作
... pass
... finally:
... await lock_manager.release_lock("draft-123")
"""
async with self._manager_lock:
if draft_id not in self._locks:
raise KeyError(f"No lock found for draft_id: {draft_id}")
lock = self._locks[draft_id]
self._lock_counts[draft_id] = max(0, self._lock_counts.get(draft_id, 0) - 1)
acquired_at = self._lock_acquired_at.get(draft_id)
owner = self._lock_owner.get(draft_id)
# 释放锁(在 manager_lock 之外,避免死锁)
try:
lock.release()
held_for = (time.monotonic() - acquired_at) if acquired_at else None
logger.info(
f"Lock released for draft_id: {draft_id}, held_for: {held_for:.3f}s, owner: {owner}"
if held_for is not None else
f"Lock released for draft_id: {draft_id}, owner: {owner}"
)
except RuntimeError as e:
logger.error(f"Failed to release lock for draft_id {draft_id}: {str(e)}")
raise
finally:
async with self._manager_lock:
# 无持有者、未锁定、且无等待者时回收锁对象,避免 draft_id 维度常驻增长
lock_obj = self._locks.get(draft_id)
if lock_obj is not None:
waiters = getattr(lock_obj, "_waiters", None)
has_waiters = bool(waiters) if waiters is not None else False
if (
self._lock_counts.get(draft_id, 0) <= 0
and not lock_obj.locked()
and not has_waiters
):
self._locks.pop(draft_id, None)
self._lock_counts.pop(draft_id, None)
self._lock_owner.pop(draft_id, None)
self._lock_acquired_at.pop(draft_id, None)
def is_locked(self, draft_id: str) -> bool:
"""
检查指定草稿是否被锁定
Args:
draft_id: 草稿 ID
Returns:
bool: 如果草稿被锁定返回 True,否则返回 False
Example:
>>> lock_manager = DraftLockManager()
>>> await lock_manager.acquire_lock("draft-123")
>>> print(lock_manager.is_locked("draft-123")) # True
>>> await lock_manager.release_lock("draft-123")
>>> print(lock_manager.is_locked("draft-123")) # False
"""
if draft_id not in self._locks:
return False
return self._locks[draft_id].locked()
def get_lock_count(self, draft_id: str) -> int:
"""
获取指定草稿的锁持有计数
Args:
draft_id: 草稿 ID
Returns:
int: 锁持有次数(重入次数)
Example:
>>> lock_manager = DraftLockManager()
>>> await lock_manager.acquire_lock("draft-123")
>>> print(lock_manager.get_lock_count("draft-123")) # 1
"""
return self._lock_counts.get(draft_id, 0)
def get_all_locked_drafts(self) -> list:
"""
获取所有当前被锁定的草稿 ID 列表
Returns:
list: 被锁定的草稿 ID 列表
Example:
>>> lock_manager = DraftLockManager()
>>> await lock_manager.acquire_lock("draft-123")
>>> locked = lock_manager.get_all_locked_drafts()
>>> print(locked) # ["draft-123"]
"""
return [
draft_id for draft_id, lock in self._locks.items()
if lock.locked()
]
async def clear_all_locks(self) -> None:
"""
清除所有锁(仅在紧急情况下使用)
Warning: 此方法会强制释放所有锁,可能导致数据不一致
仅应在系统异常或死锁检测时使用
Example:
>>> lock_manager = DraftLockManager()
>>> # 检测到死锁时
>>> await lock_manager.clear_all_locks()
"""
async with self._manager_lock:
released_count = len(self._locks)
self._locks.clear()
self._lock_counts.clear()
if released_count > 0:
logger.warning(f"Cleared all locks, released {released_count} locks")
def get_stats(self) -> dict:
"""
获取锁管理器统计信息
Returns:
dict: 包含锁统计信息的字典
Example:
>>> lock_manager = DraftLockManager()
>>> stats = lock_manager.get_stats()
>>> print(stats) # {"total_locks": 5, "locked_drafts": 2}
"""
locked_count = sum(1 for lock in self._locks.values() if lock.locked())
return {
"total_locks": len(self._locks),
"locked_drafts": locked_count,
"total_holders": sum(self._lock_counts.values())
}
# 全局单例
_draf_lock_manager: Optional[DraftLockManager] = None
def get_draft_lock_manager() -> DraftLockManager:
"""
获取全局草稿锁管理器实例
Returns:
DraftLockManager: 单例锁管理器实例
Example:
>>> lock_manager = get_draft_lock_manager()
>>> await lock_manager.acquire_lock("draft-123")
"""
global _draf_lock_manager
if _draf_lock_manager is None:
_draf_lock_manager = DraftLockManager()
return _draf_lock_manager
================================================
FILE: src/utils/helper.py
================================================
from urllib.parse import urlparse, parse_qs
import os
import requests
import mimetypes
import datetime
import uuid
from pathlib import Path
from src.utils.logger import logger
from exceptions import CustomException, CustomError
import config
def get_url_param(url: str, key: str, default=None):
"""
从 URL 中提取指定查询参数的值(返回第一个值)。
若参数不存在,返回 default。
"""
query = parse_qs(urlparse(url).query)
return query.get(key, [default])[0]
def gen_unique_id() -> str:
"""
生成唯一ID
"""
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
unique_id = uuid.uuid4().hex[:8]
return f"{timestamp}{unique_id}"
def get_all_files(dir: str) -> list:
"""
使用 pathlib.Path.rglob() 递归获取目录下所有文件的路径列表。
参数:
dir (str): 要遍历的目录路径。
返回:
list: 包含所有文件完整路径的列表。
"""
path_obj = Path(dir)
# 检查目录是否存在
if not path_obj.exists():
return []
# 使用 rglob('*') 递归匹配所有条目,并用 is_file() 过滤出文件
file_list = [str(file_path) for file_path in path_obj.rglob('*') if file_path.is_file()]
return file_list
================================================
FILE: src/utils/keyframe_value.py
================================================
"""关键帧属性值的归一化工具(与 pyJianYingDraft / keyframes_infos 约定一致)。"""
POSITION_X = "KFTypePositionX"
POSITION_Y = "KFTypePositionY"
# |value| <= 1 视为已归一化(剪映半画布单位);> 1 视为像素位移(与 transform_x 一致)
_NORMALIZED_POSITION_MAX = 1.0
def normalize_keyframe_value(
ctype: str,
value: float,
width: int | None = None,
height: int | None = None,
*,
assume_pixel: bool = False,
) -> float:
"""
将关键帧属性值转换为剪映草稿内部单位。
位置类关键帧(KFTypePositionX/Y)在剪映中为「UI 显示像素值 / 画布宽(高)」,
与 add_videos/add_images 中 transform_x / draft_width 的换算一致。
Args:
assume_pixel: True 时只要提供了 width/height 就按像素换算(keyframes_infos);
False 时仅当 |value| > 1 时按像素换算(add_keyframes,兼容已归一化的 -1~1)。
"""
if ctype == POSITION_X and width is not None and width > 0:
if assume_pixel or abs(value) > _NORMALIZED_POSITION_MAX:
return value / width
elif ctype == POSITION_Y and height is not None and height > 0:
if assume_pixel or abs(value) > _NORMALIZED_POSITION_MAX:
return value / height
return value
================================================
FILE: src/utils/logger.py
================================================
from logging.config import dictConfig
from typing import Optional
import logging
import os
import config
LOG_DIR = config.LOG_DIR
LOG_FILE = os.path.join(LOG_DIR, "capcut-mate.log")
LOG_MAX_BYTES = 20 * 1024 * 1024 # 20MB
LOG_BACKUP_COUNT = 10
os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
class SkipGenVideoStatusAccessLogFilter(logging.Filter):
"""Drop uvicorn access lines for gen_video_status (high-frequency polling floods the console)."""
_PATH_FRAGMENT = "/gen_video_status"
def filter(self, record: logging.LogRecord) -> bool:
return self._PATH_FRAGMENT not in record.getMessage()
class RelativePathFormatter(logging.Formatter):
def __init__(self, *args, project_root: Optional[str] = None, **kwargs):
super().__init__(*args, **kwargs)
# 把项目根目录传进来
self.project_root = project_root or os.getcwd()
def format(self, record: logging.LogRecord) -> str:
record.rel_path = os.path.relpath(record.pathname, self.project_root)
return super().format(record)
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"default": {
"()": RelativePathFormatter,
"fmt": "%(asctime)s.%(msecs)03d | %(levelname)s | %(trace_id)s | %(name)s | %(rel_path)s:%(lineno)d | %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S",
},
},
"handlers": {
"default": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout",
},
"file": {
"formatter": "default",
"class": "logging.handlers.RotatingFileHandler",
"filename": LOG_FILE,
"maxBytes": LOG_MAX_BYTES,
"backupCount": LOG_BACKUP_COUNT,
"encoding": "utf-8",
},
},
"loggers": {
"uvicorn": {"handlers": ["default", "file"], "level": "INFO", "propagate": False},
"uvicorn.error": {"handlers": ["default", "file"], "level": "INFO", "propagate": False},
"uvicorn.access": {"handlers": ["default", "file"], "level": "INFO", "propagate": False},
"src.utils.logger": {"handlers": ["default", "file"], "level": "INFO", "propagate": False}
},
}
dictConfig(LOGGING_CONFIG)
def _install_trace_context_filters() -> None:
"""dictConfig 之后注册,避免字符串解析 Filter 时在包未加载完的情况下循环导入。"""
from src.utils.trace_context import TraceContextFilter
filt = TraceContextFilter()
for log_name in ("uvicorn", "uvicorn.error", "uvicorn.access", "src.utils.logger"):
for h in logging.getLogger(log_name).handlers:
h.addFilter(filt)
_install_trace_context_filters()
logging.getLogger("uvicorn.access").addFilter(SkipGenVideoStatusAccessLogFilter())
logger = logging.getLogger(__name__)
================================================
FILE: src/utils/media.py
================================================
import subprocess
import os
from typing import Optional
from src.utils.logger import logger
def get_media_duration(file_path: str) -> Optional[int]:
"""
获取音视频文件的时长,返回微秒数
Args:
file_path (str): 音视频文件的路径
Returns:
Optional[int]: 文件时长(微秒),如果获取失败则返回 None
Example:
duration_us = get_media_duration("test.mp3")
if duration_us:
print(f"文件时长: {duration_us} 微秒")
"""
try:
# 检查文件是否存在
if not os.path.exists(file_path):
logger.warning(f"文件不存在: {file_path}")
return None
# 使用 ffprobe 获取媒体信息
cmd = [
"ffprobe",
"-v", "error",
"-show_entries", "format=duration",
"-of", "default=noprint_wrappers=1:nokey=1",
file_path
]
# 执行命令并获取输出
result = subprocess.run(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
timeout=30 # 设置超时时间
)
# 检查命令执行是否成功
if result.returncode != 0:
logger.error(f"ffprobe 执行失败: {result.stderr}")
return None
# 解析输出
duration_str = result.stdout.strip()
if not duration_str:
logger.warning(f"未能获取到文件时长: {file_path}")
return None
# 转换为浮点数(秒)
duration_seconds = float(duration_str)
# 转换为微秒
duration_microseconds = int(duration_seconds * 1_000_000)
logger.info(f"文件 {file_path} 的时长: {duration_microseconds} 微秒")
return duration_microseconds
except subprocess.TimeoutExpired:
logger.error(f"ffprobe 执行超时: {file_path}")
return None
except ValueError as e:
logger.error(f"解析时长失败: {e}, 输出内容: {result.stdout if 'result' in locals() else 'N/A'}")
return None
except Exception as e:
logger.error(f"获取媒体文件时长时发生未知错误: {e}")
return None
def get_media_duration_formatted(file_path: str) -> Optional[str]:
"""
获取音视频文件的时长,返回格式化的字符串 (HH:MM:SS.mmm)
Args:
file_path (str): 音视频文件的路径
Returns:
Optional[str]: 格式化的时长字符串,如果获取失败则返回 None
"""
duration_us = get_media_duration(file_path)
if duration_us is None:
return None
# 转换为秒和毫秒
total_seconds = duration_us / 1_000_000
hours = int(total_seconds // 3600)
minutes = int((total_seconds % 3600) // 60)
seconds = int(total_seconds % 60)
milliseconds = int((total_seconds % 1) * 1000)
return f"{hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:03d}"
================================================
FILE: src/utils/oss.py
================================================
# 实现阿里云对象存储(OSS)的上传功能
import datetime
import os
import time
from typing import Optional
import config
from exceptions import CustomError, CustomException
from src.utils.logger import logger
from src.utils.storage_upload_retry import run_with_storage_retry
# oss2.resumable_upload:大于 1MB 走 Multipart(与 COS upload_file 默认 PartSize=1 行为一致:≤1MB 仍为单次 PutObject)
_OSS_MULTIPART_THRESHOLD_BYTES = 1024 * 1024 + 1
# 弱网可适当保留 2;并发过高易触发超时则改为 1
_OSS_MULTIPART_NUM_THREADS = 2
def oss_upload_file(file_path: str, expire_days: Optional[int] = None) -> str:
"""
上传文件到 OSS,返回带签名的临时URL,链接在指定天数后失效(见 config.VIDEO_GEN_RETENTION_DAYS)。
使用 oss2.resumable_upload:大于 1MB 时用分片(Multipart)上传并支持断点续传;≤1MB 仍为单次 PutObject。
Args:
file_path: 文件路径
expire_days: URL 有效期天数;为 None 时使用 config.VIDEO_GEN_RETENTION_DAYS(视频生成任务默认)
Returns:
str: 带签名的临时下载URL(有效期为 expire_days 天)
Raises:
CustomException: 上传失败
"""
if expire_days is None:
expire_days = config.VIDEO_GEN_RETENTION_DAYS
try:
import oss2
from oss2 import make_upload_store, resumable_upload
except ImportError as e:
logger.error(f"OSS SDK import failed: {e}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, "OSS SDK not installed")
now = datetime.datetime.now()
current_date = now.strftime("%Y-%m-%d")
current_hour = now.strftime("%H")
filename = os.path.basename(file_path)
key = f"{current_date}/{current_hour}/{filename}"
def do_upload() -> str:
expire_time = datetime.datetime.now() + datetime.timedelta(days=expire_days)
expire_time_str = expire_time.strftime("%Y-%m-%dT%H:%M:%S.000Z")
auth = oss2.Auth(config.OSS_ACCESS_KEY_ID, config.OSS_ACCESS_KEY_SECRET)
bucket = oss2.Bucket(auth, config.OSS_ENDPOINT, config.OSS_BUCKET_NAME)
os.makedirs(config.TEMP_DIR, exist_ok=True)
ckpt = make_upload_store(root=config.TEMP_DIR, dir="oss_multipart_ckpt")
response = resumable_upload(
bucket,
key,
file_path,
store=ckpt,
multipart_threshold=_OSS_MULTIPART_THRESHOLD_BYTES,
part_size=None,
num_threads=_OSS_MULTIPART_NUM_THREADS,
)
logger.info(f"OSS upload success, key: {key}, expire time: {expire_time_str}, status: {response.status}")
signed_url = bucket.sign_url(
method="GET",
key=key,
expires=expire_days * 24 * 3600,
)
logger.info(f"Generated OSS signed URL valid for {expire_days} day(s), URL: {signed_url[:100]}...")
return signed_url
_t0 = time.perf_counter()
success = False
try:
result = run_with_storage_retry(do_upload, context="OSS")
success = True
return result
except Exception as e:
logger.error(f"OSS upload failed: {e}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, "OSS upload failed")
finally:
elapsed = time.perf_counter() - _t0
logger.info(
"OSS upload %s, file=%s, key=%s, total_duration_sec=%.3f",
"success" if success else "failed",
file_path,
key,
elapsed,
)
================================================
FILE: src/utils/points.py
================================================
from typing import Dict, Any, Optional
import time
from exceptions import CustomException, CustomError
from src.utils.logger import logger
import requests
# 常量定义
POINTS_API_BASE_URL = "https://jcaigc.cn/openapi/v1/user/points"
API_HEADERS = {
'User-Agent': 'CapcutMate/1.0',
'Accept': 'application/json',
'Content-Type': 'application/json'
}
DEFAULT_API_TIMEOUT = 30 # 默认API超时时间为30秒
USER_API_RETRY_ATTEMPTS = 3 # 连接失败或超时后额外重试次数(首次 + 3 次重试,最多 4 次请求)
USER_API_RETRY_INTERVAL_SEC = 1
def get_user_points(api_key: str) -> float:
"""
根据API Key获取用户积分
Args:
api_key: 用户的API Key
Returns:
float: 用户当前积分
Raises:
CustomException: 当获取积分失败时
"""
try:
# 调用获取积分API
params = {'apiKey': api_key}
result = _call_user_api('GET', '', params=params)
# 检查响应码并处理结果
code = result.get('code', -1)
if code == 0:
points = _extract_points_from_response(result)
logger.info(f"Successfully retrieved user points: {points} for API key: {api_key[:8]}***")
return points
elif code == 10007: # API Key无效
logger.error(f"Invalid API key, result: {result}, code: {code}")
raise CustomException(CustomError.INVALID_APIKEY, detail=f"{api_key}")
else:
logger.error(f"Failed to get user points: {result}, code: {code}")
raise CustomException(CustomError.UNKNOWN_ERROR, detail=f"Unknown error occurred while getting user points: {result}, code: {code}")
except CustomException:
raise
except Exception as e:
logger.error(f"Unexpected error getting user points for API key {api_key[:8]}***: {str(e)}")
raise CustomException(CustomError.UNKNOWN_ERROR, detail=f"Unknown error occurred while getting user points: {str(e)}")
def deduct_user_points(api_key: str, points: float, desc: str) -> bool:
"""
根据API Key减少用户积分
Args:
api_key: 用户的API Key
points: 要减少的积分数量(必须为正数)
desc: 减少积分的原因描述
Returns:
bool: True表示扣减成功,False表示失败
Raises:
CustomException: 仅当apiKey无效时抛出异常
"""
try:
# 调用扣减积分API
json_data = {
'apiKey': api_key,
'points': float(points),
'desc': desc.strip()
}
result = _call_user_api('POST', '/deduct', json_data=json_data)
code = result.get('code', -1)
if code == 0:
logger.info(f"Successfully deducted {points} points for API key {api_key[:8]}***, reason: {desc}")
return True
elif code == 10007: # API Key无效
logger.error(f"Invalid API key for deduct points: {result}, code: {code}")
raise CustomException(CustomError.INVALID_APIKEY, detail=f"{api_key}")
else:
logger.error(f"Failed to deduct points: {result}, code: {code}")
return False
except CustomException as e:
logger.warning(f"Deduct points failed, API key: {api_key[:8]}***, error: {str(e)}")
return False
except Exception as e:
logger.error(f"Unexpected error deducting points for API key {api_key[:8]}***: {str(e)}")
return False
def _extract_points_from_response(result: Dict[str, Any]) -> float:
"""
从响应中提取积分数据
Args:
result: API响应数据
Returns:
float: 积分值
Raises:
CustomException: 积分数据格式错误时
"""
try:
points = result.get('data', {}).get('points', 0.0)
return float(points)
except (ValueError, TypeError):
logger.error(f"Invalid points format in API response, result: {result}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, detail="Points format error")
def _parse_api_response(response: requests.Response) -> Dict[str, Any]:
"""
解析API响应的JSON数据
Args:
response: HTTP响应对象
Returns:
Dict[str, Any]: 解析后的JSON数据
Raises:
CustomException: JSON解析失败时
"""
try:
return response.json()
except ValueError:
logger.error(f"Failed to parse API response as JSON: {response.text}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, detail="API response format error")
def _call_user_api(method: str, endpoint: str, params: Optional[dict] = None, json_data: Optional[dict] = None, timeout: int = DEFAULT_API_TIMEOUT) -> Dict[str, Any]:
"""
调用用户积分相关API的通用方法
Args:
method: HTTP方法 ('GET' 或 'POST')
endpoint: API端点路径
params: 查询参数(用于GET请求)
json_data: JSON数据(用于POST请求)
timeout: 请求超时时间(秒)
Returns:
Dict[str, Any]: API响应的JSON数据
Raises:
CustomException: 当API调用失败或返回错误时
"""
url = f"{POINTS_API_BASE_URL}{endpoint}"
max_attempts = USER_API_RETRY_ATTEMPTS + 1
for attempt in range(max_attempts):
try:
if attempt == 0:
logger.info(f"Calling user API: {method} {url}")
else:
logger.info(f"Calling user API: {method} {url} (attempt {attempt + 1}/{max_attempts})")
# 根据方法类型发送请求
if method.upper() == 'GET':
response = requests.get(url, params=params, headers=API_HEADERS, timeout=timeout)
elif method.upper() == 'POST':
response = requests.post(url, json=json_data, headers=API_HEADERS, timeout=timeout)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
# 解析JSON响应
return _parse_api_response(response)
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError) as e:
if attempt < USER_API_RETRY_ATTEMPTS:
logger.warning(
f"User API {type(e).__name__}, will retry ({attempt + 1}/{USER_API_RETRY_ATTEMPTS}) "
f"after {USER_API_RETRY_INTERVAL_SEC}s: {method} {url}"
)
time.sleep(USER_API_RETRY_INTERVAL_SEC)
continue
if isinstance(e, requests.exceptions.Timeout):
logger.error(f"User API timeout after {max_attempts} attempts: {method} {url}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, detail="User API call timeout")
logger.error(f"User API connection error after {max_attempts} attempts: {method} {url}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, detail="Unable to connect to user API service")
except requests.exceptions.RequestException as e:
logger.error(f"User API request failed: {method} {url}, error: {str(e)}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, detail=f"User API request failed: {str(e)}")
except CustomException:
raise
except Exception as e:
logger.error(f"Unexpected error in user API call: {method} {url}, error: {str(e)}")
raise CustomException(CustomError.UNKNOWN_ERROR, detail=f"Unknown error occurred while calling user API: {str(e)}")
================================================
FILE: src/utils/storage_upload_retry.py
================================================
# 对象存储上传:可重试错误识别与退避重试(独立模块,供 cos/oss 使用,避免与 upload_file 相向依赖)
import errno
import random
import time
from collections.abc import Callable
from typing import Iterator, TypeVar
import requests
import urllib3.exceptions
from qcloud_cos.cos_exception import CosClientError, CosServiceError
from src.utils.logger import logger
try:
import oss2.exceptions as oss_exc
except ImportError: # pragma: no cover
oss_exc = None # type: ignore[assignment]
# 业务层整次重试(与 COS SDK 内重试等叠加)
_STORAGE_UPLOAD_MAX_ATTEMPTS = 5
_STORAGE_UPLOAD_BASE_DELAY_SEC = 1.0
_STORAGE_UPLOAD_MAX_DELAY_SEC = 30.0
T = TypeVar("T")
_RETRYABLE_ERRNOS = frozenset(
{
errno.ECONNRESET,
errno.ETIMEDOUT,
errno.EPIPE,
errno.ECONNABORTED,
errno.ENETUNREACH,
errno.EHOSTUNREACH,
10053,
10054,
}
)
def _iter_exception_chain(exc: BaseException) -> Iterator[BaseException]:
seen: set[int] = set()
e: BaseException | None = exc
while e is not None and id(e) not in seen:
yield e
seen.add(id(e))
nxt = e.__cause__ or e.__context__
e = nxt if nxt is not e else None
def is_retryable_storage_error(exc: BaseException) -> bool:
"""
判断是否为“整次重试”可能恢复的错误:网络/超时/连接类、云端临时性 5xx 等。
非幂等或确定性的客户端错误(4xx 业务、鉴权等)返回 False。
"""
for e in _iter_exception_chain(exc):
if isinstance(
e,
(
requests.exceptions.ConnectionError,
requests.exceptions.Timeout,
requests.exceptions.ChunkedEncodingError,
urllib3.exceptions.ConnectTimeoutError,
urllib3.exceptions.ReadTimeoutError,
urllib3.exceptions.NewConnectionError,
urllib3.exceptions.ProtocolError,
),
):
return True
if isinstance(e, OSError) and getattr(e, "errno", None) in _RETRYABLE_ERRNOS:
return True
if isinstance(e, CosClientError):
return True
if isinstance(e, CosServiceError):
try:
code = e.get_status_code()
except Exception:
code = None
if code is not None and int(code) >= 500:
return True
return False
if oss_exc is not None:
if isinstance(e, oss_exc.RequestError):
return True
if isinstance(e, oss_exc.OssError):
st = getattr(e, "status", None)
if st == oss_exc.OSS_REQUEST_ERROR_STATUS:
return True
if isinstance(st, int) and st >= 500:
return True
if isinstance(st, int) and st == 408:
return True
return False
def run_with_storage_retry(operation: Callable[[], T], *, context: str = "") -> T:
"""对上传/签名等操作做有限次重试,指数退避 + 全抖动。"""
max_attempts = max(1, _STORAGE_UPLOAD_MAX_ATTEMPTS)
base = max(0.05, _STORAGE_UPLOAD_BASE_DELAY_SEC)
cap = max(base, _STORAGE_UPLOAD_MAX_DELAY_SEC)
prefix = f"{context} " if context else ""
last: BaseException | None = None
for attempt in range(max_attempts):
try:
return operation()
except Exception as e:
last = e
if attempt >= max_attempts - 1 or not is_retryable_storage_error(e):
raise
upper = min(cap, base * (2**attempt))
delay = random.uniform(0.0, upper)
logger.warning(
"%sstorage upload attempt %d/%d failed: %s; retrying in %.2fs",
prefix,
attempt + 1,
max_attempts,
e,
delay,
)
time.sleep(delay)
assert last is not None
raise last
================================================
FILE: src/utils/trace_context.py
================================================
"""
分布式追踪上下文(W3C Trace Context + 常见 Request-ID)。
- 入站:优先解析 `traceparent`(W3C),否则 `X-Request-ID` / `X-Trace-Id`;
- 出站响应:`traceparent`、`X-Request-ID`(与 trace-id 对齐);
- 运行态:`contextvars` 供任意代码通过 `get_trace_id()` 读取,并由 Logging Filter 写入每条日志。
"""
from __future__ import annotations
import contextvars
import hashlib
import logging
import secrets
import uuid
from typing import Optional, Tuple
# --- W3C Trace Context: https://www.w3.org/TR/trace-context/
TRACEPARENT_HEADER = "traceparent"
REQUEST_ID_HEADERS = ("x-request-id", "x-trace-id")
trace_id_var: contextvars.ContextVar[Optional[str]] = contextvars.ContextVar(
"trace_id", default=None
)
span_id_var: contextvars.ContextVar[Optional[str]] = contextvars.ContextVar(
"span_id", default=None
)
def get_trace_id() -> Optional[str]:
return trace_id_var.get()
def get_span_id() -> Optional[str]:
return span_id_var.get()
def _gen_trace_id() -> str:
return uuid.uuid4().hex
def _gen_span_id() -> str:
return secrets.token_hex(8)
def parse_traceparent(value: str) -> Optional[Tuple[str, str]]:
"""
解析 traceparent,成功返回 (trace_id, parent_span_id),均为小写十六进制字符串。
trace-id 全 0 视为无效。
"""
parts = value.strip().split("-")
if len(parts) != 4:
return None
_ver, tid, pid, _flags = parts
if len(tid) != 32 or len(pid) != 16:
return None
tid_l, pid_l = tid.lower(), pid.lower()
hex32 = set("0123456789abcdef")
if not all(c in hex32 for c in tid_l) or not all(c in hex32 for c in pid_l):
return None
if tid_l == "0" * 32:
return None
return tid_l, pid_l
def build_traceparent(trace_id: str, span_id: str, sampled: bool = True) -> str:
"""组装标准 traceparent(version 00)。"""
flags = "01" if sampled else "00"
return f"00-{trace_id}-{span_id}-{flags}"
def _normalize_custom_request_id(raw: str) -> str:
"""将客户端 Request-ID 规范为 32 位 hex trace-id;无法解析则稳定哈希到 32 hex。"""
s = raw.strip()
if not s:
return _gen_trace_id()
no_dash = s.replace("-", "").lower()
hexset = set("0123456789abcdef")
if len(no_dash) == 32 and all(c in hexset for c in no_dash):
return no_dash
return hashlib.sha256(s.encode("utf-8")).hexdigest()[:32]
def resolve_trace_from_headers(header_getter) -> Tuple[str, str]:
"""
从请求头解析或生成 (trace_id, span_id)。
header_getter: 与 Starlette Headers 兼容,如 headers.get(name)。
"""
tp = header_getter(TRACEPARENT_HEADER)
if tp:
parsed = parse_traceparent(tp)
if parsed:
tid, _parent = parsed
return tid, _gen_span_id()
for name in REQUEST_ID_HEADERS:
v = header_getter(name)
if v and str(v).strip():
return _normalize_custom_request_id(str(v)), _gen_span_id()
return _gen_trace_id(), _gen_span_id()
class TraceContextFilter(logging.Filter):
"""为 LogRecord 增加 trace_id 字段,供 Formatter 使用。"""
def filter(self, record: logging.LogRecord) -> bool:
tid = get_trace_id()
record.trace_id = tid if tid else "-"
return True
================================================
FILE: src/utils/upload_file.py
================================================
# 对象存储统一上传入口(配置判断 + 路由分发;具体上传与重试在 cos.py / oss.py + storage_upload_retry)
from typing import Optional
import config
from exceptions import CustomError, CustomException
from src.utils.logger import logger
from src.utils.cos import cos_upload_file
from src.utils.oss import oss_upload_file
def _is_valid_storage_config(value: str) -> bool:
"""判断存储配置项是否有效(空串和占位符视为未配置)。"""
normalized = (value or "").strip()
return normalized != "" and normalized.lower() != "xxx"
def _is_cos_configured() -> bool:
"""判断 COS 配置是否完整有效。"""
return all(
_is_valid_storage_config(item)
for item in (config.COS_SECRET_ID, config.COS_SECRET_KEY, config.COS_BUCKET_NAME, config.COS_REGION)
)
def _is_oss_configured() -> bool:
"""判断 OSS 配置是否完整有效。"""
return all(
_is_valid_storage_config(item)
for item in (
config.OSS_ACCESS_KEY_ID,
config.OSS_ACCESS_KEY_SECRET,
config.OSS_BUCKET_NAME,
config.OSS_ENDPOINT,
)
)
def upload_file(file_path: str, expire_days: Optional[int] = None) -> str:
"""
上传文件到对象存储并返回带签名的临时URL。
选择策略:
1. 若 COS 配置完整,优先使用 COS
2. 否则若 OSS 配置完整,使用 OSS
3. 都未配置时抛出异常
"""
if expire_days is None:
expire_days = config.VIDEO_GEN_RETENTION_DAYS
try:
if _is_cos_configured():
logger.info("Detected COS config, using COS upload")
return cos_upload_file(file_path=file_path, expire_days=expire_days)
if _is_oss_configured():
logger.info("COS config not found, fallback to OSS upload")
return oss_upload_file(file_path=file_path, expire_days=expire_days)
raise CustomException(
CustomError.INTERNAL_SERVER_ERROR,
"Neither COS nor OSS storage config is available"
)
except Exception as e:
if isinstance(e, CustomException):
raise
logger.error(f"Storage upload failed: {e}")
raise CustomException(CustomError.INTERNAL_SERVER_ERROR, "Storage upload failed")
================================================
FILE: src/utils/video_task_manager.py
================================================
"""
视频生成异步任务队列管理器
支持任务排队、状态跟踪和结果查询
"""
import asyncio
import queue
import threading
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime
from enum import Enum
from typing import Dict, Optional, Tuple, Any
from dataclasses import dataclass
from src.utils.logger import logger
from src.utils import helper
from src.utils.video_task_store import (
get_completed_by_draft_id,
prune_if_needed,
save_completed_result,
)
import src.pyJianYingDraft as draft
import config
import os
import shutil
import sys
import subprocess
import json
# draft_content.json 中 duration 为微秒;低于 3 秒视为空草稿,不进入剪映导出
MIN_DRAFT_EXPORT_DURATION_US = 3 * 1_000_000
# gen_video:同时下载草稿的最大并发,超出部分在 _download_executor 队列中排队
DRAFT_DOWNLOAD_MAX_CONCURRENT = 3
# gen_video:上传到对象存储的最大并发,超出部分在 _upload_executor 队列中排队
OBJECT_STORAGE_UPLOAD_MAX_CONCURRENT = 2
# 如果是Linux系统,则不导入uiautomation,并避免执行相关代码
try:
from uiautomation import UIAutomationInitializerInThread # type: ignore
except ImportError:
# 在缺少依赖的系统上创建一个占位符
class UIAutomationInitializerInThread: # type: ignore
def __enter__(self):
pass
def __exit__(self, *args):
pass
class TaskStatus(Enum):
"""任务状态枚举"""
PENDING = "pending" # 等待中
PROCESSING = "processing" # 处理中
COMPLETED = "completed" # 已完成
FAILED = "failed" # 失败
@dataclass
class VideoGenTask:
"""视频生成任务数据类"""
draft_url: str
draft_id: str
status: TaskStatus
created_at: datetime
started_at: Optional[datetime] = None
completed_at: Optional[datetime] = None
video_url: str = ""
error_message: str = ""
progress: int = 0 # 进度百分比 0-100
api_key: Optional[str] = None # 存储API密钥用于计费
outfile: str = "" # 导出目标路径,在下载阶段生成
class VideoGenTaskManager:
"""视频生成任务管理器 - 单例模式
每个任务在独立协程中执行:草稿下载由专用线程池执行,并发上限为
DRAFT_DOWNLOAD_MAX_CONCURRENT,超出部分在线程池队列中排队;
剪映 RPA 导出由 export_video_lock 全局串行;COS/OSS 上传在独立线程池中执行,
并发上限为 OBJECT_STORAGE_UPLOAD_MAX_CONCURRENT。
"""
_instance = None
_lock = threading.Lock()
def __new__(cls):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
if hasattr(self, '_initialized'):
return
self._initialized = True
# 任务存储:{draft_url: VideoGenTask}
self.tasks: Dict[str, VideoGenTask] = {}
# 跨线程任务队列(HTTP 线程 put、worker 线程 get)。不能用 asyncio.Queue:其在 __init__
# 时绑定的 loop 与 worker 内 new_event_loop() 不一致,会触发 “bound to a different event loop”。
self.task_queue: queue.Queue = queue.Queue()
_download_workers = DRAFT_DOWNLOAD_MAX_CONCURRENT
_upload_workers = OBJECT_STORAGE_UPLOAD_MAX_CONCURRENT
self._download_executor = ThreadPoolExecutor(
max_workers=_download_workers,
thread_name_prefix="draft_dl",
)
self._upload_executor = ThreadPoolExecutor(
max_workers=_upload_workers,
thread_name_prefix="cos_upload",
)
# 导出视频专用锁(确保任何时候只有一个线程执行剪映 RPA 导出)
self.export_video_lock = threading.Lock()
# 有多少个线程已进入「仅导出」阶段(含在 export_video_lock 上阻塞等待),用于对照默认线程池挤占
self._export_metrics_lock = threading.Lock()
self._export_phase_active = 0
# 工作线程
self.worker_thread: Optional[threading.Thread] = None
# 停止标志
self.stop_flag = threading.Event()
_default_asyncio_pool = min(32, (os.cpu_count() or 1) + 4)
logger.info(
"VideoGenTaskManager initialized: draft_dl max_workers=%s (queued beyond that), "
"cos_upload max_workers=%s (queued beyond that). Jianying export uses run_in_executor(None) "
"and shares the asyncio default thread pool with sync FastAPI routes "
"(typical cap min(32, cpu+4)=%s). When export-phase concurrency reaches that level, "
"synchronous HTTP handlers may stall.",
_download_workers,
_upload_workers,
_default_asyncio_pool,
)
def submit_task(self, draft_url: str, api_key: str = None) -> None:
"""
提交视频生成任务
Args:
draft_url: 草稿URL
api_key: API密钥,用于计费
"""
# 提取草稿ID
draft_id = helper.get_url_param(draft_url, "draft_id")
if not draft_id:
raise ValueError("无效的草稿URL")
# 检查是否已有相同草稿的任务在进行
if draft_url in self.tasks:
existing_task = self.tasks[draft_url]
if existing_task.status in [TaskStatus.PENDING, TaskStatus.PROCESSING]:
logger.info(f"Task already exists for draft_url: {draft_url}")
return
# 创建新任务
task = VideoGenTask(
draft_url=draft_url,
draft_id=draft_id,
status=TaskStatus.PENDING,
created_at=datetime.now(),
api_key=api_key # 存储API密钥用于计费
)
# 存储任务
self.tasks[draft_url] = task
self._add_task_to_queue_sync(task)
# 启动工作线程(如果还没启动)
self._ensure_worker_running()
logger.info(f"Task submitted for draft_url: {draft_url}")
def _add_task_to_queue_sync(self, task: VideoGenTask) -> None:
"""Thread-safe enqueue from FastAPI worker threads (or any thread)."""
self.task_queue.put(task)
logger.info(f"Task added to queue: {task.draft_url}")
def get_task_status(self, draft_url: str) -> Optional[Dict[str, Any]]:
"""
根据草稿URL获取任务状态
Args:
draft_url: 草稿URL
Returns:
任务状态信息,如果不存在返回None
"""
# 热路径:本进程内提交过的任务始终在内存,避免每次轮询都抢 SQLite 全局锁
task = self.tasks.get(draft_url)
if task:
return {
"draft_url": task.draft_url,
"status": task.status.value,
"progress": task.progress,
"video_url": task.video_url,
"error_message": task.error_message,
"created_at": task.created_at.isoformat(),
"started_at": task.started_at.isoformat() if task.started_at else None,
"completed_at": task.completed_at.isoformat() if task.completed_at else None,
}
prune_if_needed()
draft_id = helper.get_url_param(draft_url, "draft_id")
return get_completed_by_draft_id(draft_id)
def get_active_render_count(self) -> int:
"""
当前进行中的云渲染草稿数量:排队(pending) + 渲染中(processing)。
不含已完成(completed)、失败(failed)。
"""
active = (TaskStatus.PENDING, TaskStatus.PROCESSING)
return sum(1 for t in self.tasks.values() if t.status in active)
def _ensure_worker_running(self):
"""确保工作线程正在运行"""
if self.worker_thread is None or not self.worker_thread.is_alive():
self.stop_flag.clear()
self.worker_thread = threading.Thread(target=self._worker_loop, daemon=True)
self.worker_thread.start()
logger.info("Worker thread started")
def _worker_loop(self):
"""工作线程主循环"""
logger.info("Worker loop started")
# 在工作线程中创建新的事件循环
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(self._async_worker_loop())
finally:
loop.close()
async def _async_worker_loop(self):
"""从队列取任务并启动独立协程;下载/上传并发受各自线程池限制,导出串行。"""
while not self.stop_flag.is_set():
try:
# Blocking get with timeout on thread pool — queue is thread-safe, not loop-bound.
task = await asyncio.to_thread(self.task_queue.get, True, 1.0)
t = asyncio.create_task(self._process_task(task))
t.add_done_callback(self._log_async_task_done)
except queue.Empty:
continue
except Exception as e:
logger.error(f"Worker loop error: {e}")
await asyncio.sleep(1)
def _log_async_task_done(self, fut: asyncio.Task) -> None:
try:
fut.result()
except asyncio.CancelledError:
pass
except Exception as e:
logger.exception(f"Async task finished with error: {e}")
def _persist_terminal_task(self, task: VideoGenTask) -> None:
"""将已完成或失败的任务写入 SQLite(仅终态)。"""
if task.status not in (TaskStatus.COMPLETED, TaskStatus.FAILED):
return
task.completed_at = datetime.now()
try:
save_completed_result(
draft_id=task.draft_id,
draft_url=task.draft_url,
status=task.status.value,
progress=task.progress,
video_url=task.video_url,
error_message=task.error_message,
created_at=task.created_at,
started_at=task.started_at,
completed_at=task.completed_at,
)
except Exception as persist_err:
logger.exception(
"Failed to persist video gen task result: %s", persist_err
)
async def _run_upload_and_finalize(self, task: VideoGenTask) -> None:
"""导出成功后的上传与落库;上传受 _upload_executor 并发上限约束,绑定本 task 的 outfile/draft_id。"""
loop = asyncio.get_running_loop()
try:
video_url, error_message = await loop.run_in_executor(
self._upload_executor,
self._phase_cos_upload_finalize,
task,
)
if video_url:
task.status = TaskStatus.COMPLETED
task.video_url = video_url
task.progress = 100
logger.info(f"Task completed successfully: {task.draft_url}")
else:
task.status = TaskStatus.FAILED
task.error_message = error_message
task.progress = 0
logger.error(f"Task failed: {task.draft_url}, error: {error_message}")
except Exception as e:
task.status = TaskStatus.FAILED
task.error_message = str(e)
task.progress = 0
logger.exception(f"Upload/finalize exception: {task.draft_url}, error: {e}")
self._cleanup_files(getattr(task, "outfile", "") or "", task.draft_id)
finally:
self._persist_terminal_task(task)
async def _process_task(self, task: VideoGenTask):
"""
单任务流水线:下载阶段受 _download_executor 并发上限约束;导出串行(export_video_lock);
成功后上传统一异步且不阻塞本循环(上传受 _upload_executor 限制)。
"""
logger.info(f"Processing task: {task.draft_url}")
task.status = TaskStatus.PROCESSING
task.started_at = datetime.now()
task.progress = 10
loop = asyncio.get_running_loop()
try:
prep_error = await loop.run_in_executor(
self._download_executor,
self._phase_download_and_prepare,
task,
)
if prep_error:
task.status = TaskStatus.FAILED
task.error_message = prep_error
task.progress = 0
logger.error(f"Task failed: {task.draft_url}, error: {prep_error}")
self._cleanup_files(task.outfile, task.draft_id)
self._persist_terminal_task(task)
return
export_error = await loop.run_in_executor(
None,
self._phase_export_only,
task,
)
if export_error:
task.status = TaskStatus.FAILED
task.error_message = export_error
task.progress = 0
logger.error(f"Task failed: {task.draft_url}, error: {export_error}")
self._cleanup_files(task.outfile, task.draft_id)
self._persist_terminal_task(task)
return
ut = asyncio.create_task(self._run_upload_and_finalize(task))
ut.add_done_callback(self._log_async_task_done)
except Exception as e:
task.status = TaskStatus.FAILED
task.error_message = str(e)
task.progress = 0
logger.exception(f"Task exception: {task.draft_url}, error: {e}")
self._cleanup_files(getattr(task, "outfile", "") or "", task.draft_id)
self._persist_terminal_task(task)
def _check_draft_duration(self, task: VideoGenTask) -> bool:
"""
检查草稿中的视频时长是否满足导出要求(draft_content.duration 单位为微秒)。
时长不大于 0 或小于 3 秒均视为无效。
Returns:
bool: 是否允许继续导出
"""
try:
# 构建草稿内容文件路径
draft_content_path = os.path.join(config.DRAFT_SAVE_PATH, task.draft_id, "draft_content.json")
# 检查文件是否存在
if not os.path.exists(draft_content_path):
logger.error(
"draft_content.json not found: path=%s draft_id=%s",
draft_content_path,
task.draft_id,
)
return False
# 读取并解析JSON文件
with open(draft_content_path, 'r', encoding='utf-8') as f:
draft_content = json.load(f)
# 获取时长
duration = draft_content.get("duration", 0)
if duration <= 0:
logger.error(
"draft duration invalid (<=0): duration_us=%s draft_id=%s",
duration,
task.draft_id,
)
return False
if duration < MIN_DRAFT_EXPORT_DURATION_US:
logger.error(
"draft duration below minimum export length (<3s): duration_us=%s "
"draft_id=%s",
duration,
task.draft_id,
)
return False
logger.info(
"draft duration check passed: duration_us=%s draft_id=%s",
duration,
task.draft_id,
)
return True
except json.JSONDecodeError as e:
logger.error(
"failed to parse draft_content.json: %s draft_id=%s",
e,
task.draft_id,
)
return False
except Exception as e:
logger.error(
"draft duration check error: %s draft_id=%s",
e,
task.draft_id,
)
return False
def _phase_download_and_prepare(self, task: VideoGenTask) -> str:
"""
下载草稿并校验时长(可并发执行)。
Returns:
错误信息,成功时返回空字符串。
"""
try:
task.progress = 20
task.outfile = os.path.join(config.DRAFT_DIR, f"{helper.gen_unique_id()}.mp4")
if not sys.platform.startswith("win"):
return "视频生成功能仅在Windows系统上可用"
task.progress = 30
if not self._download_draft(task):
logger.error("draft download failed: draft_url=%s", task.draft_url)
return f"草稿下载失败: {task.draft_url}"
if not self._check_draft_duration(task):
logger.error(
"draft duration check failed (empty or too short): draft_id=%s",
task.draft_id,
)
return f"草稿中视频时长不大于3秒,请检查草稿内容: {task.draft_id}"
task.progress = 40
return ""
except Exception as exc:
logger.exception(
f"Export draft failed: draft_id={task.draft_id}, error={exc}"
)
return f"导出草稿失败: {exc}"
def _phase_export_only(self, task: VideoGenTask) -> str:
"""
仅执行剪映导出(在 export_video_lock 内,全局串行)。
Returns:
错误信息,成功时返回空字符串。
"""
with self._export_metrics_lock:
self._export_phase_active += 1
export_phase_concurrent = self._export_phase_active
logger.info(
"Export phase entered (waiting for lock or exporting): "
"concurrent=%s draft_id=%s",
export_phase_concurrent,
task.draft_id,
)
try:
try:
if not self._export_video(task, task.outfile):
return "导出草稿失败"
return ""
except Exception as exc:
logger.exception(
f"Export draft failed: draft_id={task.draft_id}, error={exc}"
)
return f"导出草稿失败: {exc}"
finally:
with self._export_metrics_lock:
self._export_phase_active -= 1
export_phase_concurrent = self._export_phase_active
logger.info(
"Export phase exited: concurrent=%s draft_id=%s",
export_phase_concurrent,
task.draft_id,
)
def _phase_cos_upload_finalize(self, task: VideoGenTask) -> Tuple[str, str]:
"""
COS 上传、扣费与清理(与其它任务的上传共享线程池,最多 2 路并发)。
草稿目录与本地导出 mp4 在 finally 中清理,避免上传/扣费任一环节抛错导致残留。
"""
try:
task.progress = 95
upload_url, upload_failed = self._upload_video_to_cos(task.outfile)
self._calculate_and_charge(task, task.outfile)
return self._handle_result(upload_url, upload_failed)
except Exception as exc:
logger.exception(
f"Export draft failed: draft_id={task.draft_id}, error={exc}"
)
return "", f"导出草稿失败: {exc}"
finally:
self._cleanup_files(task.outfile, task.draft_id)
def _download_draft(self, task: VideoGenTask) -> bool:
"""
下载草稿
Args:
task: 视频生成任务
Returns:
bool: 下载是否成功
"""
logger.info(f"Start downloading draft before export: {task.draft_url}")
from src.utils.draft_downloader import download_draft
download_success = download_draft(task.draft_url)
if download_success:
logger.info(f"Draft downloaded successfully: {task.draft_url}")
else:
logger.error(f"Failed to download draft: {task.draft_url}")
return download_success
def _export_video(self, task: VideoGenTask, outfile: str) -> bool:
"""
导出视频
Args:
task: 视频生成任务
outfile: 输出文件路径
Returns:
bool: 导出是否成功
"""
# 使用专用锁确保任何时候只有一个线程执行导出视频操作
logger.info(
"Waiting for export_video_lock: draft_id=%s",
task.draft_id,
)
with self.export_video_lock:
logger.info(f"Begin to export draft: {task.draft_id} -> {outfile}")
# 更新进度
task.progress = 50
# 检查JianyingController是否可用
if draft.JianyingController is None:
if sys.platform != "win32":
error_msg = "剪映自动导出功能仅在Windows平台可用"
logger.error(
"JianyingController unavailable: requires Windows platform"
)
else:
error_msg = "缺少Windows依赖,请安装: pip install capcut-mate[windows]"
logger.error(
"JianyingController unavailable: install windows extras "
"(pip install capcut-mate[windows])"
)
raise RuntimeError(error_msg)
with UIAutomationInitializerInThread():
# 此前需要将剪映打开,并位于目录页
ctrl = draft.JianyingController()
# 更新进度
task.progress = 70
# 导出指定名称的草稿
ctrl.export_draft(task.draft_id, outfile)
# 检查文件是否生成
if not os.path.exists(outfile):
# 个别版本剪映不会抛异常,但文件未生成
logger.error(
"export finished but output file missing (check disk space / "
"Jianying version): path=%s",
outfile,
)
return False
logger.info(f"Export draft success: {outfile}")
return True
def _upload_video_to_cos(self, outfile: str) -> Tuple[str, bool]:
"""
上传视频到对象存储(优先COS,兜底OSS)
Args:
outfile: 输出文件路径
Returns:
(upload_url, upload_failed): 上传后的URL和是否上传失败
"""
upload_url = ""
upload_failed = False
try:
from src.utils.upload_file import upload_file
logger.info(f"Uploading video to object storage: {outfile}")
upload_url = upload_file(outfile, expire_days=config.VIDEO_GEN_RETENTION_DAYS)
logger.info(f"Video uploaded to object storage successfully: {upload_url}")
except Exception as upload_error:
logger.error(f"Failed to upload video to object storage: {upload_error}")
upload_failed = True
return upload_url, upload_failed
def _calculate_and_charge(self, task: VideoGenTask, outfile: str) -> None:
"""
计算并扣除费用(必需执行但不关心结果)
Args:
task: 视频生成任务
outfile: 输出文件路径
Returns:
None: 无返回值
"""
if config.ENABLE_APIKEY and task.api_key:
try:
# 导入获取媒体时长的函数
from src.utils.media import get_media_duration
# 获取视频时长(返回的是微秒)
duration_us = get_media_duration(outfile)
if duration_us and duration_us > 0:
# 将微秒转换为秒
video_duration = duration_us / 1_000_000 # 微秒转秒
# 计算费用:0.01积分/秒
cost = video_duration * 0.01
# 导入扣费函数
from src.utils.points import deduct_user_points
# 扣除用户积分(必需执行但不关心结果)
charge_success = deduct_user_points(
api_key=task.api_key,
points=cost,
desc=f"剪映草稿导出视频,时长{video_duration:.2f}秒,费用{cost:.2f}积分"
)
if charge_success:
logger.info(f"Successfully charged {cost:.2f} points for video duration {video_duration:.2f}s, API key: {task.api_key[:8]}***")
else:
logger.warning(f"Failed to charge {cost:.2f} points for video duration {video_duration:.2f}s, API key: {task.api_key[:8]}***")
else:
logger.warning(f"Could not determine video duration for charging: {outfile}")
except Exception as charge_error:
logger.error(f"Error calculating or charging for video duration: {charge_error}")
def _cleanup_files(self, outfile: str, draft_id: str) -> None:
"""
清理临时文件
Args:
outfile: 输出文件路径
draft_id: 草稿ID
"""
try:
# 清理本地视频文件
if os.path.exists(outfile):
os.remove(outfile)
logger.info(f"Cleaned up local video file: {outfile}")
# 清理下载的草稿文件
draft_path = os.path.join(config.DRAFT_SAVE_PATH, draft_id)
if os.path.exists(draft_path):
shutil.rmtree(draft_path)
logger.info(f"Cleaned up draft directory: {draft_path}")
except Exception as cleanup_error:
logger.warning(f"Failed to clean up files: {cleanup_error}")
def _handle_result(self, upload_url: str, upload_failed: bool) -> Tuple[str, str]:
"""
处理最终结果
Args:
upload_url: 上传后的URL
upload_failed: 上传是否失败
Returns:
(video_url, error_message): 视频URL和错误信息
"""
# 如果上传失败,返回错误信息;扣费结果不关心
if upload_failed:
return "", "视频上传失败"
# 返回上传后的URL,扣费结果不阻塞视频生成
return upload_url, ""
def stop(self):
"""停止任务管理器"""
logger.info("Stopping VideoGenTaskManager")
self.stop_flag.set()
if self.worker_thread and self.worker_thread.is_alive():
self.worker_thread.join(timeout=5)
self._download_executor.shutdown(wait=False)
self._upload_executor.shutdown(wait=False)
logger.info("VideoGenTaskManager stopped")
# 全局任务管理器实例
task_manager = VideoGenTaskManager()
================================================
FILE: src/utils/video_task_store.py
================================================
"""
视频生成任务完成结果持久化(SQLite)。
进行中的任务仅存在于内存,完成(成功或失败)后写入本模块。
"""
from __future__ import annotations
import os
import sqlite3
import threading
import time
from datetime import datetime
from typing import Any, Dict, Optional
import config
from src.utils.logger import logger
_MAX_ROWS = 100_000
_PRUNE_BATCH = 1_000
# 高并发下避免每次状态查询都跑 COUNT/竞争锁;超过间隔才真正检查是否需清理
_PRUNE_MIN_INTERVAL_SEC = 60.0
_last_prune_at: Optional[float] = None
_lock = threading.Lock()
def _connect() -> sqlite3.Connection:
path = config.VIDEO_GEN_TASK_DB_PATH
os.makedirs(os.path.dirname(path), exist_ok=True)
conn = sqlite3.connect(path, check_same_thread=False)
conn.row_factory = sqlite3.Row
return conn
def _init_schema(conn: sqlite3.Connection) -> None:
conn.execute(
"""
CREATE TABLE IF NOT EXISTS video_gen_task_results (
draft_id TEXT PRIMARY KEY NOT NULL,
draft_url TEXT NOT NULL,
status TEXT NOT NULL,
progress INTEGER NOT NULL,
video_url TEXT NOT NULL DEFAULT '',
error_message TEXT NOT NULL DEFAULT '',
created_at TEXT,
started_at TEXT,
completed_at TEXT NOT NULL
)
"""
)
conn.execute(
"""
CREATE INDEX IF NOT EXISTS idx_vgtr_completed_at
ON video_gen_task_results(completed_at)
"""
)
conn.commit()
def _ensure_schema() -> None:
with _lock:
conn = _connect()
try:
_init_schema(conn)
finally:
conn.close()
_ensure_schema()
def prune_if_needed() -> None:
"""
若表中记录数超过 10 万,按 completed_at 最旧优先删除 1000 条。
在查询已落库任务前可调用;高并发下通过时间间隔节流,避免每次请求都 COUNT(*)。
"""
global _last_prune_at
now = time.monotonic()
if _last_prune_at is not None and now - _last_prune_at < _PRUNE_MIN_INTERVAL_SEC:
return
with _lock:
now2 = time.monotonic()
if _last_prune_at is not None and now2 - _last_prune_at < _PRUNE_MIN_INTERVAL_SEC:
return
_last_prune_at = now2
conn = _connect()
try:
(cnt,) = conn.execute(
"SELECT COUNT(*) FROM video_gen_task_results"
).fetchone()
if cnt <= _MAX_ROWS:
return
conn.execute(
"""
DELETE FROM video_gen_task_results WHERE rowid IN (
SELECT rowid FROM video_gen_task_results
ORDER BY completed_at ASC, draft_id ASC
LIMIT ?
)
""",
(_PRUNE_BATCH,),
)
conn.commit()
logger.info(
"video_gen_task_results pruned %s rows (count was %s)",
_PRUNE_BATCH,
cnt,
)
finally:
conn.close()
def save_completed_result(
draft_id: str,
draft_url: str,
status: str,
progress: int,
video_url: str,
error_message: str,
created_at: datetime,
started_at: Optional[datetime],
completed_at: datetime,
) -> None:
"""持久化已完成任务(成功或失败)。不在此保存进行中的任务。"""
with _lock:
conn = _connect()
try:
conn.execute(
"""
INSERT OR REPLACE INTO video_gen_task_results (
draft_id, draft_url, status, progress,
video_url, error_message,
created_at, started_at, completed_at
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(
draft_id,
draft_url,
status,
progress,
video_url,
error_message,
created_at.isoformat(),
started_at.isoformat() if started_at else None,
completed_at.isoformat(),
),
)
conn.commit()
finally:
conn.close()
def get_completed_by_draft_id(draft_id: str) -> Optional[Dict[str, Any]]:
"""按 draft_id 读取已持久化的任务结果;无记录则返回 None。"""
if not draft_id:
return None
with _lock:
conn = _connect()
try:
row = conn.execute(
"""
SELECT draft_url, status, progress, video_url, error_message,
created_at, started_at, completed_at
FROM video_gen_task_results
WHERE draft_id = ?
""",
(draft_id,),
).fetchone()
if not row:
return None
return {
"draft_url": row["draft_url"],
"status": row["status"],
"progress": row["progress"],
"video_url": row["video_url"] or "",
"error_message": row["error_message"] or "",
"created_at": row["created_at"],
"started_at": row["started_at"],
"completed_at": row["completed_at"],
}
finally:
conn.close()
================================================
FILE: template/default/draft_agency_config.json
================================================
{
"marterials": null,
"use_converter": false,
"video_resolution": 720
}
================================================
FILE: template/default/draft_info.json
================================================
{
"canvas_config": {
"height": 0,
"ratio": "original",
"width": 0
},
"color_space": -1,
"config": {
"adjust_max_index": 1,
"combination_max_index": 1,
"export_range": null,
"extract_audio_last_index": 1,
"lyrics_recognition_id": "",
"lyrics_sync": true,
"lyrics_taskinfo": [],
"maintrack_adsorb": true,
"material_save_mode": 0,
"original_sound_last_index": 1,
"record_audio_last_index": 1,
"sticker_max_index": 1,
"subtitle_recognition_id": "",
"subtitle_sync": true,
"subtitle_taskinfo": [],
"video_mute": false
},
"cover": null,
"create_time": 0,
"duration": 0,
"extra_info": null,
"fps": 30.0,
"group_container": null,
"id": "1E7B473A-7C58-4FF5-AF38-620EDBEE66DE",
"keyframes": {
"adjusts": [],
"audios": [],
"filters": [],
"handwrites": [],
"stickers": [],
"texts": [],
"videos": []
},
"last_modified_platform": {
"app_id": 3704,
"app_version": "3.1.0-beta7",
"os": "mac",
"os_version": "15.6.1"
},
"materials": {
"audio_balances": [],
"audio_effects": [],
"audio_fades": [],
"audios": [],
"beats": [],
"canvases": [],
"chromas": [],
"color_curves": [],
"drafts": [],
"effects": [],
"handwrites": [],
"hsl": [],
"images": [],
"log_color_wheels": [],
"masks": [],
"material_animations": [],
"placeholders": [],
"primary_color_wheels": [],
"realtime_denoises": [],
"speeds": [],
"stickers": [],
"tail_leaders": [],
"text_templates": [],
"texts": [],
"transitions": [],
"video_effects": [],
"video_trackings": [],
"videos": []
},
"mutable_config": null,
"name": "",
"new_version": "52.0.0",
"platform": {
"app_id": 3704,
"app_version": "3.1.0-beta7",
"os": "mac",
"os_version": "15.6.1"
},
"relationships": [],
"render_index_track_mode_on": true,
"tracks": [],
"update_time": 0,
"version": 360000
}
================================================
FILE: template/default/draft_info.json.bak
================================================
{
"canvas_config": {
"height": 0,
"ratio": "original",
"width": 0
},
"color_space": -1,
"config": {
"adjust_max_index": 1,
"combination_max_index": 1,
"export_range": null,
"extract_audio_last_index": 1,
"lyrics_recognition_id": "",
"lyrics_sync": true,
"lyrics_taskinfo": [
],
"maintrack_adsorb": true,
"material_save_mode": 0,
"original_sound_last_index": 1,
"record_audio_last_index": 1,
"sticker_max_index": 1,
"subtitle_recognition_id": "",
"subtitle_sync": true,
"subtitle_taskinfo": [
],
"video_mute": false
},
"cover": null,
"create_time": 0,
"duration": 0,
"extra_info": null,
"fps": 30.0,
"group_container": null,
"id": "1E7B473A-7C58-4FF5-AF38-620EDBEE66DE",
"keyframes": {
"adjusts": [
],
"audios": [
],
"filters": [
],
"handwrites": [
],
"stickers": [
],
"texts": [
],
"videos": [
]
},
"last_modified_platform": {
"app_id": 3704,
"app_version": "3.1.0-beta7",
"os": "mac",
"os_version": "15.6.1"
},
"materials": {
"audio_balances": [
],
"audio_effects": [
],
"audio_fades": [
],
"audios": [
],
"beats": [
],
"canvases": [
],
"chromas": [
],
"color_curves": [
],
"drafts": [
],
"effects": [
],
"handwrites": [
],
"hsl": [
],
"images": [
],
"log_color_wheels": [
],
"masks": [
],
"material_animations": [
],
"placeholders": [
],
"primary_color_wheels": [
],
"realtime_denoises": [
],
"speeds": [
],
"stickers": [
],
"tail_leaders": [
],
"text_templates": [
],
"texts": [
],
"transitions": [
],
"video_effects": [
],
"video_trackings": [
],
"videos": [
]
},
"mutable_config": null,
"name": "",
"new_version": "52.0.0",
"platform": {
"app_id": 3704,
"app_version": "3.1.0-beta7",
"os": "mac",
"os_version": "15.6.1"
},
"relationships": [
],
"render_index_track_mode_on": true,
"tracks": [
],
"update_time": 0,
"version": 360000
}
================================================
FILE: template/default/draft_meta_info.json
================================================
{
"draft_cloud_last_action_download": false,
"draft_cloud_purchase_info": "",
"draft_cloud_tutorial_info": "",
"draft_cover": "",
"draft_fold_path": "",
"draft_id": "F8B72D13-7BB1-430B-89F1-BBECD092E08D",
"draft_materials": [
{
"type": 0,
"value": []
},
{
"type": 1,
"value": []
},
{
"type": 2,
"value": []
},
{
"type": 3,
"value": []
},
{
"type": 6,
"value": []
},
{
"type": 7,
"value": []
},
{
"type": 8,
"value": []
}
],
"draft_materials_copied_info": [],
"draft_name": "",
"draft_removable_storage_device": "",
"draft_root_path": "",
"draft_segment_extra_info": [],
"draft_timeline_materials_size_": 1524,
"tm_draft_cloud_completed": "",
"tm_draft_cloud_modified": 0,
"tm_draft_create": 1767007847131339,
"tm_draft_modified": 1767007866760103,
"tm_duration": 0
}
================================================
FILE: template/default/draft_settings
================================================
[General]
cloud_last_modify_platform=mac
================================================
FILE: template/default/template.tmp
================================================
{
"canvas_config": {
"height": 0,
"ratio": "original",
"width": 0
},
"color_space": -1,
"config": {
"adjust_max_index": 1,
"combination_max_index": 1,
"export_range": null,
"extract_audio_last_index": 1,
"lyrics_recognition_id": "",
"lyrics_sync": true,
"lyrics_taskinfo": [
],
"maintrack_adsorb": true,
"material_save_mode": 0,
"original_sound_last_index": 1,
"record_audio_last_index": 1,
"sticker_max_index": 1,
"subtitle_recognition_id": "",
"subtitle_sync": true,
"subtitle_taskinfo": [
],
"video_mute": false
},
"cover": null,
"create_time": 0,
"duration": 0,
"extra_info": null,
"fps": 30.0,
"group_container": null,
"id": "1E7B473A-7C58-4FF5-AF38-620EDBEE66DE",
"keyframes": {
"adjusts": [
],
"audios": [
],
"filters": [
],
"handwrites": [
],
"stickers": [
],
"texts": [
],
"videos": [
]
},
"last_modified_platform": {
"app_id": 3704,
"app_version": "3.1.0-beta7",
"os": "mac",
"os_version": "15.6.1"
},
"materials": {
"audio_balances": [
],
"audio_effects": [
],
"audio_fades": [
],
"audios": [
],
"beats": [
],
"canvases": [
],
"chromas": [
],
"color_curves": [
],
"drafts": [
],
"effects": [
],
"handwrites": [
],
"hsl": [
],
"images": [
],
"log_color_wheels": [
],
"masks": [
],
"material_animations": [
],
"placeholders": [
],
"primary_color_wheels": [
],
"realtime_denoises": [
],
"speeds": [
],
"stickers": [
],
"tail_leaders": [
],
"text_templates": [
],
"texts": [
],
"transitions": [
],
"video_effects": [
],
"video_trackings": [
],
"videos": [
]
},
"mutable_config": null,
"name": "",
"new_version": "52.0.0",
"platform": {
"app_id": 3704,
"app_version": "3.1.0-beta7",
"os": "mac",
"os_version": "15.6.1"
},
"relationships": [
],
"render_index_track_mode_on": true,
"tracks": [
],
"update_time": 0,
"version": 360000
}
================================================
FILE: template/default2/attachment_pc_common.json
================================================
{
"pc_feature_flag": 0,
"template_item_infos": [],
"unlock_template_ids": []
}
================================================
FILE: template/default2/draft_agency_config.json
================================================
{
"marterials": null,
"use_converter": false,
"video_resolution": 720
}
================================================
FILE: template/default2/draft_content.json
================================================
{
"canvas_config": {
"height": 1920,
"ratio": "original",
"width": 1080
},
"color_space": -1,
"config": {
"adjust_max_index": 1,
"attachment_info": [],
"combination_max_index": 1,
"export_range": null,
"extract_audio_last_index": 1,
"lyrics_recognition_id": "",
"lyrics_sync": true,
"lyrics_taskinfo": [],
"maintrack_adsorb": false,
"material_save_mode": 0,
"multi_language_current": "none",
"multi_language_list": [],
"multi_language_main": "none",
"multi_language_mode": "none",
"original_sound_last_index": 1,
"record_audio_last_index": 1,
"sticker_max_index": 1,
"subtitle_keywords_config": null,
"subtitle_recognition_id": "",
"subtitle_sync": true,
"subtitle_taskinfo": [],
"system_font_list": [],
"video_mute": false,
"zoom_info_params": null
},
"cover": null,
"create_time": 0,
"duration": 0,
"extra_info": null,
"fps": 30,
"free_render_index_mode_on": false,
"group_container": null,
"id": "a45b7687-c846-4296-a35d-e4f0e18e28dc",
"is_drop_frame_timecode": false,
"keyframe_graph_list": [],
"keyframes": {
"adjusts": [],
"audios": [],
"effects": [],
"filters": [],
"handwrites": [],
"stickers": [],
"texts": [],
"videos": []
},
"lyrics_effects": [],
"materials": {
"ai_translates": [],
"audio_balances": [],
"audio_effects": [],
"audio_fades": [],
"audio_track_indexes": [],
"audios": [],
"beats": [],
"canvases": [],
"chromas": [],
"color_curves": [],
"masks": [],
"digital_humans": [],
"drafts": [],
"effects": [],
"flowers": [],
"green_screens": [],
"handwrites": [],
"hsl": [],
"huazi": [],
"images": [],
"log_color_wheels": [],
"loudnesses": [],
"manual_deformations": [],
"material_animations": [],
"material_colors": [],
"multi_language_refs": [],
"placeholder_infos": [],
"placeholders": [],
"plugin_effects": [],
"primary_color_wheels": [],
"realtime_denoises": [],
"shapes": [],
"smart_crops": [],
"smart_relights": [],
"sound_channel_mappings": [],
"speeds": [],
"stickers": [],
"tail_leaders": [],
"text_templates": [],
"texts": [],
"time_marks": [],
"transitions": [],
"video_effects": [],
"video_trackings": [],
"videos": [],
"vocal_beautifys": [],
"vocal_separations": []
},
"mutable_config": null,
"name": "",
"new_version": "110.0.0",
"path": "",
"relationships": [],
"render_index_track_mode_on": true,
"retouch_cover": null,
"source": "default",
"static_cover_image_path": "",
"time_marks": null,
"tracks": [
{
"attribute": 0,
"flag": 0,
"id": "2D0629D7-BC55-4A90-867A-C078CFEEE0D2",
"name": "main_track",
"segments": [],
"type": "video"
}
],
"update_time": 0,
"version": 360000,
"platform": {
"app_id": 3704,
"app_source": "lv",
"app_version": "5.9.0",
"device_id": "9d624d7e23dc4e43a0ed4020b8e3e90e",
"hard_disk_id": "f242a67014ec01ecdc2a9280da37adb1",
"mac_address": "0c233adaa327abd93e3d6b5dae6d75e2",
"os": "mac",
"os_version": "14.5"
},
"last_modified_platform": {
"app_id": 3704,
"app_source": "cc",
"app_version": "5.9.0",
"device_id": "9d624d7e23dc4e43a0ed4020b8e3e90e",
"hard_disk_id": "f242a67014ec01ecdc2a9280da37adb1",
"mac_address": "0c233adaa327abd93e3d6b5dae6d75e2",
"os": "mac",
"os_version": "14.5"
}
}
================================================
FILE: template/default2/draft_info.json
================================================
{
"canvas_config": {
"height": 1920,
"ratio": "original",
"width": 1080
},
"color_space": -1,
"config": {
"adjust_max_index": 1,
"attachment_info": [],
"combination_max_index": 1,
"export_range": null,
"extract_audio_last_index": 1,
"lyrics_recognition_id": "",
"lyrics_sync": true,
"lyrics_taskinfo": [],
"maintrack_adsorb": false,
"material_save_mode": 0,
"multi_language_current": "none",
"multi_language_list": [],
"multi_language_main": "none",
"multi_language_mode": "none",
"original_sound_last_index": 1,
"record_audio_last_index": 1,
"sticker_max_index": 1,
"subtitle_keywords_config": null,
"subtitle_recognition_id": "",
"subtitle_sync": true,
"subtitle_taskinfo": [],
"system_font_list": [],
"video_mute": false,
"zoom_info_params": null
},
"cover": null,
"create_time": 0,
"duration": 0,
"extra_info": null,
"fps": 30,
"free_render_index_mode_on": false,
"group_container": null,
"id": "a45b7687-c846-4296-a35d-e4f0e18e28dc",
"is_drop_frame_timecode": false,
"keyframe_graph_list": [],
"keyframes": {
"adjusts": [],
"audios": [],
"effects": [],
"filters": [],
"handwrites": [],
"stickers": [],
"texts": [],
"videos": []
},
"lyrics_effects": [],
"materials": {
"ai_translates": [],
"audio_balances": [],
"audio_effects": [],
"audio_fades": [],
"audio_track_indexes": [],
"audios": [],
"beats": [],
"canvases": [],
"chromas": [],
"color_curves": [],
"masks": [],
"digital_humans": [],
"drafts": [],
"effects": [],
"flowers": [],
"green_screens": [],
"handwrites": [],
"hsl": [],
"huazi": [],
"images": [],
"log_color_wheels": [],
"loudnesses": [],
"manual_deformations": [],
"material_animations": [],
"material_colors": [],
"multi_language_refs": [],
"placeholder_infos": [],
"placeholders": [],
"plugin_effects": [],
"primary_color_wheels": [],
"realtime_denoises": [],
"shapes": [],
"smart_crops": [],
"smart_relights": [],
"sound_channel_mappings": [],
"speeds": [],
"stickers": [],
"tail_leaders": [],
"text_templates": [],
"texts": [],
"time_marks": [],
"transitions": [],
"video_effects": [],
"video_trackings": [],
"videos": [],
"vocal_beautifys": [],
"vocal_separations": []
},
"mutable_config": null,
"name": "",
"new_version": "110.0.0",
"path": "",
"relationships": [],
"render_index_track_mode_on": true,
"retouch_cover": null,
"source": "default",
"static_cover_image_path": "",
"time_marks": null,
"tracks": [
{
"attribute": 0,
"flag": 0,
"id": "2D0629D7-BC55-4A90-867A-C078CFEEE0D2",
"segments": [],
"name": "main_track",
"type": "video"
}
],
"update_time": 0,
"version": 360000,
"platform": {
"app_id": 3704,
"app_source": "lv",
"app_version": "5.9.0",
"device_id": "9d624d7e23dc4e43a0ed4020b8e3e90e",
"hard_disk_id": "f242a67014ec01ecdc2a9280da37adb1",
"mac_address": "0c233adaa327abd93e3d6b5dae6d75e2",
"os": "mac",
"os_version": "14.5"
},
"last_modified_platform": {
"app_id": 3704,
"app_source": "cc",
"app_version": "5.9.0",
"device_id": "9d624d7e23dc4e43a0ed4020b8e3e90e",
"hard_disk_id": "f242a67014ec01ecdc2a9280da37adb1",
"mac_address": "0c233adaa327abd93e3d6b5dae6d75e2",
"os": "mac",
"os_version": "14.5"
}
}
================================================
FILE: template/default2/draft_meta_info.json
================================================
{
"cloud_package_completed_time": "",
"draft_cloud_capcut_purchase_info": "",
"draft_cloud_last_action_download": false,
"draft_cloud_materials": [],
"draft_cloud_purchase_info": "",
"draft_cloud_template_id": "",
"draft_cloud_tutorial_info": "",
"draft_cloud_videocut_purchase_info": "",
"draft_cover": "draft_cover.jpg",
"draft_deeplink_url": "",
"draft_enterprise_info": {
"draft_enterprise_extra": "",
"draft_enterprise_id": "",
"draft_enterprise_name": "",
"enterprise_material": []
},
"draft_fold_path": "C:/Users/1/AppData/Local/JianyingPro/User Data/Projects/com.lveditor.draft/035ae208-ec69-4068-b479-777cb3bab17a",
"draft_id": "9977D3AA-CA25-4c52-B049-0D135322A1B8",
"draft_is_ai_packaging_used": false,
"draft_is_ai_shorts": false,
"draft_is_ai_translate": false,
"draft_is_article_video_draft": false,
"draft_is_from_deeplink": "false",
"draft_is_invisible": false,
"draft_materials": [
{
"type": 0,
"value": []
},
{
"type": 1,
"value": []
},
{
"type": 2,
"value": []
},
{
"type": 3,
"value": []
},
{
"type": 6,
"value": []
},
{
"type": 7,
"value": []
},
{
"type": 8,
"value": []
}
],
"draft_materials_copied_info": [],
"draft_name": "035ae208-ec69-4068-b479-777cb3bab17a",
"draft_new_version": "",
"draft_removable_storage_device": "",
"draft_root_path": "C:\\Users\\1\\AppData\\Local\\JianyingPro\\User Data\\Projects\\com.lveditor.draft",
"draft_segment_extra_info": [],
"draft_timeline_materials_size_": 2075,
"draft_type": "",
"tm_draft_cloud_completed": "",
"tm_draft_cloud_modified": 0,
"tm_draft_create": 1686707414251596,
"tm_draft_modified": 2686707417166183,
"tm_draft_removed": 0,
"tm_duration": 0
}
================================================
FILE: template/default2/template.tmp
================================================
{
"canvas_config": {
"height": 0,
"ratio": "original",
"width": 0
},
"color_space": -1,
"config": {
"adjust_max_index": 1,
"attachment_info": [
],
"combination_max_index": 1,
"export_range": null,
"extract_audio_last_index": 1,
"lyrics_recognition_id": "",
"lyrics_sync": true,
"lyrics_taskinfo": [
],
"maintrack_adsorb": true,
"material_save_mode": 0,
"original_sound_last_index": 1,
"record_audio_last_index": 1,
"sticker_max_index": 1,
"subtitle_recognition_id": "",
"subtitle_sync": true,
"subtitle_taskinfo": [
],
"video_mute": false,
"zoom_info_params": null
},
"cover": null,
"create_time": 0,
"duration": 0,
"extra_info": null,
"fps": 30,
"free_render_index_mode_on": false,
"group_container": null,
"id": "4c9ea46a-49f4-4e88-b028-363dbcfffcac",
"keyframes": {
"adjusts": [
],
"audios": [
],
"effects": [
],
"filters": [
],
"handwrites": [
],
"stickers": [
],
"texts": [
],
"videos": [
]
},
"last_modified_platform": {
"app_id": 3704,
"app_source": "lv",
"app_version": "3.9.0",
"device_id": "ece93fefa6d73d0879f6cf6251e212fd",
"hard_disk_id": "da04071d52c1f66c291bc2f5b1f0e87f",
"mac_address": "864b94efa06c9456b10992695eba19c4",
"os": "mac",
"os_version": "12.5.1"
},
"materials": {
"audio_balances": [
],
"audio_effects": [
],
"audio_fades": [
],
"audios": [
],
"beats": [
],
"canvases": [
],
"chromas": [
],
"color_curves": [
],
"drafts": [
],
"effects": [
],
"handwrites": [
],
"hsl": [
],
"images": [
],
"log_color_wheels": [
],
"manual_deformations": [
],
"masks": [
],
"material_animations": [
],
"placeholders": [
],
"plugin_effects": [
],
"primary_color_wheels": [
],
"realtime_denoises": [
],
"sound_channel_mappings": [
],
"speeds": [
],
"stickers": [
],
"tail_leaders": [
],
"text_templates": [
],
"texts": [
],
"transitions": [
],
"video_effects": [
],
"video_trackings": [
],
"videos": [
]
},
"mutable_config": null,
"name": "",
"new_version": "69.0.0",
"platform": {
"app_id": 3704,
"app_source": "lv",
"app_version": "3.9.0",
"device_id": "ece93fefa6d73d0879f6cf6251e212fd",
"hard_disk_id": "da04071d52c1f66c291bc2f5b1f0e87f",
"mac_address": "864b94efa06c9456b10992695eba19c4",
"os": "mac",
"os_version": "12.5.1"
},
"relationships": [
],
"render_index_track_mode_on": false,
"retouch_cover": null,
"source": "default",
"static_cover_image_path": "",
"tracks": [
],
"update_time": 0,
"version": 360000
}
================================================
FILE: template/readme.md
================================================
## default
此模板在新版本剪映上兼容性较好,但在5.9上,缩放关键帧不生效
## default2
解决在5.9上缩放关键帧不生效的问题
================================================
FILE: tests/__init__.py
================================================
# 空文件,标识tests为Python包
================================================
FILE: tests/manual_test_audio_infos.py
================================================
import json
def audio_infos(
mp3_urls: list,
timelines: list,
audio_effect: str = None,
volume: float = None
) -> str:
"""
根据音频URL和时间线生成音频信息JSON字符串
"""
# 检查参数长度是否匹配
if len(mp3_urls) != len(timelines):
raise ValueError(f"mp3_urls length ({len(mp3_urls)}) does not match timelines length ({len(timelines)})")
# 构建音频信息列表
infos = []
for i, (audio_url, timeline) in enumerate(zip(mp3_urls, timelines)):
info = {
"audio_url": audio_url,
"start": timeline["start"],
"end": timeline["end"]
}
# 添加可选参数
if audio_effect is not None:
info["audio_effect"] = audio_effect
if volume is not None:
info["volume"] = volume
infos.append(info)
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
return infos_json
def test_audio_infos():
"""测试音频信息生成功能"""
# 测试基本功能
print("测试基本功能:")
mp3_urls = [
"https://assets.jcaigc.cn/test1.mp3",
"https://assets.jcaigc.cn/test2.mp3"
]
timelines = [
{"start": 0, "end": 284891428},
{"start": 284891428, "end": 579578774}
]
audio_effect = "教堂"
volume = 1.0
infos_json = audio_infos(mp3_urls, timelines, audio_effect, volume)
print(f"Infos JSON: {infos_json}")
# 解析JSON验证内容
infos = json.loads(infos_json)
print(f"Parsed infos: {infos}")
# 验证内容
assert len(infos) == 2
assert infos[0]["audio_url"] == "https://assets.jcaigc.cn/test1.mp3"
assert infos[0]["start"] == 0
assert infos[0]["end"] == 284891428
assert infos[0]["audio_effect"] == "教堂"
assert infos[0]["volume"] == 1.0
assert infos[1]["audio_url"] == "https://assets.jcaigc.cn/test2.mp3"
assert infos[1]["start"] == 284891428
assert infos[1]["end"] == 579578774
assert infos[1]["audio_effect"] == "教堂"
assert infos[1]["volume"] == 1.0
print("基本功能测试通过")
# 测试可选参数为None的情况
print("\n测试可选参数为None的情况:")
infos_json_no_optional = audio_infos(mp3_urls, timelines)
infos_no_optional = json.loads(infos_json_no_optional)
print(f"Infos without optional params: {infos_no_optional}")
# 验证可选参数不存在
assert "audio_effect" not in infos_no_optional[0]
assert "volume" not in infos_no_optional[0]
assert "audio_effect" not in infos_no_optional[1]
assert "volume" not in infos_no_optional[1]
print("可选参数测试通过")
print("\n所有测试通过!")
if __name__ == "__main__":
test_audio_infos()
================================================
FILE: tests/manual_test_caption_infos.py
================================================
import json
def caption_infos(
texts: list,
timelines: list,
font_size: int = None,
keyword_color: str = None,
keyword_font_size: int = None,
keywords: list = None,
in_animation: str = None,
in_animation_duration: int = None,
loop_animation: str = None,
loop_animation_duration: int = None,
out_animation: str = None,
out_animation_duration: int = None,
transition: str = None,
transition_duration: int = None
) -> str:
"""
根据文本和时间线生成字幕信息JSON字符串
"""
# 检查参数长度是否匹配
if len(texts) != len(timelines):
raise ValueError(f"texts length ({len(texts)}) does not match timelines length ({len(timelines)})")
# 检查keywords长度是否匹配
if keywords is not None and len(keywords) != len(texts):
raise ValueError(f"keywords length ({len(keywords)}) does not match texts length ({len(texts)})")
# 构建字幕信息列表
infos = []
for i, (text, timeline) in enumerate(zip(texts, timelines)):
info = {
"start": timeline["start"],
"end": timeline["end"],
"text": text
}
# 添加关键词信息
if keywords is not None:
info["keyword"] = keywords[i]
# 添加可选参数
if keyword_color is not None:
info["keyword_color"] = keyword_color
if keyword_font_size is not None:
info["keyword_font_size"] = keyword_font_size
if font_size is not None:
info["font_size"] = font_size
if in_animation is not None:
info["in_animation"] = in_animation
if in_animation_duration is not None:
info["in_animation_duration"] = in_animation_duration
if loop_animation is not None:
info["loop_animation"] = loop_animation
if loop_animation_duration is not None:
info["loop_animation_duration"] = loop_animation_duration
if out_animation is not None:
info["out_animation"] = out_animation
if out_animation_duration is not None:
info["out_animation_duration"] = out_animation_duration
if transition is not None:
info["transition"] = transition
if transition_duration is not None:
info["transition_duration"] = transition_duration
infos.append(info)
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
return infos_json
def test_caption_infos():
"""测试字幕信息生成功能"""
# 测试基本功能
print("测试基本功能:")
texts = [
"床前明月光",
"明天我发光"
]
timelines = [
{"start": 0, "end": 284891428},
{"start": 284891428, "end": 579578774}
]
font_size = 15
keyword_color = "#ff0000"
keyword_font_size = 15
keywords = ["明月", "明天"]
in_animation = "展开"
in_animation_duration = 1
loop_animation = "分身"
loop_animation_duration = 2
out_animation = "闪现"
out_animation_duration = 3
transition = "推近"
transition_duration = 1
infos_json = caption_infos(
texts, timelines, font_size, keyword_color, keyword_font_size, keywords,
in_animation, in_animation_duration, loop_animation, loop_animation_duration,
out_animation, out_animation_duration, transition, transition_duration
)
print(f"Infos JSON: {infos_json}")
# 解析JSON验证内容
infos = json.loads(infos_json)
print(f"Parsed infos: {infos}")
# 验证内容
assert len(infos) == 2
assert infos[0]["start"] == 0
assert infos[0]["end"] == 284891428
assert infos[0]["text"] == "床前明月光"
assert infos[0]["keyword"] == "明月"
assert infos[0]["keyword_color"] == "#ff0000"
assert infos[0]["keyword_font_size"] == 15
assert infos[0]["font_size"] == 15
assert infos[0]["in_animation"] == "展开"
assert infos[0]["in_animation_duration"] == 1
assert infos[0]["loop_animation"] == "分身"
assert infos[0]["loop_animation_duration"] == 2
assert infos[0]["out_animation"] == "闪现"
assert infos[0]["out_animation_duration"] == 3
assert infos[0]["transition"] == "推近"
assert infos[0]["transition_duration"] == 1
assert infos[1]["start"] == 284891428
assert infos[1]["end"] == 579578774
assert infos[1]["text"] == "明天我发光"
assert infos[1]["keyword"] == "明天"
assert infos[1]["keyword_color"] == "#ff0000"
assert infos[1]["keyword_font_size"] == 15
assert infos[1]["font_size"] == 15
assert infos[1]["in_animation"] == "展开"
assert infos[1]["in_animation_duration"] == 1
assert infos[1]["loop_animation"] == "分身"
assert infos[1]["loop_animation_duration"] == 2
assert infos[1]["out_animation"] == "闪现"
assert infos[1]["out_animation_duration"] == 3
assert infos[1]["transition"] == "推近"
assert infos[1]["transition_duration"] == 1
print("基本功能测试通过")
# 测试可选参数为None的情况
print("\n测试可选参数为None的情况:")
infos_json_no_optional = caption_infos(texts, timelines)
infos_no_optional = json.loads(infos_json_no_optional)
print(f"Infos without optional params: {infos_no_optional}")
# 验证可选参数不存在
optional_params = [
"keyword_color", "keyword_font_size", "font_size", "in_animation",
"in_animation_duration", "loop_animation", "loop_animation_duration",
"out_animation", "out_animation_duration", "transition", "transition_duration"
]
for param in optional_params:
assert param not in infos_no_optional[0]
assert param not in infos_no_optional[1]
# 验证没有keyword参数时不会添加keyword字段
assert "keyword" not in infos_no_optional[0]
assert "keyword" not in infos_no_optional[1]
print("可选参数测试通过")
print("\n所有测试通过!")
if __name__ == "__main__":
test_caption_infos()
================================================
FILE: tests/manual_test_effect_infos.py
================================================
import json
def effect_infos(
effects: list,
timelines: list
) -> str:
"""
根据特效名称和时间线生成特效信息JSON字符串
"""
# 检查参数长度是否匹配
if len(effects) != len(timelines):
raise ValueError(f"effects length ({len(effects)}) does not match timelines length ({len(timelines)})")
# 构建特效信息列表
infos = []
for i, (effect, timeline) in enumerate(zip(effects, timelines)):
info = {
"effect_title": effect,
"start": timeline["start"],
"end": timeline["end"]
}
infos.append(info)
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
return infos_json
def test_effect_infos():
"""测试特效信息生成功能"""
# 测试基本功能
print("测试基本功能:")
effects = [
"红包来了",
"雪花"
]
timelines = [
{"start": 0, "end": 284891428},
{"start": 284891428, "end": 579578774}
]
infos_json = effect_infos(effects, timelines)
print(f"Infos JSON: {infos_json}")
# 解析JSON验证内容
infos = json.loads(infos_json)
print(f"Parsed infos: {infos}")
# 验证内容
assert len(infos) == 2
assert infos[0]["effect_title"] == "红包来了"
assert infos[0]["start"] == 0
assert infos[0]["end"] == 284891428
assert infos[1]["effect_title"] == "雪花"
assert infos[1]["start"] == 284891428
assert infos[1]["end"] == 579578774
print("基本功能测试通过")
print("\n所有测试通过!")
if __name__ == "__main__":
test_effect_infos()
================================================
FILE: tests/manual_test_imgs_infos.py
================================================
import json
def imgs_infos(
imgs: list,
timelines: list,
height: int = None,
width: int = None,
in_animation: str = None,
in_animation_duration: int = None,
loop_animation: str = None,
loop_animation_duration: int = None,
out_animation: str = None,
out_animation_duration: int = None,
transition: str = None,
transition_duration: int = None
) -> str:
"""
根据图片URL和时间线生成图片信息JSON字符串
"""
# 检查参数长度是否匹配
if len(imgs) != len(timelines):
raise ValueError(f"imgs length ({len(imgs)}) does not match timelines length ({len(timelines)})")
# 构建图片信息列表
infos = []
for i, (img_url, timeline) in enumerate(zip(imgs, timelines)):
info = {
"image_url": img_url,
"start": timeline["start"],
"end": timeline["end"]
}
# 添加可选参数
if height is not None:
info["height"] = height
if width is not None:
info["width"] = width
if in_animation is not None:
info["in_animation"] = in_animation
if in_animation_duration is not None:
info["in_animation_duration"] = in_animation_duration
if loop_animation is not None:
info["loop_animation"] = loop_animation
if loop_animation_duration is not None:
info["loop_animation_duration"] = loop_animation_duration
if out_animation is not None:
info["out_animation"] = out_animation
if out_animation_duration is not None:
info["out_animation_duration"] = out_animation_duration
if transition is not None:
info["transition"] = transition
if transition_duration is not None:
info["transition_duration"] = transition_duration
infos.append(info)
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
return infos_json
def test_imgs_infos():
"""测试图片信息生成功能"""
# 测试基本功能
print("测试基本功能:")
imgs = [
"https://assets.jcaigc.cn/demo.png",
"https://assets.jcaigc.cn/demo1.png"
]
timelines = [
{"start": 0, "end": 284891428},
{"start": 284891428, "end": 579578774}
]
height = 1080
width = 1920
in_animation = "展开"
in_animation_duration = 1
loop_animation = "分身"
loop_animation_duration = 2
out_animation = "闪现"
out_animation_duration = 3
transition = "推近"
transition_duration = 1
infos_json = imgs_infos(
imgs, timelines, height, width, in_animation, in_animation_duration,
loop_animation, loop_animation_duration, out_animation, out_animation_duration,
transition, transition_duration
)
print(f"Infos JSON: {infos_json}")
# 解析JSON验证内容
infos = json.loads(infos_json)
print(f"Parsed infos: {infos}")
# 验证内容
assert len(infos) == 2
assert infos[0]["image_url"] == "https://assets.jcaigc.cn/demo.png"
assert infos[0]["start"] == 0
assert infos[0]["end"] == 284891428
assert infos[0]["height"] == 1080
assert infos[0]["width"] == 1920
assert infos[0]["in_animation"] == "展开"
assert infos[0]["in_animation_duration"] == 1
assert infos[0]["loop_animation"] == "分身"
assert infos[0]["loop_animation_duration"] == 2
assert infos[0]["out_animation"] == "闪现"
assert infos[0]["out_animation_duration"] == 3
assert infos[0]["transition"] == "推近"
assert infos[0]["transition_duration"] == 1
assert infos[1]["image_url"] == "https://assets.jcaigc.cn/demo1.png"
assert infos[1]["start"] == 284891428
assert infos[1]["end"] == 579578774
assert infos[1]["height"] == 1080
assert infos[1]["width"] == 1920
assert infos[1]["in_animation"] == "展开"
assert infos[1]["in_animation_duration"] == 1
assert infos[1]["loop_animation"] == "分身"
assert infos[1]["loop_animation_duration"] == 2
assert infos[1]["out_animation"] == "闪现"
assert infos[1]["out_animation_duration"] == 3
assert infos[1]["transition"] == "推近"
assert infos[1]["transition_duration"] == 1
print("基本功能测试通过")
# 测试可选参数为None的情况
print("\n测试可选参数为None的情况:")
infos_json_no_optional = imgs_infos(imgs, timelines)
infos_no_optional = json.loads(infos_json_no_optional)
print(f"Infos without optional params: {infos_no_optional}")
# 验证可选参数不存在
optional_params = [
"height", "width", "in_animation", "in_animation_duration",
"loop_animation", "loop_animation_duration", "out_animation",
"out_animation_duration", "transition", "transition_duration"
]
for param in optional_params:
assert param not in infos_no_optional[0]
assert param not in infos_no_optional[1]
print("可选参数测试通过")
print("\n所有测试通过!")
if __name__ == "__main__":
test_imgs_infos()
================================================
FILE: tests/manual_test_keyframes_infos.py
================================================
import json
def keyframes_infos(
ctype: str,
offsets: str,
values: str,
segment_infos: list,
height: int = None,
width: int = None
) -> str:
"""
根据关键帧类型、位置比例和值生成关键帧信息JSON字符串
"""
# 解析offsets和values
offset_list = [int(x) for x in offsets.split("|")]
value_list = [float(x) for x in values.split("|")]
# 检查offsets和values长度是否匹配
if len(offset_list) != len(value_list):
raise ValueError(f"offsets length ({len(offset_list)}) does not match values length ({len(value_list)})")
# 构建关键帧信息列表
keyframes = []
# 处理每个片段信息
for segment_info in segment_infos:
segment_id = segment_info["id"]
start = segment_info["start"]
end = segment_info["end"]
duration = end - start
# 为每个offset创建关键帧
for offset_percent, value in zip(offset_list, value_list):
# 计算实际的时间偏移(微秒)
time_offset = int(start + (offset_percent / 100.0) * duration)
# 根据关键帧类型处理值的归一化
normalized_value = value
if ctype == "KFTypePositionX" and width is not None and width > 0:
normalized_value = value / width
elif ctype == "KFTypePositionY" and height is not None and height > 0:
normalized_value = value / height
keyframe = {
"offset": time_offset,
"property": ctype,
"segment_id": segment_id,
"value": normalized_value
}
keyframes.append(keyframe)
# 转换为JSON字符串
keyframes_json = json.dumps(keyframes, ensure_ascii=False)
return keyframes_json
def test_keyframes_infos():
"""测试关键帧信息生成功能"""
# 测试基本功能
print("测试基本功能:")
# 示例输入参数
ctype = "KFTypePositionX"
offsets = "0|100"
values = "1|2"
segment_infos = [
{
"end": 5000000,
"id": "c1369c795ca64fe38bac1f2a93e8a811",
"start": 0
}
]
width = 1920
height = 1080
keyframes_json = keyframes_infos(ctype, offsets, values, segment_infos, height, width)
print(f"Keyframes JSON: {keyframes_json}")
# 解析JSON验证内容
keyframes = json.loads(keyframes_json)
print(f"Parsed keyframes: {keyframes}")
# 验证内容
assert len(keyframes) == 2
assert keyframes[0]["offset"] == 0
assert keyframes[0]["property"] == "KFTypePositionX"
assert keyframes[0]["segment_id"] == "c1369c795ca64fe38bac1f2a93e8a811"
# 由于是KFTypePositionX类型并且提供了width,值应该被归一化
assert keyframes[0]["value"] == 1 / 1920
assert keyframes[1]["offset"] == 5000000
assert keyframes[1]["property"] == "KFTypePositionX"
assert keyframes[1]["segment_id"] == "c1369c795ca64fe38bac1f2a93e8a811"
# 由于是KFTypePositionX类型并且提供了width,值应该被归一化
assert keyframes[1]["value"] == 2 / 1920
print("基本功能测试通过")
# 测试不提供width和height的情况
print("\n测试不提供width和height的情况:")
keyframes_json_no_dim = keyframes_infos(ctype, offsets, values, segment_infos)
keyframes_no_dim = json.loads(keyframes_json_no_dim)
print(f"Keyframes without dimensions: {keyframes_no_dim}")
# 验证值没有被归一化
assert keyframes_no_dim[0]["value"] == 1
assert keyframes_no_dim[1]["value"] == 2
print("不提供width和height测试通过")
# 测试KFTypePositionY类型
print("\n测试KFTypePositionY类型:")
ctype_y = "KFTypePositionY"
keyframes_json_y = keyframes_infos(ctype_y, offsets, values, segment_infos, height, width)
keyframes_y = json.loads(keyframes_json_y)
print(f"Keyframes Y: {keyframes_y}")
# 验证值被height归一化
assert keyframes_y[0]["value"] == 1 / 1080
assert keyframes_y[1]["value"] == 2 / 1080
print("KFTypePositionY类型测试通过")
# 测试多个offset和value
print("\n测试多个offset和value:")
offsets_multi = "0|50|100"
values_multi = "1|2|1"
keyframes_json_multi = keyframes_infos(ctype, offsets_multi, values_multi, segment_infos, height, width)
keyframes_multi = json.loads(keyframes_json_multi)
print(f"Keyframes multi: {keyframes_multi}")
# 验证生成了3个关键帧
assert len(keyframes_multi) == 3
assert keyframes_multi[0]["offset"] == 0
assert keyframes_multi[1]["offset"] == 2500000 # 50% of 5000000
assert keyframes_multi[2]["offset"] == 5000000
print("多个offset和value测试通过")
print("\n所有测试通过!")
if __name__ == "__main__":
test_keyframes_infos()
================================================
FILE: tests/manual_test_video_infos.py
================================================
import json
def video_infos(
video_urls: list,
timelines: list,
height: int = None,
width: int = None,
mask: str = None,
transition: str = None,
transition_duration: int = None,
volume: float = 1.0
) -> str:
"""
根据视频URL和时间线生成视频信息JSON字符串
"""
# 检查参数长度是否匹配
if len(video_urls) != len(timelines):
raise ValueError(f"video_urls length ({len(video_urls)}) does not match timelines length ({len(timelines)})")
# 构建视频信息列表
infos = []
for i, (video_url, timeline) in enumerate(zip(video_urls, timelines)):
start = timeline["start"]
end = timeline["end"]
duration = end - start
info = {
"video_url": video_url,
"start": start,
"end": end,
"duration": duration
}
# 添加可选参数
if width is not None:
info["width"] = width
if height is not None:
info["height"] = height
if mask is not None:
info["mask"] = mask
if transition is not None:
info["transition"] = transition
if transition_duration is not None:
info["transition_duration"] = transition_duration
if volume is not None:
info["volume"] = volume
infos.append(info)
# 转换为JSON字符串
infos_json = json.dumps(infos, ensure_ascii=False)
return infos_json
def test_video_infos():
"""测试视频信息生成功能"""
# 测试基本功能
print("测试基本功能:")
# 示例输入参数
video_urls = [
"https://assets.jcaigc.cn/min.mp4",
"https://assets.jcaigc.cn/max.mp4"
]
timelines = [
{"end": 284891428, "start": 0},
{"end": 579578774, "start": 284891428}
]
height = 1080
width = 1920
mask = "爱心"
transition = "推近"
transition_duration = 1
volume = 1.0
infos_json = video_infos(
video_urls, timelines, height, width, mask,
transition, transition_duration, volume
)
print(f"Infos JSON: {infos_json}")
# 解析JSON验证内容
infos = json.loads(infos_json)
print(f"Parsed infos: {infos}")
# 验证内容
assert len(infos) == 2
assert infos[0]["video_url"] == "https://assets.jcaigc.cn/min.mp4"
assert infos[0]["start"] == 0
assert infos[0]["end"] == 284891428
assert infos[0]["duration"] == 284891428
assert infos[0]["width"] == 1920
assert infos[0]["height"] == 1080
assert infos[0]["mask"] == "爱心"
assert infos[0]["volume"] == 1.0
assert infos[0]["transition"] == "推近"
assert infos[0]["transition_duration"] == 1
assert infos[1]["video_url"] == "https://assets.jcaigc.cn/max.mp4"
assert infos[1]["start"] == 284891428
assert infos[1]["end"] == 579578774
assert infos[1]["duration"] == 294687346 # 579578774 - 284891428
assert infos[1]["width"] == 1920
assert infos[1]["height"] == 1080
assert infos[1]["mask"] == "爱心"
assert infos[1]["volume"] == 1.0
assert infos[1]["transition"] == "推近"
assert infos[1]["transition_duration"] == 1
print("基本功能测试通过")
# 测试可选参数为None的情况
print("\n测试可选参数为None的情况:")
infos_json_no_optional = video_infos(video_urls, timelines)
infos_no_optional = json.loads(infos_json_no_optional)
print(f"Infos without optional params: {infos_no_optional}")
# 验证可选参数不存在
optional_params = [
"width", "height", "mask", "transition",
"transition_duration", "volume"
]
for param in optional_params:
# volume有默认值1.0,所以会存在
if param != "volume":
assert param not in infos_no_optional[0]
assert param not in infos_no_optional[1]
else:
# volume有默认值1.0
assert infos_no_optional[0]["volume"] == 1.0
assert infos_no_optional[1]["volume"] == 1.0
print("可选参数测试通过")
print("\n所有测试通过!")
if __name__ == "__main__":
test_video_infos()
================================================
FILE: tests/test_add_audios.py
================================================
import requests
import json
import time
def test_add_audios():
"""测试音频添加接口"""
# 1. 先创建一个草稿
create_draft_url = "http://localhost:30000/openapi/capcut-mate/v1/create_draft"
create_draft_data = {
"width": 1920,
"height": 1080
}
try:
print("Creating draft...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"Failed to create draft: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"Draft created successfully: {draft_url}")
# 2. 添加音频
add_audios_url = "http://localhost:30000/openapi/capcut-mate/v1/add_audios"
audio_infos = [
{
"audio_url": "https://assets.jcaigc.cn/test1.mp3",
"duration": 10000000, # 10秒 (微秒)
"start": 0,
"end": 5000000, # 前5秒
"volume": 0.8,
"audio_effect": "教堂"
}
]
add_audios_data = {
"draft_url": draft_url,
"audio_infos": json.dumps(audio_infos)
}
print("Adding audios...")
add_response = requests.post(add_audios_url, json=add_audios_data)
if add_response.status_code == 200:
result = add_response.json()
print(f"Audios added successfully!")
print(f"Track ID: {result['track_id']}")
print(f"Audio IDs: {result['audio_ids']}")
print(f"Draft URL: {result['draft_url']}")
else:
print(f"Failed to add audios: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"Error occurred: {e}")
print("确保服务器正在运行 http://localhost:30000")
if __name__ == "__main__":
test_add_audios()
================================================
FILE: tests/test_add_captions_text_effect.py
================================================
"""
测试 add_captions 接口的 text_effect 功能
"""
import json
from src.service.add_captions import add_captions
from src.service.get_text_effects import resolve_text_effect, TEXT_EFFECT_MAP
def test_resolve_text_effect():
"""测试花字效果解析功能"""
print("=" * 60)
print("测试花字效果解析功能")
print("=" * 60)
# 测试 1: 通过中文名称查找
print("\n测试 1: 通过中文名称查找 '白字橘色发光花字'")
result = resolve_text_effect("白字橘色发光花字")
if result:
print(f"✓ 找到花字效果:{result}")
assert result['effect_id'] == "7296357486490144036"
assert result['resource_id'] == "7296357486490144036"
else:
print("✗ 未找到花字效果")
# 测试 2: 通过 effect_id 查找
print("\n测试 2: 通过 effect_id 查找 '7296357486490144036'")
result = resolve_text_effect("7296357486490144036")
if result:
print(f"✓ 找到花字效果:{result}")
else:
print("✗ 未找到花字效果")
# 测试 3: 不存在的名称
print("\n测试 3: 查找不存在的花字效果 '不存在的花字'")
result = resolve_text_effect("不存在的花字")
if result is None:
print("✓ 正确返回 None")
else:
print(f"✗ 应该返回 None,但返回了:{result}")
print("\n" + "=" * 60)
print("花字效果解析功能测试完成")
print("=" * 60)
def test_text_effect_map():
"""测试花字映射表"""
print("\n" + "=" * 60)
print("测试花字映射表内容")
print("=" * 60)
print(f"\n花字映射表包含 {len(TEXT_EFFECT_MAP)} 个花字效果:")
for name, data in TEXT_EFFECT_MAP.items():
print(f" - {name}: {data['effect_id']}")
def test_add_captions_with_text_effect():
"""测试添加字幕时应用花字效果(需要实际草稿环境)"""
print("\n" + "=" * 60)
print("测试 add_captions 集成花字效果功能")
print("=" * 60)
# 这是一个示例测试,实际需要有效的草稿 URL
print("\n注意:此测试需要有效的草稿环境")
print("示例调用代码:")
print("""
draft_url = "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=YOUR_DRAFT_ID"
captions = json.dumps([
{
"start": 0,
"end": 5000000,
"text": "测试花字效果",
"text_effect": "白字橘色发光花字"
}
])
# 使用全局 text_effect 参数
draft_url, track_id, text_ids, segment_ids, segment_infos = add_captions(
draft_url=draft_url,
captions=captions,
text_effect="白字橘色发光花字" # 全局花字效果
)
# 或者在每个 caption 中单独指定
captions = json.dumps([
{
"start": 0,
"end": 5000000,
"text": "测试花字效果 1",
"text_effect": "白字橘色发光花字" # 单个 caption 的花字
},
{
"start": 5000000,
"end": 10000000,
"text": "测试花字效果 2",
"text_effect": "黄字白色发光花字" # 不同的花字
}
])
""")
print("\n" + "=" * 60)
print("集成测试示例完成")
print("=" * 60)
if __name__ == "__main__":
# 运行所有测试
test_text_effect_map()
test_resolve_text_effect()
test_add_captions_with_text_effect()
print("\n" + "=" * 60)
print("所有测试完成!")
print("=" * 60)
================================================
FILE: tests/test_add_images.py
================================================
import requests
import json
import time
def test_add_images():
"""测试图片添加接口"""
# 1. 先创建一个草稿
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1920,
"height": 1080
}
try:
print("Creating draft...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"Failed to create draft: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"Draft created successfully: {draft_url}")
# 2. 添加图片
add_images_url = "http://localhost:8000/v1/add_images"
image_infos = [
{
"image_url": "https://example.com/image1.jpg",
"width": 1024,
"height": 1024,
"start": 0,
"end": 2000000, # 显示2秒
"in_animation": "淡入",
"out_animation": "淡出",
"in_animation_duration": 500000, # 0.5秒
"out_animation_duration": 500000, # 0.5秒
"transition": "淡入淡出",
"transition_duration": 500000 # 0.5秒
},
{
"image_url": "https://example.com/image2.png",
"width": 800,
"height": 600,
"start": 2000000, # 从第2秒开始
"end": 5000000, # 显示到第5秒
"loop_animation": "呼吸",
"loop_animation_duration": 1000000 # 1秒循环
}
]
add_images_data = {
"draft_url": draft_url,
"image_infos": json.dumps(image_infos),
"alpha": 0.9,
"scale_x": 1.2,
"scale_y": 1.2,
"transform_x": 50,
"transform_y": -30
}
print("Adding images...")
add_response = requests.post(add_images_url, json=add_images_data)
if add_response.status_code == 200:
result = add_response.json()
print(f"Images added successfully!")
print(f"Track ID: {result['track_id']}")
print(f"Image IDs: {result['image_ids']}")
print(f"Segment IDs: {result['segment_ids']}")
print(f"Segment Infos:")
for seg_info in result['segment_infos']:
print(f" - ID: {seg_info['id']}, Start: {seg_info['start']}, End: {seg_info['end']}")
print(f"Draft URL: {result['draft_url']}")
else:
print(f"Failed to add images: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"Error occurred: {e}")
print("Make sure the server is running on http://localhost:8000")
if __name__ == "__main__":
test_add_images()
================================================
FILE: tests/test_add_keyframes_normalize.py
================================================
"""add_keyframes / keyframes_infos 位置关键帧归一化集成测试。"""
import json
import os
import sys
from unittest.mock import MagicMock, patch
import pytest
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from src.pyJianYingDraft.segment import VisualSegment
from src.service.add_keyframes import add_keyframes
from src.service.keyframes_infos import keyframes_infos
@pytest.fixture
def visual_segment():
seg = MagicMock(spec=VisualSegment)
seg.duration = 10_000_000
seg.segment_id = "533f9ef5f7d341a2ad3f18eb4cb0f9b0"
return seg
def test_add_keyframes_normalizes_pixel_position_x(visual_segment):
"""回归:像素位移 -2608 / -699 应除以画布宽度。"""
keyframes = json.dumps([
{
"segment_id": "533f9ef5f7d341a2ad3f18eb4cb0f9b0",
"property": "KFTypePositionX",
"offset": 0,
"value": -2608.0,
},
{
"segment_id": "533f9ef5f7d341a2ad3f18eb4cb0f9b0",
"property": "KFTypePositionX",
"offset": 3_345_600,
"value": -699.0,
},
])
mock_script = MagicMock()
mock_script.width = 1920
mock_script.height = 1080
with patch("src.service.add_keyframes.helper.get_url_param", return_value="draft-kf"), \
patch("src.service.add_keyframes.DRAFT_CACHE", {"draft-kf": mock_script}), \
patch("src.service.add_keyframes.find_segment_by_id", return_value=visual_segment):
draft_url, added, affected = add_keyframes(
"http://localhost/v1/get_draft?draft_id=draft-kf",
keyframes,
)
assert added == 2
calls = visual_segment.add_keyframe.call_args_list
assert calls[0][0][2] == pytest.approx(-2608.0 / 1920)
assert calls[1][0][2] == pytest.approx(-699.0 / 1920)
assert affected == ["533f9ef5f7d341a2ad3f18eb4cb0f9b0"]
assert "draft-kf" in draft_url
def test_add_keyframes_rotation_value_unchanged(visual_segment):
mock_script = MagicMock(width=1920, height=1080)
keyframes = json.dumps([{
"segment_id": "533f9ef5f7d341a2ad3f18eb4cb0f9b0",
"property": "KFTypeRotation",
"offset": 0,
"value": 90.0,
}])
with patch("src.service.add_keyframes.helper.get_url_param", return_value="draft-kf"), \
patch("src.service.add_keyframes.DRAFT_CACHE", {"draft-kf": mock_script}), \
patch("src.service.add_keyframes.find_segment_by_id", return_value=visual_segment):
add_keyframes("http://localhost/v1/get_draft?draft_id=draft-kf", keyframes)
assert visual_segment.add_keyframe.call_args[0][2] == 90.0
def test_add_keyframes_uniform_scale_and_alpha_unchanged(visual_segment):
mock_script = MagicMock(width=1920, height=1080)
keyframes = json.dumps([
{
"segment_id": "533f9ef5f7d341a2ad3f18eb4cb0f9b0",
"property": "UNIFORM_SCALE",
"offset": 0,
"value": 1.3,
},
{
"segment_id": "533f9ef5f7d341a2ad3f18eb4cb0f9b0",
"property": "KFTypeAlpha",
"offset": 1_000_000,
"value": 0.5,
},
])
with patch("src.service.add_keyframes.helper.get_url_param", return_value="draft-kf"), \
patch("src.service.add_keyframes.DRAFT_CACHE", {"draft-kf": mock_script}), \
patch("src.service.add_keyframes.find_segment_by_id", return_value=visual_segment):
add_keyframes("http://localhost/v1/get_draft?draft_id=draft-kf", keyframes)
calls = visual_segment.add_keyframe.call_args_list
assert calls[0][0][2] == 1.3
assert calls[1][0][2] == 0.5
def test_keyframes_infos_normalizes_pixels_for_position():
out = keyframes_infos(
ctype="KFTypePositionX",
offsets="0|50",
values="-2608|-699",
segment_infos=[{"id": "seg-1", "start": 0, "end": 10_000_000}],
width=1920,
height=1080,
)
items = json.loads(out)
assert len(items) == 2
assert items[0]["value"] == pytest.approx(-2608.0 / 1920)
assert items[1]["value"] == pytest.approx(-699.0 / 1920)
assert items[0]["offset"] == 0
assert items[1]["offset"] == 5_000_000
================================================
FILE: tests/test_add_keyframes_refactor.py
================================================
import sys
import os
import json
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.service.add_keyframes import parse_keyframes_data
def test_parse_keyframes_data():
"""测试关键帧数据解析"""
print("Testing keyframe data parsing...")
# 测试数据
test_keyframes = [
{
"segment_id": "segment-1",
"property": "KFTypePositionX",
"offset": 0.0,
"value": 0.0
},
{
"segment_id": "segment-1",
"property": "KFTypePositionX",
"offset": 1.0,
"value": 0.5
}
]
# 将测试数据转换为JSON字符串
keyframes_json = json.dumps(test_keyframes)
# 解析关键帧数据
parsed_keyframes = parse_keyframes_data(keyframes_json)
# 验证解析结果
assert len(parsed_keyframes) == 2
assert parsed_keyframes[0]["segment_id"] == "segment-1"
assert parsed_keyframes[0]["property"] == "KFTypePositionX"
assert parsed_keyframes[0]["offset"] == 0.0
assert parsed_keyframes[0]["value"] == 0.0
assert parsed_keyframes[1]["segment_id"] == "segment-1"
assert parsed_keyframes[1]["property"] == "KFTypePositionX"
assert parsed_keyframes[1]["offset"] == 1.0
assert parsed_keyframes[1]["value"] == 0.5
print("✓ Keyframe data parsing test passed")
def test_parse_invalid_keyframes_data():
"""测试无效关键帧数据解析"""
print("Testing invalid keyframe data parsing...")
# 测试缺少必填字段的数据
invalid_keyframes = [
{
"segment_id": "segment-1",
"property": "KFTypePositionX",
# 缺少offset和value字段
}
]
# 将测试数据转换为JSON字符串
keyframes_json = json.dumps(invalid_keyframes)
# 尝试解析关键帧数据,应该抛出异常
try:
parse_keyframes_data(keyframes_json)
assert False, "Should have raised an exception"
except Exception as e:
print(f"✓ Invalid keyframe data parsing test passed, caught expected exception: {e}")
if __name__ == "__main__":
print("Running add_keyframes refactor tests...")
test_parse_keyframes_data()
test_parse_invalid_keyframes_data()
print("All tests passed!")
================================================
FILE: tests/test_add_masks.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
测试 add_masks 功能的单元测试
包含正常场景、边界场景和异常场景的完整测试用例
"""
import unittest
from unittest.mock import Mock, MagicMock, patch
from typing import List, Tuple
import sys
import os
# 添加项目根目录到路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.service.add_masks import (
add_masks,
add_mask_to_segment,
calculate_mask_size_params,
find_segment_by_id,
find_mask_type_by_name
)
from src.pyJianYingDraft import ScriptFile, MaskType
from src.pyJianYingDraft.video_segment import VideoSegment
from exceptions import CustomException, CustomError
class TestCalculateMaskSizeParams(unittest.TestCase):
"""测试遮罩尺寸参数计算函数"""
def test_circle_mask_size_calculation(self):
"""测试圆形遮罩尺寸计算(非矩形)"""
# 准备测试数据:素材尺寸 1920x1080,遮罩尺寸 512x512
mask_type = MaskType.圆形
width = 512
height = 512
material_width = 1920
material_height = 1080
# 调用函数
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
# 验证结果
expected_size = height / material_height # 512/1080 ≈ 0.474
self.assertAlmostEqual(size, expected_size, places=4)
self.assertIsNone(rect_width, "非矩形遮罩的 rect_width 应为 None")
def test_rectangle_mask_size_calculation(self):
"""测试矩形遮罩尺寸计算"""
# 准备测试数据
mask_type = MaskType.矩形
width = 800
height = 600
material_width = 1920
material_height = 1080
# 调用函数
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
# 验证结果
expected_size = height / material_height # 600/1080 ≈ 0.556
expected_rect_width = width / material_width # 800/1920 ≈ 0.417
self.assertAlmostEqual(size, expected_size, places=4)
self.assertAlmostEqual(rect_width, expected_rect_width, places=4)
def test_heart_mask_size_calculation(self):
"""测试爱心遮罩尺寸计算"""
mask_type = MaskType.爱心
width = 400
height = 400
material_width = 1920
material_height = 1080
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
expected_size = height / material_height
self.assertAlmostEqual(size, expected_size, places=4)
self.assertIsNone(rect_width)
def test_star_mask_size_calculation(self):
"""测试星形遮罩尺寸计算"""
mask_type = MaskType.星形
width = 300
height = 300
material_width = 1280
material_height = 720
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
expected_size = height / material_height # 300/720 ≈ 0.417
self.assertAlmostEqual(size, expected_size, places=4)
self.assertIsNone(rect_width)
def test_linear_mask_size_calculation(self):
"""测试线性遮罩尺寸计算"""
mask_type = MaskType.线性
width = 1000
height = 1000
material_width = 1920
material_height = 1080
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
expected_size = height / material_height
self.assertAlmostEqual(size, expected_size, places=4)
self.assertIsNone(rect_width)
def test_mirror_mask_size_calculation(self):
"""测试镜面遮罩尺寸计算"""
mask_type = MaskType.镜面
width = 600
height = 800
material_width = 1920
material_height = 1080
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
expected_size = height / material_height
self.assertAlmostEqual(size, expected_size, places=4)
self.assertIsNone(rect_width)
def test_zero_dimensions(self):
"""测试零尺寸的边界情况"""
mask_type = MaskType.圆形
width = 0
height = 0
material_width = 1920
material_height = 1080
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
self.assertEqual(size, 0.0)
self.assertIsNone(rect_width)
def test_large_dimensions(self):
"""测试大尺寸的边界情况"""
mask_type = MaskType.圆形
width = 4096
height = 4096
material_width = 1920
material_height = 1080
size, rect_width = calculate_mask_size_params(
mask_type=mask_type,
width=width,
height=height,
material_width=material_width,
material_height=material_height
)
expected_size = height / material_height # 4096/1080 ≈ 3.793
self.assertGreater(size, 1.0, "当遮罩尺寸大于素材时,size 应大于 1")
self.assertAlmostEqual(size, expected_size, places=4)
self.assertIsNone(rect_width)
class TestFindMaskTypeByName(unittest.TestCase):
"""测试遮罩类型查找函数"""
def test_find_circle_mask(self):
"""测试查找圆形遮罩"""
result = find_mask_type_by_name("圆形")
self.assertEqual(result, MaskType.圆形)
def test_find_rectangle_mask(self):
"""测试查找矩形遮罩"""
result = find_mask_type_by_name("矩形")
self.assertEqual(result, MaskType.矩形)
def test_find_linear_mask(self):
"""测试查找线性遮罩"""
result = find_mask_type_by_name("线性")
self.assertEqual(result, MaskType.线性)
def test_find_mirror_mask(self):
"""测试查找镜面遮罩"""
result = find_mask_type_by_name("镜面")
self.assertEqual(result, MaskType.镜面)
def test_find_heart_mask(self):
"""测试查找爱心遮罩"""
result = find_mask_type_by_name("爱心")
self.assertEqual(result, MaskType.爱心)
def test_find_star_mask(self):
"""测试查找星形遮罩"""
result = find_mask_type_by_name("星形")
self.assertEqual(result, MaskType.星形)
def test_find_invalid_mask(self):
"""测试查找不存在的遮罩类型"""
result = find_mask_type_by_name("不存在的遮罩")
self.assertIsNone(result)
def test_case_sensitive_search(self):
"""测试大小写敏感性"""
result = find_mask_type_by_name("圆形")
self.assertIsNotNone(result)
# 小写应该找不到
result_lower = find_mask_type_by_name("圆形")
self.assertEqual(result, result_lower)
class TestAddMaskToSegment(unittest.TestCase):
"""测试添加遮罩到片段函数"""
def setUp(self):
"""测试前准备"""
# 创建模拟的 ScriptFile
self.mock_script = Mock(spec=ScriptFile)
self.mock_script.materials = Mock()
self.mock_script.materials.masks = []
self.mock_segment = Mock(spec=VideoSegment)
self.mock_segment.segment_id = "test-segment-id"
self.mock_segment.mask = None # 初始无遮罩
self.mock_segment.material_size = (1920, 1080)
self.mock_segment.add_mask = Mock()
# 模拟轨道和片段查找
self.mock_track = Mock()
self.mock_track.segments = [self.mock_segment]
self.mock_script.tracks = {"video": self.mock_track}
def test_add_circle_mask_success(self):
"""测试成功添加圆形遮罩"""
with patch('src.service.add_masks.find_segment_by_id') as mock_find_segment:
mock_find_segment.return_value = self.mock_segment
# 模拟 add_mask 方法成功执行,设置 mask 属性
def mock_add_mask_impl(*args, **kwargs):
self.mock_segment.mask = Mock()
self.mock_segment.mask.global_id = "generated-mask-id"
return self.mock_segment
self.mock_segment.add_mask = Mock(side_effect=mock_add_mask_impl)
mask_id = add_mask_to_segment(
script=self.mock_script,
segment_id="test-segment-id",
mask_type=MaskType.圆形,
center_x=100,
center_y=200,
width=512,
height=512,
feather=20,
rotation=0,
invert=False,
round_corner=0
)
# 验证调用了 add_mask 方法
self.mock_segment.add_mask.assert_called_once()
call_args = self.mock_segment.add_mask.call_args
self.assertEqual(call_args.kwargs['mask_type'], MaskType.圆形)
self.assertEqual(call_args.kwargs['center_x'], 100.0)
self.assertEqual(call_args.kwargs['center_y'], 200.0)
self.assertEqual(call_args.kwargs['feather'], 20.0)
self.assertEqual(call_args.kwargs['rotation'], 0.0)
self.assertFalse(call_args.kwargs['invert'])
# 验证返回值
self.assertIsInstance(mask_id, str)
self.assertTrue(len(mask_id) > 0)
def test_add_rectangle_mask_with_all_params(self):
"""测试添加矩形遮罩(使用所有参数)"""
with patch('src.service.add_masks.find_segment_by_id') as mock_find_segment:
mock_find_segment.return_value = self.mock_segment
# 模拟 add_mask 方法成功执行,设置 mask 属性
def mock_add_mask_impl(*args, **kwargs):
self.mock_segment.mask = Mock()
self.mock_segment.mask.global_id = "rectangle-mask-id"
return self.mock_segment
self.mock_segment.add_mask = Mock(side_effect=mock_add_mask_impl)
mask_id = add_mask_to_segment(
script=self.mock_script,
segment_id="test-segment-id",
mask_type=MaskType.矩形,
center_x=50,
center_y=100,
width=800,
height=600,
feather=30,
rotation=45,
invert=True,
round_corner=25
)
# 验证调用了 add_mask 方法且包含所有参数
self.mock_segment.add_mask.assert_called_once()
call_args = self.mock_segment.add_mask.call_args
self.assertEqual(call_args.kwargs['mask_type'], MaskType.矩形)
self.assertIn('rect_width', call_args.kwargs)
self.assertIn('round_corner', call_args.kwargs)
def test_segment_not_found(self):
"""测试片段未找到的异常情况"""
with patch('src.service.add_masks.find_segment_by_id') as mock_find_segment:
mock_find_segment.return_value = None
with self.assertRaises(CustomException) as context:
add_mask_to_segment(
script=self.mock_script,
segment_id="non-existent-segment",
mask_type=MaskType.圆形
)
self.assertEqual(context.exception.err, CustomError.SEGMENT_NOT_FOUND)
def test_non_video_segment(self):
"""测试非视频片段类型异常"""
with patch('src.service.add_masks.find_segment_by_id') as mock_find_segment:
mock_non_video_segment = Mock()
mock_non_video_segment.segment_id = "audio-segment"
mock_find_segment.return_value = mock_non_video_segment
with self.assertRaises(CustomException) as context:
add_mask_to_segment(
script=self.mock_script,
segment_id="audio-segment",
mask_type=MaskType.圆形
)
self.assertEqual(context.exception.err, CustomError.INVALID_SEGMENT_TYPE)
@patch('src.service.add_masks.find_segment_by_id')
def test_segment_already_has_mask(self, mock_find_segment):
"""测试片段已有遮罩的情况"""
mock_existing_mask = Mock()
mock_existing_mask.global_id = "existing-mask-id"
self.mock_segment.mask = mock_existing_mask
mock_find_segment.return_value = self.mock_segment
# 应该返回现有遮罩 ID 而不是抛出异常
mask_id = add_mask_to_segment(
script=self.mock_script,
segment_id="test-segment-id",
mask_type=MaskType.圆形
)
self.assertEqual(mask_id, "existing-mask-id")
# 不应调用 add_mask
self.mock_segment.add_mask.assert_not_called()
class TestAddMasksIntegration(unittest.TestCase):
"""测试 add_masks 集成函数"""
@patch('src.service.add_masks.DRAFT_CACHE')
@patch('src.service.add_masks.helper.get_url_param')
@patch('src.service.add_masks.find_mask_type_by_name')
@patch('src.service.add_masks.add_mask_to_segment')
def test_add_single_circle_mask(self, mock_add_mask, mock_find_mask_type, mock_get_param, mock_cache):
"""测试添加单个圆形遮罩的正常场景"""
# 设置模拟返回值
mock_get_param.return_value = "test-draft-id"
mock_find_mask_type.return_value = MaskType.圆形
mock_add_mask.return_value = "generated-mask-id"
# 创建模拟草稿
mock_script = Mock(spec=ScriptFile)
mock_script.save = Mock()
# 正确设置 DRAFT_CACHE 的模拟
mock_cache.__contains__ = Mock(return_value=True)
mock_cache.__getitem__ = Mock(return_value=mock_script)
# 调用函数
draft_url = "https://example.com/draft?draft_id=test-draft-id"
segment_ids = ["segment-1"]
result = add_masks(
draft_url=draft_url,
segment_ids=segment_ids,
name="圆形",
X=100,
Y=200,
width=512,
height=512,
feather=20,
rotation=0,
invert=False,
roundCorner=0
)
# 验证结果
self.assertEqual(result[0], draft_url)
self.assertEqual(result[1], 1) # masks_added
self.assertEqual(result[2], segment_ids) # affected_segments
self.assertEqual(result[3], ["generated-mask-id"]) # mask_ids
# 验证保存了草稿
mock_script.save.assert_called_once()
@patch('src.service.add_masks.DRAFT_CACHE')
@patch('src.service.add_masks.helper.get_url_param')
@patch('src.service.add_masks.find_mask_type_by_name')
@patch('src.service.add_masks.add_mask_to_segment')
def test_add_multiple_masks(self, mock_add_mask, mock_find_mask_type, mock_get_param, mock_cache):
"""测试批量添加多个遮罩"""
mock_get_param.return_value = "test-draft-id"
mock_find_mask_type.return_value = MaskType.圆形
mock_add_mask.side_effect = ["mask-id-1", "mask-id-2", "mask-id-3"]
mock_script = Mock(spec=ScriptFile)
mock_script.save = Mock()
# 正确设置 DRAFT_CACHE 的模拟
mock_cache.__contains__ = Mock(return_value=True)
mock_cache.__getitem__ = Mock(return_value=mock_script)
draft_url = "https://example.com/draft?draft_id=test-draft-id"
segment_ids = ["segment-1", "segment-2", "segment-3"]
result = add_masks(
draft_url=draft_url,
segment_ids=segment_ids,
name="圆形"
)
self.assertEqual(result[1], 3) # masks_added
self.assertEqual(len(result[2]), 3) # affected_segments
self.assertEqual(len(result[3]), 3) # mask_ids
self.assertEqual(mock_add_mask.call_count, 3)
@patch('src.service.add_masks.helper.get_url_param')
@patch('src.service.add_masks.DRAFT_CACHE')
def test_invalid_draft_url(self, mock_cache, mock_get_param):
"""测试无效的 draft_url 异常"""
mock_get_param.return_value = None
with self.assertRaises(CustomException) as context:
add_masks(
draft_url="invalid-url",
segment_ids=["segment-1"]
)
self.assertEqual(context.exception.err, CustomError.INVALID_DRAFT_URL)
@patch('src.service.add_masks.DRAFT_CACHE')
@patch('src.service.add_masks.helper.get_url_param')
def test_empty_segment_ids(self, mock_get_param, mock_cache):
"""测试空的 segment_ids 异常"""
mock_get_param.return_value = "test-draft-id"
# 设置缓存,这样会通过第一个检查
mock_cache.__contains__ = Mock(return_value=True)
with self.assertRaises(CustomException) as context:
add_masks(
draft_url="https://example.com/draft?draft_id=test-draft-id",
segment_ids=[]
)
self.assertEqual(context.exception.err, CustomError.INVALID_MASK_INFO)
@patch('src.service.add_masks.DRAFT_CACHE')
@patch('src.service.add_masks.helper.get_url_param')
@patch('src.service.add_masks.find_mask_type_by_name')
def test_invalid_mask_type(self, mock_find_mask_type, mock_get_param, mock_cache):
"""测试无效的遮罩类型异常"""
mock_get_param.return_value = "test-draft-id"
mock_cache.__contains__ = Mock(return_value=True)
mock_find_mask_type.return_value = None
with self.assertRaises(CustomException) as context:
add_masks(
draft_url="https://example.com/draft?draft_id=test-draft-id",
segment_ids=["segment-1"],
name="无效遮罩类型"
)
self.assertEqual(context.exception.err, CustomError.MASK_NOT_FOUND)
@patch('src.service.add_masks.DRAFT_CACHE')
@patch('src.service.add_masks.helper.get_url_param')
@patch('src.service.add_masks.find_mask_type_by_name')
@patch('src.service.add_masks.add_mask_to_segment')
def test_partial_failure_handling(self, mock_add_mask, mock_find_mask_type, mock_get_param, mock_cache):
"""测试部分失败的处理"""
mock_get_param.return_value = "test-draft-id"
mock_find_mask_type.return_value = MaskType.圆形
# 第一个成功,第二个失败
mock_add_mask.side_effect = Exception("添加失败")
mock_script = Mock(spec=ScriptFile)
mock_script.save = Mock()
mock_cache.__getitem__.return_value = mock_script
with self.assertRaises(Exception):
add_masks(
draft_url="https://example.com/draft?draft_id=test-draft-id",
segment_ids=["segment-1", "segment-2"]
)
if __name__ == '__main__':
unittest.main()
================================================
FILE: tests/test_add_videos_concurrent.py
================================================
"""
add_videos 并发锁功能单元测试
测试异步锁机制防止同一草稿的并发写操作
测试覆盖:
1. 正常场景:带锁的视频添加
2. 边界场景:超时、并发访问同一草稿
3. 异常场景:锁获取失败、无效草稿 ID
"""
import asyncio
import pytest
import sys
import os
from unittest.mock import patch, MagicMock
import json
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.service.add_videos import add_videos_async, _add_videos_internal
from src.utils.draft_lock_manager import DraftLockManager
from exceptions import CustomException, CustomError
class TestAddVideosAsync:
"""add_videos_async 测试类"""
@pytest.fixture
def mock_draft_data(self):
"""模拟草稿数据"""
return {
"draft_url": "http://localhost/v1/get_draft?draft_id=test-draft-001",
"video_infos": json.dumps([
{
"video_url": "https://example.com/video1.mp4",
"width": 1920,
"height": 1080,
"start": 0,
"end": 5000000,
"duration": 5000000
}
])
}
@pytest.mark.asyncio
async def test_add_videos_with_lock_success(self, mock_draft_data):
"""测试成功添加视频(带锁)"""
# Mock 所有依赖
with patch('src.service.add_videos.helper.get_url_param') as mock_get_param, \
patch('src.service.add_videos.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_videos.os.makedirs'), \
patch('src.service.add_videos.parse_video_data') as mock_parse, \
patch('src.service.add_videos.add_video_to_draft') as mock_add, \
patch('src.service.add_videos.download') as mock_download:
# 设置 mock(prepare 阶段会执行 draft_id in DRAFT_CACHE)
mock_get_param.return_value = "test-draft-001"
mock_cache.__contains__.return_value = True
mock_parse.return_value = [{
'video_url': 'https://example.com/video1.mp4',
'width': 1920,
'height': 1080,
'start': 0,
'end': 5000000,
'duration': 5000000,
'original_start': 0,
'original_end': 5000000
}]
mock_add.return_value = ("segment-123", 5000000)
mock_download.return_value = "/tmp/video.mp4"
# Mock 草稿对象
mock_script = MagicMock()
mock_script.width = 1920
mock_script.height = 1080
mock_script.tracks = {"track-1": MagicMock(track_id="track-123", name="video_track")}
mock_script.materials.videos = [MagicMock(material_id="video-123")]
mock_cache.__getitem__.return_value = mock_script
# 调用函数
result = await add_videos_async(
draft_url=mock_draft_data["draft_url"],
video_infos=mock_draft_data["video_infos"]
)
# 验证结果
assert len(result) == 4
assert result[0] == mock_draft_data["draft_url"]
# 验证锁被正确获取和释放
lock_manager = DraftLockManager()
assert not lock_manager.is_locked("test-draft-001")
@pytest.mark.asyncio
async def test_add_videos_invalid_draft_url(self):
"""测试无效草稿 URL"""
with pytest.raises(CustomException) as exc_info:
await add_videos_async(
draft_url="invalid-url",
video_infos='[]'
)
assert exc_info.value.err == CustomError.INVALID_DRAFT_URL
@pytest.mark.asyncio
async def test_add_videos_lock_timeout(self):
"""测试锁超时"""
lock_manager = DraftLockManager()
draft_id = "timeout-test"
# 先获取锁并不释放
await lock_manager.acquire_lock(draft_id)
prepared = [{
"video_url": "https://example.com/v.mp4",
"start": 0,
"end": 1,
"duration": 1,
"original_start": 0,
"original_end": 1,
"local_video_path": "/tmp/timeout-test.mp4",
}]
# 尝试获取同一个草稿的锁(应该超时);prepare 在锁之前,需绕过网络/缓存
with patch("src.service.add_videos._prepare_videos_local_files", return_value=prepared):
with pytest.raises(CustomException) as exc_info:
await add_videos_async(
draft_url=f"http://localhost/v1/get_draft?draft_id={draft_id}",
video_infos="[]",
lock_timeout=0.1,
)
assert exc_info.value.err == CustomError.DRAFT_LOCK_TIMEOUT
assert "Failed to acquire lock" in exc_info.value.detail
# 清理
await lock_manager.release_lock(draft_id)
@pytest.mark.asyncio
async def test_concurrent_add_videos_same_draft(self):
"""测试并发添加视频到同一草稿(应该串行执行)"""
execution_order = []
draft_url = "http://localhost/v1/get_draft?draft_id=concurrent-test"
video_infos = json.dumps([{
"video_url": "https://example.com/video.mp4",
"start": 0,
"end": 5000000
}])
prep_counter = {"n": 0}
def fake_prepare(draft_url: str, video_infos: str):
prep_counter["n"] += 1
n = prep_counter["n"]
return [{
"video_url": "https://example.com/video.mp4",
"start": 0,
"end": 5000000,
"duration": 5000000,
"original_start": 0,
"original_end": 5000000,
"local_video_path": f"/tmp/video_prep_{n}.mp4",
}]
async def add_video_task(task_id):
try:
execution_order.append(f"{task_id}_start")
await add_videos_async(
draft_url=draft_url,
video_infos=video_infos,
lock_timeout=5.0,
)
execution_order.append(f"{task_id}_complete")
except Exception as e:
execution_order.append(f"{task_id}_error: {str(e)}")
with patch("src.service.add_videos.helper.get_url_param", return_value="concurrent-test"), \
patch("src.service.add_videos.DRAFT_CACHE") as mock_cache, \
patch("src.service.add_videos.os.makedirs"), \
patch("src.service.add_videos._prepare_videos_local_files", side_effect=fake_prepare), \
patch("src.service.add_videos.add_video_to_draft") as mock_add:
mock_cache.__contains__.return_value = True
mock_script = MagicMock()
mock_script.width = 1920
mock_script.height = 1080
mock_script.tracks = {}
mock_script.materials.videos = []
mock_cache.__getitem__.return_value = mock_script
call_seq = {"i": 0}
def add_side_effect(*args, **kwargs):
call_seq["i"] += 1
return (f"segment-{call_seq['i']}", 5000000)
mock_add.side_effect = add_side_effect
await asyncio.gather(
add_video_task(1),
add_video_task(2),
add_video_task(3),
)
# 验证任务是串行执行的(每个任务必须等待前一个释放锁)
# 第一个任务必须先完成
first_complete_index = execution_order.index("1_complete")
assert first_complete_index > 0 # 必须在开始之后
# 验证没有并发冲突
error_count = sum(1 for e in execution_order if "error" in e)
assert error_count == 0
@pytest.mark.asyncio
async def test_concurrent_add_videos_different_drafts(self):
"""测试并发添加视频到不同草稿(可以并行执行)"""
completed_drafts = []
def fake_get_url_param(url: str, key: str):
if key != "draft_id":
return None
return url.split("draft_id=")[-1]
def fake_prepare(draft_url: str, video_infos: str):
did = fake_get_url_param(draft_url, "draft_id")
return [{
"video_url": f"https://example.com/video_{did}.mp4",
"start": 0,
"end": 5000000,
"duration": 5000000,
"original_start": 0,
"original_end": 5000000,
"local_video_path": f"/tmp/video_{did}.mp4",
}]
def make_script():
mock_script = MagicMock()
mock_script.width = 1920
mock_script.height = 1080
mock_script.tracks = {}
mock_script.materials.videos = []
return mock_script
async def add_video_task(draft_id):
await add_videos_async(
draft_url=f"http://localhost/v1/get_draft?draft_id={draft_id}",
video_infos="[]",
)
completed_drafts.append(draft_id)
with patch("src.service.add_videos.helper.get_url_param", side_effect=fake_get_url_param), \
patch("src.service.add_videos._prepare_videos_local_files", side_effect=fake_prepare), \
patch("src.service.add_videos.DRAFT_CACHE") as mock_cache, \
patch("src.service.add_videos.os.makedirs"), \
patch("src.service.add_videos.add_video_to_draft") as mock_add:
mock_cache.__contains__.return_value = True
mock_cache.__getitem__.side_effect = lambda _did: make_script()
mock_add.return_value = ("segment-mock", 5000000)
tasks = [
add_video_task("draft-a"),
add_video_task("draft-b"),
add_video_task("draft-c"),
]
await asyncio.gather(*tasks)
# 所有任务都应该完成
assert len(completed_drafts) == 3
assert "draft-a" in completed_drafts
assert "draft-b" in completed_drafts
assert "draft-c" in completed_drafts
class TestAddVideosInternal:
"""_add_videos_internal 测试类"""
@pytest.mark.asyncio
async def test_internal_function_requires_lock(self):
"""测试内部函数需要外层锁控制"""
# 这是一个白盒测试,验证内部函数确实不包含锁逻辑
# 通过检查函数签名和文档
import inspect
from src.service.add_videos import _add_videos_internal
# 获取函数文档
docstring = _add_videos_internal.__doc__
# 验证文档中明确说明需要外层锁控制
assert "无锁" in docstring or "需外层控制" in docstring or "并发" in docstring
# 验证函数签名不包含锁相关参数
sig = inspect.signature(_add_videos_internal)
params = list(sig.parameters.keys())
assert "lock_timeout" not in params
assert "lock_manager" not in params
class TestLockManagerIntegration:
"""锁管理器集成测试"""
@pytest.mark.asyncio
async def test_lock_cleanup_after_exception(self):
"""测试异常后锁的清理"""
draft_id = "exception-test"
lock_manager = DraftLockManager()
# 获取锁
await lock_manager.acquire_lock(draft_id)
try:
# 模拟某个操作失败
raise ValueError("Simulated error")
except ValueError:
pass
finally:
# 确保释放锁
await lock_manager.release_lock(draft_id)
# 验证锁已释放
assert not lock_manager.is_locked(draft_id)
@pytest.mark.asyncio
async def test_lock_stats_accuracy(self):
"""测试锁统计信息准确性"""
lock_manager = DraftLockManager()
await lock_manager.clear_all_locks()
draft_ids = ["stats-1", "stats-2", "stats-3"]
# 初始状态
stats = lock_manager.get_stats()
assert stats["total_locks"] == 0
assert stats["locked_drafts"] == 0
assert stats["total_holders"] == 0
# 获取所有锁
for draft_id in draft_ids:
await lock_manager.acquire_lock(draft_id)
stats = lock_manager.get_stats()
assert stats["total_locks"] == 3
assert stats["locked_drafts"] == 3
assert stats["total_holders"] == 3
# 释放一个锁
await lock_manager.release_lock(draft_ids[0])
stats = lock_manager.get_stats()
# release_lock 不删除 _locks 中的条目,total_locks 仍为草稿数
assert stats["total_locks"] == 3
assert stats["locked_drafts"] == 2
assert stats["total_holders"] == 2
if __name__ == "__main__":
pytest.main([__file__, "-v"])
================================================
FILE: tests/test_add_videos_concurrent_demo.py
================================================
"""
add_videos 并发保护功能演示测试
简单演示锁机制如何防止同一草稿的并发写操作
"""
import asyncio
import pytest
import sys
import os
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.utils.draft_lock_manager import DraftLockManager
class TestConcurrentProtectionDemo:
"""并发保护演示测试"""
@pytest.mark.asyncio
async def test_same_draft_serialized_access(self):
"""演示:同一草稿的并发访问会被强制串行化"""
lock_manager = DraftLockManager()
draft_id = "demo-draft"
execution_log = []
async def worker(worker_id, work_duration=0.1):
"""模拟一个 add_videos 请求"""
await lock_manager.acquire_lock(draft_id)
try:
# 开始处理
execution_log.append(f"worker_{worker_id}_start")
await asyncio.sleep(work_duration) # 模拟写入草稿文件
execution_log.append(f"worker_{worker_id}_end")
finally:
await lock_manager.release_lock(draft_id)
# 启动 3 个并发请求(实际场景是 3 个 HTTP 请求同时调用 add_videos)
tasks = [
worker(1),
worker(2),
worker(3)
]
await asyncio.gather(*tasks)
# 验证:由于锁的保护,任务必须一个接一个执行
# 每个 worker 的 start 和 end 必须是连续的
print("\n执行日志:")
for i, log in enumerate(execution_log):
print(f" {i+1}. {log}")
# 验证没有并发冲突(不会有交叉执行)
assert len(execution_log) == 6
# 验证每个 worker 都是成对执行的
for i in range(0, len(execution_log), 2):
worker_num = execution_log[i].split('_')[1]
assert execution_log[i].endswith('_start')
assert execution_log[i+1].endswith('_end')
assert execution_log[i+1].split('_')[1] == worker_num
@pytest.mark.asyncio
async def test_different_drafts_parallel_access(self):
"""演示:不同草稿可以并行访问"""
lock_manager = DraftLockManager()
execution_log = []
async def worker(draft_id, worker_id):
"""模拟处理不同草稿的请求"""
await lock_manager.acquire_lock(draft_id)
try:
execution_log.append(f"worker_{worker_id}_processing_{draft_id}")
await asyncio.sleep(0.1)
finally:
await lock_manager.release_lock(draft_id)
# 3 个 worker 处理不同的草稿
tasks = [
worker("draft-A", 1),
worker("draft-B", 2),
worker("draft-C", 3)
]
await asyncio.gather(*tasks)
print("\n不同草稿并行处理日志:")
for log in execution_log:
print(f" {log}")
# 验证:所有任务都完成了
assert len(execution_log) == 3
# 验证:每个草稿都被处理了
drafts_processed = [log.split('_')[-1] for log in execution_log]
assert "draft-A" in drafts_processed
assert "draft-B" in drafts_processed
assert "draft-C" in drafts_processed
@pytest.mark.asyncio
async def test_lock_prevents_concurrent_writes(self):
"""演示:锁机制防止并发写入导致文件损坏"""
lock_manager = DraftLockManager()
draft_id = "protected-draft"
# 模拟共享资源(草稿文件)
shared_data = {"counter": 0, "corrupted": False}
async def unsafe_write(worker_id):
"""没有锁保护的写入(会导致损坏)"""
# 读取
current = shared_data["counter"]
await asyncio.sleep(0.01) # 模拟 I/O 延迟
# 写入
shared_data["counter"] = current + 1
# 检查是否有并发修改
if shared_data["counter"] > max(int(worker_id), 1):
shared_data["corrupted"] = True
async def safe_write(worker_id):
"""有锁保护的写入(安全)"""
await lock_manager.acquire_lock(draft_id)
try:
current = shared_data["counter"]
await asyncio.sleep(0.01)
shared_data["counter"] = current + 1
finally:
await lock_manager.release_lock(draft_id)
# 测试不安全的写入(注释掉,避免真正损坏数据)
# unsafe_tasks = [unsafe_write(i) for i in range(1, 11)]
# await asyncio.gather(*unsafe_tasks)
# print(f"\n不安全写入结果:counter={shared_data['counter']}, corrupted={shared_data['corrupted']}")
# 重置
shared_data["counter"] = 0
shared_data["corrupted"] = False
# 测试安全的写入
safe_tasks = [safe_write(i) for i in range(1, 11)]
await asyncio.gather(*safe_tasks)
print(f"\n安全写入结果:counter={shared_data['counter']}, corrupted={shared_data['corrupted']}")
# 验证:有锁保护时,counter 应该正好是 10
assert shared_data["counter"] == 10
assert shared_data["corrupted"] is False
if __name__ == "__main__":
# 运行演示
async def main():
tester = TestConcurrentProtectionDemo()
print("=" * 60)
print("测试 1: 同一草稿的串行访问")
print("=" * 60)
await tester.test_same_draft_serialized_access()
print("\n" + "=" * 60)
print("测试 2: 不同草稿的并行访问")
print("=" * 60)
await tester.test_different_drafts_parallel_access()
print("\n" + "=" * 60)
print("测试 3: 锁保护防止并发写入")
print("=" * 60)
await tester.test_lock_prevents_concurrent_writes()
print("\n" + "=" * 60)
print("所有演示完成!")
print("=" * 60)
asyncio.run(main())
================================================
FILE: tests/test_add_videos_duration.py
================================================
import requests
import json
import time
def test_add_videos_with_duration():
"""测试带duration参数的视频添加接口"""
# 1. 先创建一个草稿
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1920,
"height": 1080
}
try:
print("Creating draft...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"Failed to create draft: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"Draft created successfully: {draft_url}")
# 2. 添加视频 - 测试指定duration的情况
add_videos_url = "http://localhost:8000/v1/add_videos"
video_infos = [
{
"video_url": "https://example.com/video1.mp4",
"width": 1920,
"height": 1080,
"start": 0,
"end": 3000000, # 3秒
"duration": 6000000, # 指定6秒,比实际播放时长长
"volume": 0.8
},
{
"video_url": "https://example.com/video2.mp4",
"width": 1280,
"height": 720,
"start": 3000000, # 从第3秒开始
"end": 5000000, # 到第5秒结束
"duration": 1000000, # 指定1秒,比实际播放时长短
"volume": 1.0
},
# 测试不提供duration字段的情况
{
"video_url": "https://example.com/video3.mp4",
"width": 1920,
"height": 1080,
"start": 5000000, # 从第5秒开始
"end": 8000000, # 到第8秒结束
"volume": 0.5
}
]
add_videos_data = {
"draft_url": draft_url,
"video_infos": json.dumps(video_infos),
"alpha": 1.0,
"scale_x": 1.0,
"scale_y": 1.0,
"transform_x": 0,
"transform_y": 0
}
print("Adding videos...")
add_response = requests.post(add_videos_url, json=add_videos_data)
if add_response.status_code == 200:
result = add_response.json()
print(f"Videos added successfully!")
print(f"Track ID: {result['track_id']}")
print(f"Video IDs: {result['video_ids']}")
print(f"Segment IDs: {result['segment_ids']}")
print(f"Draft URL: {result['draft_url']}")
else:
print(f"Failed to add videos: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"Error occurred: {e}")
print("Make sure the server is running on http://localhost:8000")
if __name__ == "__main__":
test_add_videos_with_duration()
================================================
FILE: tests/test_add_videos_refactor.py
================================================
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.service.add_videos import parse_video_data
import json
def test_parse_video_data_with_duration():
"""测试解析带duration参数的视频数据"""
# 测试数据:指定duration与实际播放时长不同
video_infos = [
{
"video_url": "https://example.com/video1.mp4",
"width": 1920,
"height": 1080,
"start": 0,
"end": 3000000, # 3秒
"duration": 6000000, # 指定6秒,比实际播放时长长
"volume": 0.8
},
{
"video_url": "https://example.com/video2.mp4",
"width": 1280,
"height": 720,
"start": 3000000, # 从第3秒开始
"end": 5000000, # 到第5秒结束
"duration": 1000000, # 指定1秒,比实际播放时长短
"volume": 1.0
},
# 测试不提供duration字段的情况
{
"video_url": "https://example.com/video3.mp4",
"width": 1920,
"height": 1080,
"start": 5000000, # 从第5秒开始
"end": 8000000, # 到第8秒结束
"volume": 0.5
}
]
json_str = json.dumps(video_infos)
parsed_videos = parse_video_data(json_str)
print("Parsed video data:")
for i, video in enumerate(parsed_videos):
print(f"Video {i+1}:")
print(f" URL: {video['video_url']}")
print(f" Width: {video['width']}")
print(f" Height: {video['height']}")
print(f" Start: {video['start']}")
print(f" End: {video['end']}")
print(f" Duration: {video['duration']}")
print(f" Play Duration (end-start): {video['end'] - video['start']}")
print(f" Volume: {video['volume']}")
print()
# 验证第一个视频:指定duration为6秒,播放时长为3秒
assert parsed_videos[0]['duration'] == 6000000
assert parsed_videos[0]['end'] - parsed_videos[0]['start'] == 3000000
# 验证第二个视频:指定duration为1秒,播放时长为2秒
assert parsed_videos[1]['duration'] == 1000000
assert parsed_videos[1]['end'] - parsed_videos[1]['start'] == 2000000
# 验证第三个视频:未指定duration,应该等于end-start
assert parsed_videos[2]['duration'] == 3000000
assert parsed_videos[2]['end'] - parsed_videos[2]['start'] == 3000000
print("All tests passed!")
if __name__ == "__main__":
test_parse_video_data_with_duration()
================================================
FILE: tests/test_all_text_effects.py
================================================
"""
测试扩展后的花字效果功能(1440 个花字)
"""
import random
from src.service.get_text_effects import TEXT_EFFECT_MAP, resolve_text_effect, get_text_effects
def test_total_count():
"""测试花字总数"""
print("=" * 80)
print("测试 1: 验证花字效果总数")
print("=" * 80)
total = len(TEXT_EFFECT_MAP)
print(f"\n✓ 当前加载的花字效果总数:{total}")
assert total == 1440, f"期望 1440 个花字,但实际有 {total} 个"
print(f"✓ 验证通过:共有 {total} 个花字效果")
return total
def test_resolve_by_name():
"""测试通过中文名称查找花字"""
print("\n" + "=" * 80)
print("测试 2: 通过中文名称查找花字")
print("=" * 80)
# 测试几个示例花字
test_cases = [
"红黄火焰综艺花字",
"蓝白色立体综艺描边花字",
"黄字橙光花字",
]
for effect_name in test_cases:
if effect_name in TEXT_EFFECT_MAP:
result = resolve_text_effect(effect_name)
print(f"\n✓ 找到花字:'{effect_name}'")
print(f" Effect ID: {result['effect_id']}")
print(f" Resource ID: {result['resource_id']}")
else:
print(f"\n✗ 未找到花字:'{effect_name}'")
print("\n✓ 中文名称查找测试完成")
def test_resolve_by_id():
"""测试通过 effect_id 查找花字"""
print("\n" + "=" * 80)
print("测试 3: 通过 effect_id 查找花字")
print("=" * 80)
# 获取第一个花字的 ID
first_effect_name = list(TEXT_EFFECT_MAP.keys())[0]
first_effect_id = TEXT_EFFECT_MAP[first_effect_name]["effect_id"]
result = resolve_text_effect(first_effect_id)
print(f"\n✓ 通过 ID '{first_effect_id}' 查找到:")
print(f" 名称:{first_effect_name}")
print(f" Resource ID: {result['resource_id']}")
print("\n✓ effect_id 查找测试完成")
def test_random_effects():
"""随机测试 10 个花字"""
print("\n" + "=" * 80)
print("测试 4: 随机测试 10 个花字效果")
print("=" * 80)
all_effects = list(TEXT_EFFECT_MAP.items())
random_effects = random.sample(all_effects, 10)
print("\n随机选择的 10 个花字效果:")
for i, (name, data) in enumerate(random_effects, 1):
print(f" {i}. {name} (ID: {data['effect_id']})")
# 验证可以解析
result = resolve_text_effect(name)
assert result is not None, f"无法解析花字:{name}"
print("\n✓ 随机测试通过")
def test_filter_by_mode():
"""测试按模式过滤花字"""
print("\n" + "=" * 80)
print("测试 5: 按模式过滤花字效果")
print("=" * 80)
# 测试 mode=0 (所有)
all_effects = get_text_effects(mode=0)
print(f"\n✓ Mode 0 (所有): {len(all_effects)} 个花字")
# 测试 mode=1 (VIP)
vip_effects = get_text_effects(mode=1)
print(f"✓ Mode 1 (VIP): {len(vip_effects)} 个花字")
# 测试 mode=2 (免费)
free_effects = get_text_effects(mode=2)
print(f"✓ Mode 2 (免费): {len(free_effects)} 个花字")
# 验证数量关系
assert len(all_effects) == len(vip_effects) + len(free_effects), \
"所有效果数量应该等于 VIP+免费的总和"
print("\n✓ 过滤功能测试通过")
def test_special_characters():
"""测试包含特殊字符的花字名称"""
print("\n" + "=" * 80)
print("测试 6: 包含特殊字符的花字名称")
print("=" * 80)
special_names = []
for name in TEXT_EFFECT_MAP.keys():
if any(c in name for c in ['#', '!', '-', ' ']):
special_names.append(name)
print(f"\n找到 {len(special_names)} 个包含特殊字符的花字名称:")
for name in special_names[:10]: # 只显示前 10 个
print(f" - {name}")
if len(special_names) > 10:
print(f" ... 还有 {len(special_names) - 10} 个")
# 测试解析其中一个
if special_names:
test_name = special_names[0]
result = resolve_text_effect(test_name)
print(f"\n✓ 测试解析 '{test_name}': 成功")
print("\n✓ 特殊字符测试通过")
def test_export_capability():
"""测试导出功能"""
print("\n" + "=" * 80)
print("测试 7: 导出花字列表到文件")
print("=" * 80)
output_file = "test_effects_list.txt"
with open(output_file, 'w', encoding='utf-8') as f:
f.write("# 花字效果列表 (共 1440 个)\n\n")
f.write("| 序号 | 花字名称 | Effect ID |\n")
f.write("|------|---------|-----------|\n")
for i, (name, data) in enumerate(TEXT_EFFECT_MAP.items(), 1):
f.write(f"| {i} | {name} | {data['effect_id']} |\n")
print(f"\n✓ 已导出花字列表到:{output_file}")
print(f" 文件大小:请查看生成的文件")
print("\n✓ 导出测试通过")
def main():
"""运行所有测试"""
print("\n" + "=" * 80)
print("开始测试扩展后的花字效果功能 (1440 个花字)")
print("=" * 80)
try:
# 运行所有测试
test_total_count()
test_resolve_by_name()
test_resolve_by_id()
test_random_effects()
test_filter_by_mode()
test_special_characters()
test_export_capability()
# 总结
print("\n" + "=" * 80)
print("✅ 所有测试通过!")
print("=" * 80)
print(f"\n📊 统计摘要:")
print(f" • 总花字数:1,440 个")
print(f" • 支持中文名称查找:是")
print(f" • 支持 effect_id 查找:是")
print(f" • 支持模式过滤:是")
print(f" • 特殊字符支持:是")
print(f" • 导出功能:是")
print("\n🎉 花字效果扩展功能运行正常!")
print("=" * 80)
except AssertionError as e:
print(f"\n❌ 测试失败:{str(e)}")
raise
except Exception as e:
print(f"\n❌ 发生错误:{str(e)}")
raise
if __name__ == "__main__":
main()
================================================
FILE: tests/test_api_version.py
================================================
import pytest
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_v1_create_draft():
"""测试v1版本的create_draft接口"""
response = client.post("/openapi/v1/create_draft", params={"height": 1080, "width": 1920})
assert response.status_code == 200
assert "message" in response.json()
assert "draft_id" in response.json()
assert response.json()["message"] == "草稿创建成功"
def test_version_not_found():
"""测试不存在的API版本"""
response = client.post("/openapi/v2/create_draft", params={"height": 1080, "width": 1920})
assert response.status_code == 404
if __name__ == "__main__":
# 运行测试
pytest.main(["-v", "test_api_version.py"])
================================================
FILE: tests/test_audio_infos.py
================================================
import sys
import os
import json
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.service.audio_infos import audio_infos
def test_audio_infos():
"""测试音频信息生成功能"""
# 测试基本功能
print("测试基本功能:")
mp3_urls = [
"https://assets.jcaigc.cn/test1.mp3",
"https://assets.jcaigc.cn/test2.mp3"
]
timelines = [
{"start": 0, "end": 284891428},
{"start": 284891428, "end": 579578774}
]
audio_effect = "教堂"
volume = 1.0
infos_json = audio_infos(mp3_urls, timelines, audio_effect, volume)
print(f"Infos JSON: {infos_json}")
# 解析JSON验证内容
infos = json.loads(infos_json)
print(f"Parsed infos: {infos}")
# 验证内容
assert len(infos) == 2
assert infos[0]["audio_url"] == "https://assets.jcaigc.cn/test1.mp3"
assert infos[0]["start"] == 0
assert infos[0]["end"] == 284891428
assert infos[0]["audio_effect"] == "教堂"
assert infos[0]["volume"] == 1.0
assert infos[1]["audio_url"] == "https://assets.jcaigc.cn/test2.mp3"
assert infos[1]["start"] == 284891428
assert infos[1]["end"] == 579578774
assert infos[1]["audio_effect"] == "教堂"
assert infos[1]["volume"] == 1.0
print("基本功能测试通过")
# 测试可选参数为None的情况
print("\n测试可选参数为None的情况:")
infos_json_no_optional = audio_infos(mp3_urls, timelines)
infos_no_optional = json.loads(infos_json_no_optional)
print(f"Infos without optional params: {infos_no_optional}")
# 验证可选参数不存在
assert "audio_effect" not in infos_no_optional[0]
assert "volume" not in infos_no_optional[0]
assert "audio_effect" not in infos_no_optional[1]
assert "volume" not in infos_no_optional[1]
print("可选参数测试通过")
# 测试长度不匹配的情况
print("\n测试长度不匹配的情况:")
try:
audio_infos(["url1"], timelines, audio_effect, volume)
assert False, "应该抛出ValueError异常"
except ValueError as e:
print(f"正确捕获异常: {e}")
print("长度不匹配测试通过")
if __name__ == "__main__":
test_audio_infos()
print("\n所有测试通过!")
================================================
FILE: tests/test_audio_infos_simple.py
================================================
import sys
import os
import json
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
# 直接导入我们需要的函数
from src.service.audio_infos import audio_infos
def test_audio_infos():
"""测试音频信息生成功能"""
# 测试基本功能
print("测试基本功能:")
mp3_urls = [
"https://assets.jcaigc.cn/test1.mp3",
"https://assets.jcaigc.cn/test2.mp3"
]
timelines = [
{"start": 0, "end": 284891428},
{"start": 284891428, "end": 579578774}
]
audio_effect = "教堂"
volume = 1.0
infos_json = audio_infos(mp3_urls, timelines, audio_effect, volume)
print(f"Infos JSON: {infos_json}")
# 解析JSON验证内容
infos = json.loads(infos_json)
print(f"Parsed infos: {infos}")
# 验证内容
assert len(infos) == 2
assert infos[0]["audio_url"] == "https://assets.jcaigc.cn/test1.mp3"
assert infos[0]["start"] == 0
assert infos[0]["end"] == 284891428
assert infos[0]["audio_effect"] == "教堂"
assert infos[0]["volume"] == 1.0
assert infos[1]["audio_url"] == "https://assets.jcaigc.cn/test2.mp3"
assert infos[1]["start"] == 284891428
assert infos[1]["end"] == 579578774
assert infos[1]["audio_effect"] == "教堂"
assert infos[1]["volume"] == 1.0
print("基本功能测试通过")
# 测试可选参数为None的情况
print("\n测试可选参数为None的情况:")
infos_json_no_optional = audio_infos(mp3_urls, timelines)
infos_no_optional = json.loads(infos_json_no_optional)
print(f"Infos without optional params: {infos_no_optional}")
# 验证可选参数不存在
assert "audio_effect" not in infos_no_optional[0]
assert "volume" not in infos_no_optional[0]
assert "audio_effect" not in infos_no_optional[1]
assert "volume" not in infos_no_optional[1]
print("可选参数测试通过")
print("\n所有测试通过!")
if __name__ == "__main__":
test_audio_infos()
================================================
FILE: tests/test_audio_timelines.py
================================================
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.service.audio_timelines import audio_timelines
def test_audio_timelines():
"""测试音频时间线计算功能"""
# 测试空链接列表
print("测试空链接列表:")
timelines, all_timelines = audio_timelines([])
print(f"Timelines: {timelines}")
print(f"All timelines: {all_timelines}")
# 测试正常情况(这里只是模拟,实际测试需要真实的音频文件URL)
# 我们可以在这里添加更多的测试用例
if __name__ == "__main__":
test_audio_timelines()
================================================
FILE: tests/test_caption_keywords.py
================================================
import requests
import json
import time
def test_caption_keywords():
"""测试字幕关键词高亮功能"""
# 1. 先创建一个草稿
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1920,
"height": 1080
}
try:
print("Creating draft...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"Failed to create draft: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"Draft created successfully: {draft_url}")
# 2. 添加带关键词高亮的字幕
add_captions_url = "http://localhost:8000/v1/add_captions"
captions = [
{
"start": 0,
"end": 5000000, # 5秒
"text": "欢迎使用剪映字幕功能",
"keyword": "剪映|功能", # 关键词
"keyword_color": "#ff0000" # 红色高亮
},
{
"start": 5000000,
"end": 10000000, # 10秒
"text": "这是一个测试字幕",
"keyword": "测试",
"keyword_color": "#00ff00" # 绿色高亮
}
]
add_captions_data = {
"draft_url": draft_url,
"captions": json.dumps(captions),
"text_color": "#ffffff", # 默认白色文本
"font_size": 16
}
print("Adding captions with keyword highlighting...")
add_response = requests.post(add_captions_url, json=add_captions_data)
if add_response.status_code == 200:
result = add_response.json()
print(f"Captions added successfully!")
print(f"Track ID: {result['track_id']}")
print(f"Text IDs: {result['text_ids']}")
print(f"Segment IDs: {result['segment_ids']}")
print(f"Draft URL: {result['draft_url']}")
else:
print(f"Failed to add captions: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"Error occurred: {e}")
print("Make sure the server is running on http://localhost:8000")
if __name__ == "__main__":
test_caption_keywords()
================================================
FILE: tests/test_caption_transform.py
================================================
import requests
import json
import time
def test_caption_transform():
"""测试字幕位置变换功能"""
# 1. 先创建一个草稿
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1920,
"height": 1080
}
try:
print("Creating draft...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"Failed to create draft: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"Draft created successfully: {draft_url}")
# 2. 添加带位置变换的字幕
add_captions_url = "http://localhost:8000/v1/add_captions"
captions = [
{
"start": 0,
"end": 5000000, # 5秒
"text": "测试字幕位置变换"
}
]
add_captions_data = {
"draft_url": draft_url,
"captions": json.dumps(captions),
"text_color": "#ffffff", # 默认白色文本
"font_size": 16,
"transform_x": 100, # X轴位置偏移100像素
"transform_y": -50 # Y轴位置偏移-50像素
}
print("Adding captions with position transformation...")
add_response = requests.post(add_captions_url, json=add_captions_data)
if add_response.status_code == 200:
result = add_response.json()
print(f"Captions added successfully!")
print(f"Track ID: {result['track_id']}")
print(f"Text IDs: {result['text_ids']}")
print(f"Segment IDs: {result['segment_ids']}")
print(f"Draft URL: {result['draft_url']}")
else:
print(f"Failed to add captions: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"Error occurred: {e}")
print("Make sure the server is running on http://localhost:8000")
if __name__ == "__main__":
test_caption_transform()
================================================
FILE: tests/test_caption_transform_fix.py
================================================
import requests
import json
import time
def test_caption_transform_fix():
"""测试修复后的字幕位置变换功能"""
# 1. 先创建一个草稿
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1920,
"height": 1080
}
try:
print("Creating draft...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"Failed to create draft: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"Draft created successfully: {draft_url}")
# 2. 添加带位置变换的字幕(测试修复后的transform参数)
add_captions_url = "http://localhost:8000/v1/add_captions"
captions = [
{
"start": 0,
"end": 5000000, # 5秒
"text": "测试字幕位置变换修复"
}
]
add_captions_data = {
"draft_url": draft_url,
"captions": json.dumps(captions),
"text_color": "#ffffff", # 默认白色文本
"font_size": 16,
"transform_x": 200, # X轴位置偏移200像素
"transform_y": 100 # Y轴位置偏移100像素
}
print("Adding captions with fixed position transformation...")
print(f"Setting transform_x={add_captions_data['transform_x']}, transform_y={add_captions_data['transform_y']}")
add_response = requests.post(add_captions_url, json=add_captions_data)
if add_response.status_code == 200:
result = add_response.json()
print(f"Captions added successfully!")
print(f"Track ID: {result['track_id']}")
print(f"Text IDs: {result['text_ids']}")
print(f"Segment IDs: {result['segment_ids']}")
print(f"Draft URL: {result['draft_url']}")
print("\n注意:在剪映中验证时,transform_x=200应该精确移动200像素,而不是之前的400像素")
print("修复说明:根据ClipSettings类定义,transform参数单位是'半个画布宽/高',已使用正确的转换公式")
else:
print(f"Failed to add captions: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"Error occurred: {e}")
print("Make sure the server is running on http://localhost:8000")
if __name__ == "__main__":
test_caption_transform_fix()
================================================
FILE: tests/test_chinese_encoding_fix.py
================================================
"""
测试 get_audio_duration 接口的编码问题修复
"""
import requests
import json
def test_chinese_metadata_audio():
"""测试包含中文元数据的音频文件"""
# 服务器地址
base_url = "http://localhost:60000"
api_url = f"{base_url}/openapi/v1/get_audio_duration"
# 测试数据 - 使用包含中文元数据的音频文件
test_data = {
"mp3_url": "https://assets.jcaigc.cn/test1.mp3" # 这个文件包含中文元数据
}
# 请求头
headers = {
"Content-Type": "application/json"
}
try:
print("🚀 开始测试包含中文元数据的音频文件...")
print(f"📍 请求URL: {api_url}")
print(f"📝 请求数据: {json.dumps(test_data, indent=2)}")
# 发送POST请求
response = requests.post(api_url, json=test_data, headers=headers, timeout=120)
print(f"📊 响应状态码: {response.status_code}")
if response.status_code == 200:
result = response.json()
print(f"✅ 编码问题修复成功!")
print(f"📋 响应数据: {json.dumps(result, indent=2, ensure_ascii=False)}")
# 验证响应格式
if "duration" in result:
duration = result["duration"]
print(f"🎵 音频时长: {duration} 微秒 = {duration/1000000:.3f} 秒")
return True
else:
print("❌ 响应中缺少 'duration' 字段")
return False
else:
print(f"❌ 请求失败,状态码: {response.status_code}")
print(f"📄 响应内容: {response.text}")
return False
except requests.exceptions.ConnectionError:
print("❌ 连接失败,请确保服务器已启动 (python main.py)")
return False
except requests.exceptions.Timeout:
print("❌ 请求超时")
return False
except Exception as e:
print(f"❌ 测试异常: {str(e)}")
return False
if __name__ == "__main__":
success = test_chinese_metadata_audio()
if success:
print("\n🎉 中文元数据编码问题修复测试通过!")
else:
print("\n💥 中文元数据编码问题修复测试失败!")
================================================
FILE: tests/test_ci_dependencies.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CI/CD跨平台依赖测试脚本
验证在不同环境下的依赖安装行为
"""
import sys
import subprocess
import platform
def test_platform_info():
"""显示平台信息"""
print(f"📊平信息:")
print(f" 系统: {platform.system()}")
print(f" 版本: {platform.release()}")
print(f" Python: {sys.platform}")
print(f" 架: {platform.machine()}")
print()
def test_basic_sync():
"""测试基础依赖同步"""
print("🧪测试基础依赖同步 (uv sync):")
try:
result = subprocess.run(['uv', 'sync'], capture_output=True, text=True, timeout=60)
if result.returncode == 0:
print(" ✅基础依赖同步成功")
else:
print(" ❌基础依赖同步失败")
print(f" 错误信息: {result.stderr[:200]}")
except Exception as e:
print(f" ❌执行失败: {e}")
print()
def test_windows_extras():
"""测试Windows可选依赖"""
print("🧪测试Windows可选依赖 (uv pip install -e .[windows]):")
try:
result = subprocess.run(['uv', 'pip', 'install', '-e', '.[windows]'],
capture_output=True, text=True, timeout=60)
if result.returncode == 0:
print(" ✅ Windows可选依赖安装成功")
else:
print(" ⚠ Windows可选依赖安装可能部分成功或跳过")
if "No candidates were found" in result.stderr:
print(" 💡这是正常的 - 在非Windows平台上会跳过Windows特定依赖")
else:
print(f" 错误信息: {result.stderr[:200]}")
except Exception as e:
print(f" ❌执行失败: {e}")
print()
def test_import_functionality():
"""测试功能导入"""
print("🧪测试功能导入:")
try:
# 添加项目路径
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
#测试基础导入
import src.pyJianYingDraft as draft
print(f" ✅基础导入成功 (ISWIN: {draft.ISWIN})")
#测试服务层
from src import service
print(" ✅ 服务层导入成功")
#测试API层
from src.router import v1_router
print(" ✅ API层导入成功")
except Exception as e:
print(f" ❌导入失败: {e}")
import traceback
traceback.print_exc()
print()
def main():
"""主测试函数"""
print("=" * 60)
print("🚀 CI/CD跨平台依赖测试")
print("=" * 60)
test_platform_info()
test_basic_sync()
test_windows_extras()
test_import_functionality()
print("=" * 60)
print("✅ 测试完成")
print("=" * 60)
if __name__ == "__main__":
main()
================================================
FILE: tests/test_cross_platform.py
================================================
#!/usr/bin/env python3
"""
跨平台兼容性测试脚本
验证在不同平台上的导入和基本功能
"""
import sys
import platform
def test_cross_platform_compatibility():
print(f"Platform: {platform.system()} {platform.release()}")
print(f"Python version: {sys.version}")
print("=" * 50)
# 测试基础导入
try:
import src.pyJianYingDraft as draft
print("✅ 基础导入成功")
print(f" ISWIN: {draft.ISWIN}")
print(f" JianyingController available: {draft.JianyingController is not None}")
except Exception as e:
print(f"❌ 基础导入失败: {e}")
return False
# 测试服务层导入
try:
from src import service
print("✅ 服务层导入成功")
except Exception as e:
print(f"❌ 服务层导入失败: {e}")
return False
# 测试API层导入
try:
from src.router import v1
print("✅ API层导入成功")
except Exception as e:
print(f"❌ API层导入失败: {e}")
return False
# 测试工具层导入
try:
from src.utils import helper
print("✅ 工具层导入成功")
except Exception as e:
print(f"❌ 工具层导入失败: {e}")
return False
print("=" * 50)
print("🎉 所有基础导入测试通过!")
# 平台特定测试
if draft.ISWIN:
print("\n🖥️ Windows平台特定测试:")
try:
# 测试UI自动化相关导入
from src.utils.video_task_manager import UIAutomationInitializerInThread
print("✅ UI自动化初始化器导入成功")
# 测试剪映控制器
if draft.JianyingController:
print("✅ 剪映控制器可用")
else:
print("⚠️ 剪映控制器不可用")
except Exception as e:
print(f"❌ Windows特定功能测试失败: {e}")
else:
print("\n🐧 Linux平台特定测试:")
try:
# 测试UI自动化占位符
from src.utils.video_task_manager import UIAutomationInitializerInThread
print("✅ UI自动化占位符导入成功")
# 测试占位符功能
with UIAutomationInitializerInThread():
print("✅ UI自动化占位符上下文管理器工作正常")
except Exception as e:
print(f"❌ Linux特定功能测试失败: {e}")
return True
if __name__ == "__main__":
success = test_cross_platform_compatibility()
sys.exit(0 if success else 1)
================================================
FILE: tests/test_draft_cleanup.py
================================================
"""Unit tests for draft directory cleanup (oldest first, protected / locked / cached skips)."""
from __future__ import annotations
import os
from src.utils import draft_cleanup as dc
def _mkdir(p: str, name: str) -> str:
path = os.path.join(p, name)
os.makedirs(path, exist_ok=True)
return path
def test_is_draft_directory_name_accepts_standard_id() -> None:
assert dc.is_draft_directory_name("20200101000000aaaaaaaa") is True
assert dc.is_draft_directory_name("20200101000000abcdef12") is True
def test_is_draft_directory_name_rejects_invalid() -> None:
assert dc.is_draft_directory_name("20200101000000aaaaaaa") is False
assert dc.is_draft_directory_name("20200101000000aaaaaaaag") is False
assert dc.is_draft_directory_name("draft") is False
assert dc.is_draft_directory_name("") is False
def test_list_sorted_draft_ids_ignores_files_and_bad_names(tmp_path) -> None:
base = str(tmp_path)
_mkdir(base, "20200201000000bbbbbbbb")
_mkdir(base, "20200101000000aaaaaaaa")
open(os.path.join(base, "x.mp4"), "wb").close()
_mkdir(base, "not_a_valid_draft_id")
got = dc.list_sorted_draft_ids(base)
assert got == ["20200101000000aaaaaaaa", "20200201000000bbbbbbbb"]
def test_select_drafts_for_deletion_oldest_first_until_quota(tmp_path) -> None:
ordered = [
"20200101000000aaaaaaaa",
"20200201000000bbbbbbbb",
"20200301000000cccccccc",
]
assert dc.select_drafts_for_deletion(ordered, max_keep=3, skip_ids=set()) == []
assert dc.select_drafts_for_deletion(ordered, max_keep=2, skip_ids=set()) == [
"20200101000000aaaaaaaa"
]
assert dc.select_drafts_for_deletion(ordered, max_keep=1, skip_ids=set()) == [
"20200101000000aaaaaaaa",
"20200201000000bbbbbbbb",
]
assert dc.select_drafts_for_deletion(ordered, max_keep=0, skip_ids=set()) == ordered
def test_select_drafts_for_deletion_skips_protected_uses_next_oldest() -> None:
ordered = [
"20200101000000aaaaaaaa",
"20200201000000bbbbbbbb",
"20200301000000cccccccc",
]
skip = {"20200101000000aaaaaaaa"}
assert dc.select_drafts_for_deletion(ordered, max_keep=1, skip_ids=skip) == [
"20200201000000bbbbbbbb",
"20200301000000cccccccc",
]
def test_run_one_draft_cleanup_deletes_oldest_unskipped_only(tmp_path) -> None:
base = str(tmp_path)
old = "20200101000000aaaaaaaa"
mid = "20200201000000bbbbbbbb"
new = "20200301000000cccccccc"
for d in (old, mid, new):
_mkdir(base, d)
deleted = dc.run_one_draft_cleanup(
draft_dir=base,
max_keep=1,
protected_ids=[],
locked_ids=[],
cached_ids=[],
)
assert set(deleted) == {old, mid}
assert os.path.isdir(os.path.join(base, new))
assert not os.path.exists(os.path.join(base, old))
assert not os.path.exists(os.path.join(base, mid))
def test_run_one_draft_cleanup_never_removes_protected_ids(tmp_path) -> None:
base = str(tmp_path)
for pid in dc.DRAFT_CLEANUP_PROTECTED_DRAFT_IDS:
_mkdir(base, pid)
extra = "20990101000000eeeeeeee"
_mkdir(base, extra)
deleted = dc.run_one_draft_cleanup(
draft_dir=base,
max_keep=0,
protected_ids=dc.DRAFT_CLEANUP_PROTECTED_DRAFT_IDS,
locked_ids=[],
cached_ids=[],
)
assert extra in deleted
for pid in dc.DRAFT_CLEANUP_PROTECTED_DRAFT_IDS:
assert pid not in deleted
assert os.path.isdir(os.path.join(base, pid))
def test_run_one_draft_cleanup_skips_locked_ids(tmp_path) -> None:
base = str(tmp_path)
a, b, c = (
"20200101000000aaaaaaaa",
"20200201000000bbbbbbbb",
"20200301000000cccccccc",
)
for d in (a, b, c):
_mkdir(base, d)
deleted = dc.run_one_draft_cleanup(
draft_dir=base,
max_keep=1,
protected_ids=[],
locked_ids=[a],
cached_ids=[],
)
assert a not in deleted
assert set(deleted) == {b, c}
assert os.path.isdir(os.path.join(base, a))
def test_run_one_draft_cleanup_skips_cached_ids(tmp_path) -> None:
base = str(tmp_path)
a, b = "20200101000000aaaaaaaa", "20200201000000bbbbbbbb"
for d in (a, b):
_mkdir(base, d)
deleted = dc.run_one_draft_cleanup(
draft_dir=base,
max_keep=1,
protected_ids=[],
locked_ids=[],
cached_ids=[a],
)
assert a not in deleted
assert deleted == [b]
def test_list_sorted_draft_ids_missing_dir_returns_empty(tmp_path) -> None:
missing = os.path.join(str(tmp_path), "nope")
assert dc.list_sorted_draft_ids(missing) == []
================================================
FILE: tests/test_draft_downloader_remote_materials.py
================================================
"""
Unit tests for src.utils.draft_downloader remote material download and path localization.
"""
import json
import os
import tempfile
from unittest.mock import MagicMock, patch
import pytest
import requests
import src.utils.draft_downloader as dd
@pytest.fixture
def no_sleep():
with patch.object(dd, "time") as m_time:
m_time.sleep = MagicMock()
yield m_time
class TestDownloadRemoteFile:
def _ok_response(self, content: bytes = b"data") -> MagicMock:
r = MagicMock()
r.status_code = 200
r.iter_content = MagicMock(return_value=[content])
return r
def test_succeeds_first_request(self, no_sleep) -> None:
out = os.path.join(tempfile.gettempdir(), "t_dl_first.bin")
try:
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = self._ok_response()
m_req.exceptions = requests.exceptions
assert dd._download_remote_file("https://x.test/a.mp4", out) is True
m_req.get.assert_called_once()
with open(out, "rb") as f:
assert f.read() == b"data"
finally:
if os.path.isfile(out):
os.remove(out)
def test_retries_then_success_on_timeout(self, no_sleep) -> None:
calls = []
def side_effect(*_a, **_kw):
calls.append(1)
if len(calls) < 3:
raise requests.exceptions.ReadTimeout("read timed out")
return self._ok_response()
out = os.path.join(tempfile.gettempdir(), "t_dl_retry.bin")
try:
with patch.object(dd, "requests") as m_req:
m_req.get.side_effect = side_effect
m_req.exceptions = requests.exceptions
assert dd._download_remote_file("https://x.test/b.mp4", out) is True
assert len(calls) == 3
finally:
if os.path.isfile(out):
os.remove(out)
def test_returns_false_after_exhausting_retries(self, no_sleep) -> None:
with patch.object(dd, "_MAX_RETRIES", 2):
with patch.object(dd, "requests") as m_req:
m_req.get.side_effect = requests.exceptions.ConnectionError("refused")
m_req.exceptions = requests.exceptions
out = os.path.join(tempfile.gettempdir(), "t_dl_fail.bin")
assert dd._download_remote_file("https://x.test/c.mp4", out) is False
assert m_req.get.call_count == 3
def test_non200_retries_then_success(self, no_sleep) -> None:
bad = MagicMock()
bad.status_code = 503
good = self._ok_response()
out = os.path.join(tempfile.gettempdir(), "t_dl_503.bin")
try:
with patch.object(dd, "_MAX_RETRIES", 2):
with patch.object(dd, "requests") as m_req:
m_req.get.side_effect = [bad, bad, good]
m_req.exceptions = requests.exceptions
assert dd._download_remote_file("https://x.test/d.mp4", out) is True
finally:
if os.path.isfile(out):
os.remove(out)
class TestLocalizeRemoteMaterialPaths:
def test_no_materials_returns_true(self) -> None:
assert dd.localize_remote_material_paths({}, "/tmp/x") is True
def test_no_urls_returns_true(self) -> None:
data = {"materials": {"audios": [], "videos": [{"path": "C:\\local\\x.mp4"}]}}
assert dd.localize_remote_material_paths(data, "/tmp/y") is True
@patch.object(dd, "_download_remote_file", return_value=True)
def test_rewrites_path_on_success(self, m_dl) -> None:
with tempfile.TemporaryDirectory() as td:
url = "https://cdn.example.com/v.mp4"
data: dict = {
"materials": {
"audios": [],
"videos": [
{
"path": url,
"material_name": "clip1",
}
],
}
}
assert dd.localize_remote_material_paths(data, td) is True
m_dl.assert_called_once()
new_path = data["materials"]["videos"][0]["path"]
assert new_path.startswith(td)
assert "assets" in new_path.replace("\\", "/")
assert new_path.endswith(".mp4")
@patch.object(dd, "_download_remote_file", return_value=False)
def test_returns_false_when_download_fails(self, m_dl) -> None:
with tempfile.TemporaryDirectory() as td:
url = "https://cdn.example.com/miss.mp4"
data: dict = {
"materials": {
"audios": [],
"videos": [{"path": url, "id": "1"}],
}
}
assert dd.localize_remote_material_paths(data, td) is False
assert data["materials"]["videos"][0]["path"] == url
@patch.object(dd, "_download_remote_file", return_value=True)
def test_same_url_shared_across_items(self, m_dl) -> None:
u = "https://cdn.example.com/same.mp3"
with tempfile.TemporaryDirectory() as td:
data: dict = {
"materials": {
"audios": [
{"path": u, "name": "a"},
{"path": u, "name": "b"},
],
"videos": [],
}
}
assert dd.localize_remote_material_paths(data, td) is True
assert m_dl.call_count == 1
p0 = data["materials"]["audios"][0]["path"]
p1 = data["materials"]["audios"][1]["path"]
assert p0 == p1
assert p0.startswith(td)
class TestUpdateJsonFilePaths:
def test_skips_write_when_localize_fails(self) -> None:
body = {
"materials": {"audios": [], "videos": []},
"duration": 1000,
}
with tempfile.TemporaryDirectory() as td:
path = os.path.join(td, "draft_content.json")
original = json.dumps(body, ensure_ascii=False)
with open(path, "w", encoding="utf-8") as f:
f.write(original)
with patch.object(dd, "localize_remote_material_paths", return_value=False):
assert (
dd.update_json_file_paths(path, td, "20260101120000abc")
is False
)
with open(path, "r", encoding="utf-8") as f:
assert f.read() == original
@patch.object(dd, "localize_remote_material_paths", return_value=True)
@patch.object(dd, "config")
def test_writes_when_localize_ok(self, m_config, m_loc) -> None:
m_config.DRAFT_SAVE_PATH = "D:/mock/draft"
base = {
"materials": {"audios": [], "videos": []},
}
with tempfile.TemporaryDirectory() as td:
path = os.path.join(td, "draft_content.json")
with open(path, "w", encoding="utf-8") as f:
json.dump(base, f, ensure_ascii=False)
did = "20260101120000abc"
assert dd.update_json_file_paths(path, td, did) is True
m_loc.assert_called_once()
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
assert "materials" in data
assert isinstance(data["materials"], dict)
class TestDownloadSingleFile:
"""download_single_file:流式写入 + 超时与关闭行为;路径与结果应与优化前语义一致。"""
_BASE = "https://capcut.example.com"
_TIMEOUT = (
dd._REQUEST_CONNECT_TIMEOUT,
dd._REQUEST_READ_TIMEOUT,
)
def _stream_response(
self,
chunks: list,
status: int = 200,
) -> MagicMock:
r = MagicMock()
r.status_code = status
r.iter_content = MagicMock(side_effect=lambda chunk_size=8192: iter(chunks))
r.close = MagicMock()
return r
def test_success_writes_concatenated_chunks_and_relative_path(self, no_sleep) -> None:
"""URL 中带草稿 ID 时,相对路径为 draft_id 之后的路径段;内容与分块顺序一致。"""
file_url = (
f"{self._BASE}/app/output/draft/20251204214904ccb1af38/Resources/pic.png"
)
with tempfile.TemporaryDirectory() as td:
resp = self._stream_response([b"hel", b"lo"])
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = resp
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is True
expected = os.path.join(td, "Resources", "pic.png")
assert os.path.isfile(expected)
with open(expected, "rb") as f:
assert f.read() == b"hello"
m_req.get.assert_called_once_with(
file_url,
timeout=self._TIMEOUT,
stream=True,
)
resp.close.assert_called_once()
def test_fallback_relative_path_without_draft_segment(self, no_sleep) -> None:
"""路径中无草稿 ID 段时,与原先一致:使用 path 第一段子路径之后部分。"""
file_url = f"{self._BASE}/static/assets/logo.bin"
with tempfile.TemporaryDirectory() as td:
resp = self._stream_response([b"z"])
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = resp
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is True
expected = os.path.join(td, "static", "assets", "logo.bin")
assert os.path.isfile(expected)
with open(expected, "rb") as f:
assert f.read() == b"z"
def test_non200_returns_false_and_closes(self, no_sleep) -> None:
"""非网关类 4xx/5xx 不重试,立即失败并关闭响应。"""
file_url = f"{self._BASE}/app/output/draft/20251204214904ccb1af38/x.bin"
with tempfile.TemporaryDirectory() as td:
resp = self._stream_response([], status=404)
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = resp
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is False
resp.close.assert_called_once()
def test_gateway_503_retries_until_exhausted(self, no_sleep) -> None:
"""503 退避重试,耗尽后与网络重试一致共 6 次请求。"""
file_url = f"{self._BASE}/app/output/draft/20251204214904ccb1af38/x.bin"
with tempfile.TemporaryDirectory() as td:
resp = self._stream_response([], status=503)
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = resp
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is False
assert m_req.get.call_count == 6
assert resp.close.call_count == 6
def test_retries_then_success_on_read_timeout(self, no_sleep) -> None:
calls: list = []
def side_effect(*_a, **_kw):
calls.append(1)
if len(calls) < 3:
raise requests.exceptions.ReadTimeout("stalled")
return self._stream_response([b"ok"])
file_url = (
f"{self._BASE}/app/output/draft/20251204214904ccb1af38/data.bin"
)
with tempfile.TemporaryDirectory() as td:
with patch.object(dd, "requests") as m_req:
m_req.get.side_effect = side_effect
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is True
assert len(calls) == 3
out = os.path.join(td, "data.bin")
with open(out, "rb") as f:
assert f.read() == b"ok"
def test_returns_false_after_exhausting_retries(self, no_sleep) -> None:
file_url = (
f"{self._BASE}/app/output/draft/20251204214904ccb1af38/miss.bin"
)
with tempfile.TemporaryDirectory() as td:
with patch.object(dd, "requests") as m_req:
m_req.get.side_effect = requests.exceptions.ConnectionError("down")
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is False
# retry_count 0..5 共 6 次尝试后放弃(与原先 max_retries=5 语义一致)
assert m_req.get.call_count == 6
@patch.object(dd, "update_json_file_paths")
def test_plain_file_does_not_touch_json_paths(self, m_upd, no_sleep) -> None:
file_url = (
f"{self._BASE}/app/output/draft/20251204214904ccb1af38/only.bin"
)
with tempfile.TemporaryDirectory() as td:
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = self._stream_response([b"\x00"])
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is True
m_upd.assert_not_called()
@patch.object(dd, "update_json_file_paths", return_value=True)
def test_json_files_invoke_path_update(self, m_upd, no_sleep) -> None:
file_url = (
f"{self._BASE}/app/output/draft/20251204214904ccb1af38/"
f"draft_content.json"
)
with tempfile.TemporaryDirectory() as td:
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = self._stream_response([b"{}\n"])
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is True
m_upd.assert_called_once()
call_kw = m_upd.call_args
assert call_kw[0][1] == td
assert call_kw[0][2] == "20251204214904ccb1af38"
@patch.object(dd, "update_json_file_paths", return_value=False)
def test_json_update_failure_returns_false(self, m_upd, no_sleep) -> None:
file_url = (
f"{self._BASE}/app/output/draft/20251204214904ccb1af38/"
f"draft_info.json"
)
with tempfile.TemporaryDirectory() as td:
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = self._stream_response([b"{}\n"])
m_req.exceptions = requests.exceptions
assert dd.download_single_file(file_url, td) is False
class TestExecuteDownload:
"""execute_download:超时 + 流式写入 + 关闭连接。"""
_TIMEOUT = (
dd._REQUEST_CONNECT_TIMEOUT,
dd._REQUEST_READ_TIMEOUT,
)
def test_streams_body_to_default_filename_and_closes(self, no_sleep) -> None:
draft_url = "https://api.example.com/get?draft_id=x"
did = "mydraftid001"
with tempfile.TemporaryDirectory() as td:
r = MagicMock()
r.status_code = 200
r.headers = {}
r.iter_content = MagicMock(
side_effect=lambda chunk_size=8192: iter([b"a", b"bc"])
)
r.close = MagicMock()
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = r
m_req.exceptions = requests.exceptions
assert dd.execute_download(draft_url, td, did) is True
out = os.path.join(td, f"{did}.draft")
with open(out, "rb") as f:
assert f.read() == b"abc"
m_req.get.assert_called_once_with(
draft_url,
timeout=self._TIMEOUT,
stream=True,
)
r.close.assert_called_once()
def test_non200_returns_false(self, no_sleep) -> None:
r = MagicMock()
r.status_code = 500
r.close = MagicMock()
with tempfile.TemporaryDirectory() as td:
with patch.object(dd, "requests") as m_req:
m_req.get.return_value = r
m_req.exceptions = requests.exceptions
assert dd.execute_download("https://u", td, "d") is False
r.close.assert_called_once()
def test_request_exception_returns_false(self, no_sleep) -> None:
with tempfile.TemporaryDirectory() as td:
with patch.object(dd, "requests") as m_req:
m_req.get.side_effect = requests.exceptions.ConnectTimeout("t")
m_req.exceptions = requests.exceptions
assert dd.execute_download("https://u", td, "d") is False
================================================
FILE: tests/test_draft_lock_all_apis.py
================================================
"""
草稿并发锁功能单元测试 - 所有支持锁的 API
测试异步锁机制防止同一草稿的并发写操作
测试覆盖:
1. 正常场景:带锁的操作成功执行
2. 边界场景:超时、并发访问同一草稿
3. 异常场景:锁获取失败、无效草稿 ID
测试的 API 列表:
- add_audios_async
- add_images_async
- save_draft_async
- add_captions_async
- add_effects_async
- add_keyframes_async
- add_sticker_async
- add_filters_async
- easy_create_material_async
- add_masks_async
"""
import asyncio
import pytest
import sys
import os
from unittest.mock import patch, MagicMock
import json
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.service.add_audios import add_audios_async
from src.service.add_images import add_images_async
from src.service.save_draft import save_draft_async
from src.service.add_captions import add_captions_async
from src.service.add_effects import add_effects_async
from src.service.add_keyframes import add_keyframes_async
from src.service.add_sticker import add_sticker_async
from src.service.add_filters import add_filters_async
from src.service.easy_create_material import easy_create_material_async
from src.service.add_masks import add_masks_async
from src.utils.draft_lock_manager import DraftLockManager
from exceptions import CustomException, CustomError
class TestAllAsyncLockAPIs:
"""所有带锁异步 API 的测试类"""
@pytest.fixture
def mock_draft_data(self):
"""模拟草稿数据"""
return {
"draft_url": "http://localhost/v1/get_draft?draft_id=test-draft-001",
"draft_id": "test-draft-001"
}
@pytest.mark.asyncio
async def test_save_draft_async_normal(self, mock_draft_data):
"""测试 save_draft_async 正常场景"""
with patch('src.service.save_draft.DRAFT_CACHE') as mock_cache, \
patch('src.service.save_draft.helper.get_url_param', return_value=mock_draft_data['draft_id']):
# 模拟草稿对象
mock_script = MagicMock()
mock_script.save.return_value = None
mock_cache.__getitem__.return_value = mock_script
# 执行测试
result = await save_draft_async(draft_url=mock_draft_data['draft_url'])
# 验证结果
assert result == mock_draft_data['draft_url']
mock_script.save.assert_called_once()
@pytest.mark.asyncio
async def test_add_audios_async_normal(self, mock_draft_data):
"""测试 add_audios_async 正常场景"""
audio_infos = json.dumps([
{
"audio_url": "https://example.com/audio.mp3",
"start": 0,
"end": 5000000
}
])
mock_audio_seg = MagicMock()
mock_audio_seg.material_instance.material_id = 'audio-mat-123'
with patch('src.service.add_audios.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_audios.helper.get_url_param', return_value=mock_draft_data['draft_id']), \
patch('src.service.add_audios.download') as mock_download, \
patch('src.service.add_audios.AudioMaterial') as mock_audio_material, \
patch('src.service.add_audios.draft.AudioSegment', return_value=mock_audio_seg), \
patch('src.service.add_audios.os.makedirs'), \
patch('src.service.add_audios.os.path.isfile', return_value=True):
# 模拟草稿对象(prepare 阶段会执行 draft_id in DRAFT_CACHE)
mock_script = MagicMock()
mock_script.save.return_value = None
mock_script.tracks = {'track1': MagicMock(track_id='track-id-123', name='audio_track')}
mock_script.width = 1920
mock_script.height = 1080
mock_cache.__contains__.return_value = True
mock_cache.__getitem__.return_value = mock_script
# 模拟下载和音频处理
mock_download.return_value = '/tmp/audio.mp3'
mock_audio_material.return_value.duration = 5000000
# 执行测试
result = await add_audios_async(
draft_url=mock_draft_data['draft_url'],
audio_infos=audio_infos
)
# 验证结果
assert len(result) == 3
assert result[0] == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_add_images_async_normal(self, mock_draft_data):
"""测试 add_images_async 正常场景"""
image_infos = json.dumps([
{
"image_url": "https://example.com/image.jpg",
"width": 1024,
"height": 1024,
"start": 0,
"end": 5000000
}
])
mock_img_seg = MagicMock()
mock_img_seg.segment_id = 'seg-img-123'
mock_img_seg.material_instance.material_id = 'img-mat-123'
with patch('src.service.add_images.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_images.helper.get_url_param', return_value=mock_draft_data['draft_id']), \
patch('src.service.add_images.download') as mock_download, \
patch('src.service.add_images.draft.VideoSegment', return_value=mock_img_seg), \
patch('src.service.add_images.os.makedirs'), \
patch('src.service.add_images.os.path.isfile', return_value=True):
# 模拟草稿对象(prepare 阶段会执行 draft_id in DRAFT_CACHE)
mock_script = MagicMock()
mock_script.save.return_value = None
mock_script.tracks = {'track1': MagicMock(track_id='track-id-123', name='image_track')}
mock_script.width = 1920
mock_script.height = 1080
mock_cache.__contains__.return_value = True
mock_cache.__getitem__.return_value = mock_script
# 模拟下载
mock_download.return_value = '/tmp/image.jpg'
# 执行测试
result = await add_images_async(
draft_url=mock_draft_data['draft_url'],
image_infos=image_infos
)
# 验证结果
assert len(result) == 5
assert result[0] == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_add_captions_async_normal(self, mock_draft_data):
"""测试 add_captions_async 正常场景"""
captions = json.dumps([
{
"start": 0,
"end": 5000000,
"text": "你好,剪映"
}
])
with patch('src.service.add_captions.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_captions.helper.get_url_param', return_value=mock_draft_data['draft_id']):
# 模拟草稿对象
mock_script = MagicMock()
mock_script.save.return_value = None
mock_script.tracks = {'track1': MagicMock(track_id='track-id-123', name='caption_track')}
mock_script.width = 1920
mock_script.height = 1080
mock_cache.__getitem__.return_value = mock_script
# 执行测试
result = await add_captions_async(
draft_url=mock_draft_data['draft_url'],
captions=captions
)
# 验证结果
assert len(result) == 5
assert result[0] == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_add_effects_async_normal(self, mock_draft_data):
"""测试 add_effects_async 正常场景"""
effect_infos = json.dumps([
{
"effect_title": "录制边框 III",
"start": 0,
"end": 5000000
}
])
with patch('src.service.add_effects.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_effects.helper.get_url_param', return_value=mock_draft_data['draft_id']):
# 模拟草稿对象
mock_script = MagicMock()
mock_script.save.return_value = None
mock_script.tracks = {'track1': MagicMock(track_id='track-id-123', name='effect_track')}
mock_cache.__getitem__.return_value = mock_script
# 执行测试
result = await add_effects_async(
draft_url=mock_draft_data['draft_url'],
effect_infos=effect_infos
)
# 验证结果
assert len(result) == 4
assert result[0] == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_add_keyframes_async_normal(self, mock_draft_data):
"""测试 add_keyframes_async 正常场景"""
keyframes = json.dumps([
{
"segment_id": "segment-uuid-123",
"property": "KFTypePositionX",
"offset": 0.5,
"value": -0.1
}
])
with patch('src.service.add_keyframes.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_keyframes.helper.get_url_param', return_value=mock_draft_data['draft_id']):
# 模拟草稿对象
mock_script = MagicMock()
mock_script.save.return_value = None
mock_cache.__getitem__.return_value = mock_script
# 模拟片段
mock_segment = MagicMock()
mock_segment.segment_id = "segment-uuid-123"
mock_segment.duration = 5000000
mock_script.find_segment_by_id.return_value = mock_segment
# 执行测试
result = await add_keyframes_async(
draft_url=mock_draft_data['draft_url'],
keyframes=keyframes
)
# 验证结果
assert len(result) == 3
assert result[0] == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_add_sticker_async_normal(self, mock_draft_data):
"""测试 add_sticker_async 正常场景"""
with patch('src.service.add_sticker.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_sticker.helper.get_url_param', return_value=mock_draft_data['draft_id']):
# 模拟草稿对象
mock_script = MagicMock()
mock_script.save.return_value = None
mock_script.tracks = {'track1': MagicMock(track_id='track-id-123', name='sticker_track')}
mock_script.width = 1920
mock_script.height = 1080
mock_cache.__getitem__.return_value = mock_script
# 执行测试
result = await add_sticker_async(
draft_url=mock_draft_data['draft_url'],
sticker_id="sticker-uuid-123",
start=0,
end=5000000
)
# 验证结果
assert len(result) == 5
assert result[0] == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_add_filters_async_normal(self, mock_draft_data):
"""测试 add_filters_async 正常场景"""
filter_infos = json.dumps([
{
"filter_title": "复古",
"start": 0,
"end": 5000000
}
])
with patch('src.service.add_filters.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_filters.helper.get_url_param', return_value=mock_draft_data['draft_id']):
# 模拟草稿对象
mock_script = MagicMock()
mock_script.save.return_value = None
mock_script.tracks = {'track1': MagicMock(track_id='track-id-123', name='filter_track')}
mock_cache.__getitem__.return_value = mock_script
# 执行测试
result = await add_filters_async(
draft_url=mock_draft_data['draft_url'],
filter_infos=filter_infos
)
# 验证结果
assert len(result) == 4
assert result[0] == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_add_masks_async_normal(self, mock_draft_data):
"""测试 add_masks_async 正常场景"""
segment_ids = ["segment-uuid-123"]
with patch('src.service.add_masks.DRAFT_CACHE') as mock_cache, \
patch('src.service.add_masks.helper.get_url_param', return_value=mock_draft_data['draft_id']):
# 模拟草稿对象
mock_script = MagicMock()
mock_script.save.return_value = None
mock_cache.__getitem__.return_value = mock_script
# 模拟片段
mock_segment = MagicMock()
mock_segment.segment_id = "segment-uuid-123"
mock_script.find_segment_by_id.return_value = mock_segment
# 执行测试
result = await add_masks_async(
draft_url=mock_draft_data['draft_url'],
segment_ids=segment_ids
)
# 验证结果
assert len(result) == 4
assert result[0] == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_easy_create_material_async_normal(self, mock_draft_data):
"""测试 easy_create_material_async 正常场景"""
with patch('src.service.easy_create_material.DRAFT_CACHE') as mock_cache, \
patch('src.service.easy_create_material.helper.get_url_param', return_value=mock_draft_data['draft_id']), \
patch('src.service.easy_create_material.download') as mock_download, \
patch('src.service.easy_create_material.os.makedirs'):
# 模拟草稿对象
mock_script = MagicMock()
mock_script.save.return_value = None
mock_script.width = 1920
mock_script.height = 1080
mock_cache.__getitem__.return_value = mock_script
# 模拟下载
mock_download.return_value = '/tmp/audio.mp3'
# 执行测试
result = await easy_create_material_async(
draft_url=mock_draft_data['draft_url'],
audio_url="https://example.com/audio.mp3"
)
# 验证结果
assert result == mock_draft_data['draft_url']
@pytest.mark.asyncio
async def test_concurrent_access_same_draft_serialized(self, mock_draft_data):
"""测试同一草稿的并发访问会被串行化"""
lock_manager = DraftLockManager()
execution_log = []
async def worker(worker_id, work_duration=0.1):
"""模拟一个 API 请求"""
try:
await lock_manager.acquire_lock(mock_draft_data['draft_id'], timeout=5.0)
execution_log.append(f"worker_{worker_id}_start")
await asyncio.sleep(work_duration) # 模拟写入草稿文件
execution_log.append(f"worker_{worker_id}_end")
finally:
await lock_manager.release_lock(mock_draft_data['draft_id'])
# 启动 3 个并发请求
tasks = [
worker(1),
worker(2),
worker(3)
]
# 等待所有任务完成
await asyncio.gather(*tasks)
# 验证执行顺序是串行的(不是交错的)
# 正确的串行执行应该是:worker_1_start, worker_1_end, worker_2_start, worker_2_end...
assert len(execution_log) == 6
# 检查每个 worker 的 start 和 end 是连续的
for i in range(0, len(execution_log), 2):
assert execution_log[i].endswith('_start')
assert execution_log[i+1].endswith('_end')
# 确保是同一个 worker
worker_id = execution_log[i].split('_')[1]
assert execution_log[i+1].split('_')[1] == worker_id
@pytest.mark.asyncio
async def test_invalid_draft_id_raises_error(self):
"""测试无效草稿 ID 抛出错误"""
with patch('src.service.save_draft.helper.get_url_param', return_value=None):
with pytest.raises(CustomException) as exc_info:
await save_draft_async(draft_url="http://invalid-url")
assert exc_info.value.err == CustomError.INVALID_DRAFT_URL
@pytest.mark.asyncio
async def test_lock_timeout_raises_error(self, mock_draft_data):
"""测试锁超时抛出错误"""
lock_manager = DraftLockManager()
# 先获取锁并不释放
await lock_manager.acquire_lock(mock_draft_data['draft_id'])
# 尝试再次获取锁,应该超时
with pytest.raises(CustomException) as exc_info:
with patch('src.service.save_draft.DRAFT_CACHE') as mock_cache, \
patch('src.service.save_draft.helper.get_url_param', return_value=mock_draft_data['draft_id']):
mock_script = MagicMock()
mock_cache.__getitem__.return_value = mock_script
await save_draft_async(
draft_url=mock_draft_data['draft_url'],
lock_timeout=0.1 # 很短的超时时间
)
assert exc_info.value.err == CustomError.DRAFT_LOCK_TIMEOUT
# 清理:释放锁
await lock_manager.release_lock(mock_draft_data['draft_id'])
if __name__ == '__main__':
pytest.main([__file__, '-v'])
================================================
FILE: tests/test_draft_lock_manager.py
================================================
"""
草稿并发锁管理器单元测试
测试 DraftLockManager 的所有功能
测试覆盖:
1. 正常场景:锁的获取和释放
2. 边界场景:超时、重入、并发访问
3. 异常场景:无效输入、重复释放
"""
import asyncio
import pytest
import sys
import os
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.utils.draft_lock_manager import DraftLockManager, get_draft_lock_manager
class TestDraftLockManager:
"""DraftLockManager 测试类"""
@pytest.fixture
def lock_manager(self):
"""创建锁管理器实例"""
return DraftLockManager()
@pytest.mark.asyncio
async def test_acquire_and_release_lock(self, lock_manager):
"""测试基本的锁获取和释放"""
draft_id = "test-draft-001"
# 获取锁
result = await lock_manager.acquire_lock(draft_id)
assert result is True
assert lock_manager.is_locked(draft_id) is True
assert lock_manager.get_lock_count(draft_id) == 1
# 释放锁
await lock_manager.release_lock(draft_id)
assert lock_manager.is_locked(draft_id) is False
assert lock_manager.get_lock_count(draft_id) == 0
@pytest.mark.asyncio
async def test_acquire_lock_with_timeout(self, lock_manager):
"""测试带超时的锁获取"""
draft_id = "test-draft-002"
# 立即获取锁(无超时)
result = await lock_manager.acquire_lock(draft_id, timeout=None)
assert result is True
await lock_manager.release_lock(draft_id)
# 带超时获取锁
result = await lock_manager.acquire_lock(draft_id, timeout=5.0)
assert result is True
await lock_manager.release_lock(draft_id)
@pytest.mark.asyncio
async def test_acquire_lock_timeout_exception(self, lock_manager):
"""测试锁获取超时异常"""
draft_id = "test-draft-003"
# 第一次获取锁
await lock_manager.acquire_lock(draft_id)
# 尝试再次获取(应该超时)
with pytest.raises(asyncio.TimeoutError):
await lock_manager.acquire_lock(draft_id, timeout=0.1)
# 清理
await lock_manager.release_lock(draft_id)
@pytest.mark.asyncio
async def test_release_nonexistent_lock(self, lock_manager):
"""测试释放不存在的锁"""
draft_id = "nonexistent-draft"
with pytest.raises(KeyError):
await lock_manager.release_lock(draft_id)
@pytest.mark.asyncio
async def test_is_locked_method(self, lock_manager):
"""测试 is_locked 方法"""
draft_id = "test-draft-004"
# 未锁定时
assert lock_manager.is_locked(draft_id) is False
# 锁定后
await lock_manager.acquire_lock(draft_id)
assert lock_manager.is_locked(draft_id) is True
# 释放后
await lock_manager.release_lock(draft_id)
assert lock_manager.is_locked(draft_id) is False
@pytest.mark.asyncio
async def test_get_lock_count(self, lock_manager):
"""测试获取锁计数"""
draft_id = "test-draft-005"
# 初始计数为 0
assert lock_manager.get_lock_count(draft_id) == 0
# 获取一次锁
await lock_manager.acquire_lock(draft_id)
assert lock_manager.get_lock_count(draft_id) == 1
# 释放锁
await lock_manager.release_lock(draft_id)
assert lock_manager.get_lock_count(draft_id) == 0
@pytest.mark.asyncio
async def test_get_all_locked_drafts(self, lock_manager):
"""测试获取所有被锁定的草稿"""
draft_ids = ["test-draft-006-a", "test-draft-006-b", "test-draft-006-c"]
# 锁定前两个
await lock_manager.acquire_lock(draft_ids[0])
await lock_manager.acquire_lock(draft_ids[1])
locked = lock_manager.get_all_locked_drafts()
assert len(locked) == 2
assert draft_ids[0] in locked
assert draft_ids[1] in locked
assert draft_ids[2] not in locked
# 释放一个
await lock_manager.release_lock(draft_ids[0])
locked = lock_manager.get_all_locked_drafts()
assert len(locked) == 1
assert draft_ids[1] in locked
# 全部释放
await lock_manager.release_lock(draft_ids[1])
locked = lock_manager.get_all_locked_drafts()
assert len(locked) == 0
@pytest.mark.asyncio
async def test_clear_all_locks(self, lock_manager):
"""测试清除所有锁"""
draft_ids = ["test-draft-007-a", "test-draft-007-b"]
# 获取多个锁
for draft_id in draft_ids:
await lock_manager.acquire_lock(draft_id)
# 验证都被锁定
for draft_id in draft_ids:
assert lock_manager.is_locked(draft_id) is True
# 清除所有锁
await lock_manager.clear_all_locks()
# 验证都已释放(锁对象已被删除)
for draft_id in draft_ids:
assert lock_manager.is_locked(draft_id) is False
@pytest.mark.asyncio
async def test_get_stats(self, lock_manager):
"""测试获取统计信息"""
draft_ids = ["test-draft-008-a", "test-draft-008-b"]
# 初始状态
stats = lock_manager.get_stats()
assert stats["total_locks"] == 0
assert stats["locked_drafts"] == 0
# 获取锁后
for draft_id in draft_ids:
await lock_manager.acquire_lock(draft_id)
stats = lock_manager.get_stats()
assert stats["total_locks"] == 2
assert stats["locked_drafts"] == 2
assert stats["total_holders"] == 2
# 清理
for draft_id in draft_ids:
await lock_manager.release_lock(draft_id)
@pytest.mark.asyncio
async def test_concurrent_access_different_drafts(self, lock_manager):
"""测试并发访问不同草稿"""
results = []
async def acquire_and_release(draft_id):
await lock_manager.acquire_lock(draft_id)
await asyncio.sleep(0.1) # 模拟工作
results.append(draft_id)
await lock_manager.release_lock(draft_id)
# 并发访问 3 个不同的草稿
tasks = [
acquire_and_release("draft-a"),
acquire_and_release("draft-b"),
acquire_and_release("draft-c")
]
await asyncio.gather(*tasks)
# 所有任务都应该完成
assert len(results) == 3
assert "draft-a" in results
assert "draft-b" in results
assert "draft-c" in results
@pytest.mark.asyncio
async def test_serial_access_same_draft(self, lock_manager):
"""测试串行访问同一草稿"""
draft_id = "test-draft-same"
execution_order = []
async def worker(worker_id):
await lock_manager.acquire_lock(draft_id)
try:
execution_order.append(f"{worker_id}_start")
await asyncio.sleep(0.1)
execution_order.append(f"{worker_id}_end")
finally:
await lock_manager.release_lock(draft_id)
# 3 个 worker 按顺序访问同一草稿(不是并发)
# 因为 asyncio.gather 会同时启动所有任务,但锁会强制它们串行执行
tasks = [
worker(1),
worker(2),
worker(3)
]
await asyncio.gather(*tasks)
# 验证执行顺序是串行的(每个 worker 必须等待前一个完成)
# 由于锁的保护,应该是一个接一个执行
assert len(execution_order) == 6
# 验证每个 worker 都是成对的 start->end
for i in range(0, len(execution_order), 2):
worker_num = execution_order[i].split('_')[0]
assert execution_order[i+1] == f"{worker_num}_end"
@pytest.mark.asyncio
async def test_singleton_pattern(self):
"""测试单例模式"""
manager1 = DraftLockManager()
manager2 = DraftLockManager()
# 应该是同一个实例
assert manager1 is manager2
@pytest.mark.asyncio
async def test_get_draft_lock_manager_function(self):
"""测试全局获取器函数"""
manager1 = get_draft_lock_manager()
manager2 = get_draft_lock_manager()
# 应该是同一个实例
assert manager1 is manager2
class TestDraftLockManagerEdgeCases:
"""DraftLockManager 边界情况测试"""
@pytest.mark.asyncio
async def test_empty_draft_id(self):
"""测试空字符串草稿 ID"""
lock_manager = DraftLockManager()
# 空字符串也应该能获取锁
draft_id = ""
result = await lock_manager.acquire_lock(draft_id)
assert result is True
await lock_manager.release_lock(draft_id)
@pytest.mark.asyncio
async def test_special_characters_in_draft_id(self):
"""测试特殊字符的草稿 ID"""
lock_manager = DraftLockManager()
special_ids = [
"draft-with-dash",
"draft_with_underscore",
"draft.with.dots",
"draft/with/slashes",
"draft@with#special$chars"
]
for draft_id in special_ids:
await lock_manager.acquire_lock(draft_id)
assert lock_manager.is_locked(draft_id) is True
await lock_manager.release_lock(draft_id)
assert lock_manager.is_locked(draft_id) is False
@pytest.mark.asyncio
async def test_very_long_draft_id(self):
"""测试超长草稿 ID"""
lock_manager = DraftLockManager()
# 创建一个很长的 ID
long_id = "draft-" + "a" * 1000
await lock_manager.acquire_lock(long_id)
assert lock_manager.is_locked(long_id) is True
await lock_manager.release_lock(long_id)
@pytest.mark.asyncio
async def test_rapid_acquire_release_cycle(self):
"""测试快速连续获取释放循环"""
lock_manager = DraftLockManager()
draft_id = "rapid-cycle"
# 快速循环 100 次
for i in range(100):
await lock_manager.acquire_lock(draft_id)
await lock_manager.release_lock(draft_id)
# 最后应该是未锁定状态
assert lock_manager.is_locked(draft_id) is False
@pytest.mark.asyncio
async def test_multiple_workers_same_draft_stress(self):
"""测试多 worker 压力测试"""
lock_manager = DraftLockManager()
draft_id = "stress-test"
counter = 0
async def increment_counter():
nonlocal counter
await lock_manager.acquire_lock(draft_id)
try:
current = counter
await asyncio.sleep(0.01) # 增加竞争
counter = current + 1
finally:
await lock_manager.release_lock(draft_id)
# 10 个 worker 同时尝试增加计数器
tasks = [increment_counter() for _ in range(10)]
await asyncio.gather(*tasks)
# 由于锁的保护,counter 应该正好是 10
assert counter == 10
if __name__ == "__main__":
pytest.main([__file__, "-v"])
================================================
FILE: tests/test_draft_service.py
================================================
import pytest
from fastapi.testclient import TestClient
from main import app
from src.service.create_draft import create_draft_service
from src.schemas.create_draft import CreateDraftRequest
client = TestClient(app)
def test_create_draft_service(mocker):
"""测试创建草稿的服务函数"""
# 模拟draft_dir和pyJianYingDraft
mock_draft_dir = "test/draft/dir"
mock_draft_folder = mocker.patch("pyJianYingDraft.DraftFolder")
mock_script = mocker.Mock()
mock_draft_folder.return_value.create_draft.return_value = mock_script
# 调用服务函数
draft_id = create_draft_service(
draft_dir=mock_draft_dir,
width=1920,
height=1080
)
# 验证调用
mock_draft_folder.assert_called_once_with(mock_draft_dir)
mock_draft_folder.return_value.create_draft.assert_called_once()
mock_script.save.assert_called_once()
assert draft_id is not None
def test_create_draft_api():
"""测试创建草稿的API接口"""
response = client.post("/openapi/v1/create_draft", json={"height": 1080, "width": 1920})
assert response.status_code == 200
assert "message" in response.json()
assert "draft_id" in response.json()
assert response.json()["message"] == "草稿创建成功"
if __name__ == "__main__":
pytest.main(["-v", "test_draft_service.py"])
================================================
FILE: tests/test_export_error_handling.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试视频导出功能的错误处理
"""
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from src.utils.video_task_manager import VideoGenTaskManager
from src.utils.logger import logger
def test_export_error_handling():
"""测试导出功能的错误处理"""
print("🧪 测试视频导出错误处理...")
# 创建任务管理器实例
task_manager = VideoGenTaskManager()
# 创建一个测试任务
test_task = type('TestTask', (), {
'draft_id': 'test_draft_123',
'progress': 0
})()
try:
# 尝试调用导出功能(应该会抛出RuntimeError)
result = task_manager._export_video(test_task, "test_output.mp4")
print(f"❌ 预期应该抛出异常,但返回了: {result}")
except RuntimeError as e:
print(f"✅ 正确捕获RuntimeError: {e}")
if "缺少Windows依赖" in str(e) or "仅在Windows平台可用" in str(e):
print("✅ 错误信息符合预期")
else:
print(f"⚠️ 错误信息不完全符合预期: {e}")
except Exception as e:
print(f"❌ 捕获到意外异常: {type(e).__name__}: {e}")
print("✅ 错误处理测试完成")
if __name__ == "__main__":
test_export_error_handling()
================================================
FILE: tests/test_file_operations.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试文件移动功能的改进
"""
import sys
import os
import tempfile
import shutil
from unittest.mock import Mock, patch
# 添加项目路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
def test_file_move_improvements():
"""测试文件移动功能的改进"""
print("🧪 测试文件移动功能改进...")
# 创建测试文件
with tempfile.TemporaryDirectory() as temp_dir:
test_file = os.path.join(temp_dir, "test_draft.mp4")
output_file = os.path.join(temp_dir, "output", "result.mp4")
# 创建测试文件
with open(test_file, 'w') as f:
f.write("test content")
print(f"✅ 创建测试文件: {test_file}")
print(f"✅目标路径: {output_file}")
#测试正常移动
try:
#确保目标目录存在
os.makedirs(os.path.dirname(output_file), exist_ok=True)
shutil.move(test_file, output_file)
print("✅ 文件移动成功")
# 检查文件是否存在
if os.path.exists(output_file):
print("✅目标文件存在")
else:
print("❌目标文件不存在")
except Exception as e:
print(f"❌ 文件移动失败: {e}")
print("✅ 文件移动测试完成")
def test_directory_creation():
"""测试目录创建功能"""
print("\n🧪 测试目录创建功能...")
with tempfile.TemporaryDirectory() as temp_dir:
nested_path = os.path.join(temp_dir, "a", "b", "c", "file.txt")
directory = os.path.dirname(nested_path)
print(f"✅ 目标目录: {directory}")
#测试创建嵌套目录
try:
os.makedirs(directory, exist_ok=True)
print("✅目录创建成功")
# 创建测试文件
with open(nested_path, 'w') as f:
f.write("test")
print("✅ 文件创建成功")
except Exception as e:
print(f"❌目录创建失败: {e}")
print("✅目录创建测试完成")
if __name__ == "__main__":
test_file_move_improvements()
test_directory_creation()
print("\n🎉 所有测试完成!")
================================================
FILE: tests/test_float_transform.py
================================================
import requests
import json
import time
def test_float_transform():
"""测试浮点数类型的transform参数"""
# 1. 先创建一个草稿
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1920,
"height": 1080
}
try:
print("Creating draft...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"Failed to create draft: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"Draft created successfully: {draft_url}")
# 2. 添加带浮点数位置变换的字幕
add_captions_url = "http://localhost:8000/v1/add_captions"
captions = [
{
"start": 0,
"end": 5000000, # 5秒
"text": "测试浮点数字幕位置变换"
}
]
add_captions_data = {
"draft_url": draft_url,
"captions": json.dumps(captions),
"text_color": "#ffffff", # 默认白色文本
"font_size": 16,
"transform_x": 150.5, # X轴位置偏移150.5像素
"transform_y": -75.25 # Y轴位置偏移-75.25像素
}
print("Adding captions with float position transformation...")
print(f"Setting transform_x={add_captions_data['transform_x']}, transform_y={add_captions_data['transform_y']}")
add_response = requests.post(add_captions_url, json=add_captions_data)
if add_response.status_code == 200:
result = add_response.json()
print(f"Captions added successfully!")
print(f"Track ID: {result['track_id']}")
print(f"Text IDs: {result['text_ids']}")
print(f"Segment IDs: {result['segment_ids']}")
print(f"Draft URL: {result['draft_url']}")
print("\n注意:在剪映中验证时,transform_x=150.5应该精确移动150.5像素")
else:
print(f"Failed to add captions: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"Error occurred: {e}")
print("Make sure the server is running on http://localhost:8000")
if __name__ == "__main__":
test_float_transform()
================================================
FILE: tests/test_font_alias_resolution.py
================================================
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from src.service.add_captions import resolve_font_type
from src.pyJianYingDraft import FontType
def test_resolve_font_type_by_alias_zhixianghei():
"""支持通过“志向黑”别名解析字体。"""
assert resolve_font_type("志向黑") == FontType.励字志向黑简_特粗
def test_resolve_font_type_by_display_name():
"""支持通过字体展示名解析。"""
assert resolve_font_type("励字志向黑简 特粗") == FontType.励字志向黑简_特粗
def test_resolve_font_type_by_enum_name():
"""支持通过 FontType 枚举字段名解析。"""
assert resolve_font_type("励字志向黑简_特粗") == FontType.励字志向黑简_特粗
def test_resolve_font_type_with_unknown_name():
"""未知字体名称应回退为默认字体(返回 None)。"""
assert resolve_font_type("不存在的字体名称") is None
================================================
FILE: tests/test_font_size.py
================================================
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.pyJianYingDraft.text_segment import TextStyle, TextSegment
from src.pyJianYingDraft.time_util import Timerange
def test_font_size():
"""测试字体大小设置"""
# 创建一个文本样式,指定字体大小为20
text_style = TextStyle(
size=20.0,
color=(1.0, 1.0, 1.0), # 白色
alpha=1.0,
align=1, # 居中
auto_wrapping=True
)
print(f"创建的TextStyle字体大小: {text_style.size}")
# 创建一个时间范围
timerange = Timerange(start=0, duration=5000000) # 5秒
# 创建文本片段
text_segment = TextSegment(
text="测试字体大小",
timerange=timerange,
style=text_style
)
print(f"TextSegment的style.size: {text_segment.style.size}")
# 导出材质并检查字体大小
material_json = text_segment.export_material()
content = material_json["content"]
print(f"导出的content: {content}")
# 解析content JSON
import json
content_data = json.loads(content)
styles = content_data["styles"]
base_style = styles[0]
print(f"基础样式中的字体大小: {base_style['size']}")
if __name__ == "__main__":
test_font_size()
================================================
FILE: tests/test_font_size_debug.py
================================================
def test_font_size_logic():
"""测试字体大小逻辑"""
# 模拟caption数据
caption = {
"start": 0,
"end": 5000000,
"text": "测试字体大小"
}
# 模拟函数参数
font_size = 15 # add_captions函数的默认值
# 模拟add_caption_to_draft中的逻辑
size = float(caption.get('font_size', font_size))
print(f"caption: {caption}")
print(f"font_size参数: {font_size}")
print(f"计算出的字体大小: {size}")
# 测试当caption中有font_size时的情况
caption_with_font_size = {
"start": 0,
"end": 5000000,
"text": "测试字体大小",
"font_size": 20
}
size2 = float(caption_with_font_size.get('font_size', font_size))
print(f"\ncaption_with_font_size: {caption_with_font_size}")
print(f"font_size参数: {font_size}")
print(f"计算出的字体大小: {size2}")
if __name__ == "__main__":
test_font_size_logic()
================================================
FILE: tests/test_font_size_logic.py
================================================
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
def test_font_size_logic():
"""测试字体大小逻辑"""
# 模拟caption数据,不指定font_size
caption_without_font_size = {
"start": 0,
"end": 5000000,
"text": "测试字体大小"
}
# 模拟函数参数
font_size = 20 # add_captions函数的默认值
# 模拟add_caption_to_draft中的逻辑
# 使用一个特殊值来表示未设置字体大小
FONT_SIZE_NOT_SET = -1.0
font_size_value = FONT_SIZE_NOT_SET
if 'font_size' in caption_without_font_size and caption_without_font_size['font_size'] is not None:
font_size_value = float(caption_without_font_size['font_size'])
print(f"caption_without_font_size: {caption_without_font_size}")
print(f"font_size参数: {font_size}")
print(f"计算出的字体大小值: {font_size_value}")
print(f"最终使用的字体大小: {font_size_value if font_size_value != FONT_SIZE_NOT_SET else 8.0}")
# 测试当caption中有font_size时的情况
caption_with_font_size = {
"start": 0,
"end": 5000000,
"text": "测试字体大小",
"font_size": 25
}
font_size_value2 = FONT_SIZE_NOT_SET
if 'font_size' in caption_with_font_size and caption_with_font_size['font_size'] is not None:
font_size_value2 = float(caption_with_font_size['font_size'])
print(f"\ncaption_with_font_size: {caption_with_font_size}")
print(f"font_size参数: {font_size}")
print(f"计算出的字体大小值: {font_size_value2}")
print(f"最终使用的字体大小: {font_size_value2}")
if __name__ == "__main__":
test_font_size_logic()
================================================
FILE: tests/test_font_size_not_set.py
================================================
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.service.add_captions import add_caption_to_draft
from src.pyJianYingDraft import ScriptFile
def test_font_size_not_set():
"""测试未设置字体大小的情况"""
# 创建一个模拟的草稿文件对象
script = ScriptFile()
# 创建一个字幕项,不指定font_size
caption = {
"start": 0,
"end": 5000000, # 5秒
"text": "测试未设置字体大小"
}
try:
# 调用add_caption_to_draft函数
segment_id, text_id, segment_info = add_caption_to_draft(
script=script,
track_name="test_track",
caption=caption,
text_color="#ffffff",
font_size=20 # 这是接口级别的默认值
)
print(f"成功添加字幕,segment_id: {segment_id}")
print(f"text_id: {text_id}")
print(f"segment_info: {segment_info}")
# 检查导出的材质
# 获取刚刚添加的文本片段
text_segment = None
for segment in script.segments.values():
if segment.segment_id == segment_id:
text_segment = segment
break
if text_segment:
material_json = text_segment.export_material()
print(f"导出的材质: {material_json}")
# 检查content中的size字段
import json
content_data = json.loads(material_json["content"])
styles = content_data["styles"]
base_style = styles[0]
if "size" in base_style:
print(f"基础样式中的字体大小: {base_style['size']}")
else:
print("基础样式中没有size字段,表示未设置字体大小")
else:
print("未找到添加的文本片段")
except Exception as e:
print(f"添加字幕时出错: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
test_font_size_not_set()
================================================
FILE: tests/test_get_audio_duration_api.py
================================================
"""
测试 get_audio_duration 接口的完整性
"""
import requests
import json
def test_get_audio_duration_api():
"""测试 get_audio_duration 接口"""
# 服务器地址
base_url = "http://localhost:60000"
api_url = f"{base_url}/openapi/v1/get_audio_duration"
# 测试数据
test_data = {
"mp3_url": "https://www.soundjay.com/misc/sounds/bell-ringing-05.wav"
}
# 请求头
headers = {
"Content-Type": "application/json"
}
try:
print("🚀 开始测试 get_audio_duration 接口...")
print(f"📍 请求URL: {api_url}")
print(f"📝 请求数据: {json.dumps(test_data, indent=2)}")
# 发送POST请求
response = requests.post(api_url, json=test_data, headers=headers, timeout=60)
print(f"📊 响应状态码: {response.status_code}")
print(f"📄 响应头: {dict(response.headers)}")
if response.status_code == 200:
result = response.json()
print(f"✅ 请求成功!")
print(f"📋 响应数据: {json.dumps(result, indent=2)}")
# 验证响应格式
if "duration" in result:
duration = result["duration"]
print(f"🎵 音频时长: {duration} 微秒 = {duration/1000000:.3f} 秒")
return True
else:
print("❌ 响应中缺少 'duration' 字段")
return False
else:
print(f"❌ 请求失败,状态码: {response.status_code}")
print(f"📄 响应内容: {response.text}")
return False
except requests.exceptions.ConnectionError:
print("❌ 连接失败,请确保服务器已启动 (python main.py)")
return False
except requests.exceptions.Timeout:
print("❌ 请求超时")
return False
except Exception as e:
print(f"❌ 测试异常: {str(e)}")
return False
if __name__ == "__main__":
success = test_get_audio_duration_api()
if success:
print("\n🎉 get_audio_duration 接口测试通过!")
else:
print("\n💥 get_audio_duration 接口测试失败!")
================================================
FILE: tests/test_get_text_effects.py
================================================
"""
测试获取花字效果列表 API
"""
import sys
import os
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.service.get_text_effects import get_text_effects
def test_get_all_text_effects():
"""测试获取所有花字效果"""
print("=" * 60)
print("测试:获取所有花字效果 (mode=0)")
print("=" * 60)
try:
effects = get_text_effects(mode=0)
print(f"\n✅ 成功获取 {len(effects)} 个花字效果")
# 显示前 20 个
print("\n前 20 个花字效果:")
for i, effect in enumerate(effects[:20], 1):
vip_tag = " [VIP]" if effect.get('is_vip') else ""
print(f" {i}. {effect['name']}{vip_tag} (ID: {effect['effect_id']})")
# 统计 VIP 和免费
vip_count = sum(1 for e in effects if e.get('is_vip', False))
free_count = len(effects) - vip_count
print(f"\n📊 统计:")
print(f" • VIP 效果:{vip_count} 个")
print(f" • 免费效果:{free_count} 个")
print(f" • 总计:{len(effects)} 个")
except Exception as e:
print(f"\n❌ 测试失败:{str(e)}")
import traceback
traceback.print_exc()
def test_get_vip_text_effects():
"""测试获取 VIP 花字效果"""
print("\n" + "=" * 60)
print("测试:获取 VIP 花字效果 (mode=1)")
print("=" * 60)
try:
effects = get_text_effects(mode=1)
print(f"\n✅ 成功获取 {len(effects)} 个 VIP 花字效果")
if effects:
print("\n前 10 个 VIP 花字效果:")
for i, effect in enumerate(effects[:10], 1):
print(f" {i}. {effect['name']} (ID: {effect['effect_id']})")
else:
print("\nℹ️ 当前没有 VIP 花字效果")
except Exception as e:
print(f"\n❌ 测试失败:{str(e)}")
def test_get_free_text_effects():
"""测试获取免费花字效果"""
print("\n" + "=" * 60)
print("测试:获取免费花字效果 (mode=2)")
print("=" * 60)
try:
effects = get_text_effects(mode=2)
print(f"\n✅ 成功获取 {len(effects)} 个免费花字效果")
# 显示前 20 个
print("\n前 20 个免费花字效果:")
for i, effect in enumerate(effects[:20], 1):
print(f" {i}. {effect['name']} (ID: {effect['effect_id']})")
print(f"\n📊 总计:{len(effects)} 个免费花字效果")
except Exception as e:
print(f"\n❌ 测试失败:{str(e)}")
def test_invalid_mode():
"""测试无效模式"""
print("\n" + "=" * 60)
print("测试:无效模式 (mode=3)")
print("=" * 60)
try:
effects = get_text_effects(mode=3)
print(f"\n❌ 应该抛出异常但没有")
except Exception as e:
print(f"\n✅ 正确抛出异常:{type(e).__name__}")
if __name__ == "__main__":
print("\n🚀 开始测试获取花字效果列表 API\n")
test_get_all_text_effects()
test_get_vip_text_effects()
test_get_free_text_effects()
test_invalid_mode()
print("\n" + "=" * 60)
print("✅ 所有测试完成!")
print("=" * 60)
================================================
FILE: tests/test_imgs_infos_multiple_animations.py
================================================
import json
import sys
import os
# 添加项目根目录到Python路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from src.service.imgs_infos import imgs_infos
def test_multiple_animations_basic():
"""测试基本的多动画功能"""
print("测试基本的多动画功能:")
imgs = [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg"
]
timelines = [
{"start": 0, "end": 1000000},
{"start": 1000000, "end": 2000000},
{"start": 2000000, "end": 3000000}
]
# 测试多个入场动画
in_animation = "淡入|展开|缩放"
in_animation_duration = 500000
infos_json = imgs_infos(
imgs=imgs,
timelines=timelines,
in_animation=in_animation,
in_animation_duration=in_animation_duration
)
infos = json.loads(infos_json)
print(f"生成的图片信息: {infos}")
# 验证每个图片都获得了对应的动画
assert len(infos) == 3
assert infos[0]["in_animation"] == "淡入"
assert infos[1]["in_animation"] == "展开"
assert infos[2]["in_animation"] == "缩放"
assert infos[0]["in_animation_duration"] == 500000
assert infos[1]["in_animation_duration"] == 500000
assert infos[2]["in_animation_duration"] == 500000
print("✓ 基本多动画测试通过")
def test_animation_extension_logic():
"""测试动画扩展逻辑:动画不足时使用最后一个"""
print("\n测试动画扩展逻辑:")
imgs = [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg",
"https://example.com/image4.jpg"
]
timelines = [
{"start": 0, "end": 1000000},
{"start": 1000000, "end": 2000000},
{"start": 2000000, "end": 3000000},
{"start": 3000000, "end": 4000000}
]
# 只提供2个动画,但有4张图片
in_animation = "淡入|展开"
in_animation_duration = 500000
infos_json = imgs_infos(
imgs=imgs,
timelines=timelines,
in_animation=in_animation,
in_animation_duration=in_animation_duration
)
infos = json.loads(infos_json)
print(f"生成的图片信息: {infos}")
# 验证扩展逻辑:前两个使用指定动画,后两个使用最后一个动画
assert len(infos) == 4
assert infos[0]["in_animation"] == "淡入"
assert infos[1]["in_animation"] == "展开"
assert infos[2]["in_animation"] == "展开" # 使用最后一个动画
assert infos[3]["in_animation"] == "展开" # 使用最后一个动画
print("✓ 动画扩展逻辑测试通过")
def test_excess_animations():
"""测试动画过多时的处理:忽略多余的动画"""
print("\n测试动画过多时的处理:")
imgs = [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg"
]
timelines = [
{"start": 0, "end": 1000000},
{"start": 1000000, "end": 2000000}
]
# 提供3个动画,但只有2张图片
in_animation = "淡入|展开|缩放|旋转"
in_animation_duration = 500000
infos_json = imgs_infos(
imgs=imgs,
timelines=timelines,
in_animation=in_animation,
in_animation_duration=in_animation_duration
)
infos = json.loads(infos_json)
print(f"生成的图片信息: {infos}")
# 验证只使用前两个动画
assert len(infos) == 2
assert infos[0]["in_animation"] == "淡入"
assert infos[1]["in_animation"] == "展开"
# 多余的动画(缩放、旋转)应该被忽略
print("✓ 动画过多处理测试通过")
def test_multiple_animation_types():
"""测试多种动画类型同时使用"""
print("\n测试多种动画类型同时使用:")
imgs = [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg"
]
timelines = [
{"start": 0, "end": 1000000},
{"start": 1000000, "end": 2000000},
{"start": 2000000, "end": 3000000}
]
# 同时测试三种动画类型
in_animation = "淡入|展开|缩放"
in_animation_duration = 500000
loop_animation = "呼吸|旋转|闪烁"
loop_animation_duration = 1000000
out_animation = "淡出|收缩|翻转"
out_animation_duration = 300000
infos_json = imgs_infos(
imgs=imgs,
timelines=timelines,
in_animation=in_animation,
in_animation_duration=in_animation_duration,
loop_animation=loop_animation,
loop_animation_duration=loop_animation_duration,
out_animation=out_animation,
out_animation_duration=out_animation_duration
)
infos = json.loads(infos_json)
print(f"生成的图片信息: {infos}")
# 验证所有动画类型都正确分配
assert len(infos) == 3
assert infos[0]["in_animation"] == "淡入"
assert infos[0]["loop_animation"] == "呼吸"
assert infos[0]["out_animation"] == "淡出"
assert infos[1]["in_animation"] == "展开"
assert infos[1]["loop_animation"] == "旋转"
assert infos[1]["out_animation"] == "收缩"
assert infos[2]["in_animation"] == "缩放"
assert infos[2]["loop_animation"] == "闪烁"
assert infos[2]["out_animation"] == "翻转"
# 验证duration正确添加
assert infos[0]["in_animation_duration"] == 500000
assert infos[0]["loop_animation_duration"] == 1000000
assert infos[0]["out_animation_duration"] == 300000
print("✓ 多种动画类型测试通过")
def test_backward_compatibility():
"""测试向后兼容性:单个动画仍然正常工作"""
print("\n测试向后兼容性:")
imgs = [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg"
]
timelines = [
{"start": 0, "end": 1000000},
{"start": 1000000, "end": 2000000}
]
# 使用单个动画(原始用法)
in_animation = "淡入"
in_animation_duration = 500000
infos_json = imgs_infos(
imgs=imgs,
timelines=timelines,
in_animation=in_animation,
in_animation_duration=in_animation_duration
)
infos = json.loads(infos_json)
print(f"生成的图片信息: {infos}")
# 验证向后兼容性:两个图片都使用同一个动画
assert len(infos) == 2
assert infos[0]["in_animation"] == "淡入"
assert infos[1]["in_animation"] == "淡入"
assert infos[0]["in_animation_duration"] == 500000
assert infos[1]["in_animation_duration"] == 500000
print("✓ 向后兼容性测试通过")
def test_empty_and_none_animations():
"""测试空动画和None值的处理"""
print("\n测试空动画和None值的处理:")
imgs = [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg"
]
timelines = [
{"start": 0, "end": 1000000},
{"start": 1000000, "end": 2000000}
]
# 测试空字符串和None值
infos_json = imgs_infos(
imgs=imgs,
timelines=timelines,
in_animation="", # 空字符串
loop_animation=None, # None值
out_animation="淡出" # 正常值
)
infos = json.loads(infos_json)
print(f"生成的图片信息: {infos}")
# 验证空动画不添加动画字段
assert "in_animation" not in infos[0]
assert "in_animation" not in infos[1]
assert "loop_animation" not in infos[0]
assert "loop_animation" not in infos[1]
# 验证正常动画正常工作
assert infos[0]["out_animation"] == "淡出"
assert infos[1]["out_animation"] == "淡出"
print("✓ 空动画和None值处理测试通过")
def run_all_tests():
"""运行所有测试"""
print("开始测试imgs_infos多动画功能...")
print("=" * 50)
try:
test_multiple_animations_basic()
test_animation_extension_logic()
test_excess_animations()
test_multiple_animation_types()
test_backward_compatibility()
test_empty_and_none_animations()
print("\n" + "=" * 50)
print("🎉 所有测试通过!")
return True
except Exception as e:
print(f"\n❌ 测试失败: {e}")
import traceback
traceback.print_exc()
return False
if __name__ == "__main__":
success = run_all_tests()
sys.exit(0 if success else 1)
================================================
FILE: tests/test_keyframe_value.py
================================================
"""keyframe_value 归一化工具单元测试。"""
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from src.utils.keyframe_value import normalize_keyframe_value
def test_normalize_pixel_position_x():
assert normalize_keyframe_value("KFTypePositionX", -2608.0, width=1920) == -2608.0 / 1920
assert normalize_keyframe_value("KFTypePositionX", -699.0, width=1920) == -699.0 / 1920
def test_normalize_already_normalized_position_x():
assert normalize_keyframe_value("KFTypePositionX", -0.1, width=1920) == -0.1
assert normalize_keyframe_value("KFTypePositionX", 1.0, width=1920) == 1.0
def test_normalize_pixel_position_y():
assert normalize_keyframe_value("KFTypePositionY", 540.0, height=1080) == 0.5
def test_keyframes_infos_assume_pixel_normalizes_small_values():
assert normalize_keyframe_value(
"KFTypePositionX", 1.0, width=1920, assume_pixel=True
) == 1.0 / 1920
def test_rotation_scale_alpha_unchanged():
canvas = dict(width=1920, height=1080)
assert normalize_keyframe_value("KFTypeRotation", 90.0, **canvas) == 90.0
assert normalize_keyframe_value("UNIFORM_SCALE", 1.3, **canvas) == 1.3
assert normalize_keyframe_value("KFTypeAlpha", 0.5, **canvas) == 0.5
def test_rotation_scale_alpha_unchanged_with_assume_pixel():
canvas = dict(width=1920, height=1080, assume_pixel=True)
assert normalize_keyframe_value("KFTypeRotation", 45.0, **canvas) == 45.0
assert normalize_keyframe_value("UNIFORM_SCALE", 1.5, **canvas) == 1.5
assert normalize_keyframe_value("KFTypeAlpha", 0.8, **canvas) == 0.8
================================================
FILE: tests/test_keyword_font_size.py
================================================
import sys
import os
import json
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.service.add_captions import parse_captions_data, apply_keyword_highlight
from src.pyJianYingDraft.text_segment import TextSegment, TextStyle, Timerange
def test_keyword_font_size_parsing():
"""测试keyword_font_size参数解析"""
print("Testing keyword_font_size parameter parsing...")
# 测试数据
test_captions = [
{
"start": 0,
"end": 10000000,
"text": "你好,剪映",
"keyword": "剪映",
"keyword_font_size": 20 # 设置关键词字体大小
},
{
"start": 10000000,
"end": 20000000,
"text": "欢迎使用剪映字幕功能",
"keyword": "功能",
"keyword_font_size": 18 # 设置关键词字体大小
}
]
# 将测试数据转换为JSON字符串
captions_json = json.dumps(test_captions)
# 解析字幕数据
parsed_captions = parse_captions_data(captions_json)
# 验证解析结果
assert len(parsed_captions) == 2
assert parsed_captions[0]["keyword_font_size"] == 20
assert parsed_captions[1]["keyword_font_size"] == 18
print("✓ keyword_font_size parameter parsing test passed")
def test_keyword_font_size_application():
"""测试keyword_font_size参数应用"""
print("Testing keyword_font_size parameter application...")
# 创建一个文本片段
text_segment = TextSegment(
text="你好,剪映",
timerange=Timerange(start=0, duration=5000000),
style=TextStyle(size=15.0) # 默认字体大小为15
)
# 应用关键词高亮,指定关键词字体大小为20
apply_keyword_highlight(text_segment, "剪映", (1.0, 0.0, 0.0), 20.0)
# 验证额外样式是否正确应用
assert len(text_segment.extra_styles) == 1
highlight_style = text_segment.extra_styles[0]
assert highlight_style["size"] == 20.0 # 验证关键词字体大小是否为20
assert highlight_style["range"] == [3, 5] # 验证关键词位置是否正确
print("✓ keyword_font_size parameter application test passed")
def test_keyword_font_size_default():
"""测试keyword_font_size参数默认值"""
print("Testing keyword_font_size parameter default value...")
# 创建一个文本片段
text_segment = TextSegment(
text="你好,剪映",
timerange=Timerange(start=0, duration=5000000),
style=TextStyle(size=15.0) # 默认字体大小为15
)
# 应用关键词高亮,不指定关键词字体大小,应该使用默认值
apply_keyword_highlight(text_segment, "剪映", (1.0, 0.0, 0.0))
# 验证额外样式是否正确应用
assert len(text_segment.extra_styles) == 1
highlight_style = text_segment.extra_styles[0]
assert highlight_style["size"] == 15.0 # 验证关键词字体大小是否为默认值15
print("✓ keyword_font_size parameter default value test passed")
if __name__ == "__main__":
print("Running keyword_font_size tests...")
test_keyword_font_size_parsing()
test_keyword_font_size_application()
test_keyword_font_size_default()
print("All tests passed!")
================================================
FILE: tests/test_latest_commit_features.py
================================================
"""
单元测试:验证最近一次提交的新功能
测试内容:
1. 主轨道吸附 (maintrack_adsorb)
2. 混合模式 (MixMode)
3. 音频淡入淡出 (AudioFade for VideoSegment)
4. 新增滤镜和字体
"""
import unittest
import sys
import os
# 添加 src 到路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
from pyJianYingDraft import DraftFolder, ScriptFile
from pyJianYingDraft.video_segment import VideoSegment, MixMode
from pyJianYingDraft.segment import AudioFade
from pyJianYingDraft.metadata import FilterType, FontType
from pyJianYingDraft.metadata.mix_mode_meta import MixModeType
from pyJianYingDraft.time_util import Timerange
from pyJianYingDraft.track import TrackType
class TestMaintrackAdsorb(unittest.TestCase):
"""测试主轨道吸附功能"""
def test_maintrack_adsorb_default_true(self):
"""测试默认启用主轨道吸附"""
script = ScriptFile(1920, 1080, 30, maintrack_adsorb=True)
self.assertTrue(script.maintrack_adsorb)
def test_maintrack_adsorb_false(self):
"""测试禁用主轨道吸附"""
script = ScriptFile(1920, 1080, 30, maintrack_adsorb=False)
self.assertFalse(script.maintrack_adsorb)
def test_maintrack_adsorb_in_export(self):
"""测试主轨道吸附配置正确导出到 JSON"""
script = ScriptFile(1920, 1080, 30, maintrack_adsorb=True)
json_str = script.dumps()
self.assertIn('"maintrack_adsorb": true', json_str)
class TestMixMode(unittest.TestCase):
"""测试混合模式功能"""
def test_mix_mode_creation(self):
"""测试混合模式对象创建"""
mix_mode = MixMode(MixModeType.正片叠底.value)
self.assertIsNotNone(mix_mode.global_id)
self.assertEqual(mix_mode.effect_meta.name, "正片叠底")
self.assertEqual(mix_mode.apply_target_type, 0)
def test_mix_mode_export_json(self):
"""测试混合模式 JSON 导出"""
mix_mode = MixMode(MixModeType.滤色.value)
json_data = mix_mode.export_json()
self.assertEqual(json_data["type"], "mix_mode")
self.assertEqual(json_data["name"], "滤色")
self.assertEqual(json_data["value"], 1.0)
self.assertEqual(json_data["apply_target_type"], 0)
self.assertEqual(json_data["platform"], "all")
self.assertIn("id", json_data)
self.assertIn("effect_id", json_data)
self.assertIn("resource_id", json_data)
def test_video_segment_set_mix_mode(self):
"""测试为视频片段设置混合模式"""
# 创建一个模拟的视频片段(使用假路径)
timerange = Timerange(0, 1000000) # 1秒
# 由于需要真实视频文件,这里只测试对象创建逻辑
# 实际测试需要在集成测试中进行
pass
class TestVideoSegmentAudioFade(unittest.TestCase):
"""测试视频片段的音频淡入淡出功能"""
def test_audio_fade_creation(self):
"""测试音频淡入淡出对象创建"""
fade = AudioFade(500000, 500000) # 0.5秒淡入,0.5秒淡出
self.assertIsNotNone(fade.fade_id)
self.assertEqual(fade.in_duration, 500000)
self.assertEqual(fade.out_duration, 500000)
def test_audio_fade_export_json(self):
"""测试音频淡入淡出 JSON 导出"""
fade = AudioFade(100000, 200000)
json_data = fade.export_json()
self.assertEqual(json_data["type"], "audio_fade")
self.assertEqual(json_data["fade_in_duration"], 100000)
self.assertEqual(json_data["fade_out_duration"], 200000)
self.assertEqual(json_data["fade_type"], 0)
self.assertIn("id", json_data)
class TestNewFilters(unittest.TestCase):
"""测试新增滤镜"""
def test_filter_has_resource_id(self):
"""测试滤镜有资源 ID"""
filter_meta = FilterType.黑白记忆
self.assertIsNotNone(filter_meta.value.resource_id)
self.assertIsNotNone(filter_meta.value.effect_id)
def test_filter_with_params(self):
"""测试带参数的滤镜"""
# 黑白记忆滤镜有 effects_adjust_filter 参数
filter_meta = FilterType.黑白记忆
self.assertTrue(len(filter_meta.value.params) > 0)
param = filter_meta.value.params[0]
self.assertEqual(param.name, "effects_adjust_filter")
class TestNewFonts(unittest.TestCase):
"""测试新增字体"""
def test_new_fonts_exist(self):
"""测试新增字体存在"""
# 南廱明體
self.assertTrue(hasattr(FontType, '南廱明體'))
font1 = FontType.南廱明體
self.assertIsNotNone(font1.value.resource_id)
# 蜡笔体
self.assertTrue(hasattr(FontType, '蜡笔体'))
font2 = FontType.蜡笔体
self.assertIsNotNone(font2.value.resource_id)
class TestScriptMaterial(unittest.TestCase):
"""测试 ScriptMaterial 对新材料的支持"""
def test_mix_modes_list_exists(self):
"""测试 mix_modes 列表存在"""
from pyJianYingDraft.script_file import ScriptMaterial
materials = ScriptMaterial()
self.assertTrue(hasattr(materials, 'mix_modes'))
self.assertIsInstance(materials.mix_modes, list)
def test_mix_mode_in_check(self):
"""测试 mix_mode 的 __contains__ 检查"""
from pyJianYingDraft.script_file import ScriptMaterial
materials = ScriptMaterial()
mix_mode = MixMode(MixModeType.柔光.value)
# 初始不应包含
self.assertNotIn(mix_mode, materials)
# 添加后应包含
materials.mix_modes.append(mix_mode)
self.assertIn(mix_mode, materials)
class TestIntegration(unittest.TestCase):
"""集成测试 - 验证完整工作流程"""
def test_script_file_creation_with_maintrack_adsorb(self):
"""测试创建带主轨道吸附配置的 ScriptFile"""
script = ScriptFile(1920, 1080, 30, maintrack_adsorb=True)
script.add_track(TrackType.video)
# 验证 dumps 输出包含 maintrack_adsorb
json_str = script.dumps()
self.assertIn('"maintrack_adsorb": true', json_str)
def test_export_json_structure(self):
"""测试导出 JSON 结构完整性"""
script = ScriptFile(1920, 1080, 30, maintrack_adsorb=False)
json_str = script.dumps()
# 验证基本字段存在
self.assertIn('"fps": 30', json_str)
self.assertIn('"width": 1920', json_str)
self.assertIn('"height": 1080', json_str)
self.assertIn('"maintrack_adsorb": false', json_str)
class TestBackwardCompatibility(unittest.TestCase):
"""向后兼容性测试"""
def test_script_file_init_requires_maintrack_adsorb(self):
"""测试 ScriptFile 初始化需要 maintrack_adsorb 参数"""
# 这是有意的设计,强制用户明确指定主轨道吸附设置
with self.assertRaises(TypeError):
ScriptFile(1920, 1080, 30) # 缺少 maintrack_adsorb
def test_mix_mode_types_available(self):
"""测试所有混合模式类型可用"""
expected_modes = [
"正片叠底", "颜色减淡", "颜色加深", "线性加深",
"柔光", "强光", "滤色", "叠加", "变亮", "变暗"
]
for mode_name in expected_modes:
self.assertTrue(
hasattr(MixModeType, mode_name),
f"MixModeType 缺少 {mode_name}"
)
if __name__ == '__main__':
unittest.main(verbosity=2)
================================================
FILE: tests/test_logic_validation.py
================================================
"""
这个文件用于验证我们对add_videos接口修复的逻辑是否正确
"""
def test_duration_handling_logic():
"""
测试duration处理逻辑
场景:
1. 视频实际时长为2000000微秒(2秒)
2. 用户指定duration为3000000微秒(3秒)
3. start=3000000, end=6000000 (播放时长3秒)
预期行为:
- 视频正常播放前2秒
- 第3秒显示视频最后一帧(静态画面)
"""
# 模拟视频信息
video_info = {
"video_url": "https://example.com/video.mp4",
"duration": 3000000, # 用户指定的总时长
"start": 3000000, # 在时间轴上的开始时间
"end": 6000000, # 在时间轴上的结束时间
"width": 576,
"height": 1024
}
# 实际视频时长(从文件中获取)
actual_video_duration = 2000000 # 2秒
print("输入参数:")
print(f" video_url: {video_info['video_url']}")
print(f" 指定duration: {video_info['duration']} 微秒 ({video_info['duration']/1000000}秒)")
print(f" start: {video_info['start']} 微秒 ({video_info['start']/1000000}秒)")
print(f" end: {video_info['end']} 微秒 ({video_info['end']/1000000}秒)")
print(f" 实际视频时长: {actual_video_duration} 微秒 ({actual_video_duration/1000000}秒)")
# 计算播放时长
play_duration = video_info['end'] - video_info['start']
print(f"\n计算结果:")
print(f" 播放时长 (end-start): {play_duration} 微秒 ({play_duration/1000000}秒)")
# 检查是否超出实际时长
if video_info['duration'] > actual_video_duration:
extension_duration = video_info['duration'] - actual_video_duration
print(f" 超出时长: {extension_duration} 微秒 ({extension_duration/1000000}秒)")
print(f" 结论: 视频播放{actual_video_duration/1000000}秒后,显示静态画面{extension_duration/1000000}秒")
else:
print(f" 结论: 视频按时长正常播放")
# 验证我们的解决方案
print(f"\n解决方案验证:")
print(f" 使用source_timerange: [0, {min(video_info['duration'], actual_video_duration)}]")
print(f" 使用target_timerange: [{video_info['start']}, {play_duration}]")
print(f" 保持speed=1.0,确保视频以原始速度播放")
# 验证参数
assert video_info['duration'] == 3000000
assert play_duration == 3000000
assert actual_video_duration == 2000000
assert video_info['duration'] > actual_video_duration
print("\n✅ 逻辑验证通过!")
if __name__ == "__main__":
test_duration_handling_logic()
================================================
FILE: tests/test_media_utils.py
================================================
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.utils.media import get_media_duration, get_media_duration_formatted
def test_media_duration():
"""测试媒体时长获取功能"""
# 测试不存在的文件
print("测试不存在的文件:")
duration = get_media_duration("nonexistent.mp3")
print(f"时长: {duration}")
# 测试存在的音频文件
print("\n测试存在的音频文件:")
duration = get_media_duration("test_audio.wav")
print(f"WAV文件时长(微秒): {duration}")
formatted = get_media_duration_formatted("test_audio.wav")
print(f"WAV文件时长(格式化): {formatted}")
# 清理测试文件
if os.path.exists("test_audio.wav"):
os.remove("test_audio.wav")
print("已清理测试文件")
if __name__ == "__main__":
test_media_duration()
================================================
FILE: tests/test_middleware.py
================================================
import os
import asyncio
from fastapi import FastAPI, Request
from src.middlewares import init_env_middleware
from src.customException.setttings import DRAFT_DIR
# 创建测试应用
app = FastAPI()
# 注册中间件
app.middleware("http")(init_env_middleware)
# 测试路由
@app.get("/")
async def test(request: Request):
return {
"message": "测试成功",
"draft_dir": os.environ.get("DRAFT_DIR"),
"today_draft_dir": os.environ.get("TODAY_DRAFT_DIR"),
"dir_exists": os.path.exists(DRAFT_DIR)
}
# 运行测试
if __name__ == "__main__":
import uvicorn
print("启动测试服务器...")
print(f"草稿目录: {DRAFT_DIR}")
uvicorn.run(app, host="0.0.0.0", port=8000)
================================================
FILE: tests/test_param_pass.py
================================================
import requests
def test_create_draft_with_custom_params():
"""测试使用自定义参数创建草稿"""
# 测试不同的参数值
test_cases = [
(1080, 1920), # 默认值
(720, 1280), # 720p
(2160, 3840) # 4K
]
# 假设API运行在本地8000端口
base_url = "http://localhost:60000"
endpoint = "/openapi/v1/create_draft"
url = f"{base_url}{endpoint}"
for height, width in test_cases:
print(f"Testing with height={height}, width={width}")
# 使用JSON body传递参数
try:
response = requests.post(
url,
json={"height": height, "width": width}
)
print(f"Response status code: {response.status_code}")
print(f"Response body: {response.json()}")
if response.status_code != 200:
print(f"Error: Request failed with status code {response.status_code}")
continue
if "message" not in response.json() or "draft_id" not in response.json():
print("Error: Response missing required fields")
continue
if response.json()["message"] != "草稿创建成功":
print(f"Error: Unexpected message: {response.json()['message']}")
continue
print("Test passed!")
except Exception as e:
print(f"Error occurred: {e}")
print("Make sure the server is running on http://localhost:8000")
if __name__ == "__main__":
test_create_draft_with_custom_params()
================================================
FILE: tests/test_parse_video_data.py
================================================
import json
def parse_video_data(json_str: str) -> list:
"""
解析视频数据的JSON字符串,处理可选字段的默认值
这是add_videos.py中parse_video_data函数的简化版本,用于测试
"""
try:
# 解析JSON字符串
data = json.loads(json_str)
except json.JSONDecodeError as e:
raise Exception(f"JSON parse error: {e.msg}")
# 确保输入是列表
if not isinstance(data, list):
raise Exception("video_infos should be a list")
result = []
for i, item in enumerate(data):
if not isinstance(item, dict):
raise Exception(f"the {i}th item should be a dict")
# 检查必选字段
required_fields = ["video_url", "width", "height", "start", "end"]
missing_fields = [field for field in required_fields if field not in item]
if missing_fields:
raise Exception(f"the {i}th item is missing required fields: {', '.join(missing_fields)}")
# 如果没有提供duration,则计算为end-start
duration = item.get("duration", item["end"] - item["start"])
# 创建处理后的对象,设置默认值
processed_item = {
"video_url": item["video_url"],
"width": item["width"],
"height": item["height"],
"start": item["start"],
"end": item["end"],
"duration": duration,
"mask": item.get("mask", None), # 默认值 None
"transition": item.get("transition", None), # 默认值 None
"transition_duration": item.get("transition_duration", 500000), # 默认值 500000
"volume": item.get("volume", 1.0) # 默认值 1.0
}
# 验证数值范围
if processed_item["volume"] < 0 or processed_item["volume"] > 1:
# 音量值必须在[0, 1]范围内,给默认值
processed_item["volume"] = 1.0
if processed_item["transition_duration"] < 0:
# 转场持续时间必须为非负数,给默认值
processed_item["transition_duration"] = 500000
result.append(processed_item)
return result
def test_parse_video_data_with_duration():
"""测试解析带duration参数的视频数据"""
# 测试数据:指定duration与实际播放时长不同
video_infos = [
{
"video_url": "https://example.com/video1.mp4",
"width": 1920,
"height": 1080,
"start": 0,
"end": 3000000, # 3秒
"duration": 6000000, # 指定6秒,比实际播放时长长
"volume": 0.8
},
{
"video_url": "https://example.com/video2.mp4",
"width": 1280,
"height": 720,
"start": 3000000, # 从第3秒开始
"end": 5000000, # 到第5秒结束
"duration": 1000000, # 指定1秒,比实际播放时长短
"volume": 1.0
},
# 测试不提供duration字段的情况
{
"video_url": "https://example.com/video3.mp4",
"width": 1920,
"height": 1080,
"start": 5000000, # 从第5秒开始
"end": 8000000, # 到第8秒结束
"volume": 0.5
}
]
json_str = json.dumps(video_infos)
parsed_videos = parse_video_data(json_str)
print("Parsed video data:")
for i, video in enumerate(parsed_videos):
print(f"Video {i+1}:")
print(f" URL: {video['video_url']}")
print(f" Width: {video['width']}")
print(f" Height: {video['height']}")
print(f" Start: {video['start']}")
print(f" End: {video['end']}")
print(f" Duration: {video['duration']}")
print(f" Play Duration (end-start): {video['end'] - video['start']}")
print(f" Volume: {video['volume']}")
print()
# 验证第一个视频:指定duration为6秒,播放时长为3秒
assert parsed_videos[0]['duration'] == 6000000
assert parsed_videos[0]['end'] - parsed_videos[0]['start'] == 3000000
# 验证第二个视频:指定duration为1秒,播放时长为2秒
assert parsed_videos[1]['duration'] == 1000000
assert parsed_videos[1]['end'] - parsed_videos[1]['start'] == 2000000
# 验证第三个视频:未指定duration,应该等于end-start
assert parsed_videos[2]['duration'] == 3000000
assert parsed_videos[2]['end'] - parsed_videos[2]['start'] == 3000000
print("All tests passed!")
if __name__ == "__main__":
test_parse_video_data_with_duration()
================================================
FILE: tests/test_search_sticker.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试 search_sticker 功能
"""
import sys
import os
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.service.search_sticker import search_sticker
def test_search_sticker():
"""测试搜索贴纸功能"""
print("测试搜索贴纸功能")
# 测试正常搜索
print("\n1. 测试正常搜索 '梦幻':")
result = search_sticker("梦幻")
print(f" 找到 {len(result)} 条记录")
if result:
print(f" 第一条记录标题: {result[0]['title']}")
# 测试搜索不到内容的情况
print("\n2. 测试搜索不存在的关键词 '不存在的关键词':")
result = search_sticker("不存在的关键词")
print(f" 找到 {len(result)} 条记录(应该是随机的50条)")
if result:
print(f" 第一条记录标题: {result[0]['title']}")
# 测试空关键词
print("\n3. 测试空关键词:")
result = search_sticker("")
print(f" 找到 {len(result)} 条记录")
if len(result) > 50:
print(" 应该只返回前50条记录")
else:
print(f" 返回了 {len(result)} 条记录")
print("\n测试完成!")
if __name__ == "__main__":
test_search_sticker()
================================================
FILE: tests/test_search_sticker_basic.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
基本测试 search_sticker 功能
"""
import json
import random
import os
def search_sticker(keyword: str, sticker_config_path: str) -> list:
"""
搜索贴纸的业务逻辑(简化版)
Args:
keyword: 搜索关键词
sticker_config_path: 贴纸配置文件路径
Returns:
list: 贴纸数据列表,最多返回50条记录
"""
print(f"Searching stickers with keyword: {keyword}")
# 从配置文件中读取贴纸数据
try:
with open(sticker_config_path, 'r', encoding='utf-8') as f:
sticker_data = json.load(f)
except FileNotFoundError:
print(f"Sticker config file not found: {sticker_config_path}")
return []
except json.JSONDecodeError as e:
print(f"Failed to parse sticker config file: {e}")
return []
except Exception as e:
print(f"Failed to read sticker config file: {e}")
return []
# 根据关键词过滤数据(简单匹配标题)
filtered_data = []
for item in sticker_data:
if keyword in item["title"]:
filtered_data.append(item)
print(f"Found {len(filtered_data)} stickers matching keyword: {keyword}")
# 如果没有找到匹配的贴纸,随机返回50条记录
if not filtered_data:
print("No matching stickers found, returning 50 random stickers")
# 确保不会超出总数据量
sample_size = min(50, len(sticker_data))
filtered_data = random.sample(sticker_data, sample_size)
# 如果找到的贴纸超过50条,只返回前50条
if len(filtered_data) > 50:
print(f"Too many matching stickers ({len(filtered_data)}), returning only 50")
filtered_data = filtered_data[:50]
return filtered_data
def test_search_sticker():
"""测试搜索贴纸功能"""
print("测试搜索贴纸功能")
# 设置贴纸配置文件路径
sticker_config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config", "sticker.json")
# 测试正常搜索
print("\n1. 测试正常搜索 '梦幻':")
result = search_sticker("梦幻", sticker_config_path)
print(f" 找到 {len(result)} 条记录")
if result:
print(f" 第一条记录标题: {result[0]['title']}")
# 测试搜索不到内容的情况
print("\n2. 测试搜索不存在的关键词 '不存在的关键词':")
result = search_sticker("不存在的关键词", sticker_config_path)
print(f" 找到 {len(result)} 条记录(应该是随机的50条)")
if result:
print(f" 第一条记录标题: {result[0]['title']}")
# 测试空关键词
print("\n3. 测试空关键词:")
result = search_sticker("", sticker_config_path)
print(f" 找到 {len(result)} 条记录")
if len(result) > 50:
print(" 应该只返回前50条记录")
else:
print(f" 返回了 {len(result)} 条记录")
print("\n测试完成!")
if __name__ == "__main__":
test_search_sticker()
================================================
FILE: tests/test_search_sticker_simple.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化测试 search_sticker 功能
"""
import sys
import os
import json
import random
import config
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
def search_sticker(keyword: str) -> list:
"""
搜索贴纸的业务逻辑(简化版)
Args:
keyword: 搜索关键词
Returns:
list: 贴纸数据列表,最多返回50条记录
"""
print(f"Searching stickers with keyword: {keyword}")
# 从配置文件中读取贴纸数据
try:
with open(config.STICKER_CONFIG_PATH, 'r', encoding='utf-8') as f:
sticker_data = json.load(f)
except FileNotFoundError:
print(f"Sticker config file not found: {config.STICKER_CONFIG_PATH}")
return []
except json.JSONDecodeError as e:
print(f"Failed to parse sticker config file: {e}")
return []
except Exception as e:
print(f"Failed to read sticker config file: {e}")
return []
# 根据关键词过滤数据(简单匹配标题)
filtered_data = []
for item in sticker_data:
if keyword in item["title"]:
filtered_data.append(item)
print(f"Found {len(filtered_data)} stickers matching keyword: {keyword}")
# 如果没有找到匹配的贴纸,随机返回50条记录
if not filtered_data:
print("No matching stickers found, returning 50 random stickers")
# 确保不会超出总数据量
sample_size = min(50, len(sticker_data))
filtered_data = random.sample(sticker_data, sample_size)
# 如果找到的贴纸超过50条,只返回前50条
if len(filtered_data) > 50:
print(f"Too many matching stickers ({len(filtered_data)}), returning only 50")
filtered_data = filtered_data[:50]
return filtered_data
def test_search_sticker():
"""测试搜索贴纸功能"""
print("测试搜索贴纸功能")
# 测试正常搜索
print("\n1. 测试正常搜索 '梦幻':")
result = search_sticker("梦幻")
print(f" 找到 {len(result)} 条记录")
if result:
print(f" 第一条记录标题: {result[0]['title']}")
# 测试搜索不到内容的情况
print("\n2. 测试搜索不存在的关键词 '不存在的关键词':")
result = search_sticker("不存在的关键词")
print(f" 找到 {len(result)} 条记录(应该是随机的50条)")
if result:
print(f" 第一条记录标题: {result[0]['title']}")
# 测试空关键词
print("\n3. 测试空关键词:")
result = search_sticker("")
print(f" 找到 {len(result)} 条记录")
if len(result) > 50:
print(" 应该只返回前50条记录")
else:
print(f" 返回了 {len(result)} 条记录")
print("\n测试完成!")
if __name__ == "__main__":
test_search_sticker()
================================================
FILE: tests/test_storage_upload_retry.py
================================================
"""
strict unit tests for src.utils.storage_upload_retry
"""
import errno
from unittest.mock import MagicMock, patch
import pytest
import requests
import urllib3.exceptions
from requests.exceptions import ChunkedEncodingError
from qcloud_cos.cos_exception import CosClientError, CosServiceError
import src.utils.storage_upload_retry as sur
@pytest.fixture
def no_sleep_no_random_delay():
"""Make retries cheap and deterministic in tests."""
with (
patch.object(sur, "time") as m_time,
patch.object(sur, "random") as m_random,
):
m_time.sleep = MagicMock()
m_random.uniform = MagicMock(return_value=0.0)
yield m_time
class TestIterExceptionChain:
def test_yields_self_then_cause(self) -> None:
root = requests.ConnectionError("outer")
root.__cause__ = OSError(errno.ETIMEDOUT, "inner")
seen = list(sur._iter_exception_chain(root))
assert len(seen) == 2
assert seen[0] is root
assert seen[1] is root.__cause__
def test_stops_on_cycle(self) -> None:
a = Exception("a")
b = Exception("b")
a.__context__ = b
b.__context__ = a
seen = list(sur._iter_exception_chain(a))
assert len(seen) == 2
class TestIsRetryableStorageError:
@pytest.mark.parametrize(
"exc",
[
requests.ConnectionError("refused"),
requests.Timeout("t"),
ChunkedEncodingError(),
],
)
def test_requests_transient(self, exc: Exception) -> None:
assert sur.is_retryable_storage_error(exc) is True
def test_urllib3_new_connection(self) -> None:
from urllib3.connection import HTTPConnection
exc = urllib3.exceptions.NewConnectionError(HTTPConnection("127.0.0.1", 9), "nope")
assert sur.is_retryable_storage_error(exc) is True
def test_urllib3_read_timeout(self) -> None:
pool = MagicMock()
exc = urllib3.exceptions.ReadTimeoutError(pool, "http://example", "read")
assert sur.is_retryable_storage_error(exc) is True
def test_urllib3_connect_timeout(self) -> None:
assert sur.is_retryable_storage_error(urllib3.exceptions.ConnectTimeoutError("c")) is True
def test_urllib3_protocol(self) -> None:
assert sur.is_retryable_storage_error(urllib3.exceptions.ProtocolError("p")) is True
@pytest.mark.parametrize("code", (errno.ECONNRESET, errno.ETIMEDOUT, 10054))
def test_oserror_errno(self, code: int) -> None:
assert sur.is_retryable_storage_error(OSError(code, "x")) is True
def test_oserror_not_retryable(self) -> None:
assert sur.is_retryable_storage_error(OSError(errno.ENOENT, "nope")) is False
def test_cos_client_error(self) -> None:
assert sur.is_retryable_storage_error(CosClientError("timeout")) is True
@pytest.mark.parametrize("status, expected", [(503, True), (500, True), (400, False), (404, False)])
def test_cos_service_error(self, status: int, expected: bool) -> None:
err = CosServiceError("PUT", {"code": "K", "message": "m", "resource": "r", "requestid": "q", "traceid": "t"}, status)
assert sur.is_retryable_storage_error(err) is expected
def test_exception_chain_finds_cause(self) -> None:
inner = requests.ConnectionError("c")
outer = ValueError("wrap")
outer.__cause__ = inner
assert sur.is_retryable_storage_error(outer) is True
def test_exception_chain_valueerror_first_in_chain_still_finds_cause(self) -> None:
"""Outer not retryable, __cause__ is: must still return True."""
inner = requests.ConnectionError("c")
outer = ValueError("v")
outer.__cause__ = inner
assert sur.is_retryable_storage_error(outer) is True
def test_oss_request_error(self) -> None:
import oss2.exceptions as ox
e = ox.RequestError(requests.ConnectionError("r"))
assert sur.is_retryable_storage_error(e) is True
@pytest.mark.parametrize("status, expected", [(503, True), (500, True), (408, True), (400, False), (404, False)])
def test_oss_oss_error_status(self, status: int, expected: bool) -> None:
import oss2.exceptions as ox
e = ox.OssError(status, {}, "", {})
assert sur.is_retryable_storage_error(e) is expected
class TestRunWithStorageRetry:
def test_success_first_call(self, no_sleep_no_random_delay) -> None:
op = MagicMock(return_value="ok")
assert sur.run_with_storage_retry(op, context="T") == "ok"
op.assert_called_once()
def test_retries_then_success(self, no_sleep_no_random_delay) -> None:
m_time = no_sleep_no_random_delay
op = MagicMock(side_effect=[requests.ConnectionError("1"), requests.ConnectionError("2"), "done"])
assert sur.run_with_storage_retry(op) == "done"
assert op.call_count == 3
assert m_time.sleep.call_count == 2
def test_non_retryable_raises_immediately(self, no_sleep_no_random_delay) -> None:
m_time = no_sleep_no_random_delay
op = MagicMock(side_effect=ValueError("bad"))
with pytest.raises(ValueError, match="bad"):
sur.run_with_storage_retry(op)
op.assert_called_once()
m_time.sleep.assert_not_called()
def test_exhausts_attempts(self, no_sleep_no_random_delay) -> None:
m_time = no_sleep_no_random_delay
err = requests.ConnectionError("x")
with patch.object(sur, "_STORAGE_UPLOAD_MAX_ATTEMPTS", 3):
op = MagicMock(side_effect=err)
with pytest.raises(requests.ConnectionError):
sur.run_with_storage_retry(op, context="X")
assert op.call_count == 3
assert m_time.sleep.call_count == 2
def test_context_passed_to_warning_logger(self, no_sleep_no_random_delay) -> None:
op = MagicMock(side_effect=[requests.ConnectionError("f"), "ok"])
with patch.object(sur.logger, "warning") as m_warn:
sur.run_with_storage_retry(op, context="COS")
m_warn.assert_called_once()
assert m_warn.call_args is not None
flat = " ".join(str(x) for x in m_warn.call_args[0])
assert "COS" in flat and "storage upload attempt" in flat
================================================
FILE: tests/test_text_segment_add_animation.py
================================================
"""TextSegment.add_animation:循环动画修正后的回归与行为测试。
保证入场/出场逻辑不变;循环动画 start 在入场结束后,duration 为单次循环时长(可受中间空隙限制)。
"""
from __future__ import annotations
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
import pytest
from src.pyJianYingDraft.text_segment import TextSegment, TextStyle
from src.pyJianYingDraft.time_util import Timerange
from src.pyJianYingDraft.metadata import TextIntro, TextOutro, TextLoopAnim
def _anim(seg: TextSegment, animation_type: str):
assert seg.animations_instance is not None
return next(a for a in seg.animations_instance.animations if a.animation_type == animation_type)
# --- 入场 / 出场:与改动前一致 ---
def test_intro_only_start_zero_and_respects_duration():
seg = TextSegment("t", Timerange(0, 10_000_000), style=TextStyle())
seg.add_animation(TextIntro.弹入, duration=400_000)
a = _anim(seg, "in")
assert a.start == 0
assert a.duration == 400_000
def test_outro_only_start_is_segment_end_minus_duration():
seg = TextSegment("t", Timerange(0, 10_000_000), style=TextStyle())
seg.add_animation(TextOutro.弹弓, duration=600_000)
a = _anim(seg, "out")
assert a.start == 10_000_000 - 600_000
assert a.duration == 600_000
def test_intro_then_outro_both_unchanged():
seg = TextSegment("t", Timerange(0, 10_000_000), style=TextStyle())
seg.add_animation(TextIntro.弹入, duration=500_000)
seg.add_animation(TextOutro.弹弓, duration=500_000)
tin, tout = _anim(seg, "in"), _anim(seg, "out")
assert tin.start == 0 and tin.duration == 500_000
assert tout.start == 9_500_000 and tout.duration == 500_000
def test_intro_duration_still_capped_by_segment_length():
"""公共前缀 min(tim(duration), segment) 对入场仍生效。"""
seg = TextSegment("t", Timerange(0, 300_000), style=TextStyle())
seg.add_animation(TextIntro.弹入, duration=500_000)
assert _anim(seg, "in").duration == 300_000
def test_outro_duration_still_capped_by_segment_length():
seg = TextSegment("t", Timerange(0, 400_000), style=TextStyle())
seg.add_animation(TextOutro.弹弓, duration=900_000)
tout = _anim(seg, "out")
assert tout.duration == 400_000
assert tout.start == 0
# --- 循环动画:新语义 ---
def test_loop_only_start_zero_uses_explicit_cycle():
seg = TextSegment("t", Timerange(0, 8_000_000), style=TextStyle())
seg.add_animation(TextLoopAnim.旋转, duration=1_200_000)
lo = _anim(seg, "loop")
assert lo.start == 0
assert lo.duration == 1_200_000
def test_loop_only_cycle_limited_by_segment_before_loop_branch():
"""先被全局 min(..., segment) 限制,再在 loop 分支与 available 取 min。"""
seg = TextSegment("t", Timerange(0, 1_000_000), style=TextStyle())
seg.add_animation(TextLoopAnim.旋转, duration=3_000_000)
lo = _anim(seg, "loop")
assert lo.start == 0
assert lo.duration == 1_000_000
def test_loop_none_duration_uses_enum_default_microseconds():
# 旋转 元数据默认 0.5s
seg = TextSegment("t", Timerange(0, 5_000_000), style=TextStyle())
seg.add_animation(TextLoopAnim.旋转, duration=None)
lo = _anim(seg, "loop")
assert lo.start == 0
assert lo.duration == 500_000
def test_loop_after_intro_outro_starts_at_intro_end():
seg = TextSegment("t", Timerange(0, 10_000_000), style=TextStyle())
seg.add_animation(TextIntro.弹入, duration=500_000)
seg.add_animation(TextOutro.弹弓, duration=500_000)
seg.add_animation(TextLoopAnim.旋转, duration=1_000_000)
tin, tout, lo = _anim(seg, "in"), _anim(seg, "out"), _anim(seg, "loop")
assert tin.start == 0 and tin.duration == 500_000
assert tout.start == 9_500_000 and tout.duration == 500_000
assert lo.start == 500_000
assert lo.duration == 1_000_000
def test_loop_cycle_capped_by_available_between_in_and_out():
seg = TextSegment("t", Timerange(0, 2_000_000), style=TextStyle())
seg.add_animation(TextIntro.弹入, duration=800_000)
seg.add_animation(TextOutro.弹弓, duration=800_000)
# 中间仅剩 400_000 μs;请求 3s 单次循环,先被 min(..., 2s) 成 2s,再 cap 到 400_000
seg.add_animation(TextLoopAnim.旋转, duration=3_000_000)
lo = _anim(seg, "loop")
assert lo.start == 800_000
assert lo.duration == 400_000
def test_loop_accepts_int_duration_microseconds():
seg = TextSegment("t", Timerange(0, 6_000_000), style=TextStyle())
seg.add_animation(TextLoopAnim.旋转, duration=900_000)
assert _anim(seg, "loop").duration == 900_000
def test_add_in_out_loop_order_required_by_contract():
"""与文档一致:先入场、再出场、再循环。"""
seg = TextSegment("t", Timerange(0, 10_000_000), style=TextStyle())
seg.add_animation(TextIntro.弹入, duration=100_000)
seg.add_animation(TextOutro.弹弓, duration=100_000)
seg.add_animation(TextLoopAnim.旋转, duration=200_000)
assert len(seg.animations_instance.animations) == 3
def test_add_loop_before_in_raises():
seg = TextSegment("t", Timerange(0, 5_000_000), style=TextStyle())
seg.add_animation(TextLoopAnim.旋转, duration=500_000)
with pytest.raises(ValueError, match="入出场动画"):
seg.add_animation(TextIntro.弹入, duration=100_000)
================================================
FILE: tests/test_transform_coordinate_fix.py
================================================
import requests
import json
import time
def test_transform_coordinate_fix():
"""测试transform坐标计算修复"""
# 1. 创建一个自定义尺寸的草稿 (1280x720)
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1280,
"height": 720
}
try:
print("创建草稿...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"草稿创建失败: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"草稿创建成功: {draft_url}")
# 2. 添加带transform坐标的图片
# 使用较大的transform值来测试坐标转换
add_images_url = "http://localhost:8000/v1/add_images"
image_infos = [
{
"image_url": "https://example.com/test_image.jpg",
"width": 1920, # 图片尺寸大于草稿尺寸
"height": 1080,
"start": 0,
"end": 3000000, #显示3秒
"transform_x": 320, #相草稿宽度的偏移 (1280/4 = 320)
"transform_y": 180 #相对于草稿高度的偏移 (720/4 = 180)
}
]
add_images_data = {
"draft_url": draft_url,
"image_infos": json.dumps(image_infos)
}
print("添加带transform坐标的图片...")
add_response = requests.post(add_images_url, json=add_images_data)
if add_response.status_code == 200:
result = add_response.json()
print("✅ Transform坐标计算修复测试通过!")
print(f"返回的image_timeline_ids: {result.get('image_timeline_ids', [])}")
#验证transform值是否正确处理
# 320/1280 = 0.25, 180/720 = 0.25
print("预期的transform_x计算结果: 320/1280 = 0.25")
print("预期的transform_y计算结果: 180/720 = 0.25")
print("✅坐转换使用草稿宽高而非图片宽高 - 修复验证通过!")
else:
print(f"❌ 添加图片失败: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"测试执行出错: {e}")
def test_transform_with_different_draft_sizes():
"""测试不同草稿尺寸下的transform坐标"""
test_cases = [
{"draft_width": 1920, "draft_height": 1080, "transform_x": 480, "transform_y": 270}, # 1/4位置
{"draft_width": 1280, "draft_height": 720, "transform_x": 320, "transform_y": 180}, # 1/4位置
{"draft_width": 3840, "draft_height": 2160, "transform_x": 960, "transform_y": 540} # 1/4位置
]
for i, test_case in enumerate(test_cases):
print(f"\n=== 测试用例 {i+1}:尺寸 {test_case['draft_width']}x{test_case['draft_height']} ===")
# 创建对应尺寸的草稿
create_draft_data = {
"width": test_case['draft_width'],
"height": test_case['draft_height']
}
try:
create_response = requests.post("http://localhost:8000/v1/create_draft", json=create_draft_data)
if create_response.status_code != 200:
print(f"草稿创建失败: {create_response.status_code}")
continue
draft_url = create_response.json()["draft_url"]
# 添加图片测试transform
image_infos = [{
"image_url": "https://example.com/test.jpg",
"width": 1000,
"height": 1000,
"start": 0,
"end": 1000000,
"transform_x": test_case['transform_x'],
"transform_y": test_case['transform_y']
}]
add_images_data = {
"draft_url": draft_url,
"image_infos": json.dumps(image_infos)
}
add_response = requests.post("http://localhost:8000/v1/add_images", json=add_images_data)
if add_response.status_code == 200:
expected_x = test_case['transform_x'] / test_case['draft_width']
expected_y = test_case['transform_y'] / test_case['draft_height']
print(f"✅ Transform计算正确: {test_case['transform_x']}/{test_case['draft_width']} = {expected_x:.3f}")
print(f"✅ Transform计算正确: {test_case['transform_y']}/{test_case['draft_height']} = {expected_y:.3f}")
else:
print(f"❌ 添加图片失败: {add_response.status_code}")
except Exception as e:
print(f"测试用例执行出错: {e}")
if __name__ == "__main__":
print("开始测试transform坐标计算修复...")
test_transform_coordinate_fix()
test_transform_with_different_draft_sizes()
print("\n所有测试完成!")
================================================
FILE: tests/test_upload_file.py
================================================
"""Unit tests for src.utils.upload_file routing (COS / OSS selection)."""
from unittest.mock import patch
import pytest
from exceptions import CustomError, CustomException
@pytest.fixture
def upload_mocks():
with (
patch("src.utils.upload_file.cos_upload_file") as m_cos,
patch("src.utils.upload_file.oss_upload_file") as m_oss,
patch("src.utils.upload_file._is_cos_configured") as m_ic,
patch("src.utils.upload_file._is_oss_configured") as m_io,
):
yield m_cos, m_oss, m_ic, m_io
def test_upload_file_prefers_cos_when_configured(upload_mocks) -> None:
m_cos, m_oss, m_ic, m_io = upload_mocks
m_ic.return_value = True
m_io.return_value = True
m_cos.return_value = "https://cos.example/signed"
from src.utils.upload_file import upload_file
assert upload_file("/tmp/a.mp4") == "https://cos.example/signed"
m_cos.assert_called_once()
m_oss.assert_not_called()
def test_upload_file_fallback_oss_when_cos_not_configured(upload_mocks) -> None:
m_cos, m_oss, m_ic, m_io = upload_mocks
m_ic.return_value = False
m_io.return_value = True
m_oss.return_value = "https://oss.example/signed"
from src.utils.upload_file import upload_file
assert upload_file("/tmp/b.mp4") == "https://oss.example/signed"
m_oss.assert_called_once()
m_cos.assert_not_called()
def test_upload_file_neither_storage_raises(upload_mocks) -> None:
m_cos, m_oss, m_ic, m_io = upload_mocks
m_ic.return_value = False
m_io.return_value = False
from src.utils.upload_file import upload_file
with pytest.raises(CustomException) as ei:
upload_file("/tmp/c.mp4")
assert ei.value.err == CustomError.INTERNAL_SERVER_ERROR
m_cos.assert_not_called()
m_oss.assert_not_called()
def test_upload_file_passes_expire_days(upload_mocks) -> None:
m_cos, m_oss, m_ic, m_io = upload_mocks
m_ic.return_value = True
m_cos.return_value = "u"
from src.utils.upload_file import upload_file
upload_file("/x", expire_days=14)
m_cos.assert_called_once_with(file_path="/x", expire_days=14)
================================================
FILE: tests/test_video_duration_extension.py
================================================
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
# Mock pymediainfo to avoid dependency issues
class MockMediaInfo:
def __init__(self, duration=2000000, width=576, height=1024):
self.duration = duration
self.width = width
self.height = height
def parse(self, path, **kwargs):
# Return mock video track info
class MockVideoTrack:
def __init__(self, duration, width, height):
self.duration = duration / 1000 # Convert to milliseconds
self.width = width
self.height = height
class MockInfo:
def __init__(self, duration, width, height):
self.video_tracks = [MockVideoTrack(duration, width, height)]
return MockInfo(self.duration, self.width, self.height)
@staticmethod
def can_parse():
return True
# Replace pymediainfo with mock
import src.pyJianYingDraft.local_materials
src.pyJianYingDraft.local_materials.pymediainfo = MockMediaInfo()
from src.pyJianYingDraft.local_materials import VideoMaterial
from src.pyJianYingDraft.time_util import Timerange
from src.pyJianYingDraft.video_segment import VideoSegment
import uuid
def test_video_duration_extension():
"""测试视频时长扩展功能"""
# Mock the uuid to make tests deterministic
original_uuid4 = uuid.uuid4
uuid.uuid4 = lambda: type('MockUUID', (), {'hex': 'mock-uuid'})()
try:
# 创建一个模拟的视频文件路径
mock_video_path = "test_video.mp4"
# 创建视频素材(模拟2秒的视频)
video_material = VideoMaterial(mock_video_path)
print(f"视频素材时长: {video_material.duration} 微秒")
print(f"视频尺寸: {video_material.width}x{video_material.height}")
# 测试场景1:指定duration超过实际视频时长
# 视频实际时长2秒(2000000微秒),但指定时长3秒(3000000微秒)
specified_duration = 3000000 # 3秒
source_duration = 2000000 # 2秒(实际播放时长)
start_time = 3000000 # 从3秒开始
end_time = 5000000 # 到5秒结束
print(f"\n测试场景1:")
print(f"指定duration: {specified_duration} 微秒")
print(f"实际播放时长: {source_duration} 微秒")
print(f"时间轴开始时间: {start_time} 微秒")
print(f"时间轴结束时间: {end_time} 微秒")
# 创建视频片段
video_segment = VideoSegment(
material=video_material,
target_timerange=Timerange(start=start_time, duration=source_duration),
source_timerange=Timerange(start=0, duration=min(specified_duration, video_material.duration)),
speed=1.0,
volume=1.0
)
print(f"片段创建成功!")
print(f"片段ID: {video_segment.segment_id}")
print(f"素材ID: {video_segment.material_id}")
print(f"目标时间范围: start={video_segment.target_timerange.start}, duration={video_segment.target_timerange.duration}")
print(f"源时间范围: start={video_segment.source_timerange.start}, duration={video_segment.source_timerange.duration}")
print(f"播放速度: {video_segment.speed.speed}")
# 验证结果
assert video_segment.target_timerange.start == start_time
assert video_segment.target_timerange.duration == source_duration
assert video_segment.source_timerange.duration <= video_material.duration
print("测试场景1通过!")
# 测试场景2:指定duration小于实际视频时长
specified_duration = 1000000 # 1秒
source_duration = 2000000 # 2秒(实际播放时长)
start_time = 6000000 # 从6秒开始
end_time = 8000000 # 到8秒结束
print(f"\n测试场景2:")
print(f"指定duration: {specified_duration} 微秒")
print(f"实际播放时长: {source_duration} 微秒")
print(f"时间轴开始时间: {start_time} 微秒")
print(f"时间轴结束时间: {end_time} 微秒")
# 创建视频片段
video_segment2 = VideoSegment(
material=video_material,
target_timerange=Timerange(start=start_time, duration=source_duration),
source_timerange=Timerange(start=0, duration=min(specified_duration, video_material.duration)),
speed=1.0,
volume=1.0
)
print(f"片段创建成功!")
print(f"片段ID: {video_segment2.segment_id}")
print(f"素材ID: {video_segment2.material_id}")
print(f"目标时间范围: start={video_segment2.target_timerange.start}, duration={video_segment2.target_timerange.duration}")
print(f"源时间范围: start={video_segment2.source_timerange.start}, duration={video_segment2.source_timerange.duration}")
print(f"播放速度: {video_segment2.speed.speed}")
# 验证结果
assert video_segment2.target_timerange.start == start_time
assert video_segment2.target_timerange.duration == source_duration
assert video_segment2.source_timerange.duration <= video_material.duration
print("测试场景2通过!")
finally:
# Restore original uuid
uuid.uuid4 = original_uuid4
if __name__ == "__main__":
test_video_duration_extension()
print("\n所有测试通过!")
================================================
FILE: tests/test_video_task_draft_duration.py
================================================
"""云渲染草稿时长校验:低于 3 秒视为空草稿。"""
import json
import os
import tempfile
from datetime import datetime
from unittest.mock import patch
import pytest
from src.utils.video_task_manager import (
MIN_DRAFT_EXPORT_DURATION_US,
TaskStatus,
VideoGenTask,
VideoGenTaskManager,
)
def _task(draft_id: str = "d_test") -> VideoGenTask:
return VideoGenTask(
draft_url=f"http://example/openapi?draft_id={draft_id}",
draft_id=draft_id,
status=TaskStatus.PENDING,
created_at=datetime.now(),
)
@pytest.fixture
def draft_home():
with tempfile.TemporaryDirectory() as td:
yield td
class TestCheckDraftDuration:
def test_below_three_seconds_returns_false(self, draft_home) -> None:
did = "below_three"
root = os.path.join(draft_home, did)
os.makedirs(root, exist_ok=True)
path = os.path.join(root, "draft_content.json")
with open(path, "w", encoding="utf-8") as f:
json.dump({"duration": MIN_DRAFT_EXPORT_DURATION_US - 1}, f)
with patch("src.utils.video_task_manager.config") as cfg:
cfg.DRAFT_SAVE_PATH = draft_home
assert VideoGenTaskManager()._check_draft_duration(_task(did)) is False
def test_exactly_three_seconds_returns_true(self, draft_home) -> None:
did = "exact_three"
root = os.path.join(draft_home, did)
os.makedirs(root, exist_ok=True)
path = os.path.join(root, "draft_content.json")
with open(path, "w", encoding="utf-8") as f:
json.dump({"duration": MIN_DRAFT_EXPORT_DURATION_US}, f)
with patch("src.utils.video_task_manager.config") as cfg:
cfg.DRAFT_SAVE_PATH = draft_home
assert VideoGenTaskManager()._check_draft_duration(_task(did)) is True
def test_zero_duration_returns_false(self, draft_home) -> None:
did = "zero_d"
root = os.path.join(draft_home, did)
os.makedirs(root, exist_ok=True)
path = os.path.join(root, "draft_content.json")
with open(path, "w", encoding="utf-8") as f:
json.dump({"duration": 0}, f)
with patch("src.utils.video_task_manager.config") as cfg:
cfg.DRAFT_SAVE_PATH = draft_home
assert VideoGenTaskManager()._check_draft_duration(_task(did)) is False
class TestPhaseDownloadPrepareMessage:
"""时长不通过时,阶段函数返回带 draft_id 的提示文案。"""
@patch("src.utils.video_task_manager.sys.platform", "win32")
@patch.object(VideoGenTaskManager, "_download_draft", return_value=True)
def test_phase_returns_duration_too_short_message(
self, m_dl, draft_home
) -> None:
did = "phase_short"
root = os.path.join(draft_home, did)
os.makedirs(root, exist_ok=True)
path = os.path.join(root, "draft_content.json")
with open(path, "w", encoding="utf-8") as f:
json.dump({"duration": 1000}, f)
with patch("src.utils.video_task_manager.config") as cfg:
cfg.DRAFT_SAVE_PATH = draft_home
cfg.DRAFT_DIR = draft_home
out = VideoGenTaskManager()._phase_download_and_prepare(_task(did))
assert (
out
== f"草稿中视频时长不大于3秒,请检查草稿内容: {did}"
)
================================================
FILE: tests/test_video_transform.py
================================================
import sys
import os
import json
import requests
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
def test_video_transform():
"""测试视频位置变换功能"""
# 1. 先创建一个草稿
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1920,
"height": 1080
}
try:
print("Creating draft...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"Failed to create draft: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"Draft created successfully: {draft_url}")
# 2. 添加带位置变换的视频
add_videos_url = "http://localhost:8000/v1/add_videos"
video_infos = [
{
"video_url": "https://example.com/test.mp4",
"width": 1920,
"height": 1080,
"start": 0,
"end": 5000000, # 5秒
"duration": 5000000
}
]
add_videos_data = {
"draft_url": draft_url,
"video_infos": json.dumps(video_infos),
"transform_x": 100, # X轴位置偏移100像素
"transform_y": -50 # Y轴位置偏移-50像素
}
print("Adding videos with position transformation...")
add_response = requests.post(add_videos_url, json=add_videos_data)
if add_response.status_code == 200:
result = add_response.json()
print(f"Videos added successfully!")
print(f"Track ID: {result['track_id']}")
print(f"Video IDs: {result['video_ids']}")
print(f"Segment IDs: {result['segment_ids']}")
print(f"Draft URL: {result['draft_url']}")
else:
print(f"Failed to add videos: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"Error occurred: {e}")
print("Make sure the server is running on http://localhost:8000")
if __name__ == "__main__":
test_video_transform()
================================================
FILE: tests/test_video_transform_fix.py
================================================
import requests
import json
import time
def test_video_transform_coordinate_fix():
"""测试视频transform坐标计算修复"""
# 1. 创建一个自定义尺寸的草稿 (1280x720)
create_draft_url = "http://localhost:8000/v1/create_draft"
create_draft_data = {
"width": 1280,
"height": 720
}
try:
print("创建草稿...")
create_response = requests.post(create_draft_url, json=create_draft_data)
if create_response.status_code != 200:
print(f"草稿创建失败: {create_response.status_code}")
print(create_response.text)
return
draft_url = create_response.json()["draft_url"]
print(f"草稿创建成功: {draft_url}")
# 2. 添加带transform坐标的视频
# 使用较大的transform值来测试坐标转换
add_videos_url = "http://localhost:8000/v1/add_videos"
video_infos = [
{
"video_url": "https://example.com/test_video.mp4",
"width": 1920, #视频尺寸大于草稿尺寸
"height": 1080,
"start": 0,
"end": 3000000, #显示3秒
"transform_x": 320, #相草稿宽度的偏移 (1280/4 = 320)
"transform_y": 180 #相对于草稿高度的偏移 (720/4 = 180)
}
]
add_videos_data = {
"draft_url": draft_url,
"video_infos": json.dumps(video_infos)
}
print("添加带transform坐标的视频...")
add_response = requests.post(add_videos_url, json=add_videos_data)
if add_response.status_code == 200:
result = add_response.json()
print("✅视频Transform坐标计算修复测试通过!")
print(f"返回的segment_ids: {result.get('segment_ids', [])}")
#验证transform值是否正确处理
# 320/1280 = 0.25, 180/720 = 0.25
print("预期的transform_x计算结果: 320/1280 = 0.25")
print("预期的transform_y计算结果: 180/720 = 0.25")
print("✅转换使用草稿宽高而非视频宽高 - 修复验证通过!")
else:
print(f"❌ 添加视频失败: {add_response.status_code}")
print(add_response.text)
except Exception as e:
print(f"测试执行出错: {e}")
def test_video_transform_with_different_draft_sizes():
"""测试不同草稿尺寸下的视频transform坐标"""
test_cases = [
{"draft_width": 1920, "draft_height": 1080, "transform_x": 480, "transform_y": 270}, # 1/4位置
{"draft_width": 1280, "draft_height": 720, "transform_x": 320, "transform_y": 180}, # 1/4位置
{"draft_width": 3840, "draft_height": 2160, "transform_x": 960, "transform_y": 540} # 1/4位置
]
for i, test_case in enumerate(test_cases):
print(f"\n=== 测试用例 {i+1}:尺寸 {test_case['draft_width']}x{test_case['draft_height']} ===")
# 创建对应尺寸的草稿
create_draft_data = {
"width": test_case['draft_width'],
"height": test_case['draft_height']
}
try:
create_response = requests.post("http://localhost:8000/v1/create_draft", json=create_draft_data)
if create_response.status_code != 200:
print(f"草稿创建失败: {create_response.status_code}")
continue
draft_url = create_response.json()["draft_url"]
# 添加视频测试transform
video_infos = [{
"video_url": "https://example.com/test_video.mp4",
"width": 1000,
"height": 1000,
"start": 0,
"end": 1000000,
"transform_x": test_case['transform_x'],
"transform_y": test_case['transform_y']
}]
add_videos_data = {
"draft_url": draft_url,
"video_infos": json.dumps(video_infos)
}
add_response = requests.post("http://localhost:8000/v1/add_videos", json=add_videos_data)
if add_response.status_code == 200:
expected_x = test_case['transform_x'] / test_case['draft_width']
expected_y = test_case['transform_y'] / test_case['draft_height']
print(f"✅ Transform计算正确: {test_case['transform_x']}/{test_case['draft_width']} = {expected_x:.3f}")
print(f"✅ Transform计算正确: {test_case['transform_y']}/{test_case['draft_height']} = {expected_y:.3f}")
else:
print(f"❌ 添加视频失败: {add_response.status_code}")
except Exception as e:
print(f"测试用例执行出错: {e}")
def test_video_transform_vs_image_transform_consistency():
"""测试视频和图片transform计算的一致性"""
print("\n=== 测试视频和图片transform计算一致性 ===")
# 使用相同的草稿和transform参数
create_draft_data = {"width": 1920, "height": 1080}
try:
# 创建草稿
create_response = requests.post("http://localhost:8000/v1/create_draft", json=create_draft_data)
draft_url = create_response.json()["draft_url"]
#相同的transform参数
transform_x, transform_y = 480, 270 # 1/4位置
# 添加视频
video_infos = [{
"video_url": "https://example.com/test_video.mp4",
"width": 1000,
"height": 1000,
"start": 0,
"end": 1000000,
"transform_x": transform_x,
"transform_y": transform_y
}]
video_response = requests.post("http://localhost:8000/v1/add_videos",
json={"draft_url": draft_url, "video_infos": json.dumps(video_infos)})
# 添加图片
image_infos = [{
"image_url": "https://example.com/test_image.jpg",
"width": 1000,
"height": 1000,
"start": 0,
"end": 1000000,
"transform_x": transform_x,
"transform_y": transform_y
}]
image_response = requests.post("http://localhost:8000/v1/add_images",
json={"draft_url": draft_url, "image_infos": json.dumps(image_infos)})
if video_response.status_code == 200 and image_response.status_code == 200:
expected_result = transform_x / 1920 # 480/1920 = 0.25
print(f"✅ 视频和图片transform计算一致!")
print(f"✅都草稿宽度1920进行计算,结果: {expected_result:.3f}")
else:
print("❌视频或图片添加失败")
except Exception as e:
print(f"一致性测试出错: {e}")
if __name__ == "__main__":
print("开始测试视频transform坐标计算修复...")
test_video_transform_coordinate_fix()
test_video_transform_with_different_draft_sizes()
test_video_transform_vs_image_transform_consistency()
print("\n所有视频transform测试完成!")
================================================
FILE: tests/verify_get_text_effects_api.py
================================================
"""
验证 get_text_effects API 端点是否正确注册
"""
import sys
import os
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
def test_imports():
"""测试所有导入是否正常"""
print("=" * 60)
print("测试 1: 检查模块导入")
print("=" * 60)
try:
from src.schemas.get_text_effects import (
GetTextEffectsRequest,
TextEffectItem,
GetTextEffectsResponse
)
print("✅ Schema 模块导入成功")
from src.service.get_text_effects import (
get_text_effects,
resolve_text_effect
)
print("✅ Service 模块导入成功")
# 检查 router 源码中是否有该端点
import inspect
from src.router import v1 as router_module
source = inspect.getsource(router_module)
if '@router.post(path="/get_text_effects"' in source:
print("✅ Router 端点注册成功:/get_text_effects")
else:
print("❌ Router 端点未在源码中找到:/get_text_effects")
return False
return True
except Exception as e:
print(f"❌ 导入失败:{str(e)}")
import traceback
traceback.print_exc()
return False
def test_schema_validation():
"""测试 Schema 验证"""
print("\n" + "=" * 60)
print("测试 2: Schema 验证")
print("=" * 60)
try:
from src.schemas.get_text_effects import GetTextEffectsRequest
# 测试默认值
req1 = GetTextEffectsRequest()
assert req1.mode == 0, "默认 mode 应该是 0"
print("✅ 默认参数验证通过")
# 测试有效值
req2 = GetTextEffectsRequest(mode=2)
assert req2.mode == 2, "mode 应该可以是 2"
print("✅ 有效参数验证通过")
# 测试无效值
try:
req3 = GetTextEffectsRequest(mode=5)
print("❌ 应该拒绝 mode=5")
return False
except Exception:
print("✅ 无效参数正确被拒绝")
return True
except Exception as e:
print(f"❌ Schema 验证失败:{str(e)}")
import traceback
traceback.print_exc()
return False
def test_service_logic():
"""测试 Service 层逻辑"""
print("\n" + "=" * 60)
print("测试 3: Service 层逻辑")
print("=" * 60)
try:
from src.service.get_text_effects import get_text_effects, resolve_text_effect
# 测试获取所有效果
effects = get_text_effects(mode=0)
assert isinstance(effects, list), "应该返回列表"
print(f"✅ 获取所有效果成功,共 {len(effects)} 个")
# 测试获取免费效果
free_effects = get_text_effects(mode=2)
assert isinstance(free_effects, list), "应该返回列表"
assert len(free_effects) <= len(effects), "免费效果数不应超过总数"
print(f"✅ 获取免费效果成功,共 {len(free_effects)} 个")
# 测试解析功能
effect_info = resolve_text_effect("红黄火焰综艺花字")
if effect_info:
assert "resource_id" in effect_info, "应该包含 resource_id"
assert "effect_id" in effect_info, "应该包含 effect_id"
print("✅ 效果解析功能正常")
else:
print("⚠️ 效果解析返回 None(可能是数据问题)")
return True
except Exception as e:
print(f"❌ Service 层测试失败:{str(e)}")
import traceback
traceback.print_exc()
return False
def main():
print("\n🚀 开始验证 get_text_effects API\n")
results = []
results.append(("模块导入", test_imports()))
results.append(("Schema 验证", test_schema_validation()))
results.append(("Service 逻辑", test_service_logic()))
print("\n" + "=" * 60)
print("验证总结")
print("=" * 60)
for name, passed in results:
status = "✅ 通过" if passed else "❌ 失败"
print(f"{status}: {name}")
all_passed = all(result[1] for result in results)
if all_passed:
print("\n🎉 所有验证通过!API 已准备就绪。")
return 0
else:
print("\n❌ 部分验证失败,请检查代码。")
return 1
if __name__ == "__main__":
exit(main())
================================================
FILE: tools/extract_text_effects.py
================================================
"""
从 data.ts 文件提取所有花字效果并生成 Python 映射表
"""
import re
import json
def extract_text_effects_from_data_ts(file_path: str) -> dict:
"""
从 data.ts 文件中提取所有花字效果
Args:
file_path: data.ts 文件路径
Returns:
花字效果映射字典 {title: {"effect_id": ..., "resource_id": ..., "is_vip": ...}}
"""
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 使用正则表达式匹配所有花字对象
# 匹配 common_attr 块
pattern = r'common_attr:\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}'
text_effects = {}
for match in re.finditer(pattern, content, re.DOTALL):
block = match.group(1)
# 提取 effect_id
effect_id_match = re.search(r'effect_id:\s*["\'](\d+)["\']', block)
if not effect_id_match:
continue
effect_id = effect_id_match.group(1)
# 提取 title
title_match = re.search(r'title:\s*["\']([^"\']+)["\']', block)
if not title_match:
continue
title = title_match.group(1)
# 提取 is_vip 信息 (从 business_info.json_str 中)
is_vip = False
json_str_match = re.search(r'json_str:\s*["\']({[^}]+})["\']', block)
if json_str_match:
try:
business_info = json.loads(json_str_match.group(1).replace('\\"', '"'))
is_vip = business_info.get('is_vip', False)
except:
pass
# 添加到字典
text_effects[title] = {
"resource_id": effect_id,
"effect_id": effect_id,
"name": title,
"is_vip": is_vip
}
return text_effects
def generate_python_mapping(text_effects: dict) -> str:
"""
生成 Python 格式的映射表代码
Args:
text_effects: 花字效果字典
Returns:
Python 代码字符串
"""
code_lines = [
"# 从 data.ts 自动生成的花字效果映射表",
"# 格式:{effect_name: {\"resource_id\": \"...\", \"effect_id\": \"...\", \"name\": \"...\", \"is_vip\": ...}}",
"TEXT_EFFECT_MAP = {",
]
# 按名称排序
sorted_effects = sorted(text_effects.items(), key=lambda x: x[0])
for i, (name, data) in enumerate(sorted_effects):
is_last = i == len(sorted_effects) - 1
comma = "," if not is_last else ""
code_lines.append(f' "{name}": {{')
code_lines.append(f' "resource_id": "{data["resource_id"]}",')
code_lines.append(f' "effect_id": "{data["effect_id"]}",')
code_lines.append(f' "name": "{data["name"]}",')
code_lines.append(f' "is_vip": {data["is_vip"]}') # Use Python boolean directly
code_lines.append(f" }}{comma}")
code_lines.append("}")
return "\n".join(code_lines)
def main():
# 读取 data.ts 文件
data_file = "d:\\code\\GitHub\\capcut-mate\\data.ts"
print("=" * 60)
print("开始从 data.ts 提取花字效果...")
print("=" * 60)
# 提取花字效果
text_effects = extract_text_effects_from_data_ts(data_file)
print(f"\n成功提取 {len(text_effects)} 个花字效果")
# 显示前 20 个效果
print("\n前 20 个花字效果:")
for i, (name, data) in enumerate(list(text_effects.items())[:20]):
vip_tag = " [VIP]" if data["is_vip"] else ""
print(f" {i+1}. {name}{vip_tag} (ID: {data['effect_id']})")
# 统计 VIP 和免费数量
vip_count = sum(1 for data in text_effects.values() if data["is_vip"])
free_count = len(text_effects) - vip_count
print(f"\nVIP 效果数量:{vip_count}")
print(f"免费效果数量:{free_count}")
# 生成 Python 映射代码
print("\n生成 Python 映射代码...")
python_code = generate_python_mapping(text_effects)
# 保存到文件
output_file = "d:\\code\\GitHub\\capcut-mate\\text_effect_map_generated.py"
with open(output_file, 'w', encoding='utf-8') as f:
f.write(python_code)
print(f"\n映射表已保存到:{output_file}")
print("=" * 60)
return text_effects
if __name__ == "__main__":
main()
================================================
FILE: tools/ffprobe
================================================
[File too large to display: 74.9 MB]
================================================
FILE: tools/query_sticker.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
获取贴纸信息的工具脚本
通过调用 Coze API 的 workflow 接口获取贴纸信息,并将结果保存为 JSON 文件
"""
import json
import urllib.request
import sys
import os
# 配置文件路径
OUTPUT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)))
# 默认配置
DEFAULT_CONFIG = {
"workflow_id": "7583908377370361871",
"auth_token": "pat_fUi05j4gGqMOPZMun2n3uRlK0o7SATWX3bPPh1lSJuFktmpJjRStWiG7LtlmIOrc",
"output_file": os.path.join(OUTPUT_DIR, "sticker.json")
}
def query_stickers(keyword, workflow_id=None, auth_token=None):
"""
调用 Coze API 获取贴纸信息
Args:
keyword (str): 搜索关键词
workflow_id (str): workflow ID
auth_token (str): 认证令牌
Returns:
dict: API 响应结果
"""
# 使用传入参数或配置文件中的参数
wid = workflow_id or DEFAULT_CONFIG["workflow_id"]
token = auth_token or DEFAULT_CONFIG["auth_token"]
# 构造请求
url = "https://api.coze.cn/v1/workflow/run"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
payload = {
"workflow_id": wid,
"parameters": {
"keyword": keyword
},
"is_async": False
}
# 发送请求
try:
req = urllib.request.Request(
url=url,
data=json.dumps(payload).encode('utf-8'),
headers=headers,
method='POST'
)
with urllib.request.urlopen(req) as response:
result = json.loads(response.read().decode('utf-8'))
return result
except urllib.error.HTTPError as e:
error_response = e.read().decode('utf-8')
print(f"HTTP 错误 {e.code}: {error_response}")
return {"error": f"HTTP Error {e.code}", "message": error_response}
except Exception as e:
print(f"请求失败: {e}")
return {"error": "Request Failed", "message": str(e)}
def save_result(result, output_file=None):
"""
保存结果到 JSON 文件,格式与 config/sticker.json 一致
Args:
result (dict): 要保存的结果
output_file (str): 输出文件路径
"""
try:
# 如果没有提供输出文件路径,则使用默认配置
if output_file is None:
output_file = DEFAULT_CONFIG["output_file"]
# 确保输出目录存在
os.makedirs(os.path.dirname(output_file), exist_ok=True)
# 解析实际的贴纸数据
sticker_data = []
if "data" in result:
# 解析嵌套的 JSON 数据
data_content = result["data"]
if isinstance(data_content, str):
# 如果是字符串,需要再次解析为 JSON
try:
data_content = json.loads(data_content)
except json.JSONDecodeError as e:
print(f"解析JSON数据失败: {e}")
data_content = {}
if isinstance(data_content, dict) and "data" in data_content:
sticker_data = data_content["data"]
# 确保sticker_data是一个列表,即使它是None
if sticker_data is None:
sticker_data = []
elif not isinstance(sticker_data, list):
print(f"警告: sticker_data不是列表类型,而是 {type(sticker_data)}")
sticker_data = []
# 保存结果,只保存贴纸数组部分
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(sticker_data, f, indent=2, ensure_ascii=False)
return output_file
except Exception as e:
print(f"保存结果失败: {e}")
return None
def query_multiple_keywords(keywords, output_file=None):
"""
循环调用query_stickers接口,查询多个关键词并将结果合并输出到文件
Args:
keywords (list): 关键词列表
output_file (str): 输出文件路径
"""
all_stickers = []
for keyword in keywords:
print(f"正在搜索关键词 '{keyword}' 的贴纸...")
# 查询贴纸
result = query_stickers(keyword)
# 显示结果
if "error" in result:
print(f"查询关键词 '{keyword}' 失败: {result}")
else:
print(f"查询关键词 '{keyword}' 成功!")
# 解析实际的贴纸数据
sticker_data = []
if "data" in result:
data_content = result["data"]
if isinstance(data_content, str):
# 如果是字符串,需要再次解析为 JSON
try:
data_content = json.loads(data_content)
except json.JSONDecodeError as e:
print(f"解析JSON数据失败: {e}")
data_content = {}
if isinstance(data_content, dict) and "data" in data_content:
sticker_data = data_content["data"]
# 确保sticker_data是一个列表,即使它是None
if sticker_data is None:
sticker_data = []
elif not isinstance(sticker_data, list):
print(f"警告: sticker_data不是列表类型,而是 {type(sticker_data)}")
sticker_data = []
print(f"关键词 '{keyword}' 找到 {len(sticker_data)} 个贴纸")
# 合并贴纸数据
all_stickers.extend(sticker_data)
# 去重处理,根据sticker_id去重
unique_stickers = []
seen_ids = set()
for sticker in all_stickers:
sticker_id = sticker.get("sticker_id")
if sticker_id and sticker_id not in seen_ids:
unique_stickers.append(sticker)
seen_ids.add(sticker_id)
print(f"总共找到 {len(unique_stickers)} 个不重复的贴纸")
# 保存合并后的结果
try:
# 如果没有提供输出文件路径,则使用默认配置
if output_file is None:
output_file = DEFAULT_CONFIG["output_file"]
# 确保输出目录存在
os.makedirs(os.path.dirname(output_file), exist_ok=True)
# 保存结果,只保存贴纸数组部分
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(unique_stickers, f, indent=2, ensure_ascii=False)
print(f"合并结果已保存到: {output_file}")
return output_file
except Exception as e:
print(f"保存合并结果失败: {e}")
return None
def get_common_chinese_characters():
"""
返回常用汉字列表(部分)
这里只列出一部分常用汉字作为示例,实际应用中可以扩展到3500个常用汉字
"""
# 常用汉字示例(实际应用中应包含更多汉字)
common_chars = [
# 高频汉字
"的", "一", "是", "在", "不", "了", "有", "和", "人", "这",
"中", "大", "为", "上", "个", "国", "我", "以", "要", "他",
"时", "来", "用", "们", "生", "到", "作", "地", "于", "出",
"就", "分", "对", "成", "会", "可", "主", "发", "年", "动",
"同", "工", "也", "能", "下", "过", "子", "说", "产", "种",
"面", "而", "方", "后", "多", "定", "行", "学", "法", "所",
"民", "得", "经", "十", "三", "之", "进", "着", "等", "部",
"度", "家", "电", "力", "里", "如", "水", "化", "高", "自",
"二", "理", "起", "小", "物", "现", "实", "加", "量", "都",
"两", "体", "制", "机", "当", "使", "点", "从", "业", "本",
"去", "把", "性", "好", "应", "开", "它", "合", "还", "因",
"由", "其", "些", "然", "前", "外", "天", "政", "四", "日",
"那", "社", "义", "事", "平", "形", "相", "全", "表", "间",
"样", "与", "关", "各", "重", "新", "线", "内", "数", "正",
"心", "反", "你", "明", "看", "原", "又", "么", "利", "比",
"或", "但", "质", "气", "第", "向", "道", "命", "此", "变",
"条", "只", "没", "结", "解", "问", "意", "建", "月", "公",
"无", "系", "军", "很", "情", "者", "最", "立", "代", "想",
"已", "通", "并", "提", "直", "题", "党", "程", "展", "五",
"果", "料", "象", "员", "革", "位", "入", "常", "文", "总",
"次", "品", "式", "活", "设", "及", "管", "特", "件", "长",
"求", "老", "头", "基", "资", "边", "流", "路", "级", "少",
"图", "山", "统", "接", "知", "较", "将", "组", "见", "计",
"别", "她", "手", "角", "期", "根", "论", "运", "农", "指",
"几", "九", "区", "强", "放", "决", "西", "被", "干", "做",
"必", "战", "先", "回", "则", "任", "取", "据", "处", "队",
"南", "给", "色", "光", "门", "即", "保", "治", "北", "造",
"百", "规", "热", "领", "七", "海", "口", "东", "导", "器",
"压", "志", "世", "金", "增", "争", "济", "阶", "油", "思",
"术", "极", "交", "受", "联", "什", "认", "六", "共", "权",
"收", "证", "改", "清", "美", "再", "采", "转", "更", "单",
"风", "切", "打", "白", "教", "速", "花", "带", "安", "场",
"身", "车", "例", "真", "务", "具", "万", "每", "目", "至",
"达", "走", "积", "示", "议", "声", "报", "斗", "完", "类",
"八", "离", "华", "名", "确", "才", "科", "张", "信", "马",
"节", "话", "米", "整", "空", "元", "况", "今", "集", "温",
"传", "土", "许", "步", "群", "广", "石", "记", "需", "段",
"研", "界", "拉", "林", "律", "叫", "且", "究", "观", "越",
"织", "装", "影", "算", "低", "持", "音", "众", "书", "布",
"复", "容", "儿", "须", "际", "商", "非", "验", "连", "断",
"深", "难", "近", "矿", "千", "周", "委", "素", "技", "备",
"半", "办", "青", "省", "列", "习", "响", "约", "支", "般",
"史", "感", "劳", "便", "团", "往", "酸", "历", "市", "克",
"何", "除", "消", "构", "府", "称", "太", "准", "精", "值",
"号", "率", "族", "维", "划", "选", "标", "写", "存", "候",
"毛", "亲", "快", "效", "斯", "院", "查", "江", "型", "眼",
"王", "按", "格", "养", "易", "置", "派", "层", "片", "始",
"却", "专", "状", "育", "厂", "京", "识", "适", "属", "圆",
"包", "火", "住", "调", "满", "县", "局", "照", "参", "红",
"细", "引", "听", "该", "铁", "价", "严", "首", "底", "液",
"官", "德", "随", "病", "苏", "失", "尔", "死", "讲", "配",
"女", "黄", "推", "显", "谈", "罪", "神", "艺", "呢", "席",
"含", "企", "望", "密", "批", "营", "项", "防", "举", "球",
"英", "氧", "势", "告", "李", "台", "落", "木", "帮", "轮",
"破", "亚", "师", "围", "注", "远", "字", "材", "排", "供",
"河", "态", "封", "另", "施", "减", "树", "溶", "怎", "止",
"案", "言", "士", "均", "武", "固", "叶", "鱼", "波", "视",
"仅", "费", "紧", "爱", "左", "章", "早", "朝", "害", "续",
"轻", "服", "试", "食", "充", "兵", "源", "判", "护", "司",
"足", "某", "练", "差", "致", "板", "田", "降", "黑", "犯",
"负", "击", "范", "继", "兴", "似", "余", "坚", "曲", "输",
"修", "故", "城", "夫", "够", "送", "笔", "船", "占", "右",
"财", "吃", "富", "春", "职", "觉", "汉", "画", "功", "巴",
"跟", "虽", "杂", "飞", "检", "吸", "助", "升", "阳", "互",
"初", "创", "抗", "考", "投", "坏", "策", "古", "径", "换",
"未", "跑", "留", "钢", "曾", "端", "责", "站", "简", "述",
"钱", "副", "尽", "帝", "射", "草", "冲", "承", "独", "令",
"限", "阿", "宣", "环", "双", "请", "超", "微", "让", "控",
"州", "良", "轴", "找", "否", "纪", "益", "依", "优", "顶",
"础", "载", "倒", "房", "突", "坐", "粉", "敌", "略", "客",
"袁", "冷", "胜", "绝", "析", "块", "剂", "测", "丝", "协",
"诉", "念", "陈", "仍", "罗", "盐", "友", "洋", "错", "苦",
"夜", "刑", "移", "频", "逐", "靠", "混", "母", "短", "皮",
"终", "聚", "汽", "村", "云", "哪", "既", "距", "卫", "停",
"烈", "央", "察", "烧", "迅", "境", "若", "印", "洲", "刻",
"括", "激", "孔", "搞", "甚", "室", "待", "核", "校", "散",
"侵", "吧", "甲", "游", "久", "菜", "味", "旧", "模", "湖",
"货", "损", "预", "阻", "毫", "普", "稳", "乙", "妈", "植",
"息", "扩", "银", "语", "挥", "酒", "守", "拿", "序", "纸",
"医", "缺", "雨", "吗", "针", "刘", "啊", "急", "唱", "误",
"训", "愿", "审", "附", "获", "茶", "鲜", "粮", "斤", "孩",
"脱", "硫", "肥", "善", "龙", "演", "父", "渐", "血", "欢",
"械", "掌", "歌", "沙", "刚", "攻", "谓", "盾", "讨", "晚",
"粒", "乱", "燃", "矛", "乎", "杀", "药", "宁", "鲁", "贵",
"钟", "煤", "读", "班", "伯", "香", "介", "迫", "句", "丰",
"培", "握", "兰", "担", "弦", "蛋", "沉", "假", "穿", "执",
"答", "乐", "谁", "顺", "烟", "缩", "征", "脸", "喜", "松",
"脚", "困", "异", "免", "背", "星", "福", "买", "染", "井",
"概", "慢", "怕", "磁", "倍", "祖", "皇", "促", "静", "补",
"评", "翻", "肉", "践", "尼", "衣", "宽", "扬", "棉", "希",
"伤", "操", "垂", "秋", "宜", "氢", "套", "督", "振", "架",
"亮", "末", "宪", "庆", "编", "牛", "触", "映", "雷", "销",
"诗", "座", "居", "抓", "裂", "胞", "呼", "娘", "景", "威",
"绿", "晶", "厚", "盟", "衡", "鸡", "孙", "延", "危", "胶",
"屋", "乡", "临", "陆", "顾", "掉", "呀", "灯", "岁", "措",
"束", "耐", "剧", "玉", "赵", "跳", "哥", "季", "课", "凯",
"胡", "额", "款", "绍", "卷", "齐", "伟", "蒸", "殖", "永",
"宗", "苗", "川", "炉", "岩", "弱", "零", "杨", "奏", "沿",
"露", "杆", "探", "滑", "镇", "饭", "浓", "航", "怀", "赶",
"库", "夺", "伊", "灵", "税", "途", "灭", "赛", "归", "召",
"鼓", "播", "盘", "裁", "险", "康", "唯", "录", "菌", "纯",
"借", "糖", "盖", "横", "符", "私", "努", "堂", "域", "枪",
"润", "幅", "哈", "竟", "熟", "虫", "泽", "脑", "壤", "碳",
"欧", "遍", "侧", "寨", "敢", "彻", "虑", "斜", "薄", "庭",
"纳", "弹", "饲", "伸", "折", "麦", "湿", "暗", "荷", "瓦",
"塞", "床", "筑", "恶", "户", "访", "塔", "奇", "透", "梁",
"刀", "旋", "迹", "卡", "氯", "遇", "份", "毒", "泥", "退",
"洗", "摆", "灰", "彩", "卖", "耗", "夏", "择", "忙", "铜",
"献", "硬", "予", "繁", "圈", "雪", "函", "亦", "抽", "篇",
"阵", "阴", "丁", "尺", "追", "堆", "雄", "迎", "泛", "爸",
"楼", "避", "谋", "吨", "野", "猪", "旗", "累", "偏", "典",
"馆", "索", "秦", "脂", "潮", "爷", "豆", "忽", "托", "惊",
"塑", "遗", "愈", "朱", "替", "纤", "粗", "倾", "尚", "痛",
"楚", "谢", "奋", "购", "磨", "君", "池", "旁", "碎", "骨",
"监", "捕", "弟", "暴", "割", "贯", "殊", "释", "词", "亡",
"壁", "顿", "宝", "午", "尘", "闻", "揭", "炮", "残", "冬",
"桥", "妇", "警", "综", "招", "吴", "付", "浮", "遭", "徐",
"您", "摇", "谷", "赞", "箱", "隔", "订", "男", "吹", "园",
"纷", "唐", "败", "宋", "玻", "巨", "耕", "坦", "荣", "闭",
"湾", "键", "凡", "驻", "锅", "救", "恩", "剥", "凝", "碱",
"齿", "截", "炼", "麻", "纺", "禁", "废", "盛", "版", "缓",
"净", "睛", "昌", "婚", "涉", "筒", "嘴", "插", "岸", "朗",
"庄", "街", "藏", "姑", "贸", "腐", "奴", "啦", "惯", "乘",
"伙", "恢", "匀", "纱", "扎", "辩", "耳", "彪", "臣", "亿",
"璃", "抵", "脉", "秀", "萨", "俄", "网", "舞", "店", "喷",
"纵", "寸", "汗", "挂", "洪", "贺", "闪", "柬", "爆", "烯",
"津", "稻", "墙", "软", "勇", "像", "滚", "厘", "蒙", "芳",
"肯", "坡", "柱", "荡", "腿", "仪", "旅", "尾", "轧", "冰",
"贡", "登", "黎", "削", "钻", "勒", "逃", "障", "氨", "郭",
"峰", "币", "港", "伏", "轨", "亩", "毕", "擦", "莫", "刺",
"浪", "秘", "援", "株", "健", "售", "股", "岛", "甘", "泡",
"睡", "童", "铸", "汤", "阀", "休", "汇", "舍", "牧", "绕",
"炸", "哲", "磷", "绩", "朋", "淡", "尖", "启", "陷", "柴",
"呈", "徒", "颜", "泪", "稍", "忘", "泵", "蓝", "拖", "洞",
"授", "镜", "辛", "壮", "锋", "贫", "虚", "弯", "摩", "泰",
"幼", "廷", "尊", "窗", "纲", "弄", "隶", "疑", "氏", "宫",
"姐", "震", "瑞", "怪", "尤", "琴", "循", "描", "膜", "违",
"夹", "腰", "缘", "珠", "穷", "森", "枝", "竹", "沟", "催",
"绳", "忆", "邦", "剩", "幸", "浆", "栏", "拥", "牙", "贮",
"礼", "滤", "钠", "纹", "罢", "拍", "咱", "喊", "袖", "埃",
"勤", "罚", "焦", "潜", "伍", "墨", "欲", "缝", "姓", "刊",
"饱", "仿", "奖", "铝", "鬼", "丽", "跨", "默", "挖", "链",
"扫", "喝", "袋", "炭", "污", "幕", "诸", "弧", "励", "梅",
"奶", "洁", "灾", "舟", "鉴", "苯", "讼", "抱", "毁", "懂",
"寒", "智", "埔", "寄", "届", "跃", "渡", "挑", "丹", "艰",
"贝", "碰", "拔", "爹", "戴", "码", "梦", "芽", "熔", "赤",
"渔", "哭", "敬", "颗", "奔", "铅", "仲", "虎", "稀", "妹",
"乏", "珍", "申", "桌", "遵", "允", "隆", "螺", "仓", "魏",
"锐", "晓", "氮", "兼", "隐", "碍", "赫", "拨", "忠", "肃",
"缸", "牵", "抢", "博", "巧", "壳", "兄", "杜", "讯", "诚",
"碧", "祥", "柯", "页", "巡", "矩", "悲", "灌", "龄", "伦",
"票", "寻", "桂", "铺", "圣", "恐", "恰", "郑", "趣", "抬",
"荒", "腾", "贴", "柔", "滴", "猛", "阔", "辆", "妻", "填",
"撤", "储", "签", "闹", "扰", "紫", "砂", "递", "戏", "吊",
"陶", "伐", "喂", "疗", "瓶", "婆", "抚", "臂", "摸", "忍",
"虾", "蜡", "邻", "胸", "巩", "挤", "偶", "弃", "槽", "劲",
"乳", "邓", "吉", "仁", "烂", "砖", "租", "乌", "舰", "伴",
"瓜", "浅", "丙", "暂", "燥", "橡", "柳", "迷", "暖", "牌",
"秧", "胆", "详", "簧", "踏", "瓷", "谱", "呆", "宾", "糊",
"洛", "辉", "愤", "竞", "隙", "怒", "粘", "乃", "绪", "肩",
"籍", "敏", "涂", "熙", "皆", "侦", "悬", "掘", "享", "纠",
"醒", "狂", "锁", "淀", "恨", "牲", "霸", "爬", "赏", "逆",
"玩", "陵", "祝", "秒", "浙", "貌", "役", "彼", "悉", "鸭",
"趋", "凤", "晨", "畜", "辈", "秩", "卵", "署", "梯", "炎",
"滩", "棋", "驱", "筛", "峡", "冒", "啥", "寿", "译", "浸",
"泉", "帽", "迟", "硅", "疆", "贷", "漏", "稿", "冠", "嫩",
"胁", "芯", "牢", "叛", "蚀", "奥", "鸣", "岭", "羊", "凭",
"串", "塘", "绘", "酵", "融", "盆", "锡", "庙", "筹", "冻",
"辅", "摄", "袭", "筋", "拒", "僚", "旱", "钾", "鸟", "漆",
"沈", "眉", "疏", "添", "棒", "穗", "硝", "韩", "逼", "扭",
"侨", "凉", "挺", "碗", "栽", "炒", "杯", "患", "馏", "劝",
"豪", "辽", "勃", "鸿", "旦", "吏", "拜", "狗", "埋", "辊",
"掩", "饮", "搬", "骂", "辞", "勾", "扣", "估", "蒋", "绒",
"雾", "丈", "朵", "姆", "拟", "宇", "辑", "陕", "雕", "偿",
"蓄", "崇", "剪", "倡", "厅", "咬", "驶", "薯", "刷", "斥",
"番", "赋", "奉", "佛", "浇", "漫", "曼", "扇", "钙", "桃",
"扶", "仔", "返", "俗", "亏", "腔", "鞋", "棱", "覆", "框",
"悄", "叔", "撞", "骗", "勘", "旺", "沸", "孤", "吐", "孟",
"渠", "屈", "疾", "妙", "惜", "仰", "狠", "胀", "谐", "抛",
"霉", "桑", "岗", "嘛", "衰", "盗", "渗", "脏", "赖", "涌",
"甜", "曹", "阅", "肌", "哩", "厉", "烃", "纬", "毅", "昨",
"伪", "症", "煮", "叹", "钉", "搭", "茎", "笼", "酷", "偷",
"弓", "锥", "恒", "杰", "坑", "鼻", "翼", "纶", "叙", "狱",
"逮", "罐", "络", "棚", "抑", "膨", "蔬", "寺", "骤", "穆",
"冶", "枯", "册", "尸", "凸", "绅", "坯", "牺", "焰", "轰",
"欣", "晋", "瘦", "御", "锭", "锦", "丧", "旬", "锻", "垄",
"搜", "扑", "邀", "亭", "酯", "迈", "舒", "脆", "酶", "闲",
"忧", "酚", "顽", "羽", "涨", "卸", "仗", "陪", "辟", "惩",
"杭", "姚", "肚", "捉", "飘", "漂", "昆", "欺", "吾", "郎",
"烷", "汁", "呵", "饰", "萧", "雅", "邮", "迁", "燕", "撒",
"姻", "赴", "宴", "烦", "债", "帐", "斑", "铃", "旨", "醇",
"董", "饼", "雏", "姿", "拌", "傅", "腹", "妥", "揉", "贤",
"拆", "歪", "葡", "胺", "丢", "浩", "徽", "昂", "垫", "挡",
"览", "贪", "慰", "缴", "汪", "慌", "冯", "诺", "姜", "谊",
"凶", "劣", "诬", "耀", "昏", "躺", "盈", "骑", "乔", "溪",
"丛", "卢", "抹", "闷", "咨", "刮", "驾", "缆", "悟", "摘",
"铒", "掷", "颇", "幻", "柄", "惠", "惨", "佳", "仇", "腊",
"窝", "涤", "剑", "瞧", "堡", "泼", "葱", "罩", "霍", "捞",
"胎", "苍", "滨", "俩", "捅", "湘", "砍", "霞", "邵", "萄",
"疯", "淮", "遂", "熊", "粪", "烘", "宿", "档", "戈", "驳",
"嫂", "裕", "徙", "箭", "捐", "肠", "撑", "晒", "辨", "殿",
"莲", "摊", "搅", "酱", "屏", "疫", "哀", "蔡", "堵", "沫",
"皱", "畅", "叠", "阁", "莱", "敲", "辖", "钩", "痕", "坝",
"巷", "饿", "祸", "丘", "玄", "溜", "曰", "逻", "彭", "尝",
"卿", "妨", "艇", "吞", "韦", "怨", "矮", "歇"
]
return common_chars
def main():
"""主函数"""
# 剪映贴纸搜索关键词大全 - 按功能/风格等维度分类的字符串数组
# 核心功能类
function_keywords = [
"箭头", "圆圈", "高亮", "进度条", "序号", "标签", "重点", "划重点",
"标题", "字幕", "弹幕", "泡泡字", "立体字", "花字", "手写体", "空心字",
"按钮", "图标", "导航栏", "弹窗", "加载", "二维码", "水印",
"马赛克", "遮挡", "模糊", "相框", "边框", "画框", "圆角", "虚线框",
"点赞", "关注", "收藏", "评论", "分享", "箭头指示", "手势"
]
# 风格/质感类
style_keywords = [
"动态", "静态", "透明", "渐变", "发光", "闪烁", "粒子", "线条风",
"手绘", "卡通", "简约", "复古", "国潮", "赛博朋克", "科技感", "ins风",
"梦幻", "唯美", "治愈", "暗黑", "清新", "可爱", "搞怪", "酷飒",
"3D", "立体", "浮雕", "水墨", "剪纸", "像素", "涂鸦", "水彩"
]
# 情绪/表情类
emotion_keywords = [
"爱心", "星星眼", "撒花", "开心", "快乐", "感动", "惊喜", "比心",
"无语", "满头问号", "难过", "生气", "尴尬", "流汗", "晕", "崩溃",
"震惊", "吐槽", "吃瓜", "doge", "捂脸", "大笑", "嘘", "害羞",
"优雅永不过时", "可云式震惊", "电子包浆", "栓Q", "绝绝子"
]
# 场景/节日类
scene_keywords = [
"vlog", "美食", "旅行", "运动", "学习", "办公", "游戏", "宠物",
"春日", "夏日", "秋日", "冬日", "美拉德", "雪景", "落叶", "樱花",
"春节", "中秋", "国庆", "圣诞", "元旦", "情人节", "七夕", "端午", "开学季",
"直播", "促销", "抽奖", "婚礼", "生日", "派对", "毕业", "年会"
]
# 元素/对象类
element_keywords = [
"太阳", "月亮", "星星", "云朵", "雨滴", "雪花", "火焰", "植物", "花朵",
"爱心", "气球", "礼物", "蛋糕", "汽车", "飞机", "动物", "水果", "零食",
"emoji", "标点", "数学符号", "货币符号", "国旗", "logo", "徽章",
"彩带", "气球", "烟花", "光斑", "爱心雨", "花瓣", "蝴蝶", "星星"
]
# 热门/分类类
hot_keywords = [
"热门", "推荐", "爆款", "新贴纸", "VIP", "免费",
"抖音", "快手", "小红书", "B站", "视频号",
"脸部装饰", "手势识别", "AR贴纸", "特效贴纸", "动态贴纸"
]
# 获取常用汉字
chinese_characters = get_common_chinese_characters()
# 合并所有关键词到一个总数组(去重)
keywords = list(set(
function_keywords + style_keywords + emotion_keywords + scene_keywords + element_keywords + hot_keywords + chinese_characters
))
# 查询多个关键词并合并结果
output_file = query_multiple_keywords(keywords)
if not output_file:
print("查询或保存结果失败")
sys.exit(1)
if __name__ == "__main__":
main()