feat(settings): upload a Google Takeout export in Settings › Account

A "YouTube history" section under YouTube access: the watch history and
the Watch later csv are dropped or picked (one request each, each file's
outcome said on its own), and the section then says what the import did
- only the counts it produced - or that it is running, failed or was cut
off by a restart. While it runs it asks again until it ends; a failed
re-read shows the failure, not the previous answer.

The drop zone the Files upload had inline is now ui/DropZone, used by
both. The e2e seed clears the account's kept Takeout videos.
This commit is contained in:
2026-10-23 18:51:05 +02:00
parent 5d9952ab1e
commit 3553eac8c4
16 changed files with 749 additions and 84 deletions
+1
View File
@@ -87,6 +87,7 @@
"purgeDiscovery": "Couldn't clear the discovery data",
"plexWatchLink": "Couldn't change the Plex watch-state sync",
"plexWatchImport": "Couldn't import the watch state from Plex",
"takeoutUpload": "Couldn't upload the Takeout file",
"shareLinkDownload": "Couldn't change whether the link allows downloading",
"shareLinkRevoke": "Couldn't revoke the link",
"shareLinkPassword": "Couldn't change the link's password",
@@ -19,6 +19,41 @@
"never": "Not imported yet",
"importing": "Importing your Plex watch history…"
},
"takeout": {
"title": "YouTube history",
"intro": "Upload “watch-history.json” from your Google Takeout export (and “Watch later-videos.csv”, if you have it). Videos known here show as watched; the rest are remembered and marked watched once they arrive here. Shorts are skipped, and nothing you set here is overwritten.",
"drop": "Drop the files here, or choose them",
"dropActive": "Drop to upload",
"uploading": "Uploading {{name}}…",
"read_one": "{{name}}: {{n}} video read",
"read_other": "{{name}}: {{n}} videos read",
"running": "Processing…",
"last": "Last import: {{when}}",
"failed": "The last import ({{when}}) failed. Upload the file again to retry.",
"interrupted": "The last import ({{when}}) was cut off by a server restart. Upload the file again to finish it.",
"newImport": "New import",
"loadFailed": "Couldn't load the last import",
"howTo": "How to export from Takeout?",
"howToBody": "At takeout.google.com select only “YouTube and YouTube Music”. In its options keep only “history” and “playlists”, and choose JSON for the history. Untick “videos”, or every video you ever uploaded comes with it.",
"count": {
"watched_one": "{{n}} watched",
"watched_other": "{{n}} watched",
"waiting_one": "{{n}} remembered",
"waiting_other": "{{n}} remembered",
"short_one": "{{n}} Short skipped",
"short_other": "{{n}} Shorts skipped",
"kept_one": "{{n}} left as you set it here",
"kept_other": "{{n}} left as you set them here",
"added_one": "{{n}} added to Watch later",
"added_other": "{{n}} added to Watch later",
"present_one": "{{n}} already in Watch later",
"present_other": "{{n}} already in Watch later",
"missing_one": "{{n}} no longer on YouTube",
"missing_other": "{{n}} no longer on YouTube",
"laterWaiting_one": "{{n}} waiting for Watch later",
"laterWaiting_other": "{{n}} waiting for Watch later"
}
},
"save": {
"saving": "Saving…",
"saved": "Settings saved",
+1
View File
@@ -87,6 +87,7 @@
"purgeDiscovery": "Nem sikerült törölni a felfedezési adatokat",
"plexWatchLink": "Nem sikerült módosítani a Plex megtekintésiállapot-szinkront",
"plexWatchImport": "Nem sikerült importálni a megtekintési állapotot a Plexből",
"takeoutUpload": "Nem sikerült feltölteni a Takeout-fájlt",
"shareLinkDownload": "Nem sikerült módosítani, hogy a link engedi-e a letöltést",
"shareLinkRevoke": "Nem sikerült visszavonni a linket",
"shareLinkPassword": "Nem sikerült módosítani a link jelszavát",
@@ -19,6 +19,41 @@
"never": "Még nincs importálva",
"importing": "Plex-előzmény importálása…"
},
"takeout": {
"title": "YouTube-előzmények",
"intro": "Töltsd fel a Google Takeout exportodból a „watch-history.json” fájlt (és ha van, a „Watch later-videos.csv” fájlt). Az itt ismert videók megnézettként jelennek meg; a többit megjegyezzük, és megnézettek lesznek, amint bekerülnek ide. A Shortsot kihagyjuk, és amit itt beállítottál, azt nem írjuk felül.",
"drop": "Húzd ide a fájlokat, vagy válaszd ki őket",
"dropActive": "Engedd el a feltöltéshez",
"uploading": "{{name}} feltöltése…",
"read_one": "{{name}}: {{n}} videó beolvasva",
"read_other": "{{name}}: {{n}} videó beolvasva",
"running": "Feldolgozás…",
"last": "Utolsó import: {{when}}",
"failed": "Az utolsó import ({{when}}) nem sikerült. Töltsd fel újra a fájlt.",
"interrupted": "Az utolsó importot ({{when}}) megszakította a szerver újraindulása. Töltsd fel újra a fájlt a befejezéshez.",
"newImport": "Új import",
"loadFailed": "Nem sikerült betölteni az utolsó importot",
"howTo": "Hogyan exportálj a Takeoutból?",
"howToBody": "A takeout.google.com oldalon csak a „YouTube és YouTube Music” kell. A beállításai közül csak az „előzmények” és a „lejátszási listák” maradjon, az előzményekhez JSON formátummal. A „videók” pipát vedd ki, különben az összes feltöltött videód is benne lesz.",
"count": {
"watched_one": "{{n}} megnézett",
"watched_other": "{{n}} megnézett",
"waiting_one": "{{n}} megjegyezve",
"waiting_other": "{{n}} megjegyezve",
"short_one": "{{n}} Short kihagyva",
"short_other": "{{n}} Short kihagyva",
"kept_one": "{{n}} úgy maradt, ahogy itt beállítottad",
"kept_other": "{{n}} úgy maradt, ahogy itt beállítottad",
"added_one": "{{n}} a „Megnézem később” listába",
"added_other": "{{n}} a „Megnézem később” listába",
"present_one": "{{n}} már a „Megnézem később” listán",
"present_other": "{{n}} már a „Megnézem később” listán",
"missing_one": "{{n}} már nincs fent a YouTube-on",
"missing_other": "{{n}} már nincs fent a YouTube-on",
"laterWaiting_one": "{{n}} vár a „Megnézem később” listára",
"laterWaiting_other": "{{n}} vár a „Megnézem később” listára"
}
},
"save": {
"saving": "Mentés…",
"saved": "Beállítások elmentve",