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:
61 extension = filename.split('.')[-1]
62 tmpfile = os.path.join(tmpdir, md5.md5(str(random.random())).hexdigest()) + '.' + extension
63 dst = open(tmpfile, 'w')
64 BLOCK_SIZE = 10*1000*1000
66 s = fd.read(BLOCK_SIZE)
68 if len(s) != BLOCK_SIZE:
71 os.rename(tmpfile, dstfile)
75 def get_current_file(self, filename):
76 return self.get_http_file('current/' + filename + '.wav')
78 def get_archive_file(self, filename):
79 dstfile = self.get_http_file('archives/' + filename + '.ogg')
80 localwav = os.path.join(tmpdir, dstfile.replace('.ogg', '.wav'))
81 os.system('oggdec %s --output %s' % (dstfile, localwav))
88 lower = date.replace(minute = (date.minute - (date.minute % 15)))
92 upper = get_lower(date)
93 return upper + timedelta(seconds=15*60)
95 def extract(start, end, output):
96 lower = get_lower(start)
97 upper = get_lower(end - timedelta(seconds=60))
99 filenames = source.get_files(lower, upper)
100 if start.minute % 15 != 0:
101 delay = (start.minute % 15) * 60
102 tmpfile = os.path.join(tmpdir, md5.md5(str(random.random())).hexdigest()) + '.wav'
103 os.system('sox --show-progress %s %s trim %d %d' % (
104 filenames[0], output, delay, 15*60-delay))
105 filenames[0] = tmpfile
107 if end.minute % 15 != 0:
108 delay = (end.minute % 15) * 60
109 tmpfile = os.path.join(tmpdir, md5.md5(str(random.random())).hexdigest()) + '.wav'
110 os.system('sox --show-progress %s %s trim 0 %d' % (filenames[-1], tmpfile, delay))
111 filenames[-1] = tmpfile
113 tmpfile = os.path.join(tmpdir, md5.md5(str(random.random())).hexdigest()) + '.wav'
114 if len(filenames) > 1:
115 os.system('sox --show-progress %s %s' % (' '.join(filenames), tmpfile))
116 shutil.move(tmpfile, output)
118 shutil.copy(filenames[0], output)
120 if __name__ == '__main__':
121 parser = OptionParser()
122 parser.add_option('--start', dest='start', metavar='TIME')
123 parser.add_option('--stop', dest='stop', metavar='TIME')
124 parser.add_option('--output', dest='output', metavar='FILENAME')
125 options, args = parser.parse_args()
126 if not (options.start and options.stop and options.output):
130 datetime.strptime(options.start, '%Y-%m-%d %H:%M'),
131 datetime.strptime(options.stop, '%Y-%m-%d %H:%M'),