Autorecap's picture
Update app.py
e4f0040 verified
Raw
History Blame Contribute Delete
19.1 kB
import gradio as gr
from google import genai
import json
import os
from datetime import datetime, timedelta
# ๐Ÿ“‚ แ€กแ€แ€ปแ€€แ€บแ€กแ€œแ€€แ€บแ€™แ€ปแ€ฌแ€ธแ€€แ€ญแ€ฏ แ€กแ€žแ€ฑแ€™แ€พแ€แ€บแ€‘แ€ฌแ€ธแ€™แ€Šแ€ทแ€บ JSON Database แ€–แ€ญแ€ฏแ€„แ€บแ€กแ€™แ€Šแ€บ
DB_FILE = "recap_users_db.json"
# ๐Ÿ”‘ แ€…แ€แ€„แ€บแ€กแ€žแ€ฏแ€ถแ€ธแ€•แ€ผแ€ฏแ€แ€ปแ€ญแ€”แ€บแ€แ€ฝแ€„แ€บ แ€•แ€ซแ€แ€„แ€บแ€™แ€Šแ€ทแ€บ แ€กแ€แ€ผแ€ฑแ€แ€ถ แ€กแ€€แ€ฑแ€ฌแ€„แ€ทแ€บแ€™แ€ปแ€ฌแ€ธ
DEFAULT_DB = {
"admin": {
"password": "241212", # ๐Ÿ‘‘ Admin แ€กแ€แ€ฝแ€€แ€บ Password
"role": "admin"
},
"user1": {
"password": "456456", # ๐Ÿ†“ Free User แ€กแ€แ€ฝแ€€แ€บ Password
"role": "free",
"last_used_date": "",
"usage_count": 0
}
}
# ๐Ÿ”„ Database แ€–แ€แ€บแ€žแ€Šแ€ทแ€บ แ€…แ€”แ€…แ€บ
def load_db():
if not os.path.exists(DB_FILE):
with open(DB_FILE, "w", encoding="utf-8") as f:
json.dump(DEFAULT_DB, f, indent=4, ensure_ascii=False)
return DEFAULT_DB
try:
with open(DB_FILE, "r", encoding="utf-8") as f:
return json.load(f)
except:
return DEFAULT_DB
# ๐Ÿ’พ Database แ€žแ€ญแ€™แ€บแ€ธแ€†แ€Šแ€บแ€ธแ€žแ€Šแ€ทแ€บ แ€…แ€”แ€…แ€บ
def save_db(db_data):
with open(DB_FILE, "w", encoding="utf-8") as f:
json.dump(db_data, f, indent=4, ensure_ascii=False)
# ๐Ÿ” Login แ€…แ€…แ€บแ€†แ€ฑแ€ธแ€•แ€ฑแ€ธแ€™แ€Šแ€ทแ€บ Function
def check_login(username, password):
username = username.strip()
password = password.strip()
db = load_db()
if username in db and db[username]["password"] == password:
user_info = db[username]
role = user_info["role"]
if role == "member":
expiry = datetime.strptime(user_info["expiry_date"], "%Y-%m-%d")
if datetime.now() > expiry:
return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), f"๐Ÿšซ แ€กแ€žแ€ฏแ€ถแ€ธแ€•แ€ผแ€ฏแ€žแ€ฐ '{username}' แ€žแ€Šแ€บ แ€žแ€€แ€บแ€แ€™แ€บแ€ธแ€€แ€ฏแ€”แ€บแ€†แ€ฏแ€ถแ€ธแ€žแ€ฝแ€ฌแ€ธแ€•แ€ซแ€•แ€ผแ€ฎแ‹"
role_text = f"โญ PAID MEMBER (แ€žแ€€แ€บแ€แ€™แ€บแ€ธแ€€แ€ฏแ€”แ€บแ€›แ€€แ€บ - {user_info['expiry_date']})"
return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), f"โœ… แ€กแ€ฑแ€ฌแ€„แ€บแ€™แ€ผแ€„แ€บแ€…แ€ฝแ€ฌ แ€แ€„แ€บแ€›แ€ฑแ€ฌแ€€แ€บแ€•แ€ผแ€ฎแ€ธแ€•แ€ซแ€•แ€ผแ€ฎแ‹ [{role_text}]"
elif role == "admin":
return gr.update(visible=False), gr.update(visible=True), gr.update(visible=True), "๐Ÿ‘‘ แ€™แ€„แ€บแ€นแ€‚แ€œแ€ฌแ€•แ€ซ ADMIN แ€€แ€ผแ€ฎแ€ธแ€—แ€ปแ€ฌแ‹ แ€…แ€”แ€…แ€บแ€แ€…แ€บแ€แ€ฏแ€œแ€ฏแ€ถแ€ธแ€€แ€ญแ€ฏ แ€…แ€ฎแ€™แ€ถแ€แ€”แ€ทแ€บแ€แ€ฝแ€ฒแ€”แ€ญแ€ฏแ€„แ€บแ€•แ€ซแ€•แ€ผแ€ฎแ‹"
elif role == "free":
return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), "๐Ÿ†“ FREE USER แ€กแ€–แ€ผแ€…แ€บ แ€กแ€ฑแ€ฌแ€„แ€บแ€™แ€ผแ€„แ€บแ€…แ€ฝแ€ฌ แ€แ€„แ€บแ€›แ€ฑแ€ฌแ€€แ€บแ€•แ€ผแ€ฎแ€ธแ€•แ€ซแ€•แ€ผแ€ฎแ‹ (แ€แ€…แ€บแ€”แ€ฑแ€ท แ แ€€แ€ผแ€ญแ€™แ€บ แ€€แ€”แ€ทแ€บแ€žแ€แ€บแ€แ€ปแ€€แ€บแ€›แ€พแ€ญ)"
return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), "โŒ Username แ€žแ€ญแ€ฏแ€ทแ€™แ€Ÿแ€ฏแ€แ€บ Password แ€™แ€พแ€ฌแ€ธแ€šแ€ฝแ€„แ€บแ€ธแ€”แ€ฑแ€•แ€ซแ€žแ€Šแ€บแ‹"
# =====================================================================
# ๐Ÿš€ MAIN RECAP PROCESSOR (With Security & Usage Limit)
# =====================================================================
def process_movie_recap(logged_in_user, movie_name, episode_part, movie_context, api_key, duration_choice, progress=gr.Progress(track_tqdm=True)):
if not logged_in_user:
return "๐Ÿ”’ แ€€แ€ปแ€ฑแ€ธแ€‡แ€ฐแ€ธแ€•แ€ผแ€ฏแ แ€…แ€”แ€…แ€บแ€กแ€แ€ฝแ€„แ€บแ€ธแ€žแ€ญแ€ฏแ€ท แ€กแ€›แ€„แ€บ Login แ€แ€„แ€บแ€•แ€ฑแ€ธแ€•แ€ซแ‹"
if not api_key or api_key.strip() == "":
return "โš ๏ธ แ€€แ€ปแ€ฑแ€ธแ€‡แ€ฐแ€ธแ€•แ€ผแ€ฏแ แ€žแ€„แ€บแ Gemini API Key แ€€แ€ญแ€ฏ แ€กแ€›แ€„แ€บแ€‘แ€Šแ€ทแ€บแ€•แ€ฑแ€ธแ€•แ€ซแ€—แ€ปแ€ฌเฅค"
if not movie_name or movie_name.strip() == "":
return "โš ๏ธ แ€€แ€ปแ€ฑแ€ธแ€‡แ€ฐแ€ธแ€•แ€ผแ€ฏแ แ€›แ€ฏแ€•แ€บแ€›แ€พแ€„แ€บ แ€žแ€ญแ€ฏแ€ทแ€™แ€Ÿแ€ฏแ€แ€บ แ€…แ€ฎแ€ธแ€›แ€ฎแ€ธแ€”แ€ฌแ€™แ€Šแ€บแ€€แ€ญแ€ฏ แ€‘แ€Šแ€ทแ€บแ€žแ€ฝแ€„แ€บแ€ธแ€•แ€ฑแ€ธแ€•แ€ซแ€—แ€ปแ€ฌเฅค"
db = load_db()
if logged_in_user not in db:
return "โŒ แ€กแ€žแ€ฏแ€ถแ€ธแ€•แ€ผแ€ฏแ€žแ€ฐ แ€™แ€›แ€พแ€ญแ€แ€ฑแ€ฌแ€ทแ€•แ€ซแ‹"
user_info = db[logged_in_user]
today_str = datetime.now().strftime("%Y-%m-%d")
# ๐Ÿ›ก๏ธ Limit แ€…แ€…แ€บแ€†แ€ฑแ€ธแ€แ€ผแ€„แ€บแ€ธแ€…แ€”แ€…แ€บ (Free & Member)
if user_info["role"] != "admin":
if user_info.get("last_used_date") == today_str and user_info.get("usage_count", 0) >= 1:
return "๐Ÿšซ แ€žแ€„แ€บแ€žแ€Šแ€บ แ€šแ€”แ€ฑแ€ทแ€กแ€แ€ฝแ€€แ€บ แ€•แ€ผแ€ฏแ€œแ€ฏแ€•แ€บแ€แ€ฝแ€„แ€ทแ€บ (แ) แ€€แ€ผแ€ญแ€™แ€บ แ€•แ€ผแ€Šแ€ทแ€บแ€žแ€ฝแ€ฌแ€ธแ€•แ€ซแ€•แ€ผแ€ฎแ‹ แ€”แ€ฑแ€ฌแ€€แ€บแ€”แ€ฑแ€ทแ€™แ€พ แ€•แ€ผแ€”แ€บแ€œแ€Šแ€บ แ€…แ€™แ€บแ€ธแ€žแ€•แ€บแ€•แ€ซแ€›แ€”แ€บแ‹"
if duration_choice == "Short (TikTok/Reels - 1 Min)":
word_count = "แ€…แ€ฌแ€œแ€ฏแ€ถแ€ธแ€›แ€ฑ แƒแ€แ€ แ€€แ€ปแ€ฑแ€ฌแ€บ แ€™แ€พ แ…แ€แ€ แ€กแ€แ€ฝแ€„แ€บแ€ธ"
length_desc = "แ แ€™แ€ญแ€”แ€…แ€บแ€…แ€ฌ Short แ€—แ€ฎแ€’แ€ฎแ€šแ€ญแ€ฏ"
elif duration_choice == "Medium (YouTube - 3 to 5 Mins)":
word_count = "แ€…แ€ฌแ€œแ€ฏแ€ถแ€ธแ€›แ€ฑ แแ…้ง’แ€ฌแ€บ แ€™แ€พ แ‚แ€แ€แ€ แ€กแ€แ€ฝแ€„แ€บแ€ธ"
length_desc = "แƒ แ€™แ€ญแ€”แ€…แ€บแ€™แ€พ แ… แ€™แ€ญแ€”แ€…แ€บแ€…แ€ฌ YouTube แ€—แ€ฎแ€’แ€ฎแ€šแ€ญแ€ฏ"
else:
word_count = "แ€…แ€ฌแ€œแ€ฏแ€ถแ€ธแ€›แ€ฑ แƒแ€แ€0 แ€€แ€ปแ€ฑแ€ฌแ€บ แ€™แ€พ แ„แ€แ€แ€ แ€กแ€แ€ฝแ€„แ€บแ€ธ"
length_desc = "แแ… แ€™แ€ญแ€”แ€…แ€บแ€…แ€ฌ YouTube Long-form แ€—แ€ฎแ€’แ€ฎแ€šแ€ญแ€ฏ"
additional_context = ""
if movie_context and movie_context.strip() != "":
additional_context = f"\n[แ€คแ€›แ€ฏแ€•แ€บแ€›แ€พแ€„แ€บแ แ€…แ€…แ€บแ€™แ€พแ€”แ€บแ€žแ€ฑแ€ฌ แ€‡แ€ฌแ€แ€บแ€œแ€™แ€บแ€ธ Context แ€กแ€แ€ปแ€€แ€บแ€กแ€œแ€€แ€บแ€™แ€ปแ€ฌแ€ธ -\n{movie_context.strip()}]\n"
try:
client = genai.Client(api_key=api_key.strip())
movie_info = f"แ€›แ€ฏแ€•แ€บแ€›แ€พแ€„แ€บ/แ€…แ€ฎแ€ธแ€›แ€ฎแ€ธ แ€”แ€ฌแ€™แ€Šแ€บแ€–แ€ผแ€…แ€บแ€žแ€Šแ€ทแ€บ '{movie_name.strip()}' แ€€แ€ญแ€ฏ แ€กแ€แ€ผแ€ฑแ€แ€ถแ€•แ€ซแ‹ "
episode_info = f"แ€กแ€‘แ€ฐแ€ธแ€žแ€–แ€ผแ€„แ€ทแ€บ '{episode_part.strip()}' แ แ€‡แ€ฌแ€แ€บแ€œแ€™แ€บแ€ธแ€แ€…แ€บแ€แ€ฏแ€œแ€ฏแ€ถแ€ธแ€€แ€ญแ€ฏ " if episode_part and episode_part.strip() else "แ€‡แ€ฌแ€แ€บแ€œแ€™แ€บแ€ธแ€แ€…แ€บแ€แ€ฏแ€œแ€ฏแ€ถแ€ธแ€€แ€ญแ€ฏ "
progress(0.50, desc="โšก Gemini AI แ€€แ€”แ€ฑ แ€‡แ€ฌแ€แ€บแ€œแ€™แ€บแ€ธแ€€แ€ญแ€ฏ แ€กแ€…แ€กแ€†แ€ฏแ€ถแ€ธ แ€•แ€ฑแ€ซแ€„แ€บแ€ธแ€…แ€•แ€บแ€•แ€ผแ€ฎแ€ธ แ€›แ€ฑแ€ธแ€žแ€ฌแ€ธแ€”แ€ฑแ€•แ€ซแ€žแ€Šแ€บ...")
script_prompt = (
f"แ€™แ€„แ€บแ€ธแ€€ แ€›แ€ฏแ€•แ€บแ€›แ€พแ€„แ€บแ€”แ€พแ€„แ€ทแ€บ แ€…แ€ฎแ€ธแ€›แ€ฎแ€ธแ€™แ€ปแ€ฌแ€ธแ€€แ€ญแ€ฏ Recap แ€œแ€ฏแ€•แ€บแ€แ€ฒแ€ท Professional Content Creator แ€แ€…แ€บแ€šแ€ฑแ€ฌแ€€แ€บ แ€–แ€ผแ€…แ€บแ€แ€šแ€บแ‹ "
f"{movie_info} {episode_info} "
f"แ€แ€…แ€บแ€แ€€แ€บแ€แ€…แ€บแ€•แ€ปแ€€แ€บแ€”แ€พแ€„แ€ทแ€บ แ€–แ€ผแ€แ€บแ€™แ€แ€ปแ€‘แ€ฌแ€ธแ€˜แ€ฒแŠ แ€กแ€…-แ€กแ€œแ€šแ€บ-แ€กแ€†แ€ฏแ€ถแ€ธ แ€‡แ€ฌแ€แ€บแ€žแ€ญแ€™แ€บแ€ธแ€•แ€ญแ€ฏแ€„แ€บแ€ธแ€กแ€‘แ€ญ (แ€‘แ€ญแ€ฏ Episode แ€žแ€ญแ€ฏแ€ทแ€™แ€Ÿแ€ฏแ€แ€บ แ€‡แ€ฌแ€แ€บแ€€แ€ฌแ€ธแ แ€‡แ€ฌแ€แ€บแ€žแ€ญแ€™แ€บแ€ธแ€แ€”แ€บแ€ธแ€กแ€‘แ€ญ) แ€•แ€ผแ€ฎแ€ธแ€•แ€ผแ€Šแ€ทแ€บแ€…แ€ฏแ€ถแ€…แ€ฝแ€ฌ แ€•แ€ซแ€แ€„แ€บแ€žแ€ฑแ€ฌ {length_desc} แ€กแ€แ€ฝแ€€แ€บ แ€™แ€ผแ€”แ€บแ€™แ€ฌแ€œแ€ญแ€ฏ Video Recap Script แ€แ€…แ€บแ€แ€ฏแ€€แ€ญแ€ฏ แ€›แ€ฑแ€ธแ€•แ€ฑแ€ธแ€•แ€ซแ‹"
f"{additional_context}\n\n"
f"แ€žแ€แ€บแ€™แ€พแ€แ€บแ€แ€ปแ€€แ€บแ€™แ€ปแ€ฌแ€ธ (แ€™แ€–แ€ผแ€…แ€บแ€™แ€”แ€ฑแ€œแ€ญแ€ฏแ€€แ€บแ€”แ€ฌแ€›แ€”แ€บ) -\n"
f"แแ‹ โš ๏ธ แ€กแ€›แ€ฑแ€ธแ€€แ€ผแ€ฎแ€ธแ€†แ€ฏแ€ถแ€ธแ€กแ€แ€ปแ€€แ€บ - แ€•แ€ฑแ€ธแ€‘แ€ฌแ€ธแ€žแ€ฑแ€ฌ แ€กแ€•แ€ญแ€ฏแ€„แ€บแ€ธ (Episode) แ€žแ€ญแ€ฏแ€ทแ€™แ€Ÿแ€ฏแ€แ€บ แ€‡แ€ฌแ€แ€บแ€œแ€™แ€บแ€ธแ€แ€ฝแ€ฒแ แ€‡แ€ฌแ€แ€บแ€€แ€ฝแ€€แ€บ แ€กแ€…แ€™แ€พ แ€กแ€†แ€ฏแ€ถแ€ธแ€‘แ€ญ 'แ€‡แ€ฌแ€แ€บแ€žแ€ญแ€™แ€บแ€ธแ€•แ€ญแ€ฏแ€„แ€บแ€ธ (Ending)' แ€€แ€ญแ€ฏ แ€™แ€–แ€ผแ€…แ€บแ€™แ€”แ€ฑ แ€‘แ€Šแ€ทแ€บแ€žแ€ฝแ€„แ€บแ€ธแ€›แ€™แ€Šแ€บแ‹ แ€œแ€™แ€บแ€ธแ€แ€…แ€บแ€แ€€แ€บแ€แ€ฝแ€„แ€บ แ€…แ€ฌแ€žแ€ฌแ€ธแ€–แ€ผแ€แ€บแ€แ€ฑแ€ฌแ€€แ€บแ€•แ€ผแ€ฎแ€ธ แ€•แ€›แ€ญแ€žแ€แ€บแ€€แ€ญแ€ฏ แ€™แ€ปแ€พแ€ฑแ€ฌแ€บแ€แ€ญแ€ฏแ€„แ€บแ€ธแ€‘แ€ฌแ€ธแ€แ€ผแ€„แ€บแ€ธแ€™แ€ปแ€ญแ€ฏแ€ธ แ€œแ€ฏแ€ถแ€ธแ€ (แ€œแ€ฏแ€ถแ€ธแ€) แ€™แ€œแ€ฏแ€•แ€บแ€›แ€•แ€ซแ‹ แ€แ€…แ€บแ€•แ€ฏแ€’แ€บแ€œแ€ฏแ€ถแ€ธ แ€กแ€•แ€ผแ€ฎแ€ธแ€žแ€แ€บแ€•แ€ฑแ€ธแ€›แ€™แ€Šแ€บแ‹\n"
f"แ‚แ‹ แ€…แ€€แ€ฌแ€ธแ€•แ€ผแ€ฑแ€ฌแ€Ÿแ€”แ€บแ€€ แ€•แ€›แ€ญแ€žแ€แ€บแ€€แ€ญแ€ฏ แ€†แ€ฝแ€ฒแ€†แ€ฑแ€ฌแ€„แ€บแ€™แ€พแ€ฏแ€›แ€พแ€ญแ€•แ€ผแ€ฎแ€ธ แ€‡แ€ฌแ€แ€บแ€›แ€พแ€ญแ€”แ€บแ€แ€€แ€บแ€กแ€ฑแ€ฌแ€„แ€บ แ€…แ€ญแ€แ€บแ€œแ€พแ€ฏแ€•แ€บแ€›แ€พแ€ฌแ€ธแ€…แ€›แ€ฌ แ€กแ€•แ€ผแ€Šแ€ทแ€บแ€–แ€ผแ€…แ€บแ€›แ€™แ€šแ€บแ‹ แ€…แ€ฌแ€กแ€ฏแ€•แ€บแ€–แ€แ€บแ€•แ€ผแ€žแ€œแ€ญแ€ฏแ€™แ€ปแ€ญแ€ฏแ€ธ แ€œแ€ฏแ€ถแ€ธแ€ แ€™แ€œแ€ฏแ€•แ€บแ€•แ€ซแ€”แ€ฒแ€ทแ‹\n"
f"แƒแ‹ แ€’แ€ซแ€€ {length_desc} แ€–แ€ผแ€…แ€บแ€œแ€ญแ€ฏแ€ท แ€™แ€ผแ€”แ€บแ€™แ€ฌแ€…แ€ฌแ€žแ€ฌแ€ธแ€€แ€ญแ€ฏ {word_count} แ€กแ€•แ€ผแ€Šแ€ทแ€บแ€กแ€…แ€ฏแ€ถ แ€แ€ปแ€›แ€ฑแ€ธแ€•แ€ฑแ€ธแ€•แ€ซแ‹ แ€…แ€ฌแ€œแ€ฏแ€ถแ€ธแ€›แ€ฑ แ€€แ€”แ€ทแ€บแ€žแ€แ€บแ€แ€ปแ€€แ€บแ€กแ€แ€ฝแ€„แ€บแ€ธแ€™แ€พแ€ฌแ€•แ€ฒ แ€‡แ€ฌแ€แ€บแ€œแ€™แ€บแ€ธแ€แ€…แ€บแ€แ€ฏแ€œแ€ฏแ€ถแ€ธ แ€•แ€ผแ€ฎแ€ธแ€†แ€ฏแ€ถแ€ธแ€žแ€ฝแ€ฌแ€ธแ€กแ€ฑแ€ฌแ€„แ€บ แ€กแ€แ€ปแ€ญแ€”แ€บแ€กแ€† แ€แ€แ€บแ€”แ€ญแ€ฏแ€„แ€บแ€žแ€™แ€ปแ€พ แ€™แ€ปแ€พแ€•แ€ผแ€ฎแ€ธ แ€›แ€ฑแ€ธแ€•แ€ฑแ€ธแ€•แ€ซแ‹\n"
f"แ„แ‹ Creator Tips แ€แ€ฝแ€ฑแŠ แ€‡แ€ฌแ€แ€บแ€€แ€ฝแ€€แ€บแ€–แ€ฑแ€ฌแ€บแ€•แ€ผแ€แ€ปแ€€แ€บแ€แ€ฝแ€ฑ (แ€ฅแ€•แ€™แ€ฌ- Visual: ...) แ€œแ€ฏแ€ถแ€ธแ€ แ€‘แ€Šแ€ทแ€บแ€™แ€•แ€ฑแ€ธแ€•แ€ซแ€”แ€ฒแ€ทแ‹ แ€”แ€ฑแ€ฌแ€€แ€บแ€แ€ถแ€…แ€€แ€ฌแ€ธแ€•แ€ผแ€ฑแ€ฌ (Voiceover) แ€กแ€แ€ฝแ€€แ€บ แ€™แ€ผแ€”แ€บแ€™แ€ฌแ€œแ€ญแ€ฏ แ€…แ€€แ€ฌแ€ธแ€•แ€ผแ€ฑแ€ฌแ€…แ€ฌแ€žแ€ฌแ€ธ แ€žแ€ฎแ€ธแ€žแ€”แ€ทแ€บแ€€แ€ญแ€ฏแ€•แ€ฒ แ€แ€ปแ€›แ€ฑแ€ธแ€•แ€ฑแ€ธแ€›แ€•แ€ซแ€™แ€šแ€บเฅค"
)
response = client.models.generate_content(model='gemini-2.5-flash', contents=script_prompt)
burmese_script = response.text
# ๐Ÿ’พ แ€กแ€ฑแ€ฌแ€„แ€บแ€™แ€ผแ€„แ€บแ€•แ€ซแ€€ Usage Count แ€™แ€พแ€แ€บแ€žแ€ฌแ€ธแ€™แ€Šแ€บ
if user_info["role"] != "admin":
user_info["last_used_date"] = today_str
user_info["usage_count"] = 1
db[logged_in_user] = user_info
save_db(db)
return burmese_script
except Exception as e:
return f"โŒ Error แ€แ€€แ€บแ€žแ€ฝแ€ฌแ€ธแ€•แ€ซแ€แ€šแ€บ- {str(e)}"
# ๐Ÿ‘‘ [ADMIN FEATURE]: Member แ€žแ€…แ€บแ€‘แ€Šแ€ทแ€บแ€แ€ผแ€„แ€บแ€ธ
def admin_add_member(new_username, new_password):
new_username = new_username.strip()
new_password = new_password.strip()
if not new_username or not new_password:
return "โŒ Username แ€”แ€พแ€„แ€ทแ€บ Password แ€กแ€ฌแ€ธแ€œแ€ฏแ€ถแ€ธ แ€›แ€ญแ€ฏแ€€แ€บแ€‘แ€Šแ€ทแ€บแ€•แ€ฑแ€ธแ€•แ€ซแ‹", get_members_table()
db = load_db()
if new_username in db:
return f"โŒ แ€กแ€žแ€ฏแ€ถแ€ธแ€•แ€ผแ€ฏแ€žแ€ฐแ€”แ€ฌแ€™แ€Šแ€บ '{new_username}' แ€žแ€Šแ€บ แ€›แ€พแ€ญแ€”แ€พแ€„แ€ทแ€บแ€•แ€ผแ€ฎแ€ธแ€žแ€ฌแ€ธ แ€–แ€ผแ€…แ€บแ€”แ€ฑแ€žแ€Šแ€บแ‹", get_members_table()
expiry_date = (datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d")
db[new_username] = {
"password": new_password,
"role": "member",
"expiry_date": expiry_date,
"last_used_date": "",
"usage_count": 0
}
save_db(db)
return f"โœ… Paid Member '{new_username}' แ€กแ€ฌแ€ธ (แ) แ€œ แ€žแ€€แ€บแ€แ€™แ€บแ€ธแ€–แ€ผแ€„แ€ทแ€บ แ€กแ€ฑแ€ฌแ€„แ€บแ€™แ€ผแ€„แ€บแ€…แ€ฝแ€ฌ แ€แ€Šแ€บแ€†แ€ฑแ€ฌแ€€แ€บแ€•แ€ผแ€ฎแ€ธแ€•แ€ซแ€•แ€ผแ€ฎแ‹", get_members_table()
# ๐Ÿ‘‘ [ADMIN FEATURE]: Member แ€กแ€ฌแ€ธ แ€•แ€ผแ€”แ€บแ€–แ€ปแ€€แ€บแ€แ€ผแ€„แ€บแ€ธ แ€แ€œแ€ฏแ€แ€บ
def admin_delete_member(username_to_delete):
username_to_delete = username_to_delete.strip()
if not username_to_delete:
return "โŒ แ€€แ€ปแ€ฑแ€ธแ€‡แ€ฐแ€ธแ€•แ€ผแ€ฏแ แ€–แ€ปแ€€แ€บแ€œแ€ญแ€ฏแ€žแ€ฑแ€ฌ Username แ€€แ€ญแ€ฏ แ€›แ€ญแ€ฏแ€€แ€บแ€‘แ€Šแ€ทแ€บแ€•แ€ซแ‹", get_members_table()
db = load_db()
if username_to_delete in db:
if db[username_to_delete]["role"] == "member":
del db[username_to_delete]
save_db(db)
return f"๐Ÿ—‘๏ธ Paid Member '{username_to_delete}' แ€กแ€ฌแ€ธ แ€…แ€”แ€…แ€บแ€‘แ€ฒแ€™แ€พ แ€กแ€•แ€ผแ€ฎแ€ธแ€–แ€ปแ€€แ€บแ€œแ€ญแ€ฏแ€€แ€บแ€•แ€ซแ€•แ€ผแ€ฎแ‹", get_members_table()
else:
return "โŒ Admin แ€žแ€ญแ€ฏแ€ทแ€™แ€Ÿแ€ฏแ€แ€บ Free User แ€กแ€€แ€ฑแ€ฌแ€„แ€ทแ€บแ€€แ€ญแ€ฏ แ€–แ€ปแ€€แ€บแแ€™แ€›แ€•แ€ซแ‹", get_members_table()
return f"โŒ แ€กแ€žแ€ฏแ€ถแ€ธแ€•แ€ผแ€ฏแ€žแ€ฐ '{username_to_delete}' แ€€แ€ญแ€ฏ แ€›แ€พแ€ฌแ€™แ€แ€ฝแ€ฑแ€ทแ€•แ€ซแ‹", get_members_table()
# ๐Ÿ‘‘ [ADMIN FEATURE]: Member แ€‡แ€šแ€ฌแ€ธแ€‘แ€ฏแ€แ€บแ€•แ€ฑแ€ธแ€แ€ผแ€„แ€บแ€ธ
def get_members_table():
db = load_db()
table_data = []
for user, data in db.items():
if data["role"] == "member":
table_data.append([user, data["password"], data["expiry_date"], data.get("last_used_date", "แ€™แ€›แ€พแ€ญแ€žแ€ฑแ€ธ"), "แ€•แ€ผแ€Šแ€ทแ€บ" if data.get("usage_count",0)>=1 else "แ€€แ€ปแ€”แ€บ"])
return table_data
# =====================================================================
# ๐ŸŽจ GRADIO UI DESIGN WITH SECURITY SYSTEM
# =====================================================================
with gr.Blocks(title="Smart Movie Auto Recap Pro") as demo:
current_logged_user = gr.State(value="")
gr.Markdown("# โœจ Smart Movie Auto Recap Pro (v 2.0) โœจ")
gr.Markdown("๐Ÿ›ก๏ธ Secure Account Control & Professional Script Generator")
status_output = gr.Textbox(label="โ„น๏ธ Login Status", value="๐Ÿ”’ แ€€แ€ปแ€ฑแ€ธแ€‡แ€ฐแ€ธแ€•แ€ผแ€ฏแ แ€…แ€”แ€…แ€บแ€กแ€แ€ฝแ€„แ€บแ€ธแ€žแ€ญแ€ฏแ€ท แ€กแ€›แ€„แ€บแ€แ€„แ€บแ€›แ€ฑแ€ฌแ€€แ€บแ€•แ€ฑแ€ธแ€•แ€ซแ‹", interactive=False)
# 1. ๐Ÿ” LOGIN BOX
with gr.Group() as login_box:
gr.Markdown("### ๐Ÿ” แ€กแ€€แ€ฑแ€ฌแ€„แ€ทแ€บแ€แ€„แ€บแ€›แ€”แ€บ")
username_input = gr.Textbox(label="Username", placeholder="๐Ÿ‘ค Username แ€›แ€ญแ€ฏแ€€แ€บแ€‘แ€Šแ€ทแ€บแ€•แ€ซ")
password_input = gr.Textbox(label="Password", placeholder="๐Ÿ”‘ Password แ€›แ€ญแ€ฏแ€€แ€บแ€‘แ€Šแ€ทแ€บแ€•แ€ซ", type="password")
login_btn = gr.Button("Login แ€แ€„แ€บแ€™แ€Šแ€บ", variant="primary")
# 2. ๐Ÿ‘‘ ADMIN CONTROL PANEL
with gr.Group(visible=False) as admin_panel:
gr.Markdown("## ๐Ÿ‘‘ Admin Control Panel (Member Management)")
with gr.Row():
with gr.Column():
gr.Markdown("### โž• Member แ€กแ€žแ€…แ€บ แ€‘แ€Šแ€ทแ€บแ€›แ€”แ€บ")
new_user_in = gr.Textbox(label="Member แ€žแ€…แ€บแ Username", placeholder="แ€ฅแ€•แ€™แ€ฌ - member_mgmg")
new_pass_in = gr.Textbox(label="Member แ€žแ€…แ€บแ Password", placeholder="แ€ฅแ€•แ€™แ€ฌ - mgmg123")
add_member_btn = gr.Button("โž• Paid Member แ€กแ€žแ€…แ€บ แ€†แ€ฑแ€ฌแ€€แ€บแ€™แ€Šแ€บ (แ แ€œ แ€žแ€€แ€บแ€แ€™แ€บแ€ธ)", variant="secondary")
gr.Markdown("---")
gr.Markdown("### ๐Ÿ—‘๏ธ Member แ€กแ€ฌแ€ธ แ€•แ€ผแ€”แ€บแ€–แ€ปแ€€แ€บแ€›แ€”แ€บ")
delete_user_in = gr.Textbox(label="แ€–แ€ปแ€€แ€บแ€œแ€ญแ€ฏแ€žแ€ฑแ€ฌ Username แ€€แ€ญแ€ฏ แ€›แ€ญแ€ฏแ€€แ€บแ€‘แ€Šแ€ทแ€บแ€•แ€ซ", placeholder="แ€ฅแ€•แ€™แ€ฌ - member_mgmg")
delete_member_btn = gr.Button("๐Ÿ—‘๏ธ Member แ€กแ€ฌแ€ธ แ€…แ€”แ€…แ€บแ€‘แ€ฒแ€™แ€พ แ€–แ€ปแ€€แ€บแ€™แ€Šแ€บ", variant="stop")
admin_action_status = gr.Textbox(label="๐Ÿ“Š แ€œแ€ฏแ€•แ€บแ€†แ€ฑแ€ฌแ€„แ€บแ€™แ€พแ€ฏ แ€กแ€แ€ผแ€ฑแ€กแ€”แ€ฑแ€•แ€ผแ€แ€ปแ€€แ€บ", interactive=False)
with gr.Column():
gr.Markdown("### ๐Ÿ‘ฅ แ€œแ€€แ€บแ€›แ€พแ€ญ Paid Members แ€™แ€ปแ€ฌแ€ธแ€…แ€ฌแ€›แ€„แ€บแ€ธ")
members_table = gr.Dataframe(
headers=["Username", "Password", "Expiry Date", "Last Used Date", "Today Limit"],
datatype=["str", "str", "str", "str", "str"],
value=get_members_table()
)
# 3. ๐ŸŽฌ MAIN RECAP STUDIO BOX
with gr.Group(visible=False) as main_studio_box:
with gr.Row():
with gr.Column():
gr.Markdown("### โš™๏ธ Recap Configurations")
api_key_input = gr.Textbox(label="๐Ÿ”‘ แ€žแ€„แ€บแ Gemini API Key", placeholder="AI Studio Key แ€‘แ€Šแ€ทแ€บแ€›แ€”แ€บ", type="password")
movie_name_input = gr.Textbox(label="๐Ÿฟ แ€›แ€ฏแ€•แ€บแ€›แ€พแ€„แ€บ แ€žแ€ญแ€ฏแ€ทแ€™แ€Ÿแ€ฏแ€แ€บ แ€…แ€ฎแ€ธแ€›แ€ฎแ€ธแ€”แ€ฌแ€™แ€Šแ€บ", placeholder="แ€ฅแ€•แ€™แ€ฌ- True Education (Korean Series)")
episode_input = gr.Textbox(label="๐ŸŽฌ แ€กแ€•แ€ญแ€ฏแ€„แ€บแ€ธ (Episode / Part / Season) (Optional)", placeholder="แ€ฅแ€•แ€™แ€ฌ- Episode 1")
movie_context_input = gr.Textbox(
label="๐Ÿ“ แ€‡แ€ฌแ€แ€บแ€œแ€™แ€บแ€ธแ€กแ€€แ€ปแ€‰แ€บแ€ธ แ€žแ€ญแ€ฏแ€ทแ€™แ€Ÿแ€ฏแ€แ€บ แ€กแ€แ€ปแ€€แ€บแ€กแ€œแ€€แ€บ (Optional)",
placeholder="แ€•แ€ญแ€ฏแ€™แ€ญแ€ฏแ€แ€ญแ€€แ€ปแ€…แ€ฑแ€›แ€”แ€บ แ€‡แ€ฌแ€แ€บแ€œแ€™แ€บแ€ธแ€กแ€€แ€ปแ€‰แ€บแ€ธแ€€แ€ญแ€ฏ แ€‘แ€Šแ€ทแ€บแ€•แ€ฑแ€ธแ€”แ€ญแ€ฏแ€„แ€บแ€•แ€ซแ€žแ€Šแ€บแ‹",
lines=4
)
duration_dropdown = gr.Dropdown(
choices=["Short (TikTok/Reels - 1 Min)", "Medium (YouTube - 3 to 5 Mins)", "Long (YouTube - 10 to 15 Mins)"],
value="Medium (YouTube - 3 to 5 Mins)",
label="โฑ๏ธ แ€—แ€ฎแ€’แ€ฎแ€šแ€ญแ€ฏ แ€กแ€แ€ปแ€ญแ€”แ€บแ€กแ€›แ€พแ€Šแ€บ"
)
submit_btn = gr.Button("๐Ÿš€ Auto Process แ€…แ€แ€„แ€บแ€™แ€Šแ€บ", variant="primary")
with gr.Column():
gr.Markdown("### ๐Ÿ“ แ€‘แ€ฝแ€€แ€บแ€•แ€ฑแ€ซแ€บแ€œแ€ฌแ€žแ€ฑแ€ฌ แ€›แ€œแ€’แ€บ")
output_script = gr.Textbox(label="๐Ÿ“ แ€‘แ€ฝแ€€แ€บแ€œแ€ฌแ€žแ€Šแ€ทแ€บ แ€™แ€ผแ€”แ€บแ€™แ€ฌแ€œแ€ญแ€ฏ Script", interactive=False, lines=18)
# ๐Ÿ”— Login แ€œแ€ฏแ€•แ€บแ€†แ€ฑแ€ฌแ€„แ€บแ€แ€ปแ€€แ€บ แ€แ€ปแ€ญแ€แ€บแ€†แ€€แ€บแ€แ€ผแ€„แ€บแ€ธ
def login_pipeline(u, p):
box_vis, studio_vis, admin_vis, msg = check_login(u, p)
logged_user = u.strip() if "โŒ" not in msg and "๐Ÿšซ" not in msg else ""
return box_vis, studio_vis, admin_vis, msg, logged_user
login_btn.click(
fn=login_pipeline,
inputs=[username_input, password_input],
outputs=[login_box, main_studio_box, admin_panel, status_output, current_logged_user]
)
# ๐Ÿ”— Script แ€‘แ€ฏแ€แ€บแ€œแ€ฏแ€•แ€บแ€แ€ผแ€„แ€บแ€ธ แ€แ€œแ€ฏแ€แ€บแ€แ€ปแ€ญแ€แ€บแ€†แ€€แ€บแ€แ€ผแ€„แ€บแ€ธ
submit_btn.click(
fn=process_movie_recap,
inputs=[current_logged_user, movie_name_input, episode_input, movie_context_input, api_key_input, duration_dropdown],
outputs=[output_script]
)
# ๐Ÿ”— Admin Add Member
add_member_btn.click(
fn=admin_add_member,
inputs=[new_user_in, new_pass_in],
outputs=[admin_action_status, members_table]
)
# ๐Ÿ”— Admin Delete Member
delete_member_btn.click(
fn=admin_delete_member,
inputs=[delete_user_in],
outputs=[admin_action_status, members_table]
)
if __name__ == "__main__":
demo.launch()