diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarred2Test.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarred2Test.kt new file mode 100644 index 00000000..dc61a6e0 --- /dev/null +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarred2Test.kt @@ -0,0 +1,48 @@ +package org.moire.ultrasonic.api.subsonic + +import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should equal` +import org.junit.Test +import org.moire.ultrasonic.api.subsonic.models.Artist +import org.moire.ultrasonic.api.subsonic.models.SearchTwoResult + +/** + * Integration test for [SubsonicAPIClient] for getStarred2 call. + */ +@Suppress("NamingConventionViolation") +class SubsonicApiGetStarred2Test : SubsonicAPIClientTest() { + @Test + fun `Should handle error response`() { + val response = checkErrorCallParsed(mockWebServerRule) { + client.api.getStarred2().execute() + } + + response.starred2 `should equal` SearchTwoResult() + } + + @Test + fun `Should handle ok reponse`() { + mockWebServerRule.enqueueResponse("get_starred_2_ok.json") + + val response = client.api.getStarred2().execute() + + assertResponseSuccessful(response) + with(response.body().starred2) { + albumList `should equal` emptyList() + artistList.size `should equal to` 1 + artistList[0] `should equal` Artist(id = 364, name = "Parov Stelar", + starred = parseDate("2017-08-12T18:32:58.768Z")) + songList `should equal` emptyList() + } + } + + @Test + fun `Should pass music folder id in request param`() { + val musicFolderId = 441L + + mockWebServerRule.assertRequestParam(responseResourceName = "get_starred_2_ok.json", + expectedParam = "musicFolderId=$musicFolderId") { + client.api.getStarred2(musicFolderId = musicFolderId).execute() + } + } +} diff --git a/subsonic-api/src/integrationTest/resources/get_starred_2_ok.json b/subsonic-api/src/integrationTest/resources/get_starred_2_ok.json new file mode 100644 index 00000000..2fda264f --- /dev/null +++ b/subsonic-api/src/integrationTest/resources/get_starred_2_ok.json @@ -0,0 +1,13 @@ +{ + "subsonic-response" : { + "status" : "ok", + "version" : "1.15.0", + "starred2" : { + "artist" : [ { + "id" : "364", + "name" : "Parov Stelar", + "starred" : "2017-08-12T18:32:58.768Z" + } ] + } + } +} \ No newline at end of file diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt index a9edabf3..28d1c952 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt @@ -14,6 +14,7 @@ import org.moire.ultrasonic.api.subsonic.response.GetPlaylistsResponse import org.moire.ultrasonic.api.subsonic.response.GetPodcastsResponse import org.moire.ultrasonic.api.subsonic.response.GetRandomSongsResponse import org.moire.ultrasonic.api.subsonic.response.GetStarredResponse +import org.moire.ultrasonic.api.subsonic.response.GetStarredTwoResponse import org.moire.ultrasonic.api.subsonic.response.LicenseResponse import org.moire.ultrasonic.api.subsonic.response.MusicFoldersResponse import org.moire.ultrasonic.api.subsonic.response.SearchResponse @@ -156,4 +157,7 @@ interface SubsonicAPIDefinition { @GET("getStarred.view") fun getStarred(@Query("musicFolderId") musicFolderId: Long? = null): Call + + @GET("getStarred2.view") + fun getStarred2(@Query("musicFolderId") musicFolderId: Long? = null): Call } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetStarredTwoResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetStarredTwoResponse.kt new file mode 100644 index 00000000..cbbeafcc --- /dev/null +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetStarredTwoResponse.kt @@ -0,0 +1,11 @@ +package org.moire.ultrasonic.api.subsonic.response + +import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions +import org.moire.ultrasonic.api.subsonic.SubsonicError +import org.moire.ultrasonic.api.subsonic.models.SearchTwoResult + +class GetStarredTwoResponse(status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val starred2: SearchTwoResult = SearchTwoResult()) + : SubsonicResponse(status, version, error) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java index e31c0b81..803eeed2 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java @@ -71,6 +71,7 @@ import org.moire.ultrasonic.api.subsonic.response.GetPlaylistsResponse; import org.moire.ultrasonic.api.subsonic.response.GetPodcastsResponse; import org.moire.ultrasonic.api.subsonic.response.GetRandomSongsResponse; import org.moire.ultrasonic.api.subsonic.response.GetStarredResponse; +import org.moire.ultrasonic.api.subsonic.response.GetStarredTwoResponse; import org.moire.ultrasonic.api.subsonic.response.LicenseResponse; import org.moire.ultrasonic.api.subsonic.response.MusicFoldersResponse; import org.moire.ultrasonic.api.subsonic.response.SearchResponse; @@ -108,7 +109,6 @@ import org.moire.ultrasonic.service.parser.GenreParser; import org.moire.ultrasonic.service.parser.JukeboxStatusParser; import org.moire.ultrasonic.service.parser.MusicDirectoryParser; import org.moire.ultrasonic.service.parser.RandomSongsParser; -import org.moire.ultrasonic.service.parser.SearchResult2Parser; import org.moire.ultrasonic.service.parser.ShareParser; import org.moire.ultrasonic.service.parser.UserInfoParser; import org.moire.ultrasonic.service.ssl.SSLSocketFactory; @@ -726,21 +726,16 @@ public class RESTMusicService implements MusicService return APISearchConverter.toDomainEntity(response.body().getStarred()); } - @Override - public SearchResult getStarred2(Context context, ProgressListener progressListener) throws Exception - { - checkServerVersion(context, "1.8", "Starred albums by ID3 tag not supported."); + @Override + public SearchResult getStarred2(Context context, + ProgressListener progressListener) throws Exception { + updateProgressListener(progressListener, R.string.parser_reading); + Response response = subsonicAPIClient.getApi() + .getStarred2(null).execute(); + checkResponseSuccessful(response); - Reader reader = getReader(context, progressListener, "getStarred2", null); - try - { - return new SearchResult2Parser(context).parse(reader, progressListener, true); - } - finally - { - Util.close(reader); - } - } + return APISearchConverter.toDomainEntity(response.body().getStarred2()); + } private static void checkServerVersion(Context context, String version, String text) throws ServerTooOldException { diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/parser/SearchResult2Parser.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/parser/SearchResult2Parser.java deleted file mode 100644 index f85f3eee..00000000 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/parser/SearchResult2Parser.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - This file is part of Subsonic. - - Subsonic is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Subsonic is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Subsonic. If not, see . - - Copyright 2009 (C) Sindre Mehus - */ -package org.moire.ultrasonic.service.parser; - -import android.content.Context; - -import org.moire.ultrasonic.R; -import org.moire.ultrasonic.domain.MusicDirectory; -import org.moire.ultrasonic.domain.SearchResult; -import org.moire.ultrasonic.domain.Artist; -import org.moire.ultrasonic.util.ProgressListener; - -import org.xmlpull.v1.XmlPullParser; - -import java.io.Reader; -import java.util.List; -import java.util.ArrayList; - -/** - * @author Sindre Mehus - */ -public class SearchResult2Parser extends MusicDirectoryEntryParser -{ - - public SearchResult2Parser(Context context) - { - super(context); - } - - public SearchResult parse(Reader reader, ProgressListener progressListener, boolean useId3) throws Exception - { - updateProgress(progressListener, R.string.parser_reading); - init(reader); - - List artists = new ArrayList(); - List albums = new ArrayList(); - List songs = new ArrayList(); - int eventType; - do - { - eventType = nextParseEvent(); - if (eventType == XmlPullParser.START_TAG) - { - String name = getElementName(); - if ("artist".equals(name)) - { - Artist artist = new Artist(); - artist.setId(get("id")); - artist.setName(get("name")); - artists.add(artist); - } - else if ("album".equals(name)) - { - albums.add(parseEntry("", useId3, 0)); - } - else if ("song".equals(name)) - { - songs.add(parseEntry("", false, 0)); - } - else if ("error".equals(name)) - { - handleError(); - } - } - } while (eventType != XmlPullParser.END_DOCUMENT); - - validate(); - updateProgress(progressListener, R.string.parser_reading_done); - - return new SearchResult(artists, albums, songs); - } - -} \ No newline at end of file