mirror of
https://github.com/kkroening/ffmpeg-python.git
synced 2025-08-30 02:30:02 +08:00
Import ABC from collections.abc for Python 3.9+ compatibility (#330)
* Import ABC from collections.abc instead of collections for Python 3.9 compatibility. * Fix deprecation warnings due to invalid escape sequences. * Support Python 3.10 Co-authored-by: Karl Kroening <karlk@kralnet.us>
This commit is contained in:
parent
cb9d400467
commit
6189cd6861
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@ -15,7 +15,7 @@ jobs:
|
|||||||
- "3.7"
|
- "3.7"
|
||||||
- "3.8"
|
- "3.8"
|
||||||
- "3.9"
|
- "3.9"
|
||||||
# - "3.10" # FIXME: broken due to `collections.Iterable` issue; see #330 / #624 / etc.
|
- "3.10"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
@ -27,10 +27,10 @@ parser.add_argument('--start-time', type=float, help='Start time (seconds)')
|
|||||||
parser.add_argument('--end-time', type=float, help='End time (seconds)')
|
parser.add_argument('--end-time', type=float, help='End time (seconds)')
|
||||||
parser.add_argument('-v', dest='verbose', action='store_true', help='Verbose mode')
|
parser.add_argument('-v', dest='verbose', action='store_true', help='Verbose mode')
|
||||||
|
|
||||||
silence_start_re = re.compile(' silence_start: (?P<start>[0-9]+(\.?[0-9]*))$')
|
silence_start_re = re.compile(r' silence_start: (?P<start>[0-9]+(\.?[0-9]*))$')
|
||||||
silence_end_re = re.compile(' silence_end: (?P<end>[0-9]+(\.?[0-9]*)) ')
|
silence_end_re = re.compile(r' silence_end: (?P<end>[0-9]+(\.?[0-9]*)) ')
|
||||||
total_duration_re = re.compile(
|
total_duration_re = re.compile(
|
||||||
'size=[^ ]+ time=(?P<hours>[0-9]{2}):(?P<minutes>[0-9]{2}):(?P<seconds>[0-9\.]{5}) bitrate=')
|
r'size=[^ ]+ time=(?P<hours>[0-9]{2}):(?P<minutes>[0-9]{2}):(?P<seconds>[0-9\.]{5}) bitrate=')
|
||||||
|
|
||||||
|
|
||||||
def _logged_popen(cmd_line, *args, **kwargs):
|
def _logged_popen(cmd_line, *args, **kwargs):
|
||||||
|
@ -3,7 +3,6 @@ from .dag import get_outgoing_edges, topo_sort
|
|||||||
from ._utils import basestring, convert_kwargs_to_cmd_line_args
|
from ._utils import basestring, convert_kwargs_to_cmd_line_args
|
||||||
from builtins import str
|
from builtins import str
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
import collections
|
|
||||||
import copy
|
import copy
|
||||||
import operator
|
import operator
|
||||||
import subprocess
|
import subprocess
|
||||||
@ -18,6 +17,11 @@ from .nodes import (
|
|||||||
output_operator,
|
output_operator,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
from collections.abc import Iterable
|
||||||
|
except ImportError:
|
||||||
|
from collections import Iterable
|
||||||
|
|
||||||
|
|
||||||
class Error(Exception):
|
class Error(Exception):
|
||||||
def __init__(self, cmd, stdout, stderr):
|
def __init__(self, cmd, stdout, stderr):
|
||||||
@ -136,9 +140,7 @@ def _get_output_args(node, stream_name_map):
|
|||||||
args += ['-b:a', str(kwargs.pop('audio_bitrate'))]
|
args += ['-b:a', str(kwargs.pop('audio_bitrate'))]
|
||||||
if 'video_size' in kwargs:
|
if 'video_size' in kwargs:
|
||||||
video_size = kwargs.pop('video_size')
|
video_size = kwargs.pop('video_size')
|
||||||
if not isinstance(video_size, basestring) and isinstance(
|
if not isinstance(video_size, basestring) and isinstance(video_size, Iterable):
|
||||||
video_size, collections.Iterable
|
|
||||||
):
|
|
||||||
video_size = '{}x{}'.format(video_size[0], video_size[1])
|
video_size = '{}x{}'.format(video_size[0], video_size[1])
|
||||||
args += ['-video_size', video_size]
|
args += ['-video_size', video_size]
|
||||||
args += convert_kwargs_to_cmd_line_args(kwargs)
|
args += convert_kwargs_to_cmd_line_args(kwargs)
|
||||||
|
@ -3,13 +3,17 @@ from builtins import str
|
|||||||
from past.builtins import basestring
|
from past.builtins import basestring
|
||||||
import hashlib
|
import hashlib
|
||||||
import sys
|
import sys
|
||||||
import collections
|
|
||||||
|
|
||||||
|
|
||||||
if sys.version_info.major == 2:
|
if sys.version_info.major == 2:
|
||||||
# noinspection PyUnresolvedReferences,PyShadowingBuiltins
|
# noinspection PyUnresolvedReferences,PyShadowingBuiltins
|
||||||
str = str
|
str = str
|
||||||
|
|
||||||
|
try:
|
||||||
|
from collections.abc import Iterable
|
||||||
|
except ImportError:
|
||||||
|
from collections import Iterable
|
||||||
|
|
||||||
|
|
||||||
# `past.builtins.basestring` module can't be imported on Python3 in some environments (Ubuntu).
|
# `past.builtins.basestring` module can't be imported on Python3 in some environments (Ubuntu).
|
||||||
# This code is copy-pasted from it to avoid crashes.
|
# This code is copy-pasted from it to avoid crashes.
|
||||||
@ -92,7 +96,7 @@ def convert_kwargs_to_cmd_line_args(kwargs):
|
|||||||
args = []
|
args = []
|
||||||
for k in sorted(kwargs.keys()):
|
for k in sorted(kwargs.keys()):
|
||||||
v = kwargs[k]
|
v = kwargs[k]
|
||||||
if isinstance(v, collections.Iterable) and not isinstance(v, str):
|
if isinstance(v, Iterable) and not isinstance(v, str):
|
||||||
for value in v:
|
for value in v:
|
||||||
args.append('-{}'.format(k))
|
args.append('-{}'.format(k))
|
||||||
if value is not None:
|
if value is not None:
|
||||||
|
@ -30,7 +30,7 @@ subprocess.check_call(['ffmpeg', '-version'])
|
|||||||
|
|
||||||
|
|
||||||
def test_escape_chars():
|
def test_escape_chars():
|
||||||
assert ffmpeg._utils.escape_chars('a:b', ':') == 'a\:b'
|
assert ffmpeg._utils.escape_chars('a:b', ':') == r'a\:b'
|
||||||
assert ffmpeg._utils.escape_chars('a\\:b', ':\\') == 'a\\\\\\:b'
|
assert ffmpeg._utils.escape_chars('a\\:b', ':\\') == 'a\\\\\\:b'
|
||||||
assert (
|
assert (
|
||||||
ffmpeg._utils.escape_chars('a:b,c[d]e%{}f\'g\'h\\i', '\\\':,[]%')
|
ffmpeg._utils.escape_chars('a:b,c[d]e%{}f\'g\'h\\i', '\\\':,[]%')
|
||||||
|
4
setup.py
4
setup.py
@ -92,5 +92,9 @@ setup(
|
|||||||
'Programming Language :: Python :: 3.4',
|
'Programming Language :: Python :: 3.4',
|
||||||
'Programming Language :: Python :: 3.5',
|
'Programming Language :: Python :: 3.5',
|
||||||
'Programming Language :: Python :: 3.6',
|
'Programming Language :: Python :: 3.6',
|
||||||
|
'Programming Language :: Python :: 3.7',
|
||||||
|
'Programming Language :: Python :: 3.8',
|
||||||
|
'Programming Language :: Python :: 3.9',
|
||||||
|
'Programming Language :: Python :: 3.10',
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
3
tox.ini
3
tox.ini
@ -4,7 +4,7 @@
|
|||||||
# and then run "tox" from this directory.
|
# and then run "tox" from this directory.
|
||||||
|
|
||||||
[tox]
|
[tox]
|
||||||
envlist = py27, py35, py36, py37, py38, py39
|
envlist = py27, py35, py36, py37, py38, py39, py310
|
||||||
|
|
||||||
[gh-actions]
|
[gh-actions]
|
||||||
python =
|
python =
|
||||||
@ -14,6 +14,7 @@ python =
|
|||||||
3.7: py37
|
3.7: py37
|
||||||
3.8: py38
|
3.8: py38
|
||||||
3.9: py39
|
3.9: py39
|
||||||
|
3.10: py310
|
||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
commands = py.test -vv
|
commands = py.test -vv
|
||||||
|
Loading…
x
Reference in New Issue
Block a user