File size: 3,780 Bytes
de4b571
 
11fcc5a
de4b571
 
 
11fcc5a
 
de4b571
11fcc5a
de4b571
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11fcc5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
de4b571
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import type { RecursivePartial } from "$lib/types/generic";
import type {
    PartialSettings,
    AllPartialSettingsWithSchema,
    CobaltSettingsV3,
    CobaltSettingsV4,
    CobaltSettingsV5,
    CobaltSettingsV6,
} from "$lib/types/settings";
import { getBrowserLanguage } from "$lib/settings/audio-sub-language";

type Migrator = (s: AllPartialSettingsWithSchema) => AllPartialSettingsWithSchema;

const migrations: Record<number, Migrator> = {
    [3]: (settings: AllPartialSettingsWithSchema) => {
        const out = settings as RecursivePartial<CobaltSettingsV3>;
        out.schemaVersion = 3;

        if (settings?.save && "youtubeDubBrowserLang" in settings.save) {
            if (settings.save.youtubeDubBrowserLang) {
                out.save!.youtubeDubLang = getBrowserLanguage();
            }

            delete settings.save.youtubeDubBrowserLang;
        }

        return out as AllPartialSettingsWithSchema;
    },

    [4]: (settings: AllPartialSettingsWithSchema) => {
        const out = settings as RecursivePartial<CobaltSettingsV4>;
        out.schemaVersion = 4;

        if (settings?.processing) {
            if ("allowDefaultOverride" in settings.processing) {
                delete settings.processing.allowDefaultOverride;
            }
            if ("seenOverrideWarning" in settings.processing) {
                delete settings.processing.seenOverrideWarning;
            }
        }

        return out as AllPartialSettingsWithSchema;
    },

    [5]: (settings: AllPartialSettingsWithSchema) => {
        const out = settings as RecursivePartial<CobaltSettingsV5>;
        out.schemaVersion = 5;

        if (settings?.save) {
            if ("tiktokH265" in settings.save) {
                out.save!.allowH265 = settings.save.tiktokH265;
                delete settings.save.tiktokH265;
            }
            if ("twitterGif" in settings.save) {
                out.save!.convertGif = settings.save.twitterGif;
                delete settings.save.twitterGif;
            }
        }

        if (settings?.privacy) {
            if ("alwaysProxy" in settings.privacy) {
                out.save ??= {};
                out.save.alwaysProxy = settings.privacy.alwaysProxy;
                delete settings.privacy.alwaysProxy;
            }
        }

        if (settings?.appearance) {
            if ("reduceMotion" in settings.appearance) {
                out.accessibility ??= {};
                out.accessibility.reduceMotion = settings.appearance.reduceMotion;
                delete settings.appearance.reduceMotion;
            }
            if ("reduceTransparency" in settings.appearance) {
                out.accessibility ??= {};
                out.accessibility.reduceTransparency = settings.appearance.reduceTransparency;
                delete settings.appearance.reduceTransparency;
            }
        }

        return out as AllPartialSettingsWithSchema;
    },

    [6]: (settings: AllPartialSettingsWithSchema) => {
        const out = settings as RecursivePartial<CobaltSettingsV6>;
        out.schemaVersion = 6;

        if (settings?.save) {
            if ("localProcessing" in settings.save) {
                out.save!.localProcessing =
                    settings.save.localProcessing ? "preferred" : "disabled";
            }
        }

        return out as AllPartialSettingsWithSchema;
    },
};

export const migrate = (settings: AllPartialSettingsWithSchema): PartialSettings => {
    return Object.keys(migrations)
        .map(Number)
        .filter((version) => version > settings.schemaVersion)
        .reduce((settings, migrationVersion) => {
            return migrations[migrationVersion](settings);
        }, settings as AllPartialSettingsWithSchema) as PartialSettings;
};