array( 'name' => t('Archive videos'), 'class' => 'MediaArchiveStreamWrapper', 'description' => t('Videos provided by Archive.'), 'type' => STREAM_WRAPPERS_READ_VISIBLE, ), ); } function media_archive_media_format_form_prepare_alter(&$form, &$form_state, $media) { $settings = array('autosubmit' => ($media->type == "video")); drupal_add_js(array('media_format_form' => $settings), 'setting'); } /** * Implements hook_theme(). */ function media_archive_theme($existing, $type, $theme, $path) { return array( 'media_archive_preview_style' => array( 'variables' => array('style_name' => NULL), 'file' => 'media_archive.theme.inc', 'path' => $path . '/includes/themes', ), 'media_archive_field_formatter_styles' => array( 'variables' => array('element' => NULL, 'style' => NULL), 'file' => 'media_archive.theme.inc', 'path' => $path . '/includes/themes', ), 'media_archive_video' => array( 'variables' => array('uri' => NULL, 'width' => NULL, 'height' => NULL, 'autoplay' => NULL, 'fullscreen' => NULL), 'file' => 'media_archive.theme.inc', 'path' => $path . '/includes/themes', 'template' => 'media-archive-video', ), 'media_archive_embed' => array( 'variables' => array('style_name' => NULL, 'uri' => NULL, 'alt' => NULL, 'title' => NULL), 'file' => 'media_archive.theme.inc', 'path' => $path . '/includes/themes', ), 'media_archive_styles' => array( 'variables' => array('element' => NULL, 'style' => NULL), 'file' => 'media_archive.theme.inc', 'path' => $path . '/includes/themes', ), ); } /** * Implementation of Styles module hook_styles_register(). */ function media_archive_styles_register() { return array( 'MediaArchiveStyles' => array( 'field_types' => 'file', 'name' => t('MediaArchive'), 'description' => t('Media Archive styles.'), 'path' => drupal_get_path('module', 'media_archive') .'/includes', 'file' => 'media_archive.styles.inc', ), ); } /** * Implements hook_styles_containers(). (Deprecated in version 2) */ function media_archive_styles_containers() { return array( 'file' => array( 'containers' => array( 'media_archive' => array( 'label' => t('Archive Styles'), 'data' => array( 'streams' => array( 'archive', ), 'mimetypes' => array( 'video/archive', ), ), 'weight' => 0, 'filter callback' => 'media_archive_formatter_filter', 'themes' => array( 'field_formatter_styles' => 'media_archive_field_formatter_styles', 'styles' => 'media_archive_styles', 'preview' => 'media_archive_preview_style', ), 'description' => t('Archive Styles will display embedded Archive videos and thumbnails to your choosing, such as by resizing, setting colors, and autoplay. You can !manage.', array('!manage' => l(t('manage your Archive styles here'), 'admin/config/media/media-archive-styles'))), ), ), ), ); } function media_archive_formatter_filter($variables) { if (isset($variables['object'])) { $object = $variables['object']; return (file_uri_scheme($object->uri) == 'archive') && ($object->filemime == 'video/archive'); } } /** * Implementation of the File Styles module's hook_file_styles_filter(). */ function media_archive_file_styles_filter($object) { if ((file_uri_scheme($object->uri) == 'archive') && ($object->filemime == 'video/archive')) { return 'media_archive'; } } /** * Implements hook_styles_styles(). */ function media_archive_styles_styles() { $styles = array( 'file' => array( 'containers' => array( 'media_archive' => array( 'styles' => array( 'archive_thumbnail' => array( 'name' => 'archive_thumbnail', 'effects' => array( array('label' => t('Thumbnail'), 'name' => 'thumbnail', 'data' => array('thumbnail' => 1)), array('label' => t('Resize'), 'name' => 'resize', 'data' => array('width' => 100, 'height' => 75)), ), ), 'archive_preview' => array( 'name' => 'archive_preview', 'effects' => array( array('label' => t('Autoplay'), 'name' => 'autoplay', 'data' => array('autoplay' => 1)), array('label' => t('Resize'), 'name' => 'resize', 'data' => array('width' => 220, 'height' => 165)), ), ), 'archive_full' => array( 'name' => 'archive_full', 'effects' => array( array('label' => t('Autoplay'), 'name' => 'autoplay', 'data' => array('autoplay' => 0)), array('label' => t('Resize'), 'name' => 'resize', 'data' => array('width' => 640, 'height' => 480)), array('label' => t('Full screen'), 'name' => 'fullscreen', 'data' => array('fullscreen' => 1)), ), ), ), ), ), ), ); // Allow any image style to be applied to the thumbnail. foreach (image_styles() as $style_name => $image_style) { $styles['file']['containers']['media_archive']['styles']['archive_thumbnail_' . $style_name] = array( 'name' => 'archive_thumbnail_' . $style_name, 'image_style' => $style_name, 'effects' => array( array('label' => t('Thumbnail'), 'name' => 'thumbnail', 'data' => array('thumbnail' => 1)), ), ); } return $styles; } /** * Implements hook_styles_presets(). */ function media_archive_styles_presets() { $presets = array( 'file' => array( 'square_thumbnail' => array( 'media_archive' => array( 'archive_thumbnail_square_thumbnail', ), ), 'thumbnail' => array( 'media_archive' => array( 'archive_thumbnail', ), ), 'small' => array( 'media_archive' => array( 'archive_preview', ), ), 'large' => array( 'media_archive' => array( 'archive_full', ), ), 'original' => array( 'media_archive' => array( 'archive_full', ), ), ), ); return $presets; } /** * Implements hook_media_parse(). * * @todo: this might be deprecated now that we have media_internet, * but the hook is still being called in a couple places in media. */ function media_archive_media_parse($url, $options = array()) { $scheme = 'archive://'; preg_match('@archive\.org/details/([^"\& ]+)@i', $url, $matches); if (isset($matches[1])) { $org = media_archive_embedcode_lookup($matches[1]); return file_stream_wrapper_uri_normalize($scheme . 'v/' . $matches[1] . '/org/' . $org); } // @TODO: Validate for malformed archive urls. } /** * Implements hook_media_internet_providers(); */ function media_archive_media_internet_providers() { $path = drupal_get_path('module', 'media_archive'); return array( 'MediaInternetArchiveHandler' => array( 'title' => 'archive', 'image' => $path . '/images/stream-archive.png' ), ); } class MediaInternetArchiveHandler extends MediaInternetBaseHandler { public function claim($embedCode) { if (media_archive_media_parse($embedCode)) { return TRUE; } } public function validate() { // @todo Media module currently fails when two files try to have the same // URI, so catch that in the validation step. Some day, it would be nice // to allow it, however. See http://drupal.org/node/952422. $uri = media_archive_media_parse($this->embedCode); $existing_files = file_load_multiple(array(), array('uri' => $uri)); if (count($existing_files)) { throw new MediaInternetValidationException(t('You have entered a URL for a video that is already in your library.')); } } public function save() { $file = $this->getFileObject(); file_save($file); return $file; } public function getFileObject() { $uri = media_archive_media_parse($this->embedCode); //@todo: this is terribly broken in some ways because the function is really // made for local files which are 'real' return file_uri_to_object($uri); } /** * Returns information about the media. See http://video.search.yahoo.com/mrss. * * @return * If ATOM+MRSS information is available, a SimpleXML element containing * ATOM and MRSS elements, as per those respective specifications. * * @todo Would be better for the return value to be an array rather than a * SimpleXML element, but media_retrieve_xml() needs to be upgraded to * handle namespaces first. */ //http://archive.org/file/4035623?skin=rss public function getMRSS() { $uri = media_archive_media_parse($this->embedCode); $video_id = arg(1, file_uri_target($uri)); $rss_url = url('http://gdata.archive.org/feeds/api/videos/' . $video_id, array('query' => array('v' => '2'))); // @todo Use media_retrieve_xml() once it's upgraded to include elements // from all namespaces, not just the document default namespace. $entry = simplexml_load_file($rss_url); return $entry; } /** * Returns information about the media. See http://www.oembed.com/. * * @return * If oEmbed information is available, an array containing 'title', 'type', * 'url', and other information as specified by the oEmbed standard. * Otherwise, NULL. */ //http://archive.org/oembed/?url=http://archive.org/file/12345 public function getOEmbed() { $uri = media_archive_media_parse($this->embedCode); $external_url = drupal_realpath($uri); $oembed_url = url('http://archive.org/oembed', array('query' => array('url' => $external_url, 'format' => 'json'))); $response = drupal_http_request($oembed_url); if (!isset($response->error)) { return drupal_json_decode($response->data); } } } function media_archive_embedcode_lookup($video_id) { //http://www.archive.org/download/bavc-77620-dominotheory/bavc-77620-dominotheory_files.xml //Domino_Theory.mpeg // I hate this, but after reading http://data.agaric.com/node/2378 I'm // begining to think there isn't an easier way // if there isn't a better way, this needs to be done once and stored $url = 'http://www.archive.org/download/' . $video_id . '/' . $video_id; $rss_source = $url . '_files.xml'; $rss = file_get_contents($rss_source); preg_match('/(.+)<\/original>/', $rss, $matches); if (isset($matches[1])) { $info = pathinfo($matches[1]); $file_name = basename($matches[1],'.'.$info['extension']); return $file_name; } }