save changes
This commit is contained in:
152
src/data/cinematic_and_film_styles_mockumentaries.json
Normal file
152
src/data/cinematic_and_film_styles_mockumentaries.json
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"subGenre": "Mockumentaries",
|
||||||
|
"scene": "Behind-the-scenes of a struggling community theatre putting on an over-ambitious historical epic (light/sardonic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Paper props labeled in felt-tip pen",
|
||||||
|
"An actor nervously adjusting a wildly inaccurate costume",
|
||||||
|
"A director coaching a soldier's valiant but clearly memorized cry",
|
||||||
|
"A collapsed folding backdrop revealing a janitor's mop",
|
||||||
|
"A program printed with misspelled cast names"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Quick reaction cuts of the cast over-explaining motivations to an unseen interviewer",
|
||||||
|
"An earnest rehearsal interrupted by a misguided special effect that produces a comedic mess",
|
||||||
|
"Cutaways to absurd promotional material promising 'authenticity guaranteed'",
|
||||||
|
"Intertitle captions that contradict what interviewees are saying"
|
||||||
|
],
|
||||||
|
"camera": "Documentary-style hand-held coverage combined with awkwardly placed fixed interview framings and intentionally 'found' phone footage",
|
||||||
|
"accents": [
|
||||||
|
"uneven practical stage light micro-bleed and costume micro-stitch inconsistency",
|
||||||
|
"lo-fi mic rustle and a faint audience cough sound bed"
|
||||||
|
],
|
||||||
|
"mood": "playful, wry, affectionate",
|
||||||
|
"lighting": "practical stage & fluorescent backstage mixes with occasional overexposed highlight",
|
||||||
|
"style": "mockumentary observational satire"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Mockumentaries",
|
||||||
|
"scene": "A faux wildlife documentary following a 'rare urban raccoon with refined habits' (light/absurd)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A raccoon perched by a tiny table with a tea cup",
|
||||||
|
"A narrator solemnly describing the raccoon's 'taste for eclectic cutlery'",
|
||||||
|
"Zoomed macro on a raccoon's paw as though it's a delicate instrument",
|
||||||
|
"A staged tracking camera that the raccoon clearly interacts with",
|
||||||
|
"A habitat 'researcher' holding a clipboard and whispering conspiratorially"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Deadpan interviews with 'experts' offering ludicrously specific behavioral taxonomy",
|
||||||
|
"Slow-motion inserts underscoring mundane raccoon behaviors as if epic",
|
||||||
|
"On-screen scientific graphics that collapse into silly footnotes",
|
||||||
|
"A staged rescue that intentionally misreads the animal's intentions"
|
||||||
|
],
|
||||||
|
"camera": "Nature doc conventions exaggerated: long telephoto sim, cinematic slow-mo, and mock-serious macro inserts",
|
||||||
|
"accents": [
|
||||||
|
"fur micro-detail with comically over-graded color and exaggerated telephoto compression",
|
||||||
|
"fake stat overlay micro-typography and affectless narration tone"
|
||||||
|
],
|
||||||
|
"mood": "irreverent, deadpan, whimsical",
|
||||||
|
"lighting": "naturalistic golden-hour emulation with playfully cinematic grading",
|
||||||
|
"style": "satirical nature documentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Mockumentaries",
|
||||||
|
"scene": "A startup pitch doc where founders earnestly explain an obviously useless product to investors (light/biting)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A glass-walled meeting room with smug post-it-note charts",
|
||||||
|
"Overconfident prototypes that wobble and spark",
|
||||||
|
"A whiteboard drawing devolving into incomprehensible acronyms",
|
||||||
|
"An investor nodding politely while checking their watch",
|
||||||
|
"A press kit filled with jargon-heavy one-liners"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Founder uses sweeping hand gestures and invented metrics to sell the product",
|
||||||
|
"Cutaways to user testimonials that are obviously scripted and absurd",
|
||||||
|
"A demo fails spectacularly, followed by a forced laugh and pivot talk",
|
||||||
|
"On-screen lower-thirds show inflated titles like 'Chief Visionary Officer'"
|
||||||
|
],
|
||||||
|
"camera": "Clean corporate-style B-roll juxtaposed with handheld 'authentic' testimonial inserts and awkward cut-in close-ups",
|
||||||
|
"accents": [
|
||||||
|
"plastic prototype micro-scratch and coffee-cup micro-ring on the table",
|
||||||
|
"powdered enthusiasm in voiceover micro-intonation"
|
||||||
|
],
|
||||||
|
"mood": "satirical, cringe, gleefully critical",
|
||||||
|
"lighting": "bright corporate practicals with occasional cold tungsten to puncture optimism",
|
||||||
|
"style": "mock-expository tech startup documentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Mockumentaries",
|
||||||
|
"scene": "Local council 'truth and reconciliation' meeting that is increasingly petty and performative (dark/comic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A municipal meeting room with a single flag and a stale coffee urn",
|
||||||
|
"Citizens using formal language for personal grievances",
|
||||||
|
"A slide deck with bullet points devolving into passive-aggressive memes",
|
||||||
|
"A gavel tapped to reassert authority over trivial disputes",
|
||||||
|
"An earnest volunteer handing out flyers for a cause that nobody follows"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Close interviews reveal wildly different recollections of the same small incident",
|
||||||
|
"Assembly members perform ritual apologies that avoid responsibility",
|
||||||
|
"Cutaways to archived 'minutes' that read like a tragicomedy",
|
||||||
|
"A final board vote decided by a single petulant abstention"
|
||||||
|
],
|
||||||
|
"camera": "Static institutional coverage with awkwardly framed talking heads and intentionally stale cutaway B-roll",
|
||||||
|
"accents": [
|
||||||
|
"paper micro-curl on agenda pages and microphone micro-pop when speakers change",
|
||||||
|
"low-level room hum micro-noise and fluorescent micro-flicker"
|
||||||
|
],
|
||||||
|
"mood": "dry, ironic, mildly uncomfortable",
|
||||||
|
"lighting": "flat institutional fluorescents with occasional warm practicals during personal moments",
|
||||||
|
"style": "satirical civic mockumentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Mockumentaries",
|
||||||
|
"scene": "A faux cult documentary exploring the rise of an innocuous neighborhood fad treated as a sweeping social movement (light/absurd)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Members wearing matching but clearly homemade insignia",
|
||||||
|
"Merchandise stalls selling intentionally useless tokens",
|
||||||
|
"A slow-motion montage of followers performing a silly ritual",
|
||||||
|
"A founder interviewed with an exaggerated origin myth",
|
||||||
|
"A timeline graphic that compresses months into 'eras' with pompous titles"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Intercut interviews with an escalating sense of earnestness and absurd commitment",
|
||||||
|
"Archival-style footage staged to look older and more significant than it is",
|
||||||
|
"A staged scandal that parodies cult controversies but over trivial details",
|
||||||
|
"Final tongue-in-cheek montage showing the fad's decline into harmless nostalgia"
|
||||||
|
],
|
||||||
|
"camera": "Hybrid archival emulation with modern interview rigs and intentionally inconsistent aspect ratios to imply document age",
|
||||||
|
"accents": [
|
||||||
|
"home-printed badge micro-fiber and staged 'aged' film grain micro-scratch",
|
||||||
|
"overly sincere music cue micro-swell"
|
||||||
|
],
|
||||||
|
"mood": "satirical, absurd, affectionate",
|
||||||
|
"lighting": "variable—archival warm sepia for flashbacks and honest daylight for present interviews",
|
||||||
|
"style": "playful cultural mockumentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Mockumentaries",
|
||||||
|
"scene": "A mock 'lost' instructional film dramatizing simple household tasks as high drama (light/parodic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A 16mm instructional card instructing 'how to fold a fitted sheet' as if a life-or-death skill",
|
||||||
|
"A narrator building suspense over banal steps",
|
||||||
|
"Close-ups on hands with exaggerated importance",
|
||||||
|
"A dramatic reenactment with overly intense actors",
|
||||||
|
"Title cards with faux-authoritative citations"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Deadpan step-by-step sequences treated with cinematic gravity",
|
||||||
|
"Cutaways to faux-experts citing irrelevant 'research' for comedic effect",
|
||||||
|
"Slow crossfades exaggerate the transition between each mundane step",
|
||||||
|
"An escalating montaged score that makes the task feel epic"
|
||||||
|
],
|
||||||
|
"camera": "Intentionally reverent framing and slow push-ins to amplify banality into drama",
|
||||||
|
"accents": [
|
||||||
|
"16mm film grain micro-scratch and instructional card micro-paper texture",
|
||||||
|
"excessive reverb on narration micro-tone"
|
||||||
|
],
|
||||||
|
"mood": "parodic, deadpan, affectionate",
|
||||||
|
"lighting": "studio-key dramatic lighting applied to everyday objects",
|
||||||
|
"style": "parodic instructional mockumentary"
|
||||||
|
}
|
||||||
|
]
|
||||||
202
src/data/cinematic_and_film_styles_nature_documentaries.json
Normal file
202
src/data/cinematic_and_film_styles_nature_documentaries.json
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"subGenre": "Nature Documentaries",
|
||||||
|
"scene": "Pre-dawn rainforest canopy survey with researchers suspended in rope bridges (dark/immersive)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Mist weaving between layered leaf crowns",
|
||||||
|
"Bioluminescent fungi faintly glowing on a fallen log",
|
||||||
|
"A distant primate call answered in echo",
|
||||||
|
"A dew-laden spiderweb glistening in headlamp beams",
|
||||||
|
"Canopy platforms silhouetted against a slowly brightening sky"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Researchers record vocalizations while carefully tagging a sleeping bird",
|
||||||
|
"A slow cable-camera glide follows an individual moving along a branch",
|
||||||
|
"Macro cutaways capture feather micro-structure and insect micro-interactions",
|
||||||
|
"On-screen graphics overlay species names and conservation status"
|
||||||
|
],
|
||||||
|
"camera": "Long cable-suspension wide to show canopy scale, intimate rigs for close macro, and stabilized hand-held for researcher POVs",
|
||||||
|
"accents": [
|
||||||
|
"leaf micro-rain beads and moss micro-fiber detail",
|
||||||
|
"headlamp micro-beam and breath micro-fog in cold pockets"
|
||||||
|
],
|
||||||
|
"mood": "awe, attentive, reverent",
|
||||||
|
"lighting": "soft pre-dawn diffuse light with selective headlamp practicals",
|
||||||
|
"style": "immersive field-naturalist documentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Nature Documentaries",
|
||||||
|
"scene": "Kelp forest dive with a small submersible tracking a migrating sea otter (light/ethereal)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Sunlight shafts filtering through dense kelp blades",
|
||||||
|
"Air bubbles trailing a diver's ascent",
|
||||||
|
"A curious otter inspecting a camera housing",
|
||||||
|
"Silty particles catching the light like slow snow",
|
||||||
|
"A hovering school of fish forming kinetic patterns"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Close gentle interaction as the otter retrieves tagged equipment",
|
||||||
|
"Slow tracking shots show the otter's foraging behavior and kelp architecture",
|
||||||
|
"Hydrophone audio overlays with natural underwater soundscapes",
|
||||||
|
"Scientific annotations appear showing movement telemetry"
|
||||||
|
],
|
||||||
|
"camera": "Underwater wide lenses for environment, close macro housings for behavior, submersible-mounted stable tracking",
|
||||||
|
"accents": [
|
||||||
|
"water micro-sheen on camera domes and kelp micro-vein texture",
|
||||||
|
"bubble micro-surface tension and particulate micro-diffusion"
|
||||||
|
],
|
||||||
|
"mood": "curious, serene, intimate",
|
||||||
|
"lighting": "filtered natural sunlight underwater with practical submersible fills",
|
||||||
|
"style": "marine-behavioral observational documentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Nature Documentaries",
|
||||||
|
"scene": "Nocturnal desert transect where researchers track elusive rodents under moonlight (dark/minimalist)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Moonlit dunes with low-contrast ridgelines",
|
||||||
|
"A tiny footprint leading into a sheltered crevice",
|
||||||
|
"Thermal camera reveal of hidden burrows",
|
||||||
|
"A distant coyote silhouette atop a ridge",
|
||||||
|
"A dune camp with wind-sculpted tarps and ephemeral equipment"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Thermal and infrared inserts reveal movement invisible to naked eye",
|
||||||
|
"Quiet capture and release of a tagged rodent with minimal disturbance",
|
||||||
|
"A researcher records notes by red-filtered light so as not to alarm subjects",
|
||||||
|
"A time-lapse shows dune morphology shifting overnight"
|
||||||
|
],
|
||||||
|
"camera": "Long-lens tele and thermal inserts for detection, low-noise audio capture, and discreet close-ups for delicate handling",
|
||||||
|
"accents": [
|
||||||
|
"sand micro-grain texture and moon micro-glow on horizon",
|
||||||
|
"thermal micro-palette and red-filter micro-illumination"
|
||||||
|
],
|
||||||
|
"mood": "patient, sparse, scientific",
|
||||||
|
"lighting": "moonlight-dominant low-key with thermal/instrument practicals",
|
||||||
|
"style": "nocturnal field-study documentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Nature Documentaries",
|
||||||
|
"scene": "Alpine meadow pollinator census at golden hour (light/delicate)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Bees and butterflies visiting swathes of alpine wildflowers",
|
||||||
|
"Mist rolling from a valley as sun warms the slope",
|
||||||
|
"A close focus on proboscis and pollen grains",
|
||||||
|
"A shepherd dog resting against a weathered fencepost",
|
||||||
|
"Tiny hand-labeled specimen vials arranged on a cloth"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Macro sequences showing pollination mechanics in crisp slow motion",
|
||||||
|
"Researchers count and annotate species on tablet overlays",
|
||||||
|
"Cutaways to ecological graphics showing pollinator-plant networks",
|
||||||
|
"A short interview with a local botanist about seasonal shifts"
|
||||||
|
],
|
||||||
|
"camera": "Macro lenses for insect detail, gentle dolly across meadow for scale, and stabilized close-up on hands at work",
|
||||||
|
"accents": [
|
||||||
|
"pollen micro-grain detail and wing micro-membrane translucence",
|
||||||
|
"sun micro-rim on flower petals and herb micro-scent haze"
|
||||||
|
],
|
||||||
|
"mood": "delicate, hopeful, scientifically curious",
|
||||||
|
"lighting": "warm golden-hour light with shallow depth-of-field highlights",
|
||||||
|
"style": "micro-ecology observational piece"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Nature Documentaries",
|
||||||
|
"scene": "Arctic ice floe survey documenting seal pupping season (light/fragile)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Low winter sun glancing on blue ice ridges",
|
||||||
|
"Tiny seal pups huddled on thin ice",
|
||||||
|
"A zodiac approaching carefully to avoid disturbance",
|
||||||
|
"Annotated satellite overlays showing shrinking floe extents",
|
||||||
|
"A battered field tent and scientific flags"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Gentle observational coverage of nursing and pup behavior",
|
||||||
|
"Scientists deploy non-invasive sensors and tag locations",
|
||||||
|
"Aerial drone shots show fracturing floes and retreating pack ice",
|
||||||
|
"On-screen context provides historical sea-ice trend data"
|
||||||
|
],
|
||||||
|
"camera": "Cold-rated telephoto for distant behavior, drone for floe scale, and stabilized close-up lenses for animal detail",
|
||||||
|
"accents": [
|
||||||
|
"ice micro-crystal detail and fur micro-fluff on pups",
|
||||||
|
"breath micro-condensation and fabric micro-stitch on parkas"
|
||||||
|
],
|
||||||
|
"mood": "fragile, urgent, tender",
|
||||||
|
"lighting": "low-angle cool daylight with high-definition contrast",
|
||||||
|
"style": "polar conservation documentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Nature Documentaries",
|
||||||
|
"scene": "Migratory bird stopover wetlands captured at dawn with flocks taking flight (light/epic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Silhouetted flocks forming complex murmuration patterns",
|
||||||
|
"Reed beds bending under an early breeze",
|
||||||
|
"Field technicians counting flocks from a blind",
|
||||||
|
"GPS-tagged birds shown on animated migratory maps",
|
||||||
|
"A shallow reflection mosaic on calm water"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Time-sliced aerial reveals flight paths and congregation density",
|
||||||
|
"Close audio recorders display call signatures with spectrogram overlays",
|
||||||
|
"Scientists explain habitat importance with overlay conservation metrics",
|
||||||
|
"A community restoration team prepares nest boxes and monitoring stations"
|
||||||
|
],
|
||||||
|
"camera": "High-altitude drone for flock geometry, long lens for individual behavior, and stabilized boat-based coverage for human activity",
|
||||||
|
"accents": [
|
||||||
|
"feather micro-barb detail and water micro-ripple texture",
|
||||||
|
"GPS micro-ui overlays and spectrogram micro-detail"
|
||||||
|
],
|
||||||
|
"mood": "expansive, rhythmic, informative",
|
||||||
|
"lighting": "soft rising sunlight with reflective low-angle highlights",
|
||||||
|
"style": "migration-focused scientific documentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Nature Documentaries",
|
||||||
|
"scene": "Volcanic island succession showing life returning to cooled lava fields (light/resilient)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Black new rock interspersed with pioneering moss patches",
|
||||||
|
"A hermit crab scuttling across a basalt plain",
|
||||||
|
"A time-lapse of lichen colonization across months",
|
||||||
|
"A veteran field ecologist pointing to micro-habitats in crevices",
|
||||||
|
"Steam vents hissing in background at the island's heart"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Macro-to-wide transitions demonstrate ecological succession stages",
|
||||||
|
"Interviews with ecologists explain nutrient cycles and colonizers",
|
||||||
|
"Animated overlays show decades of regrowth and species arrival",
|
||||||
|
"A final celebratory montage of returned seabirds and plant cover"
|
||||||
|
],
|
||||||
|
"camera": "Macro lenses for early colonizers, wide environmental panoramas, and stabilized time-lapse rigs",
|
||||||
|
"accents": [
|
||||||
|
"lava micro-pitting and moss micro-felt detail",
|
||||||
|
"salt micro-crystallization and wind micro-etching on rock"
|
||||||
|
],
|
||||||
|
"mood": "resilient, instructive, quietly triumphant",
|
||||||
|
"lighting": "bright island sunlight with strong shadow definition",
|
||||||
|
"style": "succession and resilience nature documentary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Nature Documentaries",
|
||||||
|
"scene": "Urban wildlife corridor at dusk showing foxes, hedgehogs, and foraging birds (light/hopeful)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A narrow greenbelt threaded between apartment blocks",
|
||||||
|
"Garden feeders and makeshift hedgehog homes",
|
||||||
|
"A fox slipping through a chain-link gap",
|
||||||
|
"Children peering over a fence with quiet curiosity",
|
||||||
|
"Streetlights casting soft pools across grass"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Observational shots of nocturnal foraging with motion-activated cameras",
|
||||||
|
"Local residents describe coexistence strategies in short interviews",
|
||||||
|
"Conservation groups install habitat improvements with quick explanatory inserts",
|
||||||
|
"Before-and-after B-roll shows measurable increase in local biodiversity"
|
||||||
|
],
|
||||||
|
"camera": "Discrete trail cameras for behavior, gentle handheld for resident interviews, and stabilized night-lapse for corridor activity",
|
||||||
|
"accents": [
|
||||||
|
"fur micro-texture and grass micro-blade detail",
|
||||||
|
"streetlight micro-halo and motion-sensor micro-trigger sound beds"
|
||||||
|
],
|
||||||
|
"mood": "optimistic, communal, pragmatic",
|
||||||
|
"lighting": "soft dusk with practical urban lighting and subtle fill",
|
||||||
|
"style": "urban-nature coexistence documentary"
|
||||||
|
}
|
||||||
|
]
|
||||||
202
src/data/cinematic_and_film_styles_short_films.json
Normal file
202
src/data/cinematic_and_film_styles_short_films.json
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"subGenre": "Short Films",
|
||||||
|
"scene": "One-shot apartment elevator ride where two strangers share a life-changing secret (light/intimate)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A cramped elevator with a faulty fluorescent overhead",
|
||||||
|
"Close-up of intertwined hands as a bag slips",
|
||||||
|
"A practiced smile that falters mid-floor",
|
||||||
|
"A hastily scribbled note handed as the doors open",
|
||||||
|
"Silent pause before both step out into different lives"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Two characters exchange fragmented confessions over a few floors",
|
||||||
|
"A small prop (ring, photograph, ticket) changes hands to signify trust",
|
||||||
|
"A brief misunderstanding resolves into mutual compassion",
|
||||||
|
"Doors close on a changed expression and the sound of the elevator returning"
|
||||||
|
],
|
||||||
|
"camera": "Single continuous handheld for the one-shot intimacy, subtle push-ins on reaction beats",
|
||||||
|
"accents": [
|
||||||
|
"fluorescent micro-flicker and fabric micro-weave on coats",
|
||||||
|
"elevator micro-echo sound bed and button micro-press clicks"
|
||||||
|
],
|
||||||
|
"mood": "tense then tender",
|
||||||
|
"lighting": "flat practical with a warm fill on closing beat",
|
||||||
|
"style": "minimalist one-shot short"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Short Films",
|
||||||
|
"scene": "Late-night laundromat where a lost friendship is mended between cycles (light/nostalgic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Rows of spinning chrome machines reflecting neon",
|
||||||
|
"A faded mixtape sleeve tucked beneath quarters",
|
||||||
|
"A child's drawing taped to a folding table",
|
||||||
|
"Steam fogging glass during a sudden laugh",
|
||||||
|
"Hands folding identical shirts in slow unison"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Old friends trade small confessions while folding laundry",
|
||||||
|
"A shared memory triggers a spontaneous reconciliation ritual",
|
||||||
|
"Montage of folding intercut with flash memory fragments",
|
||||||
|
"A final handshake that replaces an awkward silence"
|
||||||
|
],
|
||||||
|
"camera": "Medium static coverage with delicate close-ups and rhythmic cutting to match wash cycles",
|
||||||
|
"accents": [
|
||||||
|
"metal micro-polish on washer rims and detergent micro-suds",
|
||||||
|
"tape micro-peel texture and coin micro-clink"
|
||||||
|
],
|
||||||
|
"mood": "warm, forgiving, bittersweet",
|
||||||
|
"lighting": "neon practicals with soft diffusion",
|
||||||
|
"style": "character vignette short"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Short Films",
|
||||||
|
"scene": "Experimental: a fragmented memory portrayed through jump-cuts, practical effects, and layered sound (dark/abstract)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A cracked mirror reflecting multiple partial faces",
|
||||||
|
"A kitchen clock with its hands spinning irregularly",
|
||||||
|
"Superimposed footsteps across different floors",
|
||||||
|
"A hand tracing a child's name on frosted glass",
|
||||||
|
"An out-of-sync mouth movement against whispered audio"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Rapid montage stitches together non-linear memory fragments",
|
||||||
|
"Practical in-camera effects create seamless and disorienting transitions",
|
||||||
|
"Sound design becomes the narrative driver, with whispers and pulses guiding emotion",
|
||||||
|
"A final still frame holds, allowing meaning to coalesce or dissolve"
|
||||||
|
],
|
||||||
|
"camera": "Intimate close-ups, unpredictable zooms, and purposeful jump-cut rhythm",
|
||||||
|
"accents": [
|
||||||
|
"film micro-grain overlays and tape micro-hiss in audio layers",
|
||||||
|
"practical micro-shadow play and textured micro-scratches"
|
||||||
|
],
|
||||||
|
"mood": "disorienting, meditative, evocative",
|
||||||
|
"lighting": "high-contrast practicals with occasional strobe accents",
|
||||||
|
"style": "experimental collage short"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Short Films",
|
||||||
|
"scene": "Dark comedy: a suburban garage sale where the seller slowly realizes every item reveals an embarrassing secret (dark/wry)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Packed folding tables with mismatched tchotchkes",
|
||||||
|
"A neighbor laughing too loudly at a strangely specific anecdote",
|
||||||
|
"A price tag revealing the original owner's private note",
|
||||||
|
"A child pointing at an awkward object with blunt curiosity",
|
||||||
|
"A banner reading 'Everything Must Go' flapping comically"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Customers barter over items while inadvertently disclosing personal gossip",
|
||||||
|
"Seller attempts damage control as each object exposes another memory",
|
||||||
|
"A sudden reveal that transforms the sale into community catharsis",
|
||||||
|
"A shadow of embarrassment dissolves into shared laughter"
|
||||||
|
],
|
||||||
|
"camera": "Observational handheld with quick reaction close-ups and wider community coverage",
|
||||||
|
"accents": [
|
||||||
|
"paper micro-tag creases and plastic micro-fade on goods",
|
||||||
|
"ambient suburban micro-traffic and distant lawn-mower hum"
|
||||||
|
],
|
||||||
|
"mood": "funny, awkward, humane",
|
||||||
|
"lighting": "natural afternoon daylight with warm fill",
|
||||||
|
"style": "deadpan suburban short"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Short Films",
|
||||||
|
"scene": "Silent-era homage: a black-and-white montage of a street vendor's brief triumph and loss (light/poignant)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Hand-painted signage and a wooden cart with brass fittings",
|
||||||
|
"A passerby's hat flying off in a sudden breeze",
|
||||||
|
"A mime-like exchange over a single coin",
|
||||||
|
"A close on a newspaper headline signaling changing times",
|
||||||
|
"A slow dissolve to an empty cart at dusk"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Pantomime-driven encounters create expressive, wordless narrative beats",
|
||||||
|
"Physical comedy transitions into a quietly tragic payoff",
|
||||||
|
"Intertitles provide ironic commentary and emotional context",
|
||||||
|
"A final tableau underscores the cycle of hope and loss"
|
||||||
|
],
|
||||||
|
"camera": "Static and measured framing, occasional gentle tracking to mimic period cinematography",
|
||||||
|
"accents": [
|
||||||
|
"film micro-grain and intertitle micro-typefaces",
|
||||||
|
"wood micro-patina and coin micro-glint"
|
||||||
|
],
|
||||||
|
"mood": "nostalgic, bittersweet, poetic",
|
||||||
|
"lighting": "high-key contrast emulating early cinema",
|
||||||
|
"style": "silent-era homage short"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Short Films",
|
||||||
|
"scene": "Stop-motion: an intimate letter delivered by a handmade puppet across a miniature city (light/charming)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Tiny streetlights casting soft pools of warmth",
|
||||||
|
"A scaled mailbox with a tiny flag that pops",
|
||||||
|
"Close-ups on articulated fingers and stitched fabric",
|
||||||
|
"A layered miniature skyline with painted clouds",
|
||||||
|
"An elaborate sequence of gears and pulleys driving movement"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Carefully choreographed stop-motion delivers tactile narrative beats",
|
||||||
|
"Physical interactions emphasize craftsmanship and small-scale emotion",
|
||||||
|
"A montage of tiny rituals culminating in the letter reaching its destination",
|
||||||
|
"A reveal that the letter heals a small, personal rift"
|
||||||
|
],
|
||||||
|
"camera": "Macro-focused frame-by-frame capture with precise puppet articulation and slow dolly reveals",
|
||||||
|
"accents": [
|
||||||
|
"fabric micro-stitch and paper micro-fiber detail",
|
||||||
|
"stop-motion micro-jerk used intentionally for charm"
|
||||||
|
],
|
||||||
|
"mood": "warm, whimsical, handcrafted",
|
||||||
|
"lighting": "soft practicals with careful shadow sculpting",
|
||||||
|
"style": "artisanal stop-motion short"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Short Films",
|
||||||
|
"scene": "Micro-thriller: a locked convenience store at dawn with a lone clerk and a suspicious customer (dark/suspenseful)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Flickering refrigeration lights and a humming neon 'Open' sign",
|
||||||
|
"A receipt printer spooling in the background",
|
||||||
|
"A hulking coat concealing a tense silhouette",
|
||||||
|
"A pack of gum left conspicuously near the register",
|
||||||
|
"A CCTV monitor showing an empty street outside"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Slow escalation of mistrust through glances, offhand questions, and minor provocations",
|
||||||
|
"Tension punctuated by tiny physical actions (a forced laugh, a slammed can)",
|
||||||
|
"A twist reveal reframes earlier benign details into threat or relief",
|
||||||
|
"An abrupt blackout leaves the resolution ambiguous"
|
||||||
|
],
|
||||||
|
"camera": "Tight medium coverage with selective handheld inserts to heighten unease; long takes for simmering tension",
|
||||||
|
"accents": [
|
||||||
|
"plastic micro-crinkle on snack wrappers and fluorescent micro-hum",
|
||||||
|
"CCTV micro-grain and faint street micro-ambience"
|
||||||
|
],
|
||||||
|
"mood": "claustrophobic, tense, uncertain",
|
||||||
|
"lighting": "cold practical fluorescents with a single warmer key for the clerk",
|
||||||
|
"style": "micro-thriller short"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Short Films",
|
||||||
|
"scene": "Romantic vignette: two strangers exchange notes on opposite benches in a park over a single summer afternoon (light/delicate)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Dappled sunlight through plane-tree leaves",
|
||||||
|
"A paper plane gliding between benches",
|
||||||
|
"A carved initials heart on an old bench armrest",
|
||||||
|
"A stray dog weaving between the silence and notes",
|
||||||
|
"A wristwatch ticking prominently during a pause"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"A quiet correspondence develops via folded notes and small, thoughtful gestures",
|
||||||
|
"Soundless montages of parallel actions emphasize connection without meeting",
|
||||||
|
"A final meeting is implied rather than shown, leaving space for imagination",
|
||||||
|
"A closing visual motif recalls the very first exchanged note"
|
||||||
|
],
|
||||||
|
"camera": "Soft telephoto separations to create intimacy across physical distance; gentle cross-cutting montage",
|
||||||
|
"accents": [
|
||||||
|
"paper micro-fold creases and leaf micro-rustle",
|
||||||
|
"ambient park micro-sound with bird micro-chirps"
|
||||||
|
],
|
||||||
|
"mood": "tender, hopeful, wistful",
|
||||||
|
"lighting": "warm afternoon golden-hour with shallow depth-of-field",
|
||||||
|
"style": "romantic vignette short"
|
||||||
|
}
|
||||||
|
]
|
||||||
202
src/data/cinematic_and_film_styles_superhero_films.json
Normal file
202
src/data/cinematic_and_film_styles_superhero_films.json
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"subGenre": "Superhero Films",
|
||||||
|
"scene": "Nighttime rooftop confrontation above a rain-slicked neon city (dark/epic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Sparks from a distant helicopter rotor silhouette the skyline",
|
||||||
|
"A dropped glove flutters toward the alley below",
|
||||||
|
"Neon signage reflected in puddles at the ledge",
|
||||||
|
"A villain's henchman falls past the camera in slow motion",
|
||||||
|
"A rooftop antenna creates dramatic rim-light"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Hero grapples to regain balance as a thrown projectile shatters nearby glass",
|
||||||
|
"Villain delivers an ideological monologue while circling the rooftop",
|
||||||
|
"A sudden rescue jump redirects the conflict toward civilians below",
|
||||||
|
"A decisive punch sends a crate tumbling into frame to reveal a hidden clue"
|
||||||
|
],
|
||||||
|
"camera": "Dynamic combination of sweeping crane, tight handheld on faces for micro-expression, and slow-mo inserts for impact",
|
||||||
|
"accents": [
|
||||||
|
"rain micro-refraction on cape and visor micro-glass sheen",
|
||||||
|
"neon micro-bloom and rooftop grit micro-texture"
|
||||||
|
],
|
||||||
|
"mood": "tense, heroic, cinematic",
|
||||||
|
"lighting": "high-contrast rim and practical neon with splashes of rain-reflect catchlights",
|
||||||
|
"style": "superhero blockbuster with grounded gritty accents"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Superhero Films",
|
||||||
|
"scene": "Small-town origin: discovery of the artifact in a dusty farmhouse attic (light/quiet)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Sunbeams cutting through attic dust and rafters",
|
||||||
|
"A family photo with a hidden burn mark",
|
||||||
|
"An old radio crackling with a faint emergency broadcast",
|
||||||
|
"A curious child accidentally activating a subtle glow",
|
||||||
|
"Handwritten notes tucked into a leather box"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Character tentatively places the artifact on a table and it hums to life",
|
||||||
|
"Close-up on a palm absorbing a faint charge and twitching with new power",
|
||||||
|
"Cut to a montage of small displays lighting up across town",
|
||||||
|
"A neighbor's dog howls as a far-off siren responds"
|
||||||
|
],
|
||||||
|
"camera": "Warm close-ups and intimate dolly pushes for discovery; macro inserts on artifact details",
|
||||||
|
"accents": [
|
||||||
|
"dust micro-motes and wood micro-grain on attic floorboards",
|
||||||
|
"artifact micro-glow halo and faint electronic micro-buzz"
|
||||||
|
],
|
||||||
|
"mood": "awe, curiosity, quiet destiny",
|
||||||
|
"lighting": "soft warm daylight with a single artifact-driven glow",
|
||||||
|
"style": "origin-story drama with magical-realism touches"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Superhero Films",
|
||||||
|
"scene": "Hero in civilian disguise navigating a bustling public parade before an ambush (light/chaotic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Confetti in the air and banners snapping in a mild breeze",
|
||||||
|
"Crowd reaction shots with flags and phone-recording hands",
|
||||||
|
"A street vendor startled as a costumed figure darts past",
|
||||||
|
"A parade float passing with a cryptic logo",
|
||||||
|
"Security cameras on lamp posts angled at the crowd"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Hero maintains cover while subtly redirecting pedestrians away from danger",
|
||||||
|
"A sudden explosion of themed balloons reveals hidden drones",
|
||||||
|
"Split-second decision to reveal powers to save a collapsing stand",
|
||||||
|
"A quick symbolic gesture that rallies bystanders to help"
|
||||||
|
],
|
||||||
|
"camera": "Fluid steadicam weaving through crowd, punctuated with rapid close handheld inserts during action",
|
||||||
|
"accents": [
|
||||||
|
"confetti micro-fiber texture and practical parade light micro-speculars",
|
||||||
|
"phone-screen micro-glare and crowd micro-interaction sound beds"
|
||||||
|
],
|
||||||
|
"mood": "urgent, public stakes, heroic restraint",
|
||||||
|
"lighting": "bright daylight with strong practical highlights and lens flare",
|
||||||
|
"style": "urban-action with emotional public drama"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Superhero Films",
|
||||||
|
"scene": "Secret lab beneath city: a containment breach and moral choice (dark/forbidding)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Vapor trails from cryogenic chambers",
|
||||||
|
"Warning lights cycling red along stainless steel walls",
|
||||||
|
"A shattered containment window with frost crystals",
|
||||||
|
"A technician's abandoned tablet with an urgent note",
|
||||||
|
"A digital countdown frozen on a cracked screen"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Containment alarms trigger as an experiment destabilizes",
|
||||||
|
"Hero must decide whether to rescind a protocol or risk collateral damage",
|
||||||
|
"A flash of power stabilizes the reactor but leaves ambiguous consequences",
|
||||||
|
"Aftermath contains evidence suggesting the villain manipulated the experiment"
|
||||||
|
],
|
||||||
|
"camera": "Clinical tracking shots for lab machinery, jittery handheld during the breach, and close-in reaction shots",
|
||||||
|
"accents": [
|
||||||
|
"metal micro-grain and condensation micro-beads on glass",
|
||||||
|
"alarm micro-pulse lighting and screen micro-pixel grid"
|
||||||
|
],
|
||||||
|
"mood": "tense, ethical, ominous",
|
||||||
|
"lighting": "cool practicals, strobed alarm reds, and monitor-dominant fills",
|
||||||
|
"style": "techno-thriller superhero sequence with moral complexity"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Superhero Films",
|
||||||
|
"scene": "Midnight alley rescue where the hero's methods are questioned by an onlooker (dark/gritty)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A discarded child's toy under a chain-link fence",
|
||||||
|
"Steam rising from a sewer grate",
|
||||||
|
"A wary bystander filming from a doorway",
|
||||||
|
"Graffiti telling a local urban legend about a masked savior",
|
||||||
|
"A fractured streetlamp flickering overhead"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Hero stops a mugging with swift non-lethal force and helps the victim up",
|
||||||
|
"An onlooker confronts the hero later, asking why they cross the line",
|
||||||
|
"Hero avoids answering and leaves a glittering emblem behind",
|
||||||
|
"Cutaways to police report files implying mixed public opinion"
|
||||||
|
],
|
||||||
|
"camera": "Handheld close to the action, then pulled back to a voyeuristic fixed frame as the moral debate unfolds",
|
||||||
|
"accents": [
|
||||||
|
"sewer-steam micro-haze and fabric micro-weave of the hero's gloves",
|
||||||
|
"streetlamp micro-flicker and pavement micro-moisture speculars"
|
||||||
|
],
|
||||||
|
"mood": "ambiguous, gritty, introspective",
|
||||||
|
"lighting": "low-key practicals with single-source highlights and deep shadows",
|
||||||
|
"style": "street-level vigilante drama"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Superhero Films",
|
||||||
|
"scene": "Training montage in abandoned subway tunnels (dark/kinetic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Old tiled columns with posters half-torn",
|
||||||
|
"A makeshift obstacle course of discarded crates and pipes",
|
||||||
|
"Sparks from improvised sparring equipment",
|
||||||
|
"A chalkboard with tactical diagrams scribbled and erased",
|
||||||
|
"A single fluorescent tube buzzing above"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Accelerated sequences of parkour, gadget testing, and tactical drills",
|
||||||
|
"Hero and mentor exchange terse coaching advice mid-exertion",
|
||||||
|
"Close micro-shots of callused hands and focused eyes",
|
||||||
|
"A final timed run that ends in a confident stance on a platform edge"
|
||||||
|
],
|
||||||
|
"camera": "Rapid cutting rhythm with whip-pans, intercut slow-motion for form emphasis, and POV inserts",
|
||||||
|
"accents": [
|
||||||
|
"concrete micro-pitting and sweat micro-sheen on brows",
|
||||||
|
"metal micro-echo and fluorescent micro-flicker"
|
||||||
|
],
|
||||||
|
"mood": "determined, focused, emergent power",
|
||||||
|
"lighting": "directional practicals with gritty tungsten cast and selective fill",
|
||||||
|
"style": "heightened training montage blending realism and stylization"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Superhero Films",
|
||||||
|
"scene": "Citywide team-up on a stormy night to stop a collapsing bridge (dark/heroic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"Suspension cables snapping with distant thunder",
|
||||||
|
"Headlights streaming through heavy rain like comet tails",
|
||||||
|
"Civilians on the bridge quickly being shepherded to safety",
|
||||||
|
"A silhouetted team emblem briefly visible in lightning",
|
||||||
|
"Emergency vehicles forming a chaotic perimeter"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Team executes synchronized maneuvers to prevent structural collapse",
|
||||||
|
"One member sacrifices their position to hold a failing cable",
|
||||||
|
"Heroic rallying dialogue over comms unites the team and spurs the rescue",
|
||||||
|
"Final slow reveal of saved civilians applauding from safe distance"
|
||||||
|
],
|
||||||
|
"camera": "Epic wide shots to show scale, medium action coverage, and emotional close-ups for the sacrifice beats",
|
||||||
|
"accents": [
|
||||||
|
"rain micro-streaks on visors and metal micro-spray from water impact",
|
||||||
|
"cable micro-fray detail and thunder micro-room tone"
|
||||||
|
],
|
||||||
|
"mood": "epic, sacrificial, triumphant",
|
||||||
|
"lighting": "strobe-like lightning with vehicle practicals and searchlight beams",
|
||||||
|
"style": "ensemble superhero set-piece balancing spectacle and heart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subGenre": "Superhero Films",
|
||||||
|
"scene": "Dawn aftermath: quiet rooftop reflection and the cost of vigilance (light/melancholic)",
|
||||||
|
"sceneVariants": [
|
||||||
|
"A battered emblem patched and pinned to rooftop chain",
|
||||||
|
"Dawn birds hesitantly returning to powerlines",
|
||||||
|
"A folded newspaper headline about the night's events",
|
||||||
|
"A small bouquet left anonymously beside a memorial plaque",
|
||||||
|
"Footprints in rooftop gravel leading to the ledge"
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
"Hero surveys the city with a weary expression and pocketed trinkets from those saved",
|
||||||
|
"A quiet radio transmission reports no casualties; a soft exhale is heard",
|
||||||
|
"Cut to a montage of news headlines and personal messages hinting at ongoing consequences",
|
||||||
|
"A final isolated close-up of the hero removing their mask and staring at the skyline"
|
||||||
|
],
|
||||||
|
"camera": "Slow contemplative crane pullback with intimate close-ups punctuating the quiet aftermath",
|
||||||
|
"accents": [
|
||||||
|
"fabric micro-tear and sunrise micro-gold rim on cape",
|
||||||
|
"paper micro-fiber detail on newspaper and rooftop micro-grit"
|
||||||
|
],
|
||||||
|
"mood": "reflective, weary, hopeful",
|
||||||
|
"lighting": "soft warm dawn with low contrast and gentle rim-light",
|
||||||
|
"style": "character-driven quiet epilogue"
|
||||||
|
}
|
||||||
|
]
|
||||||
@ -18,10 +18,10 @@ const servers = [
|
|||||||
baseUrl: process.env.SERVER1_COMFY_BASE_URL,
|
baseUrl: process.env.SERVER1_COMFY_BASE_URL,
|
||||||
outputDir: process.env.SERVER1_COMFY_OUTPUT_DIR,
|
outputDir: process.env.SERVER1_COMFY_OUTPUT_DIR,
|
||||||
},
|
},
|
||||||
{
|
//{
|
||||||
baseUrl: process.env.SERVER2_COMFY_BASE_URL,
|
// baseUrl: process.env.SERVER2_COMFY_BASE_URL,
|
||||||
outputDir: process.env.SERVER2_COMFY_OUTPUT_DIR,
|
// outputDir: process.env.SERVER2_COMFY_OUTPUT_DIR,
|
||||||
},
|
//},
|
||||||
];
|
];
|
||||||
|
|
||||||
const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { logger } from './lib/logger';
|
|||||||
import { callLMStudio } from './lib/lmstudio';
|
import { callLMStudio } from './lib/lmstudio';
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
//await insertGenres();
|
await insertGenres();
|
||||||
await generatePrompts();
|
await generatePrompts();
|
||||||
process.exit();
|
process.exit();
|
||||||
}
|
}
|
||||||
@ -13,23 +13,63 @@ async function main() {
|
|||||||
async function insertGenres() {
|
async function insertGenres() {
|
||||||
logger.info('Starting genre insertion...');
|
logger.info('Starting genre insertion...');
|
||||||
try {
|
try {
|
||||||
const genresPath = path.join(__dirname, 'data', 'genres.json');
|
const dataDir = path.join(__dirname, 'data');
|
||||||
const genresData = JSON.parse(fs.readFileSync(genresPath, 'utf-8'));
|
const files = fs.readdirSync(dataDir).filter((f) => f.endsWith('.json'));
|
||||||
|
|
||||||
for (const genre in genresData) {
|
for (const file of files) {
|
||||||
if (genresData.hasOwnProperty(genre)) {
|
// skip the central genres.json (if present) since individual files represent sub-genres
|
||||||
const items = genresData[genre];
|
if (file === 'genres.json') continue;
|
||||||
for (let item of items) {
|
|
||||||
if (Array.isArray(item)) {
|
const filePath = path.join(dataDir, file);
|
||||||
for (const subItem of item) {
|
let raw: string;
|
||||||
await processItem(genre, subItem);
|
try {
|
||||||
|
raw = fs.readFileSync(filePath, 'utf-8');
|
||||||
|
} catch (err) {
|
||||||
|
logger.warn(`Could not read file ${file}: ${err}`);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let jsonData: any;
|
||||||
|
try {
|
||||||
|
jsonData = JSON.parse(raw);
|
||||||
|
} catch (err) {
|
||||||
|
logger.warn(`Skipping ${file} - invalid JSON: ${err}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Derive a genre from the filename (e.g. abstract_art_3d_renderings.json -> abstract_art)
|
||||||
|
const base = path.basename(file, '.json');
|
||||||
|
const parts = base.split('_');
|
||||||
|
const genre = parts[0] || base;
|
||||||
|
|
||||||
|
// Normalize to an array of items
|
||||||
|
let items: any[] = [];
|
||||||
|
if (Array.isArray(jsonData)) {
|
||||||
|
items = jsonData;
|
||||||
|
} else if (typeof jsonData === 'object' && jsonData !== null) {
|
||||||
|
// If there is an 'items' property, prefer it
|
||||||
|
if (Array.isArray((jsonData as any).items)) {
|
||||||
|
items = (jsonData as any).items;
|
||||||
} else {
|
} else {
|
||||||
|
// Otherwise, try to collect object values that look like items (fallback)
|
||||||
|
const vals = Object.values(jsonData);
|
||||||
|
for (const v of vals) {
|
||||||
|
if (Array.isArray(v)) {
|
||||||
|
items = items.concat(v);
|
||||||
|
} else if (v && typeof v === 'object') {
|
||||||
|
items.push(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const item of items) {
|
||||||
|
if (item && typeof item === 'object') {
|
||||||
await processItem(genre, item);
|
await processItem(genre, item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
logger.info('Finished processing genres.');
|
logger.info('Finished processing genres.');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Error processing genres:', error);
|
logger.error('Error processing genres:', error);
|
||||||
@ -92,23 +132,112 @@ async function generatePrompts() {
|
|||||||
|
|
||||||
async function processItem(genre: string, item: any) {
|
async function processItem(genre: string, item: any) {
|
||||||
if (item && typeof item === 'object' && !Array.isArray(item)) {
|
if (item && typeof item === 'object' && !Array.isArray(item)) {
|
||||||
const { subGenre, scene, action, camera } = item;
|
const {
|
||||||
|
subGenre,
|
||||||
|
scene,
|
||||||
|
sceneVariants,
|
||||||
|
actions,
|
||||||
|
action,
|
||||||
|
camera,
|
||||||
|
accents,
|
||||||
|
mood,
|
||||||
|
lighting,
|
||||||
|
style,
|
||||||
|
} = item;
|
||||||
|
|
||||||
// Check if the item already exists
|
// Determine final scene text
|
||||||
|
const finalScene =
|
||||||
|
(typeof scene === 'string' && scene.trim().length > 0)
|
||||||
|
? scene
|
||||||
|
: Array.isArray(sceneVariants) && sceneVariants.length > 0
|
||||||
|
? sceneVariants[0]
|
||||||
|
: '';
|
||||||
|
|
||||||
|
// Choose one random action (fall back to legacy 'action' if needed)
|
||||||
|
let chosenAction = '';
|
||||||
|
if (Array.isArray(actions) && actions.length > 0) {
|
||||||
|
chosenAction = actions[Math.floor(Math.random() * actions.length)];
|
||||||
|
} else if (typeof action === 'string') {
|
||||||
|
chosenAction = action;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Choose random accents (pick 1 or 2 if available)
|
||||||
|
let chosenAccents = '';
|
||||||
|
if (Array.isArray(accents) && accents.length > 0) {
|
||||||
|
const pickCount = Math.min(accents.length, Math.random() < 0.5 ? 1 : 2);
|
||||||
|
const shuffled = accents.slice().sort(() => Math.random() - 0.5);
|
||||||
|
chosenAccents = shuffled.slice(0, pickCount).join('; ');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build a meta string that includes accents, mood, lighting, and style
|
||||||
|
const metaParts: string[] = [];
|
||||||
|
if (chosenAccents) metaParts.push(`Accents: ${chosenAccents}`);
|
||||||
|
if (mood) metaParts.push(`Mood: ${mood}`);
|
||||||
|
if (lighting) metaParts.push(`Lighting: ${lighting}`);
|
||||||
|
if (style) metaParts.push(`Style: ${style}`);
|
||||||
|
const meta = metaParts.join(' | ');
|
||||||
|
|
||||||
|
// Compose the action text that will be stored in the DB (so later prompt generation can use it)
|
||||||
|
const actionText = [chosenAction, meta].filter(Boolean).join(' ').trim();
|
||||||
|
|
||||||
|
// Generate image_prompt and video_prompt using LM Studio (with retries)
|
||||||
|
let imagePrompt: string | null = null;
|
||||||
|
let videoPrompt: string | null = null;
|
||||||
|
|
||||||
|
const lmInput = `
|
||||||
|
Generate two prompts in JSON: { "imagePrompt": "...", "videoPrompt": "..." }.
|
||||||
|
Image prompt: ~125 words describing a still image representing the scene. Include lighting, mood, style and any accents provided.
|
||||||
|
Video prompt: ~125 words describing an 8-second piece starting from the scene, describing the action and camera movement. Include lighting, mood, style and any accents provided.
|
||||||
|
|
||||||
|
Use the following details:
|
||||||
|
- Genre: ${genre}
|
||||||
|
- Sub-Genre: ${subGenre}
|
||||||
|
- Scene: ${finalScene}
|
||||||
|
- Action: ${chosenAction}
|
||||||
|
- Camera: ${camera || 'neutral camera movement'}
|
||||||
|
- Accents: ${chosenAccents || 'none'}
|
||||||
|
- Mood: ${mood || 'n/a'}
|
||||||
|
- Lighting: ${lighting || 'n/a'}
|
||||||
|
- Style: ${style || 'n/a'}
|
||||||
|
`;
|
||||||
|
|
||||||
|
let lmResponse: any = null;
|
||||||
|
for (let attempt = 0; attempt < 5; attempt++) {
|
||||||
|
try {
|
||||||
|
lmResponse = await callLMStudio(lmInput);
|
||||||
|
if (lmResponse && (lmResponse.imagePrompt || lmResponse.videoPrompt)) {
|
||||||
|
imagePrompt = lmResponse.imagePrompt || null;
|
||||||
|
videoPrompt = lmResponse.videoPrompt || null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
logger.warn(`LMStudio attempt ${attempt + 1} failed for ${genre} - ${subGenre}: ${err}`);
|
||||||
|
}
|
||||||
|
// small delay between attempts could be added if desired
|
||||||
|
}
|
||||||
|
|
||||||
|
// If LM didn't return prompts, still insert with null prompts but log warning
|
||||||
|
if (!imagePrompt || !videoPrompt) {
|
||||||
|
logger.warn(`LMStudio did not return both prompts for ${genre} - ${subGenre} - ${finalScene}. Inserting without prompts.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the item already exists (compare stored action text so duplicates are avoided)
|
||||||
const existing = await query(
|
const existing = await query(
|
||||||
'SELECT id FROM video WHERE genre = ? AND sub_genre = ? AND scene = ? AND action = ? AND camera = ?',
|
'SELECT id FROM video WHERE genre = ? AND sub_genre = ? AND scene = ? AND action = ? AND camera = ?',
|
||||||
[genre, subGenre, scene, action, camera]
|
[genre, subGenre, finalScene, actionText, camera]
|
||||||
) as any[];
|
) as any[];
|
||||||
|
|
||||||
if (existing.length === 0) {
|
if (existing.length === 0) {
|
||||||
// Insert the new item
|
// Insert the new item with generated prompts
|
||||||
await query(
|
await query(
|
||||||
'INSERT INTO video (genre, sub_genre, scene, action, camera) VALUES (?, ?, ?, ?, ?)',
|
'INSERT INTO video (genre, sub_genre, scene, action, camera, image_prompt, video_prompt) VALUES (?, ?, ?, ?, ?, ?, ?)',
|
||||||
[genre, subGenre, scene, action, camera]
|
[genre, subGenre, finalScene, actionText, camera, imagePrompt, videoPrompt]
|
||||||
);
|
);
|
||||||
logger.info(`Inserted: ${genre} - ${subGenre} - ${scene}`);
|
logger.info(`Inserted: ${genre} - ${subGenre} - ${finalScene}`);
|
||||||
|
logger.info(`Image prompt: ${imagePrompt}`);
|
||||||
|
logger.info(`Video prompt: ${videoPrompt}`);
|
||||||
} else {
|
} else {
|
||||||
logger.info(`Skipped (exists): ${genre} - ${subGenre} - ${scene}`);
|
logger.info(`Skipped (exists): ${genre} - ${subGenre} - ${finalScene}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user