I’m starting over with my music library by ripping my cd audio collection to FLAC. All music swill be at least 16-Bit/44.1 kHz and anything I want to keep from my old library that isn’t I will try to procure. If you have any music you would like to add, send me a message.
I use navidrome as a client and beet to manage my library. Really cool!
I mainly use Emby/Plex for my music client, but having a look at Navidrome again. Thanks @carlfrifer for Beets, definitely will help with my metadata.
Do you use any mobile apps with Navidrome?
For mac I use Feishin. For Android I use Tempo. Both open source and really well done apps. I don’t daily use iPhone so I wouldn’t know, but I’m sure you can find something compatible with subsonic.
Here’s a list, but I’d recommend you doing some research as you may find better ones tgat aren’t listed there: Subsonic
I really don’t want a smartphone, but GrapheneOS seems to be a stronger option for me to take control; still considering Unplugged. I could at least side load apps and sandbox Google play store if I really needed something. I know that apps using the messaging api’s won’t work properly, which is fine, it’s just weighing what I need on a Smartphone vs The Light Phone.
- Home Cameras with Unifi
- 2 Auth
- BMW car app
- Starlink
- Banking
I’ve weighed using a tablet or laptop, but hard to get away from the smartphone portability.
OK, really like beets to cleanup metadata. I made a backup of my Music library before having beets make changes, which was good as I made a few mistakes as I was getting used to it.
My ~/.config/beets/config.yaml
plugins: fetchart embedart discogs
per_disc_numbering: yes
import:
write: yes
ignore:
- "thumbs.db"
- ".DS_Store"
- "*.log"
- "*.txt"
- "cover.jpg"
- "*Continous.flac"
fetchart:
auto: yes
sources: coverart itunes amazon discogs
minwidth: 500
cautious: yes
I’ll be sharing a few things tomorrow!
Please do, how do you name your music folders/files?
I have a system to automate the download of music and its organisation:
- I shazam the songs I like and / or I add them to a specific playlist on spotify, shazam is connected to my spotify premium account, so everything I shazam goes to the aforementioned playlist
- I have a docker compose that uses
zotifyto download high bitrate.oggfiles from that playlist. In theory they are source spotify files, so no loss of quality there. Up to 320kbps if you use premium, otherwise up to 160kbps if I recall correctly - I also download the synced lyrics from spotify using the same
zotifyapp - I created a script that adds the synced lyrics to the ogg file as metadata using python3
- another script will trigger
beetsimportusing the song ID from spotify, so no need to find metadata anywhere else and the process can be fully automated - done! music available on navidrome with synced lyrics and all the metadata
At the moment I still run the scripts manually because I want to make sure that everything goes well, but I can make it fully automated easily.
As per the directory structure, I go for artist/album/track - title e.g. Eminem/The Slim Shady LP/02 - My Name Is.ogg. It’s simple but I like it.
This is my config file for beets:
# Root
directory: /data/music/library
library: /config/beets/musiclibrary.db
# General
asciify_paths: yes
threaded: yes
import:
move: yes
write: yes
log: /config/beets/beets.log
duplicate_action: skip
quiet_fallback: skip
incremental: no
ignore: ["processed", "tmp"]
# I'm importing the songs using their Spotify ID, so I don't need beets to skip if it's unsure, as I'm sure the identification by the ID is correct
match:
strong_rec_thresh: 1
paths:
default: $albumartist/$album%aunique{}/$track - $title
singleton: $albumartist/$album%aunique{}/$track - $title
comp: $albumartist/$album%aunique{}/$track - $title
albumtype_soundtrack: $albumartist/$album%aunique{}/$track - $title
plugins:
- spotify
- embedart
- lyrics
- edit
#- autobpm
- duplicates
- info
- scrub
- filetote # Even though I add the lyrics to the metadata of the song, I also move the `.lrc` file (named the same as the song) the where the song is moved just in case. It's just a few kb more per song, no biggie
- web
# Plugins configuration
embedart:
auto: no # Picked up from Spotify, but plugin enabled in case I download certain meme songs from youtube and I want to add specific albumart manually
lyrics:
auto: yes
synced: yes
edit:
itemfields: track title artist album albumartist # being able to edit metadata with vim is pretty fast and cool
#autobpm:
# auto: yes
scrub:
auto: yes
filetote:
pairing:
enabled: true
pairing_only: true
extensions: ".lrc"
paths:
paired_ext:.lrc: $albumpath/$medianame_new
web:
host: 0.0.0.0
port: 8337
readonly: true
replace:
'^\.': _
'[\x00-\x1f]': _
'[<>:"\?\*\|]': _
'[\xE8-\xEB]': e
'[\xEC-\xEF]': i
'[\xE2-\xE6]': a
'[\xF2-\xF6]': o
'[\xF8]': o
'\.: _
'\s+: ''
Well dangit, your config > my config! I’m gonna try it out as I’m not completely happy with mine yet. I made a backup, then I can restart if I need. I put cover.jpg in the album directories so it gets the one I want. Gonna try yours ![]()
I only want flac files, 16bit/44.1KHz. If you are using a DAC with quality hard wired headphones, not bluetooth you will notice a difference in sound quality.
I’m just using plenty of different plugins, that’s why my config grew this much. I also have some config geared to the automation of the import, so that adds up too. Filetote also needs plenty of config even though I just want to move .lrc files with the .ogg ones.
I also wanted the highest quality possible, but in my case it was not worth it the extra space needed for the small quality bump, especially considering that that would only be noticeable under specific circumstances. Around 10MB for the average length song in a 320kbps file is decent imo. I saw some very high quality flac file going over 30MB for an average length song… 3x the space for such a small quality bump isn’t worth it in my current setup. I know you always go big, tho! ![]()
How I rip a CD to 1 track.
g3-abcde-single.sh
#!/bin/bash
set -x
abcde -o flac -1 -V -c ~/bin/abcde-single.conf
abcde-single.conf
OUTPUTFORMAT='${ARTISTFILE}/${ALBUMFILE}/${TRACKNUM}.${TRACKFILE}'
FLACENCODERSYNTAX=default
FLACENCODER="flac"
FLACOPTS='-s -5'
EJECTCD=n
For weeks I’ve been learning a lot about music formats and how I want to end up with my music solution. I ripped all my CD’s to FLAC and with how old some of them are, up to 40 years old the metadata isn’t quite correct and caused me a lot of issues with beets. The problem is I have original releases, and over the years there have been re-releases and of course overseas releases causes confusion for automation and I have to be a lot mroe manually involved.
What I’m finding:
-
I use MusicBrainz Picard to do the first lookup, set tags
comp, disc, discc, disctotaland album art. Somtimes if the art is not correct at all, I’ll search and add it ascover.jpgto the directory. -
Import with Beets which will put in the correct desired path, lyrics and album art. Compilations can be problematic and sometimes have to manually update with Metaflac or Beets or MusicBrainz the metadata so that Beets will move it correctly. Typically it’s best to use Beets to update the metadata as it will move immediatly, but still run a
beet updateafter any metadata changes. -
I’m going to re-rep my entire library to FLAC. I can convert this to anything else without loss.
- FLACarchival storage and source conversions
- DSD container for local and my future home player with Sonus sound system in the living room. Also for my portable Astell&Kern.
OGG container with Opus codec[1] FLAC since storage isn’t a problem nor is bandwidth for streaming which transcodes if client needs it: Plex, Jellyfin, Emby. As much as I want to get rid of Plex, it has the best interface and it’s really easy to connect. I keep Jellyfin and Emby running in tandem in case Plex goes pure evil and I’m forced to get away from it.
Home Hardware I’m looking at which I want an App or Web access to control remote and good local access. Stil looking for something with a bigger screen. Must be able to support DSD via network share. This will part of the audio system connected to the main TV, 7.1 for the living room and maybe speakers in other rooms.
- Cambridge Audio CXN100
- Bluesound Node X
For my desktop, still doing a lot of research.
- Chord Electronics Hugo 2
- iFi Audio Pro iDSD
- Topping D90SE
- RME ADI-2 DAC FS
I also wanted specific formatting:
Albums
- Album Artist / Album / Track - Title
- Album Artist / Album / Disk # / Track - Title
Compilations / DJ-Sets
- Compilations / Album Artist / Album / Track - Title
- Compilations / Album Artist / Album / Disc # / Track - Title
Soundtracks
- Soundtracks / Album Artist / Album / Track - Title
- Soundtracks / Album Artist / Album / Disc # / Track - Title
Singles
- Singles / Artist - Track
My latest Beets Configuration
# Beets configuration
directory: /home/gregorygleinig/Music
# General
threaded: yes
logging:
level: DEBUG
plugins: embedart fetchart discogs lyrics lastgenre missing mbsync bpm inline duplicates
import:
move: no
copy: yes
write: yes
from_scratch: no
autotag: yes
log: ~/.config/beets/beets.log
quiet: no
quiet_fallback: ask
incremental: no
resume: yes
ignore:
- thumbs.db
- .DS_Store
- "*.log"
- "*.txt"
- "*.webp"
duplicate_keys:
album: albumartist album disc disctotal
item: artist disc title
duplicates:
count: yes # Show counts of duplicates for each key.
album: yes # Include album-based duplicates.
checksum: no # Use file checksums to detect duplicates.
format: $artist - $album - $disc - $title # Customize the output format.
path: yes # Show full paths to duplicate files.
#duplicate_action: keep
per_disc_numbering: yes
ui:
color: yes
bpm:
- overwrite: yes
fetchart:
auto: yes # Automatically fetch album art during import.
cautious: yes # Avoid fetching low-quality or incorrect images.
minwidth: 300 # Minimum width for fetched album art.
#sources: [filesystem, discogs, coverart] # Preferred sources for artwork.
sources: [filesystem, musicbrainz, discogs coverart] # Preferred sources for artwork.
store: cover.jpg # Store artwork as cover.jpg.
overwrite: no # Do not overwrite cover.jpg if it already exists.
lyrics:
auto: yes # Automatically fetch lyrics during import.
source: genius # Use Genius as the preferred lyrics provider.
store: yes # Embed the fetched lyrics into the music file.
item_fields:
# disctotal is actually metatag "discc" comment property "DISCC"
# can set with: beet modify disctotal=2 album:"George Is On"
# or: metaflac --set-tag=DISCC=2 *.flac
multidisc: 1 if disctotal > 1 else 0
#initial: albumartist[0].upper() + u'.'
#disc_and_track: u'%02i.%02i' % (disc, track) if
# disctotal > 1 else u'%02i' % (track)
comment: "'Collected by Gregory Gleinig https://greg.tube'"
paths:
default: '$albumartist/$album/%if{$multidisc,Disc $disc/}$track - $title'
# set based on RELEASETYPE=single
#single: Non-Album/$artist/$title
#comp: 'Compilation/$albumartist/$album%aunique{}/%if{$multidisc,Disc $disc/}$track - $title'
comp: 'Compilation/$albumartist/$album/%if{$multidisc,Disc $disc/}$track - $title'
#soundtrack: Soundtracks/$album%aunique{}/$album - $track - $title
albumtype:soundtrack: Soundtracks/$album%aunique{}/$track - $title
soundtrack: Soundtracks/$album%aunique{}/$track - $title
unknown: Unknown/$disc-$track $title # For files with missing or unknown artist/album data.
discogs:
user_token: your_token
# G3 Notes:
#
# Filenames
# Use square brackets [ ] for metadata, such as [Disc 1], [Live], or [Remastered].
# Use parentheses ( ) for descriptive or versioning information, such as (Live in Berlin) or (2024 Version).
# dependencies
# sudo apt install imagemagick && sudo ln -s /usr/bin/convert /usr/bin/magick
And scripts I run
It’s a scratchpad of commands, will do more cleaning and update
#!/bin/bash
set -x
# pip install --upgrade python3-discogs-client
# pip install pylast
# config: ~/.config/beets/config.yaml
initial_import() {
# Initial autotag import
beet import "/home/gregorygleinig/Music (import)"
}
import_pathname() {
#beet -v import "/home/gregorygleinig/Music (import)/Above & Beyond"
#beet -v import "/home/gregorygleinig/Music (import)/Above & Beyond/Anjunabeats 100 + From Goa to Rio (Disc Two)"
#beet -v import "~/Music (import)/INXS"
#beet -v import "~/Music (import)/Deep Dish"
#beet -v import "~/Music (import)/Ace of Base"
#beet -v import "~/Music (import)/Alanis Morissette"
#beet -v import "~/Music (import)/Amorphous Androgynous"
#beet -v import "~/Music (import)/Anything Box"
#beet -v import "~/Music (import)/Cause & Effect"
#beet -v import "~/Music (import)/Aqua"
#beet -v import "~/Music (import)/Bananarama"
#beet -v import "~/Music (import)/Book of Love"
#beet -v import "~/Music (import)/Boshell & Cody"
#beet -v import "~/Music (import)/Camouflage"
#beet -v import "~/Music (import)/Chicane"
#beet -v import "~/Music (import)/Christine And The Queens"
#beet -v import "~/Music (import)/Cicada"
#beet -v import "~/Music (import)/Cliff Martinez"
#beet -v import "~/Music (import)/Crystal Method"
#beet -v import "~/Music (import)/Cyndi Lauper"
#beet -v import "~/Music (import)/Daft Punk"
#beet -v import "~/Music (import)/Daryl Hall & John Oates"
#beet -v import "~/Music (import)/Depeche Mode"
beet -v import "~/Music (import)/DEVO"
}
update_compilation() {
beet modify comp=1 album:"George Is On"
beet update
}
force_metatags_from_musicbrains() {
#beet mbsync "Anjunabeats 100 + From Goa to Rio"
beet mbsync "Kick (30) - CD 1"
#beet mbsync "George Is On"
}
remove_album() {
#beet remove -a "Bloom" --delete
#beet remove -a "Trip" --delete
#beet remove -a "Another Minute" --delete
#beet remove -a "Another Minute (Single)" --delete
#beet remove -a artist:'Cause & Effect' --delete
beet remove -a 'George is on' --delete
#beet remove -a 'Trip' --delete
#beet remove -a 'Above & Beyond' --delete
#beet remove -a 'Kick (30) - CD 1' --delete
#beet remove -a 'The Neon Demon' --delete
}
import_from_scratch() {
#beet import --from-scratch "/home/gregorygleinig/Music (import)/Gabriel & Dresden"
#beet import --from-scratch "/home/gregorygleinig/Music (import)/Deep Dish"
#beet import --from-scratch "/home/gregorygleinig/Music (import)/Ace of Base"
#beet -vv import --from-scratch "/home/gregorygleinig/Music (import)/Above & Beyond"
beet import --from-scratch "~/Music (import)/INXS"
}
update_coverart() {
#beet embedart "George Is On" --file ~/"Music/Compilation/Deep Dish/George Is On/Disc 01/cover.jpg"
#beet -v embedart "George Is On" --file cover.jpg
#beet -v fetchart "Mixology 1"
#beet -v embedart "Mixology 1"
#beet -v fetchart "This Feel Is..."
#beet -v clearart "This Feel Is..."
#beet -v embedart "This Feel Is..." --file "/home/gregorygleinig/Music/Christian Boshell & Brian Cody/This Feel Is.._/cover.jpg"
#beet fetchart "Camouflage"
#beet -v embedart album:"Cause & Effect" --file "/home/gregorygleinig/Music/Cause & Effect/Cause & Effect/cover.jpg"
beet -v embedart album:"The Neon Demon" --file "/home/gregorygleinig/Music/Soundtracks/The Neon Demon/cover.jpg"
}
show_info() {
#beet ls -f 'discnumber: $discnumber disc:$disc multidisc:$multidisc disctotal:$disctotal artist:$artist album:$album track:$track title:$title'
beet ls -f '$albumartist $album $disc $disctotal'
}
update_soundtrack() {
beet modify releasetype!: album:"The Neon Demon"
beet modify releasetype="soundtrack" grouping="soundtrack" album:"The Neon Demon"
}
update_personal_comment() {
beet modify personal_comment="Collected by Gregory Gleinig https://greg.tube" album:"The Neon Demon"
}
check_config() {
beets config
}
upgrade_beets() {
pip install --upgrade beets
}
add_lyrics() {
#beet lyrics album:"George Is On"
beet lyrics album:"Enjoy the Silence"
}
#force_metatags_from_musicbrains
#remove_album
#update_coverart
#update_soundtrack
#update_compilation
#show_info
#check_config
#upgrade_beets
#update_personal_comment
#add_lyrics
#initial_import
#import_from_scratch
import_pathname
Metaflac
It’s a scratchpad of commands, will do more cleaning and update
#!/bin/bash
set -x
remove_all_tags() {
metaflac --remove-all-tags *.flac
}
list_all_tags() {
metaflac --list *.flac | grep -i comment
}
list_tags() {
metaflac --show-tag=ALBUMARTIST --show-tag=ALBUM --show-tag=DISC --show-tag=DISCTOTAL *.flac
}
#metaflac --remove-tag=ALBUMARTIST *.flac
#metaflac --set-tag=ALBUMARTIST="Above & Beyond" *.flac
#metaflac --list 'All That She Wants (single version).flac' | grep -i comment
#
#metaflac --list '03 All That She Wants (Banghra version).flac' | grep -i comment
#metaflac --show-tag=ALBUMARTIST *.flac
#metaflac --remove-tag=ALBUMARTIST *.flac
#metaflac --set-tag=ALBUMARTIST="Deep Dish" *.flac
#metaflac --show-tag=ALBUMARTIST *.flac
#metaflac --show-tag=ALBUM *.flac
#metaflac --remove-tag=COMPILATION *.flac
#metaflac --set-tag=COMPILATION=1 *.flac
#metaflac --show-tag=COMPILATION *.flac
#metaflac --remove-tag=RELEASETYPE *.flac
#metaflac --set-tag=RELEASETYPE=1 *.flac
#metaflac --show-tag=RELEASETYPE *.flac
#metaflac --remove-tag=DISCNUMBER *.flac
#metaflac --set-tag=DISCNUMBER=1 *.flac
#metaflac --show-tag=DISCNUMBER *.flac
# RELEASETYPE=single, MUSICBRAINZ_ALBUMTYPE=single
#metaflac --remove-tag=RELEASETYPE *.flac
#metaflac --remove-tag=MUSICBRAINZ_ALBUMTYPE *.flac
#metaflac --set-tag=RELEASETYPE=single *.flac
#metaflac --show-tag=RELEASETYPE *.flac
# discc / DISCC
#metaflac --remove-tag=DISCC *.flac
#metaflac --set-tag=DISCC=2 *.flac
#metaflac --show-tag=DISCC *.flac
#metaflac --remove-tag=DISC *.flac
#metaflac --set-tag=DISC=1 *.flac
#metaflac --show-tag=DISC *.flac
#metaflac --remove-tag=ALBUM *.flac
#metaflac --set-tag=ALBUM="George Is On" *.flac
#metaflac --show-tag=ALBUM *.flac
#metaflac --list *.flac | grep -i comment
set_compilation() {
metaflac --remove-tag=COMPILATION *.flac
metaflac --set-tag=COMPILATION=1 *.flac
metaflac --show-tag=COMPILATION *.flac
}
set_disc_number() {
metaflac --remove-tag=DISC *.flac
metaflac --set-tag=DISC=2 *.flac
metaflac --show-tag=DISC *.flac
metaflac --remove-tag=DISCNUMBER *.flac
metaflac --set-tag=DISCNUMBER=2 *.flac
metaflac --show-tag=DISCNUMBER *.flac
}
set_disc_total() {
metaflac --remove-tag=DISCC *.flac
metaflac --set-tag=DISCC=2 *.flac
metaflac --show-tag=DISCC *.flac
metaflac --remove-tag=DISCTOTAL *.flac
metaflac --set-tag=DISCTOTAL=2 *.flac
metaflac --show-tag=DISCTOTAL *.flac
}
#remove_all_tags
set_compilation
set_disc_number
set_disc_total
#list_all_tags
#list_tags
Signalyst
A DSD player for the desktop. I’ve tried to get this installed under Pop!_OS, having dependecny issues. When I figure it out will post my findings on how to get this to work.
As my journey continues, I’ll be updating here.
FLAC is best for high-quality, lossless audio. Opus in OGG is best for streaming efficiency with good quality at lower bitrates. ↩︎
That’s insane, good job man! I’m sure this is a safe place, but remember to remove the discogs user token.
Good point, especially as this is public ![]()




