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.

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.0.tar.gz (28.2 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.0-py3-none-any.whl (19.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: smart_playlist_io-1.1.0.tar.gz
  • Upload date:
  • Size: 28.2 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.0.tar.gz
Algorithm Hash digest
SHA256 800cb0709c36a6c7667e7c040acfeccb396e3f3a228209266388e850ccaea6bf
MD5 dffb102e5276293b3790f9560605694e
BLAKE2b-256 d84c3fdfc45bba99df68d85dca4291f31b609e051d72e7b6f553ae15af7d5c7d

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_playlist_io-1.1.0.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.0-py3-none-any.whl.

File metadata

File hashes

Hashes for smart_playlist_io-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5899f7964dfa5d7e9273cd153621a7985cb26c5fd3fbffde2b369c4ca8e24b26
MD5 72d00dc35c0493a4384d97730e450f9d
BLAKE2b-256 74f1ab892015fb029998353ed10b0906ac7e78256323245fedc1b71caee5c0fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_playlist_io-1.1.0-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