antimoji / app.py
luguog's picture
Create app.py
1768102 verified
raw
history blame
3.87 kB
# app.py (runs on Hugging Face Spaces w/ Firebase Firestore)
import gradio as gr
from PIL import Image, ImageDraw, ImageFont
import hashlib
import requests
import firebase_admin
from firebase_admin import credentials, firestore
import os
from io import BytesIO
# 🔐 Firebase Setup (replace with your Firebase project credentials)
cred_json = {
  "type": "service_account",
  "project_id": "YOUR_PROJECT_ID",
  "private_key_id": "YOUR_KEY_ID",
  "private_key": "-----BEGIN PRIVATE KEY-----\\nYOUR_PRIVATE_KEY\\n-----END PRIVATE KEY-----\\n",
  "client_email": "[email protected]",
  "client_id": "your_client_id",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-xxx%40your-project.iam.gserviceaccount.com"
}
if not firebase_admin._apps:
    cred = credentials.Certificate(cred_json)
    firebase_admin.initialize_app(cred)
db = firestore.client()
# 🤖 Hugging Face Emoji Gen
HF_TOKEN = os.getenv("HF_TOKEN", "")
HF_MODEL = "valhalla/emoji-diffusion"
def hf_generate_emoji(prompt):
    headers = {"Authorization": f"Bearer {HF_TOKEN}"}
    payload = {"inputs": prompt}
    response = requests.post(
        f"https://api-inference.huggingface.co/models/{HF_MODEL}",
        headers=headers,
        json=payload,
    )
    if response.status_code != 200:
        raise ValueError("Hugging Face API failed")
    return Image.open(BytesIO(response.content))
# 🎯 Fingerprint = hash of emoji image
def compute_fingerprint(img: Image.Image) -> str:
    gray = img.convert("L").resize((32, 32))
    return hashlib.sha256(gray.tobytes()).hexdigest()
# 🏷 Overlay micro-ad / sponsor
def embed_ad(img: Image.Image, tag: str) -> Image.Image:
    draw = ImageDraw.Draw(img)
    font = ImageFont.load_default()
    draw.text((img.width - 30, img.height - 12), tag[:3].upper(), fill="yellow", font=font)
    return img
# 🧠 Full pipeline: gen → fingerprint → save to Firestore
def process(prompt, sponsor=""):
    img = hf_generate_emoji(prompt).resize((128,128))
    if sponsor:
        img = embed_ad(img, sponsor)
    fingerprint = compute_fingerprint(img)
    doc_ref = db.collection("emojis").document(fingerprint)
    doc = doc_ref.get()
    if not doc.exists:
        doc_ref.set({
            "prompt": prompt,
            "sponsor": sponsor,
            "usage": 0,
        })
    return img, fingerprint
# 🔁 Increment emoji usage count
def use_emoji(fp):
    doc_ref = db.collection("emojis").document(fp)
    doc = doc_ref.get()
    if doc.exists:
        new_usage = doc.to_dict()["usage"] + 1
        doc_ref.update({"usage": new_usage})
        return f"Usage count updated: {new_usage}"
    return "Emoji not found"
# 🎛 Gradio App
with gr.Blocks() as demo:
    gr.Markdown("# 🧬 Emoji Factory: Generate, Track & Embed Micro-Ads")
    with gr.Row():
        prompt = gr.Textbox(label="Enter your idea prompt (e.g. pig vault rocket)")
        sponsor = gr.Textbox(label="Sponsor / Ad Tag (optional)")
    gen_btn = gr.Button("🚀 Generate Emoji")
    emoji_out = gr.Image(label="Generated Emoji")
    fp_out = gr.Textbox(label="Emoji Fingerprint")
    use_btn = gr.Button("🔁 Use Emoji")
    result = gr.Textbox(label="Usage Count / Message")
    gen_btn.click(fn=process, inputs=[prompt, sponsor], outputs=[emoji_out, fp_out])
    use_btn.click(fn=use_emoji, inputs=[fp_out], outputs=[result])
demo.launch()