|
|
import shutil
|
|
|
import os
|
|
|
import yt_dlp
|
|
|
from .yt_dlp_logger import YtDlpLogger, yt_dlp_log_hook
|
|
|
|
|
|
MEDIA_FOLDER = '/var/www/html/storage/app/music'
|
|
|
|
|
|
|
|
|
def download_album(album, artist):
|
|
|
"""
|
|
|
Take an artist and album dict and use yt-dlp to download the album to the local filestore.
|
|
|
:param album: Dict of album data
|
|
|
:return: dict of save data
|
|
|
"""
|
|
|
response = {
|
|
|
'artist': {},
|
|
|
'album': {},
|
|
|
}
|
|
|
artist_path = MEDIA_FOLDER + '/%s' % artist.get('name')
|
|
|
if not os.path.exists(artist_path):
|
|
|
# Make artist folder and copy the artist image, add
|
|
|
os.mkdir(artist_path)
|
|
|
shutil.copy2(artist.get('image'), artist_path + '/artist.jpg')
|
|
|
response['artist'] = {'url_local': artist_path}
|
|
|
|
|
|
# Create album folder
|
|
|
album_title = album.get('name')
|
|
|
album_path = artist_path + '/%s' % album_title
|
|
|
if not os.path.exists(album_path):
|
|
|
os.mkdir(album_path)
|
|
|
shutil.copy2(album.get('image'), album_path + '/album.jpg')
|
|
|
|
|
|
# Download album
|
|
|
ydl_opts = {
|
|
|
'logger': YtDlpLogger(),
|
|
|
'progress_hooks': [yt_dlp_log_hook],
|
|
|
'format': 'mp3/bestaudio/best',
|
|
|
'outtmpl': album_path + '/%(title)s.%(ext)s',
|
|
|
# ℹ️ See help(yt_dlp.postprocessor) for a list of available Postprocessors and their arguments
|
|
|
'postprocessors': [{ # Extract audio using ffmpeg
|
|
|
'key': 'FFmpegExtractAudio',
|
|
|
'preferredcodec': 'mp3',
|
|
|
}]
|
|
|
}
|
|
|
download_url = 'https://music.youtube.com/' + album.get('url_remote')
|
|
|
|
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
|
try:
|
|
|
ydl.download(download_url)
|
|
|
except Exception as e:
|
|
|
print('yt-dlp download failed: =========')
|
|
|
print(e)
|
|
|
response['album'] = {'url_local': album_path}
|
|
|
return response
|