98 lines
4.1 KiB
Kotlin
98 lines
4.1 KiB
Kotlin
package it.vfsfitvnm.youtubemusic.requests
|
|
|
|
import io.ktor.client.call.body
|
|
import io.ktor.client.request.post
|
|
import io.ktor.client.request.setBody
|
|
import it.vfsfitvnm.youtubemusic.Innertube
|
|
import it.vfsfitvnm.youtubemusic.models.BrowseResponse
|
|
import it.vfsfitvnm.youtubemusic.models.ContinuationResponse
|
|
import it.vfsfitvnm.youtubemusic.models.GridRenderer
|
|
import it.vfsfitvnm.youtubemusic.models.MusicResponsiveListItemRenderer
|
|
import it.vfsfitvnm.youtubemusic.models.MusicShelfRenderer
|
|
import it.vfsfitvnm.youtubemusic.models.MusicTwoRowItemRenderer
|
|
import it.vfsfitvnm.youtubemusic.models.bodies.BrowseBody
|
|
import it.vfsfitvnm.youtubemusic.models.bodies.ContinuationBody
|
|
import it.vfsfitvnm.youtubemusic.utils.runCatchingNonCancellable
|
|
|
|
suspend fun <T : Innertube.Item> Innertube.itemsPage(
|
|
body: BrowseBody,
|
|
fromMusicResponsiveListItemRenderer: (MusicResponsiveListItemRenderer) -> T? = { null },
|
|
fromMusicTwoRowItemRenderer: (MusicTwoRowItemRenderer) -> T? = { null },
|
|
) = runCatchingNonCancellable {
|
|
val response = client.post(browse) {
|
|
setBody(body)
|
|
// mask("contents.singleColumnBrowseResultsRenderer.tabs.tabRenderer.content.sectionListRenderer.contents(musicPlaylistShelfRenderer(continuations,contents.$musicResponsiveListItemRendererMask),gridRenderer(continuations,items.$musicTwoRowItemRendererMask))")
|
|
}.body<BrowseResponse>()
|
|
|
|
val sectionListRendererContent = response
|
|
.contents
|
|
?.singleColumnBrowseResultsRenderer
|
|
?.tabs
|
|
?.firstOrNull()
|
|
?.tabRenderer
|
|
?.content
|
|
?.sectionListRenderer
|
|
?.contents
|
|
?.firstOrNull()
|
|
|
|
itemsPageFromMusicShelRendererOrGridRenderer(
|
|
musicShelfRenderer = sectionListRendererContent
|
|
?.musicShelfRenderer,
|
|
gridRenderer = sectionListRendererContent
|
|
?.gridRenderer,
|
|
fromMusicResponsiveListItemRenderer = fromMusicResponsiveListItemRenderer,
|
|
fromMusicTwoRowItemRenderer = fromMusicTwoRowItemRenderer,
|
|
)
|
|
}
|
|
|
|
suspend fun <T : Innertube.Item> Innertube.itemsPage(
|
|
body: ContinuationBody,
|
|
fromMusicResponsiveListItemRenderer: (MusicResponsiveListItemRenderer) -> T? = { null },
|
|
fromMusicTwoRowItemRenderer: (MusicTwoRowItemRenderer) -> T? = { null },
|
|
) = runCatchingNonCancellable {
|
|
val response = client.post(browse) {
|
|
setBody(body)
|
|
// mask("contents.singleColumnBrowseResultsRenderer.tabs.tabRenderer.content.sectionListRenderer.contents(musicPlaylistShelfRenderer(continuations,contents.$musicResponsiveListItemRendererMask),gridRenderer(continuations,items.$musicTwoRowItemRendererMask))")
|
|
}.body<ContinuationResponse>()
|
|
|
|
itemsPageFromMusicShelRendererOrGridRenderer(
|
|
musicShelfRenderer = response
|
|
.continuationContents
|
|
?.musicShelfContinuation,
|
|
gridRenderer = null,
|
|
fromMusicResponsiveListItemRenderer = fromMusicResponsiveListItemRenderer,
|
|
fromMusicTwoRowItemRenderer = fromMusicTwoRowItemRenderer,
|
|
)
|
|
}
|
|
|
|
private fun <T : Innertube.Item> itemsPageFromMusicShelRendererOrGridRenderer(
|
|
musicShelfRenderer: MusicShelfRenderer?,
|
|
gridRenderer: GridRenderer?,
|
|
fromMusicResponsiveListItemRenderer: (MusicResponsiveListItemRenderer) -> T?,
|
|
fromMusicTwoRowItemRenderer: (MusicTwoRowItemRenderer) -> T?,
|
|
): Innertube.ItemsPage<T>? {
|
|
return if (musicShelfRenderer != null) {
|
|
Innertube.ItemsPage(
|
|
continuation = musicShelfRenderer
|
|
.continuations
|
|
?.firstOrNull()
|
|
?.nextContinuationData
|
|
?.continuation,
|
|
items = musicShelfRenderer
|
|
.contents
|
|
?.mapNotNull(MusicShelfRenderer.Content::musicResponsiveListItemRenderer)
|
|
?.mapNotNull(fromMusicResponsiveListItemRenderer)
|
|
)
|
|
} else if (gridRenderer != null) {
|
|
Innertube.ItemsPage(
|
|
continuation = null,
|
|
items = gridRenderer
|
|
.items
|
|
?.mapNotNull(GridRenderer.Item::musicTwoRowItemRenderer)
|
|
?.mapNotNull(fromMusicTwoRowItemRenderer)
|
|
)
|
|
} else {
|
|
null
|
|
}
|
|
}
|