media-agent-mcp 2.7.0__tar.gz → 2.7.2__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.
Files changed (62) hide show
  1. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/PKG-INFO +2 -1
  2. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/pyproject.toml +2 -1
  3. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/ai_models/omni_human.py +2 -2
  4. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/async_server.py +10 -18
  5. media_agent_mcp-2.7.2/src/media_agent_mcp/be/__pycache__/__init__.cpython-312.pyc +0 -0
  6. media_agent_mcp-2.7.2/src/media_agent_mcp/be/__pycache__/app.cpython-312.pyc +0 -0
  7. media_agent_mcp-2.7.2/src/media_agent_mcp/be/__pycache__/routes_media.cpython-312.pyc +0 -0
  8. media_agent_mcp-2.7.2/src/media_agent_mcp/be/__pycache__/routes_omni_human.cpython-312.pyc +0 -0
  9. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/__pycache__/routes_subtitles.cpython-312.pyc +0 -0
  10. media_agent_mcp-2.7.2/src/media_agent_mcp/be/__pycache__/utils.cpython-312.pyc +0 -0
  11. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/app.py +2 -0
  12. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/routes_media.py +7 -4
  13. media_agent_mcp-2.7.2/src/media_agent_mcp/be/routes_omni_human.py +34 -0
  14. media_agent_mcp-2.7.2/src/media_agent_mcp/video/omni_human.py +118 -0
  15. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp.egg-info/PKG-INFO +2 -1
  16. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp.egg-info/SOURCES.txt +3 -0
  17. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp.egg-info/requires.txt +1 -0
  18. media_agent_mcp-2.7.0/src/media_agent_mcp/be/__pycache__/__init__.cpython-312.pyc +0 -0
  19. media_agent_mcp-2.7.0/src/media_agent_mcp/be/__pycache__/app.cpython-312.pyc +0 -0
  20. media_agent_mcp-2.7.0/src/media_agent_mcp/be/__pycache__/routes_media.cpython-312.pyc +0 -0
  21. media_agent_mcp-2.7.0/src/media_agent_mcp/be/__pycache__/utils.cpython-312.pyc +0 -0
  22. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/README.md +0 -0
  23. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/setup.cfg +0 -0
  24. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/__init__.py +0 -0
  25. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/ai_models/__init__.py +0 -0
  26. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/ai_models/openaiedit.py +0 -0
  27. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/ai_models/seed16.py +0 -0
  28. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/ai_models/seedance.py +0 -0
  29. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/ai_models/seededit.py +0 -0
  30. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/ai_models/seedream.py +0 -0
  31. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/ai_models/tts.py +0 -0
  32. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/async_wrapper.py +0 -0
  33. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/audio/combiner.py +0 -0
  34. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/audio/speed_controller.py +0 -0
  35. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/audio/tts.py +0 -0
  36. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/README.md +0 -0
  37. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/__init__.py +0 -0
  38. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/__pycache__/routes_omni.cpython-312.pyc +0 -0
  39. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/fonts/en/EduNSWACTCursive-VariableFont_wght.ttf +0 -0
  40. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/fonts/en/MozillaText-VariableFont_wght.ttf +0 -0
  41. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/fonts/en/Roboto_Condensed-Regular.ttf +0 -0
  42. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/fonts/zh/MaShanZheng-Regular.ttf +0 -0
  43. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/fonts/zh/NotoSerifSC-VariableFont_wght.ttf +0 -0
  44. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/fonts/zh/ZCOOLXiaoWei-Regular.ttf +0 -0
  45. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/pyproject.toml +0 -0
  46. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/routes_subtitles.py +0 -0
  47. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/utils.py +0 -0
  48. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/be/uv.lock +0 -0
  49. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/install_tools/__init__.py +0 -0
  50. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/install_tools/installer.py +0 -0
  51. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/media_selectors/__init__.py +0 -0
  52. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/media_selectors/image_selector.py +0 -0
  53. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/media_selectors/video_selector.py +0 -0
  54. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/storage/__init__.py +0 -0
  55. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/storage/tos_client.py +0 -0
  56. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/video/__init__.py +0 -0
  57. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/video/processor.py +0 -0
  58. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/video/stack.py +0 -0
  59. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp/video/subtitle.py +0 -0
  60. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp.egg-info/dependency_links.txt +0 -0
  61. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp.egg-info/entry_points.txt +0 -0
  62. {media_agent_mcp-2.7.0 → media_agent_mcp-2.7.2}/src/media_agent_mcp.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: media-agent-mcp
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: A Model Context Protocol server for media processing with AI tools
5
5
  Author-email: Media Agent Team <team@mediaagent.com>
6
6
  Keywords: mcp,ai,media,video,image,processing
@@ -26,6 +26,7 @@ Requires-Dist: loguru>=0.7.3
26
26
  Requires-Dist: imageio-ffmpeg>=0.4.0
27
27
  Requires-Dist: Flask>=3.0.0
28
28
  Requires-Dist: pydub>=0.25.1
29
+ Requires-Dist: gunicorn>=22.0.0
29
30
  Requires-Dist: audioop-lts; python_version >= "3.13"
30
31
  Requires-Dist: google-genai>=1.33.0
31
32
  Requires-Dist: mcp==1.11.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "media-agent-mcp"
3
- version = "2.7.0"
3
+ version = "2.7.2"
4
4
  description = "A Model Context Protocol server for media processing with AI tools"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -31,6 +31,7 @@ dependencies = [
31
31
  "imageio-ffmpeg>=0.4.0",
32
32
  "Flask>=3.0.0",
33
33
  "pydub>=0.25.1",
34
+ "gunicorn>=22.0.0",
34
35
  "audioop-lts; python_version >= '3.13'",
35
36
  "google-genai>=1.33.0",
36
37
  "mcp==1.11.0",
@@ -122,8 +122,8 @@ if __name__ == '__main__':
122
122
  time1 = time.time()
123
123
 
124
124
  print(generate_video_from_omni_human(
125
- image_url="https://ark-content-generation-v2-ap-southeast-1.tos-ap-southeast-1.volces.com/seedream-3-0-t2i/0217564979274996d76cd7acfd572da46abbcedd46e0f23a31db6.jpeg?X-Tos-Algorithm=TOS4-HMAC-SHA256&X-Tos-Credential=AKLTYWJkZTExNjA1ZDUyNDc3YzhjNTM5OGIyNjBhNDcyOTQ%2F20250829%2Fap-southeast-1%2Ftos%2Frequest&X-Tos-Date=20250829T200528Z&X-Tos-Expires=86400&X-Tos-Signature=abf8c7d516eecd4543691ffee5c3c5bcc7e38d5d047caf7f2fcfe3e41ab897d3&X-Tos-SignedHeaders=host",
126
- audio_url="https://carey.tos-ap-southeast-1.bytepluses.com/media_agent/2025-08-30/a72d04349e81454c8065674792256a1d.mp3"
125
+ image_url="https://carey.tos-ap-southeast-1.bytepluses.com/Art%20Portrait/Art%20Portrait/Art%20Portrait/Art%20Portrait%20(1).jpg",
126
+ audio_url="https://carey.tos-ap-southeast-1.bytepluses.com/media_agent/2025-09-02/66620bed2a5f4b2cbc641559ff93a2ed.mp3"
127
127
  ))
128
128
 
129
129
  print(time.time() - time1)
@@ -449,8 +449,6 @@ def main():
449
449
  help='Host for SSE transport (default: 127.0.0.1)')
450
450
  parser.add_argument('--port', type=int, default=8000,
451
451
  help='Port for SSE transport (default: 8000)')
452
- parser.add_argument('--version', action='store_true',
453
- help='Show version information')
454
452
  parser.add_argument('--run-be', action='store_true',
455
453
  help='Run the backend server')
456
454
  parser.add_argument('--be-host', type=str, default='0.0.0.0',
@@ -460,10 +458,6 @@ def main():
460
458
 
461
459
  args = parser.parse_args()
462
460
 
463
- if args.version:
464
- print("Async Media Agent MCP Server v0.1.0")
465
- return
466
-
467
461
  if args.run_be:
468
462
  logger.info(f"Starting backend server on {args.be_host}:{args.be_port}...")
469
463
  be_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'be'))
@@ -473,22 +467,20 @@ def main():
473
467
  try:
474
468
  subprocess.run(
475
469
  [
476
- sys.executable,
477
- "-c",
478
- (
479
- "import sys, app; "
480
- "flask_app = getattr(app, '_flask_app', getattr(app, 'app', None)); "
481
- "assert flask_app is not None, 'No Flask application instance found in app.py'; "
482
- "flask_app.run(host=sys.argv[1], port=int(sys.argv[2]), debug=False)"
483
- ),
484
- args.be_host,
485
- str(args.be_port),
470
+ "gunicorn",
471
+ "--workers",
472
+ "4",
473
+ "--bind",
474
+ f"{args.be_host}:{args.be_port}",
475
+ "--log-level",
476
+ "debug",
477
+ "app:app",
486
478
  ],
487
479
  cwd=be_path,
488
480
  check=True
489
481
  )
490
482
  except FileNotFoundError:
491
- logger.error("`uvicorn` command not found. Please ensure it is installed in your environment.")
483
+ logger.error("`gunicorn` command not found. Please ensure it is installed in your environment.")
492
484
  except subprocess.CalledProcessError as e:
493
485
  logger.error(f"Failed to start backend server: {e}")
494
486
  return
@@ -528,7 +520,7 @@ def main():
528
520
  mcp.sse_app(),
529
521
  host=args.host,
530
522
  port=args.port,
531
- timeout_keep_alive=1200
523
+ timeout_keep_alive=300
532
524
  )
533
525
  else:
534
526
  # Default stdio transport
@@ -6,6 +6,7 @@ from flask import Flask
6
6
  # Register blueprints from modularized routes
7
7
  from media_agent_mcp.be.routes_media import media_bp
8
8
  from media_agent_mcp.be.routes_subtitles import subtitles_bp
9
+ from media_agent_mcp.be.routes_omni_human import omni_human_bp
9
10
 
10
11
 
11
12
  logger = logging.getLogger(__name__)
@@ -14,6 +15,7 @@ app = Flask(__name__)
14
15
  # Register blueprints (keep original paths unchanged)
15
16
  app.register_blueprint(media_bp)
16
17
  app.register_blueprint(subtitles_bp)
18
+ app.register_blueprint(omni_human_bp)
17
19
 
18
20
 
19
21
  if __name__ == "__main__":
@@ -5,6 +5,7 @@ import subprocess
5
5
  import tempfile
6
6
  from pathlib import Path
7
7
  from typing import List, Optional, Dict, Any
8
+ from concurrent.futures import ThreadPoolExecutor
8
9
 
9
10
  from flask import Blueprint, jsonify, request, send_file, after_this_request
10
11
 
@@ -160,13 +161,15 @@ def concat_videos():
160
161
  pass
161
162
  return response
162
163
 
163
- logger.info('Downloading videos')
164
+ logger.info('Downloading videos concurrently')
164
165
  video_paths = []
165
- for url in video_urls:
166
- dl = download_video_from_url(url)
166
+ with ThreadPoolExecutor(max_workers=min(len(video_urls), 5)) as executor:
167
+ download_results = list(executor.map(download_video_from_url, video_urls))
168
+
169
+ for dl in download_results:
167
170
  if dl.get("status") == "error":
168
171
  return jsonify(dl), 400
169
- path = Path(dl["data"]["file_path"]) # type: ignore[index]
172
+ path = Path(dl["data"]["file_path"])
170
173
  temp_files.append(path)
171
174
  video_paths.append(path)
172
175
 
@@ -0,0 +1,34 @@
1
+ from flask import Blueprint, request, jsonify
2
+ from media_agent_mcp.video.omni_human import generate_video_from_omni_human
3
+
4
+ omni_human_bp = Blueprint("omni_human", __name__)
5
+
6
+ @omni_human_bp.post("/generate-video-from-omni-human")
7
+ def generate_video():
8
+ """
9
+ Generates a video from an image and audio using the Omni Human API.
10
+ """
11
+ try:
12
+ data = request.get_json(silent=True) or {}
13
+ image_url = data.get("image_url")
14
+ audio_url = data.get("audio_url")
15
+
16
+ if not image_url or not audio_url:
17
+ return jsonify({
18
+ "status": "error",
19
+ "data": None,
20
+ "message": "Fields image_url and audio_url are required"
21
+ }), 400
22
+
23
+ video_url = generate_video_from_omni_human(image_url, audio_url)
24
+
25
+ return jsonify({
26
+ "status": "success",
27
+ "data": {
28
+ "video_url": video_url
29
+ },
30
+ "message": "Video generated successfully"
31
+ })
32
+
33
+ except Exception as e:
34
+ return jsonify({"status": "error", "data": None, "message": str(e)}), 500
@@ -0,0 +1,118 @@
1
+ import hashlib
2
+ import json
3
+ import os
4
+ import random
5
+ import time
6
+ from typing import Dict, Any
7
+ import requests
8
+
9
+
10
+ def _generate_signature(nonce: int, timestamp: int, security_key: str) -> str:
11
+ """
12
+ Generates a signature for the API request.
13
+ """
14
+ keys = [str(nonce), str(security_key), str(timestamp)]
15
+ keys.sort()
16
+ key_str = "".join(keys).encode("utf-8")
17
+ signature = hashlib.sha1(key_str).hexdigest()
18
+ return signature.lower()
19
+
20
+
21
+ def _submit_task(image_url: str, audio_url: str, api_key: str, security_key: str) -> str:
22
+ """
23
+ Submits a video generation task.
24
+ """
25
+ submit_task_url = "https://cv-api.byteintlapi.com/api/common/v2/submit_task"
26
+ timestamp = int(time.time())
27
+ nonce = random.randint(0, (1 << 31) - 1)
28
+ signature = _generate_signature(nonce, timestamp, security_key)
29
+
30
+ params = {
31
+ "api_key": api_key,
32
+ "timestamp": str(timestamp),
33
+ "nonce": str(nonce),
34
+ "sign": signature,
35
+ }
36
+ headers = {"Content-Type": "application/json"}
37
+ body = {
38
+ "req_key": "realman_avatar_picture_omni_cv",
39
+ "image_url": image_url,
40
+ "audio_url": audio_url,
41
+ }
42
+
43
+ response = requests.post(submit_task_url, params=params, headers=headers, json=body)
44
+ response.raise_for_status()
45
+ data = response.json()
46
+ if data["code"] != 10000:
47
+ raise Exception(f"Failed to submit task: {data['message']}")
48
+ return data["data"]["task_id"]
49
+
50
+
51
+ def _get_task_result(task_id: str, api_key: str, security_key: str) -> Dict[str, Any]:
52
+ """
53
+ Gets the result of a video generation task.
54
+ """
55
+ get_result_url = "https://cv-api.byteintlapi.com/api/common/v2/get_result"
56
+ timestamp = int(time.time())
57
+ nonce = random.randint(0, (1 << 31) - 1)
58
+ signature = _generate_signature(nonce, timestamp, security_key)
59
+
60
+ params = {
61
+ "api_key": api_key,
62
+ "timestamp": str(timestamp),
63
+ "nonce": str(nonce),
64
+ "sign": signature,
65
+ }
66
+ headers = {"Content-Type": "application/json"}
67
+ body = {
68
+ "req_key": "realman_avatar_picture_omni_cv",
69
+ "task_id": task_id,
70
+ }
71
+
72
+ response = requests.post(get_result_url, params=params, headers=headers, json=body)
73
+ print(response.text)
74
+ response.raise_for_status()
75
+ return response.json()
76
+
77
+
78
+ def generate_video_from_omni_human(image_url: str, audio_url: str) -> str:
79
+ """
80
+ Generates a video from an image and audio using the Omni Human API.
81
+
82
+ Args:
83
+ image_url: The URL of the portrait image.
84
+ audio_url: The URL of the audio.
85
+
86
+ Returns:
87
+ The URL of the generated video.
88
+ """
89
+ api_key = os.environ.get("OMNI_HUMAN_AK")
90
+ security_key = os.environ.get("OMNI_HUMAN_SK")
91
+
92
+ if not api_key or not security_key:
93
+ raise ValueError("OMNI_HUMAN_AK and OMNI_HUMAN_SK environment variables must be set")
94
+
95
+ task_id = _submit_task(image_url, audio_url, api_key, security_key)
96
+ print('Submitted task, task_id:', task_id)
97
+ while True:
98
+ result = _get_task_result(task_id, api_key, security_key)
99
+ if result["code"] != 10000:
100
+ raise Exception(f"Failed to get task result: {result['message']}")
101
+
102
+ status = result.get("data", {}).get("status")
103
+ if status == "done":
104
+ # Parse resp_data JSON string to get video_url
105
+ resp_data_str = result["data"].get("resp_data", "{}")
106
+ try:
107
+ resp_data = json.loads(resp_data_str)
108
+ video_url = resp_data.get("video_url")
109
+ if video_url:
110
+ return video_url
111
+ else:
112
+ raise Exception(f"No video_url found in response: {resp_data}")
113
+ except json.JSONDecodeError as e:
114
+ raise Exception(f"Failed to parse resp_data JSON: {e}")
115
+ elif status in ["failed", "error"]:
116
+ raise Exception(f"Video generation failed: {result}")
117
+
118
+ time.sleep(5)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: media-agent-mcp
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: A Model Context Protocol server for media processing with AI tools
5
5
  Author-email: Media Agent Team <team@mediaagent.com>
6
6
  Keywords: mcp,ai,media,video,image,processing
@@ -26,6 +26,7 @@ Requires-Dist: loguru>=0.7.3
26
26
  Requires-Dist: imageio-ffmpeg>=0.4.0
27
27
  Requires-Dist: Flask>=3.0.0
28
28
  Requires-Dist: pydub>=0.25.1
29
+ Requires-Dist: gunicorn>=22.0.0
29
30
  Requires-Dist: audioop-lts; python_version >= "3.13"
30
31
  Requires-Dist: google-genai>=1.33.0
31
32
  Requires-Dist: mcp==1.11.0
@@ -25,6 +25,7 @@ src/media_agent_mcp/be/__init__.py
25
25
  src/media_agent_mcp/be/app.py
26
26
  src/media_agent_mcp/be/pyproject.toml
27
27
  src/media_agent_mcp/be/routes_media.py
28
+ src/media_agent_mcp/be/routes_omni_human.py
28
29
  src/media_agent_mcp/be/routes_subtitles.py
29
30
  src/media_agent_mcp/be/utils.py
30
31
  src/media_agent_mcp/be/uv.lock
@@ -32,6 +33,7 @@ src/media_agent_mcp/be/__pycache__/__init__.cpython-312.pyc
32
33
  src/media_agent_mcp/be/__pycache__/app.cpython-312.pyc
33
34
  src/media_agent_mcp/be/__pycache__/routes_media.cpython-312.pyc
34
35
  src/media_agent_mcp/be/__pycache__/routes_omni.cpython-312.pyc
36
+ src/media_agent_mcp/be/__pycache__/routes_omni_human.cpython-312.pyc
35
37
  src/media_agent_mcp/be/__pycache__/routes_subtitles.cpython-312.pyc
36
38
  src/media_agent_mcp/be/__pycache__/utils.cpython-312.pyc
37
39
  src/media_agent_mcp/be/fonts/en/EduNSWACTCursive-VariableFont_wght.ttf
@@ -48,6 +50,7 @@ src/media_agent_mcp/media_selectors/video_selector.py
48
50
  src/media_agent_mcp/storage/__init__.py
49
51
  src/media_agent_mcp/storage/tos_client.py
50
52
  src/media_agent_mcp/video/__init__.py
53
+ src/media_agent_mcp/video/omni_human.py
51
54
  src/media_agent_mcp/video/processor.py
52
55
  src/media_agent_mcp/video/stack.py
53
56
  src/media_agent_mcp/video/subtitle.py
@@ -13,6 +13,7 @@ loguru>=0.7.3
13
13
  imageio-ffmpeg>=0.4.0
14
14
  Flask>=3.0.0
15
15
  pydub>=0.25.1
16
+ gunicorn>=22.0.0
16
17
  google-genai>=1.33.0
17
18
  mcp==1.11.0
18
19