Spaces:
Sleeping
Sleeping
File size: 2,519 Bytes
d124c09 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# --- app.py ---
import json
import math
import gradio as gr
from PIL import Image
import random
# Load segments JSON
def load_segments():
with open("segments_full.json", "r", encoding="utf-8") as f:
segments = json.load(f)
return segments
# Simulated keyframe image generator (use local placeholder or generate random colors)
def get_placeholder_image(seed):
random.seed(seed)
img = Image.new("RGB", (256, 144), color=(random.randint(100,255), random.randint(100,255), random.randint(100,255)))
return img
# UI component for a single segment row
def segment_display(segment):
description = segment["description"]
seg_id = segment["segment_id"]
row = [f"Segment {seg_id}", description]
for i in range(3):
img = get_placeholder_image(seed=(seg_id * 10 + i))
row.append(img)
return row
# Pagination logic
def paginate_segments(page=1, page_size=15):
segments = load_segments()
total = len(segments)
max_page = math.ceil(total / page_size)
start = (page - 1) * page_size
end = start + page_size
subset = segments[start:end]
headers = ["Segment ID", "Description", "Candidate 1", "Candidate 2", "Candidate 3"]
data = [segment_display(seg) for seg in subset]
return headers, data, max_page
# Gradio interface
def build_interface():
with gr.Blocks() as demo:
gr.Markdown("## 🎬 Keyframe Candidate Viewer")
page_state = gr.State(1)
table = gr.Dataframe(headers=[], datatype=["str", "str", "image", "image", "image"], row_count=15)
total_pages_text = gr.Textbox(label="Page Info", interactive=False)
def update(page):
headers, rows, max_page = paginate_segments(page)
return gr.update(headers=headers, value=rows), f"Page {page} of {max_page}", page
prev_btn = gr.Button("⬅ Prev")
next_btn = gr.Button("Next ➡")
table.change(fn=lambda: None, inputs=[], outputs=[])
prev_btn.click(fn=lambda p: max(1, p - 1), inputs=page_state, outputs=page_state).then(update, inputs=page_state, outputs=[table, total_pages_text, page_state])
next_btn.click(fn=lambda p: p + 1, inputs=page_state, outputs=page_state).then(update, inputs=page_state, outputs=[table, total_pages_text, page_state])
# Initial load
demo.load(fn=update, inputs=page_state, outputs=[table, total_pages_text, page_state])
return demo
# Launch app
if __name__ == "__main__":
demo = build_interface()
demo.launch()
|