mirror of
https://github.com/KevinMidboe/spotify-downloader.git
synced 2025-10-29 18:00:15 +00:00
Switch to class for embedding metadata
This commit is contained in:
@@ -1,102 +0,0 @@
|
|||||||
import urllib2
|
|
||||||
from mutagen.easyid3 import EasyID3
|
|
||||||
from mutagen.id3 import ID3, APIC
|
|
||||||
from mutagen.mp4 import MP4, MP4Cover
|
|
||||||
|
|
||||||
def compare_metadata(file, metadata):
|
|
||||||
try:
|
|
||||||
if file.endswith('.mp3'):
|
|
||||||
audiofile = EasyID3('Music/' + file)
|
|
||||||
already_tagged = audiofile['title'][0] == metadata['name']
|
|
||||||
elif file.endswith('.m4a'):
|
|
||||||
tag = {'title': '\xa9nam'}
|
|
||||||
audiofile = MP4('Music/' + file)
|
|
||||||
already_tagged = audiofile[tags['title']] == metadata['name']
|
|
||||||
except KeyError:
|
|
||||||
already_tagged = False
|
|
||||||
return already_tagged
|
|
||||||
|
|
||||||
def embed_metadata(music_file, meta_tags, output_ext):
|
|
||||||
if meta_tags is None:
|
|
||||||
print('Could not find meta-tags')
|
|
||||||
elif output_ext == '.m4a':
|
|
||||||
print('Fixing meta-tags')
|
|
||||||
metadata_m4a(music_file, meta_tags, output_ext)
|
|
||||||
elif output_ext == '.mp3':
|
|
||||||
print('Fixing meta-tags')
|
|
||||||
metadata_mp3(music_file, meta_tags, output_ext)
|
|
||||||
else:
|
|
||||||
print('Cannot embed meta-tags into given output extension')
|
|
||||||
|
|
||||||
def metadata_mp3(music_file, meta_tags, output_ext):
|
|
||||||
artists = []
|
|
||||||
for artist in meta_tags['artists']:
|
|
||||||
artists.append(artist['name'])
|
|
||||||
audiofile = EasyID3('Music/' + music_file + output_ext)
|
|
||||||
audiofile['artist'] = artists
|
|
||||||
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['copyright'] = meta_tags['copyright']
|
|
||||||
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['encodedby'] = meta_tags['publisher']
|
|
||||||
audiofile['isrc'] = meta_tags['external_ids']['isrc']
|
|
||||||
audiofile['website'] = meta_tags['external_urls']['spotify']
|
|
||||||
audiofile['length'] = str(meta_tags['duration_ms'] / 1000)
|
|
||||||
if meta_tags['genre']:
|
|
||||||
audiofile['genre'] = meta_tags['genre']
|
|
||||||
audiofile.save(v2_version=3)
|
|
||||||
audiofile = ID3('Music/' + music_file + output_ext)
|
|
||||||
albumart = urllib2.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()
|
|
||||||
audiofile.save(v2_version=3)
|
|
||||||
|
|
||||||
def metadata_m4a(music_file, meta_tags, output_ext):
|
|
||||||
# eyed serves only mp3 not aac so using mutagen
|
|
||||||
# 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',
|
|
||||||
'originaldate': 'purd',
|
|
||||||
'comment': '\xa9cmt',
|
|
||||||
'group': '\xa9grp',
|
|
||||||
'writer': '\xa9wrt',
|
|
||||||
'genre': '\xa9gen',
|
|
||||||
'tracknumber': 'trkn',
|
|
||||||
'albumartist': 'aART',
|
|
||||||
'disknumber': 'disk',
|
|
||||||
'cpil': 'cpil',
|
|
||||||
'albumart': 'covr',
|
|
||||||
'copyright': 'cprt',
|
|
||||||
'tempo': 'tmpo'}
|
|
||||||
|
|
||||||
artists = []
|
|
||||||
for artist in meta_tags['artists']:
|
|
||||||
artists.append(artist['name'])
|
|
||||||
audiofile = MP4('Music/' + music_file + output_ext)
|
|
||||||
audiofile[tags['artist']] = artists
|
|
||||||
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['originaldate']] = meta_tags['release_date']
|
|
||||||
audiofile[tags['copyright']] = meta_tags['copyright']
|
|
||||||
if meta_tags['genre']:
|
|
||||||
audiofile[tags['genre']] = meta_tags['genre']
|
|
||||||
albumart = urllib2.urlopen(meta_tags['album']['images'][0]['url'])
|
|
||||||
audiofile[tags['albumart']] = [ MP4Cover(albumart.read(), imageformat=MP4Cover.FORMAT_JPEG) ]
|
|
||||||
albumart.close()
|
|
||||||
audiofile.save()
|
|
||||||
106
core/metadata.py
Normal file
106
core/metadata.py
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
import urllib2
|
||||||
|
from mutagen.easyid3 import EasyID3
|
||||||
|
from mutagen.id3 import ID3, APIC
|
||||||
|
from mutagen.mp4 import MP4, MP4Cover
|
||||||
|
|
||||||
|
|
||||||
|
def compare_metadata(file, metadata):
|
||||||
|
try:
|
||||||
|
if file.endswith('.mp3'):
|
||||||
|
audiofile = EasyID3('Music/' + file)
|
||||||
|
already_tagged = audiofile['title'][0] == metadata['name']
|
||||||
|
elif file.endswith('.m4a'):
|
||||||
|
tag = {'title': '\xa9nam'}
|
||||||
|
audiofile = MP4('Music/' + file)
|
||||||
|
already_tagged = audiofile[tags['title']] == metadata['name']
|
||||||
|
except KeyError:
|
||||||
|
already_tagged = False
|
||||||
|
return already_tagged
|
||||||
|
|
||||||
|
class embed_metadata(object):
|
||||||
|
|
||||||
|
def __init__(self, music_file, meta_tags, output_ext):
|
||||||
|
|
||||||
|
if meta_tags is None:
|
||||||
|
print('Could not find meta-tags')
|
||||||
|
elif output_ext == '.m4a':
|
||||||
|
print('Fixing meta-tags')
|
||||||
|
self.metadata_m4a(music_file, meta_tags, output_ext)
|
||||||
|
elif output_ext == '.mp3':
|
||||||
|
print('Fixing meta-tags')
|
||||||
|
self.metadata_mp3(music_file, meta_tags, output_ext)
|
||||||
|
else:
|
||||||
|
print('Cannot embed meta-tags into given output extension')
|
||||||
|
|
||||||
|
def metadata_mp3(self, music_file, meta_tags, output_ext):
|
||||||
|
artists = []
|
||||||
|
for artist in meta_tags['artists']:
|
||||||
|
artists.append(artist['name'])
|
||||||
|
audiofile = EasyID3('Music/' + music_file + output_ext)
|
||||||
|
audiofile['artist'] = artists
|
||||||
|
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['copyright'] = meta_tags['copyright']
|
||||||
|
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['encodedby'] = meta_tags['publisher']
|
||||||
|
audiofile['isrc'] = meta_tags['external_ids']['isrc']
|
||||||
|
audiofile['website'] = meta_tags['external_urls']['spotify']
|
||||||
|
audiofile['length'] = str(meta_tags['duration_ms'] / 1000)
|
||||||
|
if meta_tags['genre']:
|
||||||
|
audiofile['genre'] = meta_tags['genre']
|
||||||
|
audiofile.save(v2_version=3)
|
||||||
|
audiofile = ID3('Music/' + music_file + output_ext)
|
||||||
|
albumart = urllib2.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()
|
||||||
|
audiofile.save(v2_version=3)
|
||||||
|
|
||||||
|
def metadata_m4a(self, music_file, meta_tags, output_ext):
|
||||||
|
# eyed serves only mp3 not aac so using mutagen
|
||||||
|
# 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',
|
||||||
|
'originaldate': 'purd',
|
||||||
|
'comment': '\xa9cmt',
|
||||||
|
'group': '\xa9grp',
|
||||||
|
'writer': '\xa9wrt',
|
||||||
|
'genre': '\xa9gen',
|
||||||
|
'tracknumber': 'trkn',
|
||||||
|
'albumartist': 'aART',
|
||||||
|
'disknumber': 'disk',
|
||||||
|
'cpil': 'cpil',
|
||||||
|
'albumart': 'covr',
|
||||||
|
'copyright': 'cprt',
|
||||||
|
'tempo': 'tmpo'}
|
||||||
|
|
||||||
|
artists = []
|
||||||
|
for artist in meta_tags['artists']:
|
||||||
|
artists.append(artist['name'])
|
||||||
|
audiofile = MP4('Music/' + music_file + output_ext)
|
||||||
|
audiofile[tags['artist']] = artists
|
||||||
|
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['originaldate']] = meta_tags['release_date']
|
||||||
|
audiofile[tags['copyright']] = meta_tags['copyright']
|
||||||
|
if meta_tags['genre']:
|
||||||
|
audiofile[tags['genre']] = meta_tags['genre']
|
||||||
|
albumart = urllib2.urlopen(meta_tags['album']['images'][0]['url'])
|
||||||
|
audiofile[tags['albumart']] = [ MP4Cover(albumart.read(), imageformat=MP4Cover.FORMAT_JPEG) ]
|
||||||
|
albumart.close()
|
||||||
|
audiofile.save()
|
||||||
17
spotdl.py
17
spotdl.py
@@ -1,10 +1,9 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*- coding: UTF-8 -*-
|
# -*- coding: UTF-8 -*-
|
||||||
|
|
||||||
from core.embed_metadata import compare_metadata
|
#from core.metadata import embed_metadata
|
||||||
from core.embed_metadata import embed_metadata
|
#from core.metadata import compare_metadata
|
||||||
from core.embed_metadata import metadata_mp3
|
from core import metadata
|
||||||
from core.embed_metadata import metadata_m4a
|
|
||||||
from core.misc import input_link
|
from core.misc import input_link
|
||||||
from core.misc import trim_song
|
from core.misc import trim_song
|
||||||
from core.misc import get_arguments
|
from core.misc import get_arguments
|
||||||
@@ -235,15 +234,17 @@ def check_exists(music_file, raw_song, islist):
|
|||||||
|
|
||||||
if file.startswith(generate_filename(music_file)):
|
if file.startswith(generate_filename(music_file)):
|
||||||
|
|
||||||
already_tagged = compare_metadata(file, generate_metadata(raw_song))
|
already_tagged = metadata.compare_metadata(file, generate_metadata(raw_song))
|
||||||
|
|
||||||
if is_spotify(raw_song) and not already_tagged:
|
if is_spotify(raw_song) and not already_tagged:
|
||||||
os.remove("Music/" + file)
|
os.remove("Music/" + file)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if islist:
|
if islist:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
prompt = raw_input('Song with same name has already been downloaded. Re-download? (y/n): ').lower()
|
prompt = raw_input('Song with same name has already been downloaded. Re-download? (y/n): ').lower()
|
||||||
|
|
||||||
if prompt == "y":
|
if prompt == "y":
|
||||||
os.remove("Music/" + file)
|
os.remove("Music/" + file)
|
||||||
return False
|
return False
|
||||||
@@ -251,8 +252,8 @@ def check_exists(music_file, raw_song, islist):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def grab_list(file):
|
def grab_list(file):
|
||||||
lines = open(file, 'r').read()
|
with open(file, 'r') as listed:
|
||||||
lines = lines.splitlines()
|
lines = (listed.read()).splitlines()
|
||||||
# Ignore blank lines in file (if any)
|
# Ignore blank lines in file (if any)
|
||||||
try:
|
try:
|
||||||
lines.remove('')
|
lines.remove('')
|
||||||
@@ -301,7 +302,7 @@ def grab_single(raw_song, number=None):
|
|||||||
convert_song(music_file)
|
convert_song(music_file)
|
||||||
meta_tags = generate_metadata(raw_song)
|
meta_tags = generate_metadata(raw_song)
|
||||||
if not args.no_metadata:
|
if not args.no_metadata:
|
||||||
embed_metadata(music_file, meta_tags, args.output_ext)
|
metadata.embed_metadata(music_file, meta_tags, args.output_ext)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user