better-ffmpeg-progress 4.0.1__tar.gz → 5.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/PKG-INFO +5 -9
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/README.md +4 -8
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/better_ffmpeg_progress.py +31 -29
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/terminate_process.py +2 -2
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress.egg-info/PKG-INFO +5 -9
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/setup.py +1 -1
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/LICENSE +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/__init__.py +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/enums.py +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/exceptions.py +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/progress_bars.py +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/utils.py +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress.egg-info/SOURCES.txt +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress.egg-info/dependency_links.txt +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress.egg-info/requires.txt +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress.egg-info/top_level.txt +0 -0
- {better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: better-ffmpeg-progress
|
|
3
|
-
Version:
|
|
3
|
+
Version: 5.0.0
|
|
4
4
|
Summary: Run FFmpeg & see percentage progress + ETA.
|
|
5
5
|
Home-page: https://github.com/CrypticSignal/better-ffmpeg-progress
|
|
6
6
|
Author: GitHub.com/CrypticSignal
|
|
@@ -61,13 +61,13 @@ from better_ffmpeg_progress import FfmpegProcess, FfmpegProcessError
|
|
|
61
61
|
command = [
|
|
62
62
|
"ffmpeg",
|
|
63
63
|
"-i",
|
|
64
|
-
"https://
|
|
65
|
-
"-
|
|
64
|
+
"https://media.xiph.org/video/derf/y4m/ducks_take_off_1080p50.y4m",
|
|
65
|
+
"-map",
|
|
66
|
+
"0:V",
|
|
67
|
+
"-c:V",
|
|
66
68
|
"libx264",
|
|
67
69
|
"-preset",
|
|
68
70
|
"ultrafast",
|
|
69
|
-
"-c:a",
|
|
70
|
-
"copy",
|
|
71
71
|
"-f",
|
|
72
72
|
"null",
|
|
73
73
|
"-",
|
|
@@ -78,11 +78,7 @@ try:
|
|
|
78
78
|
# Uncomment the line below if you want to use tqdm instead of rich for the progress bar
|
|
79
79
|
# process.use_tqdm = True
|
|
80
80
|
|
|
81
|
-
# Run the FFmpeg command and show a progress bar
|
|
82
81
|
process.run()
|
|
83
|
-
# The FFmpeg process failed if the return code is not 0
|
|
84
|
-
if process.return_code != 0:
|
|
85
|
-
pass
|
|
86
82
|
except FfmpegProcessError as e:
|
|
87
83
|
print(f"An error occurred when running the better-ffmpeg-process package:\n{e}")
|
|
88
84
|
```
|
|
@@ -42,13 +42,13 @@ from better_ffmpeg_progress import FfmpegProcess, FfmpegProcessError
|
|
|
42
42
|
command = [
|
|
43
43
|
"ffmpeg",
|
|
44
44
|
"-i",
|
|
45
|
-
"https://
|
|
46
|
-
"-
|
|
45
|
+
"https://media.xiph.org/video/derf/y4m/ducks_take_off_1080p50.y4m",
|
|
46
|
+
"-map",
|
|
47
|
+
"0:V",
|
|
48
|
+
"-c:V",
|
|
47
49
|
"libx264",
|
|
48
50
|
"-preset",
|
|
49
51
|
"ultrafast",
|
|
50
|
-
"-c:a",
|
|
51
|
-
"copy",
|
|
52
52
|
"-f",
|
|
53
53
|
"null",
|
|
54
54
|
"-",
|
|
@@ -59,11 +59,7 @@ try:
|
|
|
59
59
|
# Uncomment the line below if you want to use tqdm instead of rich for the progress bar
|
|
60
60
|
# process.use_tqdm = True
|
|
61
61
|
|
|
62
|
-
# Run the FFmpeg command and show a progress bar
|
|
63
62
|
process.run()
|
|
64
|
-
# The FFmpeg process failed if the return code is not 0
|
|
65
|
-
if process.return_code != 0:
|
|
66
|
-
pass
|
|
67
63
|
except FfmpegProcessError as e:
|
|
68
64
|
print(f"An error occurred when running the better-ffmpeg-process package:\n{e}")
|
|
69
65
|
```
|
|
@@ -57,7 +57,7 @@ class FfmpegProcess:
|
|
|
57
57
|
self,
|
|
58
58
|
command: List[str],
|
|
59
59
|
ffmpeg_log_level: Optional[Union[FfmpegLogLevel, str]] = None,
|
|
60
|
-
ffmpeg_log_file: Optional[Union[str,
|
|
60
|
+
ffmpeg_log_file: Optional[Union[str, os.PathLike]] = None,
|
|
61
61
|
print_detected_duration: bool = False,
|
|
62
62
|
):
|
|
63
63
|
# Raises FfmpegCommandError if the command is invalid
|
|
@@ -91,9 +91,13 @@ class FfmpegProcess:
|
|
|
91
91
|
# Assumes last argument is output
|
|
92
92
|
self._output_filepath = Path(command[-1])
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
)
|
|
94
|
+
if ffmpeg_log_file is None:
|
|
95
|
+
self._ffmpeg_log_file = Path(f"{self._input_filepath.name}_ffmpeg_log.txt")
|
|
96
|
+
elif isinstance(ffmpeg_log_file, (str, os.PathLike)):
|
|
97
|
+
self._ffmpeg_log_file = Path(ffmpeg_log_file)
|
|
98
|
+
else:
|
|
99
|
+
self._ffmpeg_log_file = ffmpeg_log_file
|
|
100
|
+
|
|
97
101
|
self._print_detected_duration = print_detected_duration
|
|
98
102
|
self._duration_secs = get_media_duration(input_file_path_str)
|
|
99
103
|
|
|
@@ -123,13 +127,12 @@ class FfmpegProcess:
|
|
|
123
127
|
self._handle_overwrite_prompt()
|
|
124
128
|
|
|
125
129
|
self._process: Optional[subprocess.Popen] = None
|
|
126
|
-
self._return_code: Optional[int] = None
|
|
127
130
|
self.use_tqdm: bool = False
|
|
128
131
|
|
|
129
132
|
def run(
|
|
130
133
|
self,
|
|
131
134
|
print_command: bool = False,
|
|
132
|
-
) ->
|
|
135
|
+
) -> None:
|
|
133
136
|
if print_command:
|
|
134
137
|
cmd_str = (
|
|
135
138
|
" ".join(self._ffmpeg_command)
|
|
@@ -148,42 +151,48 @@ class FfmpegProcess:
|
|
|
148
151
|
if self._shell_needed and isinstance(current_ffmpeg_command, list):
|
|
149
152
|
current_ffmpeg_command = " ".join(current_ffmpeg_command)
|
|
150
153
|
|
|
151
|
-
self._return_code = 1
|
|
152
|
-
|
|
153
154
|
try:
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
155
|
+
creationflags = 0
|
|
156
|
+
# Windows
|
|
157
|
+
if os.name == "nt":
|
|
158
|
+
creationflags = subprocess.CREATE_NEW_PROCESS_GROUP
|
|
159
|
+
|
|
160
|
+
if isinstance(self._ffmpeg_log_file, Path):
|
|
161
|
+
with open(self._ffmpeg_log_file, "w", encoding="utf-8") as f:
|
|
162
|
+
self._process = subprocess.Popen(
|
|
163
|
+
current_ffmpeg_command,
|
|
164
|
+
shell=self._shell_needed,
|
|
165
|
+
stdout=subprocess.PIPE,
|
|
166
|
+
stderr=f,
|
|
167
|
+
creationflags=creationflags,
|
|
168
|
+
)
|
|
169
|
+
else:
|
|
160
170
|
self._process = subprocess.Popen(
|
|
161
171
|
current_ffmpeg_command,
|
|
162
172
|
shell=self._shell_needed,
|
|
163
173
|
stdout=subprocess.PIPE,
|
|
164
|
-
stderr=
|
|
174
|
+
stderr=self._ffmpeg_log_file,
|
|
165
175
|
creationflags=creationflags,
|
|
166
176
|
)
|
|
167
177
|
except Exception as e:
|
|
168
|
-
# self._return_code remains None as the process didn't start
|
|
169
178
|
raise FfmpegProcessError(f"Error starting FFmpeg process: {e}") from e
|
|
170
179
|
|
|
180
|
+
user_interrupted = False
|
|
171
181
|
try:
|
|
172
182
|
if self.use_tqdm:
|
|
173
|
-
|
|
183
|
+
use_tqdm(self, self._process)
|
|
174
184
|
else:
|
|
175
|
-
|
|
185
|
+
use_rich(self, self._process)
|
|
176
186
|
except KeyboardInterrupt:
|
|
187
|
+
user_interrupted = True
|
|
177
188
|
self._terminate()
|
|
178
|
-
self._return_code = 1
|
|
179
189
|
finally:
|
|
180
190
|
if self._process:
|
|
181
|
-
self._return_code = self._process.returncode
|
|
182
|
-
|
|
183
191
|
if self._process.stdout:
|
|
184
192
|
self._process.stdout.close()
|
|
185
193
|
|
|
186
|
-
|
|
194
|
+
if not user_interrupted and self._process and self._process.returncode != 0:
|
|
195
|
+
raise FfmpegProcessError(f"FFmpeg process failed. Return code: {self._process.returncode}")
|
|
187
196
|
|
|
188
197
|
def _terminate(self):
|
|
189
198
|
if self._process:
|
|
@@ -191,10 +200,3 @@ class FfmpegProcess:
|
|
|
191
200
|
else:
|
|
192
201
|
exit()
|
|
193
202
|
|
|
194
|
-
@property
|
|
195
|
-
def return_code(self) -> Optional[int]:
|
|
196
|
-
"""
|
|
197
|
-
The return code of the FFmpeg process.
|
|
198
|
-
None if the process has not started or failed to start.
|
|
199
|
-
"""
|
|
200
|
-
return self._return_code
|
|
@@ -196,6 +196,8 @@ def terminate_ffmpeg_process(process: Optional[subprocess.Popen]):
|
|
|
196
196
|
if not process or process.poll() is not None:
|
|
197
197
|
return
|
|
198
198
|
|
|
199
|
+
print("[KeyboardInterrupt] Terminating the FFmpeg process...")
|
|
200
|
+
|
|
199
201
|
original_pid = process.pid
|
|
200
202
|
|
|
201
203
|
parent_ps_proc: Optional[psutil.Process] = None
|
|
@@ -219,8 +221,6 @@ def terminate_ffmpeg_process(process: Optional[subprocess.Popen]):
|
|
|
219
221
|
print(f"Error during fallback Popen termination: {popen_term_err}")
|
|
220
222
|
return
|
|
221
223
|
|
|
222
|
-
print("[better-ffmpeg-progress] Terminating the FFmpeg process...")
|
|
223
|
-
|
|
224
224
|
if parent_ps_proc:
|
|
225
225
|
_terminate_children_processes(parent_ps_proc)
|
|
226
226
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: better-ffmpeg-progress
|
|
3
|
-
Version:
|
|
3
|
+
Version: 5.0.0
|
|
4
4
|
Summary: Run FFmpeg & see percentage progress + ETA.
|
|
5
5
|
Home-page: https://github.com/CrypticSignal/better-ffmpeg-progress
|
|
6
6
|
Author: GitHub.com/CrypticSignal
|
|
@@ -61,13 +61,13 @@ from better_ffmpeg_progress import FfmpegProcess, FfmpegProcessError
|
|
|
61
61
|
command = [
|
|
62
62
|
"ffmpeg",
|
|
63
63
|
"-i",
|
|
64
|
-
"https://
|
|
65
|
-
"-
|
|
64
|
+
"https://media.xiph.org/video/derf/y4m/ducks_take_off_1080p50.y4m",
|
|
65
|
+
"-map",
|
|
66
|
+
"0:V",
|
|
67
|
+
"-c:V",
|
|
66
68
|
"libx264",
|
|
67
69
|
"-preset",
|
|
68
70
|
"ultrafast",
|
|
69
|
-
"-c:a",
|
|
70
|
-
"copy",
|
|
71
71
|
"-f",
|
|
72
72
|
"null",
|
|
73
73
|
"-",
|
|
@@ -78,11 +78,7 @@ try:
|
|
|
78
78
|
# Uncomment the line below if you want to use tqdm instead of rich for the progress bar
|
|
79
79
|
# process.use_tqdm = True
|
|
80
80
|
|
|
81
|
-
# Run the FFmpeg command and show a progress bar
|
|
82
81
|
process.run()
|
|
83
|
-
# The FFmpeg process failed if the return code is not 0
|
|
84
|
-
if process.return_code != 0:
|
|
85
|
-
pass
|
|
86
82
|
except FfmpegProcessError as e:
|
|
87
83
|
print(f"An error occurred when running the better-ffmpeg-process package:\n{e}")
|
|
88
84
|
```
|
|
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as f:
|
|
|
5
5
|
|
|
6
6
|
setuptools.setup(
|
|
7
7
|
name="better-ffmpeg-progress",
|
|
8
|
-
version="
|
|
8
|
+
version="5.0.0",
|
|
9
9
|
author="GitHub.com/CrypticSignal",
|
|
10
10
|
author_email="theaudiophile@outlook.com",
|
|
11
11
|
description="Run FFmpeg & see percentage progress + ETA.",
|
|
File without changes
|
{better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/__init__.py
RENAMED
|
File without changes
|
{better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/enums.py
RENAMED
|
File without changes
|
{better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
{better_ffmpeg_progress-4.0.1 → better_ffmpeg_progress-5.0.0}/better_ffmpeg_progress/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|