import logging from django.views.generic import View from django.http.response import HttpResponse, HttpResponseRedirect, Http404 from django.db.models import F from aliyun_video.models import ( AliyunVideo, AliyunVideoPlayDetail, AliyunVideoHistory ) from aliyun_video.core.utils import get_valid_cdn_url logger = logging.getLogger(__name__) class Playm3u8View(View): def get(self, request, *args, **kwargs): lesson_id = kwargs['lesson_id'] video_id = kwargs['video_id'] play_id = kwargs['play_id'] try: m3u8_index_content = AliyunVideoPlayDetail.objects.get( video__lesson_id=lesson_id, video_id=video_id, play_id=play_id ).m3u8_index_content if request.user.is_authenticated: logger.info({ 'user_id': request.user.id, 'lesson_id': lesson_id, 'video_id': video_id, 'play_id': play_id, 'type': 'backend', 'body': { 'event': 'm3u8' } }) except AliyunVideoPlayDetail.DoesNotExist: raise Http404 return HttpResponse(m3u8_index_content) class PlayTsView(View): def get(self, request, *args, **kwargs): lesson_id = kwargs['lesson_id'] video_id = kwargs['video_id'] play_id = kwargs['play_id'] seq_num = kwargs['seq_num'] if not AliyunVideoPlayDetail.objects.filter( video__lesson_id=lesson_id, video_id=video_id, play_id=play_id).exists(): raise Http404 if request.user.is_authenticated: logger.info({ 'user_id': request.user.id, 'lesson_id': lesson_id, 'video_id': video_id, 'play_id': play_id, 'type': 'backend', 'body': { 'event': 'ts', 'seq_num': seq_num } }) return HttpResponseRedirect( get_valid_cdn_url('/{}/{}-{}.ts'.format(video_id, play_id, seq_num))) class PlayLogView(View): def get(self, request, *args, **kwargs): lesson_id = kwargs['lesson_id'] video_id = kwargs['video_id'] try: aliyun_video = AliyunVideo.objects.get( lesson_id=lesson_id, video_id=video_id) except AliyunVideo.DoesNotExist: raise Http404 data = request.GET event_type = data.get('event') play_at = data.get('play_at') definition = data.get('definition') if request.user.is_authenticated: logger.info({ 'user_id': request.user.id, 'lesson_id': lesson_id, 'video_id': video_id, 'type': 'frontend', 'body': dict(request.GET) }) if event_type == 'end' and request.user.is_authenticated: history, _ = AliyunVideoHistory.objects.get_or_create( video=aliyun_video, user=request.user) AliyunVideoHistory.objects.filter(pk=history.id).update( played_at=play_at, last_definition=definition, total_visited_count=F('total_visited_count') + 1) from university.models import Lesson Lesson.update_lesson_progress(lesson_id, request.user.id) return HttpResponse()