@gradio/video 0.17.0-dev.0 → 0.17.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/Index.svelte +98 -122
- package/Video.test.ts +2 -2
- package/dist/Example.svelte +20 -16
- package/dist/Example.svelte.d.ts +21 -19
- package/dist/Index.svelte +127 -114
- package/dist/Index.svelte.d.ts +3 -155
- package/dist/shared/InteractiveVideo.svelte +79 -51
- package/dist/shared/InteractiveVideo.svelte.d.ts +57 -47
- package/dist/shared/Player.svelte +103 -71
- package/dist/shared/Player.svelte.d.ts +44 -42
- package/dist/shared/Video.svelte +77 -62
- package/dist/shared/Video.svelte.d.ts +44 -36
- package/dist/shared/VideoControls.svelte +49 -40
- package/dist/shared/VideoControls.svelte.d.ts +29 -27
- package/dist/shared/VideoPreview.svelte +58 -37
- package/dist/shared/VideoPreview.svelte.d.ts +37 -35
- package/dist/shared/VideoTimeline.svelte +148 -106
- package/dist/shared/VideoTimeline.svelte.d.ts +22 -20
- package/dist/types.d.ts +31 -0
- package/dist/types.js +1 -0
- package/package.json +14 -14
- package/shared/InteractiveVideo.svelte +3 -1
- package/shared/Video.svelte +1 -1
- package/types.ts +37 -0
package/dist/Index.svelte
CHANGED
|
@@ -1,103 +1,109 @@
|
|
|
1
1
|
<svelte:options accessors={true} />
|
|
2
2
|
|
|
3
|
-
<script
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
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
|
-
let
|
|
34
|
-
let
|
|
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
|
-
function handle_error({ detail }) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
3
|
+
<script lang="ts">
|
|
4
|
+
import { tick } from "svelte";
|
|
5
|
+
import type { FileData } from "@gradio/client";
|
|
6
|
+
import { Block, UploadText } from "@gradio/atoms";
|
|
7
|
+
import StaticVideo from "./shared/VideoPreview.svelte";
|
|
8
|
+
import Video from "./shared/InteractiveVideo.svelte";
|
|
9
|
+
import { StatusTracker } from "@gradio/statustracker";
|
|
10
|
+
import { Gradio } from "@gradio/utils";
|
|
11
|
+
import type { VideoProps, VideoEvents } from "./types";
|
|
12
|
+
|
|
13
|
+
const props = $props();
|
|
14
|
+
|
|
15
|
+
let upload_promise = $state<Promise<any>>();
|
|
16
|
+
|
|
17
|
+
class VideoGradio extends Gradio<VideoEvents, VideoProps> {
|
|
18
|
+
async get_data() {
|
|
19
|
+
if (upload_promise) {
|
|
20
|
+
await upload_promise;
|
|
21
|
+
await tick();
|
|
22
|
+
}
|
|
23
|
+
const data = await super.get_data();
|
|
24
|
+
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const gradio = new VideoGradio(props);
|
|
30
|
+
let old_value = $state(gradio.props.value);
|
|
31
|
+
|
|
32
|
+
let uploading = $state(false);
|
|
33
|
+
let dragging = $state(false);
|
|
34
|
+
let active_source = $derived.by(() =>
|
|
35
|
+
gradio.props.sources ? gradio.props.sources[0] : undefined
|
|
36
|
+
);
|
|
37
|
+
let initial_value: FileData | null = gradio.props.value;
|
|
38
|
+
|
|
39
|
+
$effect(() => {
|
|
40
|
+
if (old_value != gradio.props.value) {
|
|
41
|
+
old_value = gradio.props.value;
|
|
42
|
+
gradio.dispatch("change");
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const handle_reset_value = (): void => {
|
|
47
|
+
if (initial_value === null || gradio.props.value === initial_value) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
gradio.props.value = initial_value;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
function handle_change({ detail }: CustomEvent<FileData | null>): void {
|
|
54
|
+
if (detail != null) {
|
|
55
|
+
gradio.props.value = detail as FileData;
|
|
56
|
+
} else {
|
|
57
|
+
gradio.props.value = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function handle_error({ detail }: CustomEvent<string>): void {
|
|
62
|
+
const [level, status] = detail.includes("Invalid file type")
|
|
63
|
+
? ["warning", "complete"]
|
|
64
|
+
: ["error", "error"];
|
|
65
|
+
gradio.shared.loading_status.status = status as any;
|
|
66
|
+
gradio.shared.loading_status.message = detail;
|
|
67
|
+
gradio.dispatch(level as "error" | "warning", detail);
|
|
68
|
+
}
|
|
68
69
|
</script>
|
|
69
70
|
|
|
70
|
-
{#if !interactive}
|
|
71
|
+
{#if !gradio.shared.interactive}
|
|
71
72
|
<Block
|
|
72
|
-
{visible}
|
|
73
|
-
variant={value === null && active_source === "upload"
|
|
73
|
+
visible={gradio.shared.visible}
|
|
74
|
+
variant={gradio.props.value === null && active_source === "upload"
|
|
75
|
+
? "dashed"
|
|
76
|
+
: "solid"}
|
|
74
77
|
border_mode={dragging ? "focus" : "base"}
|
|
75
78
|
padding={false}
|
|
76
|
-
{elem_id}
|
|
77
|
-
{elem_classes}
|
|
78
|
-
{height}
|
|
79
|
-
{width}
|
|
80
|
-
{container}
|
|
81
|
-
{scale}
|
|
82
|
-
{min_width}
|
|
79
|
+
elem_id={gradio.shared.elem_id}
|
|
80
|
+
elem_classes={gradio.shared.elem_classes}
|
|
81
|
+
height={gradio.props.height || undefined}
|
|
82
|
+
width={gradio.props.width}
|
|
83
|
+
container={gradio.shared.container}
|
|
84
|
+
scale={gradio.shared.scale}
|
|
85
|
+
min_width={gradio.shared.min_width}
|
|
83
86
|
allow_overflow={false}
|
|
84
87
|
>
|
|
85
88
|
<StatusTracker
|
|
86
|
-
autoscroll={gradio.autoscroll}
|
|
89
|
+
autoscroll={gradio.shared.autoscroll}
|
|
87
90
|
i18n={gradio.i18n}
|
|
88
|
-
{...loading_status}
|
|
89
|
-
on:clear_status={() =>
|
|
91
|
+
{...gradio.shared.loading_status}
|
|
92
|
+
on:clear_status={() =>
|
|
93
|
+
gradio.dispatch("clear_status", gradio.shared.loading_status)}
|
|
90
94
|
/>
|
|
91
95
|
|
|
92
96
|
<StaticVideo
|
|
93
|
-
{value}
|
|
94
|
-
subtitle={subtitles}
|
|
95
|
-
{label}
|
|
96
|
-
{show_label}
|
|
97
|
-
{autoplay}
|
|
98
|
-
{loop}
|
|
99
|
-
show_share_button={buttons
|
|
100
|
-
show_download_button={buttons
|
|
97
|
+
value={gradio.props.value}
|
|
98
|
+
subtitle={gradio.props.subtitles}
|
|
99
|
+
label={gradio.shared.label}
|
|
100
|
+
show_label={gradio.shared.show_label}
|
|
101
|
+
autoplay={gradio.props.autoplay}
|
|
102
|
+
loop={gradio.props.loop}
|
|
103
|
+
show_share_button={(gradio.props.buttons || []).includes("share")}
|
|
104
|
+
show_download_button={(gradio.props.buttons || ["download"]).includes(
|
|
105
|
+
"download"
|
|
106
|
+
)}
|
|
101
107
|
on:play={() => gradio.dispatch("play")}
|
|
102
108
|
on:pause={() => gradio.dispatch("pause")}
|
|
103
109
|
on:stop={() => gradio.dispatch("stop")}
|
|
@@ -105,50 +111,57 @@ function handle_error({ detail }) {
|
|
|
105
111
|
on:share={({ detail }) => gradio.dispatch("share", detail)}
|
|
106
112
|
on:error={({ detail }) => gradio.dispatch("error", detail)}
|
|
107
113
|
i18n={gradio.i18n}
|
|
108
|
-
upload={(...args) => gradio.client.upload(...args)}
|
|
114
|
+
upload={(...args) => gradio.shared.client.upload(...args)}
|
|
109
115
|
/>
|
|
110
116
|
</Block>
|
|
111
117
|
{:else}
|
|
112
118
|
<Block
|
|
113
|
-
{visible}
|
|
114
|
-
variant={value === null && active_source === "upload"
|
|
119
|
+
visible={gradio.shared.visible}
|
|
120
|
+
variant={gradio.props.value === null && active_source === "upload"
|
|
121
|
+
? "dashed"
|
|
122
|
+
: "solid"}
|
|
115
123
|
border_mode={dragging ? "focus" : "base"}
|
|
116
124
|
padding={false}
|
|
117
|
-
{elem_id}
|
|
118
|
-
{elem_classes}
|
|
119
|
-
{height}
|
|
120
|
-
{width}
|
|
121
|
-
{container}
|
|
122
|
-
{scale}
|
|
123
|
-
{min_width}
|
|
125
|
+
elem_id={gradio.shared.elem_id}
|
|
126
|
+
elem_classes={gradio.shared.elem_classes}
|
|
127
|
+
height={gradio.props.height || undefined}
|
|
128
|
+
width={gradio.props.width}
|
|
129
|
+
container={gradio.shared.container}
|
|
130
|
+
scale={gradio.shared.scale}
|
|
131
|
+
min_width={gradio.shared.min_width}
|
|
124
132
|
allow_overflow={false}
|
|
125
133
|
>
|
|
126
134
|
<StatusTracker
|
|
127
|
-
autoscroll={gradio.autoscroll}
|
|
135
|
+
autoscroll={gradio.shared.autoscroll}
|
|
128
136
|
i18n={gradio.i18n}
|
|
129
|
-
{...loading_status}
|
|
130
|
-
on:clear_status={() =>
|
|
137
|
+
{...gradio.shared.loading_status}
|
|
138
|
+
on:clear_status={() =>
|
|
139
|
+
gradio.dispatch("clear_status", gradio.shared.loading_status)}
|
|
131
140
|
/>
|
|
132
141
|
|
|
133
142
|
<Video
|
|
134
|
-
|
|
135
|
-
|
|
143
|
+
bind:upload_promise
|
|
144
|
+
value={gradio.props.value}
|
|
145
|
+
subtitle={gradio.props.subtitles}
|
|
136
146
|
on:change={handle_change}
|
|
137
147
|
on:drag={({ detail }) => (dragging = detail)}
|
|
138
148
|
on:error={handle_error}
|
|
139
149
|
bind:uploading
|
|
140
|
-
{label}
|
|
141
|
-
{show_label}
|
|
142
|
-
show_download_button={buttons
|
|
143
|
-
{sources}
|
|
150
|
+
label={gradio.shared.label}
|
|
151
|
+
show_label={gradio.shared.show_label}
|
|
152
|
+
show_download_button={(gradio.props.buttons || []).includes("download")}
|
|
153
|
+
sources={gradio.props.sources}
|
|
144
154
|
{active_source}
|
|
145
|
-
{webcam_options}
|
|
146
|
-
{include_audio}
|
|
147
|
-
{autoplay}
|
|
148
|
-
{root}
|
|
149
|
-
{loop}
|
|
155
|
+
webcam_options={gradio.props.webcam_options}
|
|
156
|
+
include_audio={gradio.props.include_audio}
|
|
157
|
+
autoplay={gradio.props.autoplay}
|
|
158
|
+
root={gradio.shared.root}
|
|
159
|
+
loop={gradio.props.loop}
|
|
150
160
|
{handle_reset_value}
|
|
151
|
-
on:clear={() =>
|
|
161
|
+
on:clear={() => {
|
|
162
|
+
gradio.props.value = null;
|
|
163
|
+
gradio.dispatch("clear");
|
|
164
|
+
}}
|
|
152
165
|
on:play={() => gradio.dispatch("play")}
|
|
153
166
|
on:pause={() => gradio.dispatch("pause")}
|
|
154
167
|
on:upload={() => gradio.dispatch("upload")}
|
|
@@ -157,9 +170,9 @@ function handle_error({ detail }) {
|
|
|
157
170
|
on:start_recording={() => gradio.dispatch("start_recording")}
|
|
158
171
|
on:stop_recording={() => gradio.dispatch("stop_recording")}
|
|
159
172
|
i18n={gradio.i18n}
|
|
160
|
-
max_file_size={gradio.max_file_size}
|
|
161
|
-
upload={(...args) => gradio.client.upload(...args)}
|
|
162
|
-
stream_handler={(...args) => gradio.client.stream(...args)}
|
|
173
|
+
max_file_size={gradio.shared.max_file_size}
|
|
174
|
+
upload={(...args) => gradio.shared.client.upload(...args)}
|
|
175
|
+
stream_handler={(...args) => gradio.shared.client.stream(...args)}
|
|
163
176
|
>
|
|
164
177
|
<UploadText i18n={gradio.i18n} type="video" />
|
|
165
178
|
</Video>
|
package/dist/Index.svelte.d.ts
CHANGED
|
@@ -1,155 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import type { LoadingStatus } from "@gradio/statustracker";
|
|
5
|
-
import type { WebcamOptions } from "./shared/utils";
|
|
6
|
-
declare const __propDef: {
|
|
7
|
-
props: {
|
|
8
|
-
elem_id?: string;
|
|
9
|
-
elem_classes?: string[];
|
|
10
|
-
visible?: boolean | "hidden";
|
|
11
|
-
value?: null | FileData;
|
|
12
|
-
subtitles?: null | FileData;
|
|
13
|
-
label: string;
|
|
14
|
-
sources: ["webcam"] | ["upload"] | ["webcam", "upload"] | ["upload", "webcam"];
|
|
15
|
-
root: string;
|
|
16
|
-
show_label: boolean;
|
|
17
|
-
loading_status: LoadingStatus;
|
|
18
|
-
height: number | undefined;
|
|
19
|
-
width: number | undefined;
|
|
20
|
-
container?: boolean;
|
|
21
|
-
scale?: number | null;
|
|
22
|
-
min_width?: number | undefined;
|
|
23
|
-
autoplay?: boolean;
|
|
24
|
-
buttons?: string[] | null;
|
|
25
|
-
gradio: Gradio<{
|
|
26
|
-
change: never;
|
|
27
|
-
clear: never;
|
|
28
|
-
play: never;
|
|
29
|
-
pause: never;
|
|
30
|
-
upload: never;
|
|
31
|
-
stop: never;
|
|
32
|
-
end: never;
|
|
33
|
-
start_recording: never;
|
|
34
|
-
stop_recording: never;
|
|
35
|
-
share: ShareData;
|
|
36
|
-
error: string;
|
|
37
|
-
warning: string;
|
|
38
|
-
clear_status: LoadingStatus;
|
|
39
|
-
}>;
|
|
40
|
-
interactive: boolean;
|
|
41
|
-
webcam_options: WebcamOptions;
|
|
42
|
-
include_audio: boolean;
|
|
43
|
-
loop?: boolean;
|
|
44
|
-
input_ready: boolean;
|
|
45
|
-
};
|
|
46
|
-
events: {
|
|
47
|
-
[evt: string]: CustomEvent<any>;
|
|
48
|
-
};
|
|
49
|
-
slots: {};
|
|
50
|
-
exports?: {} | undefined;
|
|
51
|
-
bindings?: string | undefined;
|
|
52
|
-
};
|
|
53
|
-
export type IndexProps = typeof __propDef.props;
|
|
54
|
-
export type IndexEvents = typeof __propDef.events;
|
|
55
|
-
export type IndexSlots = typeof __propDef.slots;
|
|
56
|
-
export default class Index extends SvelteComponent<IndexProps, IndexEvents, IndexSlots> {
|
|
57
|
-
get elem_id(): string | undefined;
|
|
58
|
-
/**accessor*/
|
|
59
|
-
set elem_id(_: string | undefined);
|
|
60
|
-
get elem_classes(): string[] | undefined;
|
|
61
|
-
/**accessor*/
|
|
62
|
-
set elem_classes(_: string[] | undefined);
|
|
63
|
-
get visible(): boolean | "hidden" | undefined;
|
|
64
|
-
/**accessor*/
|
|
65
|
-
set visible(_: boolean | "hidden" | undefined);
|
|
66
|
-
get value(): any;
|
|
67
|
-
/**accessor*/
|
|
68
|
-
set value(_: any);
|
|
69
|
-
get subtitles(): any;
|
|
70
|
-
/**accessor*/
|
|
71
|
-
set subtitles(_: any);
|
|
72
|
-
get label(): string;
|
|
73
|
-
/**accessor*/
|
|
74
|
-
set label(_: string);
|
|
75
|
-
get sources(): ["upload"] | ["webcam"] | ["webcam", "upload"] | ["upload", "webcam"];
|
|
76
|
-
/**accessor*/
|
|
77
|
-
set sources(_: ["upload"] | ["webcam"] | ["webcam", "upload"] | ["upload", "webcam"]);
|
|
78
|
-
get root(): string;
|
|
79
|
-
/**accessor*/
|
|
80
|
-
set root(_: string);
|
|
81
|
-
get show_label(): boolean;
|
|
82
|
-
/**accessor*/
|
|
83
|
-
set show_label(_: boolean);
|
|
84
|
-
get loading_status(): LoadingStatus;
|
|
85
|
-
/**accessor*/
|
|
86
|
-
set loading_status(_: LoadingStatus);
|
|
87
|
-
get height(): number | undefined;
|
|
88
|
-
/**accessor*/
|
|
89
|
-
set height(_: number | undefined);
|
|
90
|
-
get width(): number | undefined;
|
|
91
|
-
/**accessor*/
|
|
92
|
-
set width(_: number | undefined);
|
|
93
|
-
get container(): boolean | undefined;
|
|
94
|
-
/**accessor*/
|
|
95
|
-
set container(_: boolean | undefined);
|
|
96
|
-
get scale(): number | null | undefined;
|
|
97
|
-
/**accessor*/
|
|
98
|
-
set scale(_: number | null | undefined);
|
|
99
|
-
get min_width(): number | undefined;
|
|
100
|
-
/**accessor*/
|
|
101
|
-
set min_width(_: number | undefined);
|
|
102
|
-
get autoplay(): boolean | undefined;
|
|
103
|
-
/**accessor*/
|
|
104
|
-
set autoplay(_: boolean | undefined);
|
|
105
|
-
get buttons(): string[] | null | undefined;
|
|
106
|
-
/**accessor*/
|
|
107
|
-
set buttons(_: string[] | null | undefined);
|
|
108
|
-
get gradio(): Gradio<{
|
|
109
|
-
change: never;
|
|
110
|
-
clear: never;
|
|
111
|
-
play: never;
|
|
112
|
-
pause: never;
|
|
113
|
-
upload: never;
|
|
114
|
-
stop: never;
|
|
115
|
-
end: never;
|
|
116
|
-
start_recording: never;
|
|
117
|
-
stop_recording: never;
|
|
118
|
-
share: ShareData;
|
|
119
|
-
error: string;
|
|
120
|
-
warning: string;
|
|
121
|
-
clear_status: LoadingStatus;
|
|
122
|
-
}>;
|
|
123
|
-
/**accessor*/
|
|
124
|
-
set gradio(_: Gradio<{
|
|
125
|
-
change: never;
|
|
126
|
-
clear: never;
|
|
127
|
-
play: never;
|
|
128
|
-
pause: never;
|
|
129
|
-
upload: never;
|
|
130
|
-
stop: never;
|
|
131
|
-
end: never;
|
|
132
|
-
start_recording: never;
|
|
133
|
-
stop_recording: never;
|
|
134
|
-
share: ShareData;
|
|
135
|
-
error: string;
|
|
136
|
-
warning: string;
|
|
137
|
-
clear_status: LoadingStatus;
|
|
138
|
-
}>);
|
|
139
|
-
get interactive(): boolean;
|
|
140
|
-
/**accessor*/
|
|
141
|
-
set interactive(_: boolean);
|
|
142
|
-
get webcam_options(): WebcamOptions;
|
|
143
|
-
/**accessor*/
|
|
144
|
-
set webcam_options(_: WebcamOptions);
|
|
145
|
-
get include_audio(): boolean;
|
|
146
|
-
/**accessor*/
|
|
147
|
-
set include_audio(_: boolean);
|
|
148
|
-
get loop(): boolean | undefined;
|
|
149
|
-
/**accessor*/
|
|
150
|
-
set loop(_: boolean | undefined);
|
|
151
|
-
get input_ready(): boolean;
|
|
152
|
-
/**accessor*/
|
|
153
|
-
set input_ready(_: boolean);
|
|
154
|
-
}
|
|
155
|
-
export {};
|
|
1
|
+
declare const Index: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
2
|
+
type Index = ReturnType<typeof Index>;
|
|
3
|
+
export default Index;
|
|
@@ -1,61 +1,89 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export let
|
|
15
|
-
export let
|
|
16
|
-
export let
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export let
|
|
22
|
-
|
|
23
|
-
export let
|
|
24
|
-
export let
|
|
25
|
-
export let
|
|
26
|
-
export let
|
|
27
|
-
export let
|
|
28
|
-
let
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createEventDispatcher } from "svelte";
|
|
3
|
+
import { Upload, ModifyUpload } from "@gradio/upload";
|
|
4
|
+
import type { FileData, Client } from "@gradio/client";
|
|
5
|
+
import { BlockLabel } from "@gradio/atoms";
|
|
6
|
+
import { Webcam } from "@gradio/image";
|
|
7
|
+
import { Video } from "@gradio/icons";
|
|
8
|
+
import type { WebcamOptions } from "./utils";
|
|
9
|
+
import { prettyBytes, playable } from "./utils";
|
|
10
|
+
import Player from "./Player.svelte";
|
|
11
|
+
import type { I18nFormatter } from "@gradio/utils";
|
|
12
|
+
import { SelectSource } from "@gradio/atoms";
|
|
13
|
+
|
|
14
|
+
export let value: FileData | null = null;
|
|
15
|
+
export let subtitle: FileData | null = null;
|
|
16
|
+
export let sources:
|
|
17
|
+
| ["webcam"]
|
|
18
|
+
| ["upload"]
|
|
19
|
+
| ["webcam", "upload"]
|
|
20
|
+
| ["upload", "webcam"] = ["webcam", "upload"];
|
|
21
|
+
export let label: string | undefined = undefined;
|
|
22
|
+
export let show_download_button = false;
|
|
23
|
+
export let show_label = true;
|
|
24
|
+
export let webcam_options: WebcamOptions;
|
|
25
|
+
export let include_audio: boolean;
|
|
26
|
+
export let autoplay: boolean;
|
|
27
|
+
export let root: string;
|
|
28
|
+
export let i18n: I18nFormatter;
|
|
29
|
+
export let active_source: "webcam" | "upload" = "webcam";
|
|
30
|
+
export let handle_reset_value: () => void = () => {};
|
|
31
|
+
export let max_file_size: number | null = null;
|
|
32
|
+
export let upload: Client["upload"];
|
|
33
|
+
export let stream_handler: Client["stream"];
|
|
34
|
+
export let loop: boolean;
|
|
35
|
+
export let uploading = false;
|
|
36
|
+
export let upload_promise: Promise<any> | null = null;
|
|
37
|
+
|
|
38
|
+
let has_change_history = false;
|
|
39
|
+
|
|
40
|
+
const dispatch = createEventDispatcher<{
|
|
41
|
+
change: FileData | null;
|
|
42
|
+
clear?: never;
|
|
43
|
+
play?: never;
|
|
44
|
+
pause?: never;
|
|
45
|
+
end?: never;
|
|
46
|
+
drag: boolean;
|
|
47
|
+
error: string;
|
|
48
|
+
upload: FileData;
|
|
49
|
+
start_recording?: never;
|
|
50
|
+
stop_recording?: never;
|
|
51
|
+
}>();
|
|
52
|
+
|
|
53
|
+
function handle_load({ detail }: CustomEvent<FileData | null>): void {
|
|
54
|
+
value = detail;
|
|
55
|
+
dispatch("change", detail);
|
|
56
|
+
dispatch("upload", detail!);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function handle_clear(): void {
|
|
60
|
+
value = null;
|
|
61
|
+
dispatch("change", null);
|
|
62
|
+
dispatch("clear");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function handle_change(video: FileData): void {
|
|
66
|
+
has_change_history = true;
|
|
67
|
+
dispatch("change", video);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function handle_capture({
|
|
71
|
+
detail
|
|
72
|
+
}: CustomEvent<FileData | any | null>): void {
|
|
73
|
+
dispatch("change", detail);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
let dragging = false;
|
|
77
|
+
$: dispatch("drag", dragging);
|
|
51
78
|
</script>
|
|
52
79
|
|
|
53
80
|
<BlockLabel {show_label} Icon={Video} label={label || "Video"} />
|
|
54
81
|
<div data-testid="video" class="video-container">
|
|
55
|
-
{#if value === null || value
|
|
82
|
+
{#if value === null || value?.url === undefined}
|
|
56
83
|
<div class="upload-container">
|
|
57
84
|
{#if active_source === "upload"}
|
|
58
85
|
<Upload
|
|
86
|
+
bind:upload_promise
|
|
59
87
|
bind:dragging
|
|
60
88
|
bind:uploading
|
|
61
89
|
filetype="video/x-m4v,video/*"
|