Finish data migration

This commit is contained in:
James Hawkins 2022-04-25 19:56:29 +01:00
parent 95f623922a
commit 008c91b0fe
4 changed files with 59 additions and 123 deletions

View file

@ -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()

View file

@ -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<WatchedStoreDataWrapper>({
updateProgress: () => {},
updateProgress: () => { },
getFilteredWatched: () => [],
watched: {
items: [],

View file

@ -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() {

View file

@ -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;