4 from datetime import datetime, timedelta
9 from optparse import OptionParser
14 #os.system = print_cmd
16 tmpdir = os.environ.get('TMPDIR', '/tmp/')
20 def get_files(self, start, end):
24 filenames.append(self.get_file(t))
25 t = t + timedelta(seconds=15*60)
28 def get_file(self, timestamp):
29 formatted = timestamp.strftime('record-%Y-%m-%d-%a-%H-%M')
30 t = self.get_current_file(formatted)
33 return self.get_archive_file(formatted)
35 class LocalSource(Source):
36 base_directory = '/var/www/current/record/'
38 def get_current_file(self, filename):
39 fullpath = os.path.join(self.base_directory, 'current', filename + '.wav')
40 if os.path.exists(fullpath):
43 def get_archive_file(self, filename):
44 fullpath = os.path.join(self.base_directory, 'archives', filename + '.ogg')
45 localwav = os.path.join(tmpdir, filename.replace('.ogg', '.wav'))
46 os.system('oggdec %s --output %s' % (fullpath, localwav))
49 class HttpSource(Source):
50 base_url = 'http://nas.studio.priv/current/record/'
52 def get_http_file(self, filename):
53 dstfile = os.path.join(tmpdir, os.path.basename(filename))
54 if os.path.exists(dstfile):
56 url = self.base_url + filename
58 fd = urllib2.urlopen(url)
59 except urllib2.HTTPError:
62 extension = filename.split('.')[-1]
63 tmpfile = os.path.join(tmpdir, md5.md5(str(random.random())).hexdigest()) + '.' + extension
64 dst = open(tmpfile, 'w')
65 BLOCK_SIZE = 10*1000*1000
67 s = fd.read(BLOCK_SIZE)
69 if len(s) != BLOCK_SIZE:
72 os.rename(tmpfile, dstfile)
76 def get_current_file(self, filename):
77 return self.get_http_file('current/' + filename + '.wav')
79 def get_archive_file(self, filename):
80 dstfile = self.get_http_file('archives/' + filename + '.ogg')
81 localwav = os.path.join(tmpdir, dstfile.replace('.ogg', '.wav'))
82 os.system('oggdec %s --output %s' % (dstfile, localwav))
89 lower = date.replace(minute = (date.minute - (date.minute % 15)))
93 upper = get_lower(date)
94 return upper + timedelta(seconds=15*60)
96 def extract(start, end, output):
97 lower = get_lower(start)
98 upper = get_lower(end - timedelta(seconds=60))
100 filenames = source.get_files(lower, upper)
101 if start.minute % 15 != 0:
102 delay = (start.minute % 15) * 60
103 tmpfile = os.path.join(tmpdir, md5.md5(str(random.random())).hexdigest()) + '.wav'
104 os.system('sox --show-progress %s %s trim %d %d' % (
105 filenames[0], output, delay, 15*60-delay))
106 filenames[0] = tmpfile
108 if end.minute % 15 != 0:
109 delay = (end.minute % 15) * 60
110 tmpfile = os.path.join(tmpdir, md5.md5(str(random.random())).hexdigest()) + '.wav'
111 os.system('sox --show-progress %s %s trim 0 %d' % (filenames[-1], tmpfile, delay))
112 filenames[-1] = tmpfile
114 tmpfile = os.path.join(tmpdir, md5.md5(str(random.random())).hexdigest()) + '.wav'
115 if len(filenames) > 1:
116 os.system('sox --show-progress %s %s' % (' '.join(filenames), tmpfile))
117 shutil.move(tmpfile, output)
119 shutil.copy(filenames[0], output)
121 if __name__ == '__main__':
122 parser = OptionParser()
123 parser.add_option('--start', dest='start', metavar='TIME')
124 parser.add_option('--stop', dest='stop', metavar='TIME')
125 parser.add_option('--output', dest='output', metavar='FILENAME')
126 options, args = parser.parse_args()
127 if not (options.start and options.stop and options.output):
131 datetime.strptime(options.start, '%Y-%m-%d %H:%M'),
132 datetime.strptime(options.stop, '%Y-%m-%d %H:%M'),