75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
"""Art-DAG oEmbed endpoint.
|
|
|
|
Returns oEmbed JSON responses for Art-DAG content (media, recipes, effects, runs).
|
|
"""
|
|
|
|
import os
|
|
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import JSONResponse
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/oembed")
|
|
async def oembed(request: Request):
|
|
url = request.query_params.get("url", "")
|
|
if not url:
|
|
return JSONResponse({"error": "url parameter required"}, status_code=400)
|
|
|
|
# Parse URL to extract content type and CID
|
|
# URL patterns: /cache/{cid}, /recipes/{cid}, /effects/{cid}, /runs/{cid}
|
|
from urllib.parse import urlparse
|
|
|
|
parsed = urlparse(url)
|
|
parts = [p for p in parsed.path.strip("/").split("/") if p]
|
|
|
|
if len(parts) < 2:
|
|
return JSONResponse({"error": "could not parse content URL"}, status_code=404)
|
|
|
|
content_type = parts[0].rstrip("s") # recipes -> recipe, runs -> run
|
|
cid = parts[1]
|
|
|
|
import database
|
|
|
|
title = cid[:16]
|
|
thumbnail_url = None
|
|
|
|
# Look up metadata
|
|
items = await database.get_item_types(cid)
|
|
if items:
|
|
meta = items[0]
|
|
title = meta.get("filename") or meta.get("description") or title
|
|
|
|
# Try friendly name
|
|
actor_id = meta.get("actor_id")
|
|
if actor_id:
|
|
friendly = await database.get_friendly_name_by_cid(actor_id, cid)
|
|
if friendly:
|
|
title = friendly.get("display_name") or friendly.get("base_name", title)
|
|
|
|
# Media items get a thumbnail
|
|
if meta.get("type") == "media":
|
|
artdag_url = os.getenv("APP_URL_ARTDAG", "https://celery-artdag.rose-ash.com")
|
|
thumbnail_url = f"{artdag_url}/cache/{cid}/raw"
|
|
|
|
elif content_type == "run":
|
|
run = await database.get_run_cache(cid)
|
|
if run:
|
|
title = f"Run {cid[:12]}"
|
|
|
|
artdag_url = os.getenv("APP_URL_ARTDAG", "https://celery-artdag.rose-ash.com")
|
|
|
|
resp = {
|
|
"version": "1.0",
|
|
"type": "link",
|
|
"title": title,
|
|
"provider_name": "art-dag",
|
|
"provider_url": artdag_url,
|
|
"url": url,
|
|
}
|
|
if thumbnail_url:
|
|
resp["thumbnail_url"] = thumbnail_url
|
|
|
|
return JSONResponse(resp)
|