import os import tempfile from flask import Flask, render_template_string, request, redirect, send_file, jsonify from huggingface_hub import HfApi, hf_hub_download, upload_file, delete_file # Environment REPO_ID = os.getenv("REPO_ID") HF_TOKEN = os.getenv("HF_TOKEN") app = Flask(__name__) api = HfApi() TEMPLATE = """ HuggingFace Drive - {{ path or 'Root' }}

Uploading...

HuggingFace Drive

{% for item in items %}
{% if item.type == 'dir' %} {% else %} {% endif %}
{{ item.name }}
{% endfor %}
""" def list_folder(path=""): prefix = path.strip("/") + ("/" if path else "") all_files = api.list_repo_files(repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN) seen = set() items = [] for f in all_files: if not f.startswith(prefix): continue rest = f[len(prefix):] if "/" in rest: dir_name = rest.split("/")[0] dir_path = (prefix + dir_name).strip("/") if dir_path not in seen: seen.add(dir_path) items.append({"type":"dir","name":dir_name,"path":dir_path}) else: items.append({"type":"file","name":rest,"path":(prefix + rest).strip("/")}) # sort dirs then files items.sort(key=lambda x: (x["type"]!="dir", x["name"].lower())) return items @app.route("/", methods=["GET"]) def index(): path = request.args.get("path","").strip("/") return render_template_string(TEMPLATE, items=list_folder(path), path=path) @app.route("/download", methods=["GET"]) def download(): p = request.args.get("path","") # download via hf_hub_download into /tmp local = hf_hub_download(repo_id=REPO_ID, filename=p, repo_type="dataset", token=HF_TOKEN, cache_dir=tempfile.gettempdir()) return send_file(local, as_attachment=True, download_name=os.path.basename(p)) @app.route("/upload", methods=["POST"]) def upload(): file = request.files["file"] path = request.form.get("path","").strip("/") dest = f"{path}/{file.filename}".strip("/") tmp = tempfile.NamedTemporaryFile(delete=False) file.save(tmp.name) upload_file(path_or_fileobj=tmp.name, path_in_repo=dest, repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN) return redirect(f"/?path={path}") @app.route("/delete", methods=["POST"]) def delete(): d = request.get_json()["path"] all_files = api.list_repo_files(repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN) for f in all_files: if f == d or f.startswith(d.rstrip("/")+"/"): delete_file(repo_id=REPO_ID, path_in_repo=f, repo_type="dataset", token=HF_TOKEN) return jsonify(status="ok") @app.route("/create_folder", methods=["POST"]) def create_folder(): folder = request.get_json()["path"].strip("/") keep = f"{folder}/.keep" tmp = tempfile.NamedTemporaryFile(delete=False) tmp.write(b"") tmp.flush() upload_file(path_or_fileobj=tmp.name, path_in_repo=keep, repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN) return jsonify(status="ok") @app.route("/rename", methods=["POST"]) def rename(): data = request.get_json() old, new = data["old_path"].strip("/"), data["new_path"].strip("/") all_files = api.list_repo_files(repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN) for f in all_files: if f == old or f.startswith(old+"/"): rel = f[len(old):].lstrip("/") newp = (new + "/" + rel).strip("/") local = hf_hub_download(repo_id=REPO_ID, filename=f, repo_type="dataset", token=HF_TOKEN, cache_dir=tempfile.gettempdir()) upload_file(path_or_fileobj=local, path_in_repo=newp, repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN) delete_file(repo_id=REPO_ID, path_in_repo=f, repo_type="dataset", token=HF_TOKEN) return jsonify(status="ok") if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=7860)