From 7e9c00a7132edd501b984010a89efc65ba474d38 Mon Sep 17 00:00:00 2001 From: jdou Date: Wed, 26 Aug 2026 20:33:59 -0700 Subject: [PATCH] Add music folder support to get_album_list2 --- src/libopensonic/_async/connection.py | 7 +++++-- test/test_connection.py | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/libopensonic/_async/connection.py b/src/libopensonic/_async/connection.py index 0166474..415ff11 100644 --- a/src/libopensonic/_async/connection.py +++ b/src/libopensonic/_async/connection.py @@ -823,7 +823,8 @@ async def get_album_list(self, ltype:str, size:int=10, offset:int=0, from_year:i async def get_album_list2(self, ltype:str, size:int=10, offset:int=0, from_year:int|None=None, to_year:int|None=None, - genre:str|None=None) -> list[AlbumID3]: + genre:str|None=None, + music_folder_id:int|None=None) -> list[AlbumID3]: """Return a list of albums filtered by type, organized using ID3 tags. Similar to get_album_list but uses ID3 tags for organization. @@ -840,6 +841,8 @@ async def get_album_list2(self, ltype:str, size:int=10, offset:int=0, from_year: Required when ltype is "byYear". Start of year range. to_year: Required when ltype is "byYear". End of year range. genre: Required when ltype is "byGenre". The genre name, e.g. "Rock". + music_folder_id: Only return albums in this music folder. + See get_music_folders(). Returns: A list of media.AlbumID3 objects. @@ -851,7 +854,7 @@ async def get_album_list2(self, ltype:str, size:int=10, offset:int=0, q = self._get_query_dict({'type': ltype, 'size': size, 'offset': offset, 'fromYear': from_year, 'toYear': to_year, - 'genre': genre}) + 'genre': genre, 'musicFolderId': music_folder_id}) res = await self._do_request(method, q) dres = await self._handle_info_res(res) diff --git a/test/test_connection.py b/test/test_connection.py index 9bf72d6..013c25e 100644 --- a/test/test_connection.py +++ b/test/test_connection.py @@ -1002,6 +1002,28 @@ async def test_get_album_list2(self, conn, mock_session, mock_response): assert len(result) == 1 assert isinstance(result[0], AlbumID3) + @pytest.mark.asyncio + async def test_get_album_list2_with_music_folder( + self, conn, mock_session, mock_response + ): + """Test get_album_list2 with a music folder filter.""" + albums = { + "albumList2": { + "album": [ + {"id": "alb-1", "name": "Album 1", "songCount": 5, + "duration": 1800, "created": "2024-01-01T00:00:00"} + ] + } + } + set_json_response(mock_response, make_response(albums)) + mock_session.post = AsyncMock(return_value=mock_response) + + result = await conn.get_album_list2("frequent", music_folder_id=1) + assert len(result) == 1 + assert isinstance(result[0], AlbumID3) + data = mock_session.post.call_args.kwargs["data"] + assert data["musicFolderId"] == "1" + @pytest.mark.asyncio async def test_get_random_songs_empty(self, conn, mock_session, mock_response): """Test get_random_songs with empty result."""