""" 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.management.sound_stats import SoxStats, SoundStats 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)