videoconverter-worker 1.0.6__py3-none-any.whl → 1.0.8__py3-none-any.whl
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.
- {videoconverter_worker-1.0.6.dist-info → videoconverter_worker-1.0.8.dist-info}/METADATA +1 -1
- videoconverter_worker-1.0.8.dist-info/RECORD +10 -0
- worker.py +43 -15
- videoconverter_worker-1.0.6.dist-info/RECORD +0 -10
- {videoconverter_worker-1.0.6.dist-info → videoconverter_worker-1.0.8.dist-info}/WHEEL +0 -0
- {videoconverter_worker-1.0.6.dist-info → videoconverter_worker-1.0.8.dist-info}/entry_points.txt +0 -0
- {videoconverter_worker-1.0.6.dist-info → videoconverter_worker-1.0.8.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
ffmpeg_runner.py,sha256=2sYugXkKp-NKj3ahxbwbhAo4G49FDu-0oze-cdJvcY0,12218
|
|
2
|
+
metadata.py,sha256=32zQn7jJ6XTHhunwTn5Xv0qmpjHnap_pkPxY0XI8MBs,3116
|
|
3
|
+
schema.py,sha256=3ILdGl5qSQOSvKfiKWcnaxdyHwV4rDvGnRZIparVp3o,4361
|
|
4
|
+
task_queue.py,sha256=sYQelPRuTbP9g_sPs69xOR3n5SIxGBFxY4EI5ueQrQs,11822
|
|
5
|
+
worker.py,sha256=oDd4NG0OM5GsoYnRNf8XtcwIyoe8Zd7SkXABrC8WqzM,22417
|
|
6
|
+
videoconverter_worker-1.0.8.dist-info/METADATA,sha256=rPAbe8ov972I4JqYOylfTTlFlJuQkavM51e0oYpbCoo,5139
|
|
7
|
+
videoconverter_worker-1.0.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
8
|
+
videoconverter_worker-1.0.8.dist-info/entry_points.txt,sha256=qedJjjix02n9Hz8adBioDIpGHghm8S3fQZdFwM5LV1A,83
|
|
9
|
+
videoconverter_worker-1.0.8.dist-info/top_level.txt,sha256=iamWyiqUZ4X0_2UZx6GEk9gsPmiI9qhse_15HqtzUj8,48
|
|
10
|
+
videoconverter_worker-1.0.8.dist-info/RECORD,,
|
worker.py
CHANGED
|
@@ -31,14 +31,26 @@ logging.basicConfig(
|
|
|
31
31
|
logger = logging.getLogger("worker")
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
def _cpu_ram_str() -> str:
|
|
35
|
+
"""若已安装 psutil 则返回 ' CPU 12% RAM 34%',否则返回空字符串。不增加强制依赖。"""
|
|
36
|
+
try:
|
|
37
|
+
import psutil
|
|
38
|
+
cpu = psutil.cpu_percent(interval=None)
|
|
39
|
+
mem = psutil.virtual_memory().percent
|
|
40
|
+
return f" CPU {cpu:.0f}% RAM {mem:.0f}%"
|
|
41
|
+
except Exception:
|
|
42
|
+
return ""
|
|
43
|
+
|
|
44
|
+
|
|
34
45
|
def _desub_spinner(stop_event: threading.Event) -> None:
|
|
35
|
-
"""
|
|
46
|
+
"""去字幕阶段同一行跑马灯,避免用户以为死机。仅 TTY 且 1 秒刷新一次;若已装 psutil 会显示 CPU/RAM 占用。"""
|
|
36
47
|
i = 0
|
|
37
|
-
while not stop_event.wait(0
|
|
48
|
+
while not stop_event.wait(1.0):
|
|
38
49
|
dots = "." * ((i % 3) + 1)
|
|
39
50
|
try:
|
|
40
51
|
ts = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
|
41
|
-
|
|
52
|
+
extra = _cpu_ram_str()
|
|
53
|
+
sys.stderr.write(f"\r{ts} [INFO] worker: 去字幕中{extra} {dots} ")
|
|
42
54
|
sys.stderr.flush()
|
|
43
55
|
except (OSError, UnicodeEncodeError):
|
|
44
56
|
break
|
|
@@ -353,11 +365,23 @@ def run_simple_compose(
|
|
|
353
365
|
chunk_list = [c for c in (metadata.get("chunks") or []) if c.get("originalPath")]
|
|
354
366
|
logger.info("切分完成: %d 块,开始去字幕", len(chunk_list))
|
|
355
367
|
|
|
368
|
+
use_spinner = getattr(sys.stderr, "isatty", lambda: False)() # 仅真正终端跑跑马灯,避免 Colab/后台时满屏刷日志
|
|
356
369
|
stop_spinner = threading.Event()
|
|
357
370
|
spinner = threading.Thread(target=_desub_spinner, args=(stop_spinner,), daemon=True)
|
|
358
|
-
|
|
371
|
+
|
|
372
|
+
def _stop_spinner_newline():
|
|
373
|
+
stop_spinner.set()
|
|
374
|
+
spinner.join(timeout=1.5)
|
|
375
|
+
try:
|
|
376
|
+
sys.stderr.write("\n")
|
|
377
|
+
sys.stderr.flush()
|
|
378
|
+
except (OSError, UnicodeEncodeError):
|
|
379
|
+
pass
|
|
380
|
+
|
|
381
|
+
if use_spinner:
|
|
382
|
+
spinner.start()
|
|
359
383
|
try:
|
|
360
|
-
for ch in chunk_list:
|
|
384
|
+
for i, ch in enumerate(chunk_list):
|
|
361
385
|
rel = ch.get("originalPath", "")
|
|
362
386
|
if not rel:
|
|
363
387
|
continue
|
|
@@ -375,17 +399,18 @@ def run_simple_compose(
|
|
|
375
399
|
cfg["endTime"] = 0
|
|
376
400
|
cfg["forceKeyframeAtStart"] = True
|
|
377
401
|
run_desubtitle(cfg, str(chunk_path), str(output_file))
|
|
402
|
+
if use_spinner:
|
|
403
|
+
_stop_spinner_newline()
|
|
378
404
|
meta_path = Path(output_dir) / video_id / "metadata.json"
|
|
379
405
|
if meta_path.exists():
|
|
380
406
|
update_chunk_processed(str(meta_path), chunk_id, str(output_file))
|
|
407
|
+
if use_spinner and i + 1 < len(chunk_list):
|
|
408
|
+
stop_spinner = threading.Event()
|
|
409
|
+
spinner = threading.Thread(target=_desub_spinner, args=(stop_spinner,), daemon=True)
|
|
410
|
+
spinner.start()
|
|
381
411
|
finally:
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
try:
|
|
385
|
-
sys.stderr.write("\n")
|
|
386
|
-
sys.stderr.flush()
|
|
387
|
-
except (OSError, UnicodeEncodeError):
|
|
388
|
-
pass
|
|
412
|
+
if use_spinner:
|
|
413
|
+
_stop_spinner_newline()
|
|
389
414
|
|
|
390
415
|
data = load_metadata(str(Path(output_dir) / video_id / "metadata.json"))
|
|
391
416
|
processed = get_processed_chunks(data)
|
|
@@ -445,7 +470,7 @@ def main() -> int:
|
|
|
445
470
|
parser.add_argument(
|
|
446
471
|
"--dir",
|
|
447
472
|
default=".",
|
|
448
|
-
help="
|
|
473
|
+
help="简易模式:工作目录(支持相对路径),不存在则自动创建,默认当前目录",
|
|
449
474
|
)
|
|
450
475
|
parser.add_argument(
|
|
451
476
|
"--start",
|
|
@@ -506,9 +531,12 @@ def main() -> int:
|
|
|
506
531
|
|
|
507
532
|
if args.simple:
|
|
508
533
|
base = Path(args.dir).resolve()
|
|
509
|
-
if not base.is_dir():
|
|
510
|
-
logger.error("
|
|
534
|
+
if base.exists() and not base.is_dir():
|
|
535
|
+
logger.error("路径已存在但不是目录: %s", base)
|
|
511
536
|
return 1
|
|
537
|
+
if not base.exists():
|
|
538
|
+
base.mkdir(parents=True, exist_ok=True)
|
|
539
|
+
logger.info("已创建工作目录: %s", base)
|
|
512
540
|
out_dir = Path(args.output).resolve() if args.output else (base / "videoconverter_out")
|
|
513
541
|
out_dir.mkdir(parents=True, exist_ok=True)
|
|
514
542
|
if args.file:
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
ffmpeg_runner.py,sha256=2sYugXkKp-NKj3ahxbwbhAo4G49FDu-0oze-cdJvcY0,12218
|
|
2
|
-
metadata.py,sha256=32zQn7jJ6XTHhunwTn5Xv0qmpjHnap_pkPxY0XI8MBs,3116
|
|
3
|
-
schema.py,sha256=3ILdGl5qSQOSvKfiKWcnaxdyHwV4rDvGnRZIparVp3o,4361
|
|
4
|
-
task_queue.py,sha256=sYQelPRuTbP9g_sPs69xOR3n5SIxGBFxY4EI5ueQrQs,11822
|
|
5
|
-
worker.py,sha256=JEuCMeqFzNIepJP6fDEWeokA2zZ3eJ6MnxkewmFGXGE,21143
|
|
6
|
-
videoconverter_worker-1.0.6.dist-info/METADATA,sha256=YsRlsAkXt7kn4M4hbHz87OQ6FcPfsnOPtU1np3fneh4,5139
|
|
7
|
-
videoconverter_worker-1.0.6.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
8
|
-
videoconverter_worker-1.0.6.dist-info/entry_points.txt,sha256=qedJjjix02n9Hz8adBioDIpGHghm8S3fQZdFwM5LV1A,83
|
|
9
|
-
videoconverter_worker-1.0.6.dist-info/top_level.txt,sha256=iamWyiqUZ4X0_2UZx6GEk9gsPmiI9qhse_15HqtzUj8,48
|
|
10
|
-
videoconverter_worker-1.0.6.dist-info/RECORD,,
|
|
File without changes
|
{videoconverter_worker-1.0.6.dist-info → videoconverter_worker-1.0.8.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{videoconverter_worker-1.0.6.dist-info → videoconverter_worker-1.0.8.dist-info}/top_level.txt
RENAMED
|
File without changes
|