basyx commited on
Commit
24164b9
·
verified ·
1 Parent(s): 18ef40a

feat: return signed media URLs with published outputs

Browse files
Files changed (1) hide show
  1. app/services/media_service.py +4 -0
app/services/media_service.py CHANGED
@@ -19,6 +19,7 @@ from app.services.whisper_service import WhisperService
19
  from app.services.ytdlp_service import YTDLPService
20
  from app.security.assets import CanonicalAssetService
21
  from app.security.context import auth_context
 
22
 
23
  logger = get_logger(__name__)
24
  Operation = Callable[
@@ -164,6 +165,7 @@ class MediaProcessor:
164
  ) -> SuccessResponse:
165
  """Publish a result and build the shared structured success response."""
166
  download_url: str | None = None
 
167
  output_size = 0
168
  canonical_asset_id: str | None = None
169
  if result.path is not None:
@@ -173,6 +175,7 @@ class MediaProcessor:
173
  output_size = published.stat().st_size
174
  base_url = self.settings.base_url.rstrip("/")
175
  download_url = f"{base_url}/v1/media/{resolved.request_id}/{published.name}"
 
176
  # Outputs are registered by the pipeline, never claimed later by
177
  # a user-supplied path. Anonymous deployments retain legacy media
178
  # behavior but cannot use the social ownership boundary.
@@ -194,6 +197,7 @@ class MediaProcessor:
194
  "inputs": probe_metadata,
195
  "output_size": output_size,
196
  **({"asset_id": canonical_asset_id} if canonical_asset_id else {}),
 
197
  **(extra_metadata or {}),
198
  }
199
  logger.info(
 
19
  from app.services.ytdlp_service import YTDLPService
20
  from app.security.assets import CanonicalAssetService
21
  from app.security.context import auth_context
22
+ from app.services.media_url_signer import MediaURLSigner
23
 
24
  logger = get_logger(__name__)
25
  Operation = Callable[
 
165
  ) -> SuccessResponse:
166
  """Publish a result and build the shared structured success response."""
167
  download_url: str | None = None
168
+ signed_url: str | None = None
169
  output_size = 0
170
  canonical_asset_id: str | None = None
171
  if result.path is not None:
 
175
  output_size = published.stat().st_size
176
  base_url = self.settings.base_url.rstrip("/")
177
  download_url = f"{base_url}/v1/media/{resolved.request_id}/{published.name}"
178
+ signed_url = MediaURLSigner(self.settings).sign(resolved.request_id, published.name)
179
  # Outputs are registered by the pipeline, never claimed later by
180
  # a user-supplied path. Anonymous deployments retain legacy media
181
  # behavior but cannot use the social ownership boundary.
 
197
  "inputs": probe_metadata,
198
  "output_size": output_size,
199
  **({"asset_id": canonical_asset_id} if canonical_asset_id else {}),
200
+ **({"signed_url": signed_url} if signed_url else {}),
201
  **(extra_metadata or {}),
202
  }
203
  logger.info(