diff --git a/pkgs/development/python-modules/av/default.nix b/pkgs/development/python-modules/av/default.nix index c79dc8b3fcb1..3ebc44d1c4d6 100644 --- a/pkgs/development/python-modules/av/default.nix +++ b/pkgs/development/python-modules/av/default.nix @@ -1,33 +1,141 @@ { lib , buildPythonPackage -, fetchPypi -, isPy27 -, numpy -, ffmpeg +, fetchFromGitHub +, pythonOlder + +# build +, cython , pkg-config + +# runtime +, ffmpeg + +# tests +, numpy +, pillow +, pytestCheckHook }: buildPythonPackage rec { pname = "av"; - version = "8.1.0"; - disabled = isPy27; # setup.py no longer compatible + version = "9.1.1"; + format = "pyproject"; + disabled = pythonOlder "3.7"; - src = fetchPypi { - inherit pname version; - sha256 = "0402169bc27e38e0f44e0e0e1854cf488337e86206b6d25d6dae2bfd7a1a0230"; + src = fetchFromGitHub { + owner = "mikeboers"; + repo = "PyAV"; + rev = "v${version}"; + hash = "sha256-/6C5GE9zANPy0xaptu/+pIupOLDra/R7TJ41YLGszUs="; }; - checkInputs = [ numpy ]; + nativeBuildInputs = [ + cython + pkg-config + ]; - nativeBuildInputs = [ pkg-config ]; - buildInputs = [ ffmpeg ]; + buildInputs = [ + ffmpeg + ]; - # Tests require downloading files from internet - doCheck = false; + preCheck = '' + # ensure we import the built version + rm -r av + ''; - meta = { + checkInputs = [ + numpy + pillow + pytestCheckHook + ]; + + pytestFlagsArray = [ + # Tests that want to download FATE data + # https://github.com/PyAV-Org/PyAV/issues/955 + "--deselect=tests/test_audiofifo.py::TestAudioFifo::test_data" + "--deselect=tests/test_codec_context.py::TestCodecContext::test_codec_tag" + "--deselect=tests/test_codec_context.py::TestCodecContext::test_parse" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_aac" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_dnxhd" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_dvvideo" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_h264" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_mjpeg" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_mp2" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_mpeg1video" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_mpeg4" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_pcm_s24le" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_png" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_tiff" + "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_xvid" + "--deselect=tests/test_decode.py::TestDecode::test_decode_audio_sample_count" + "--deselect=tests/test_decode.py::TestDecode::test_decoded_motion_vectors" + "--deselect=tests/test_decode.py::TestDecode::test_decoded_motion_vectors_no_flag" + "--deselect=tests/test_decode.py::TestDecode::test_decoded_time_base" + "--deselect=tests/test_decode.py::TestDecode::test_decoded_video_frame_count" + "--deselect=tests/test_encode.py::TestBasicAudioEncoding::test_transcode" + "--deselect=tests/test_file_probing.py::TestAudioProbe::test_container_probing" + "--deselect=tests/test_file_probing.py::TestAudioProbe::test_stream_probing" + "--deselect=tests/test_file_probing.py::TestDataProbe::test_container_probing" + "--deselect=tests/test_file_probing.py::TestDataProbe::test_stream_probing" + "--deselect=tests/test_file_probing.py::TestSubtitleProbe::test_container_probing" + "--deselect=tests/test_file_probing.py::TestSubtitleProbe::test_stream_probing" + "--deselect=tests/test_file_probing.py::TestVideoProbe::test_container_probing" + "--deselect=tests/test_file_probing.py::TestVideoProbe::test_stream_probing" + "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_buffer" + "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_buffer_no_see" + "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_file" + "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_pipe_readonly" + "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_write_readonl" + "--deselect=tests/test_seek.py::TestSeek::test_decode_half" + "--deselect=tests/test_seek.py::TestSeek::test_seek_end" + "--deselect=tests/test_seek.py::TestSeek::test_seek_float" + "--deselect=tests/test_seek.py::TestSeek::test_seek_int64" + "--deselect=tests/test_seek.py::TestSeek::test_seek_middle" + "--deselect=tests/test_seek.py::TestSeek::test_seek_start" + "--deselect=tests/test_seek.py::TestSeek::test_stream_seek" + "--deselect=tests/test_streams.py::TestStreams::test_selection" + "--deselect=tests/test_streams.py::TestStreams::test_stream_tuples" + "--deselect=tests/test_subtitles.py::TestSubtitle::test_movtext" + "--deselect=tests/test_subtitles.py::TestSubtitle::test_vobsub" + "--deselect=tests/test_videoframe.py::TestVideoFrameImage::test_roundtrip" + ]; + + disabledTestPaths = [ + # urlopen fails during DNS resolution + "tests/test_doctests.py" + "tests/test_timeout.py" + ]; + + pythonImportsCheck = [ + "av" + "av.audio" + "av.buffer" + "av.bytesource" + "av.codec" + "av.container" + "av._core" + "av.datasets" + "av.descriptor" + "av.dictionary" + "av.enum" + "av.error" + "av.filter" + "av.format" + "av.frame" + "av.logging" + "av.option" + "av.packet" + "av.plane" + "av.stream" + "av.subtitles" + "av.utils" + "av.video" + ]; + + meta = with lib; { description = "Pythonic bindings for FFmpeg/Libav"; homepage = "https://github.com/mikeboers/PyAV/"; - license = lib.licenses.bsd2; + license = licenses.bsd2; + maintainers = with maintainers; [ ]; }; }