media-engine 0.1.1__py3-none-any.whl → 0.2.0__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.
- media_engine/_version.py +2 -2
- media_engine/batch/models.py +9 -0
- media_engine/batch/processor.py +14 -12
- media_engine/batch/timing.py +1 -1
- media_engine/config.py +91 -19
- media_engine/extractors/faces.py +1 -1
- media_engine/extractors/frame_buffer.py +1 -1
- media_engine/extractors/frames.py +2 -2
- media_engine/extractors/metadata/sony.py +1 -1
- media_engine/extractors/motion.py +4 -4
- media_engine/extractors/objects.py +1 -1
- media_engine/extractors/objects_qwen.py +738 -112
- media_engine/extractors/ocr.py +1 -1
- media_engine/extractors/transcribe.py +1 -1
- media_engine/extractors/vad.py +1 -1
- media_engine/routers/settings.py +2 -0
- media_engine/schemas.py +2 -0
- {media_engine-0.1.1.dist-info → media_engine-0.2.0.dist-info}/METADATA +1 -1
- {media_engine-0.1.1.dist-info → media_engine-0.2.0.dist-info}/RECORD +22 -22
- {media_engine-0.1.1.dist-info → media_engine-0.2.0.dist-info}/WHEEL +0 -0
- {media_engine-0.1.1.dist-info → media_engine-0.2.0.dist-info}/entry_points.txt +0 -0
- {media_engine-0.1.1.dist-info → media_engine-0.2.0.dist-info}/licenses/LICENSE +0 -0
media_engine/extractors/ocr.py
CHANGED
|
@@ -261,7 +261,7 @@ def extract_ocr(
|
|
|
261
261
|
# Log stats
|
|
262
262
|
if frames_checked > 0:
|
|
263
263
|
skip_pct = (frames_skipped / frames_checked) * 100
|
|
264
|
-
logger.info(f"OCR: {frames_checked} frames checked, {frames_skipped} skipped ({skip_pct:.0f}%),
|
|
264
|
+
logger.info(f"OCR: {frames_checked} frames checked, {frames_skipped} skipped ({skip_pct:.0f}%), {frames_with_text} processed, {len(detections)} text regions found")
|
|
265
265
|
else:
|
|
266
266
|
logger.info("OCR: no frames to process")
|
|
267
267
|
|
|
@@ -251,7 +251,7 @@ def get_transcription_backend() -> TranscriptionBackend:
|
|
|
251
251
|
logger.info("Using openai-whisper backend (CPU)")
|
|
252
252
|
return _backend
|
|
253
253
|
except ImportError:
|
|
254
|
-
raise RuntimeError("No Whisper backend available. Install one of:
|
|
254
|
+
raise RuntimeError("No Whisper backend available. Install one of: mlx-whisper, faster-whisper, openai-whisper")
|
|
255
255
|
|
|
256
256
|
|
|
257
257
|
def unload_whisper_model() -> None:
|
media_engine/extractors/vad.py
CHANGED
|
@@ -248,7 +248,7 @@ def detect_voice_activity(
|
|
|
248
248
|
# Audio present but no speech detected (silent, ambient, or music)
|
|
249
249
|
audio_content = AudioContent.AUDIO
|
|
250
250
|
|
|
251
|
-
logger.info(f"VAD result for {path.name}: {audio_content}
|
|
251
|
+
logger.info(f"VAD result for {path.name}: {audio_content} (speech_ratio={speech_ratio:.2%}, duration={total_speech_duration:.1f}s)")
|
|
252
252
|
|
|
253
253
|
return {
|
|
254
254
|
"audio_content": str(audio_content),
|
media_engine/routers/settings.py
CHANGED
|
@@ -30,6 +30,7 @@ async def get_settings_endpoint():
|
|
|
30
30
|
min_face_size=settings.min_face_size,
|
|
31
31
|
object_detector=settings.object_detector,
|
|
32
32
|
qwen_model=settings.qwen_model,
|
|
33
|
+
qwen_strategy=settings.qwen_strategy,
|
|
33
34
|
qwen_frames_per_scene=settings.qwen_frames_per_scene,
|
|
34
35
|
yolo_model=settings.yolo_model,
|
|
35
36
|
clip_model=settings.clip_model,
|
|
@@ -79,6 +80,7 @@ async def update_settings(update: SettingsUpdate):
|
|
|
79
80
|
min_face_size=new_settings.min_face_size,
|
|
80
81
|
object_detector=new_settings.object_detector,
|
|
81
82
|
qwen_model=new_settings.qwen_model,
|
|
83
|
+
qwen_strategy=new_settings.qwen_strategy,
|
|
82
84
|
qwen_frames_per_scene=new_settings.qwen_frames_per_scene,
|
|
83
85
|
yolo_model=new_settings.yolo_model,
|
|
84
86
|
clip_model=new_settings.clip_model,
|
media_engine/schemas.py
CHANGED
|
@@ -530,6 +530,7 @@ class SettingsResponse(BaseModel):
|
|
|
530
530
|
# Object detection
|
|
531
531
|
object_detector: str
|
|
532
532
|
qwen_model: str
|
|
533
|
+
qwen_strategy: str # "auto", "single", "context", "batch", "batch_context"
|
|
533
534
|
qwen_frames_per_scene: int
|
|
534
535
|
yolo_model: str
|
|
535
536
|
|
|
@@ -568,6 +569,7 @@ class SettingsUpdate(BaseModel):
|
|
|
568
569
|
# Object detection
|
|
569
570
|
object_detector: str | None = None
|
|
570
571
|
qwen_model: str | None = None
|
|
572
|
+
qwen_strategy: str | None = None # "auto", "single", "context", "batch", "batch_context"
|
|
571
573
|
qwen_frames_per_scene: int | None = None
|
|
572
574
|
yolo_model: str | None = None
|
|
573
575
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: media-engine
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: AI-powered video extraction API for metadata, transcripts, faces, scenes, objects, and more
|
|
5
5
|
Project-URL: Repository, https://github.com/thetrainroom/media-engine
|
|
6
6
|
Project-URL: Issues, https://github.com/thetrainroom/media-engine/issues
|
|
@@ -8,34 +8,34 @@ cli/scenes.py,sha256=W3DE6VTVOUo4pjbPLfX3iQIQ1LSI9Jo7n5sIZGG9dZc,1741
|
|
|
8
8
|
cli/telemetry.py,sha256=z7UqxoGMY2L0QEkA3hlNZsP3paXREXxKkWpVVzCboJY,2029
|
|
9
9
|
cli/transcript.py,sha256=CFgaxP_jFDQf-J7U-_1NK7ADx5zoLvJ-8_F2zSaCc68,2280
|
|
10
10
|
media_engine/__init__.py,sha256=T0S3Jxe8MktWwlldioaPxRLRYIlp3Nw8GaIiQ6kaGrw,216
|
|
11
|
-
media_engine/_version.py,sha256=
|
|
11
|
+
media_engine/_version.py,sha256=Dg8AmJomLVpjKL6prJylOONZAPRtB86LOce7dorQS_A,704
|
|
12
12
|
media_engine/app.py,sha256=pnSNIyqQrTXad39x5ZZ1iskkF8WE9SWwici7C7llTMM,1987
|
|
13
13
|
media_engine/cli.py,sha256=V41KS4samQjsYAP0064RcQ1pHS4Zs6Q94yUBDTTNMKE,293
|
|
14
|
-
media_engine/config.py,sha256=
|
|
14
|
+
media_engine/config.py,sha256=wl0k3lR-079zKp47_b9IaQfrww2X15kkBFmhNWAnDKI,23490
|
|
15
15
|
media_engine/main.py,sha256=H354jbr_3teUXdXwfmODwAt_i7s9wgedWw3EJbIilFw,2146
|
|
16
16
|
media_engine/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
media_engine/schemas.py,sha256=
|
|
17
|
+
media_engine/schemas.py,sha256=uJ8jnJ4QHgXz5-zCrs29291PXhZ5VmiFg1sKaxJp_hQ,15204
|
|
18
18
|
media_engine/batch/__init__.py,sha256=wJIGdNif8thXQqowCNNWwCC6fjgJM0bei47oo2x3_kA,1248
|
|
19
|
-
media_engine/batch/models.py,sha256
|
|
20
|
-
media_engine/batch/processor.py,sha256=
|
|
19
|
+
media_engine/batch/models.py,sha256=2zss3yMEpd0kLvtJmZ00XiciNrhx6pL62-SyZ36CcZI,4373
|
|
20
|
+
media_engine/batch/processor.py,sha256=byOCO7cs8tjw1zy0LdzGnZnDcR7pwwzNGnv0_QLh2yQ,57001
|
|
21
21
|
media_engine/batch/queue.py,sha256=yhUN0xkpbJ74Ti1XrY12pe4y7Jf8nb016Q6gpV9IzLw,7535
|
|
22
22
|
media_engine/batch/state.py,sha256=uobVK7G_-p58iCTzxmkBk8KEkYnWkzUn7t2_iD65J2o,827
|
|
23
|
-
media_engine/batch/timing.py,sha256=
|
|
23
|
+
media_engine/batch/timing.py,sha256=4tCqaSLHVLuFjKvu0s9RHtgSC_Vi1sTzHE_ZMim8d4s,11656
|
|
24
24
|
media_engine/extractors/__init__.py,sha256=m9jl2SyqeGpn0kIET2qAO_nXT6caAGKurBW3oTlao8o,2048
|
|
25
25
|
media_engine/extractors/clip.py,sha256=sCuy4MS_4aqtuIMgpWBY7NuEnfOQSZqoMTNNlkk6yGk,12984
|
|
26
|
-
media_engine/extractors/faces.py,sha256=
|
|
27
|
-
media_engine/extractors/frame_buffer.py,sha256=
|
|
28
|
-
media_engine/extractors/frames.py,sha256=
|
|
29
|
-
media_engine/extractors/motion.py,sha256=
|
|
30
|
-
media_engine/extractors/objects.py,sha256=
|
|
31
|
-
media_engine/extractors/objects_qwen.py,sha256=
|
|
32
|
-
media_engine/extractors/ocr.py,sha256=
|
|
26
|
+
media_engine/extractors/faces.py,sha256=xDFEh5tn6qAduGO41Wd1R_TyRxcz1DQEK7AGESpwnrE,15696
|
|
27
|
+
media_engine/extractors/frame_buffer.py,sha256=ev1ETT7nwoaQsB0APyBK6Xv44UqkIpvdcbGDeyelp_I,10964
|
|
28
|
+
media_engine/extractors/frames.py,sha256=ccfYdlIVsxzkb_4THA5Cs9ivNhezsHtK6Z2mp68RzAg,13585
|
|
29
|
+
media_engine/extractors/motion.py,sha256=rtcF37WotIeMSg6ZnUDuoAtLUXoBd2LoaLGWiwssLm0,25959
|
|
30
|
+
media_engine/extractors/objects.py,sha256=CN4mXb_kqe5qImf2htJkK0ES--xMKHjrWwYw7ZuqgH4,7761
|
|
31
|
+
media_engine/extractors/objects_qwen.py,sha256=2oBbfyyIn2RkVzhDDmh30orCsUSoYSwtXS6szovrcb0,53385
|
|
32
|
+
media_engine/extractors/ocr.py,sha256=b3-pLOYg1JQbaJTB-ACggwYV6FK76Ynjvb9IwyyRVWY,8508
|
|
33
33
|
media_engine/extractors/scenes.py,sha256=I-Do5NJnl7gbUVYskvbkWtAwHNotydhxGU83fwIlJSk,2680
|
|
34
34
|
media_engine/extractors/shot_type.py,sha256=CJ-SII8X3toSihs4oA5a3dbYcljLxeA68e5DFO6RRHA,7143
|
|
35
35
|
media_engine/extractors/telemetry.py,sha256=TSsQVEA8sP2hnCwNYY-2AmE_hTTrOhKES0DSyj0ZU24,8796
|
|
36
|
-
media_engine/extractors/transcribe.py,sha256=
|
|
36
|
+
media_engine/extractors/transcribe.py,sha256=OyCdNZN5qXIS-z9hfx7O1zp4Zsc1eN1u053xf7Tf_4U,18035
|
|
37
37
|
media_engine/extractors/translate.py,sha256=E23Neu42m2fmkrqlDDt1hFKddkDxK_FLlnJh32LFpSw,3808
|
|
38
|
-
media_engine/extractors/vad.py,sha256=
|
|
38
|
+
media_engine/extractors/vad.py,sha256=gU4-Y6ekqjOXSoFlG9Fm62qxkUv8FYkNqz-7FIqRsgk,8996
|
|
39
39
|
media_engine/extractors/metadata/__init__.py,sha256=SQMGL-DAejcOZE0OxgWOkfCewDBPuW-lZKFRma-r-B8,4021
|
|
40
40
|
media_engine/extractors/metadata/apple.py,sha256=HBdMijdBLMsOBSsnzTf8DJykJkGFREGExEveQlUnqwU,5146
|
|
41
41
|
media_engine/extractors/metadata/arri.py,sha256=XUn_N20Y-FPIds21JJwLfx6nlQvMwRG-W9p532-aeLI,3379
|
|
@@ -52,19 +52,19 @@ media_engine/extractors/metadata/generic.py,sha256=sCQY8HA2G1DZ2OmJWJdjAqKKpAJp1
|
|
|
52
52
|
media_engine/extractors/metadata/gopro.py,sha256=MQHqEzRWrYoW5bca1jzfIhcVAM-3lcGrJem16DsvKSE,8080
|
|
53
53
|
media_engine/extractors/metadata/red.py,sha256=I5SClyeGYc3WxQ0TSwYAcHuv19elXbRQRkqBT1CUfW4,9356
|
|
54
54
|
media_engine/extractors/metadata/registry.py,sha256=Idd7ind3X_1ywJ0spbeqEK9hT3ykQYUqbGVp6WITAX8,3619
|
|
55
|
-
media_engine/extractors/metadata/sony.py,sha256=
|
|
55
|
+
media_engine/extractors/metadata/sony.py,sha256=Z7XJ0fVbVsYpLMP5DqS5WW3GAiIiv7ibX9o7tZhdhws,16328
|
|
56
56
|
media_engine/extractors/metadata/tesla.py,sha256=EihXp-abCw_MpR1e1FSFCnckEz_7n1htvjcQpflRvG8,4247
|
|
57
57
|
media_engine/routers/__init__.py,sha256=8gf_Jo9TpSkuHg0nwQboqUxI9jioEyVCimhO-lWN-Zs,477
|
|
58
58
|
media_engine/routers/batch.py,sha256=VGdAZFUeRz4X0LWu6OK-UuiW9OHNt1Pe51xPfd4j6EI,2767
|
|
59
59
|
media_engine/routers/health.py,sha256=vNYSNG-B0MoM9dxzOYB5v-12-VKJkvBpXXCYCH1itZg,2748
|
|
60
60
|
media_engine/routers/models.py,sha256=Y_CBvD9Q8gp3rg1_VuvEuv2lsZCsnL6aIIhB1m5pFQc,7739
|
|
61
|
-
media_engine/routers/settings.py,sha256=
|
|
61
|
+
media_engine/routers/settings.py,sha256=scD74CiAjhSfWjmwSQ9OJJmwQn2Cqdz1k64L8SG6SgI,3129
|
|
62
62
|
media_engine/routers/utils.py,sha256=Cx6uWQldV8AC79sotVMSlRtWXTMZbSc8DWXdSBog7ys,4552
|
|
63
63
|
media_engine/utils/__init__.py,sha256=UXpqgpt1NU8NTsP_iRPfiP20_OpmGqEoZS6jVmRpjXo,162
|
|
64
64
|
media_engine/utils/logging.py,sha256=yOnrYMAfwqtJLOGnhiIJbzVU8m8MYF39acuIpU4A_oA,1965
|
|
65
65
|
media_engine/utils/memory.py,sha256=OZB0yl21u-lj-VwmO8RrRMd_CURxeBgKZrb6QA3OYWU,1186
|
|
66
|
-
media_engine-0.
|
|
67
|
-
media_engine-0.
|
|
68
|
-
media_engine-0.
|
|
69
|
-
media_engine-0.
|
|
70
|
-
media_engine-0.
|
|
66
|
+
media_engine-0.2.0.dist-info/METADATA,sha256=IjT8QPw4IichcIxYco8cIg9fdOA0gD7ogop39KOoN7A,8059
|
|
67
|
+
media_engine-0.2.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
68
|
+
media_engine-0.2.0.dist-info/entry_points.txt,sha256=vdEMWxqs_gFTni4BGrX_iCP_f2HhC6XIz8ExQvyMpcE,338
|
|
69
|
+
media_engine-0.2.0.dist-info/licenses/LICENSE,sha256=UOl7jpYGV9IlJlBilZxQ5IoOKhDkbwUqvLDwQk2tsFw,1069
|
|
70
|
+
media_engine-0.2.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|