miru/common/modules/animeprogress.js
2024-01-20 18:25:03 +01:00

59 lines
2 KiB
JavaScript

import Dexie, { liveQuery } from 'dexie';
export const db = new Dexie('miru');
db.version(1).stores({
animeEpisodeProgress: '[mediaId+episode], currentTime, safeduration, createdAt, updatedAt', // mediaId and episode is the composite key
});
// Return an object with the progress of each episode in percent (0-100), keyed by episode number
export function liveAnimeProgress (mediaId){
return liveQuery(async () => {
if (!mediaId) return {}
const results = await db.animeEpisodeProgress.where({ mediaId }).toArray();
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 liveQuery(async () => {
if (!mediaId || !episode) return 0
const result = await getAnimeProgress(mediaId, 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) {
return db.animeEpisodeProgress.where({ mediaId, episode }).first();
}
// Set an individual episode's progress
export async function setAnimeProgress ({mediaId, episode, currentTime, safeduration}) {
// If you want to update the record if it already exists:
const existing = await getAnimeProgress(mediaId, episode);
if (existing) {
return await db.animeEpisodeProgress.update([ mediaId, episode ], {
currentTime,
safeduration,
updatedAt: Date.now(),
});
}
// If you want to insert a new record if it does not exist:
return await db.animeEpisodeProgress.put({
mediaId,
episode,
currentTime,
safeduration,
createdAt: Date.now(),
updatedAt: Date.now(),
});
}