mirror of
https://github.com/beetbox/beets.git
synced 2026-01-30 12:02:41 +01:00
URL-encode additional item `fields` within generated EXTM3U playlists instead of JSON-encoding them. This is because JSON-encoding additional fields/attributes made it difficult to parse the `EXTINF` line but using URL-encoding for these values makes parsing easy (because URL-encoded values cannot contain commas, quotation marks and spaces). I introduced the generation of additional EXTM3U item fields earlier this year and I want to correct that now. **Design/definition background:** Unfortunately, I didn't find a clear definition of how additional playlist item attributes should be encoded - apparently there is none. Given that item URIs within an M3U playlist can be URL-encoded already, defining the values of additional attributes to be URL-encoded is consistent design. I didn't find examples of additional EXTM3U item attributes in the web where the attribute value contains a comma, space or quotation mark but examples that specified numeric IDs and URLs as attribute values. Because the URL attribute examples I found didn't contain URL-encoded characters and because it is more readable and unproblematic for parsing, I've let the attribute URL encoding treat `:` and `/` as safe characters. **Breaking change:** While this is a breaking change in theory, in practice it is not since afaik all integrations of the smartplaylist plugin's additional EXTM3U item attribute generation feature (beets-webm3u) work with simple attribute values such as the item ID (numeric) whose formatting/encoding is not affected when changing from JSON to URL-encoding. In other words the change is backward-compatible with the beets-webm3u plugin (which I'll adjust correspondingly after this beets PR was merged). |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| lyrics_pages.py | ||
| test_acousticbrainz.py | ||
| test_advancedrewrite.py | ||
| test_albumtypes.py | ||
| test_art.py | ||
| test_aura.py | ||
| test_autobpm.py | ||
| test_bareasc.py | ||
| test_beatport.py | ||
| test_bucket.py | ||
| test_convert.py | ||
| test_discogs.py | ||
| test_edit.py | ||
| test_embedart.py | ||
| test_embyupdate.py | ||
| test_export.py | ||
| test_fetchart.py | ||
| test_filefilter.py | ||
| test_ftintitle.py | ||
| test_hook.py | ||
| test_ihate.py | ||
| test_importadded.py | ||
| test_importfeeds.py | ||
| test_info.py | ||
| test_ipfs.py | ||
| test_keyfinder.py | ||
| test_lastgenre.py | ||
| test_limit.py | ||
| test_lyrics.py | ||
| test_mbsubmit.py | ||
| test_mbsync.py | ||
| test_mpdstats.py | ||
| test_parentwork.py | ||
| test_permissions.py | ||
| test_play.py | ||
| test_player.py | ||
| test_playlist.py | ||
| test_plexupdate.py | ||
| test_plugin_mediafield.py | ||
| test_random.py | ||
| test_replaygain.py | ||
| test_smartplaylist.py | ||
| test_spotify.py | ||
| test_subsonicupdate.py | ||
| test_substitute.py | ||
| test_the.py | ||
| test_thumbnails.py | ||
| test_types_plugin.py | ||
| test_web.py | ||
| test_zero.py | ||