2018-07-31 19:51:39 +00:00
|
|
|
import os
|
|
|
|
|
import uuid
|
|
|
|
|
|
|
|
|
|
import cv2
|
2018-10-01 20:34:57 +00:00
|
|
|
import pafy
|
2018-08-20 23:00:22 +00:00
|
|
|
from django.conf import settings
|
2018-07-31 19:51:39 +00:00
|
|
|
from django.core.files import File
|
|
|
|
|
from django.db import models
|
|
|
|
|
|
2018-10-01 20:34:57 +00:00
|
|
|
from api.exceptions import TooLargeFile
|
|
|
|
|
from comic_layout.comic_layout import LayoutGenerator
|
|
|
|
|
from keyframes.keyframes import KeyFramesExtractor
|
|
|
|
|
from style_transfer.style_transfer import StyleTransfer
|
2018-11-02 12:01:37 +00:00
|
|
|
from utils import jj, profile
|
2018-10-01 20:34:57 +00:00
|
|
|
|
2018-07-31 19:51:39 +00:00
|
|
|
|
|
|
|
|
class Video(models.Model):
|
2018-08-20 23:00:22 +00:00
|
|
|
file = models.FileField(blank=False, null=False, upload_to="raw_videos")
|
2018-07-31 19:51:39 +00:00
|
|
|
timestamp = models.DateTimeField(auto_now_add=True)
|
|
|
|
|
|
2018-11-02 12:01:37 +00:00
|
|
|
@profile
|
2018-10-01 20:34:57 +00:00
|
|
|
def download_from_youtube(self, yt_url):
|
|
|
|
|
yt_pafy = pafy.new(yt_url)
|
|
|
|
|
|
|
|
|
|
# Use the biggest possible quality with file size < MAX_FILE_SIZE and resolution <= 480px
|
2018-11-10 21:45:55 +00:00
|
|
|
for stream in reversed(yt_pafy.videostreams):
|
2018-10-01 20:34:57 +00:00
|
|
|
if stream.get_filesize() < settings.MAX_FILE_SIZE and int(stream.quality.split("x")[1]) <= 480:
|
|
|
|
|
tmp_name = uuid.uuid4().hex + ".mp4"
|
|
|
|
|
relative_path = jj('raw_videos', tmp_name)
|
|
|
|
|
full_path = jj(settings.MEDIA_ROOT, relative_path)
|
|
|
|
|
stream.download(full_path)
|
|
|
|
|
self.file.name = relative_path
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
raise TooLargeFile()
|
|
|
|
|
|
2018-11-18 12:48:39 +00:00
|
|
|
def create_comix(self, yt_url='', frames_mode=0, rl_mode=0, image_assessment_mode=0, style_transfer_mode=0):
|
2018-11-09 11:19:31 +00:00
|
|
|
(keyframes, keyframes_timings), keyframes_extraction_time = KeyFramesExtractor.get_keyframes(
|
2018-11-05 23:56:15 +00:00
|
|
|
video=self,
|
|
|
|
|
frames_mode=frames_mode,
|
2018-11-08 23:44:19 +00:00
|
|
|
rl_mode=rl_mode,
|
|
|
|
|
image_assessment_mode=image_assessment_mode
|
2018-11-05 23:56:15 +00:00
|
|
|
)
|
2018-11-10 21:45:55 +00:00
|
|
|
stylized_keyframes, stylization_time = StyleTransfer.get_stylized_frames(frames=keyframes,
|
|
|
|
|
style_transfer_mode=style_transfer_mode)
|
2018-11-02 12:01:37 +00:00
|
|
|
comic_image, layout_generation_time = LayoutGenerator.get_layout(frames=stylized_keyframes)
|
|
|
|
|
|
2018-11-18 12:48:39 +00:00
|
|
|
comic, from_nparray_time = Comic.create_from_nparray(nparray=comic_image,
|
|
|
|
|
video=self,
|
|
|
|
|
yt_url=yt_url,
|
|
|
|
|
frames_mode=frames_mode,
|
|
|
|
|
rl_mode=rl_mode,
|
|
|
|
|
image_assessment_mode=image_assessment_mode,
|
|
|
|
|
style_transfer_mode=style_transfer_mode)
|
|
|
|
|
|
2018-11-09 11:19:31 +00:00
|
|
|
timings = {
|
2018-11-18 12:48:39 +00:00
|
|
|
'from_nparray_time': from_nparray_time,
|
2018-11-09 11:19:31 +00:00
|
|
|
'keyframes_extraction_time': keyframes_extraction_time,
|
|
|
|
|
'stylization_time': stylization_time,
|
|
|
|
|
'layout_generation_time': layout_generation_time,
|
2018-11-10 21:45:55 +00:00
|
|
|
'keyframes_extraction_time_details': keyframes_timings
|
2018-11-09 11:19:31 +00:00
|
|
|
}
|
2018-11-10 21:45:55 +00:00
|
|
|
|
2018-11-18 12:48:39 +00:00
|
|
|
return comic, timings
|
2018-10-01 20:34:57 +00:00
|
|
|
|
2018-07-31 19:51:39 +00:00
|
|
|
|
|
|
|
|
class Comic(models.Model):
|
2018-08-20 23:00:22 +00:00
|
|
|
file = models.FileField(blank=False, null=False, upload_to="comic")
|
|
|
|
|
video = models.ForeignKey(Video, on_delete=models.CASCADE, related_name="comic")
|
2018-11-18 12:48:39 +00:00
|
|
|
yt_url = models.URLField(blank=True, null=True)
|
|
|
|
|
frames_mode = models.PositiveIntegerField(default=0)
|
|
|
|
|
rl_mode = models.PositiveIntegerField(default=0)
|
|
|
|
|
image_assessment_mode = models.PositiveIntegerField(default=0)
|
|
|
|
|
style_transfer_mode = models.PositiveIntegerField(default=0)
|
|
|
|
|
timestamp = models.DateTimeField(auto_now_add=True)
|
2018-07-31 19:51:39 +00:00
|
|
|
|
|
|
|
|
@classmethod
|
2018-11-02 12:01:37 +00:00
|
|
|
@profile
|
2018-11-18 12:48:39 +00:00
|
|
|
def create_from_nparray(cls, nparray, video, yt_url, frames_mode,
|
|
|
|
|
rl_mode, image_assessment_mode, style_transfer_mode):
|
2018-10-01 20:34:57 +00:00
|
|
|
tmp_name = uuid.uuid4().hex + ".png"
|
2018-11-18 12:48:39 +00:00
|
|
|
cv2.imwrite(jj(settings.TMP_DIR, tmp_name), nparray)
|
2018-10-01 20:34:57 +00:00
|
|
|
with open(jj(settings.TMP_DIR, tmp_name), mode="rb") as tmp_file:
|
|
|
|
|
comic_image = File(tmp_file, name=tmp_name)
|
2018-11-18 12:48:39 +00:00
|
|
|
comic = Comic.objects.create(file=comic_image,
|
|
|
|
|
video=video,
|
|
|
|
|
yt_url=yt_url,
|
|
|
|
|
frames_mode=frames_mode,
|
|
|
|
|
rl_mode=rl_mode,
|
|
|
|
|
image_assessment_mode=image_assessment_mode,
|
|
|
|
|
style_transfer_mode=style_transfer_mode)
|
2018-10-01 20:34:57 +00:00
|
|
|
os.remove(jj(settings.TMP_DIR, tmp_name))
|
2018-07-31 19:51:39 +00:00
|
|
|
return comic
|