diff --git a/config.py.example b/config.py.example index 87eaa6f..8757916 100644 --- a/config.py.example +++ b/config.py.example @@ -6,3 +6,4 @@ class Config: ''.join(random.choices(string.ascii_letters, k=20)) DATA_DIR = os.environ.get('DATA_DIR') or '/home/orange/devel/prolefeeder/tmp' MAX_LENGTH = os.environ.get('MAX_LENGTH') or 180 + KBITS = os.environ.get('KBITS') or 128 diff --git a/generate-test-data.py b/generate-test-data.py index 559ef5f..63aed88 100644 --- a/generate-test-data.py +++ b/generate-test-data.py @@ -1,14 +1,14 @@ from datetime import datetime, timedelta import subprocess -KBITS = 128 +from config import Config def generate_test_file(fn, delta): subprocess.call(['ffmpeg', '-f', 'lavfi', '-i', 'sine=frequency=1000:duration=%d' % delta.total_seconds(), - '-b:a', '%dk' % KBITS, + '-b:a', '%dk' % Config.KBITS, fn]) diff --git a/prolefeeder.py b/prolefeeder.py index 1b415ff..547f7bc 100644 --- a/prolefeeder.py +++ b/prolefeeder.py @@ -6,6 +6,10 @@ from wtforms import DateTimeField, DecimalField, SubmitField from wtforms.validators import DataRequired, NumberRange from datetime import datetime, timedelta +import os +import random +import re +import subprocess from config import Config @@ -47,7 +51,53 @@ def download_file(filename): def prepare_download(form): - return 'test.mp3' + """Prepare a download given the user's request form""" + + def start_time_for_source_fn(fn): + return datetime.strptime(fn, 'qfhi-%Y%m%d-%H%M.mp3') + + def length_for_source_fn(fn): + size = os.stat(os.path.join(app.config['DATA_DIR'], fn)).st_size + length = timedelta(minutes=size / (1000*app.config['KBITS']/8) / 60) + return length + + # Get a sorted list of all source files with start time and length + sources = [] + for fn in os.listdir(app.config['DATA_DIR']): + try: + start_time = start_time_for_source_fn(fn) + length = length_for_source_fn(fn) + sources.append({'fn': fn, 'start_time': start_time, 'length': length}) + except ValueError: + pass + sources = sorted(sources, key=lambda s: s['start_time']) + + # Only interested in the source files from the start file + start_index = None + for i, source in enumerate(sources): + if source['start_time'] <= form.start_time.data < source['start_time'] + source['length']: + start_index = i + sources = sources[start_index:] + + # Seek into the first file + ss = (form.start_time.data - sources[0]['start_time']).total_seconds() + + # Let ffmpeg do the rest of the job + # XXX Necessary to limit the concat files? + output_filename = '{}_{}.mp3'.format(form.start_time.data, form.length.data) + + c = ['ffmpeg', '-y'] + c += ['-ss', str(ss)] + c += ['-i', 'concat:' + '|'.join([os.path.join(app.config['DATA_DIR'], + source['fn']) for source in sources])] + c += ['-codec', 'copy'] + c += ['-t', str(form.length.data * 60)] + c += [os.path.join(app.config['DATA_DIR'], output_filename)] + + app.logger.debug(' '.join(c)) + subprocess.call(c) + + return output_filename if __name__ == '__main__':