Changelog#
This project adheres to Semantic Versioning.
v2.1.3 (2024-04-06)#
Bug Fixes#
Metatracks always failing equality (89e25d2)
v2.1.2 (2024-04-06)#
Build Changes#
v2.1.1 (2023-05-22)#
Build Changes#
v2.1.0 (2022-12-21)#
New Features#
v2.0.0 (2022-12-20)#
I’m not particularly happy about how little time as passed between v1.0.0 and this release and I don’t expect this timeframe to be the norm. In a perfect world, I’m releasing at most 1-2 major versions per year of Moe. I justified this timeframe as I still don’t think there’s many people using Moe and the list of breaking changes I wanted to implement had settled at a good number.
With that said, I recommend reading through the following notes before upgrading.
Breaking Changes#
Use mediafile dependency over moe_mediafile fork (bcda77d)
Now that our changes have been merged into mediafile, there’s no longer a need to use our fork.
You may experience issues if you have both moe_mediafile and mediafile installed together. All users upgrading should explicitly uninstall moe_mediafile by running ``pip uninstall moe_mediafile``.
DB sessions are now explicitly passed as arguments (228a017)
This helps clarify exactly which functions require the database to be initialized. Also, it helps avoid any potential future issues with relying entirely on a global/thread-local session factory.
The following functions/hooks are affected by this change:
add.add_item
- newsession
parametercli.Hooks.add_command
- the sub-command functions are now passed asession
parameterconfig.Hooks.register_sa_event_listeners
-session
parameter removedduplicate.resolve_dup_items
- newsession
parameterduplicate.Hooks.resolve_dup_items
- newsession
parameterduplicate.resolve_duplicates
- newsession
parameterduplicate.get_duplicates
- newsession
parameterlibrary.lib_item.Hooks.edit_changed_items
- newsession
parameterlibrary.lib_item.Hooks.edit_new_items
- newsession
parameterlibrary.lib_item.Hooks.process_removed_items
- newsession
parameterlibrary.lib_item.Hooks.process_changed_items
- newsession
parameterlibrary.lib_item.Hooks.process_new_items
- newsession
parameterquery.query
- newsession
parameterremove.remove_item
- newsession
parameterutil.cli.query.cli_query
- newsession
parameter
config.MoeSession
has also been replaced withconfig.moe_sessionmaker
. Sessions should no longer be created by importingMoeSession
, and instead should use a session parameter that is created at the top-level of an application. Refer to theconfig.py
docstring as well ascli.py
for more information on how to handle sessions now.Changed CandidateAlbum attributes (9cc69db)
source_str
is now split into two fields:plugin_source
andsource_id
. This is so in the future we can check against theplugin_source
and apply different handling criteria per plugin e.g. import weight values.sub_header_info
renamed todisambigs
. The “sub-header” is specific to the cli, so it was renamed to be more generalized.
Replaced
lib_path
arg forfmt_item_path
with optionalparent
arg (cc267d5)This is more flexible as it allows specifying the direct parent for albums, extras and tracks instead of just albums.
Removed sync plugin (ae0889d)
The original idea of the sync plugin to sync multiple metadata sources with one command has some implementation barriers that were not fully fleshed out. Instead, each plugin should just implement their own sync commands.
Removed musicbrainz plugin (d171be0)
Musicbrainz is now a third-party plugin to be consistent with Moe’s policy that any external source plugins should not be in the core repository.
If you’d like to continue to use musicbrainz as an import source, you can install the new plugin with
pip install moe_musicbrainz
. Also, ensure to enable it in your configuration. You can find more information on the Thid-Pary Plugins documentation page.Removed
plugin
sub-directory and package (d3d756d)Now, rather than having to import an api function as
moe.plugins.add.add_item
, it’s justmoe.add.add_item
. I felt the extraplugins
import level was unnecessarily verbose.Custom fields now require dictionary access (1df625c)
Custom fields must now be accessed via
item.custom["my_custom_field"]
i.e. normal dictionary access.I changed this from normal attribute access as overriding
__getattr__
and__setattr__
(required for transparent attribute access) had some finicky conflicts with sqlalchemy. Also, it prevented type hinting the custom attribute dictionary as well as integration with data serializers such as pydantic.Overall, the more I used them, the more issues I found, and the more it felt like a hack. I believe the new explicit dictionary access for custom attributes will prove to be more bulletproof. It also explicitly delineates normal and custom attributes which can be useful in some cases.
Renamed
album_obj
reference toalbum
in tracks and extras (51ff9a9)track.album
now refers to the actual album object (renamed fromtrack.album_obj
) andtrack.albumartist
has been removed. Similarly,extra.album_obj
has been renamed toextra.album
.The original idea was that
track.album
was a string that referred to an album’s title, whiletrack.album_obj
was the actual album object itself.track.album
andtrack.albumartist
were “mapped” attributes of an album directly exposed in the track API due to convention. However, these mapped attributes are not first-class attributes as far as sqlalchemy is concerned, and thus have additional issues and considerations compared to normal attributes. Ultimately, I decided these mapped attributes are not worth the headache.
Performance Enhancements#
Slightly improved start-up time by importing default plugins (0ffd10a)
Build Changes#
Removed pyyaml dependency (2519817)
v1.5.1 (2022-11-06)#
Bug Fixes#
Ensure tracks created from files contain required tags (bf215ed)
v1.5.0 (2022-11-05)#
New Features#
Bug Fixes#
Build Changes#
Support python 3.11 (de6ebd2)
v1.4.0 (2022-11-03)#
New Features#
Show catalog number after label during import (84f8067)
Bug Fixes#
Musicbrainz error if release does not have a date or format (d0fe109)
v1.3.2 (2022-11-01)#
Bug Fixes#
Track audio_format is now a property and not a field (c2aeda7)
v1.3.1 (2022-11-01)#
Bug Fixes#
Use fork of mediafile (53d8333)
v1.3.0 (2022-11-01)#
New Features#
v1.2.0 (2022-10-12)#
New Features#
Bug Fixes#
Tags now written to tracks if album fields changed (48f7076)
v1.1.0 (2022-10-12)#
New Features#
v1.0.0 (2022-10-09)#
First stable release! From this point on, the API is considered stable and breaking changes will result in a new major version per semantic versioning.
Breaking Changes#
Update docs for stable release (07fec3e)
Bug Fixes#
Import wrong dataclass (ee6959a)
v0.16.0 (2022-10-09)#
New Features#
v0.15.3 (2022-10-08)#
Bug Fixes#
Musicbrainz error if a release has no label (6991a41)
v0.15.2 (2022-10-08)#
Bug Fixes#
Musicbrainz error if release does not have a country specified (1c0f844)
v0.15.1 (2022-10-08)#
Bug Fixes#
Sync_item not called with keyword arguments (7c4b65a)
v0.15.0 (2022-10-08)#
New Features#
New config option
original_date
(3894fa7)New field - original_date (416d202)
Add media, label, country, and year to import header (ce9cc9a)
New album field - label (80e8348)
New album field - country (5a51d71)
New album field - media (256a3a6)
New track field - artists (7701d9e)
New path template function to get a unique extra filename (8a0c3a3)
Allow plugins to create custom path template functions (195ea9c)
Add mbcol cli argument to sync music to a musicbrainz collection (4f00136)
List cli output is now sorted (fbb11d0)
v0.14.0 (2022-10-02)#
New Features#
Add: New import option to skip a single item (3d3027c)
v0.13.0 (2022-10-02)#
New Features#
Adjusted track match values to be more lenient (9b90803)
v0.12.2 (2022-10-02)#
Bug Fixes#
Relative path error if album and file use non-relative hardlinks (8574e38)
v0.12.1 (2022-10-02)#
Bug Fixes#
v0.12.0 (2022-10-02)#
New Features#
Bug Fixes#
Build Changes#
Add rich as a dependency (626b20c)
v0.11.0 (2022-09-19)#
Some big changes here, notably requiring python3.9 to take get the json1 extension in sqlite. This is what allows us to now support custom fields in plugins. This version introduces an non-backwards-compatible database change, and thus will require a deletion of any current library.
New Features#
Read and write musicbrainz ids (ef82c67)
New hook to allow plugins to write custom tags to a track (8ee8fcb)
New hook to allow plugins to read/set custom track tags (b5069ba)
Custom fields can be set by plugins for all library items (9606c1d)
MB: New api call to update an album from musicbrainz (2a972de)
MB: Added new api call to set a mb collection to a set of releases (aad7959)
MB: Ability to auto update a musicbrainz collection (6e1cec1)
Build Changes#
v0.10.0 (2022-09-05)#
New Features#
v0.9.0 (2022-09-02)#
Feat#
Paths are now configurable.
Better duplicate resolution.
v0.8.2 (2022-02-03)#
Refactor#
clean query_type code
v0.8.1 (2021-09-21)#
Fix#
remove src directory
v0.8.0 (2021-08-28)#
Feat#
config: extra plugins can be specified in config init
add
plugin_registration
hook to allow custom plugin registration
Refactor#
cli: move
edit_new_items
andprocess_new_items
hooksswitch to using a thread-local session
remove core subpackage
change to src/moe layout
split cli and core files
v0.7.3 (2021-08-14)#
Fix#
add: abort will now abort importing an item entirely
v0.7.2 (2021-08-14)#
Refactor#
add: take advantage of argparse pathlib type
v0.7.1 (2021-08-08)#
Refactor#
api: introduce core api
library: add
fields
attribute to library itemsquery: “*” query now searches by track ID
library: take advantage of is_unique in eq
v0.7.0 (2021-07-18)#
Feat#
list: add ability to list item paths
v0.6.1 (2021-07-18)#
Fix#
move: remove ability to auto-move items on tag changes
move: remove leftover empty dirs after an album has been moved
v0.6.0 (2021-07-18)#
Feat#
move: add the
move
command
v0.5.0 (2021-07-17)#
Feat#
add: use ‘artist’ as a backup for ‘albumartist’ if missing
v0.4.2 (2021-07-17)#
Fix#
add: invalid tracks aren’t added as extras and are logged properly
v0.4.1 (2021-07-17)#
Refactor#
more appropriate names for sub-command parsers
abstract sqlalchemy orm events into new hook specifications
v0.4.0 (2021-07-15)#
Feat#
move: add
asciify_paths
configuration option
Refactor#
move: move/copying tracks & extras now requires a destination
v0.3.12 (2021-07-12)#
Refactor#
mrmoe -> moe
v0.3.11 (2021-07-11)#
Refactor#
cli: only print warnings or worse logs for external libraries
v0.3.10 (2021-07-11)#
Fix#
info: error accessing empty fields
v0.3.9 (2021-07-11)#
Refactor#
info: album info now only prints album attributes
v0.3.8 (2021-07-11)#
Refactor#
track: remove
file_ext
fieldtrack: genre is now a concatenated string and genres is a list
track: don’t expose
album_path
as a track fieldextra: album -> album_obj
Fix#
track: properly read musibrainz track id from file
write: write date, disc, and disc_total to track file
v0.3.7 (2021-07-11)#
Fix#
move: album copies to proper directory on add
v0.3.6 (2021-07-10)#
Fix#
move: don’t move items until they’ve been added to the dB
v0.3.5 (2021-07-08)#
Fix#
write and move properly oeprate on all altered items
v0.3.4 (2021-07-08)#
Fix#
library: error when adding duplicate genres
v0.3.3 (2021-07-08)#
Refactor#
add: abstract questionary dependency from API
v0.3.2 (2021-07-07)#
Refactor#
api: define the api
v0.3.1 (2021-07-06)#
Fix#
add: track file types now transferred when adding a new album via prompt
v0.3.0 (2021-07-06)#
Feat#
add: only print new track title on prompt if it changed
v0.2.1 - v0.2.3 (2021-07-02)#
Fix issues installing from PYPI. (Lesson learned to use test.pypi.org next time.)
v0.2.0 (2021-07-01)#
Initial Alpha Release!
Basic features include:
add/remove/edit/list music to your library
import metadata from Musicbrainz