diff --git a/src/state/bookmark/store.ts b/src/state/bookmark/store.ts index 3b7a3a92..5be45812 100644 --- a/src/state/bookmark/store.ts +++ b/src/state/bookmark/store.ts @@ -1,14 +1,14 @@ import { createVersionedStore } from "@/utils/storage"; +import { migrateV1Bookmarks } from "../watched/migrations/v2"; import { BookmarkStoreData } from "./types"; export const BookmarkStore = createVersionedStore() .setKey("mw-bookmarks") .addVersion({ version: 0, - migrate() { - return { - bookmarks: [], // TODO migrate bookmarks - }; + migrate(oldBookmarks) { + console.log(oldBookmarks); + return migrateV1Bookmarks(oldBookmarks); }, }) .addVersion({ diff --git a/src/state/watched/migrations/v2.ts b/src/state/watched/migrations/v2.ts index ff0115e6..c079b32d 100644 --- a/src/state/watched/migrations/v2.ts +++ b/src/state/watched/migrations/v2.ts @@ -27,16 +27,14 @@ export interface OldData { items: (OldMovie | OldSeries)[]; } -export async function migrateV2(old: OldData) { - const oldData = old; - if (!oldData) return; - - const uniqueMedias: Record = {}; - oldData.items.forEach((item: any) => { - if (uniqueMedias[item.mediaId]) return; - uniqueMedias[item.mediaId] = item; - }); +interface OldBookmarks { + bookmarks: (OldMovie | OldSeries)[]; +} +async function getMetas( + uniqueMedias: Record, + oldData?: OldData +): Promise> | undefined> { const yearsAreClose = (a: number, b: number) => { return Math.abs(a - b) <= 1; }; @@ -74,14 +72,16 @@ export async function migrateV2(old: OldData) { if (!meta || !meta?.meta.seasons) return; const seasonNumbers = [ ...new Set( - oldData.items - .filter((watchedEntry: any) => watchedEntry.mediaId === item.id) - .map((watchedEntry: any) => watchedEntry.seasonId) + oldData?.items + ? oldData.items + .filter((watchedEntry: any) => watchedEntry.mediaId === item.id) + .map((watchedEntry: any) => watchedEntry.seasonId) + : ["0"] ), ]; const seasons = seasonNumbers.map((num) => ({ num, - season: meta.meta?.seasons?.[(num as number) - 1], + season: meta.meta?.seasons?.[Math.max(0, (num as number) - 1)], })); keys = seasons .map((season) => (season ? [season.num, season?.season?.id] : [])) @@ -101,6 +101,45 @@ export async function migrateV2(old: OldData) { ); } + return mediaMetas; +} + +export async function migrateV1Bookmarks(old: OldBookmarks) { + const oldData = old; + if (!oldData) return; + + const uniqueMedias: Record = {}; + oldData.bookmarks.forEach((item: any) => { + if (uniqueMedias[item.mediaId]) return; + uniqueMedias[item.mediaId] = item; + }); + + const mediaMetas = await getMetas(uniqueMedias); + if (!mediaMetas) return; + + const bookmarks = Object.keys(mediaMetas) + .map((key) => mediaMetas[key]["0"]) + .map((t) => t?.meta) + .filter(Boolean); + + return { + bookmarks, + }; +} + +export async function migrateV2Videos(old: OldData) { + const oldData = old; + if (!oldData) return; + + const uniqueMedias: Record = {}; + oldData.items.forEach((item: any) => { + if (uniqueMedias[item.mediaId]) return; + uniqueMedias[item.mediaId] = item; + }); + + const mediaMetas = await getMetas(uniqueMedias, oldData); + if (!mediaMetas) return; + // We've got all the metadata you can dream of now // Now let's convert stuff into the new format. const newData: WatchedStoreData = { diff --git a/src/state/watched/store.ts b/src/state/watched/store.ts index 56fac9ae..84eefd67 100644 --- a/src/state/watched/store.ts +++ b/src/state/watched/store.ts @@ -1,5 +1,5 @@ import { createVersionedStore } from "@/utils/storage"; -import { migrateV2, OldData } from "./migrations/v2"; +import { migrateV2Videos, OldData } from "./migrations/v2"; import { WatchedStoreData } from "./types"; export const VideoProgressStore = createVersionedStore() @@ -15,7 +15,7 @@ export const VideoProgressStore = createVersionedStore() .addVersion({ version: 1, async migrate(old: OldData) { - return migrateV2(old); + return migrateV2Videos(old); }, }) .addVersion({