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'])
Exemple #2
0
    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'])
Exemple #4
0
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)
Exemple #5
0
    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'])
Exemple #6
0
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)
Exemple #8
0
    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)
Exemple #9
0
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)
Exemple #11
0
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
Exemple #12
0
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
Exemple #13
0
    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)
Exemple #14
0
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)
Exemple #15
0
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)
Exemple #16
0
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)