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.
Files changed (36) hide show
  1. creative_render_engine-0.7.0/PKG-INFO +59 -0
  2. creative_render_engine-0.7.0/README.md +36 -0
  3. creative_render_engine-0.7.0/pyproject.toml +48 -0
  4. creative_render_engine-0.7.0/setup.cfg +4 -0
  5. creative_render_engine-0.7.0/src/creative_render_engine/__init__.py +72 -0
  6. creative_render_engine-0.7.0/src/creative_render_engine/api.py +79 -0
  7. creative_render_engine-0.7.0/src/creative_render_engine/compiler.py +1428 -0
  8. creative_render_engine-0.7.0/src/creative_render_engine/engines/__init__.py +0 -0
  9. creative_render_engine-0.7.0/src/creative_render_engine/engines/common.py +484 -0
  10. creative_render_engine-0.7.0/src/creative_render_engine/engines/pure_image.py +99 -0
  11. creative_render_engine-0.7.0/src/creative_render_engine/errors.py +44 -0
  12. creative_render_engine-0.7.0/src/creative_render_engine/hashing.py +30 -0
  13. creative_render_engine-0.7.0/src/creative_render_engine/output_paths.py +75 -0
  14. creative_render_engine-0.7.0/src/creative_render_engine/plans.py +310 -0
  15. creative_render_engine-0.7.0/src/creative_render_engine/preview.py +203 -0
  16. creative_render_engine-0.7.0/src/creative_render_engine/py.typed +0 -0
  17. creative_render_engine-0.7.0/src/creative_render_engine/render.py +328 -0
  18. creative_render_engine-0.7.0/src/creative_render_engine/schemas.py +763 -0
  19. creative_render_engine-0.7.0/src/creative_render_engine/settings.py +31 -0
  20. creative_render_engine-0.7.0/src/creative_render_engine.egg-info/PKG-INFO +59 -0
  21. creative_render_engine-0.7.0/src/creative_render_engine.egg-info/SOURCES.txt +34 -0
  22. creative_render_engine-0.7.0/src/creative_render_engine.egg-info/dependency_links.txt +1 -0
  23. creative_render_engine-0.7.0/src/creative_render_engine.egg-info/requires.txt +12 -0
  24. creative_render_engine-0.7.0/src/creative_render_engine.egg-info/top_level.txt +1 -0
  25. creative_render_engine-0.7.0/tests/test_contracts.py +977 -0
  26. creative_render_engine-0.7.0/tests/test_graphic_text.py +221 -0
  27. creative_render_engine-0.7.0/tests/test_layer_order.py +75 -0
  28. creative_render_engine-0.7.0/tests/test_legacy_media.py +238 -0
  29. creative_render_engine-0.7.0/tests/test_legacy_parity.py +327 -0
  30. creative_render_engine-0.7.0/tests/test_output_paths.py +179 -0
  31. creative_render_engine-0.7.0/tests/test_pure_image.py +197 -0
  32. creative_render_engine-0.7.0/tests/test_scroll_call.py +66 -0
  33. creative_render_engine-0.7.0/tests/test_timeline_call.py +204 -0
  34. creative_render_engine-0.7.0/tests/test_timeline_parity.py +57 -0
  35. creative_render_engine-0.7.0/tests/test_video_progress.py +116 -0
  36. 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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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
+ ]