This is part of the MusicBrainz spec, but I didn't think of implementing
it. Turns out it's stupidly common among music releases, so may as well.
Resolves#590.
M4A has it's own multi-value spec that works similarly to vorbis, where
they just repeat the atom several times with multiple values. Since M4A
atoms are remapped to ID3v2 frames, this more or less requires us to
tolerate duplicate ID3v2 frames as well, which is frustratingly a spec
violation. It solves the problem though
Resolves#558.
Implement a new Name.Known.Factory instance that replaces the usage of
Name.Known.from.
This again allows songs to be differentiated on tag interpretation and
is generally easier to test.
Move all multi-value utilities to a new Separators interface.
This should allow separator config to be dynamically compared across
song instances, and generally make songs easier to test.
Trim simple names once punctuation has been removed.
This prevents situations where album names like "& Yet & Yet" (a real
album by post-rock outfit Do Make Say Think) will have blank thumbs.
This probably isn't the best approach in general, but nothing about the
intelligent name system is a good approach.
Rename MusicMode to MusicType.
The original naming was always a bit clunky given that it referred to
both settings and data configuration. I feel that "Type" is probably
better overall.
Refactor the music name implementation to do the following:
1. Unify normal and sort names under a single datatype
2. Handle arbitrary-length digit strings
3. Ignore puncutation regardless of the intelligent sort
configuration, as it is trivially localizable.
Resolves#423.
Co-authored by: ChatGPT-3.5
Make the numeric sort name handling added prior dependent on a new
"Intelligent Sorting" setting that also controls the article checks.
This kind of behavior might not be desirable in all cases, and it makes
the setting more consistent anyway.
Refactor the disjoint Library and Playlist setup into two new
DeviceLibrary and UserLibrary implementations.
This makes the API surface a bit less disjoint than prior.
Unify Indexer and MusicRepository into a single class.
This is meant to create a single dependency on PlaylistDatabase and
reduce the amount of orchestration.
Fully use DI in the playback module.
Previously use was split among different components that could leverage
injection, and components that could not. This fully unifies them.
Use @Binds more heavily with dependency injection, whee currently
reasonable.
Reduces the amount of boilerplate "fun from" functions that need to be
used.
Make sorting direction (ascending/descending) explicit in the UI and in
the code.
Instead of a boolean flag, two distinct "ascending" and "descending"
options are used instead. This should be much clearer.
Start injecting shared object instances.
This is not a 100% conversion, as certain portions of the code are not
really ready for 100% DI constructors just yet.
Split off "raw" music (RawSong, RawAlbum) from real music impls
(RealSong, RealAlbum).
They don't really make sense as a sub-class anymore given that there is
no longer a canonical music datastructure.