コード例 #1
0
ファイル: videomeet.py プロジェクト: bowu8/anwen
    def get(self):
        """Renders the main page. When this page is shown, we create a new
        channel to push asynchronous updates to the client."""
        room_key = sanitize(self.get_argument('r', None))
        debug = self.get_argument('debug', None)
        unittest = self.get_argument('unittest', None)
        stun_server = self.get_argument('ss', None)
        turn_server = self.get_argument('ts', None)
        hd_video = self.get_argument('hd', 'true')
        ts_pwd = self.get_argument('tp', None)
        # set compat to true by default.
        compat = self.get_argument('compat', 'true')
        if debug == 'loopback':
        # set compat to false as DTLS does not work for loopback.
            compat = 'false'

        # token_timeout for channel creation, default 30min, max 2 days, min 3min.
        # token_timeout = self.request.get_range('tt',
        #                                        min_value = 3,
        #                                        max_value = 3000,
        #                                        default = 30)
        if unittest:
            # Always create a new room for the unit tests.
            room_key = generate_random(8)

        if not room_key:
            room_key = generate_random(8)
            redirect = '?r=' + room_key
            redirect = append_url_arguments(self.request, redirect)
            self.redirect(redirect)
            logging.info('Redirecting visitor to base URL to ' + redirect)
            return

        user = None
        initiator = 0
        with LOCK:
            # room = None
            room = Room.by_room_key(room_key)
            if not room and debug != "full":
                # New room.
                user = generate_random(8)
                if debug == 'loopback':
                    initiator = 1
                    info = 'user0 %s added to test room %s' % (user, room_key)
                    logger.debug(info)
                else:
                    initiator = 0
                    room = Room.new({'room_key': room_key})
                    room.add_user(user)
                    info = 'user1 %s added to new room %s' % (user, room_key)
                    logger.debug(info)
            elif room and room.get_occupancy() == 1 and debug != 'full':
                # 1 occupant.
                user = generate_random(8)
                room.add_user(user)
                info = 'user2 %s added to room %s' % (user, room_key)
                logger.debug(info)
                initiator = 1
            else:
                # 2 occupants (full).
                template = jinja_environment.get_template('full.html')
                self.write(
                    template.render({'room_key': room_key}))
                info = 'room %s is full' % (room_key)
                logger.debug(info)
                return
        room_link = 'http://%s/videomeet?r=%s' % (self.request.host, room_key)
        room_link = append_url_arguments(self.request, room_link)
        pc_config = make_pc_config(stun_server, turn_server, ts_pwd)
        pc_constraints = make_pc_constraints(compat)
        offer_constraints = make_offer_constraints(compat)
        media_constraints = make_media_constraints(hd_video)
        template_values = {
            'me': user,
            'room_key': room_key,
            'room_link': room_link,
            'initiator': initiator,
            'pc_config': json.dumps(pc_config),
            'pc_constraints': json.dumps(pc_constraints),
            'offer_constraints': json.dumps(offer_constraints),
            'media_constraints': json.dumps(media_constraints)
        }
        if unittest:
            target_page = 'test/test_' + unittest + '.html'
        else:
            target_page = 'videomeet.html'

        template = jinja_environment.get_template(target_page)
        self.write(template.render(template_values))