+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):
- filelist = NamedTemporaryFile(prefix='concat-', suffix='.txt')
+def ffmpeg_concat(paths, suffix, copy=False):
+ 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()
- outname = process_to_file(
- ['ffmpeg', '-y', '-safe', '0', '-f', 'concat', '-i', filelist.name],
- 'concat-', suffix
- )
+ args = ['ffmpeg', '-y', '-safe', '0', '-f', 'concat', '-i', filelist.name]
+ if copy:
+ args += ['-c', 'copy']
+ outname = process_to_file(args, 'concat-', suffix)
filelist.close()
return outname
def concat_videos(paths):
- return ffmpeg_concat(paths, '.mkv')
+ return ffmpeg_concat(paths, '.mkv', copy=True)
def concat_audio(paths):
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)