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/') 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/', 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)