|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
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() |
|
|
|
|
|
|
|
|
|
|
|
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)) |
|
|
|
|
|
|
|
|
|
|
|
def compute_fingerprint(img: Image.Image) -> str: |
|
|
|
gray = img.convert("L").resize((32, 32)) |
|
|
|
return hashlib.sha256(gray.tobytes()).hexdigest() |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
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" |
|
|
|
|
|
|
|
|
|
|
|
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() |