creative-render-engine 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- creative_render_engine-0.7.0/PKG-INFO +59 -0
- creative_render_engine-0.7.0/README.md +36 -0
- creative_render_engine-0.7.0/pyproject.toml +48 -0
- creative_render_engine-0.7.0/setup.cfg +4 -0
- creative_render_engine-0.7.0/src/creative_render_engine/__init__.py +72 -0
- creative_render_engine-0.7.0/src/creative_render_engine/api.py +79 -0
- creative_render_engine-0.7.0/src/creative_render_engine/compiler.py +1428 -0
- creative_render_engine-0.7.0/src/creative_render_engine/engines/__init__.py +0 -0
- creative_render_engine-0.7.0/src/creative_render_engine/engines/common.py +484 -0
- creative_render_engine-0.7.0/src/creative_render_engine/engines/pure_image.py +99 -0
- creative_render_engine-0.7.0/src/creative_render_engine/errors.py +44 -0
- creative_render_engine-0.7.0/src/creative_render_engine/hashing.py +30 -0
- creative_render_engine-0.7.0/src/creative_render_engine/output_paths.py +75 -0
- creative_render_engine-0.7.0/src/creative_render_engine/plans.py +310 -0
- creative_render_engine-0.7.0/src/creative_render_engine/preview.py +203 -0
- creative_render_engine-0.7.0/src/creative_render_engine/py.typed +0 -0
- creative_render_engine-0.7.0/src/creative_render_engine/render.py +328 -0
- creative_render_engine-0.7.0/src/creative_render_engine/schemas.py +763 -0
- creative_render_engine-0.7.0/src/creative_render_engine/settings.py +31 -0
- creative_render_engine-0.7.0/src/creative_render_engine.egg-info/PKG-INFO +59 -0
- creative_render_engine-0.7.0/src/creative_render_engine.egg-info/SOURCES.txt +34 -0
- creative_render_engine-0.7.0/src/creative_render_engine.egg-info/dependency_links.txt +1 -0
- creative_render_engine-0.7.0/src/creative_render_engine.egg-info/requires.txt +12 -0
- creative_render_engine-0.7.0/src/creative_render_engine.egg-info/top_level.txt +1 -0
- creative_render_engine-0.7.0/tests/test_contracts.py +977 -0
- creative_render_engine-0.7.0/tests/test_graphic_text.py +221 -0
- creative_render_engine-0.7.0/tests/test_layer_order.py +75 -0
- creative_render_engine-0.7.0/tests/test_legacy_media.py +238 -0
- creative_render_engine-0.7.0/tests/test_legacy_parity.py +327 -0
- creative_render_engine-0.7.0/tests/test_output_paths.py +179 -0
- creative_render_engine-0.7.0/tests/test_pure_image.py +197 -0
- creative_render_engine-0.7.0/tests/test_scroll_call.py +66 -0
- creative_render_engine-0.7.0/tests/test_timeline_call.py +204 -0
- creative_render_engine-0.7.0/tests/test_timeline_parity.py +57 -0
- creative_render_engine-0.7.0/tests/test_video_progress.py +116 -0
- creative_render_engine-0.7.0/tests/test_wheel_isolation.py +79 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: creative-render-engine
|
|
3
|
+
Version: 0.7.0
|
|
4
|
+
Summary: Standalone creative image, scroll, and timeline rendering engine
|
|
5
|
+
Keywords: image,video,rendering,subtitle,timeline
|
|
6
|
+
Classifier: Intended Audience :: Developers
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
9
|
+
Classifier: Typing :: Typed
|
|
10
|
+
Requires-Python: >=3.12
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
Requires-Dist: pydantic<3,>=2.12
|
|
13
|
+
Requires-Dist: pillow<12,>=11
|
|
14
|
+
Requires-Dist: numpy<3,>=2
|
|
15
|
+
Requires-Dist: moviepy<3,>=2.2
|
|
16
|
+
Requires-Dist: proglog<1,>=0.1.12
|
|
17
|
+
Requires-Dist: text-block-renderer<4,>=3.2.2
|
|
18
|
+
Provides-Extra: publish
|
|
19
|
+
Requires-Dist: setuptools>=78; extra == "publish"
|
|
20
|
+
Requires-Dist: mypy<2,>=1.19; extra == "publish"
|
|
21
|
+
Requires-Dist: build<2,>=1.2; extra == "publish"
|
|
22
|
+
Requires-Dist: twine<7,>=6; extra == "publish"
|
|
23
|
+
|
|
24
|
+
# Creative Render Engine
|
|
25
|
+
|
|
26
|
+
独立的创意图片、滚动视频和时间线渲染引擎,提供基于 Pydantic 的任务模型、编译、预览和渲染接口。
|
|
27
|
+
|
|
28
|
+
## 安装
|
|
29
|
+
|
|
30
|
+
需要 Python 3.12 或更高版本。
|
|
31
|
+
|
|
32
|
+
```shell
|
|
33
|
+
python -m pip install creative-render-engine
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
发行包名为 `creative-render-engine`,Python 导入名为 `creative_render_engine`。
|
|
37
|
+
|
|
38
|
+
## 使用
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
import creative_render_engine as engine
|
|
42
|
+
|
|
43
|
+
# 获取任务 JSON Schema,查看支持的任务类型和字段。
|
|
44
|
+
schema = engine.render_task_json_schema()
|
|
45
|
+
|
|
46
|
+
# 写入文件前必须配置输出根目录。
|
|
47
|
+
engine.settings.output_root = "./output"
|
|
48
|
+
|
|
49
|
+
# task 为符合 Schema 的任务字典或 RenderTask 模型:
|
|
50
|
+
# plan = engine.compile(task)
|
|
51
|
+
# preview = engine.preview(plan)
|
|
52
|
+
# result = engine.render(plan)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
支持纯图片、图文、滚动和时间线任务,以及时间线字幕生成。字体、图片、音视频等素材由调用方提供,不随包分发;视频处理依赖 MoviePy 和可用的 FFmpeg。
|
|
56
|
+
|
|
57
|
+
## 发布
|
|
58
|
+
|
|
59
|
+
本地打包、校验及上传 PyPI 的步骤见源码目录中的 `build_pypi.md`。
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Creative Render Engine
|
|
2
|
+
|
|
3
|
+
独立的创意图片、滚动视频和时间线渲染引擎,提供基于 Pydantic 的任务模型、编译、预览和渲染接口。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
需要 Python 3.12 或更高版本。
|
|
8
|
+
|
|
9
|
+
```shell
|
|
10
|
+
python -m pip install creative-render-engine
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
发行包名为 `creative-render-engine`,Python 导入名为 `creative_render_engine`。
|
|
14
|
+
|
|
15
|
+
## 使用
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import creative_render_engine as engine
|
|
19
|
+
|
|
20
|
+
# 获取任务 JSON Schema,查看支持的任务类型和字段。
|
|
21
|
+
schema = engine.render_task_json_schema()
|
|
22
|
+
|
|
23
|
+
# 写入文件前必须配置输出根目录。
|
|
24
|
+
engine.settings.output_root = "./output"
|
|
25
|
+
|
|
26
|
+
# task 为符合 Schema 的任务字典或 RenderTask 模型:
|
|
27
|
+
# plan = engine.compile(task)
|
|
28
|
+
# preview = engine.preview(plan)
|
|
29
|
+
# result = engine.render(plan)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
支持纯图片、图文、滚动和时间线任务,以及时间线字幕生成。字体、图片、音视频等素材由调用方提供,不随包分发;视频处理依赖 MoviePy 和可用的 FFmpeg。
|
|
33
|
+
|
|
34
|
+
## 发布
|
|
35
|
+
|
|
36
|
+
本地打包、校验及上传 PyPI 的步骤见源码目录中的 `build_pypi.md`。
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=78"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "creative-render-engine"
|
|
7
|
+
version = "0.7.0"
|
|
8
|
+
description = "Standalone creative image, scroll, and timeline rendering engine"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
keywords = ["image", "video", "rendering", "subtitle", "timeline"]
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Intended Audience :: Developers",
|
|
13
|
+
"Programming Language :: Python :: 3",
|
|
14
|
+
"Programming Language :: Python :: 3.12",
|
|
15
|
+
"Typing :: Typed",
|
|
16
|
+
]
|
|
17
|
+
requires-python = ">=3.12"
|
|
18
|
+
dependencies = [
|
|
19
|
+
"pydantic>=2.12,<3",
|
|
20
|
+
"pillow>=11,<12",
|
|
21
|
+
"numpy>=2,<3",
|
|
22
|
+
"moviepy>=2.2,<3",
|
|
23
|
+
"proglog>=0.1.12,<1",
|
|
24
|
+
"text-block-renderer>=3.2.2,<4",
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
[project.optional-dependencies]
|
|
28
|
+
publish = [
|
|
29
|
+
"setuptools>=78",
|
|
30
|
+
"mypy>=1.19,<2",
|
|
31
|
+
"build>=1.2,<2",
|
|
32
|
+
"twine>=6,<7",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
[tool.setuptools.packages.find]
|
|
36
|
+
where = ["src"]
|
|
37
|
+
|
|
38
|
+
[tool.setuptools.package-data]
|
|
39
|
+
creative_render_engine = ["py.typed"]
|
|
40
|
+
|
|
41
|
+
[tool.pytest.ini_options]
|
|
42
|
+
testpaths = ["tests"]
|
|
43
|
+
|
|
44
|
+
[tool.mypy]
|
|
45
|
+
python_version = "3.12"
|
|
46
|
+
mypy_path = ["src"]
|
|
47
|
+
ignore_missing_imports = true
|
|
48
|
+
disable_error_code = ["import-untyped"]
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
from .api import (
|
|
2
|
+
compile,
|
|
3
|
+
generate_timeline_subtitles,
|
|
4
|
+
measure_graphic_text,
|
|
5
|
+
preview,
|
|
6
|
+
render,
|
|
7
|
+
render_task_hash,
|
|
8
|
+
render_task_json_schema,
|
|
9
|
+
validate_render_task,
|
|
10
|
+
)
|
|
11
|
+
from .errors import (
|
|
12
|
+
AssetError,
|
|
13
|
+
CompileError,
|
|
14
|
+
ConfigurationError,
|
|
15
|
+
ContractError,
|
|
16
|
+
CreativeRenderEngineError,
|
|
17
|
+
RenderError,
|
|
18
|
+
)
|
|
19
|
+
from .plans import GraphicTextMeasurement, PreviewManifest, RenderManifest, RenderPlan
|
|
20
|
+
from .schemas import (
|
|
21
|
+
GraphicTextRenderTask,
|
|
22
|
+
PureImageRenderTask,
|
|
23
|
+
RenderTask,
|
|
24
|
+
ScrollRenderTask,
|
|
25
|
+
TimelineRenderTask,
|
|
26
|
+
TimelineSubtitleBlock,
|
|
27
|
+
TimelineSubtitleConfig,
|
|
28
|
+
TimelineSubtitleFrame,
|
|
29
|
+
TimelineSubtitleFrameItem,
|
|
30
|
+
TimelineSubtitleLayout,
|
|
31
|
+
TimelineSubtitleTemplate,
|
|
32
|
+
TimelineTemplate,
|
|
33
|
+
WpmSubtitleGenerationOptions,
|
|
34
|
+
)
|
|
35
|
+
from .settings import settings
|
|
36
|
+
|
|
37
|
+
__version__ = "0.7.0"
|
|
38
|
+
|
|
39
|
+
__all__ = [
|
|
40
|
+
"AssetError",
|
|
41
|
+
"CompileError",
|
|
42
|
+
"ConfigurationError",
|
|
43
|
+
"ContractError",
|
|
44
|
+
"CreativeRenderEngineError",
|
|
45
|
+
"GraphicTextMeasurement",
|
|
46
|
+
"GraphicTextRenderTask",
|
|
47
|
+
"PreviewManifest",
|
|
48
|
+
"PureImageRenderTask",
|
|
49
|
+
"RenderError",
|
|
50
|
+
"RenderManifest",
|
|
51
|
+
"RenderPlan",
|
|
52
|
+
"RenderTask",
|
|
53
|
+
"ScrollRenderTask",
|
|
54
|
+
"TimelineRenderTask",
|
|
55
|
+
"TimelineSubtitleBlock",
|
|
56
|
+
"TimelineSubtitleConfig",
|
|
57
|
+
"TimelineSubtitleFrame",
|
|
58
|
+
"TimelineSubtitleFrameItem",
|
|
59
|
+
"TimelineSubtitleLayout",
|
|
60
|
+
"TimelineSubtitleTemplate",
|
|
61
|
+
"TimelineTemplate",
|
|
62
|
+
"WpmSubtitleGenerationOptions",
|
|
63
|
+
"compile",
|
|
64
|
+
"generate_timeline_subtitles",
|
|
65
|
+
"measure_graphic_text",
|
|
66
|
+
"preview",
|
|
67
|
+
"render",
|
|
68
|
+
"render_task_hash",
|
|
69
|
+
"render_task_json_schema",
|
|
70
|
+
"settings",
|
|
71
|
+
"validate_render_task",
|
|
72
|
+
]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Sequence
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from pydantic import TypeAdapter
|
|
8
|
+
|
|
9
|
+
from .compiler import (
|
|
10
|
+
compile_task,
|
|
11
|
+
generate_timeline_subtitles,
|
|
12
|
+
measure_graphic_text_task,
|
|
13
|
+
validate_render_task,
|
|
14
|
+
)
|
|
15
|
+
from .hashing import stable_sha256
|
|
16
|
+
from .output_paths import resolve_preview_dir, resolve_render_path
|
|
17
|
+
from .plans import GraphicTextMeasurement, PreviewManifest, RenderManifest, RenderPlan
|
|
18
|
+
from .preview import preview_plan
|
|
19
|
+
from .render import render_plan
|
|
20
|
+
from .schemas import GraphicTextRenderTask, RenderTask
|
|
21
|
+
|
|
22
|
+
_RENDER_TASK_ADAPTER: TypeAdapter[RenderTask] = TypeAdapter(RenderTask)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def compile(value: RenderTask | dict[str, Any]) -> RenderPlan:
|
|
26
|
+
return compile_task(value)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def measure_graphic_text(
|
|
30
|
+
value: GraphicTextRenderTask | dict[str, Any],
|
|
31
|
+
) -> GraphicTextMeasurement:
|
|
32
|
+
return measure_graphic_text_task(value)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def preview(
|
|
36
|
+
plan: RenderPlan,
|
|
37
|
+
output_dir: str | Path | None = None,
|
|
38
|
+
*,
|
|
39
|
+
timestamps: Sequence[float] | None = None,
|
|
40
|
+
) -> PreviewManifest:
|
|
41
|
+
return preview_plan(plan, resolve_preview_dir(output_dir), timestamps=timestamps)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def render(
|
|
45
|
+
plan: RenderPlan,
|
|
46
|
+
output_path: str | Path | None = None,
|
|
47
|
+
*,
|
|
48
|
+
output_dir: str | Path | None = None,
|
|
49
|
+
output_filename: str | None = None,
|
|
50
|
+
show_progress: bool = False,
|
|
51
|
+
) -> RenderManifest:
|
|
52
|
+
destination = resolve_render_path(
|
|
53
|
+
output_path,
|
|
54
|
+
output_dir=output_dir,
|
|
55
|
+
output_filename=output_filename,
|
|
56
|
+
kind=plan.kind,
|
|
57
|
+
)
|
|
58
|
+
return render_plan(plan, destination, show_progress=show_progress)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def render_task_hash(value: RenderTask | dict[str, Any]) -> str:
|
|
62
|
+
"""Return the SHA-256 of the strictly normalized RenderTask payload."""
|
|
63
|
+
return stable_sha256(validate_render_task(value))
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def render_task_json_schema() -> dict[str, Any]:
|
|
67
|
+
return _RENDER_TASK_ADAPTER.json_schema()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
__all__ = [
|
|
71
|
+
"compile",
|
|
72
|
+
"generate_timeline_subtitles",
|
|
73
|
+
"measure_graphic_text",
|
|
74
|
+
"preview",
|
|
75
|
+
"render",
|
|
76
|
+
"render_task_hash",
|
|
77
|
+
"render_task_json_schema",
|
|
78
|
+
"validate_render_task",
|
|
79
|
+
]
|