From 613b81fa0bcdb31884b4d1aa5430b91cd9958fd3 Mon Sep 17 00:00:00 2001
From: Ollie Taylor <13766232+OllieJT@users.noreply.github.com>
Date: Fri, 24 Feb 2023 19:20:07 +0000
Subject: [PATCH 1/8] adds method to clear saved progress
---
src/lib/context/progress.ts | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/src/lib/context/progress.ts b/src/lib/context/progress.ts
index 5e79ae4..d34fbd5 100644
--- a/src/lib/context/progress.ts
+++ b/src/lib/context/progress.ts
@@ -13,6 +13,7 @@ function stash_episode() {
info('saving progress: ', state.src);
if (!state.src) return;
episode_progress_map.set(state.src, { current_time: state.current_time });
+ save_all();
})();
}
@@ -69,9 +70,21 @@ function load_all() {
}
}
+function clear_all() {
+ episode_progress_map.clear();
+ save_all();
+}
+
export const episode_progress = {
+ episodes: {
+ get: episode_progress_map.get,
+ includes: episode_progress_map.has,
+ forEach: episode_progress_map.forEach,
+ map: [...episode_progress_map].map,
+ },
stash: stash_episode,
use: use_episode,
save_all,
load_all,
+ clear_all,
};
From 6155a3c09f19454d7ae07cd60c219d303b7de7d4 Mon Sep 17 00:00:00 2001
From: Ollie Taylor <13766232+OllieJT@users.noreply.github.com>
Date: Fri, 24 Feb 2023 19:24:58 +0000
Subject: [PATCH 2/8] Fixes dist exports
---
src/lib/components/audio-loader.svelte | 2 +-
src/lib/context/audio.ts | 2 +-
src/lib/context/{progress.ts => episode-progress.ts} | 0
src/lib/index.ts | 3 ++-
src/routes/+page.svelte | 3 +--
5 files changed, 5 insertions(+), 5 deletions(-)
rename src/lib/context/{progress.ts => episode-progress.ts} (100%)
diff --git a/src/lib/components/audio-loader.svelte b/src/lib/components/audio-loader.svelte
index c336933..0f34a3e 100644
--- a/src/lib/components/audio-loader.svelte
+++ b/src/lib/components/audio-loader.svelte
@@ -13,7 +13,7 @@
audio_start_at,
audio_volume,
} from '$lib/context/audio-internals';
- import { episode_progress } from '$lib/context/progress';
+ import { episode_progress } from '$lib/context/episode-progress';
import type { PlayerElement } from '$lib/types/types';
import { onMount } from 'svelte';
diff --git a/src/lib/context/audio.ts b/src/lib/context/audio.ts
index c7ef45d..c1dbe8d 100644
--- a/src/lib/context/audio.ts
+++ b/src/lib/context/audio.ts
@@ -13,7 +13,7 @@ import {
audio_volume,
} from '$lib/context/audio-internals';
import { audio_metadata, type AudioMetadata } from '$lib/context/audio-metadata';
-import { episode_progress } from '$lib/context/progress';
+import { episode_progress } from '$lib/context/episode-progress';
import { secondsToTimestamp } from '$lib/utility/seconds-to-timestamp';
import { info, warn } from '$pkg/log';
import clamp from 'just-clamp';
diff --git a/src/lib/context/progress.ts b/src/lib/context/episode-progress.ts
similarity index 100%
rename from src/lib/context/progress.ts
rename to src/lib/context/episode-progress.ts
diff --git a/src/lib/index.ts b/src/lib/index.ts
index 14bf742..3b11cb2 100644
--- a/src/lib/index.ts
+++ b/src/lib/index.ts
@@ -1,2 +1,3 @@
export { default as AudioLoader } from '$lib/components/audio-loader.svelte';
-export { audio, type AudioLoadData, type AudioLoadOptions } from '$lib/context/audio';
+export * from '$lib/context/audio';
+export * from '$lib/context/episode-progress';
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 5d0bff3..0afa8ad 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,6 +1,5 @@
diff --git a/src/lib/context/user-preferences.ts b/src/lib/context/user-preferences.ts
new file mode 100644
index 0000000..8481387
--- /dev/null
+++ b/src/lib/context/user-preferences.ts
@@ -0,0 +1,62 @@
+import { browser } from '$app/environment';
+import { info, warn } from '$lib/utility/package/log';
+import { writable } from 'svelte/store';
+
+export type UserPreferences = {
+ playback_rate: number;
+ volume: number;
+};
+
+const default_user_preferences = {
+ playback_rate: 1,
+ volume: 1,
+} satisfies UserPreferences;
+
+const user_preference_store = writable(default_user_preferences);
+
+function set_preference(prefs: Partial) {
+ user_preference_store.update((prev) => ({ ...prev, ...prefs }));
+ save();
+}
+const USER_PREFERENCE_KEY = 'USER_PREFERENCE' as const;
+
+function save() {
+ if (!browser || !localStorage) {
+ warn('localStorage not available, skipping save');
+ return;
+ }
+ return user_preference_store.subscribe((prefs) => {
+ info(`Saving user preferences to localStorage`, prefs);
+ localStorage.setItem(USER_PREFERENCE_KEY, JSON.stringify(prefs));
+ })();
+}
+
+function load() {
+ if (!browser || !localStorage) {
+ warn('localStorage not available, skipping load');
+ return;
+ }
+ const data = localStorage.getItem(USER_PREFERENCE_KEY);
+
+ if (!data || typeof data !== 'object') {
+ info('No saved user preferences found');
+ return;
+ }
+
+ const preferences = JSON.parse(data) as UserPreferences;
+ user_preference_store.update((prev) => ({ ...prev, ...preferences }));
+ info(`Loaded user preferences from localStorage`, data);
+}
+
+function clear() {
+ user_preference_store.set(default_user_preferences);
+ save();
+}
+
+export const user_preferences = {
+ subscribe: user_preference_store.subscribe,
+ set: set_preference,
+ save,
+ load,
+ clear,
+};
From becb001479b9ccee78d7236789374d13d07954e7 Mon Sep 17 00:00:00 2001
From: Ollie Taylor <13766232+OllieJT@users.noreply.github.com>
Date: Fri, 24 Feb 2023 20:03:10 +0000
Subject: [PATCH 5/8] fixes consumption of user preferences store
---
src/lib/components/audio-loader.svelte | 11 ++++-------
src/lib/context/audio-internals.ts | 2 --
src/lib/context/audio.ts | 21 +++++----------------
src/lib/index.ts | 1 +
src/routes/+page.svelte | 9 ++++++---
5 files changed, 16 insertions(+), 28 deletions(-)
diff --git a/src/lib/components/audio-loader.svelte b/src/lib/components/audio-loader.svelte
index 2ca17a3..27d3593 100644
--- a/src/lib/components/audio-loader.svelte
+++ b/src/lib/components/audio-loader.svelte
@@ -8,12 +8,9 @@
audio_loading,
audio_muted,
audio_paused,
- audio_playback_rate,
audio_src,
audio_start_at,
- audio_volume,
} from '$lib/context/audio-internals';
- import { episode_progress } from '$lib/context/episode-progress';
import { user_preferences } from '$lib/context/user-preferences';
import type { PlayerElement } from '$lib/types/types';
import { onMount } from 'svelte';
@@ -26,9 +23,9 @@
let paused = false;
// handler values
- let volume = $audio_volume;
+ let volume = $user_preferences.volume;
+ let playbackRate = $user_preferences.playback_rate;
let muted = false;
- let playbackRate = 1;
// readonly - stores will update when bindings change
$: audio_element.set(element);
@@ -38,9 +35,9 @@
$: audio_paused.set(paused);
// handlers - when store value changes, the binding will update the audio element
- $: volume = $audio_volume;
+ $: volume = $user_preferences.volume;
+ $: playbackRate = $user_preferences.playback_rate;
$: muted = $audio_muted;
- $: playbackRate = $audio_playback_rate;
$: current_time = $audio_start_at;
onMount(() => {
diff --git a/src/lib/context/audio-internals.ts b/src/lib/context/audio-internals.ts
index 09a7fed..60ebe79 100644
--- a/src/lib/context/audio-internals.ts
+++ b/src/lib/context/audio-internals.ts
@@ -13,6 +13,4 @@ export const audio_paused = writable(true);
export const audio_start_at = writable(0);
export const audio_autoplay = writable(false);
export const audio_muted = writable(false);
-export const audio_playback_rate = writable(1);
export const audio_src = writable('');
-export const audio_volume = writable(1);
diff --git a/src/lib/context/audio.ts b/src/lib/context/audio.ts
index c1dbe8d..d041504 100644
--- a/src/lib/context/audio.ts
+++ b/src/lib/context/audio.ts
@@ -7,13 +7,12 @@ import {
audio_loading,
audio_muted,
audio_paused,
- audio_playback_rate,
audio_src,
audio_start_at,
- audio_volume,
} from '$lib/context/audio-internals';
import { audio_metadata, type AudioMetadata } from '$lib/context/audio-metadata';
import { episode_progress } from '$lib/context/episode-progress';
+import { user_preferences } from '$lib/context/user-preferences';
import { secondsToTimestamp } from '$lib/utility/seconds-to-timestamp';
import { info, warn } from '$pkg/log';
import clamp from 'just-clamp';
@@ -29,10 +28,9 @@ const audio_state = derived(
audio_start_at,
audio_autoplay,
audio_muted,
- audio_playback_rate,
audio_src,
- audio_volume,
audio_metadata,
+ user_preferences,
],
([
$current_time,
@@ -43,10 +41,9 @@ const audio_state = derived(
$start_at,
$autoplay,
$muted,
- $playback_rate,
$src,
- $volume,
$metadata,
+ $user_preferences,
]) => {
return {
current_time: $current_time,
@@ -57,10 +54,10 @@ const audio_state = derived(
start_at: $start_at,
autoplay: $autoplay,
muted: $muted,
- playback_rate: $playback_rate,
src: $src,
- volume: $volume,
metadata: $metadata,
+ playback_rate: $user_preferences.playback_rate,
+ volume: $user_preferences.volume,
timestamp: secondsToTimestamp($current_time),
};
},
@@ -126,7 +123,6 @@ const load = (data: AudioLoadData, opts: AudioLoadOptions) => {
info('load: ', src);
audio_autoplay.set(opts.autoplay);
- audio_volume.set(1);
audio_src.set(src);
audio_metadata.set(metadata);
audio_start_at.set(start_at);
@@ -138,17 +134,11 @@ function unload() {
info('unload: ');
pause();
audio_autoplay.set(false);
- audio_volume.set(1);
audio_src.set('');
audio_metadata.set(null);
audio_start_at.set(0);
}
-function setPlaybackRate(rate: number) {
- info('setPlaybackRate: ', rate);
- audio_playback_rate.set(clamp(0, 10, rate));
-}
-
function seek(seconds: number, from: 'from-start' | 'from-end' = 'from-start') {
info('seek: ', seconds, from);
return audio_element.subscribe((el) => {
@@ -181,7 +171,6 @@ export const audio = {
unmute,
load,
unload,
- setPlaybackRate,
seek,
skip,
};
diff --git a/src/lib/index.ts b/src/lib/index.ts
index 3b11cb2..7230b96 100644
--- a/src/lib/index.ts
+++ b/src/lib/index.ts
@@ -1,3 +1,4 @@
export { default as AudioLoader } from '$lib/components/audio-loader.svelte';
export * from '$lib/context/audio';
export * from '$lib/context/episode-progress';
+export * from '$lib/context/user-preferences';
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 0afa8ad..054b854 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,5 +1,5 @@