]> git.0d.be Git - pige-extractor.git/blob - dojobs.py
start
[pige-extractor.git] / dojobs.py
1 #! /usr/bin/env python
2
3 import os
4 import time
5 import sys
6 from extract import extract
7 from datetime import datetime, timedelta
8
9 JOBS_DIR = '/tmp/jobs'
10
11 class Job:
12     def __init__(self, job_id):
13         self.job_id = job_id
14         self.filename = os.path.join(JOBS_DIR, self.job_id)
15         line = file(self.filename).readline()
16         self.cmd = line.split(':', 1)[0].strip()
17         self.timestamp = os.stat(self.filename)[-3]
18
19     def add_info(self, info):
20         first_line = file(self.filename).readline()
21         if not first_line.endswith('\n'):
22             first_line += '\n'
23         open(self.filename, 'w').write(first_line + info + '\n')
24
25     def start(self):
26         if os.fork():
27             return
28         firstline = file(self.filename).readline()
29         open(self.filename, 'w').write('running\nEn cours de traitement ...\n')
30         first_word, date, start, end = firstline.strip().split()
31
32         year, month, day = date.split('-')
33         start_hour, start_minutes = [int(x) for x in start.split(':')]
34         end_hour, end_minutes = [int(x) for x in end.split(':')]
35         output_filename = 'extrait-%s%s%s-%02d%02d-%02d%02d.wav' % (
36                 year, month, day, start_hour, start_minutes, end_hour, end_minutes)
37         start_time = datetime(int(year), int(month), int(day), int(start_hour), int(start_minutes))
38         end_time = datetime(int(year), int(month), int(day), int(end_hour), int(end_minutes))
39         if end_time < start_time:
40             end_time += timedelta(days=1)
41         extract(start_time, end_time, output_filename)
42         open(self.filename, 'w').write('done:%s\n' % output_filename)
43         sys.exit(0)
44
45     def cleanup(self):
46         if os.stat(self.filename)[-2]+300 > time.time():
47             try:
48                 os.unlink(self.filename)
49             except OSError:
50                 pass
51
52     def __repr__(self):
53         return '<Job id=%s>' % self.job_id
54
55
56 jobs = [Job(x) for x in os.listdir(JOBS_DIR)]
57 jobs.sort(lambda x, y: cmp(x.timestamp, y.timestamp))
58
59 running_jobs = [x for x in jobs if x.cmd == 'running']
60
61 waiting = 0
62 for job in jobs:
63     if job.cmd == 'start':
64         if running_jobs:
65             job.add_info('Encore %s jobs ...' % (len(running_jobs)+waiting))
66             waiting += 1
67         else:
68             running_jobs.append(job)
69             job.start()
70     elif job.cmd == 'done':
71         job.cleanup()