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')
def add(event, basefolder, filename, file): """ :param event: parent event :param basefolder: basefolder to store files :param file: file object from upload :return: """ # initiate result dict result = {'error': '', 'preprod_id': '', 'location':''} audiotools = CombaAudiotools() # initiate override object override = BroadcastEventOverride() override.broadcast_event = event override.start = event.start # create folders parentfolder = os.path.abspath(os.path.join(basefolder, os.path.pardir)) uid = os.stat(parentfolder).st_uid gid = os.stat(parentfolder).st_gid if not os.path.exists(basefolder): os.mkdir(basefolder) try: os.chown(basefolder, uid, gid) except: pass folder = os.path.join(basefolder, override.start.strftime('%Y-%m-%d-%H-%M')) if not os.path.exists(folder): os.mkdir(folder) try: os.chown(folder, uid, gid) except: pass # make secure filename, create path and store file filename = secure_filename(filename) file_path = os.path.join(folder, filename) inc = 1 (base, ext) = os.path.splitext(file_path) while os.path.exists(file_path): file_path = base + "-" + str(inc) + ext inc = inc + 1 try: shutil.move(file, file_path) except: result['error'] = _("Could not store file to %(location)", location=file_path) # check mime type mimetype = audiotools.audio_mime_type(file_path) if mimetype: if mimetype.find("wav") > -1: info = audiotools.get_wav_info(file_path) elif (mimetype.find("mpeg")) > -1: info = audiotools.get_mp3_info(file_path) elif (mimetype.find("ogg")) > -1: info = audiotools.get_ogg_info(file_path) else: try: os.remove(file_path) except: pass result['error'] = _("Wrong Filetype") # store data override.mimetype = mimetype if info.has_key('bitrate'): override.bitrate = info['bitrate'] if info.has_key('length'): override.length = info['length'] if info.has_key('channels'): override.channels = info['channels'] override.identifier = event.identifier override.ordering = override.nextOrdering() override.location = 'file://' + file_path override.save() result['preprod_id'] = override.id result['ordering'] = override.ordering result['location'] = override.location else: result['error'] = _("Wrong Filetype") return result