the translated name of the provider * 'url' => the url to the main page for the provider * 'settings_description' => a description of the provider that will be posted in the admin settings form * 'supported_features' => an array of rows describing the state of certain supported features by the provider. * These will be rendered in a table, with the columns being 'Feature', 'Supported', 'Notes'. */ function emimage_flickr_info() { $name = t('Flickr'); $features = array( array(t('Import photosets'), t('Yes'), t('If you have the Embedded Media Import module activated, you may allow @name photosets to be imported into content.', array('@name' => $name))), ); return array( 'provider' => 'flickr', 'name' => t('Flickr'), 'url' => EMIMAGE_FLICKR_MAIN_URL, 'settings_description' => t('These settings specifically affect images displayed from Flickr.', array('@flickr' => EMIMAGE_FLICKR_MAIN_URL)), 'supported_features' => $features, 'import_sets_word' => t('photosets'), ); } /** * This allows flickr photosets to be imported into nodes */ function emimage_flickr_import($url, $limit = 0, $page = 0) { $codes = array(); // http://www.flickr.com/photos/nikkiana/sets/72157601948647678/ if (preg_match('@flickr\.com/photos/([^/]*)/([^/]*)/([^/]*)/@i', $url, $matches)) { $page++; // flickr starts current page at 1 $codes['#matches'] = $matches; $args = array('photoset_id' => $matches[3]); if ($limit) { $args['per_page'] = $limit; } $args['page'] = $page; $xml = emimage_flickr_request('flickr.photosets.getPhotos', $args); $codes['#pages'] = $xml['photoset']['pages']; $codes['#page'] = $xml['photoset']['page'] - 1; $codes['#total'] = $xml['photoset']['total']; $codes['#per_page'] = $xml['photoset']['per_page']; $codes['#set'] = array(); foreach ($xml['photoset']['photo'] as $photo) { $data = emimage_flickr_data(NULL, array('value' => $photo['id'])); $codes['#set'][] = array( '#code' => $photo['id'], '#title' => $photo['title'], '#link' => emimage_flickr_embedded_link($photo['id'], $xml['photoset']['owner']), '#thumb' => emimage_flickr_image_url($photo['id'], 100, 100, NULL, NULL, NULL), '#body' => $data['description'], '#tags' => $data['tags'], // '#body' => emimage_flickr_description($photo['id']), // '#tags' => emimage_flickr_tags($photo['id']), ); } /* $data['owner'] = $xml['photo']['owner']['nsid']; $data['title'] = $xml['photo']['title']['_content'];*/ } return $codes; } /** * hook emimage_PROVIDER_settings * this should return a subform to be added to the emimage_settings() admin settings page. * note that a form field will already be provided, at $form['PROVIDER'] (such as $form['flickr']) * so if you want specific provider settings within that field, you can add the elements to that form field. */ function emimage_flickr_settings() { $form['flickr']['api'] = array( '#type' => 'fieldset', '#title' => t('Flickr API'), '#description' => t('You will first need to apply for an API Developer Key from the Flickr Developer Profile page.', array('@flickr' => EMIMAGE_FLICKR_API_APPLICATION_URL)), '#collapsible' => TRUE, '#collapsed' => (variable_get('emimage_flickr_api_key', '') != ''), ); $form['flickr']['api']['emimage_flickr_api_key'] = array( '#type' => 'textfield', '#title' => t('Flickr API Key'), '#default_value' => variable_get('emimage_flickr_api_key', ''), '#description' => t('Please enter your Flickr Developer Key here.'), ); $form['flickr']['api']['emimage_flickr_api_secret'] = array( '#type' => 'textfield', '#title' => t('Flickr API Secret'), '#default_value' => variable_get('emimage_flickr_api_secret', ''), '#description' => t('If you have a secret for the Flickr API, enter it here.'), ); return $form; } /** * this is a wrapper for emimage_request_xml that includes flickr's api key */ function emimage_flickr_request($method, $args = array(), $cached = TRUE) { // display an error if we don't have an api key yet emimage_flickr_error_check(); $args['api_key'] = trim(variable_get('emimage_flickr_api_key', '')); if ($secret = trim(variable_get('emimage_flickr_api_secret', ''))) { $args['secret'] = md5($secret . $arghash); } $args['method'] = $method; $args['format'] = 'php_serial'; $xml = module_invoke('emfield', 'request_xml', 'flickr', EMIMAGE_FLICKR_REST_ENDPOINT, $args, $cached, FALSE, FALSE, TRUE); return $xml; } /** * Implement hook emvideo_PROVIDER_data_version(). */ function emimage_flickr_data_version() { return EMIMAGE_FLICKR_DATA_VERSION; } function emimage_flickr_data($field, $item) { $data = array(); // use the page id, since we'll have that in most cases (except in embed pastes, which gets parsed during extraction) // we use this to get an rss feed w/ all the info for the video. interesting reading ;) $xml = emimage_flickr_request('flickr.photos.getInfo', array('photo_id' => $item['value'])); $data['owner'] = $xml['photo']['owner']['nsid']; $data['title'] = $xml['photo']['title']['_content']; $data['description'] = $xml['photo']['description']['_content']; $data['tags'] = array(); if (is_array($xml['photo']['tags']['tag'])) { foreach ($xml['photo']['tags']['tag'] as $tag) { $data['tags'][] = $tag['raw']; } } // Store the dimensions of the largest image so we can scale it correctly at display-time $width = 0 ; $height = 0; $xml = emimage_flickr_request('flickr.photos.getSizes', array('photo_id' => $item['value'])); foreach( $xml["sizes"]["size"] as $size){ // Ignore the Square size, as that doesn't give us the true aspect ratio if ($size["label"] != "Square") { if ( (int)$size["width"] > $width ) { $width = (int)$size["width"]; $height = (int)$size["height"]; } } } if ($width > 0) { $data['width'] = $width ; $data['height'] = $height ; } $data['emimage_data_version'] = EMIMAGE_FLICKR_DATA_VERSION; return $data; } /** * This will log an error if we don't have a key yet. In addition, if the user is an admin, we'll display an error. */ function emimage_flickr_error_check() { static $checked; if (!$checked && (variable_get('emimage_flickr_api_key', '') == '')) { global $user; $error = t('You do not yet have a Flickr API key set. You will need to apply for a Flickr API key and enter your key at the settings administration page before Flickr images may be displayed.', array('@apply' => EMIMAGE_FLICKR_API_APPLICATION_URL, '@settings' => url('admin/content/emfield'))); if (user_access('administer site configuration')) { drupal_set_message($error, 'error'); } watchdog('Embedded Media Field', '!error', array('!error' => $error)); } $checked = TRUE; } function emimage_flickr_extract($embed = '') { // http://flickr.com/photos/96898796@N00/194727976/ return array('@flickr\.com/photos/[^/]*/(\d+)@i'); } /** * hook emimage_PROVIDER_embedded_link($code) * returns a link to view the content at the provider's site * @param $code * the string containing the content to watch * @return * a string containing the URL to view the video at the original provider's site */ function emimage_flickr_embedded_link($code, $data = array()) { if ($data['owner']) { $owner = $data['owner']; } else { $xml = emimage_flickr_request('flickr.photos.getInfo', array('photo_id' => $code)); $owner = $xml['photo']['owner']['nsid']; } return 'http://www.flickr.com/photos/'. $owner .'/'. $code; } /** * Implements emimage_PROVIDER_image_url. * * @param $code * The provider code of the image. * @param $width * @param $height * The dimensions of the photo to display. * @return * The url directly to the image to display. */ function emimage_flickr_image_url($code, $width, $height, $formatter = NULL, $field = NULL, $item = NULL, $node = NULL) { if ($code) { $size = _emimage_flickr_guess_size($width, $height); $getsize = emimage_flickr_request('flickr.photos.getSizes', array('photo_id' => $code)); // For small images, there may not be the sizes 0..4 that // _emimage_flickr_guess_size assumes, so: $size = min( $size, (count($getsize['sizes']['size'])-1) ); $url = $getsize['sizes']['size'][$size]['source']; } return $url; } /** * Implements emimage_PROVIDER_image_title. * * @param $code * The provider code of the image. * @param $data * Any stored data for the image, which may already have the title. * @return * The title as the 3rd party provider knows it, if accessible to us. otherwise, ''. */ function emimage_flickr_image_title($code, $data) { if ($data['title']) { return $data['title']; } $photo = emimage_flickr_request('flickr.photos.getInfo', array('photo_id' => $code)); return $photo['photo']['title']['_content'] ? $photo['photo']['title']['_content'] : ''; } /** * Helper function for emimage_flickr_image_url. * This will return the appropriate array key for the image size we wish. */ function _emimage_flickr_guess_size($width, $height) { $max = max($width, $height); if ($max) { foreach (array('0' => 75, '1' => 100, '2' => 240, '3' => 500, '4' => 1024) as $size => $value) { if ($max <= $value) { return $size; } } } // If we don't have width or height set, then get the original size. return '5'; } function emimage_flickr_thumbnail($field, $item, $formatter, $node, $width, $height) { // As this is called by emthumb to grab the original size when available, // for later use w/ imagecache, we'll try to grab an intentionally large // image, at 4800x4800. return emimage_flickr_image_url($item['value'], 4800, 4800, $formatter, $field, $item, $node); }