6 from django.conf import settings
7 from django.core.files.storage import default_storage
8 from django.core.management.base import BaseCommand
11 class Command(BaseCommand):
12 def handle(self, verbosity, **kwargs):
13 self.verbosity = verbosity
14 self.ytdl_path = default_storage.path('ytdl')
15 if not os.path.exists(self.ytdl_path):
16 os.mkdir(self.ytdl_path)
19 for filename in glob.glob(os.path.join(self.ytdl_path, '*.json')):
20 with open(filename) as fd:
23 if data.get('_status') == 'finished' or data.get('_error'):
26 self.ytdl(filename, data)
32 def ytdl(self, filename, data):
38 data['_percent_str'] = d.get('_percent_str')
39 data['_status'] = d.get('status')
40 with open(filename, 'w') as fd:
41 json.dump(data, fp=fd, indent=2)
46 'format': 'bestaudio',
47 'outtmpl': os.path.join(self.ytdl_path, '%(id)s.%(ext)s'),
51 'key': 'FFmpegExtractAudio',
52 'preferredcodec': 'opus',
55 'progress_hooks': [progress_hook],
57 with yt_dlp.YoutubeDL(ydl_opts) as ydl:
60 if data.get('_status') == 'finished':
61 base_filename = os.path.splitext(filename)[0]
64 for x in glob.glob(base_filename + '*')
65 if not x.endswith('.part') and not x.endswith('.json')
67 url = os.path.join(settings.MEDIA_URL, 'ytdl', real_filename[len(self.ytdl_path) + 1 :])
68 data['_audio_url'] = url
69 with open(filename, 'w') as fd:
70 json.dump(data, fp=fd, indent=2)
72 data['_error'] = 'XXX'
73 with open(filename, 'w') as fd:
74 json.dump(data, fp=fd, indent=2)