Spaces:
Running
Running
feat: return signed media URLs with published outputs
Browse files
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(
|