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.
Files changed (36) hide show
  1. typed_ffmpeg/__init__.py +26 -1
  2. typed_ffmpeg/base.py +87 -29
  3. typed_ffmpeg/common/schema.py +281 -3
  4. typed_ffmpeg/common/serialize.py +118 -21
  5. typed_ffmpeg/dag/__init__.py +13 -0
  6. typed_ffmpeg/dag/compile.py +39 -4
  7. typed_ffmpeg/dag/context.py +137 -29
  8. typed_ffmpeg/dag/factory.py +27 -0
  9. typed_ffmpeg/dag/global_runnable/global_args.py +11 -0
  10. typed_ffmpeg/dag/global_runnable/runnable.py +143 -34
  11. typed_ffmpeg/dag/io/_input.py +2 -1
  12. typed_ffmpeg/dag/io/_output.py +2 -1
  13. typed_ffmpeg/dag/nodes.py +402 -67
  14. typed_ffmpeg/dag/schema.py +3 -1
  15. typed_ffmpeg/dag/utils.py +29 -8
  16. typed_ffmpeg/dag/validate.py +83 -20
  17. typed_ffmpeg/exceptions.py +42 -9
  18. typed_ffmpeg/info.py +137 -16
  19. typed_ffmpeg/probe.py +31 -6
  20. typed_ffmpeg/schema.py +32 -5
  21. typed_ffmpeg/sources.py +2825 -0
  22. typed_ffmpeg/streams/channel_layout.py +13 -0
  23. typed_ffmpeg/utils/escaping.py +47 -7
  24. typed_ffmpeg/utils/forzendict.py +108 -0
  25. typed_ffmpeg/utils/lazy_eval/operator.py +43 -1
  26. typed_ffmpeg/utils/lazy_eval/schema.py +122 -6
  27. typed_ffmpeg/utils/run.py +44 -7
  28. typed_ffmpeg/utils/snapshot.py +36 -1
  29. typed_ffmpeg/utils/typing.py +29 -4
  30. typed_ffmpeg/utils/view.py +46 -4
  31. {typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/METADATA +1 -1
  32. typed_ffmpeg_compatible-2.6.4.dist-info/RECORD +48 -0
  33. typed_ffmpeg_compatible-2.6.2.dist-info/RECORD +0 -46
  34. {typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/LICENSE +0 -0
  35. {typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/WHEEL +0 -0
  36. {typed_ffmpeg_compatible-2.6.2.dist-info → typed_ffmpeg_compatible-2.6.4.dist-info}/entry_points.txt +0 -0
@@ -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 the graph via graphviz.
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 to render the graph in.
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: typed-ffmpeg-compatible
3
- Version: 2.6.2
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,,