From a30791a0360595cb35d506acd19df864282727c0 Mon Sep 17 00:00:00 2001 From: Esa Kataja Date: Thu, 17 Apr 2025 12:36:31 +0300 Subject: [PATCH] Replace Click with Typer for improved CLI argument handling --- pyproject.toml | 1 + src/app.py | 24 ++++++++++++------------ uv.lock | 29 ++++++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a75ee81..f6dc6ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,4 +10,5 @@ dependencies = [ "python-dotenv>=1.0.1", "requests>=2.32.3", "rich>=13.9.4", + "typer>=0.15.2", ] diff --git a/src/app.py b/src/app.py index 72d76ce..ab40ee7 100644 --- a/src/app.py +++ b/src/app.py @@ -1,13 +1,13 @@ import json import subprocess -import click +import typer from pathlib import Path -# from rich import print from models.streams import VideoFile, VideoStream, AudioStream, SubtitleStream from movie_details import get_movie_details from lib.fs import write_shell_script +app = typer.Typer() def parse_streams(stream_data: dict, VideoFile: VideoFile) -> VideoFile: for stream in stream_data["streams"]: @@ -23,15 +23,15 @@ def parse_streams(stream_data: dict, VideoFile: VideoFile) -> VideoFile: return VideoFile -@click.command() -@click.argument("filename", type=click.Path(exists=True)) -@click.option("-i", "--imdb", type=str, help="IMDB ID") -@click.option("-ns", "--nosubtitles", is_flag=True, help="No subtitles") -@click.option("-p", "--preset", type=int, default=2, help="Encoding preset (default: 2)") -@click.option("-c", "--crf", type=int, default=30, help="CRF value (default: 30)") -@click.option('-o', '--original-media-type', default='DVD', help='Set the ORIGINAL_MEDIA_TYPE metadata') -def main(filename: Path, imdb: str, nosubtitles: bool, preset: int, crf: int, original_media_type: str): - """Run ffprobe on a file and print the output in JSON format.""" +@app.command() +def main( + filename: Path = typer.Argument(..., exists=True, help="Input video file"), + imdb: str = typer.Option(None, "-i", "--imdb", help="IMDB ID"), + nosubtitles: bool = typer.Option(False, "-ns", "--nosubtitles", help="Remove subtitles"), + preset: int = typer.Option(2, "-p", "--preset", help="Encoding preset"), + crf: int = typer.Option(30, "-c", "--crf", help="CRF value"), + original_media_type: str = typer.Option("DVD", "-o", "--original-media-type", help="Set the ORIGINAL_MEDIA_TYPE metadata") +): video_details = VideoFile( imdb=imdb, video_path=filename, allow_subtitle=not nosubtitles ) @@ -62,4 +62,4 @@ def main(filename: Path, imdb: str, nosubtitles: bool, preset: int, crf: int, or if __name__ == "__main__": - main() + app() diff --git a/uv.lock b/uv.lock index cfd08a8..9665268 100644 --- a/uv.lock +++ b/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 1 requires-python = ">=3.12" resolution-markers = [ "python_full_version < '3.13'", @@ -67,7 +68,7 @@ name = "click" version = "8.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } wheels = [ @@ -208,6 +209,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, ] +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, +] + +[[package]] +name = "typer" +version = "0.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, +] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -236,6 +261,7 @@ dependencies = [ { name = "python-dotenv" }, { name = "requests" }, { name = "rich" }, + { name = "typer" }, ] [package.metadata] @@ -245,4 +271,5 @@ requires-dist = [ { name = "python-dotenv", specifier = ">=1.0.1" }, { name = "requests", specifier = ">=2.32.3" }, { name = "rich", specifier = ">=13.9.4" }, + { name = "typer", specifier = ">=0.15.2" }, ]