/** * display available recording, if any * * This function retrieves the list of available recordings from the BBB server, * and displays it to the surfer. */ function get_view_text_extension() { global $context; // parameters to list recordings $parameters = array(); $parameters[] = 'meetingID=' . urlencode($this->attributes['id']); // link to list recordings $url = $this->build_link('getRecordings', $parameters); // query the BBB back-end if (($response = http::proceed_natively($url)) && ($xml = simplexml_load_string($response)) && $xml->returncode == 'SUCCESS') { // ok, we have some recording available if ($recordings = $xml->recordings->children()) { // enumerate recordings, but use only the first one foreach ($recordings as $name => $node) { // sanity checks if ($name != 'recording') { continue; } if (!isset($node->playback)) { continue; } if (!isset($node->playback->format)) { continue; } if (!isset($node->playback->format->url)) { continue; } // a button to start the replay in a separate window $menu = array(); $menu[] = Skin::build_link((string) $node->playback->format->url, 'Play the presentation', 'tee'); return Skin::build_box('Presentation', Skin::finalize_list($menu, 'menu_bar')); } } } }
/** * the URL to start and to join the event * * @see overlays/events/start.php * * @return string the URL to redirect the user to the meeting, or NULL on error */ function get_start_url() { global $context; // create an OpenTok session if (isset($context['opentok_api_key']) && $context['opentok_api_key']) { // server to connect to if (isset($context['opentok_api_url']) && $context['opentok_api_url']) { $url = $context['opentok_api_url']; } else { $url = 'https://staging.tokbox.com/hl'; } // link to create a session $url .= '/session/create'; // authenticate through HTTP headers $headers = array('X-TB-PARTNER-AUTH: ' . $context['opentok_api_key'] . ':' . $context['opentok_api_secret']); // parameters of this session $parameters = array(); $parameters['api_key'] = $context['opentok_api_key']; $parameters['location'] = $_SERVER['REMOTE_ADDR']; // get a new session id if ($response = http::proceed_natively($url, $headers, $parameters)) { // invalid xml response if (!($xml = @simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA))) { Logger::error(sprintf('OpenTok: %s', 'response is not valid XML')); return NULL; // error code returned by the server } elseif ($errors = $xml->xpath("//error")) { if ($message = $errors[0]->xpath("//@message")) { $message = (string) $message[0]['message']; } else { $message = 'unknown error'; } Logger::error(sprintf('OpenTok: %s', $xml->error['code'] . ' ' . $xml->error->children()->getName() . ': ' . $message)); return NULL; // no session id in the response } elseif (!isset($xml->Session->session_id)) { Logger::error(sprintf('OpenTok: %s', 'no session id has been provided')); return NULL; } // save the session id along averlay data and forward it to all participants $fields = array('session_id' => (string) $xml->Session->session_id); $this->set_values($fields); } } // redirect to the main page if (is_object($this->anchor)) { return $context['url_to_home'] . $context['url_to_root'] . $this->anchor->get_url(); } // problem, darling! return NULL; }
/** * use oEmbed to embed some object * * @link http://oembed.com/ the specification of the oEmbed protocol * * The strategy to find oEmbed data is the following: * - list of well-known services (e.g., slideshare, ...) * - sense the target url in case an oEmbed endpoint is provided * - submit the url to http://www.noembed.com/ * * The array returned reflects the outcome of the oEmbed transaction. * If a network error takes place, the type is set to 'error'. * * @param string the address of the object to embed * @return array attributes returned by provider */ public static function oembed($url) { global $context; // we return an array of results $result = array(); // the list of known endpoints $endpoints = array(); // type: video $endpoints['https?://(www\\.)?youtube\\.com/watch\\?'] = 'http://www.youtube.com/oembed'; $endpoints['http://youtu\\.be/'] = 'http://www.youtube.com/oembed'; $endpoints['https?://(www\\.)?vimeo\\.com/'] = 'http://vimeo.com/api/oembed.json'; $endpoints['http://revision3\\.com/'] = 'http://revision3.com/api/oembed/'; $endpoints['http://(www\\.)?5min\\.com/video/'] = 'http://api.5min.com/oembed.json'; $endpoints['http://(www\\.)?dotsub\\.com/view/'] = 'http://dotsub.com/services/oembed'; $endpoints['https?://(www\\.)?hulu\\.com/watch/'] = 'http://www.hulu.com/api/oembed.json'; $endpoints['https?://(www\\.)?dailymotion\\.com/'] = 'http://www.dailymotion.com/services/oembed/'; $endpoints['http://[^\\.]+\\.blip\\.tv/'] = 'http://blip.tv/oembed/'; $endpoints['http://blip\\.tv/'] = 'http://blip.tv/oembed/'; $endpoints['https?://(www\\.)?viddler\\.com/'] = 'http://lab.viddler.com/services/oembed/'; // type: photo (or file) $endpoints['https?://(www\\.)?flickr\\.com/'] = 'http://www.flickr.com/services/oembed/'; $endpoints['http://flic\\.kr/'] = 'http://www.flickr.com/services/oembed/'; $endpoints['http://[^\\.]+\\.deviantart\\.com/'] = 'http://backend.deviantart.com/oembed'; $endpoints['http://yfrog\\.'] = 'http://www.yfrog.com/api/oembed'; $endpoints['https?://(www\\.)?smugmug\\.com/'] = 'http://api.smugmug.com/services/oembed/'; $endpoints['http://[^\\.]+\\.photobucket\\.com/'] = 'http://photobucket.com/oembed'; // type: rich $endpoints['https?://[^\\.]+\\.twitter\\.com/.+?/status(es)?/'] = 'https://api.twitter.com/1/statuses/oembed.json'; $endpoints['https?://twitter\\.com/.+?/status(es)?/'] = 'https://api.twitter.com/1/statuses/oembed.json'; $endpoints['http://official\\.fm/'] = 'http://official.fm/services/oembed.json'; $endpoints['http://soundcloud\\.com/'] = 'http://soundcloud.com/oembed'; $endpoints['http://rd\\.io/'] = 'http://www.rdio.com/api/oembed/'; $endpoints['https?://(www\\.)?slideshare\\.net/'] = 'http://www.slideshare.net/api/oembed/2'; $endpoints['https?://(www\\.)?scribd\\.com/'] = 'http://www.scribd.com/services/oembed'; // look at each providers $endpoint = null; foreach ($endpoints as $pattern => $api) { // stop when one provider has been found if (preg_match('/' . str_replace('/', '\\/', $pattern) . '/i', $url)) { $endpoint = $api; break; } } // finalize the query for the matching endpoint if ($endpoint) { // prepare the oEmbed request $parameters = array(); $parameters[] = 'url=' . urlencode($url); $parameters[] = 'maxwidth=500'; $parameters[] = 'format=json'; // encode provided data, if any $endpoint .= '?' . implode('&', $parameters); // else try to auto-detect an endpoint } elseif ($content = http::proceed_natively($url)) { // it is not necessary to look at page content $content = substr($content, 0, stripos($content, '</head>')); // if the endpoint signature is found if (stripos($content, 'application/json+oembed') !== FALSE) { // extract all links if (preg_match_all('/<link([^<>]+)>/i', $content, $links)) { // look at each of them sequentially foreach ($links[1] as $link) { // not the oEmbed endpoint! if (!stripos($link, 'application/json+oembed')) { continue; } // got it! if (preg_match('/href="([^"]+)"/i', $link, $matches)) { $endpoint = trim($matches[1]); break; } } } } } // if no provider has been found, submit this url to noembed.com if (!$endpoint) { // prepare the oEmbed request $parameters = array(); $parameters[] = 'url=' . urlencode($url); $parameters[] = 'maxwidth=500'; $parameters[] = 'format=json'; // encode provided data, if any $endpoint = 'http://noembed.com/embed?' . implode('&', $parameters); } // do the transaction if (!($response = http::proceed_natively($endpoint))) { $result['type'] = 'error'; return $result; // decode the received snippet } else { include_once $context['path_to_root'] . 'included/json.php'; if (!($data = json_decode2($response))) { $result['type'] = 'error'; return $result; } // return data to caller foreach ($data as $name => $value) { $result[$name] = $value; } // ensure that type is set if (!isset($result['type'])) { $result['type'] = 'error'; } } // job done return $result; }
/** * stop a phone call * * @param array e.g., array('call_id' => '123') * @return mixed some error array with code and message, or the id of the stopped call */ function release($parameters) { global $context; // do we have some API key? if (!isset($context['obs_api_key'])) { return array('code' => -32000, 'message' => 'Missing credentials to use OBS API'); } // look for a call id if (empty($parameters['call_id'])) { return array('code' => -32602, 'message' => 'Invalid parameter "call_id"'); } // data to be submitted to OBS $data = array(); $data[] = 'id=' . urlencode($context['obs_api_key']); $data[] = 'call_id=' . urlencode($parameters['call_id']); // build the endpoint to invoke $url = self::build_obs_link('call/releaseCall', $data); // do release the call if (!($response = http::proceed_natively($url))) { return array('code' => -32603, 'message' => 'Unable to query the OBS API'); } // ensure we receive correct xml if (!($xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA))) { return array('code' => -32603, 'message' => 'Invalid response from OBS API'); } // stop on error if ($xml->status->status_code != 200) { return array('code' => -32000, 'message' => 'Error: ' . $xml->status->status_code . ' ' . $xml->status->status_msg); } // look for call id if (!($id = $xml->call_info->call_id)) { return array('code' => -32603, 'message' => 'Invalid response from OBS API'); } // provide id back to caller return array('call_id' => (string) $id); }
if (isset($context['opentok_api_url']) && $context['opentok_api_url']) { $url = $context['opentok_api_url']; } else { $url = 'https://staging.tokbox.com/hl'; } // link to create a session $url .= '/session/create'; // authenticate through HTTP headers $headers = array('X-TB-PARTNER-AUTH: ' . $context['opentok_api_key'] . ':' . $context['opentok_api_secret']); // parameters of this session $parameters = array(); $parameters['api_key'] = $context['opentok_api_key']; $parameters['location'] = $_SERVER['REMOTE_ADDR']; // $parameters['p2p.preference'] = 'enabled'; // get a new session id if (!($response = http::proceed_natively($url, $headers, $parameters))) { Logger::error(sprintf('OpenTok: %s', 'response is not valid XML')); } elseif (!($xml = @simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA))) { Logger::error(sprintf('OpenTok: %s', 'response is not valid XML')); } elseif ($errors = $xml->xpath("//error")) { if ($message = $errors[0]->xpath("//@message")) { $message = (string) $message[0]['message']; } else { $message = 'unknown error'; } Logger::error(sprintf('OpenTok: %s', $xml->error['code'] . ' ' . $xml->error->children()->getName() . ': ' . $message)); // no session id in the response } elseif (!isset($xml->Session->session_id)) { Logger::error(sprintf('OpenTok: %s', 'no session id has been provided')); } else { // save the pair meeting id - OpenTok id in a text file