migu/common/modules/animeprogress.js
2024-02-08 23:13:36 +01:00

69 lines
2.7 KiB
JavaScript

import { writable, derived } from 'simple-store-svelte'
// Maximum number of entries to keep in LocalStorage
const maxEntries = 1000
// LocalStorage is structured as an array of objects with the following properties:
// mediaId, episode, currentTime, safeduration, createdAt, updatedAt
function loadFromLocalStorage () {
const data = localStorage.getItem('animeEpisodeProgress')
return data ? JSON.parse(data) : []
}
function saveToLocalStorage (data) {
localStorage.setItem('animeEpisodeProgress', JSON.stringify(data))
animeProgressStore.set(data)
}
const animeProgressStore = writable(loadFromLocalStorage())
// Return an object with the progress of each episode in percent (0-100), keyed by episode number
export function liveAnimeProgress (mediaId) {
return derived(animeProgressStore, (data) => {
if (!mediaId) return {}
const results = data.filter(item => item.mediaId === mediaId)
if (!results) return {}
// Return an object with the episode as the key and the progress as the value
return Object.fromEntries(results.map(result => [
result.episode,
Math.ceil(result.currentTime / result.safeduration * 100)
]))
})
}
// Return an individual episode's progress in percent (0-100)
export function liveAnimeEpisodeProgress (mediaId, episode) {
return derived(animeProgressStore, (data) => {
if (!mediaId || !episode) return 0
const result = data.find(item => item.mediaId === mediaId && item.episode === episode)
if (!result) return 0
return Math.ceil(result.currentTime / result.safeduration * 100)
})
}
// Return an individual episode's record { mediaId, episode, currentTime, safeduration, createdAt, updatedAt }
export function getAnimeProgress (mediaId, episode) {
const data = loadFromLocalStorage()
return data.find(item => item.mediaId === mediaId && item.episode === episode)
}
// Set an individual episode's progress
export function setAnimeProgress ({ mediaId, episode, currentTime, safeduration }) {
if (!mediaId || !episode || !currentTime || !safeduration) return
const data = loadFromLocalStorage()
// Update the existing entry or create a new one
const existing = data.find(item => item.mediaId === mediaId && item.episode === episode)
if (existing) {
existing.currentTime = currentTime
existing.safeduration = safeduration
existing.updatedAt = Date.now()
} else {
data.push({ mediaId, episode, currentTime, safeduration, createdAt: Date.now(), updatedAt: Date.now() })
}
// Remove the oldest entries if we have too many
while (data.length > maxEntries) {
const oldest = data.reduce((a, b) => a.updatedAt < b.updatedAt ? a : b)
data.splice(data.indexOf(oldest), 1)
}
saveToLocalStorage(data)
}