CoolFace
Apppublic

FernMedia/Replicate

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
app.py143 linesDownload Raw Back to root
1from flask import Flask, render_template, jsonify, request, redirect, url_for2import threading3import logging4import os5import re6import time7from datetime import datetime, timedelta8from huggingface_hub import HfApi9 10app = Flask(__name__)11 12# Configure logging13logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")14 15# Global variables16next_execution_time = datetime.now() + timedelta(hours=28)  # Updated countdown to 28 hours17rate_limit_message = None18error_message = None19EXECUTE_PASSWORD = os.getenv("EXECUTE_PASSWORD", "default_password")20hf_token = os.getenv("HF_API_TOKEN", "default_token")21YourUsername = os.getenv("YourUsername", "default_user")22 23# Validate API token24if not hf_token or hf_token == "default_token":25    logging.error("❌ HF API Token is missing! Ensure it's set correctly.")26    exit(1)27 28# Initialize API29api = HfApi(token=hf_token)30 31def extract_rate_limit_message(error_msg):32    match = re.search(r"retry this action in about (\d+) hours", error_msg)33    return f"⚠️ Rate-limited. Retry in {match.group(1)} hours." if match else "⚠️ Rate-limited. Please try again later."34 35def delete_repos():36    global rate_limit_message37    rate_limit_message = None38 39    repos = [40        f"{YourUsername}/FernFlix",41     #   f"{YourUsername}/FernFlow",42        f"{YourUsername}/FernsComet"     # Added FernsComet43    ]44 45    for repo in repos:46        try:47            api.delete_repo(repo_id=repo, repo_type="space")48            logging.info(f"✅ Deleted repository: {repo}")49        except Exception as e:50            if "rate-limited" in str(e).lower():51                rate_limit_message = extract_rate_limit_message(str(e))52                logging.warning(f"⚠️ Rate-limited while deleting {repo}.")53            else:54                logging.error(f"❌ Error deleting {repo}: {e}")55 56def duplicate_repos():57    global rate_limit_message58    rate_limit_message = None59 60    tasks = [61        ("jasy0/FernFlix", [{"key": "ADDON_NAME", "value": os.getenv("DUPLI_SECRET_AIO", "default_secret")}]),62    #    ("jasy0/FernFlow", [{"key": "API_PASSWORD", "value": os.getenv("DUPLI_SECRET_MEDIAFLOW", "default_secret")}]),63        ("jasy0/FernsComet", [])64    ]65 66    for repo, secrets in tasks:67        try:68            api.duplicate_space(from_id=repo, secrets=secrets)69            logging.info(f"✅ Duplicated repository: {repo} with secrets: {secrets}")70        except Exception as e:71            if "rate-limited" in str(e).lower():72                rate_limit_message = extract_rate_limit_message(str(e))73                logging.warning(f"⚠️ Rate-limited while duplicating {repo}.")74            else:75                logging.error(f"❌ Error duplicating {repo}: {e}")76 77def manage_execution():78    global next_execution_time79 80    logging.info("🚀 Initial execution at container startup...")81    delete_repos()82    duplicate_repos()83 84    while True:85        if datetime.now() >= next_execution_time:86            logging.info("⏳ Countdown expired, executing tasks...")87            delete_repos()88            duplicate_repos()89 90            next_execution_time = datetime.now() + timedelta(hours=28)  # Updated reset interval91            logging.info(f"🔄 Countdown reset. Next execution at: {next_execution_time}")92 93        time.sleep(1)  # Prevent busy looping94 95@app.route("/")96def home():97    global error_message98    temp_error = error_message if error_message else ""99    error_message = None100    return render_template("index.html", error_message=temp_error)101 102@app.route("/execute", methods=["POST"])103def execute_now():104    global error_message, next_execution_time, rate_limit_message105 106    if request.form.get("password") == EXECUTE_PASSWORD:107        logging.info("🚀 Manual execution triggered.")108        delete_repos()109        duplicate_repos()110 111        if rate_limit_message is None:112            next_execution_time = datetime.now() + timedelta(hours=28)113            logging.info(f"🔄 Countdown reset due to manual execution. Next execution at: {next_execution_time}")114        else:115            logging.warning("⚠️ Manual execution was rate-limited—countdown NOT reset.")116 117        return redirect(url_for("home"))118    else:119        error_message = "⚠️ Invalid password. Execution denied."120        return redirect(url_for("home"))121 122@app.route("/time_left", methods=["GET"])123def time_left():124    global rate_limit_message, next_execution_time125 126    if datetime.now() >= next_execution_time:127        logging.info("⏳ Countdown expired. Resetting timer and executing tasks...")128        delete_repos()129        duplicate_repos()130        next_execution_time = datetime.now() + timedelta(hours=28)  # Updated reset interval131        logging.info(f"🔄 Countdown reset. Next execution at: {next_execution_time}")132 133    remaining_time = max((next_execution_time - datetime.now()).total_seconds(), 0)134    hh_mm_ss = f"{int(remaining_time // 3600):02}:{int((remaining_time % 3600) // 60):02}:{int(remaining_time % 60):02}"135 136    temp_rate_limit = rate_limit_message if rate_limit_message else ""137    rate_limit_message = None138 139    return jsonify({"time_left": hh_mm_ss, "rate_limit_message": temp_rate_limit})140 141if __name__ == "__main__":142    threading.Thread(target=manage_execution, daemon=True).start()143    app.run(host="0.0.0.0", port=7860)