123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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)
|