def start(self): """ Watch redis store. If the last track of a recorded programme is dumped, combine archive the tracks to a single mp3 @return: """ self.loadConfig() print "Archive is running" logging.debug("Archive is running") audiotools = CombaAudiotools() r = redis.Redis("localhost") ps_obj=r.pubsub() ps_obj.psubscribe('recordPublish') for item in ps_obj.listen(): logging.debug("listener found item") logging.debug(item['data']) if type(item['data']) == type(""): try: data = simplejson.loads(item['data']) except: logging.debug("could not load item") continue if not data.has_key('value') or not data.has_key('eventname'): logging.debug("no value, no eventname") continue if not data['eventname'] == 'dumpend': logging.debug("eventname ist nicht dumpend") continue curtrack = BroadcastEventTrack.objects(location='file://' + data["value"]).first() if not curtrack: logging.debug("track nicht gefunden") continue logging.debug("track " + str(data["value"]) + ' gefunden') if curtrack.isLast(): logging.debug("track ist der letzte") tracks = BroadcastEventTrack.objects(broadcast_event=curtrack.broadcast_event) event = curtrack.broadcast_event files = [] for track in tracks: files.append(track.location.replace('file://', '')) subfolder = event.start.strftime('%Y-%m-%d') filename = event.start.strftime('%Y-%m-%d-%H-%M-%S.mp3') event.modified = datetime.datetime.now() event.location = 'file://' + str(self.archivebase + subfolder + '/' + filename).replace('//','/') event.state = 'archived' event.modified_by = 'archiver' event.save() cur_folder = str(self.archivebase + subfolder + '/').replace('//', '/') audiotools.combine_audiofiles(files, cur_folder, filename, clean=False, params=["-C", "224.01"])
def combine_audiofiles(self, watcher, revents): """ Kombiniert Dateien, die in einem best. Zeitintervall entstanden sind @type watcher: object @param watcher: der watcher @type revents: object @param revents: revents - nicht verwendet """ self.block_combine = False self.messenger.send('Stop watcher', '0501', 'info', 'combine_audiofiles' , None, 'appinternal') from_time = int(watcher.data['from_time']) to_time = int(watcher.data['to_time']) watcher.stop() watcher.loop.stop() # Den Ordner bestimmen, in dem die Dateien liegen cur_folder = self.record_dir + '/' + datetime.datetime.fromtimestamp(from_time).strftime("%Y-%m-%d") + "/" uid = os.stat(cur_folder).st_uid gid = os.stat(cur_folder).st_gid # Name der Audiodatei, die angelegt werden muss out_file = datetime.datetime.fromtimestamp(from_time).strftime("%Y-%m-%d-%H-%M") + ".wav" # Alle WAV-Dateien im Ordner files = glob.glob(cur_folder + "*.wav") combine = [] if len(files) > 0: for file in files: t = int(os.path.getmtime(file)) # Liegt die Mtime im definierten Intervall? if t > from_time and t <= to_time: combine.append(file) if len(combine) > 0: audiotools = CombaAudiotools() audiotools.combine_audiofiles(combine, cur_folder, out_file, nice=19) os.chown(out_file, uid, gid); self.messenger.send("Combined to file " + out_file, '0502', 'info', 'combine_audiofiles' , None, 'appinternal')