103 lines
2.7 KiB
TypeScript
103 lines
2.7 KiB
TypeScript
import { z } from "zod";
|
|
|
|
const intensity = z.enum(["mild", "moderate", "strong"]);
|
|
const confidence = z.enum(["high", "medium", "low"]);
|
|
|
|
export const ratingExplainedSchema = z.object({
|
|
officialRating: z.string(),
|
|
region: z.string(),
|
|
summary: z.string(),
|
|
factors: z.array(
|
|
z.object({
|
|
category: z.enum([
|
|
"violence",
|
|
"language",
|
|
"sexuality",
|
|
"substances",
|
|
"frightening",
|
|
"other",
|
|
]),
|
|
intensity,
|
|
description: z.string(),
|
|
approximateTiming: z.string().optional(),
|
|
confidence: confidence.optional(),
|
|
}),
|
|
),
|
|
borderlineNote: z.string().optional(),
|
|
});
|
|
|
|
export const skipGuideSchema = z.object({
|
|
originalRating: z.string(),
|
|
suggestedAudienceAge: z.number().int().min(0).max(21),
|
|
totalSkippedMinutes: z.number().int().min(0),
|
|
segments: z.array(
|
|
z.object({
|
|
start: z.string(),
|
|
end: z.string(),
|
|
reason: z.string(),
|
|
intensity,
|
|
plotImpact: z.enum(["none", "minor", "significant"]),
|
|
skipRecommendation: z.enum(["recommended", "optional", "do_not_skip"]),
|
|
resumeHint: z.string(),
|
|
}),
|
|
),
|
|
disclaimer: z.string(),
|
|
});
|
|
|
|
export const sensitivityGuideSchema = z.object({
|
|
summary: z.string(),
|
|
themes: z.array(
|
|
z.object({
|
|
theme: z.string(),
|
|
severity: intensity,
|
|
description: z.string(),
|
|
approximateTiming: z.string().optional(),
|
|
}),
|
|
),
|
|
});
|
|
|
|
export const internationalRatingsSchema = z.object({
|
|
ratings: z.array(
|
|
z.object({
|
|
country: z.string(),
|
|
countryCode: z.string(),
|
|
rating: z.string(),
|
|
descriptors: z.array(z.string()).optional(),
|
|
}),
|
|
),
|
|
discrepancyNote: z.string(),
|
|
strictestCountry: z.string().optional(),
|
|
mostLenientCountry: z.string().optional(),
|
|
});
|
|
|
|
export const productionFactsSchema = z.object({
|
|
facts: z.array(
|
|
z.object({
|
|
category: z.string(),
|
|
fact: z.string(),
|
|
}),
|
|
),
|
|
budget: z.string().optional(),
|
|
boxOffice: z.string().optional(),
|
|
filmingLocations: z.array(z.string()).optional(),
|
|
});
|
|
|
|
export const historicalAccuracySchema = z.object({
|
|
accuracyScore: z.number().min(0).max(100),
|
|
summary: z.string(),
|
|
accurateElements: z.array(z.string()),
|
|
inventions: z.array(
|
|
z.object({
|
|
claim: z.string(),
|
|
reality: z.string(),
|
|
}),
|
|
),
|
|
confidence,
|
|
});
|
|
|
|
export type RatingExplained = z.infer<typeof ratingExplainedSchema>;
|
|
export type SkipGuide = z.infer<typeof skipGuideSchema>;
|
|
export type SensitivityGuide = z.infer<typeof sensitivityGuideSchema>;
|
|
export type InternationalRatings = z.infer<typeof internationalRatingsSchema>;
|
|
export type ProductionFacts = z.infer<typeof productionFactsSchema>;
|
|
export type HistoricalAccuracy = z.infer<typeof historicalAccuracySchema>; |