예제 #1
0
def video_api(room_name, video_index=None):
    user = users.get_current_user()
    if flask.request.method == 'GET':
        room = Room.fetch_by_name(room_name)
        if room is None:
            return json_fail(Reason.NO_ROOM_FOUND)
        if video_index is None:
            return json_response(room.video_ids)
        elif video_index >= len(room.video_ids):
            return json_fail(Reason.INVALID_PARAMETER)
        else:
            return json_response(room.video_ids[video_index])
    elif flask.request.method == 'POST':
        if not user:
            return json_fail(Reason.LOGIN_REQUIRED)
        room = Room.fetch_by_name(room_name)
        if room is None:
            return json_fail(Reason.NO_ROOM_FOUND)
        if user.email() != room.creator_email:
            return json_fail(Reason.FORBIDDEN_OPERATION)

        video_info = flask.request.get_json(silent=True)
        if video_info is None or "id" not in video_info:
            return json_fail(Reason.INVALID_PARAMETER)
        room.video_ids.append(video_info["id"]);
        room.put()
        return json_succ()
    elif flask.request.method == 'PUT':
        if not user:
            return json_fail(Reason.LOGIN_REQUIRED)
        room = Room.fetch_by_name(room_name)
        if room is None:
            return json_fail(Reason.NO_ROOM_FOUND)
        if user.email() != room.creator_email:
            return json_fail(Reason.FORBIDDEN_OPERATION)

        video_action = flask.request.get_json(silent=True)
        if video_action is None:
            return json_fail(Reason.INVALID_PARAMETER)
        if "op" not in video_action or "current_time" not in video_action or "roundtrip" not in video_action:
            return json_fail(Reason.INVALID_PARAMETER)
        if video_action["op"] not in ['NOTSTARTED', 'PAUSED', 'PLAYING', 'ENDED']:
            return json_fail(Reason.INVALID_PARAMETER)
        room.state = video_action["op"]
        # Save current_time+roundtrip/2 and last updated time. 
        # When read, it'll be now()-last_updated_time+current_time+roundtrip/2
        room.current_time = int(int(video_action["current_time"]) + float(video_action["roundtrip"])/2)
        room.put()
        return json_succ()
    elif flask.request.method == 'DELETE':
        if not user:
            return json_fail(Reason.LOGIN_REQUIRED)
        room = Room.fetch_by_name(room_name)
        if room is None:
            return json_fail(Reason.NO_ROOM_FOUND)
        if user.email() != room.creator_email:
            return json_fail(Reason.FORBIDDEN_OPERATION)

        #could only remove video_id at 0
        video_index = int(video_index)
        if video_index != 0:
            return json_fail(Reason.INVALID_PARAMETER)
        logging.info('delete_video(%s:%d):%s'%(room_name,video_index,room.__class__.__name__))
        room.video_ids = room.video_ids[1:]
        room.put()
        return json_succ()
    else:
        return json_fail(Reason.INVALID_PARAMETER)
예제 #2
0
def video_sync_api(room_name):
    room = Room.fetch_by_name(room_name)
    if room is None:
        return json_fail(Reason.NO_ROOM_FOUND)
    update_current_time(room)
    return json_response({"current_time":room.current_time})
예제 #3
0
def room_api(room_name=None):
    user = users.get_current_user()
    if flask.request.method == 'GET':
        if room_name is None:
            rooms = []
            if not user:
                rooms = Room.fetch_all_anonymous()
            else:
                rooms = Room.fetch_all()
            for room in rooms:
                update_current_time(room)
            return json_response([room.to_dict() for room in rooms])
        else:
            room = Room.fetch_by_name(room_name)
            if room is None:
                return json_fail(Reason.NO_ROOM_FOUND)
            update_current_time(room)
            return json_response(room.to_dict()) 
    elif flask.request.method == 'POST':
        if not user:
            return json_fail(Reason.LOGIN_REQUIRED)
        else:
            room_info = flask.request.get_json(silent=True)
            if room_info is None:
                return json_fail(Reason.INVALID_PARAMETER)

            if "name" not in room_info:
                return json_fail(Reason.ROOM_NAME_REQUIRED)

            room = Room.fetch_by_name(room_info["name"])
            logging.info('create_room(%s):%s'%(room_info["name"],room.__class__.__name__))
            if room is not None:
                return json_fail(Reason.EXIST_ROOM_NAME)

            room = Room(creator_email=user.email(), name=room_info["name"])
            if "current_time" in room_info:
                room.current_time=int(room_info["current_time"])
            if "cover" in room_info:
                room.cover=room_info["cover"]
            room.put()
            update_current_time(room)
            return json_succ(data=room.to_dict())
    elif flask.request.method == 'PUT':
        if not user:
            return json_fail(Reason.LOGIN_REQUIRED)

        room = Room.fetch_by_name(room_name)
        logging.info('update_room(%s):%s'%(room_name,room.__class__.__name__))
        if room is None:
            return json_fail(Reason.NO_ROOM_FOUND)
        if user.email() != room.creator_email:
            return json_fail(Reason.FORBIDDEN_OPERATION)

        room_info = flask.request.get_json(silent=True)
        if room_info is None:
            return json_fail(Reason.INVALID_PARAMETER)

        if "current_time" in room_info:
            room.current_time=int(room_info["current_time"])
        if "cover" in room_info:
            room.cover=room_info["cover"]
        room.put()
        return json_succ()
    elif flask.request.method == 'DELETE':
        if not user:
            return json_fail(Reason.LOGIN_REQUIRED)

        room = Room.fetch_by_name(room_name)
        logging.info('delete_room(%s):%s'%(room_name,room.__class__.__name__))
        if room is not None:
            if user.email() != room.creator_email:
                return json_fail(Reason.FORBIDDEN_OPERATION)
            else:
                room.key.delete()
                return json_succ()
        else:
            return json_fail(Reason.NO_ROOM_FOUND, room_name)

    else:
        return json_fail(Reason.INVALID_PARAMETER)