<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://karaoke.kjams.com/w/index.php?action=history&amp;feed=atom&amp;title=Remove_Duplicate_Index_Entries</id>
	<title>Remove Duplicate Index Entries - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://karaoke.kjams.com/w/index.php?action=history&amp;feed=atom&amp;title=Remove_Duplicate_Index_Entries"/>
	<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=Remove_Duplicate_Index_Entries&amp;action=history"/>
	<updated>2026-06-09T09:18:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://karaoke.kjams.com/w/index.php?title=Remove_Duplicate_Index_Entries&amp;diff=13695&amp;oldid=prev</id>
		<title>Dave: rename Path Hash to File Hash (CM_Key_ID_HASH_FILE)</title>
		<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=Remove_Duplicate_Index_Entries&amp;diff=13695&amp;oldid=prev"/>
		<updated>2026-06-07T21:46:53Z</updated>

		<summary type="html">&lt;p&gt;rename Path Hash to File Hash (CM_Key_ID_HASH_FILE)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:46, 7 June 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== What the command does ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== What the command does ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Computes a &#039;&#039;&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Path &lt;/del&gt;Hash&#039;&#039;&#039; for each library song that has a resolvable local media path (ZIP, then video, then audio — same priority kJams uses elsewhere).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Computes a &#039;&#039;&#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;File &lt;/ins&gt;Hash&#039;&#039;&#039; for each library song that has a resolvable local media path (ZIP, then video, then audio — same priority kJams uses elsewhere).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Groups songs with the same hash (same resolved file path).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Groups songs with the same hash (same resolved file path).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Within each group, keeps the entry with the &amp;#039;&amp;#039;&amp;#039;lowest song ID&amp;#039;&amp;#039;&amp;#039; as the canonical copy.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Within each group, keeps the entry with the &amp;#039;&amp;#039;&amp;#039;lowest song ID&amp;#039;&amp;#039;&amp;#039; as the canonical copy.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l27&quot;&gt;Line 27:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 27:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Duplicates defined only by playlist references without duplicate library entries.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Duplicates defined only by playlist references without duplicate library entries.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Path &lt;/del&gt;Hash column ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;File &lt;/ins&gt;Hash column ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;After running, you can show the &#039;&#039;&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Path &lt;/del&gt;Hash&#039;&#039;&#039; sort column in the Library to inspect the computed values. Songs with the same hash are duplicates by file path.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;After running, you can show the &#039;&#039;&#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;File &lt;/ins&gt;Hash&#039;&#039;&#039; sort column in the Library to inspect the computed values. Songs with the same hash are duplicates by file path.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Before you run ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Before you run ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key kjams_www-mw_:diff:1.41:old-13694:rev-13695:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Dave</name></author>
	</entry>
	<entry>
		<id>https://karaoke.kjams.com/w/index.php?title=Remove_Duplicate_Index_Entries&amp;diff=13694&amp;oldid=prev</id>
		<title>Dave: add Remove Duplicate Index Entries help page</title>
		<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=Remove_Duplicate_Index_Entries&amp;diff=13694&amp;oldid=prev"/>
		<updated>2026-06-07T01:41:27Z</updated>

		<summary type="html">&lt;p&gt;add Remove Duplicate Index Entries help page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Remove Duplicate Index Entries =&lt;br /&gt;
&lt;br /&gt;
This feature is available in the Qt (64-bit) edition of kJams under &amp;#039;&amp;#039;&amp;#039;Advanced → Special → Remove Duplicate Index Entries…&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== What is an &amp;quot;index entry&amp;quot;? ==&lt;br /&gt;
&lt;br /&gt;
Each song in your kJams &amp;#039;&amp;#039;&amp;#039;Library&amp;#039;&amp;#039;&amp;#039; has a unique &amp;#039;&amp;#039;&amp;#039;song ID&amp;#039;&amp;#039;&amp;#039; (index entry). That is separate from a &amp;#039;&amp;#039;&amp;#039;playlist item&amp;#039;&amp;#039;&amp;#039; (a reference to a song in a rotation list, custom playlist, singer list, etc.).&lt;br /&gt;
&lt;br /&gt;
Sometimes the same physical media file is imported or added more than once, creating multiple library index entries (different song IDs) that all point at the &amp;#039;&amp;#039;&amp;#039;same file on disk&amp;#039;&amp;#039;&amp;#039;. This command finds those duplicates and consolidates them.&lt;br /&gt;
&lt;br /&gt;
== What the command does ==&lt;br /&gt;
&lt;br /&gt;
# Computes a &amp;#039;&amp;#039;&amp;#039;Path Hash&amp;#039;&amp;#039;&amp;#039; for each library song that has a resolvable local media path (ZIP, then video, then audio — same priority kJams uses elsewhere).&lt;br /&gt;
# Groups songs with the same hash (same resolved file path).&lt;br /&gt;
# Within each group, keeps the entry with the &amp;#039;&amp;#039;&amp;#039;lowest song ID&amp;#039;&amp;#039;&amp;#039; as the canonical copy.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Updates playlists&amp;#039;&amp;#039;&amp;#039;: any playlist reference to a removed song ID is changed to point at the canonical song ID. If the playlist already contains the canonical entry, the duplicate playlist reference is removed instead.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Deletes&amp;#039;&amp;#039;&amp;#039; the extra library index entries (and their library playlist rows). Your media file on disk is not deleted by this operation (only cache/temp files associated with the removed entries may be cleared, same as normal Remove from Library).&lt;br /&gt;
&lt;br /&gt;
== What is skipped ==&lt;br /&gt;
&lt;br /&gt;
Songs with &amp;#039;&amp;#039;&amp;#039;no resolvable local file path&amp;#039;&amp;#039;&amp;#039; are skipped — for example some streaming entries, some music-store entries without a local file, or songs whose files are missing. They are not hashed and are never merged or deleted by this command.&lt;br /&gt;
&lt;br /&gt;
== What this does &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; detect ==&lt;br /&gt;
&lt;br /&gt;
* The same audio on disk via &amp;#039;&amp;#039;&amp;#039;different paths&amp;#039;&amp;#039;&amp;#039; (aliases, copies in different folders, hard links with different path strings).&lt;br /&gt;
* Duplicates that share metadata (name/artist/album) but point at &amp;#039;&amp;#039;&amp;#039;different files&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Duplicates defined only by playlist references without duplicate library entries.&lt;br /&gt;
&lt;br /&gt;
== Path Hash column ==&lt;br /&gt;
&lt;br /&gt;
After running, you can show the &amp;#039;&amp;#039;&amp;#039;Path Hash&amp;#039;&amp;#039;&amp;#039; sort column in the Library to inspect the computed values. Songs with the same hash are duplicates by file path.&lt;br /&gt;
&lt;br /&gt;
== Before you run ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Back up your library&amp;#039;&amp;#039;&amp;#039; (Save Database) if you are unsure. This operation removes library entries and cannot be undone from within kJams.&lt;br /&gt;
* Quit any operation that is sorting the library; the command waits for sorting to finish.&lt;br /&gt;
* Read the confirmation dialogs carefully; the second dialog shows counts of groups and entries to be removed.&lt;br /&gt;
&lt;br /&gt;
== Technical notes ==&lt;br /&gt;
&lt;br /&gt;
* Path resolution uses &amp;#039;&amp;#039;&amp;#039;Resolve As Far As You Can&amp;#039;&amp;#039;&amp;#039; so aliases and broken path chains are normalized when possible.&lt;br /&gt;
* Volume names are normalized for consistent hashing on macOS.&lt;br /&gt;
* The feature is compiled only into the Qt build (`#if _QT_`); 32-bit editions do not include this menu item.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
	</entry>
</feed>