1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- from os.path import join
- import argparse
- from urllib.parse import urlparse
- import logging
- import json
- import multiprocessing
- import functools
- from splinter import Browser
- from .download import download_track
- from .visit import visit_track, visit_album, visit_artist
- log = logging.getLogger(__name__)
- def get_parser():
- p = argparse.ArgumentParser(
- description='Download tracks from bandcamp, sharing is caring!',
- formatter_class=argparse.ArgumentDefaultsHelpFormatter)
- p.add_argument('url')
- p.add_argument('--loglevel', default='INFO', help='Log level',
- choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'])
- info = p.add_argument_group('fetch track info')
- info.add_argument('--driver', default='firefox',
- help='Internal splinter option',
- choices=['firefox', 'chrome'])
- info.add_argument('--mode', default=None,
- choices=['album', 'track', 'artist'])
- do = p.add_argument_group('what to do with fetched urls')
- do.add_argument('--do', default='print',
- help='What to do with retrieved informations',
- choices=['print', 'wgetprint', 'download'])
- do.add_argument('--download-base', default='.',
- help='Only applies to wget')
- do.add_argument('-j', '--jobs', default=3, type=int,
- help='Parallel downloads')
- return p
- def get_mode(url):
- path = urlparse(url).path
- if path.startswith('/track/'):
- return 'track'
- if path.startswith('/album/'):
- return 'album'
- raise ValueError('unsupported url: "{}"'.format(path))
- def main():
- args = get_parser().parse_args()
- logging.basicConfig(level=args.loglevel)
- logging.getLogger('selenium.webdriver').setLevel(logging.WARNING)
- logging.getLogger('requests').setLevel(logging.WARNING)
- if args.mode is None:
- args.mode = get_mode(args.url)
- log.info('Going in %s mode' % args.mode)
- prefs = {
- 'dom.audiochannel.mutedByDefault': True
- }
- with Browser(args.driver, profile_preferences=prefs) as br:
- # get track info
- if args.mode == 'track':
- tracks = visit_track(br, args.url)
- elif args.mode == 'album':
- tracks = visit_album(br, args.url)
- else:
- tracks = visit_artist(br, args.url)
- # do something
- if args.do == 'print':
- for track in tracks:
- print(json.dumps(track))
- elif args.do == 'wgetprint':
- for track in tracks:
- cmd = ['wget', '-nv', "'%s'" % track['url'],
- '-O', "'%s'" %
- join(args.download_base,
- '-'.join((track['artist'], track['album'],
- track['title']))).replace(' ', '_')
- ]
- print(' '.join(cmd))
- elif args.do == 'download':
- pool = multiprocessing.Pool(processes=args.jobs)
- for res in pool.imap_unordered(functools.partial(download_track,
- args=args),
- tracks):
- print('R', res)
- pool.close()
- pool.join()
- else:
- raise NotImplementedError('action ' + args.do)
- if __name__ == '__main__':
- main()
|