import gradio as gr def CitraIlmuWebUI(client, host: str = None, port: int = None, browser: bool = True, upload_size: str = "4MB", public: bool = False, limit: int = 10, quiet: bool = False): """ Start Citrailmu Web UI with all features. Parameters: - client (Client): Citrailmu instance - host (str): Server host - port (int): Server port - browser (bool): Launch browser automatically - upload_size (str): Maximum file size for uploads - public (bool): Enable public URL mode - limit (int): Maximum number of concurrent requests - quiet (bool): Quiet mode """ try: def update_preview(url): if not url: return "" template = """
{content}
""" if "youtube.com" in url or "youtu.be" in url: video_id = url.split("v=")[1].split("&")[0] if "youtube.com" in url else url.split("/")[-1].split("?")[0] content = f""" """ else: content = f""" """ return template.format(content=content) gr_css = """ footer { display: none !important; } """ gr_theme = gr.themes.Default( primary_hue="green", secondary_hue="green", neutral_hue=gr.themes.colors.zinc, font=["Amiri", "system-ui", "sans-serif"] ) with gr.Blocks(title="CitraIlmu", analytics_enabled=False, theme=gr_theme, css=gr_css).queue(default_concurrency_limit=limit) as demo: gr.Markdown("##
CitraIlmu Web UI") gr.Markdown("
Made for #GodamSahur 2025 by Ikmal Said") gr.Markdown("
") with gr.Row(): with gr.Column(): with gr.Column(scale=1): with gr.Tabs(): with gr.Tab('YouTube/Video URL'): input_url = gr.Textbox( label="Input URL", placeholder="Enter URL...", lines=1, max_lines=1, info="Enter YouTube or web URL here" ) url_preview = gr.HTML() url_btn = gr.Button("Process URL", variant="primary") with gr.Tab('Video File'): input_video = gr.Video(label="Input Video File") video_btn = gr.Button("Process Video", variant="primary") with gr.Tab('Audio File'): input_audio = gr.Audio(label="Input Audio File", type='filepath') audio_btn = gr.Button("Process Audio", variant="primary") with gr.Column(scale=1): with gr.Tabs(): with gr.Tab('Settings', elem_classes='test'): target_language = gr.Dropdown( value="Bahasa Malaysia", choices=["Bahasa Malaysia", "Arabic", "English", "Mandarin", "Tamil"], label="Target Analysis Language", info="Select the target language for the analysis" ) processing_mode = gr.Radio( choices=["Analysis", "Transcript"], value="Analysis", label="Processing Mode", info="Analysis: Full content analysis with topics and themes | Transcript: Complete text from audio" ) with gr.Column(scale=1): with gr.Tabs(): with gr.Tab('Results'): audio_output = gr.Audio(label="Reference Audio") pdf_output = gr.File(label="Download Results as PDF") with gr.Accordion("Read Results as Text"): results_text = gr.Markdown(value="Please process media first for reading!", height=300) gr.Markdown("
") gr.Markdown("
CitraIlmu can make mistakes. Check important info.") gr.Markdown("
") # Setup event handlers input_url.change(fn=update_preview, inputs=[input_url], outputs=[url_preview]) audio_btn.click(fn=client.process_media, inputs=[input_audio, target_language, processing_mode], outputs=[audio_output, pdf_output, results_text]) video_btn.click(fn=client.process_media, inputs=[input_video, target_language, processing_mode], outputs=[audio_output, pdf_output, results_text]) url_btn.click(fn=client.process_media, inputs=[input_url, target_language, processing_mode], outputs=[audio_output, pdf_output, results_text]) demo.launch( server_name=host, server_port=port, inbrowser=browser, max_file_size=upload_size, share=public, quiet=quiet ) except Exception as e: client.logger.error(f"{str(e)}") raise