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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 gBB<^kFTz!`@>1hlqAr&XIXpJz^j
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 fDx>>*he0WGC%V=D!{0dHEZMyUU7
zhb3wi5;%4gz+%}RBM$FqXBK1i@=$J9$$7PV(qq@|0-hxW)2OpV0&6Pt*13|K54bcC5}r0h{V9tPZgM*sRp#hikj^vXmZrs$DNr%
zJ2b~A9V07U1U>;!CKFA7EK6Ca$-=g}&?PcJF5!^Yn<-y}OjZJSAL0Q&yA);(;>tj_
z{d*-`6M--5l+t!IYX^d;rSTZ(1)Ou$Xk%xjf(NANY1wz4>$p{rCS#=leyWg(MXUrJ
zJ6*gVW5**nk%pHXJ^rk7&TUsmIVH6yF(2>U1I*5~s@TE7+2lIX7&UhmiMDZYZ}7fX
zIxYcntxn&Bl)X#k+=wtp-DR9JqTRM^A8y
zeP5qfXJ=_T*%F!^v~5*aCsaYh?!6wYDRRi#itGUgLcLbadfK(8eO#|pR!Y=-uRSef
zj0N@lXpNVw>qE_%Cf5Qp7dcdS?O+rw53XPbkFKaC0YI6K8Lf&c^vDVqsjLdDy2B(r
zdj^(OnJpP!^@-B#Y-M;!trS_0TJ~rzU;A6`sHzTP3*_wZNm4p{T|NzD5>G^4N;8DL
zLgK_#hg2OQwo@0Y<4MZg!ZI?1%B@hQr#;w5Dy#0A&n%|FKp&x}Pf7M}hn18Q*eylnIW26@k
zblj-Us#WI$h+r=%OUN#qhe6p)UjHv<&()ZoVkz!w6#ykV0ysJX
z$0PtY$srbm)rayhlLBgaQilaO+wHC!IxKrO(~*!^sCV>!`94Xk-j{WPE2*LFGNe=*
zVk(!&J{cm)AIC?bC2yq_3S~p8EH?qiVUTxoTE!Q8abh338%!Xl^1O*9oYR)-guVM1
zM|p&<`T?6vaE>CoUUwfP^!9ai!?J}Qr20S)jnLut0LTN@_^9)0HuCB>sC(Pj0-B9F
zol*g`f*)U?IhCsv7Glm<8F9&nnGe4eDd*a)WE@p_Ivy=4#k);Fc&$2CEOn>_T(OCn
zl4>eG+XT3x#9A?0vmN`vk~%3#?F@`R!J%@8k0Oqr`dLe~7oh^`urFEe`O;Cb8%xK`
zl`nX1Q=@|jo}5R(#CRDmap;JOD_Noa|a
zl313qk>`Gvr6g=6(n~dGjytw=reID^bwBO12S_K7#0|bcn4Vb-i&Q}H39D;y126fG
ztV7)%c=)G`eR~V=QAF?$?wpMpX{k6cbyD~YFGZjps=0EsP44oM |