From cce7dbaea0708825f9248e0214f09906392b6d98 Mon Sep 17 00:00:00 2001 From: pank-su Date: Wed, 13 Dec 2023 18:54:36 +0300 Subject: [PATCH] feat: add landing --- library/src/commonMain/kotlin/Client.kt | 30 +- .../kotlin/model/account/Experiments.kt | 524 ------------------ .../commonMain/kotlin/model/account/Theme.kt | 13 + .../kotlin/model/account/UserSettings.kt | 23 - .../kotlin/model/account/Visibility.kt | 15 + library/src/commonMain/kotlin/model/ad/Ad.kt | 17 - .../commonMain/kotlin/model/ad/Currency.kt | 5 + .../kotlin/model/ad/PaymentMethod.kt | 10 + .../commonMain/kotlin/model/ad/TypeProduct.kt | 10 + .../commonMain/kotlin/model/album/Album.kt | 102 ---- .../kotlin/model/album/AlbumType.kt | 19 + .../commonMain/kotlin/model/album/Genre.kt | 79 +++ .../commonMain/kotlin/model/album/MetaType.kt | 19 + .../src/commonMain/kotlin/model/feed/Event.kt | 19 - .../commonMain/kotlin/model/feed/EventType.kt | 25 + .../kotlin/model/feed/GeneratedPlaylist.kt | 24 - .../model/feed/GeneratedPlaylistType.kt | 27 + .../commonMain/kotlin/model/landing/Block.kt | 13 + .../kotlin/model/landing/BlockEntity.kt | 19 + .../kotlin/model/landing/BlockType.kt | 42 ++ .../kotlin/model/landing/Landing.kt | 12 + .../kotlin/model/landing/Promotion.kt | 6 + library/src/commonTest/kotlin/LandingTest.kt | 16 + .../commonTest/kotlin/WizardIsPassedTest.kt | 21 + 24 files changed, 376 insertions(+), 714 deletions(-) delete mode 100644 library/src/commonMain/kotlin/model/account/Experiments.kt create mode 100644 library/src/commonMain/kotlin/model/account/Theme.kt create mode 100644 library/src/commonMain/kotlin/model/account/Visibility.kt create mode 100644 library/src/commonMain/kotlin/model/ad/Currency.kt create mode 100644 library/src/commonMain/kotlin/model/ad/PaymentMethod.kt create mode 100644 library/src/commonMain/kotlin/model/ad/TypeProduct.kt create mode 100644 library/src/commonMain/kotlin/model/album/AlbumType.kt create mode 100644 library/src/commonMain/kotlin/model/album/Genre.kt create mode 100644 library/src/commonMain/kotlin/model/album/MetaType.kt create mode 100644 library/src/commonMain/kotlin/model/feed/EventType.kt create mode 100644 library/src/commonMain/kotlin/model/feed/GeneratedPlaylistType.kt create mode 100644 library/src/commonMain/kotlin/model/landing/Block.kt create mode 100644 library/src/commonMain/kotlin/model/landing/BlockEntity.kt create mode 100644 library/src/commonMain/kotlin/model/landing/BlockType.kt create mode 100644 library/src/commonMain/kotlin/model/landing/Landing.kt create mode 100644 library/src/commonMain/kotlin/model/landing/Promotion.kt create mode 100644 library/src/commonTest/kotlin/LandingTest.kt create mode 100644 library/src/commonTest/kotlin/WizardIsPassedTest.kt diff --git a/library/src/commonMain/kotlin/Client.kt b/library/src/commonMain/kotlin/Client.kt index a784f69..7145eac 100644 --- a/library/src/commonMain/kotlin/Client.kt +++ b/library/src/commonMain/kotlin/Client.kt @@ -1,4 +1,5 @@ import dsl.YandexMusicTagMaker +import exceptions.NotAuthenticatedException import exceptions.SessionExpiredException import io.ktor.client.* import io.ktor.client.call.* @@ -9,14 +10,16 @@ import io.ktor.client.request.* import io.ktor.client.request.forms.* import io.ktor.http.* import io.ktor.serialization.kotlinx.json.* +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import model.* -import model.account.Experiments import model.account.PromoCodeStatus import model.account.Status import model.account.UserSettings import model.ad.Ad import model.feed.Feed +import model.landing.BlockType +import model.landing.Landing expect fun getHttpClientEngine(): HttpClientEngine @@ -124,10 +127,12 @@ class Client { } } } - } - headers { - remove(HttpHeaders.ContentType) - remove(HttpHeaders.ContentLength) + } else if (method == HttpMethod.Get) { + url { + body.forEach { + parameters.append(it.key, it.value) + } + } } }.body>().result.apply { client = this@Client } } @@ -197,4 +202,19 @@ class Client { ) suspend fun feed() = request("feed") + + suspend fun feedWizardIsPassed() = + requestPrimitive>("feed", "wizard", "is-passed").value!!["isWizardPassed"] as Boolean + + suspend fun landing(vararg blocks: BlockType) = + request( + listOf("landing3"), + body = hashMapOf( + "blocks" to blocks.joinToString(",") { + val json = Json.encodeToString(it) + json.substring(1.. // TODO +) diff --git a/library/src/commonMain/kotlin/model/landing/BlockEntity.kt b/library/src/commonMain/kotlin/model/landing/BlockEntity.kt new file mode 100644 index 0000000..53961d2 --- /dev/null +++ b/library/src/commonMain/kotlin/model/landing/BlockEntity.kt @@ -0,0 +1,19 @@ +package model.landing + +import kotlinx.serialization.Serializable +import model.feed.GeneratedPlaylist + + +@Serializable +abstract class BlockEntity { + abstract val id: String + abstract val type: BlockType +} + +@Serializable +data class GeneratedEntity(override val id: String, override val type: BlockType, val data: GeneratedPlaylist) : + BlockEntity() + + +@Serializable +data class PromotionEntity(override val id: String, override val type: BlockType, val data: Promotion) : BlockEntity() diff --git a/library/src/commonMain/kotlin/model/landing/BlockType.kt b/library/src/commonMain/kotlin/model/landing/BlockType.kt new file mode 100644 index 0000000..01af212 --- /dev/null +++ b/library/src/commonMain/kotlin/model/landing/BlockType.kt @@ -0,0 +1,42 @@ +package model.landing + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonNames + +@OptIn(ExperimentalSerializationApi::class) +@Serializable +enum class BlockType { + @SerialName("personalplaylists") + @JsonNames("personalplaylists", "personal-playlists", "personal-playlist") + PersonalPlaylists, + + @SerialName("promotions") + @JsonNames("promotions") + Promotions, + + @SerialName("new-releases") + NewReleases, + + @SerialName("new-playlists") + NewPlaylists, + + @SerialName("mixes") + Mixes, + + @SerialName("chart") + Chart, + + @SerialName("artists") + Artists, + + @SerialName("albums") + Albums, + + @SerialName("playlists") + Playlists, + + @SerialName("play_contexts") + PlayContexts +} \ No newline at end of file diff --git a/library/src/commonMain/kotlin/model/landing/Landing.kt b/library/src/commonMain/kotlin/model/landing/Landing.kt new file mode 100644 index 0000000..524426c --- /dev/null +++ b/library/src/commonMain/kotlin/model/landing/Landing.kt @@ -0,0 +1,12 @@ +package model.landing + +import kotlinx.serialization.Serializable +import model.Result + + +@Serializable +data class Landing( + val pumpkin: Boolean, + val contentId: String, + val blocks: List +) : Result() \ No newline at end of file diff --git a/library/src/commonMain/kotlin/model/landing/Promotion.kt b/library/src/commonMain/kotlin/model/landing/Promotion.kt new file mode 100644 index 0000000..5ef101b --- /dev/null +++ b/library/src/commonMain/kotlin/model/landing/Promotion.kt @@ -0,0 +1,6 @@ +package model.landing + +import kotlinx.serialization.Serializable + +@Serializable +data class Promotion(val title: String) \ No newline at end of file diff --git a/library/src/commonTest/kotlin/LandingTest.kt b/library/src/commonTest/kotlin/LandingTest.kt new file mode 100644 index 0000000..4cba7db --- /dev/null +++ b/library/src/commonTest/kotlin/LandingTest.kt @@ -0,0 +1,16 @@ +import dsl.client +import io.getenv +import kotlinx.coroutines.test.runTest +import model.landing.BlockType +import kotlin.test.Test + +class LandingTest { + + @Test + fun gettingTest() = runTest { + val token = getenv("token") ?: return@runTest + println( + client { this.token = token }.landing(BlockType.PersonalPlaylists) + ) + } +} \ No newline at end of file diff --git a/library/src/commonTest/kotlin/WizardIsPassedTest.kt b/library/src/commonTest/kotlin/WizardIsPassedTest.kt new file mode 100644 index 0000000..13c3c7a --- /dev/null +++ b/library/src/commonTest/kotlin/WizardIsPassedTest.kt @@ -0,0 +1,21 @@ +import dsl.client +import io.getenv +import kotlinx.coroutines.test.runTest +import kotlin.test.Test +import kotlin.test.assertFails + +class WizardIsPassedTest { + + @Test + fun gettingTest() = runTest { + assertFails { + client { + + }.feedWizardIsPassed() + } + val token = getenv("token") ?: return@runTest + client { + this.token = token + }.feedWizardIsPassed() + } +} \ No newline at end of file