def test_get_next_and_past_mediapackages(self): repo = repository.Repository(self.tmppath) now = datetime.datetime.utcnow() mp = mediapackage.Mediapackage(identifier="1", title='MP#1', date=(now - datetime.timedelta(days=1))) repo.add(mp) mp = mediapackage.Mediapackage(identifier="2", title='MP#2', date=(now - datetime.timedelta(days=30))) repo.add(mp) mp = mediapackage.Mediapackage(identifier="3", title='MP#3', date=(now - datetime.timedelta(days=60))) repo.add(mp) mp_next = mediapackage.Mediapackage(identifier="4", title='MP#4', date=(now + datetime.timedelta(days=1))) repo.add(mp_next) mp = mediapackage.Mediapackage(identifier="5", title='MP#5', date=(now + datetime.timedelta(days=30))) repo.add(mp) self.assertEqual(repo.get_next_mediapackage(), mp_next) self.assertEqual(len(repo.get_next_mediapackages()), 2) self.assertEqual(len(repo.get_past_mediapackages()), 3) self.assertEqual(len(repo.get_past_mediapackages(40)), 1)
def test_mediapackage_get_oc_capture_agent_property(self): mp = mediapackage.Mediapackage() mp.add(self.path_capture_agent_properties, mediapackage.TYPE_ATTACHMENT, identifier='org.opencastproject.capture.agent.properties') self.assertEqual(mp.getOCCaptureAgentProperty('capture.device.names'), 'camera,screen,audio') self.assertNotEqual( mp.getOCCaptureAgentProperty('capture.device.names.error'), 'camera,screen,audio') mp2 = mediapackage.Mediapackage() self.assertNotEqual( mp2.getOCCaptureAgentProperty('capture.device.names'), 'camera,screen,audio') self.assertEqual( mp.getOCCaptureAgentProperties(), { u'org.opencastproject.workflow.config.trimHold': 'false', u'capture.device.names': 'camera,screen,audio', u'org.opencastproject.workflow.definition': 'full', u'event.series': 'f16b43df-d1d4-4a85-8989-c060b85cea8d', u'event.title': 'Clase 2', u'event.location': 'GC-Etna', u'org.opencastproject.workflow.config.captionHold': 'false' })
def test_cleanstale_plugin(self): dispatcher = context.get_dispatcher() repo = context.get_repository() conf = context.get_conf() now = datetime.datetime.utcnow() mp = mediapackage.Mediapackage(identifier="1", title='MP#1', date=(now - datetime.timedelta(days=1))) repo.add(mp) mp = mediapackage.Mediapackage(identifier="2", title='MP#2', date=(now - datetime.timedelta(days=30))) repo.add(mp) mp = mediapackage.Mediapackage(identifier="3", title='MP#3', date=(now - datetime.timedelta(days=60))) repo.add(mp) mp = mediapackage.Mediapackage(identifier="4", title='MP#4', date=(now + datetime.timedelta(days=1))) repo.add(mp) mp = mediapackage.Mediapackage(identifier="5", title='MP#5', date=(now + datetime.timedelta(days=30))) repo.add(mp) cleanstale.init() self.assertEqual(len(repo), 5) conf.set('cleanstale','maxarchivaldays', '50') dispatcher.emit('galicaster-notify-nightly') self.assertEqual(len(repo), 4) conf.set('cleanstale','maxarchivaldays', '20') dispatcher.emit('galicaster-notify-nightly') self.assertEqual(len(repo), 3)
def test_folder_name_template_unique(self): repo = repository.Repository(self.tmppath, 'test', 'test') mp1 = mediapackage.Mediapackage() mp2 = mediapackage.Mediapackage() mp3 = mediapackage.Mediapackage() repo.add(mp1) self.assertEqual(mp1.getURI(), os.path.join(repo.root, 'test')) repo.add(mp2) self.assertEqual(mp2.getURI(), os.path.join(repo.root, 'test_2')) repo.add(mp3) self.assertEqual(mp3.getURI(), os.path.join(repo.root, 'test_3'))
def select_devices(self): """Loads the bins and creates the preview areas for the active profile, creating a new mediapacakge.""" logger.info("Setting Devices the new way") self.mediapackage = mediapackage.Mediapackage() self.mediapackage.setTitle("Recording started at " + datetime.datetime.now().replace( microsecond=0).isoformat()) current_profile = self.conf.get_current_profile() bins = current_profile.tracks for objectbin in bins: objectbin['path'] = self.repo.get_attach_path() devices = current_profile.get_video_areas() areas = self.create_drawing_areas(devices) self.error_text = None self.error_dialog = None if self.error_id: logger.info("Error in select devices " + str(self.error_id)) self.dispatcher.disconnect(self.error_id) self.error_id = self.dispatcher.connect("recorder-error", self.handle_pipeline_error) self.audiobar.ClearVumeter() self.record = Recorder(bins, areas) self.record.mute_preview(not self.focus_is_active) return True
def test_duration_add_track(self): mp = mediapackage.Mediapackage() mp.add(self.path_track1, mediapackage.TYPE_TRACK, "presentation/source", None, 532) mp.add(self.path_track2, mediapackage.TYPE_TRACK, "presenter/source", None, 1532) self.assertEqual(mp.getDuration(), 1532)
def test_folder_name_template_no_alphanumeric(self): repo = repository.Repository(self.tmppath, 'test', 'Foo-Bar[!!??]-{hostname}_m{second}') mp = mediapackage.Mediapackage() repo.add(mp) self.assertEqual(mp.getURI(), os.path.join(repo.root, 'FooBar{hostname}_m{second}'.format(hostname="test", second=mp.getDate().strftime('%S'))))
def select_devices(self): """Loads the bins and creates the preview areas for the active profile, creating a new mediapacakge.""" self.configure_profile() logger.info("Setting Devices the new way") now = datetime.datetime.now().replace(microsecond=0) self.mediapackage = mediapackage.Mediapackage( title="Recording started at " + now.isoformat()) context.get_state().mp = self.mediapackage.identifier current_profile = self.conf.get_current_profile() bins = current_profile.tracks for objectbin in bins: objectbin['path'] = self.repo.get_rectemp_path() devices = current_profile.get_video_areas() areas = self.create_drawing_areas(devices) self.bins = bins self.areas = areas if self.error_dialog: if self.error_id: self.dispatcher.disconnect(self.error_id) self.error_id = None self.error_dialog.dialog_destroy() self.error_dialog = None self.error_text = None self.error_id = self.dispatcher.connect("recorder-error", self.handle_pipeline_error) self.audiobar.ClearVumeter() if self.ok_to_show: self.init_recorder() return True
def test_add_after_rec_manual(self): duration = 134 repo = repository.Repository(self.tmppath) mp = mediapackage.Mediapackage() #TODO file extension to mimetype??? bins = [ self.__get_tmp_bin( 't.avi', { 'device': 'test', 'name': 'name1', 'dev': 'dev1', 'flavor': 'presenter' }), self.__get_tmp_bin( 't.mp4', { 'device': 'test', 'name': 'name2', 'dev': 'dev2', 'flavor': 'presentation' }) ] self.assertTrue(mp.manual) repo.add_after_rec(mp, bins, duration) self.assertEqual(mp.getDuration(), duration) self.assertEqual(len(repo), 1) self.assertEqual(len(mp.getTracks()), len(bins))
def test_add_after_rec_no_manual(self): duration = 134 repo = repository.Repository(self.tmppath) mp = mediapackage.Mediapackage() repo.add(mp) mp.addAttachmentAsString( 'capture.device.names=name1,name3', name='org.opencastproject.capture.agent.properties', identifier='org.opencastproject.capture.agent.properties') mp.manual = False #TODO file extension to mimetype??? bins = [ self.__get_tmp_bin( 't.avi', { 'device': 'test', 'name': 'name1', 'dev': 'dev1', 'flavor': 'presenter' }), self.__get_tmp_bin( 't.mp4', { 'device': 'test', 'name': 'name2', 'dev': 'dev2', 'flavor': 'presentation' }) ] self.assertFalse(mp.manual) repo.add_after_rec(mp, bins, duration) self.assertEqual(mp.getDuration(), duration) self.assertEqual(len(repo), 1) self.assertEqual(len(mp.getTracks()), 1)
def test_ingest_nightly_with_params(self): workflow_name = 'GC-fast_workflow' workflow_parameters = 'trimHold:true;' repo = Repository('/tmp/repo_night') dispatcher = Dispatcher() logger = Logger(None) w = worker.Worker(dispatcher, repo, logger, self.client) mp = mediapackage.Mediapackage() repo.add(mp) w.enqueue_nightly_job_by_name( worker.INGEST_CODE, mp, { 'workflow': workflow_name, 'workflow_parameters': workflow_parameters }) dispatcher.emit('timer-nightly') time.sleep(1) # Need time to create zip self.assertEqual(len(self.client.calls), 1) self.assertEqual(self.client.calls[0]['workflow'], workflow_name) self.assertEqual(self.client.calls[0]['workflow_parameters'], workflow_parameters) self.assertEqual(mp.getOpStatus(worker.INGEST_CODE), mediapackage.OP_DONE) rmtree('/tmp/repo_night')
def create_mp(repo, event): if repo.has_key(event['UID']): mp = repo.get(event['UID']) if mp.status != mediapackage.SCHEDULED: return False rewrite = True else: mp = mediapackage.Mediapackage() mp.status = mediapackage.SCHEDULED mp.manual = False mp.properties['workflow_id'] = event['UID'] repo.add(mp) rewrite = False mp.setTitle(event['SUMMARY']) mp.setDate(event['DTSTART'].dt.replace(tzinfo=None)) ca_properties_name = 'org.opencastproject.capture.agent.properties' for attach_enc in event['ATTACH']: attach = base64.b64decode(attach_enc) if attach_enc.params['X-APPLE-FILENAME'] == 'episode.xml': mp.addDublincoreAsString(attach, 'episode.xml', rewrite) elif attach_enc.params['X-APPLE-FILENAME'] == 'series.xml': mp.addSeriesDublincoreAsString(attach, 'series.xml', rewrite) elif attach_enc.params['X-APPLE-FILENAME'] == ca_properties_name: mp.addAttachmentAsString(attach, ca_properties_name, rewrite, ca_properties_name) else: logger.error('call error parse ical attachs %s', attach_enc.params['X-APPLE-FILENAME']) mp.marshalDublincore() repo.update(mp)
def fromXML(xml): # FIXME: xml podria ser un file, o un string con un path. # Ojo si no existe. """ Obter os datos do manifest, e despois do episode e o series """ mp_uri = path.dirname(path.abspath(xml)) mp = mediapackage.Mediapackage(uri=mp_uri) manifest = minidom.parse(xml) principal = manifest.getElementsByTagName("mediapackage") mp.setDuration( principal[0].getAttribute("duration") ) # FIXME check if empty and take out patch in listing.populatetreeview mp.setIdentifier(principal[0].getAttribute("id")) if principal[0].hasAttribute("start"): mp.setDate( datetime.strptime(principal[0].getAttribute("start"), '%Y-%m-%dT%H:%M:%S')) without_galicaster = False try: galicaster = minidom.parse(path.join(mp.getURI(), 'galicaster.xml')) mp.status = int(_checknget(galicaster, "status")) for i in galicaster.getElementsByTagName("operation"): op = unicode(i.getAttribute("key")) status = _checknget(i, "status") mp.setOpStatus(op, int(status)) for i in galicaster.getElementsByTagName("property"): op = unicode(i.getAttribute("name")) value = _checkget(i) mp.properties[op] = unicode(value) except IOError: print "WHITOUT galicaster.xml" without_galicaster = True for etype, tag in mediapackage.MANIFEST_TAGS.items(): for i in manifest.getElementsByTagName(tag): if i.hasAttribute("id"): identifier = unicode(i.getAttribute("id")) else: identifier = None uri = _checknget(i, "url") flavor = unicode(i.getAttribute("type")) mime = _checknget(i, "mimetype") duration = _checknget(i, "duration") mp.add(_getElementAbsPath(uri, mp.getURI()), etype, flavor, mime, duration, identifier) if uri == 'org.opencastproject.capture.agent.properties' and etype == mediapackage.TYPE_ATTACHMENT: mp.manual = False if etype == mediapackage.TYPE_TRACK and mp.status == mediapackage.NEW and without_galicaster: mp.status = mediapackage.RECORDED mp.marshalDublincore() return mp
def test_ingest_manual(self): mp = mediapackage.Mediapackage(uri='/tmp') mp.manual = True self.worker._ingest(mp) self.assertEqual(self.client.calls[0]['workflow'], None) self.assertEqual(self.client.calls[0]['workflow_instance'], None) self.assertEqual(self.client.calls[0]['workflow_parameters'], None)
def test_add_tracks(self): mp = mediapackage.Mediapackage() file_path = path.join(self.baseDir, 'SCREEN.mpeg') mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source') file_path = path.join(self.baseDir, 'CAMERA.mpeg') mp.add(file_path, mediapackage.TYPE_TRACK, 'presentation/source') file_path = path.join(self.baseDir, 'episode.xml') mp.add(file_path, mediapackage.TYPE_CATALOG, 'dublincore/episode') self.assertEqual(len(mp.getElements()), 3)
def default_mediapackage(self): global config now = datetime.now().replace(microsecond=0) title = "Recording started at " + now.isoformat() mp = mediapackage.Mediapackage(title=title) if (context): mp.setSeries( {'identifier': context.get_conf().get('series', 'default')}) return mp
def test_bad_delete(self): repo = repository.Repository(self.tmppath) mp = mediapackage.Mediapackage() mp.add(self.track1) mp.add(self.track2) mp.add(self.catalog) mp.metadata_episode["title"] = "Title" self.assertRaises(KeyError, repo.delete, mp)
def test_add(self): repo = repository.Repository(self.tmppath) mp = mediapackage.Mediapackage() mp.add(self.track1) mp.add(self.track2) mp.add(self.catalog) repo.add(mp) self.assertRaises(KeyError, repo.add, mp) self.assertEqual(repo.size(), 1)
def test_ingest_no_manual_only_workflow(self): mp = mediapackage.Mediapackage(identifier='1', uri='/tmp') mp.addAttachmentAsString( 'org.opencastproject.workflow.definition=mini-full', name='org.opencastproject.capture.agent.properties', identifier='org.opencastproject.capture.agent.properties') mp.manual = False self.worker._ingest(mp) self.assertEqual(self.client.calls[0]['workflow'], 'mini-full') self.assertEqual(self.client.calls[0]['workflow_instance'], '1') self.assertEqual(self.client.calls[0]['workflow_parameters'], {})
def setUp(self): self.logger_filename = '/tmp/galicaster_test.log' self.repo = self.RepoMock() self.client = self.OCHTTPClientMock() self.dispatcher = self.DispatcherMock() self.logger = Logger(self.logger_filename) self.worker = worker.Worker(self.dispatcher, self.repo, self.logger, self.client) self.repo1 = Repository() self.mp = mediapackage.Mediapackage() self.repo1.add(self.mp)
def test_operation_status(self): mp = mediapackage.Mediapackage() mp.add(self.track1) mp.operation["ingest"] = 4 mp.marshalDublincore() da = minidom.parseString(serializer.set_properties(mp)) name = "key:ingest" try: self.assertEqual(da.getElementsByTagName(name)[0].firstChild.wholeText.strip().strip("\n"), da.getElementsByTagName(name)[0].firstChild.wholeText.strip().strip("\n")) except IndexError: pass
def start_rapidrec_recording(): logger.info("Start rapidrec recording") now = datetime.datetime.now().replace(microsecond=0) title = "RapidRec started at {0}".format(now.isoformat()) # Create mediapackage mp = mediapackage.Mediapackage(title=title, date=now) # Start recording recorder.record(mp)
def select_devices(self): """Loads the bins and creates the preview areas for the active profile, creating a new mediapacakge.""" self.configure_profile() logger.info("Setting Devices the new way") now = datetime.datetime.now().replace(microsecond=0) self.mediapackage = mediapackage.Mediapackage(title=_("Recording started at {0}").format(now.isoformat())) context.get_state().mp = self.mediapackage.identifier if self.ok_to_show: self.init_recorder() self.error_handle_id = None return False
def test_manual(self): repo = self.RepoMock() client = self.MHHTTPClientMock() dispatcher = self.DispatcherMock() w = worker.Worker(dispatcher, repo, client) mp = mediapackage.Mediapackage(uri='/tmp') mp.manual = True w._ingest(mp) self.assertEqual(client.calls[0]['workflow'], None) self.assertEqual(client.calls[0]['workflow_instance'], None) self.assertEqual(client.calls[0]['workflow_parameters'], None)
def test_repo_lifecycle(self): repo = repository.Repository(self.tmppath) mp = mediapackage.Mediapackage() mp.title = 'lifecycle test MP' self.assertEqual(len(repo), 0) repo.add_after_rec(mp, [], 30) self.assertEqual(len(repo), 1) for catalog in mp.getCatalogs(): self.assertEqual(mp.getURI(), os.path.dirname(catalog.getURI())) self.assertTrue(os.path.isfile(catalog.getURI()), 'The catalog path {0} not exists'.format(catalog.getURI()))
def test_ingest_no_manual(self): mp = mediapackage.Mediapackage(identifier='1', uri='/tmp') mp.add(self.path_capture_agent_properties, mediapackage.TYPE_ATTACHMENT, identifier='org.opencastproject.capture.agent.properties') mp.manual = False self.worker._ingest(mp) self.assertEqual(self.client.calls[0]['workflow'], 'full') self.assertEqual(self.client.calls[0]['workflow_instance'], '1') self.assertEqual(self.client.calls[0]['workflow_parameters'], { 'trimHold': 'false', 'captionHold': 'false' })
def test_no_manual(self): repo = self.RepoMock() client = self.MHHTTPClientMock() dispatcher = self.DispatcherMock() w = worker.Worker(dispatcher, repo, client) mp = mediapackage.Mediapackage(uri='/tmp') mp.properties['workflow_id'] = "1" mp.add(self.path_capture_agent_properties, mediapackage.TYPE_ATTACHMENT, identifier='org.opencastproject.capture.agent.properties') mp.manual = False w._ingest(mp) self.assertEqual(client.calls[0]['workflow'], 'full') self.assertEqual(client.calls[0]['workflow_instance'], '1') self.assertEqual(client.calls[0]['workflow_parameters'], {'trimHold': 'false', 'captionHold': 'false'})
def test_delete(self): repo = repository.Repository(self.tmppath) mp = mediapackage.Mediapackage() mp.add(self.track1) mp.add(self.track2) mp.add(self.catalog) mp.metadata_episode["title"] = "Title" repo.add(mp) self.assertEqual(repo.size(), 1) repo.delete(mp) self.assertEqual(repo.size(), 0) self.assertEqual(len(os.listdir(self.tmppath)), 1) #attach
def test_save_in_zip(self): mp = mediapackage.Mediapackage() mp.add(self.track1) mp.add(self.track2) mp.add(self.catalog) mp.marshalDublincore() da = minidom.parseString(serializer.set_episode(mp)) db = minidom.parse(self.path_catalog) for name in ["dcterms:title", "dcterms:identifier", "dcterms:created"]: try: self.assertEqual(da.getElementsByTagName(name)[0].firstChild.wholeText.strip().strip("\n"), db.getElementsByTagName(name)[0].firstChild.wholeText.strip().strip("\n")) except IndexError: continue
def test_ingest_nightly(self): repo = Repository('/tmp/repo_night') dispatcher = Dispatcher() logger = Logger(None) w = worker.Worker(dispatcher, repo, logger, self.client) mp = mediapackage.Mediapackage() mp.setOpStatus(worker.INGEST_CODE, mediapackage.OP_NIGHTLY) repo.add(mp) dispatcher.emit('timer-nightly') time.sleep(1) # Need time to create zip self.assertEqual(len(self.client.calls), 1) self.assertEqual(mp.getOpStatus(worker.INGEST_CODE), mediapackage.OP_DONE) rmtree('/tmp/repo_night')