Add preferOriginal query param for /movies

This commit is contained in:
Zoe Roux 2025-01-15 23:16:18 +01:00
parent 7cc6e7e2d4
commit 5ca1b19148

View File

@ -1,5 +1,5 @@
import { and, eq, sql } from "drizzle-orm"; import { and, eq, sql } from "drizzle-orm";
import { Elysia, redirect, t } from "elysia"; import { Elysia, t } from "elysia";
import { KError } from "~/models/error"; import { KError } from "~/models/error";
import { comment } from "~/utils"; import { comment } from "~/utils";
import { db } from "../db"; import { db } from "../db";
@ -9,6 +9,7 @@ import { bubble } from "../models/examples";
import { Movie, MovieStatus, MovieTranslation } from "../models/movie"; import { Movie, MovieStatus, MovieTranslation } from "../models/movie";
import { import {
Filter, Filter,
type Image,
Sort, Sort,
type FilterDef, type FilterDef,
Genre, Genre,
@ -190,13 +191,22 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
.get( .get(
"", "",
async ({ async ({
query: { limit, after, sort, filter }, query: { limit, after, sort, filter, preferOriginal },
headers: { "accept-language": languages }, headers: { "accept-language": languages },
request: { url }, request: { url },
}) => { }) => {
const langs = processLanguages(languages); const langs = processLanguages(languages);
const [transQ, transCol] = getTranslationQuery(langs, true);
// TODO: Add sql indexes on sort keys const transQ = db
.selectDistinctOn([showTranslations.pk])
.from(showTranslations)
.orderBy(
showTranslations.pk,
sql`array_position(${sqlarr(langs)}, ${showTranslations.language})`,
)
.as("t");
const { pk, poster, thumbnail, banner, logo, ...transCol } =
getColumns(transQ);
const items = await db const items = await db
.select({ .select({
@ -204,9 +214,22 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
...transCol, ...transCol,
status: sql<MovieStatus>`${moviesCol.status}`, status: sql<MovieStatus>`${moviesCol.status}`,
airDate: startAir, airDate: startAir,
poster: sql<Image>`coalese(${showTranslations.poster}, ${poster})`,
thumbnail: sql<Image>`coalese(${showTranslations.thumbnail}, ${thumbnail})`,
banner: sql<Image>`coalese(${showTranslations.banner}, ${banner})`,
logo: sql<Image>`coalese(${showTranslations.logo}, ${logo})`,
}) })
.from(shows) .from(shows)
.innerJoin(transQ, eq(shows.pk, transQ.pk)) .innerJoin(transQ, eq(shows.pk, transQ.pk))
.leftJoin(
showTranslations,
and(
eq(shows.pk, showTranslations.pk),
eq(showTranslations.language, shows.originalLanguage),
// TODO: check user's settings before fallbacking to false.
sql`coalese(${preferOriginal}, false)`,
),
)
.where(and(filter, keysetPaginate({ table: shows, after, sort }))) .where(and(filter, keysetPaginate({ table: shows, after, sort })))
.orderBy( .orderBy(
...(sort.random ...(sort.random
@ -244,6 +267,7 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
`, `,
}), }),
), ),
preferOriginal: t.Optional(t.Boolean()),
}), }),
headers: t.Object({ headers: t.Object({
"accept-language": t.String({ "accept-language": t.String({