kinopoisk-rating
Version:
API-клиент для получения рейтингов с Кинопоиска и IMDb
52 lines (44 loc) • 1.83 kB
text/typescript
import axios, { AxiosError } from 'axios';
import { Rating, KinopoiskError } from './types';
import { parseXML } from './utils';
export class KinopoiskRating {
private static readonly TIMEOUT = 5000;
private static cache = new Map<number, Rating>();
static async getRating(movieId: number): Promise<Rating> {
if (this.cache.has(movieId)) {
return this.cache.get(movieId)!;
}
try {
const response = await axios.get(`https://rating.kinopoisk.ru/${movieId}.xml`, {
responseType: "text",
timeout: this.TIMEOUT,
signal: new AbortController().signal,
});
const parsed = await parseXML(response.data);
const rating: Rating = {
kp: {
rating: Number(parsed.kp_rating._),
votes: Number(parsed.kp_rating.$.num_vote),
},
imdb: {
rating: Number(parsed.imdb_rating._),
votes: Number(parsed.imdb_rating.$.num_vote),
},
};
if (isNaN(rating.kp.rating) || isNaN(rating.imdb.rating)) {
throw new KinopoiskError('Неверный формат рейтингов');
}
this.cache.set(movieId, rating);
return rating;
} catch (error) {
if (typeof jest === 'undefined') {
console.error("Ошибка при получении рейтинга:", error);
}
const axiosError = error as AxiosError;
throw new KinopoiskError(
`Ошибка ${axiosError.response?.status || "UNKNOWN"}: ${axiosError.message}`,
axiosError.response?.status
);
}
}
}