Package: xmms
Version: 1.2.10-2
Severity: wishlist
Tags: patch

There's a patch for 1.2.7 to remove duplicate entries in the playlist 
at http://www.lehigh.edu/~tfc4/xmms-patch.html
I adjusted the patch to cleanly apply to 1.2.10.
Please apply it.



-- System Information:
Debian Release: 3.1
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.4.27
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages xmms depends on:
ii  libc6                2.3.2.ds1-20        GNU C Library: Shared libraries an
ii  libglib1.2           1.2.10-9            The GLib library of C routines
ii  libgtk1.2            1.2.10-17           The GIMP Toolkit set of widgets fo
ii  libice6              4.3.0.dfsg.1-12.0.1 Inter-Client Exchange library
ii  libsm6               4.3.0.dfsg.1-12.0.1 X Window System Session Management
ii  libx11-6             4.3.0.dfsg.1-12.0.1 X Window System protocol client li
ii  libxext6             4.3.0.dfsg.1-12.0.1 X Window System miscellaneous exte
ii  libxi6               4.3.0.dfsg.1-12.0.1 X Window System Input extension li
ii  xlibs                4.3.0.dfsg.1-12     X Keyboard Extension (XKB) configu

-- no debconf information
diff -u -r -i xmms-1.2.10-orig/xmms/playlist.c xmms-1.2.10/xmms/playlist.c
--- xmms-1.2.10-orig/xmms/playlist.c	2004-02-23 21:31:43.000000000 +0100
+++ xmms-1.2.10/xmms/playlist.c	2005-03-05 00:52:50.000000000 +0100
@@ -1949,6 +1949,72 @@
 	}
 }
 
+void playlistwin_remove_dups()
+{
+	GList *node, *next_node, *curr_pos, *temp, *next_temp;
+	PlaylistEntry *entry, *temp_entry;
+	gboolean list_changed = FALSE;
+
+	PL_LOCK();
+	node = playlist;
+	while (node)
+	{
+		/* A dead file is a file that is not readable. */
+		entry = (PlaylistEntry *) node->data;
+
+		temp = g_list_next(node);
+		while(temp)
+		{
+			next_temp = g_list_next(temp);
+			temp_entry = (PlaylistEntry *) temp->data;
+
+			/* Is this a duplicate filename entry? */
+			if (entry && temp_entry
+				&& entry!=temp_entry
+				&& strcmp(entry->filename, temp_entry->filename)==0)
+			{
+				list_changed = TRUE;
+				curr_pos = g_list_find(playlist, playlist_position);
+				if (temp == curr_pos)
+				{
+					if (get_input_playing())
+					{
+						/* Don't remove the currently
+						   playing song */
+						temp = next_temp;
+						continue;
+					}
+					if (g_list_next(curr_pos))
+						playlist_position = curr_pos->next->data;
+						else if (g_list_previous(curr_pos))
+						playlist_position = curr_pos->prev->data;
+					else if (temp != playlist)
+						playlist_position = playlist->data;
+					else
+						playlist_position = NULL;
+				}
+
+				playlist = g_list_remove_link(playlist, temp);
+				g_free(temp_entry->title);
+				g_free(temp_entry->filename);
+				g_free(temp->data);
+				g_list_free_1(temp);
+			}
+			temp = next_temp;
+		}
+		next_node = g_list_next(node);
+		node = next_node;
+	}
+	PL_UNLOCK();
+
+	if (list_changed)
+	{
+		playlist_generate_shuffle_list();
+		playlistwin_update_list();
+	}
+
+}
+
 void playlist_get_total_time(gulong *total_time, gulong *selection_time, gboolean *total_more, gboolean *selection_more)
 {
 	GList *list;
diff -u -r -i xmms-1.2.10-orig/xmms/playlist.h xmms-1.2.10/xmms/playlist.h
--- xmms-1.2.10-orig/xmms/playlist.h	2004-01-17 01:22:17.000000000 +0100
+++ xmms-1.2.10/xmms/playlist.h	2005-03-05 00:52:48.000000000 +0100
@@ -74,6 +74,7 @@
 void playlist_reverse(void);
 void playlist_random(void);
 void playlist_remove_dead_files(void);
+void playlist_remove_dups(void);
 void playlist_fileinfo_current(void);
 void playlist_fileinfo(gint pos);
 void playlist_delete_index(glong index);
diff -u -r -i xmms-1.2.10-orig/xmms/playlistwin.c xmms-1.2.10/xmms/playlistwin.c
--- xmms-1.2.10-orig/xmms/playlistwin.c	2004-02-23 21:31:43.000000000 +0100
+++ xmms-1.2.10/xmms/playlistwin.c	2005-03-05 00:52:51.000000000 +0100
@@ -137,13 +137,14 @@
 
 enum
 {
-	PLAYLISTWIN_REMOVE_DEAD_FILES, PLAYLISTWIN_PHYSICALLY_DELETE
+	PLAYLISTWIN_REMOVE_DEAD_FILES, PLAYLISTWIN_PHYSICALLY_DELETE, PLAYLISTWIN_REMOVE_DUPS
 };
 
 GtkItemFactoryEntry playlistwin_sub_menu_entries[] =
 {
 	{N_("/Remove Dead Files"), NULL, playlistwin_sub_menu_callback, PLAYLISTWIN_REMOVE_DEAD_FILES, "<Item>"},
 	{N_("/Physically Delete Files"), NULL, playlistwin_sub_menu_callback, PLAYLISTWIN_PHYSICALLY_DELETE, "<Item>"},
+	{N_("/Remove Duplicate Files"), NULL, playlistwin_sub_menu_callback, PLAYLISTWIN_REMOVE_DUPS, "<Item>"},
 };
 
 static const int playlistwin_sub_menu_entries_num = 
@@ -1791,6 +1792,9 @@
 		case PLAYLISTWIN_PHYSICALLY_DELETE:
 			playlistwin_physically_delete();
 			break;
+		case PLAYLISTWIN_REMOVE_DUPS:
+			playlistwin_remove_dups();
+			break;
 	}
 }
 

Reply via email to