From 81a854f7ea737ecdb05ebfb5d09209508f34b745 Mon Sep 17 00:00:00 2001 From: Karl 'vollmerk' Vollmer Date: Sun, 16 Dec 2007 23:52:06 +0000 Subject: fixed the find duplicates stuff, its actually still broken somewhat but it mostly works so why not commit eah? --- admin/duplicates.php | 26 +++---- docs/CHANGELOG | 1 + lib/class/catalog.class.php | 71 +++++++++++++++++++ lib/class/preference.class.php | 1 - lib/duplicates.php | 120 --------------------------------- login.php | 2 +- server/ajax.server.php | 4 ++ server/song.ajax.php | 48 +++++++++++++ templates/show_duplicate.inc.php | 43 ++++++++++++ templates/show_duplicates.inc.php | 94 +++++++++++++++++--------- templates/show_list_duplicates.inc.php | 103 ---------------------------- templates/sidebar_admin.inc.php | 1 + themes/classic/templates/default.css | 6 +- themes/greysme/templates/default.css | 3 +- 14 files changed, 249 insertions(+), 274 deletions(-) delete mode 100644 lib/duplicates.php create mode 100644 server/song.ajax.php create mode 100644 templates/show_duplicate.inc.php delete mode 100644 templates/show_list_duplicates.inc.php diff --git a/admin/duplicates.php b/admin/duplicates.php index 09602d53..aac0ceef 100644 --- a/admin/duplicates.php +++ b/admin/duplicates.php @@ -1,7 +1,7 @@ has_access(100)) { +if (!Access::check('interface','100')) { access_denied(); exit; } -$action = scrub_in($_REQUEST['action']); -$search_type = scrub_in($_REQUEST['search_type']); - -show_template('header'); +show_header(); /* Switch on Action */ -switch ($action) { - case 'search': - $flags = get_duplicate_songs($search_type); - show_duplicate_songs($flags,$search_type); +switch ($_REQUEST['action']) { + case 'find_duplicates': + $duplicates = Catalog::get_duplicate_songs($_REQUEST['search_type']); + require_once Config::get('prefix') . '/templates/show_duplicate.inc.php'; + require_once Config::get('prefix') . '/templates/show_duplicates.inc.php'; break; default: - show_duplicate_searchbox($search_type); + require_once Config::get('prefix') . '/templates/show_duplicate.inc.php'; break; } // end switch on action diff --git a/docs/CHANGELOG b/docs/CHANGELOG index 9204bb9b..4383e026 100755 --- a/docs/CHANGELOG +++ b/docs/CHANGELOG @@ -4,6 +4,7 @@ -------------------------------------------------------------------------- v.3.4-Alpha4 + - Fixed Find Duplicates Functionality - Added Highest Rated option to Advanced Random - Fixed incorrect mime type being set on ASX playlists - Fixed problem where you couldn't change playlist type diff --git a/lib/class/catalog.class.php b/lib/class/catalog.class.php index 39c2c7ea..d5e8535f 100644 --- a/lib/class/catalog.class.php +++ b/lib/class/catalog.class.php @@ -790,6 +790,77 @@ class Catalog { } //get_files + /** + * get_duplicate_songs + * This function takes a search type and returns a list of all song_ids that + * are likely to be duplicates based on teh search method selected. + */ + public static function get_duplicate_songs($search_method) { + + // Setup the base SQL + $sql = "SELECT song.id AS song,artist.id AS artist,album.id AS album,title,COUNT(title) AS ctitle". + " FROM `song` LEFT JOIN `artist` ON `artist`.`id`=`song`.`artist` " . + " LEFT JOIN `album` ON `album`.`id`=`song`.`album` ". + " GROUP BY song.title"; + + // Add any Additional constraints + if ($search_method == "artist_title" OR $search_method == "artist_album_title") { + $sql = $sql.",artist.name"; + } + + if ($search_method == "artist_album_title") { + $sql = $sql.",album.name"; + } + + // Final componets + $sql = $sql." HAVING COUNT(title) > 1"; + $sql = $sql." ORDER BY `ctitle`"; + + $db_results = Dba::query($sql); + + $results = array(); + + while ($item = Dba::fetch_assoc($db_results)) { + $results[] = $item; + } // end while + + return $results; + + } // get_duplicate_songs + + /** + * get_duplicate_info + * This takes a song, search type and auto flag and returns the duplicate songs in the correct + * order, it sorts them by longest, higest bitrate, largest filesize, checking + * the last one as most likely bad + */ + public static function get_duplicate_info($item,$search_type) { + // Build the SQL + $sql = "SELECT `song`.`id`" . + " FROM song,artist,album". + " WHERE song.artist=artist.id AND song.album=album.id". + " AND song.title= '".Dba::escape($item['title'])."'"; + + if ($search_type == "artist_title" || $search_type == "artist_album_title") { + $sql .=" AND artist.id = '".Dba::escape($item['artist'])."'"; + } + if ($search_type == "artist_album_title" ) { + $sql .=" AND album.id = '".Dba::escape($item['album'])."'"; + } + + $sql .= " ORDER BY `time`,`bitrate`,`size` LIMIT 2"; + $db_results = Dba::query($sql); + + $results = array(); + + while ($item = Dba::fetch_assoc($db_results)) { + $results[] = $item['id']; + } // end while + + return $results; + + } // get_duplicate_info + /** * dump_album_art (Added by Cucumber 20050216) * This runs through all of the albums and trys to dump the diff --git a/lib/class/preference.class.php b/lib/class/preference.class.php index 71b714fc..da4242c8 100644 --- a/lib/class/preference.class.php +++ b/lib/class/preference.class.php @@ -341,7 +341,6 @@ class Preference { Config::set_by_array($results,1); - } // init diff --git a/lib/duplicates.php b/lib/duplicates.php deleted file mode 100644 index c6af8c58..00000000 --- a/lib/duplicates.php +++ /dev/null @@ -1,120 +0,0 @@ -'' ". - " GROUP BY title"; - - // Additional constraints - if ($search_type=="artist_title"||$search_type=="artist_album_title") { - $sql = $sql.",artist"; - } - - if ($search_type=="artist_album_title") { - $sql = $sql.",album"; - } - - // Final componets - $sql = $sql." HAVING count(title) > 1"; - $sql = $sql." ORDER BY ctitle"; - - $db_results = mysql_query($sql, dbh()); - - $arr = array(); - - while ($flag = mysql_fetch_assoc($db_results)) { - $arr[] = $flag; - } // end while - - return $arr; - -} // get_duplicate_songs - -/** - * get_duplicate_info - * This takes a song, search type and auto flag and returns the duplicate songs in the correct - * order, if AUTO is selected it sorts them by longest, higest bitrate, largest filesize, checking - * the last one as most likely bad - */ -function get_duplicate_info($song,$search_type,$auto='') { - // Get the artist name - $artist = $song->get_artist_name(); - - // Build the SQL - $sql = "SELECT song.id as songid,song.title as song,file,bitrate,size,time," . - "album.name AS album,album.id as albumid, artist.name AS artist,artist.id as artistid". - " FROM song,artist,album ". - " WHERE song.artist=artist.id AND song.album=album.id ". - " AND song.title= '".sql_escape($song->title)."'"; - - if ($search_type == "artist_title" || $search_type == "artist_album_title") { - $sql .=" AND artist.id = '".$song->artist."'"; - } - if ($search_type == "artist_album_title" ) { - $sql .=" AND album.id = '".$song->album."'"; - } - - if ($auto) { - $sql .= " ORDER BY time,bitrate,size"; - } - - $db_results = mysql_query($sql, dbh()); - - $arr = array(); - - while ($flag = mysql_fetch_assoc($db_results)) { - $arr[] = $flag; - } // end while - - return $arr; - -} // get_duplicate_info - -/*! - @function show_duplicate_songs - @discussion -*/ -function show_duplicate_songs($flags,$search_type) { - - require_once(conf('prefix').'/templates/show_list_duplicates.inc.php'); - -} // show_duplicate_songs - -/*! - @function show_duplicate_searchbox - @discussion -*/ -function show_duplicate_searchbox($search_type) { - - require_once(conf('prefix') . '/templates/show_duplicates.inc.php'); - -} // show_duplicate_searchbox - -?> diff --git a/login.php b/login.php index 983d9c8b..95184aa0 100644 --- a/login.php +++ b/login.php @@ -26,7 +26,7 @@ require_once 'lib/init.php'; * can't handle Cookie + Redirect */ vauth_session_cookie(); -Preference::init() +Preference::init(); /** * If Access Control is turned on then we don't diff --git a/server/ajax.server.php b/server/ajax.server.php index 09325883..c83a0328 100644 --- a/server/ajax.server.php +++ b/server/ajax.server.php @@ -61,6 +61,10 @@ switch ($_REQUEST['page']) { require_once Config::get('prefix') . '/server/stream.ajax.php'; exit; break; + case 'song': + require_once Config::get('prefix') . '/server/song.ajax.php'; + exit; + break; case 'democratic': require_once Config::get('prefix') . '/server/democratic.ajax.php'; exit; diff --git a/server/song.ajax.php b/server/song.ajax.php new file mode 100644 index 00000000..ae277675 --- /dev/null +++ b/server/song.ajax.php @@ -0,0 +1,48 @@ +username . ' attempted to change the state of a song','1'); + exit; + } + + $song = new Song($_REQUEST['song_id']); + $new_enabled = $song->enabled ? '0' : '1'; + $song->update_enabled($new_enabled,$song->id); + + //FIXME: Re-display this + + break; + default: + $results['rfc3514'] = '0x1'; + break; +} // switch on action; + +// We always do this +echo xml_from_array($results); +?> diff --git a/templates/show_duplicate.inc.php b/templates/show_duplicate.inc.php new file mode 100644 index 00000000..1f4ead8e --- /dev/null +++ b/templates/show_duplicate.inc.php @@ -0,0 +1,43 @@ + + +
+ + + + + +
: + + />
+ />
+ />
+
+
+ +
+
+ diff --git a/templates/show_duplicates.inc.php b/templates/show_duplicates.inc.php index 731016ad..f93bbf83 100644 --- a/templates/show_duplicates.inc.php +++ b/templates/show_duplicates.inc.php @@ -1,13 +1,12 @@ - -
- - - -
: - + + ++ + + + + + + + + + + + + + + + + + + +$song_id) { + $song = new Song($song_id); + $song->format(); + $row_key = 'duplicate_' . $song_id; + $current_class = ($key == '0') ? 'row-highlight' : flip_class(); + $button = $song->enabled ? 'disable' : 'enable'; ?> - />
- />
- />
- - - - - - + + + + + + + + + + + + + + + + + + + + +
  - - /> -
+ + f_link; ?>f_artist_link; ?>f_album_link; ?>f_time; ?>f_bitrate; ?>f_size; ?>MBfile); ?>
-
- - -
diff --git a/templates/show_list_duplicates.inc.php b/templates/show_list_duplicates.inc.php deleted file mode 100644 index 25abeecc..00000000 --- a/templates/show_list_duplicates.inc.php +++ /dev/null @@ -1,103 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - format_song(); - - // Set some extra vars - $alt_title = $song->title; - $formated_title = $song->f_title; - $artist = $song->f_artist; - $alt_artist = $song->f_full_artist; - - // Gather the duplicates - $dinfolist = get_duplicate_info($song,$search_type,$_REQUEST['auto']); - - // Set the current class, only changes once per set of duplicates - $current_class = flip_class(); - - foreach ($dinfolist as $key=>$dinfo) { - $check_txt = ''; - if ($key == '0' AND $_REQUEST['auto']) { $check_txt = ' checked="checked"'; } - echo "". - "". - "". - "". - "". - "". - "". - "". - ""; - echo "\n"; - } // end foreach ($dinfolist as $dinfo) - - } // end foreach ($flags as $flag) - ?> - - - - - - - - - - -
id\">".scrub_out($formated_title)." ".scrub_out($dinfo['artist'])." ".scrub_out($dinfo['album'])." ".floor($dinfo['time']/60).":".sprintf("%02d", ($dinfo['time']%60) )."".intval($dinfo['bitrate']/1000)."".sprintf("%.2f", ($dinfo['size']/1048576))."MB".$dinfo['file']."
-
- -
-
- - -

- - diff --git a/templates/sidebar_admin.inc.php b/templates/sidebar_admin.inc.php index c34de6bd..bc35e000 100644 --- a/templates/sidebar_admin.inc.php +++ b/templates/sidebar_admin.inc.php @@ -20,6 +20,7 @@
    • +
    diff --git a/themes/classic/templates/default.css b/themes/classic/templates/default.css index ba71d503..b45857ee 100644 --- a/themes/classic/templates/default.css +++ b/themes/classic/templates/default.css @@ -507,13 +507,17 @@ a.button{padding:1px 3px;} /* table rows */ .odd, .odd td, -.even, .even td { +.even, .even td, .row-highlight { font-size: 12px; border-bottom:1px dotted #c0c0c0; } .even:hover, .odd:hover { background:#99ccff; } +.row-highlight:hover { + background:#cc3333; +} + /* Misc */ .border { background: #000; } diff --git a/themes/greysme/templates/default.css b/themes/greysme/templates/default.css index 4b753ac2..3e01a519 100644 --- a/themes/greysme/templates/default.css +++ b/themes/greysme/templates/default.css @@ -557,10 +557,11 @@ input[type=checkbox] { border:0;background:none; } } /* table rows */ -.odd, .even { background: url(../images/list_back.png) 0 50% repeat-x !important; background-image: none;} +.odd, .even, .row-highlight { background: url(../images/list_back.png) 0 50% repeat-x !important; background-image: none;} .odd { background-color: #111 !important;} .even { } .odd:hover, .even:hover { background-color: #2b293d !important;} +.row-highlight:hover { background-color: #cc3333 !important;} /* Misc */ .border { background: #000; } -- cgit