Merge branch 'master' into importer-typehints-and-refactor

This commit is contained in:
Sebastian Mohr 2025-02-17 23:02:00 +01:00 committed by GitHub
commit 918fd863f3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 11 additions and 10 deletions

View file

@ -14,8 +14,8 @@
"""Generates smart playlists based on beets queries.""" """Generates smart playlists based on beets queries."""
import json
import os import os
from urllib.parse import quote
from urllib.request import pathname2url from urllib.request import pathname2url
from beets import ui from beets import ui
@ -327,7 +327,8 @@ class SmartPlaylistPlugin(BeetsPlugin):
if extm3u: if extm3u:
attr = [(k, entry.item[k]) for k in keys] attr = [(k, entry.item[k]) for k in keys]
al = [ al = [
f" {a[0]}={json.dumps(str(a[1]))}" for a in attr f" {key}=\"{quote(str(value), safe='/:')}\""
for key, value in attr
] ]
attrs = "".join(al) attrs = "".join(al)
comment = "#EXTINF:{}{},{} - {}\n".format( comment = "#EXTINF:{}{},{} - {}\n".format(

View file

@ -88,6 +88,8 @@ Other changes:
:bug:`5539` :bug:`5539`
* Added some typehints: ImportSession and Pipeline have typehints now. Should * Added some typehints: ImportSession and Pipeline have typehints now. Should
improve useability for new developers. improve useability for new developers.
* :doc:`/plugins/smartplaylist`: URL-encode additional item `fields` within generated
EXTM3U playlists instead of JSON-encoding them.
2.2.0 (December 02, 2024) 2.2.0 (December 02, 2024)
------------------------- -------------------------

View file

@ -97,27 +97,25 @@ In case you want to export additional fields from the beets database into the
generated playlists, you can do so by specifying them within the ``fields`` generated playlists, you can do so by specifying them within the ``fields``
configuration option and setting the ``output`` option to ``extm3u``. configuration option and setting the ``output`` option to ``extm3u``.
For instance the following configuration exports the ``id`` and ``genre`` For instance the following configuration exports the ``id`` and ``genre``
fields: fields::
smartplaylist: smartplaylist:
playlist_dir: /data/playlists playlist_dir: /data/playlists
relative_to: /data/playlists relative_to: /data/playlists
output: extm3u output: extm3u
fields: fields:
- id - id
- genre - genre
playlists: playlists:
- name: all.m3u - name: all.m3u
query: '' query: ''
A resulting ``all.m3u`` file could look as follows: Values of additional fields are URL-encoded.
A resulting ``all.m3u`` file could look as follows::
#EXTM3U #EXTM3U
#EXTINF:805 id="1931" genre="Jazz",Miles Davis - Autumn Leaves #EXTINF:805 id="1931" genre="Progressive%20Rock",Led Zeppelin - Stairway to Heaven
../music/Albums/Miles Davis/Autumn Leaves/02 Autumn Leaves.mp3 ../music/singles/Led Zeppelin/Stairway to Heaven.mp3
To give a usage example, the `webm3u`_ and `Beetstream`_ plugins read the To give a usage example, the `webm3u`_ and `Beetstream`_ plugins read the
exported ``id`` field, allowing you to serve your local m3u playlists via HTTP. exported ``id`` field, allowing you to serve your local m3u playlists via HTTP.

View file

@ -283,7 +283,7 @@ class SmartPlaylistTest(BeetsTestCase):
assert ( assert (
content content
== b"#EXTM3U\n" == b"#EXTM3U\n"
+ b'#EXTINF:300 id="456" genre="Fake Genre",Fake Artist - fake Title\n' + b'#EXTINF:300 id="456" genre="Fake%20Genre",Fake Artist - fake Title\n'
+ b"/tagada.mp3\n" + b"/tagada.mp3\n"
) )