From 8facb9e5e7baeaf077f07f7668f8924097a22c58 Mon Sep 17 00:00:00 2001 From: j Date: Sun, 19 Nov 2023 00:05:30 +0100 Subject: [PATCH] import video only content too --- utils.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/utils.py b/utils.py index 12dfc68..02fe4fd 100644 --- a/utils.py +++ b/utils.py @@ -1,7 +1,8 @@ +import json import os -import subprocess import ox import shutil +import subprocess import tempfile from archive.models import File, Stream, User @@ -20,6 +21,17 @@ def import_items(items): load_vimeo(i) print(i) + +def load_formats(url): + cmd = ['yt-dlp', '-q', url, '-j', '-F'] + p = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, close_fds=True) + stdout, stderr = p.communicate() + formats = stdout.decode().strip().split('\n')[-1] + return json.loads(formats) + + def load_vimeo(item): urls = [url for url in item.data.get("links", []) if "vimeo.com" in url] cdir = os.path.abspath(os.curdir) @@ -33,8 +45,10 @@ def load_vimeo(item): if isinstance(tmp, bytes): tmp = tmp.decode('utf-8') os.chdir(tmp) - cmd = ['yt-dlp', '-q', url] - cmd += ['-o', '%(title)80s.%(ext)s'] + cmd = [ + 'yt-dlp', '-q', url, + '-o', '%(title)80s.%(ext)s' + ] cmd += [ '-f', 'bestvideo[height<=%s][ext=mp4]+bestaudio[ext=m4a]' % resolution, '--merge-output-format', 'mp4' @@ -43,6 +57,35 @@ def load_vimeo(item): stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) stdout, stderr = p.communicate() + if stderr and b'Requested format is not available.' in stderr: + formats = load_formats(url) + has_audio = bool([fmt for fmt in formats['formats'] if fmt['resolution'] == 'audio only']) + has_video = bool([fmt for fmt in formats['formats'] if 'x' in fmt['resolution']]) + + cmd = [ + 'yt-dlp', '-q', url, + '-o', '%(title)80s.%(ext)s' + ] + if has_video and not has_audio: + cmd += [ + '-f', 'bestvideo[height<=%s][ext=mp4]' % resolution, + ] + elif not has_video and has_audio: + cmd += [ + 'bestaudio[ext=m4a]' + ] + else: + cmd = [] + if cmd: + p = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, close_fds=True) + stdout, stderr = p.communicate() + + if stdout or stderr: + print(" ".join(cmd)) + print(stdout) + print(stderr) parts = list(os.listdir(tmp)) if parts: part = 1 @@ -67,7 +110,7 @@ def load_vimeo(item): f.save() f.item.save() else: - return 'file exists' + return 'file exists %s' % oshash stream, created = Stream.objects.get_or_create(file=orig, resolution=resolution, format="mp4") stream.media.name = stream.path(stream.name()) ox.makedirs(os.path.dirname(stream.media.path))