mirror of
https://github.com/NoCrypt/migu.git
synced 2026-01-11 20:10:22 +00:00
69 lines
2.7 KiB
JavaScript
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)
|
|
}
|