fix: update "new episode" route to check all providers before throwing error
This commit is contained in:
@@ -3,7 +3,7 @@ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|||||||
import { fetchFromMultipleSources } from "~/libs/fetchFromMultipleSources";
|
import { fetchFromMultipleSources } from "~/libs/fetchFromMultipleSources";
|
||||||
import { readEnvVariable } from "~/libs/readEnvVariable";
|
import { readEnvVariable } from "~/libs/readEnvVariable";
|
||||||
import type { Env } from "~/types/env";
|
import type { Env } from "~/types/env";
|
||||||
import { EpisodesResponseSchema } from "~/types/episode";
|
import { EpisodesResponse, EpisodesResponseSchema } from "~/types/episode";
|
||||||
import {
|
import {
|
||||||
AniListIdQuerySchema,
|
AniListIdQuerySchema,
|
||||||
ErrorResponse,
|
ErrorResponse,
|
||||||
@@ -43,6 +43,23 @@ const route = createRoute({
|
|||||||
|
|
||||||
const app = new OpenAPIHono<Env>();
|
const app = new OpenAPIHono<Env>();
|
||||||
|
|
||||||
|
export function fetchEpisodesFromAllProviders(
|
||||||
|
aniListId: number,
|
||||||
|
isAnifyEnabled: boolean,
|
||||||
|
): Promise<EpisodesResponse[]> {
|
||||||
|
return Promise.allSettled([
|
||||||
|
import("./aniwatch").then(({ getEpisodesFromAniwatch }) =>
|
||||||
|
getEpisodesFromAniwatch(aniListId),
|
||||||
|
),
|
||||||
|
getEpisodesFromAnify(isAnifyEnabled, aniListId),
|
||||||
|
]).then((episodeResults) =>
|
||||||
|
episodeResults
|
||||||
|
.filter((result) => result.status === "fulfilled")
|
||||||
|
.map((result) => result.value)
|
||||||
|
.filter((episodes) => !!episodes),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function fetchEpisodes(aniListId: number, isAnifyEnabled: boolean) {
|
export function fetchEpisodes(aniListId: number, isAnifyEnabled: boolean) {
|
||||||
return fetchFromMultipleSources([
|
return fetchFromMultipleSources([
|
||||||
() => getEpisodesFromAnify(isAnifyEnabled, aniListId),
|
() => getEpisodesFromAnify(isAnifyEnabled, aniListId),
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ import { env } from "hono/adapter";
|
|||||||
import mapKeys from "lodash.mapkeys";
|
import mapKeys from "lodash.mapkeys";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
import { fetchEpisodes } from "~/controllers/episodes/getByAniListId";
|
import {
|
||||||
|
fetchEpisodes,
|
||||||
|
fetchEpisodesFromAllProviders,
|
||||||
|
} from "~/controllers/episodes/getByAniListId";
|
||||||
import { fetchEpisodeUrl } from "~/controllers/episodes/getEpisodeUrl";
|
import { fetchEpisodeUrl } from "~/controllers/episodes/getEpisodeUrl";
|
||||||
import { Case, changeStringCase } from "~/libs/changeStringCase";
|
import { Case, changeStringCase } from "~/libs/changeStringCase";
|
||||||
import type { AdminSdkCredentials } from "~/libs/fcm/getGoogleAuthToken";
|
import type { AdminSdkCredentials } from "~/libs/fcm/getGoogleAuthToken";
|
||||||
@@ -59,11 +62,11 @@ app.post(
|
|||||||
env<Env, typeof c>(c, "workerd"),
|
env<Env, typeof c>(c, "workerd"),
|
||||||
"ENABLE_ANIFY",
|
"ENABLE_ANIFY",
|
||||||
);
|
);
|
||||||
const {
|
const fetchEpisodesResult = await fetchEpisodesFromAllProviders(
|
||||||
errorOccurred: fetchEpisodesErrorOccurred,
|
aniListId,
|
||||||
result: fetchEpisodesResult,
|
isAnifyEnabled,
|
||||||
} = await fetchEpisodes(aniListId, isAnifyEnabled);
|
);
|
||||||
if (fetchEpisodesErrorOccurred) {
|
if (fetchEpisodesResult.length === 0) {
|
||||||
console.error(`Failed to fetch episodes for title ${aniListId}`);
|
console.error(`Failed to fetch episodes for title ${aniListId}`);
|
||||||
return c.json(
|
return c.json(
|
||||||
{ success: false, message: "Failed to fetch episodes" },
|
{ success: false, message: "Failed to fetch episodes" },
|
||||||
@@ -71,31 +74,45 @@ app.post(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { episodes, providerId } = fetchEpisodesResult;
|
let episodes;
|
||||||
const episode = episodes.find(
|
|
||||||
(episode) => episode.number === episodeNumber,
|
|
||||||
);
|
|
||||||
if (!episode) {
|
|
||||||
return c.json({ success: false, message: "Episode not found" }, 404);
|
|
||||||
}
|
|
||||||
|
|
||||||
let fetchUrlResult;
|
let fetchUrlResult;
|
||||||
try {
|
|
||||||
fetchUrlResult = await fetchEpisodeUrl(
|
for (const {
|
||||||
|
episodes: episodesResult,
|
||||||
|
providerId,
|
||||||
|
} of fetchEpisodesResult) {
|
||||||
|
const episode = episodesResult.find(
|
||||||
|
(episode) => episode.number === episodeNumber,
|
||||||
|
);
|
||||||
|
if (!episode) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
episodes = episodesResult;
|
||||||
|
|
||||||
|
const urlResult = await fetchEpisodeUrl(
|
||||||
providerId,
|
providerId,
|
||||||
episode.id,
|
episode.id,
|
||||||
aniListId,
|
aniListId,
|
||||||
isAnifyEnabled,
|
isAnifyEnabled,
|
||||||
);
|
);
|
||||||
if (!fetchUrlResult) {
|
if (!fetchUrlResult) {
|
||||||
console.error(`Failed to fetch episode URL for episode ${episode.id}`);
|
continue;
|
||||||
return c.json(
|
|
||||||
{ success: false, message: "Episode URL not found" },
|
|
||||||
404,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
|
||||||
console.error(`Failed to fetch episode URL for episode ${episode.id}`);
|
fetchUrlResult = urlResult;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!episodes) {
|
||||||
|
console.error(`Failed to fetch episodes for title ${aniListId}`);
|
||||||
|
return c.json(
|
||||||
|
{ success: false, message: "Failed to fetch episodes" },
|
||||||
|
500,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fetchUrlResult) {
|
||||||
|
console.error(`Failed to fetch episode URL for episode`);
|
||||||
return c.json(
|
return c.json(
|
||||||
{ success: false, message: "Failed to fetch episode URL" },
|
{ success: false, message: "Failed to fetch episode URL" },
|
||||||
500,
|
500,
|
||||||
|
|||||||
Reference in New Issue
Block a user