import os import queue import subprocess DESIRED_AUTHOR = "Autor" src = os.path.join("/mnt/doma/verejne/muzika/", DESIRED_AUTHOR) dst = "/var/tmp/" def meta(srcfile): cmd = ["metaflac", "--show-all-tags", srcfile] p = subprocess.Popen(cmd, stdout=subprocess.PIPE) r = {} for l in iter(p.stdout.readline, b''): k, v = l.split(b'=', 1) r[k.decode('utf-8')] = v.decode('utf-8').strip() print(r) return r def discdir(d): return d.startswith('CD') or d.startswith('Disc ') or d.startswith('Part ') or d.startswith('Volume ') def basename(p): dn = os.path.dirname(p) bn = os.path.basename(p) if discdir(bn): return os.path.join(os.path.basename(dn), bn) return bn def do_dir(d): dstdir = os.path.join(dst, basename(d)) os.makedirs(dstdir, exist_ok=True) allproc = queue.Queue() for f in os.listdir(d): if not f.endswith('.flac') or not f[0].isnumeric(): continue dstfilename = f.replace(".flac", ".mp3") wavfilename = f.replace(".flac", ".wav") wavfile = os.path.join(dstdir, wavfilename) dstfile = os.path.join(dstdir, dstfilename) srcfile = os.path.join(d, f) m = meta(srcfile) flaccmd = ["flac", "-d", "-o", wavfile, srcfile] lamecmd = ["lame", "-V", "2"] if 'ARTIST' in m: lamecmd.extend(["--ta", m['ARTIST']]) if 'TITLE' in m: lamecmd.extend(["--tt", m['TITLE']]) if 'ALBUM' in m: lamecmd.extend(["--tl", m['ALBUM']]) if 'TRACKNUMBER' in m: trk = int(m['TRACKNUMBER']) if 'TOTALTRACKS' in m: trk = str(trk) + "/" + str(int(m['TOTALTRACKS'])) lamecmd.extend(["--tn", trk]) else: lamecmd.extend(["--tn", str(trk)]) if 'DISCNUMBER' in m: disc = int(m['DISCNUMBER']) if 'TOTALDISCS' in m: total = int(m['TOTALDISCS']) disc = str(disc) + "/" + str(total) if total > 1: lamecmd.extend(["--tv", 'TPOS=' + disc]) else: lamecmd.extend(["--tv", 'TPOS=' + str(disc)]) if 'DATE' in m: lamecmd.extend(["--ty", m['DATE']]) if 'GENRE' in m: lamecmd.extend(["--tg", m['GENRE']]) if 'COMMENT' in m: lamecmd.extend(["--tc", m['COMMENT']]) lamecmd.extend([wavfile, dstfile]) print(flaccmd) print(lamecmd) flac = subprocess.Popen(flaccmd) allproc.put((flac, lamecmd)) while not allproc.empty(): p, cmd = allproc.get() p.wait() if cmd: allproc.put((subprocess.Popen(cmd), None)) for f in os.listdir(dstdir): if not f.endswith('.wav'): continue os.unlink(os.path.join(dstdir, f)) if __name__ == '__main__': for d in os.listdir(os.path.join(src)): if DESIRED_AUTHOR not in d: print(d) continue inside = os.listdir(os.path.join(src, d)) multidisc = any([discdir(d) for d in inside]) if multidisc: for dd in inside: if discdir(dd): do_dir(os.path.join(src, d, dd)) else: do_dir(os.path.join(src, d))