File size: 3,669 Bytes
d1baa28
 
 
 
 
eddfd17
d1baa28
eddfd17
d1baa28
 
 
 
 
 
eddfd17
d1baa28
 
 
 
 
 
eddfd17
d1baa28
 
 
eddfd17
d1baa28
 
 
 
eddfd17
d1baa28
 
 
 
 
eddfd17
d1baa28
 
 
 
 
 
eddfd17
d1baa28
 
 
 
 
 
 
 
 
 
 
 
 
0f99f61
d1baa28
 
 
 
0f99f61
d1baa28
 
 
 
 
 
 
882d2ac
d1baa28
 
 
 
 
 
 
 
 
882d2ac
d1baa28
 
 
 
 
 
 
 
 
 
 
 
 
0f99f61
d1baa28
 
 
24a5b54
d1baa28
eddfd17
d1baa28
 
 
 
 
eddfd17
d1baa28
eddfd17
d1baa28
 
 
eddfd17
73df6d1
 
 
 
d1baa28
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from flask import (
    Flask, render_template, request, redirect,
    url_for, send_from_directory, send_file, session, flash
)
import os, json
from werkzeug.utils import secure_filename
from datetime import timedelta

# ---------- basic config ----------
UPLOAD_ROOT      = "uploaded_files"          # root folder for *all* users
USERS_FILE       = "users.json"              # simple JSON registry
ALLOWED_EXTS     = {"pdf", "txt", "mp3", "wav", "ogg"}
SECRET           = os.getenv("SECRET_KEY", "change‑me")
os.makedirs(UPLOAD_ROOT, exist_ok=True)

app = Flask(__name__, static_url_path="/static")
app.config.update(
    UPLOAD_ROOT=UPLOAD_ROOT,
    SECRET_KEY=SECRET,
    PERMANENT_SESSION_LIFETIME=timedelta(days=30),
)

# ---------- helpers ----------
def allowed(filename):
    return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTS

def user_folder():
    folder = os.path.join(UPLOAD_ROOT, session["username"])
    os.makedirs(folder, exist_ok=True)
    return folder

def load_users():
    if not os.path.exists(USERS_FILE):
        return []
    with open(USERS_FILE) as f:
        return json.load(f)

def save_user(name):
    users = load_users()
    if name not in users:
        users.append(name)
        with open(USERS_FILE, "w") as f:
            json.dump(users, f)

# ---------- auth ----------
@app.route("/", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        name = request.form.get("username", "").strip()
        if not name:
            flash("Pick a name first.")
            return redirect(url_for("login"))
        session.permanent = True
        session["username"] = name
        save_user(name)
        return redirect(url_for("dashboard"))
    return render_template("login.html")

@app.get("/logout")
def logout():
    session.clear()
    return redirect(url_for("login"))

# ---------- main UI ----------
@app.get("/dashboard")
def dashboard():
    if "username" not in session:
        return redirect(url_for("login"))
    files = os.listdir(user_folder())
    return render_template("index.html", files=files, user=session["username"])

# ---------- file handlers ----------
@app.post("/upload")
def upload_file():
    if "username" not in session:
        return redirect(url_for("login"))
    for file in request.files.getlist("file"):
        if file and allowed(file.filename):
            file.save(os.path.join(user_folder(), secure_filename(file.filename)))
    return redirect(url_for("dashboard"))

@app.get("/view/<path:filename>")
def view_file(filename):
    path = os.path.join(user_folder(), filename)
    if not os.path.exists(path):
        return "File not found", 404
    mime = {
        "pdf": "application/pdf",
        "txt": "text/plain",
        "mp3": "audio/mpeg",
        "wav": "audio/wav",
        "ogg": "audio/ogg",
    }.get(filename.rsplit(".", 1)[-1].lower(), "application/octet-stream")
    return send_file(path, mimetype=mime, as_attachment=False)

@app.get("/download/<path:filename>")
def download_file(filename):
    return send_from_directory(user_folder(), filename, as_attachment=True)

@app.post("/delete/<path:filename>")
def delete_file(filename):
    try:
        os.remove(os.path.join(user_folder(), filename))
    except FileNotFoundError:
        pass
    return redirect(url_for("dashboard"))

@app.post("/clear")
def clear_all():
    for f in os.listdir(user_folder()):
        os.remove(os.path.join(user_folder(), f))
    return redirect(url_for("dashboard"))

@app.route("/api/ping")
def ping():
    return "pong", 200

# ---------- hf entry ----------
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=7860)