/system/plugins/flickrsilo/flickrsilo.plugin.php
PHP | 993 lines | 770 code | 103 blank | 120 comment | 62 complexity | 3bca9c695fd61b63281723963e691ddf MD5 | raw file
Possible License(s): Apache-2.0
- <?php
- class flickrAPI
- {
- function __construct()
- {
- $this->key = 'cd0ae46b1332aa2bd52ba3063f0db41c';
- $this->secret = '76cf747f70be9029';
- $this->endpoint = 'http://www.flickr.com/services/rest/?';
- $this->authendpoint = 'http://www.flickr.com/services/auth/?';
- $this->uploadendpoint = 'http://api.flickr.com/services/upload/?';
- $this->conntimeout = 20;
- }
- public function sign( $args )
- {
- ksort( $args );
- unset( $args['photo'] );
- $a = '';
- foreach( $args as $key => $value ){
- $a .= $key . $value;
- }
- return md5( $this->secret . $a );
- }
- public function encode( $args )
- {
- $encoded = array();
- foreach ( $args as $key => $value ){
- $encoded[] = urlencode( $key ) . '=' . urlencode( $value );
- }
- return $encoded;
- }
- function call( $method, $args = array () )
- {
- $args = array_merge( array ( 'method' => $method,
- 'api_key' => $this->key ), $args );
- ksort( $args );
- $args = array_merge( $args, array ( 'api_sig' => $this->sign( $args ) ) );
- ksort( $args );
- if ( $method == 'upload' ){
- $req = curl_init();
- $args['api_key'] = $this->key;
- $photo = $args['photo'];
- $args['photo'] = '@' . $photo;
- curl_setopt( $req, CURLOPT_URL, $this->uploadendpoint );
- curl_setopt( $req, CURLOPT_TIMEOUT, 0 );
- // curl_setopt($req, CURLOPT_INFILESIZE, filesize($photo));
- // Sign and build request parameters
- curl_setopt( $req, CURLOPT_POSTFIELDS, $args );
- curl_setopt( $req, CURLOPT_CONNECTTIMEOUT, $this->conntimeout );
- curl_setopt( $req, CURLOPT_FOLLOWLOCATION, 1 );
- curl_setopt( $req, CURLOPT_HEADER, 0 );
- curl_setopt( $req, CURLOPT_RETURNTRANSFER, 1 );
- $this->_http_body = curl_exec( $req );
- if ( curl_errno( $req ) ){
- throw new Exception( curl_error( $req ) );
- }
- curl_close( $req );
- $xml = simplexml_load_string( $this->_http_body );
- $this->xml = $xml;
- return $xml;
- }
- else{
- $url = $this->endpoint . implode( '&', $this->encode( $args ) );
- $call = new RemoteRequest( $url );
- $call->set_timeout( 5 );
-
- try {
- $result = $call->execute();
- }
- catch ( RemoteRequest_Timeout $t ) {
- Session::error( 'Currently unable to connect to Flickr.', 'flickr API' );
- return false;
- }
- catch ( Exception $e ) {
- // at the moment we're using the same error message, though this is more catastrophic
- Session::error( 'Currently unable to connect to Flickr.', 'flickr API' );
- return false;
- }
-
- $response = $call->get_response_body();
- try{
- $xml = new SimpleXMLElement( $response );
- return $xml;
- }
- catch( Exception $e ) {
- Session::error( 'Unable to process Flickr response.', 'flickr API' );
- return false;
- }
- }
- }
- }
- class Flickr extends flickrAPI
- {
- function __construct( $params = array() )
- {
- parent::__construct( $params );
- }
- // URL building
- function getPhotoURL( $p, $size = 'm', $ext = 'jpg' )
- {
- return "http://static.flickr.com/{$p['server']}/{$p['id']}_{$p['secret']}_{$size}.{$ext}";
- }
- // authentication and approval
- public function getFrob()
- {
- $xml = $this->call( 'flickr.auth.getFrob', array() );
- return $xml->frob;
- }
- public function authLink( $frob )
- {
- $params['api_key'] = $this->key;
- $params['frob'] = $frob;
- $params['perms'] = 'write';
- $params['api_sig'] = md5( $this->secret . 'api_key' . $params['api_key'] . 'frob' . $params['frob'] . 'permswrite' );
- $link = $this->authendpoint . implode( '&', $this->encode( $params ) );
- return $link;
- }
- function getToken( $frob )
- {
- $xml = $this->call( 'flickr.auth.getToken', array( 'frob' => $frob ) );
- return $xml;
- }
- // grab the token from our db.
- function cachedToken()
- {
- $token = Options::get( 'flickr_token_' . User::identify()->id );
- return $token;
- }
- // get publicly available photos
- function getPublicPhotos( $nsid, $extras = '', $per_page = '', $page = '' )
- {
- $params = array( 'user_id' => $nsid );
- if ( $extras ){
- $params['extras'] = $extras;
- }
- if ( $per_page ){
- $params['per_page'] = $per_page;
- }
- if ( $page ){
- $params['page'] = $page;
- }
- $xml = $this->call( 'flickr.people.getPublicPhotos' , $params );
- foreach( $xml->photos->attributes() as $key => $value ){
- $pic[$key] = (string)$value;
- }
- $i = 0;
- foreach( $xml->photos->photo as $photo ){
- foreach( $photo->attributes() as $key => $value ){
- $pic['photos'][(string)$photo['id']][$key] = (string)$value;
- }
- $i++;
- }
- return $pic;
- }
- // Photosets methods
- function photosetsGetList( $nsid = '' )
- {
- $params = array();
- if ( $nsid ){
- $params['user_id'] = $nsid;
- }
- $xml = $this->call( 'flickr.photosets.getList', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- return $xml;
- }
- function photosetsGetInfo( $photoset_id )
- {
- $params = array( 'photoset_id' => $photoset_id );
- $xml = $this->call( 'flickr.photosets.getInfo', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- return $xml;
- }
- function photosetGetPrimary( $p, $size = 'm', $ext = '.jpg' )
- {
- return 'http://static.flickr.com/' . $p['server'] . '/' . $p['primary'] . '_' . $p['secret'] . '_' . $size . $ext;
- }
- function photosetsGetPhotos( $photoset_id )
- {
- $params = array( 'photoset_id' => $photoset_id );
- $xml = $this->call( 'flickr.photosets.getPhotos', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- return $xml;
- }
- function photosRecentlyUpdated()
- {
- $params = array();
- if ( $this->cachedToken() ){
- $params['auth_token'] = $this->cachedToken();
- }
- $params['secret'] = $this->secret;
- $params['min_date'] = time() - 31536000; // Within the last year
- $params['per_page'] = 10;
- $xml = $this->call( 'flickr.photos.recentlyUpdated', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- return $xml;
- }
- function mediaSearch( $params = array() )
- {
- if ( $this->cachedToken() ){
- $params['auth_token'] = $this->cachedToken();
- }
- $params['secret'] = $this->secret;
- $params['user_id'] = 'me';
- $params['sort'] = 'date-posted-desc';
- $params['per_page'] = 20;
- $xml = $this->call( 'flickr.photos.search', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- return $xml;
- }
- function photosSearch( $params = array() )
- {
- if ( $this->cachedToken() ){
- $params['auth_token'] = $this->cachedToken();
- }
- $defaults = array(
- 'secret' => $this->secret,
- 'user_id' => 'me',
- 'sort' => 'date-posted-desc',
- 'per_page' => 20,
- 'media' => 'photos',
- 'extras' => 'original_format',
- );
- $params = array_merge( $defaults, $params );
- $xml = $this->call( 'flickr.photos.search', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- return $xml;
- }
- function videoSearch( $params = array() )
- {
- if ( $this->cachedToken() ){
- $params['auth_token'] = $this->cachedToken();
- }
- $params['secret'] = $this->secret;
- $params['user_id'] = 'me';
- $params['sort'] = 'date-posted-desc';
- $params['per_page'] = 20;
- $params['media'] = 'videos';
- $xml = $this->call( 'flickr.photos.search', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- return $xml;
- }
- function tagsGetListUser( $userid = null )
- {
- $params = array();
- if ( isset( $userid ) ) {
- $params['user_id'] = $userid;
- }
- $xml = $this->call( 'flickr.tags.getListUser', $params );
- return $xml;
- }
- function photosGetInfo( $photo_id )
- {
- $params = array();
- if ( $this->cachedToken() ){
- $params['auth_token'] = $this->cachedToken();
- }
- $params['photo_id'] = $photo_id;
- $params['secret'] = $this->secret;
- $xml = $this->call( 'flickr.photos.getInfo', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- return $xml;
- }
- function upload( $photo, $title = '', $description = '', $tags = '', $perms = '', $async = 1, &$info = null )
- {
- $store = HABARI_PATH . '/' . Site::get_path( 'user' ) . '/cache';
- if ( !is_dir( $store ) ){
- mkdir( $store, 0777 );
- }
- $params = array( 'auth_token' => $this->cachedToken() );
- $url = InputFilter::parse_url( 'file://' . $photo );
- if ( isset( $url['scheme'] ) ){
- $localphoto = fopen( HABARI_PATH . '/' . $photo, 'r' );
- $store = tempnam( $store, 'G2F' );
- file_put_contents( $store, $localphoto );
- fclose( $localphoto );
- $params['photo'] = $store;
- }
- else{
- $params['photo'] = $photo;
- }
- $info = filesize( $params['photo'] );
- if ( $title ){
- $params['title'] = $title;
- }
- if ( $description ){
- $params['description'] = $description;
- }
- if ( $tags ){
- $params['tags'] = $tags;
- }
- if ( $perms ){
- if ( isset( $perms['is_public'] ) ){
- $params['is_public'] = $perms['is_public'];
- }
- if ( isset( $perms['is_friend'] ) ){
- $params['is_friend'] = $perms['is_friend'];
- }
- if ( isset( $perms['is_family'] ) ){
- $params['is_family'] = $perms['is_family'];
- }
- }
- if ( $async ){
- $params['async'] = $async;
- }
- // call the upload method.
- $xml = $this->call( 'upload', $params );
- if ( $store ){
- unlink( $store );
- }
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- if ( $async ){
- return( (string)$xml->ticketid );
- }
- else{
- return( (string)$xml->photoid );
- }
- }
- function photosUploadCheckTickets( $tickets )
- {
- if ( is_array( $tickets ) ){
- foreach( $tickets as $key => $value ){
- if ( $key ){
- $params['tickets'] .= ' ';
- }
- $params['tickets'] .= $value;
- }
- }
- else{
- $params['tickets'] = $tickets;
- }
- $xml = $this->call( 'flickr.photos.upload.checkTickets', $params );
- if ( Error::is_error( $xml ) ){
- throw $xml;
- }
- foreach( $xml->uploader->ticket as $ticket ){
- foreach( $ticket->attributes() as $key => $value ){
- $uptick[(string)$ticket['id']][$key] = (string)$value;
- }
- }
- return $uptick;
- }
- function reflectionGetMethods()
- {
- $params = array();
- $xml = $this->call( 'flickr.reflection.getMethods', $params );
- if ( !$xml ){
- return false;
- }
- $ret = (array)$xml->methods->method;
- return $ret;
- }
- }
- /**
- * Flickr Silo
- */
- class FlickrSilo extends Plugin implements MediaSilo
- {
- const SILO_NAME = 'Flickr';
- static $cache = array();
- /**
- * Initialize some internal values when plugin initializes
- */
- public function action_init()
- {
- }
- /**
- * Return basic information about this silo
- * name- The name of the silo, used as the root directory for media in this silo
- * icon- An icon to represent the silo
- */
- public function silo_info()
- {
- if ( $this->is_auth() ) {
- return array( 'name' => self::SILO_NAME, 'icon' => URL::get_from_filesystem(__FILE__) . '/icon.png' );
- }
- else {
- return array();
- }
- }
- /**
- * Return directory contents for the silo path
- *
- * @param string $path The path to retrieve the contents of
- * @return array An array of MediaAssets describing the contents of the directory
- */
- public function silo_dir( $path )
- {
- $flickr = new Flickr();
- $results = array();
- $size = Options::get( 'flickrsilo__flickr_size' );
- $section = strtok( $path, '/' );
- switch ( $section ) {
- case 'attrib-sa':
- $xml = $flickr->photosSearch( array( 'user_id' => '', 'license' => '4,5', 'text'=>$_SESSION['flickrsearch'] ) );
- foreach( $xml->photos->photo as $photo ) {
- $props = array();
- foreach( $photo->attributes() as $name => $value ) {
- $props[$name] = (string)$value;
- }
- $props = array_merge( $props, self::element_props( $photo, "http://www.flickr.com/photos/{$photo['owner']}/{$photo['id']}", $size ) );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/photos/' . $photo['id'],
- false,
- $props
- );
- }
- break;
- case 'search':
- $xml = $flickr->photosSearch( array( 'text'=>$_SESSION['flickrsearch'] ) );
- foreach( $xml->photos->photo as $photo ) {
- $props = array();
- foreach( $photo->attributes() as $name => $value ) {
- $props[$name] = (string)$value;
- }
- $props = array_merge( $props, self::element_props( $photo, "http://www.flickr.com/photos/{$_SESSION['nsid']}/{$photo['id']}", $size ) );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/photos/' . $photo['id'],
- false,
- $props
- );
- }
- break;
- case 'photos':
- $xml = $flickr->photosSearch();
- foreach( $xml->photos->photo as $photo ) {
- $props = array();
- foreach( $photo->attributes() as $name => $value ) {
- $props[$name] = (string)$value;
- }
- $props = array_merge( $props, self::element_props( $photo, "http://www.flickr.com/photos/{$_SESSION['nsid']}/{$photo['id']}", $size ) );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/photos/' . $photo['id'],
- false,
- $props
- );
- }
- break;
- case 'videos':
- $xml = $flickr->videoSearch();
- foreach( $xml->photos->photo as $photo ) {
- $props = array();
- foreach( $photo->attributes() as $name => $value ) {
- $props[$name] = (string)$value;
- }
- $props = array_merge( $props, self::element_props( $photo, "http://www.flickr.com/photos/{$_SESSION['nsid']}/{$photo['id']}", $size ) );
- $props['filetype'] = 'flickrvideo';
- $results[] = new MediaAsset(
- self::SILO_NAME . '/photos/' . $photo['id'],
- false,
- $props
- );
- }
- break;
- case 'tags':
- $selected_tag = strtok('/');
- if ( $selected_tag ) {
- $xml = $flickr->photosSearch( array( 'tags'=>$selected_tag ) );
- foreach( $xml->photos->photo as $photo ) {
- $props = array();
- foreach( $photo->attributes() as $name => $value ) {
- $props[$name] = (string)$value;
- }
- $props = array_merge( $props, self::element_props( $photo, "http://www.flickr.com/photos/{$_SESSION['nsid']}/{$photo['id']}", $size ) );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/photos/' . $photo['id'],
- false,
- $props
- );
- }
- }
- else {
- $xml = $flickr->tagsGetListUser( $_SESSION['nsid'] );
- foreach( $xml->who->tags->tag as $tag ) {
- $results[] = new MediaAsset(
- self::SILO_NAME . '/tags/' . (string)$tag,
- true,
- array( 'title' => (string)$tag )
- );
- }
- }
- break;
- case 'sets':
- $selected_set = strtok('/');
- if ( $selected_set ) {
- $xml = $flickr->photosetsGetPhotos( $selected_set );
- foreach( $xml->photoset->photo as $photo ) {
- $props = array();
- foreach( $photo->attributes() as $name => $value ) {
- $props[$name] = (string)$value;
- }
- $props = array_merge( $props, self::element_props( $photo, "http://www.flickr.com/photos/{$_SESSION['nsid']}/{$photo['id']}", $size ) );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/photos/' . $photo['id'],
- false,
- $props
- );
- }
- }
- else {
- $xml = $flickr->photosetsGetList( $_SESSION['nsid'] );
- foreach( $xml->photosets->photoset as $set ) {
- $results[] = new MediaAsset(
- self::SILO_NAME . '/sets/' . (string)$set['id'],
- true,
- array( 'title' => (string)$set->title )
- );
- }
- }
- break;
- case '$search':
- $path = strtok( '/' );
- $dosearch = Utils::slugify( $path );
- $_SESSION['flickrsearch'] = $path;
- $section = $path;
- case '':
- if ( isset( $_SESSION['flickrsearch'] ) ) {
- $results[] = new MediaAsset(
- self::SILO_NAME . '/search',
- true,
- array( 'title' => _t( 'Search' ) )
- );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/attrib-sa',
- true,
- array( 'title' => _t( 'Search CC' ) )
- );
- }
- $results[] = new MediaAsset(
- self::SILO_NAME . '/photos',
- true,
- array('title' => _t( 'Photos' ) )
- );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/videos',
- true,
- array('title' => _t( 'Videos' ) )
- );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/tags',
- true,
- array('title' => _t( 'Tags' ) )
- );
- $results[] = new MediaAsset(
- self::SILO_NAME . '/sets',
- true,
- array('title' => _t( 'Sets' ) )
- );
- break;
- }
- return $results;
- }
-
- /**
- * Function that populates the element properties for use in the silo.
- *
- * This is to reduce the amount of duplicate code.
- *
- * @param array $photo The photo element array
- * @param string $url The Flickr URL to link to
- * @param string $size The size of the image to display.
- * @return array
- */
- private static function element_props( $photo, $url, $size )
- {
- $props = array();
- $props['url'] = "http://farm{$photo['farm']}.static.flickr.com/{$photo['server']}/{$photo['id']}_{$photo['secret']}{$size}.jpg";
- $props['thumbnail_url'] = "http://farm{$photo['farm']}.static.flickr.com/{$photo['server']}/{$photo['id']}_{$photo['secret']}_m.jpg";
- $props['flickr_url'] = $url;
- $props['filetype'] = 'flickr';
- return $props;
- }
- /**
- * Get the file from the specified path
- *
- * @param string $path The path of the file to retrieve
- * @param array $qualities Qualities that specify the version of the file to retrieve.
- * @return MediaAsset The requested asset
- */
- public function silo_get( $path, $qualities = null )
- {
- $flickr = new Flickr();
- $results = array();
- $size = Options::get( 'flickrsilo__flickr_size' );
- list($unused, $photoid) = explode( '/', $path );
-
- $xml = $flickr->photosGetInfo($photoid);
- $photo = $xml->photo;
- $props = array();
- foreach( $photo->attributes() as $name => $value ) {
- $props[$name] = (string)$value;
- }
- $props = array_merge( $props, self::element_props( $photo, "http://www.flickr.com/photos/{$_SESSION['nsid']}/{$photo['id']}", $size ) );
- $result = new MediaAsset(
- self::SILO_NAME . '/photos/' . $photo['id'],
- false,
- $props
- );
- return $result;
- }
- /**
- * Get the direct URL of the file of the specified path
- *
- * @param string $path The path of the file to retrieve
- * @param array $qualities Qualities that specify the version of the file to retrieve.
- * @return string The requested url
- */
- public function silo_url( $path, $qualities = null )
- {
- $photo = false;
- if ( preg_match( '%^photos/(.+)$%', $path, $matches ) ) {
- $id = $matches[1];
- $photo = self::$cache[$id];
- }
- $size = '';
- if ( isset( $qualities['size'] ) && $qualities['size'] == 'thumbnail' ) {
- $size = '_m';
- }
- $url = "http://farm{$photo['farm']}.static.flickr.com/{$photo['server']}/{$photo['id']}_{$photo['secret']}{$size}.jpg";
- return $url;
- }
- /**
- * Create a new asset instance for the specified path
- *
- * @param string $path The path of the new file to create
- * @return MediaAsset The requested asset
- */
- public function silo_new( $path )
- {
- }
- /**
- * Store the specified media at the specified path
- *
- * @param string $path The path of the file to retrieve
- * @param MediaAsset $ The asset to store
- */
- public function silo_put( $path, $filedata )
- {
- }
- /**
- * Delete the file at the specified path
- *
- * @param string $path The path of the file to retrieve
- */
- public function silo_delete( $path )
- {
- }
- /**
- * Retrieve a set of highlights from this silo
- * This would include things like recently uploaded assets, or top downloads
- *
- * @return array An array of MediaAssets to highlihgt from this silo
- */
- public function silo_highlights()
- {
- }
- /**
- * Retrieve the permissions for the current user to access the specified path
- *
- * @param string $path The path to retrieve permissions for
- * @return array An array of permissions constants (MediaSilo::PERM_READ, MediaSilo::PERM_WRITE)
- */
- public function silo_permissions( $path )
- {
- }
- /**
- * Return directory contents for the silo path
- *
- * @param string $path The path to retrieve the contents of
- * @return array An array of MediaAssets describing the contents of the directory
- */
- public function silo_contents()
- {
- $flickr = new Flickr();
- $token = Options::get( 'flickr_token_' . User::identify()->id );
- $result = $flickr->call( 'flickr.auth.checkToken',
- array( 'api_key' => $flickr->key,
- 'auth_token' => $token ) );
- $photos = $flickr->GetPublicPhotos( $result->auth->user['nsid'], null, 5 );
- foreach( $photos['photos'] as $photo ){
- $url = $flickr->getPhotoURL( $photo );
- echo '<img src="' . $url . '" width="150px" alt="' . ( isset( $photo['title'] ) ? $photo['title'] : _t('This photo has no title') ) . '">';
- }
- }
- /**
- * Add actions to the plugin page for this plugin
- * The authorization should probably be done per-user.
- *
- * @param array $actions An array of actions that apply to this plugin
- * @param string $plugin_id The string id of a plugin, generated by the system
- * @return array The array of actions to attach to the specified $plugin_id
- */
- public function filter_plugin_config( $actions, $plugin_id )
- {
- $flickr_ok = $this->is_auth();
- if ( $flickr_ok ){
- $actions['deauthorize'] = _t( 'De-Authorize' );
- }
- else{
- $actions['authorize'] = _t( 'Authorize' );
- }
- $actions['configure'] = _t( 'Configure' );
- return $actions;
- }
- /**
- * Respond to the user selecting the authorize action on the plugin page
- *
- */
- public function action_plugin_ui_authorize()
- {
- if ( $this->is_auth() ){
- $deauth_url = URL::get( 'admin', array( 'page' => 'plugins', 'configure' => $this->plugin_id(), 'configaction' => 'deauthorize' ) ) . '#plugin_options';
- echo '<p>' . _t( 'You have already successfully authorized Habari to access your Flickr account.') . '</p>';
- echo '<p>' . _t( 'Do you want to ') . '<a href="">' . _t( 'revoke authorization' ) . '</a>?</p>';
- }
- else{
- $flickr = new Flickr();
- $_SESSION['flickr_frob'] = '' . $flickr->getFrob();
- $auth_url = $flickr->authLink( $_SESSION['flickr_frob'] );
- $confirm_url = URL::get( 'admin', array( 'page' => 'plugins', 'configure' => $this->plugin_id(), 'configaction' => 'confirm' ) ) . '#plugin_options';
- echo '<p>' . _t( 'To use this plugin, you must ') . "<a href=\"{$auth_url}\" target=\"_blank\">" . _t( 'authorize Habari to have access to your Flickr account' ) . '</a>.';
- echo '<p>' . _t( 'When you have completed the authorization on Flickr, return here and ') . "<a href=\"$confirm_url\">" . _t( 'confirm that the authorization was successful') . '</a>.';
- }
- }
-
- /**
- * Respond to the user selecting the confirm action
- *
- */
- public function action_plugin_ui_confirm()
- {
- $flickr = new Flickr();
- if ( !isset( $_SESSION['flickr_frob'] ) ){
- $auth_url = URL::get( 'admin', array( 'page' => 'plugins', 'configure' => $this->plugin_id(), 'configaction' => 'authorize' ) ) . '#plugin_options';
- echo '<p>' . _t( 'Either you have already authorized Habari to access your flickr account, or you have not yet done so. Please ' ). '<a href="' . $auth_url . '">' . _t( 'try again' ) . '</a></p>';
- }
- else{
- $token = $flickr->getToken( $_SESSION['flickr_frob'] );
- if ( isset( $token->auth->perms ) ){
- Options::set( 'flickr_token_' . User::identify()->id, '' . $token->auth->token );
- echo '<p>' . _t( 'Your authorization was set successfully.' ) . '</p>';
- }
- else{
- echo '<p>' . _t( 'There was a problem with your authorization:' ) . '</p>';
- echo Utils::htmlspecialchars( $token->asXML() );
- }
- unset( $_SESSION['flickr_frob'] );
- }
- }
-
- /**
- * Respond to the user selecting the deauthorize action
- *
- */
- public function action_plugin_ui_deauthorize()
- {
- Options::set( 'flickr_token_' . User::identify()->id );
- $reauth_url = URL::get( 'admin', array( 'page' => 'plugins', 'configure' => $this->plugin_id(), 'configaction' => 'authorize' ) ) . '#plugin_options';
- echo '<p>' . _t( 'The Flickr Silo Plugin authorization has been deleted.' ) . '<p>';
- echo '<p>' . _t( 'Do you want to ' ) . "<a href=\"{$reauth_url}\">" . _t( 're-authorize this plugin' ) . "</a>?<p>";
- }
-
- /**
- * Respond to the user selecting the configure action
- *
- */
- public function action_plugin_ui_configure()
- {
- $ui = new FormUI( strtolower( get_class( $this ) ) );
- $ui->append( 'select', 'flickr_size','option:flickrsilo__flickr_size', _t( 'Default size for images in Posts:' ) );
- $ui->flickr_size->options = array( '_s' => _t( 'Square' ) . ' (75x75)', '_t' => _t( 'Thumbnail' ) . ' (100px)', '_m' => _t( 'Small' ) . ' (240px)', '' => _t( 'Medium' ) . ' (500px)', '_b' => _t( 'Large') . ' (1024px)', '_o' => _t( 'Original Size' ) );
- $ui->append('submit', 'save', _t( 'Save' ) );
- $ui->set_option('success_message', _t( 'Options saved' ) );
- $ui->out();
- }
-
- public function action_admin_footer( $theme )
- {
- if ( Controller::get_var( 'page' ) == 'publish' ) {
- $size = Options::get( 'flickrsilo__flickr_size' );
- switch ( $size ) {
- case '_s':
- $vsizex = 75;
- break;
- case '_t':
- $vsizex = 100;
- break;
- case '_m':
- $vsizex = 240;
- break;
- case '':
- $vsizex = 500;
- break;
- case '_b':
- $vsizex = 1024;
- break;
- case '_o':
- $vsizex = 400;
- break;
- }
- $vsizey = intval( $vsizex/4*3 );
- echo <<< FLICKR
- <script type="text/javascript">
- habari.media.output.flickr = {
- embed_photo: function(fileindex, fileobj) {
- habari.editor.insertSelection('<a href="' + fileobj.flickr_url + '"><img alt="' + fileobj.title + '" src="' + fileobj.url + '"></a>');
- }
- }
- habari.media.output.flickrvideo = {
- embed_video: function(fileindex, fileobj) {
- habari.editor.insertSelection('<object type="application/x-shockwave-flash" width="{$vsizex}" height="{$vsizey}" data="http://www.flickr.com/apps/video/stewart.swf?v=49235" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"> <param name="flashvars" value="intl_lang=en-us&photo_secret=' + fileobj.secret + '&photo_id=' + fileobj.id + '&show_info_box=true"></param> <param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=49235"></param> <param name="bgcolor" value="#000000"></param> <param name="allowFullScreen" value="true"></param><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=49235" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&photo_secret=' + fileobj.secret + '&photo_id=' + fileobj.id + '&flickr_show_info_box=true" height="{$vsizey}" width="{$vsizex}"></embed></object>');
- },
- thumbnail: function(fileindex, fileobj) {
- habari.editor.insertSelection('<a href="' + fileobj.flickr_url + '"><img alt="' + fileobj.title + '" src="' + fileobj.url + '"></a>');
- }
- }
- habari.media.preview.flickr = function(fileindex, fileobj) {
- var stats = '';
- return '<div class="mediatitle"><a href="' + fileobj.flickr_url + '" class="medialink" onclick="$(this).attr(\'target\',\'_blank\');" title="Open in new window">media</a>' + fileobj.title + '</div><img src="' + fileobj.thumbnail_url + '"><div class="mediastats"> ' + stats + '</div>';
- }
- habari.media.preview.flickrvideo = function(fileindex, fileobj) {
- var stats = '';
- return '<div class="mediatitle"><a href="' + fileobj.flickr_url + '" class="medialink" onclick="$(this).attr(\'target\',\'_blank\');"title="Open in new window" >media</a>' + fileobj.title + '</div><img src="' + fileobj.thumbnail_url + '"><div class="mediastats"> ' + stats + '</div>';
- }
- </script>
- FLICKR;
- }
- }
- private function is_auth()
- {
- static $flickr_ok = null;
- if ( isset( $flickr_ok ) ){
- return $flickr_ok;
- }
- $flickr_ok = false;
- $token = Options::get( 'flickr_token_' . User::identify()->id );
- if ( $token != '' ){
- $flickr = new Flickr();
- $result = $flickr->call( 'flickr.auth.checkToken', array( 'api_key' => $flickr->key, 'auth_token' => $token ) );
- if ( isset( $result->auth->perms ) ){
- $flickr_ok = true;
- $_SESSION['nsid'] = (string)$result->auth->user['nsid'];
- }
- else{
- Options::set( 'flickr_token_' . User::identify()->id );
- unset( $_SESSION['flickr_token'] );
- }
- }
- return $flickr_ok;
- }
- /**
- * Provide controls for the media control bar
- *
- * @param array $controls Incoming controls from other plugins
- * @param MediaSilo $silo An instance of a MediaSilo
- * @param string $path The path to get controls for
- * @param string $panelname The name of the requested panel, if none then emptystring
- * @return array The altered $controls array with new (or removed) controls
- *
- * @todo This should really use FormUI, but FormUI needs a way to submit forms via ajax
- */
- public function filter_media_controls( $controls, $silo, $path, $panelname )
- {
- $class = __CLASS__;
- if ( $silo instanceof $class ) {
- unset( $controls['root'] );
- $search_criteria = isset( $_SESSION['flickrsearch'] ) ? htmlentities( $_SESSION['flickrsearch'] ) : '';
- $controls['search']= '<label for="flickrsearch" class="incontent">' ._t( 'Search' ) . '</label><input type="search" id="flickrsearch" placeholder="'. _t( 'Search for photos' ) .'" value="'.$search_criteria.'">
- <script type="text/javascript">
- $(\'#flickrsearch\').keypress(function(e){
- if (e.which == 13){
- habari.media.fullReload();
- habari.media.showdir(\''.FlickrSilo::SILO_NAME.'/$search/\' + $(this).val());
- return false;
- }
- });
- </script>';
- }
- return $controls;
- }
- }
- ?>