Skip to main content

Encode and decode Apple Music Smart Playlist binary format (Smart Info + Smart Criteria)

Project description

smart-playlist-io

PyPI

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

smart_playlist_io-1.1.2.tar.gz (29.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

smart_playlist_io-1.1.2-py3-none-any.whl (20.2 kB view details)

Uploaded Python 3

File details

Details for the file smart_playlist_io-1.1.2.tar.gz.

File metadata

  • Download URL: smart_playlist_io-1.1.2.tar.gz
  • Upload date:
  • Size: 29.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for smart_playlist_io-1.1.2.tar.gz
Algorithm Hash digest
SHA256 43be311ea065d2a8ee00c4b3f4cfa71b6f04cba1d4849e9f32f74e76175876d5
MD5 3a2f7b98a5753b30fa924cae72697e9f
BLAKE2b-256 98d6091598bc79183ead94ecae40ed02539fe29be1f01270bdc4eae270cc2d31

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_playlist_io-1.1.2.tar.gz:

Publisher: publish.yml on kynoptic/smart-playlist-io

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_playlist_io-1.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for smart_playlist_io-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 53dc95c349f53f4f5cd9d47638e57cfc5dd91eebf2dc352f9108922fd8e41ae4
MD5 37133e6ab99574de5adf711f9b2b9e8a
BLAKE2b-256 06cbd29d0eafdf2483f3bd37a0ec9bb843e3d7dde161f711b9d7a191aa9d0025

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_playlist_io-1.1.2-py3-none-any.whl:

Publisher: publish.yml on kynoptic/smart-playlist-io

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page