fix(playlist): usage of new youtube api format for playlists/albums. Credits to LlinksRechts @ https://github.com/vfsfitvnm/ViMusic/pull/1654.

This commit is contained in:
Sublimeful 2024-07-15 15:16:02 -05:00
parent e6bdd6c114
commit d7b33ed329
No known key found for this signature in database
GPG key ID: 0F07FC4700815A4D
7 changed files with 35 additions and 11 deletions

View file

@ -67,7 +67,7 @@ fun AlbumScreen(browseId: String) {
.collect { (currentAlbum, tabIndex) -> .collect { (currentAlbum, tabIndex) ->
album = currentAlbum album = currentAlbum
if (albumPage == null && (currentAlbum?.timestamp == null || tabIndex == 1)) { if (albumPage == null && (currentAlbum?.timestamp == null || currentAlbum.title == null || tabIndex == 1)) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
Innertube.albumPage(BrowseBody(browseId = browseId)) Innertube.albumPage(BrowseBody(browseId = browseId))
?.onSuccess { currentAlbumPage -> ?.onSuccess { currentAlbumPage ->

View file

@ -13,6 +13,7 @@ data class BrowseResponse(
@Serializable @Serializable
data class Contents( data class Contents(
val singleColumnBrowseResultsRenderer: Tabs?, val singleColumnBrowseResultsRenderer: Tabs?,
val twoColumnBrowseResultsRenderer: TwoColResults?,
val sectionListRenderer: SectionListRenderer?, val sectionListRenderer: SectionListRenderer?,
) )

View file

@ -7,7 +7,9 @@ data class MusicShelfRenderer(
val bottomEndpoint: NavigationEndpoint?, val bottomEndpoint: NavigationEndpoint?,
val contents: List<Content>?, val contents: List<Content>?,
val continuations: List<Continuation>?, val continuations: List<Continuation>?,
val title: Runs? val title: Runs?,
val thumbnail: ThumbnailRenderer?,
val subtitle: Runs?
) { ) {
@Serializable @Serializable
data class Content( data class Content(
@ -23,7 +25,7 @@ data class MusicShelfRenderer(
?: emptyList()) to ?: emptyList()) to
(musicResponsiveListItemRenderer (musicResponsiveListItemRenderer
?.flexColumns ?.flexColumns
?.lastOrNull() ?.getOrNull(1)
?.musicResponsiveListItemFlexColumnRenderer ?.musicResponsiveListItemFlexColumnRenderer
?.text ?.text
?.splitBySeparator() ?.splitBySeparator()

View file

@ -16,6 +16,8 @@ data class SectionListRenderer(
val musicCarouselShelfRenderer: MusicCarouselShelfRenderer?, val musicCarouselShelfRenderer: MusicCarouselShelfRenderer?,
@JsonNames("musicPlaylistShelfRenderer") @JsonNames("musicPlaylistShelfRenderer")
val musicShelfRenderer: MusicShelfRenderer?, val musicShelfRenderer: MusicShelfRenderer?,
val musicResponsiveHeaderRenderer: MusicShelfRenderer?,
val musicPlaylistShelfRenderer: MusicShelfRenderer?,
val gridRenderer: GridRenderer?, val gridRenderer: GridRenderer?,
val musicDescriptionShelfRenderer: MusicDescriptionShelfRenderer?, val musicDescriptionShelfRenderer: MusicDescriptionShelfRenderer?,
) { ) {

View file

@ -0,0 +1,14 @@
package it.vfsfitvnm.innertube.models
import kotlinx.serialization.Serializable
@Serializable
data class TwoColResults(
val secondaryContents: SecondaryContents?,
val tabs: List<Tabs.Tab>?
) {
@Serializable
data class SecondaryContents(
val sectionListRenderer: SectionListRenderer?
)
}

View file

@ -37,7 +37,7 @@ suspend fun <T : Innertube.Item> Innertube.itemsPage(
itemsPageFromMusicShelRendererOrGridRenderer( itemsPageFromMusicShelRendererOrGridRenderer(
musicShelfRenderer = sectionListRendererContent musicShelfRenderer = sectionListRendererContent
?.musicShelfRenderer, ?.musicPlaylistShelfRenderer,
gridRenderer = sectionListRendererContent gridRenderer = sectionListRendererContent
?.gridRenderer, ?.gridRenderer,
fromMusicResponsiveListItemRenderer = fromMusicResponsiveListItemRenderer, fromMusicResponsiveListItemRenderer = fromMusicResponsiveListItemRenderer,

View file

@ -16,26 +16,31 @@ import it.vfsfitvnm.innertube.utils.runCatchingNonCancellable
suspend fun Innertube.playlistPage(body: BrowseBody) = runCatchingNonCancellable { suspend fun Innertube.playlistPage(body: BrowseBody) = runCatchingNonCancellable {
val response = client.post(browse) { val response = client.post(browse) {
setBody(body) setBody(body)
mask("contents.singleColumnBrowseResultsRenderer.tabs.tabRenderer.content.sectionListRenderer.contents(musicPlaylistShelfRenderer(continuations,contents.$musicResponsiveListItemRendererMask),musicCarouselShelfRenderer.contents.$musicTwoRowItemRendererMask),header.musicDetailHeaderRenderer(title,subtitle,thumbnail),microformat") mask("contents.twoColumnBrowseResultsRenderer(tabs.tabRenderer.content.sectionListRenderer.contents.musicResponsiveHeaderRenderer(title,subtitle,thumbnail),secondaryContents.sectionListRenderer.contents(musicPlaylistShelfRenderer(continuations,contents.$musicResponsiveListItemRendererMask),musicCarouselShelfRenderer.contents.$musicTwoRowItemRendererMask)),microformat")
}.body<BrowseResponse>() }.body<BrowseResponse>()
val musicDetailHeaderRenderer = response val musicDetailHeaderRenderer = response
.header
?.musicDetailHeaderRenderer
val sectionListRendererContents = response
.contents .contents
?.singleColumnBrowseResultsRenderer ?.twoColumnBrowseResultsRenderer
?.tabs ?.tabs
?.firstOrNull() ?.firstOrNull()
?.tabRenderer ?.tabRenderer
?.content ?.content
?.sectionListRenderer ?.sectionListRenderer
?.contents ?.contents
?.firstOrNull()
?.musicResponsiveHeaderRenderer
val sectionListRendererContents = response
.contents
?.twoColumnBrowseResultsRenderer
?.secondaryContents
?.sectionListRenderer
?.contents
val musicShelfRenderer = sectionListRendererContents val musicShelfRenderer = sectionListRendererContents
?.firstOrNull() ?.firstOrNull()
?.musicShelfRenderer ?.musicPlaylistShelfRenderer
val musicCarouselShelfRenderer = sectionListRendererContents val musicCarouselShelfRenderer = sectionListRendererContents
?.getOrNull(1) ?.getOrNull(1)