diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cc7fdc4c310..0823d30a2f44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## New Features: - Add `start_recording` and `stop_recording` events to `Video` and `Audio` components by [@pngwn](https://github.com/pngwn) in [PR 4422](https://github.com/gradio-app/gradio/pull/4422) +- Add `autoplay` kwarg to `Video` and `Audio` components by [@pngwn](https://github.com/pngwn) in [PR 4453](https://github.com/gradio-app/gradio/pull/4453) ## Bug Fixes: diff --git a/gradio/components.py b/gradio/components.py index 4b3b97e4c0ed..ca3d71d20164 100644 --- a/gradio/components.py +++ b/gradio/components.py @@ -2172,6 +2172,7 @@ def __init__( elem_classes: list[str] | str | None = None, mirror_webcam: bool = True, include_audio: bool | None = None, + autoplay: bool = False, **kwargs, ): """ @@ -2195,6 +2196,7 @@ def __init__( include_audio: Whether the component should record/retain the audio track for a video. By default, audio is excluded for webcam videos and included for uploaded videos. """ self.format = format + self.autoplay = autoplay valid_sources = ["upload", "webcam"] if source not in valid_sources: raise ValueError( @@ -2231,6 +2233,7 @@ def get_config(self): "width": self.width, "mirror_webcam": self.mirror_webcam, "include_audio": self.include_audio, + "autoplay": self.autoplay, **IOComponent.get_config(self), } @@ -2250,6 +2253,7 @@ def update( min_width: int | None = None, interactive: bool | None = None, visible: bool | None = None, + autoplay: bool | None = None, ): return { "source": source, @@ -2263,6 +2267,7 @@ def update( "interactive": interactive, "visible": visible, "value": value, + "autoplay": autoplay, "__type__": "update", } @@ -2518,6 +2523,7 @@ def __init__( elem_id: str | None = None, elem_classes: list[str] | str | None = None, format: Literal["wav", "mp3"] = "wav", + autoplay: bool = False, **kwargs, ): """ @@ -2572,12 +2578,14 @@ def __init__( ) TokenInterpretable.__init__(self) self.format = format + self.autoplay = autoplay def get_config(self): return { "source": self.source, "value": self.value, "streaming": self.streaming, + "autoplay": self.autoplay, **IOComponent.get_config(self), } @@ -2598,6 +2606,7 @@ def update( min_width: int | None = None, interactive: bool | None = None, visible: bool | None = None, + autoplay: bool | None = None, ): return { "source": source, @@ -2609,6 +2618,7 @@ def update( "interactive": interactive, "visible": visible, "value": value, + "autoplay": autoplay, "__type__": "update", } diff --git a/js/_spaces-test/src/lib/EndpointInputs.svelte b/js/_spaces-test/src/lib/EndpointInputs.svelte index 634dc9aeed38..ae9833040f8a 100644 --- a/js/_spaces-test/src/lib/EndpointInputs.svelte +++ b/js/_spaces-test/src/lib/EndpointInputs.svelte @@ -20,7 +20,6 @@ if (!files) return; const _files = Array.from(files); request_data[i] = files.length === 1 ? _files[0] : _files; - console.log(request_data); } diff --git a/js/app/src/components/Audio/Audio.svelte b/js/app/src/components/Audio/Audio.svelte index 6f2f4d83f98b..0d8019a9c975 100644 --- a/js/app/src/components/Audio/Audio.svelte +++ b/js/app/src/components/Audio/Audio.svelte @@ -35,6 +35,7 @@ export let scale: number = 1; export let min_width: number | undefined = undefined; export let loading_status: LoadingStatus; + export let autoplay: boolean = false; let _value: null | FileData; $: _value = normalise_file(value, root, root_url); @@ -75,6 +76,7 @@ {source} {pending} {streaming} + {autoplay} on:edit on:play on:pause @@ -93,6 +95,7 @@ {:else} = []; let submit_pending_stream_on_pending_end: boolean = false; - let player; + let player: HTMLAudioElement; let inited = false; let crop_values = [0, 100]; const STREAM_TIMESLICE = 500; @@ -259,8 +260,18 @@ dispatch("end"); } + let old_val: any; + function value_has_changed(val: any) { + if (val === old_val) return false; + else { + old_val = val; + return true; + } + } + export let dragging = false; $: dispatch("drag", dragging); + $: autoplay && player && value_has_changed(value?.data) && player.play(); {:else}