AlistGo/alist · error

MediaFire token renewal failed: %s

Error message

MediaFire token renewal failed: %s

What it means

renewToken reached MediaFire, got a parseable response, but response.result != 'Success' — the API refused to renew the session token. MediaFire rejects renewal when the current session_token is already expired/revoked, when the cookie/account context no longer matches, or when the endpoint is called too frequently. The new token in response.session_token is intentionally not saved on this path.

Source

Thrown at drivers/mediafire/util.go:133

}

func (d *Mediafire) renewToken(_ context.Context) error {
	query := map[string]string{
		"session_token":   d.SessionToken,
		"response_format": "json",
	}

	var resp MediafireRenewTokenResponse
	_, err := d.postForm("/user/renew_session_token.php", query, &resp)
	if err != nil {
		return fmt.Errorf("failed to renew token: %w", err)
	}

	//fmt.Printf("getInfo :: Raw response: %s\n", string(body))
	//fmt.Printf("getInfo :: Parsed response: %+v\n", resp)

	if resp.Response.Result != "Success" {
		return fmt.Errorf("MediaFire token renewal failed: %s", resp.Response.Result)
	}

	d.SessionToken = resp.Response.SessionToken

	//fmt.Printf("Init :: Renew Session Token: %s", resp.Response.Result)

	op.MustSaveDriverStorage(d)

	return nil
}

func (d *Mediafire) getFiles(ctx context.Context, folderKey string) ([]File, error) {
	files := make([]File, 0)
	hasMore := true
	chunkNumber := 1

	for hasMore {
		resp, err := d.getFolderContent(ctx, folderKey, chunkNumber)

View on GitHub (pinned to 843d9dc814)

Solutions

  1. On this error, immediately fall back to getSessionToken with a freshly extracted browser cookie — renewal of a dead token cannot succeed
  2. Ensure only one instance renews a given account's token
  3. If it recurs, re-extract both cookie and session token together so they belong to the same browser session

Example fix

// before: renew failure returned as-is
if resp.Response.Result != "Success" {
    return fmt.Errorf("MediaFire token renewal failed: %s", resp.Response.Result)
}

// after: escalate dead-token renewals to full re-auth
if resp.Response.Result != "Success" {
    if newTok, err2 := d.getSessionToken(context.Background()); err2 == nil {
        d.SessionToken = newTok
        return nil
    }
    return fmt.Errorf("MediaFire token renewal failed: %s", resp.Response.Result)
}
Defensive patterns

Strategy: fallback

Try / catch

On renewal refusal, fall back immediately: if newTok, err := d.getSessionToken(ctx); err == nil { use newTok } else { mark storage as needing new credentials }. Retrying renew against a dead token is pointless.

Prevention

When it happens

Trigger: The 6-9 minute renewal cron racing after the token already expired; account logged out in the browser invalidating the session; renewing with a token obtained under a different cookie.

Common situations: Instance suspended/resumed so the cron gap exceeded the token lifetime; multiple instances sharing one account and interfering with each other's sessions.

Related errors


AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15). Data as JSON: /api/errors/42a6afa2544f851c. Report an issue: GitHub.