Explorer
/proc/10/root/tmp/resume_carousel_function.py
← Zurück ↓ Download
from pathlib import Path
p=Path('/opt/struktur/social-media-agent/publish_ready.py'); s=p.read_text(); start=s.index('def generate_carousel_for_package('); end=s.index('\n\ndef build_media_brief',start)
replacement='''def generate_carousel_for_package(package_id: str) -> dict:
    """Create or resume exactly one five-slide carousel for a package."""
    con=sqlite3.connect(CASES_DB); con.row_factory=sqlite3.Row; row=con.execute("SELECT * FROM publication_packages WHERE package_id=?",(package_id,)).fetchone()
    if not row: con.close(); raise ValueError("publication package not found")
    package=dict(row); topic=_text(package.get("topic")); decision=assess_media_type(package)
    if decision["media_type"] != "carousel": con.close(); raise ValueError("Package ist nicht für Carousel geeignet")
    existing=con.execute("SELECT * FROM carousels WHERE package_id=? ORDER BY created_at DESC LIMIT 1",(package_id,)).fetchone()
    if existing and con.execute("SELECT count(*) FROM carousel_slides WHERE carousel_id=?",(existing["carousel_id"],)).fetchone()[0] < 5:
        carousel_id=existing["carousel_id"]; briefrow=con.execute("SELECT * FROM media_briefs WHERE media_brief_id=?",(existing["media_brief_id"],)).fetchone(); brief=dict(briefrow)
        for key in ("required_objects_json","technical_requirements_json","avoid_motifs_json","avoid_technical_errors_json","reference_assets_json","feedback_rules_json"):
            try: brief[key.removesuffix("_json")]=json.loads(brief.pop(key) or "[]")
            except (TypeError,json.JSONDecodeError): brief[key.removesuffix("_json")]=[]
    else:
        carousel_id=f"CAR-{uuid.uuid4()}"; feedback_text,feedback_rules=feedback_prompt_text(package); reference_asset=None
        try:
            ref_path,ref_label=internal_asset_for_package(package)
            if ref_path and ref_path.is_file(): reference_asset={"path":str(ref_path),"label":ref_label,"source":"media_catalog"}
        except Exception: reference_asset=None
        brief=build_media_brief(package,feedback_rules,reference_asset,carousel_id); persist_media_brief(con,brief)
        con.execute("INSERT INTO carousels(carousel_id,package_id,media_brief_id,slide_count,media_type,media_type_reason,created_at) VALUES(?,?,?,?,?,?,?)",(carousel_id,package_id,brief["media_brief_id"],5,"carousel",decision["reason"],_now())); con.commit()
    slides=build_carousel_slides(package); _validate_carousel_slides(slides); reports=[]
    reference=Path(brief["reference_assets"][0]["path"]) if brief.get("reference_assets") else None
    for slide in slides:
        prompt=media_brief_prompt(brief,1)+f" Carousel-Slide {slide['slide_number']} Zweck: {slide['purpose']}. Sichtbares Motiv: {slide['motif']}. Keine Schrift oder Zahlen im Bild; Text wird später deterministisch als Layout aufgebracht."
        target=(BASE_DIR/"generated_visuals"/f"{package['signal_id']}_{carousel_id[-8:]}_slide-{slide['slide_number']}.png").resolve()
        try:
            if target.is_file() and not con.execute("SELECT 1 FROM carousel_slides WHERE carousel_id=? AND slide_number=?",(carousel_id,slide["slide_number"])).fetchone():
                generated={"origin_path":"","path":str(target)}
            else:
                generated=generate_with_codex(prompt,target,reference_image=reference)
            qa=run_image_qa(target,topic,_text(package.get("final_text") or package.get("facebook_text"))); _render_carousel_slide_text(target,slide); data=target.read_bytes(); sha=hashlib.sha256(data).hexdigest()
            if not con.execute("SELECT 1 FROM carousel_slides WHERE carousel_id=? AND slide_number=?",(carousel_id,slide["slide_number"])).fetchone():
                con.execute("INSERT INTO carousel_slides(slide_id,carousel_id,package_id,slide_number,slide_count,purpose,statement,image_path,origin_path,sha256,file_bytes,generator,prompt,media_brief_id,qa_status,qa_report_json,qa_failure_reasons,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",(f"SLIDE-{uuid.uuid4()}",carousel_id,package_id,slide["slide_number"],5,slide["purpose"],slide["statement"],str(target),generated.get("origin_path",""),sha,len(data),"Codex built-in image_gen",prompt,brief["media_brief_id"],"passed" if qa_passes(qa) else "failed",json.dumps(qa,ensure_ascii=False),"; ".join(qa.get("failure_reasons",[])),_now()))
            reports.append({"slide":slide["slide_number"],"path":str(target),"sha256":sha,"bytes":len(data),"qa":qa})
        except (CodexImageError,CodexImageQAError,OSError,ValueError) as exc:
            reports.append({"slide":slide["slide_number"],"qa":{"overall":"FAIL","failure_reasons":[str(exc)]},"error":str(exc)})
        con.commit()
    con.execute("UPDATE publication_packages SET media_type='carousel',media_type_reason=?,human_visual_approval='offen' WHERE package_id=?",(decision["reason"],package_id)); con.commit(); con.close()
    return {"carousel_id":carousel_id,"media_brief_id":brief["media_brief_id"],"slides":reports,"media_type":"carousel"}
'''
p.write_text(s[:start]+replacement+s[end:]); print('carousel function made resumable')