Index: audio.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/audio/audio.module,v retrieving revision 1.151 diff -u -p -r1.151 audio.module --- audio.module 26 Nov 2008 01:17:58 -0000 1.151 +++ audio.module 4 Feb 2009 20:32:58 -0000 @@ -1308,10 +1308,10 @@ function audio_is_flash_playable($node) function audio_views_api() { return array( 'api' => 2.0, + 'path' => drupal_get_path('module', 'audio') . '/views', ); } - /** * Implementation of the token.module's hook_token_values(). * Index: audio.views.inc =================================================================== RCS file: audio.views.inc diff -N audio.views.inc --- audio.views.inc 22 Dec 2008 08:50:35 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,311 +0,0 @@ - array( - 'left_field' => 'vid', - 'field' => 'vid', - ), - 'node_revisions' => array( - 'left_field' => 'vid', - 'field' => 'vid', - ), - 'files' => array( - 'left_field' => 'fid', - 'field' => 'fid', - ), - ); - - // ---------------------------------------------------------------- - // Fields - - $data['audio']['play_count'] = array( - 'title' => t('Play count'), - 'help' => t('This will display the number of times this has been played.'), - 'field' => array( - 'handler' => 'views_handler_field_numeric', - 'click sortable' => TRUE, - ), - 'filter' => array( - 'handler' => 'views_handler_filter_numeric', - 'label' => t('Plays'), - ), - 'sort' => array( - 'handler' => 'views_handler_sort', - ), - ); - $data['audio']['download_count'] = array( - 'title' => t('Download count'), - 'help' => t('This will display the number of times this has been downloaded.'), - 'field' => array( - 'handler' => 'views_handler_field_numeric', - 'click sortable' => TRUE, - ), - 'filter' => array( - 'handler' => 'views_handler_filter_numeric', - 'label' => t('Plays'), - ), - 'sort' => array( - 'handler' => 'views_handler_sort', - ), - ); - - $data['audio']['playtime'] = array( - 'title' => t('Length'), - 'help' => t('The playing time of the audio.'), // The help that appears on the UI, - // Information for displaying a title as a field - 'field' => array( - 'handler' => 'views_handler_field', - 'click sortable' => TRUE, - ), - 'sort' => array( - 'handler' => 'views_handler_sort', - ), - 'filter' => array( - 'handler' => 'views_handler_filter_string', - ), - 'argument' => array( - 'handler' => 'views_handler_argument_string', - ), - ); - - $data['audio']['downloadable'] = array( - 'title' => t('Downloadable'), - 'help' => t('Whether or not the audio is downloadable.'), - 'field' => array( - 'handler' => 'views_handler_field_boolean', - 'click sortable' => TRUE, - ), - 'filter' => array( - 'handler' => 'views_handler_filter_boolean_operator', - 'label' => t('Downloadable'), - ), - 'sort' => array( - 'handler' => 'views_handler_sort', - ), - ); - - - foreach (audio_get_tags_allowed() as $tag) { - $data['audio_metadata_'. $tag]['table']['group'] = t('Audio'); - - // For other base tables, explain how we join - $data['audio_metadata_'. $tag]['table']['join'] = array( - 'node' => array( - 'left_field' => 'vid', - 'table' => 'audio_metadata', - 'field' => 'vid', - 'extra' => array(array('field' => 'tag', 'value' => $tag, 'operator' => '=')) - ), - 'node_revisions' => array( - 'left_field' => 'vid', - 'table' => 'audio_metadata', - 'field' => 'vid', - 'extra' => array(array('field' => 'tag', 'value' => $tag, 'operator' => '=')) - ), - ); - - $data['audio_metadata_'. $tag]['value'] = array( - 'title' => t('@tag', array('@tag' => drupal_ucfirst($tag))), - 'help' => t('The value of the @tag metadata field.', array('@tag' => $tag)), - 'field' => array( - 'handler' => 'views_handler_field_xss', - 'click sortable' => TRUE, - ), - 'sort' => array( - 'handler' => 'views_handler_sort', - ), - 'filter' => array( - 'handler' => 'views_handler_filter_string', - ), - 'argument' => array( - 'handler' => 'views_handler_argument_string', - ), - ); -/* - $data['audio_metadata_'. $tag]['clean'] = array( - 'title' => t('Cleaned @tag value', array('@tag' => $tag)), - 'help' => t('The stripped down version of the @tag metadata field.', array('@tag' => $tag)), - 'field' => array( - 'handler' => 'views_handler_field_xss', - 'click sortable' => TRUE, - ), - 'sort' => array( - 'handler' => 'views_handler_sort', - ), - 'filter' => array( - 'handler' => 'views_handler_filter_string', - ), - 'argument' => array( - 'handler' => 'views_handler_argument_string', - ), - ); -*/ - } - - return $data; -} - -function audio_views_tables() { - $players = array(); - foreach (audio_get_players('names') as $name => $player) { - $players[$name] = $player['title']; - } - - $tables['audio'] = array( - 'name' => 'audio', - 'join' => array( - 'left' => array( - 'table' => 'node', - 'field' => 'vid' - ), - 'right' => array( - 'field' => 'vid' - ) - ), - 'fields' => array( - 'play_link' => array( - 'name' => t('Audio: Player link/flash'), - 'handler' => 'audio_views_handler_field_player', - 'option' => array( - '#type' => 'select', - '#options' => $players, - ), - 'notafield' => TRUE, - 'sortable' => FALSE, - 'help' => t('This will display a flash player/link.'), - ), - 'download_link' => array( - 'name' => t('Audio: Download link'), - 'handler' => 'audio_views_handler_field_download', - 'notafield' => TRUE, - 'sortable' => FALSE, - 'help' => t('This will display a download link if the node allows it.'), - ), - 'file_size' => array( - 'name' => t('Audio: File size'), - 'handler' => 'views_handler_field_filesize', - 'sortable' => TRUE, - 'help' => t("This will display the audio file's size."), - ), - ), - ); - - $numeric_tags = array('track', 'year'); - - foreach (audio_get_tags_allowed() as $tag) { - $tables['audio_metadata_'. $tag] = array( - 'name' => 'audio_metadata', - 'join' => array( - 'left' => array( - 'table' => 'audio', - 'field' => 'vid' - ), - 'right' => array( - 'field' => 'vid' - ), - 'extra' => array( - 'tag' => $tag - ), - ), - 'fields' => array( - 'value' => array( - 'name' => t('Audio: Tag @tag', array('@tag' => $tag)), - 'sortable' => TRUE, - 'help' => t('This will display tag %tag values.', array('%tag' => $tag)), - ), - ), - 'filters' => array( - 'clean' => array( - 'name' => t('Audio: Tag @tag', array('@tag' => $tag)), - 'tag' => $tag, - 'operator' => array('=' => 'Equals'), - 'list' => 'audio_views_handler_filter_tags', - 'list-type' => 'list', - 'operator' => 'views_handler_operator_or', - 'value-type' => 'array', - 'help' => t('Filter by whether or not the audio is downloadable. '), - ), - ), - 'sorts' => array( - 'value' => array( - 'name' => t('Audio: Tag @tag', array('@tag' => $tag)), - 'help' => t('Sort audio nodes by tag %tag values.', array('%tag' => $tag)), - ), - ), - ); - - // Use different handlers for numeric tags. - if (in_array($tag, $numeric_tags)) { - $tables["audio_metadata_$tag"]['sorts']['value']['handler'] = 'audio_views_sort_handler_numeric_tag'; - // Set notafield to TRUE so that our handler can add the field. - $tables["audio_metadata_$tag"]['fields']['value']['notafield'] = TRUE; - $tables["audio_metadata_$tag"]['fields']['value']['query_handler'] = 'audio_views_field_query_handler_numeric'; - } - } - - return $tables; -} - -// TODO: profile this code and see if it can be optimized. -function audio_views_handler_field_player($fieldinfo, $fielddata, $value, $data) { - $node = node_load($data->nid); - return audio_get_node_player($node, $fielddata['options']); -} - -// TODO: profile this code and see if it can be optimized. -function audio_views_handler_field_download($fieldinfo, $fielddata, $value, $data) { - $node = node_load($data->nid); - if ($node->url_download) { - return l(t('download audio file'), $node->url_download, NULL); - } -} - -/** - * - */ -function audio_views_handler_filter_tags($op, $field) { - $tags = array(); - $result = db_query(db_rewrite_sql("SELECT a.value, a.clean FROM {node} n INNER JOIN {audio_metadata} a ON n.vid = a.vid WHERE a.tag = '%s' ORDER BY a.value ASC"), $field['tag']); - while ($obj = db_fetch_object($result)) { - $tags[$obj->clean] = $obj->value; - } - return $tags; -} - -/** - * Field sort handler to convert numeric values in string fiels for sorting. - * - * For more info on how this works see: http://blog.feedmarker.com/2006/02/01/how-to-do-natural-alpha-numeric-sort-in-mysql/ - */ -function audio_views_field_query_handler_numeric($fielddata, $fieldinfo, &$query) { - // This handler expects that the field will have 'notafield' => TRUE so that - // we can add in our field and not have worry about views overwriting it with - // the default. - $query->add_field($fielddata['field'] .' + 0', $fielddata['tablename'], $fielddata['queryname']); -} - -/** - * Sort handler to convert numeric values in string fiels for sorting. - * - * For more info on how this works see: http://blog.feedmarker.com/2006/02/01/how-to-do-natural-alpha-numeric-sort-in-mysql/ - */ -function audio_views_sort_handler_numeric_tag($op, &$query, $sortinfo, $sort) { - // We go to a bunch of trouble here to make sure we're adding the same field - // as audio_views_field_query_handler_numeric() would so that views doesn't - // duplicate it. - $query->add_orderby('', $sort['field'] .' + 0', $sort['sortorder'], $sortinfo['table'] .'_'. $sortinfo['field']); - -} Index: audio.views_default.inc =================================================================== RCS file: audio.views_default.inc diff -N audio.views_default.inc --- audio.views_default.inc 3 Oct 2008 06:24:28 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,382 +0,0 @@ -name = 'audio'; - $view->description = 'Audio nodes'; - $view->tag = ''; - $view->view_php = ''; - $view->base_table = 'node'; - $view->is_cacheable = FALSE; - $view->api_version = 2; - $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ - $handler = $view->new_display('default', 'Defaults', 'default'); - $handler->override_option('fields', array( - 'title' => array( - 'id' => 'title', - 'table' => 'node', - 'field' => 'title', - ), - )); - $handler->override_option('sorts', array( - 'created' => array( - 'id' => 'created', - 'table' => 'node', - 'field' => 'created', - ), - )); - $handler->override_option('filters', array( - 'type' => array( - 'operator' => 'in', - 'value' => array( - 'audio' => 'audio', - ), - 'group' => '0', - 'exposed' => FALSE, - 'expose' => array( - 'operator' => FALSE, - 'label' => '', - ), - 'id' => 'type', - 'table' => 'node', - 'field' => 'type', - 'relationship' => 'none', - ), - 'status' => array( - 'operator' => '=', - 'value' => 1, - 'group' => '0', - 'exposed' => FALSE, - 'expose' => array( - 'operator' => FALSE, - 'label' => '', - ), - 'id' => 'status', - 'table' => 'node', - 'field' => 'status', - 'relationship' => 'none', - ), - )); - $handler->override_option('access', array( - 'type' => 'perm', - 'perm' => 'access content', - )); - $handler->override_option('title', 'Audio'); - $handler->override_option('header_format', '1'); - $handler->override_option('footer_format', '1'); - $handler->override_option('empty_format', '1'); - $handler->override_option('items_per_page', '10'); - $handler->override_option('use_pager', TRUE); - $handler->override_option('row_plugin', 'node'); - $handler->override_option('row_options', array( - 'teaser' => TRUE, - 'links' => TRUE, - )); - $handler = $view->new_display('page', 'Page', 'page_1'); - $handler->override_option('path', 'audio'); - $handler->override_option('menu', array( - 'type' => 'normal', - 'title' => 'Audio', - 'weight' => 0, - )); - $handler->override_option('tab_options', array( - 'type' => 'none', - 'title' => '', - 'weight' => '0', - )); - $handler = $view->new_display('block', 'Block', 'block_1'); - $handler->override_option('title', 'Recent audio'); - $handler->override_option('items_per_page', '5'); - $handler->override_option('style_plugin', 'list'); - $handler->override_option('style_options', array( - 'type' => 'ul', - )); - $handler->override_option('row_plugin', 'fields'); - $handler->override_option('block_description', ''); - $handler->override_option('block_caching', -1); - $handler = $view->new_display('feed', 'Feed', 'feed_1'); - $handler->override_option('style_plugin', 'rss'); - $handler->override_option('style_options', array( - 'mission_description' => FALSE, - 'description' => '', - )); - $handler->override_option('row_plugin', 'node_rss'); - $handler->override_option('row_options', array( - 'item_length' => 'default', - )); - $handler->override_option('path', 'audio/feed'); - $handler->override_option('menu', array( - 'type' => 'none', - 'title' => '', - 'weight' => 0, - )); - $handler->override_option('tab_options', array( - 'type' => 'none', - 'title' => '', - 'weight' => 0, - )); - $handler->override_option('displays', array( - 'default' => 'default', - 'page_1' => 'page_1', - 'block_1' => 'block_1', - )); - $handler->override_option('sitename_title', FALSE); - $views[$view->name] = $view; - - - - $view = new view; - $view->name = 'audio_random'; - $view->description = 'Random audio nodes'; - $view->tag = ''; - $view->view_php = ''; - $view->base_table = 'node'; - $view->is_cacheable = FALSE; - $view->api_version = 2; - $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ - $handler = $view->new_display('default', 'Defaults', 'default'); - $handler->override_option('fields', array( - 'title' => array( - 'label' => '', - 'link_to_node' => 1, - 'exclude' => 0, - 'id' => 'title', - 'table' => 'node', - 'field' => 'title', - 'relationship' => 'none', - ), - )); - $handler->override_option('sorts', array( - 'random' => array( - 'order' => 'ASC', - 'id' => 'random', - 'table' => 'views', - 'field' => 'random', - 'relationship' => 'none', - ), - )); - $handler->override_option('filters', array( - 'type' => array( - 'operator' => 'in', - 'value' => array( - 'audio' => 'audio', - ), - 'group' => '0', - 'exposed' => FALSE, - 'expose' => array( - 'operator' => FALSE, - 'label' => '', - ), - 'id' => 'type', - 'table' => 'node', - 'field' => 'type', - 'relationship' => 'none', - ), - 'status' => array( - 'operator' => '=', - 'value' => 1, - 'group' => '0', - 'exposed' => FALSE, - 'expose' => array( - 'operator' => FALSE, - 'label' => '', - ), - 'id' => 'status', - 'table' => 'node', - 'field' => 'status', - 'relationship' => 'none', - ), - )); - $handler->override_option('access', array( - 'type' => 'perm', - 'perm' => 'access content', - )); - $handler->override_option('title', 'Random audio'); - $handler->override_option('header_format', '1'); - $handler->override_option('footer_format', '1'); - $handler->override_option('empty_format', '1'); - $handler->override_option('items_per_page', 5); - $handler->override_option('style_plugin', 'list'); - $handler->override_option('style_options', array( - 'grouping' => '', - 'type' => 'ul', - )); - $handler = $view->new_display('block', 'Block', 'block_1'); - $handler->override_option('items_per_page', '5'); - $handler->override_option('style_options', array( - 'type' => 'ul', - )); - $handler->override_option('block_description', ''); - $handler->override_option('block_caching', -1); - $views[$view->name] = $view; - - - - $view = new view; - $view->name = 'audio_user'; - $view->description = 'Audio user feed'; - $view->tag = ''; - $view->view_php = ''; - $view->base_table = 'node'; - $view->is_cacheable = FALSE; - $view->api_version = 2; - $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ - $handler = $view->new_display('default', 'Defaults', 'default'); - $handler->override_option('sorts', array( - 'created' => array( - 'order' => 'ASC', - 'granularity' => 'second', - 'id' => 'created', - 'table' => 'node', - 'field' => 'created', - 'override' => array( - 'button' => 'Override', - ), - 'relationship' => 'none', - ), - )); - $handler->override_option('arguments', array( - 'uid' => array( - 'default_action' => 'summary asc', - 'style_plugin' => 'default_summary', - 'style_options' => array( - 'count' => 1, - 'override' => 0, - 'items_per_page' => '25', - ), - 'wildcard' => 'all', - 'wildcard_substitution' => 'All', - 'title' => '', - 'default_argument_type' => 'fixed', - 'default_argument' => '', - 'validate_type' => 'none', - 'validate_fail' => 'not found', - 'break_phrase' => 0, - 'not' => 0, - 'id' => 'uid', - 'table' => 'users', - 'field' => 'uid', - 'override' => array( - 'button' => 'Override', - ), - 'relationship' => 'none', - 'default_options_div_prefix' => '', - 'default_argument_user' => 0, - 'default_argument_fixed' => '', - 'default_argument_php' => '', - 'validate_argument_node_type' => array( - 'blog' => 0, - 'poll' => 0, - 'audio' => 0, - 'image' => 0, - 'book' => 0, - 'page' => 0, - 'story' => 0, - 'video' => 0, - ), - 'validate_argument_node_access' => 0, - 'validate_argument_nid_type' => 'nid', - 'validate_argument_vocabulary' => array( - '1' => 0, - ), - 'validate_argument_type' => 'tid', - 'validate_argument_php' => '', - ), - )); - $handler->override_option('filters', array( - 'type' => array( - 'operator' => 'in', - 'value' => array( - 'audio' => 'audio', - ), - 'group' => '0', - 'exposed' => FALSE, - 'expose' => array( - 'operator' => FALSE, - 'label' => '', - ), - 'id' => 'type', - 'table' => 'node', - 'field' => 'type', - 'relationship' => 'none', - ), - 'status' => array( - 'operator' => '=', - 'value' => 1, - 'group' => '0', - 'exposed' => FALSE, - 'expose' => array( - 'operator' => FALSE, - 'label' => '', - ), - 'id' => 'status', - 'table' => 'node', - 'field' => 'status', - 'relationship' => 'none', - ), - )); - $handler->override_option('access', array( - 'type' => 'perm', - 'perm' => 'access content', - )); - $handler->override_option('title', 'User\'s Audio'); - $handler->override_option('header_format', '1'); - $handler->override_option('footer_format', '1'); - $handler->override_option('empty_format', '1'); - $handler->override_option('items_per_page', '10'); - $handler->override_option('use_pager', TRUE); - $handler->override_option('row_plugin', 'node'); - $handler->override_option('row_options', array( - 'teaser' => 1, - 'links' => 1, - 'comments' => 0, - )); - $handler = $view->new_display('page', 'Page', 'page_1'); - $handler->override_option('path', 'audio/user'); - $handler->override_option('menu', array( - 'type' => 'none', - 'title' => '', - 'weight' => 0, - )); - $handler->override_option('tab_options', array( - 'type' => 'none', - 'title' => '', - 'weight' => 0, - )); - $handler = $view->new_display('feed', 'Feed', 'feed_1'); - $handler->override_option('style_plugin', 'rss'); - $handler->override_option('style_options', array( - 'mission_description' => FALSE, - 'description' => '', - )); - $handler->override_option('row_plugin', 'node_rss'); - $handler->override_option('row_options', array( - 'item_length' => 'default', - )); - $handler->override_option('path', 'user/%/feed'); - $handler->override_option('menu', array( - 'type' => 'none', - 'title' => '', - 'weight' => 0, - )); - $handler->override_option('tab_options', array( - 'type' => 'none', - 'title' => '', - 'weight' => 0, - )); - $handler->override_option('displays', array( - 'default' => 'default', - 'page_1' => 'page_1', - )); - $handler->override_option('sitename_title', FALSE); - $views[$view->name] = $view; - - - - return $views; -} Index: views/audio.views.inc =================================================================== RCS file: views/audio.views.inc diff -N views/audio.views.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ views/audio.views.inc 4 Feb 2009 20:32:58 -0000 @@ -0,0 +1,369 @@ + array( + 'left_field' => 'vid', + 'field' => 'vid', + ), + 'node_revisions' => array( + 'left_field' => 'vid', + 'field' => 'vid', + ), + 'files' => array( + 'left_field' => 'fid', + 'field' => 'fid', + ), + ); + + // ---------------------------------------------------------------- + // Fields + + $data['audio']['play_count'] = array( + 'title' => t('Play count'), + 'help' => t('This will display the number of times this has been played.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + 'label' => t('Plays'), + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + $data['audio']['download_count'] = array( + 'title' => t('Download count'), + 'help' => t('This will display the number of times this has been downloaded.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + 'label' => t('Plays'), + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + $data['audio']['playtime'] = array( + 'title' => t('Length'), + 'help' => t('The playing time of the audio.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + $data['audio']['downloadable'] = array( + 'title' => t('Downloadable'), + 'help' => t('Whether or not the audio is downloadable.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Downloadable'), + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + $data['audio']['player'] = array( + 'title' => t('Player'), + 'help' => t('This will display a flash player.'), + 'real field' => 'nid', + 'field' => array( + 'handler' => 'audio_handler_field_player', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + $data['audio']['play_link'] = array( + 'title' => t('Play link'), + 'help' => t('This will display a player link link.'), + 'real field' => 'fid', + 'field' => array( + 'handler' => 'audio_handler_field_play_link', + 'additional fields' => array('nid', 'fid'), + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + $data['audio']['download_link'] = array( + 'title' => t('Download link'), + 'help' => t('This will display a download link if the node allows it.'), + 'real field' => 'fid', + 'field' => array( + 'handler' => 'audio_handler_field_download_link', + 'additional fields' => array('nid', 'fid', 'downloadable'), + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + foreach (audio_get_tags_allowed() as $tag) { + $data['audio_metadata_'. $tag]['table']['group'] = t('Audio'); + + // For other base tables, explain how we join + $data['audio_metadata_'. $tag]['table']['join'] = array( + 'node' => array( + 'left_field' => 'vid', + 'table' => 'audio_metadata', + 'field' => 'vid', + 'extra' => array(array('field' => 'tag', 'value' => $tag, 'operator' => '=')) + ), + 'node_revisions' => array( + 'left_field' => 'vid', + 'table' => 'audio_metadata', + 'field' => 'vid', + 'extra' => array(array('field' => 'tag', 'value' => $tag, 'operator' => '=')) + ), + ); + + $data['audio_metadata_'. $tag]['value'] = array( + 'title' => t('@tag', array('@tag' => drupal_ucfirst($tag))), + 'help' => t('The value of the @tag metadata field.', array('@tag' => $tag)), + 'field' => array( + 'handler' => 'views_handler_field_xss', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); +/* + $data['audio_metadata_'. $tag]['clean'] = array( + 'title' => t('Cleaned @tag value', array('@tag' => $tag)), + 'help' => t('The stripped down version of the @tag metadata field.', array('@tag' => $tag)), + 'field' => array( + 'handler' => 'views_handler_field_xss', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); +*/ + } + + return $data; +} + +function audio_views_tables() { + $players = array(); + foreach (audio_get_players('names') as $name => $player) { + $players[$name] = $player['title']; + } + + $tables['audio'] = array( + 'name' => 'audio', + 'join' => array( + 'left' => array( + 'table' => 'node', + 'field' => 'vid' + ), + 'right' => array( + 'field' => 'vid' + ) + ), + 'fields' => array( + 'play_link' => array( + 'name' => t('Audio: Player link/flash'), + 'handler' => 'audio_views_handler_field_player', + 'option' => array( + '#type' => 'select', + '#options' => $players, + ), + 'notafield' => TRUE, + 'sortable' => FALSE, + 'help' => t('This will display a flash player/link.'), + ), + 'download_link' => array( + 'name' => t('Audio: Download link'), + 'handler' => 'audio_views_handler_field_download', + 'notafield' => TRUE, + 'sortable' => FALSE, + 'help' => t('This will display a download link if the node allows it.'), + ), + 'file_size' => array( + 'name' => t('Audio: File size'), + 'handler' => 'views_handler_field_filesize', + 'sortable' => TRUE, + 'help' => t("This will display the audio file's size."), + ), + ), + ); + + $numeric_tags = array('track', 'year'); + + foreach (audio_get_tags_allowed() as $tag) { + $tables['audio_metadata_'. $tag] = array( + 'name' => 'audio_metadata', + 'join' => array( + 'left' => array( + 'table' => 'audio', + 'field' => 'vid' + ), + 'right' => array( + 'field' => 'vid' + ), + 'extra' => array( + 'tag' => $tag + ), + ), + 'fields' => array( + 'value' => array( + 'name' => t('Audio: Tag @tag', array('@tag' => $tag)), + 'sortable' => TRUE, + 'help' => t('This will display tag %tag values.', array('%tag' => $tag)), + ), + ), + 'filters' => array( + 'clean' => array( + 'name' => t('Audio: Tag @tag', array('@tag' => $tag)), + 'tag' => $tag, + 'operator' => array('=' => 'Equals'), + 'list' => 'audio_views_handler_filter_tags', + 'list-type' => 'list', + 'operator' => 'views_handler_operator_or', + 'value-type' => 'array', + 'help' => t('Filter by whether or not the audio is downloadable. '), + ), + ), + 'sorts' => array( + 'value' => array( + 'name' => t('Audio: Tag @tag', array('@tag' => $tag)), + 'help' => t('Sort audio nodes by tag %tag values.', array('%tag' => $tag)), + ), + ), + ); + + // Use different handlers for numeric tags. + if (in_array($tag, $numeric_tags)) { + $tables["audio_metadata_$tag"]['sorts']['value']['handler'] = 'audio_views_sort_handler_numeric_tag'; + // Set notafield to TRUE so that our handler can add the field. + $tables["audio_metadata_$tag"]['fields']['value']['notafield'] = TRUE; + $tables["audio_metadata_$tag"]['fields']['value']['query_handler'] = 'audio_views_field_query_handler_numeric'; + } + } + + return $tables; +} + +// TODO: profile this code and see if it can be optimized. +function audio_views_handler_field_player($fieldinfo, $fielddata, $value, $data) { + $node = node_load($data->nid); + return audio_get_node_player($node, $fielddata['options']); +} + +// TODO: profile this code and see if it can be optimized. +function audio_views_handler_field_download($fieldinfo, $fielddata, $value, $data) { + $node = node_load($data->nid); + if ($node->url_download) { + return l(t('download audio file'), $node->url_download, NULL); + } +} + +function audio_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'audio') . '/views/handlers', + ), + 'handlers' => array( + // field handlers + 'audio_handler_field_download_link' => array( + 'parent' => 'views_handler_field', + ), + 'audio_handler_field_play_link' => array( + 'parent' => 'views_handler_field', + ), + 'audio_handler_field_player' => array( + 'parent' => 'views_handler_field', + ), + ), + ); +} + +/** + * + */ +function audio_views_handler_filter_tags($op, $field) { + $tags = array(); + $result = db_query(db_rewrite_sql("SELECT a.value, a.clean FROM {node} n INNER JOIN {audio_metadata} a ON n.vid = a.vid WHERE a.tag = '%s' ORDER BY a.value ASC"), $field['tag']); + while ($obj = db_fetch_object($result)) { + $tags[$obj->clean] = $obj->value; + } + return $tags; +} + +/** + * Field sort handler to convert numeric values in string fiels for sorting. + * + * For more info on how this works see: http://blog.feedmarker.com/2006/02/01/how-to-do-natural-alpha-numeric-sort-in-mysql/ + */ +function audio_views_field_query_handler_numeric($fielddata, $fieldinfo, &$query) { + // This handler expects that the field will have 'notafield' => TRUE so that + // we can add in our field and not have worry about views overwriting it with + // the default. + $query->add_field($fielddata['field'] .' + 0', $fielddata['tablename'], $fielddata['queryname']); +} + +/** + * Sort handler to convert numeric values in string fiels for sorting. + * + * For more info on how this works see: http://blog.feedmarker.com/2006/02/01/how-to-do-natural-alpha-numeric-sort-in-mysql/ + */ +function audio_views_sort_handler_numeric_tag($op, &$query, $sortinfo, $sort) { + // We go to a bunch of trouble here to make sure we're adding the same field + // as audio_views_field_query_handler_numeric() would so that views doesn't + // duplicate it. + $query->add_orderby('', $sort['field'] .' + 0', $sort['sortorder'], $sortinfo['table'] .'_'. $sortinfo['field']); + +} Index: views/audio.views_default.inc =================================================================== RCS file: views/audio.views_default.inc diff -N views/audio.views_default.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ views/audio.views_default.inc 4 Feb 2009 20:32:58 -0000 @@ -0,0 +1,382 @@ +name = 'audio'; + $view->description = 'Audio nodes'; + $view->tag = ''; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = FALSE; + $view->api_version = 2; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('fields', array( + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + ), + )); + $handler->override_option('sorts', array( + 'created' => array( + 'id' => 'created', + 'table' => 'node', + 'field' => 'created', + ), + )); + $handler->override_option('filters', array( + 'type' => array( + 'operator' => 'in', + 'value' => array( + 'audio' => 'audio', + ), + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'id' => 'type', + 'table' => 'node', + 'field' => 'type', + 'relationship' => 'none', + ), + 'status' => array( + 'operator' => '=', + 'value' => 1, + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'perm', + 'perm' => 'access content', + )); + $handler->override_option('title', 'Audio'); + $handler->override_option('header_format', '1'); + $handler->override_option('footer_format', '1'); + $handler->override_option('empty_format', '1'); + $handler->override_option('items_per_page', '10'); + $handler->override_option('use_pager', TRUE); + $handler->override_option('row_plugin', 'node'); + $handler->override_option('row_options', array( + 'teaser' => TRUE, + 'links' => TRUE, + )); + $handler = $view->new_display('page', 'Page', 'page_1'); + $handler->override_option('path', 'audio'); + $handler->override_option('menu', array( + 'type' => 'normal', + 'title' => 'Audio', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => '0', + )); + $handler = $view->new_display('block', 'Block', 'block_1'); + $handler->override_option('title', 'Recent audio'); + $handler->override_option('items_per_page', '5'); + $handler->override_option('style_plugin', 'list'); + $handler->override_option('style_options', array( + 'type' => 'ul', + )); + $handler->override_option('row_plugin', 'fields'); + $handler->override_option('block_description', ''); + $handler->override_option('block_caching', -1); + $handler = $view->new_display('feed', 'Feed', 'feed_1'); + $handler->override_option('style_plugin', 'rss'); + $handler->override_option('style_options', array( + 'mission_description' => FALSE, + 'description' => '', + )); + $handler->override_option('row_plugin', 'node_rss'); + $handler->override_option('row_options', array( + 'item_length' => 'default', + )); + $handler->override_option('path', 'audio/feed'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('displays', array( + 'default' => 'default', + 'page_1' => 'page_1', + 'block_1' => 'block_1', + )); + $handler->override_option('sitename_title', FALSE); + $views[$view->name] = $view; + + + + $view = new view; + $view->name = 'audio_random'; + $view->description = 'Random audio nodes'; + $view->tag = ''; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = FALSE; + $view->api_version = 2; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('fields', array( + 'title' => array( + 'label' => '', + 'link_to_node' => 1, + 'exclude' => 0, + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'relationship' => 'none', + ), + )); + $handler->override_option('sorts', array( + 'random' => array( + 'order' => 'ASC', + 'id' => 'random', + 'table' => 'views', + 'field' => 'random', + 'relationship' => 'none', + ), + )); + $handler->override_option('filters', array( + 'type' => array( + 'operator' => 'in', + 'value' => array( + 'audio' => 'audio', + ), + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'id' => 'type', + 'table' => 'node', + 'field' => 'type', + 'relationship' => 'none', + ), + 'status' => array( + 'operator' => '=', + 'value' => 1, + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'perm', + 'perm' => 'access content', + )); + $handler->override_option('title', 'Random audio'); + $handler->override_option('header_format', '1'); + $handler->override_option('footer_format', '1'); + $handler->override_option('empty_format', '1'); + $handler->override_option('items_per_page', 5); + $handler->override_option('style_plugin', 'list'); + $handler->override_option('style_options', array( + 'grouping' => '', + 'type' => 'ul', + )); + $handler = $view->new_display('block', 'Block', 'block_1'); + $handler->override_option('items_per_page', '5'); + $handler->override_option('style_options', array( + 'type' => 'ul', + )); + $handler->override_option('block_description', ''); + $handler->override_option('block_caching', -1); + $views[$view->name] = $view; + + + + $view = new view; + $view->name = 'audio_user'; + $view->description = 'Audio user feed'; + $view->tag = ''; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = FALSE; + $view->api_version = 2; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('sorts', array( + 'created' => array( + 'order' => 'ASC', + 'granularity' => 'second', + 'id' => 'created', + 'table' => 'node', + 'field' => 'created', + 'override' => array( + 'button' => 'Override', + ), + 'relationship' => 'none', + ), + )); + $handler->override_option('arguments', array( + 'uid' => array( + 'default_action' => 'summary asc', + 'style_plugin' => 'default_summary', + 'style_options' => array( + 'count' => 1, + 'override' => 0, + 'items_per_page' => '25', + ), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate_type' => 'none', + 'validate_fail' => 'not found', + 'break_phrase' => 0, + 'not' => 0, + 'id' => 'uid', + 'table' => 'users', + 'field' => 'uid', + 'override' => array( + 'button' => 'Override', + ), + 'relationship' => 'none', + 'default_options_div_prefix' => '', + 'default_argument_user' => 0, + 'default_argument_fixed' => '', + 'default_argument_php' => '', + 'validate_argument_node_type' => array( + 'blog' => 0, + 'poll' => 0, + 'audio' => 0, + 'image' => 0, + 'book' => 0, + 'page' => 0, + 'story' => 0, + 'video' => 0, + ), + 'validate_argument_node_access' => 0, + 'validate_argument_nid_type' => 'nid', + 'validate_argument_vocabulary' => array( + '1' => 0, + ), + 'validate_argument_type' => 'tid', + 'validate_argument_php' => '', + ), + )); + $handler->override_option('filters', array( + 'type' => array( + 'operator' => 'in', + 'value' => array( + 'audio' => 'audio', + ), + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'id' => 'type', + 'table' => 'node', + 'field' => 'type', + 'relationship' => 'none', + ), + 'status' => array( + 'operator' => '=', + 'value' => 1, + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'perm', + 'perm' => 'access content', + )); + $handler->override_option('title', 'User\'s Audio'); + $handler->override_option('header_format', '1'); + $handler->override_option('footer_format', '1'); + $handler->override_option('empty_format', '1'); + $handler->override_option('items_per_page', '10'); + $handler->override_option('use_pager', TRUE); + $handler->override_option('row_plugin', 'node'); + $handler->override_option('row_options', array( + 'teaser' => 1, + 'links' => 1, + 'comments' => 0, + )); + $handler = $view->new_display('page', 'Page', 'page_1'); + $handler->override_option('path', 'audio/user'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler = $view->new_display('feed', 'Feed', 'feed_1'); + $handler->override_option('style_plugin', 'rss'); + $handler->override_option('style_options', array( + 'mission_description' => FALSE, + 'description' => '', + )); + $handler->override_option('row_plugin', 'node_rss'); + $handler->override_option('row_options', array( + 'item_length' => 'default', + )); + $handler->override_option('path', 'user/%/feed'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('displays', array( + 'default' => 'default', + 'page_1' => 'page_1', + )); + $handler->override_option('sitename_title', FALSE); + $views[$view->name] = $view; + + + + return $views; +} Index: views/handlers/audio_handler_field_download_link.inc =================================================================== RCS file: views/handlers/audio_handler_field_download_link.inc diff -N views/handlers/audio_handler_field_download_link.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ views/handlers/audio_handler_field_download_link.inc 4 Feb 2009 20:32:58 -0000 @@ -0,0 +1,41 @@ + 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + } + + function render($values) { + if (!empty($this->aliases['nid']) && !empty($this->aliases['fid']) && !empty($this->aliases['downloadable'])) { + $text = !empty($this->options['text']) ? $this->options['text'] : t('download'); + $nid = $values->{$this->aliases['nid']}; + $fid = $values->{$this->aliases['fid']}; + $downloadable = $values->{$this->aliases['downloadable']}; + + if ($downloadable) { + $file = db_fetch_object(db_query("SELECT * FROM {files} WHERE fid=%d", $fid)); + if (isset($file->filepath) && file_exists($file->filepath)) { + // iTunes and other podcasting programs check the url to determine the + // file type. we'll add the original file name on to the end. see issues + // #35398 and #68716 for more info. + $url = 'audio/download/'. $nid .'/'. $file->filename; + return l($text, url($url, array('absolute' => TRUE))); + } + } + } + + return ''; + } +} Index: views/handlers/audio_handler_field_play_link.inc =================================================================== RCS file: views/handlers/audio_handler_field_play_link.inc diff -N views/handlers/audio_handler_field_play_link.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ views/handlers/audio_handler_field_play_link.inc 4 Feb 2009 20:32:58 -0000 @@ -0,0 +1,27 @@ + 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + } + + function render($values) { + if (!empty($this->aliases['nid'])) { + $text = !empty($this->options['text']) ? $this->options['text'] : t('play'); + $nid = $values->{$this->aliases['nid']}; + + $url = 'audio/play/'. $nid; + return l($text, url($url, array('absolute' => TRUE))); + } + + return ''; + } +} Index: views/handlers/audio_handler_field_player.inc =================================================================== RCS file: views/handlers/audio_handler_field_player.inc diff -N views/handlers/audio_handler_field_player.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ views/handlers/audio_handler_field_player.inc 4 Feb 2009 20:32:58 -0000 @@ -0,0 +1,46 @@ + $players[0]); + + return $options; + } + + /** + * Provide link to the page being visited. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $players = audio_get_players('names'); + $options = array(); + foreach ($players as $name => $player) { + $options[$name] = $player['title']; + } + + $form['player'] = array( + '#title' => t('Select a player'), + '#type' => 'select', + '#options' => $options, + '#default_value' => $this->options['player'], + ); + } + + function render($values) { + if (!empty($this->field_alias)) { + if ($nid = $values->{$this->field_alias}) { + $node = node_load($nid); + return audio_get_node_player($node, $this->options['player']); + } + } + + return ''; + } +}