{escaped_title}
{escaped_description}
영상 보기"""영상 공유 링크용 Open Graph HTML 생성 서비스.""" from dataclasses import dataclass from html import escape from urllib.parse import urlsplit, urlunsplit from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.home.models import Project from app.video.models import Video FALLBACK_FRONTEND_URL = "https://ado2.o2osolution.ai" DEFAULT_SHARE_IMAGE_PATH = "/assets/images/ado2_image.png" DEFAULT_SHARE_IMAGE_STATIC_PATH = "/static/images/ado2_image.png" @dataclass(frozen=True, slots=True) class VideoShareData: """공유 페이지에 필요한 영상 및 프로젝트 정보.""" video_id: int poster_url: str | None store_name: str region: str async def get_video_share_data( session: AsyncSession, video_id: int, ) -> VideoShareData | None: """공유 가능한 완료 영상을 프로젝트 정보와 함께 조회합니다.""" result = await session.execute( select( Video.id, Video.poster_url, Project.store_name, Project.region, ) .join(Project, Video.project_id == Project.id) .where( Video.id == video_id, Video.status == "completed", Video.is_deleted.is_(False), Project.is_deleted.is_(False), ) ) row = result.one_or_none() if row is None: return None return VideoShareData( video_id=row.id, poster_url=row.poster_url, store_name=row.store_name, region=row.region, ) def build_video_share_html( data: VideoShareData, *, share_url: str, frontend_base_url: str, configured_default_image_url: str = "", ) -> str: """영상별 OG 메타데이터와 상세 화면 이동 기능을 포함한 HTML을 생성합니다.""" frontend_base = _normalise_frontend_base_url(frontend_base_url) detail_url = f"{frontend_base}/video/{data.video_id}" fallback_image_url = _resolve_default_image_url( configured_default_image_url, frontend_base, share_url=share_url, ) image_url = _absolute_http_url(data.poster_url) or fallback_image_url store_name = _normalise_text(data.store_name, "ADO2 영상") region = _normalise_text(data.region, "") title = f"{store_name} | ADO2" description = ( f"{region} · {store_name} 어떤 내용이 들어가야할지 정해야 합니다. 기존 영상 업로드시에 생성되는 내용을 사용하려면 db에 저장하고 업로드 할때마다 변경되는 부분을 전부 수정해야 합니다." if region else "ADO2 AI 마케팅 영상" ) escaped_title = escape(title, quote=True) escaped_description = escape(description, quote=True) escaped_image_url = escape(image_url, quote=True) escaped_share_url = escape(_absolute_http_url(share_url) or detail_url, quote=True) escaped_detail_url = escape(detail_url, quote=True) return f"""
{escaped_description}
영상 보기