У меня есть приложение Django, которое позволяет пользователям создавать / сохранять «клипы» видеофайлов, то есть сохранять временные метки времени начала и окончания видеофайлов для сохранения в плейлистах. Мне бы хотелось, чтобы пользователи могли загружать сохраненные клипы (и плейлисты).
Я провел немало исследований по этой теме и заставил ffmpeg работать из моего терминала для сохранения частичных клипов (хотя я изо всех сил пытался выяснить имена путей для использования subprocess.call с ffmpeg), и я также получил Movie работает через терминал, чтобы сохранить частичные клипы.
Я изо всех сил пытаюсь выяснить, как включить это в мое приложение Django, чтобы пользователи могли щелкнуть ссылку и впоследствии начать загрузку определенного клипа (или списка воспроизведения). Я верю, что захочу использовать сельдерей, чтобы не связывать сервер, но я даже не до такой степени, что могу разгрузить задачу, так как не могу понять, как:
- «Обрежьте» оригинальный, более длинный видеофайл, чтобы сделать его короче (нужно ли сначала делать локальную копию нового файла?).
- Отправить ответ в виде загрузки пользователю.
Вот мои модели.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'
Буду очень признателен, если кто-нибудь укажет мне правильное направление для загрузки файла, чтобы я мог перейти к попытке включить его в сельдерей?