media-agent-mcp 2.6.12__tar.gz → 2.6.14__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.
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/PKG-INFO +1 -1
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/pyproject.toml +1 -1
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/async_server.py +24 -63
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/PKG-INFO +1 -1
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/README.md +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/setup.cfg +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/__init__.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/__init__.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/omni_human.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/openaiedit.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/seed16.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/seedance.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/seededit.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/seedream.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/tts.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/async_wrapper.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/audio/combiner.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/audio/speed_controller.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/audio/tts.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/README.md +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__init__.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/__init__.cpython-312.pyc +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/app.cpython-312.pyc +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/routes_media.cpython-312.pyc +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/routes_omni.cpython-312.pyc +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/routes_subtitles.cpython-312.pyc +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/utils.cpython-312.pyc +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/app.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/fonts/en/EduNSWACTCursive-VariableFont_wght.ttf +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/fonts/en/MozillaText-VariableFont_wght.ttf +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/fonts/en/Roboto_Condensed-Regular.ttf +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/fonts/zh/MaShanZheng-Regular.ttf +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/fonts/zh/NotoSerifSC-VariableFont_wght.ttf +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/fonts/zh/ZCOOLXiaoWei-Regular.ttf +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/pyproject.toml +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/routes_media.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/routes_subtitles.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/utils.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/uv.lock +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/install_tools/__init__.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/install_tools/installer.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/media_selectors/__init__.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/media_selectors/image_selector.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/media_selectors/video_selector.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/storage/__init__.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/storage/tos_client.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/video/__init__.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/video/processor.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/video/stack.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/video/subtitle.py +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/SOURCES.txt +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/dependency_links.txt +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/entry_points.txt +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/requires.txt +0 -0
- {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/top_level.txt +0 -0
@@ -163,15 +163,15 @@ class SessionManager:
|
|
163
163
|
"""Get session object by ID."""
|
164
164
|
return self._sessions.get(session_id)
|
165
165
|
|
166
|
-
def remove_session(self, session_id: str):
|
166
|
+
def remove_session(self, session_id: str, remove_route_mapping: bool = True):
|
167
167
|
"""Remove a session."""
|
168
168
|
if session_id in self._sessions:
|
169
169
|
del self._sessions[session_id]
|
170
|
-
if session_id in self._session_routes:
|
170
|
+
if remove_route_mapping and session_id in self._session_routes:
|
171
171
|
del self._session_routes[session_id]
|
172
172
|
if session_id in self._session_timestamps:
|
173
173
|
del self._session_timestamps[session_id]
|
174
|
-
logger.info(f"Removed session: {session_id}")
|
174
|
+
logger.info(f"Removed session: {session_id} (route_mapping_removed: {remove_route_mapping})")
|
175
175
|
|
176
176
|
def cleanup_expired_sessions(self, max_age_seconds: int = 3600):
|
177
177
|
"""Clean up sessions older than max_age_seconds."""
|
@@ -209,61 +209,25 @@ class SessionManager:
|
|
209
209
|
# Global session manager
|
210
210
|
session_manager = SessionManager()
|
211
211
|
|
212
|
-
|
213
|
-
"""
|
212
|
+
def _extract_session_id_from_url(url: str) -> Optional[str]:
|
213
|
+
"""Extract session_id from URL."""
|
214
|
+
import re
|
215
|
+
from urllib.parse import urlparse, parse_qs
|
214
216
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
session_manager.add_route_mapping(session_id, new_session_id)
|
230
|
-
|
231
|
-
# Remove old session
|
232
|
-
session_manager.remove_session(session_id)
|
233
|
-
|
234
|
-
logger.info(f"Auto-generated new session {new_session_id} to replace expired session {session_id}")
|
235
|
-
|
236
|
-
# Create a redirect response with new session ID
|
237
|
-
new_url = str(request.url).replace(f"session_id={session_id}", f"session_id={new_session_id}")
|
238
|
-
|
239
|
-
from starlette.responses import RedirectResponse
|
240
|
-
return RedirectResponse(url=new_url, status_code=307) # Temporary redirect preserving method
|
241
|
-
|
242
|
-
# If no session_id found, re-raise the error
|
243
|
-
raise e
|
244
|
-
except Exception as e:
|
245
|
-
logger.error(f"Unexpected error in middleware: {e}")
|
246
|
-
raise e
|
247
|
-
|
248
|
-
def _extract_session_id(self, request: Request) -> Optional[str]:
|
249
|
-
"""Extract session_id from request URL or headers."""
|
250
|
-
# Try to get from query parameters
|
251
|
-
session_id = request.query_params.get('session_id')
|
252
|
-
if session_id:
|
253
|
-
return session_id
|
254
|
-
|
255
|
-
# Try to get from path parameters
|
256
|
-
if hasattr(request, 'path_params') and 'session_id' in request.path_params:
|
257
|
-
return request.path_params['session_id']
|
258
|
-
|
259
|
-
# Try to extract from URL path
|
260
|
-
import re
|
261
|
-
path = str(request.url.path)
|
262
|
-
match = re.search(r'session_id=([a-f0-9]+)', str(request.url))
|
263
|
-
if match:
|
264
|
-
return match.group(1)
|
265
|
-
|
266
|
-
return None
|
217
|
+
# Parse the URL
|
218
|
+
parsed = urlparse(url)
|
219
|
+
|
220
|
+
# Try to get from query parameters
|
221
|
+
query_params = parse_qs(parsed.query)
|
222
|
+
if 'session_id' in query_params:
|
223
|
+
return query_params['session_id'][0]
|
224
|
+
|
225
|
+
# Try to extract from URL path using regex
|
226
|
+
match = re.search(r'session_id=([a-f0-9]+)', url)
|
227
|
+
if match:
|
228
|
+
return match.group(1)
|
229
|
+
|
230
|
+
return None
|
267
231
|
|
268
232
|
# Global exception handler for ClosedResourceError
|
269
233
|
async def handle_closed_resource_error(request, exc):
|
@@ -279,7 +243,7 @@ async def handle_closed_resource_error(request, exc):
|
|
279
243
|
# Generate new session ID
|
280
244
|
new_session_id = session_manager.generate_session_id()
|
281
245
|
session_manager.add_route_mapping(session_id, new_session_id)
|
282
|
-
session_manager.remove_session(session_id)
|
246
|
+
session_manager.remove_session(session_id, remove_route_mapping=False)
|
283
247
|
|
284
248
|
logger.info(f"Global handler: Generated new session {new_session_id} to replace {session_id}")
|
285
249
|
|
@@ -825,16 +789,13 @@ def main():
|
|
825
789
|
mcp.settings.host = args.host
|
826
790
|
mcp.settings.port = args.port
|
827
791
|
|
828
|
-
# Get the SSE app and add
|
792
|
+
# Get the SSE app and add global exception handler
|
829
793
|
sse_app = mcp.sse_app()
|
830
794
|
|
831
|
-
# Add session error handling middleware
|
832
|
-
sse_app.add_middleware(SessionErrorHandlingMiddleware)
|
833
|
-
|
834
795
|
# Add global exception handler for ClosedResourceError
|
835
796
|
sse_app.add_exception_handler(anyio.ClosedResourceError, handle_closed_resource_error)
|
836
797
|
|
837
|
-
logger.info("Added
|
798
|
+
logger.info("Added global ClosedResourceError handler for automatic session recovery")
|
838
799
|
|
839
800
|
# Use uvicorn to run SSE app with extended keep-alive timeout (5 minutes)
|
840
801
|
uvicorn.run(
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/omni_human.py
RENAMED
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/openaiedit.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/audio/speed_controller.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/routes_subtitles.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/install_tools/__init__.py
RENAMED
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/install_tools/installer.py
RENAMED
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/media_selectors/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/dependency_links.txt
RENAMED
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/entry_points.txt
RENAMED
File without changes
|
File without changes
|
{media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/top_level.txt
RENAMED
File without changes
|