main.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import os
  2. import hashlib
  3. import random
  4. import json
  5. from flask import Flask, jsonify, send_file, request
  6. from flask_cors import CORS
  7. app = Flask(__name__)
  8. CORS(app)
  9. # 配置文件路径
  10. VIDEO_DIR = "videos" # 视频存放目录
  11. WEIGHT_FILE = "weights.json" # 权重存储文件
  12. def get_file_md5(filepath):
  13. """计算文件的MD5值"""
  14. hash_md5 = hashlib.md5()
  15. with open(filepath, "rb") as f:
  16. for chunk in iter(lambda: f.read(4096), b""):
  17. hash_md5.update(chunk)
  18. return hash_md5.hexdigest()
  19. def scan_videos():
  20. """扫描视频目录并返回带权重的文件列表"""
  21. videos = []
  22. for filename in os.listdir(VIDEO_DIR):
  23. if filename.split('.')[-1].lower() in ['mp4', 'avi', 'mov', 'mkv']:
  24. filepath = os.path.join(VIDEO_DIR, filename)
  25. md5 = get_file_md5(filepath)
  26. videos.append({'md5': md5, 'filename': filename})
  27. return videos
  28. def load_weights():
  29. """加载权重数据"""
  30. try:
  31. with open(WEIGHT_FILE, 'r') as f:
  32. return json.load(f)
  33. except:
  34. return {}
  35. def save_weights(weights):
  36. """保存权重数据"""
  37. with open(WEIGHT_FILE, 'w') as f:
  38. json.dump(weights, f)
  39. def get_weighted_list():
  40. """获取带权重的视频列表"""
  41. videos = scan_videos()
  42. weights = load_weights()
  43. weighted_list = []
  44. for v in videos:
  45. weight = weights.get(v['md5'], 5)
  46. weighted_list.append({
  47. **v,
  48. 'weight': max(0, min(10, int(weight))), # 限制在0-10之间
  49. 'path': os.path.join(VIDEO_DIR, v['filename'])
  50. })
  51. return weighted_list
  52. @app.route('/files')
  53. def get_files():
  54. """接口1:获取文件列表"""
  55. return jsonify(get_weighted_list())
  56. @app.route('/random')
  57. def get_random():
  58. """接口2:加权随机获取视频"""
  59. files = get_weighted_list()
  60. total_weight = sum(f['weight'] for f in files)
  61. rand = random.uniform(0, total_weight)
  62. current = 0
  63. for f in files:
  64. current += f['weight']
  65. if rand <= current:
  66. return jsonify(f)
  67. return jsonify(files[0])
  68. @app.route('/play/<md5>')
  69. def play_video(md5):
  70. """接口3:播放指定视频"""
  71. for f in get_weighted_list():
  72. if f['md5'] == md5:
  73. return send_file(f['path'])
  74. return "File not found", 404
  75. @app.route('/weight/<md5>', methods=['POST'])
  76. def update_weight(md5):
  77. """接口4:更新权重"""
  78. weights = load_weights()
  79. try:
  80. weight = int(request.json.get('weight', 5))
  81. weights[md5] = max(0, min(10, weight))
  82. save_weights(weights)
  83. return jsonify({'status': 'success'})
  84. except:
  85. return jsonify({'status': 'error'}), 400
  86. if __name__ == '__main__':
  87. os.makedirs(VIDEO_DIR, exist_ok=True)
  88. app.run(debug=True)