Greetings Lemmings!
I am not new to self hosting; been at it for a few years. And I have neglected a very important part of my home lab; MUSIC!
So I stream music from Navidrome to all of my devices.
My music library has grown organically over the years, for probably the past 17 years. And a few times I had manually organized and fixed up some of the tags. But ultimately I ended up with a mess of a library.
I am working on cleaning that up. Though I absolutely should have cleaned it up before I created 2 backup scripts.
In short, I have a script that is called from a systemd service on a timer that runs my backup script that essentially more or less uses rsync to mirror the files in LiveMusicDir to MusicArchive1. This happens on my docker host where my Navidrome lives. The Music is on an NFS share hosted outside of the docker host.
The next step I run another similar setup on my desktop; systemd service running a script on a timer that uses rsync and other dependencies to track changes.
What I plan to do is organize the source. I am using beets, and learning as I go.
What methods do you use for managing a large music library?
My experience is similar to a lot of people here. I see that we’ve all had our hurdles over the decades while moving OS’s and I’ve used many of the apps mentioned here (Windows/Linux). I couple of years ago i decide to stream my music because i was already into self-hosting and i really needed to properly tag my music for whatever server app I would use.
I always had my music structured by folder, i was using desktop apps for playback so it kinda worked for me. But i wanted to have better tagging. I had already used kid3 and picard but it lacked automation so I used beets for the albums on my collection (about 12K of songs). It wasn’t perfect but the software is not blame and it was a great way to tag automatically and move files for a consistent folder structure to match my needs.
Right now, since i don’t add music all the time ( a couple per week) i mainly stick to picard to tag new albums. it has 3 actions to manage the files on disk (move, rename, tag), I have script rules for naming files (if required) and i use the ReplayGain plugin. But I also have to point out that the learning curve of picard is rather high, the UI is a mess and it took me a really long time to understand how it works or where the options are.
After trying airsonic for a while i moved to Navidrome and have been using symfonium (android) and Feishin (desktop). It’s the best experience I’ve had since i started listening to music on my pc (199…6/7).
Regarding the source files, it lives on a disk and is backed up to another disk, managed on openmediavault.Big beets fan here. Only thing I don’t like, other than the odd album missing from their index, is the weak genre naming. I acknowledge this is murky territory, I’m wondering how other users handle the genres.
You can use the https://beets.readthedocs.io/en/stable/plugins/lastgenre.html plugin to write genres
Great suggestion, will try it out today, thanks!!
Just thought I’d also comment that beets does not have a metadata index, it relies on Musicbrainz for metadata fetching. There are also plugins for other services like Bandcamp or Spotify.
I use brainz and MStream
Acronyms, initialisms, abbreviations, contractions, and other phrases which expand to something larger, that I’ve seen in this thread:
Fewer Letters More Letters NAS Network-Attached Storage NFS Network File System, a Unix-based file-sharing protocol known for performance and efficiency Plex Brand of media server package
[Thread #56 for this comm, first seen 19th Jul 2026, 03:30] [FAQ] [Full list] [Contact] [Source code]
I personally use a music tagging/renaming program called Picard. Point it at a relatively unorganized music folder, it tries to identify each track based on the existing metadata or acoustic signature, adds/modifies the track metadata based on the Music Brainz database, and runs a custom renaming script that moves it into place per my preferences.
Its not as automated as I would like, and takes some hand holding, but keeps my collection clean and standardized.
Picard is the way to go if you want to get the highest quality tagging with exact release matching. Most would probably not care too much about this, however when I know my files were ripped from a Japanese release, I want the tags to reflect this. Picard allows me to find the right match before any tags are written. This is especially helpful when you have two or more different versions of the same album, e.g. one CD rip and one vinyl rip, or two CD releases with different set of bonus tracks. My directory structure and tagging rules allow me to manage this consistently with no manual workarounds.
I was looking into setting a docker container of Picard, and see what I could do with it. However, I was looking for the most automated solution I could find; and happened to land on Beets.
Though I may still try out Picard as a supplementary option.
Not tried beets (this thread only now made me aware of it), but adding a +1 for Picard
I let it run on a huge chunk of my music and apart from a few tracks it thought should be in compilation albums, worked really well.
After the big sift, I basically just run it on new stuff when I get it…
Sometimes I use Puddletag to fine-tune some data.
I find most new things I get from Bandcamp, etc are in MusicBrainz, so not much editing required… although I have spent some time over the years carefully entering some older, more obscure music.
I see you’re settling in beets and if that works for you, that is excellent. Just this week, I started running it on copies of some albums in my collection to see how it did.
Over the last year, I’ve ripped (or cleaned up existing) about 25,000 songs. My process has really been rip them with whatever tags I can find, put them all through MP3tag to retrieve and clean up metadata, then run a script to backup the FLAC off-site, convert to MP3 locally, and copy to my NAS in my preferred directory structure.
I was thinking maybe I don’t want to deal with the tagging, hence my trials with beets. But you know, I don’t necessarily trust everything in Musicbrainz or like how they handle some things, so I’m probably going to stick with the semi-manual tagging. I am looking at still using beets to handle lyrics, replaygain, and fleshing out less important metadata.
I havent trusted it with my music in RW mode yet. I was just getting statistics. however, I am using a custom built docker container based off Lyrica that downloads LRC files for me. Its running right now. And I like having karaoke style synced lyrics .
Yeah. I used FileFlows for a bit to download lyrics and I do already have replaygain being added every night for new additions.
Lidarr manages my large library easily
What methods do you use for managing a large music library?
I have a physical collection I have been accumulating for decades now, that goes as far back as 1937. I have converted everything to flac and it resides on a NAS drive. I have used Beets and Picard, and back in the day MP3Tag for tagging, and surprisingly, MusicBee (Windows) is great for embedding lyrics. It takes a while to embed lyrics in a large collection. Currently I have everything tagged, in their respective artists/albums, and embedded lyrics for about 75-80% of them. I run Navidrome and stream via Feishin locally, and Substreamer on my mobile.
ETAL I have also used czkawka_gui in the past to clean out duplicates.
MusicBee, I loved that player back when I was a Windows user. And MediaMonkey if you didn’t mind paying. Those two were the best music players. Now that I am full time Linux, there isn’t a player that even compares.
However, Feishin is about as close as I can get to a UI I like for a player, and luckily it works with Navidrome (jellyfin and others too)
MusicBee
It was, and imo, still is a great piece of software. I’m not always on a Windows machine, but MusicBee is a staple when I am. Every so once in a while, someone writes a piece of software for Windows that just kicks ass. Few and far between, but it’s pretty good stuff.
I do wish they made a Linux port. Because I’m never going back to windows.
It would be nice. I’ve hung on to my stripped down Windows 10 now because I use a program called BlueBeam for one of my business ventures that absolutely has to run on Windows. There is no Linux equivalent, and there is no running it in Wine.
Whenever I have to sift through a big collection, Feishin is no longer the right tool. In that case I use Quod Libet with the 3 panes layout. Resembles Musicbee/MediaMonkey pretty well, while being very fast!
OP: Don’t forget to have some fun with your collection: Mixxx - mixing and looping, so much fun!
I just use lidarr to rewrite the tags to be consistent and that seems to be enough for navidrome to put the correct cover art 90% of the time.
Beets for importing, ascii only, lastgenre, fetchart, whatever other plugins I’m forgetting,
/artist/yyyy_album_name/directory structure,01_title.extfor single disc,01-01_title.extfor multi disc. I invoke beets manually just to keep an eye on how things get matched up and tagged during the process. I deal in full albums, LPs, compilations and such because it’s often easier to maintain and match metadata than with individual tracks. I guess it’s a data hoarder / archivist compulsion too, but it’s rare I can’t find at least one other track on an album appreciable so… why not?A weekly rsync pushes the beets DB and library from my TrueNAS server to another server with a 8TB external dedicated to backing up my most important stuff (personal projects, password store, compose files, confs, etc). I’ve got an rsync alias set up on my laptop I invoke manually because I’m nearing the limit of what I want to allot to music. At least until I decide to get a larger drive.
That’s local in triplicate, with zraid on the NAS and a fourth copy on my phone, which leaves me feeling pretty good about not losing any music outside of a house fire or tornado. I was also rsync’ing all my media (music, movies, shows) to another TrueNAS setup at a relative’s but some things have changed with that so it’s on hold. Not fond of missing my off-site backup but hopefully can resolve it soon.
Everything is local only right now. The library is mounted read-only in Jellyfin so can play music from pretty much any phone, TV, computer, my Steam Deck, etc throughout the house. If I ever decide to open things up, reverse proxy or whatever, I might look into Finamp but I buy a flagship phone every six to ten years for the storage space so I can just take my music with me. Might eventually switch that to a dedicated music device.
Right now I am running beets against my live music dir and running a few different commands on it to see:
Duplicate albums:
beet duplicates \ --album \ --full \ --strict \ --key albumartist \ --key album \ --path \ > config/duplicate-albums.txtSearching across different albums:
docker exec -i -u abc beets \ beet duplicates \ -F \ -s \ -k artist \ -k title \ -f '$id | $artist | $album | $title | $format | $bitrate | $length | $path' \ > config/duplicates-across-albums.txtAnd running this right now for audio checksum comparison:
docker exec -i -u abc beets \ beet duplicates \ -F \ -C 'ffmpeg -i {file} -f crc -' \ -f '$id | $artist | $album | $title | $format | $bitrate | $path' \ > config/duplicates-audio-checksum.txtAnd when that is done I know I can inspect candidate based on ID with something like this:
docker exec -it -u abc beets \ beet ls 'id:1524' \ -f '$id Artist: $artist Album: $album Title: $title Format: $format Bitrate: $bitrate Sample rate: $samplerate Bit depth: $bitdepth Length: $length Path: $path'I have the main music I am scanning mounted in read only right now; but when I am done collecting some information about it, I am going to remount and restart the container, along with modifying some config options.
Ultimately, I am going to go Artist by artist with something like this:
docker exec -it -u abc beets \ beet duplicates \ -s \ -k artist \ -k album \ -k title \ --move /quarantine \ 'albumartist:"Example Artist" album:"Example Album"'
Definitely more advanced than what I do! I’ve also been collecting for a long time, and I’ve just been storing the media. I went from Windows/x86-64 to Mac/ARM64 a few years back, and I have kinda limited options that way. I would have just gone to Linux if my computers didn’t die, but at the time, Apple made sense.
I do Apple Music, but, that doesn’t answer the question. I also self-host my music via a Plex server. I got Plex Pass for well under $100 on sale years and years ago. Much harder to recommend now. Plexamp is awesome for music, and I also use Prologue (iOS app) for audiobooks hosted on Plex.
For tagging, I use Mp3Tag and tag manually. It was free on Windows, but the guy wants $30 for it on Mac. It’s a long story as to why, but after he was kind enough to explain it to me… I paid the man. (For my part, I’d used it for free for many years and I got a lot of miles out of it, and still do, and it’s a good, well maintained app from a solo developer.) There are free alternatives. Not so many good ones on Mac (part of why I paid). For album art, I get them from Apple using this handy site (not mine): https://bendodson.com/projects/itunes-artwork-finder/ — you can use 600px or you can use either 2000px or 3000px, I forget which. I’m good with 600px. I think Apple uses the smaller size for phones and the bigger one for TVs and Macs (especially as iMacs have 5K screens now).
My library might also not be as big as yours is. Plex says I have 14,462 tracks indexed. Maybe those are rookie numbers, I dunno. I pretty much have everything I want. All I’d really want now is to take my Apple Music playlists and download them to m4a 192k or similar. I have a few decade playlists that are like 500-600 songs each (80s, 90s, and 00s).
I just use kid3 to check and fix the tags on each album as I get it.
I have gone in so many different directions. When I was on Windows I would use MusicBee or MediaMonkey for tagging, I would do it album by album. It was pretty great, but I haven’t used Windows in years. There are not any Media players that are for local files that I even like for Linux.
So, I ultimately moved to Navidrome. Have lost some of my tunes, but was at 50k at one point. I am back down to about 23k.
Beets seems pretty neat so far, automatic is my goal!
Navidrome looks like good stuff. If I ever move off of Plex, I’ll absolutely be looking at it. I’m running macOS, but my goal is to buy a gently used Windows PC from a business or something (like they couldn’t upgrade it to Windows 11 or whatever’s after that) and replace Windows with Linux, and use it as a server. My Mac (M2 Pro, 16GB RAM) is more than enough machine to run multiple servers, but I’d rather do that with a dedicated machine running some *nix that I can terminal into from the Mac. Navidrome does run on macOS with minor tweaking that is not above my skill level, but when I set up the server I’ll be looking real hard at alternatives.
My music is on my PC hard drive and synced to my server. Last year I spent a few weeks tagging my old stuff and i tried beets, kid3, and picard but ended up liking picard the most just since it was a lot better at grouping albums together and finding the best matches ime. Any new music is tagged with picard. Then i run a navidrome docker container with the music library mounted. And i use feishin for desktop and symfonium for mobile use.
If you’re interested, i wrote about my experience migrating from iTunes to navidrome and tagging my music here (no ads, monetization, or tracking)
Feishin, and Symfonium are fantastic.
Though, if you at all care about whether or not it’s open source, I would argue Tempus is another good option for Android.
https://github.com/eddyizm/tempus
Which I have been trying out a bit as of late. And works with Android Auto on GrapheneOS
Thanks for mentioning that, I’ll take a look!
I have a bunch of actions setup in mp3tag which strips out all but the absolute necessary tags, and uses the cover from the directory to add the cover to the files… once tagging is correct, you can use any library.
NFS / Shares - over complicated. Just syncthing it around (and snapshot on backup server), for nearly static data as music it is perfect.
I already have a symcthing server setup, as well as it setup on a few devices. It really isnt the solution for me considering where my music lives. Can’t run Syncthing on my NAS.
Either way I’d have to mount the share whether it be NFS or smb.
A mishmash of beets and the old ways got me to where I am, navidrome with a bit of mpv & kodi.
I’m currently trying to ignore it and plan to return with a new workflow over the next year or so. Beets will be part of this but also need some python, shell glue and other tools working together, and things are changing at little faster than they once were.
I spent a little time a few months back grabbing NPR and KEXP audio at scale with yt-dlp and having them land with decent tags as navidrome compliant albums and now feel a little more confident incorporating oddities into sacred realm of jazz flacs.
But the one folder to rule them all is still in the planning stages.
The way I used to do, I can’t believe I spent that much time. I would literally go folder by folder and rename things. Then when I got a little older and a little smarter used MusicBee or MediaMonkey to tag and rename music files. But even that became too much for me to want to do.
Ultimately I want the most automated way I can do it. But luckily all new music coming in is named with the same format every single time, and is properly tagged.
It’s all of my legacy stuff I have to clean up really.
Yeah, I’m not about to rush in but I suspect over the next year or so I’ll be letting an llm loose on my old crates to see what happens and MacGyver some sort of Dread Pirate Robot that can run locally and is a frankenstein of beets, plugins and other projects that will eat music and shit albums.







