mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-07-31 14:33:50 -04:00
Add entriesCount
& availableCount
to seasons
This commit is contained in:
parent
287b5350ff
commit
aea2535cc6
2
api/drizzle/0022_seasons-count.sql
Normal file
2
api/drizzle/0022_seasons-count.sql
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE "kyoo"."seasons" ADD COLUMN "entries_count" integer NOT NULL;--> statement-breakpoint
|
||||||
|
ALTER TABLE "kyoo"."seasons" ADD COLUMN "available_count" integer DEFAULT 0 NOT NULL;
|
1872
api/drizzle/meta/0022_snapshot.json
Normal file
1872
api/drizzle/meta/0022_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -155,6 +155,13 @@
|
|||||||
"when": 1747727831649,
|
"when": 1747727831649,
|
||||||
"tag": "0021_crew",
|
"tag": "0021_crew",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 22,
|
||||||
|
"version": "7",
|
||||||
|
"when": 1752446736231,
|
||||||
|
"tag": "0022_seasons-count",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,8 @@ const seasonFilters: FilterDef = {
|
|||||||
seasonNumber: { column: seasons.seasonNumber, type: "int" },
|
seasonNumber: { column: seasons.seasonNumber, type: "int" },
|
||||||
startAir: { column: seasons.startAir, type: "date" },
|
startAir: { column: seasons.startAir, type: "date" },
|
||||||
endAir: { column: seasons.endAir, type: "date" },
|
endAir: { column: seasons.endAir, type: "date" },
|
||||||
|
entriesCount: { column: seasons.entriesCount, type: "int" },
|
||||||
|
availableCount: { column: seasons.availableCount, type: "int" },
|
||||||
};
|
};
|
||||||
|
|
||||||
const seasonSort = Sort(
|
const seasonSort = Sort(
|
||||||
@ -31,6 +33,8 @@ const seasonSort = Sort(
|
|||||||
seasonNumber: seasons.seasonNumber,
|
seasonNumber: seasons.seasonNumber,
|
||||||
startAir: seasons.startAir,
|
startAir: seasons.startAir,
|
||||||
endAir: seasons.endAir,
|
endAir: seasons.endAir,
|
||||||
|
entriesCount: seasons.entriesCount,
|
||||||
|
availableCount: seasons.availableCount,
|
||||||
nextRefresh: seasons.nextRefresh,
|
nextRefresh: seasons.nextRefresh,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -9,7 +9,13 @@ import {
|
|||||||
sql,
|
sql,
|
||||||
} from "drizzle-orm";
|
} from "drizzle-orm";
|
||||||
import { db, type Transaction } from "~/db";
|
import { db, type Transaction } from "~/db";
|
||||||
import { entries, entryVideoJoin, shows, showTranslations } from "~/db/schema";
|
import {
|
||||||
|
entries,
|
||||||
|
entryVideoJoin,
|
||||||
|
seasons,
|
||||||
|
shows,
|
||||||
|
showTranslations,
|
||||||
|
} from "~/db/schema";
|
||||||
import { conflictUpdateAllExcept, sqlarr } from "~/db/utils";
|
import { conflictUpdateAllExcept, sqlarr } from "~/db/utils";
|
||||||
import type { SeedCollection } from "~/models/collections";
|
import type { SeedCollection } from "~/models/collections";
|
||||||
import type { SeedMovie } from "~/models/movie";
|
import type { SeedMovie } from "~/models/movie";
|
||||||
@ -151,7 +157,7 @@ export async function updateAvailableCount(
|
|||||||
updateEntryCount = false,
|
updateEntryCount = false,
|
||||||
) {
|
) {
|
||||||
const showPkQ = Array.isArray(showPks) ? sqlarr(showPks) : showPks;
|
const showPkQ = Array.isArray(showPks) ? sqlarr(showPks) : showPks;
|
||||||
return await tx
|
await tx
|
||||||
.update(shows)
|
.update(shows)
|
||||||
.set({
|
.set({
|
||||||
availableCount: sql`${db
|
availableCount: sql`${db
|
||||||
@ -179,6 +185,35 @@ export async function updateAvailableCount(
|
|||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
.where(eq(shows.pk, sql`any(${showPkQ})`));
|
.where(eq(shows.pk, sql`any(${showPkQ})`));
|
||||||
|
await tx
|
||||||
|
.update(seasons)
|
||||||
|
.set({
|
||||||
|
availableCount: sql`${db
|
||||||
|
.select({ count: count() })
|
||||||
|
.from(entries)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
eq(entries.showPk, seasons.showPk),
|
||||||
|
eq(entries.seasonNumber, seasons.seasonNumber),
|
||||||
|
ne(entries.kind, "extra"),
|
||||||
|
exists(
|
||||||
|
db
|
||||||
|
.select()
|
||||||
|
.from(entryVideoJoin)
|
||||||
|
.where(eq(entryVideoJoin.entryPk, entries.pk)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)}`,
|
||||||
|
...(updateEntryCount && {
|
||||||
|
entriesCount: sql`${db
|
||||||
|
.select({ count: count() })
|
||||||
|
.from(entries)
|
||||||
|
.where(
|
||||||
|
and(eq(entries.showPk, seasons.showPk), ne(entries.kind, "extra")),
|
||||||
|
)}`,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
.where(eq(seasons.showPk, sql`any(${showPkQ})`));
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updateAvailableSince(
|
export async function updateAvailableSince(
|
||||||
|
@ -122,7 +122,15 @@ export const seedSerie = async (
|
|||||||
);
|
);
|
||||||
if ("status" in show) return show;
|
if ("status" in show) return show;
|
||||||
|
|
||||||
const retSeasons = await insertSeasons(show, seasons);
|
const retSeasons = await insertSeasons(
|
||||||
|
show,
|
||||||
|
seasons.map((s) => ({
|
||||||
|
...s,
|
||||||
|
entriesCount: entries.filter(
|
||||||
|
(x) => x.kind === "episode" && x.seasonNumber === s.seasonNumber,
|
||||||
|
).length,
|
||||||
|
})),
|
||||||
|
);
|
||||||
const retEntries = await insertEntries(show, entries);
|
const retEntries = await insertEntries(show, entries);
|
||||||
const retExtras = await insertEntries(
|
const retExtras = await insertEntries(
|
||||||
show,
|
show,
|
||||||
|
@ -40,6 +40,9 @@ export const seasons = schema.table(
|
|||||||
startAir: date(),
|
startAir: date(),
|
||||||
endAir: date(),
|
endAir: date(),
|
||||||
|
|
||||||
|
entriesCount: integer().notNull(),
|
||||||
|
availableCount: integer().notNull().default(0),
|
||||||
|
|
||||||
externalId: season_extid(),
|
externalId: season_extid(),
|
||||||
|
|
||||||
createdAt: timestamp({ withTimezone: true, mode: "iso" })
|
createdAt: timestamp({ withTimezone: true, mode: "iso" })
|
||||||
|
@ -32,6 +32,15 @@ export const Season = t.Composite([
|
|||||||
SeasonTranslation,
|
SeasonTranslation,
|
||||||
BaseSeason,
|
BaseSeason,
|
||||||
DbMetadata,
|
DbMetadata,
|
||||||
|
t.Object({
|
||||||
|
entriesCount: t.Integer({
|
||||||
|
description: "The number of episodes in this season",
|
||||||
|
}),
|
||||||
|
|
||||||
|
availableCount: t.Integer({
|
||||||
|
description: "The number of episodes that can be played right away",
|
||||||
|
}),
|
||||||
|
}),
|
||||||
]);
|
]);
|
||||||
export type Season = Prettify<typeof Season.static>;
|
export type Season = Prettify<typeof Season.static>;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user