from flask import Blueprint, render_template, request, send_file, jsonify import math, time from helpers.db import db_get_videos, db_get_video, db_get_recent from helpers.favorites import mark_favorites, db_get_favorites, db_get_fav_set from helpers.cache import build_cache from config import VIDEOS_PER_PAGE, DASHBOARD_PER_PAGE web = Blueprint("web", __name__) @web.route("/") def dashboard(): cache = build_cache() query = request.args.get("q", "").lower().strip() sort = request.args.get("sort", "total_size") dir_ = request.args.get("dir", "desc") reverse = (dir_ == "desc") items = list(cache["storage_usage"].items()) if query: items = [e for e in items if query in e[0].split("::")[0].lower()] def k_user(x): return x[0].split("::")[0].lower() def k_platform(x): return x[0].split("::")[1].lower() def k_total(x): return x[1]["total_size"] def k_count(x): return x[1]["video_count"] def k_avg(x): return cache["avg_sizes"][x[0]] key_map = { "user": k_user, "platform": k_platform, "total_size": k_total, "video_count": k_count, "avg_size": k_avg, } items.sort(key=key_map.get(sort, k_total), reverse=reverse) page = max(1, int(request.args.get("page", 1))) total_pages = max(1, math.ceil(len(items) / DASHBOARD_PER_PAGE)) start = (page - 1) * DASHBOARD_PER_PAGE paginated = items[start:start + DASHBOARD_PER_PAGE] return render_template( "main.html", storage_usage=paginated, avg_sizes=cache["avg_sizes"], page=page, total_pages=total_pages, query=query, sort=sort, dir=dir_ ) @web.route("/refresh") def refresh(): cache = build_cache() return jsonify({ "status": "ok", "videos": sum(x["video_count"] for x in cache["storage_usage"].values()), "updated": time.ctime(cache["timestamp"]) }) @web.route("/user/") def user_page(username): videos = db_get_videos(username=username) page = max(1, int(request.args.get("page", 1))) total_pages = max(1, math.ceil(len(videos) / VIDEOS_PER_PAGE)) start = (page - 1) * VIDEOS_PER_PAGE paginated = videos[start:start + VIDEOS_PER_PAGE] mark_favorites(paginated) return render_template( "user_page.html", username=username, videos=paginated, page=page, total_pages=total_pages ) @web.route("/video/stream/") def stream_video(video_id): video = db_get_video(video_id) if video: return send_file(video["filepath"], mimetype="video/mp4") return "Video not found", 404 @web.route("/video/") def view_video(video_id): video = db_get_video(video_id) if video: video["is_favorite"] = (video["video_id"] in db_get_fav_set()) return render_template("video_view.html", video=video) return "Video not found", 404 @web.route("/recent") def recent(): page = max(1, int(request.args.get("page", 1))) per_page = VIDEOS_PER_PAGE videos, total = db_get_recent(page, per_page) total_pages = max(1, math.ceil(total / per_page)) mark_favorites(videos) return render_template( "recent.html", videos=videos, page=page, total_pages=total_pages ) @web.route("/favorites") def favorites_page(): page = max(1, int(request.args.get("page", 1))) per_page = VIDEOS_PER_PAGE videos, total = db_get_favorites(page, per_page) total_pages = max(1, math.ceil(total / per_page)) mark_favorites(videos) return render_template( "favorites.html", videos=videos, page=page, total_pages=total_pages )