Repository navigation
Most importantly, adds new plistsync sync CLI (create, remove, list, register, show, run) for managing and running SyncedPlaylists, i.e. plistsync is now usable as a full sync tool from the command line.
Breaking Changes
- Service configuration is now dynamic and extensible. Instead of a static config schema with hardcoded service fields, the schema is built at runtime from registered
ServiceConfigsubclasses. Each service ships its own config class inplistsync/services/<service>/config.py(BeetsConfig,PlexConfig,SpotifyConfig,TidalConfig,TraktorConfig), which enables easier addition of new services and more flexible validation.- Removed the hardcoded service accessors on
Config(Config.beets,Config.plex,Config.spotify,Config.tidal,Config.traktor). UseConfig.get_service_config("<service>")or the convenience classmethod on the service's config class (e.g.PlexConfig.get()) instead. - Removed the per-service
enabledflag (theOptionalServicebase class is gone); a service config is now always part of the schema once its config class is registered. Theenabledkey is no longer accepted in service sections and must be removed from existing config files. - The config file is now loaded from
config.yamlinstead ofconfig.yml. Rename existing config files; otherwise a fresh default config is generated. - Removed the
enabledflag from theloggingsection. Logging is always initialized when the CLI starts, so the key is no longer supported and must be removed from existing config files.
- Removed the hardcoded service accessors on
Added
- Added
match_manymethod toCollectionbase to allow matching multiple tracks at once, improving performance for large collections as it avoids repeated api calls for each track. - Added the
ServiceConfigbase class, which auto-registers a service's config schema and automatically includes it in the main config schema. - Added
Config.get_service_config()which lazily discovers a service, rebuilds the config schema, reloads and validates the config file, and returns the service's config instance. - Added the
plistsync syncCLI subcommands (create,remove,list,register,show,run) for managing and running synced playlists. - Added
Service.config()for resolving a service's registered config class and theServiceConfig.get()classmethod (e.g.PlexConfig.get()) for direct access to the service config instance. - Moved each service's configuration into the service package, including token handling (
SpotifyConfig.load_token(),TidalConfig.load_token(),PlexConfig.token_path).
Changes
- The generated default config file now includes all discoverable services, making it easier to see which services are available and how to configure them.
- Logging is now initialized when the CLI starts instead of at import time. This makes logging configuration more predictable, avoids side effects for library consumers, and improves support for applications managing their own logging configuration. (#107)
- Updated eyconf dependency to 0.8.0, we now use
pydanticfor config validation and schema generation instead ofjsonschema.