12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- import os
- from os.path import join, exists
- import requests
- import mutagen.mp3
- import logging
- import unicodedata
- log = logging.getLogger(__name__)
- def safefname(s):
- asciified = unicodedata.normalize('NFKD', s).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']), safefname(track['album']))
- else:
- fdir = join(safefname(track['artist']))
- fname = safefname(track['title'] + '.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 ', track['title'])
- 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()
- log.info('track %(title)s downloaded' % track)
|