File size: 2,050 Bytes
8fdc036 |
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<script lang="ts">
import { uploadToHuggingFace } from "@gradio/utils";
import { Empty } from "@gradio/atoms";
import { ShareButton, IconButton, BlockLabel } from "@gradio/atoms";
import { Download, Music } from "@gradio/icons";
import type { I18nFormatter } from "@gradio/utils";
import AudioPlayer from "../player/AudioPlayer.svelte";
import { createEventDispatcher } from "svelte";
import type { FileData } from "@gradio/client";
import { DownloadLink } from "@gradio/wasm/svelte";
import type { WaveformOptions } from "../shared/types";
export let value: null | FileData = null;
export let label: string;
export let show_label = true;
export let show_download_button = true;
export let show_share_button = false;
export let i18n: I18nFormatter;
export let waveform_settings: Record<string, any>;
export let waveform_options: WaveformOptions;
export let editable = true;
const dispatch = createEventDispatcher<{
change: FileData;
play: undefined;
pause: undefined;
end: undefined;
stop: undefined;
}>();
$: value && dispatch("change", value);
</script>
<BlockLabel
{show_label}
Icon={Music}
float={false}
label={label || i18n("audio.audio")}
/>
{#if value !== null}
<div class="icon-buttons">
{#if show_download_button}
<DownloadLink href={value.url} download={value.orig_name || value.path}>
<IconButton Icon={Download} label={i18n("common.download")} />
</DownloadLink>
{/if}
{#if show_share_button}
<ShareButton
{i18n}
on:error
on:share
formatter={async (value) => {
if (!value) return "";
let url = await uploadToHuggingFace(value.url, "url");
return `<audio controls src="${url}"></audio>`;
}}
{value}
/>
{/if}
</div>
<AudioPlayer
{value}
{label}
{i18n}
{waveform_settings}
{waveform_options}
{editable}
on:pause
on:play
on:stop
/>
{:else}
<Empty size="small">
<Music />
</Empty>
{/if}
<style>
.icon-buttons {
display: flex;
position: absolute;
top: 6px;
right: 6px;
gap: var(--size-1);
}
</style>
|