]> git.0d.be Git - pige-extractor.git/blob - extract.py
create JOBS_DIR when necessary, and don't fail when it doesn't exist
[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             print 'url 404:', url
61             return
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
66         while True:
67             s = fd.read(BLOCK_SIZE)
68             dst.write(s)
69             if len(s) != BLOCK_SIZE:
70                 break
71         dst.close()
72         os.rename(tmpfile, dstfile)
73         return dstfile
74
75
76     def get_current_file(self, filename):
77         return self.get_http_file('current/' + filename + '.wav')
78
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))
83         return localwav
84
85
86 source = HttpSource()
87
88 def get_lower(date):
89     lower = date.replace(minute = (date.minute - (date.minute % 15)))
90     return lower
91
92 def get_upper(date):
93     upper = get_lower(date)
94     return upper + timedelta(seconds=15*60)
95
96 def extract(start, end, output):
97     lower = get_lower(start)
98     upper = get_lower(end - timedelta(seconds=60))
99
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
107
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
113
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)
118     else:
119         shutil.copy(filenames[0], output)
120
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):
128         parser.print_help()
129         sys.exit(1)
130     sys.exit(extract(
131             datetime.strptime(options.start, '%Y-%m-%d %H:%M'),
132             datetime.strptime(options.stop, '%Y-%m-%d %H:%M'),
133             options.output))