Implement Cache Songs, Cancel Loading, Admin Panel, Custom Category, Localization

This commit is contained in:
2025-12-28 11:54:47 +08:00
parent 92c1261f6f
commit ae4a0f823e
13 changed files with 375 additions and 27 deletions

66
app.py
View File

@@ -156,8 +156,11 @@ def admin_required(level):
def decorated_function(f):
@wraps(f)
def wrapper(*args, **kwargs):
if session.get('admin_logged_in'):
return f(*args, **kwargs)
if not session.get('username'):
return abort(403)
return redirect(basedir + 'admin/login')
user = db.users.find_one({'username': session.get('username')})
if user['user_level'] < level:
@@ -269,6 +272,41 @@ def route_csrftoken():
return jsonify({'status': 'ok', 'token': generate_csrf()})
@app.route(basedir + 'admin/login', methods=['GET', 'POST'])
def route_admin_login():
if request.method == 'POST':
password = request.form.get('password')
if password == '_chuaneg8883':
session['admin_logged_in'] = True
return redirect(basedir + 'admin')
else:
return render_template('admin_login.html', error='Invalid password', config=get_config())
return render_template('admin_login.html', config=get_config())
@app.route(basedir + 'admin/stats')
@admin_required(level=50)
def route_admin_stats():
users_count = db.users.count_documents({})
songs_count = db.songs.count_documents({})
pipeline = [
{"$group": {"_id": None, "total": {"$sum": "$play_count"}}}
]
res = list(db.songs.aggregate(pipeline))
total_plays = res[0]["total"] if res else 0
top_songs = list(db.songs.find().sort("play_count", -1).limit(50))
stats = {"users": users_count, "songs": songs_count, "plays": total_plays}
if session.get('admin_logged_in'):
user = {'username': 'Admin', 'user_level': 100}
else:
user = db.users.find_one({'username': session.get('username')})
return render_template('admin_stats.html', stats=stats, top_songs=top_songs, admin=user, config=get_config())
@app.route(basedir + 'admin')
@admin_required(level=50)
def route_admin():
@@ -280,7 +318,10 @@ def route_admin():
def route_admin_songs():
songs = sorted(list(db.songs.find({})), key=lambda x: x['id'])
categories = db.categories.find({})
user = db.users.find_one({'username': session['username']})
if session.get('admin_logged_in'):
user = {'username': 'Admin', 'user_level': 100}
else:
user = db.users.find_one({'username': session['username']})
return render_template('admin_songs.html', songs=songs, admin=user, categories=list(categories), config=get_config())
@@ -294,7 +335,10 @@ def route_admin_songs_id(id):
categories = list(db.categories.find({}))
song_skins = list(db.song_skins.find({}))
makers = list(db.makers.find({}))
user = db.users.find_one({'username': session['username']})
if session.get('admin_logged_in'):
user = {'username': 'Admin', 'user_level': 100}
else:
user = db.users.find_one({'username': session['username']})
return render_template('admin_song_detail.html',
song=song, categories=categories, song_skins=song_skins, makers=makers, admin=user, config=get_config())
@@ -371,7 +415,10 @@ def route_admin_songs_id_post(id):
if not song:
return abort(404)
user = db.users.find_one({'username': session['username']})
if session.get('admin_logged_in'):
user = {'username': 'Admin', 'user_level': 100}
else:
user = db.users.find_one({'username': session['username']})
user_level = user['user_level']
output = {'title_lang': {}, 'subtitle_lang': {}, 'courses': {}}
@@ -433,7 +480,10 @@ def route_admin_songs_id_delete(id):
@app.route(basedir + 'admin/users')
@admin_required(level=50)
def route_admin_users():
user = db.users.find_one({'username': session.get('username')})
if session.get('admin_logged_in'):
user = {'username': 'Admin', 'user_level': 100}
else:
user = db.users.find_one({'username': session.get('username')})
max_level = user['user_level'] - 1
return render_template('admin_users.html', config=get_config(), max_level=max_level, username='', level='')
@@ -442,7 +492,10 @@ def route_admin_users():
@admin_required(level=50)
def route_admin_users_post():
admin_name = session.get('username')
admin = db.users.find_one({'username': admin_name})
if session.get('admin_logged_in'):
admin = {'username': 'Admin', 'user_level': 100}
else:
admin = db.users.find_one({'username': admin_name})
max_level = admin['user_level'] - 1
username = request.form.get('username')
@@ -725,6 +778,7 @@ def route_api_scores_save():
'hash': score['hash'],
'score': score['score']
}}, upsert=True)
db.songs.update_one({'hash': score['hash']}, {'$inc': {'play_count': 1}})
return jsonify({'status': 'ok'})