123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- import os
- from os.path import join, exists
- import requests
- import mutagen.mp3
- from mutagen.id3 import ID3, USLT, TDOR
- import logging
- import unicodedata
- log = logging.getLogger(__name__)
- def safefname(s):
- asciified = unicodedata.normalize('NFKD', s)
- asciified = asciified.encode('ascii', 'ignore').decode('ascii')
- return asciified.replace('/', '_').replace(' ', '_')
- def download_track(track, args):
- log.debug('Downloading "%s"', track['title'])
- if 'album' in track:
- fdir = join(safefname(track['artist'])[:240],
- safefname(track['album'])[:240])
- else:
- fdir = join(safefname(track['artist'])[:240])
- fname = safefname(track['title'])[:240] + '.mp3'
- fpath = join(args.download_base, fdir, fname)
- os.makedirs(join(args.download_base, fdir), exist_ok=True)
- if exists(fpath):
- log.info('file %s exists, skipping' % fpath)
- return
- log.debug('download in ' + fpath)
- resp = requests.get(track['url'],
- headers={'user-agent': 'curl/7.52.1'},
- stream=True)
- if not resp.ok:
- log.error('Error downloading track %s (%s): %d %s',
- track['title'], track['url'],
- resp.status_code, resp.reason)
- return
- with open(fpath, 'wb') as buf:
- log.debug('writing ' + fname)
- for block in resp.iter_content():
- buf.write(block)
- audio = mutagen.mp3.EasyMP3(fpath) # TODO: is it always mp3?
- audio['title'] = track['title']
- audio['artist'] = track['artist']
- if 'album' in track:
- audio['album'] = track['album']
- audio.save()
- if 'lyrics' in track:
- tags = ID3(fpath)
- tags['USLT'] = USLT(text=track['lyrics'])
- tags.save()
- if 'datePublished' in track:
- tags = ID3(fpath)
- tags['TDOR'] = TDOR(text=track['datePublished'])
- tags.save()
- log.info('track %(title)s downloaded' % track)
|