diff --git a/src/YTMusic.ts b/src/YTMusic.ts index b33d851..55a7555 100644 --- a/src/YTMusic.ts +++ b/src/YTMusic.ts @@ -15,15 +15,15 @@ import { VideoDetailed, VideoFull, } from "./@types/types" +import { FE_MUSIC_HOME } from "./constants" import AlbumParser from "./parsers/AlbumParser" import ArtistParser from "./parsers/ArtistParser" +import Parser from "./parsers/Parser" import PlaylistParser from "./parsers/PlaylistParser" import SearchParser from "./parsers/SearchParser" import SongParser from "./parsers/SongParser" import VideoParser from "./parsers/VideoParser" import { traverse, traverseList, traverseString } from "./utils/traverse" -import { FE_MUSIC_HOME } from "./constants" -import Parser from "./parsers/Parser" export default class YTMusic { private cookiejar: CookieJar @@ -510,11 +510,21 @@ export default class YTMusic { public async getHome(): Promise { const results: HomePageContent[] = [] const page = await this.constructRequest("browse", { browseId: FE_MUSIC_HOME }) - traverseList(page, "sectionListRenderer", "contents").forEach(content => { + traverseList(page, "contents").forEach(content => { const parsed = Parser.parseMixedContent(content) parsed && results.push(parsed) }) + let continuation = traverseString(page, "continuation") + while (continuation) { + const nextPage = await this.constructRequest("browse", {}, { continuation }) + traverseList(nextPage, "contents").forEach(content => { + const parsed = Parser.parseMixedContent(content) + parsed && results.push(parsed) + }) + continuation = traverseString(nextPage, "continuation") + } + return results } } diff --git a/src/parsers/SongParser.ts b/src/parsers/SongParser.ts index 39c354c..cb7f21c 100644 --- a/src/parsers/SongParser.ts +++ b/src/parsers/SongParser.ts @@ -25,10 +25,11 @@ export default class SongParser { } public static parseSearchResult(item: any): SongDetailed { - const columns = traverseList(item, "flexColumns", "runs").flat() + const columns = traverseList(item, "flexColumns", "runs") - const title = columns.find(isTitle) - const artist = columns.find(isArtist) || columns[1] + // It is not possible to identify the title and author + const title = columns[0] + const artist = columns[1] const album = columns.find(isAlbum) ?? null const duration = columns.find(isDuration)