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)