This is mostly for my own convenience. I recently rebuilt a host for managing my beets library, and these are the packages (both deb and pip) that I needed to install for my particular beets config to work. And since that’s not really very helpful to anyone else without my beets config, I’ve included that as well.
This should work for both ubuntu trusty and xenial.
Requirements for beets:
$ sudo apt-get install python-dev python-pip python-gi libchromaprint-tools imagemagick mp3val flac lame flac gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0 plugins-ugly gir1.2-gstreamer-1.0 libxml2-dev libxslt1-dev zlib1g-dev $ sudo pip install beets pyacoustid discogs-client pylast requests bs4 isodate lxml
I use two plugins not included by default:
bandcamp
rymgenre
Beets config:
############################################################################ ## Beets Configuration file. ## ~./config/beets/config.yaml ############################################################################# ### Global Options library: ~/.config/beets/library.blb directory: /mnt/music/ pluginpath: ~/.config/beets/plugins ignore: .AppleDouble ._* *~ .DS_Store per_disc_numbering: true threaded: yes # Plugins plugins: [ # autotagger extentions chroma, discogs, # metadata plugins acousticbrainz, embedart, fetchart, ftintitle, lastgenre, mbsync, replaygain, scrub, # path format plugins bucket, inline, the, # interoperability plugins badfiles, # misc plugins missing, info, # other plugins bandcamp ] # Import Options import: copy: true move: false write: true delete: false resume: ask incremental: false quiet_fallback: skip none_rec_fallback: skip timid: false languages: en log: ~/beets-import.log # Path options paths: # Albums/A/ASCI Artist Name, The/[YEAR] ASCI Album Name, The [EP]/01 - Track Name.mp3 default: 'Albums/%bucket{%upper{%left{%the{%asciify{$albumartist}},1}}}/%the{%asciify{$albumartist}}/[%if{$year,$year,0000}] %asciify{$album} %aunique{albumartist album year, albumtype label catalognum albumdisambig}/%if{$multidisc,$disc-}$track - %asciify{$title}' # Singles/ASCII Artist Name, The - Track Name.mp3 singleton: 'Singles/%%the{%asciify{$artist}} - %asciify{$title}' # Compilations/[YEAR] ASCI Compilation Name, The/01-01 - Track Name.mp3 comp: 'Compilations/[%if{$year,$year,0000}] %the{%asciify{$album}%if{%aunique, %aunique{albumartist album year, albumtype label catalognum albumdisambig}}}/%if{$multidisc,$disc-}$track - %asciify{$title}' # Sountracks/[YEAR] ASCI Soundtrack Name, The/01 - Track Name.mp3 albumtype:soundtrack: 'Soundtracks/[%if{$year,$year,0000}] %the{%asciify{$album}%if{%aunique, %aunique{albumartist album year, albumtype label catalognum albumdisambig}}}/%if{$multidisc,$disk-}$track - %asciify{$title}' ### Plugin Options # Inline plugin multidisc template item_fields: multidisc: 1 if disctotal > 1 else 0 # Collects all special characters into single bucket bucket: bucket_alpha: - _ - A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z bucket_alpha_regex: '_': ^[^A-Z] # Per album genres selected from a custom list # My genre-tree.yaml is ever so slightly custom as well # I found per-album genres in last.fm could be very misleading. lastgenre: canonical: ~/.config/beets/genres-tree.yaml whitelist: ~/.config/beets/genres.txt min_weight: 20 source: artist fallback: 'Unknown' # rymgenre doesn't run on import, so I use it as a backup # for when lastgenre is giving me garbage results. rymgenre: classes: primary depth: node # Fetch fresh album art for new imports fetchart: sources: coverart itunes amazon albumart store_source: yes # I want the option to scrub, but don't feel the need to scrub automatically scrub: auto: no # Gstreamer is a pain, but still the correct backend replaygain: backend: gstreamer overwrite: yes acoustid: apikey: <API_KEY> echonest: apikey: <API_KEY> auto: yes