smart-playlist-io
Build and inspect Apple Music smart playlists from Python.
from smart_playlist_io import AND, OR, rule, encode_b64
rules = AND([
rule("Rating", "greater", 3),
rule("LastPlayed", "not_in_last", 6, "months"),
OR([
rule("Genre", "starts", "Ambient"),
rule("Genre", "starts", "Electronic / Ambient"),
]),
])
info_b64, criteria_b64 = encode_b64(rules, limit=25, select_by="most_played")
Produces the Smart Info and Smart Criteria base64 blobs used in Music.app's Library XML format. Import them via File > Library > Import Playlist or the AppleScript add command. Also decodes existing smart playlists back to readable rules.
Not affiliated with or endorsed by Apple Inc.
Install
Requires Python 3.12+.
pip install smart-playlist-io
Encode
from smart_playlist_io import AND, OR, rule, encode, encode_b64
# Raw bytes
info_bytes, criteria_bytes = encode(rules, limit=25, select_by="most_played", live=True)
# Base64 strings (for XML plist)
info_b64, criteria_b64 = encode_b64(rules, limit=25, select_by="most_played")
Options
| Parameter | Default | Values |
|---|---|---|
limit |
None |
Any int, or None to disable |
limit_by |
"items" |
"items", "minutes", "hours", "MB", "GB" |
select_by |
"most_played" |
random, name, album, artist, genre, highest_rated, lowest_rated, most_played, least_played, most_recently_played, least_recently_played, most_recently_added, least_recently_added |
live |
True |
True / False |
only_checked |
False |
True / False |
Fields and operators
| Type | Fields | Operators |
|---|---|---|
| String | Name, Artist, Album, Genre, Comments, Grouping, Composer, AlbumArtist, Kind |
is, is_not, contains, not_contains, starts, ends |
| Integer | Rating (1–5), Year, Plays, BPM, BitRate, TrackNumber, DiskNumber, Size, Duration, Skips |
is, is_not, greater, less, between |
| Boolean | Checked, HasArtwork |
is |
| Date | DateAdded, DateModified, LastPlayed, LastSkipped |
in_last, not_in_last (+ unit: "days", "weeks", "months"), after, before |
| Enum | iCloudStatus, Love, MediaKind, Location |
is, is_not |
Decode
from smart_playlist_io import decode_criteria, decode_info_flags
rules = decode_criteria(criteria_bytes) # ['AND', 'Rating > 3', ...]
flags = decode_info_flags(info_bytes) # 'live updating, limit 25 items, most played'
CLI
Decode all smart playlists in a Library XML export:
decode-smart-playlists /path/to/Library.xml
decode-smart-playlists /path/to/Library.xml --out baseline.md
Known Limitations
- String fields (Name, Artist, Album, Genre, etc.) are limited to 127 characters due to a UTF-16 byte-length constraint in the binary format. Longer values raise
ValueError. - The binary format is reverse-engineered from 2021 Music.app library exports and may change with future macOS updates. If imports start failing after an OS update, see
docs/runbook-format-changes.md. - Decoding is best-effort: unknown field IDs and operator codes are reported as hex literals rather than raising errors.
Notes
Binary format details and the skip-length padding decision are in docs/format-constants.md. Architecture decisions behind the boilerplate structure and top-level OR handling are documented in docs/adr-001-boilerplate-n2-no-identity-child.md and docs/adr-002-top-level-or-emitted-directly.md.
Format knowledge derived from itunessmart by cvzi and banshee-itunes-import-plugin by Scott Peterson. See NOTICE for license text.
License
MIT
Metadata
Release files for smart-playlist-io 1.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| smart_playlist_io-1.1.2.tar.gz | 29.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| smart_playlist_io-1.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 49.1 kB
Release files / smart_playlist_io-1.1.2.tar.gz
| Download URL | smart_playlist_io-1.1.2.tar.gz |
|---|---|
| Size | 29.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
43be311ea065d2a8ee00c4b3f4cfa71b6f04cba1d4849e9f32f74e76175876d5
|
|
BLAKE2b-256 checksum How to use checksums |
98d6091598bc79183ead94ecae40ed02539fe29be1f01270bdc4eae270cc2d31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 26, 2026.
Transparency logRelease files / smart_playlist_io-1.1.2-py3-none-any.whl
| Download URL | smart_playlist_io-1.1.2-py3-none-any.whl |
|---|---|
| Size | 20.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
53dc95c349f53f4f5cd9d47638e57cfc5dd91eebf2dc352f9108922fd8e41ae4
|
|
BLAKE2b-256 checksum How to use checksums |
06cbd29d0eafdf2483f3bd37a0ec9bb843e3d7dde161f711b9d7a191aa9d0025
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 26, 2026.
Transparency log