audiogen.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from __future__ import print_function
  2. import sys
  3. import argparse
  4. from .entrypoints_utils import get_one_entrypoint
  5. import json
  6. from logging import getLogger, basicConfig
  7. log = getLogger("audiogen")
  8. def get_audiogenerator(kind):
  9. """Messes with entrypoints to return an audiogenerator function"""
  10. return get_one_entrypoint("larigira.audiogenerators", kind)
  11. def get_parser():
  12. parser = argparse.ArgumentParser(description="Generate audio and output paths")
  13. parser.add_argument("--log-level", choices=['DEBUG', 'INFO', 'WARNING', 'DEBUG'], default='WARNING')
  14. parser.add_argument(
  15. "audiospec",
  16. metavar="AUDIOSPEC",
  17. type=str,
  18. nargs=1,
  19. help="filename for audiospec, formatted in json",
  20. )
  21. return parser
  22. def read_spec(fname):
  23. try:
  24. if fname == "-":
  25. return json.load(sys.stdin)
  26. with open(fname) as buf:
  27. return json.load(buf)
  28. except ValueError:
  29. sys.stderr.write("Error: invalid JSON\n")
  30. sys.exit(1)
  31. def check_spec(spec):
  32. if "kind" not in spec:
  33. yield "Missing field 'kind'"
  34. def audiogenerate(spec):
  35. gen = get_audiogenerator(spec["kind"])
  36. return tuple(gen(spec))
  37. def main():
  38. """Main function for the "larigira-audiogen" executable"""
  39. args = get_parser().parse_args()
  40. basicConfig(level=args.log_level)
  41. spec = read_spec(args.audiospec[0])
  42. errors = tuple(check_spec(spec))
  43. if errors:
  44. log.error("Errors in audiospec")
  45. for err in errors:
  46. sys.stderr.write("Error: {}\n".format(err))
  47. sys.exit(1)
  48. for path in audiogenerate(spec):
  49. print(path)
  50. if __name__ == "__main__":
  51. main()