aircox/aircox/management/commands/sounds_quality_check.py
Thomas Kairos f7a61fe6c0 Feat: packaging (#127)
- Add configuration files for packaging
- Precommit now uses ruff

Co-authored-by: bkfox <thomas bkfox net>
Reviewed-on: #127
2023-10-11 10:58:34 +02:00

83 lines
2.5 KiB
Python
Executable File

"""Analyse and check files using Sox, prints good and bad files."""
import logging
from argparse import RawTextHelpFormatter
from django.core.management.base import BaseCommand, CommandError
from aircox.controllers.sound_stats import SoundStats, SoxStats
logger = logging.getLogger("aircox.commands")
class Command(BaseCommand):
help = __doc__
sounds = None
def add_arguments(self, parser):
parser.formatter_class = RawTextHelpFormatter
parser.add_argument(
"files",
metavar="FILE",
type=str,
nargs="+",
help="file(s) to analyse",
)
parser.add_argument(
"-s",
"--sample_length",
type=int,
default=120,
help="size of sample to analyse in seconds. If not set (or 0), " "does not analyse by sample",
)
parser.add_argument(
"-a",
"--attribute",
type=str,
help="attribute name to use to check, that can be:\n"
+ ", ".join(['"{}"'.format(attr) for attr in SoxStats.attributes]),
)
parser.add_argument(
"-r",
"--range",
type=float,
nargs=2,
help="range of minimal and maximal accepted value such as: " "--range min max",
)
parser.add_argument(
"-i",
"--resume",
action="store_true",
help="print a resume of good and bad files",
)
def handle(self, *args, **options):
# parameters
minmax = options.get("range")
if not minmax:
raise CommandError("no range specified")
attr = options.get("attribute")
if not attr:
raise CommandError("no attribute specified")
# sound analyse and checks
self.sounds = [SoundStats(path, options.get("sample_length")) for path in options.get("files")]
self.bad = []
self.good = []
for sound in self.sounds:
logger.info("analyse " + sound.path)
sound.analyse()
sound.check(attr, minmax[0], minmax[1])
if sound.bad:
self.bad.append(sound)
else:
self.good.append(sound)
# resume
if options.get("resume"):
for sound in self.good:
logger.info("\033[92m+ %s\033[0m", sound.path)
for sound in self.bad:
logger.info("\033[91m+ %s\033[0m", sound.path)