feat(files): share a folder by link — its page lists what is in it, plays a video above the list

A /watch link may now open one of its owner's own folders (migration 0108: folder_id beside job_id,
exactly one set; a folder's links go with it). The page shows what is in the folder when it is
opened, newest first: a video or a song plays in the same player a file link has, above the list,
each keeping its own resume point; a document only downloads, never opens as a page. A file moved
out stops opening through the link at its next request. Password, expiry and stream-only work as on
a file link; the unfurl names the folder and counts its files, never their names. Source folders
and the Hub cannot be shared.

The folder menu gets "Copy link" and "Share with a link…" (the Share dialog's link half); the rail
marks a folder a live link opens.

Two fixes in the Share dialog on the way: revoking the last link no longer mints a new one at once,
and the new-link form goes back to downloadable after making a link.
This commit is contained in:
2026-10-15 02:23:24 +02:00
parent 90567718b2
commit 86712b6b0e
33 changed files with 1880 additions and 321 deletions
+3 -1
View File
@@ -118,7 +118,9 @@
"newPassword": "New password",
"savePassword": "Save",
"removePassword": "Delete",
"removePasswordConfirm": "This makes the link public — anyone with the URL can watch it without a password."
"removePasswordConfirm": "This makes the link public — anyone with the URL can watch it without a password.",
"folderTitle": "Share folder · {{name}}",
"folderLinkHint": "Anyone with the link can see the folder — no account needed. They see what is in it when they open it: files you put in later too, not the ones you take out."
},
"confirm": {
"cancelTitle": "Cancel download?",
+1
View File
@@ -199,6 +199,7 @@
"share_own": "That's already your download",
"share_password_required": "This link needs a password",
"share_unfinished": "Only a finished download can be shared",
"share_folder_kind": "Only a folder of your own can be shared by link",
"smtp_failed": "The email couldn't be sent — check the SMTP settings",
"smtp_off": "SMTP isn't configured",
"spec_not_object": "The profile's settings are malformed",
+3 -1
View File
@@ -84,7 +84,9 @@
"deleteBodyEmpty": "The folder is empty. Nothing else changes.",
"deleteBody_one": "Its file goes back to the folder it came from, and its retention starts again from today.",
"deleteBody_other": "Its {{count}} files go back to the folders they came from, and their retention starts again from today.",
"deleteAction": "Delete folder"
"deleteAction": "Delete folder",
"shareLink": "Share with a link…",
"shared": "Shared with a link"
},
"layout": {
"label": "View",
+3 -1
View File
@@ -118,7 +118,9 @@
"newPassword": "Új jelszó",
"savePassword": "Mentés",
"removePassword": "Törlés",
"removePasswordConfirm": "Ezzel a link publikus lesz — jelszó nélkül bárki megnézheti, akinek megvan az URL."
"removePasswordConfirm": "Ezzel a link publikus lesz — jelszó nélkül bárki megnézheti, akinek megvan az URL.",
"folderTitle": "Mappa megosztása · {{name}}",
"folderLinkHint": "A link birtokában bárki megnézheti a mappát — fiók nélkül is. Azt látja, ami megnyitáskor benne van: a később betett fájlokat is, a kivetteket már nem."
},
"confirm": {
"cancelTitle": "Megszakítod a letöltést?",
+1
View File
@@ -199,6 +199,7 @@
"share_own": "Ez már a te letöltésed",
"share_password_required": "Ehhez a linkhez jelszó kell",
"share_unfinished": "Csak befejezett letöltés osztható meg",
"share_folder_kind": "Linkkel csak saját mappa osztható meg",
"smtp_failed": "Nem sikerült elküldeni a levelet — ellenőrizd az SMTP-beállításokat",
"smtp_off": "Az SMTP nincs beállítva",
"spec_not_object": "A profil beállításai hibás formátumúak",
+3 -1
View File
@@ -84,7 +84,9 @@
"deleteBodyEmpty": "A mappa üres. Más nem változik.",
"deleteBody_one": "A benne lévő fájl visszakerül abba a mappába, ahonnan jött, és a megőrzési ideje mától újraindul.",
"deleteBody_other": "A benne lévő {{count}} fájl visszakerül abba a mappába, ahonnan jött, és a megőrzési idejük mától újraindul.",
"deleteAction": "Mappa törlése"
"deleteAction": "Mappa törlése",
"shareLink": "Megosztás linkkel…",
"shared": "Linkkel megosztva"
},
"layout": {
"label": "Nézet",