mirror of
https://github.com/Dvorinka/swingmusic-extended.git
synced 2026-06-03 20:13:02 +00:00
fix: case insensitive sorting on sort_tracks
This commit is contained in:
+14
-3
@@ -53,11 +53,12 @@ def insert_playlist(name: str, image: str = None):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_path_trackhashes(path: str):
|
def get_path_trackhashes(path: str, tracksortby: str, reverse: bool):
|
||||||
"""
|
"""
|
||||||
Returns a list of trackhashes in a folder.
|
Returns a list of trackhashes in a folder.
|
||||||
"""
|
"""
|
||||||
tracks = TrackStore.get_tracks_in_path(path)
|
tracks = TrackStore.get_tracks_in_path(path)
|
||||||
|
tracks = sort_tracks(tracks, key=tracksortby, reverse=reverse)
|
||||||
return [t.trackhash for t in tracks]
|
return [t.trackhash for t in tracks]
|
||||||
|
|
||||||
|
|
||||||
@@ -152,6 +153,10 @@ class AddItemToPlaylistBody(BaseModel):
|
|||||||
description="The type of item to add",
|
description="The type of item to add",
|
||||||
examples=["tracks", "folder", "album", "artist"],
|
examples=["tracks", "folder", "album", "artist"],
|
||||||
)
|
)
|
||||||
|
sortoptions: dict = Field(
|
||||||
|
default=None,
|
||||||
|
description="The sort options for the tracks",
|
||||||
|
)
|
||||||
itemhash: str = Field(..., description="The hash of the item to add")
|
itemhash: str = Field(..., description="The hash of the item to add")
|
||||||
|
|
||||||
|
|
||||||
@@ -165,11 +170,12 @@ def add_item_to_playlist(path: PlaylistIDPath, body: AddItemToPlaylistBody):
|
|||||||
itemtype = body.itemtype
|
itemtype = body.itemtype
|
||||||
itemhash = body.itemhash
|
itemhash = body.itemhash
|
||||||
playlist_id = path.playlistid
|
playlist_id = path.playlistid
|
||||||
|
sortoptions = body.sortoptions
|
||||||
|
|
||||||
if itemtype == "tracks":
|
if itemtype == "tracks":
|
||||||
trackhashes = itemhash.split(",")
|
trackhashes = itemhash.split(",")
|
||||||
elif itemtype == "folder":
|
elif itemtype == "folder":
|
||||||
trackhashes = get_path_trackhashes(itemhash)
|
trackhashes = get_path_trackhashes(itemhash, sortoptions.get("tracksortby") or 'default', sortoptions.get("tracksortreverse") or False)
|
||||||
elif itemtype == "album":
|
elif itemtype == "album":
|
||||||
trackhashes = get_album_trackhashes(itemhash)
|
trackhashes = get_album_trackhashes(itemhash)
|
||||||
elif itemtype == "artist":
|
elif itemtype == "artist":
|
||||||
@@ -378,6 +384,10 @@ class SavePlaylistAsItemBody(BaseModel):
|
|||||||
itemtype: str = Field(..., description="The type of item", example="tracks")
|
itemtype: str = Field(..., description="The type of item", example="tracks")
|
||||||
playlist_name: str = Field(..., description="The name of the playlist")
|
playlist_name: str = Field(..., description="The name of the playlist")
|
||||||
itemhash: str = Field(..., description="The hash of the item to save")
|
itemhash: str = Field(..., description="The hash of the item to save")
|
||||||
|
sortoptions: dict = Field(
|
||||||
|
default=dict(),
|
||||||
|
description="The sort options for the tracks",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@api.post("/save-item")
|
@api.post("/save-item")
|
||||||
@@ -390,6 +400,7 @@ def save_item_as_playlist(body: SavePlaylistAsItemBody):
|
|||||||
itemtype = body.itemtype
|
itemtype = body.itemtype
|
||||||
playlist_name = body.playlist_name
|
playlist_name = body.playlist_name
|
||||||
itemhash = body.itemhash
|
itemhash = body.itemhash
|
||||||
|
sortoptions = body.sortoptions
|
||||||
|
|
||||||
if PlaylistTable.check_exists_by_name(playlist_name):
|
if PlaylistTable.check_exists_by_name(playlist_name):
|
||||||
return {"error": "Playlist already exists"}, 409
|
return {"error": "Playlist already exists"}, 409
|
||||||
@@ -397,7 +408,7 @@ def save_item_as_playlist(body: SavePlaylistAsItemBody):
|
|||||||
if itemtype == "tracks":
|
if itemtype == "tracks":
|
||||||
trackhashes = itemhash.split(",")
|
trackhashes = itemhash.split(",")
|
||||||
elif itemtype == "folder":
|
elif itemtype == "folder":
|
||||||
trackhashes = get_path_trackhashes(itemhash)
|
trackhashes = get_path_trackhashes(itemhash, sortoptions.get("tracksortby") or 'default', sortoptions.get("tracksortreverse") or False)
|
||||||
elif itemtype == "album":
|
elif itemtype == "album":
|
||||||
trackhashes = get_album_trackhashes(itemhash)
|
trackhashes = get_album_trackhashes(itemhash)
|
||||||
elif itemtype == "artist":
|
elif itemtype == "artist":
|
||||||
|
|||||||
+8
-9
@@ -1,6 +1,6 @@
|
|||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
import os
|
import os
|
||||||
from pprint import pprint
|
from typing import Callable
|
||||||
from app.lib.albumslib import sort_by_track_no
|
from app.lib.albumslib import sort_by_track_no
|
||||||
from app.models.folder import Folder
|
from app.models.folder import Folder
|
||||||
from app.models.track import Track
|
from app.models.track import Track
|
||||||
@@ -14,25 +14,24 @@ def sort_tracks(tracks: list[Track], key: str, reverse: bool = False):
|
|||||||
if key == "default":
|
if key == "default":
|
||||||
return tracks
|
return tracks
|
||||||
|
|
||||||
sortfunc = lambda x: getattr(x, key)
|
sortfunc: Callable[[Track], str] = lambda track: getattr(track, key)
|
||||||
|
|
||||||
if key == "artists" or key == "albumartists":
|
if key == "artists" or key == "albumartists":
|
||||||
sortfunc = lambda x: getattr(x, key)[0]["name"]
|
sortfunc = lambda track: getattr(track, key)[0]["name"]
|
||||||
|
|
||||||
if key == "disc":
|
if key == "disc":
|
||||||
# INFO: Group tracks into albums, then sort them by disc number.
|
# INFO: Group tracks into albums, then sort them by disc number.
|
||||||
tracks = sorted(tracks, key=lambda x: x.album)
|
tracks = sorted(tracks, key=lambda x: x.album.casefold())
|
||||||
groups = groupby(tracks, lambda x: x.albumhash)
|
groups = groupby(tracks, lambda x: x.albumhash)
|
||||||
|
|
||||||
return flatten([sort_by_track_no(list(g)) for k, g in groups])
|
return flatten([sort_by_track_no(list(g)) for k, g in groups])
|
||||||
|
|
||||||
# INFO: sort tracks by title for a fallback value
|
# INFO: sort tracks by title for a fallback value
|
||||||
tracks = sorted(tracks, key=lambda t: t.title)
|
tracks = sorted(tracks, key=lambda t: t.title.casefold())
|
||||||
|
|
||||||
if key == "title" and not reverse:
|
if key == "title" and not reverse:
|
||||||
return tracks
|
return tracks
|
||||||
|
|
||||||
return sorted(tracks, key=sortfunc, reverse=reverse)
|
return sorted(tracks, key=lambda track: sortfunc(track).casefold(), reverse=reverse)
|
||||||
|
|
||||||
|
|
||||||
def sort_folders(folders: list[Folder], key: str, reverse: bool = False):
|
def sort_folders(folders: list[Folder], key: str, reverse: bool = False):
|
||||||
@@ -42,9 +41,9 @@ def sort_folders(folders: list[Folder], key: str, reverse: bool = False):
|
|||||||
if key == "default":
|
if key == "default":
|
||||||
return folders
|
return folders
|
||||||
|
|
||||||
sortfunc = lambda x: getattr(x, key)
|
sortfunc: Callable[[Folder], str | float] = lambda folder: getattr(folder, key)
|
||||||
|
|
||||||
if key == "lastmod":
|
if key == "lastmod":
|
||||||
sortfunc = lambda x: os.path.getmtime(x.path)
|
sortfunc = lambda folder: os.path.getmtime(folder.path)
|
||||||
|
|
||||||
return sorted(folders, key=sortfunc, reverse=reverse)
|
return sorted(folders, key=sortfunc, reverse=reverse)
|
||||||
|
|||||||
Reference in New Issue
Block a user