Разрешить загрузку частичных видеофайлов из Django - PullRequest
0 голосов
/ 18 января 2019

У меня есть приложение Django, которое позволяет пользователям создавать / сохранять «клипы» видеофайлов, то есть сохранять временные метки времени начала и окончания видеофайлов для сохранения в плейлистах. Мне бы хотелось, чтобы пользователи могли загружать сохраненные клипы (и плейлисты).

Я провел немало исследований по этой теме и заставил ffmpeg работать из моего терминала для сохранения частичных клипов (хотя я изо всех сил пытался выяснить имена путей для использования subprocess.call с ffmpeg), и я также получил Movie работает через терминал, чтобы сохранить частичные клипы.

Я изо всех сил пытаюсь выяснить, как включить это в мое приложение Django, чтобы пользователи могли щелкнуть ссылку и впоследствии начать загрузку определенного клипа (или списка воспроизведения). Я верю, что захочу использовать сельдерей, чтобы не связывать сервер, но я даже не до такой степени, что могу разгрузить задачу, так как не могу понять, как:

  1. «Обрежьте» оригинальный, более длинный видеофайл, чтобы сделать его короче (нужно ли сначала делать локальную копию нового файла?).
  2. Отправить ответ в виде загрузки пользователю.

Вот мои модели.py:

class Match(models.Model):
    game_id = models.IntegerField(primary_key=True,
        validators=[MinValueValidator(1)],db_column="game_id")
    wide = models.FileField(upload_to='games/2018/',blank=True,null=True)

class Playlist(models.Model):
        name = models.CharField(default='',null=True,blank=True,max_length=200)
        created_by = models.ForeignKey(User,related_name="playlists",on_delete=models.CASCADE)
        created =   models.DateTimeField(editable=False)
        modified =  models.DateTimeField()


        def save(self, *args, **kwargs):
            ''' On save, update timestamps '''
            if not self.id:
                entries = Playlist.objects.order_by('-id')
                try:
                    self.id = entries[0].id + 1
                except IndexError:
                    # we don't have any PlaylistEntries yet, so we just start @ 0
                    self.id = 0
                self.created = timezone.now()
            self.modified = timezone.now()

            return super(Playlist, self).save(*args, **kwargs)


    class Clip(models.Model):
        name =  models.CharField(default='',null=True,blank=True,max_length=200)
        game_id = models.ForeignKey(Match,related_name="clips",on_delete=models.CASCADE,
            db_column="game_id",null=True,blank=True)
        clipstart = models.IntegerField(null=True,blank=True)
        clipend = models.IntegerField(null=True,blank=True)
        playlist = models.ForeignKey(Playlist,related_name="clips",on_delete=models.CASCADE,
            db_column="playlist",null=True,blank=True)
        created_by = models.ForeignKey(User,related_name="clips",on_delete=models.CASCADE)
        created =   models.DateTimeField(editable=False)
        modified =  models.DateTimeField()
        duration = models.IntegerField(null=True,blank=True)

        def save(self, *args, **kwargs):
            ''' On save, update timestamps '''
            if not self.id:
                entries = Clip.objects.order_by('-id')
                try:
                    self.id = entries[0].id + 1
                except IndexError:
                    # we don't have any PlaylistEntries yet, so we just start @ 0
                    self.id = 0
                self.created = timezone.now()
            self.modified = timezone.now()
            self.duration = int(self.clipend) - int(self.clipstart)
            return super(Clip, self).save(*args, **kwargs)

И views.py, где я борюсь (я не уверен, правильно ли я работаю с FileField и т. Д.):

from moviepy.editor import *
def ClipDownload(request,pk,*args,**kwargs):

    this_clip = models.Clip.objects.filter(pk=pk)
    file_name = this_clip[0].game_id.wide

    p = VideoFileClip(file_name,audio=False).subclip(this_clip.clipstart,this_clip.clipend)

    response = HttpResponse(p, content_type='application/force-download')
    response['Content-Disposition'] = 'attachment; filename=%s' % this_clip.name
    response['Content-Length'] = os.path.getsize(file_name)
    return response

Текущий код не работает, я получаю правильный клип, но я не могу сделать вложенный клип из FileField, так как получаю ошибку атрибута:

AttributeError: 'FieldFile' object has no attribute 'endswith'

Буду очень признателен, если кто-нибудь укажет мне правильное направление для загрузки файла, чтобы я мог перейти к попытке включить его в сельдерей?

...