@tiktikimelbo7/extensions
Version:
Nodejs library that provides high-level APIs for obtaining information on various entertainment media such as books, movies, comic books, anime, manga, and so on.
269 lines • 11.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const models_1 = require("../../models");
/**
* @attention Cloudflare bypass is **REQUIRED**.
*/
class Marin extends models_1.AnimeParser {
constructor() {
super(...arguments);
this.name = 'Marin';
this.baseUrl = 'https://marin.moe';
this.logo = 'https://i.pinimg.com/736x/62/8d/3f/628d3f2e60b0aa8c8fa9598e8dae6320.jpg';
this.classPath = 'ANIME.Marin';
this.recentEpisodes = async (page = 1) => {
const token = await this.getToken();
let data;
try {
const response = await this.client.post('https://marin.moe/anime', {
page: page,
sort: 'rel-d',
filter: {
type: [],
status: [],
content_rating: [],
genre: [],
group: [],
production: [],
source: [],
resolution: [],
audio: [],
subtitle: [],
},
search: '',
}, {
headers: {
Origin: 'https://marin.moe/',
Referer: 'https://marin.moe/anime',
Cookie: `__ddg1=;__ddg2_=; XSRF-TOKEN=${token[1]}; marin_session=${token[0]};`,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'x-xsrf-token': token[1].split(';')[0].replace('%3D', '='),
'x-inertia': true,
},
});
data = await response.data;
}
catch (error) {
console.log(error);
}
const response_data = {
currentPage: page,
hasNextPage: data.props.anime_list.meta.last_page > page,
results: data.props.anime_list.data.map((el) => {
return {
id: el.slug,
title: el.title,
image: el.cover,
releaseDate: el.year,
type: el.type,
};
}),
};
return response_data;
};
/**
* @param query Search query
*/
this.search = async (query, page = 1) => {
const token = await this.getToken();
let data;
try {
const response = await this.client.post('https://marin.moe/anime', {
page: page,
sort: 'az-a',
filter: {
type: [],
status: [],
content_rating: [],
genre: [],
group: [],
production: [],
source: [],
resolution: [],
audio: [],
subtitle: [],
},
search: query,
}, {
headers: {
Origin: 'https://marin.moe/',
Referer: 'https://marin.moe/anime',
Cookie: `__ddg1=;__ddg2_=; XSRF-TOKEN=${token[1]}; marin_session=${token[0]};`,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'x-xsrf-token': token[1].split(';')[0].replace('%3D', '='),
'x-inertia': true,
},
});
data = await response.data;
}
catch (error) {
console.log(error);
}
const response_data = {
currentPage: page,
hasNextPage: data.props.anime_list.meta.last_page > page,
results: data.props.anime_list.data.map((el) => {
return {
id: el.slug,
title: el.title,
image: el.cover,
releaseDate: el.year,
type: el.type,
};
}),
};
return response_data;
};
/**
* @param id Anime id
*/
this.fetchAnimeInfo = async (id) => {
var _a;
const token = await this.getToken();
let data;
try {
const response = await this.client.post(`https://marin.moe/anime/${id}`, {}, {
headers: {
Origin: 'https://marin.moe/',
Referer: `https://marin.moe/anime/${id}`,
Cookie: `__ddg1=;__ddg2_=; XSRF-TOKEN=${token[1].split(';')[0]}; marin_session=${token[0].split(';')[0]};`,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'x-inertia': true,
'x-inertia-version': '884345c4d568d16e3bb2fb3ae350cca9',
'x-requested-with': 'XMLHttpRequest',
'x-xsrf-token': token[1].split(';')[0].replace('%3D', '='),
},
});
data = await response.data;
console.log(data);
}
catch (error) {
console.log(error);
}
let episodes = data.props.episode_list.data;
if (data.props.anime.last_episode > 36) {
for (let index = 2; index < data.props.anime.last_episode / 36; index++) {
const response = await this.client.post(`https://marin.moe/anime/${id}`, { filter: { episodes: true, specials: true }, eps_page: index }, {
headers: {
Origin: 'https://marin.moe/',
Referer: `https://marin.moe/anime/${id}`,
Cookie: `__ddg1=;__ddg2_=; XSRF-TOKEN=${token[1].split(';')[0]}; marin_session=${token[0].split(';')[0]};`,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'x-inertia': true,
'x-inertia-version': '884345c4d568d16e3bb2fb3ae350cca9',
'x-requested-with': 'XMLHttpRequest',
'x-xsrf-token': token[1].split(';')[0].replace('%3D', '='),
},
});
const data = await response.data;
episodes = episodes.concat(data.props.episode_list.data);
}
}
//{"filter":{"episodes":true,"specials":true},"eps_page":2}
const response_data = {
id: id,
title: {
native: data.props.anime.alt_titles['Official Title'][0].text,
romaji: data.props.anime.title,
english: data.props.anime.alt_titles['Official Title'][1].text,
},
synonyms: ((_a = data.props.anime.alt_titles['Synonym']) === null || _a === void 0 ? void 0 : _a.map((el) => {
return el.text;
})) || [],
image: data.props.anime.cover,
cover: data.props.anime.cover,
description: data.props.anime.description,
status: data.props.anime.status.name,
releaseDate: data.props.anime.release_date,
totalEpisodes: data.props.anime.last_episode,
currentEpisode: data.props.anime.last_episode,
genres: data.props.anime.genre_list.map((el) => {
return el.name;
}),
studios: data.props.anime.production_list.map((el) => {
return el.name;
}),
type: data.props.anime.type.name,
ageRating: data.props.anime.content_rating.name,
episodes: episodes.map((el) => {
return {
id: `${id}/${el.sort}`,
title: el.title,
number: el.sort,
image: el.cover,
airdate: el.release_date,
};
}),
};
return response_data;
};
/**
*
* @param episodeId Episode id
*/
this.fetchEpisodeSources = async (id) => {
const token = await this.getToken();
let data;
try {
const response = await this.client.post(`https://marin.moe/anime/${id}`, {}, {
headers: {
Origin: 'https://marin.moe/',
Referer: `https://marin.moe/anime/${id}`,
Cookie: `__ddg1=;__ddg2_=; XSRF-TOKEN=${token[1].split(';')[0]}; marin_session=${token[0].split(';')[0]};`,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
'x-inertia': true,
'x-inertia-version': '884345c4d568d16e3bb2fb3ae350cca9',
'x-requested-with': 'XMLHttpRequest',
'x-xsrf-token': token[1].split(';')[0].replace('%3D', '='),
},
});
data = await response.data;
}
catch (error) {
console.log(error);
}
const response_data = {
sources: data.props.video.data.mirror.map((el) => {
return {
url: el.code.file,
quality: el.resolution,
isM3U8: false,
duration: el.code.duration,
thumbnail: el.code.thumbnail,
};
}),
sprites: data.props.video.data.mirror[0].code.sprite,
spriteVtt: data.props.video.data.mirror[0].code.vtt,
};
return response_data;
};
/**
*
* @param episodeId Episode id
*/
this.fetchEpisodeServers = (episodeId) => {
throw new Error('Method not implemented.');
};
}
async getToken() {
const token = [];
const response = await this.client.get('https://marin.moe/anime', {
headers: {
Referer: 'https://marin.moe/anime',
Cookie: '__ddg1_=;__ddg2_=;',
},
});
token.push(response.headers['set-cookie'][1].replace('marin_session=', ''));
token.push(response.headers['set-cookie'][0].replace('XSRF-TOKEN=', ''));
return token;
}
}
exports.default = Marin;
// (async () => {
// const marin = new Marin();
// const search = await marin.search('vermeil in gold');
// const anime = await marin.fetchAnimeInfo(search.results[0].id);
// const sources = await marin.fetchEpisodeSources(anime.episodes![0].id);
// console.log(sources);
// })();
//# sourceMappingURL=marin.js.map