summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--admin/duplicates.php26
-rwxr-xr-xdocs/CHANGELOG1
-rw-r--r--lib/class/catalog.class.php71
-rw-r--r--lib/class/preference.class.php1
-rw-r--r--lib/duplicates.php120
-rw-r--r--login.php2
-rw-r--r--server/ajax.server.php4
-rw-r--r--server/song.ajax.php48
-rw-r--r--templates/show_duplicate.inc.php43
-rw-r--r--templates/show_duplicates.inc.php94
-rw-r--r--templates/show_list_duplicates.inc.php103
-rw-r--r--templates/sidebar_admin.inc.php1
-rw-r--r--themes/classic/templates/default.css6
-rw-r--r--themes/greysme/templates/default.css3
14 files changed, 249 insertions, 274 deletions
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 @@
<?php
/*
- Copyright (c) 2001 - 2006 Ampache.org
+ Copyright (c) 2001 - 2007 Ampache.org
All rights reserved.
This program is free software; you can redistribute it and/or
@@ -19,30 +19,24 @@
*/
+require_once '../lib/init.php';
-// Allows users to search for duplicate songs in their catalogs
-
-require_once ('../lib/init.php');
-require_once( conf('prefix').'/lib/duplicates.php');
-
-if (!$GLOBALS['user']->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
@@ -791,6 +791,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
* art for them into the 'folder.jpg' file in the appropriate dir
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 @@
-<?php
-/*
-
- Copyright (c) 2001 - 2006 Ampache.org
- All rights reserved.
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License v2
- as published by the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-/**
- * get_duplicate_songs
- * This function takes a search type and returns a list of all songs that
- * are likely to be duplicates based on the search type selected
- */
-function get_duplicate_songs($search_type) {
-
- // Setup the base SQL
- $sql = "SELECT song.id as song,artist.name,album.name,title,count(title) as ctitle".
- " FROM song,artist,album ".
- " WHERE song.artist=artist.id AND song.album=album.id AND song.title<>'' ".
- " 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 @@
+<?php
+/*
+
+ Copyright (c) 2001 - 2007 Ampache.org
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License v2
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+/**
+ * Sub-Ajax page, requires AJAX_INCLUDE as one
+ */
+if (AJAX_INCLUDE != '1') { exit; }
+
+switch ($_REQUEST['action']) {
+ case 'flip_state':
+ if (!Access::check('interface','75')) {
+ debug_event('DENIED',$GLOBALS['user']->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 @@
+<?php
+/*
+
+ Copyright (c) 2001 - 2007 Ampache.org
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+?>
+<?php show_box_top(_('Find Duplicates')); ?>
+<form name="duplicates" action="<?php echo Config::get('web_path'); ?>/admin/duplicates.php?action=find_duplicates" method="post" enctype="multipart/form-data" >
+<table cellspacing="0" cellpadding="3">
+<tr>
+ <td valign="top"><strong><?php echo _('Search Type'); ?>:</strong></td>
+ <td>
+ <?php
+ $name = 'check_' . scrub_in($_REQUEST['search_type']);
+ ${$name} = ' checked="checked" ';
+ ?>
+ <input type="radio" name="search_type" value="title"<?php echo $check_title; ?>/><?php echo _('Title'); ?><br />
+ <input type="radio" name="search_type" value="artist_title"<?php echo $check_artist_title; ?>/><?php echo _('Artist and Title'); ?><br />
+ <input type="radio" name="search_type" value="artist_album_title"<?php echo $check_artist_album_title; ?>/><?php echo _('Artist, Album and Title'); ?><br />
+ </td>
+</tr>
+</table>
+<div class="formValidation">
+ <input type="submit" value="<?php echo _('Find Duplicates'); ?>" />
+</div>
+</form>
+<?php show_box_bottom(); ?>
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 @@
<?php
/*
- Copyright (c) 2001 - 2005 Ampache.org
+ Copyright (c) 2001 - 2007 Ampache.org
All rights reserved.
This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
+ modify it under the terms of the GNU General Public License v2
+ as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,35 +18,68 @@
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-
-$web_path = conf('web_path');
?>
-<?php show_box_top(_('Find Duplicates')); ?>
-<form name="duplicates" action="<?php echo conf('web_path'); ?>/admin/duplicates.php" method="post" enctype="multipart/form-data" >
-<table cellspacing="0" cellpadding="3" width="450">
- <tr>
- <td valign="top"><?php echo _('Search Type'); ?>:</td>
- <td>
- <?php
- $name = 'check_' . $_REQUEST['search_type'];
- ${$name} = ' checked="checked" ';
+<?php show_box_top(_('Duplicate Songs')); ?>
+<form method="post" enctype="multipart/form-data" action="<?php echo $web_path; ?>/admin/flag.php?action=disable">
+<table class="tabledata" cellpadding="0" cellspacing="0">
+<colgroup>
+ <col id="col_disable" />
+ <col id="col_song" />
+ <col id="col_artist" />
+ <col id="col_album" />
+ <col id="col_length" />
+ <col id="col_bitrate" />
+ <col id="col_size" />
+ <col id="col_filename" />
+</colgroup>
+<tr class="th-top">
+ <th class="cel_disable"><?php echo _('Disable'); ?></th>
+ <th class="cel_song"><?php echo _('Song'); ?></th>
+ <th class="cel_artist"><?php echo _('Artist'); ?></th>
+ <th class="cel_album"><?php echo _('Album'); ?></th>
+ <th class="cel_length"><?php echo _('Length'); ?></th>
+ <th class="cel_bitrate"><?php echo _('Bitrate'); ?></th>
+ <th class="cel_size"><?php echo _('Size'); ?></th>
+ <th class="cel_filename"><?php echo _('Filename'); ?></th>
+</tr>
+<?php
+ foreach ($duplicates as $item) {
+ // Gather the duplicates
+ $songs = Catalog::get_duplicate_info($item,$search_type);
+
+ foreach ($songs as $key=>$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';
?>
- <input type="radio" name="search_type" value="title"<?php echo $check_title; ?>/><?php echo _('Title'); ?><br />
- <input type="radio" name="search_type" value="artist_title"<?php echo $check_artist_title; ?>/><?php echo _('Artist and Title'); ?><br />
- <input type="radio" name="search_type" value="artist_album_title"<?php echo $check_artist_album_title; ?>/><?php echo _('Artist, Album and Title'); ?><br />
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>
- <?php if ($_REQUEST['auto']) { $auto_check = ' checked="checked"'; } ?>
- <input type="checkbox" name="auto" value="1" <?php echo $auto_check; ?>/><?php echo _('Select Best Guess'); ?>
- </td>
- </tr>
+<tr id="<?php echo $row_key; ?>" class="<?php echo $current_class; ?>">
+ <td class="cel_disable">
+ <?php echo Ajax::button('?page=song&action=flip_state&song_id=' . $song_id,$button,_(ucfirst($button)),'flip_state_' . $song_id); ?>
+ </td>
+ <td class="cel_song"><?php echo $song->f_link; ?></td>
+ <td class="cel_artist"><?php echo $song->f_artist_link; ?></td>
+ <td class="cel_album"><?php echo $song->f_album_link; ?></td>
+ <td class="cel_length"><?php echo $song->f_time; ?></td>
+ <td class="cel_bitrate"><?php echo $song->f_bitrate; ?></td>
+ <td class="cel_size"><?php echo $song->f_size; ?>MB</td>
+ <td class="cel_filename"><?php echo scrub_out($song->file); ?></td>
+</tr>
+<?php
+ } // end foreach ($dinfolist as $dinfo)
+ } // end foreach ($flags as $flag)
+?>
+<tr class="th-bottom">
+ <th class="cel_disable"><?php echo _('Disable'); ?></th>
+ <th class="cel_song"><?php echo _('Song'); ?></th>
+ <th class="cel_artist"><?php echo _('Artist'); ?></th>
+ <th class="cel_album"><?php echo _('Album'); ?></th>
+ <th class="cel_length"><?php echo _('Length'); ?></th>
+ <th class="cel_bitrate"><?php echo _('Bitrate'); ?></th>
+ <th class="cel_size"><?php echo _('Size'); ?></th>
+ <th class="cel_filename"><?php echo _('Filename'); ?></th>
+</tr>
</table>
-<div class="formValidation">
- <input type="hidden" name="action" value="search" />
- <input type="submit" value="<?php echo _('Search'); ?>" />
-</div>
</form>
<?php show_box_bottom(); ?>
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 @@
-<?php
-/*
-
- Copyright (c) 2001 - 2006 Ampache.org
- All rights reserved.
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License v2
- as published by the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-$web_path = conf('web_path');
-show_duplicate_searchbox($search_type);
-
-if (count($flags)) { ?>
- <?php show_box_top(_('Duplicate Songs')); ?>
- <form method="post" enctype="multipart/form-data" action="<?php echo $web_path; ?>/admin/flag.php?action=disable">
- <table class="tabledata" cellpadding="0" cellspacing="0">
- <colgroup>
- <col id="col_disable" />
- <col id="col_song" />
- <col id="col_artist" />
- <col id="col_album" />
- <col id="col_length" />
- <col id="col_bitrate" />
- <col id="col_size" />
- <col id="col_filename" />
- </colgroup>
- <tr class="th-top">
- <th class="cel_disable"><?php echo _('Disable'); ?></th>
- <th class="cel_song"><?php echo _('Song'); ?></th>
- <th class="cel_artist"><?php echo _('Artist'); ?></th>
- <th class="cel_album"><?php echo _('Album'); ?></th>
- <th class="cel_length"><?php echo _('Length'); ?></th>
- <th class="cel_bitrate"><?php echo _('Bitrate'); ?></th>
- <th class="cel_size"><?php echo _('Size'); ?></th>
- <th class="cel_filename"><?php echo _('Filename'); ?></th>
- </tr>
- <?php
- foreach ($flags as $flag) {
- /* Build the Song */
- $song = new Song($flag['song']);
- $song->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 "<tr class=\"".$current_class."\">".
- "<td class=\"cel_disable\"><input type=\"checkbox\" name=\"song_ids[]\" value=\"" . $dinfo['songid'] . "\" $check_txt/></td>".
- "<td class=\"cel_song\"><a href=\"$web_path/stream.php?action=single_song&amp;song_id=$song->id\">".scrub_out($formated_title)."</a> </td>".
- "<td class=\"cel_artist\"><a href=\"$web_path/artists.php?action=show&amp;artist=".$dinfo['artistid']."\" title=\"".scrub_out($dinfo['artist'])."\">".scrub_out($dinfo['artist'])."</a> </td>".
- "<td class=\"cel_album\"><a href=\"$web_path/albums.php?action=show&amp;album=".$dinfo['albumid']."\" title=\"".scrub_out($dinfo['album'])."\">".scrub_out($dinfo['album'])."</a> </td>".
- "<td class=\"cel_length\">".floor($dinfo['time']/60).":".sprintf("%02d", ($dinfo['time']%60) )."</td>".
- "<td class=\"cel_bitrate\">".intval($dinfo['bitrate']/1000)."</td>".
- "<td class=\"cel_size\">".sprintf("%.2f", ($dinfo['size']/1048576))."MB</td>".
- "<td class=\"cel_filename\">".$dinfo['file']."</td>";
- echo "</tr>\n";
- } // end foreach ($dinfolist as $dinfo)
-
- } // end foreach ($flags as $flag)
- ?>
- <tr class="th-bottom">
- <th class="cel_disable"><?php echo _('Disable'); ?></th>
- <th class="cel_song"><?php echo _('Song'); ?></th>
- <th class="cel_artist"><?php echo _('Artist'); ?></th>
- <th class="cel_album"><?php echo _('Album'); ?></th>
- <th class="cel_length"><?php echo _('Length'); ?></th>
- <th class="cel_bitrate"><?php echo _('Bitrate'); ?></th>
- <th class="cel_size"><?php echo _('Size'); ?></th>
- <th class="cel_filename"><?php echo _('Filename'); ?></th>
- </tr>
- </table>
- <div class="formValidation">
- <input type="submit" value="<?php echo _('Disable Songs'); ?>" />
- </div>
- </form>
- <?php show_box_bottom(); ?>
-<?php } else { ?>
-<p class="error"><?php echo _('No Records Found'); ?></p>
-<?php } // end if ($flags) and else ?>
-
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 @@
</li>
<li><h4><?php echo _('Other Tools'); ?></h4>
<ul class="sb3" id="sb_admin_ot">
+ <li id="sb_admin_ot_Duplicates"><a href="<?php echo $web_path; ?>/admin/duplicates.php"><?php echo _('Find Duplicates'); ?></a></li>
<li id="sb_admin_ot_ClearNowPlaying"><a href="<?php echo $web_path; ?>/admin/catalog.php?action=clear_now_playing"><?php echo _('Clear Now Playing'); ?></a></li>
<li id="sb_admin_ot_ClearCatStats"><a href="<?php echo $web_path; ?>/admin/catalog.php?action=clear_stats"><?php echo _('Clear Catalog Stats'); ?></a></li>
</ul>
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; }