Installing beets to Manage My Audio Tags

Yesterday, I spent a long time learning how to use MusicBrainz Picard. Today, I discovered beets on Reddit. So, I decided to install it on Windows.

  1. cinst -y python
  2. python -m pip install –upgrade pip
  3. pip install beets
  4. Type beet at the command prompt to make sure everything’s in order.

Now just type beet at the command prompt to use it.  Read the documentation for more information.

Also, download beets.reg and modify it for your system to add a Windows shell extension that imports tracks into your beets database.

  1. Note: The shell extension only works on directories.
  2. Verify that the shell extension is installed by running:

Now read through the documentation.

https://beets.readthedocs.io/en/stable/guides/main.html

Find your configuration file using:

Edit your configuration file using:

Change the first path below to a directory where you’d like to keep your music. Then, for library, choose a good place to keep a database file that keeps an index of your music. (The config’s format is YAML. You’ll want to configure your text editor to use spaces, not real tabs, for indentation. Also, ~ means your home directory in these paths, even on Windows.)

The default configuration assumes you want to start a new organized music folder (that directory above) and that you’ll copy cleaned-up music into that empty folder using beets’ import command (see below). But you can configure beets to behave many other ways:

To keep your current directory structure and to not correct files’ tags: leave files completely unmodified on your disk. (Corrected tags will still be stored in beets’ database, and you can use them to do renaming or tag changes later.) Put this in your config file:

Importing Your Library

To take the fast, un-autotagged path, just say:

Note that you just need to add -A for “don’t autotag”.

Adding More Music

If you’ve ripped or… otherwise obtained some new music, you can add it with the beet import command, the same way you imported your library. Like so:

This will attempt to autotag the new album (interactively) and add it to your library. There are, of course, more options for this command—just type beet help import to see what’s available.

Seeing Your Music

If you want to query your music library, the beet list (shortened to beet ls) command is for you. You give it a query string, which is formatted something like a Google search, and it gives you a list of songs. Thus:

To import all of the files in the current directory, I tried:

beet import -A .

Now running beet ls showed this:

Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Gambler (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Slide It In (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Slow An’ Easy (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Love Ain’t No Stranger (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Give Me More Time (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Standing in the Shadow (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Hungry for Love (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – All or Nothing (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Spit It Out (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Guilty of Love (UK Mix) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Need Your Love So Bad (Single B-Side) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Gambler (7′ Eddie Kramer Mix 1983) [2019 Remaster]
Whitesnake – Slide It In: The Ultimate Edition (2019 Remaster) (Disc 2 – Original UK Mix) – Guilty of Love (7′ Eddie Kramer Mix 1983) [2019 Remaster]

And beet stats showed this:

Tracks: 13
Total time: 50.6 minutes
Approximate total size: 343.0 MiB
Artists: 1
Albums: 1
Album artists: 1

To list all files containing “love”:

beet ls love

To list all files other than those containing “love” (at cmd.exe):

beet ls ^^love

To do the same in PowerShell:

beet ls ^love

Override my “don’t update tags” setting when importing:

beet import -w .

Show tags as written to files (uses the info plugin):

beet info whitesnake

beet import -W: when autotagging, don’t write new tags to the files themselves (just keep the new metadata in beets’ database)

Album Art

Then add fetchart and embedart to plugins.

Note: if there is already a cover.jpg file in this folder, it may not download new art and then write it into your file.

Lyrics

pip install requests

Then add lyrics to plugins.

Genre

After you have pylast installed, enable the lastgenre plugin in your configuration.

Importing Tracks

  1. Using “K” for keep both when you are adding tracks to an albums creates a second directory for the album. Don’t use this!

Set Specific Fields

Note that Tag&Rename seems to set the month and day fields to “00” when you update the comments field.

Search for File Type

beet stats format:MP3

beet stats format:FLAC

Search for Bitrate

beet stats bitrate:128000

beet list format:MP3 bitrate:128000

Search and Display Specific Fields

Show More Verbose Information

Update Your Database to Remove Deleted Files

Remove a Custom Field (Created by Accident)

Add to an Existing Comments Field

(beet ls smokey  -f '$track//$title//$comments' | sort) | % { beet modify "$($_.split('//')[2])" comments="Purchased from Amazon Music in MP3 format on 08/29/2020.`n`n$($_.split('//')[4])" }

$tracks = beet ls smokey  -f '$track' ; $titles = beet ls smokey  -f '$title' ; $comments = beet ls smokey  -f '$comments' ; for ($count = 0; $count -lt $tracks.Length; $count++) { beet modify smokey track:"$($tracks[$count])" title:"$($titles[$count])" comments="Purchased from Amazon Music in MP3 format on 08/29/2020.`n`n$($comments[$count])" }