fix: update "new episode" route to check all providers before throwing error

This commit is contained in:
2024-09-23 17:18:03 -04:00
parent d8a01fefa2
commit 87b938bdaa
2 changed files with 58 additions and 24 deletions

View File

@@ -3,7 +3,7 @@ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
import { fetchFromMultipleSources } from "~/libs/fetchFromMultipleSources";
import { readEnvVariable } from "~/libs/readEnvVariable";
import type { Env } from "~/types/env";
import { EpisodesResponseSchema } from "~/types/episode";
import { EpisodesResponse, EpisodesResponseSchema } from "~/types/episode";
import {
AniListIdQuerySchema,
ErrorResponse,
@@ -43,6 +43,23 @@ const route = createRoute({
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) {
return fetchFromMultipleSources([
() => getEpisodesFromAnify(isAnifyEnabled, aniListId),

View File

@@ -5,7 +5,10 @@ import { env } from "hono/adapter";
import mapKeys from "lodash.mapkeys";
import { z } from "zod";
import { fetchEpisodes } from "~/controllers/episodes/getByAniListId";
import {
fetchEpisodes,
fetchEpisodesFromAllProviders,
} from "~/controllers/episodes/getByAniListId";
import { fetchEpisodeUrl } from "~/controllers/episodes/getEpisodeUrl";
import { Case, changeStringCase } from "~/libs/changeStringCase";
import type { AdminSdkCredentials } from "~/libs/fcm/getGoogleAuthToken";
@@ -59,11 +62,11 @@ app.post(
env<Env, typeof c>(c, "workerd"),
"ENABLE_ANIFY",
);
const {
errorOccurred: fetchEpisodesErrorOccurred,
result: fetchEpisodesResult,
} = await fetchEpisodes(aniListId, isAnifyEnabled);
if (fetchEpisodesErrorOccurred) {
const fetchEpisodesResult = await fetchEpisodesFromAllProviders(
aniListId,
isAnifyEnabled,
);
if (fetchEpisodesResult.length === 0) {
console.error(`Failed to fetch episodes for title ${aniListId}`);
return c.json(
{ success: false, message: "Failed to fetch episodes" },
@@ -71,31 +74,45 @@ app.post(
);
}
const { episodes, providerId } = fetchEpisodesResult;
const episode = episodes.find(
(episode) => episode.number === episodeNumber,
);
if (!episode) {
return c.json({ success: false, message: "Episode not found" }, 404);
}
let episodes;
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,
episode.id,
aniListId,
isAnifyEnabled,
);
if (!fetchUrlResult) {
console.error(`Failed to fetch episode URL for episode ${episode.id}`);
return c.json(
{ success: false, message: "Episode URL not found" },
404,
);
continue;
}
} 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(
{ success: false, message: "Failed to fetch episode URL" },
500,