Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
6af4d40
wip
lucemia Jun 18, 2025
2195241
improve the writing
lucemia Jun 18, 2025
7ac8b64
fix
lucemia Jun 18, 2025
4771f77
fix
lucemia Jun 18, 2025
bf32a76
fix
lucemia Jun 18, 2025
6156fb7
fix
lucemia Jun 18, 2025
6a4c25f
fix
lucemia Jun 18, 2025
389d300
fix
lucemia Jun 18, 2025
50b400e
fix
lucemia Jun 18, 2025
7fea162
Improve docstrings in parse_help.py module - Add comprehensive module…
lucemia Jun 19, 2025
47973be
refactor: rewrite docstrings in parse_help/utils.py
lucemia Jun 19, 2025
8c811f9
test: add test case for run_ffmpeg_command
lucemia Jun 19, 2025
5e1d9af
fix: update parse_help utils and test snapshots
lucemia Jun 19, 2025
90d898e
refactor: update parse_help scripts and test snapshots
lucemia Jun 19, 2025
e9f3456
test: update parse_help test snapshots
lucemia Jun 19, 2025
f536b6e
feat: add main_branch_only pytest marker and CI configuration
lucemia Jun 19, 2025
ba8f8aa
test: update parse_help test files
lucemia Jun 19, 2025
f4935f8
docs: improve docstrings in parse_codecs.py
lucemia Jun 19, 2025
b398872
fix
lucemia Jun 19, 2025
13730f2
update
lucemia Jun 19, 2025
2d15520
refactor parse_formats
lucemia Jun 19, 2025
9061d36
wip
lucemia Jun 19, 2025
09cf1a0
wip
lucemia Jun 19, 2025
b8e1af9
wip
lucemia Jun 19, 2025
3229807
wip
lucemia Jun 19, 2025
3bf972f
update cli
lucemia Jun 19, 2025
242a281
wip
lucemia Jun 19, 2025
384e07d
wip
lucemia Jun 19, 2025
c535870
wip
lucemia Jun 20, 2025
0b06588
wip
lucemia Jun 23, 2025
10104d5
wip
lucemia Jun 23, 2025
acb3d93
merge
lucemia Jun 24, 2025
99ba793
wip
lucemia Jun 24, 2025
17360f6
wip
lucemia Jun 24, 2025
d1d2d75
wip
lucemia Jun 24, 2025
c8a6e75
ruff
lucemia Jun 24, 2025
bd22f6b
fix
lucemia Jun 24, 2025
5d5f2cf
Merge branch 'main' into refactor-scripts
lucemia Jun 25, 2025
5d64497
Merge branch 'main' into refactor-scripts
lucemia Jun 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions src/scripts/code_gen/context.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
from typing import Any, cast

from ..parse_help import parse_codecs, parse_formats
from ..parse_help.schema import (
FFMpegAVOption,
FFMpegCodec,
FFMpegDecoder,
FFMpegDemuxer,
FFMpegEncoder,
FFMpegFormat,
FFMpegMuxer,
FFMpegOptionChoice,
)
from .schema import (
FFMpegAVOptionIR,
FFMpegCodecIR,
FFMpegFormatIR,
FFMpegOptionChoiceIR,
)


def convert(obj: Any) -> Any:
match obj:
case FFMpegCodec():
return FFMpegCodecIR(
name=obj.name,
help=obj.help,
options=tuple(convert(option) for option in obj.options),
is_decoder=isinstance(obj, FFMpegDecoder),
is_encoder=isinstance(obj, FFMpegEncoder),
)
case FFMpegFormat():
return FFMpegFormatIR(
name=obj.name,
help=obj.help,
options=tuple(convert(option) for option in obj.options),
is_muxer=isinstance(obj, FFMpegMuxer),
is_demuxer=isinstance(obj, FFMpegDemuxer),
)
case FFMpegAVOption():
return FFMpegAVOptionIR(
name=obj.name,
help=obj.help,
type=obj.type,
choices=tuple(convert(choice) for choice in obj.choices),
default=obj.default,
)
case FFMpegOptionChoice():
return FFMpegOptionChoiceIR(
name=obj.name,
help=obj.help,
flags=obj.flags,
value=obj.value,
)
case _:
raise ValueError(f"Unknown object: {obj}")


def all_codecs() -> list[FFMpegCodecIR]:
return cast(
list[FFMpegCodecIR], [convert(codec) for codec in parse_codecs.extract()]
)


def all_formats() -> list[FFMpegFormatIR]:
return cast(
list[FFMpegFormatIR], [convert(format) for format in parse_formats.extract()]
)
Empty file.
29 changes: 29 additions & 0 deletions src/scripts/code_gen/python/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

from pathlib import Path

import typer
from ...parse_help import parse_codecs
from .render import render
app = typer.Typer()

@app.command()
def generate(outpath: Path | None = None, rebuild: bool = False) -> None:
"""
Generate filter and option documents

Args:
outpath: The output path
rebuild: Whether to rebuild the filters and options from scratch, ignoring the cache
"""
if not outpath:
outpath = Path(__file__).parent.parent.parent / "ffmpeg"

codecs = parse_codecs.extract()

render(
)
os.system("pre-commit run -a")


if __name__ == "__main__":
app()
67 changes: 67 additions & 0 deletions src/scripts/code_gen/python/context.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from .. import context
from .schema import (
PythonFFMpegCodec,
PythonFFMpegFormat,
PythonFFMpegOption,
PythonFFMpegOptionChoice,
)


def all_codecs() -> list[PythonFFMpegCodec]:
return [
PythonFFMpegCodec(
name=codec.name,
options=tuple(
PythonFFMpegOption(
name=option.name,
type=option.type,
default=option.default,
help=option.help,
choices=tuple(
PythonFFMpegOptionChoice(
name=choice.name,
help=choice.help,
flags=choice.flags,
value=choice.value,
)
for choice in option.choices
),
)
for option in codec.options
),
help=codec.help,
is_decoder=codec.is_decoder,
is_encoder=codec.is_encoder,
)
for codec in context.all_codecs()
]


def all_formats() -> list[PythonFFMpegFormat]:
return [
PythonFFMpegFormat(
name=format.name,
options=tuple(
PythonFFMpegOption(
name=option.name,
type=option.type,
default=option.default,
help=option.help,
choices=tuple(
PythonFFMpegOptionChoice(
name=choice.name,
help=choice.help,
flags=choice.flags,
value=choice.value,
)
for choice in option.choices
),
)
for option in format.options
),
help=format.help,
is_muxer=format.is_muxer,
is_demuxer=format.is_demuxer,
)
for format in context.all_formats()
]
50 changes: 50 additions & 0 deletions src/scripts/code_gen/python/schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from dataclasses import dataclass

from ..schema import (
FFMpegAVOptionIR,
FFMpegCodecIR,
FFMpegFilterIR,
FFMpegFormatIR,
FFMpegOptionChoiceIR,
)
from .utils import option_typing, safe_name


@dataclass(frozen=True, kw_only=True)
class PythonFFMpegOptionChoice(FFMpegOptionChoiceIR): ...


@dataclass(frozen=True, kw_only=True)
class PythonFFMpegCodec(FFMpegCodecIR):
@property
def safe_name(self) -> str:
return safe_name(self.name)


@dataclass(frozen=True, kw_only=True)
class PythonFFMpegOption(FFMpegAVOptionIR):
@property
def safe_name(self) -> str:
return safe_name(self.name)

@property
def typing(self) -> str:
return option_typing(self)


@dataclass(frozen=True, kw_only=True)
class PythonFFMpegFormat(FFMpegFormatIR):
@property
def safe_name(self) -> str:
return safe_name(self.name)


@dataclass(frozen=True, kw_only=True)
class PythonFFMpegFilter(FFMpegFilterIR):
@property
def safe_name(self) -> str:
return safe_name(self.name)

@property
def return_typing(self) -> str:
raise NotImplementedError()
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from typing import Literal
from .schema import FFMpegDecoderOption
from ..utils.frozendict import FrozenDict, merge



def h264(

profile: String| Literal["baseline"] = None,

) -> FFMpegDecoderOption:
"""
H.264 video codec for encoding/decoding

Args:
profile: Set H.264 profile (baseline, main, high)

Returns:
the set codec options
"""
return FFMpegDecoderOption(kwargs=merge({

"profile": profile,

}))

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from typing import Literal
from .schema import FFMpegEncoderOption
from ..utils.frozendict import FrozenDict, merge



Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from typing import Literal
from .schema import FFMpegDemuxerOption
from ..utils.frozendict import FrozenDict, merge



Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from typing import Literal
from .schema import FFMpegMuxerOption
from ..utils.frozendict import FrozenDict, merge



def mp4(

profile: String| Literal["baseline"] = None,

) -> FFMpegMuxerOption:
"""
MP4 container format

Args:
profile: Set MP4 profile (baseline, main, high)

Returns:
the set codec options
"""
return FFMpegMuxerOption(kwargs=merge({

"profile": profile,

}))

Loading
Loading