From bacaa57f8dcc50212cc5feaeea54ca9e8f9bb60b Mon Sep 17 00:00:00 2001 From: Sebastian Mohr Date: Wed, 13 Aug 2025 12:27:12 +0200 Subject: [PATCH] Cached property for length & forgot sorted. --- beets/library/models.py | 2 +- beetsplug/random.py | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/beets/library/models.py b/beets/library/models.py index a17c7d0a5..e255a3f52 100644 --- a/beets/library/models.py +++ b/beets/library/models.py @@ -616,7 +616,7 @@ class Album(LibModel): for item in self.items(): item.try_sync(write, move) - @property + @cached_property def length(self) -> float: """Return the total length of all items in this album in seconds.""" return sum(item.length for item in self.items()) diff --git a/beetsplug/random.py b/beetsplug/random.py index 933049d96..853e9b14a 100644 --- a/beetsplug/random.py +++ b/beetsplug/random.py @@ -5,7 +5,7 @@ from __future__ import annotations import random from itertools import groupby, islice from operator import attrgetter -from typing import TYPE_CHECKING, Any, Iterable, Sequence, TypeVar +from typing import TYPE_CHECKING, Any, Iterable, Sequence, Union from beets.plugins import BeetsPlugin from beets.ui import Subcommand, print_ @@ -13,9 +13,9 @@ from beets.ui import Subcommand, print_ if TYPE_CHECKING: import optparse - from beets.library import LibModel, Library + from beets.library import Album, Item, Library - T = TypeVar("T", bound=LibModel) + T = Union[Item, Album] def random_func(lib: Library, opts: optparse.Values, args: list[str]): @@ -87,7 +87,9 @@ def _equal_chance_permutation( except AttributeError: return NOT_FOUND_SENTINEL - groups: dict[Any, list[T]] = { + sorted(objs, key=get_attr) + + groups: dict[str | object, list[T]] = { NOT_FOUND_SENTINEL: [], } for k, values in groupby(objs, key=get_attr):