From 037df1d16f0febc3bc6e66e4a5921c72d7e87971 Mon Sep 17 00:00:00 2001 From: Hekmon Date: Fri, 29 Apr 2022 11:31:01 +0200 Subject: [PATCH 1/7] handle session queries not being valid --- crunchyroll.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crunchyroll.go b/crunchyroll.go index d6d2744..5d9031d 100644 --- a/crunchyroll.go +++ b/crunchyroll.go @@ -70,6 +70,10 @@ func LoginWithCredentials(user string, password string, locale LOCALE, client *h } defer sessResp.Body.Close() + if sessResp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("Failed to start session: %s", sessResp.Status) + } + var data map[string]interface{} body, _ := io.ReadAll(sessResp.Body) json.Unmarshal(body, &data) @@ -109,6 +113,11 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (* return nil, err } defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("Failed to start session: %s", resp.Status) + } + json.NewDecoder(resp.Body).Decode(&jsonBody) if _, ok := jsonBody["message"]; ok { return nil, errors.New("invalid session id") From db47eeb11c6f30dec008a5802deb9129dc09bea5 Mon Sep 17 00:00:00 2001 From: Hekmon Date: Fri, 29 Apr 2022 11:34:17 +0200 Subject: [PATCH 2/7] handle login with creds errors --- crunchyroll.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/crunchyroll.go b/crunchyroll.go index 5d9031d..57548cc 100644 --- a/crunchyroll.go +++ b/crunchyroll.go @@ -71,7 +71,7 @@ func LoginWithCredentials(user string, password string, locale LOCALE, client *h defer sessResp.Body.Close() if sessResp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("Failed to start session: %s", sessResp.Status) + return nil, fmt.Errorf("failed to start session for credentials login: %s", sessResp.Status) } var data map[string]interface{} @@ -85,7 +85,15 @@ func LoginWithCredentials(user string, password string, locale LOCALE, client *h authValues.Set("session_id", sessionID) authValues.Set("account", user) authValues.Set("password", password) - client.Post(loginEndpoint, "application/x-www-form-urlencoded", bytes.NewBufferString(authValues.Encode())) + loginResp, err := client.Post(loginEndpoint, "application/x-www-form-urlencoded", bytes.NewBufferString(authValues.Encode())) + if err != nil { + return nil, err + } + defer loginResp.Body.Close() + + if loginResp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to auth with credentials: %s", loginResp.Status) + } return LoginWithSessionID(sessionID, locale, client) } From 353f425bbfeeb9c6b74ff3cc93954309a95ae418 Mon Sep 17 00:00:00 2001 From: Hekmon Date: Fri, 29 Apr 2022 11:36:45 +0200 Subject: [PATCH 3/7] typo fix --- crunchyroll.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crunchyroll.go b/crunchyroll.go index 57548cc..0d03440 100644 --- a/crunchyroll.go +++ b/crunchyroll.go @@ -123,7 +123,7 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (* defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("Failed to start session: %s", resp.Status) + return nil, fmt.Errorf("failed to start session: %s", resp.Status) } json.NewDecoder(resp.Body).Decode(&jsonBody) From aa3f8e1b341a39f2a78cf8d5522afd721ecd97d6 Mon Sep 17 00:00:00 2001 From: Hekmon Date: Fri, 29 Apr 2022 11:39:11 +0200 Subject: [PATCH 4/7] handle json parsing errors --- crunchyroll.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/crunchyroll.go b/crunchyroll.go index 0d03440..8ae0932 100644 --- a/crunchyroll.go +++ b/crunchyroll.go @@ -76,7 +76,9 @@ func LoginWithCredentials(user string, password string, locale LOCALE, client *h var data map[string]interface{} body, _ := io.ReadAll(sessResp.Body) - json.Unmarshal(body, &data) + if err = json.Unmarshal(body, &data); err != nil { + return nil, fmt.Errorf("failed to parse start session with credentials response: %w", err) + } sessionID := data["data"].(map[string]interface{})["session_id"].(string) @@ -126,7 +128,9 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (* return nil, fmt.Errorf("failed to start session: %s", resp.Status) } - json.NewDecoder(resp.Body).Decode(&jsonBody) + if err = json.NewDecoder(resp.Body).Decode(&jsonBody); err != nil { + return nil, fmt.Errorf("failed to parse start session with session id response: %w", err) + } if _, ok := jsonBody["message"]; ok { return nil, errors.New("invalid session id") } @@ -178,7 +182,9 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (* return nil, err } defer resp.Body.Close() - json.NewDecoder(resp.Body).Decode(&jsonBody) + if err = json.NewDecoder(resp.Body).Decode(&jsonBody); err != nil { + return nil, fmt.Errorf("failed to parse 'token' response: %w", err) + } crunchy.Config.TokenType = jsonBody["token_type"].(string) crunchy.Config.AccessToken = jsonBody["access_token"].(string) @@ -189,7 +195,9 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (* return nil, err } defer resp.Body.Close() - json.NewDecoder(resp.Body).Decode(&jsonBody) + if err = json.NewDecoder(resp.Body).Decode(&jsonBody); err != nil { + return nil, fmt.Errorf("failed to parse 'index' response: %w", err) + } cms := jsonBody["cms"].(map[string]interface{}) crunchy.Config.Policy = cms["policy"].(string) @@ -203,7 +211,9 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (* return nil, err } defer resp.Body.Close() - json.NewDecoder(resp.Body).Decode(&jsonBody) + if err = json.NewDecoder(resp.Body).Decode(&jsonBody); err != nil { + return nil, fmt.Errorf("failed to parse 'me' response: %w", err) + } crunchy.Config.AccountID = jsonBody["account_id"].(string) crunchy.Config.ExternalID = jsonBody["external_id"].(string) @@ -215,7 +225,9 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (* return nil, err } defer resp.Body.Close() - json.NewDecoder(resp.Body).Decode(&jsonBody) + if err = json.NewDecoder(resp.Body).Decode(&jsonBody); err != nil { + return nil, fmt.Errorf("failed to parse 'profile' response: %w", err) + } crunchy.Config.MaturityRating = jsonBody["maturity_rating"].(string) From 187a0c8817e6ecfe446712bb3f9db4e040776bd1 Mon Sep 17 00:00:00 2001 From: Hekmon Date: Fri, 29 Apr 2022 11:43:43 +0200 Subject: [PATCH 5/7] add missing defer --- crunchyroll.go | 1 + 1 file changed, 1 insertion(+) diff --git a/crunchyroll.go b/crunchyroll.go index 8ae0932..bf20ed8 100644 --- a/crunchyroll.go +++ b/crunchyroll.go @@ -244,6 +244,7 @@ func (c *Crunchyroll) request(endpoint string) (*http.Response, error) { resp, err := c.Client.Do(req) if err == nil { + defer resp.Body.Close() bodyAsBytes, _ := io.ReadAll(resp.Body) defer resp.Body.Close() if resp.StatusCode == http.StatusUnauthorized { From 362708cf3584c192988a1f37eb659ff3b30271fe Mon Sep 17 00:00:00 2001 From: Hekmon Date: Fri, 29 Apr 2022 11:45:00 +0200 Subject: [PATCH 6/7] handle json unmarshall error --- crunchyroll.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crunchyroll.go b/crunchyroll.go index bf20ed8..ece4da1 100644 --- a/crunchyroll.go +++ b/crunchyroll.go @@ -295,7 +295,9 @@ func (c *Crunchyroll) Search(query string, limit uint) (s []*Series, m []*Movie, defer resp.Body.Close() var jsonBody map[string]interface{} - json.NewDecoder(resp.Body).Decode(&jsonBody) + if err = json.NewDecoder(resp.Body).Decode(&jsonBody); err != nil { + return nil, nil, fmt.Errorf("failed to parse 'search' response: %w", err) + } for _, item := range jsonBody["items"].([]interface{}) { item := item.(map[string]interface{}) From 413949797c8ed1f1b75df3515a70d05143b9e5ad Mon Sep 17 00:00:00 2001 From: Hekmon Date: Fri, 29 Apr 2022 11:49:23 +0200 Subject: [PATCH 7/7] avoid copy error to be shadowed --- downloader.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/downloader.go b/downloader.go index 74546da..0001347 100644 --- a/downloader.go +++ b/downloader.go @@ -199,8 +199,8 @@ func (d Downloader) mergeSegmentsFFmpeg(files []string) error { } } if f, ok := d.Writer.(*os.File); !ok || f.Name() != tmpfile { - file, err := os.Open(tmpfile) - if err != nil { + var file *os.File + if file, err = os.Open(tmpfile); err != nil { return err } defer file.Close()