Metadata-Version: 2.4
Name: plistsync
Version: 0.6.0
Summary: Toolbox for transferring, converting and matching music collections and playlists across services.
Project-URL: Documentation, https://docs.plistsync.com
Project-URL: Repository, https://github.com/metasauce/plistsync.git
Project-URL: Issues, https://github.com/metasauce/plistsync/issues
Project-URL: Changelog, https://github.com/metasauce/plistsync/blob/main/CHANGELOG.md
Author-email: "Sebastian B. Mohr" <sebastian@mohrenclan.de>, "F. Paul Spitzner" <github@makeitso.one>
License-Expression: PolyForm-Noncommercial-1.0.0
License-File: LICENSE
Keywords: conversion,matching,music,playlists,sync,transfer
Classifier: Development Status :: 4 - Beta
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.11
Requires-Dist: eyconf[cli]>=0.6.2
Requires-Dist: levenshtein>=0.27.3
Requires-Dist: platformdirs>=4.5.1
Requires-Dist: requests>=2.32.5
Requires-Dist: typer>=0.21.1
Requires-Dist: typing-extensions>=4.15.0
Provides-Extra: allservices
Requires-Dist: lxml>=6.0.2; extra == 'allservices'
Requires-Dist: nest-asyncio>=1.6.0; extra == 'allservices'
Requires-Dist: requests-oauth2client>=1.8.0; extra == 'allservices'
Requires-Dist: sqlalchemy>=2.0.45; extra == 'allservices'
Requires-Dist: tinytag>=2.2.0; extra == 'allservices'
Provides-Extra: beets
Requires-Dist: sqlalchemy>=2.0.45; extra == 'beets'
Provides-Extra: local
Requires-Dist: tinytag>=2.2.0; extra == 'local'
Provides-Extra: plex
Requires-Dist: nest-asyncio>=1.6.0; extra == 'plex'
Requires-Dist: tinytag>=2.2.0; extra == 'plex'
Provides-Extra: spotify
Requires-Dist: requests-oauth2client>=1.8.0; extra == 'spotify'
Provides-Extra: tidal
Requires-Dist: requests-oauth2client>=1.8.0; extra == 'tidal'
Provides-Extra: traktor
Requires-Dist: lxml>=6.0.2; extra == 'traktor'
Description-Content-Type: text/markdown

[![Python checks](https://github.com/metasauce/plistsync/actions/workflows/python.yml/badge.svg?branch=main)](https://github.com/metasauce/plistsync/actions/workflows/python.yml)
[![PyPI - Version](https://img.shields.io/pypi/v/plistsync)](https://pypi.org/project/plistsync/)
[![Documentation](https://app.readthedocs.org/projects/plistsync/badge/?version=latest&style=flat)](https://docs.plistsync.com)

<p align="center">
    <h1 align="center">plistsync</h1>
</p>

<p align="center">
    <em><b>
<!-- start intro -->
Toolbox for transferring, converting and matching music collections and playlists across services.
<!-- end intro -->
    </b></em>
</p>

<p align="center">
<img  src="./docs/_static/v2/ios_squircle.webp" alt="plistsync logo" width="80" align="center">
</p>

## Overview

<!-- start overview -->

**plistsync** is a Python toolbox designed to solve the common problem of fragmented music libraries across different platforms. Whether you're a DJ moving playlists between Traktor and streaming services, a music enthusiast syncing collections between Plex and Spotify, or simply organizing your music across multiple platforms, plistsync provides a unified interface to transfer, convert, and match your music data.

The core of plistsync is its abstraction layer that normalizes tracks, collections, and playlists from various services into a common format, enabling seamless synchronization while handling the complexities of different APIs, authentication methods, and metadata formats.

<!-- end overview -->

## Features

<!-- start features -->

- **Unified Abstraction Layer**: Normalizes tracks, collections, and playlists from various services into a common format, enabling seamless synchronization across platforms
- **Extensible Service Architecture**: The abstraction layer is designed to support arbitrary music services with consistent APIs
  - Currently supports Spotify, Tidal, Plex, Traktor and local files
- **Collection Management**: Sync entire music libraries or specific playlists between services
- **Developer-Friendly**: Built with type hints, comprehensive error handling, and pytest for testing
- **Flexible Configuration**: Manage service credentials and preferences through config files

<!-- end features -->

## Getting started

For detailed usage guides, API reference, and examples, see the [full documentation](https://docs.plistsync.com).

## Is this for you?

**plistsync** is intended for users who are comfortable with Python and scripting. It is **not** a point-and-click app, it’s a _developer-oriented_ toolbox for automating music library and playlist workflows.

## License

This project is licensed under the **PolyForm Noncommercial License 1.0.0.**

In short, this license allows broad use for personal, educational, research, and non-profit purposes, but forbids commercial use.
We chose it to defend our work in an industry that often exploits artists, where commercial interests seem more important than an inclusive community.

See the [LICENSE](LICENSE) file for the full terms.

## Support the project

If you enjoy this project, there are a few ways you can support us:

- To add Apple Music support, we are currently looking for someone to support us with an Apple Developer Account. (Apple only allows access to its MusicKit API via a paid Developer Account. If you are a Dev and willing to help us out, please get in touch 🫶)
- Contribute code: Pull requests, bug reports, and feature suggestions are always welcome!
- Spread the word: Share the project with friends or on social media.
- Donate: Every contribution helps fuel more coffee-powered coding sessions!
  - Donate ETH: <a href="etherium:0x81927e76f2f0fAA9e7fD92176a473955DB20Ce55" target="_blank">0x81927e76f2f0fAA9e7fD92176a473955DB20Ce55</a>
  - Donate BTC: <a href="bitcoin:bc1qw5e0deust6uq94e5s58au82wrakcjmlemw3cy4" target="_blank">bc1qw5e0deust6uq94e5s58au82wrakcjmlemw3cy4</a>

---

<p align="center">
  <em>Keep your music in sync, everywhere.</em>
</p>
