Release Historyο
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning
1.0.0ο
Addedο
Custom API caching backend to replace dependency on requests-cache package. Currently only supports SQLite backend. More backends can be implemented in future if desired.
Cache settings for specific GET request endpoints on
SpotifyAPI
replacing need for per methoduse_cache
parameter.
Changedο
Replaced
authorise
method fromAPIAuthoriser
with __call__ method for class.Dependency injection pattern for
RequestHandler
andRemoteAPI
. Now takesAPIAuthoriser
andResponseCache
objects for instantiation instead of kwargs forAPIAuthoriser
.APIAuthoriser
kwargs given toSpotifyAPI
now merge with default kwargs.Moved
remote_wrangler
attribute fromMusifyCollection
toLocalCollection
. This attribute was only needed byLocalCollection
branch of child classes.Moved
logger
attribute fromLibrary
toRemoteLibrary
.Switch some dependencies to be optional for groups of operation: progress bars, images, musicbee
Fixedο
Added missing variables to __slots__ definitions
Correctly applied __slots__ pattern to child classes. Now works as expected.
LocalTrack
now copies tags as expected when callingcopy.copy()
Removedο
use_cache
parameter from allRemoteAPI
related methods. Cache settings now handled byResponseCache
0.9.2ο
Addedο
REMOTE_SOURCES
global variable in thelibraries.remote
module which lists the names of all the fully supported remote sources. Also, added theSOURCE_NAME
global variable for the Spotify module.
Changedο
FilterComparers
now accepts a singleComparer
on thecomparers
argument.MusicBee
class attributes were renamed to classify that full paths are also valid, not just filenames.ItemDownloadHelper
urls
init arg now has default arg of empty tuple.
Documentationο
Fixed error in βsync dataβ how-to.
Fixedο
Comparer
now considers strings as converted on first pass when converting expected values.Printing of new line at the end of
RemoteLibrary.extend()
0.9.1ο
Fixedο
Bug in
ItemMatcher.match()
where operations always returned the last item in the given list ofresults
0.9.0ο
Addedο
RemoteAPI
methods now acceptRemoteResponse
objects as input, refreshing them automaticallyProperty βkindβ to all objects which have an associated
RemoteObjectType
Introduced
MusifyItemSettable
class to allow distinction between items that can have their properties set and those that canβtExtend
FilterMatcher
with group_by tag functionalityNow fully supports parsing of processors relating to
XAutoPF
objects with full I/O of settings to/from their related XML files on diskNow supports creating new
XAutoPF
files from scratch without the file needing to already exist For XML values not directly controlled by Musify, users can use the βdefault_xmlβ class attribute to control the initial default values applied in this scenarioβlengthβ property on
MusifyCollection
and implementation on all subclasses
Changedο
Major refactoring and restructuring to all modules to improve modularity and add composition
- The following classes and methods have been modified to implement concurrency to improve performance:
LocalLibrary.save_tracks()
LocalLibrary.json()
+ optimisation for extracting JSON data from tracks
Made
load_tracks()
andload_playlists()
utility functions more DRYMove
TagReader.load()
fromLocalTrack
to super classTagReader
SpotifyAPI.extend_items()
now skips on responses that are already fully extendedSpotifyArtist.load()
now uses the base load method fromSpotifyCollectionLoader
meaning it now takes full advantage of the item filtering this method offers. As part of this, the base method was made more generic to accommodate allSpotifyObject
typesRenamed βkindβ property on
LocalTrack
to βtypeβ to avoid clashing property namesItemMatcher
,RemoteItemChecker
, andRemoteItemSearcher
now accept all MusifyItem types that may have their URI property set manuallyRemoteItemChecker
andRemoteItemSearcher
no longer inherit fromItemMatcher
. Composite pattern used instead.ItemSorter
now shuffles randomly on unsupported types + prioritises fields settings over shuffle settingsComparer._in_range()
now uses inclusive range i.e.a <= x <= b
wherex
is the value to compare anda
andb
are the limits. Previously used exclusive range i.e.a < x < b
Removed
from_xml
andto_xml
methods from allMusicBeeProcessor
subclasses. Moved this logic toXMLPlaylistParser
as distinct βgetβ methods for each processor typeMoved loading of XML file logic from
XAutoPF
toXMLPlaylistParser
.XMLPlaylistParser
is now solely responsible for all XML parsing and handling forXAutoPF
files
Fixedο
Comparer
dynamic processor methods which process string values now cast expected types before processing
Removedο
Redundant ShuffleBy enum and related arguments from
ItemSorter
ItemProcessor
andMusicBeeProcessor
abstraction layers. No longer needed after some refactoringget_filtered_playlists
method fromLibrary
. This contained author specific logic and was not appropriate for general use
Documentationο
Added info on lint checking for the contributing page
0.8.1ο
Changedο
ItemSorter
now acceptsshuffle_weight
between -1 and 1 instead of 0 and 1. This parameterβs logic has not yet been implemented so no changes to functionality have been made yetMove
get_filepaths()
fromLocalTrack
to super classFile
Documentationο
References to python objects now link correctly
Fixedο
Comments from
LocalTrack
metadata loading no longer gets wiped after setting URI on initTweaked assignment of description of IDv3 comment tags for
MP3
align_string()
function now handles combining unicode characters properly for fixed-width fontsLocalTrack.get_filepaths()
on LocalTrack no longer returns paths from$RECYCLE.BIN
folders. These are deleted files and were causing the package to crash when trying to load themPrettyPrinter.json()
andPrettyPrinter._to_str()
converts attribute keys to string to ensure safe json/str/repr outputFilterMatcher
andFilterComparers
now correctly import conditions from XML playlist files. Previously, these filters could not import nested match conditions from files. Changes to logic also made toComparer.from_xml()
to accommodateXMLLibraryParser
now handles empty arrays correctly. Previously would crashFixed
Comparer
dynamic process method alternate names forin_the_last
andnot_in_the_last
Removedο
Abstract uri.setter method on
Item
0.8.0ο
Addedο
Add debug log for error failure reason when loading tracks
MusifyCollection.intersection()
andMusifyCollection.difference()
methodsPlaylist.merge()
andLibrary.merge_playlists()
methods
Changedο
Generating folders for a
LocalLibrary
now uses folder names as relative to the library folders of theLocalLibrary
. This now supports nested folder structures betterWriting date tags to
LocalTrack
now supports partial dates of only YYYY-MMWriting date tags to
LocalTrack
skips writing year, month, day tags if date tag already written
Removedο
set_compilation_tags method removed from
LocalFolder
. This contained author specific logic and was not appropriate for general use
Fixedο
ConnectionError catch in
RequestHandler
now handles correctlyAdded safe characters and replacements for path conversion in MusicBee
XMLLibraryParser
. Now converts path to expected XML format correctlyFilterMatcher
now handles β&β character correctlySpotifyAPI
now only requests batches of up to 20 items when getting albums. Now matches Spotify Web API specifications betterLoading of logging yaml config uses UTF-8 encoding now
Removed dependency on pytest-lazy-fixture. Package is broken for pytest >8.0. Replaced functionality with forked version of code
0.7.6ο
Fixedο
Rename __max_str in local/collection.py to _max_str - functions could not see variable
Add default value of 0 to sort_key in
ItemSorter.sort_by_field()
Fixed
RemoteItemChecker
_pause()
logic to only get playlist name when input is not False-y
0.7.5ο
Addedο
Add the
ItemDownloadHelper
general processor
Changedο
Factor out logging handlers to their own script to avoid circular import issues
Abstract away input methods of
RemoteItemChecker
toInputProcessor
base classFactor out patch_input method to function in
InputProcessor
derived tests
Fixedο
Captured stdout assertions in
RemoteItemChecker
tests re-enabled, now fixedSurround
RemoteAPI
βuserβ properties in try-except block so they can still be pretty printed even if API is not authorised
Documentationο
Fix redirect/broken links
Change notes text to proper rst syntax
0.7.4ο
Fixedο
Fix bug in
LocalLibrary.restore_tracks()
method on library due to βimagesβ tag name not being present in track properties
Documentationο
Expand docstrings across entire package
Expand documentation with how to section, release history, and contributions pages
0.7.3ο
Changedο
Remove x10 factor on bar threshold on _get_items_multi function in
SpotifyAPI
Fixedο
LocalTrack
would break when trying to save tags for unmapped tag names, now handles correctly
0.7.2ο
Fixedο
MusifyLogger
would not get file_paths for parent loggers when propagate == True, now it does
0.7.1ο
Changedο
Remove automatic assignment of absolute path to package root for relative paths on
CurrentTimeRotatingFileHandler
Fixedο
CurrentTimeRotatingFileHandler
now creates dirs for new log directories
0.7.0ο
Addedο
Initial release! π