|
@@ -9,26 +9,74 @@ app = Flask(__name__)
|
|
|
CORS(app)
|
|
|
|
|
|
# 配置文件路径
|
|
|
-VIDEO_DIR = "videos" # 视频存放目录
|
|
|
-WEIGHT_FILE = "weights.json" # 权重存储文件
|
|
|
+VIDEO_DIR = "/177_data/media/MV" # 视频存放目录
|
|
|
+WEIGHT_FILE = "weights.json" # 权重存储文件
|
|
|
+MD5_CACHE_FILE = "md5_cache.json" # MD5缓存文件
|
|
|
|
|
|
-def get_file_md5(filepath):
|
|
|
+def load_md5_cache():
|
|
|
+ """加载MD5缓存文件"""
|
|
|
+ try:
|
|
|
+ with open(MD5_CACHE_FILE, 'r') as f:
|
|
|
+ cache = json.load(f)
|
|
|
+ return {k: (v[0], v[1], v[2]) for k, v in cache.items()}
|
|
|
+ except (FileNotFoundError, json.JSONDecodeError):
|
|
|
+ return {}
|
|
|
+
|
|
|
+def save_md5_cache(cache):
|
|
|
+ """保存MD5缓存文件"""
|
|
|
+ serializable = {k: [v[0], v[1], v[2]] for k, v in cache.items()}
|
|
|
+ with open(MD5_CACHE_FILE, 'w') as f:
|
|
|
+ json.dump(serializable, f)
|
|
|
+
|
|
|
+def compute_md5(filepath):
|
|
|
"""计算文件的MD5值"""
|
|
|
hash_md5 = hashlib.md5()
|
|
|
with open(filepath, "rb") as f:
|
|
|
- for chunk in iter(lambda: f.read(4096), b""):
|
|
|
+ for chunk in iter(lambda: f.read(8192), b""):
|
|
|
hash_md5.update(chunk)
|
|
|
return hash_md5.hexdigest()
|
|
|
|
|
|
-def scan_videos():
|
|
|
- """扫描视频目录并返回带权重的文件列表"""
|
|
|
- videos = []
|
|
|
+def scan_files():
|
|
|
+ """扫描视频文件并维护MD5缓存"""
|
|
|
+ cache = load_md5_cache()
|
|
|
+ updated = False
|
|
|
+ files = []
|
|
|
+
|
|
|
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
|
|
|
+ # 过滤非视频文件
|
|
|
+ if filename.split('.')[-1].lower() not in ['mp4', 'avi', 'mov', 'mkv']:
|
|
|
+ continue
|
|
|
+
|
|
|
+ filepath = os.path.join(VIDEO_DIR, filename)
|
|
|
+ if not os.path.isfile(filepath):
|
|
|
+ continue
|
|
|
+
|
|
|
+ try:
|
|
|
+ stat = os.stat(filepath)
|
|
|
+ current_size = stat.st_size
|
|
|
+ current_mtime = stat.st_mtime
|
|
|
+
|
|
|
+ # 检查缓存有效性
|
|
|
+ if filename in cache:
|
|
|
+ cached_size, cached_mtime, cached_md5 = cache[filename]
|
|
|
+ if cached_size == current_size and cached_mtime == current_mtime:
|
|
|
+ files.append({'filename': filename, 'md5': cached_md5, 'path': filepath})
|
|
|
+ continue
|
|
|
+
|
|
|
+ # 需要更新缓存
|
|
|
+ md5 = compute_md5(filepath)
|
|
|
+ cache[filename] = (current_size, current_mtime, md5)
|
|
|
+ updated = True
|
|
|
+ files.append({'filename': filename, 'md5': md5, 'path': filepath})
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ print(f"Error processing {filename}: {str(e)}")
|
|
|
+
|
|
|
+ # 保存更新后的缓存
|
|
|
+ if updated:
|
|
|
+ save_md5_cache(cache)
|
|
|
+
|
|
|
+ return files
|
|
|
|
|
|
def load_weights():
|
|
|
"""加载权重数据"""
|
|
@@ -43,58 +91,67 @@ 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('/')
|
|
|
+def index():
|
|
|
+ return send_file('index.html')
|
|
|
|
|
|
@app.route('/files')
|
|
|
def get_files():
|
|
|
- """接口1:获取文件列表"""
|
|
|
- return jsonify(get_weighted_list())
|
|
|
+ """文件列表接口"""
|
|
|
+ files = scan_files()
|
|
|
+ weights = load_weights()
|
|
|
+
|
|
|
+ # 合并权重数据
|
|
|
+ for f in files:
|
|
|
+ f['weight'] = weights.get(f['md5'], 5)
|
|
|
+
|
|
|
+ return jsonify(files)
|
|
|
|
|
|
@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
|
|
|
+ """加权随机接口"""
|
|
|
+ files = scan_files()
|
|
|
+ weights = load_weights()
|
|
|
+
|
|
|
+ # 构建权重列表
|
|
|
+ weighted = []
|
|
|
for f in files:
|
|
|
- current += f['weight']
|
|
|
+ weight = weights.get(f['md5'], 5)
|
|
|
+ weighted.append( (f, max(0, min(10, weight))) )
|
|
|
+
|
|
|
+ # 加权随机选择
|
|
|
+ total = sum(w for _, w in weighted)
|
|
|
+ if total == 0:
|
|
|
+ return jsonify(random.choice(files))
|
|
|
+
|
|
|
+ rand = random.uniform(0, total)
|
|
|
+ current = 0
|
|
|
+ for f, w in weighted:
|
|
|
+ current += w
|
|
|
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():
|
|
|
+ """播放接口"""
|
|
|
+ for f in scan_files():
|
|
|
if f['md5'] == md5:
|
|
|
return send_file(f['path'])
|
|
|
- return "File not found", 404
|
|
|
+ return "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'})
|
|
|
+ return jsonify({'status': 'ok'})
|
|
|
except:
|
|
|
return jsonify({'status': 'error'}), 400
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
os.makedirs(VIDEO_DIR, exist_ok=True)
|
|
|
- app.run(debug=True)
|
|
|
+ app.run(debug=True, host='0.0.0.0', port=5000)
|