|
25 | 25 | import os |
26 | 26 | from pathlib import Path |
27 | 27 | import platform |
| 28 | +import shutil |
28 | 29 | import subprocess |
29 | 30 | import sys |
30 | 31 | from tempfile import TemporaryDirectory |
@@ -408,27 +409,9 @@ def bin_path(cls): |
408 | 409 | @classmethod |
409 | 410 | def isAvailable(cls): |
410 | 411 | ''' |
411 | | - Check to see if a MovieWriter subclass is actually available by |
412 | | - running the commandline tool. |
| 412 | + Check to see if a MovieWriter subclass is actually available. |
413 | 413 | ''' |
414 | | - bin_path = cls.bin_path() |
415 | | - if not bin_path: |
416 | | - return False |
417 | | - try: |
418 | | - p = subprocess.Popen( |
419 | | - bin_path, |
420 | | - shell=False, |
421 | | - stdout=subprocess.PIPE, |
422 | | - stderr=subprocess.PIPE, |
423 | | - creationflags=subprocess_creation_flags) |
424 | | - return cls._handle_subprocess(p) |
425 | | - except OSError: |
426 | | - return False |
427 | | - |
428 | | - @classmethod |
429 | | - def _handle_subprocess(cls, process): |
430 | | - process.communicate() |
431 | | - return True |
| 414 | + return shutil.which(cls.bin_path()) is not None |
432 | 415 |
|
433 | 416 |
|
434 | 417 | class FileMovieWriter(MovieWriter): |
@@ -633,13 +616,14 @@ def output_args(self): |
633 | 616 | return args + ['-y', self.outfile] |
634 | 617 |
|
635 | 618 | @classmethod |
636 | | - def _handle_subprocess(cls, process): |
637 | | - _, err = process.communicate() |
638 | | - # Ubuntu 12.04 ships a broken ffmpeg binary which we shouldn't use |
639 | | - # NOTE : when removed, remove the same method in AVConvBase. |
640 | | - if 'Libav' in err.decode(): |
641 | | - return False |
642 | | - return True |
| 619 | + def isAvailable(cls): |
| 620 | + return ( |
| 621 | + super().isAvailable() |
| 622 | + # Ubuntu 12.04 ships a broken ffmpeg binary which we shouldn't use. |
| 623 | + # NOTE: when removed, remove the same method in AVConvBase. |
| 624 | + and b'LibAv' not in subprocess.run( |
| 625 | + [cls.bin_path()], creationflags=subprocess_creation_flags, |
| 626 | + stdout=subprocess.DEVNULL, stderr=subprocess.PIPE).stderr) |
643 | 627 |
|
644 | 628 |
|
645 | 629 | # Combine FFMpeg options with pipe-based writing |
@@ -697,9 +681,7 @@ class AVConvBase(FFMpegBase): |
697 | 681 | args_key = 'animation.avconv_args' |
698 | 682 |
|
699 | 683 | # NOTE : should be removed when the same method is removed in FFMpegBase. |
700 | | - @classmethod |
701 | | - def _handle_subprocess(cls, process): |
702 | | - return MovieWriter._handle_subprocess(process) |
| 684 | + isAvailable = classmethod(MovieWriter.isAvailable.__func__) |
703 | 685 |
|
704 | 686 |
|
705 | 687 | # Combine AVConv options with pipe-based writing |
@@ -772,8 +754,6 @@ def isAvailable(cls): |
772 | 754 | cls._init_from_registry() |
773 | 755 | return super().isAvailable() |
774 | 756 |
|
775 | | -ImageMagickBase._init_from_registry() |
776 | | - |
777 | 757 |
|
778 | 758 | # Note: the base classes need to be in that order to get |
779 | 759 | # isAvailable() from ImageMagickBase called and not the |
|
0 commit comments