mirror of
https://github.com/KevinMidboe/spotify-downloader.git
synced 2025-10-29 18:00:15 +00:00
* Monkeypatch fetch user and use pytest.tempdir * Cover spotify_tools.grab_album() * Cover avconv conversion * Cover grab_single() * Reduce code repetition * Move grab_playlist() to spotify_tools.py * Move Spotify specific functions to spotify_tools.py * Refactoring * Return track list from write_tracks() * Fix tests * Cover more cases in generate_youtube_url() * Test for unavailable audio streams * Test for filename without spaces * handle.py 100% coverage * Improve config tests * Speed up tests * Install avconv and libfdk-aac * Some cleaning * FFmpeg with libfdk-aac, libopus * Some refactoring * Convert tmpdir to string * Cover YouTube title when downloading from list * Explicitly cover some internals.py functions
153 lines
6.3 KiB
Python
Executable File
153 lines
6.3 KiB
Python
Executable File
from mutagen.easyid3 import EasyID3
|
|
from mutagen.id3 import ID3, TORY, TYER, TPUB, APIC, USLT, COMM
|
|
from mutagen.mp4 import MP4, MP4Cover
|
|
from core.const import log
|
|
|
|
import urllib.request
|
|
|
|
|
|
def compare(music_file, metadata):
|
|
"""Check if the input music file title matches the expected title."""
|
|
already_tagged = False
|
|
try:
|
|
if music_file.endswith('.mp3'):
|
|
audiofile = EasyID3(music_file)
|
|
already_tagged = audiofile['title'][0] == metadata['name']
|
|
elif music_file.endswith('.m4a'):
|
|
audiofile = MP4(music_file)
|
|
already_tagged = audiofile['\xa9nam'][0] == metadata['name']
|
|
except (KeyError, TypeError):
|
|
pass
|
|
|
|
return already_tagged
|
|
|
|
|
|
def embed(music_file, meta_tags):
|
|
""" Embed metadata. """
|
|
embed = EmbedMetadata(music_file, meta_tags)
|
|
if music_file.endswith('.m4a'):
|
|
log.info('Applying metadata')
|
|
return embed.as_m4a()
|
|
elif music_file.endswith('.mp3'):
|
|
log.info('Applying metadata')
|
|
return embed.as_mp3()
|
|
else:
|
|
log.warning('Cannot embed metadata into given output extension')
|
|
return False
|
|
|
|
|
|
class EmbedMetadata:
|
|
def __init__(self, music_file, meta_tags):
|
|
self.music_file = music_file
|
|
self.meta_tags = meta_tags
|
|
|
|
def as_mp3(self):
|
|
""" Embed metadata to MP3 files. """
|
|
music_file = self.music_file
|
|
meta_tags = self.meta_tags
|
|
# EasyID3 is fun to use ;)
|
|
# For supported easyid3 tags:
|
|
# https://github.com/quodlibet/mutagen/blob/master/mutagen/easyid3.py
|
|
# Check out somewhere at end of above linked file
|
|
audiofile = EasyID3(music_file)
|
|
audiofile['artist'] = meta_tags['artists'][0]['name']
|
|
audiofile['albumartist'] = meta_tags['artists'][0]['name']
|
|
audiofile['album'] = meta_tags['album']['name']
|
|
audiofile['title'] = meta_tags['name']
|
|
audiofile['tracknumber'] = [meta_tags['track_number'],
|
|
meta_tags['total_tracks']]
|
|
audiofile['discnumber'] = [meta_tags['disc_number'], 0]
|
|
audiofile['date'] = meta_tags['release_date']
|
|
audiofile['originaldate'] = meta_tags['release_date']
|
|
audiofile['media'] = meta_tags['type']
|
|
audiofile['author'] = meta_tags['artists'][0]['name']
|
|
audiofile['lyricist'] = meta_tags['artists'][0]['name']
|
|
audiofile['arranger'] = meta_tags['artists'][0]['name']
|
|
audiofile['performer'] = meta_tags['artists'][0]['name']
|
|
audiofile['website'] = meta_tags['external_urls']['spotify']
|
|
audiofile['length'] = str(meta_tags['duration'])
|
|
if meta_tags['publisher']:
|
|
audiofile['encodedby'] = meta_tags['publisher']
|
|
if meta_tags['genre']:
|
|
audiofile['genre'] = meta_tags['genre']
|
|
if meta_tags['copyright']:
|
|
audiofile['copyright'] = meta_tags['copyright']
|
|
if meta_tags['external_ids']['isrc']:
|
|
audiofile['isrc'] = meta_tags['external_ids']['isrc']
|
|
audiofile.save(v2_version=3)
|
|
|
|
# For supported id3 tags:
|
|
# https://github.com/quodlibet/mutagen/blob/master/mutagen/id3/_frames.py
|
|
# Each class represents an id3 tag
|
|
audiofile = ID3(music_file)
|
|
audiofile['TORY'] = TORY(encoding=3, text=meta_tags['year'])
|
|
audiofile['TYER'] = TYER(encoding=3, text=meta_tags['year'])
|
|
audiofile['TPUB'] = TPUB(encoding=3, text=meta_tags['publisher'])
|
|
audiofile['COMM'] = COMM(encoding=3, text=meta_tags['external_urls']['spotify'])
|
|
if meta_tags['lyrics']:
|
|
audiofile['USLT'] = USLT(encoding=3, desc=u'Lyrics', text=meta_tags['lyrics'])
|
|
try:
|
|
albumart = urllib.request.urlopen(meta_tags['album']['images'][0]['url'])
|
|
audiofile['APIC'] = APIC(encoding=3, mime='image/jpeg', type=3,
|
|
desc=u'Cover', data=albumart.read())
|
|
albumart.close()
|
|
except IndexError:
|
|
pass
|
|
|
|
audiofile.save(v2_version=3)
|
|
return True
|
|
|
|
def as_m4a(self):
|
|
""" Embed metadata to M4A files. """
|
|
music_file = self.music_file
|
|
meta_tags = self.meta_tags
|
|
# Apple has specific tags - see mutagen docs -
|
|
# http://mutagen.readthedocs.io/en/latest/api/mp4.html
|
|
tags = { 'album' : '\xa9alb',
|
|
'artist' : '\xa9ART',
|
|
'date' : '\xa9day',
|
|
'title' : '\xa9nam',
|
|
'year' : '\xa9day',
|
|
'originaldate' : 'purd',
|
|
'comment' : '\xa9cmt',
|
|
'group' : '\xa9grp',
|
|
'writer' : '\xa9wrt',
|
|
'genre' : '\xa9gen',
|
|
'tracknumber' : 'trkn',
|
|
'albumartist' : 'aART',
|
|
'disknumber' : 'disk',
|
|
'cpil' : 'cpil',
|
|
'albumart' : 'covr',
|
|
'copyright' : 'cprt',
|
|
'tempo' : 'tmpo',
|
|
'lyrics' : '\xa9lyr' }
|
|
|
|
audiofile = MP4(music_file)
|
|
audiofile[tags['artist']] = meta_tags['artists'][0]['name']
|
|
audiofile[tags['albumartist']] = meta_tags['artists'][0]['name']
|
|
audiofile[tags['album']] = meta_tags['album']['name']
|
|
audiofile[tags['title']] = meta_tags['name']
|
|
audiofile[tags['tracknumber']] = [(meta_tags['track_number'],
|
|
meta_tags['total_tracks'])]
|
|
audiofile[tags['disknumber']] = [(meta_tags['disc_number'], 0)]
|
|
audiofile[tags['date']] = meta_tags['release_date']
|
|
audiofile[tags['year']] = meta_tags['year']
|
|
audiofile[tags['originaldate']] = meta_tags['release_date']
|
|
audiofile[tags['comment']] = meta_tags['external_urls']['spotify']
|
|
if meta_tags['genre']:
|
|
audiofile[tags['genre']] = meta_tags['genre']
|
|
if meta_tags['copyright']:
|
|
audiofile[tags['copyright']] = meta_tags['copyright']
|
|
if meta_tags['lyrics']:
|
|
audiofile[tags['lyrics']] = meta_tags['lyrics']
|
|
try:
|
|
albumart = urllib.request.urlopen(meta_tags['album']['images'][0]['url'])
|
|
audiofile[tags['albumart']] = [MP4Cover(
|
|
albumart.read(), imageformat=MP4Cover.FORMAT_JPEG)]
|
|
albumart.close()
|
|
except IndexError:
|
|
pass
|
|
|
|
audiofile.save()
|
|
return True
|