|
import gradio as gr |
|
from bs4 import BeautifulSoup |
|
import json |
|
import requests |
|
|
|
|
|
|
|
|
|
TONE_OPTIONS = ["Friendly", "Humanized", "Engaging", "Funny", "Emotional"] |
|
|
|
|
|
|
|
|
|
def extract_main_content(html_text): |
|
try: |
|
soup = BeautifulSoup(html_text, "html.parser") |
|
article = soup.find("article") or soup.body |
|
text = article.get_text(separator="\n", strip=True) if article else "" |
|
print("[extract_main_content] Successfully extracted main content.") |
|
return text |
|
except Exception as e: |
|
print(f"[extract_main_content] Error: {e}") |
|
return "" |
|
|
|
|
|
|
|
|
|
def build_prompt(text, tones, platform, blog_link): |
|
try: |
|
tone_str = ", ".join(tones) |
|
print(f"[build_prompt] Using tones: {tone_str} for platform: {platform}") |
|
|
|
|
|
return f""" |
|
You are a skilled content writer. Based on the content below, generate a post for {platform}. |
|
The post should feel like someone sharing a personal experience or story related to the topic. |
|
Make it {tone_str.lower()}, natural, and relatable. Include a catchy title to hook readers, and a body that encourages responses. |
|
|
|
--- |
|
{text} |
|
--- |
|
|
|
And by the way, if you're curious about my fermentation experiments or want to join in on the fun, feel free to check out my blog! I've got all sorts of tips, tricks, and beginner-friendly recipes to help you start your own fermentation journey. {blog_link} – hope to see you there! |
|
""" |
|
except Exception as e: |
|
print(f"[build_prompt] Error: {e}") |
|
return "" |
|
|
|
|
|
|
|
|
|
def generate_post(api_key, text, tones, platform, blog_link): |
|
try: |
|
headers = {"Content-Type": "application/json"} |
|
prompt = build_prompt(text, tones, platform, blog_link) |
|
data = { |
|
"contents": [{"parts": [{"text": prompt}]}] |
|
} |
|
print("[generate_post] Sending request to Gemini API...") |
|
response = requests.post( |
|
f"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent?key={api_key}", |
|
headers=headers, |
|
data=json.dumps(data) |
|
) |
|
print(f"[generate_post] Response status code: {response.status_code}") |
|
result = response.json() |
|
print(f"[generate_post] Response JSON: {result}") |
|
return result["candidates"][0]["content"]["parts"][0]["text"] |
|
except Exception as e: |
|
print(f"[generate_post] Error: {e}") |
|
return "Error generating content. Check your API key or prompt." |
|
|
|
|
|
|
|
|
|
def app_interface(html_file, tones, platform_choice, api_key, blog_link): |
|
try: |
|
if not html_file: |
|
return "Please upload an HTML blog post." |
|
|
|
print("[app_interface] Reading HTML file...") |
|
|
|
if hasattr(html_file, "name"): |
|
with open(html_file.name, "r", encoding="utf-8") as f: |
|
html_content = f.read() |
|
else: |
|
html_bytes = html_file.read() |
|
html_content = html_bytes.decode("utf-8") |
|
|
|
main_text = extract_main_content(html_content) |
|
if not main_text: |
|
return "Couldn't extract content from file. Ensure it's a valid HTML blog post." |
|
|
|
print("[app_interface] Generating post...") |
|
output = generate_post(api_key, main_text, tones, platform_choice, blog_link) |
|
return output |
|
except Exception as e: |
|
print(f"[app_interface] Error: {e}") |
|
return "Unexpected error occurred. Please check the logs." |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Reddit & Quora Post Generator 🧠") |
|
gr.Markdown("Upload your HTML blog post and get ready-to-publish content for Reddit or Quora, written in a human, friendly tone.") |
|
|
|
with gr.Row(): |
|
html_input = gr.File(label="Upload HTML Blog Post", file_types=[".html"]) |
|
|
|
tone_checkboxes = gr.CheckboxGroup(label="Choose Tones", choices=TONE_OPTIONS, value=["Friendly", "Humanized"]) |
|
platform_radio = gr.Radio(label="Target Platform", choices=["Reddit", "Quora"], value="Reddit") |
|
api_key_input = gr.Textbox(label="Enter Your Gemini API Key", type="password") |
|
blog_link_input = gr.Textbox(label="Enter Your Blog Link", placeholder="Insert your blog link here...") |
|
generate_button = gr.Button("Generate Post") |
|
output_box = gr.Textbox(label="Generated Post", lines=20, interactive=True) |
|
|
|
generate_button.click(app_interface, inputs=[html_input, tone_checkboxes, platform_radio, api_key_input, blog_link_input], outputs=output_box) |
|
|
|
|
|
|
|
|
|
demo.launch() |
|
|