From 5f200d3838a5cca06025e0a1509ffe96484b958e Mon Sep 17 00:00:00 2001 From: Ollie Taylor <13766232+OllieJT@users.noreply.github.com> Date: Fri, 24 Feb 2023 18:46:41 +0000 Subject: [PATCH 1/4] Adds stash/use/save/load actions for episode progress --- src/lib/context/audio.ts | 11 +++++- src/lib/context/progress.ts | 77 +++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/lib/context/progress.ts diff --git a/src/lib/context/audio.ts b/src/lib/context/audio.ts index fb7c481..c7ef45d 100644 --- a/src/lib/context/audio.ts +++ b/src/lib/context/audio.ts @@ -13,6 +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 { secondsToTimestamp } from '$lib/utility/seconds-to-timestamp'; import { info, warn } from '$pkg/log'; import clamp from 'just-clamp'; @@ -115,17 +116,25 @@ export type AudioLoadOptions = { }; const load = (data: AudioLoadData, opts: AudioLoadOptions) => { + episode_progress.stash(); + const { src, ...metadata } = data; + const progress = episode_progress.use(src); + const start_at = progress?.start_at || opts.start_at || 0; + + console.log('progress', progress); + info('load: ', src); audio_autoplay.set(opts.autoplay); audio_volume.set(1); audio_src.set(src); audio_metadata.set(metadata); - audio_start_at.set(opts.start_at || 0); + audio_start_at.set(start_at); // opts.current_time ? seek(opts.current_time) : null; //opts.autoplay && play(); }; function unload() { + episode_progress.stash(); info('unload: '); pause(); audio_autoplay.set(false); diff --git a/src/lib/context/progress.ts b/src/lib/context/progress.ts new file mode 100644 index 0000000..5e79ae4 --- /dev/null +++ b/src/lib/context/progress.ts @@ -0,0 +1,77 @@ +import { browser } from '$app/environment'; +import { audio, type AudioLoadOptions } from '$lib/context/audio'; +import { error, info, warn } from '$lib/utility/package/log'; + +export type EpisodeProgress = { + current_time: number; +}; + +const episode_progress_map = new Map(); + +function stash_episode() { + return audio.subscribe((state) => { + info('saving progress: ', state.src); + if (!state.src) return; + episode_progress_map.set(state.src, { current_time: state.current_time }); + })(); +} + +function use_episode(src: string): Pick | null { + const progress = episode_progress_map.get(src); + + if (!progress) return null; + + info('found saved progress: ', progress); + + return { start_at: progress.current_time }; +} + +type SavedEpisodeProgress = EpisodeProgress & { src: string }; +const EPISODE_PROGRESS_KEY = 'EPISODE_PROGRESS' as const; + +function save_all() { + if (!browser || !localStorage) { + warn('localStorage not available, skipping save'); + return; + } + const items = [...episode_progress_map]; + + const episodes = items.reduce((prev, [src, progress]) => { + return [...prev, { src, ...progress }]; + }, [] as SavedEpisodeProgress[]); + + info(`Saving progress for ${episodes.length} episodes to localStorage`, episodes); + localStorage.setItem(EPISODE_PROGRESS_KEY, JSON.stringify(episodes)); +} + +function load_all() { + if (!browser || !localStorage) { + warn('localStorage not available, skipping load'); + return; + } + const data = localStorage.getItem(EPISODE_PROGRESS_KEY); + + if (!data) { + info('No saved episode progress found'); + return; + } + + const episodes = JSON.parse(data) as SavedEpisodeProgress[]; + + try { + episodes.forEach(({ src, ...progress }) => { + episode_progress_map.set(src, progress); + }); + info(`Loaded ${episode_progress_map.size} episodes progress from localStorage`); + } catch (e) { + error('Error loading episode progress', e); + return; + } +} + +export const episode_progress = { + stash: stash_episode, + use: use_episode, + save_all, + load_all, +}; From e222a4257d969a8ccb3eeb4068bc642f0f1bf878 Mon Sep 17 00:00:00 2001 From: Ollie Taylor <13766232+OllieJT@users.noreply.github.com> Date: Fri, 24 Feb 2023 18:46:50 +0000 Subject: [PATCH 2/4] adds save button to demo --- src/routes/+page.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index b5880c5..5d0bff3 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,5 +1,6 @@