typed-ffmpeg-compatible 2.6.2__py3-none-any.whl → 2.6.4__py3-none-any.whl
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.
- typed_ffmpeg/__init__.py +26 -1
- typed_ffmpeg/base.py +87 -29
- typed_ffmpeg/common/schema.py +281 -3
- typed_ffmpeg/common/serialize.py +118 -21
- typed_ffmpeg/dag/__init__.py +13 -0
- typed_ffmpeg/dag/compile.py +39 -4
- typed_ffmpeg/dag/context.py +137 -29
- typed_ffmpeg/dag/factory.py +27 -0
- typed_ffmpeg/dag/global_runnable/global_args.py +11 -0
- typed_ffmpeg/dag/global_runnable/runnable.py +143 -34
- typed_ffmpeg/dag/io/_input.py +2 -1
- typed_ffmpeg/dag/io/_output.py +2 -1
- typed_ffmpeg/dag/nodes.py +402 -67
- typed_ffmpeg/dag/schema.py +3 -1
- typed_ffmpeg/dag/utils.py +29 -8
- typed_ffmpeg/dag/validate.py +83 -20
- typed_ffmpeg/exceptions.py +42 -9
- typed_ffmpeg/info.py +137 -16
- typed_ffmpeg/probe.py +31 -6
- typed_ffmpeg/schema.py +32 -5
- typed_ffmpeg/sources.py +2825 -0
- typed_ffmpeg/streams/channel_layout.py +13 -0
- typed_ffmpeg/utils/escaping.py +47 -7
- typed_ffmpeg/utils/forzendict.py +108 -0
- typed_ffmpeg/utils/lazy_eval/operator.py +43 -1
- typed_ffmpeg/utils/lazy_eval/schema.py +122 -6
- typed_ffmpeg/utils/run.py +44 -7
- typed_ffmpeg/utils/snapshot.py +36 -1
- typed_ffmpeg/utils/typing.py +29 -4
- typed_ffmpeg/utils/view.py +46 -4
- {typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/METADATA +1 -1
- typed_ffmpeg_compatible-2.6.4.dist-info/RECORD +48 -0
- typed_ffmpeg_compatible-2.6.2.dist-info/RECORD +0 -46
- {typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/LICENSE +0 -0
- {typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/WHEEL +0 -0
- {typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/entry_points.txt +0 -0
typed_ffmpeg/utils/view.py
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
"""
|
2
|
+
Visualization utilities for FFmpeg filter graphs.
|
3
|
+
|
4
|
+
This module provides functionality to generate visual representations of
|
5
|
+
FFmpeg filter graphs using Graphviz. These visualizations can be useful for
|
6
|
+
understanding complex filter chains, debugging, and documentation purposes.
|
7
|
+
"""
|
8
|
+
|
1
9
|
from __future__ import annotations
|
2
10
|
|
3
11
|
from typing import Literal
|
@@ -8,6 +16,22 @@ from ..dag.schema import Node
|
|
8
16
|
|
9
17
|
|
10
18
|
def _get_node_color(node: Node) -> str | None:
|
19
|
+
"""
|
20
|
+
Determine the appropriate color for a node in the graph visualization.
|
21
|
+
|
22
|
+
This internal helper function assigns specific colors to different types of nodes
|
23
|
+
to enhance visual differentiation in the rendered graph:
|
24
|
+
- Input nodes: green (#99cc00)
|
25
|
+
- Output nodes: blue (#99ccff)
|
26
|
+
- Filter nodes: yellow (#ffcc00)
|
27
|
+
- Other nodes: no specific color (None)
|
28
|
+
|
29
|
+
Args:
|
30
|
+
node: The node to assign a color to
|
31
|
+
|
32
|
+
Returns:
|
33
|
+
A hex color string or None if no specific color is assigned
|
34
|
+
"""
|
11
35
|
if isinstance(node, InputNode):
|
12
36
|
color = "#99cc00"
|
13
37
|
elif isinstance(node, OutputNode):
|
@@ -21,14 +45,32 @@ def _get_node_color(node: Node) -> str | None:
|
|
21
45
|
|
22
46
|
def view(node: Node, format: Literal["png", "svg", "dot"]) -> str:
|
23
47
|
"""
|
24
|
-
Visualize
|
48
|
+
Visualize a filter graph node and its dependencies using Graphviz.
|
49
|
+
|
50
|
+
This function creates a graphical representation of the FFmpeg filter graph
|
51
|
+
starting from the given node. It traverses the entire graph and generates
|
52
|
+
a visual diagram showing all nodes and their connections. The visualization
|
53
|
+
uses different colors to distinguish between input, output, and filter nodes.
|
25
54
|
|
26
55
|
Args:
|
27
|
-
node: The node to visualize
|
28
|
-
format: The format
|
56
|
+
node: The root node to visualize (typically an output node)
|
57
|
+
format: The output format for the visualization (png, svg, or dot)
|
29
58
|
|
30
59
|
Returns:
|
31
|
-
The path to the rendered graph
|
60
|
+
The path to the rendered graph file
|
61
|
+
|
62
|
+
Raises:
|
63
|
+
ImportError: If the graphviz package is not installed
|
64
|
+
|
65
|
+
Example:
|
66
|
+
```python
|
67
|
+
# Create a filter graph and visualize it
|
68
|
+
output = (
|
69
|
+
ffmpeg.input("input.mp4").filter("scale", 1280, 720).output("output.mp4")
|
70
|
+
)
|
71
|
+
graph_path = ffmpeg.utils.view(output, format="png")
|
72
|
+
print(f"Graph visualization saved to {graph_path}")
|
73
|
+
```
|
32
74
|
"""
|
33
75
|
|
34
76
|
try:
|
{typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: typed-ffmpeg-compatible
|
3
|
-
Version: 2.6.
|
3
|
+
Version: 2.6.4
|
4
4
|
Summary: Modern Python FFmpeg wrappers offer comprehensive support for complex filters, complete with detailed typing and documentation.
|
5
5
|
Home-page: https://livingbio.github.io/typed-ffmpeg/
|
6
6
|
License: MIT
|
@@ -0,0 +1,48 @@
|
|
1
|
+
typed_ffmpeg/__init__.py,sha256=NL_jH6nUb5pF8pMt3S51243qBTUvZdN-9sJpeuiznRE,1532
|
2
|
+
typed_ffmpeg/base.py,sha256=C5Tqbx2I0c-09D7aXKZoGkspu-lAAeAhuOns5zr3PXQ,6304
|
3
|
+
typed_ffmpeg/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
+
typed_ffmpeg/common/schema.py,sha256=NSr1GnREvAhdshlBigRSUu12NTleOwhspJrbVCpGgNo,19468
|
5
|
+
typed_ffmpeg/common/serialize.py,sha256=Be0SgrsfD76kWZYT1IKFKQItuOgGLYWJITjDXGvbzcs,7687
|
6
|
+
typed_ffmpeg/dag/__init__.py,sha256=qAApSNqjbZ1DtUaV5bSku9RwG7MpMPa1HJO764cSBt4,849
|
7
|
+
typed_ffmpeg/dag/compile.py,sha256=GXMTFE1vqRDI-nuIZPtJwXQhCc61uCIGh5u4OBRp8gg,3129
|
8
|
+
typed_ffmpeg/dag/context.py,sha256=pv77lltW6yk-PRYlZ0MC6FICVxYLuyxQAS9Vx5vko0s,11691
|
9
|
+
typed_ffmpeg/dag/factory.py,sha256=7iRB2Inth97wxvklI-MoL_47Cl7rZOogNj10qM7wUTs,2600
|
10
|
+
typed_ffmpeg/dag/global_runnable/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
+
typed_ffmpeg/dag/global_runnable/global_args.py,sha256=ehLtx4v-XxqkmODhpE_gik0r79hs4Sa8TJnRsH9Fj1o,8043
|
12
|
+
typed_ffmpeg/dag/global_runnable/runnable.py,sha256=wvfvojrLFvu-Vz0N2AIXbla2kptwcu0Dba4TfKYOH3I,11041
|
13
|
+
typed_ffmpeg/dag/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
|
+
typed_ffmpeg/dag/io/_input.py,sha256=KRLTSQPEfmgPcPEAJdeWRHZhNsClaJCB9Ac6czMOrmE,7214
|
15
|
+
typed_ffmpeg/dag/io/_output.py,sha256=_no6ffAOABznbLNTki8CYr7pvr4Sa0LweRfn38-cszs,12470
|
16
|
+
typed_ffmpeg/dag/io/output_args.py,sha256=SThIhZh9PXs2m6Fz5JsSy8oS-Te7GM_oz7HRuZo0-eI,13901
|
17
|
+
typed_ffmpeg/dag/nodes.py,sha256=yJcFjN85aFbk_4SKI7pbe-JkTSUJbfrpSXpqYiGbWGs,29133
|
18
|
+
typed_ffmpeg/dag/schema.py,sha256=gKW1eMMiVHvsbFnw4jlh22QhnSDgk_AJCBWvlF73ZZs,6040
|
19
|
+
typed_ffmpeg/dag/utils.py,sha256=hydh7_kjpOCw8WEGhXMxIXR4Ek-3DeoOt6esInuK2Xw,1941
|
20
|
+
typed_ffmpeg/dag/validate.py,sha256=tWswVibP_BFNOiWX0LgnfMrg3TBm7QIt060Ofd9ychE,9569
|
21
|
+
typed_ffmpeg/exceptions.py,sha256=D4SID6WOwkjVV8O8mAjrEDHWn-8BRDnK_jteaDof1SY,2474
|
22
|
+
typed_ffmpeg/filters.py,sha256=_lBpGZgPHK3KgGVrw-TCdQEsBRuEXVIgwggYNGd80MU,110076
|
23
|
+
typed_ffmpeg/info.py,sha256=0KCzf8hJaI6ObPRT0uftLa96RlYvaQmoEq1sqFJSc24,9521
|
24
|
+
typed_ffmpeg/probe.py,sha256=ABfM0ZfDNwBHpPfhu2hpx61_oXb8zdhD9oofwSEcODg,2588
|
25
|
+
typed_ffmpeg/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
|
+
typed_ffmpeg/schema.py,sha256=KVtmyGeJutjFot70r6Nj8W8WBqwvfg2-rSgjdhPVh-o,1615
|
27
|
+
typed_ffmpeg/sources.py,sha256=ASt0l8FMW82X-70qw72167xpyBY7tQQClVuhy8r0HfU,86026
|
28
|
+
typed_ffmpeg/streams/__init__.py,sha256=Nt9uWpcVI1sQLl5Qt_kBCBcWOGZA1vczCQ0qvFbSko0,141
|
29
|
+
typed_ffmpeg/streams/audio.py,sha256=2oNRhb5UetWtlPG3NW73AjUZoFPl303yMv-6W1sGWt0,259054
|
30
|
+
typed_ffmpeg/streams/av.py,sha256=SWcy8Q9hk36ZZJ4WosG08NR-r1f2IzOgZ4tsAZ7nX18,544
|
31
|
+
typed_ffmpeg/streams/channel_layout.py,sha256=hGagaoc1tnWS8K1yiITp4f_92qq5e7C_zB15bHOL0DI,1162
|
32
|
+
typed_ffmpeg/streams/video.py,sha256=cQwHfew75YO_dbZjmpUYd-nXt1JHN0M7suFKKe5UH5s,453576
|
33
|
+
typed_ffmpeg/types.py,sha256=ly3zLtg7KxRa_jsDDrFPAxRZRjTQdWVpiQzOD9NdrFM,4137
|
34
|
+
typed_ffmpeg/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
|
+
typed_ffmpeg/utils/escaping.py,sha256=m6CTEBwWZTFdtZHTHW-3pQCgkpdZb9f9ynoO-gsD7uM,2937
|
36
|
+
typed_ffmpeg/utils/forzendict.py,sha256=9QWdPQA2AbSfiC9-mrq1YeZFl1qN--zw8WlsqQ2ulCk,3114
|
37
|
+
typed_ffmpeg/utils/lazy_eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
|
+
typed_ffmpeg/utils/lazy_eval/operator.py,sha256=QWybd-UH3VdDa8kgWkqAMi3WV0b0WF1d1JixQr6is2E,4136
|
39
|
+
typed_ffmpeg/utils/lazy_eval/schema.py,sha256=WSg-E3MS3itN1AT6Dq4Z9btnRHEReuN3o6zruXou7h4,9623
|
40
|
+
typed_ffmpeg/utils/run.py,sha256=mSoAdcvD-InldqkRgWNc8iXKgJJoEMAOE4PL2gVmtqw,2178
|
41
|
+
typed_ffmpeg/utils/snapshot.py,sha256=mKILRm6qiQV2egaD-70MSUEl-DFoLD5w_v9GZIequI4,2181
|
42
|
+
typed_ffmpeg/utils/typing.py,sha256=DBQn_gCF8C_DTwsfMHeCgfnNUROwAjlIcHrQ7lNDOoE,1187
|
43
|
+
typed_ffmpeg/utils/view.py,sha256=4DJmyGIkUeE6-V0azudDCWm608mRdeRhTZHMgnew9Kw,3409
|
44
|
+
typed_ffmpeg_compatible-2.6.4.dist-info/LICENSE,sha256=8Aaya5i_09Cou2i3QMxTwz6uHGzi_fGA4uhkco07-A4,1066
|
45
|
+
typed_ffmpeg_compatible-2.6.4.dist-info/METADATA,sha256=AB_nBB0d5PwrLzSZ29cy_Xc01YKTAM8tWj9X8BEnIJs,7249
|
46
|
+
typed_ffmpeg_compatible-2.6.4.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
47
|
+
typed_ffmpeg_compatible-2.6.4.dist-info/entry_points.txt,sha256=KfZmNsM16GT_lF1otASIN6E3i6xXHXoB1gMeEdlptjA,44
|
48
|
+
typed_ffmpeg_compatible-2.6.4.dist-info/RECORD,,
|
@@ -1,46 +0,0 @@
|
|
1
|
-
typed_ffmpeg/__init__.py,sha256=122K8EWO5F-1re6YjI_VrTo8tlGGkNbT9Dqlppt5bUI,711
|
2
|
-
typed_ffmpeg/base.py,sha256=77X6z6GPMYyYkJqzYUHJKqPeToQ0ZsA8TQMVXCm7dDA,3248
|
3
|
-
typed_ffmpeg/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
-
typed_ffmpeg/common/schema.py,sha256=tGgb13tfiHOEXpOEmjlh92Gg8o4G4b9bzFgiTpupGO8,9724
|
5
|
-
typed_ffmpeg/common/serialize.py,sha256=J-NuMzPoy_qDl9UStVeMnjYVLK-QOUjz5cz4xStPIc4,3471
|
6
|
-
typed_ffmpeg/dag/__init__.py,sha256=RXOgd2Gx0w0bzvnqX9TpFpi5SbTtgh0DQAmCZnYMx_o,315
|
7
|
-
typed_ffmpeg/dag/compile.py,sha256=891eELZB_LeD6RSwRYFjBrcQmd7uvfFiOaQyp5LCUwU,1565
|
8
|
-
typed_ffmpeg/dag/context.py,sha256=a0UWq1yMBznCTapO_FHlelHVdzBGf2juUKoSRKN0jUI,5863
|
9
|
-
typed_ffmpeg/dag/factory.py,sha256=KT50pifjKUXymDM8DvAE1OJYRBahoAmRQ-VGD0L7irA,1561
|
10
|
-
typed_ffmpeg/dag/global_runnable/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
typed_ffmpeg/dag/global_runnable/global_args.py,sha256=YvYEp7gYquzRhhbBHptq7hq3r210VZtyTZNECIWd0Vc,7571
|
12
|
-
typed_ffmpeg/dag/global_runnable/runnable.py,sha256=PW36CSlwSqKuIPOVD4XfRb9hhwsAdv4wFMNxq8Da83U,5371
|
13
|
-
typed_ffmpeg/dag/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
|
-
typed_ffmpeg/dag/io/_input.py,sha256=O4YJ253W75Ez9lHb1oNCyqt5HmHcAsCIqdN8jZKijmc,7176
|
15
|
-
typed_ffmpeg/dag/io/_output.py,sha256=xayZijYpQzt26xkbCeuC7Z0EICDaArZIW69U1E4Hu8I,12432
|
16
|
-
typed_ffmpeg/dag/io/output_args.py,sha256=SThIhZh9PXs2m6Fz5JsSy8oS-Te7GM_oz7HRuZo0-eI,13901
|
17
|
-
typed_ffmpeg/dag/nodes.py,sha256=ua0wZDcu60nscs5V0CDTCoZbw9uyrYC7vkZrewNVqsU,14778
|
18
|
-
typed_ffmpeg/dag/schema.py,sha256=rkzf9OavVj_pP8dVqVI8wAMaCUe0Q1s5B1MLN35a5Dk,5913
|
19
|
-
typed_ffmpeg/dag/utils.py,sha256=ooGrCOnsvRjjUMhC4JSCc3T2FRL1JLz0CeVSiE9f1hI,1141
|
20
|
-
typed_ffmpeg/dag/validate.py,sha256=hsKzWIKngZWAZCEzU-G0drSfAJyOQd9WXx0c7m0vLLg,5973
|
21
|
-
typed_ffmpeg/exceptions.py,sha256=rNF4bGWDds9P9gzzATEmPMHprXx1Rm4QVtFyIq3pqNc,944
|
22
|
-
typed_ffmpeg/filters.py,sha256=_lBpGZgPHK3KgGVrw-TCdQEsBRuEXVIgwggYNGd80MU,110076
|
23
|
-
typed_ffmpeg/info.py,sha256=-5ME5u16foXWDSdO-1hNw_4twH_5gtkENdiswg4fMAk,4790
|
24
|
-
typed_ffmpeg/probe.py,sha256=iIMKIdlvudCnnJLVKwzQxCOhGlgSqtnCeSgY8mEiHoE,1449
|
25
|
-
typed_ffmpeg/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
|
-
typed_ffmpeg/schema.py,sha256=Bb1It8tVVmPcGl2QkhIqSMdsL4ZnwkdBy-5UjS5SEvQ,533
|
27
|
-
typed_ffmpeg/streams/__init__.py,sha256=Nt9uWpcVI1sQLl5Qt_kBCBcWOGZA1vczCQ0qvFbSko0,141
|
28
|
-
typed_ffmpeg/streams/audio.py,sha256=2oNRhb5UetWtlPG3NW73AjUZoFPl303yMv-6W1sGWt0,259054
|
29
|
-
typed_ffmpeg/streams/av.py,sha256=SWcy8Q9hk36ZZJ4WosG08NR-r1f2IzOgZ4tsAZ7nX18,544
|
30
|
-
typed_ffmpeg/streams/channel_layout.py,sha256=ocRb1HM9QgAH4xL0liVs-lXq0WaZyRu1agWz4CaLssU,662
|
31
|
-
typed_ffmpeg/streams/video.py,sha256=cQwHfew75YO_dbZjmpUYd-nXt1JHN0M7suFKKe5UH5s,453576
|
32
|
-
typed_ffmpeg/types.py,sha256=ly3zLtg7KxRa_jsDDrFPAxRZRjTQdWVpiQzOD9NdrFM,4137
|
33
|
-
typed_ffmpeg/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
34
|
-
typed_ffmpeg/utils/escaping.py,sha256=OfX0K2InUuAye7t8DcS6ebCNvRatxy1F4ieBLRfOea4,1203
|
35
|
-
typed_ffmpeg/utils/lazy_eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
36
|
-
typed_ffmpeg/utils/lazy_eval/operator.py,sha256=AFUUdse1M5QvyO6i78xO3e3hxG2lwITSmgywsQbDWNs,2787
|
37
|
-
typed_ffmpeg/utils/lazy_eval/schema.py,sha256=JCiwxNElHzeSm5ehfgpwgV1fNbZ7cuQzs2u605zEw5Q,4840
|
38
|
-
typed_ffmpeg/utils/run.py,sha256=9fKUFOS6mD4hDm751zVADS31N4yY6dTeoKPy1LImauI,710
|
39
|
-
typed_ffmpeg/utils/snapshot.py,sha256=TLhjMPVzOpWSqoToNy_heWCv3-Hnbk6hK_BuRKAhf0U,773
|
40
|
-
typed_ffmpeg/utils/typing.py,sha256=sx4IN38NGQxgMs5GOtPouM02TcHINxvTreXPUbAbGRc,316
|
41
|
-
typed_ffmpeg/utils/view.py,sha256=RhKqKgRQ3mRaXtnV77yUk40HKgiGZikB4T8IL92I3v4,1780
|
42
|
-
typed_ffmpeg_compatible-2.6.2.dist-info/LICENSE,sha256=8Aaya5i_09Cou2i3QMxTwz6uHGzi_fGA4uhkco07-A4,1066
|
43
|
-
typed_ffmpeg_compatible-2.6.2.dist-info/METADATA,sha256=VUmB65xLFEjnUI0aANrHLS66BrktLsSZQhsb0GJEVno,7249
|
44
|
-
typed_ffmpeg_compatible-2.6.2.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
45
|
-
typed_ffmpeg_compatible-2.6.2.dist-info/entry_points.txt,sha256=KfZmNsM16GT_lF1otASIN6E3i6xXHXoB1gMeEdlptjA,44
|
46
|
-
typed_ffmpeg_compatible-2.6.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/entry_points.txt
RENAMED
File without changes
|