diff --git a/beetsplug/smartplaylist.py b/beetsplug/smartplaylist.py index 9df2cca648..6124c7b408 100644 --- a/beetsplug/smartplaylist.py +++ b/beetsplug/smartplaylist.py @@ -259,7 +259,7 @@ def update_playlists(self, lib, pretend=False): tpl = self.config["uri_format"].get() prefix = bytestring_path(self.config["prefix"].as_str()) relative_to = self.config["relative_to"].get() - if relative_to: + if relative_to != "m3u": relative_to = normpath(relative_to) # Maps playlist filenames to lists of track filenames. @@ -289,6 +289,8 @@ def update_playlists(self, lib, pretend=False): item_uri = item.path if tpl: item_uri = tpl.replace("$id", str(item.id)).encode("utf-8") + if relative_to == "m3u": + item_uri = "m3u" else: if relative_to: item_uri = os.path.relpath(item_uri, relative_to) @@ -325,6 +327,17 @@ def update_playlists(self, lib, pretend=False): f.write(b"#EXTM3U\n") for entry in m3us[m3u]: item = entry.item + if entry.uri == "m3u": + entry.uri = os.path.relpath( + item.path, os.path.dirname(m3u_path) + ) + if self.config["forward_slash"].get(): + entry.uri = path_as_posix(entry.uri) + if self.config["urlencode"]: + entry.uri = bytestring_path( + pathname2url(entry.uri) + ) + entry.uri = prefix + entry.uri comment = "" if extm3u: attr = [(k, entry.item[k]) for k in keys] diff --git a/docs/changelog.rst b/docs/changelog.rst index 7a94fa3fc3..e063586a3d 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -13,6 +13,7 @@ New features: album queries involving `path` field have been sped up, like `beet list -a path:/path/`. +* Ability to use relative_to as "m3u" to set playlist files as relative to where each playlist is at, including subdirectories. Bug fixes: * Improved naming of temporary files by separating the random part with the file extension.