def test_status(self): stream = Stream('test_url', 'test_description') db_session.add(stream) db_session.commit() rv = self.app.get('/streams/{0}/status'.format(stream.id + 1)) self.assertEqual(rv.status_code, 404) rv = self.app.get('/streams/{0}/status'.format(stream.id)) janswer = json.loads(rv.data) self.assertEqual(janswer['url'], 'test_url') self.assertEqual(janswer['description'], 'test_description') self.assertIsNotNone(janswer['create_date']) self.assertIsNone(janswer['start_date']) self.assertIsNone(janswer['stop_date']) self.assertIsNotNone(janswer['status']) stream = Stream.query.get(stream.id) stream.start_date = datetime.datetime.now() stream.stop_date = datetime.datetime.now() db_session.commit() rv = self.app.get('/streams/{0}/status'.format(stream.id)) janswer = json.loads(rv.data) self.assertIsNotNone(janswer['start_date']) self.assertIsNotNone(janswer['stop_date'])
def test_clip(self): stream = Stream('test_url', 'test_description') stream.start_date = datetime.datetime.now() stream.stop_date = datetime.datetime.now() db_session.add(stream) db_session.commit() rv = self.app.get('/streams/{0}/get_clip'.format(stream.id + 1)) self.assertEqual(rv.status_code, 404) rv = self.app.get('/streams/{0}/get_clip?start=123'.format(stream.id)) janswer = json.loads(rv.data) status = janswer['status'] self.assertEqual(status, 'pending') attempt = 10 while status != 'done': time.sleep(1) rv = self.app.get('/streams/{0}/get_clip?start=123'.format(stream.id)) janswer = json.loads(rv.data) status = janswer['status'] self.assertTrue(attempt, 'Timeout') attempt -= 1 self.assertTrue(janswer['clips']) for clip in janswer['clips']: self.assertTrue(os.path.exists(clip['link'])) os.remove(clip['link'])
def process_request(request_id, test): """ Start to process clip request. Params: -r <request_id> """ if test: print '!!! TEST REQUEST PROCESSING !!!' current_app.config.from_object('tests.test_settings') init_app(current_app) print current_app.config['DATABASE_URI'] r = ClipRequest.query.get(request_id) if r == None: get_logger().error("Request %s not found", request_id) else: r.start_processing_date = datetime.now() db_session.commit() get_logger().info("Start to process request %s", request_id) s = Seamstress(StorageProxy(current_app.config), current_app.config['TEMP_FOLDER'], current_app.config['RESULT_CLIPS_FOLDER'], current_app.config['FFMPEG_BIN']) output_files = s.compile_clip(r.stream_id, r.start, r.stop, r.id) r.done_date = datetime.now() for o in output_files: link = ClipLink(os.path.join(current_app.config['DOWNLOAD_LINK_PREFIX'], o.split('/')[-1]), os.path.join(current_app.config['RESULT_CLIPS_FOLDER'], o)) r.links.append(link) db_session.commit() get_logger().info("Finish to process request %s", request_id)
def test_clip(self): stream = Stream('test_url', 'test_description') stream.start_date = datetime.datetime.now() stream.stop_date = datetime.datetime.now() db_session.add(stream) db_session.commit() rv = self.app.get('/streams/{0}/get_clip'.format(stream.id + 1)) self.assertEqual(rv.status_code, 404) rv = self.app.get('/streams/{0}/get_clip?start=123'.format(stream.id)) janswer = json.loads(rv.data) status = janswer['status'] self.assertEqual(status, 'pending') attempt = 10 while status != 'done': time.sleep(1) rv = self.app.get('/streams/{0}/get_clip?start=123'.format( stream.id)) janswer = json.loads(rv.data) status = janswer['status'] self.assertTrue(attempt, 'Timeout') attempt -= 1 self.assertTrue(janswer['clips']) for clip in janswer['clips']: self.assertTrue(os.path.exists(clip['link'])) os.remove(clip['link'])
def get_clip(stream_id): stream = Stream.query.get(stream_id) if stream: if not stream.start_date: return jsonify(error_message='Stream not started'), 500 else: if request.method == 'POST': start = request.form.get('start') stop = request.form.get('stop') else: start = request.args.get('start') stop = request.args.get('stop') start = convert_to_datetime( int(start)) if start else stream.start_date if stop: stop = convert_to_datetime(int(stop)) else: if stream.stop_date != None: stop = stream.stop_date else: stop = datetime.now() clip_request = ClipRequest.query.filter( ClipRequest.stream_id == stream_id, ClipRequest.start == start, ClipRequest.stop == stop).first() if not clip_request: clip_request = ClipRequest(stream_id, start, stop) db_session.add(clip_request) db_session.commit() get_logger().info( "Clip request %d for stream %d (%s - %s) created", clip_request.id, stream_id, start, stop) pop_params = [ 'python', 'manage.py', 'process_request', '-r', str(clip_request.id) ] if current_app.config['TESTING']: pop_params += ['-t', 'True'] pop = Popen(pop_params) if not clip_request.start_processing_date: result = {'status': 'pending'} elif not clip_request.done_date: result = {'status': 'processing'} else: clips = [{'link': link.url} for link in clip_request.links] result = {'status': 'done', 'clips': clips} return jsonify(**result) else: return jsonify(error_message='Stream not found'), 404
def test_list(self): rv = self.app.get('/streams/') janswer = json.loads(rv.data) self.assertEqual(len(janswer['result']), 0) stream = Stream('test_url', 'test description') db_session.add(stream) db_session.commit() rv = self.app.get('/streams/') janswer = json.loads(rv.data) self.assertEqual(len(janswer['result']), 1)
def get_clip(stream_id): stream = Stream.query.get(stream_id) if stream: if not stream.start_date: return jsonify(error_message='Stream not started'), 500 else: if request.method == 'POST': start = request.form.get('start') stop = request.form.get('stop') else: start = request.args.get('start') stop = request.args.get('stop') start = convert_to_datetime(int(start)) if start else stream.start_date if stop: stop = convert_to_datetime(int(stop)) else: if stream.stop_date != None: stop = stream.stop_date else: stop = datetime.now() clip_request = ClipRequest.query.filter(ClipRequest.stream_id==stream_id, ClipRequest.start==start, ClipRequest.stop==stop).first() if not clip_request: clip_request = ClipRequest(stream_id, start, stop) db_session.add(clip_request) db_session.commit() get_logger().info("Clip request %d for stream %d (%s - %s) created", clip_request.id, stream_id, start, stop) pop_params = ['python', 'manage.py', 'process_request', '-r', str(clip_request.id)] if current_app.config['TESTING']: pop_params += ['-t', 'True'] pop = Popen(pop_params) if not clip_request.start_processing_date: result = {'status': 'pending'} elif not clip_request.done_date: result = {'status': 'processing'} else: clips = [{ 'link': link.url } for link in clip_request.links] result = {'status': 'done', 'clips': clips} return jsonify(**result) else: return jsonify(error_message='Stream not found'), 404
def test_start(self): stream1 = Stream('test_url_1', 'test_description_1') stream2 = Stream('test_url_2', 'test_description_2') stream2.start_date = datetime.datetime.now() db_session.add(stream1) db_session.add(stream2) db_session.commit() rv = self.app.post('/streams/{0}/start'.format(stream1.id)) self.assertEqual(rv.status_code, 200) stream1 = Stream.query.get(stream1.id) self.assertIsNotNone(stream1.start_date) rv = self.app.post('/streams/{0}/start'.format(stream2.id)) self.assertEqual(rv.status_code, 500) rv = self.app.post('/streams/{0}/start'.format(stream2.id + 1)) self.assertEqual(rv.status_code, 404)
def start(stream_id): stream = Stream.query.get(stream_id) if stream: if stream.start_date: return jsonify(error_message='Stream already started'), 500 else: if segmentor_proxy.start(stream.id, stream.url): stream.start_date = datetime.now() db_session.commit() get_logger().info("Stream %d started", stream.id) return jsonify(result='ok') else: get_logger().error("Cannot start stream %d", stream.id) return jsonify(error_message='Cannot start stream'), 500 else: return jsonify(error_message='Stream not found'), 404
def create(): if request.json: url = request.json.get('url') description = request.json.get('description') else: url = request.form.get('url') description = request.form.get('description') if not url: return jsonify(error_message='URL cannot be empty'), 500 else: stream = Stream(url, description) db_session.add(stream) db_session.commit() get_logger().info("Stream %d (url: %s , description: %s) created", stream.id, stream.url, stream.description) return jsonify(stream_id=stream.id)
def clear_old_requests(): """ Clear all old requests """ requests_count = 0 files_count = 0 for request in ClipRequest.query.all(): for link in request.links: if os.path.isfile(link.file_path): os.remove(link.file_path) files_count += 1 db_session.delete(link) db_session.delete(request) requests_count += 1 count = ClipRequest.query.delete() db_session.commit() get_logger().info("Old requests cleared. Deleted: %d requests, %d files", requests_count, files_count) print "Deleted: {0} requests, {1} files".format(requests_count, files_count)