Skip to content

Releases: metasauce/plistsync

Release 0.6.0

18 Apr 13:52

Choose a tag to compare

Breaking Changes

Playlist Class Hierarchy Refactor

The playlist class hierarchy has been redesigned for clearer separation of concerns:

Renamed Classes:

  • PlaylistCollectionPlaylist (base protocol)
  • SpotifyPlaylistCollectionSpotifyPlaylist
  • TidalPlaylistCollectionTidalPlaylist
  • PlexPlaylistCollectionPlexPlaylist
  • NMLPlaylistCollectionNMLPlaylist

Library Classes Renamed:

  • SpotifyLibraryCollectionSpotifyLibrary
  • TidalLibraryCollectionTidalLibrary
  • PlexLibrarySectionCollectionPlexLibrary
  • NMLLibraryCollectionNMLLibrary

New Abstractions:

  • OfflinePlaylist — In-memory playlist with no service synchronization
  • ServicePlaylist — Base for playlists synchronized with music services
  • MultiRequestServicePlaylist — For APIs requiring multi-request modifications
  • PlaylistIDs — Unified TypedDict for cross-service playlist identification

Method Changes:

Old New Notes
remote_edit() edit() Context manager for transactional edits
remote_delete() delete() Returns OfflinePlaylist with last state
remote_create() library.create_playlist() Factory method on library
remote_upsert() update() Bulk sync to remote
remote_associated Removed Service playlists always correspond to remote

Migration:

# Old
pl = SpotifyPlaylistCollection(library, "Name", "desc")
pl.remote_create()
with pl.remote_edit():
    pl.tracks.append(track)

# New
pl = library.create_playlist("Name", "desc")
with pl.edit():
    pl.tracks.append(track)
  • Auth commands are now available via plistsync auth [service] instead of plistsync [service] auth

Added

  • Split Playlist ABC into two classes: one for simple services, like filesystems, where states can be pushed via a single API call (PlaylistCollection) and one where multiple API calls are required (MultiRequestPlaylistCollection), e.g. when a playlists description cannot be pushed in the same call as track changes.
  • Added allservices dependency group to allow a loaded pip install with batteries included.
  • Added plistsync --version command to show the currently installed version of the library

Fixed

  • Fixed lazy track loading when playlist has 0 tracks (force=True logic in _load_tracks)
  • In rare cases, spotify playlists can contain invalid items, which do not appear in the web interface (but through the api). We now filter and remove them.
  • Fixed an issue with the spotify api returning duplicate playlists on pagination borders.
  • In rare cases, spotify playlists can contain invalid items, which do not appear in the web interface (but through the api). We now filter and remove them.

📦 PyPI: https://pypi.org/project/plistsync/0.6.0/

📁 Artifacts:

  • sdist: plistsync-0.6.0.tar.gz
  • wheel: plistsync-0.6.0-py3-none-any.whl

v0.5.1

17 Mar 21:21
5eceff3

Choose a tag to compare

What's Changed

  • Hotfix: dependency issue when installing with pip by @semohr in #72

Full Changelog: v0.5.0...v0.5.1

v0.5.0

15 Mar 16:52
68b4ee6

Choose a tag to compare

This marks the first public release of plistsync, a major milestone for the project! 🎉

While the library is now in a very usable state and suitable for real-world music library synchronization, we’re still actively refining the public API. As such, breaking changes to function signatures, module structure, or core abstractions may occur without deprecation warnings until we reach version 1.0.0.

We encourage early adopters to:

  • Experiment freely and share feedback (via GitHub Issues or Discussions)
  • Pin to this version if stability is critical
  • Expect occasional breaking changes as we iterate toward a stable 1.0.0 API

Added

  • Traktor config option backup_before_write (enabled by default), which creates a backup of the NML file before each write operation.
  • pyproject.toml metadata enhancements: updated readme, license, authors, project_urls, and classifiers for better discoverability and packaging.
  • Support for batched remote operations, enabling efficient minification of expensive network requests (e.g., bulk playlist updates across services).
  • Improved examples: now hosted in docs/examples (full-fledged Jupyter notebooks by the core team) and docs/examples/community (community-contributed scripts, including simple CLI workflows).

Changed

  • Unified __repr__ format across all core classes to ClassName(key=value) for consistent, debug-friendly output.
  • Standardized get_playlist() behavior across all services: now consistently returns None when no playlist is found, regardless of the lookup identifier used. Introduced get_playlist_or_raise() for predictable, exception-raising behavior when a playlist must exist.

v0.4.0

07 Mar 21:28

Choose a tag to compare

What's Changed

Full Changelog: v0.3.0...v0.4.0

v0.3.0

16 Feb 20:22

Choose a tag to compare

What's Changed

Full Changelog: v0.2.0...v0.3.0

v0.2.0

30 Oct 16:39
66b9c96

Choose a tag to compare

What's Changed

Full Changelog: v0.1.0...v0.2.0

v0.1.0

08 Sep 12:54

Choose a tag to compare