#!/usr/bin/env python # # Copyright © 2018-2019 Nick Bowler # # Tool to fetch album art for a release from the Cover Art Archive. # # License WTFPL2: Do What The Fuck You Want To Public License, version 2. # This is free software: you are free to do what the fuck you want to. # There is NO WARRANTY, to the extent permitted by law. from pathlib import Path import musicbrainzngs import argparse import tempfile import sys import os umask = os.umask(0) os.umask(umask) progname = "caa-fetcher" version = "1" musicbrainzngs.set_useragent(progname, version) parser = argparse.ArgumentParser( description='Download album artwork from the Cover Art Archive' ) # NamedTemporaryFile workalike which allows control of the file mode... def open_tmp(prefix="tmp", suffix="", dir=".", mode=0o600): names = tempfile._get_candidate_names() for seq in range(100): name = os.path.join(dir, "%s%s%s" % (prefix, next(names), suffix)) try: f = open(name, "x+", mode) except FileExistsError: continue return tempfile._TemporaryFileWrapper(f, name) return None class VersionAction(argparse.Action): def __init__(self, **kw): super().__init__(nargs=0, help="show a version message and exit", **kw) def __call__(self, parser, namespace, values, option_string=None): print("%s %s" % (progname, version)) print('''Copyright © 2019 Nick Bowler License WTFPL2: Do What The Fuck You Want To Public License, version 2. This is free software: you are free to do what the fuck you want to. There is NO WARRANTY, to the extent permitted by law.''') sys.exit(0) parser.add_argument('--version', action=VersionAction) parser.add_argument('-o', '--output-directory', metavar='DIR', help='''downloaded files are written to DIR, which is created if it does not exists. Default: .''') parser.add_argument('-r', '--release-mbid', metavar='MBID', required=True) args = parser.parse_args() # TODO: allow the naming scheme to be configured... name_format = "{num:02d}" covers = musicbrainzngs.get_image_list(args.release_mbid) if len(covers["images"]) == 0: print("release has no cover art, nothing to do") sys.exit() if args.output_directory: Path(args.output_directory).mkdir(parents=True, exist_ok=True) os.chdir(args.output_directory) failed = False for c in covers["images"]: (_,ext) = os.path.splitext(c["image"]) outname = (name_format + "{0}").format(ext, num = (covers["images"].index(c) + 1) ) if Path(outname).exists(): print("%s already exists, skipping..." % outname) continue outfile = open_tmp(suffix=ext, dir=".", mode=0o666) rc = os.spawnlp(os.P_WAIT, 'wget', 'wget', '-O', outfile.name, c["image"]) if rc: failed = True os.link(outfile.name, outname) outfile.close() if failed: sys.exit(1)