import os import json import tempfile from datetime import datetime from flask import Flask, request, render_template_string from huggingface_hub import HfApi, whoami app = Flask(__name__) api = HfApi() # ========================== # CONFIG # ========================== DATASET_REPO = "INDONESIA-AI/manga-dataset" OWNER_TOKEN = os.environ.get("HF_OWNER_TOKEN") # ========================== # VALIDASI USER TOKEN # ========================== def get_username(token): try: info = whoami(token=token) return info["name"] except: return None # ========================== # HTML UI # ========================== HTML = """ Upload Komik

📚 Upload Komik Publik

""" @app.route("/") def home(): return render_template_string(HTML) # ========================== # UPLOAD # ========================== @app.route("/upload", methods=["POST"]) def upload(): if not OWNER_TOKEN: return "❌ OWNER TOKEN belum diset di Space Secrets" user_token = request.form.get("user_token") username = get_username(user_token) if not username: return "❌ HF API Key tidak valid" title = request.form["title"] comic_id = request.form["comic_id"] chapter = request.form["chapter"] cover = request.files["cover"] pages = request.files.getlist("pages") base_path = f"comics/{comic_id}" chapter_path = f"{base_path}/{chapter}" # ========= Upload Cover ========= with tempfile.NamedTemporaryFile(delete=False) as tmp: cover.save(tmp.name) api.upload_file( path_or_fileobj=tmp.name, path_in_repo=f"{base_path}/cover.jpg", repo_id=DATASET_REPO, repo_type="dataset", token=OWNER_TOKEN, commit_message=f"Cover upload by {username}" ) os.remove(tmp.name) # ========= Upload Pages ========= for i, page in enumerate(pages): with tempfile.NamedTemporaryFile(delete=False) as tmp: page.save(tmp.name) api.upload_file( path_or_fileobj=tmp.name, path_in_repo=f"{chapter_path}/page_{i+1}.jpg", repo_id=DATASET_REPO, repo_type="dataset", token=OWNER_TOKEN, commit_message=f"{username} upload {chapter}" ) os.remove(tmp.name) # ========= Metadata ========= info = { "title": title, "uploaded_by": username, "created": datetime.now().isoformat() } with tempfile.NamedTemporaryFile(mode="w", delete=False) as tmp: json.dump(info, tmp) api.upload_file( path_or_fileobj=tmp.name, path_in_repo=f"{base_path}/info.json", repo_id=DATASET_REPO, repo_type="dataset", token=OWNER_TOKEN, commit_message="Update metadata" ) os.remove(tmp.name) return f"""

✅ Upload berhasil!

Uploader: {username}
Comic: {title}
Chapter: {chapter}

Upload lagi """ # ========================== # RUN # ========================== if __name__ == "__main__": app.run(host="0.0.0.0", port=7860)