diff --git a/src/data/cinematic_and_film_styles_mockumentaries.json b/src/data/cinematic_and_film_styles_mockumentaries.json new file mode 100644 index 0000000..40c78f7 --- /dev/null +++ b/src/data/cinematic_and_film_styles_mockumentaries.json @@ -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" + } +] \ No newline at end of file diff --git a/src/data/cinematic_and_film_styles_nature_documentaries.json b/src/data/cinematic_and_film_styles_nature_documentaries.json new file mode 100644 index 0000000..5ee68aa --- /dev/null +++ b/src/data/cinematic_and_film_styles_nature_documentaries.json @@ -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" + } +] \ No newline at end of file diff --git a/src/data/cinematic_and_film_styles_short_films.json b/src/data/cinematic_and_film_styles_short_films.json new file mode 100644 index 0000000..9fa0cc1 --- /dev/null +++ b/src/data/cinematic_and_film_styles_short_films.json @@ -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" + } +] \ No newline at end of file diff --git a/src/data/cinematic_and_film_styles_superhero_films.json b/src/data/cinematic_and_film_styles_superhero_films.json new file mode 100644 index 0000000..9acd97a --- /dev/null +++ b/src/data/cinematic_and_film_styles_superhero_films.json @@ -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" + } +] \ No newline at end of file diff --git a/src/generateImage.ts b/src/generateImage.ts index a1cb948..c6e338f 100644 --- a/src/generateImage.ts +++ b/src/generateImage.ts @@ -18,10 +18,10 @@ const servers = [ baseUrl: process.env.SERVER1_COMFY_BASE_URL, outputDir: process.env.SERVER1_COMFY_OUTPUT_DIR, }, - { - baseUrl: process.env.SERVER2_COMFY_BASE_URL, - outputDir: process.env.SERVER2_COMFY_OUTPUT_DIR, - }, + //{ + // baseUrl: process.env.SERVER2_COMFY_BASE_URL, + // outputDir: process.env.SERVER2_COMFY_OUTPUT_DIR, + //}, ]; const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); diff --git a/src/generatePrompt.ts b/src/generatePrompt.ts index 68e7c65..6407d1d 100644 --- a/src/generatePrompt.ts +++ b/src/generatePrompt.ts @@ -5,7 +5,7 @@ import { logger } from './lib/logger'; import { callLMStudio } from './lib/lmstudio'; async function main() { - //await insertGenres(); + await insertGenres(); await generatePrompts(); process.exit(); } @@ -13,23 +13,63 @@ async function main() { async function insertGenres() { logger.info('Starting genre insertion...'); try { - const genresPath = path.join(__dirname, 'data', 'genres.json'); - const genresData = JSON.parse(fs.readFileSync(genresPath, 'utf-8')); + const dataDir = path.join(__dirname, 'data'); + const files = fs.readdirSync(dataDir).filter((f) => f.endsWith('.json')); - for (const genre in genresData) { - if (genresData.hasOwnProperty(genre)) { - const items = genresData[genre]; - for (let item of items) { - if (Array.isArray(item)) { - for (const subItem of item) { - await processItem(genre, subItem); + for (const file of files) { + // skip the central genres.json (if present) since individual files represent sub-genres + if (file === 'genres.json') continue; + + const filePath = path.join(dataDir, file); + let raw: string; + 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 { + // 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); } - } else { - await processItem(genre, item); } } } + + for (const item of items) { + if (item && typeof item === 'object') { + await processItem(genre, item); + } + } } + logger.info('Finished processing genres.'); } catch (error) { logger.error('Error processing genres:', error); @@ -92,23 +132,112 @@ async function generatePrompts() { async function processItem(genre: string, item: any) { 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( - 'SELECT id FROM video WHERE genre = ? AND sub_genre = ? AND scene = ? AND action = ? AND camera = ?', - [genre, subGenre, scene, action, camera] - ) as any[]; + 'SELECT id FROM video WHERE genre = ? AND sub_genre = ? AND scene = ? AND action = ? AND camera = ?', + [genre, subGenre, finalScene, actionText, camera] + ) as any[]; if (existing.length === 0) { - // Insert the new item + // Insert the new item with generated prompts await query( - 'INSERT INTO video (genre, sub_genre, scene, action, camera) VALUES (?, ?, ?, ?, ?)', - [genre, subGenre, scene, action, camera] + 'INSERT INTO video (genre, sub_genre, scene, action, camera, image_prompt, video_prompt) VALUES (?, ?, ?, ?, ?, ?, ?)', + [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 { - logger.info(`Skipped (exists): ${genre} - ${subGenre} - ${scene}`); + logger.info(`Skipped (exists): ${genre} - ${subGenre} - ${finalScene}`); } } }