musso is a music sorter CLI tool that helps you to keep your music folder sorted. It's designed to be simple and fast, but also powerful and fully automated. Currently, musso supports MP3, FLAC, OGG, M4A and M4P. This project was forked from muso.
To build musso yourself you need at least Rust 1.41. If you aren't going
to install it using a package manager you should build musso with feature
standalone
activated, for example:
cargo build --features standalone --release
The standalone feature include contents of service and config in binary, so musso can create these files by itself.
To install from source using cargo (installed bin is in $HOME/.cargo/bin
)
you can do the following:
cargo install --path . --features standalone
musso is all about renaming and moving files around, but how it'll decide where the new file will reside, or which is going to be its name? Fortunately you can tell musso how to rename your files with a format string. This string will build the new name (path) using one or more of the following placeholders:
{artist}
: Artist name (Album Artist from tags is preferred, then Artist).{album}
: Album name.{disc}
: Disc number.{track}
: Track number.{title}
: Song title.{ext}
: File extension (e.g.mp3
,flac
)
As an example, the default format that musso will use is the following.
"{artist}/{album}/{track} - {title}.{ext}"
The {disc}
and {track}
placeholders have the option to fill
with leading zeros, the syntax is {disc:n}
or {track:n}
where n
is the
length that has to be achieved adding leading zeros. For example, using {disc:2}
will produce the following transformations:
2
will become02
10
will become10
Finally, all of these placeholders (except {ext}
) support an optional flag
(activated by adding a ?
before the }
, e.g. {artist?}
, {disc:2?}
).
Renaming a file that doesn't have a specific tag doesn't fail but leaves empty
that placeholder in the string, however note that there are some rules:
- Directory components cannot be optional (e.g. this is invalid
{artist}/{album?}/{title}.{ext}
) - File name component must have one required placeholder, apart from
{ext}
(e.g. this is invalid{artist}/{title?}.{ext}
)
Note: These rules may be different in the future if I find a better way to fill these "unknowns" (possibly using ?
for digits and Unknown
for strings, or adding the option to provide a custom value).
A format string can be specified for oneshot mode using the -f/--format
option, or providing it in for each library in the config
file.
We recently talked about libraries, these objects are used in the config file to provide musso settings while it's running in watcher mode. For example, the default library provided in the default config file is described as follows.
[libraries.default]
# Specified format that will be used for this library
format = '{artist}/{album}/{track} - {title}.{ext}'
# Folders that compose this library
folders = ['$HOME/Music']
# If enabled, the rename will be compatible with exFAT
exfat-compat = true
They are used to provide different options, to different folders.
musso will search for a config file in the following directories in order:
$XDG_CONFIG_DIR/musso/config.toml
$HOME/.config/musso/config.toml
It's also possible to indicate a custom path for config file with the
-c/--config
option. Config file is primary used when running in watcher
mode, but it's also able to provide a default format string for certain
folders while running in oneshot mode. For example, in the default config
file the default library specifies a format and a list of
folders, if you would run musso on $HOME/Music
without specifying a
format, it'll try to grab it from the config file, if there isn't one that
correspond to the folder it'll fall back to the default.
musso can be used in two modes: oneshot and watcher. Both of them have
similar functionalities, but as the naming suggest they perform it differently.
Below we have the output of musso --help
, which explains each option or flag available
USAGE:
musso [OPTIONS] <SUBCOMMAND>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-c, --config <config> Path to custom config file
SUBCOMMANDS:
copy-service Copy service file to systemd user config dir
help Prints this message or the help of the given subcommand(s)
sort Sort a music directory
watch Watch libraries and sort added files
By the default, musso will run on the current working dir, but you can provide your own path as a free argument. Config file is optional in this mode.
In this mode config file is required, and as it's described in section [watch]
of the default config file, the watcher can be configured.
[watch]
every = 1 # second(s)
# Specifies which libraries will be seen by musso
libraries = [ 'default' ]
It's recommended to invoke the watcher mode using the provided service
file for systemd
, this way you can run musso
automatically on boot. Service file should be run on user level (systemctl --user
). The easiest way to copy the service file is running musso with
copy-service
subcommand.
GNU General Public License v3.0
See LICENSE to see the full text.