diff --git a/builder.go b/builder.go index 0c22404..5319446 100644 --- a/builder.go +++ b/builder.go @@ -205,7 +205,7 @@ func NavigationButton(s gjson.Result) []Item { return r } -func MultiSelectMenuItemRenderer(j gjson.Result) []Item { +func MultiSelectMenuItemRenderer(j, ref gjson.Result) []Item { r := []Item{} @@ -219,8 +219,12 @@ func MultiSelectMenuItemRenderer(j gjson.Result) []Item { go func() { defer wg.Done() + steg := v.Get("formItemEntityKey").String() + id := ref.Get("#(entityKey == " + steg + ")" + + ".payload.musicFormBooleanChoice.opaqueToken") + r = append(r, Item{ - Id: v.Get("selectedCommand.commandExecutorCommand.commands.#(musicBrowseFormBinderCommand).musicBrowseFormBinderCommand.browseEndpoint.params").String(), + Id: id.String(), Title: RunsText(v.Get("title")), }) }() diff --git a/fetch.go b/fetch.go index 1633ebe..17ca371 100644 --- a/fetch.go +++ b/fetch.go @@ -13,7 +13,7 @@ import ( func Fetch(path string, data []byte) (string, int, error) { - url := "https://music.youtube.com/youtubei/v1/" + path + "?key=AIzaSyC9XL3ZjWddXya6X74dJoCTL-WEYFDNX30&prettyPrint=false" + url := "https://music.youtube.com/youtubei/v1/" + path + "?alt=json&key=AIzaSyC9XL3ZjWddXya6X74dJoCTL-WEYFDNX30&prettyPrint=false" req, err := http.NewRequest("POST", url, bytes.NewBuffer(data)) if err != nil { @@ -64,7 +64,7 @@ func FetchExplore() (string, int) { id := "FEmusic_explore" - context := GetTypeBrowse("", id, "") + context := GetTypeBrowse("", id, "", "") raw, status := FetchBrowse(context) @@ -80,7 +80,7 @@ func FetchGenres() (string, int) { id := "FEmusic_moods_and_genres" - context := GetTypeBrowse("", id, "") + context := GetTypeBrowse("", id, "", "") raw, status := FetchBrowse(context) @@ -96,7 +96,7 @@ func FetchGenre(param string) (string, int) { id := "FEmusic_moods_and_genres_category" - context := GetTypeBrowse("", id, param) + context := GetTypeBrowse("", id, param, "") raw, status := FetchBrowse(context) @@ -108,11 +108,11 @@ func FetchGenre(param string) (string, int) { return res, status } -func FetchCharts(params string) (string, int) { +func FetchCharts(params, code string) (string, int) { id := "FEmusic_charts" - context := GetTypeBrowse("", id, params) + context := GetTypeBrowse("", id, params, code) raw, status := FetchBrowse(context) @@ -126,7 +126,7 @@ func FetchCharts(params string) (string, int) { func FetchArtist(id string) (string, int) { - context := GetTypeBrowse("artist", id, "") + context := GetTypeBrowse("artist", id, "", "") raw, status := FetchBrowse(context) @@ -140,7 +140,7 @@ func FetchArtist(id string) (string, int) { func FetchLyrics(id string) (string, int) { - context := GetTypeBrowse("lyrics", id, "") + context := GetTypeBrowse("lyrics", id, "", "") raw, status := FetchBrowse(context) @@ -154,7 +154,7 @@ func FetchLyrics(id string) (string, int) { func FetchAlbum(id string) (string, int) { - context := GetTypeBrowse("album", id, "") + context := GetTypeBrowse("album", id, "", "") raw, status := FetchBrowse(context) diff --git a/main.go b/main.go index 8ee5249..517677a 100644 --- a/main.go +++ b/main.go @@ -59,7 +59,7 @@ func HandleGenre(c *fiber.Ctx) error { func HandleCharts(c *fiber.Ctx) error { defer calc()() - res, status := FetchCharts(c.Params("id")) + res, status := FetchCharts(c.Query("params"), c.Query("code")) return c.Status(status).SendString(res) } @@ -106,7 +106,7 @@ func main() { app.Get("/explore", HandleExplore) app.Get("/genres", HandleGenres) app.Get("/genres/:id", HandleGenre) - app.Get("/charts/:id", HandleCharts) + app.Get("/charts", HandleCharts) app.Get("/next/:id", HandleNext) app.Get("/browse/:id", HandleBrowse) app.Get("/channel/:id", HandleArtist) diff --git a/parser.go b/parser.go index 5c8f231..d410eb3 100644 --- a/parser.go +++ b/parser.go @@ -125,16 +125,29 @@ func ParseCharts(raw string) (string, error) { j := gjson.Parse(raw) - c := j.Get("contents.singleColumnBrowseResultsRenderer.tabs.0.tabRenderer.content.sectionListRenderer.contents") + c := j.Get("contents.singleColumnBrowseResultsRenderer" + + ".tabs.0.tabRenderer.content.sectionListRenderer.contents") - o := c.Get("0.musicShelfRenderer.subheaders.0.musicSideAlignedItemRenderer.startItems.0.musicSortFilterButtonRenderer") - a := c.Get("#(musicCarouselShelfRenderer.header.musicCarouselShelfBasicHeaderRenderer.title.runs.0.text == Top artists).musicCarouselShelfRenderer.contents") - t := c.Get("#(musicCarouselShelfRenderer.header.musicCarouselShelfBasicHeaderRenderer.title.runs.0.text == Trending).musicCarouselShelfRenderer.contents") + o := c.Get("0.musicShelfRenderer.subheaders.0" + + ".musicSideAlignedItemRenderer.startItems.0" + + ".musicSortFilterButtonRenderer") + + a := c.Get("#(musicCarouselShelfRenderer.header.musicCarouselShelfBasicHeaderRenderer" + + ".title.runs.0.text == Top artists)" + + ".musicCarouselShelfRenderer.contents") + + t := c.Get("#(musicCarouselShelfRenderer.header.musicCarouselShelfBasicHeaderRenderer" + + ".title.runs.0.text == Trending)" + + ".musicCarouselShelfRenderer.contents") + + opts := o.Get("menu.musicMultiSelectMenuRenderer.options" + + ".#.musicMultiSelectMenuItemRenderer") + ref := j.Get("frameworkUpdates.entityBatchUpdate.mutations") val := Charts{ Options: Options{ Default: RunsText(o.Get("title")), - All: MultiSelectMenuItemRenderer(o.Get("menu.musicMultiSelectMenuRenderer.options.#.musicMultiSelectMenuItemRenderer")), + All: MultiSelectMenuItemRenderer(opts, ref), }, Artists: ResponsiveListItemRendererCH(a), Trending: ResponsiveListItemRenderer(t), diff --git a/structs.go b/structs.go index 99d7232..a970762 100644 --- a/structs.go +++ b/structs.go @@ -90,13 +90,17 @@ type Context struct { } type PageType struct { - PageType string `json:"pageType",omitempty` + PageType string `json:"pageType,omitempty"` } type BrowseMusicConfig struct { MusicConfig PageType `json:"browseEndpointContextMusicConfig,omitempty"` } +type Form struct { + Values []string `json:"selectedValues"` +} + type WatchMusicConfig struct { Panel bool `json:"hasPersistentPlaylistPanel,omitempty"` Type string `json:"musicVideoType,omitempty"` @@ -107,6 +111,7 @@ type BrowseData struct { MusicConfig BrowseMusicConfig `json:"browseEndpointContextMusicConfig,omitempty"` BrowseId string `json:"browseId,omitempty"` Params string `json:"params,omitempty"` + Form Form `json:"formData,omitempty"` } type NextData struct { diff --git a/types.go b/types.go index bda7d02..2f992d9 100644 --- a/types.go +++ b/types.go @@ -10,8 +10,7 @@ var BaseContext Context = Context{ }, } -func GetTypeBrowse(t, id, params string) BrowseData { - +func GetTypeBrowse(t, id, params, form string) BrowseData { if t != "" { return BrowseData{ Context: BaseContext, @@ -22,6 +21,15 @@ func GetTypeBrowse(t, id, params string) BrowseData { }, BrowseId: id, } + } else if form != "" { + return BrowseData{ + Context: BaseContext, + BrowseId: id, + Params: params, + Form: Form{ + Values: []string{form}, + }, + } } else { return BrowseData{ Context: BaseContext, @@ -29,7 +37,6 @@ func GetTypeBrowse(t, id, params string) BrowseData { Params: params, } } - } func GetTypeNext(id, pid string) NextData {