AI 生成: 一个仿 aptv.pro 的视频站点,使用 Python Flask 构建,包含视频列表、分类、搜索和视频播放页面。
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
import json
|
||||
import os
|
||||
from flask import Flask, render_template, request, abort
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
DATA_FILE = os.path.join(os.path.dirname(__file__), 'data', 'videos.json')
|
||||
|
||||
|
||||
def load_videos():
|
||||
"""加载视频数据"""
|
||||
with open(DATA_FILE, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
"""首页:支持分类筛选和搜索"""
|
||||
videos = load_videos()
|
||||
category = request.args.get('category', '').strip()
|
||||
keyword = request.args.get('q', '').strip()
|
||||
|
||||
# 分类筛选
|
||||
if category:
|
||||
videos = [v for v in videos if v.get('category') == category]
|
||||
|
||||
# 关键词搜索
|
||||
if keyword:
|
||||
kw = keyword.lower()
|
||||
videos = [v for v in videos if kw in v.get('title', '').lower()
|
||||
or kw in v.get('description', '').lower()]
|
||||
|
||||
# 所有分类
|
||||
all_videos = load_videos()
|
||||
categories = sorted({v.get('category', '') for v in all_videos if v.get('category')})
|
||||
|
||||
return render_template('index.html',
|
||||
videos=videos,
|
||||
categories=categories,
|
||||
current_category=category,
|
||||
keyword=keyword)
|
||||
|
||||
|
||||
@app.route('/video/<int:vid>')
|
||||
def detail(vid):
|
||||
"""视频详情页"""
|
||||
videos = load_videos()
|
||||
video = next((v for v in videos if v.get('id') == vid), None)
|
||||
if not video:
|
||||
abort(404)
|
||||
# 推荐:同分类的其他视频
|
||||
related = [v for v in videos if v.get('category') == video.get('category') and v.get('id') != vid][:6]
|
||||
return render_template('detail.html', video=video, related=related)
|
||||
|
||||
|
||||
@app.errorhandler(404)
|
||||
def not_found(e):
|
||||
return render_template('base.html', not_found=True), 404
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True, host='0.0.0.0', port=5000)
|
||||
Reference in New Issue
Block a user