mirror of
https://github.com/beetbox/beets.git
synced 2026-01-30 20:13:37 +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). |
||
|---|---|---|
| .. | ||
| bpd | ||
| lastgenre | ||
| metasync | ||
| web | ||
| __init__.py | ||
| _typing.py | ||
| absubmit.py | ||
| acousticbrainz.py | ||
| advancedrewrite.py | ||
| albumtypes.py | ||
| aura.py | ||
| autobpm.py | ||
| badfiles.py | ||
| bareasc.py | ||
| beatport.py | ||
| bench.py | ||
| bpm.py | ||
| bpsync.py | ||
| bucket.py | ||
| chroma.py | ||
| convert.py | ||
| deezer.py | ||
| discogs.py | ||
| duplicates.py | ||
| edit.py | ||
| embedart.py | ||
| embyupdate.py | ||
| export.py | ||
| fetchart.py | ||
| filefilter.py | ||
| fish.py | ||
| freedesktop.py | ||
| fromfilename.py | ||
| ftintitle.py | ||
| fuzzy.py | ||
| gmusic.py | ||
| hook.py | ||
| ihate.py | ||
| importadded.py | ||
| importfeeds.py | ||
| info.py | ||
| inline.py | ||
| ipfs.py | ||
| keyfinder.py | ||
| kodiupdate.py | ||
| lastimport.py | ||
| limit.py | ||
| listenbrainz.py | ||
| loadext.py | ||
| lyrics.py | ||
| mbcollection.py | ||
| mbsubmit.py | ||
| mbsync.py | ||
| missing.py | ||
| mpdstats.py | ||
| mpdupdate.py | ||
| parentwork.py | ||
| permissions.py | ||
| play.py | ||
| playlist.py | ||
| plexupdate.py | ||
| random.py | ||
| replaygain.py | ||
| rewrite.py | ||
| scrub.py | ||
| smartplaylist.py | ||
| sonosupdate.py | ||
| spotify.py | ||
| subsonicplaylist.py | ||
| subsonicupdate.py | ||
| substitute.py | ||
| the.py | ||
| thumbnails.py | ||
| types.py | ||
| unimported.py | ||
| zero.py | ||