|
@@ -0,0 +1,100 @@
|
|
|
+import os
|
|
|
+import hashlib
|
|
|
+import random
|
|
|
+import json
|
|
|
+from flask import Flask, jsonify, send_file, request
|
|
|
+from flask_cors import CORS
|
|
|
+
|
|
|
+app = Flask(__name__)
|
|
|
+CORS(app)
|
|
|
+
|
|
|
+# 配置文件路径
|
|
|
+VIDEO_DIR = "videos" # 视频存放目录
|
|
|
+WEIGHT_FILE = "weights.json" # 权重存储文件
|
|
|
+
|
|
|
+def get_file_md5(filepath):
|
|
|
+ """计算文件的MD5值"""
|
|
|
+ hash_md5 = hashlib.md5()
|
|
|
+ with open(filepath, "rb") as f:
|
|
|
+ for chunk in iter(lambda: f.read(4096), b""):
|
|
|
+ hash_md5.update(chunk)
|
|
|
+ return hash_md5.hexdigest()
|
|
|
+
|
|
|
+def scan_videos():
|
|
|
+ """扫描视频目录并返回带权重的文件列表"""
|
|
|
+ videos = []
|
|
|
+ for filename in os.listdir(VIDEO_DIR):
|
|
|
+ if filename.split('.')[-1].lower() in ['mp4', 'avi', 'mov', 'mkv']:
|
|
|
+ filepath = os.path.join(VIDEO_DIR, filename)
|
|
|
+ md5 = get_file_md5(filepath)
|
|
|
+ videos.append({'md5': md5, 'filename': filename})
|
|
|
+ return videos
|
|
|
+
|
|
|
+def load_weights():
|
|
|
+ """加载权重数据"""
|
|
|
+ try:
|
|
|
+ with open(WEIGHT_FILE, 'r') as f:
|
|
|
+ return json.load(f)
|
|
|
+ except:
|
|
|
+ return {}
|
|
|
+
|
|
|
+def save_weights(weights):
|
|
|
+ """保存权重数据"""
|
|
|
+ with open(WEIGHT_FILE, 'w') as f:
|
|
|
+ json.dump(weights, f)
|
|
|
+
|
|
|
+def get_weighted_list():
|
|
|
+ """获取带权重的视频列表"""
|
|
|
+ videos = scan_videos()
|
|
|
+ weights = load_weights()
|
|
|
+ weighted_list = []
|
|
|
+ for v in videos:
|
|
|
+ weight = weights.get(v['md5'], 5)
|
|
|
+ weighted_list.append({
|
|
|
+ **v,
|
|
|
+ 'weight': max(0, min(10, int(weight))), # 限制在0-10之间
|
|
|
+ 'path': os.path.join(VIDEO_DIR, v['filename'])
|
|
|
+ })
|
|
|
+ return weighted_list
|
|
|
+
|
|
|
+@app.route('/files')
|
|
|
+def get_files():
|
|
|
+ """接口1:获取文件列表"""
|
|
|
+ return jsonify(get_weighted_list())
|
|
|
+
|
|
|
+@app.route('/random')
|
|
|
+def get_random():
|
|
|
+ """接口2:加权随机获取视频"""
|
|
|
+ files = get_weighted_list()
|
|
|
+ total_weight = sum(f['weight'] for f in files)
|
|
|
+ rand = random.uniform(0, total_weight)
|
|
|
+ current = 0
|
|
|
+ for f in files:
|
|
|
+ current += f['weight']
|
|
|
+ if rand <= current:
|
|
|
+ return jsonify(f)
|
|
|
+ return jsonify(files[0])
|
|
|
+
|
|
|
+@app.route('/play/<md5>')
|
|
|
+def play_video(md5):
|
|
|
+ """接口3:播放指定视频"""
|
|
|
+ for f in get_weighted_list():
|
|
|
+ if f['md5'] == md5:
|
|
|
+ return send_file(f['path'])
|
|
|
+ return "File not found", 404
|
|
|
+
|
|
|
+@app.route('/weight/<md5>', methods=['POST'])
|
|
|
+def update_weight(md5):
|
|
|
+ """接口4:更新权重"""
|
|
|
+ weights = load_weights()
|
|
|
+ try:
|
|
|
+ weight = int(request.json.get('weight', 5))
|
|
|
+ weights[md5] = max(0, min(10, weight))
|
|
|
+ save_weights(weights)
|
|
|
+ return jsonify({'status': 'success'})
|
|
|
+ except:
|
|
|
+ return jsonify({'status': 'error'}), 400
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ os.makedirs(VIDEO_DIR, exist_ok=True)
|
|
|
+ app.run(debug=True)
|