mirror of
https://github.com/mdtahseen7/AnimepaheApi.git
synced 2026-06-02 22:08:16 +00:00
@@ -30,6 +30,7 @@ app.get('/', (req, res) => {
|
|||||||
endpoints: {
|
endpoints: {
|
||||||
search: '/search?q=naruto',
|
search: '/search?q=naruto',
|
||||||
episodes: '/episodes?session=anime-session-id',
|
episodes: '/episodes?session=anime-session-id',
|
||||||
|
latest: '/latest?page=1',
|
||||||
sources: '/sources?anime_session=xxx&episode_session=yyy',
|
sources: '/sources?anime_session=xxx&episode_session=yyy',
|
||||||
ids: '/ids?session=anime-session-id (returns AniList and MyAnimeList IDs)',
|
ids: '/ids?session=anime-session-id (returns AniList and MyAnimeList IDs)',
|
||||||
m3u8: '/m3u8?url=kwik-url (returns m3u8 URL with required referer)',
|
m3u8: '/m3u8?url=kwik-url (returns m3u8 URL with required referer)',
|
||||||
@@ -77,6 +78,17 @@ app.get('/episodes', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get('/latest', async (req, res) => {
|
||||||
|
try {
|
||||||
|
const page = parseInt(req.query.page, 10) || 1;
|
||||||
|
const latest = await pahe.getLatest(page);
|
||||||
|
res.json(latest);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Latest error:', error);
|
||||||
|
res.status(mapErrorToStatusCode(error.message)).json({ error: error.message });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
app.get('/sources', async (req, res) => {
|
app.get('/sources', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { anime_session, episode_session } = req.query;
|
const { anime_session, episode_session } = req.query;
|
||||||
@@ -266,9 +278,4 @@ if (require.main === module) {
|
|||||||
app.listen(PORT, () => {
|
app.listen(PORT, () => {
|
||||||
console.log(`Animepahe API server running on port ${PORT}`);
|
console.log(`Animepahe API server running on port ${PORT}`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+67
-1
@@ -126,6 +126,9 @@ class AnimePahe {
|
|||||||
if (context === 'ids') {
|
if (context === 'ids') {
|
||||||
return 'Anime session not found. Use /search first to get a valid session id.';
|
return 'Anime session not found. Use /search first to get a valid session id.';
|
||||||
}
|
}
|
||||||
|
if (context === 'latest') {
|
||||||
|
return 'Unable to fetch latest episodes right now.';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (statusCode === 403 && /ddos-guard|checking your browser|cloudflare/i.test(rawMessage)) {
|
if (statusCode === 403 && /ddos-guard|checking your browser|cloudflare/i.test(rawMessage)) {
|
||||||
@@ -260,6 +263,70 @@ class AnimePahe {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get latest airing episodes
|
||||||
|
* @param {number} page - Page number
|
||||||
|
* @returns {Promise<Array>} Array of latest airing episodes
|
||||||
|
*/
|
||||||
|
async getLatest(page = 1) {
|
||||||
|
try {
|
||||||
|
const latestUrl = `${this.base}/api?m=airing&page=${page}`;
|
||||||
|
const response = await cloudscraper.get(latestUrl, {
|
||||||
|
headers: this.getHeaders()
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = this._parseJsonResponse(response);
|
||||||
|
const latestRows = this._extractArray(data, ['data', 'results', 'items', 'episodes', 'list']);
|
||||||
|
const results = [];
|
||||||
|
|
||||||
|
for (const item of latestRows) {
|
||||||
|
const animeSession =
|
||||||
|
item.anime_session ||
|
||||||
|
item.session ||
|
||||||
|
item.slug ||
|
||||||
|
item.anime?.session ||
|
||||||
|
item.anime?.slug ||
|
||||||
|
null;
|
||||||
|
|
||||||
|
const episodeSession =
|
||||||
|
item.episode_session ||
|
||||||
|
item.release_session ||
|
||||||
|
item.episode?.session ||
|
||||||
|
item.session ||
|
||||||
|
null;
|
||||||
|
|
||||||
|
const title =
|
||||||
|
item.anime_title ||
|
||||||
|
item.title ||
|
||||||
|
item.anime?.title ||
|
||||||
|
item.anime?.name ||
|
||||||
|
null;
|
||||||
|
|
||||||
|
const urlValue =
|
||||||
|
item.url ||
|
||||||
|
(animeSession ? `${this.base}/anime/${animeSession}` : null);
|
||||||
|
|
||||||
|
results.push({
|
||||||
|
id: item.id || item.release_id || item.episode_id || null,
|
||||||
|
title,
|
||||||
|
url: urlValue,
|
||||||
|
episode: Number(item.episode ?? item.number ?? item.ep ?? item.ep_num ?? null),
|
||||||
|
episode_title:
|
||||||
|
item.episode_title ||
|
||||||
|
item.title ||
|
||||||
|
`Episode ${item.episode ?? item.number ?? ''}`.trim(),
|
||||||
|
snapshot: item.snapshot || item.thumbnail || item.image || null,
|
||||||
|
anime_session: animeSession,
|
||||||
|
episode_session: episodeSession
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(`Failed to get latest episodes: ${this._formatUpstreamError('latest', error)}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get streaming sources for an episode
|
* Get streaming sources for an episode
|
||||||
* @param {string} animeSession - Anime session ID
|
* @param {string} animeSession - Anime session ID
|
||||||
@@ -501,7 +568,6 @@ ${transformedScript}
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = AnimePahe;
|
module.exports = AnimePahe;
|
||||||
|
|||||||
Reference in New Issue
Block a user