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.
Files changed (55) hide show
  1. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/PKG-INFO +1 -1
  2. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/pyproject.toml +1 -1
  3. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/async_server.py +24 -63
  4. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/PKG-INFO +1 -1
  5. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/README.md +0 -0
  6. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/setup.cfg +0 -0
  7. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/__init__.py +0 -0
  8. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/__init__.py +0 -0
  9. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/omni_human.py +0 -0
  10. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/openaiedit.py +0 -0
  11. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/seed16.py +0 -0
  12. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/seedance.py +0 -0
  13. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/seededit.py +0 -0
  14. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/seedream.py +0 -0
  15. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/ai_models/tts.py +0 -0
  16. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/async_wrapper.py +0 -0
  17. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/audio/combiner.py +0 -0
  18. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/audio/speed_controller.py +0 -0
  19. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/audio/tts.py +0 -0
  20. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/README.md +0 -0
  21. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__init__.py +0 -0
  22. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/__init__.cpython-312.pyc +0 -0
  23. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/app.cpython-312.pyc +0 -0
  24. {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
  25. {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
  26. {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
  27. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/__pycache__/utils.cpython-312.pyc +0 -0
  28. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/app.py +0 -0
  29. {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
  30. {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
  31. {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
  32. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/fonts/zh/MaShanZheng-Regular.ttf +0 -0
  33. {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
  34. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/fonts/zh/ZCOOLXiaoWei-Regular.ttf +0 -0
  35. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/pyproject.toml +0 -0
  36. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/routes_media.py +0 -0
  37. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/routes_subtitles.py +0 -0
  38. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/utils.py +0 -0
  39. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/be/uv.lock +0 -0
  40. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/install_tools/__init__.py +0 -0
  41. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/install_tools/installer.py +0 -0
  42. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/media_selectors/__init__.py +0 -0
  43. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/media_selectors/image_selector.py +0 -0
  44. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/media_selectors/video_selector.py +0 -0
  45. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/storage/__init__.py +0 -0
  46. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/storage/tos_client.py +0 -0
  47. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/video/__init__.py +0 -0
  48. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/video/processor.py +0 -0
  49. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/video/stack.py +0 -0
  50. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp/video/subtitle.py +0 -0
  51. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/SOURCES.txt +0 -0
  52. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/dependency_links.txt +0 -0
  53. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/entry_points.txt +0 -0
  54. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/src/media_agent_mcp.egg-info/requires.txt +0 -0
  55. {media_agent_mcp-2.6.12 → media_agent_mcp-2.6.14}/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.6.12
3
+ Version: 2.6.14
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "media-agent-mcp"
3
- version = "2.6.12"
3
+ version = "2.6.14"
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"
@@ -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
- class SessionErrorHandlingMiddleware(BaseHTTPMiddleware):
213
- """Middleware to handle ClosedResourceError and auto-regenerate sessions."""
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
- async def dispatch(self, request: Request, call_next):
216
- try:
217
- response = await call_next(request)
218
- return response
219
- except anyio.ClosedResourceError as e:
220
- logger.warning(f"ClosedResourceError detected: {e}")
221
-
222
- # Extract session_id from request
223
- session_id = self._extract_session_id(request)
224
- if session_id:
225
- # Generate new session ID
226
- new_session_id = session_manager.generate_session_id()
227
-
228
- # Add route mapping
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 session error handling middleware
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 SessionErrorHandlingMiddleware and global ClosedResourceError handler for automatic session recovery")
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(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: media-agent-mcp
3
- Version: 2.6.12
3
+ Version: 2.6.14
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