diff --git a/browse.php b/browse.php index 220a0f9b..69454c2e 100644 --- a/browse.php +++ b/browse.php @@ -37,6 +37,7 @@ require_once 'lib/init.php'; /* Display the headers and menus */ require_once Config::get('prefix') . '/templates/header.inc.php'; +echo '
'; switch($_REQUEST['action']) { case 'file': @@ -104,37 +105,8 @@ switch($_REQUEST['action']) { break; case 'song': Browse::set_type('song'); - - /* Setup the View Object */ - $view = new View(); - $view->import_session_view(); - - $match = scrub_in($_REQUEST['match']); - - require (conf('prefix') . '/templates/show_box_top.inc.php'); - show_alphabet_list('song_title','browse.php',$match,'song_title'); - /* Detect if it's Browse, and if so don't fill it in */ - if ($match == 'Browse') { $match = ''; } - show_alphabet_form($match,_('Show Titles Starting With'),"browse.php"); - require (conf('prefix') . '/templates/show_box_bottom.inc.php'); - - $sql = $song->get_sql_from_match($_REQUEST['match']); - - if ($_REQUEST['keep_view']) { - $view->initialize(); - } - else { - $db_results = mysql_query($sql, dbh()); - $total_items = mysql_num_rows($db_results); - $offset_limit = 999999; - if ($match != 'Show All') { $offset_limit = $user->prefs['offset_limit']; } - $view = new View($sql, 'browse.php?action=song_title','title',$total_items,$offset_limit); - } - - if ($view->base_sql) { - $songs = $song->get_songs($view->sql); - show_songs($songs,0,0); - } + $song_ids = Browse::get_objects(); + Browse::show_objects($song_ids); break; case 'catalog': @@ -146,6 +118,8 @@ switch($_REQUEST['action']) { break; } // end Switch $action +echo '
'; + /* Show the Footer */ show_footer(); ?> diff --git a/images/icon_add.png b/images/icon_add.png new file mode 100644 index 00000000..6332fefe Binary files /dev/null and b/images/icon_add.png differ diff --git a/lib/class/browse.class.php b/lib/class/browse.class.php index eaa540bb..531ccc26 100644 --- a/lib/class/browse.class.php +++ b/lib/class/browse.class.php @@ -29,12 +29,14 @@ */ class Browse { - + // Public static vars that are cached + public static $sql; + /** * constructor * This should never be called */ - private __construct() { + private function __construct() { // Rien a faire @@ -56,9 +58,14 @@ class Browse { case 'unplayed': case 'rated': $key = $_REQUEST['key']; - $_SESSION['browse']['filter'][$key] = make_bool($_REQUEST['value']); + if ($_SESSION['browse']['filter'][$key]) { + unset($_SESSION['browse']['filter'][$key]); + } + else { + $_SESSION['browse']['filter'][$key] = 1; + } break; - default + default: // Rien a faire break; } // end switch @@ -87,4 +94,145 @@ class Browse { } // set_type + /** + * get_objects + * This gets an array of the ids of the objects that we are + * currently browsing by it applies the sql and logic based + * filters + */ + public static function get_objects() { + + // First we need to get the SQL statement we are going to run + // This has to run against any possible filters (dependent on type) + $sql = self::get_sql(); + $db_results = Dba::query($sql); + + $results = array(); + + while ($data = Dba::fetch_assoc($db_results)) { + // If we've hit our offset limit + if (count($results) >= $GLOBALS['user']->prefs['offset_limit']) { return $results; } + + // Make sure that this object passes the logic filter + if (self::logic_filter($data['id'])) { + $results[] = $data['id']; + } + } // end while + + return $results; + + } // get_objects + + /** + * get_sql + * This returns the sql statement we are going to use this has to be run + * every time we get the objects because it depends on the filters and the + * type of object we are currently browsing + */ + public static function get_sql() { + + // Get our base SQL must always return ID + switch ($_SESSION['browse']['type']) { + case 'album': + + break; + case 'artist': + + break; + case 'genre': + + break; + case 'song': + default: + $sql = "SELECT `song`.`id` FROM `song` "; + break; + } // end base sql + + // No sense to go further if we don't have filters + if (!is_array($_SESSION['browse']['filter'])) { return $sql; } + + // Foreach the filters and see if any of them can be applied + // as part of a where statement in this sql (type dependent) + $where_sql = "WHERE 1=1 AND "; + + foreach ($_SESSION['browse']['filter'] as $key=>$value) { + $where_sql .= self::sql_filter($key,$value); + } // end foreach + + $where_sql = rtrim($where_sql,'AND '); + + $sql .= $where_sql; + + self::$sql = $sql; + + return $sql; + + } // get_sql + + /** + * sql_filter + * This takes a filter name and value and if it is possible + * to filter by this name on this type returns the approiate sql + * if not returns nothing + */ + private static function sql_filter($filter,$value) { + + $filter_sql = ''; + + if ($_SESSION['browse']['type'] == 'song') { + switch($filter) { + case 'alpha_match': + $filter_sql = " `song`.`title` LIKE '" . Dba::escape($value) . "%' AND "; + break; + case 'unplayed': + $filter_sql = " `song`.`played`='0' AND "; + break; + default: + // Rien a faire + break; + } // end list of sqlable filters + } // if it is a song + + if ($_SESSION['browse']['type'] == 'album') { + + + + + } // end album + + return $filter_sql; + + } // sql_filter + + /** + * logic_filter + * This runs the filters that we can't easily apply + * to the sql so they have to be done after the fact + * these should be limited as they are often intensive and + * require additional queries per object... :( + */ + private static function logic_filter($object_id) { + + return true; + + } // logic_filter + + /** + * show_objects + * This takes an array of objects + * and requires the correct template based on the + * type that we are currently browsing + */ + public static function show_objects($object_ids) { + + switch ($_SESSION['browse']['type']) { + case 'song': + show_box_top(); + require_once Config::get('prefix') . '/templates/show_songs.inc.php'; + show_box_bottom(); + break; + } // end switch on type + + } // show_object + } // browse diff --git a/lib/class/song.class.php b/lib/class/song.class.php index 7711ea95..ca1b5bbf 100644 --- a/lib/class/song.class.php +++ b/lib/class/song.class.php @@ -126,12 +126,12 @@ class Song { } // fill_ext_info - /*! - @function format_type - @discussion gets the type of song we are trying to - play, used to set mime headers and to trick - players into playing them correctly - */ + /** + * format_type + * gets the type of song we are trying to + * play, used to set mime headers and to trick + * players into playing them correctly + */ function format_type($override='') { // If we pass an override for downsampling or whatever then use it @@ -633,20 +633,6 @@ class Song { } // _update_ext_item - /*! - @function format_song - @discussion this takes a song object - and formats it for display - and returns the object cleaned up - */ - function format_song() { - - $this->format(); - - return true; - - } - /** * format * This takes the current song object diff --git a/templates/list_header.inc b/templates/list_header.inc.php similarity index 99% rename from templates/list_header.inc rename to templates/list_header.inc.php index 257c5220..7fb13a57 100644 --- a/templates/list_header.inc +++ b/templates/list_header.inc.php @@ -1,7 +1,7 @@ username == $playlist->user || $GLOBALS['user']->has_access('100'))) { - $tab = 1; - $playlist_owner = true; -} - -//Horrible hack! -if ($_SERVER['SCRIPT_NAME'] == '/browse.php') { - // Setup the links - $link_end = ''; - $title_start = ''; - $track_start = ''; - $bit_start = ''; -} -?> - -
- - - - - - - - - - - - - - - - - - - - - - - - -title = 'Dynamic Song'; - $track_id = $song_id['id']; - } - } // end if playlist - elseif (!is_object($song_id)) { - unset($text_class); - $song = new Song($song_id); - $track_id = $song->id; - } - else { - $song = $song_id; - $track_id = $song->id; - } - $song->format_song(); - // Still needed crap - $totalsize += $song->size; - $totaltime += $song->time; - /* If it's disabled */ - if ($song->status == "disabled") { $text_class = "class=\"disabled\""; } -?> - - - get_track($track_id); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- offset_limit) { require (conf('prefix') . "/templates/list_header.inc"); } ?> -
  Select
- - - " value="" onchange="" /> - - has_flag()) { echo "**"; } ?> - >f_title); ?> - - >f_artist); ?> - - >f_album); ?> - - track; ?> - - f_time; ?> - - f_size; ?> MB - - f_bitrate; ?> - - - f_genre; ?> - - - - has_flag()) { - echo get_user_icon('flag'); - } - else { - echo get_user_icon('flag_off'); - } - ?> - - has_access('100')) { ?> - - - - enabled) { ?> - - - - - - - - - - prefs['download']) { ?> - title . "." . $song->type); ?>"> - - - - prefs['direct_link']) { ?> - - - - - - id,'song'); ?> -
: song(s) MB
- offset_limit) { require (conf('prefix') . "/templates/list_header.inc"); } ?> -
-
- -
- - diff --git a/templates/show_songs.inc.php b/templates/show_songs.inc.php new file mode 100644 index 00000000..e0fa49be --- /dev/null +++ b/templates/show_songs.inc.php @@ -0,0 +1,53 @@ + + + + + + + + + + + +format(); +?> + + + + + + + +
+ +
+ + f_link; ?>f_artist_link; ?>f_album_link; ?>