在flask项目中基于redis,使用Dplayer实现弹幕功能
1.下载Dplayer插件, 下载地址
https://github.com/menhood/DPlayer-Typecho
2.把插件解压, 将dplayer的文件夹放在项目的静态文件目录中
此处有坑!!!!
因为dplayer的弹幕默认在接口后面添加了 /v3,比如说项目的接口为https://xxx/xxx/xxx?id=1,但是经过dplayer发送的请求就成了https://xxx/xxx/xxx/v3?id=1,这样我们根本就无法获取到数据了。
解决方案:
修改dplayer中的DPlayer.min.js
把 文件内所有带/v3 的代码统统删除,解决问题。
3.导入css和js
<link rel="stylesheet" href="{{ url_for("static", filename="dplayer/dist/DPlayer.min.css") }}">
<script src="{{ url_for("static", filename="dplayer/plugin/flv.min.js") }}"></script>
<script src="{{ url_for("static", filename="dplayer/plugin/hls.min.js") }}"></script>
<script src="{{ url_for("static", filename="dplayer/dist/DPlayer.min.js") }}"></script>
4.添加样式
.dplayer-comment-setting-type>label{
display: inline;
}
5.添加播放器
<!-- 播放器 --> <div id="dplayer" style="height: 500px; width: 774px;"></div>
6.添加js弹幕
var dp = new DPlayer({
element: document.getElementById("dplayer"),
video: {
url: "播放地址"
},
danmaku: {
id: "电影id",
api: "API地址"
}
})
7.案例
前端代码:
video.html
<html>
<head>
<link rel="stylesheet" href="{{ url_for("static", filename="dplayer/dist/DPlayer.min.css") }}">
<script src="{{ url_for("static", filename="dplayer/plugin/flv.min.js") }}"></script>
<script src="{{ url_for("static", filename="dplayer/plugin/hls.min.js") }}"></script>
<script src="{{ url_for("static", filename="dplayer/dist/DPlayer.min.js") }}"></script>
<style>
.dplayer-comment-setting-type>label{
display: inline;
}
</style>
</head>
<body>
<!-- 播放器 -->
<div id="dplayer" style="height: 500px; width: 774px;"></div>
<script>
// 弹幕js
var dp1 = new DPlayer({
element: document.getElementById("dplayer"),
video: {
// 视屏地址
url: "{{ url_for("static", filename="uploads"+movie.url) }}"
},
danmaku: {
id: "{{ movie.id }}",
api:'{{url_for('home.tm')}}'
} })
</script>
</body>
</html>
后端代码:(使用redis将弹幕内容存入并读取)
此处需下载redis,并安装flask-redis
pip3 install flask-redis
在init文件中引入flask-redis:
__init__.py
from flask_redis import FlaskRedis app.config["REDIS_URL"] = "redis://127.0.0.1:6379/0" rds = FlaskRedis() rds.init_app(app)
弹幕处理逻辑代码:
view.py
from app.home import home
from flask import render_template, current_app, request, flash, url_for, redirect, jsonify, Response
@home.route('/tm', methods=['POST', 'GET'])
def tm():
import json
import datetime
import uuid
if request.method == "GET":
id = request.args.get('id')
print("id:", id)
key = "movie" + id
if rds.llen(key):
msgs = rds.lrange(key, 0, 2999)
res = {
"code": 1,
"danmaku": [json.loads(v) for v in msgs]
}
else:
res = {
"code": 1,
"danmaku": []
}
if request.method == "POST":
# 添加弹幕
data = json.loads(request.get_data())
print("data:", data)
msg = {
# "__id": datetime.datetime.now().strftime("%Y%m%d%H%M%S") + uuid.uuid4().hex,
"id": data['id'],
"author": current_user.name,
"time": data['time'],
"text": data['text'],
"color": data['color'],
"type": data['type'],
"ip": request.remote_addr
}
res = {
"code": 1,
"data": msg
}
# 弹幕写进redis队列
rds.lpush("movie" + str(data["id"]), json.dumps(msg))
resp = json.dumps(res)
return Response(resp, mimetype='application/json')
浙公网安备 33010602011771号