I was wondering the same thing. Maybe we should collaborate? My mother has 500 records she wants to catalog. No barcodes on them because they are too old.
If they have barcodes, there’s a beets plugin that searches album images for those. You may need to make a shim between a barcode-scanning app and that beets plugin, or the beets search backend.
If I had a research team, I would make an app that identified the the covers of the records with a smartphone camera and some computer vision software.
But since I don’t have that, Beets is looking like the next best thing. I’ve just posted in the Musicbrainz IRC looking for feedback. You can see the results of that around here: https://chatlogs.metabrainz.org/brainzbot/musicbrainz/2019-04-06/?tz=America/Havana
Some users have recommended just using a “collection” on Musicbrainz.org itself. You can craft URLs like this:
https://musicbrainz.org/collection/[collectionID]/own_collection/add?release_group=402438
https://musicbrainz.org/collection/[collectionID]/own_collection/add?release=27276
Then all you need to do is generate a release group or release. MusicBrainz can handle the rest, but does not appear to allow duplicate entries in a single collection.
There’s also Discogs, which is supposedly the best catalog for vinyl out there. There’s an assortment of paid, closed-source programs for managing collections. I don’t know the benefit they have over Beets.
In the beets IRC, they recommended using AcoustID. IMO, having to play every record would slow things down.
I’m more comfortable with having the info in a beets DB that I can slice any way I want. (And for my mother’s purposes, I can export everything she needs with beet ls and a custom print syntax). I don’t want to parse XML, but that’s an option for MB collections.
edit: For the design, I’m thinking of this. I’d appreciate feedback from those who actually know the structure of beets and can tell me if my methods are weird.
- beets DB used just for physical music. I don’t know anything about if parts of the beets architecture are dependent on actual file paths existing. (I know, for example, that running “beet mv” after you use copyartifacts to relocate non-music files into your music folders, beet mv will hard-crash out, or maybe that’s copyartifacts’ fault.)
- fake.py - plugin that can add empty releases to the beets library. Provides the import interface without needing files. Receives a release MusicBrainzID (or Beets AlbumInfo object?) and adds it to the beet library with the path “fake_plugin”. Open question: can multiple DB entries have the same path?
- mbsearch.py - plugin to search the musicbrainz DB. Can reuse a ton of code from match_album() in /beets/autotag/mb.py. https://github.com/beetbox/beets/blob/master/beets/autotag/mb.py#L409 . There may be a better way to do this. I don’t think you can use the code as-is because I want to search more fields than just artist and album.
Workflow:
- Keep the Beets import dialog open until the user aborts (like importing a huge folder of files will continue supplying new album matches to the user).
- Ask the user for field info. Maybe specified in a config file? For my use case, it will probably be [album title] + [catalog number]. Parse that into fields to search with regex(?). (Or separate each field with the user pressing enter.)
- Search MusicBrainz using the supplied info.
- Generate list of candidates.
- Match using the existing beets config. (Ex., the threshold values, the timid setting). The user can manually select a candidate from the list of candidates like they do for regular beets import.
- Import album to the beets library.