From 3c1debc51a855cfdda199b1a7fff21d6a52c8d3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Garc=C3=ADa=20Amor?= Date: Fri, 23 Mar 2018 14:16:31 +0100 Subject: [PATCH 01/14] New adaptive icon --- ultrasonic/src/main/AndroidManifest.xml | 3 ++- .../main/res/drawable-hdpi/ic_launcher.png | Bin 6365 -> 0 bytes .../main/res/drawable-ldpi/ic_launcher.png | Bin 2371 -> 0 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 3550 -> 0 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 9868 -> 0 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 18340 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_launcher.png | Bin 28585 -> 0 bytes .../res/drawable/ic_launcher_background.xml | 21 ++++++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 10 +++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +++++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +++++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2394 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4119 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1680 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2629 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3295 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5954 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4745 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6759 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 13105 bytes 21 files changed, 43 insertions(+), 1 deletion(-) delete mode 100644 ultrasonic/src/main/res/drawable-hdpi/ic_launcher.png delete mode 100644 ultrasonic/src/main/res/drawable-ldpi/ic_launcher.png delete mode 100644 ultrasonic/src/main/res/drawable-mdpi/ic_launcher.png delete mode 100644 ultrasonic/src/main/res/drawable-xhdpi/ic_launcher.png delete mode 100644 ultrasonic/src/main/res/drawable-xxhdpi/ic_launcher.png delete mode 100644 ultrasonic/src/main/res/drawable-xxxhdpi/ic_launcher.png create mode 100644 ultrasonic/src/main/res/drawable/ic_launcher_background.xml create mode 100644 ultrasonic/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 ultrasonic/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 ultrasonic/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 ultrasonic/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 ultrasonic/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 ultrasonic/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 ultrasonic/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 ultrasonic/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 ultrasonic/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 ultrasonic/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 ultrasonic/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 ultrasonic/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 ultrasonic/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/ultrasonic/src/main/AndroidManifest.xml b/ultrasonic/src/main/AndroidManifest.xml index c0c48bfc..6c158318 100644 --- a/ultrasonic/src/main/AndroidManifest.xml +++ b/ultrasonic/src/main/AndroidManifest.xml @@ -20,7 +20,8 @@ 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 diff --git a/ultrasonic/src/main/res/drawable-ldpi/ic_launcher.png b/ultrasonic/src/main/res/drawable-ldpi/ic_launcher.png deleted file mode 100644 index 0f7f738bdaf2790a8695f9b9979a454689f90edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2371 zcmV-J3B2}+P)Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L01mDm9TvjoKKo6pSDs9ig5XlZ2WV z(6zg#Q5P^*TgknKmH8$Sq@V=}cK_`Kytwg4@MfmKg@oH^WIJx_fynQS?0s`+%atmH zp_BXvJz1Db_jmBuu3mB(jc#G4^Kd|{0&50vC#%@GWfQ_iZBob?S~0v zBMIl5q)b*S1-R|j<;TW`KT<0n*`l1%>B|rwo51&9PK=-vec9EW^I{IrW(Pb-&?t|L z<&1yx3t=jJW=UkN__L1)@;7GY#wJh@mO6R&t2)@Mc zxaT&ilW5OY7Y@{wwD85AQHPo4)!ej+Agq*RXJd}Y%MAf;Rw(A8T!6vLyilG;Eh<@tg#P$9v+4!qEZ+pPLT@Tx%>bX|vK zS#X>TblrG|5_$|!kWzvRaqcbmJ*o-0Kn?N0gWep23R}xKPkL131FZ()>QT5eWrWSD z&j@ifO@m<=*s8$JMv#Uc(IJP;JR@^9I83RcQO#<6=f6=fV<;Zu)2y#OEy zm``qkWUL=uJ(TtgfE9bevIVeg7pQ3wP1C5RY3T3o0|1mt-N-uzvRP-wwo}4NSFFYF+W0|*gA5n}1Ok-vONQD3@j1$p4Xhmg%? zQ7q))q|>2or&Ky^BW0R4Q8Ghh0u}qGKBk*Ab6r8--ikV zXkh>|^Z}wH1T$wF-c=&>k+)4S!tb7`9^2|Tg=gX@T0;mJV+^)wYLviIP>?)1bs!}K zy03&B`%~gao(IwKL81^|qXw-$i^vZUIwe?V^usRXVNH*A#m$*JTFu$@Q(ec|BKnMv!03jp;P^cUk`*YB7-AmS9kCDCqJoyZDT1|N0-auw6V{2>m znVi&3AdY}2f}$FDsSlH*`%oT#8%f{UIAi4+M8i8En=??EB0{GJAONN0c%~$RFkIq# z?ts^BArf?cqOQI>j`+uh?hWth_j5(SumCOq%=u&0-HXs|qP%Aa9k+?@VlT{09%A$$ zWNr}>BMqwPaVxGMl>`@pa-k>}0tw~`l(FxtbLWn2;R|Hf^s3ZhAUM@-qY&*R@ zlP_-EwQVz3*+uhj`vPf0ExHKI%KnNgLfNq*Fv^fRn zrUgUOz@T6lhMUc0w-ib}_l^!9938x59rix|oB0DBeENHcx>g{0bz@x*qhIK=lWhnA zD9j04syQH@08E2srC^#SG{XSXb(joDTgKK>sr2c=rDxqW{?6#$J2(6QZ*1NCo|Brr zr=MPaBecP#pk`s5debGzw9BMv6A*&q^#Bw=qX2sS7#JjoNPy4-3)&-&&c4=m+pnE> z!K(0`LnGKT^wNJdXzvLW3~z(H|Bpz$@vDRx**&CF>z7KMFO3u>gn~#3A_cViB=mL- zR4K@IU7%UrZ4tTQwp%~Dz3F*)?d2Cw@3Nui(IL>^-v?Sedr_RUzaHC}J9)M{r*soE zaG}>K(3OCx(H0H7pYW-PUw`zv8z+WG{-t*PTs!w+UZbnYYDF!0@vWBjIjGN$sDQ;Nle5TTjr pL&o5$!?M#9yEc9U|Bv@8{tbfNak%+C(t`j1002ovPDHLkV1kA!S>6Bu diff --git a/ultrasonic/src/main/res/drawable-mdpi/ic_launcher.png b/ultrasonic/src/main/res/drawable-mdpi/ic_launcher.png deleted file mode 100644 index bc49464d74ec728710eb29e8ed3b8e3e3eac5d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3550 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 diff --git a/ultrasonic/src/main/res/drawable-xhdpi/ic_launcher.png b/ultrasonic/src/main/res/drawable-xhdpi/ic_launcher.png deleted file mode 100644 index 8ad80eb8607a7c83c64ced437083bf64a4cf5184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9868 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 diff --git a/ultrasonic/src/main/res/drawable-xxxhdpi/ic_launcher.png b/ultrasonic/src/main/res/drawable-xxxhdpi/ic_launcher.png deleted file mode 100644 index 64b3c40df6cfad98212e13e1bedfc11e52de8de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28585 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 diff --git a/ultrasonic/src/main/res/drawable/ic_launcher_background.xml b/ultrasonic/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..ea6a9a91 --- /dev/null +++ b/ultrasonic/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/ultrasonic/src/main/res/drawable/ic_launcher_foreground.xml b/ultrasonic/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..202ba2b0 --- /dev/null +++ b/ultrasonic/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,10 @@ + + + + diff --git a/ultrasonic/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/ultrasonic/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..bbd3e021 --- /dev/null +++ b/ultrasonic/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ultrasonic/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/ultrasonic/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..bbd3e021 --- /dev/null +++ b/ultrasonic/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ultrasonic/src/main/res/mipmap-hdpi/ic_launcher.png b/ultrasonic/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d13007cfa6a746a40d672750da2d161349259b GIT binary patch literal 2394 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 M07*qoM6N<$f?gJ4(EtDd literal 0 HcmV?d00001 diff --git a/ultrasonic/src/main/res/mipmap-hdpi/ic_launcher_round.png b/ultrasonic/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..14f0810c1c7e0999d95020edc8c9b61a4c2097f5 GIT binary patch literal 4119 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 literal 0 HcmV?d00001 diff --git a/ultrasonic/src/main/res/mipmap-xhdpi/ic_launcher.png b/ultrasonic/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8eb47a64b3c83b7bbe1f87e242f0eebb2a9fdd GIT binary patch literal 3295 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 literal 0 HcmV?d00001 diff --git a/ultrasonic/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/ultrasonic/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..5f663df09488519d18b4d65352aa12ea03d2db37 GIT binary patch literal 5954 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 literal 0 HcmV?d00001 diff --git a/ultrasonic/src/main/res/mipmap-xxhdpi/ic_launcher.png b/ultrasonic/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d4230eba181494e6a29618adc5a9570cc3a69e7 GIT binary patch literal 4745 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 OK<~D}tx_$U@c#j-(FlJ4 literal 0 HcmV?d00001 diff --git a/ultrasonic/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/ultrasonic/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0f94ebd5e704576c43f31658446a9d7c5fe832 GIT binary patch literal 8914 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 TY;ubPAT%wFyXs}CR$>1GeGo|j literal 0 HcmV?d00001 diff --git a/ultrasonic/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/ultrasonic/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..5af1f87754cf23968440734558c1f29cdb2704ed GIT binary patch literal 13105 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 Date: Sat, 24 Mar 2018 18:40:56 +0100 Subject: [PATCH 02/14] Bump version to 2.4.0 for next release. Signed-off-by: Yahor Berdnikau --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index d53fc384..f4ac0834 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,6 +1,6 @@ ext.versions = [ - versionCode : 66, - versionName : "2.3.1", + versionCode : 67, + versionName : "2.4.0", minSdk : 14, targetSdk : 22, From ce9edae390ca6d666d6b156433cf6c09b7a451dd Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 24 Mar 2018 18:43:27 +0100 Subject: [PATCH 03/14] Update kotlin to 1.2.31 version. Signed-off-by: Yahor Berdnikau --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index f4ac0834..7a5c0375 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -16,7 +16,7 @@ ext.versions = [ androidSupport : "22.2.1", - kotlin : "1.2.21", + kotlin : "1.2.31", retrofit : "2.1.0", jackson : "2.9.0", From 61b92bee39bc8a10c88d5bf68b79a0055599297f Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 24 Mar 2018 18:57:18 +0100 Subject: [PATCH 04/14] Update Retrofit to 2.4.0 version. Signed-off-by: Yahor Berdnikau --- dependencies.gradle | 2 +- .../org/moire/ultrasonic/api/subsonic/CommonFunctions.kt | 4 ++-- .../ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt | 4 ++-- .../moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt | 2 +- .../api/subsonic/SubsonicApiGetAlbumListRequestTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt | 4 ++-- .../api/subsonic/SubsonicApiGetChatMessagesTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetIndexesTest.kt | 4 ++-- .../ultrasonic/api/subsonic/SubsonicApiGetLicenseTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt | 2 +- .../api/subsonic/SubsonicApiGetMusicDirectoryTest.kt | 4 ++-- .../api/subsonic/SubsonicApiGetMusicFoldersTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt | 2 +- .../api/subsonic/SubsonicApiGetRandomSongsTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt | 4 ++-- .../api/subsonic/SubsonicApiGetSongsByGenreTest.kt | 4 ++-- .../ultrasonic/api/subsonic/SubsonicApiGetStarred2Test.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt | 2 +- .../moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt | 2 +- .../api/subsonic/SubsonicApiJukeboxControlTest.kt | 4 ++-- .../ultrasonic/api/subsonic/SubsonicApiPingRequestTest.kt | 2 +- .../moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt | 2 +- .../moire/ultrasonic/api/subsonic/SubsonicApiStarTest.kt | 2 +- .../moire/ultrasonic/api/subsonic/SubsonicApiUnstarTest.kt | 2 +- .../org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt | 6 +++--- .../api/subsonic/interceptors/PasswordHexInterceptor.kt | 2 +- 36 files changed, 46 insertions(+), 46 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 7a5c0375..243712c2 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -18,7 +18,7 @@ ext.versions = [ kotlin : "1.2.31", - retrofit : "2.1.0", + retrofit : "2.4.0", jackson : "2.9.0", okhttp : "3.9.0", semver : "1.0.0", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt index 7ee3bcc4..deca2f70 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt @@ -64,11 +64,11 @@ fun checkErrorCallParsed(mockWebServerRule: MockWebServer val response = apiRequest() assertResponseSuccessful(response) - with(response.body()) { + with(response.body()!!) { status `should be` SubsonicResponse.Status.ERROR error `should be` SubsonicError.RequestedDataWasNotFound } - return response.body() + return response.body()!! } fun SubsonicResponse.assertBaseResponseOk() { diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt index 82f95769..ed699f46 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt @@ -26,8 +26,8 @@ class SubsonicApiCreateShareTest : SubsonicAPIClientTest() { val response = client.api.createShare(listOf("some-id")).execute() assertResponseSuccessful(response) - response.body().shares.size `should equal to` 1 - with(response.body().shares[0]) { + response.body()!!.shares.size `should equal to` 1 + with(response.body()!!.shares[0]) { id `should equal to` "0" url `should equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1NiJ9." + "eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8hJ692" + diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt index 3b8c66f9..947c7c22 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt @@ -150,7 +150,7 @@ class SubsonicApiErrorsTest : SubsonicAPIClientTest() { } private fun Response.assertError(expectedError: SubsonicError) = - with(body()) { + with(body()!!) { error `should not be` null error `should equal` expectedError } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt index 817a9f36..c7ca56fb 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt @@ -28,7 +28,7 @@ class SubsonicApiGetAlbumList2Test : SubsonicAPIClientTest() { val response = client.api.getAlbumList2(STARRED).execute() assertResponseSuccessful(response) - with(response.body().albumList) { + with(response.body()!!.albumList) { this.size `should equal to` 2 this[0] `should equal` Album(id = "962", name = "Fury", artist = "Sick Puppies", artistId = "473", coverArt = "al-962", songCount = 13, duration = 2591, diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumListRequestTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumListRequestTest.kt index eb2ffb6f..72bb3934 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumListRequestTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumListRequestTest.kt @@ -27,7 +27,7 @@ class SubsonicApiGetAlbumListRequestTest : SubsonicAPIClientTest() { val response = client.api.getAlbumList(BY_GENRE).execute() assertResponseSuccessful(response) - with(response.body().albumList) { + with(response.body()!!.albumList) { size `should equal to` 2 this[1] `should equal` MusicDirectoryChild(id = "9997", parent = "9996", isDir = true, title = "Endless Forms Most Beautiful", album = "Endless Forms Most Beautiful", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt index 32793390..55dfd8df 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt @@ -38,7 +38,7 @@ class SubsonicApiGetAlbumTest : SubsonicAPIClientTest() { val response = client.api.getAlbum("512").execute() assertResponseSuccessful(response) - with(response.body().album) { + with(response.body()!!.album) { id `should equal to` "618" name `should equal to` "Black Ice" artist `should equal to` "AC/DC" diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt index 5904ee6c..2979453b 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt @@ -38,7 +38,7 @@ class SubsonicApiGetArtistTest : SubsonicAPIClientTest() { val response = client.api.getArtist("100").execute() assertResponseSuccessful(response) - with(response.body().artist) { + with(response.body()!!.artist) { id `should equal to` "362" name `should equal to` "AC/DC" coverArt `should equal to` "ar-362" diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt index 100042c5..9a504b71 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt @@ -29,7 +29,7 @@ class SubsonicApiGetArtistsTest : SubsonicAPIClientTest() { val response = client.api.getArtists(null).execute() assertResponseSuccessful(response) - with(response.body().indexes) { + with(response.body()!!.indexes) { lastModified `should equal to` 0L ignoredArticles `should equal to` "The El La Los Las Le Les" shortcutList `should equal` emptyList() diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt index a10070ee..dea42311 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt @@ -25,8 +25,8 @@ class SubsonicApiGetBookmarksTest : SubsonicAPIClientTest() { val response = client.api.getBookmarks().execute() assertResponseSuccessful(response) - response.body().bookmarkList.size `should equal to` 1 - with(response.body().bookmarkList[0]) { + response.body()!!.bookmarkList.size `should equal to` 1 + with(response.body()!!.bookmarkList[0]) { position `should equal to` 107914 username `should equal to` "CaptainEurope" comment `should equal to` "Look at this" diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt index 910c58a0..b7adae46 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt @@ -25,7 +25,7 @@ class SubsonicApiGetChatMessagesTest : SubsonicAPIClientTest() { val response = client.api.getChatMessages().execute() assertResponseSuccessful(response) - with(response.body().chatMessages) { + with(response.body()!!.chatMessages) { size `should equal to` 2 this[0] `should equal` ChatMessage(username = "sindre", time = 1269771845310, message = "Sindre was here") diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt index 1f311f07..722fb2e3 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt @@ -25,7 +25,7 @@ class SubsonicApiGetGenresTest : SubsonicAPIClientTest() { val response = client.api.getGenres().execute() assertResponseSuccessful(response) - with(response.body().genresList) { + with(response.body()!!.genresList) { size `should equal to` 5 this[0] `should equal` Genre(1186, 103, "Rock") this[1] `should equal` Genre(896, 72, "Electronic") diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetIndexesTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetIndexesTest.kt index b9bbc34c..5f1ac659 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetIndexesTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetIndexesTest.kt @@ -18,8 +18,8 @@ class SubsonicApiGetIndexesTest : SubsonicAPIClientTest() { val response = client.api.getIndexes(null, null).execute() assertResponseSuccessful(response) - response.body().indexes `should not be` null - with(response.body().indexes) { + response.body()!!.indexes `should not be` null + with(response.body()!!.indexes) { lastModified `should equal` 1491069027523 ignoredArticles `should equal` "The El La Los Las Le Les" shortcutList `should equal` listOf( diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLicenseTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLicenseTest.kt index 21401094..d0ca9eb8 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLicenseTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLicenseTest.kt @@ -16,7 +16,7 @@ class SubsonicApiGetLicenseTest : SubsonicAPIClientTest() { val response = client.api.getLicense().execute() assertResponseSuccessful(response) - with(response.body()) { + with(response.body()!!) { assertBaseResponseOk() license `should equal` License(valid = true, trialExpires = parseDate("2016-11-23T20:17:15.206Z"), diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt index a5d29b57..31de56e6 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt @@ -21,7 +21,7 @@ class SubsonicApiGetLyricsTest : SubsonicAPIClientTest() { val response = client.api.getLyrics().execute() assertResponseSuccessful(response) - with(response.body().lyrics) { + with(response.body()!!.lyrics) { artist `should equal to` "Amorphis" title `should equal to` "Alone" text `should equal to` "Tear dimmed rememberance\nIn a womb of time\nBreath upon " + diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicDirectoryTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicDirectoryTest.kt index 0801e673..0b7da0a5 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicDirectoryTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicDirectoryTest.kt @@ -40,8 +40,8 @@ class SubsonicApiGetMusicDirectoryTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) - response.body().musicDirectory `should not be` null - with(response.body().musicDirectory) { + response.body()!!.musicDirectory `should not be` null + with(response.body()!!.musicDirectory) { id `should equal to` "4836" parent `should equal to` "300" name `should equal` "12 Stones" diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicFoldersTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicFoldersTest.kt index c3460aed..0ccfde1d 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicFoldersTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicFoldersTest.kt @@ -15,7 +15,7 @@ class SubsonicApiGetMusicFoldersTest : SubsonicAPIClientTest() { val response = client.api.getMusicFolders().execute() assertResponseSuccessful(response) - with(response.body()) { + with(response.body()!!) { assertBaseResponseOk() musicFolders `should equal` listOf( MusicFolder("0", "Music"), diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt index d542d0db..fff9fe29 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt @@ -28,7 +28,7 @@ class SubsonicApiGetPlaylistTest : SubsonicAPIClientTest() { val response = client.api.getPlaylist("4").execute() assertResponseSuccessful(response) - with(response.body().playlist) { + with(response.body()!!.playlist) { id `should equal to` "0" name `should equal to` "Aug 27, 2017 11:17 AM" owner `should equal to` "admin" diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt index f787c37c..e55df742 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt @@ -27,7 +27,7 @@ class SubsonicApiGetPlaylistsTest : SubsonicAPIClientTest() { val response = client.api.getPlaylists().execute() assertResponseSuccessful(response) - with(response.body().playlists) { + with(response.body()!!.playlists) { size `should equal to` 1 this[0] `should equal` Playlist(id = "0", name = "Aug 27, 2017 11:17 AM", owner = "admin", public = false, songCount = 16, duration = 3573, diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt index 985425e4..1420f58a 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt @@ -27,7 +27,7 @@ class SubsonicApiGetPodcastsTest : SubsonicAPIClientTest() { val response = client.api.getPodcasts().execute() assertResponseSuccessful(response) - val podcastChannelsList = response.body().podcastChannels + val podcastChannelsList = response.body()!!.podcastChannels podcastChannelsList.size `should equal to` 1 with(podcastChannelsList[0]) { id `should equal to` "2" diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetRandomSongsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetRandomSongsTest.kt index 8f06b174..eec95522 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetRandomSongsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetRandomSongsTest.kt @@ -25,7 +25,7 @@ class SubsonicApiGetRandomSongsTest : SubsonicAPIClientTest() { val response = client.api.getRandomSongs().execute() assertResponseSuccessful(response) - with(response.body().songsList) { + with(response.body()!!.songsList) { size `should equal to` 3 this[1] `should equal` MusicDirectoryChild(id = "3061", parent = "3050", isDir = false, title = "Sure as Hell", album = "Who Are You Now?", artist = "This Providence", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt index 6da16b43..dc791aa8 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt @@ -25,8 +25,8 @@ class SubsonicApiGetSharesTest : SubsonicAPIClientTest() { val response = client.api.getShares().execute() assertResponseSuccessful(response) - response.body().shares.size `should equal to` 1 - with(response.body().shares[0]) { + response.body()!!.shares.size `should equal to` 1 + with(response.body()!!.shares[0]) { id `should equal to` "0" url `should equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1" + "NiJ9.eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8" + diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSongsByGenreTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSongsByGenreTest.kt index c344c8b3..a3d474fc 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSongsByGenreTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSongsByGenreTest.kt @@ -25,8 +25,8 @@ class SubsonicApiGetSongsByGenreTest : SubsonicAPIClientTest() { val response = client.api.getSongsByGenre("Trance").execute() assertResponseSuccessful(response) - response.body().songsList.size `should equal to` 2 - with(response.body().songsList) { + response.body()!!.songsList.size `should equal to` 2 + with(response.body()!!.songsList) { this[0] `should equal` MusicDirectoryChild(id = "575", parent = "576", isDir = false, title = "Time Machine (Vadim Zhukov Remix)", album = "668", artist = "Tasadi", year = 2008, genre = "Trance", size = 22467672, 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 index b8409cd0..a77ad81e 100644 --- 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 @@ -27,7 +27,7 @@ class SubsonicApiGetStarred2Test : SubsonicAPIClientTest() { val response = client.api.getStarred2().execute() assertResponseSuccessful(response) - with(response.body().starred2) { + with(response.body()!!.starred2) { albumList `should equal` emptyList() artistList.size `should equal to` 1 artistList[0] `should equal` Artist(id = "364", name = "Parov Stelar", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt index 3fd5fb9c..8a41f90c 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt @@ -26,7 +26,7 @@ class SubsonicApiGetStarredTest : SubsonicAPIClientTest() { val response = client.api.getStarred().execute() assertResponseSuccessful(response) - with(response.body().starred) { + with(response.body()!!.starred) { albumList `should equal` emptyList() artistList.size `should equal to` 1 artistList[0] `should equal` Artist(id = "364", name = "Parov Stelar", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt index 648cbeae..709c0de0 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt @@ -25,7 +25,7 @@ class SubsonicApiGetUserTest : SubsonicAPIClientTest() { val response = client.api.getUser("some").execute() assertResponseSuccessful(response) - with(response.body().user) { + with(response.body()!!.user) { username `should equal to` "GodOfUniverse" email `should equal to` "some.mail@example.com" scrobblingEnabled `should equal to` false diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt index ef3d71ab..d11e7d58 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt @@ -25,7 +25,7 @@ class SubsonicApiGetVideosListTest : SubsonicAPIClientTest() { val response = client.api.getVideos().execute() assertResponseSuccessful(response) - with(response.body().videosList) { + with(response.body()!!.videosList) { size `should equal to` 1 this[0] `should equal` MusicDirectoryChild(id = "10402", parent = "10401", isDir = false, title = "MVI_0512", album = "Incoming", size = 21889646, diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiJukeboxControlTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiJukeboxControlTest.kt index d072a217..70f83daa 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiJukeboxControlTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiJukeboxControlTest.kt @@ -29,7 +29,7 @@ class SubsonicApiJukeboxControlTest : SubsonicAPIClientTest() { val response = client.api.jukeboxControl(STATUS).execute() assertResponseSuccessful(response) - with(response.body().jukebox) { + with(response.body()!!.jukebox) { currentIndex `should equal to` 94 playing `should equal to` true gain `should equal to` 0.32f @@ -45,7 +45,7 @@ class SubsonicApiJukeboxControlTest : SubsonicAPIClientTest() { val response = client.api.jukeboxControl(GET).execute() assertResponseSuccessful(response) - with(response.body().jukebox) { + with(response.body()!!.jukebox) { currentIndex `should equal to` 887 playing `should equal to` false gain `should equal to` 0.88f diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiPingRequestTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiPingRequestTest.kt index b157ef40..055d91fa 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiPingRequestTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiPingRequestTest.kt @@ -13,7 +13,7 @@ class SubsonicApiPingRequestTest : SubsonicAPIClientTest() { val response = client.api.ping().execute() assertResponseSuccessful(response) - with(response.body()) { + with(response.body()!!) { assertBaseResponseOk() } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt index cd850480..eacf7eb0 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt @@ -29,7 +29,7 @@ class SubsonicApiSearchTest : SubsonicAPIClientTest() { val response = client.api.search().execute() assertResponseSuccessful(response) - with(response.body().searchResult) { + with(response.body()!!.searchResult) { offset `should equal to` 10 totalHits `should equal to` 53 matchList.size `should equal to` 1 diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt index e9aca121..77fe806d 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt @@ -30,7 +30,7 @@ class SubsonicApiSearchThreeTest : SubsonicAPIClientTest() { val response = client.api.search3("some-query").execute() assertResponseSuccessful(response) - with(response.body().searchResult) { + with(response.body()!!.searchResult) { artistList.size `should equal to` 1 artistList[0] `should equal` Artist(id = "505", name = "The Prodigy", coverArt = "ar-505", albumCount = 5) diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt index e572090f..38e5bb3b 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt @@ -29,7 +29,7 @@ class SubsonicApiSearchTwoTest : SubsonicAPIClientTest() { val response = client.api.search2("some-query").execute() assertResponseSuccessful(response) - with(response.body().searchResult) { + with(response.body()!!.searchResult) { artistList.size `should equal to` 1 artistList[0] `should equal` Artist(id = "522", name = "The Prodigy") albumList.size `should equal to` 1 diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStarTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStarTest.kt index 12377e3d..7ed24e26 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStarTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStarTest.kt @@ -15,7 +15,7 @@ class SubsonicApiStarTest : SubsonicAPIClientTest() { val response = client.api.star().execute() assertResponseSuccessful(response) - response.body().status `should be` SubsonicResponse.Status.OK + response.body()?.status `should be` SubsonicResponse.Status.OK } @Test diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiUnstarTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiUnstarTest.kt index a47a120a..26ec548e 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiUnstarTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiUnstarTest.kt @@ -15,7 +15,7 @@ class SubsonicApiUnstarTest : SubsonicAPIClientTest() { val response = client.api.unstar().execute() assertResponseSuccessful(response) - response.body().status `should be` SubsonicResponse.Status.OK + response.body()?.status `should be` SubsonicResponse.Status.OK } @Test diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt index fa1c1cd2..36f024b3 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt @@ -139,14 +139,14 @@ class SubsonicAPIClient(baseUrl: String, val response = apiCall() return if (response.isSuccessful) { val responseBody = response.body() - val contentType = responseBody.contentType() + val contentType = responseBody?.contentType() if (contentType != null && contentType.type().equals("application", true) && contentType.subtype().equals("json", true)) { val error = jacksonMapper.readValue(responseBody.byteStream()) StreamResponse(apiError = error.error, responseHttpCode = response.code()) } else { - StreamResponse(stream = responseBody.byteStream(), + StreamResponse(stream = responseBody?.byteStream(), responseHttpCode = response.code()) } } else { @@ -165,7 +165,7 @@ class SubsonicAPIClient(baseUrl: String, val request = api.stream(id).execute() val url = request.raw().request().url().toString() if (request.isSuccessful) { - request.body().close() + request.body()?.close() } return url } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordHexInterceptor.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordHexInterceptor.kt index bec49519..a6c8b853 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordHexInterceptor.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordHexInterceptor.kt @@ -19,7 +19,7 @@ class PasswordHexInterceptor(private val password: String) : Interceptor { override fun intercept(chain: Chain): Response { val originalRequest = chain.request() val updatedUrl = originalRequest.url().newBuilder() - .addQueryParameter("p", passwordHex).build() + .addEncodedQueryParameter("p", passwordHex).build() return chain.proceed(originalRequest.newBuilder().url(updatedUrl).build()) } } From 4959891f9f040eb337b20780a46efb008deb9d4f Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 24 Mar 2018 18:58:33 +0100 Subject: [PATCH 05/14] Update OkHttp to 3.10.0 version. Signed-off-by: Yahor Berdnikau --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 243712c2..aea3ef1f 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -20,7 +20,7 @@ ext.versions = [ retrofit : "2.4.0", jackson : "2.9.0", - okhttp : "3.9.0", + okhttp : "3.10.0", semver : "1.0.0", twitterSerial : "0.1.6", From 385779933b6d1656f4af6c03efc57e650027a99d Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 24 Mar 2018 19:00:33 +0100 Subject: [PATCH 06/14] Update mockito to 2.16.0 version. Signed-off-by: Yahor Berdnikau --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index aea3ef1f..a6c80c22 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -25,7 +25,7 @@ ext.versions = [ twitterSerial : "0.1.6", junit : "4.12", - mockito : "2.12.0", + mockito : "2.16.0", mockitoKotlin : "1.5.0", kluent : "1.26", apacheCodecs : "1.10", From 55a0e7cb3cbda5ac3bf675e609e0c8bce60761a1 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 24 Mar 2018 19:30:03 +0100 Subject: [PATCH 07/14] Update Kluent to 1.35 version. Signed-off-by: Yahor Berdnikau --- .../cache/PermanentFileStorageTest.kt | 10 +++--- dependencies.gradle | 2 +- .../api/subsonic/GetStreamUrlTest.kt | 6 ++-- .../subsonic/SubsonicApiCreateShareTest.kt | 17 ++++----- .../subsonic/SubsonicApiGetAlbumList2Test.kt | 4 +-- .../SubsonicApiGetAlbumListRequestTest.kt | 4 +-- .../api/subsonic/SubsonicApiGetAlbumTest.kt | 22 ++++++------ .../api/subsonic/SubsonicApiGetArtistTest.kt | 12 +++---- .../api/subsonic/SubsonicApiGetArtistsTest.kt | 8 ++--- .../api/subsonic/SubsonicApiGetAvatarTest.kt | 10 +++--- .../subsonic/SubsonicApiGetBookmarksTest.kt | 10 +++--- .../SubsonicApiGetChatMessagesTest.kt | 4 +-- .../subsonic/SubsonicApiGetCoverArtTest.kt | 8 ++--- .../api/subsonic/SubsonicApiGetGenresTest.kt | 4 +-- .../api/subsonic/SubsonicApiGetLyricsTest.kt | 8 ++--- .../SubsonicApiGetMusicDirectoryTest.kt | 12 +++---- .../subsonic/SubsonicApiGetPlaylistTest.kt | 18 +++++----- .../subsonic/SubsonicApiGetPlaylistsTest.kt | 4 +-- .../subsonic/SubsonicApiGetPodcastsTest.kt | 24 ++++++------- .../subsonic/SubsonicApiGetRandomSongsTest.kt | 4 +-- .../api/subsonic/SubsonicApiGetSharesTest.kt | 16 ++++----- .../SubsonicApiGetSongsByGenreTest.kt | 4 +-- .../subsonic/SubsonicApiGetStarred2Test.kt | 4 +-- .../api/subsonic/SubsonicApiGetStarredTest.kt | 4 +-- .../api/subsonic/SubsonicApiGetUserTest.kt | 36 +++++++++---------- .../subsonic/SubsonicApiGetVideosListTest.kt | 4 +-- .../subsonic/SubsonicApiJukeboxControlTest.kt | 20 +++++------ .../api/subsonic/SubsonicApiSearchTest.kt | 8 ++--- .../subsonic/SubsonicApiSearchThreeTest.kt | 8 ++--- .../api/subsonic/SubsonicApiSearchTwoTest.kt | 8 ++--- .../api/subsonic/SubsonicApiStreamTest.kt | 10 +++--- .../RangeHeaderInterceptorTest.kt | 6 ++-- .../api/subsonic/models/AlbumListTypeTest.kt | 4 +-- .../subsonic/response/StreamResponseTest.kt | 12 +++---- .../domain/APIAlbumConverterTest.kt | 6 ++-- .../domain/APIBookmarkConverterTest.kt | 6 ++-- .../domain/APIChatMessageConverterTest.kt | 4 +-- .../domain/APIIndexesConverterTest.kt | 8 ++--- .../domain/APIJukeboxConverterTest.kt | 4 +-- .../domain/APIMusicDirectoryConverterTest.kt | 12 +++---- .../domain/APIMusicFolderConverterTest.kt | 16 ++++----- .../domain/APIPlaylistConverterTest.kt | 18 +++++----- .../domain/APIPodcastConverterTest.kt | 4 +-- .../domain/APISearchConverterTest.kt | 20 +++++------ .../domain/APIShareConverterTest.kt | 4 +-- .../ultrasonic/domain/APIUserConverterTest.kt | 26 +++++++------- .../domain/ApiGenreConverterTest.kt | 4 +-- 47 files changed, 234 insertions(+), 233 deletions(-) diff --git a/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt b/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt index bd84b528..c78034fc 100644 --- a/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt +++ b/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt @@ -1,7 +1,7 @@ package org.moire.ultrasonic.cache +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should contain` -import org.amshove.kluent.`should equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.cache.serializers.getMusicFolderSerializer @@ -20,8 +20,8 @@ class PermanentFileStorageTest : BaseStorageTest() { val item = MusicFolder("1", "2") storage.store("test", item, getMusicFolderSerializer()) - storageDir.exists() `should equal to` true - getServerStorageDir().exists() `should equal to` true + storageDir.exists() `should be equal to` true + getServerStorageDir().exists() `should be equal to` true } @Test @@ -32,7 +32,7 @@ class PermanentFileStorageTest : BaseStorageTest() { storage.store(name, item, getMusicFolderSerializer()) val storageFiles = getServerStorageDir().listFiles() - storageFiles.size `should equal to` 1 + storageFiles.size `should be equal to` 1 storageFiles[0].name `should contain` name } @@ -67,7 +67,7 @@ class PermanentFileStorageTest : BaseStorageTest() { storage.clearAll() - getServerStorageDir().listFiles().size `should equal to` 0 + getServerStorageDir().listFiles().size `should be equal to` 0 } @Test diff --git a/dependencies.gradle b/dependencies.gradle index a6c80c22..52719111 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -27,7 +27,7 @@ ext.versions = [ junit : "4.12", mockito : "2.16.0", mockitoKotlin : "1.5.0", - kluent : "1.26", + kluent : "1.35", apacheCodecs : "1.10", ] diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/GetStreamUrlTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/GetStreamUrlTest.kt index e1529d3d..063a5cf7 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/GetStreamUrlTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/GetStreamUrlTest.kt @@ -1,7 +1,7 @@ package org.moire.ultrasonic.api.subsonic import okhttp3.mockwebserver.MockResponse -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.junit.Before import org.junit.Rule import org.junit.Test @@ -34,7 +34,7 @@ class GetStreamUrlTest { val streamUrl = client.getStreamUrl(id) - streamUrl `should equal to` expectedUrl + streamUrl `should be equal to` expectedUrl } @Test @@ -43,6 +43,6 @@ class GetStreamUrlTest { val streamUrl = client.getStreamUrl(id) - streamUrl `should equal to` expectedUrl + streamUrl `should be equal to` expectedUrl } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt index ed699f46..16a9a5d0 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiCreateShareTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild @@ -26,19 +26,20 @@ class SubsonicApiCreateShareTest : SubsonicAPIClientTest() { val response = client.api.createShare(listOf("some-id")).execute() assertResponseSuccessful(response) - response.body()!!.shares.size `should equal to` 1 + response.body()!!.shares.size `should be equal to` 1 with(response.body()!!.shares[0]) { - id `should equal to` "0" - url `should equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1NiJ9." + + id `should be equal to` "0" + url `should be equal to` "https://subsonic.com/ext/share/awdwo?jwt=" + + "eyJhbGciOiJIUzI1NiJ9." + "eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8hJ692" + "UxorHdHWFU2RB-fMCmCA4IJ_dTw" - username `should equal to` "admin" + username `should be equal to` "admin" created `should equal` parseDate("2017-11-07T21:33:51.748Z") expires `should equal` parseDate("2018-11-07T21:33:51.748Z") lastVisited `should equal` parseDate("2018-11-07T21:33:51.748Z") - description `should equal to` "Awesome link!" - visitCount `should equal to` 0 - items.size `should equal to` 1 + description `should be equal to` "Awesome link!" + visitCount `should be equal to` 0 + items.size `should be equal to` 1 items[0] `should equal` MusicDirectoryChild(id = "4212", parent = "4186", isDir = false, title = "Heaven Knows", album = "Going to Hell", artist = "The Pretty Reckless", track = 3, year = 2014, genre = "Hard Rock", coverArt = "4186", size = 9025090, diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt index c7ca56fb..f7c30d23 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumList2Test.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.Album @@ -29,7 +29,7 @@ class SubsonicApiGetAlbumList2Test : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.albumList) { - this.size `should equal to` 2 + this.size `should be equal to` 2 this[0] `should equal` Album(id = "962", name = "Fury", artist = "Sick Puppies", artistId = "473", coverArt = "al-962", songCount = 13, duration = 2591, created = parseDate("2017-09-02T17:34:51.000Z"), year = 2016, diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumListRequestTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumListRequestTest.kt index 72bb3934..25c833ce 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumListRequestTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumListRequestTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.AlbumListType @@ -28,7 +28,7 @@ class SubsonicApiGetAlbumListRequestTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.albumList) { - size `should equal to` 2 + size `should be equal to` 2 this[1] `should equal` MusicDirectoryChild(id = "9997", parent = "9996", isDir = true, title = "Endless Forms Most Beautiful", album = "Endless Forms Most Beautiful", artist = "Nightwish", year = 2015, genre = "Symphonic Metal", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt index 55dfd8df..ca29ee28 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -39,17 +39,17 @@ class SubsonicApiGetAlbumTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.album) { - id `should equal to` "618" - name `should equal to` "Black Ice" - artist `should equal to` "AC/DC" - artistId `should equal to` "362" - coverArt `should equal to` "al-618" - songCount `should equal to` 15 - duration `should equal to` 3331 + id `should be equal to` "618" + name `should be equal to` "Black Ice" + artist `should be equal to` "AC/DC" + artistId `should be equal to` "362" + coverArt `should be equal to` "al-618" + songCount `should be equal to` 15 + duration `should be equal to` 3331 created `should equal` parseDate("2016-10-23T15:31:22.000Z") - year `should equal to` 2008 - genre `should equal to` "Hard Rock" - songList.size `should equal to` 15 + year `should be equal to` 2008 + genre `should be equal to` "Hard Rock" + songList.size `should be equal to` 15 songList[0] `should equal` MusicDirectoryChild(id = "6491", parent = "6475", isDir = false, title = "Rock 'n' Roll Train", album = "Black Ice", artist = "AC/DC", track = 1, year = 2008, genre = "Hard Rock", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt index 2979453b..86d2b89b 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -39,11 +39,11 @@ class SubsonicApiGetArtistTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.artist) { - id `should equal to` "362" - name `should equal to` "AC/DC" - coverArt `should equal to` "ar-362" - albumCount `should equal to` 2 - albumsList.size `should equal to` 2 + id `should be equal to` "362" + name `should be equal to` "AC/DC" + coverArt `should be equal to` "ar-362" + albumCount `should be equal to` 2 + albumsList.size `should be equal to` 2 albumsList[0] `should equal` Album(id = "618", name = "Black Ice", artist = "AC/DC", artistId = "362", coverArt = "al-618", songCount = 15, duration = 3331, created = parseDate("2016-10-23T15:31:22.000Z"), diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt index 9a504b71..c299509f 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetArtistsTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -30,10 +30,10 @@ class SubsonicApiGetArtistsTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.indexes) { - lastModified `should equal to` 0L - ignoredArticles `should equal to` "The El La Los Las Le Les" + lastModified `should be equal to` 0L + ignoredArticles `should be equal to` "The El La Los Las Le Les" shortcutList `should equal` emptyList() - indexList.size `should equal to` 2 + indexList.size `should be equal to` 2 indexList `should equal` listOf( Index(name = "A", artists = listOf( Artist(id = "362", name = "AC/DC", coverArt = "ar-362", albumCount = 2), diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAvatarTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAvatarTest.kt index 91acfe65..228ff17e 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAvatarTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAvatarTest.kt @@ -1,8 +1,8 @@ package org.moire.ultrasonic.api.subsonic import okhttp3.mockwebserver.MockResponse +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should be` -import org.amshove.kluent.`should equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -19,7 +19,7 @@ class SubsonicApiGetAvatarTest : SubsonicAPIClientTest() { with(response) { stream `should be` null - responseHttpCode `should equal to` 200 + responseHttpCode `should be equal to` 200 apiError `should equal` SubsonicError.RequestedDataWasNotFound } } @@ -33,7 +33,7 @@ class SubsonicApiGetAvatarTest : SubsonicAPIClientTest() { with(response) { stream `should equal` null - responseHttpCode `should equal to` httpErrorCode + responseHttpCode `should be equal to` httpErrorCode apiError `should be` null } } @@ -46,11 +46,11 @@ class SubsonicApiGetAvatarTest : SubsonicAPIClientTest() { val response = client.stream("some") with(response) { - responseHttpCode `should equal to` 200 + responseHttpCode `should be equal to` 200 apiError `should be` null stream `should not be` null val expectedContent = mockWebServerRule.loadJsonResponse("ping_ok.json") - stream!!.bufferedReader().readText() `should equal to` expectedContent + stream!!.bufferedReader().readText() `should be equal to` expectedContent } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt index dea42311..c417199f 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetBookmarksTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild @@ -25,11 +25,11 @@ class SubsonicApiGetBookmarksTest : SubsonicAPIClientTest() { val response = client.api.getBookmarks().execute() assertResponseSuccessful(response) - response.body()!!.bookmarkList.size `should equal to` 1 + response.body()!!.bookmarkList.size `should be equal to` 1 with(response.body()!!.bookmarkList[0]) { - position `should equal to` 107914 - username `should equal to` "CaptainEurope" - comment `should equal to` "Look at this" + position `should be equal to` 107914 + username `should be equal to` "CaptainEurope" + comment `should be equal to` "Look at this" created `should equal` parseDate("2017-11-18T15:22:22.144Z") changed `should equal` parseDate("2017-11-18T15:22:22.144Z") entry `should equal` MusicDirectoryChild(id = "10349", parent = "10342", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt index b7adae46..34f13791 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetChatMessagesTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.ChatMessage @@ -26,7 +26,7 @@ class SubsonicApiGetChatMessagesTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.chatMessages) { - size `should equal to` 2 + size `should be equal to` 2 this[0] `should equal` ChatMessage(username = "sindre", time = 1269771845310, message = "Sindre was here") this[1] `should equal` ChatMessage(username = "ben", time = 1269771842504, diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetCoverArtTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetCoverArtTest.kt index d327e06c..b961c954 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetCoverArtTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetCoverArtTest.kt @@ -1,8 +1,8 @@ package org.moire.ultrasonic.api.subsonic import okhttp3.mockwebserver.MockResponse +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should be` -import org.amshove.kluent.`should equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -19,7 +19,7 @@ class SubsonicApiGetCoverArtTest : SubsonicAPIClientTest() { with(response) { stream `should be` null - responseHttpCode `should equal to` 200 + responseHttpCode `should be equal to` 200 apiError `should equal` SubsonicError.RequestedDataWasNotFound } } @@ -46,11 +46,11 @@ class SubsonicApiGetCoverArtTest : SubsonicAPIClientTest() { val response = client.getCoverArt("some-id") with(response) { - responseHttpCode `should equal to` 200 + responseHttpCode `should be equal to` 200 apiError `should be` null stream `should not be` null val expectedContent = mockWebServerRule.loadJsonResponse("ping_ok.json") - stream!!.bufferedReader().readText() `should equal to` expectedContent + stream!!.bufferedReader().readText() `should be equal to` expectedContent } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt index 722fb2e3..b4783cd8 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetGenresTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.Genre @@ -26,7 +26,7 @@ class SubsonicApiGetGenresTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.genresList) { - size `should equal to` 5 + size `should be equal to` 5 this[0] `should equal` Genre(1186, 103, "Rock") this[1] `should equal` Genre(896, 72, "Electronic") this[2] `should equal` Genre(790, 59, "Alternative Rock") diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt index 31de56e6..55bbc121 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetLyricsTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.junit.Test /** @@ -22,9 +22,9 @@ class SubsonicApiGetLyricsTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.lyrics) { - artist `should equal to` "Amorphis" - title `should equal to` "Alone" - text `should equal to` "Tear dimmed rememberance\nIn a womb of time\nBreath upon " + + artist `should be equal to` "Amorphis" + title `should be equal to` "Alone" + text `should be equal to` "Tear dimmed rememberance\nIn a womb of time\nBreath upon " + "me\nPossessed by the" } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicDirectoryTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicDirectoryTest.kt index 0b7da0a5..2c851a9a 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicDirectoryTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetMusicDirectoryTest.kt @@ -1,7 +1,7 @@ package org.moire.ultrasonic.api.subsonic +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should be` -import org.amshove.kluent.`should equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -42,13 +42,13 @@ class SubsonicApiGetMusicDirectoryTest : SubsonicAPIClientTest() { response.body()!!.musicDirectory `should not be` null with(response.body()!!.musicDirectory) { - id `should equal to` "4836" - parent `should equal to` "300" + id `should be equal to` "4836" + parent `should be equal to` "300" name `should equal` "12 Stones" - userRating `should equal to` 5 - averageRating `should equal to` 5.0f + userRating `should be equal to` 5 + averageRating `should be equal to` 5.0f starred `should equal` null - playCount `should equal to` 1 + playCount `should be equal to` 1 childList.size `should be` 2 childList[0] `should equal` MusicDirectoryChild(id = "4844", parent = "4836", isDir = false, title = "Crash", album = "12 Stones", artist = "12 Stones", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt index fff9fe29..eb541089 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -29,16 +29,16 @@ class SubsonicApiGetPlaylistTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.playlist) { - id `should equal to` "0" - name `should equal to` "Aug 27, 2017 11:17 AM" - owner `should equal to` "admin" - public `should equal to` false - songCount `should equal to` 16 - duration `should equal to` 3573 + id `should be equal to` "0" + name `should be equal to` "Aug 27, 2017 11:17 AM" + owner `should be equal to` "admin" + public `should be equal to` false + songCount `should be equal to` 16 + duration `should be equal to` 3573 created `should equal` parseDate("2017-08-27T11:17:26.216Z") changed `should equal` parseDate("2017-08-27T11:17:26.218Z") - coverArt `should equal to` "pl-0" - entriesList.size `should equal to` 2 + coverArt `should be equal to` "pl-0" + entriesList.size `should be equal to` 2 entriesList[1] `should equal` MusicDirectoryChild(id = "4215", parent = "4186", isDir = false, title = "Going to Hell", album = "Going to Hell", artist = "The Pretty Reckless", track = 2, year = 2014, diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt index e55df742..0607d3b7 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPlaylistsTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -28,7 +28,7 @@ class SubsonicApiGetPlaylistsTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.playlists) { - size `should equal to` 1 + size `should be equal to` 1 this[0] `should equal` Playlist(id = "0", name = "Aug 27, 2017 11:17 AM", owner = "admin", public = false, songCount = 16, duration = 3573, comment = "Some comment", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt index 1420f58a..d6c55519 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetPodcastsTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -28,19 +28,19 @@ class SubsonicApiGetPodcastsTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) val podcastChannelsList = response.body()!!.podcastChannels - podcastChannelsList.size `should equal to` 1 + podcastChannelsList.size `should be equal to` 1 with(podcastChannelsList[0]) { - id `should equal to` "2" - url `should equal to` "http://feeds.codenewbie.org/cnpodcast.xml" - title `should equal to` "CodeNewbie" - description `should equal to` "Stories and interviews from people on their coding " + + id `should be equal to` "2" + url `should be equal to` "http://feeds.codenewbie.org/cnpodcast.xml" + title `should be equal to` "CodeNewbie" + description `should be equal to` "Stories and interviews from people on their coding " + "journey." - coverArt `should equal to` "pod-2" - originalImageUrl `should equal to` "http://codenewbie.blubrry.com/wp-content/uploads/" + - "powerpress/220808.jpg" - status `should equal to` "completed" - errorMessage `should equal to` "" - episodeList.size `should equal to` 10 + coverArt `should be equal to` "pod-2" + originalImageUrl `should be equal to` "http://codenewbie.blubrry.com/wp-content/" + + "uploads/powerpress/220808.jpg" + status `should be equal to` "completed" + errorMessage `should be equal to` "" + episodeList.size `should be equal to` 10 episodeList[0] `should equal` MusicDirectoryChild(id = "148", parent = "9959", isDir = false, title = "S1:EP3 – How to teach yourself computer science (Vaidehi Joshi)", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetRandomSongsTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetRandomSongsTest.kt index eec95522..4257b5e1 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetRandomSongsTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetRandomSongsTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild @@ -26,7 +26,7 @@ class SubsonicApiGetRandomSongsTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.songsList) { - size `should equal to` 3 + size `should be equal to` 3 this[1] `should equal` MusicDirectoryChild(id = "3061", parent = "3050", isDir = false, title = "Sure as Hell", album = "Who Are You Now?", artist = "This Providence", track = 1, year = 2009, genre = "Indie Rock", coverArt = "3050", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt index dc791aa8..c7d953d2 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSharesTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild @@ -25,19 +25,19 @@ class SubsonicApiGetSharesTest : SubsonicAPIClientTest() { val response = client.api.getShares().execute() assertResponseSuccessful(response) - response.body()!!.shares.size `should equal to` 1 + response.body()!!.shares.size `should be equal to` 1 with(response.body()!!.shares[0]) { - id `should equal to` "0" - url `should equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1" + + id `should be equal to` "0" + url `should be equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1" + "NiJ9.eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8" + "hJ692UxorHdHWFU2RB-fMCmCA4IJ_dTw" - username `should equal to` "admin" + username `should be equal to` "admin" created `should equal` parseDate("2017-11-07T21:33:51.748Z") expires `should equal` parseDate("2018-11-07T21:33:51.748Z") lastVisited `should equal` parseDate("2018-11-07T21:33:51.748Z") - visitCount `should equal to` 0 - description `should equal to` "Awesome link!" - items.size `should equal to` 1 + visitCount `should be equal to` 0 + description `should be equal to` "Awesome link!" + items.size `should be equal to` 1 items[0] `should equal` MusicDirectoryChild(id = "4212", parent = "4186", isDir = false, title = "Heaven Knows", album = "Going to Hell", artist = "The Pretty Reckless", track = 3, year = 2014, genre = "Hard Rock", coverArt = "4186", size = 9025090, diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSongsByGenreTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSongsByGenreTest.kt index a3d474fc..c5446e14 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSongsByGenreTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetSongsByGenreTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild @@ -25,7 +25,7 @@ class SubsonicApiGetSongsByGenreTest : SubsonicAPIClientTest() { val response = client.api.getSongsByGenre("Trance").execute() assertResponseSuccessful(response) - response.body()!!.songsList.size `should equal to` 2 + response.body()!!.songsList.size `should be equal to` 2 with(response.body()!!.songsList) { this[0] `should equal` MusicDirectoryChild(id = "575", parent = "576", isDir = false, title = "Time Machine (Vadim Zhukov Remix)", album = "668", 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 index a77ad81e..3b634ca6 100644 --- 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 @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.Artist @@ -29,7 +29,7 @@ class SubsonicApiGetStarred2Test : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.starred2) { albumList `should equal` emptyList() - artistList.size `should equal to` 1 + artistList.size `should be 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() diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt index 8a41f90c..30f17cd7 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetStarredTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.Artist @@ -28,7 +28,7 @@ class SubsonicApiGetStarredTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.starred) { albumList `should equal` emptyList() - artistList.size `should equal to` 1 + artistList.size `should be 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() diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt index 709c0de0..da14d8d2 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.User @@ -26,23 +26,23 @@ class SubsonicApiGetUserTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.user) { - username `should equal to` "GodOfUniverse" - email `should equal to` "some.mail@example.com" - scrobblingEnabled `should equal to` false - adminRole `should equal to` true - settingsRole `should equal to` true - downloadRole `should equal to` true - uploadRole `should equal to` true - playlistRole `should equal to` true - coverArtRole `should equal to` true - commentRole `should equal to` true - podcastRole `should equal to` true - streamRole `should equal to` true - jukeboxRole `should equal to` true - shareRole `should equal to` true - videoConverstionRole `should equal to` false - folderList.size `should equal to` 1 - folderList[0] `should equal to` 0 + username `should be equal to` "GodOfUniverse" + email `should be equal to` "some.mail@example.com" + scrobblingEnabled `should be equal to` false + adminRole `should be equal to` true + settingsRole `should be equal to` true + downloadRole `should be equal to` true + uploadRole `should be equal to` true + playlistRole `should be equal to` true + coverArtRole `should be equal to` true + commentRole `should be equal to` true + podcastRole `should be equal to` true + streamRole `should be equal to` true + jukeboxRole `should be equal to` true + shareRole `should be equal to` true + videoConverstionRole `should be equal to` false + folderList.size `should be equal to` 1 + folderList[0] `should be equal to` 0 } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt index d11e7d58..dfd6321c 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetVideosListTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild @@ -26,7 +26,7 @@ class SubsonicApiGetVideosListTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.videosList) { - size `should equal to` 1 + size `should be equal to` 1 this[0] `should equal` MusicDirectoryChild(id = "10402", parent = "10401", isDir = false, title = "MVI_0512", album = "Incoming", size = 21889646, contentType = "video/avi", suffix = "avi", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiJukeboxControlTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiJukeboxControlTest.kt index 70f83daa..d047a2f7 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiJukeboxControlTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiJukeboxControlTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.JukeboxAction @@ -30,10 +30,10 @@ class SubsonicApiJukeboxControlTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.jukebox) { - currentIndex `should equal to` 94 - playing `should equal to` true - gain `should equal to` 0.32f - position `should equal to` 3 + currentIndex `should be equal to` 94 + playing `should be equal to` true + gain `should be equal to` 0.32f + position `should be equal to` 3 playlistEntries `should equal` emptyList() } } @@ -46,11 +46,11 @@ class SubsonicApiJukeboxControlTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.jukebox) { - currentIndex `should equal to` 887 - playing `should equal to` false - gain `should equal to` 0.88f - position `should equal to` 2 - playlistEntries.size `should equal to` 2 + currentIndex `should be equal to` 887 + playing `should be equal to` false + gain `should be equal to` 0.88f + position `should be equal to` 2 + playlistEntries.size `should be equal to` 2 playlistEntries[1] `should equal` MusicDirectoryChild(id = "4215", parent = "4186", isDir = false, title = "Going to Hell", album = "Going to Hell", artist = "The Pretty Reckless", track = 2, year = 2014, genre = "Hard Rock", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt index eacf7eb0..e20ff06f 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -30,9 +30,9 @@ class SubsonicApiSearchTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.searchResult) { - offset `should equal to` 10 - totalHits `should equal to` 53 - matchList.size `should equal to` 1 + offset `should be equal to` 10 + totalHits `should be equal to` 53 + matchList.size `should be equal to` 1 matchList[0] `should equal` MusicDirectoryChild(id = "5831", parent = "5766", isDir = false, title = "You'll Be Under My Wheels", album = "Need for Speed Most Wanted", artist = "The Prodigy", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt index 77fe806d..8b914571 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchThreeTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -31,16 +31,16 @@ class SubsonicApiSearchThreeTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.searchResult) { - artistList.size `should equal to` 1 + artistList.size `should be equal to` 1 artistList[0] `should equal` Artist(id = "505", name = "The Prodigy", coverArt = "ar-505", albumCount = 5) - albumList.size `should equal to` 1 + albumList.size `should be equal to` 1 albumList[0] `should equal` Album(id = "855", name = "Always Outnumbered, Never Outgunned", artist = "The Prodigy", artistId = "505", coverArt = "al-855", songCount = 12, duration = 3313, created = parseDate("2016-10-23T20:57:27.000Z"), year = 2004, genre = "Electronic") - songList.size `should equal to` 1 + songList.size `should be equal to` 1 songList[0] `should equal` MusicDirectoryChild(id = "5831", parent = "5766", isDir = false, title = "You'll Be Under My Wheels", album = "Need for Speed Most Wanted", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt index 38e5bb3b..06c7b773 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTwoTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -30,15 +30,15 @@ class SubsonicApiSearchTwoTest : SubsonicAPIClientTest() { assertResponseSuccessful(response) with(response.body()!!.searchResult) { - artistList.size `should equal to` 1 + artistList.size `should be equal to` 1 artistList[0] `should equal` Artist(id = "522", name = "The Prodigy") - albumList.size `should equal to` 1 + albumList.size `should be equal to` 1 albumList[0] `should equal` MusicDirectoryChild(id = "8867", parent = "522", isDir = true, title = "Always Outnumbered, Never Outgunned", album = "Always Outnumbered, Never Outgunned", artist = "The Prodigy", year = 2004, genre = "Electronic", coverArt = "8867", playCount = 0, created = parseDate("2016-10-23T20:57:27.000Z")) - songList.size `should equal to` 1 + songList.size `should be equal to` 1 songList[0] `should equal` MusicDirectoryChild(id = "5831", parent = "5766", isDir = false, title = "You'll Be Under My Wheels", album = "Need for Speed Most Wanted", diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt index 730ee8a1..34bcf3c8 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt @@ -1,8 +1,8 @@ package org.moire.ultrasonic.api.subsonic import okhttp3.mockwebserver.MockResponse +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should be` -import org.amshove.kluent.`should equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not be` import org.junit.Test @@ -19,7 +19,7 @@ class SubsonicApiStreamTest : SubsonicAPIClientTest() { with(response) { stream `should be` null - responseHttpCode `should equal to` 200 + responseHttpCode `should be equal to` 200 apiError `should equal` SubsonicError.RequestedDataWasNotFound } } @@ -33,7 +33,7 @@ class SubsonicApiStreamTest : SubsonicAPIClientTest() { with(response) { stream `should be` null - responseHttpCode `should equal to` httpErrorCode + responseHttpCode `should be equal to` httpErrorCode apiError `should be` null } } @@ -46,11 +46,11 @@ class SubsonicApiStreamTest : SubsonicAPIClientTest() { val response = client.stream("some-id") with(response) { - responseHttpCode `should equal to` 200 + responseHttpCode `should be equal to` 200 apiError `should be` null stream `should not be` null val expectedContent = mockWebServerRule.loadJsonResponse("ping_ok.json") - stream!!.bufferedReader().readText() `should equal to` expectedContent + stream!!.bufferedReader().readText() `should be equal to` expectedContent } } diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/RangeHeaderInterceptorTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/RangeHeaderInterceptorTest.kt index e458fc0d..bbfc0b3a 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/RangeHeaderInterceptorTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/RangeHeaderInterceptorTest.kt @@ -2,8 +2,8 @@ package org.moire.ultrasonic.api.subsonic.interceptors import okhttp3.Interceptor import okhttp3.mockwebserver.MockResponse +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should contain` -import org.amshove.kluent.`should equal to` import org.amshove.kluent.`should not contain` import org.junit.Test @@ -27,7 +27,7 @@ class RangeHeaderInterceptorTest : BaseInterceptorTest() { val executedRequest = mockWebServerRule.mockWebServer.takeRequest() executedRequest.headers.names() `should contain` "Range" - executedRequest.headers["Range"]!! `should equal to` "bytes=$offset-" + executedRequest.headers["Range"]!! `should be equal to` "bytes=$offset-" } @Test @@ -54,6 +54,6 @@ class RangeHeaderInterceptorTest : BaseInterceptorTest() { val executedRequest = mockWebServerRule.mockWebServer.takeRequest() executedRequest.headers.names() `should contain` "Range" - executedRequest.headers["Range"]!! `should equal to` "bytes=$offset-" + executedRequest.headers["Range"]!! `should be equal to` "bytes=$offset-" } } diff --git a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/models/AlbumListTypeTest.kt b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/models/AlbumListTypeTest.kt index ef0948d7..b072d646 100644 --- a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/models/AlbumListTypeTest.kt +++ b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/models/AlbumListTypeTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic.models -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should throw` import org.junit.Test @@ -36,6 +36,6 @@ class AlbumListTypeTest { @Test fun `Should return type name for toString call`() { - AlbumListType.STARRED.typeName `should equal to` AlbumListType.STARRED.toString() + AlbumListType.STARRED.typeName `should be equal to` AlbumListType.STARRED.toString() } } diff --git a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponseTest.kt b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponseTest.kt index ee3c0253..f09bf7d5 100644 --- a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponseTest.kt +++ b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponseTest.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic.response -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.junit.Test import org.moire.ultrasonic.api.subsonic.SubsonicError.RequestedDataWasNotFound @@ -11,26 +11,26 @@ class StreamResponseTest { @Test fun `Should have error if subsonic error is not null`() { StreamResponse(apiError = RequestedDataWasNotFound, responseHttpCode = 200) - .hasError() `should equal to` true + .hasError() `should be equal to` true } @Test fun `Should have error if http error is greater then 300`() { - StreamResponse(responseHttpCode = 301).hasError() `should equal to` true + StreamResponse(responseHttpCode = 301).hasError() `should be equal to` true } @Test fun `Should have error of http error code is lower then 200`() { - StreamResponse(responseHttpCode = 199).hasError() `should equal to` true + StreamResponse(responseHttpCode = 199).hasError() `should be equal to` true } @Test fun `Should not have error if http code is 200`() { - StreamResponse(responseHttpCode = 200).hasError() `should equal to` false + StreamResponse(responseHttpCode = 200).hasError() `should be equal to` false } @Test fun `Should not have error if http code is 300`() { - StreamResponse(responseHttpCode = 300).hasError() `should equal to` false + StreamResponse(responseHttpCode = 300).hasError() `should be equal to` false } } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIAlbumConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIAlbumConverterTest.kt index 64adb575..222b05b9 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIAlbumConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIAlbumConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.Album @@ -47,7 +47,7 @@ class APIAlbumConverterTest { with(convertedEntity) { name `should equal` null - getChildren().size `should equal to` entity.songList.size + getChildren().size `should be equal to` entity.songList.size getChildren()[0] `should equal` entity.songList[0].toDomainEntity() } } @@ -59,7 +59,7 @@ class APIAlbumConverterTest { val convertedList = entityList.toDomainEntityList() with(convertedList) { - size `should equal to` entityList.size + size `should be equal to` entityList.size forEachIndexed { index, entry -> entry `should equal` entityList[index].toDomainEntity() } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIBookmarkConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIBookmarkConverterTest.kt index 9de472da..7fea260b 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIBookmarkConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIBookmarkConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.Bookmark @@ -21,7 +21,7 @@ class APIBookmarkConverterTest { val domainEntity = entity.toDomainEntity() with(domainEntity) { - position `should equal to` entity.position.toInt() + position `should be equal to` entity.position.toInt() username `should equal` entity.username comment `should equal` entity.comment created `should equal` entity.created?.time @@ -36,7 +36,7 @@ class APIBookmarkConverterTest { val domainEntitiesList = entitiesList.toDomainEntitiesList() - domainEntitiesList.size `should equal to` entitiesList.size + domainEntitiesList.size `should be equal to` entitiesList.size domainEntitiesList.forEachIndexed({ index, bookmark -> bookmark `should equal` entitiesList[index].toDomainEntity() }) diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIChatMessageConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIChatMessageConverterTest.kt index ee462a89..3ccb81b7 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIChatMessageConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIChatMessageConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.ChatMessage @@ -31,7 +31,7 @@ class APIChatMessageConverterTest { val domainEntitiesList = entitiesList.toDomainEntitiesList() with(domainEntitiesList) { - size `should equal to` entitiesList.size + size `should be equal to` entitiesList.size forEachIndexed { index, chatMessage -> chatMessage `should equal` entitiesList[index].toDomainEntity() } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIIndexesConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIIndexesConverterTest.kt index d51522a4..9314ad60 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIIndexesConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIIndexesConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.Artist @@ -30,9 +30,9 @@ class APIIndexesConverterTest { val expectedArtists = (artistsA + artistsT).map { it.toDomainEntity() }.toMutableList() with(convertedEntity) { - lastModified `should equal to` entity.lastModified - ignoredArticles `should equal to` entity.ignoredArticles - artists.size `should equal to` expectedArtists.size + lastModified `should be equal to` entity.lastModified + ignoredArticles `should be equal to` entity.ignoredArticles + artists.size `should be equal to` expectedArtists.size artists `should equal` expectedArtists shortcuts `should equal` artistsA.map { it.toDomainEntity() }.toMutableList() } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIJukeboxConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIJukeboxConverterTest.kt index d6498860..95755c55 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIJukeboxConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIJukeboxConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.JukeboxStatus @@ -20,7 +20,7 @@ class APIJukeboxConverterTest { with(convertedEntity) { currentPlayingIndex `should equal` entity.currentIndex gain `should equal` entity.gain - isPlaying `should equal to` entity.playing + isPlaying `should be equal to` entity.playing positionSeconds `should equal` entity.position } } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIMusicDirectoryConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIMusicDirectoryConverterTest.kt index 9e8f80c2..3e4a0f1a 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIMusicDirectoryConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIMusicDirectoryConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectory @@ -23,7 +23,7 @@ class APIMusicDirectoryConverterTest { with(convertedEntity) { name `should equal` entity.name - getAllChild().size `should equal to` entity.childList.size + getAllChild().size `should be equal to` entity.childList.size getAllChild() `should equal` entity.childList .map { it.toDomainEntity() }.toMutableList() } @@ -46,7 +46,7 @@ class APIMusicDirectoryConverterTest { with(convertedEntity) { id `should equal` entity.id parent `should equal` entity.parent - isDirectory `should equal to` entity.isDir + isDirectory `should be equal to` entity.isDir title `should equal` entity.title album `should equal` entity.album albumId `should equal` entity.albumId @@ -64,9 +64,9 @@ class APIMusicDirectoryConverterTest { duration `should equal` entity.duration bitRate `should equal` entity.bitRate path `should equal` entity.path - isVideo `should equal to` entity.isVideo + isVideo `should be equal to` entity.isVideo created `should equal` entity.created?.time - starred `should equal to` (entity.starred != null) + starred `should be equal to` (entity.starred != null) discNumber `should equal` entity.discNumber type `should equal` entity.type } @@ -91,7 +91,7 @@ class APIMusicDirectoryConverterTest { val domainList = entitiesList.toDomainEntityList() - domainList.size `should equal to` entitiesList.size + domainList.size `should be equal to` entitiesList.size domainList.forEachIndexed { index, entry -> entry `should equal` entitiesList[index].toDomainEntity() } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIMusicFolderConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIMusicFolderConverterTest.kt index 7c66d464..fdae4ec8 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIMusicFolderConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIMusicFolderConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicFolder @@ -16,8 +16,8 @@ class APIMusicFolderConverterTest { val convertedEntity = entity.toDomainEntity() - convertedEntity.name `should equal to` entity.name - convertedEntity.id `should equal to` entity.id + convertedEntity.name `should be equal to` entity.name + convertedEntity.id `should be equal to` entity.id } @Test @@ -29,11 +29,11 @@ class APIMusicFolderConverterTest { val convertedList = entityList.toDomainEntityList() with(convertedList) { - size `should equal to` entityList.size - this[0].id `should equal to` entityList[0].id - this[0].name `should equal to` entityList[0].name - this[1].id `should equal to` entityList[1].id - this[1].name `should equal to` entityList[1].name + size `should be equal to` entityList.size + this[0].id `should be equal to` entityList[0].id + this[0].name `should be equal to` entityList[0].name + this[1].id `should be equal to` entityList[1].id + this[1].name `should be equal to` entityList[1].name } } } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIPlaylistConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIPlaylistConverterTest.kt index a99a288b..88897d3f 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIPlaylistConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIPlaylistConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild @@ -24,7 +24,7 @@ class APIPlaylistConverterTest { with(convertedEntity) { name `should equal` entity.name - getAllChild().size `should equal to` entity.entriesList.size + getAllChild().size `should be equal to` entity.entriesList.size getAllChild()[0] `should equal` entity.entriesList[0].toDomainEntity() getAllChild()[1] `should equal` entity.entriesList[1].toDomainEntity() } @@ -40,13 +40,13 @@ class APIPlaylistConverterTest { val convertedEntity = entity.toDomainEntity() with(convertedEntity) { - id `should equal to` entity.id - name `should equal to` entity.name - comment `should equal to` entity.comment - owner `should equal to` entity.owner + id `should be equal to` entity.id + name `should be equal to` entity.name + comment `should be equal to` entity.comment + owner `should be equal to` entity.owner public `should equal` entity.public - songCount `should equal to` entity.songCount.toString() - created `should equal to` playlistDateFormat.format(entity.created?.time) + songCount `should be equal to` entity.songCount.toString() + created `should be equal to` playlistDateFormat.format(entity.created?.time) } } @@ -57,7 +57,7 @@ class APIPlaylistConverterTest { val convertedList = entitiesList.toDomainEntitiesList() with(convertedList) { - size `should equal to` entitiesList.size + size `should be equal to` entitiesList.size this[0] `should equal` entitiesList[0].toDomainEntity() } } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIPodcastConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIPodcastConverterTest.kt index dcc49b47..46d384b8 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIPodcastConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIPodcastConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.PodcastChannel @@ -37,7 +37,7 @@ class APIPodcastConverterTest { val converted = entitiesList.toDomainEntitiesList() with(converted) { - size `should equal to` entitiesList.size + size `should be equal to` entitiesList.size this[0] `should equal` entitiesList[0].toDomainEntity() } } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APISearchConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APISearchConverterTest.kt index 5e3ce2cf..8c69e95e 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APISearchConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APISearchConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.amshove.kluent.`should not equal` import org.junit.Test @@ -27,10 +27,10 @@ class APISearchConverterTest { with(convertedEntity) { albums `should not equal` null - albums.size `should equal to` 0 + albums.size `should be equal to` 0 artists `should not equal` null - artists.size `should equal to` 0 - songs.size `should equal to` entity.matchList.size + artists.size `should be equal to` 0 + songs.size `should be equal to` entity.matchList.size songs[0] `should equal` entity.matchList[0].toDomainEntity() } } @@ -48,11 +48,11 @@ class APISearchConverterTest { val convertedEntity = entity.toDomainEntity() with(convertedEntity) { - artists.size `should equal to` entity.artistList.size + artists.size `should be equal to` entity.artistList.size artists[0] `should equal` entity.artistList[0].toDomainEntity() - albums.size `should equal to` entity.albumList.size + albums.size `should be equal to` entity.albumList.size albums[0] `should equal` entity.albumList[0].toDomainEntity() - songs.size `should equal to` entity.songList.size + songs.size `should be equal to` entity.songList.size songs[0] `should equal` entity.songList[0].toDomainEntity() } } @@ -68,11 +68,11 @@ class APISearchConverterTest { val convertedEntity = entity.toDomainEntity() with(convertedEntity) { - artists.size `should equal to` entity.artistList.size + artists.size `should be equal to` entity.artistList.size artists[0] `should equal` entity.artistList[0].toDomainEntity() - albums.size `should equal to` entity.albumList.size + albums.size `should be equal to` entity.albumList.size albums[0] `should equal` entity.albumList[0].toDomainEntity() - songs.size `should equal to` entity.songList.size + songs.size `should be equal to` entity.songList.size songs[0] `should equal` entity.songList[0].toDomainEntity() } } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIShareConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIShareConverterTest.kt index 623af2f5..53a99962 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIShareConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIShareConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild @@ -47,7 +47,7 @@ class APIShareConverterTest { val domainEntityList = entityList.toDomainEntitiesList() - domainEntityList.size `should equal to` entityList.size + domainEntityList.size `should be equal to` entityList.size domainEntityList[0] `should equal` entityList[0].toDomainEntity() domainEntityList[1] `should equal` entityList[1].toDomainEntity() } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIUserConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIUserConverterTest.kt index 0fdff320..3dfb19a8 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIUserConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/APIUserConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.User @@ -19,19 +19,19 @@ class APIUserConverterTest { val domainEntity = entity.toDomainEntity() with(domainEntity) { - adminRole `should equal to` entity.adminRole - commentRole `should equal to` entity.commentRole - coverArtRole `should equal to` entity.coverArtRole - downloadRole `should equal to` entity.downloadRole + adminRole `should be equal to` entity.adminRole + commentRole `should be equal to` entity.commentRole + coverArtRole `should be equal to` entity.coverArtRole + downloadRole `should be equal to` entity.downloadRole email `should equal` entity.email - jukeboxRole `should equal to` entity.jukeboxRole - playlistRole `should equal to` entity.playlistRole - podcastRole `should equal to` entity.podcastRole - scrobblingEnabled `should equal to` entity.scrobblingEnabled - settingsRole `should equal to` entity.settingsRole - shareRole `should equal to` entity.shareRole - streamRole `should equal to` entity.streamRole - uploadRole `should equal to` entity.uploadRole + jukeboxRole `should be equal to` entity.jukeboxRole + playlistRole `should be equal to` entity.playlistRole + podcastRole `should be equal to` entity.podcastRole + scrobblingEnabled `should be equal to` entity.scrobblingEnabled + settingsRole `should be equal to` entity.settingsRole + shareRole `should be equal to` entity.shareRole + streamRole `should be equal to` entity.streamRole + uploadRole `should be equal to` entity.uploadRole userName `should equal` entity.username } } diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/ApiGenreConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/ApiGenreConverterTest.kt index 8552bf02..0f1a0bfe 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/ApiGenreConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/domain/ApiGenreConverterTest.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.domain -import org.amshove.kluent.`should equal to` +import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.api.subsonic.models.Genre @@ -31,7 +31,7 @@ class ApiGenreConverterTest { val domainEntitiesList = entitiesList.toDomainEntityList() - domainEntitiesList.size `should equal to` entitiesList.size + domainEntitiesList.size `should be equal to` entitiesList.size domainEntitiesList[0] `should equal` entitiesList[0].toDomainEntity() domainEntitiesList[1] `should equal` entitiesList[1].toDomainEntity() } From aaa04bc84949d944192f107c11dcd3f6bbff2e91 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 24 Mar 2018 19:39:08 +0100 Subject: [PATCH 08/14] Update detekt to 1.0.0.RC6-4 version. Signed-off-by: Yahor Berdnikau --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 52719111..6f40df7c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -10,7 +10,7 @@ ext.versions = [ androidTools : "3.0.1", ktlint : "0.15.1", ktlintGradle : "3.0.1", - detekt : "1.0.0.RC6-3", + detekt : "1.0.0.RC6-4", jacoco : "0.7.9", jacocoAndroid : "0.1.2", From 46922d98ae4475248b417c5720cef6868f1f4c5a Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 24 Mar 2018 19:40:08 +0100 Subject: [PATCH 09/14] Update ktlintGradle to 3.2.0 version. Signed-off-by: Yahor Berdnikau --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 6f40df7c..80d132eb 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -9,7 +9,7 @@ ext.versions = [ androidTools : "3.0.1", ktlint : "0.15.1", - ktlintGradle : "3.0.1", + ktlintGradle : "3.2.0", detekt : "1.0.0.RC6-4", jacoco : "0.7.9", jacocoAndroid : "0.1.2", From eb09e9b4170b9297b9761c861a22876ed91b90ae Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 24 Mar 2018 19:47:55 +0100 Subject: [PATCH 10/14] Update Ktlint to 0.20.0 version. Signed-off-by: Yahor Berdnikau --- .../ultrasonic/cache/PermanentFileStorage.kt | 16 +- .../cache/serializers/ArtistSerializer.kt | 12 +- .../cache/serializers/IndexesSerializer.kt | 12 +- .../serializers/MusicFolderSerializer.kt | 12 +- dependencies.gradle | 2 +- .../org/moire/ultrasonic/domain/Artist.kt | 12 +- .../org/moire/ultrasonic/domain/Bookmark.kt | 12 +- .../moire/ultrasonic/domain/ChatMessage.kt | 6 +- .../org/moire/ultrasonic/domain/Genre.kt | 4 +- .../org/moire/ultrasonic/domain/Indexes.kt | 8 +- .../moire/ultrasonic/domain/JukeboxStatus.kt | 8 +- .../org/moire/ultrasonic/domain/Lyrics.kt | 6 +- .../moire/ultrasonic/domain/MusicDirectory.kt | 61 ++--- .../moire/ultrasonic/domain/MusicFolder.kt | 4 +- .../org/moire/ultrasonic/domain/Playlist.kt | 14 +- .../ultrasonic/domain/PodcastsChannel.kt | 10 +- .../moire/ultrasonic/domain/SearchCriteria.kt | 8 +- .../moire/ultrasonic/domain/SearchResult.kt | 6 +- .../org/moire/ultrasonic/domain/Share.kt | 18 +- .../org/moire/ultrasonic/domain/Version.kt | 2 +- .../api/subsonic/CommonFunctions.kt | 14 +- .../api/subsonic/SubsonicApiSSLTest.kt | 8 +- .../api/subsonic/ApiNotSupportedException.kt | 4 +- .../api/subsonic/ApiVersionCheckWrapper.kt | 167 +++++++------ .../api/subsonic/SubsonicAPIClient.kt | 18 +- .../api/subsonic/SubsonicAPIDefinition.kt | 223 ++++++++++-------- .../api/subsonic/SubsonicAPIVersions.kt | 6 +- .../interceptors/ProxyPasswordInterceptor.kt | 8 +- .../interceptors/VersionInterceptor.kt | 5 +- .../ultrasonic/api/subsonic/models/Album.kt | 23 +- .../ultrasonic/api/subsonic/models/Artist.kt | 16 +- .../api/subsonic/models/Bookmark.kt | 13 +- .../api/subsonic/models/ChatMessage.kt | 7 +- .../ultrasonic/api/subsonic/models/Genre.kt | 8 +- .../ultrasonic/api/subsonic/models/Index.kt | 8 +- .../ultrasonic/api/subsonic/models/Indexes.kt | 14 +- .../api/subsonic/models/JukeboxStatus.kt | 11 +- .../ultrasonic/api/subsonic/models/License.kt | 9 +- .../ultrasonic/api/subsonic/models/Lyrics.kt | 7 +- .../api/subsonic/models/MusicDirectory.kt | 20 +- .../subsonic/models/MusicDirectoryChild.kt | 68 +++--- .../api/subsonic/models/Playlist.kt | 22 +- .../api/subsonic/models/PodcastChannel.kt | 19 +- .../api/subsonic/models/SearchResult.kt | 7 +- .../api/subsonic/models/SearchThreeResult.kt | 6 +- .../api/subsonic/models/SearchTwoResult.kt | 6 +- .../ultrasonic/api/subsonic/models/Share.kt | 19 +- .../ultrasonic/api/subsonic/models/User.kt | 33 +-- .../subsonic/response/BookmarksResponse.kt | 10 +- .../subsonic/response/ChatMessagesResponse.kt | 10 +- .../api/subsonic/response/GenresResponse.kt | 8 +- .../response/GetAlbumList2Response.kt | 12 +- .../subsonic/response/GetAlbumListResponse.kt | 12 +- .../api/subsonic/response/GetAlbumResponse.kt | 10 +- .../subsonic/response/GetArtistResponse.kt | 11 +- .../subsonic/response/GetArtistsResponse.kt | 11 +- .../subsonic/response/GetIndexesResponse.kt | 11 +- .../subsonic/response/GetLyricsResponse.kt | 11 +- .../response/GetMusicDirectoryResponse.kt | 13 +- .../subsonic/response/GetPlaylistResponse.kt | 9 +- .../subsonic/response/GetPlaylistsResponse.kt | 12 +- .../subsonic/response/GetPodcastsResponse.kt | 10 +- .../response/GetRandomSongsResponse.kt | 12 +- .../response/GetSongsByGenreResponse.kt | 10 +- .../subsonic/response/GetStarredResponse.kt | 11 +- .../response/GetStarredTwoResponse.kt | 11 +- .../api/subsonic/response/GetUserResponse.kt | 9 +- .../api/subsonic/response/JukeboxResponse.kt | 11 +- .../api/subsonic/response/LicenseResponse.kt | 11 +- .../subsonic/response/MusicFoldersResponse.kt | 12 +- .../api/subsonic/response/SearchResponse.kt | 11 +- .../subsonic/response/SearchThreeResponse.kt | 10 +- .../subsonic/response/SearchTwoResponse.kt | 10 +- .../api/subsonic/response/SharesResponse.kt | 9 +- .../api/subsonic/response/StreamResponse.kt | 8 +- .../api/subsonic/response/SubsonicResponse.kt | 8 +- .../api/subsonic/response/VideosResponse.kt | 10 +- 77 files changed, 722 insertions(+), 583 deletions(-) diff --git a/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt b/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt index dbfa9658..767e23eb 100644 --- a/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt +++ b/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt @@ -19,9 +19,9 @@ internal const val STORAGE_DIR_NAME = "persistent_storage" * Look at [org.moire.ultrasonic.cache.serializers] package for available [DomainEntitySerializer]s. */ class PermanentFileStorage( - private val directories: Directories, - private val serverId: String, - private val debug: Boolean = false + private val directories: Directories, + private val serverId: String, + private val debug: Boolean = false ) { private val serializationContext = object : SerializationContext { override fun isDebug(): Boolean = debug @@ -34,9 +34,9 @@ class PermanentFileStorage( * Stores given [objectToStore] using [name] as a key and [objectSerializer] as serializer. */ fun store( - name: String, - objectToStore: T, - objectSerializer: DomainEntitySerializer + name: String, + objectToStore: T, + objectSerializer: DomainEntitySerializer ) { val storeFile = getFile(name) if (!storeFile.exists()) storeFile.createNewFile() @@ -47,8 +47,8 @@ class PermanentFileStorage( * Loads object with [name] key using [objectDeserializer] deserializer. */ fun load( - name: String, - objectDeserializer: DomainEntitySerializer + name: String, + objectDeserializer: DomainEntitySerializer ): T? { val storeFile = getFile(name) if (!storeFile.exists()) return null diff --git a/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializer.kt b/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializer.kt index 751a97d5..d7bd217a 100644 --- a/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializer.kt +++ b/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializer.kt @@ -15,9 +15,9 @@ private const val SERIALIZER_VERSION = 1 private val artistSerializer get() = object : ObjectSerializer(SERIALIZER_VERSION) { override fun serializeObject( - context: SerializationContext, - output: SerializerOutput>, - item: Artist + context: SerializationContext, + output: SerializerOutput>, + item: Artist ) { output.writeString(item.id) .writeString(item.name) @@ -31,9 +31,9 @@ private val artistSerializer get() = object : ObjectSerializer(SERIALIZE } override fun deserializeObject( - context: SerializationContext, - input: SerializerInput, - versionNumber: Int + context: SerializationContext, + input: SerializerInput, + versionNumber: Int ): Artist? { if (versionNumber != SERIALIZER_VERSION) return null diff --git a/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt b/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt index c237be76..8a04f021 100644 --- a/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt +++ b/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt @@ -14,9 +14,9 @@ private const val SERIALIZATION_VERSION = 1 private val indexesSerializer get() = object : ObjectSerializer(SERIALIZATION_VERSION) { override fun serializeObject( - context: SerializationContext, - output: SerializerOutput>, - item: Indexes + context: SerializationContext, + output: SerializerOutput>, + item: Indexes ) { val artistListSerializer = getArtistListSerializer() output.writeLong(item.lastModified) @@ -26,9 +26,9 @@ private val indexesSerializer get() = object : ObjectSerializer(SERIALI } override fun deserializeObject( - context: SerializationContext, - input: SerializerInput, - versionNumber: Int + context: SerializationContext, + input: SerializerInput, + versionNumber: Int ): Indexes? { if (versionNumber != SERIALIZATION_VERSION) return null diff --git a/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt b/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt index c65fabad..1bba19ec 100644 --- a/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt +++ b/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt @@ -15,17 +15,17 @@ private const val SERIALIZATION_VERSION = 1 private val musicFolderSerializer = object : ObjectSerializer(SERIALIZATION_VERSION) { override fun serializeObject( - context: SerializationContext, - output: SerializerOutput>, - item: MusicFolder + context: SerializationContext, + output: SerializerOutput>, + item: MusicFolder ) { output.writeString(item.id).writeString(item.name) } override fun deserializeObject( - context: SerializationContext, - input: SerializerInput, - versionNumber: Int + context: SerializationContext, + input: SerializerInput, + versionNumber: Int ): MusicFolder? { if (versionNumber != SERIALIZATION_VERSION) return null diff --git a/dependencies.gradle b/dependencies.gradle index 80d132eb..6e1e4e57 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -8,7 +8,7 @@ ext.versions = [ gradle : '4.5.1', androidTools : "3.0.1", - ktlint : "0.15.1", + ktlint : "0.20.0", ktlintGradle : "3.2.0", detekt : "1.0.0.RC6-4", jacoco : "0.7.9", diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Artist.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Artist.kt index dd46d415..9da865e5 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Artist.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Artist.kt @@ -3,12 +3,12 @@ package org.moire.ultrasonic.domain import java.io.Serializable data class Artist( - var id: String? = null, - var name: String? = null, - var index: String? = null, - var coverArt: String? = null, - var albumCount: Long? = null, - var closeness: Int = 0 + var id: String? = null, + var name: String? = null, + var index: String? = null, + var coverArt: String? = null, + var albumCount: Long? = null, + var closeness: Int = 0 ) : Serializable { companion object { private const val serialVersionUID = -5790532593784846982L diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Bookmark.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Bookmark.kt index 4e3458db..09329e4d 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Bookmark.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Bookmark.kt @@ -6,12 +6,12 @@ import java.io.Serializable import java.util.Date data class Bookmark( - val position: Int = 0, - val username: String, - val comment: String, - val created: Date? = null, - val changed: Date? = null, - val entry: Entry + val position: Int = 0, + val username: String, + val comment: String, + val created: Date? = null, + val changed: Date? = null, + val entry: Entry ) : Serializable { companion object { private const val serialVersionUID = 8988990025189807803L diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/ChatMessage.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/ChatMessage.kt index 35e112e2..94af0542 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/ChatMessage.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/ChatMessage.kt @@ -3,9 +3,9 @@ package org.moire.ultrasonic.domain import java.io.Serializable data class ChatMessage( - val username: String, - val time: Long, - val message: String + val username: String, + val time: Long, + val message: String ) : Serializable { companion object { private const val serialVersionUID = 496544310289324167L diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Genre.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Genre.kt index c975d437..e80ed2b2 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Genre.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Genre.kt @@ -3,8 +3,8 @@ package org.moire.ultrasonic.domain import java.io.Serializable data class Genre( - val name: String, - val index: String + val name: String, + val index: String ) : Serializable { companion object { private const val serialVersionUID = -3943025175219134028L diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Indexes.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Indexes.kt index 48711c2d..3d5ef194 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Indexes.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Indexes.kt @@ -3,10 +3,10 @@ package org.moire.ultrasonic.domain import java.io.Serializable data class Indexes( - val lastModified: Long, - val ignoredArticles: String, - val shortcuts: MutableList = mutableListOf(), - val artists: MutableList = mutableListOf() + val lastModified: Long, + val ignoredArticles: String, + val shortcuts: MutableList = mutableListOf(), + val artists: MutableList = mutableListOf() ) : Serializable { companion object { private const val serialVersionUID = 8156117238598414701L diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/JukeboxStatus.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/JukeboxStatus.kt index 67b0e8b5..fb99d5ac 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/JukeboxStatus.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/JukeboxStatus.kt @@ -1,8 +1,8 @@ package org.moire.ultrasonic.domain data class JukeboxStatus( - var positionSeconds: Int? = null, - var currentPlayingIndex: Int? = null, - var gain: Float? = null, - var isPlaying: Boolean = false + var positionSeconds: Int? = null, + var currentPlayingIndex: Int? = null, + var gain: Float? = null, + var isPlaying: Boolean = false ) diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Lyrics.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Lyrics.kt index 6c4315f1..7692d7ef 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Lyrics.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Lyrics.kt @@ -4,7 +4,7 @@ package org.moire.ultrasonic.domain * Song lyrics. */ data class Lyrics( - val artist: String? = null, - val title: String? = null, - val text: String? = null + val artist: String? = null, + val title: String? = null, + val text: String? = null ) diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicDirectory.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicDirectory.kt index 6a647026..7475c701 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicDirectory.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicDirectory.kt @@ -25,8 +25,9 @@ class MusicDirectory { @JvmOverloads fun getChildren( - includeDirs: Boolean = true, - includeFiles: Boolean = true): List { + includeDirs: Boolean = true, + includeFiles: Boolean = true + ): List { if (includeDirs && includeFiles) { return children } @@ -35,34 +36,34 @@ class MusicDirectory { } data class Entry( - var id: String? = null, - var parent: String? = null, - var isDirectory: Boolean = false, - var title: String? = null, - var album: String? = null, - var albumId: String? = null, - var artist: String? = null, - var artistId: String? = null, - var track: Int? = 0, - var year: Int? = 0, - var genre: String? = null, - var contentType: String? = null, - var suffix: String? = null, - var transcodedContentType: String? = null, - var transcodedSuffix: String? = null, - var coverArt: String? = null, - var size: Long? = null, - var songCount: Long? = null, - var duration: Int? = null, - var bitRate: Int? = null, - var path: String? = null, - var isVideo: Boolean = false, - var starred: Boolean = false, - var discNumber: Int? = null, - var type: String? = null, - var created: Date? = null, - var closeness: Int = 0, - var bookmarkPosition: Int = 0 + var id: String? = null, + var parent: String? = null, + var isDirectory: Boolean = false, + var title: String? = null, + var album: String? = null, + var albumId: String? = null, + var artist: String? = null, + var artistId: String? = null, + var track: Int? = 0, + var year: Int? = 0, + var genre: String? = null, + var contentType: String? = null, + var suffix: String? = null, + var transcodedContentType: String? = null, + var transcodedSuffix: String? = null, + var coverArt: String? = null, + var size: Long? = null, + var songCount: Long? = null, + var duration: Int? = null, + var bitRate: Int? = null, + var path: String? = null, + var isVideo: Boolean = false, + var starred: Boolean = false, + var discNumber: Int? = null, + var type: String? = null, + var created: Date? = null, + var closeness: Int = 0, + var bookmarkPosition: Int = 0 ) : Serializable { fun setDuration(duration: Long) { this.duration = duration.toInt() diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicFolder.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicFolder.kt index a7e91d27..9a62688b 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicFolder.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicFolder.kt @@ -4,6 +4,6 @@ package org.moire.ultrasonic.domain * Represents a top level directory in which music or other media is stored. */ data class MusicFolder( - val id: String, - val name: String + val id: String, + val name: String ) diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Playlist.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Playlist.kt index 4f8f7925..aed96150 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Playlist.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Playlist.kt @@ -3,13 +3,13 @@ package org.moire.ultrasonic.domain import java.io.Serializable data class Playlist @JvmOverloads constructor( - val id: String, - var name: String, - val owner: String = "", - val comment: String = "", - val songCount: String = "", - val created: String = "", - val public: Boolean? = null + val id: String, + var name: String, + val owner: String = "", + val comment: String = "", + val songCount: String = "", + val created: String = "", + val public: Boolean? = null ) : Serializable { companion object { private const val serialVersionUID = -4160515427075433798L diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/PodcastsChannel.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/PodcastsChannel.kt index 3b6ae96e..9f5ce4c2 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/PodcastsChannel.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/PodcastsChannel.kt @@ -3,11 +3,11 @@ package org.moire.ultrasonic.domain import java.io.Serializable data class PodcastsChannel( - val id: String, - val title: String?, - val url: String?, - val description: String?, - val status: String? + val id: String, + val title: String?, + val url: String?, + val description: String?, + val status: String? ) : Serializable { companion object { private const val serialVersionUID = -4160515427075433798L diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/SearchCriteria.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/SearchCriteria.kt index 336db68d..72f47d45 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/SearchCriteria.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/SearchCriteria.kt @@ -4,8 +4,8 @@ package org.moire.ultrasonic.domain * The criteria for a music search. */ data class SearchCriteria( - val query: String, - val artistCount: Int, - val albumCount: Int, - val songCount: Int + val query: String, + val artistCount: Int, + val albumCount: Int, + val songCount: Int ) diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/SearchResult.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/SearchResult.kt index 738ccfc6..82479b70 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/SearchResult.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/SearchResult.kt @@ -6,7 +6,7 @@ import org.moire.ultrasonic.domain.MusicDirectory.Entry * The result of a search. Contains matching artists, albums and songs. */ data class SearchResult( - val artists: List, - val albums: List, - val songs: List + val artists: List, + val albums: List, + val songs: List ) diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Share.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Share.kt index 896cdb32..fc8d9c72 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Share.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Share.kt @@ -4,15 +4,15 @@ import org.moire.ultrasonic.domain.MusicDirectory.Entry import java.io.Serializable data class Share( - var id: String? = null, - var url: String? = null, - var description: String? = null, - var username: String? = null, - var created: String? = null, - var lastVisited: String? = null, - var expires: String? = null, - var visitCount: Long? = null, - private val entries: MutableList = mutableListOf() + var id: String? = null, + var url: String? = null, + var description: String? = null, + var username: String? = null, + var created: String? = null, + var lastVisited: String? = null, + var expires: String? = null, + var visitCount: Long? = null, + private val entries: MutableList = mutableListOf() ) : Serializable { val name: String? get() = url?.let { urlPattern.matcher(url).replaceFirst("$1") } diff --git a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Version.kt b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Version.kt index 26fabbcd..30827cf1 100644 --- a/domain/src/main/kotlin/org/moire/ultrasonic/domain/Version.kt +++ b/domain/src/main/kotlin/org/moire/ultrasonic/domain/Version.kt @@ -6,7 +6,7 @@ import net.swiftzer.semver.SemVer * Represents the version number of the Subsonic Android app. */ data class Version( - val version: SemVer + val version: SemVer ) : Comparable { override fun compareTo(other: Version): Int { diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt index deca2f70..d4130355 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/CommonFunctions.kt @@ -57,8 +57,10 @@ fun parseDate(dateAsString: String): Calendar { return result } -fun checkErrorCallParsed(mockWebServerRule: MockWebServerRule, - apiRequest: () -> Response): T { +fun checkErrorCallParsed( + mockWebServerRule: MockWebServerRule, + apiRequest: () -> Response +): T { mockWebServerRule.enqueueResponse("request_data_not_found_error_response.json") val response = apiRequest() @@ -77,9 +79,11 @@ fun SubsonicResponse.assertBaseResponseOk() { error `should be` null } -fun MockWebServerRule.assertRequestParam(responseResourceName: String = "ping_ok.json", - expectedParam: String, - apiRequest: () -> Response) { +fun MockWebServerRule.assertRequestParam( + responseResourceName: String = "ping_ok.json", + expectedParam: String, + apiRequest: () -> Response +) { this.enqueueResponse(responseResourceName) apiRequest() diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSSLTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSSLTest.kt index f67ae2e8..fb43dbc1 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSSLTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSSLTest.kt @@ -37,9 +37,11 @@ class SubsonicApiSSLTest { mockWebServer.shutdown() } - private fun createSSLContext(certificatePemStream: InputStream, - certificatePkcs12Stream: InputStream, - password: String): SSLContext { + private fun createSSLContext( + certificatePemStream: InputStream, + certificatePkcs12Stream: InputStream, + password: String + ): SSLContext { var cert: X509Certificate? = null val trustStore = KeyStore.getInstance(KeyStore.getDefaultType()) trustStore.load(null) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/ApiNotSupportedException.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/ApiNotSupportedException.kt index fce439a6..a7191a3a 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/ApiNotSupportedException.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/ApiNotSupportedException.kt @@ -7,5 +7,5 @@ import java.io.IOException * by current server api version. */ class ApiNotSupportedException( - serverApiVersion: SubsonicAPIVersions) - : IOException("Server api $serverApiVersion does not support this call") + serverApiVersion: SubsonicAPIVersions +) : IOException("Server api $serverApiVersion does not support this call") diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/ApiVersionCheckWrapper.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/ApiVersionCheckWrapper.kt index 3f7d998d..e2b6c092 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/ApiVersionCheckWrapper.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/ApiVersionCheckWrapper.kt @@ -43,8 +43,9 @@ import retrofit2.Call * for this call. */ internal class ApiVersionCheckWrapper( - val api: SubsonicAPIDefinition, - var currentApiVersion: SubsonicAPIVersions) : SubsonicAPIDefinition by api { + val api: SubsonicAPIDefinition, + var currentApiVersion: SubsonicAPIVersions +) : SubsonicAPIDefinition by api { override fun getArtists(musicFolderId: String?): Call { checkVersion(V1_8_0) return api.getArtists(musicFolderId) @@ -70,26 +71,30 @@ internal class ApiVersionCheckWrapper( return api.getAlbum(id) } - override fun search2(query: String, - artistCount: Int?, - artistOffset: Int?, - albumCount: Int?, - albumOffset: Int?, - songCount: Int?, - musicFolderId: String?): Call { + override fun search2( + query: String, + artistCount: Int?, + artistOffset: Int?, + albumCount: Int?, + albumOffset: Int?, + songCount: Int?, + musicFolderId: String? + ): Call { checkVersion(V1_4_0) checkParamVersion(musicFolderId, V1_12_0) return api.search2(query, artistCount, artistOffset, albumCount, albumOffset, songCount, musicFolderId) } - override fun search3(query: String, - artistCount: Int?, - artistOffset: Int?, - albumCount: Int?, - albumOffset: Int?, - songCount: Int?, - musicFolderId: String?): Call { + override fun search3( + query: String, + artistCount: Int?, + artistOffset: Int?, + albumCount: Int?, + albumOffset: Int?, + songCount: Int?, + musicFolderId: String? + ): Call { checkVersion(V1_8_0) checkParamVersion(musicFolderId, V1_12_0) return api.search3(query, artistCount, artistOffset, albumCount, albumOffset, @@ -101,9 +106,11 @@ internal class ApiVersionCheckWrapper( return api.getPlaylists(username) } - override fun createPlaylist(id: String?, - name: String?, - songIds: List?): Call { + override fun createPlaylist( + id: String?, + name: String?, + songIds: List? + ): Call { checkVersion(V1_2_0) return api.createPlaylist(id, name, songIds) } @@ -113,12 +120,14 @@ internal class ApiVersionCheckWrapper( return api.deletePlaylist(id) } - override fun updatePlaylist(id: String, - name: String?, - comment: String?, - public: Boolean?, - songIdsToAdd: List?, - songIndexesToRemove: List?): Call { + override fun updatePlaylist( + id: String, + name: String?, + comment: String?, + public: Boolean?, + songIdsToAdd: List?, + songIndexesToRemove: List? + ): Call { checkVersion(V1_8_0) return api.updatePlaylist(id, name, comment, public, songIdsToAdd, songIndexesToRemove) } @@ -141,35 +150,41 @@ internal class ApiVersionCheckWrapper( return api.scrobble(id, time, submission) } - override fun getAlbumList(type: AlbumListType, - size: Int?, - offset: Int?, - fromYear: Int?, - toYear: Int?, - genre: String?, - musicFolderId: String?): Call { + override fun getAlbumList( + type: AlbumListType, + size: Int?, + offset: Int?, + fromYear: Int?, + toYear: Int?, + genre: String?, + musicFolderId: String? + ): Call { checkVersion(V1_2_0) checkParamVersion(musicFolderId, V1_11_0) return api.getAlbumList(type, size, offset, fromYear, toYear, genre, musicFolderId) } - override fun getAlbumList2(type: AlbumListType, - size: Int?, - offset: Int?, - fromYear: Int?, - toYear: Int?, - genre: String?, - musicFolderId: String?): Call { + override fun getAlbumList2( + type: AlbumListType, + size: Int?, + offset: Int?, + fromYear: Int?, + toYear: Int?, + genre: String?, + musicFolderId: String? + ): Call { checkVersion(V1_8_0) checkParamVersion(musicFolderId, V1_12_0) return api.getAlbumList2(type, size, offset, fromYear, toYear, genre, musicFolderId) } - override fun getRandomSongs(size: Int?, - genre: String?, - fromYear: Int?, - toYear: Int?, - musicFolderId: String?): Call { + override fun getRandomSongs( + size: Int?, + genre: String?, + fromYear: Int?, + toYear: Int?, + musicFolderId: String? + ): Call { checkVersion(V1_2_0) return api.getRandomSongs(size, genre, fromYear, toYear, musicFolderId) } @@ -186,14 +201,16 @@ internal class ApiVersionCheckWrapper( return api.getStarred2(musicFolderId) } - override fun stream(id: String, - maxBitRate: Int?, - format: String?, - timeOffset: Int?, - videoSize: String?, - estimateContentLength: Boolean?, - converted: Boolean?, - offset: Long?): Call { + override fun stream( + id: String, + maxBitRate: Int?, + format: String?, + timeOffset: Int?, + videoSize: String?, + estimateContentLength: Boolean?, + converted: Boolean?, + offset: Long? + ): Call { checkParamVersion(maxBitRate, V1_2_0) checkParamVersion(format, V1_6_0) checkParamVersion(videoSize, V1_6_0) @@ -203,11 +220,13 @@ internal class ApiVersionCheckWrapper( estimateContentLength, converted) } - override fun jukeboxControl(action: JukeboxAction, - index: Int?, - offset: Int?, - ids: List?, - gain: Float?): Call { + override fun jukeboxControl( + action: JukeboxAction, + index: Int?, + offset: Int?, + ids: List?, + gain: Float? + ): Call { checkVersion(V1_2_0) checkParamVersion(offset, V1_7_0) return api.jukeboxControl(action, index, offset, ids, gain) @@ -218,9 +237,11 @@ internal class ApiVersionCheckWrapper( return api.getShares() } - override fun createShare(idsToShare: List, - description: String?, - expires: Long?): Call { + override fun createShare( + idsToShare: List, + description: String?, + expires: Long? + ): Call { checkVersion(V1_6_0) return api.createShare(idsToShare, description, expires) } @@ -230,9 +251,11 @@ internal class ApiVersionCheckWrapper( return api.deleteShare(id) } - override fun updateShare(id: String, - description: String?, - expires: Long?): Call { + override fun updateShare( + id: String, + description: String?, + expires: Long? + ): Call { checkVersion(V1_6_0) return api.updateShare(id, description, expires) } @@ -242,10 +265,12 @@ internal class ApiVersionCheckWrapper( return api.getGenres() } - override fun getSongsByGenre(genre: String, - count: Int, - offset: Int, - musicFolderId: String?): Call { + override fun getSongsByGenre( + genre: String, + count: Int, + offset: Int, + musicFolderId: String? + ): Call { checkVersion(V1_9_0) checkParamVersion(musicFolderId, V1_12_0) return api.getSongsByGenre(genre, count, offset, musicFolderId) @@ -271,9 +296,11 @@ internal class ApiVersionCheckWrapper( return api.getBookmarks() } - override fun createBookmark(id: String, - position: Long, - comment: String?): Call { + override fun createBookmark( + id: String, + position: Long, + comment: String? + ): Call { checkVersion(V1_9_0) return api.createBookmark(id, position, comment) } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt index 36f024b3..577e55d2 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt @@ -35,14 +35,16 @@ private const val READ_TIMEOUT = 60_000L * * @author Yahor Berdnikau */ -class SubsonicAPIClient(baseUrl: String, - username: String, - password: String, - minimalProtocolVersion: SubsonicAPIVersions, - clientID: String, - allowSelfSignedCertificate: Boolean = false, - enableLdapUserSupport: Boolean = false, - debug: Boolean = false) { +class SubsonicAPIClient( + baseUrl: String, + username: String, + password: String, + minimalProtocolVersion: SubsonicAPIVersions, + clientID: String, + allowSelfSignedCertificate: Boolean = false, + enableLdapUserSupport: Boolean = false, + debug: Boolean = false +) { private val versionInterceptor = VersionInterceptor(minimalProtocolVersion) { protocolVersion = it } 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 e115ccb3..d867d452 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 @@ -54,8 +54,10 @@ interface SubsonicAPIDefinition { fun getMusicFolders(): Call @GET("getIndexes.view") - fun getIndexes(@Query("musicFolderId") musicFolderId: String?, - @Query("ifModifiedSince") ifModifiedSince: Long?): Call + fun getIndexes( + @Query("musicFolderId") musicFolderId: String?, + @Query("ifModifiedSince") ifModifiedSince: Long? + ): Call @GET("getMusicDirectory.view") fun getMusicDirectory(@Query("id") id: String): Call @@ -64,14 +66,18 @@ interface SubsonicAPIDefinition { fun getArtists(@Query("musicFolderId") musicFolderId: String?): Call @GET("star.view") - fun star(@Query("id") id: String? = null, - @Query("albumId") albumId: String? = null, - @Query("artistId") artistId: String? = null): Call + fun star( + @Query("id") id: String? = null, + @Query("albumId") albumId: String? = null, + @Query("artistId") artistId: String? = null + ): Call @GET("unstar.view") - fun unstar(@Query("id") id: String? = null, - @Query("albumId") albumId: String? = null, - @Query("artistId") artistId: String? = null): Call + fun unstar( + @Query("id") id: String? = null, + @Query("albumId") albumId: String? = null, + @Query("artistId") artistId: String? = null + ): Call @GET("getArtist.view") fun getArtist(@Query("id") id: String): Call @@ -80,31 +86,37 @@ interface SubsonicAPIDefinition { fun getAlbum(@Query("id") id: String): Call @GET("search.view") - fun search(@Query("artist") artist: String? = null, - @Query("album") album: String? = null, - @Query("title") title: String? = null, - @Query("any") any: String? = null, - @Query("count") count: Int? = null, - @Query("offset") offset: Int? = null, - @Query("newerThan") newerThan: Long? = null): Call + fun search( + @Query("artist") artist: String? = null, + @Query("album") album: String? = null, + @Query("title") title: String? = null, + @Query("any") any: String? = null, + @Query("count") count: Int? = null, + @Query("offset") offset: Int? = null, + @Query("newerThan") newerThan: Long? = null + ): Call @GET("search2.view") - fun search2(@Query("query") query: String, - @Query("artistCount") artistCount: Int? = null, - @Query("artistOffset") artistOffset: Int? = null, - @Query("albumCount") albumCount: Int? = null, - @Query("albumOffset") albumOffset: Int? = null, - @Query("songCount") songCount: Int? = null, - @Query("musicFolderId") musicFolderId: String? = null): Call + fun search2( + @Query("query") query: String, + @Query("artistCount") artistCount: Int? = null, + @Query("artistOffset") artistOffset: Int? = null, + @Query("albumCount") albumCount: Int? = null, + @Query("albumOffset") albumOffset: Int? = null, + @Query("songCount") songCount: Int? = null, + @Query("musicFolderId") musicFolderId: String? = null + ): Call @GET("search3.view") - fun search3(@Query("query") query: String, - @Query("artistCount") artistCount: Int? = null, - @Query("artistOffset") artistOffset: Int? = null, - @Query("albumCount") albumCount: Int? = null, - @Query("albumOffset") albumOffset: Int? = null, - @Query("songCount") songCount: Int? = null, - @Query("musicFolderId") musicFolderId: String? = null): Call + fun search3( + @Query("query") query: String, + @Query("artistCount") artistCount: Int? = null, + @Query("artistOffset") artistOffset: Int? = null, + @Query("albumCount") albumCount: Int? = null, + @Query("albumOffset") albumOffset: Int? = null, + @Query("songCount") songCount: Int? = null, + @Query("musicFolderId") musicFolderId: String? = null + ): Call @GET("getPlaylist.view") fun getPlaylist(@Query("id") id: String): Call @@ -113,119 +125,143 @@ interface SubsonicAPIDefinition { fun getPlaylists(@Query("username") username: String? = null): Call @GET("createPlaylist.view") - fun createPlaylist(@Query("playlistId") id: String? = null, - @Query("name") name: String? = null, - @Query("songId") songIds: List? = null): Call + fun createPlaylist( + @Query("playlistId") id: String? = null, + @Query("name") name: String? = null, + @Query("songId") songIds: List? = null + ): Call @GET("deletePlaylist.view") fun deletePlaylist(@Query("id") id: String): Call @GET("updatePlaylist.view") fun updatePlaylist( - @Query("playlistId") id: String, - @Query("name") name: String? = null, - @Query("comment") comment: String? = null, - @Query("public") public: Boolean? = null, - @Query("songIdToAdd") songIdsToAdd: List? = null, - @Query("songIndexToRemove") songIndexesToRemove: List? = null): + @Query("playlistId") id: String, + @Query("name") name: String? = null, + @Query("comment") comment: String? = null, + @Query("public") public: Boolean? = null, + @Query("songIdToAdd") songIdsToAdd: List? = null, + @Query("songIndexToRemove") songIndexesToRemove: List? = null + ): Call @GET("getPodcasts.view") - fun getPodcasts(@Query("includeEpisodes") includeEpisodes: Boolean? = null, - @Query("id") id: String? = null): Call + fun getPodcasts( + @Query("includeEpisodes") includeEpisodes: Boolean? = null, + @Query("id") id: String? = null + ): Call @GET("getLyrics.view") - fun getLyrics(@Query("artist") artist: String? = null, - @Query("title") title: String? = null): Call + fun getLyrics( + @Query("artist") artist: String? = null, + @Query("title") title: String? = null + ): Call @GET("scrobble.view") - fun scrobble(@Query("id") id: String, - @Query("time") time: Long? = null, - @Query("submission") submission: Boolean? = null): Call + fun scrobble( + @Query("id") id: String, + @Query("time") time: Long? = null, + @Query("submission") submission: Boolean? = null + ): Call @GET("getAlbumList.view") fun getAlbumList( - @Query("type") type: AlbumListType, - @Query("size") size: Int? = null, - @Query("offset") offset: Int? = null, - @Query("fromYear") fromYear: Int? = null, - @Query("toYear") toYear: Int? = null, - @Query("genre") genre: String? = null, - @Query("musicFolderId") musicFolderId: String? = null): Call + @Query("type") type: AlbumListType, + @Query("size") size: Int? = null, + @Query("offset") offset: Int? = null, + @Query("fromYear") fromYear: Int? = null, + @Query("toYear") toYear: Int? = null, + @Query("genre") genre: String? = null, + @Query("musicFolderId") musicFolderId: String? = null + ): Call @GET("getAlbumList2.view") fun getAlbumList2( - @Query("type") type: AlbumListType, - @Query("size") size: Int? = null, - @Query("offset") offset: Int? = null, - @Query("fromYear") fromYear: Int? = null, - @Query("toYear") toYear: Int? = null, - @Query("genre") genre: String? = null, - @Query("musicFolderId") musicFolderId: String? = null): Call + @Query("type") type: AlbumListType, + @Query("size") size: Int? = null, + @Query("offset") offset: Int? = null, + @Query("fromYear") fromYear: Int? = null, + @Query("toYear") toYear: Int? = null, + @Query("genre") genre: String? = null, + @Query("musicFolderId") musicFolderId: String? = null + ): Call @GET("getRandomSongs.view") fun getRandomSongs( - @Query("size") size: Int? = null, - @Query("genre") genre: String? = null, - @Query("fromYear") fromYear: Int? = null, - @Query("toYear") toYear: Int? = null, - @Query("musicFolderId") musicFolderId: String? = null): Call + @Query("size") size: Int? = null, + @Query("genre") genre: String? = null, + @Query("fromYear") fromYear: Int? = null, + @Query("toYear") toYear: Int? = null, + @Query("musicFolderId") musicFolderId: String? = null + ): Call @GET("getStarred.view") fun getStarred(@Query("musicFolderId") musicFolderId: String? = null): Call @GET("getStarred2.view") fun getStarred2( - @Query("musicFolderId") musicFolderId: String? = null): Call + @Query("musicFolderId") musicFolderId: String? = null + ): Call @Streaming @GET("getCoverArt.view") - fun getCoverArt(@Query("id") id: String, - @Query("size") size: Long? = null): Call + fun getCoverArt( + @Query("id") id: String, + @Query("size") size: Long? = null + ): Call @Streaming @GET("stream.view") - fun stream(@Query("id") id: String, - @Query("maxBitRate") maxBitRate: Int? = null, - @Query("format") format: String? = null, - @Query("timeOffset") timeOffset: Int? = null, - @Query("size") videoSize: String? = null, - @Query("estimateContentLength") estimateContentLength: Boolean? = null, - @Query("converted") converted: Boolean? = null, - @Header("Range") offset: Long? = null): Call + fun stream( + @Query("id") id: String, + @Query("maxBitRate") maxBitRate: Int? = null, + @Query("format") format: String? = null, + @Query("timeOffset") timeOffset: Int? = null, + @Query("size") videoSize: String? = null, + @Query("estimateContentLength") estimateContentLength: Boolean? = null, + @Query("converted") converted: Boolean? = null, + @Header("Range") offset: Long? = null + ): Call @GET("jukeboxControl.view") - fun jukeboxControl(@Query("action") action: JukeboxAction, - @Query("index") index: Int? = null, - @Query("offset") offset: Int? = null, - @Query("id") ids: List? = null, - @Query("gain") gain: Float? = null): Call + fun jukeboxControl( + @Query("action") action: JukeboxAction, + @Query("index") index: Int? = null, + @Query("offset") offset: Int? = null, + @Query("id") ids: List? = null, + @Query("gain") gain: Float? = null + ): Call @GET("getShares.view") fun getShares(): Call @GET("createShare.view") - fun createShare(@Query("id") idsToShare: List, - @Query("description") description: String? = null, - @Query("expires") expires: Long? = null): Call + fun createShare( + @Query("id") idsToShare: List, + @Query("description") description: String? = null, + @Query("expires") expires: Long? = null + ): Call @GET("deleteShare.view") fun deleteShare(@Query("id") id: String): Call @GET("updateShare.view") - fun updateShare(@Query("id") id: String, - @Query("description") description: String? = null, - @Query("expires") expires: Long? = null): Call + fun updateShare( + @Query("id") id: String, + @Query("description") description: String? = null, + @Query("expires") expires: Long? = null + ): Call @GET("getGenres.view") fun getGenres(): Call @GET("getSongsByGenre.view") fun getSongsByGenre( - @Query("genre") genre: String, - @Query("count") count: Int = 10, - @Query("offset") offset: Int = 0, - @Query("musicFolderId") musicFolderId: String? = null): Call + @Query("genre") genre: String, + @Query("count") count: Int = 10, + @Query("offset") offset: Int = 0, + @Query("musicFolderId") musicFolderId: String? = null + ): Call @GET("getUser.view") fun getUser(@Query("username") username: String): Call @@ -241,9 +277,10 @@ interface SubsonicAPIDefinition { @GET("createBookmark.view") fun createBookmark( - @Query("id") id: String, - @Query("position") position: Long, - @Query("comment") comment: String? = null): Call + @Query("id") id: String, + @Query("position") position: Long, + @Query("comment") comment: String? = null + ): Call @GET("deleteBookmark.view") fun deleteBookmark(@Query("id") id: String): Call diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt index 2d82ef29..042346d1 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt @@ -56,8 +56,10 @@ enum class SubsonicAPIVersions(val subsonicVersions: String, val restApiVersion: } class SubsonicAPIVersionsDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, - ctxt: DeserializationContext?): SubsonicAPIVersions { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext? + ): SubsonicAPIVersions { if (p.currentName != "version") { throw JsonParseException(p, "Not valid token for API version!") } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/ProxyPasswordInterceptor.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/ProxyPasswordInterceptor.kt index ca796a17..d05e7516 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/ProxyPasswordInterceptor.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/ProxyPasswordInterceptor.kt @@ -12,10 +12,10 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions * ldap users. */ internal class ProxyPasswordInterceptor( - initialAPIVersions: SubsonicAPIVersions, - private val hexInterceptor: PasswordHexInterceptor, - private val mD5Interceptor: PasswordMD5Interceptor, - private val forceHexPassword: Boolean = false + initialAPIVersions: SubsonicAPIVersions, + private val hexInterceptor: PasswordHexInterceptor, + private val mD5Interceptor: PasswordMD5Interceptor, + private val forceHexPassword: Boolean = false ) : Interceptor { var apiVersion: SubsonicAPIVersions = initialAPIVersions diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt index 223582fa..ae700f5a 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/VersionInterceptor.kt @@ -20,8 +20,9 @@ private const val DEFAULT_PEEK_BYTE_COUNT = 1000L * @author Yahor Berdnikau */ internal class VersionInterceptor( - internal var protocolVersion: SubsonicAPIVersions, - private val notifier: (SubsonicAPIVersions) -> Unit = {}) : Interceptor { + internal var protocolVersion: SubsonicAPIVersions, + private val notifier: (SubsonicAPIVersions) -> Unit = {} +) : Interceptor { private val jsonFactory = JsonFactory() override fun intercept(chain: Chain): okhttp3.Response { diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Album.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Album.kt index df21c658..5dacd51b 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Album.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Album.kt @@ -4,14 +4,15 @@ import com.fasterxml.jackson.annotation.JsonProperty import java.util.Calendar data class Album( - val id: String = "", - val name: String = "", - val coverArt: String = "", - val artist: String = "", - val artistId: String = "", - val songCount: Int = 0, - val duration: Int = 0, - val created: Calendar? = null, - val year: Int = 0, - val genre: String = "", - @JsonProperty("song") val songList: List = emptyList()) + val id: String = "", + val name: String = "", + val coverArt: String = "", + val artist: String = "", + val artistId: String = "", + val songCount: Int = 0, + val duration: Int = 0, + val created: Calendar? = null, + val year: Int = 0, + val genre: String = "", + @JsonProperty("song") val songList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt index 709409d5..697dbfaa 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt @@ -3,10 +3,12 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty import java.util.Calendar -data class Artist(val id: String = "", - val name: String = "", - val coverArt: String = "", - val albumCount: Int = 0, - val starred: Calendar? = null, - @JsonProperty("album") - val albumsList: List = emptyList()) +data class Artist( + val id: String = "", + val name: String = "", + val coverArt: String = "", + val albumCount: Int = 0, + val starred: Calendar? = null, + @JsonProperty("album") + val albumsList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Bookmark.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Bookmark.kt index f527b068..56a5ad7a 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Bookmark.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Bookmark.kt @@ -3,9 +3,10 @@ package org.moire.ultrasonic.api.subsonic.models import java.util.Calendar data class Bookmark( - val position: Long = 0, - val username: String = "", - val comment: String = "", - val created: Calendar? = null, - val changed: Calendar? = null, - val entry: MusicDirectoryChild = MusicDirectoryChild()) + val position: Long = 0, + val username: String = "", + val comment: String = "", + val created: Calendar? = null, + val changed: Calendar? = null, + val entry: MusicDirectoryChild = MusicDirectoryChild() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/ChatMessage.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/ChatMessage.kt index 7e76a466..abf4c010 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/ChatMessage.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/ChatMessage.kt @@ -1,6 +1,7 @@ package org.moire.ultrasonic.api.subsonic.models data class ChatMessage( - val username: String = "", - val time: Long = 0, - val message: String = "") + val username: String = "", + val time: Long = 0, + val message: String = "" +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Genre.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Genre.kt index 6a54d43c..90b73740 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Genre.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Genre.kt @@ -2,6 +2,8 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty -data class Genre(val songCount: Int = 0, - val albumCount: Int = 0, - @JsonProperty("value") val name: String) +data class Genre( + val songCount: Int = 0, + val albumCount: Int = 0, + @JsonProperty("value") val name: String +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt index 9d25ce4b..eb454f7f 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt @@ -2,6 +2,8 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty -data class Index(val name: String = "", - @JsonProperty("artist") - val artists: List = emptyList()) +data class Index( + val name: String = "", + @JsonProperty("artist") + val artists: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt index bd46cea4..74a5390d 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt @@ -2,9 +2,11 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty -data class Indexes(val lastModified: Long = 0, - val ignoredArticles: String = "", - @JsonProperty("index") - val indexList: List = emptyList(), - @JsonProperty("shortcut") - val shortcutList: List = emptyList()) +data class Indexes( + val lastModified: Long = 0, + val ignoredArticles: String = "", + @JsonProperty("index") + val indexList: List = emptyList(), + @JsonProperty("shortcut") + val shortcutList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/JukeboxStatus.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/JukeboxStatus.kt index c52fc1cf..063cb22f 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/JukeboxStatus.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/JukeboxStatus.kt @@ -3,8 +3,9 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty data class JukeboxStatus( - val currentIndex: Int = -1, - val playing: Boolean = false, - val gain: Float = 0.0f, - val position: Int = 0, - @JsonProperty("entry") val playlistEntries: List = emptyList()) + val currentIndex: Int = -1, + val playing: Boolean = false, + val gain: Float = 0.0f, + val position: Int = 0, + @JsonProperty("entry") val playlistEntries: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/License.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/License.kt index efe819d4..a83d6543 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/License.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/License.kt @@ -3,7 +3,8 @@ package org.moire.ultrasonic.api.subsonic.models import java.util.Calendar data class License( - val valid: Boolean = false, - val email: String = "", - val trialExpires: Calendar = Calendar.getInstance(), - val licenseExpires: Calendar = Calendar.getInstance()) + val valid: Boolean = false, + val email: String = "", + val trialExpires: Calendar = Calendar.getInstance(), + val licenseExpires: Calendar = Calendar.getInstance() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Lyrics.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Lyrics.kt index 830104b0..5845cf38 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Lyrics.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Lyrics.kt @@ -3,6 +3,7 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty data class Lyrics( - val artist: String = "", - val title: String = "", - @JsonProperty("value") val text: String = "") + val artist: String = "", + val title: String = "", + @JsonProperty("value") val text: String = "" +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt index 6d445097..0c69832f 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt @@ -3,12 +3,14 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty import java.util.Calendar -data class MusicDirectory(val id: String = "", - val parent: String = "", - val name: String = "", - val userRating: Int = 0, - val averageRating: Float = 0.0f, - val starred: Calendar? = null, - val playCount: Int = 0, - @JsonProperty("child") - val childList: List = emptyList()) +data class MusicDirectory( + val id: String = "", + val parent: String = "", + val name: String = "", + val userRating: Int = 0, + val averageRating: Float = 0.0f, + val starred: Calendar? = null, + val playCount: Int = 0, + @JsonProperty("child") + val childList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt index 28440d82..d51b39ca 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt @@ -2,36 +2,38 @@ package org.moire.ultrasonic.api.subsonic.models import java.util.Calendar -data class MusicDirectoryChild(val id: String = "", - val parent: String = "", - val isDir: Boolean = false, - val title: String = "", - val album: String = "", - val artist: String = "", - val track: Int = -1, - val year: Int? = null, - val genre: String = "", - val coverArt: String = "", - val size: Long = -1, - val contentType: String = "", - val suffix: String = "", - val transcodedContentType: String = "", - val transcodedSuffix: String = "", - val duration: Int = -1, - val bitRate: Int = -1, - val path: String = "", - val isVideo: Boolean = false, - val playCount: Int = 0, - val discNumber: Int = -1, - val created: Calendar? = null, - val albumId: String = "", - val artistId: String = "", - val type: String = "", - val starred: Calendar? = null, - val streamId: String = "", - val channelId: String = "", - val description: String = "", - val status: String = "", - val publishDate: Calendar? = null, - val userRating: Int? = null, - val averageRating: Float? = null) +data class MusicDirectoryChild( + val id: String = "", + val parent: String = "", + val isDir: Boolean = false, + val title: String = "", + val album: String = "", + val artist: String = "", + val track: Int = -1, + val year: Int? = null, + val genre: String = "", + val coverArt: String = "", + val size: Long = -1, + val contentType: String = "", + val suffix: String = "", + val transcodedContentType: String = "", + val transcodedSuffix: String = "", + val duration: Int = -1, + val bitRate: Int = -1, + val path: String = "", + val isVideo: Boolean = false, + val playCount: Int = 0, + val discNumber: Int = -1, + val created: Calendar? = null, + val albumId: String = "", + val artistId: String = "", + val type: String = "", + val starred: Calendar? = null, + val streamId: String = "", + val channelId: String = "", + val description: String = "", + val status: String = "", + val publishDate: Calendar? = null, + val userRating: Int? = null, + val averageRating: Float? = null +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Playlist.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Playlist.kt index ce3c41be..ccc83a69 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Playlist.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Playlist.kt @@ -4,15 +4,15 @@ import com.fasterxml.jackson.annotation.JsonProperty import java.util.Calendar data class Playlist( - val id: String = "", - val name: String = "", - val owner: String = "", - val comment: String = "", - val public: Boolean = false, - val songCount: Int = 0, - val duration: Long = 0, - val created: Calendar? = null, - val changed: Calendar? = null, - val coverArt: String = "", - @JsonProperty("entry") val entriesList: List = emptyList() + val id: String = "", + val name: String = "", + val owner: String = "", + val comment: String = "", + val public: Boolean = false, + val songCount: Int = 0, + val duration: Long = 0, + val created: Calendar? = null, + val changed: Calendar? = null, + val coverArt: String = "", + @JsonProperty("entry") val entriesList: List = emptyList() ) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/PodcastChannel.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/PodcastChannel.kt index d2a44b83..cb46e59f 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/PodcastChannel.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/PodcastChannel.kt @@ -3,12 +3,13 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty data class PodcastChannel( - val id: String = "", - val url: String = "", - val title: String = "", - val description: String = "", - val coverArt: String = "", - val originalImageUrl: String = "", - val status: String = "", - val errorMessage: String = "", - @JsonProperty("episode") val episodeList: List = emptyList()) + val id: String = "", + val url: String = "", + val title: String = "", + val description: String = "", + val coverArt: String = "", + val originalImageUrl: String = "", + val status: String = "", + val errorMessage: String = "", + @JsonProperty("episode") val episodeList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchResult.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchResult.kt index 1efade9a..d26f9cfa 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchResult.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchResult.kt @@ -3,6 +3,7 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty data class SearchResult( - val offset: Int = 0, - val totalHits: Int = 0, - @JsonProperty("match") val matchList: List = emptyList()) + val offset: Int = 0, + val totalHits: Int = 0, + @JsonProperty("match") val matchList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchThreeResult.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchThreeResult.kt index c6c3a626..14c35353 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchThreeResult.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchThreeResult.kt @@ -3,7 +3,7 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty data class SearchThreeResult( - @JsonProperty("artist") val artistList: List = emptyList(), - @JsonProperty("album") val albumList: List = emptyList(), - @JsonProperty("song") val songList: List = emptyList() + @JsonProperty("artist") val artistList: List = emptyList(), + @JsonProperty("album") val albumList: List = emptyList(), + @JsonProperty("song") val songList: List = emptyList() ) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchTwoResult.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchTwoResult.kt index 4a0fbb92..1b42f640 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchTwoResult.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/SearchTwoResult.kt @@ -3,7 +3,7 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty data class SearchTwoResult( - @JsonProperty("artist") val artistList: List = emptyList(), - @JsonProperty("album") val albumList: List = emptyList(), - @JsonProperty("song") val songList: List = emptyList() + @JsonProperty("artist") val artistList: List = emptyList(), + @JsonProperty("album") val albumList: List = emptyList(), + @JsonProperty("song") val songList: List = emptyList() ) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Share.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Share.kt index b28c480f..765540c3 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Share.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Share.kt @@ -4,12 +4,13 @@ import com.fasterxml.jackson.annotation.JsonProperty import java.util.Calendar data class Share( - val id: String = "", - val url: String = "", - val username: String = "", - val created: Calendar? = null, - val expires: Calendar? = null, - val visitCount: Int = 0, - val description: String = "", - val lastVisited: Calendar? = null, - @JsonProperty("entry") val items: List = emptyList()) + val id: String = "", + val url: String = "", + val username: String = "", + val created: Calendar? = null, + val expires: Calendar? = null, + val visitCount: Int = 0, + val description: String = "", + val lastVisited: Calendar? = null, + @JsonProperty("entry") val items: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/User.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/User.kt index 792f2556..f8ce3d70 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/User.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/User.kt @@ -3,19 +3,20 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty data class User( - val username: String = "", - val email: String = "", - val scrobblingEnabled: Boolean = false, - val adminRole: Boolean = false, - val settingsRole: Boolean = false, - val downloadRole: Boolean = false, - val uploadRole: Boolean = false, - val playlistRole: Boolean = false, - val coverArtRole: Boolean = false, - val commentRole: Boolean = false, - val podcastRole: Boolean = false, - val streamRole: Boolean = false, - val jukeboxRole: Boolean = false, - val shareRole: Boolean = false, - val videoConverstionRole: Boolean = false, - @JsonProperty("folder") val folderList: List = emptyList()) + val username: String = "", + val email: String = "", + val scrobblingEnabled: Boolean = false, + val adminRole: Boolean = false, + val settingsRole: Boolean = false, + val downloadRole: Boolean = false, + val uploadRole: Boolean = false, + val playlistRole: Boolean = false, + val coverArtRole: Boolean = false, + val commentRole: Boolean = false, + val podcastRole: Boolean = false, + val streamRole: Boolean = false, + val jukeboxRole: Boolean = false, + val shareRole: Boolean = false, + val videoConverstionRole: Boolean = false, + @JsonProperty("folder") val folderList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/BookmarksResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/BookmarksResponse.kt index 4eaae226..5cbd8bbd 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/BookmarksResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/BookmarksResponse.kt @@ -6,13 +6,15 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Bookmark class BookmarksResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) : SubsonicResponse(status, version, error) { + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("bookmarks") private val bookmarksWrapper = BookmarkWrapper() val bookmarkList: List get() = bookmarksWrapper.bookmarkList } internal class BookmarkWrapper( - @JsonProperty("bookmark") val bookmarkList: List = emptyList()) + @JsonProperty("bookmark") val bookmarkList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/ChatMessagesResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/ChatMessagesResponse.kt index 4e41ccc8..71055616 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/ChatMessagesResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/ChatMessagesResponse.kt @@ -6,13 +6,15 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.ChatMessage class ChatMessagesResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) : SubsonicResponse(status, version, error) { + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("chatMessages") private val wrapper = ChatMessagesWrapper() val chatMessages: List get() = wrapper.messagesList } internal class ChatMessagesWrapper( - @JsonProperty("chatMessage") val messagesList: List = emptyList()) + @JsonProperty("chatMessage") val messagesList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GenresResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GenresResponse.kt index fdf34c18..85fbb35c 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GenresResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GenresResponse.kt @@ -5,9 +5,11 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Genre -class GenresResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) : SubsonicResponse(status, version, error) { +class GenresResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("genres") private val genresWrapper = GenresWrapper() val genresList: List get() = genresWrapper.genresList } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumList2Response.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumList2Response.kt index cf16d95e..264ba727 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumList2Response.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumList2Response.kt @@ -6,10 +6,11 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Album @Suppress("NamingConventionViolation") -class GetAlbumList2Response(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) - : SubsonicResponse(status, version, error) { +class GetAlbumList2Response( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("albumList2") private val albumWrapper2 = AlbumWrapper2() val albumList: List @@ -18,4 +19,5 @@ class GetAlbumList2Response(status: Status, @Suppress("NamingConventionViolation") private class AlbumWrapper2( - @JsonProperty("album") val albumList: List = emptyList()) + @JsonProperty("album") val albumList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumListResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumListResponse.kt index 44e1cccf..8e3ca708 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumListResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumListResponse.kt @@ -5,10 +5,11 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild -class GetAlbumListResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) - : SubsonicResponse(status, version, error) { +class GetAlbumListResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("albumList") private val albumWrapper = AlbumWrapper() val albumList: List @@ -16,4 +17,5 @@ class GetAlbumListResponse(status: Status, } private class AlbumWrapper( - @JsonProperty("album") val albumList: List = emptyList()) + @JsonProperty("album") val albumList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumResponse.kt index a5f07596..59dd315a 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetAlbumResponse.kt @@ -4,7 +4,9 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Album -class GetAlbumResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - val album: Album = Album()) : SubsonicResponse(status, version, error) +class GetAlbumResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val album: Album = Album() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetArtistResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetArtistResponse.kt index 45b4e1f2..122073b2 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetArtistResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetArtistResponse.kt @@ -4,8 +4,9 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Artist -class GetArtistResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - val artist: Artist = Artist()) - : SubsonicResponse(status, version, error) +class GetArtistResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val artist: Artist = Artist() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetArtistsResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetArtistsResponse.kt index 76337483..586d0c81 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetArtistsResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetArtistsResponse.kt @@ -5,8 +5,9 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Indexes -class GetArtistsResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - @JsonProperty("artists") val indexes: Indexes = Indexes()) : - SubsonicResponse(status, version, error) +class GetArtistsResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + @JsonProperty("artists") val indexes: Indexes = Indexes() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt index c5f5bb7e..cbd64e17 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt @@ -4,8 +4,9 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Indexes -class GetIndexesResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - val indexes: Indexes = Indexes()) : - SubsonicResponse(status, version, error) +class GetIndexesResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val indexes: Indexes = Indexes() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetLyricsResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetLyricsResponse.kt index a2fe0a0a..d10a5de7 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetLyricsResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetLyricsResponse.kt @@ -4,8 +4,9 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Lyrics -class GetLyricsResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - val lyrics: Lyrics = Lyrics()) - : SubsonicResponse(status, version, error) +class GetLyricsResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val lyrics: Lyrics = Lyrics() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt index d5ca3e0c..3a468440 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt @@ -5,9 +5,10 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.MusicDirectory -class GetMusicDirectoryResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - @JsonProperty("directory") - val musicDirectory: MusicDirectory = MusicDirectory()) : - SubsonicResponse(status, version, error) +class GetMusicDirectoryResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + @JsonProperty("directory") + val musicDirectory: MusicDirectory = MusicDirectory() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistResponse.kt index 522761e0..7846d50b 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistResponse.kt @@ -5,7 +5,8 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Playlist class GetPlaylistResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - val playlist: Playlist = Playlist()) : SubsonicResponse(status, version, error) + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val playlist: Playlist = Playlist() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistsResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistsResponse.kt index a07c610d..84a32b20 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistsResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPlaylistsResponse.kt @@ -5,10 +5,11 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Playlist -class GetPlaylistsResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) - : SubsonicResponse(status, version, error) { +class GetPlaylistsResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("playlists") private val playlistsWrapper: PlaylistsWrapper = PlaylistsWrapper() @@ -17,4 +18,5 @@ class GetPlaylistsResponse(status: Status, } private class PlaylistsWrapper( - @JsonProperty("playlist") val playlistList: List = emptyList()) + @JsonProperty("playlist") val playlistList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPodcastsResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPodcastsResponse.kt index 00286413..3fa0fd1d 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPodcastsResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetPodcastsResponse.kt @@ -6,9 +6,10 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.PodcastChannel class GetPodcastsResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) : SubsonicResponse(status, version, error) { + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("podcasts") private val channelsWrapper = PodcastChannelWrapper() val podcastChannels: List @@ -16,4 +17,5 @@ class GetPodcastsResponse( } private class PodcastChannelWrapper( - @JsonProperty("channel") val channelsList: List = emptyList()) + @JsonProperty("channel") val channelsList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetRandomSongsResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetRandomSongsResponse.kt index 603e7744..c987db12 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetRandomSongsResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetRandomSongsResponse.kt @@ -5,10 +5,11 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild -class GetRandomSongsResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) - : SubsonicResponse(status, version, error) { +class GetRandomSongsResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("randomSongs") private val songsWrapper = RandomSongsWrapper() val songsList @@ -16,4 +17,5 @@ class GetRandomSongsResponse(status: Status, } private class RandomSongsWrapper( - @JsonProperty("song") val songsList: List = emptyList()) + @JsonProperty("song") val songsList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetSongsByGenreResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetSongsByGenreResponse.kt index e5247cfa..61b8274f 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetSongsByGenreResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetSongsByGenreResponse.kt @@ -6,13 +6,15 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild class GetSongsByGenreResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) : SubsonicResponse(status, version, error) { + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("songsByGenre") private val songsByGenreList = SongsByGenreWrapper() val songsList get() = songsByGenreList.songsList } internal class SongsByGenreWrapper( - @JsonProperty("song") val songsList: List = emptyList()) + @JsonProperty("song") val songsList: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetStarredResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetStarredResponse.kt index dc4e59eb..0c8b50a3 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetStarredResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetStarredResponse.kt @@ -4,8 +4,9 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.SearchTwoResult -class GetStarredResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - val starred: SearchTwoResult = SearchTwoResult()) - : SubsonicResponse(status, version, error) +class GetStarredResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val starred: SearchTwoResult = SearchTwoResult() +) : SubsonicResponse(status, version, error) 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 index cbbeafcc..3a25ad67 100644 --- 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 @@ -4,8 +4,9 @@ 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) +class GetStarredTwoResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val starred2: SearchTwoResult = SearchTwoResult() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetUserResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetUserResponse.kt index 31934af4..25a3891a 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetUserResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetUserResponse.kt @@ -5,7 +5,8 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.User class GetUserResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - val user: User = User()) : SubsonicResponse(status, version, error) + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val user: User = User() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/JukeboxResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/JukeboxResponse.kt index be2d6f74..eb936ef5 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/JukeboxResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/JukeboxResponse.kt @@ -5,11 +5,12 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.JukeboxStatus -class JukeboxResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - var jukebox: JukeboxStatus = JukeboxStatus()) - : SubsonicResponse(status, version, error) { +class JukeboxResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + var jukebox: JukeboxStatus = JukeboxStatus() +) : SubsonicResponse(status, version, error) { @JsonSetter("jukeboxStatus") fun setJukeboxStatus(jukebox: JukeboxStatus) { this.jukebox = jukebox } diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt index f5b7567b..35206a0b 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt @@ -4,8 +4,9 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.License -class LicenseResponse(val license: License = License(), - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) : - SubsonicResponse(status, version, error) +class LicenseResponse( + val license: License = License(), + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt index 8e78c0d7..1cd6edcc 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt @@ -5,14 +5,16 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.MusicFolder -class MusicFoldersResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) : - SubsonicResponse(status, version, error) { +class MusicFoldersResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("musicFolders") private val wrapper = MusicFoldersWrapper() val musicFolders get() = wrapper.musicFolders } internal class MusicFoldersWrapper( - @JsonProperty("musicFolder") val musicFolders: List = emptyList()) + @JsonProperty("musicFolder") val musicFolders: List = emptyList() +) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchResponse.kt index aac0a817..11cc14e6 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchResponse.kt @@ -4,8 +4,9 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.SearchResult -class SearchResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - val searchResult: SearchResult = SearchResult()) - : SubsonicResponse(status, version, error) +class SearchResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + val searchResult: SearchResult = SearchResult() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchThreeResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchThreeResponse.kt index 32cd4ae0..3c9f45b3 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchThreeResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchThreeResponse.kt @@ -6,8 +6,8 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.SearchThreeResult class SearchThreeResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - @JsonProperty("searchResult3") val searchResult: SearchThreeResult = SearchThreeResult()) - : SubsonicResponse(status, version, error) + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + @JsonProperty("searchResult3") val searchResult: SearchThreeResult = SearchThreeResult() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchTwoResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchTwoResponse.kt index b1a97164..863b7820 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchTwoResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SearchTwoResponse.kt @@ -6,8 +6,8 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.SearchTwoResult class SearchTwoResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?, - @JsonProperty("searchResult2") val searchResult: SearchTwoResult = SearchTwoResult()) - : SubsonicResponse(status, version, error) + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError?, + @JsonProperty("searchResult2") val searchResult: SearchTwoResult = SearchTwoResult() +) : SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SharesResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SharesResponse.kt index c3d4fb0a..a57d8b23 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SharesResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SharesResponse.kt @@ -5,10 +5,11 @@ import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.Share -class SharesResponse(status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) - : SubsonicResponse(status, version, error) { +class SharesResponse( + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("shares") private val wrappedShares = SharesWrapper() val shares get() = wrappedShares.share diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponse.kt index 7af5547b..7f4e7f26 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/StreamResponse.kt @@ -9,9 +9,11 @@ import java.io.InputStream * * [responseHttpCode] will be there always. */ -class StreamResponse(val stream: InputStream? = null, - val apiError: SubsonicError? = null, - val responseHttpCode: Int) { +class StreamResponse( + val stream: InputStream? = null, + val apiError: SubsonicError? = null, + val responseHttpCode: Int +) { /** * Check if this response has error. */ diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt index 55156217..92c234b8 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt @@ -13,9 +13,11 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError * Base Subsonic API response. */ @JsonRootName(value = "subsonic-response") -open class SubsonicResponse(val status: Status, - val version: SubsonicAPIVersions, - val error: SubsonicError?) { +open class SubsonicResponse( + val status: Status, + val version: SubsonicAPIVersions, + val error: SubsonicError? +) { @JsonDeserialize(using = Status.Companion.StatusJsonDeserializer::class) enum class Status(val jsonValue: String) { OK("ok"), ERROR("failed"); diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/VideosResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/VideosResponse.kt index 9ac4ff11..e6f8d0eb 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/VideosResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/VideosResponse.kt @@ -6,13 +6,15 @@ import org.moire.ultrasonic.api.subsonic.SubsonicError import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild class VideosResponse( - status: Status, - version: SubsonicAPIVersions, - error: SubsonicError?) : SubsonicResponse(status, version, error) { + status: Status, + version: SubsonicAPIVersions, + error: SubsonicError? +) : SubsonicResponse(status, version, error) { @JsonProperty("videos") private val videosWrapper = VideosWrapper() val videosList: List get() = videosWrapper.videosList } internal class VideosWrapper( - @JsonProperty("video") val videosList: List = emptyList()) + @JsonProperty("video") val videosList: List = emptyList() +) From 68cb1af02bb9431ae86f131e3029506edb691256 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Tue, 3 Apr 2018 22:09:22 +0200 Subject: [PATCH 11/14] Fix inconsistent behaviour when adding new server on debug build. After adding special suffix for debug builds, default shared preferences name was changed. --- .../src/main/java/org/moire/ultrasonic/util/Constants.java | 3 --- .../src/main/java/org/moire/ultrasonic/util/Util.java | 7 +++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java index fc6b7e12..e183f878 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java @@ -131,9 +131,6 @@ public final class Constants public static final String PREFERENCES_KEY_SCAN_MEDIA = "scanMedia"; public static final String PREFERENCES_KEY_IMAGE_LOADER_CONCURRENCY = "imageLoaderConcurrency"; - // Name of the preferences file. - public static final String PREFERENCES_FILE_NAME = "org.moire.ultrasonic_preferences"; - // Number of free trial days for non-licensed servers. public static final int FREE_TRIAL_DAYS = 30; diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java index f9994f3b..b1d12eac 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java @@ -398,10 +398,9 @@ public class Util extends DownloadActivity return builder.toString(); } - public static SharedPreferences getPreferences(Context context) - { - return context.getSharedPreferences(Constants.PREFERENCES_FILE_NAME, 0); - } + public static SharedPreferences getPreferences(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context); + } public static int getRemainingTrialDays(Context context) { From 4ac27dcd4e8bf1ba569aadda777533546efa051d Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Wed, 4 Apr 2018 21:26:31 +0200 Subject: [PATCH 12/14] Update android gradle plugin to 3.1.0 version. Signed-off-by: Yahor Berdnikau --- build.gradle | 1 + dependencies.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 25ea3d17..18226f8e 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,7 @@ allprojects { repositories { jcenter() + google() } } diff --git a/dependencies.gradle b/dependencies.gradle index 6e1e4e57..69b58c79 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,7 +7,7 @@ ext.versions = [ compileSdk : 27, gradle : '4.5.1', - androidTools : "3.0.1", + androidTools : "3.1.0", ktlint : "0.20.0", ktlintGradle : "3.2.0", detekt : "1.0.0.RC6-4", From e7caddaf9972ebb0056c4305142fa48fb18728b9 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Thu, 5 Apr 2018 20:48:43 +0200 Subject: [PATCH 13/14] Add workaround for transitive dependency conflict. Signed-off-by: Yahor Berdnikau --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 18226f8e..b839f789 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,9 @@ buildscript { classpath gradlePlugins.kotlin classpath gradlePlugins.ktlintGradle classpath gradlePlugins.detekt - classpath gradlePlugins.jacocoAndroid + classpath(gradlePlugins.jacocoAndroid) { + exclude group: 'org.codehaus.groovy', module: 'groovy-all' + } } } From 41fe68db0f48a4950b43dccc34c55397a3f6b6c2 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Fri, 6 Apr 2018 19:00:59 +0200 Subject: [PATCH 14/14] Fix notification can't be killed when player is not playing. Fix clicking on close (x) in notification does nothing when player has neither playing nor paused state. Signed-off-by: Yahor Berdnikau --- .../java/org/moire/ultrasonic/service/DownloadServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/DownloadServiceImpl.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/DownloadServiceImpl.java index 587ad7d4..96095c59 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/DownloadServiceImpl.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/DownloadServiceImpl.java @@ -1094,7 +1094,7 @@ public class DownloadServiceImpl extends Service implements DownloadService } setPlayerState(STOPPED); } - else if (playerState == PAUSED) + else { setPlayerState(STOPPED); }