Add recently added tracks and albums playlist + recommendation (#2700)
authorDominik Bruhn <dominik@dbruhn.de>
Thu, 27 Nov 2025 22:19:54 +0000 (23:19 +0100)
committerGitHub <noreply@github.com>
Thu, 27 Nov 2025 22:19:54 +0000 (23:19 +0100)
music_assistant/controllers/music.py
music_assistant/providers/builtin/__init__.py
music_assistant/providers/builtin/constants.py

index f1594b4da9e44bc78a8dda2be1ee2592270c459c..e397dd7d7481f1c5b87e4be4cd0cd6cea5f274a4 100644 (file)
@@ -497,6 +497,11 @@ class MusicController(CoreController):
             )
         return result
 
+    @api_command("music/recently_added_tracks")
+    async def recently_added_tracks(self, limit: int = 10) -> list[Track]:
+        """Return a list of the last added tracks."""
+        return await self.tracks.library_items(limit=limit, order_by="timestamp_added_desc")
+
     @api_command("music/in_progress_items")
     async def in_progress_items(self, limit: int = 10) -> list[ItemMapping]:
         """Return a list of the Audiobooks and PodcastEpisodes that are in progress."""
@@ -1360,6 +1365,22 @@ class MusicController(CoreController):
                 icon="mdi-motion-play",
                 items=await self.recently_played(limit=10),
             ),
+            RecommendationFolder(
+                item_id="recently_added_tracks",
+                provider="library",
+                name="Recently added tracks",
+                translation_key="recently_added_tracks",
+                icon="music-note-plus",
+                items=await self.tracks.library_items(limit=10, order_by="timestamp_added_desc"),
+            ),
+            RecommendationFolder(
+                item_id="recently_added_albums",
+                provider="library",
+                name="Recently added albums",
+                translation_key="recently_added_albums",
+                icon="music-note-plus",
+                items=await self.albums.library_items(limit=10, order_by="timestamp_added_desc"),
+            ),
             RecommendationFolder(
                 item_id="random_artists",
                 provider="library",
index 6e30610399727defbc4c12f825d371177b03c95e..c138478ffc74ce8a8fb1b03014c1a5b372cde9d4 100644 (file)
@@ -61,6 +61,7 @@ from .constants import (
     RANDOM_ALBUM,
     RANDOM_ARTIST,
     RANDOM_TRACKS,
+    RECENTLY_ADDED_TRACKS,
     RECENTLY_PLAYED,
     StoredItem,
 )
@@ -619,6 +620,14 @@ class BuiltinProvider(MusicProvider):
             result.append(track)
         return result
 
+    async def _get_builtin_playlist_recently_added_tracks(self) -> list[Track]:
+        result: list[Track] = []
+        recent_tracks = await self.mass.music.recently_added_tracks(100)
+        for idx, track in enumerate(recent_tracks, 1):
+            track.position = idx
+            result.append(track)
+        return result
+
     async def _get_builtin_playlist_tracks(
         self, builtin_playlist_id: str
     ) -> list[Track] | UniqueList[Track]:
@@ -630,6 +639,7 @@ class BuiltinProvider(MusicProvider):
                 RANDOM_ALBUM: self._get_builtin_playlist_random_album,
                 RANDOM_ARTIST: self._get_builtin_playlist_random_artist,
                 RECENTLY_PLAYED: self._get_builtin_playlist_recently_played,
+                RECENTLY_ADDED_TRACKS: self._get_builtin_playlist_recently_added_tracks,
             }[builtin_playlist_id]()
         except KeyError:
             raise MediaNotFoundError(f"No built in playlist: {builtin_playlist_id}")
index 49210a90c75f604b0b642f35da6c64cd23e2cadb..100553e06063278c43760a83b62f3323d22cad1c 100644 (file)
@@ -38,6 +38,7 @@ RANDOM_ARTIST = "random_artist"
 RANDOM_ALBUM = "random_album"
 RANDOM_TRACKS = "random_tracks"
 RECENTLY_PLAYED = "recently_played"
+RECENTLY_ADDED_TRACKS = "recently_added_tracks"
 
 BUILTIN_PLAYLISTS = {
     ALL_FAVORITE_TRACKS: "All favorited tracks",
@@ -45,6 +46,7 @@ BUILTIN_PLAYLISTS = {
     RANDOM_ALBUM: "Random Album (from library)",
     RANDOM_TRACKS: "500 Random tracks (from library)",
     RECENTLY_PLAYED: "Recently played tracks",
+    RECENTLY_ADDED_TRACKS: "Recently added tracks",
 }
 BUILTIN_PLAYLISTS_ENTRIES = [
     ConfigEntry(