mirror of
https://gitlab.com/ultrasonic/ultrasonic.git
synced 2025-04-24 12:50:58 +03:00
commit
9c117386ba
build.gradledependencies.gradle
cache/src
main/kotlin/org/moire/ultrasonic/cache
test/kotlin/org/moire/ultrasonic/cache
domain/src/main/kotlin/org/moire/ultrasonic/domain
Artist.ktBookmark.ktChatMessage.ktGenre.ktIndexes.ktJukeboxStatus.ktLyrics.ktMusicDirectory.ktMusicFolder.ktPlaylist.ktPodcastsChannel.ktSearchCriteria.ktSearchResult.ktShare.ktVersion.kt
subsonic-api/src
integrationTest/kotlin/org/moire/ultrasonic/api/subsonic
CommonFunctions.ktGetStreamUrlTest.ktSubsonicApiCreateShareTest.ktSubsonicApiErrorsTest.ktSubsonicApiGetAlbumList2Test.ktSubsonicApiGetAlbumListRequestTest.ktSubsonicApiGetAlbumTest.ktSubsonicApiGetArtistTest.ktSubsonicApiGetArtistsTest.ktSubsonicApiGetAvatarTest.ktSubsonicApiGetBookmarksTest.ktSubsonicApiGetChatMessagesTest.ktSubsonicApiGetCoverArtTest.ktSubsonicApiGetGenresTest.ktSubsonicApiGetIndexesTest.ktSubsonicApiGetLicenseTest.ktSubsonicApiGetLyricsTest.ktSubsonicApiGetMusicDirectoryTest.ktSubsonicApiGetMusicFoldersTest.ktSubsonicApiGetPlaylistTest.ktSubsonicApiGetPlaylistsTest.ktSubsonicApiGetPodcastsTest.ktSubsonicApiGetRandomSongsTest.ktSubsonicApiGetSharesTest.ktSubsonicApiGetSongsByGenreTest.ktSubsonicApiGetStarred2Test.ktSubsonicApiGetStarredTest.ktSubsonicApiGetUserTest.ktSubsonicApiGetVideosListTest.ktSubsonicApiJukeboxControlTest.ktSubsonicApiPingRequestTest.ktSubsonicApiSSLTest.ktSubsonicApiSearchTest.ktSubsonicApiSearchThreeTest.ktSubsonicApiSearchTwoTest.ktSubsonicApiStarTest.ktSubsonicApiStreamTest.ktSubsonicApiUnstarTest.kt
interceptors
main/kotlin/org/moire/ultrasonic/api/subsonic
ApiNotSupportedException.ktApiVersionCheckWrapper.ktSubsonicAPIClient.ktSubsonicAPIDefinition.ktSubsonicAPIVersions.kt
interceptors
models
Album.ktArtist.ktBookmark.ktChatMessage.ktGenre.ktIndex.ktIndexes.ktJukeboxStatus.ktLicense.ktLyrics.ktMusicDirectory.ktMusicDirectoryChild.ktPlaylist.ktPodcastChannel.ktSearchResult.ktSearchThreeResult.ktSearchTwoResult.ktShare.ktUser.kt
response
@ -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'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,6 +29,7 @@ allprojects {
|
||||
|
||||
repositories {
|
||||
jcenter()
|
||||
google()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 <T> store(
|
||||
name: String,
|
||||
objectToStore: T,
|
||||
objectSerializer: DomainEntitySerializer<T>
|
||||
name: String,
|
||||
objectToStore: T,
|
||||
objectSerializer: DomainEntitySerializer<T>
|
||||
) {
|
||||
val storeFile = getFile(name)
|
||||
if (!storeFile.exists()) storeFile.createNewFile()
|
||||
@ -47,8 +47,8 @@ class PermanentFileStorage(
|
||||
* Loads object with [name] key using [objectDeserializer] deserializer.
|
||||
*/
|
||||
fun <T> load(
|
||||
name: String,
|
||||
objectDeserializer: DomainEntitySerializer<T>
|
||||
name: String,
|
||||
objectDeserializer: DomainEntitySerializer<T>
|
||||
): T? {
|
||||
val storeFile = getFile(name)
|
||||
if (!storeFile.exists()) return null
|
||||
|
@ -15,9 +15,9 @@ private const val SERIALIZER_VERSION = 1
|
||||
|
||||
private val artistSerializer get() = object : ObjectSerializer<Artist>(SERIALIZER_VERSION) {
|
||||
override fun serializeObject(
|
||||
context: SerializationContext,
|
||||
output: SerializerOutput<out SerializerOutput<*>>,
|
||||
item: Artist
|
||||
context: SerializationContext,
|
||||
output: SerializerOutput<out SerializerOutput<*>>,
|
||||
item: Artist
|
||||
) {
|
||||
output.writeString(item.id)
|
||||
.writeString(item.name)
|
||||
@ -31,9 +31,9 @@ private val artistSerializer get() = object : ObjectSerializer<Artist>(SERIALIZE
|
||||
}
|
||||
|
||||
override fun deserializeObject(
|
||||
context: SerializationContext,
|
||||
input: SerializerInput,
|
||||
versionNumber: Int
|
||||
context: SerializationContext,
|
||||
input: SerializerInput,
|
||||
versionNumber: Int
|
||||
): Artist? {
|
||||
if (versionNumber != SERIALIZER_VERSION) return null
|
||||
|
||||
|
@ -14,9 +14,9 @@ private const val SERIALIZATION_VERSION = 1
|
||||
|
||||
private val indexesSerializer get() = object : ObjectSerializer<Indexes>(SERIALIZATION_VERSION) {
|
||||
override fun serializeObject(
|
||||
context: SerializationContext,
|
||||
output: SerializerOutput<out SerializerOutput<*>>,
|
||||
item: Indexes
|
||||
context: SerializationContext,
|
||||
output: SerializerOutput<out SerializerOutput<*>>,
|
||||
item: Indexes
|
||||
) {
|
||||
val artistListSerializer = getArtistListSerializer()
|
||||
output.writeLong(item.lastModified)
|
||||
@ -26,9 +26,9 @@ private val indexesSerializer get() = object : ObjectSerializer<Indexes>(SERIALI
|
||||
}
|
||||
|
||||
override fun deserializeObject(
|
||||
context: SerializationContext,
|
||||
input: SerializerInput,
|
||||
versionNumber: Int
|
||||
context: SerializationContext,
|
||||
input: SerializerInput,
|
||||
versionNumber: Int
|
||||
): Indexes? {
|
||||
if (versionNumber != SERIALIZATION_VERSION) return null
|
||||
|
||||
|
@ -15,17 +15,17 @@ private const val SERIALIZATION_VERSION = 1
|
||||
private val musicFolderSerializer = object : ObjectSerializer<MusicFolder>(SERIALIZATION_VERSION) {
|
||||
|
||||
override fun serializeObject(
|
||||
context: SerializationContext,
|
||||
output: SerializerOutput<out SerializerOutput<*>>,
|
||||
item: MusicFolder
|
||||
context: SerializationContext,
|
||||
output: SerializerOutput<out 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
|
||||
|
||||
|
@ -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
|
||||
|
@ -1,33 +1,33 @@
|
||||
ext.versions = [
|
||||
versionCode : 66,
|
||||
versionName : "2.3.1",
|
||||
versionCode : 67,
|
||||
versionName : "2.4.0",
|
||||
|
||||
minSdk : 14,
|
||||
targetSdk : 22,
|
||||
compileSdk : 27,
|
||||
gradle : '4.5.1',
|
||||
|
||||
androidTools : "3.0.1",
|
||||
ktlint : "0.15.1",
|
||||
ktlintGradle : "3.0.1",
|
||||
detekt : "1.0.0.RC6-3",
|
||||
androidTools : "3.1.0",
|
||||
ktlint : "0.20.0",
|
||||
ktlintGradle : "3.2.0",
|
||||
detekt : "1.0.0.RC6-4",
|
||||
jacoco : "0.7.9",
|
||||
jacocoAndroid : "0.1.2",
|
||||
|
||||
androidSupport : "22.2.1",
|
||||
|
||||
kotlin : "1.2.21",
|
||||
kotlin : "1.2.31",
|
||||
|
||||
retrofit : "2.1.0",
|
||||
retrofit : "2.4.0",
|
||||
jackson : "2.9.0",
|
||||
okhttp : "3.9.0",
|
||||
okhttp : "3.10.0",
|
||||
semver : "1.0.0",
|
||||
twitterSerial : "0.1.6",
|
||||
|
||||
junit : "4.12",
|
||||
mockito : "2.12.0",
|
||||
mockito : "2.16.0",
|
||||
mockitoKotlin : "1.5.0",
|
||||
kluent : "1.26",
|
||||
kluent : "1.35",
|
||||
apacheCodecs : "1.10",
|
||||
]
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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<Artist> = mutableListOf(),
|
||||
val artists: MutableList<Artist> = mutableListOf()
|
||||
val lastModified: Long,
|
||||
val ignoredArticles: String,
|
||||
val shortcuts: MutableList<Artist> = mutableListOf(),
|
||||
val artists: MutableList<Artist> = mutableListOf()
|
||||
) : Serializable {
|
||||
companion object {
|
||||
private const val serialVersionUID = 8156117238598414701L
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -25,8 +25,9 @@ class MusicDirectory {
|
||||
|
||||
@JvmOverloads
|
||||
fun getChildren(
|
||||
includeDirs: Boolean = true,
|
||||
includeFiles: Boolean = true): List<Entry> {
|
||||
includeDirs: Boolean = true,
|
||||
includeFiles: Boolean = true
|
||||
): List<Entry> {
|
||||
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()
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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<Artist>,
|
||||
val albums: List<Entry>,
|
||||
val songs: List<Entry>
|
||||
val artists: List<Artist>,
|
||||
val albums: List<Entry>,
|
||||
val songs: List<Entry>
|
||||
)
|
||||
|
@ -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<Entry> = 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<Entry> = mutableListOf()
|
||||
) : Serializable {
|
||||
val name: String?
|
||||
get() = url?.let { urlPattern.matcher(url).replaceFirst("$1") }
|
||||
|
@ -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<Version> {
|
||||
|
||||
override fun compareTo(other: Version): Int {
|
||||
|
@ -57,18 +57,20 @@ fun parseDate(dateAsString: String): Calendar {
|
||||
return result
|
||||
}
|
||||
|
||||
fun <T : SubsonicResponse> checkErrorCallParsed(mockWebServerRule: MockWebServerRule,
|
||||
apiRequest: () -> Response<T>): T {
|
||||
fun <T : SubsonicResponse> checkErrorCallParsed(
|
||||
mockWebServerRule: MockWebServerRule,
|
||||
apiRequest: () -> Response<T>
|
||||
): T {
|
||||
mockWebServerRule.enqueueResponse("request_data_not_found_error_response.json")
|
||||
|
||||
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() {
|
||||
@ -77,9 +79,11 @@ fun SubsonicResponse.assertBaseResponseOk() {
|
||||
error `should be` null
|
||||
}
|
||||
|
||||
fun MockWebServerRule.assertRequestParam(responseResourceName: String = "ping_ok.json",
|
||||
expectedParam: String,
|
||||
apiRequest: () -> Response<out Any>) {
|
||||
fun MockWebServerRule.assertRequestParam(
|
||||
responseResourceName: String = "ping_ok.json",
|
||||
expectedParam: String,
|
||||
apiRequest: () -> Response<out Any>
|
||||
) {
|
||||
this.enqueueResponse(responseResourceName)
|
||||
apiRequest()
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
with(response.body().shares[0]) {
|
||||
id `should equal to` "0"
|
||||
url `should equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1NiJ9." +
|
||||
response.body()!!.shares.size `should be equal to` 1
|
||||
with(response.body()!!.shares[0]) {
|
||||
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,
|
||||
|
2
subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt
2
subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiErrorsTest.kt
@ -150,7 +150,7 @@ class SubsonicApiErrorsTest : SubsonicAPIClientTest() {
|
||||
}
|
||||
|
||||
private fun Response<SubsonicResponse>.assertError(expectedError: SubsonicError) =
|
||||
with(body()) {
|
||||
with(body()!!) {
|
||||
error `should not be` null
|
||||
error `should equal` expectedError
|
||||
}
|
||||
|
@ -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
|
||||
@ -28,8 +28,8 @@ class SubsonicApiGetAlbumList2Test : SubsonicAPIClientTest() {
|
||||
val response = client.api.getAlbumList2(STARRED).execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().albumList) {
|
||||
this.size `should equal to` 2
|
||||
with(response.body()!!.albumList) {
|
||||
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,
|
||||
|
@ -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
|
||||
@ -27,8 +27,8 @@ class SubsonicApiGetAlbumListRequestTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getAlbumList(BY_GENRE).execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().albumList) {
|
||||
size `should equal to` 2
|
||||
with(response.body()!!.albumList) {
|
||||
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",
|
||||
|
24
subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetAlbumTest.kt
24
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
|
||||
@ -38,18 +38,18 @@ class SubsonicApiGetAlbumTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getAlbum("512").execute()
|
||||
|
||||
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
|
||||
with(response.body()!!.album) {
|
||||
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",
|
||||
|
@ -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
|
||||
@ -38,12 +38,12 @@ class SubsonicApiGetArtistTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getArtist("100").execute()
|
||||
|
||||
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
|
||||
with(response.body()!!.artist) {
|
||||
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"),
|
||||
|
@ -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,11 +29,11 @@ class SubsonicApiGetArtistsTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getArtists(null).execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().indexes) {
|
||||
lastModified `should equal to` 0L
|
||||
ignoredArticles `should equal to` "The El La Los Las Le Les"
|
||||
with(response.body()!!.indexes) {
|
||||
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),
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
with(response.body().bookmarkList[0]) {
|
||||
position `should equal to` 107914
|
||||
username `should equal to` "CaptainEurope"
|
||||
comment `should equal to` "Look at this"
|
||||
response.body()!!.bookmarkList.size `should be equal to` 1
|
||||
with(response.body()!!.bookmarkList[0]) {
|
||||
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",
|
||||
|
@ -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
|
||||
@ -25,8 +25,8 @@ class SubsonicApiGetChatMessagesTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getChatMessages().execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().chatMessages) {
|
||||
size `should equal to` 2
|
||||
with(response.body()!!.chatMessages) {
|
||||
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,
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
@ -25,8 +25,8 @@ class SubsonicApiGetGenresTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getGenres().execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().genresList) {
|
||||
size `should equal to` 5
|
||||
with(response.body()!!.genresList) {
|
||||
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")
|
||||
|
@ -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(
|
||||
|
@ -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"),
|
||||
|
@ -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
|
||||
|
||||
/**
|
||||
@ -21,10 +21,10 @@ class SubsonicApiGetLyricsTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getLyrics().execute()
|
||||
|
||||
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 " +
|
||||
with(response.body()!!.lyrics) {
|
||||
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"
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
@ -40,15 +40,15 @@ class SubsonicApiGetMusicDirectoryTest : SubsonicAPIClientTest() {
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
|
||||
response.body().musicDirectory `should not be` null
|
||||
with(response.body().musicDirectory) {
|
||||
id `should equal to` "4836"
|
||||
parent `should equal to` "300"
|
||||
response.body()!!.musicDirectory `should not be` null
|
||||
with(response.body()!!.musicDirectory) {
|
||||
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",
|
||||
|
@ -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"),
|
||||
|
@ -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,17 +28,17 @@ class SubsonicApiGetPlaylistTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getPlaylist("4").execute()
|
||||
|
||||
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
|
||||
with(response.body()!!.playlist) {
|
||||
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,
|
||||
|
@ -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
|
||||
@ -27,8 +27,8 @@ class SubsonicApiGetPlaylistsTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getPlaylists().execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().playlists) {
|
||||
size `should equal to` 1
|
||||
with(response.body()!!.playlists) {
|
||||
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",
|
||||
|
@ -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
|
||||
@ -27,20 +27,20 @@ class SubsonicApiGetPodcastsTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getPodcasts().execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
val podcastChannelsList = response.body().podcastChannels
|
||||
podcastChannelsList.size `should equal to` 1
|
||||
val podcastChannelsList = response.body()!!.podcastChannels
|
||||
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)",
|
||||
|
@ -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,8 +25,8 @@ class SubsonicApiGetRandomSongsTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getRandomSongs().execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().songsList) {
|
||||
size `should equal to` 3
|
||||
with(response.body()!!.songsList) {
|
||||
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",
|
||||
|
@ -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
|
||||
with(response.body().shares[0]) {
|
||||
id `should equal to` "0"
|
||||
url `should equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1" +
|
||||
response.body()!!.shares.size `should be equal to` 1
|
||||
with(response.body()!!.shares[0]) {
|
||||
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,
|
||||
|
@ -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,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 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",
|
||||
artist = "Tasadi", year = 2008, genre = "Trance", size = 22467672,
|
||||
|
@ -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
|
||||
@ -27,9 +27,9 @@ 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.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()
|
||||
|
@ -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
|
||||
@ -26,9 +26,9 @@ 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.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()
|
||||
|
38
subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiGetUserTest.kt
38
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
|
||||
@ -25,24 +25,24 @@ class SubsonicApiGetUserTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getUser("some").execute()
|
||||
|
||||
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
|
||||
with(response.body()!!.user) {
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,8 +25,8 @@ class SubsonicApiGetVideosListTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.getVideos().execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().videosList) {
|
||||
size `should equal to` 1
|
||||
with(response.body()!!.videosList) {
|
||||
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",
|
||||
|
@ -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
|
||||
@ -29,11 +29,11 @@ class SubsonicApiJukeboxControlTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.jukeboxControl(STATUS).execute()
|
||||
|
||||
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
|
||||
with(response.body()!!.jukebox) {
|
||||
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()
|
||||
}
|
||||
}
|
||||
@ -45,12 +45,12 @@ class SubsonicApiJukeboxControlTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.jukeboxControl(GET).execute()
|
||||
|
||||
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
|
||||
with(response.body()!!.jukebox) {
|
||||
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",
|
||||
|
@ -13,7 +13,7 @@ class SubsonicApiPingRequestTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.ping().execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body()) {
|
||||
with(response.body()!!) {
|
||||
assertBaseResponseOk()
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
10
subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiSearchTest.kt
10
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
|
||||
@ -29,10 +29,10 @@ class SubsonicApiSearchTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.search().execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().searchResult) {
|
||||
offset `should equal to` 10
|
||||
totalHits `should equal to` 53
|
||||
matchList.size `should equal to` 1
|
||||
with(response.body()!!.searchResult) {
|
||||
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",
|
||||
|
@ -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,17 +30,17 @@ class SubsonicApiSearchThreeTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.search3("some-query").execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().searchResult) {
|
||||
artistList.size `should equal to` 1
|
||||
with(response.body()!!.searchResult) {
|
||||
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",
|
||||
|
@ -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 SubsonicApiSearchTwoTest : SubsonicAPIClientTest() {
|
||||
val response = client.api.search2("some-query").execute()
|
||||
|
||||
assertResponseSuccessful(response)
|
||||
with(response.body().searchResult) {
|
||||
artistList.size `should equal to` 1
|
||||
with(response.body()!!.searchResult) {
|
||||
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",
|
||||
|
@ -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
|
||||
|
10
subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiStreamTest.kt
10
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
|
||||
}
|
||||
}
|
||||
|
||||
|
2
subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicApiUnstarTest.kt
2
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
|
||||
|
@ -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-"
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
|
@ -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<GetArtistsResponse> {
|
||||
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<SearchTwoResponse> {
|
||||
override fun search2(
|
||||
query: String,
|
||||
artistCount: Int?,
|
||||
artistOffset: Int?,
|
||||
albumCount: Int?,
|
||||
albumOffset: Int?,
|
||||
songCount: Int?,
|
||||
musicFolderId: String?
|
||||
): Call<SearchTwoResponse> {
|
||||
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<SearchThreeResponse> {
|
||||
override fun search3(
|
||||
query: String,
|
||||
artistCount: Int?,
|
||||
artistOffset: Int?,
|
||||
albumCount: Int?,
|
||||
albumOffset: Int?,
|
||||
songCount: Int?,
|
||||
musicFolderId: String?
|
||||
): Call<SearchThreeResponse> {
|
||||
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<String>?): Call<SubsonicResponse> {
|
||||
override fun createPlaylist(
|
||||
id: String?,
|
||||
name: String?,
|
||||
songIds: List<String>?
|
||||
): Call<SubsonicResponse> {
|
||||
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<String>?,
|
||||
songIndexesToRemove: List<Int>?): Call<SubsonicResponse> {
|
||||
override fun updatePlaylist(
|
||||
id: String,
|
||||
name: String?,
|
||||
comment: String?,
|
||||
public: Boolean?,
|
||||
songIdsToAdd: List<String>?,
|
||||
songIndexesToRemove: List<Int>?
|
||||
): Call<SubsonicResponse> {
|
||||
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<GetAlbumListResponse> {
|
||||
override fun getAlbumList(
|
||||
type: AlbumListType,
|
||||
size: Int?,
|
||||
offset: Int?,
|
||||
fromYear: Int?,
|
||||
toYear: Int?,
|
||||
genre: String?,
|
||||
musicFolderId: String?
|
||||
): Call<GetAlbumListResponse> {
|
||||
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<GetAlbumList2Response> {
|
||||
override fun getAlbumList2(
|
||||
type: AlbumListType,
|
||||
size: Int?,
|
||||
offset: Int?,
|
||||
fromYear: Int?,
|
||||
toYear: Int?,
|
||||
genre: String?,
|
||||
musicFolderId: String?
|
||||
): Call<GetAlbumList2Response> {
|
||||
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<GetRandomSongsResponse> {
|
||||
override fun getRandomSongs(
|
||||
size: Int?,
|
||||
genre: String?,
|
||||
fromYear: Int?,
|
||||
toYear: Int?,
|
||||
musicFolderId: String?
|
||||
): Call<GetRandomSongsResponse> {
|
||||
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<ResponseBody> {
|
||||
override fun stream(
|
||||
id: String,
|
||||
maxBitRate: Int?,
|
||||
format: String?,
|
||||
timeOffset: Int?,
|
||||
videoSize: String?,
|
||||
estimateContentLength: Boolean?,
|
||||
converted: Boolean?,
|
||||
offset: Long?
|
||||
): Call<ResponseBody> {
|
||||
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<String>?,
|
||||
gain: Float?): Call<JukeboxResponse> {
|
||||
override fun jukeboxControl(
|
||||
action: JukeboxAction,
|
||||
index: Int?,
|
||||
offset: Int?,
|
||||
ids: List<String>?,
|
||||
gain: Float?
|
||||
): Call<JukeboxResponse> {
|
||||
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<String>,
|
||||
description: String?,
|
||||
expires: Long?): Call<SharesResponse> {
|
||||
override fun createShare(
|
||||
idsToShare: List<String>,
|
||||
description: String?,
|
||||
expires: Long?
|
||||
): Call<SharesResponse> {
|
||||
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<SubsonicResponse> {
|
||||
override fun updateShare(
|
||||
id: String,
|
||||
description: String?,
|
||||
expires: Long?
|
||||
): Call<SubsonicResponse> {
|
||||
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<GetSongsByGenreResponse> {
|
||||
override fun getSongsByGenre(
|
||||
genre: String,
|
||||
count: Int,
|
||||
offset: Int,
|
||||
musicFolderId: String?
|
||||
): Call<GetSongsByGenreResponse> {
|
||||
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<SubsonicResponse> {
|
||||
override fun createBookmark(
|
||||
id: String,
|
||||
position: Long,
|
||||
comment: String?
|
||||
): Call<SubsonicResponse> {
|
||||
checkVersion(V1_9_0)
|
||||
return api.createBookmark(id, position, comment)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
@ -139,14 +141,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<SubsonicResponse>(responseBody.byteStream())
|
||||
StreamResponse(apiError = error.error, responseHttpCode = response.code())
|
||||
} else {
|
||||
StreamResponse(stream = responseBody.byteStream(),
|
||||
StreamResponse(stream = responseBody?.byteStream(),
|
||||
responseHttpCode = response.code())
|
||||
}
|
||||
} else {
|
||||
@ -165,7 +167,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
|
||||
}
|
||||
|
@ -54,8 +54,10 @@ interface SubsonicAPIDefinition {
|
||||
fun getMusicFolders(): Call<MusicFoldersResponse>
|
||||
|
||||
@GET("getIndexes.view")
|
||||
fun getIndexes(@Query("musicFolderId") musicFolderId: String?,
|
||||
@Query("ifModifiedSince") ifModifiedSince: Long?): Call<GetIndexesResponse>
|
||||
fun getIndexes(
|
||||
@Query("musicFolderId") musicFolderId: String?,
|
||||
@Query("ifModifiedSince") ifModifiedSince: Long?
|
||||
): Call<GetIndexesResponse>
|
||||
|
||||
@GET("getMusicDirectory.view")
|
||||
fun getMusicDirectory(@Query("id") id: String): Call<GetMusicDirectoryResponse>
|
||||
@ -64,14 +66,18 @@ interface SubsonicAPIDefinition {
|
||||
fun getArtists(@Query("musicFolderId") musicFolderId: String?): Call<GetArtistsResponse>
|
||||
|
||||
@GET("star.view")
|
||||
fun star(@Query("id") id: String? = null,
|
||||
@Query("albumId") albumId: String? = null,
|
||||
@Query("artistId") artistId: String? = null): Call<SubsonicResponse>
|
||||
fun star(
|
||||
@Query("id") id: String? = null,
|
||||
@Query("albumId") albumId: String? = null,
|
||||
@Query("artistId") artistId: String? = null
|
||||
): Call<SubsonicResponse>
|
||||
|
||||
@GET("unstar.view")
|
||||
fun unstar(@Query("id") id: String? = null,
|
||||
@Query("albumId") albumId: String? = null,
|
||||
@Query("artistId") artistId: String? = null): Call<SubsonicResponse>
|
||||
fun unstar(
|
||||
@Query("id") id: String? = null,
|
||||
@Query("albumId") albumId: String? = null,
|
||||
@Query("artistId") artistId: String? = null
|
||||
): Call<SubsonicResponse>
|
||||
|
||||
@GET("getArtist.view")
|
||||
fun getArtist(@Query("id") id: String): Call<GetArtistResponse>
|
||||
@ -80,31 +86,37 @@ interface SubsonicAPIDefinition {
|
||||
fun getAlbum(@Query("id") id: String): Call<GetAlbumResponse>
|
||||
|
||||
@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<SearchResponse>
|
||||
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<SearchResponse>
|
||||
|
||||
@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<SearchTwoResponse>
|
||||
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<SearchTwoResponse>
|
||||
|
||||
@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<SearchThreeResponse>
|
||||
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<SearchThreeResponse>
|
||||
|
||||
@GET("getPlaylist.view")
|
||||
fun getPlaylist(@Query("id") id: String): Call<GetPlaylistResponse>
|
||||
@ -113,119 +125,143 @@ interface SubsonicAPIDefinition {
|
||||
fun getPlaylists(@Query("username") username: String? = null): Call<GetPlaylistsResponse>
|
||||
|
||||
@GET("createPlaylist.view")
|
||||
fun createPlaylist(@Query("playlistId") id: String? = null,
|
||||
@Query("name") name: String? = null,
|
||||
@Query("songId") songIds: List<String>? = null): Call<SubsonicResponse>
|
||||
fun createPlaylist(
|
||||
@Query("playlistId") id: String? = null,
|
||||
@Query("name") name: String? = null,
|
||||
@Query("songId") songIds: List<String>? = null
|
||||
): Call<SubsonicResponse>
|
||||
|
||||
@GET("deletePlaylist.view")
|
||||
fun deletePlaylist(@Query("id") id: String): Call<SubsonicResponse>
|
||||
|
||||
@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<String>? = null,
|
||||
@Query("songIndexToRemove") songIndexesToRemove: List<Int>? = null):
|
||||
@Query("playlistId") id: String,
|
||||
@Query("name") name: String? = null,
|
||||
@Query("comment") comment: String? = null,
|
||||
@Query("public") public: Boolean? = null,
|
||||
@Query("songIdToAdd") songIdsToAdd: List<String>? = null,
|
||||
@Query("songIndexToRemove") songIndexesToRemove: List<Int>? = null
|
||||
):
|
||||
Call<SubsonicResponse>
|
||||
|
||||
@GET("getPodcasts.view")
|
||||
fun getPodcasts(@Query("includeEpisodes") includeEpisodes: Boolean? = null,
|
||||
@Query("id") id: String? = null): Call<GetPodcastsResponse>
|
||||
fun getPodcasts(
|
||||
@Query("includeEpisodes") includeEpisodes: Boolean? = null,
|
||||
@Query("id") id: String? = null
|
||||
): Call<GetPodcastsResponse>
|
||||
|
||||
@GET("getLyrics.view")
|
||||
fun getLyrics(@Query("artist") artist: String? = null,
|
||||
@Query("title") title: String? = null): Call<GetLyricsResponse>
|
||||
fun getLyrics(
|
||||
@Query("artist") artist: String? = null,
|
||||
@Query("title") title: String? = null
|
||||
): Call<GetLyricsResponse>
|
||||
|
||||
@GET("scrobble.view")
|
||||
fun scrobble(@Query("id") id: String,
|
||||
@Query("time") time: Long? = null,
|
||||
@Query("submission") submission: Boolean? = null): Call<SubsonicResponse>
|
||||
fun scrobble(
|
||||
@Query("id") id: String,
|
||||
@Query("time") time: Long? = null,
|
||||
@Query("submission") submission: Boolean? = null
|
||||
): Call<SubsonicResponse>
|
||||
|
||||
@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<GetAlbumListResponse>
|
||||
@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<GetAlbumListResponse>
|
||||
|
||||
@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<GetAlbumList2Response>
|
||||
@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<GetAlbumList2Response>
|
||||
|
||||
@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<GetRandomSongsResponse>
|
||||
@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<GetRandomSongsResponse>
|
||||
|
||||
@GET("getStarred.view")
|
||||
fun getStarred(@Query("musicFolderId") musicFolderId: String? = null): Call<GetStarredResponse>
|
||||
|
||||
@GET("getStarred2.view")
|
||||
fun getStarred2(
|
||||
@Query("musicFolderId") musicFolderId: String? = null): Call<GetStarredTwoResponse>
|
||||
@Query("musicFolderId") musicFolderId: String? = null
|
||||
): Call<GetStarredTwoResponse>
|
||||
|
||||
@Streaming
|
||||
@GET("getCoverArt.view")
|
||||
fun getCoverArt(@Query("id") id: String,
|
||||
@Query("size") size: Long? = null): Call<ResponseBody>
|
||||
fun getCoverArt(
|
||||
@Query("id") id: String,
|
||||
@Query("size") size: Long? = null
|
||||
): Call<ResponseBody>
|
||||
|
||||
@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<ResponseBody>
|
||||
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<ResponseBody>
|
||||
|
||||
@GET("jukeboxControl.view")
|
||||
fun jukeboxControl(@Query("action") action: JukeboxAction,
|
||||
@Query("index") index: Int? = null,
|
||||
@Query("offset") offset: Int? = null,
|
||||
@Query("id") ids: List<String>? = null,
|
||||
@Query("gain") gain: Float? = null): Call<JukeboxResponse>
|
||||
fun jukeboxControl(
|
||||
@Query("action") action: JukeboxAction,
|
||||
@Query("index") index: Int? = null,
|
||||
@Query("offset") offset: Int? = null,
|
||||
@Query("id") ids: List<String>? = null,
|
||||
@Query("gain") gain: Float? = null
|
||||
): Call<JukeboxResponse>
|
||||
|
||||
@GET("getShares.view")
|
||||
fun getShares(): Call<SharesResponse>
|
||||
|
||||
@GET("createShare.view")
|
||||
fun createShare(@Query("id") idsToShare: List<String>,
|
||||
@Query("description") description: String? = null,
|
||||
@Query("expires") expires: Long? = null): Call<SharesResponse>
|
||||
fun createShare(
|
||||
@Query("id") idsToShare: List<String>,
|
||||
@Query("description") description: String? = null,
|
||||
@Query("expires") expires: Long? = null
|
||||
): Call<SharesResponse>
|
||||
|
||||
@GET("deleteShare.view")
|
||||
fun deleteShare(@Query("id") id: String): Call<SubsonicResponse>
|
||||
|
||||
@GET("updateShare.view")
|
||||
fun updateShare(@Query("id") id: String,
|
||||
@Query("description") description: String? = null,
|
||||
@Query("expires") expires: Long? = null): Call<SubsonicResponse>
|
||||
fun updateShare(
|
||||
@Query("id") id: String,
|
||||
@Query("description") description: String? = null,
|
||||
@Query("expires") expires: Long? = null
|
||||
): Call<SubsonicResponse>
|
||||
|
||||
@GET("getGenres.view")
|
||||
fun getGenres(): Call<GenresResponse>
|
||||
|
||||
@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<GetSongsByGenreResponse>
|
||||
@Query("genre") genre: String,
|
||||
@Query("count") count: Int = 10,
|
||||
@Query("offset") offset: Int = 0,
|
||||
@Query("musicFolderId") musicFolderId: String? = null
|
||||
): Call<GetSongsByGenreResponse>
|
||||
|
||||
@GET("getUser.view")
|
||||
fun getUser(@Query("username") username: String): Call<GetUserResponse>
|
||||
@ -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<SubsonicResponse>
|
||||
@Query("id") id: String,
|
||||
@Query("position") position: Long,
|
||||
@Query("comment") comment: String? = null
|
||||
): Call<SubsonicResponse>
|
||||
|
||||
@GET("deleteBookmark.view")
|
||||
fun deleteBookmark(@Query("id") id: String): Call<SubsonicResponse>
|
||||
|
@ -56,8 +56,10 @@ enum class SubsonicAPIVersions(val subsonicVersions: String, val restApiVersion:
|
||||
}
|
||||
|
||||
class SubsonicAPIVersionsDeserializer : JsonDeserializer<SubsonicAPIVersions>() {
|
||||
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!")
|
||||
}
|
||||
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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<MusicDirectoryChild> = 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<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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<Album> = 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<Album> = emptyList()
|
||||
)
|
||||
|
@ -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()
|
||||
)
|
||||
|
@ -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 = ""
|
||||
)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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<Artist> = emptyList())
|
||||
data class Index(
|
||||
val name: String = "",
|
||||
@JsonProperty("artist")
|
||||
val artists: List<Artist> = emptyList()
|
||||
)
|
||||
|
@ -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<Index> = emptyList(),
|
||||
@JsonProperty("shortcut")
|
||||
val shortcutList: List<Artist> = emptyList())
|
||||
data class Indexes(
|
||||
val lastModified: Long = 0,
|
||||
val ignoredArticles: String = "",
|
||||
@JsonProperty("index")
|
||||
val indexList: List<Index> = emptyList(),
|
||||
@JsonProperty("shortcut")
|
||||
val shortcutList: List<Artist> = emptyList()
|
||||
)
|
||||
|
@ -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<MusicDirectoryChild> = emptyList())
|
||||
val currentIndex: Int = -1,
|
||||
val playing: Boolean = false,
|
||||
val gain: Float = 0.0f,
|
||||
val position: Int = 0,
|
||||
@JsonProperty("entry") val playlistEntries: List<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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()
|
||||
)
|
||||
|
@ -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 = ""
|
||||
)
|
||||
|
@ -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<MusicDirectoryChild> = 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<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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<MusicDirectoryChild> = 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<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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<MusicDirectoryChild> = 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<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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<MusicDirectoryChild> = emptyList())
|
||||
val offset: Int = 0,
|
||||
val totalHits: Int = 0,
|
||||
@JsonProperty("match") val matchList: List<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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<Artist> = emptyList(),
|
||||
@JsonProperty("album") val albumList: List<Album> = emptyList(),
|
||||
@JsonProperty("song") val songList: List<MusicDirectoryChild> = emptyList()
|
||||
@JsonProperty("artist") val artistList: List<Artist> = emptyList(),
|
||||
@JsonProperty("album") val albumList: List<Album> = emptyList(),
|
||||
@JsonProperty("song") val songList: List<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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<Artist> = emptyList(),
|
||||
@JsonProperty("album") val albumList: List<MusicDirectoryChild> = emptyList(),
|
||||
@JsonProperty("song") val songList: List<MusicDirectoryChild> = emptyList()
|
||||
@JsonProperty("artist") val artistList: List<Artist> = emptyList(),
|
||||
@JsonProperty("album") val albumList: List<MusicDirectoryChild> = emptyList(),
|
||||
@JsonProperty("song") val songList: List<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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<MusicDirectoryChild> = 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<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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<Int> = 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<Int> = emptyList()
|
||||
)
|
||||
|
@ -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<Bookmark> get() = bookmarksWrapper.bookmarkList
|
||||
}
|
||||
|
||||
internal class BookmarkWrapper(
|
||||
@JsonProperty("bookmark") val bookmarkList: List<Bookmark> = emptyList())
|
||||
@JsonProperty("bookmark") val bookmarkList: List<Bookmark> = emptyList()
|
||||
)
|
||||
|
@ -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<ChatMessage> get() = wrapper.messagesList
|
||||
}
|
||||
|
||||
internal class ChatMessagesWrapper(
|
||||
@JsonProperty("chatMessage") val messagesList: List<ChatMessage> = emptyList())
|
||||
@JsonProperty("chatMessage") val messagesList: List<ChatMessage> = emptyList()
|
||||
)
|
||||
|
@ -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<Genre> get() = genresWrapper.genresList
|
||||
}
|
||||
|
@ -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<Album>
|
||||
@ -18,4 +19,5 @@ class GetAlbumList2Response(status: Status,
|
||||
|
||||
@Suppress("NamingConventionViolation")
|
||||
private class AlbumWrapper2(
|
||||
@JsonProperty("album") val albumList: List<Album> = emptyList())
|
||||
@JsonProperty("album") val albumList: List<Album> = emptyList()
|
||||
)
|
||||
|
@ -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<MusicDirectoryChild>
|
||||
@ -16,4 +17,5 @@ class GetAlbumListResponse(status: Status,
|
||||
}
|
||||
|
||||
private class AlbumWrapper(
|
||||
@JsonProperty("album") val albumList: List<MusicDirectoryChild> = emptyList())
|
||||
@JsonProperty("album") val albumList: List<MusicDirectoryChild> = emptyList()
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
13
subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt
13
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)
|
||||
|
@ -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)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user