import streamlit as st st.set_page_config(layout="wide") css = """ """ st.markdown(css, unsafe_allow_html=True) criteria = { "Writing": [ {"name": "Dialogue", "description": "Word choice, realism, subtext, and implications."}, {"name": "Screenwriting", "description": "Structure, plot progression, and narrative choices."}, {"name": "Character Development", "description": "Depth, relatability, motivations, and arcs."}, {"name": "Theme & Symbolism", "description": "Use of deeper meaning, metaphors, and thematic consistency."} ], "Cinematography": [ {"name": "Camera Work", "description": "Shot composition, stability, movement, and angles."}, {"name": "Lighting", "description": "Contrast, exposure control, and mood-setting."}, {"name": "Color Grading", "description": "Palette consistency, contrast, and emotional tone."}, {"name": "Framing & Aspect Ratio", "description": "Use of space, focus, and visual storytelling."} ], "Editing & Pacing": [ {"name": "Scene Transitions", "description": "Smoothness, creativity, and effectiveness."}, {"name": "Continuity", "description": "Logical flow and lack of visual inconsistencies."}, {"name": "Pacing", "description": "Balance between slow and fast scenes, engagement level."}, {"name": "Use of Montage", "description": "Storytelling efficiency via edited sequences."} ], "Sound": [ {"name": "Dialogue Mixing", "description": "Clarity, balance, and intelligibility of speech."}, {"name": "Foley & Sound Effects", "description": "Realism, accuracy, and integration into the world."}, {"name": "Score & Music", "description": "Uniqueness, memorability, and emotional impact."}, {"name": "Spatial Audio & Atmosphere", "description": "Immersion, ambient sound accuracy, and use of silence."} ], "Directing & Performance": [ {"name": "Directing", "description": "Cohesion of vision, creative choices, and execution."}, {"name": "Acting", "description": "Expression, dialogue delivery, and emotional depth."}, {"name": "Blocking & Staging", "description": "Character positioning, movement, and scene composition."}, {"name": "Action & Stunt Choreography", "description": "Realism, execution, and visual readability."} ], "Production & Visuals": [ {"name": "Production Design", "description": "Set design, world-building, and authenticity."}, {"name": "Costume & Makeup", "description": "Period accuracy, character enhancement, and detailing."}, {"name": "Practical Effects & Props", "description": "Use of real elements over CGI, believability."}, {"name": "VFX & CGI Integration", "description": "Quality, realism, and seamless blending."} ], "Engagement & Replay Value": [ {"name": "Plot", "description": "Uniqueness, engagement, predictability, and emotional weight."}, {"name": "Originality", "description": "Avoidance of clichés, fresh storytelling, and innovation."}, {"name": "Rewatchability", "description": "Whether the movie holds up over multiple viewings."}, {"name": "Emotional Impact", "description": "Strength of connection, intensity of response."} ] } def calculate_score(ratings): valid = [r for r in ratings if r is not None] if not valid: return "Please rate at least one criterion." avg = sum(valid) / len(valid) scaled_score = (1/18) * (avg ** 2) + (19/18) * avg - (1/9) return f"Final Scaled Score: {scaled_score:.2f} / 10" st.markdown("

Movie Rating System

", unsafe_allow_html=True) ratings = [] # For each criterion, display a row with the checkbox on the left, then title/description and slider for group, subcriteria in criteria.items(): st.markdown(f"
{group}
", unsafe_allow_html=True) for idx, crit in enumerate(subcriteria): with st.container(): cols = st.columns([0.5, 7]) checkbox_col = cols[0] combined_col = cols[1] include = checkbox_col.checkbox("", value=True, key=f"include_{group}_{idx}") combined = ( f"{crit['name']}" f"   " f"{crit['description']}" ) combined_col.markdown(combined, unsafe_allow_html=True) rating = combined_col.slider( "", 1.0, 7.0, 4.0, step=0.01, key=f"slider_{group}_{idx}", disabled=(not include) ) ratings.append(None if not include else rating) if st.button("Calculate Score"): result = calculate_score(ratings) st.markdown(f"

{result}

", unsafe_allow_html=True)