def sync_sets(sets=[], targettids=()): tidexpr = Expr(Config["trackid"]) targetcodec = Config["type"] if "," in targetcodec: allowedcodecs = targetcodec.split(",") targetcodec = allowedcodecs[0] allowedcodecs = set(allowedcodecs) else: allowedcodecs = set((targetcodec,)) targetcodec = get_codec(targetcodec) postadd = {"type": targetcodec.type_, "ext": targetcodec.ext} dstdirs = set() onsplit = Config["onsplit"] newsets = [] while sets: fileset = sets.pop() srcs = set(file.meta["dir"] for file in fileset) dsts = set( os.path.split(file.format(postadd=() if file.type_ in allowedcodecs else postadd))[0] for file in fileset ) dsts = tuple(dsts) if onsplit == "abort": if len(dsts) > 1: fatal( consoleformat=u"tracks in %(src)s would be placed in different target directories, aborting\nset onsplit to 'warn' or 'ignore' to proceed anyway", format="split: {src:%(src)r", src=srcs.pop(), nologerror=1, ) if len(srcs) > 1: fatal( consoleformat=u"tracks in from directories %(src)s would be placed in target directory %(dst)r, aborting\nset onsplit to 'warn' or 'ignore' to proceed anyway", format="split: %(src)r", src=tuple(srcs), dst=dsts[0], nologerror=1, ) if dsts[0] in dstdirs: fatal( consoleformat=u"tracks in %(src)s would be placed in %(dst)s, which is already the target for other tracks, aborting\nset onsplit to 'warn' or 'ignore' to proceed anyway", format="split: %(src)r", src=tuple(srcs), dst=dsts[0], nologerror=1, ) dstdirs.add(dsts[0]) if any(file.meta.evaluate(tidexpr) not in targettids for file in fileset): newsets.append(fileset) sets = newsets if targetcodec.has_from_wav_pipe: task_generator = track_transcode_generator elif targetcodec.has_from_wav_multi: task_generator = album_transcode_generator reactor.suggestThreadPoolSize(max(len(alb) for alb in sets) * (2 + int(Config.get("jobs", cpu_count())))) PoolTask(task_generator(sets, targettids, allowedcodecs, targetcodec)).run() return
def init_logs(): global collector, logconsole, logfile if logconsole is None: logconsole = FilteredConsoleLogObserver(Config['consolelevel']) logconsole.start() if collector is None: collector = FilteredFileLogObserver(StringIO(), ERROR) collector.start() if logfile is None: logfile = FilteredFileLogObserver(Config.get('logfile', 'audiomangler-%d.log' % os.getpid()), get_level(Config['loglevel'])) logfile.start()
def fsdecode(string): return string.decode(Config['fs_encoding'], Config.get('fs_encoding_err', 'replace'))
def fsencode(string): return string.encode(Config['fs_encoding'], Config.get('fs_encoding_err', 'underscorereplace'))
def __init__(self, tasks, **kwargs): self.max_tasks = kwargs.get('jobs') or int(Config.get('jobs', cpu_count())) tasks = iter(tasks) super(PoolTask, self).__init__(tasks)