diff --git a/pkgs/development/python-modules/ffmpeg-python/default.nix b/pkgs/development/python-modules/ffmpeg-python/default.nix index 5db6107c918bc..c337d64dc7ee7 100644 --- a/pkgs/development/python-modules/ffmpeg-python/default.nix +++ b/pkgs/development/python-modules/ffmpeg-python/default.nix @@ -2,56 +2,67 @@ lib, buildPythonPackage, fetchFromGitHub, - ffmpeg_4, - future, - pytest-mock, - pytestCheckHook, - pythonAtLeast, - pythonOlder, substituteAll, + fetchpatch2, + setuptools, + pytestCheckHook, + pytest-mock, + ffmpeg_7, }: -buildPythonPackage rec { +buildPythonPackage { pname = "ffmpeg-python"; - version = "0.2.0"; - format = "setuptools"; - - disabled = pythonOlder "3.7"; + version = "0.2.0-unstable-2022-07-11"; + pyproject = true; src = fetchFromGitHub { owner = "kkroening"; repo = "ffmpeg-python"; - rev = version; - hash = "sha256-Dk3nHuYVlIiFF6nORZ5TVFkBXdoZUxLfoiz68V1tvlY="; + rev = "df129c7ba30aaa9ffffb81a48f53aa7253b0b4e6"; + hash = "sha256-jPiFhYRwfuS+vo6LsLw0+65NWy2A+B+EdC8SewZTRP4="; }; - propagatedBuildInputs = [ future ]; - - nativeCheckInputs = [ - pytestCheckHook - pytest-mock - ]; - patches = [ (substituteAll { src = ./ffmpeg-location.patch; - ffmpeg = ffmpeg_4; + ffmpeg = ffmpeg_7; + }) + + # Remove dependency on `future` + # https://github.com/kkroening/ffmpeg-python/pull/795 + (fetchpatch2 { + url = "https://github.com/kkroening/ffmpeg-python/commit/dce459d39ace25f03edbabdad1735064787568f7.patch?full_index=1"; + hash = "sha256-ZptCFplL88d0p2s741ymHiwyDsDGVFylBJ8FTrZDGMc="; + }) + + # Fix ffmpeg/tests/test_ffmpeg.py: test_pipe() (v1: ignore duplicate frames) + # https://github.com/kkroening/ffmpeg-python/pull/726 + (fetchpatch2 { + url = "https://github.com/kkroening/ffmpeg-python/commit/557ed8e81ff48c5931c9249ec4aae525347ecf85.patch?full_index=1"; + hash = "sha256-XrL9yLaBg1tu63OYZauEb/4Ghp2zHtiF6vB+1YYbv1Y="; + }) + + # Fix `test__probe` on FFmpeg 7 + # https://github.com/kkroening/ffmpeg-python/pull/848 + (fetchpatch2 { + url = "https://github.com/kkroening/ffmpeg-python/commit/eeaa83398ba1d4e5b470196f7d4c7ca4ba9e8ddf.patch?full_index=1"; + hash = "sha256-/qxez4RF/RPRr9nA+wp+XB49L3VNgnMwMQhFD2NwijU="; }) ]; - postPatch = '' - substituteInPlace setup.py \ - --replace "'pytest-runner'" "" - ''; + build-system = [ setuptools ]; - pythonImportsCheck = [ "ffmpeg" ]; + nativeCheckInputs = [ + pytestCheckHook + pytest-mock + ]; - disabledTests = lib.optionals (pythonAtLeast "3.10") [ "test__output__video_size" ]; + pythonImportsCheck = [ "ffmpeg" ]; - meta = with lib; { + meta = { description = "Python bindings for FFmpeg - with complex filtering support"; homepage = "https://github.com/kkroening/ffmpeg-python"; - license = licenses.asl20; - maintainers = [ ]; + license = lib.licenses.asl20; + maintainers = [ lib.maintainers.emily ]; }; } diff --git a/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch b/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch index a192504e12675..c29a1c3d92cb8 100644 --- a/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch +++ b/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch @@ -1,21 +1,21 @@ -diff --git i/ffmpeg/_probe.py w/ffmpeg/_probe.py -index 41e8168..eb83b54 100644 ---- i/ffmpeg/_probe.py -+++ w/ffmpeg/_probe.py -@@ -4,7 +4,7 @@ from ._run import Error +diff --git a/ffmpeg/_probe.py b/ffmpeg/_probe.py +index 090d7abf9e..07fb4d9459 100644 +--- a/ffmpeg/_probe.py ++++ b/ffmpeg/_probe.py +@@ -4,7 +4,7 @@ from ._utils import convert_kwargs_to_cmd_line_args --def probe(filename, cmd='ffprobe', **kwargs): -+def probe(filename, cmd='@ffmpeg@/bin/ffprobe', **kwargs): +-def probe(filename, cmd='ffprobe', timeout=None, **kwargs): ++def probe(filename, cmd='@ffmpeg@/bin/ffprobe', timeout=None, **kwargs): """Run ffprobe on the specified file and return a JSON representation of the output. Raises: -diff --git i/ffmpeg/_run.py w/ffmpeg/_run.py -index afc504d..9445cca 100644 ---- i/ffmpeg/_run.py -+++ w/ffmpeg/_run.py -@@ -172,7 +172,7 @@ def get_args(stream_spec, overwrite_output=False): +diff --git a/ffmpeg/_run.py b/ffmpeg/_run.py +index f42d1d7309..d3e1df9c80 100644 +--- a/ffmpeg/_run.py ++++ b/ffmpeg/_run.py +@@ -174,7 +174,7 @@ @output_operator() @@ -23,8 +23,8 @@ index afc504d..9445cca 100644 +def compile(stream_spec, cmd='@ffmpeg@/bin/ffmpeg', overwrite_output=False): """Build command-line for invoking ffmpeg. - The :meth:`run` function uses this to build the commnad line -@@ -193,7 +193,7 @@ def compile(stream_spec, cmd='ffmpeg', overwrite_output=False): + The :meth:`run` function uses this to build the command line +@@ -195,7 +195,7 @@ @output_operator() def run_async( stream_spec, @@ -33,7 +33,7 @@ index afc504d..9445cca 100644 pipe_stdin=False, pipe_stdout=False, pipe_stderr=False, -@@ -289,7 +289,7 @@ def run_async( +@@ -299,7 +299,7 @@ @output_operator() def run( stream_spec, @@ -42,11 +42,11 @@ index afc504d..9445cca 100644 capture_stdout=False, capture_stderr=False, input=None, -diff --git i/ffmpeg/tests/test_ffmpeg.py w/ffmpeg/tests/test_ffmpeg.py -index 279a323..8d3b35c 100644 ---- i/ffmpeg/tests/test_ffmpeg.py -+++ w/ffmpeg/tests/test_ffmpeg.py -@@ -24,7 +24,7 @@ TEST_OUTPUT_FILE2 = os.path.join(SAMPLE_DATA_DIR, 'out2.mp4') +diff --git a/ffmpeg/tests/test_ffmpeg.py b/ffmpeg/tests/test_ffmpeg.py +index 8dbc271a79..168e662e8d 100644 +--- a/ffmpeg/tests/test_ffmpeg.py ++++ b/ffmpeg/tests/test_ffmpeg.py +@@ -26,7 +26,7 @@ BOGUS_INPUT_FILE = os.path.join(SAMPLE_DATA_DIR, 'bogus') @@ -55,7 +55,13 @@ index 279a323..8d3b35c 100644 def test_escape_chars(): -@@ -423,7 +423,7 @@ def test_filter_text_arg_str_escape(): +@@ -450,12 +450,12 @@ + + + # def test_version(): +-# subprocess.check_call(['ffmpeg', '-version']) ++# subprocess.check_call(['@ffmpeg@/bin/ffmpeg', '-version']) + def test__compile(): out_file = ffmpeg.input('dummy.mp4').output('dummy2.mp4') @@ -64,7 +70,7 @@ index 279a323..8d3b35c 100644 assert out_file.compile(cmd='ffmpeg.old') == [ 'ffmpeg.old', '-i', -@@ -490,7 +490,7 @@ def test__run__input_output(mocker): +@@ -530,7 +530,7 @@ @pytest.mark.parametrize('capture_stdout', [True, False]) @pytest.mark.parametrize('capture_stderr', [True, False]) def test__run__error(mocker, capture_stdout, capture_stderr): @@ -73,12 +79,12 @@ index 279a323..8d3b35c 100644 stream = _get_complex_filter_example() with pytest.raises(ffmpeg.Error) as excinfo: out, err = ffmpeg.run( -@@ -684,7 +684,7 @@ def test_pipe(): +@@ -724,7 +724,7 @@ 'pipe:1', ] - cmd = ['ffmpeg'] + args + cmd = ['@ffmpeg@/bin/ffmpeg'] + args p = subprocess.Popen( - cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE - ) + cmd, + stdin=subprocess.PIPE,