feat(files): the Files page — the library in one aligned list, its folders in a rail

Files is the one library: every done file, the ones shared with me, or one
folder's, picked in a side rail (sources, own folders, the storage meter) and
mirrored to ?folder=. One table with every kind of value in its own column;
Copy link, Share and Save in sight, every action on a right click: play,
cut, rename in the row, move to an own folder or back home, keep, details,
re-download, delete.

The Downloads page keeps only the queue until the tray replaces it. The old
/api/downloads library routes are gone: list shared, upload, the details
PATCH, delete, the file and the usage now live under /api/files, and a
listed file says which source it came from. The job's "expired" flag is gone
with the state it described.
This commit is contained in:
2026-10-11 05:34:25 +02:00
parent 1a1665b8ec
commit 85aa917b38
65 changed files with 2295 additions and 1044 deletions
+1 -15
View File
@@ -41,8 +41,6 @@
},
"tabs": {
"queue": "Queue",
"done": "Library",
"shared": "Shared with me",
"system": "System"
},
"status": {
@@ -51,8 +49,7 @@
"paused": "Paused",
"done": "Ready",
"error": "Failed",
"canceled": "Canceled",
"expired": "Expired"
"canceled": "Canceled"
},
"phase": {
"video": "Downloading video",
@@ -75,9 +72,6 @@
"download": "Save to my device",
"play": "Play",
"rename": "Rename",
"editDetails": "Edit details…",
"share": "Share (copy link)",
"shareManage": "Manage sharing…",
"edit": "Edit / trim…",
"redownload": "Re-download (rebuild file)",
"removeShared": "Remove from my list"
@@ -87,21 +81,13 @@
},
"empty": {
"queue": "Nothing in the queue.",
"done": "No downloads yet.",
"shared": "Nothing has been shared with you.",
"admin": "No downloads on this instance yet."
},
"usage": {
"title": "Your storage",
"items": "{{used}} / {{max}} downloads",
"unlimited": "Unlimited"
},
"source": {
"open": "Open the original page in a new tab"
},
"edit": {
"title": "Edit details",
"name": "Title",
"channel": "Channel",
"channelUrl": "Channel link",
"extraLinks": "Extra links",
+7 -1
View File
@@ -97,7 +97,13 @@
"videoReset": "Couldn't reset the video",
"watchLaterAdd": "Couldn't add it to Watch later",
"watchLaterRemove": "Couldn't remove it from Watch later",
"clearSearch": "Couldn't clear the search results"
"clearSearch": "Couldn't clear the search results",
"file": {
"rename": "Couldn't rename the file",
"move": "Couldn't move the file",
"keep": "Couldn't change whether the file is kept",
"delete": "Couldn't delete the file"
}
},
"ok": "OK",
"offline": {
+60
View File
@@ -0,0 +1,60 @@
{
"navLabel": "Files",
"searchPlaceholder": "Search files…",
"count_one": "{{count}} item",
"count_other": "{{count}} items",
"rowMenu": "File actions",
"phoneOk": "Plays on a phone too",
"rail": {
"library": "Library",
"all": "All files",
"shared": "Shared with me",
"sources": "Sources",
"own": "My folders",
"noSources": "Nothing downloaded yet",
"noOwn": "No folders of your own yet"
},
"source": {
"youtube": "YouTube",
"plex": "Plex clips",
"upload": "Uploads",
"hub": "Hub"
},
"usage": {
"title": "Storage"
},
"columns": {
"name": "Name",
"source": "Source",
"phone": "Phone",
"retention": "Keeps",
"size": "Size",
"added": "Added"
},
"retention": {
"kept": "Kept",
"never": "Kept until you delete it",
"until": "Goes on {{when}}",
"days_one": "{{count}} day",
"days_other": "{{count}} days"
},
"empty": {
"all": "No files yet.",
"folder": "This folder is empty.",
"shared": "Nothing has been shared with you.",
"search": "No file matches “{{q}}”."
},
"actions": {
"copyLink": "Copy link",
"copySourceLink": "Copy source link",
"share": "Share…",
"rename": "Rename",
"move": "Move to",
"moveHome": "Back to {{folder}}",
"noOwnFolders": "No folders of your own yet",
"keep": "Keep",
"unkeep": "Stop keeping",
"details": "Details…",
"upload": "Upload"
}
}
+1
View File
@@ -27,6 +27,7 @@
"goPlaylists": "Go to Playlists",
"goPlex": "Go to Plex",
"goNotifications": "Go to Notifications",
"goFiles": "Go to Files",
"goDownloads": "Go to Downloads",
"goStats": "Go to Stats",
"goSettings": "Go to Settings",
+1
View File
@@ -13,6 +13,7 @@
"playlists": "Playlists",
"plex": "Plex",
"notifications": "Notifications",
"files": "Files",
"downloads": "Downloads",
"stats": "Stats",
"scheduler": "Scheduler",
+1 -15
View File
@@ -41,8 +41,6 @@
},
"tabs": {
"queue": "Sor",
"done": "Könyvtár",
"shared": "Velem megosztva",
"system": "Rendszer"
},
"status": {
@@ -51,8 +49,7 @@
"paused": "Szüneteltetve",
"done": "Kész",
"error": "Sikertelen",
"canceled": "Megszakítva",
"expired": "Lejárt"
"canceled": "Megszakítva"
},
"phase": {
"video": "Videósáv letöltése",
@@ -75,9 +72,6 @@
"download": "Mentés a gépemre",
"play": "Lejátszás",
"rename": "Átnevezés",
"editDetails": "Adatok szerkesztése…",
"share": "Megosztás (link másolása)",
"shareManage": "Megosztás kezelése…",
"edit": "Szerkesztés / vágás…",
"redownload": "Újraletöltés (fájl újraépítése)",
"removeShared": "Eltávolítás a listámból"
@@ -87,21 +81,13 @@
},
"empty": {
"queue": "A sor üres.",
"done": "Még nincs letöltés.",
"shared": "Még nem osztottak meg veled semmit.",
"admin": "Ezen a példányon még nincs letöltés."
},
"usage": {
"title": "Tárhelyed",
"items": "{{used}} / {{max}} letöltés",
"unlimited": "Korlátlan"
},
"source": {
"open": "Eredeti oldal megnyitása új lapon"
},
"edit": {
"title": "Adatok szerkesztése",
"name": "Cím",
"channel": "Csatorna",
"channelUrl": "Csatorna link",
"extraLinks": "További linkek",
+7 -1
View File
@@ -97,7 +97,13 @@
"videoReset": "Nem sikerült alaphelyzetbe állítani a videót",
"watchLaterAdd": "Nem sikerült hozzáadni a Megnézem később listához",
"watchLaterRemove": "Nem sikerült eltávolítani a Megnézem később listából",
"clearSearch": "Nem sikerült törölni a keresési találatokat"
"clearSearch": "Nem sikerült törölni a keresési találatokat",
"file": {
"rename": "Nem sikerült átnevezni a fájlt",
"move": "Nem sikerült áthelyezni a fájlt",
"keep": "Nem sikerült módosítani a fájl megtartását",
"delete": "Nem sikerült törölni a fájlt"
}
},
"ok": "OK",
"offline": {
+60
View File
@@ -0,0 +1,60 @@
{
"navLabel": "Fájlok",
"searchPlaceholder": "Keresés a fájlok között…",
"count_one": "{{count}} elem",
"count_other": "{{count}} elem",
"rowMenu": "Fájl műveletei",
"phoneOk": "Telefonon is lejátszható",
"rail": {
"library": "Könyvtár",
"all": "Minden fájl",
"shared": "Megosztva velem",
"sources": "Források",
"own": "Saját mappák",
"noSources": "Még nincs letöltött fájl",
"noOwn": "Még nincs saját mappád"
},
"source": {
"youtube": "YouTube",
"plex": "Plex klipek",
"upload": "Feltöltések",
"hub": "Hub"
},
"usage": {
"title": "Tárhely"
},
"columns": {
"name": "Név",
"source": "Forrás",
"phone": "Telefon",
"retention": "Megőrzés",
"size": "Méret",
"added": "Hozzáadva"
},
"retention": {
"kept": "Megtartva",
"never": "Addig marad, amíg nem törlöd",
"until": "Törlődik: {{when}}",
"days_one": "{{count}} nap",
"days_other": "{{count}} nap"
},
"empty": {
"all": "Még nincs fájlod.",
"folder": "Ez a mappa üres.",
"shared": "Veled még nem osztottak meg semmit.",
"search": "Egy fájl sem illik erre: „{{q}}”."
},
"actions": {
"copyLink": "Link másolása",
"copySourceLink": "Forrás linkjének másolása",
"share": "Megosztás…",
"rename": "Átnevezés",
"move": "Áthelyezés",
"moveHome": "Vissza ide: {{folder}}",
"noOwnFolders": "Még nincs saját mappád",
"keep": "Megtartom",
"unkeep": "Megtartás visszavonása",
"details": "Részletek…",
"upload": "Feltöltés"
}
}
+1
View File
@@ -27,6 +27,7 @@
"goPlaylists": "Ugrás: Lejátszási listák",
"goPlex": "Ugrás: Plex",
"goNotifications": "Ugrás: Értesítések",
"goFiles": "Ugrás a Fájlokhoz",
"goDownloads": "Ugrás: Letöltések",
"goStats": "Ugrás: Statisztika",
"goSettings": "Ugrás: Beállítások",
+1
View File
@@ -13,6 +13,7 @@
"playlists": "Listák",
"plex": "Plex",
"notifications": "Értesítések",
"files": "Fájlok",
"downloads": "Letöltések",
"stats": "Statisztika",
"scheduler": "Ütemező",