修复若干问题,修改媒体加载方式

master
newrain001 2 years ago
parent a8d826a186
commit c349d55132
  1. 8
      App/urls.py
  2. 72
      App/views.py
  3. 4
      templates/index.html
  4. 12
      templates/nav/videolist.html
  5. 6
      templates/nav/videoview.html

@ -19,7 +19,9 @@ urlpatterns = [
path('edit/<id>', views.editMD, name='editMD'),
path('paperlist/', views.paperList, name='paperList'),
path('paperview/<id>', views.paperDetail, name='paperDetail'),
path('video/', views.videoView, name='videoView'),
path('video/<id>', views.videoView, name='videoView'),
path('videolist/', views.videoList, name='videoList'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
#static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
path('videoView/', views.stream_video, name='stream_video'),
path('videoDownload/<id>', views.videoDownload, name='videoDownload'),
]

@ -1,8 +1,9 @@
import os
import mimetypes
from django.contrib import messages
from django.contrib.auth import authenticate
from django.db.models import F, QuerySet, Count
from django.http import JsonResponse
from django.http import JsonResponse, StreamingHttpResponse, FileResponse
from django.shortcuts import HttpResponse, render, redirect, reverse
from django.contrib.auth.decorators import login_required
from django.views.decorators.cache import cache_page
@ -11,10 +12,12 @@ from django.conf import settings
from .forms import *
from .models import *
from .qingcloud import putImage
import datetime, requests, json
import datetime, requests, json, re, os
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.clickjacking import xframe_options_sameorigin
from .csdn import get_image
from wsgiref.util import FileWrapper
from urllib.parse import quote
#@cache_page(60 * 15)
def index(request):
@ -276,17 +279,66 @@ def paperDetail(request, id):
paper.objects.filter(id=id).update(views=paper.objects.filter(id=id).get().views+1)
return render(request, 'function/viewmd.html', {'data': data, 'thumbs': thumbs.objects.filter(paper_id=id).count()})
def videoView(request):
def videoView(request, id):
if request.method == 'GET':
video_path = request.GET.get('videopath')
return render(request, 'nav/videoview.html', {'path': video_path})
data = videoUpload.objects.filter(id=id).get()
return render(request, 'nav/videoview.html', {'path': data.video_path})
def videoList(request):
desc = videoUpload.objects.all().values('video_desc').distinct()
data = {}
for i in desc:
data[i["video_desc"]] = videoUpload.objects.filter(video_desc=i["video_desc"]).all().order_by('video_title')
for k,v in data.items():
for i in v.all():
print(i.video_title)
return render(request, 'nav/videolist.html', {'data':data })
return render(request, 'nav/videolist.html', {'data':data })
def file_iterator(file_name, chunk_size=8192, offset=0, length=None):
with open(file_name, "rb") as f:
f.seek(offset, os.SEEK_SET)
remaining = length
while True:
bytes_length = chunk_size if remaining is None else min(remaining, chunk_size)
data = f.read(bytes_length)
if not data:
break
if remaining:
remaining -= len(data)
yield data
def stream_video(request):
"""将视频文件以流媒体的方式响应"""
range_header = request.META.get('HTTP_RANGE', '').strip()
range_re = re.compile(r'bytes\s*=\s*(\d+)\s*-\s*(\d*)', re.I)
range_match = range_re.match(range_header)
path = request.GET.get('path')
#这里根据实际情况改变,我的views.py在core文件夹下但是folder_path却只到core的上一层,media也在core文件夹下
folder_path = os.getcwd().replace('\\', '/')
path=folder_path+path #path就是template ?后面的参数的值
size = os.path.getsize(path)
content_type, encoding = mimetypes.guess_type(path)
content_type = content_type or 'application/octet-stream'
if range_match:
first_byte, last_byte = range_match.groups()
first_byte = int(first_byte) if first_byte else 0
last_byte = first_byte + 1024 * 1024 * 10
if last_byte >= size:
last_byte = size - 1
length = last_byte - first_byte + 1
resp = StreamingHttpResponse(file_iterator(path, offset=first_byte, length=length), status=206, content_type=content_type)
resp['Content-Length'] = str(length)
resp['Content-Range'] = 'bytes %s-%s/%s' % (first_byte, last_byte, size)
else:
resp = StreamingHttpResponse(FileWrapper(open(path, 'rb')), content_type=content_type)
resp['Content-Length'] = str(size)
resp['Accept-Ranges'] = 'bytes'
return resp
def videoDownload(request, id):
data = videoUpload.objects.filter(id=id).get()
file_path = str(data.video_path)[1:]
file_name = os.path.basename(file_path)
file = open(file_path, 'rb')
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{}"'.format(quote(file_name))
messages.error(request, '下载成功')
return response

@ -7,6 +7,9 @@
<link rel="stylesheet" href="{% static 'css/station/carousel.css' %}">
{% endblock %}
{% block login %}
<script>
alert('本次更新:\n1、视频采用流媒体加载。2、修复播放慢、加载时间长,无法拖拽进度条等问题\n3、视频展示页面新增下载按钮\n4、视频展示页面排序规则\n5、主页更新弹出')
</script>
<header style="padding-top: 70px">
<div class="px-3 py-2 border-bottom mb-3">
<div class="container d-flex flex-wrap justify-content-center">
@ -159,6 +162,5 @@
<hr>
{% endfor %}
<!-- /END THE FEATURETTES -->
</div><!-- /.container -->
{% endblock %}

@ -24,13 +24,14 @@
<h5 class="dy-video-title">{{ i.video_title }}</h5>
<span>文件大小:{{ i.video_size|filesizeformat }}</span> <br>
<span>上传用户:{{ i.username }} </span> <br>
<span>上传时间:{{ i.video_time }}</span>
<span>上传时间:{{ i.video_time }}</span> <br>
<span><a href="{% url 'App:videoDownload' i.id %}">点击下载</a></span>
<p class="dy-video-intro">本视频由千锋云计算持续维护,加速通道正在开发当中。</p>
</div>
<div class="dy-video-meta-bg"></div>
</div>
<div class="dy-video-poster"><a
href="{% url 'App:videoView' %}?videopath={{ i.video_path }}"
href="{% url 'App:videoView' i.id %}"
class="dy-video-link"> <img class="dy-video-img" src="{{ i.video_image }}"
alt="{{ i.video_title }}"> <span
class="dy-video-nocomplete"></span> <span
@ -45,4 +46,11 @@
{% endfor %}
</div>
</div>
{% if messages %}
<script>
{% for msg in messages %}
alert('{{msg.message}}');
{% endfor %}
</script>
{% endif %}
{% endblock %}

@ -1,7 +1,7 @@
{% extends 'template.html' %}
{% block title %}
{% load static %}
<html lang="cn">
<html lang="cn" style="overflow: hidden">
<head>
<link href="{% static 'css/video/main-css.css' %}" rel="stylesheet">
</head>
@ -53,7 +53,7 @@
// type: 视频类型 mp4:可播放浏览器支持的常见格式的视频文件(mp4/ogg/webm) m3u8: 可播放Hls形式推流直播视频(***.m3u8) flv: 可播放flv视频
// src: 视频路径,可以是本地路径亦可是网络路径
type: 'mp4',
src: '{{ path }}'
src: '{% url "App:stream_video" %}?path={{ path }}'
})
/* 插件的常用配置参数 */
@ -80,7 +80,7 @@
// 监听“下一个”按钮控件点击事件
nextControl.addEventListener('click', function (event) {
alert('click next menu !!!')
alert('暂不支持')
})
// 监听进入全屏模式后触发(点击进入全屏按钮)
fullScreenControl.addEventListener('fullscreen', function (event) {

Loading…
Cancel
Save