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 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() 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 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() itemsPageFromMusicShelRendererOrGridRenderer( musicShelfRenderer = response .continuationContents ?.musicShelfContinuation, gridRenderer = null, fromMusicResponsiveListItemRenderer = fromMusicResponsiveListItemRenderer, fromMusicTwoRowItemRenderer = fromMusicTwoRowItemRenderer, ) } private fun itemsPageFromMusicShelRendererOrGridRenderer( musicShelfRenderer: MusicShelfRenderer?, gridRenderer: GridRenderer?, fromMusicResponsiveListItemRenderer: (MusicResponsiveListItemRenderer) -> T?, fromMusicTwoRowItemRenderer: (MusicTwoRowItemRenderer) -> T?, ): Innertube.ItemsPage? { 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 } }