bandcamp-dl/bandcamp_dl/__main__.py

134 lines
5.2 KiB
Python
Raw Normal View History

"""bandcamp-dl
Usage:
bandcamp-dl [options] [URL ...]
2017-05-23 10:51:19 -07:00
Arguments:
URL Bandcamp album/track URL
2013-04-29 23:59:57 -07:00
Options:
2017-05-23 10:51:19 -07:00
-h --help Show this screen.
-v --version Show version.
-d --debug Verbose logging.
--artist=<artist> The artist's slug (from the URL, --track or --album is required)
--track=<track> The track's slug (from the URL, for use with --artist)
--album=<album> The album's slug (from the URL, for use with --artist)
2017-05-23 10:51:19 -07:00
--template=<template> Output filename template.
[default: %{artist}/%{album}/%{track} - %{title}]
--base-dir=<dir> Base location of which all files are downloaded.
-f --full-album Download only if all tracks are available.
-o --overwrite Overwrite tracks that already exist. Default is False.
-n --no-art Skip grabbing album art.
2017-05-23 10:51:19 -07:00
-e --embed-lyrics Embed track lyrics (If available)
-g --group Use album/track Label as iTunes grouping.
2017-05-23 10:51:19 -07:00
-r --embed-art Embed album art (If available)
-y --no-slugify Disable slugification of track, album, and artist names.
-c --ok-chars=<chars> Specify allowed chars in slugify.
[default: -_~]
-s --space-char=<char> Specify the char to use in place of spaces.
[default: -]
-a --ascii-only Only allow ASCII chars (北京 (capital of china) -> bei-jing-capital-of-china)
-k --keep-spaces Retain whitespace in filenames
-u --keep-upper Retain uppercase letters in filenames
"""
"""
Coded by:
2013-04-29 23:59:57 -07:00
Iheanyi Ekechukwu
http://twitter.com/kwuchu
http://github.com/iheanyi
2013-04-29 18:57:50 -07:00
Simon W. Jackson
http://miniarray.com
http://twitter.com/miniarray
http://github.com/miniarray
2013-04-29 18:57:50 -07:00
Anthony Forsberg:
http://evolution0.github.io
http://github.com/evolution0
Iheanyi:
Feel free to use this in any way you wish. I made this just for fun.
Shout out to darkf for writing the previous helper function for parsing the JavaScript!
"""
2013-04-29 18:57:50 -07:00
import os
import ast
import logging
import importlib
from docopt import docopt
import bandcamp_dl.bandcamp
from bandcamp_dl.bandcamp import Bandcamp
from bandcamp_dl.bandcampdownloader import BandcampDownloader
from bandcamp_dl.__init__ import __version__
def main():
arguments = docopt(__doc__, version=f'bandcamp-dl {__version__}')
2017-02-27 05:02:24 -08:00
if arguments['--debug']:
logging.basicConfig(level=logging.DEBUG)
bandcamp = Bandcamp()
2013-04-29 18:57:50 -07:00
basedir = arguments['--base-dir'] or os.path.expanduser('~')
session_file = f"{basedir}/{__version__}.not.finished"
if os.path.isfile(session_file) and arguments['URL'] is None:
with open(session_file, "r") as f:
arguments = ast.literal_eval(f.readline())
else:
with open(session_file, "w") as f:
f.write("".join(str(arguments).split('\n')))
if arguments['--artist'] and arguments['--album']:
urls = Bandcamp.generate_album_url(arguments['--artist'], arguments['--album'], "album")
elif arguments['--artist'] and arguments['--track']:
urls = Bandcamp.generate_album_url(arguments['--artist'], arguments['--track'], "track")
elif arguments['--artist']:
print(__doc__)
os.remove(session_file)
exit()
2014-06-07 21:14:56 -07:00
else:
urls = arguments['URL']
album_list = []
if type(urls) is str:
album_list.append(bandcamp.parse(urls, not arguments['--no-art'], arguments['--embed-lyrics'],
arguments['--debug']))
else:
for url in urls:
logging.debug(f"\n\tURL: {url}")
album_list.append(bandcamp.parse(url, not arguments['--no-art'], arguments['--embed-lyrics'],
arguments['--debug']))
for album in album_list:
logging.debug(" Album data:\n\t{}".format(album))
for album in album_list:
if arguments['--full-album'] and not album['full']:
print("Full album not available. Skipping ", album['title'], " ...")
album_list.remove(album) # Remove not-full albums BUT continue with the rest of the albums.
if arguments['URL'] or arguments['--artist']:
logging.debug("Preparing download process..")
for album in album_list:
bandcamp_downloader = BandcampDownloader(arguments['--template'], basedir, arguments['--overwrite'],
arguments['--embed-lyrics'], arguments['--group'],
arguments['--embed-art'], arguments['--no-slugify'],
arguments['--ok-chars'], arguments['--space-char'],
arguments['--ascii-only'], arguments['--keep-spaces'],
arguments['--keep-upper'], arguments['--debug'], album['url'])
logging.debug("Initiating download process..")
bandcamp_downloader.start(album)
# Add a newline to stop prompt mangling
print("")
else:
logging.debug(r" /!\ Something went horribly wrong /!\ ")
if __name__ == '__main__':
main()