fix
[audio.git] / src / youtube / utils.py
index 42ebc91..87fcf1a 100644 (file)
@@ -1,3 +1,4 @@
+import hashlib
 import os
 import shutil
 import subprocess
@@ -23,12 +24,24 @@ def link_or_copy(src, dst):
 
 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)
@@ -52,14 +65,17 @@ def video_from_image(img_path, duration, fps=25, cache=True):
 
 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()
@@ -101,6 +117,7 @@ def mux(channels, output_path=None):
     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)