download.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import os
  2. from os.path import join, exists
  3. import requests
  4. import mutagen.mp3
  5. import logging
  6. import unicodedata
  7. log = logging.getLogger(__name__)
  8. def safefname(s):
  9. asciified = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('ascii')
  10. return asciified.replace('/', '_').replace(' ', '_')
  11. def download_track(track, args):
  12. log.debug('Downloading "%s"', track['title'])
  13. if 'album' in track:
  14. fdir = join(safefname(track['artist']), safefname(track['album']))
  15. else:
  16. fdir = join(safefname(track['artist']))
  17. fname = safefname(track['title'] + '.mp3')
  18. fpath = join(args.download_base, fdir, fname)
  19. os.makedirs(join(args.download_base, fdir), exist_ok=True)
  20. if exists(fpath):
  21. log.info('file %s exists, skipping' % fpath)
  22. return
  23. log.debug('download in ' + fpath)
  24. resp = requests.get(track['url'],
  25. headers={'user-agent': 'curl/7.52.1'},
  26. stream=True)
  27. if not resp.ok:
  28. log.error('Error downloading track ', track['title'])
  29. return
  30. with open(fpath, 'wb') as buf:
  31. log.debug('writing ' + fname)
  32. for block in resp.iter_content():
  33. buf.write(block)
  34. audio = mutagen.mp3.EasyMP3(fpath) # TODO: is it always mp3?
  35. audio['title'] = track['title']
  36. audio['artist'] = track['artist']
  37. if 'album' in track:
  38. audio['album'] = track['album']
  39. audio.save()
  40. log.info('track %(title)s downloaded' % track)