107 lines
4.0 KiB
Kotlin
107 lines
4.0 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.MusicCarouselShelfRenderer
|
|
import it.vfsfitvnm.youtubemusic.models.MusicShelfRenderer
|
|
import it.vfsfitvnm.youtubemusic.models.SectionListRenderer
|
|
import it.vfsfitvnm.youtubemusic.models.bodies.BrowseBody
|
|
import it.vfsfitvnm.youtubemusic.utils.findSectionByTitle
|
|
import it.vfsfitvnm.youtubemusic.utils.from
|
|
import it.vfsfitvnm.youtubemusic.utils.runCatchingNonCancellable
|
|
|
|
suspend fun Innertube.artistPage(body: BrowseBody): Result<Innertube.ArtistPage>? =
|
|
runCatchingNonCancellable {
|
|
val response = client.post(browse) {
|
|
setBody(body)
|
|
mask("contents,header")
|
|
}.body<BrowseResponse>()
|
|
|
|
fun findSectionByTitle(text: String): SectionListRenderer.Content? {
|
|
return response
|
|
.contents
|
|
?.singleColumnBrowseResultsRenderer
|
|
?.tabs
|
|
?.get(0)
|
|
?.tabRenderer
|
|
?.content
|
|
?.sectionListRenderer
|
|
?.findSectionByTitle(text)
|
|
}
|
|
|
|
val songsSection = findSectionByTitle("Songs")?.musicShelfRenderer
|
|
val albumsSection = findSectionByTitle("Albums")?.musicCarouselShelfRenderer
|
|
val singlesSection = findSectionByTitle("Singles")?.musicCarouselShelfRenderer
|
|
|
|
Innertube.ArtistPage(
|
|
name = response
|
|
.header
|
|
?.musicImmersiveHeaderRenderer
|
|
?.title
|
|
?.text,
|
|
description = response
|
|
.header
|
|
?.musicImmersiveHeaderRenderer
|
|
?.description
|
|
?.text,
|
|
thumbnail = (response
|
|
.header
|
|
?.musicImmersiveHeaderRenderer
|
|
?.foregroundThumbnail
|
|
?: response
|
|
.header
|
|
?.musicImmersiveHeaderRenderer
|
|
?.thumbnail)
|
|
?.musicThumbnailRenderer
|
|
?.thumbnail
|
|
?.thumbnails
|
|
?.getOrNull(0),
|
|
shuffleEndpoint = response
|
|
.header
|
|
?.musicImmersiveHeaderRenderer
|
|
?.playButton
|
|
?.buttonRenderer
|
|
?.navigationEndpoint
|
|
?.watchEndpoint,
|
|
radioEndpoint = response
|
|
.header
|
|
?.musicImmersiveHeaderRenderer
|
|
?.startRadioButton
|
|
?.buttonRenderer
|
|
?.navigationEndpoint
|
|
?.watchEndpoint,
|
|
songs = songsSection
|
|
?.contents
|
|
?.mapNotNull(MusicShelfRenderer.Content::musicResponsiveListItemRenderer)
|
|
?.mapNotNull(Innertube.SongItem::from),
|
|
songsEndpoint = songsSection
|
|
?.bottomEndpoint
|
|
?.browseEndpoint,
|
|
albums = albumsSection
|
|
?.contents
|
|
?.mapNotNull(MusicCarouselShelfRenderer.Content::musicTwoRowItemRenderer)
|
|
?.mapNotNull(Innertube.AlbumItem::from),
|
|
albumsEndpoint = albumsSection
|
|
?.header
|
|
?.musicCarouselShelfBasicHeaderRenderer
|
|
?.moreContentButton
|
|
?.buttonRenderer
|
|
?.navigationEndpoint
|
|
?.browseEndpoint,
|
|
singles = singlesSection
|
|
?.contents
|
|
?.mapNotNull(MusicCarouselShelfRenderer.Content::musicTwoRowItemRenderer)
|
|
?.mapNotNull(Innertube.AlbumItem::from),
|
|
singlesEndpoint = singlesSection
|
|
?.header
|
|
?.musicCarouselShelfBasicHeaderRenderer
|
|
?.moreContentButton
|
|
?.buttonRenderer
|
|
?.navigationEndpoint
|
|
?.browseEndpoint,
|
|
)
|
|
}
|