]> git.0d.be Git - pige-extractor.git/blob - extract.py
create files in results/ (crade)
[pige-extractor.git] / extract.py
1 #! /usr/bin/env python
2
3 import sys
4 from datetime import datetime, timedelta
5 import os
6 import urllib2
7 import md5
8 import random
9 from optparse import OptionParser
10 import shutil
11
12 def print_cmd(x):
13     print x
14 #os.system = print_cmd
15
16 tmpdir = os.environ.get('TMPDIR', '/tmp/')
17
18
19 class Source:
20     def get_files(self, start, end):
21         filenames = []
22         t = start
23         while t <= end:
24             filenames.append(self.get_file(t))
25             t = t + timedelta(seconds=15*60)
26         return filenames
27
28     def get_file(self, timestamp):
29         formatted = timestamp.strftime('record-%Y-%m-%d-%a-%H-%M')
30         t = self.get_current_file(formatted)
31         if t:
32             return t
33         return self.get_archive_file(formatted)
34
35 class LocalSource(Source):
36     base_directory = '/var/www/current/record/'
37
38     def get_current_file(self, filename):
39         fullpath = os.path.join(self.base_directory, 'current', filename + '.wav')
40         if os.path.exists(fullpath):
41             return fullpath
42
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))
47         return localwav
48
49 class HttpSource(Source):
50     base_url = 'http://nas.studio.priv/current/record/'
51
52     def get_http_file(self, filename):
53         dstfile = os.path.join(tmpdir, os.path.basename(filename))
54         if os.path.exists(dstfile):
55             return dstfile
56         url = self.base_url + filename
57         try:
58             fd = urllib2.urlopen(url)
59         except urllib2.HTTPError:
60             return
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
65         while True:
66             s = fd.read(BLOCK_SIZE)
67             dst.write(s)
68             if len(s) != BLOCK_SIZE:
69                 break
70         dst.close()
71         os.rename(tmpfile, dstfile)
72         return dstfile
73
74
75     def get_current_file(self, filename):
76         return self.get_http_file('current/' + filename + '.wav')
77
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))
82         return localwav
83
84
85 source = HttpSource()
86
87 def get_lower(date):
88     lower = date.replace(minute = (date.minute - (date.minute % 15)))
89     return lower
90
91 def get_upper(date):
92     upper = get_lower(date)
93     return upper + timedelta(seconds=15*60)
94
95 def extract(start, end, output):
96     lower = get_lower(start)
97     upper = get_lower(end - timedelta(seconds=60))
98
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
106
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
112
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)
117     else:
118         shutil.copy(filenames[0], output)
119
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):
127         parser.print_help()
128         sys.exit(1)
129     sys.exit(extract(
130             datetime.strptime(options.start, '%Y-%m-%d %H:%M'),
131             datetime.strptime(options.stop, '%Y-%m-%d %H:%M'),
132             options.output))