diff --git a/app/integrations/llm/schemas/plan.py b/app/integrations/llm/schemas/plan.py index 819842f..fc2c8cd 100644 --- a/app/integrations/llm/schemas/plan.py +++ b/app/integrations/llm/schemas/plan.py @@ -16,8 +16,8 @@ class PlanInput(BaseModel): market_trend: str | None = None market_target_audience: str | None = None tiktok: str | None = None - instagram_en: str | None = None - facebook_en: str | None = None + instagram: str | None = None + facebook: str | None = None naver_blog: str | None = None naver_cafe: str | None = None kakao_talk: str | None = None diff --git a/app/services/analysis.py b/app/services/analysis.py index 8dec2d7..0bf7695 100644 --- a/app/services/analysis.py +++ b/app/services/analysis.py @@ -26,6 +26,26 @@ async def generate_plan(analysis_run_id: str) -> PlanOutput: report = await select_run_report_data(analysis_run_id) market = await select_market(analysis_run_id) + + mainpage = raw.get(SourceType.MAINPAGE) or [] + mainpage = mainpage[0]["raw_data"] # 유일 + branding = raw.get(SourceType.BRANDING) or [] + branding = branding[0]["raw_data"] # 유일 + instagram = raw.get(SourceType.INSTAGRAM) or [] + facebook = raw.get(SourceType.FACEBOOK) or [] + youtube = raw.get(SourceType.YOUTUBE) or [] + youtube = youtube[0]["raw_data"] if youtube else None # 유일 (기획상) + gangnam_unni = raw.get(SourceType.GANGNAM_UNNI) or [] + gangnam_unni = gangnam_unni[0]["raw_data"] if gangnam_unni else None# 유일 (기획상) + naver_blog = raw.get(SourceType.NAVER_BLOG) or [] + naver_blog = naver_blog[0]["raw_data"] if naver_blog else None# 유일 (기획상) + tiktok = raw.get(SourceType.TIKTOK) or [] + tiktok = tiktok[0]["raw_data"] if tiktok else None# 유일 (기획상) + naver_cafe = raw.get(SourceType.NAVER_CAFE) or [] + naver_cafe = naver_cafe[0]["raw_data"] if naver_cafe else None# 유일 (기획상) + kakaotalk = raw.get(SourceType.KAKAOTALK) or [] + kakaotalk = kakaotalk[0]["raw_data"] if kakaotalk else None# 유일 (기획상) + def _json(v) -> str | None: return json.dumps(v, ensure_ascii=False) if v else None @@ -42,12 +62,12 @@ async def generate_plan(analysis_run_id: str) -> PlanOutput: "market_keywords": _json(market.get("keywords")), "market_trend": _json(market.get("trend")), "market_target_audience": _json(market.get("target_audience")), - "tiktok": _json(raw.get(SourceType.TIKTOK)), - "instagram_en": _json(raw.get(SourceType.INSTAGRAM)), - "facebook_en": _json(raw.get(SourceType.FACEBOOK)), - "naver_blog": _json(_naver_blog_summary(raw.get(SourceType.NAVER_BLOG))), - "naver_cafe": _json(raw.get(SourceType.NAVER_CAFE)), - "kakao_talk": _json(raw.get(SourceType.KAKAOTALK)), + "tiktok": _json(tiktok), + "instagram": _json(instagram), + "facebook": _json(facebook), + "naver_blog": _json(_naver_blog_summary(naver_blog)), + "naver_cafe": _json(naver_cafe), + "kakao_talk": _json(kakaotalk), "channel_logos": _json(branding.get("channelLogos")), "brand_assets": _json(branding.get("brandAssets")), } @@ -200,7 +220,7 @@ async def _build_other_channels(raw: dict) -> list[dict]: result: OtherChannelsOutput = await LLMService(provider="perplexity").generate( other_channels_prompt, { - "clinic_name": (raw.get(SourceType.MAINPAGE) or [{}])[0].get("clinicName"), + "clinic_name": (raw.get(SourceType.MAINPAGE) or [{}])[0]["raw_data"].get("clinicName"), "tiktok": json.dumps(raw.get(SourceType.TIKTOK), ensure_ascii=False), "kakao_talk": json.dumps(raw.get(SourceType.KAKAOTALK), ensure_ascii=False), "naver_cafe": json.dumps(raw.get(SourceType.NAVER_CAFE), ensure_ascii=False), diff --git a/app/services/branding.py b/app/services/branding.py index 8fc7081..17705dd 100644 --- a/app/services/branding.py +++ b/app/services/branding.py @@ -16,7 +16,7 @@ async def _describe_logo(analysis_run_id: str, info_id: int, vc: VisionClient) - """공식 로고 정성 묘사. branding raw_info["brandAssets"] 머지. 호출 우선순위: raw_info.logo_url 컬럼 (HTML parser canonical) → firecrawl 메타 fallback.""" raw = await select_run_raw_data(analysis_run_id) - mainpage = raw.get("mainpage") or {} + mainpage = ((raw.get("mainpage") or [{}])[0].get("raw_data")) or {} homepage_url = mainpage.get("sourceUrl") or "" branding_meta = mainpage.get("branding") or {} column_logo = await select_mainpage_logo_url(analysis_run_id) @@ -57,7 +57,7 @@ async def _describe_channel_logos(analysis_run_id: str, info_id: int, vc: Vision } logos = [{"channel": label, "url": img} for key, label in _label.items() - if (img := (raw.get(key) or {}).get("_logo_url"))] + if (img := (raw.get(key) or [{}])[0].get("logo_url"))] if not logos: logger.info("[channel_logos] skip — no channel profileImages") return diff --git a/app/services/collect.py b/app/services/collect.py index 16411a8..d27c71b 100644 --- a/app/services/collect.py +++ b/app/services/collect.py @@ -156,7 +156,7 @@ async def collect_kakaotalk(analysis_run_id: str, info_id: int, url: str) -> Non async def collect_brand_basics(analysis_run_id: str, info_id: int) -> None: logger.info("[brand_basics] start run=%s info=%s", analysis_run_id, info_id) raw = await select_run_raw_data(analysis_run_id) - mainpage = raw.get("mainpage") or {} + mainpage = ((raw.get("mainpage") or [{}])[0].get("raw_data")) or {} homepage_url = mainpage.get("sourceUrl") or "" branding_meta = mainpage.get("branding") or {} diff --git a/app/services/facebook_audit.py b/app/services/facebook_audit.py index 2091b6a..ede8be1 100644 --- a/app/services/facebook_audit.py +++ b/app/services/facebook_audit.py @@ -82,7 +82,11 @@ def _logo_data(channel_logos: dict, channel: str) -> dict: for c in (channel_logos or {}).get("channel_logos", []): if c.get("channel") == channel: return c - return {} + print("channel_logos NOT FOUND : ", channel_logos) + return { + "is_official" : False, + "logo_description" : "로고 찾지 못함" + } def _page_patch(item: dict, channel_logos) -> dict: p: dict = {} diff --git a/app/services/market.py b/app/services/market.py index 421e901..a234047 100644 --- a/app/services/market.py +++ b/app/services/market.py @@ -31,7 +31,7 @@ async def run_market_analysis(analysis_run_id: str) -> None: run = await select_run(analysis_run_id) clinic = await select_hospital(run["hospital_id"]) raw = await select_run_raw_data(analysis_run_id) - mainpage = raw.get("mainpage") or {} + mainpage = ((raw.get("mainpage") or [{}])[0].get("raw_data")) or {} clinic_name = (clinic or {}).get("hospital_name") or "" address = (clinic or {}).get("road_address") or ""