download.py 1.9 KB

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