How to Find and Remove Duplicate Tracks in VirtualDJ
Updated · by the MixGoat team · Tool: Library
Short answer
Duplicates in VirtualDJ are almost always two Song entries in database.xml for the same audio rather than two copies of a file. Because database.xml identifies a track only by its FilePath, the same folder reached through two paths (a drive that changed letter, a share mapped two ways, a Music folder that moved into OneDrive or iCloud), a track present in both the main database and an external drive's own VirtualDJ/database.xml, or a migration from another app that recorded a second entry all produce twins. VirtualDJ has no duplicate-finder panel. Find them by searching the whole database, sorting by title and artist with the path column visible, then keep the entry that has the POIs and remove the other from the database, not from disk. Real second files need a file-level comparison; MixGoat's Library view sorts and filters your tracks but has no duplicate detector, and Lexicon offers one.
Step by step
- 1
Tell path twins from file twins
Right-click each of the two rows and open its file information to read the full path. Two different paths that both exist means two real files. One red and one white row with the same title means the old entry lost its file (a moved folder or new drive letter), which is a relocation job, covered at mixgoat.com/guides/relocate-missing-files-virtualdj, not a duplicate. Two white rows whose paths differ only by drive letter or a prefix such as a mapped share are the same file seen twice.
- 2
Search the whole database, not the current folder
Click into the browser's search field and set its scope to search the database rather than the folder you are in; the switch sits in the search options next to the field and its label varies by skin. Type an artist name. Results now come from every folder and every drive, which is the only view that shows twins that live under different roots. Right-click the column header and enable a path or filename column so the difference is visible without opening each row.
- 3
Sort by title, then choose the keeper
Click the Title column so identical titles sit together, and compare artist, length and bitrate. The keeper is the entry with the POIs: load each on a deck and see which shows hot cue pads and saved loops, or open database.xml in a text editor with VirtualDJ closed, search the title, and see which Song element has Poi children. Play count and rating are the tie-breakers.
- 4
Remove the extra entry from the database, not the disk
Right-click the entry you are dropping and pick the option that removes it from the database; the one labelled delete sends the file itself to the Recycle Bin or Trash. If the two entries point at one file through two paths, also fix the cause, for example restore the old drive letter in Disk Management or remove the second favourite folder, or VirtualDJ recreates the entry the next time it browses that path.
- 5
Deal with real second files
When both files exist, decide which copy to keep by format and bitrate, then delete the other from disk and let the database maintenance option (right-click a drive or the Computer node in the sidebar; the label mentions cleaning or removing missing files) drop its entry. If the file you are deleting is the one with the POIs, copy its Poi elements into the surviving Song entry in database.xml first, with VirtualDJ closed, and keep the FilePath of the survivor.
- 6
Prevent the next batch
Use one music root, keep external drives on a fixed letter or volume name, and do not add the same folder twice under different favourite folders. After a migration into VirtualDJ, MixGoat matches existing entries by path, including the drive-letter variant, and injects POIs into them rather than adding twins, so the migration itself is not a source of duplicates; a second migration from a different source that references the same files is, so migrate once per library.
Why database.xml makes duplicates easy
Rekordbox and Traktor keep a record ID next to the path; Serato keys on the path but also compares file fingerprints in places. VirtualDJ keys purely on FilePath, and it creates an entry for any file it is asked to show. Browse D:\Music while the drive is D:, then again after the drive comes back as E:, and you have two entries. Browse a NAS share as \\nas\music and later as the mapped Z:\, two entries. Mount a folder in a virtual folder and a favourite folder, still one entry, because the path is the same; the containers are not the problem, the path is.
The main database on your system drive also records tracks that live on external drives, while each external drive carries its own VirtualDJ/database.xml. When you browse the drive, VirtualDJ shows the drive's entries; the main database's entries for the same files appear in database-wide search. This is by design so the drive is portable, and it is not something to clean up, but it does mean a database-wide search shows two rows for a track on a drive if the main entry recorded a different letter.
What VirtualDJ gives you, and what it does not
The tools are search with database scope, column sorting, the file information dialog and the database maintenance options. The maintenance options remove entries whose files are missing; they do not merge two live entries for the same audio and they do not compare audio content. Run them only with every drive plugged in, because an unplugged drive's tracks look missing and the POIs go with the removed entries.
Third-party options: Lexicon imports a VirtualDJ library and has a duplicate finder that compares tags and can consider file properties, then writes the cleaned library back to VirtualDJ. MixGoat imports database.xml for free and shows every track with its path, sortable and filterable by title, artist, BPM, key, genre and a free-text filter, which makes eyeballing twins faster than VirtualDJ's browser, but it has no duplicate detector and does not claim to. The equivalents for the other apps are mixgoat.com/guides/find-duplicate-tracks-rekordbox, mixgoat.com/guides/find-duplicate-tracks-serato and mixgoat.com/guides/find-duplicate-tracks-traktor.
- Entry twins (one file, two paths): fix the path source, remove the extra entry.
- File twins (two files): pick one, move the Poi elements if needed, delete the other, clean missing entries.
- Drive entries vs main entries: leave alone; that is how VirtualDJ keeps drives portable.
See your whole VirtualDJ library in one sortable view
MixGoat imports database.xml free and shows every track with its path, sortable and filterable. It does not detect duplicates automatically.
See your whole VirtualDJ library in one sortable viewFrequently asked questions
- Why does VirtualDJ show the same track twice?
- Most often because the file was reached by two paths, such as a drive that changed letter or a folder that moved, and database.xml keys each entry by path. Less often there really are two files.
- Does VirtualDJ have a duplicate finder?
- No dedicated one. Use search with database scope, sort by title, and compare the path column. Lexicon is the usual third-party tool for a proper duplicate scan of a VirtualDJ library.
- Will removing a duplicate delete my cue points?
- Only if you remove the entry that holds them. Load both on a deck first; the one showing hot cue pads is the keeper. Removing from the database never touches the file, deleting does.
- Does Clean Database remove duplicates?
- It removes entries whose files cannot be found. It does not merge two live entries for the same audio. Plug in every drive before running it or the POIs of unplugged tracks are lost.
- Can I merge the POIs of two entries?
- Manually, yes: with VirtualDJ closed, copy the Poi elements from one Song element to the other in database.xml, keep the FilePath you want, and remove the spare entry. Save a copy of the file first.
- Does MixGoat find duplicates?
- No. Its Library view imports database.xml free and lets you sort and filter by every field with the path shown, which helps you spot twins, but there is no automatic duplicate detection.