From 528457fe59001a9521d371a04bf58dc1be63241b Mon Sep 17 00:00:00 2001 From: Ollie Taylor <13766232+OllieJT@users.noreply.github.com> Date: Sat, 29 Jul 2023 17:57:14 +0100 Subject: [PATCH] Cleanup lib exports (#50) --- .changeset/friendly-owls-mate.md | 5 + .changeset/metal-dancers-perform.md | 7 + src/app.html | 2 +- src/components/player/player-widget.svelte | 28 +-- src/lib/Player.svelte | 32 ++++ .../progress.svelte => Progress.svelte} | 14 +- src/lib/_internal_/announce.ts | 43 +++++ src/lib/_internal_/audio-element.ts | 84 +++++++++ src/lib/_internal_/audio-metadata.ts | 5 + src/lib/_internal_/audio-state.ts | 17 ++ src/lib/_internal_/index.ts | 8 + src/lib/_internal_/safe-use-url.ts | 33 ++++ src/lib/actions.ts | 134 ++++++++++++++ src/lib/attributes.ts | 46 +++++ src/lib/audio/actions.js | 165 ------------------ src/lib/audio/audio-element-source.js | 15 -- src/lib/audio/audio-element.js | 132 -------------- src/lib/audio/audio-metadata.js | 12 -- src/lib/audio/index.js | 11 -- src/lib/audio/player.svelte | 61 ------- src/lib/index.js | 7 - src/lib/index.ts | 10 ++ src/lib/internal/announce.js | 67 ------- src/lib/internal/index.js | 7 - src/lib/internal/use-url.js | 31 ---- src/lib/metadata.ts | 6 + src/lib/user-preferences.ts | 59 +++++++ src/lib/user-progress.ts | 63 +++++++ src/lib/user/index.js | 7 - src/lib/user/user-preferences.js | 88 ---------- src/lib/user/user-progress.js | 81 --------- src/lib/utility/format-seconds.ts | 40 +++++ src/lib/utility/index.js | 6 - src/lib/utility/seconds-to-timestamp.js | 31 ---- src/routes/+layout.svelte | 10 +- src/routes/+page.svelte | 8 +- src/routes/api/+page.svelte | 31 +--- src/routes/api/code/audio-load.js | 13 +- src/routes/api/code/audio-mute.js | 9 +- src/routes/api/code/audio-pause.js | 9 - src/routes/api/code/audio-play.js | 9 +- src/routes/api/code/audio-seek.js | 4 +- src/routes/api/code/audio-skip.js | 4 +- src/routes/api/code/audio-unload.js | 4 - src/routes/api/code/audio-unmute.js | 9 - src/routes/api/code/index.js | 16 +- .../api/code/load-audio-after-click.svelte | 8 +- .../api/code/load-audio-after-mount.svelte | 6 +- src/routes/api/code/seconds-to-timestamp.js | 12 +- src/routes/api/code/user_preferences-clear.js | 2 +- .../user_preferences-set_playback_rate.js | 2 +- .../api/code/user_preferences-set_volume.js | 2 +- .../components/code/audio-progress.svelte | 2 +- src/routes/setup/+page.svelte | 2 +- src/routes/setup/code/load-audio-advanced.js | 16 +- src/routes/setup/code/load-audio-local.js | 5 +- src/routes/setup/code/load-audio-remote.js | 5 +- .../setup/code/override-episode-state.ts | 5 +- static/podstack.png | Bin 0 -> 26269 bytes 59 files changed, 697 insertions(+), 853 deletions(-) create mode 100644 .changeset/friendly-owls-mate.md create mode 100644 .changeset/metal-dancers-perform.md create mode 100644 src/lib/Player.svelte rename src/lib/{audio/progress.svelte => Progress.svelte} (94%) create mode 100644 src/lib/_internal_/announce.ts create mode 100644 src/lib/_internal_/audio-element.ts create mode 100644 src/lib/_internal_/audio-metadata.ts create mode 100644 src/lib/_internal_/audio-state.ts create mode 100644 src/lib/_internal_/index.ts create mode 100644 src/lib/_internal_/safe-use-url.ts create mode 100644 src/lib/actions.ts create mode 100644 src/lib/attributes.ts delete mode 100644 src/lib/audio/actions.js delete mode 100644 src/lib/audio/audio-element-source.js delete mode 100644 src/lib/audio/audio-element.js delete mode 100644 src/lib/audio/audio-metadata.js delete mode 100644 src/lib/audio/index.js delete mode 100644 src/lib/audio/player.svelte delete mode 100644 src/lib/index.js create mode 100644 src/lib/index.ts delete mode 100644 src/lib/internal/announce.js delete mode 100644 src/lib/internal/index.js delete mode 100644 src/lib/internal/use-url.js create mode 100644 src/lib/metadata.ts create mode 100644 src/lib/user-preferences.ts create mode 100644 src/lib/user-progress.ts delete mode 100644 src/lib/user/index.js delete mode 100644 src/lib/user/user-preferences.js delete mode 100644 src/lib/user/user-progress.js create mode 100644 src/lib/utility/format-seconds.ts delete mode 100644 src/lib/utility/index.js delete mode 100644 src/lib/utility/seconds-to-timestamp.js delete mode 100644 src/routes/api/code/audio-pause.js delete mode 100644 src/routes/api/code/audio-unload.js delete mode 100644 src/routes/api/code/audio-unmute.js create mode 100644 static/podstack.png diff --git a/.changeset/friendly-owls-mate.md b/.changeset/friendly-owls-mate.md new file mode 100644 index 0000000..47e3418 --- /dev/null +++ b/.changeset/friendly-owls-mate.md @@ -0,0 +1,5 @@ +--- +'svelte-podcast': minor +--- + +Restructures package exports diff --git a/.changeset/metal-dancers-perform.md b/.changeset/metal-dancers-perform.md new file mode 100644 index 0000000..c64211d --- /dev/null +++ b/.changeset/metal-dancers-perform.md @@ -0,0 +1,7 @@ +--- +'svelte-podcast': minor +--- + +- improved export structure +- simplify audio methods +- improve typescript types diff --git a/src/app.html b/src/app.html index 83d21b4..e0152dd 100644 --- a/src/app.html +++ b/src/app.html @@ -9,7 +9,7 @@ - + %sveltekit.head% diff --git a/src/components/player/player-widget.svelte b/src/components/player/player-widget.svelte index 5125c39..d124606 100644 --- a/src/components/player/player-widget.svelte +++ b/src/components/player/player-widget.svelte @@ -1,4 +1,4 @@ - @@ -37,14 +31,20 @@ - +
{:else} -
+
Waiting for audio...
@@ -78,7 +78,7 @@
- -

Set or toggle the pause state.

-
- -
-
-

Set or toggle the mute state.

@@ -128,13 +112,6 @@
- -

Set or toggle the unmute state.

-
- -
-
-

Seek to a specific time in the audio. The `from` parameter diff --git a/src/routes/api/code/audio-load.js b/src/routes/api/code/audio-load.js index d48cd37..405a84f 100644 --- a/src/routes/api/code/audio-load.js +++ b/src/routes/api/code/audio-load.js @@ -1,17 +1,22 @@ import { audio } from 'svelte-podcast'; -// load a new audio source -audio.load( +// load a new audio source into the player +audio.src.load( // path to audio file '/episode-377.mp3', - // custom metadata + // custom metadata defined by you { title: 'Supper Club × Rich Harris, Author of Svelte', + artwork: + 'https://ssl-static.libsyn.com/p/assets/b/3/c/d/b3cdf28da11ad39fe5bbc093207a2619/Syntax_-_499.jpg', guests: ['Rich Harris'], hosts: ['Wes Bos', 'Scott Tolinski'], }, // autoplay - true, + false, ); + +// unload the current audio source +audio.src.unload(); diff --git a/src/routes/api/code/audio-mute.js b/src/routes/api/code/audio-mute.js index 789fae9..72ba781 100644 --- a/src/routes/api/code/audio-mute.js +++ b/src/routes/api/code/audio-mute.js @@ -1,9 +1,10 @@ import { audio } from 'svelte-podcast'; // mute the current audio source -// do nothing if it's already muted -audio.mute('set'); +audio.mute(true); -// mute the current audio if it's unmuted -// unmute the current audio if it's muted +// unmute the current audio source +audio.mute(false); + +// invert the mute state of the current audio source audio.mute('toggle'); diff --git a/src/routes/api/code/audio-pause.js b/src/routes/api/code/audio-pause.js deleted file mode 100644 index bfa3dd8..0000000 --- a/src/routes/api/code/audio-pause.js +++ /dev/null @@ -1,9 +0,0 @@ -import { audio } from 'svelte-podcast'; - -// pause the current audio source -// do nothing if it's already paused -audio.pause('set'); - -// pause the current audio if it's playing -// play the current audio if it's paused -audio.pause('toggle'); diff --git a/src/routes/api/code/audio-play.js b/src/routes/api/code/audio-play.js index 0fd33c2..a2f5cf2 100644 --- a/src/routes/api/code/audio-play.js +++ b/src/routes/api/code/audio-play.js @@ -1,9 +1,10 @@ import { audio } from 'svelte-podcast'; // play the current audio source -// do nothing if it's already playing -audio.play('set'); +audio.play(true); -// play the current audio if it's paused -// pause the current audio if it's playing +// pause the current audio source +audio.play(false); + +// invert the play state of the current audio source audio.play('toggle'); diff --git a/src/routes/api/code/audio-seek.js b/src/routes/api/code/audio-seek.js index 17a2e2a..57eb4a2 100644 --- a/src/routes/api/code/audio-seek.js +++ b/src/routes/api/code/audio-seek.js @@ -1,7 +1,7 @@ import { audio } from 'svelte-podcast'; // go to 200 seconds from the start -audio.seek(200); +audio.seek_to(200); // go to 200 seconds before the end -audio.seek(200, 'from-end'); +audio.seek_to(200, 'from-end'); diff --git a/src/routes/api/code/audio-skip.js b/src/routes/api/code/audio-skip.js index 0b89e7e..2056151 100644 --- a/src/routes/api/code/audio-skip.js +++ b/src/routes/api/code/audio-skip.js @@ -1,7 +1,7 @@ import { audio } from 'svelte-podcast'; // skip forward 30 seconds from the current position -audio.skip(30); +audio.skip_by(30); // skip backward 30 seconds from the current position -audio.skip(30, 'backward'); +audio.skip_by(30, 'backward'); diff --git a/src/routes/api/code/audio-unload.js b/src/routes/api/code/audio-unload.js deleted file mode 100644 index af801f9..0000000 --- a/src/routes/api/code/audio-unload.js +++ /dev/null @@ -1,4 +0,0 @@ -import { audio } from 'svelte-podcast'; - -// unload the current audio source -audio.unload(); diff --git a/src/routes/api/code/audio-unmute.js b/src/routes/api/code/audio-unmute.js deleted file mode 100644 index 51e1789..0000000 --- a/src/routes/api/code/audio-unmute.js +++ /dev/null @@ -1,9 +0,0 @@ -import { audio } from 'svelte-podcast'; - -// unmute the current audio source -// do nothing if it's already unmuted -audio.unmute('set'); - -// unmute the current audio if it's muted -// mute the current audio if it's unmuted -audio.unmute('toggle'); diff --git a/src/routes/api/code/index.js b/src/routes/api/code/index.js index 716e32a..4fee67e 100644 --- a/src/routes/api/code/index.js +++ b/src/routes/api/code/index.js @@ -1,13 +1,10 @@ import { format_code } from '../../../layout/helper'; -import { default as audio_load_src } from './audio-load.js?raw'; -import { default as audio_mute_src } from './audio-mute.js?raw'; -import { default as audio_pause_src } from './audio-pause.js?raw'; -import { default as audio_play_src } from './audio-play.js?raw'; -import { default as audio_seek_src } from './audio-seek.js?raw'; -import { default as audio_skip_src } from './audio-skip.js?raw'; +import { default as audio_load_src } from './audio-load?raw'; +import { default as audio_mute_src } from './audio-mute?raw'; +import { default as audio_play_src } from './audio-play?raw'; +import { default as audio_seek_src } from './audio-seek?raw'; +import { default as audio_skip_src } from './audio-skip?raw'; import { default as audio_subscribe_src } from './audio-subscribe.svelte?raw'; -import { default as audio_unload_src } from './audio-unload.js?raw'; -import { default as audio_unmute_src } from './audio-unmute.js?raw'; import { default as load_audio_after_click_src } from './load-audio-after-click.svelte?raw'; import { default as load_audio_after_mount_src } from './load-audio-after-mount.svelte?raw'; import { default as seconds_to_timestamp_src } from './seconds-to-timestamp?raw'; @@ -25,12 +22,9 @@ export const load_audio_after_mount = format_code(load_audio_after_mount_src); export const seconds_to_timestamp = format_code(seconds_to_timestamp_src); export const audio_load = format_code(audio_load_src); export const audio_play = format_code(audio_play_src); -export const audio_unload = format_code(audio_unload_src); -export const audio_pause = format_code(audio_pause_src); export const audio_skip = format_code(audio_skip_src); export const audio_seek = format_code(audio_seek_src); export const audio_mute = format_code(audio_mute_src); -export const audio_unmute = format_code(audio_unmute_src); export const user_preferences_clear = format_code(user_preferences_clear_src); export const user_preferences_set_playback_rate = format_code( user_preferences_set_playback_rate_src, diff --git a/src/routes/api/code/load-audio-after-click.svelte b/src/routes/api/code/load-audio-after-click.svelte index 1fa0fde..60635f6 100644 --- a/src/routes/api/code/load-audio-after-click.svelte +++ b/src/routes/api/code/load-audio-after-click.svelte @@ -5,12 +5,14 @@ - + diff --git a/src/routes/api/code/load-audio-after-mount.svelte b/src/routes/api/code/load-audio-after-mount.svelte index 28230f3..349c495 100644 --- a/src/routes/api/code/load-audio-after-mount.svelte +++ b/src/routes/api/code/load-audio-after-mount.svelte @@ -4,8 +4,10 @@ onMount(() => { // load the episode on mount without any metadata - audio.load('/episode-audio.mp3', { - /* optional metadata */ + audio.src.load('/episode-audio.mp3', { + /* your metadata */ + title: 'Episode Title', + artwork: '/artwork.png', }); }); diff --git a/src/routes/api/code/seconds-to-timestamp.js b/src/routes/api/code/seconds-to-timestamp.js index 68957e7..4ecdae4 100644 --- a/src/routes/api/code/seconds-to-timestamp.js +++ b/src/routes/api/code/seconds-to-timestamp.js @@ -1,8 +1,10 @@ -import { seconds_to_timestamp } from 'svelte-podcast/utility'; +import { format_seconds } from 'svelte-podcast/utility/format-seconds'; // Example -seconds_to_timestamp(5173); // 01:26:13 +format_seconds.to_timestamp(5173); // '01:26:13'; -// force hours -seconds_to_timestamp(2700, true); // 00:45:00 -seconds_to_timestamp(2700, false); // 45:00 (default) +// force hours to be displayed +format_seconds.to_timestamp(2700, true); // '00:45:00'; + +// only display hours if there are any +format_seconds.to_timestamp(2700, false); // '45:00'; diff --git a/src/routes/api/code/user_preferences-clear.js b/src/routes/api/code/user_preferences-clear.js index b640bba..231a910 100644 --- a/src/routes/api/code/user_preferences-clear.js +++ b/src/routes/api/code/user_preferences-clear.js @@ -1,4 +1,4 @@ -import { user_preferences } from '../../../lib/user'; +import { user_preferences } from 'svelte-podcast'; // Clears all user preferences user_preferences.clear(); diff --git a/src/routes/api/code/user_preferences-set_playback_rate.js b/src/routes/api/code/user_preferences-set_playback_rate.js index 6b913a7..f64784c 100644 --- a/src/routes/api/code/user_preferences-set_playback_rate.js +++ b/src/routes/api/code/user_preferences-set_playback_rate.js @@ -1,4 +1,4 @@ -import { user_preferences } from '../../../lib/user'; +import { user_preferences } from 'svelte-podcast'; // Sets the playback speed to 150% user_preferences.set_playback_rate(1.5); diff --git a/src/routes/api/code/user_preferences-set_volume.js b/src/routes/api/code/user_preferences-set_volume.js index f137499..b799cac 100644 --- a/src/routes/api/code/user_preferences-set_volume.js +++ b/src/routes/api/code/user_preferences-set_volume.js @@ -1,4 +1,4 @@ -import { user_preferences } from '../../../lib/user'; +import { user_preferences } from 'svelte-podcast'; // Sets the volume to 75% user_preferences.set_volume(0.75); diff --git a/src/routes/components/code/audio-progress.svelte b/src/routes/components/code/audio-progress.svelte index f29de20..6db8b9d 100644 --- a/src/routes/components/code/audio-progress.svelte +++ b/src/routes/components/code/audio-progress.svelte @@ -1,5 +1,5 @@ diff --git a/src/routes/setup/+page.svelte b/src/routes/setup/+page.svelte index af58fe4..67d762c 100644 --- a/src/routes/setup/+page.svelte +++ b/src/routes/setup/+page.svelte @@ -70,7 +70,7 @@ Along side your audio source, you can optionally define arbitrary metadata for you to use in your player, and determine if the episode should autoplay once loaded. Learn more in the api docsapi docs

diff --git a/src/routes/setup/code/load-audio-advanced.js b/src/routes/setup/code/load-audio-advanced.js index f3ffd95..8bb67c5 100644 --- a/src/routes/setup/code/load-audio-advanced.js +++ b/src/routes/setup/code/load-audio-advanced.js @@ -1,14 +1,16 @@ import { audio } from 'svelte-podcast'; -audio.load('/episode-audio.mp3'); +audio.src.load( + // Audio file + '/episode-audio.mp3', -audio.load( - 'https://media.transistor.fm/27a058c9/27b595e2.mp3', + // Your custom metadata { - title: 'SvelteKit-superforms with Andreas Söderlund', - artwork: - 'https://images.transistor.fm/file/transistor/images/show/12899/medium_1597678946-artwork.jpg', - guest_name: 'Andreas Söderlund', + title: 'A deep dive into Svelte Podcast', + artwork: '/artwork.png', + guest_name: 'OllieJT', }, + + // Autoplay once loaded false, ); diff --git a/src/routes/setup/code/load-audio-local.js b/src/routes/setup/code/load-audio-local.js index 3a15bae..e3b77fb 100644 --- a/src/routes/setup/code/load-audio-local.js +++ b/src/routes/setup/code/load-audio-local.js @@ -1,3 +1,6 @@ import { audio } from 'svelte-podcast'; -audio.load('/episode-audio.mp3'); +audio.src.load('/episode-audio.mp3', { + title: 'Episode Title', + artwork: '/artwork.png', +}); diff --git a/src/routes/setup/code/load-audio-remote.js b/src/routes/setup/code/load-audio-remote.js index 1de7c79..4ae9124 100644 --- a/src/routes/setup/code/load-audio-remote.js +++ b/src/routes/setup/code/load-audio-remote.js @@ -1,3 +1,6 @@ import { audio } from 'svelte-podcast'; -audio.load('https://media.transistor.fm/27a058c9/27b595e2.mp3'); +audio.src.load('https://media.transistor.fm/27a058c9/27b595e2.mp3', { + title: 'Episode Title', + artwork: '/artwork.png', +}); diff --git a/src/routes/setup/code/override-episode-state.ts b/src/routes/setup/code/override-episode-state.ts index 0da531e..b0a11b9 100644 --- a/src/routes/setup/code/override-episode-state.ts +++ b/src/routes/setup/code/override-episode-state.ts @@ -1,10 +1,9 @@ // include this in your /src/app.d.ts file declare module 'svelte-podcast' { - interface EpisodeDetails { + interface AudioMetadata { title: string; - artwork: string; - guest_name: string; + artwork: string | null; } } diff --git a/static/podstack.png b/static/podstack.png new file mode 100644 index 0000000000000000000000000000000000000000..0e14d8b8014c1793f4308dd27a957592c154b74e GIT binary patch literal 26269 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 fDx>>*he0WGC%V=D!{0dHEZMyUU7 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