From 95f623922ae5effeae74b16d9661242ec2b7f664 Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Mon, 25 Apr 2022 16:56:35 +0100 Subject: [PATCH 1/2] Begin data migration --- src/state/watched/store.ts | 56 +++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/state/watched/store.ts b/src/state/watched/store.ts index 25bd42bc..4c50b173 100644 --- a/src/state/watched/store.ts +++ b/src/state/watched/store.ts @@ -32,6 +32,20 @@ version 0 } */ +/* +item = { + mediaId: media.mediaId, + mediaType: media.mediaType, + providerId: media.providerId, + title: media.title, + year: media.year, + percentage: 0, + progress: 0, + episodeId: media.episodeId, + seasonId: media.seasonId, +}; +*/ + export const VideoProgressStore = versionedStoreBuilder() .setKey("video-progress") .addVersion({ @@ -40,7 +54,47 @@ export const VideoProgressStore = versionedStoreBuilder() .addVersion({ version: 1, migrate(data: any) { - // TODO migration + const output: any = { items: [] as any }; + + Object.keys(data).forEach((scraperId) => { + if (scraperId === "--version") return; + if (scraperId === "save") return; + + if (data[scraperId].movie) { + Object.keys(data[scraperId].movie).forEach((movieId) => { + output.items.push({ + mediaId: movieId.includes("player.php") ? movieId.split("player.php%3Fimdb%3D")[1] : movieId, + mediaType: "movie", + providerId: scraperId, + title: data[scraperId].movie[movieId].full.meta.title, + year: data[scraperId].movie[movieId].full.meta.year, + progress: data[scraperId].movie[movieId].full.currentlyAt, + percentage: Math.round((data[scraperId].movie[movieId].full.currentlyAt / data[scraperId].movie[movieId].full.totalDuration) * 100) + }); + }); + } + + if (data[scraperId].show) { + Object.keys(data[scraperId].show).forEach((showId) => { + Object.keys(data[scraperId].show[showId]).forEach((episodeId) => { + output.items.push({ + mediaId: showId, + mediaType: "series", + providerId: scraperId, + title: data[scraperId].show[showId][episodeId].meta.title, + year: data[scraperId].show[showId][episodeId].meta.year, + percentage: Math.round((data[scraperId].show[showId][episodeId].currentlyAt / data[scraperId].show[showId][episodeId].totalDuration) * 100), + progress: data[scraperId].show[showId][episodeId].currentlyAt, + episodeId: data[scraperId].show[showId][episodeId].show.episode, + seasonId: data[scraperId].show[showId][episodeId].show.season, + }); + }); + }); + } + }); + + console.log(output); + return output; }, create() { return { From 008c91b0fe187aedec1c7781a98960e7fdd3e2bd Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Mon, 25 Apr 2022 19:56:29 +0100 Subject: [PATCH 2/2] Finish data migration --- src/state/bookmark/store.ts | 50 +++------------- src/state/watched/context.tsx | 4 +- src/state/watched/store.ts | 108 ++++++++++++---------------------- src/utils/storage.ts | 20 +++---- 4 files changed, 59 insertions(+), 123 deletions(-) diff --git a/src/state/bookmark/store.ts b/src/state/bookmark/store.ts index e3999fd6..09ffcf0e 100644 --- a/src/state/bookmark/store.ts +++ b/src/state/bookmark/store.ts @@ -1,45 +1,13 @@ import { versionedStoreBuilder } from 'utils/storage'; -/* -version 0 -{ - [{scraperid}]: { - movie: { - [{movie-id}]: { - full: { - currentlyAt: number, - totalDuration: number, - updatedAt: number, // unix timestamp in ms - meta: FullMetaObject, // no idea whats in here - } - } - }, - show: { - [{show-id}]: { - [{season}-{episode}]: { - currentlyAt: number, - totalDuration: number, - updatedAt: number, // unix timestamp in ms - show: { - episode: string, - season: string, - }, - meta: FullMetaObject, // no idea whats in here - } - } - } - } -} -*/ - export const BookmarkStore = versionedStoreBuilder() - .setKey('mw-bookmarks') - .addVersion({ - version: 0, - create() { - return { - bookmarks: [] - } + .setKey('mw-bookmarks') + .addVersion({ + version: 0, + create() { + return { + bookmarks: [] } - }) - .build() + } + }) + .build() diff --git a/src/state/watched/context.tsx b/src/state/watched/context.tsx index 94558c26..dc7fe136 100644 --- a/src/state/watched/context.tsx +++ b/src/state/watched/context.tsx @@ -14,7 +14,7 @@ interface WatchedStoreItem extends MWMediaMeta { percentage: number; } -interface WatchedStoreData { +export interface WatchedStoreData { items: WatchedStoreItem[]; } @@ -38,7 +38,7 @@ export function getWatchedFromPortable( } const WatchedContext = createContext({ - updateProgress: () => {}, + updateProgress: () => { }, getFilteredWatched: () => [], watched: { items: [], diff --git a/src/state/watched/store.ts b/src/state/watched/store.ts index 4c50b173..5acd4ef0 100644 --- a/src/state/watched/store.ts +++ b/src/state/watched/store.ts @@ -1,50 +1,6 @@ +import { MWMediaType } from "providers"; import { versionedStoreBuilder } from "utils/storage"; - -/* -version 0 -{ - [{scraperid}]: { - movie: { - [{movie-id}]: { - full: { - currentlyAt: number, - totalDuration: number, - updatedAt: number, // unix timestamp in ms - meta: FullMetaObject, // no idea whats in here - } - } - }, - show: { - [{show-id}]: { - [{season}-{episode}]: { - currentlyAt: number, - totalDuration: number, - updatedAt: number, // unix timestamp in ms - show: { - episode: string, - season: string, - }, - meta: FullMetaObject, // no idea whats in here - } - } - } - } -} -*/ - -/* -item = { - mediaId: media.mediaId, - mediaType: media.mediaType, - providerId: media.providerId, - title: media.title, - year: media.year, - percentage: 0, - progress: 0, - episodeId: media.episodeId, - seasonId: media.seasonId, -}; -*/ +import { WatchedStoreData } from "./context"; export const VideoProgressStore = versionedStoreBuilder() .setKey("video-progress") @@ -54,46 +10,58 @@ export const VideoProgressStore = versionedStoreBuilder() .addVersion({ version: 1, migrate(data: any) { - const output: any = { items: [] as any }; + const output: WatchedStoreData = { items: [] }; + + if (!data || data.constructor !== Object) + return output; Object.keys(data).forEach((scraperId) => { if (scraperId === "--version") return; if (scraperId === "save") return; - if (data[scraperId].movie) { + if (data[scraperId].movie && data[scraperId].movie.constructor === Object) { Object.keys(data[scraperId].movie).forEach((movieId) => { - output.items.push({ - mediaId: movieId.includes("player.php") ? movieId.split("player.php%3Fimdb%3D")[1] : movieId, - mediaType: "movie", - providerId: scraperId, - title: data[scraperId].movie[movieId].full.meta.title, - year: data[scraperId].movie[movieId].full.meta.year, - progress: data[scraperId].movie[movieId].full.currentlyAt, - percentage: Math.round((data[scraperId].movie[movieId].full.currentlyAt / data[scraperId].movie[movieId].full.totalDuration) * 100) - }); + try { + output.items.push({ + mediaId: movieId.includes("player.php") ? movieId.split("player.php%3Fimdb%3D")[1] : movieId, + mediaType: MWMediaType.MOVIE, + providerId: scraperId, + title: data[scraperId].movie[movieId].full.meta.title, + year: data[scraperId].movie[movieId].full.meta.year, + progress: data[scraperId].movie[movieId].full.currentlyAt, + percentage: Math.round((data[scraperId].movie[movieId].full.currentlyAt / data[scraperId].movie[movieId].full.totalDuration) * 100) + }); + } catch (err) { + console.error(`Failed to migrate movie: ${scraperId}/${movieId}`, data[scraperId].movie[movieId]); + } }); } - if (data[scraperId].show) { + if (data[scraperId].show && data[scraperId].show.constructor === Object) { Object.keys(data[scraperId].show).forEach((showId) => { + if (data[scraperId].show[showId].constructor !== Object) + return; Object.keys(data[scraperId].show[showId]).forEach((episodeId) => { - output.items.push({ - mediaId: showId, - mediaType: "series", - providerId: scraperId, - title: data[scraperId].show[showId][episodeId].meta.title, - year: data[scraperId].show[showId][episodeId].meta.year, - percentage: Math.round((data[scraperId].show[showId][episodeId].currentlyAt / data[scraperId].show[showId][episodeId].totalDuration) * 100), - progress: data[scraperId].show[showId][episodeId].currentlyAt, - episodeId: data[scraperId].show[showId][episodeId].show.episode, - seasonId: data[scraperId].show[showId][episodeId].show.season, - }); + try { + output.items.push({ + mediaId: showId, + mediaType: MWMediaType.SERIES, + providerId: scraperId, + title: data[scraperId].show[showId][episodeId].meta.title, + year: data[scraperId].show[showId][episodeId].meta.year, + percentage: Math.round((data[scraperId].show[showId][episodeId].currentlyAt / data[scraperId].show[showId][episodeId].totalDuration) * 100), + progress: data[scraperId].show[showId][episodeId].currentlyAt, + episodeId: data[scraperId].show[showId][episodeId].show.episode, + seasonId: data[scraperId].show[showId][episodeId].show.season, + }); + } catch (err) { + console.error(`Failed to migrate series: ${scraperId}/${showId}/${episodeId}`, data[scraperId].show[showId][episodeId]); + } }); }); } }); - console.log(output); return output; }, create() { diff --git a/src/utils/storage.ts b/src/utils/storage.ts index 3c82baf7..51befa7a 100644 --- a/src/utils/storage.ts +++ b/src/utils/storage.ts @@ -157,19 +157,19 @@ export function versionedStoreBuilder(): any { version, // version number update: migrate ? (data: any) => { - // update function, and increment version - migrate(data); - data["--version"] = version; // eslint-disable-line no-param-reassign - return data; - } + // update function, and increment version + const newData = migrate(data); + newData["--version"] = version; // eslint-disable-line no-param-reassign + return newData; + } : undefined, init: create ? () => { - // return an initial object - const data = create(); - data["--version"] = version; - return data; - } + // return an initial object + const data = create(); + data["--version"] = version; + return data; + } : undefined, }; return this;