+import hashlib
import os
import shutil
import subprocess
def process_to_file(cmdline, prefix='', suffix='', cache_key=None, output_path=None):
if not output_path:
- tmp = NamedTemporaryFile(prefix=prefix, suffix=suffix, delete=False)
+ tmp = NamedTemporaryFile(
+ prefix=prefix, suffix=suffix, delete=False,
+ dir=settings.FILE_UPLOAD_TEMP_DIR
+ )
tmp.close()
output_path = tmp.name
if cache_key:
- cache_path = FILE_CACHE + cache_key.replace('/', '__')
+ cache_path = cache_key.replace('/', '__')
+ if len(cache_path) > 200:
+ parts = cache_path.rsplit('.', 1)
+ limit = 200 - 9
+ if len(parts) > 1:
+ limit -= len(parts[1]) + 1
+ cache_path = parts[0][:limit] + '.' + hashlib.sha1(cache_key.encode('utf-8')).hexdigest()[:8]
+ if len(parts) > 1:
+ cache_path += '.' + parts[1]
+ cache_path = FILE_CACHE + cache_path
if cache_key and os.path.exists(cache_path):
link_or_copy(cache_path, output_path)
def cut_video(video_path, duration):
return process_to_file(
- ['ffmpeg', '-y', '-i', video_path, '-t', str(duration)],
+ ['ffmpeg', '-y', '-i', video_path, '-t', str(duration), '-c', 'copy'],
'cut-',
'.mkv'
)
def ffmpeg_concat(paths, suffix, copy=False):
- filelist = NamedTemporaryFile(prefix='concat-', suffix='.txt')
+ filelist = NamedTemporaryFile(
+ prefix='concat-', suffix='.txt',
+ dir=settings.FILE_UPLOAD_TEMP_DIR
+ )
for path in paths:
filelist.write(f"file '{path}'\n".encode('utf-8'))
filelist.flush()
args = ['ffmpeg', '-y']
for c in channels:
args.extend(['-i', c])
+ args.extend(['-c', 'copy'])
return process_to_file(args, 'mux-', '.mkv', output_path=output_path)