diff --git a/materialious/src/lib/components/settings/ExportImport.svelte b/materialious/src/lib/components/settings/ExportImport.svelte
index 982423cf..4e58c8be 100644
--- a/materialious/src/lib/components/settings/ExportImport.svelte
+++ b/materialious/src/lib/components/settings/ExportImport.svelte
@@ -8,7 +8,7 @@
import { getSubscriptionsInvidious } from '$lib/api/invidious/feed';
import { backendInUseStore, invidiousAuthStore, invidiousInstanceStore } from '$lib/store';
import { Clipboard } from '@capacitor/clipboard';
- import { settingsToJson } from '$lib/externalSettings';
+ import { loadSettingsFromFile, settingsToJson } from '$lib/externalSettings';
import { downloadStringAsFile } from '$lib/misc';
async function importInvidiousSubs() {
@@ -147,7 +147,7 @@
}}
>
content_copy
- {$_('copy')}
+ {$_('layout.export.exportToClipboard')}
+
+
+
+
+
+ {
+ const files = (event.target as HTMLInputElement).files;
+ if (files?.length === 0 || !files) return;
+
+ await loadSettingsFromFile(files[0]);
+ }}
+ type="file"
+ />
+
diff --git a/materialious/src/lib/externalSettings/index.ts b/materialious/src/lib/externalSettings/index.ts
index 6eb3109f..cb88cf87 100644
--- a/materialious/src/lib/externalSettings/index.ts
+++ b/materialious/src/lib/externalSettings/index.ts
@@ -80,6 +80,21 @@ function setStores(toSet: Record, overwriteExisting = false) {
}
}
+export async function loadSettingsFromFile(file: File) {
+ const fileContents = await file.text();
+
+ let fileJson: Record | undefined;
+ try {
+ fileJson = JSON.parse(fileContents);
+ } catch {
+ // Handled outside of catch.
+ }
+
+ if (!fileJson) return;
+
+ setStores(fileJson, true);
+}
+
export function loadSettingsFromEnv() {
const defaultSettings = getPublicEnv('DEFAULT_SETTINGS');
diff --git a/materialious/src/lib/i18n/locales/en.json b/materialious/src/lib/i18n/locales/en.json
index 847cb2c5..6df66699 100644
--- a/materialious/src/lib/i18n/locales/en.json
+++ b/materialious/src/lib/i18n/locales/en.json
@@ -277,7 +277,10 @@
"importSubSupported": "YouTube CSV/OPML/JSON, Invidious OPML/JSON, Freetube database & NewPipe JSON supported",
"importing": "Importing subscriptions (this will take a moment)",
"importingCompleted": "Subscriptions successfully imported",
- "exportSub": "Export subscriptions"
+ "exportSub": "Export subscriptions",
+ "exportToClipboard": "Export to clipboard",
+ "exportToFile": "Export to file",
+ "importFromFile": "Import from file"
},
"deArrow": {
"title": "DeArrow",