npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@chez14/mal-api-lite

v2.0.0-rc

Published

MyAnimeList API client, Lite Version

Downloads

95

Readme

MyAnimeList.net API Client for Node.js: Lite Version

To see the API Documentation, please consult to:

Features

  • TypeScript supported
  • V2 API Support
  • Typecasting.
    Model is not provided just yet.

Table of Contents

Usage

Install

$ npm i -s @chez14/mal-api-lite
# OR
$ yarn add @chez14/mal-api-lite

Consuming the API

Make sure that you have the client_secret and client_id key. To obtain the key, you need to register to the API page of your MyAnimeList account.

After that, you can create an instance for the API Client, providing either (clientId and clientSecret) OR (accessToken or refreshToken).

import { MALClient } from '@chez14/mal-api-lite'

const mal = new MALClient({
    // Both of the field should be filled if you want to generate authenticate link
    clientId: "client-id here",
    clientSecret: "client-secret here",
    
    // or if you have the tokens, you can ignore the client settings and
    // add either:
    accessToken: "accessToken here",
    // or provide refreshToken, the accessToken will be fetched 
    // automatically
    refreshToken: "refreshToken here"
});

To start authentication, you need to generate the authentication link:

const {url, codeChallenge} = malClient.getOAuthURL();
// NOTE: you need to save the `codeChallenge` to session storage for next step.

Then redirect the user to the url, let the user authenticate, then the MAL will redirect back to your redirect_url field, carrying the authorization code code.

To get the access token for the resources, you need to "convert" the authorization code code first by:

const { access_token, refresh_token, expires_in } = mal.getTokensFromAuthCode(authCode, codeChallenge);

💡 Tip: You will need to save the acess_token and especially refresh_token.

The token will be automatically added to the class. You're now ready to go! Just a quick note from our fellas:

It's better if you always double-check by yourself the behaviour of all API functions you want to use. There're several imprecisions and typos in the documentation. — ZeroCrystal @ MAL API forum

Get Animes from Winter 2020

let animes = await mal.get("anime/season/2020/winter", {
    sort: "anime_score",
    limit: 4,
    fields: [
        "id",
        "title",
        "start_date",
        "end_date",
        "mean",
        "rank"
    ]
});
console.log(animes.data);
// Will produce:
// [
//  ...
//   {
//     node: {
//       id: 36862,
//       title: 'Made in Abyss Movie 3: Fukaki Tamashii no Reimei',
//       main_picture: [Object],
//       start_date: '2020-01-17',
//       end_date: '2020-01-17',
//       mean: 8.72,
//       rank: 39
//     }
//   },
//   ...
// ]

Get Anime Info

let animeInfo = await malClient.get("anime/36862", {
    fields: [
        "id",
        "title",
        "start_date",
        "end_date",
        "mean",
        "rank"
    ]
});
console.log(animeInfo);
// Will produce:
// {
//   id: 36862,
//   title: 'Made in Abyss Movie 3: Fukaki Tamashii no Reimei',
//   main_picture: {
//     medium: 'https://api-cdn.myanimelist.net/images/anime/1175/101926.jpg',
//     large: 'https://api-cdn.myanimelist.net/images/anime/1175/101926l.jpg'
//   },
//   start_date: '2020-01-17',
//   end_date: '2020-01-17',
//   mean: 8.72,
//   rank: 39
// }

Docs

Constructor Options

| Name & Type | Required | Default | Descriptions | | ---------------------------------------------------------------- | ----------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | clientId: string | yes, for OAuth related stuff. | undefined | Self explanatory. | | clientSecret: string | yes, for OAuth related stuff. | undefined | Self explanatory. | | accessToken: string | yes, to use API | undefined | Self explanatory. | | refreshToken: string | yes, to use API | undefined | Self explanatory. | | gotOptions: GotOptions | no | (see it yourself) | Add your options for the Got. Things like proxy, and etcs. | | gotOAuthOptions: GotOptions | no | (see it yourself) | Same like above, but for OAuth related stuffs. |

Methods

get

Signature: get<T = any>(resource: string, param?: PaginatableRequest): Promise<T>

Parameter fields will accept either string or array string. If array is given, it will be converted automatically to string, by gluing them with comma.

patch

Signature patch<T = any>(resource: string, param?: BaseRequest): Promise<T>

🤖 Note: The documentation states that some function uses PATCH while the cUrl sample states PUT and they obediently accept both method as a valid one. Irredeemable, right? Well as ... stated: you need to recheck the documentation again.

delete

Signature: delete<T = any>(resource: string, param?: BaseRequest): Promise<T>

post

Signature: post<T = any>(resource: string, param?: BaseRequest): Promise<T>

While there's no endpoint currently used this method, but it's weird when you implement get and many others but post. It's just a habit of mine, don't mind me.

getOAuthURL

Signature:getOAuthURL( redirectUri?: string, codeChallenge?: string, state?: string ):{ url, codeChallenge, state? }

We support OAuth URL generation, this function will automatically generate the codeChallenge variable and you can receive it on the return result. To override, you can add something to the codeChallenge parameter itself.

As stated by the documentation, redirectUrl can be left blank IF you have single RedirectUrl on the app page.

Also, just for the records, state will be left alone, even if it is undefined. We'll just send them back on the return function to help you. You can left them alone if you don't want to.

resolveAuthCode

Signature: resolveAuthCode(authCode: string, codeVerifier: string, redirectUri?: string): Promise<any>

This function will resolve your Authorization Code to access_token and refresh_token.

resolveRefreshToken

Signature: resolveRefreshToken(refreshToken?: string): Promise<any>

Refresh given refreshToken (from constructor by default). Will return new access_token and refresh_token.

FAQ

How to convert MAL URL to ID?
Do it by yourself with substring, or with the fancy myanimelist-url-to-id NPM Package.

License

This project is licensed as MIT.