Rename youtube-music module to innertube and rewrite it

This commit is contained in:
vfsfitvnm
2022-10-02 15:25:07 +02:00
parent 4bc3671be1
commit 917e194d63
126 changed files with 2210 additions and 2145 deletions

View File

@@ -0,0 +1,97 @@
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
}
}