aniki
Version:
Node.js APIs wrapper for anime/manga related content.
499 lines (417 loc) • 15.2 kB
JavaScript
const { fetching } = require("../../core/index.js");
const {
KAgeRating,
KHeaders,
KSeason,
KUrl,
KACategories,
KASubtypes,
KStreamers,
} = require("../../consts/kitsu");
const { isSameArray } = require("../../funcs/index.js");
class AnimeKitsu {
#config = {};
constructor(access_token, config) {
let defaultConfig = {
url: KUrl,
headers: {
...KHeaders,
},
};
if (access_token) {
if (typeof access_token !== "string")
throw new TypeError("'access_token' must be a string.");
if (config)
this.#config = {
...defaultConfig,
headers: {
Authorization: `Bearer ${access_token}`,
},
...config,
};
else
this.#config = {
...defaultConfig,
headers: {
Authorization: `Bearer ${access_token}`,
},
};
} else {
if (config)
this.#config = {
...defaultConfig,
...config,
};
else
this.#config = {
...defaultConfig,
};
}
}
async find(params, hooks) {
const parameters = {};
if (!params)
throw new ReferenceError("Parameter 'param' must be specified.");
if (typeof params === "number") {
const res = await fetching(
// @ts-ignore
{
...this.#config,
endpoint: `/anime/${params}`,
},
hooks,
);
if (res) return Object.freeze(res.json());
return;
}
if (!params.query)
throw new ReferenceError("Parameter 'query' must be specified.");
if (typeof params.query !== "string")
throw new TypeError("Parameter 'query' must be a string");
Object.assign(parameters, { "filter[text]": params.query });
if (params.offset) {
if (Number.isNaN(params.offset))
throw new TypeError("Parameter 'offset' must be a number.");
Object.assign(parameters, { "page[offset]": params.offset });
} else Object.assign(parameters, { "page[offset]": 0 });
if (params.limit) {
if (Number.isNaN(params.limit))
throw new TypeError("Parameter 'limit' must be a number.");
if (params.limit > 20)
throw new ReferenceError(
"Parameter 'limit' must be less or equal to 20.",
);
Object.assign(parameters, { "page[limit]": params.limit });
} else Object.assign(parameters, { "page[limit]": 10 });
if (params.ageRating) {
if (!Array.isArray(params.ageRating))
throw new TypeError("Parameter 'ageRating' must be an array.");
if (!isSameArray(params.ageRating, KAgeRating))
throw new ReferenceError(
"Invalid value(s) in the 'ageRating' parameter.",
);
Object.assign(parameters, { "filter[ageRating]": params.ageRating });
}
if (params.subtype) {
if (!Array.isArray(params.subtype))
throw new TypeError("Parameter 'subtype' must be an array.");
if (!isSameArray(params.subtype, KASubtypes))
throw new ReferenceError(
"Invalid value(s) in the 'subtype' parameter.",
);
Object.assign(parameters, { "filter[subtype]": params.subtype });
}
if (params.averageRating) {
if (!Array.isArray(params.averageRating))
throw new TypeError("Parameter 'averageRating' must be an array.");
let p = params.averageRating;
let sec = p[1] ? p[1] : 100;
if (!p[0])
throw new ReferenceError(
"First value (index 0) of the 'averageRating' parameter must be specified.",
);
if (Number.isNaN(p[0]))
throw new TypeError(
`Parameter 'averageRating' index 0 (${p[0]}) must be a number.`,
);
else if (!Number.isInteger(p[0]))
throw new TypeError(
`Parameter 'averageRating' index 0 (${p[0]}) must be an integer.`,
);
if (Number.isNaN(sec))
throw new TypeError(
`Parameter 'averageRating' index 1 (${sec}) must be a number.`,
);
else if (!Number.isInteger(sec))
throw new TypeError(
`Parameter 'averageRating' index 1 (${sec}) must be an integer.`,
);
if (p[0] < 5 || p[0] > 100)
throw new RangeError(
`Parameter 'averageRating' index 0 (${p[0]}) must be lower than 5 or greater than 100.`,
);
if (sec < 5 || sec > 100)
throw new RangeError(
`Parameter 'averageRating' index 1 (${sec}) must be lower than 5 or greater than 100.`,
);
Object.assign(parameters, {
"filter[averageRating]": `${p[0]}..${sec}`,
});
}
if (params.season) {
if (!Array.isArray(params.season))
throw new TypeError("Parameter 'season' must be an array.");
if (!isSameArray(params.season, KSeason))
throw new ReferenceError("Invalid value(s) in the 'season' parameter.");
Object.assign(parameters, { "filter[season]": params.season });
}
if (params.year) {
if (!Array.isArray(params.year))
throw new TypeError("Parameter 'year' must be an array.");
let p = params.year;
let sec = p[1] ? p[1] : 2027;
if (!p[0])
throw new ReferenceError(
"First value (index 0) of the 'year' parameter must be specified.",
);
if (Number.isNaN(p[0]))
throw new TypeError(
`Parameter 'year' index 0 (${p[0]}) must be a number.`,
);
else if (!Number.isInteger(p[0]))
throw new TypeError(
`Parameter 'year' index 0 (${p[0]}) must be an integer.`,
);
if (Number.isNaN(sec))
throw new TypeError(
`Parameter 'year' index 1 (${sec}) must be a number.`,
);
else if (!Number.isInteger(sec))
throw new TypeError(
`Parameter 'year' index 1 (${sec}) must be an integer.`,
);
if (p[0] < 1907 || p[0] > 2027)
throw new RangeError(
`Parameter 'year' index 0 (${p[0]}) must be lower than 1907 or greater than 2027.`,
);
if (sec < 1907 || sec > 2027)
throw new RangeError(
`Parameter 'year' index 1 (${sec}) must be lower than 1907 or greater than 2027.`,
);
Object.assign(parameters, {
"filter[year]": `${p[0]}..${sec}`,
});
}
if (params.streamers) {
if (!Array.isArray(params.streamers))
throw new TypeError("Parameter 'streamers' must be an array.");
if (!isSameArray(params.streamers, KStreamers))
throw new ReferenceError(
"Invalid value(s) in the 'streamers' parameter.",
);
Object.assign(parameters, { "filter[streamers]": params.streamers });
}
if (params.categories) {
if (!Array.isArray(params.categories))
throw new TypeError("Parameter 'categories' must be an array.");
if (!isSameArray(params.categories, KACategories))
throw new ReferenceError(
"Invalid value(s) in the 'categories' parameter.",
);
Object.assign(parameters, { "filter[categories]": params.categories });
}
// @ts-ignore
const p = new URLSearchParams(parameters);
const res = await fetching(
// @ts-ignore
{
...this.#config,
endpoint: `/anime`,
parameters: p,
},
hooks,
);
if (res) return Object.freeze(res.json());
return;
}
async findUnique(id, hooks) {
if (!id) throw new ReferenceError("Parameter 'id' must be specified.");
if (Number.isNaN(id))
throw new TypeError("Parameter 'id' must be a number.");
else if (!Number.isInteger(id))
throw new TypeError("Parameter 'id' must be an integer.");
const res = await fetching(
// @ts-ignore
{
...this.#config,
endpoint: `/anime/${id}`,
},
hooks,
);
if (res) return Object.freeze(res.json());
return;
}
async findMany(params, hooks) {
const parameters = {};
if (params.offset) {
if (Number.isNaN(params.offset))
throw new TypeError("Parameter 'offset' must be a number.");
Object.assign(parameters, { "page[offset]": params.offset });
} else Object.assign(parameters, { "page[offset]": 0 });
if (params.limit) {
if (Number.isNaN(params.limit))
throw new TypeError("Parameter 'limit' must be a number.");
if (params.limit > 20)
throw new ReferenceError(
"Parameter 'limit' must be less or equal to 20.",
);
Object.assign(parameters, { "page[limit]": params.limit });
} else Object.assign(parameters, { "page[limit]": 10 });
if (params.ageRating) {
if (!Array.isArray(params.ageRating))
throw new TypeError("Parameter 'ageRating' must be an array.");
if (!isSameArray(params.ageRating, KAgeRating))
throw new ReferenceError(
"Invalid value(s) in the 'ageRating' parameter.",
);
Object.assign(parameters, { "filter[ageRating]": params.ageRating });
}
if (params.subtype) {
if (!Array.isArray(params.subtype))
throw new TypeError("Parameter 'subtype' must be an array.");
if (!isSameArray(params.subtype, KASubtypes))
throw new ReferenceError(
"Invalid value(s) in the 'subtype' parameter.",
);
Object.assign(parameters, { "filter[subtype]": params.subtype });
}
if (params.averageRating) {
if (!Array.isArray(params.averageRating))
throw new TypeError("Parameter 'averageRating' must be an array.");
let p = params.averageRating;
let sec = p[1] ? p[1] : 100;
if (!p[0])
throw new ReferenceError(
"First value (index 0) of the 'averageRating' parameter must be specified.",
);
if (Number.isNaN(p[0]))
throw new TypeError(
`Parameter 'averageRating' index 0 (${p[0]}) must be a number.`,
);
else if (!Number.isInteger(p[0]))
throw new TypeError(
`Parameter 'averageRating' index 0 (${p[0]}) must be an integer.`,
);
if (Number.isNaN(sec))
throw new TypeError(
`Parameter 'averageRating' index 1 (${sec}) must be a number.`,
);
else if (!Number.isInteger(sec))
throw new TypeError(
`Parameter 'averageRating' index 1 (${sec}) must be an integer.`,
);
if (p[0] < 5 || p[0] > 100)
throw new RangeError(
`Parameter 'averageRating' index 0 (${p[0]}) must be lower than 5 or greater than 100.`,
);
if (sec < 5 || sec > 100)
throw new RangeError(
`Parameter 'averageRating' index 1 (${sec}) must be lower than 5 or greater than 100.`,
);
Object.assign(parameters, {
"filter[averageRating]": `${p[0]}..${sec}`,
});
}
if (params.season) {
if (!Array.isArray(params.season))
throw new TypeError("Parameter 'season' must be an array.");
if (!isSameArray(params.season, KSeason))
throw new ReferenceError("Invalid value(s) in the 'season' parameter.");
Object.assign(parameters, { "filter[season]": params.season });
}
if (params.year) {
if (!Array.isArray(params.year))
throw new TypeError("Parameter 'year' must be an array.");
let p = params.year;
let sec = p[1] ? p[1] : 2027;
if (!p[0])
throw new ReferenceError(
"First value (index 0) of the 'year' parameter must be specified.",
);
if (Number.isNaN(p[0]))
throw new TypeError(
`Parameter 'year' index 0 (${p[0]}) must be a number.`,
);
else if (!Number.isInteger(p[0]))
throw new TypeError(
`Parameter 'year' index 0 (${p[0]}) must be an integer.`,
);
if (Number.isNaN(sec))
throw new TypeError(
`Parameter 'year' index 1 (${sec}) must be a number.`,
);
else if (!Number.isInteger(sec))
throw new TypeError(
`Parameter 'year' index 1 (${sec}) must be an integer.`,
);
if (p[0] < 1907 || p[0] > 2027)
throw new RangeError(
`Parameter 'year' index 0 (${p[0]}) must be lower than 1907 or greater than 2027.`,
);
if (sec < 1907 || sec > 2027)
throw new RangeError(
`Parameter 'year' index 1 (${sec}) must be lower than 1907 or greater than 2027.`,
);
Object.assign(parameters, {
"filter[year]": `${p[0]}..${sec}`,
});
}
if (params.streamers) {
if (!Array.isArray(params.streamers))
throw new TypeError("Parameter 'streamers' must be an array.");
if (!isSameArray(params.streamers, KStreamers))
throw new ReferenceError(
"Invalid value(s) in the 'streamers' parameter.",
);
Object.assign(parameters, { "filter[streamers]": params.streamers });
}
if (params.categories) {
if (!Array.isArray(params.categories))
throw new TypeError("Parameter 'categories' must be an array.");
if (!isSameArray(params.categories, KACategories))
throw new ReferenceError(
"Invalid value(s) in the 'categories' parameter.",
);
Object.assign(parameters, { "filter[categories]": params.categories });
}
// @ts-ignore
const p = new URLSearchParams(parameters);
const res = await fetching(
// @ts-ignore
{
...this.#config,
endpoint: `/anime`,
parameters: p,
},
hooks,
);
if (res) return Object.freeze(res.json());
return;
}
async episode(id, hooks) {
if (!id) throw new ReferenceError("Parameter 'id' must be specified.");
if (Number.isNaN(id))
throw new TypeError("Parameter 'id' must be a number.");
else if (!Number.isInteger(id))
throw new TypeError("Parameter 'id' must be an integer.");
const res = await fetching(
// @ts-ignore
{
...this.#config,
endpoint: `/episodes/${id}`,
},
hooks,
);
if (res) return Object.freeze(res.json());
return;
}
async episodes(mediaId, hooks) {
if (!mediaId)
throw new ReferenceError("Parameter 'mediaId' must be specified.");
if (Number.isNaN(mediaId))
throw new TypeError("Parameter 'mediaId' must be a number.");
else if (!Number.isInteger(mediaId))
throw new TypeError("Parameter 'mediaId' must be an integer.");
const res = await fetching(
// @ts-ignore
{
...this.#config,
endpoint: `/episodes?filter[media_id]=${mediaId}`,
},
hooks,
);
if (res) return Object.freeze(res.json());
return;
}
}
module.exports = { AnimeKitsu };