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)
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})
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)