ffmpeg-python
Advanced tools
| Metadata-Version: 2.1 | ||
| Name: ffmpeg-python | ||
| Version: 0.1.18 | ||
| Version: 0.2.0 | ||
| Summary: Python bindings for FFmpeg - with complex filtering support | ||
@@ -9,3 +9,3 @@ Home-page: https://github.com/kkroening/ffmpeg-python | ||
| License: UNKNOWN | ||
| Download-URL: https://github.com/kkroening/ffmpeg-python/archive/v0.1.18.zip | ||
| Download-URL: https://github.com/kkroening/ffmpeg-python/archive/v0.2.0.zip | ||
| Description: ffmpeg-python: Python bindings for FFmpeg | ||
@@ -17,3 +17,3 @@ ========================================= | ||
| Keywords: -vf,a/v,audio,dsp,FFmpeg,ffmpeg,ffprobe,filtering,filter_complex,movie,render,signals,sound,streaming,streams,vf,video,wrapper,aac,ac3,avi,bmpflac,gif,mov,mp3,mp4,png,raw,rawvideo,wav,.aac,.ac3,.avi,.bmpflac,.gif,.mov,.mp3,.mp4,.png,.raw,.rawvideo,.wav | ||
| Keywords: -vf,a/v,audio,dsp,FFmpeg,ffmpeg,ffprobe,filtering,filter_complex,movie,render,signals,sound,streaming,streams,vf,video,wrapper,aac,ac3,avi,bmp,flac,gif,mov,mp3,mp4,png,raw,rawvideo,wav,.aac,.ac3,.avi,.bmp,.flac,.gif,.mov,.mp3,.mp4,.png,.raw,.rawvideo,.wav | ||
| Platform: UNKNOWN | ||
@@ -20,0 +20,0 @@ Classifier: Intended Audience :: Developers |
@@ -5,2 +5,3 @@ future | ||
| future==0.17.1 | ||
| numpy==1.16.4 | ||
| pytest-mock==1.10.4 | ||
@@ -10,2 +11,1 @@ pytest==4.6.1 | ||
| tox==3.12.1 | ||
| twine==1.13.0 |
@@ -97,7 +97,2 @@ from __future__ import unicode_literals | ||
| __all__ = [ | ||
| 'input', | ||
| 'merge_outputs', | ||
| 'output', | ||
| 'overwrite_output', | ||
| ] | ||
| __all__ = ['input', 'merge_outputs', 'output', 'overwrite_output'] |
+17
-9
@@ -24,3 +24,5 @@ from __future__ import unicode_literals | ||
| """ | ||
| return FilterNode(stream_spec, filter_name, args=args, kwargs=kwargs, max_inputs=None) | ||
| return FilterNode( | ||
| stream_spec, filter_name, args=args, kwargs=kwargs, max_inputs=None | ||
| ) | ||
@@ -148,3 +150,8 @@ | ||
| kwargs['eof_action'] = eof_action | ||
| return FilterNode([main_parent_node, overlay_parent_node], overlay.__name__, kwargs=kwargs, max_inputs=2).stream() | ||
| return FilterNode( | ||
| [main_parent_node, overlay_parent_node], | ||
| overlay.__name__, | ||
| kwargs=kwargs, | ||
| max_inputs=2, | ||
| ).stream() | ||
@@ -185,6 +192,3 @@ | ||
| return FilterNode( | ||
| stream, | ||
| crop.__name__, | ||
| args=[width, height, x, y], | ||
| kwargs=kwargs | ||
| stream, crop.__name__, args=[width, height, x, y], kwargs=kwargs | ||
| ).stream() | ||
@@ -215,3 +219,5 @@ | ||
| kwargs['t'] = thickness | ||
| return FilterNode(stream, drawbox.__name__, args=[x, y, width, height, color], kwargs=kwargs).stream() | ||
| return FilterNode( | ||
| stream, drawbox.__name__, args=[x, y, width, height, color], kwargs=kwargs | ||
| ).stream() | ||
@@ -392,4 +398,6 @@ | ||
| raise ValueError( | ||
| 'Expected concat input streams to have length multiple of {} (v={}, a={}); got {}' | ||
| .format(stream_count, video_stream_count, audio_stream_count, len(streams))) | ||
| 'Expected concat input streams to have length multiple of {} (v={}, a={}); got {}'.format( | ||
| stream_count, video_stream_count, audio_stream_count, len(streams) | ||
| ) | ||
| ) | ||
| kwargs['n'] = int(len(streams) / stream_count) | ||
@@ -396,0 +404,0 @@ return FilterNode(streams, concat.__name__, kwargs=kwargs, max_inputs=None).stream() |
+1
-3
@@ -27,4 +27,2 @@ import json | ||
| __all__ = [ | ||
| 'probe', | ||
| ] | ||
| __all__ = ['probe'] |
+50
-26
@@ -11,6 +11,3 @@ from __future__ import unicode_literals | ||
| from ._ffmpeg import ( | ||
| input, | ||
| output, | ||
| ) | ||
| from ._ffmpeg import input, output | ||
| from .nodes import ( | ||
@@ -28,3 +25,5 @@ get_stream_spec_nodes, | ||
| def __init__(self, cmd, stdout, stderr): | ||
| super(Error, self).__init__('{} error (see stderr output for detail)'.format(cmd)) | ||
| super(Error, self).__init__( | ||
| '{} error (see stderr output for detail)'.format(cmd) | ||
| ) | ||
| self.stdout = stdout | ||
@@ -74,5 +73,11 @@ self.stderr = stderr | ||
| outgoing_edges = get_outgoing_edges(node, outgoing_edge_map) | ||
| inputs = [_format_input_stream_name(stream_name_map, edge) for edge in incoming_edges] | ||
| outputs = [_format_output_stream_name(stream_name_map, edge) for edge in outgoing_edges] | ||
| filter_spec = '{}{}{}'.format(''.join(inputs), node._get_filter(outgoing_edges), ''.join(outputs)) | ||
| inputs = [ | ||
| _format_input_stream_name(stream_name_map, edge) for edge in incoming_edges | ||
| ] | ||
| outputs = [ | ||
| _format_output_stream_name(stream_name_map, edge) for edge in outgoing_edges | ||
| ] | ||
| filter_spec = '{}{}{}'.format( | ||
| ''.join(inputs), node._get_filter(outgoing_edges), ''.join(outputs) | ||
| ) | ||
| return filter_spec | ||
@@ -85,3 +90,3 @@ | ||
| outgoing_edge_map = outgoing_edge_maps[upstream_node] | ||
| for upstream_label, downstreams in list(outgoing_edge_map.items()): | ||
| for upstream_label, downstreams in sorted(outgoing_edge_map.items()): | ||
| if len(downstreams) > 1: | ||
@@ -91,3 +96,6 @@ # TODO: automatically insert `splits` ahead of time via graph transformation. | ||
| 'Encountered {} with multiple outgoing edges with same upstream label {!r}; a ' | ||
| '`split` filter is probably required'.format(upstream_node, upstream_label)) | ||
| '`split` filter is probably required'.format( | ||
| upstream_node, upstream_label | ||
| ) | ||
| ) | ||
| stream_name_map[upstream_node, upstream_label] = 's{}'.format(stream_count) | ||
@@ -99,3 +107,6 @@ stream_count += 1 | ||
| _allocate_filter_stream_names(filter_nodes, outgoing_edge_maps, stream_name_map) | ||
| filter_specs = [_get_filter_spec(node, outgoing_edge_maps[node], stream_name_map) for node in filter_nodes] | ||
| filter_specs = [ | ||
| _get_filter_spec(node, outgoing_edge_maps[node], stream_name_map) | ||
| for node in filter_nodes | ||
| ] | ||
| return ';'.join(filter_specs) | ||
@@ -118,3 +129,5 @@ | ||
| # edge = node.incoming_edges[0] | ||
| stream_name = _format_input_stream_name(stream_name_map, edge, is_final_arg=True) | ||
| stream_name = _format_input_stream_name( | ||
| stream_name_map, edge, is_final_arg=True | ||
| ) | ||
| if stream_name != '0' or len(node.incoming_edges) > 1: | ||
@@ -133,3 +146,5 @@ args += ['-map', stream_name] | ||
| video_size = kwargs.pop('video_size') | ||
| if not isinstance(video_size, basestring) and isinstance(video_size, collections.Iterable): | ||
| if not isinstance(video_size, basestring) and isinstance( | ||
| video_size, collections.Iterable | ||
| ): | ||
| video_size = '{}x{}'.format(video_size[0], video_size[1]) | ||
@@ -158,3 +173,5 @@ args += ['-video_size', video_size] | ||
| args += ['-filter_complex', filter_arg] | ||
| args += reduce(operator.add, [_get_output_args(node, stream_name_map) for node in output_nodes]) | ||
| args += reduce( | ||
| operator.add, [_get_output_args(node, stream_name_map) for node in output_nodes] | ||
| ) | ||
| args += reduce(operator.add, [_get_global_args(node) for node in global_nodes], []) | ||
@@ -187,4 +204,10 @@ if overwrite_output: | ||
| def run_async( | ||
| stream_spec, cmd='ffmpeg', pipe_stdin=False, pipe_stdout=False, pipe_stderr=False, | ||
| quiet=False, overwrite_output=False): | ||
| stream_spec, | ||
| cmd='ffmpeg', | ||
| pipe_stdin=False, | ||
| pipe_stdout=False, | ||
| pipe_stderr=False, | ||
| quiet=False, | ||
| overwrite_output=False, | ||
| ): | ||
| """Asynchronously invoke ffmpeg for the supplied node graph. | ||
@@ -272,3 +295,4 @@ | ||
| return subprocess.Popen( | ||
| args, stdin=stdin_stream, stdout=stdout_stream, stderr=stderr_stream) | ||
| args, stdin=stdin_stream, stdout=stdout_stream, stderr=stderr_stream | ||
| ) | ||
@@ -278,4 +302,10 @@ | ||
| def run( | ||
| stream_spec, cmd='ffmpeg', capture_stdout=False, capture_stderr=False, input=None, | ||
| quiet=False, overwrite_output=False): | ||
| stream_spec, | ||
| cmd='ffmpeg', | ||
| capture_stdout=False, | ||
| capture_stderr=False, | ||
| input=None, | ||
| quiet=False, | ||
| overwrite_output=False, | ||
| ): | ||
| """Invoke ffmpeg for the supplied node graph. | ||
@@ -311,8 +341,2 @@ | ||
| __all__ = [ | ||
| 'compile', | ||
| 'Error', | ||
| 'get_args', | ||
| 'run', | ||
| 'run_async', | ||
| ] | ||
| __all__ = ['compile', 'Error', 'get_args', 'run', 'run_async'] |
+7
-1
@@ -37,4 +37,7 @@ from __future__ import unicode_literals | ||
| if sys.version_info.major >= 3: | ||
| class basestring(with_metaclass(BaseBaseString)): | ||
| pass | ||
| else: | ||
@@ -56,3 +59,6 @@ # noinspection PyUnresolvedReferences,PyCompatibility | ||
| elif isinstance(item, dict): | ||
| kv_pairs = ['{}: {}'.format(_recursive_repr(k), _recursive_repr(item[k])) for k in sorted(item)] | ||
| kv_pairs = [ | ||
| '{}: {}'.format(_recursive_repr(k), _recursive_repr(item[k])) | ||
| for k in sorted(item) | ||
| ] | ||
| result = '{' + ', '.join(kv_pairs) + '}' | ||
@@ -59,0 +65,0 @@ else: |
+19
-9
@@ -37,4 +37,6 @@ from __future__ import unicode_literals | ||
| except ImportError: | ||
| raise ImportError('failed to import graphviz; please make sure graphviz is installed (e.g. `pip install ' | ||
| 'graphviz`)') | ||
| raise ImportError( | ||
| 'failed to import graphviz; please make sure graphviz is installed (e.g. `pip install ' | ||
| 'graphviz`)' | ||
| ) | ||
@@ -53,3 +55,5 @@ show_labels = kwargs.pop('show_labels', True) | ||
| if len(list(kwargs.keys())) != 0: | ||
| raise ValueError('Invalid kwargs key(s): {}'.format(', '.join(list(kwargs.keys())))) | ||
| raise ValueError( | ||
| 'Invalid kwargs key(s): {}'.format(', '.join(list(kwargs.keys()))) | ||
| ) | ||
@@ -62,7 +66,11 @@ for node in sorted_nodes: | ||
| lines += ['{!r}'.format(arg) for arg in node.args] | ||
| lines += ['{}={!r}'.format(key, node.kwargs[key]) for key in sorted(node.kwargs)] | ||
| lines += [ | ||
| '{}={!r}'.format(key, node.kwargs[key]) for key in sorted(node.kwargs) | ||
| ] | ||
| node_text = '\n'.join(lines) | ||
| else: | ||
| node_text = node.short_repr | ||
| graph.node(str(hash(node)), node_text, shape='box', style='filled', fillcolor=color) | ||
| graph.node( | ||
| str(hash(node)), node_text, shape='box', style='filled', fillcolor=color | ||
| ) | ||
| outgoing_edge_map = outgoing_edge_maps.get(node, {}) | ||
@@ -76,3 +84,7 @@ | ||
| if show_labels and (up_label is not None or down_label is not None or up_selector is not None): | ||
| if show_labels and ( | ||
| up_label is not None | ||
| or down_label is not None | ||
| or up_selector is not None | ||
| ): | ||
| if up_label is None: | ||
@@ -100,4 +112,2 @@ up_label = '' | ||
| __all__ = [ | ||
| 'view', | ||
| ] | ||
| __all__ = ['view'] |
+58
-9
@@ -73,3 +73,12 @@ from __future__ import unicode_literals | ||
| DagEdge = namedtuple('DagEdge', ['downstream_node', 'downstream_label', 'upstream_node', 'upstream_label', 'upstream_selector']) | ||
| DagEdge = namedtuple( | ||
| 'DagEdge', | ||
| [ | ||
| 'downstream_node', | ||
| 'downstream_label', | ||
| 'upstream_node', | ||
| 'upstream_label', | ||
| 'upstream_selector', | ||
| ], | ||
| ) | ||
@@ -81,3 +90,11 @@ | ||
| upstream_node, upstream_label, upstream_selector = upstream_info | ||
| edges += [DagEdge(downstream_node, downstream_label, upstream_node, upstream_label, upstream_selector)] | ||
| edges += [ | ||
| DagEdge( | ||
| downstream_node, | ||
| downstream_label, | ||
| upstream_node, | ||
| upstream_label, | ||
| upstream_selector, | ||
| ) | ||
| ] | ||
| return edges | ||
@@ -88,6 +105,14 @@ | ||
| edges = [] | ||
| for upstream_label, downstream_infos in list(outgoing_edge_map.items()): | ||
| for upstream_label, downstream_infos in sorted(outgoing_edge_map.items()): | ||
| for downstream_info in downstream_infos: | ||
| downstream_node, downstream_label, downstream_selector = downstream_info | ||
| edges += [DagEdge(downstream_node, downstream_label, upstream_node, upstream_label, downstream_selector)] | ||
| edges += [ | ||
| DagEdge( | ||
| downstream_node, | ||
| downstream_label, | ||
| upstream_node, | ||
| upstream_label, | ||
| downstream_selector, | ||
| ) | ||
| ] | ||
| return edges | ||
@@ -105,3 +130,11 @@ | ||
| upstream_node, upstream_label, upstream_selector = upstream_info | ||
| hashes += [hash(x) for x in [downstream_label, upstream_node, upstream_label, upstream_selector]] | ||
| hashes += [ | ||
| hash(x) | ||
| for x in [ | ||
| downstream_label, | ||
| upstream_node, | ||
| upstream_label, | ||
| upstream_selector, | ||
| ] | ||
| ] | ||
| return hashes | ||
@@ -137,3 +170,5 @@ | ||
| formatted_props = ['{!r}'.format(arg) for arg in self.args] | ||
| formatted_props += ['{}={!r}'.format(key, self.kwargs[key]) for key in sorted(self.kwargs)] | ||
| formatted_props += [ | ||
| '{}={!r}'.format(key, self.kwargs[key]) for key in sorted(self.kwargs) | ||
| ] | ||
| out = '{}({})'.format(self.name, ', '.join(formatted_props)) | ||
@@ -165,3 +200,9 @@ if include_hash: | ||
| def visit(upstream_node, upstream_label, downstream_node, downstream_label, downstream_selector=None): | ||
| def visit( | ||
| upstream_node, | ||
| upstream_label, | ||
| downstream_node, | ||
| downstream_label, | ||
| downstream_selector=None, | ||
| ): | ||
| if upstream_node in marked_nodes: | ||
@@ -173,3 +214,5 @@ raise RuntimeError('Graph is not a DAG') | ||
| outgoing_edge_infos = outgoing_edge_map.get(upstream_label, []) | ||
| outgoing_edge_infos += [(downstream_node, downstream_label, downstream_selector)] | ||
| outgoing_edge_infos += [ | ||
| (downstream_node, downstream_label, downstream_selector) | ||
| ] | ||
| outgoing_edge_map[upstream_label] = outgoing_edge_infos | ||
@@ -181,3 +224,9 @@ outgoing_edge_maps[upstream_node] = outgoing_edge_map | ||
| for edge in upstream_node.incoming_edges: | ||
| visit(edge.upstream_node, edge.upstream_label, edge.downstream_node, edge.downstream_label, edge.upstream_selector) | ||
| visit( | ||
| edge.upstream_node, | ||
| edge.upstream_label, | ||
| edge.downstream_node, | ||
| edge.downstream_label, | ||
| edge.upstream_selector, | ||
| ) | ||
| marked_nodes.remove(upstream_node) | ||
@@ -184,0 +233,0 @@ sorted_nodes.append(upstream_node) |
+57
-23
@@ -26,6 +26,11 @@ from __future__ import unicode_literals | ||
| def __init__(self, upstream_node, upstream_label, node_types, upstream_selector=None): | ||
| def __init__( | ||
| self, upstream_node, upstream_label, node_types, upstream_selector=None | ||
| ): | ||
| if not _is_of_types(upstream_node, node_types): | ||
| raise TypeError('Expected upstream node to be of one of the following type(s): {}; got {}'.format( | ||
| _get_types_str(node_types), type(upstream_node))) | ||
| raise TypeError( | ||
| 'Expected upstream node to be of one of the following type(s): {}; got {}'.format( | ||
| _get_types_str(node_types), type(upstream_node) | ||
| ) | ||
| ) | ||
| self.node = upstream_node | ||
@@ -46,3 +51,5 @@ self.label = upstream_label | ||
| selector = ':{}'.format(self.selector) | ||
| out = '{}[{!r}{}] <{}>'.format(node_repr, self.label, selector, self.node.short_hash) | ||
| out = '{}[{!r}{}] <{}>'.format( | ||
| node_repr, self.label, selector, self.node.short_hash | ||
| ) | ||
| return out | ||
@@ -151,5 +158,13 @@ | ||
| if min_inputs is not None and len(stream_map) < min_inputs: | ||
| raise ValueError('Expected at least {} input stream(s); got {}'.format(min_inputs, len(stream_map))) | ||
| raise ValueError( | ||
| 'Expected at least {} input stream(s); got {}'.format( | ||
| min_inputs, len(stream_map) | ||
| ) | ||
| ) | ||
| elif max_inputs is not None and len(stream_map) > max_inputs: | ||
| raise ValueError('Expected at most {} input stream(s); got {}'.format(max_inputs, len(stream_map))) | ||
| raise ValueError( | ||
| 'Expected at most {} input stream(s); got {}'.format( | ||
| max_inputs, len(stream_map) | ||
| ) | ||
| ) | ||
@@ -160,4 +175,7 @@ @classmethod | ||
| if not _is_of_types(stream, incoming_stream_types): | ||
| raise TypeError('Expected incoming stream(s) to be of one of the following types: {}; got {}' | ||
| .format(_get_types_str(incoming_stream_types), type(stream))) | ||
| raise TypeError( | ||
| 'Expected incoming stream(s) to be of one of the following types: {}; got {}'.format( | ||
| _get_types_str(incoming_stream_types), type(stream) | ||
| ) | ||
| ) | ||
@@ -168,7 +186,20 @@ @classmethod | ||
| for downstream_label, upstream in list(stream_map.items()): | ||
| incoming_edge_map[downstream_label] = (upstream.node, upstream.label, upstream.selector) | ||
| incoming_edge_map[downstream_label] = ( | ||
| upstream.node, | ||
| upstream.label, | ||
| upstream.selector, | ||
| ) | ||
| return incoming_edge_map | ||
| def __init__(self, stream_spec, name, incoming_stream_types, outgoing_stream_type, min_inputs, | ||
| max_inputs, args=[], kwargs={}): | ||
| def __init__( | ||
| self, | ||
| stream_spec, | ||
| name, | ||
| incoming_stream_types, | ||
| outgoing_stream_type, | ||
| min_inputs, | ||
| max_inputs, | ||
| args=[], | ||
| kwargs={}, | ||
| ): | ||
| stream_map = get_stream_map(stream_spec) | ||
@@ -211,4 +242,5 @@ self.__check_input_len(stream_map, min_inputs, max_inputs) | ||
| def __init__(self, upstream_node, upstream_label, upstream_selector=None): | ||
| super(FilterableStream, self).__init__(upstream_node, upstream_label, {InputNode, FilterNode}, | ||
| upstream_selector) | ||
| super(FilterableStream, self).__init__( | ||
| upstream_node, upstream_label, {InputNode, FilterNode}, upstream_selector | ||
| ) | ||
@@ -229,3 +261,3 @@ | ||
| args=args, | ||
| kwargs=kwargs | ||
| kwargs=kwargs, | ||
| ) | ||
@@ -249,3 +281,3 @@ | ||
| args=args, | ||
| kwargs=kwargs | ||
| kwargs=kwargs, | ||
| ) | ||
@@ -290,3 +322,3 @@ | ||
| args=args, | ||
| kwargs=kwargs | ||
| kwargs=kwargs, | ||
| ) | ||
@@ -301,4 +333,8 @@ | ||
| def __init__(self, upstream_node, upstream_label, upstream_selector=None): | ||
| super(OutputStream, self).__init__(upstream_node, upstream_label, {OutputNode, GlobalNode, MergeOutputsNode}, | ||
| upstream_selector=upstream_selector) | ||
| super(OutputStream, self).__init__( | ||
| upstream_node, | ||
| upstream_label, | ||
| {OutputNode, GlobalNode, MergeOutputsNode}, | ||
| upstream_selector=upstream_selector, | ||
| ) | ||
@@ -315,3 +351,3 @@ | ||
| min_inputs=1, | ||
| max_inputs=None | ||
| max_inputs=None, | ||
| ) | ||
@@ -331,3 +367,3 @@ | ||
| args=args, | ||
| kwargs=kwargs | ||
| kwargs=kwargs, | ||
| ) | ||
@@ -353,4 +389,2 @@ | ||
| __all__ = [ | ||
| 'Stream', | ||
| ] | ||
| __all__ = ['Stream'] |
+3
-3
| Metadata-Version: 2.1 | ||
| Name: ffmpeg-python | ||
| Version: 0.1.18 | ||
| Version: 0.2.0 | ||
| Summary: Python bindings for FFmpeg - with complex filtering support | ||
@@ -9,3 +9,3 @@ Home-page: https://github.com/kkroening/ffmpeg-python | ||
| License: UNKNOWN | ||
| Download-URL: https://github.com/kkroening/ffmpeg-python/archive/v0.1.18.zip | ||
| Download-URL: https://github.com/kkroening/ffmpeg-python/archive/v0.2.0.zip | ||
| Description: ffmpeg-python: Python bindings for FFmpeg | ||
@@ -17,3 +17,3 @@ ========================================= | ||
| Keywords: -vf,a/v,audio,dsp,FFmpeg,ffmpeg,ffprobe,filtering,filter_complex,movie,render,signals,sound,streaming,streams,vf,video,wrapper,aac,ac3,avi,bmpflac,gif,mov,mp3,mp4,png,raw,rawvideo,wav,.aac,.ac3,.avi,.bmpflac,.gif,.mov,.mp3,.mp4,.png,.raw,.rawvideo,.wav | ||
| Keywords: -vf,a/v,audio,dsp,FFmpeg,ffmpeg,ffprobe,filtering,filter_complex,movie,render,signals,sound,streaming,streams,vf,video,wrapper,aac,ac3,avi,bmp,flac,gif,mov,mp3,mp4,png,raw,rawvideo,wav,.aac,.ac3,.avi,.bmp,.flac,.gif,.mov,.mp3,.mp4,.png,.raw,.rawvideo,.wav | ||
| Platform: UNKNOWN | ||
@@ -20,0 +20,0 @@ Classifier: Intended Audience :: Developers |
+2
-0
@@ -243,2 +243,4 @@ # ffmpeg-python: Python bindings for FFmpeg | ||
| - [Fabrice Bellard](https://bellard.org/) | ||
| - [The FFmpeg team](https://ffmpeg.org/donations.html) | ||
| - [Arne de Laat](https://github.com/153957) | ||
@@ -245,0 +247,0 @@ - [Davide Depau](https://github.com/depau) |
+11
-7
| from setuptools import setup | ||
| from textwrap import dedent | ||
| version = '0.1.18' | ||
| download_url = 'https://github.com/kkroening/ffmpeg-python/archive/v{}.zip'.format(version) | ||
| version = '0.2.0' | ||
| download_url = 'https://github.com/kkroening/ffmpeg-python/archive/v{}.zip'.format( | ||
| version | ||
| ) | ||
| long_description = dedent("""\ | ||
| long_description = dedent( | ||
| '''\ | ||
| ffmpeg-python: Python bindings for FFmpeg | ||
@@ -13,3 +16,4 @@ ========================================= | ||
| :API Reference: https://kkroening.github.io/ffmpeg-python/ | ||
| """) | ||
| ''' | ||
| ) | ||
@@ -21,3 +25,3 @@ | ||
| 'avi', | ||
| 'bmp' | ||
| 'bmp', | ||
| 'flac', | ||
@@ -75,2 +79,3 @@ 'gif', | ||
| 'future==0.17.1', | ||
| 'numpy==1.16.4', | ||
| 'pytest-mock==1.10.4', | ||
@@ -80,4 +85,3 @@ 'pytest==4.6.1', | ||
| 'tox==3.12.1', | ||
| 'twine==1.13.0', | ||
| ], | ||
| ] | ||
| }, | ||
@@ -84,0 +88,0 @@ classifiers=[ |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
80394
2.06%1516
8.99%