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? = runCatchingNonCancellable { val response = client.post(browse) { setBody(body) mask("contents,header") }.body() 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 ?.substringBeforeLast("\n\nFrom Wikipedia"), thumbnail = 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, ) }