Example #1
0
    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"])
Example #2
0
    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')
Example #3
0
    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