FernMedia/Replicate
0
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)