kodikwrapper - это реализация API kodikapi.com для Node.js
Note
Начиная с v3.0.0 поддерживается только Node.js 18.0.0+
📖 TSDocs | 📖 Kodik API документация (требуется авторизация) |
---|
npm i kodikwrapper
yarn add kodikwrapper
pnpm add kodikwrapper
Класс Client
реализует только публичное API из документации Kodik API. Это означает, что методы будут называться одинаково.
Смотрите все доступные методы в 📖 TSDocs, документации Kodik API или с помощью подсказок в IDE.
import { Client } from 'kodikwrapper'; // ESM / TypeScript
// или
const { Client } = require('kodikwrapper'); // CommonJS
// Создание клиента
const client = new Client({
token: '<public token>',
});
// или
const client = Client.fromToken('<public token>')
client.search({
limit: 1,
title: 'судьба ночь схватки прикосновение небес',
})
.then((response) => response.results.shift())
.then((material) => console.log(material));
/**
{
id: 'movie-27068',
type: 'anime',
link: '//aniqit.com/video/27068/35bd2611080a6add3e209be3b76cd16d/720p',
title: 'Судьба: Ночь схватки. Прикосновение небес',
title_orig: "Gekijouban Fate/Stay Night: Heaven's Feel - I. Presage Flower",
other_title: 'Судьба: Ночь схватки. Прикосновение небес (фильм первый) / Судьба. Ночь схватки - Прикосновение небес.
Предвещающий цветок',
translation: { id: 767, title: 'SHIZA Project', type: 'voice' },
year: 2017,
kinopoisk_id: '895880',
imdb_id: 'tt4054952',
worldart_link: 'https://www.world-art.ru/animation/animation.php?id=2588',
shikimori_id: '25537',
quality: 'BDRip 720p',
camrip: false,
blocked_countries: [],
created_at: '2018-09-28T13:56:40Z',
updated_at: '2019-11-16T22:10:16Z',
screenshots: [
'https://i.kodik.biz/screenshots/video/27068/1.jpg',
'https://i.kodik.biz/screenshots/video/27068/2.jpg',
'https://i.kodik.biz/screenshots/video/27068/3.jpg',
'https://i.kodik.biz/screenshots/video/27068/4.jpg',
'https://i.kodik.biz/screenshots/video/27068/5.jpg'
]
}
*/
Класс VideoLinks
используется для получения прямых ссылок на файлы с Kodik и получения дополнительной информации о материале (тайминги для пропуска опенингов/эндингов, озвучку и др.), как это делает их плеер.
import { Client, VideoLinks } from 'kodikwrapper';
const client = Client.fromToken('<public token>')
client.search({
limit: 1,
title: 'судьба ночь схватки прикосновение небес',
})
.then((response) => response.results.shift())
.then(async (material) => {
if (!material) throw new Error('не найдено');
const links = await VideoLinks.getLinks({
link: material.link
});
console.log(links);
});
/**
{
"360": [
{
"src": "//cloud.kodik-storage.com/useruploads/c936a552-2455-43e2-9854-1625aaac9db8/fd762bc53599a4b97c8151a5fc725ddb:2024021820/360.mp4:hls:manifest.m3u8",
"type": "application/x-mpegURL"
}
],
"480": [
{
"src": "//cloud.kodik-storage.com/useruploads/c936a552-2455-43e2-9854-1625aaac9db8/fd762bc53599a4b97c8151a5fc725ddb:2024021820/480.mp4:hls:manifest.m3u8",
"type": "application/x-mpegURL"
}
],
"720": [
{
"src": "//cloud.kodik-storage.com/useruploads/c936a552-2455-43e2-9854-1625aaac9db8/fd762bc53599a4b97c8151a5fc725ddb:2024021820/720.mp4:hls:manifest.m3u8",
"type": "application/x-mpegURL"
}
]
}
*/
Недавно Kodik начал часто менять endpoint для получения прямых ссылок, поэтому в прошлых обновлениях (до v3.0.0) я добавил поле videoInfoUrl
(начиная с v3.0.0 - videoInfoEndpoint
) для его замены.
Так как они могут снова изменить endpoint, начиная с v3.0.0, в класс VideoLinks
добавлен метод getActualVideoInfoEndpoint
для получения актуального endpoint, в который необходимо передать ссылку на чанк с плеером. Получить ссылку на чанк можно с помощью метода parseLink
с переданным параметром extended: true
const getLinksWithActualEndpoint = async (link) => {
const parsedLink = await VideoLinks.parseLink({
link, extended: true
});
if (!parsedLink.ex.playerSingleUrl) throw new Error('не могу получить ссылку на чанк с плеером');
const endpoint = await VideoLinks.getActualVideoInfoEndpoint(parsedLink.ex.playerSingleUrl);
const links = await VideoLinks.getLinks({
link, videoInfoEndpoint: endpoint
});
return links;
};
getLinksWithActualEndpoint('//aniqit.com/video/27068/35bd2611080a6add3e209be3b76cd16d/720p')
.then(console.log)