I wrote a set of tools to keep my local music library "coordinated", to have perfect consistency between filename, id3 tag, and Spotify's metadata.
When importing music, coordinate_music will walk through audio files and use the Spotify API to search for the associated track. This can either be done one album at a time, or on a track by track basis. It will present you with a list of candidates, then you can then confirm, or type "hear0" to hear the original, or type "hear1" to hear the first candidate. Here's what it looks like when searching by track:
Here's what it looks like when searching by album:
This association is saved in the website ID3 tag in the audio file (mp3, m4a, or flac).
After importing music, this set of scripts can:
check that every directory and filename is formatted correctly.
check for consistency between filename, id3 tag, and Spotify's metadata. set tags from name and vice versa.
create .url files that open directly to Spotify Desktop.
search Spotify interactively by artist, title, album to find a corresponding Spotify track.
save all metadata to a utf-8 text file, which can be useful for backup.
Other features include, if enabled:
opening a .mp3 redirects to the associated track to play in Spotify desktop, which often has higher audio quality.
typing "BRK" into any interactive text prompt to view the current directory in UI and retry the current operation.
filenames in the format .sv.mp3 are synced to an external directory for backup.
working with Spotify playlists (viewing tracks, removing tracks, creating playlist from directory of mp3s).
saving a Spotify playlist to text file of song lengths and names.
indicating a song's subjective "rating" by its bitrate.
renaming files in a directory based on Spotify playlist.
saving disk space, by interactively walking through directories, and
if low bitrate and Spotify's 'popularity' data indicates high popularity,
replace the file with a .url linking to Spotify, after asking the user.
Tests pass on Linux (latest Linux Mint) and Windows (7 and later supported).
See the source code, and a more complete explanation, on GitHub.