larigira/larigira/audiogen_randomdir.py
2019-06-25 13:49:54 +02:00

60 lines
1.6 KiB
Python

import os
import logging
import shutil
import random
from tempfile import mkstemp
from pathlib import Path
from larigira.fsutils import scan_dir_audio, shortname, is_audio
log = logging.getLogger(__name__)
def candidates(paths):
c = set()
for path in paths:
if not path.exists():
log.warning("Can't find requested path: %s", path)
continue
if path.is_file() and is_audio(str(path)):
c.add(str(path))
elif path.is_dir():
c.update(scan_dir_audio(str(path)))
return c
def generate(spec):
"""
resolves audiospec-randomdir
Recognized arguments:
- paths [mandatory] list of source paths
- howmany [default=1] number of audio files to pick
"""
spec.setdefault("howmany", 1)
for attr in ("paths",):
if attr not in spec:
raise ValueError("Malformed audiospec: missing '%s'" % attr)
found_files = candidates([Path(p) for p in spec["paths"]])
picked = random.sample(found_files, int(spec["howmany"]))
nick = spec.get("nick", "")
if not nick:
if hasattr(spec, "eid"):
nick = spec.eid
else:
nick = "NONICK"
for path in picked:
tmp = mkstemp(
suffix=os.path.splitext(path)[-1],
prefix="randomdir-%s-%s-" % (shortname(nick), shortname(path)),
)
os.close(tmp[0])
shutil.copy(path, tmp[1])
log.info("copying %s -> %s", path, os.path.basename(tmp[1]))
yield "file://{}".format(tmp[1])
generate.description = "Picks random files from a specified directory"