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 @@