@synopackageland/sdk 0.50.5 → 0.50.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -747,3 +747,7 @@ Do not add root/executor access to browser-only Apps such as OpenList.
747
747
  current administrator's DSM session. Start it after rendering the App. Refusal,
748
748
  missing session and timeout return `[]`; use package-account `dsmservices`
749
749
  reading on the backend independently. See [service ports](../docs/dsm-service-ports.md).
750
+
751
+ For private native `<audio>` / `<video>` playback, use `mediaUrl(ctx, {asset})`
752
+ with the Go media service. It renews a stable, session-bound URL without resetting
753
+ playback. See [media grants](../docs/media.md) for backend hooks and cleanup.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { c as I } from "./context-DWEbBTIr.js";
2
- import { D as TF, i as EF } from "./context-DWEbBTIr.js";
2
+ import { D as EF, i as RF } from "./context-DWEbBTIr.js";
3
3
  const w = { status: "unsupported" };
4
4
  function De(e = {}) {
5
5
  const t = { web: !0, host: "standalone-web", dsmStandalone: null, dsmLanguage: null, appLocale: null, systemVersion: null, fullVersion: null, theme: null, ...e }, a = /* @__PURE__ */ new Set();
@@ -83,12 +83,12 @@ function Me(e) {
83
83
  }
84
84
  function c(d) {
85
85
  return o = !0, a = new Promise(function(u) {
86
- var p = new AbortController(), g = !1;
87
- function f(m) {
88
- g || (g = !0, clearTimeout(h), u(m));
86
+ var g = new AbortController(), m = !1;
87
+ function p(f) {
88
+ m || (m = !0, clearTimeout(h), u(f));
89
89
  }
90
90
  var h = setTimeout(function() {
91
- p.abort(), f(void 0);
91
+ g.abort(), p(void 0);
92
92
  }, 302e3);
93
93
  try {
94
94
  e.fetch("webman/login.cgi?enable_syno_token=yes", {
@@ -97,28 +97,28 @@ function Me(e) {
97
97
  mode: "same-origin",
98
98
  redirect: "error",
99
99
  cache: "no-store",
100
- signal: p.signal
101
- }).then(function(m) {
102
- return m.ok ? m.json() : void 0;
103
- }).then(function(m) {
104
- if (!g) {
100
+ signal: g.signal
101
+ }).then(function(f) {
102
+ return f.ok ? f.json() : void 0;
103
+ }).then(function(f) {
104
+ if (!m) {
105
105
  var v = s();
106
106
  if (v && v !== d) {
107
- f(v);
107
+ p(v);
108
108
  return;
109
109
  }
110
- var $ = m && m.success === !0 ? i(m.SynoToken) : void 0;
110
+ var $ = f && f.success === !0 ? i(f.SynoToken) : void 0;
111
111
  if ($ === d && ($ = void 0), $) {
112
112
  var b = i(e.read());
113
113
  e.write && e.write($), n = b, t = $;
114
114
  }
115
- f($);
115
+ p($);
116
116
  }
117
117
  }).catch(function() {
118
- f(void 0);
118
+ p(void 0);
119
119
  });
120
120
  } catch {
121
- f(void 0);
121
+ p(void 0);
122
122
  }
123
123
  }).finally(function() {
124
124
  a = void 0;
@@ -158,7 +158,7 @@ async function Te(e) {
158
158
  function B(e) {
159
159
  throw { code: { 106: "session_required", 107: "session_required", 119: "session_required", 105: "denied", 403: "denied", 407: "denied", 408: "denied", 414: "conflict", 1805: "conflict", 400: "invalid-request" }[String(e)] ?? "unavailable" };
160
160
  }
161
- function E(e) {
161
+ function R(e) {
162
162
  if (typeof e != "string" || e.length < 2 || e.length > 4096 || !e.startsWith("/") || /[\u0000-\u001f\u007f\\,"]/.test(e) || e.split("/").slice(1).some((t) => !t || t === "." || t === "..")) throw { code: "invalid-request" };
163
163
  }
164
164
  function te(e) {
@@ -178,20 +178,20 @@ function he(e = {}) {
178
178
  }
179
179
  async function n(i, s, r, l, c, d = !1, u) {
180
180
  if (c.aborted) throw { code: "canceled" };
181
- const p = new AbortController();
182
- let g = !1, f = !1;
183
- const h = () => p.abort();
184
- c.addEventListener("abort", h, { once: !0 }), c.aborted && p.abort();
185
- const m = setTimeout(() => {
186
- f = !0, p.abort();
181
+ const g = new AbortController();
182
+ let m = !1, p = !1;
183
+ const h = () => g.abort();
184
+ c.addEventListener("abort", h, { once: !0 }), c.aborted && g.abort();
185
+ const f = setTimeout(() => {
186
+ p = !0, g.abort();
187
187
  }, e.timeout ?? I());
188
188
  let v = () => {
189
189
  };
190
190
  try {
191
191
  const $ = async () => {
192
- if (p.signal.aborted) throw { code: "canceled" };
192
+ if (g.signal.aborted) throw { code: "canceled" };
193
193
  if (e.webApi && !u) {
194
- g = !0;
194
+ m = !0;
195
195
  try {
196
196
  return await e.webApi(i, s, r, l);
197
197
  } catch (C) {
@@ -199,58 +199,58 @@ function he(e = {}) {
199
199
  throw A && B(A[1]), C;
200
200
  }
201
201
  }
202
- const T = await a(p.signal);
203
- if (p.signal.aborted) throw { code: "canceled" };
202
+ const E = await a(g.signal);
203
+ if (g.signal.aborted) throw { code: "canceled" };
204
204
  const D = u ? new FormData() : new URLSearchParams();
205
205
  for (const [C, A] of Object.entries({ api: i, method: s, version: r, ...l })) D.append(C, typeof A == "string" ? A : JSON.stringify(A));
206
- u && D.append("file", u), g = !0;
207
- const P = await fetch(pe, { method: "POST", body: D, credentials: "same-origin", mode: "same-origin", redirect: "error", cache: "no-store", signal: p.signal, headers: { "X-SYNO-TOKEN": T } });
206
+ u && D.append("file", u), m = !0;
207
+ const P = await fetch(pe, { method: "POST", body: D, credentials: "same-origin", mode: "same-origin", redirect: "error", cache: "no-store", signal: g.signal, headers: { "X-SYNO-TOKEN": E } });
208
208
  if (!P.ok) throw Error();
209
209
  const M = await Te(P);
210
210
  if (M?.success === !1 && B(M.error?.code), M?.success !== !0) throw Error();
211
211
  return M.data;
212
- }, b = new Promise((T, D) => {
213
- v = () => D({ code: f ? "timeout" : "canceled" }), p.signal.addEventListener("abort", v, { once: !0 }), p.signal.aborted && v();
212
+ }, b = new Promise((E, D) => {
213
+ v = () => D({ code: p ? "timeout" : "canceled" }), g.signal.addEventListener("abort", v, { once: !0 }), g.signal.aborted && v();
214
214
  }), z = await Promise.race([$(), b]);
215
215
  if (z?.error || Array.isArray(z?.errors) && z.errors.length) throw { code: "denied" };
216
216
  return z;
217
217
  } catch ($) {
218
218
  const b = $?.code;
219
- throw typeof b == "number" && [106, 107, 119, 105, 403, 407, 408, 414, 1805, 400].includes(b) && B(b), typeof b == "string" && ["canceled", "timeout"].includes(b) ? { code: d && g ? "commit-uncertain" : b } : typeof b == "string" && ["session_required", "dsm_session_required", "denied", "not_found", "conflict", "invalid-request", "unavailable", "commit-uncertain"].includes(b) ? { code: b } : { code: d && g ? "commit-uncertain" : f ? "timeout" : c.aborted ? "canceled" : "unavailable" };
219
+ throw typeof b == "number" && [106, 107, 119, 105, 403, 407, 408, 414, 1805, 400].includes(b) && B(b), typeof b == "string" && ["canceled", "timeout"].includes(b) ? { code: d && m ? "commit-uncertain" : b } : typeof b == "string" && ["session_required", "dsm_session_required", "denied", "not_found", "conflict", "invalid-request", "unavailable", "commit-uncertain"].includes(b) ? { code: b } : { code: d && m ? "commit-uncertain" : p ? "timeout" : c.aborted ? "canceled" : "unavailable" };
220
220
  } finally {
221
- clearTimeout(m), c.removeEventListener("abort", h), p.signal.removeEventListener("abort", v);
221
+ clearTimeout(f), c.removeEventListener("abort", h), g.signal.removeEventListener("abort", v);
222
222
  }
223
223
  }
224
224
  async function o(i, s, r, l) {
225
- i !== void 0 && E(i);
225
+ i !== void 0 && R(i);
226
226
  const c = r.limit ?? 100, d = r.sortBy ?? "name", u = r.sortDirection ?? "ASC";
227
227
  if (!Number.isSafeInteger(s) || s < 0 || s > 1e6 || !Number.isSafeInteger(c) || c < 1 || c > 100 || !["name", "size", "type", "mtime"].includes(d) || !["ASC", "DESC"].includes(u)) throw { code: "invalid-request" };
228
- const p = await n("SYNO.FileStation.List", i === void 0 ? "list_share" : "list", 2, { offset: s, limit: c, sort_by: d, sort_direction: u, additional: ["size"], ...i === void 0 ? {} : { folder_path: i } }, l), g = i === void 0 ? p?.shares ?? p?.files : p?.files;
229
- if (!Array.isArray(g) || g.length > c || !Number.isSafeInteger(p.total) || p.total < 0 || p.offset !== s || s + g.length > p.total || !g.length && s < p.total) throw { code: "unavailable" };
230
- return g.forEach(ee), p;
228
+ const g = await n("SYNO.FileStation.List", i === void 0 ? "list_share" : "list", 2, { offset: s, limit: c, sort_by: d, sort_direction: u, additional: ["size"], ...i === void 0 ? {} : { folder_path: i } }, l), m = i === void 0 ? g?.shares ?? g?.files : g?.files;
229
+ if (!Array.isArray(m) || m.length > c || !Number.isSafeInteger(g.total) || g.total < 0 || g.offset !== s || s + m.length > g.total || !m.length && s < g.total) throw { code: "unavailable" };
230
+ return m.forEach(ee), g;
231
231
  }
232
232
  return {
233
233
  token: a,
234
234
  shares: (i, s) => o(void 0, i, {}, s),
235
235
  list: (i, s, r) => o(i, s.offset ?? 0, s, r),
236
236
  async info(i, s) {
237
- E(i);
237
+ R(i);
238
238
  const r = await n("SYNO.FileStation.List", "getinfo", 2, { path: [i], additional: ["size"] }, s);
239
239
  if (!Array.isArray(r?.files) || r.files.length !== 1 || r.files[0]?.path !== i) throw { code: "not_found" };
240
240
  return ee(r.files[0]);
241
241
  },
242
242
  async createFolder(i, s, r) {
243
- return E(i), te(s), await n("SYNO.FileStation.CreateFolder", "create", 2, { folder_path: [i], name: [s], force_parent: !1 }, r, !0), { created: !0 };
243
+ return R(i), te(s), await n("SYNO.FileStation.CreateFolder", "create", 2, { folder_path: [i], name: [s], force_parent: !1 }, r, !0), { created: !0 };
244
244
  },
245
245
  // Display/preview only. A successful browser result never authorizes a
246
246
  // backend write or grant; the executor independently checks its subject.
247
247
  async checkPermission(i, s) {
248
- E(i);
248
+ R(i);
249
249
  const r = Array.from(crypto.getRandomValues(new Uint8Array(16)), (c) => c.toString(16).padStart(2, "0")).join("");
250
250
  if ((await n("SYNO.FileStation.CheckPermission", "write", 3, { path: i, filename: `.synopkgland-permission-probe-${r}`, overwrite: !1, size: 0 }, s))?.blSkip !== !1) throw { code: "denied" };
251
251
  },
252
252
  async upload(i, s, r) {
253
- if (E(i), te(s.name), !Number.isSafeInteger(s.size) || s.size < 0 || s.size > qe) throw { code: "upload_size_required" };
253
+ if (R(i), te(s.name), !Number.isSafeInteger(s.size) || s.size < 0 || s.size > qe) throw { code: "upload_size_required" };
254
254
  await n("SYNO.FileStation.Upload", "upload", 2, { path: i, create_parents: !1, overwrite: !1, size: s.size }, r, !0, s);
255
255
  }
256
256
  };
@@ -863,7 +863,7 @@ function Ze(e = {}) {
863
863
  let o = !1;
864
864
  return {
865
865
  async download(i) {
866
- if (E(i), o) throw { code: "canceled" };
866
+ if (R(i), o) throw { code: "canceled" };
867
867
  const s = await t.token();
868
868
  if (o) throw { code: "canceled" };
869
869
  const r = document.createElement("iframe");
@@ -875,9 +875,9 @@ function Ze(e = {}) {
875
875
  c.httpEquiv = "Content-Security-Policy", c.content = "default-src 'none'; form-action 'self'; base-uri 'none'", l.head.append(c);
876
876
  const d = l.createElement("form");
877
877
  d.method = "POST", d.action = `${location.origin}${pe}?${new URLSearchParams({ SynoToken: s })}`;
878
- for (const [u, p] of Object.entries({ api: "SYNO.FileStation.Download", method: "download", version: "2", path: JSON.stringify([i]), mode: "download" })) {
879
- const g = l.createElement("input");
880
- g.type = "hidden", g.name = u, g.value = p, d.append(g);
878
+ for (const [u, g] of Object.entries({ api: "SYNO.FileStation.Download", method: "download", version: "2", path: JSON.stringify([i]), mode: "download" })) {
879
+ const m = l.createElement("input");
880
+ m.type = "hidden", m.name = u, m.value = g, d.append(m);
881
881
  }
882
882
  l.body.append(d);
883
883
  try {
@@ -935,35 +935,35 @@ function Qe(e) {
935
935
  }
936
936
  async function r(l, c, d, u = !1) {
937
937
  (t || d.aborted) && _("canceled");
938
- let p = () => {
938
+ let g = () => {
939
939
  };
940
- const g = new Promise((v, $) => {
940
+ const m = new Promise((v, $) => {
941
941
  const b = () => $({ code: u ? "commit-uncertain" : "canceled" }), z = setTimeout(() => $({ code: u ? "commit-uncertain" : "timeout" }), I(e.requestTimeout));
942
- d.addEventListener("abort", b, { once: !0 }), a.signal.addEventListener("abort", b, { once: !0 }), p = () => {
942
+ d.addEventListener("abort", b, { once: !0 }), a.signal.addEventListener("abort", b, { once: !0 }), g = () => {
943
943
  clearTimeout(z), d.removeEventListener("abort", b), a.signal.removeEventListener("abort", b);
944
944
  };
945
- }), f = new AbortController(), h = () => f.abort();
945
+ }), p = new AbortController(), h = () => p.abort();
946
946
  d.addEventListener("abort", h, { once: !0 }), a.signal.addEventListener("abort", h, { once: !0 });
947
- async function m() {
948
- switch (await s(), f.signal.aborted && _("canceled"), l) {
947
+ async function f() {
948
+ switch (await s(), p.signal.aborted && _("canceled"), l) {
949
949
  case "nas.files.shares":
950
- return o.shares(c.offset, f.signal);
950
+ return o.shares(c.offset, p.signal);
951
951
  case "nas.files.list":
952
- return o.list(c.path, c, f.signal);
952
+ return o.list(c.path, c, p.signal);
953
953
  case "nas.files.info":
954
- return o.info(c.path, f.signal);
954
+ return o.info(c.path, p.signal);
955
955
  case "nas.files.create_folder":
956
- return o.createFolder(c.parent, c.name, f.signal);
956
+ return o.createFolder(c.parent, c.name, p.signal);
957
957
  }
958
958
  _("unsupported");
959
959
  }
960
960
  try {
961
- return await Promise.race([m(), g]);
961
+ return await Promise.race([f(), m]);
962
962
  } catch (v) {
963
963
  const $ = v?.code;
964
964
  J(v) && _(J(v)), [407, 408, "407", "408", "denied"].includes($) && _("denied"), ($ === "cross_origin" || $ === "origin_required") && _("origin-refused"), ($ === "request_timeout" || $ === "request_canceled") && _(u ? "commit-uncertain" : $ === "request_timeout" ? "timeout" : "canceled"), _(typeof $ == "string" && ["session_required", "dsm_session_required", "auth_unavailable", "denied", "not_found", "conflict", "invalid-request", "unavailable", "unknown_method", "unsupported", "commit-uncertain", "canceled", "timeout"].includes($) ? $ : u ? "commit-uncertain" : "unavailable");
965
965
  } finally {
966
- p(), f.abort(), d.removeEventListener("abort", h), a.signal.removeEventListener("abort", h);
966
+ g(), p.abort(), d.removeEventListener("abort", h), a.signal.removeEventListener("abort", h);
967
967
  }
968
968
  }
969
969
  return {
@@ -977,8 +977,8 @@ function Qe(e) {
977
977
  return ae(await r("nas.files.shares", { offset: l }, c), l, 100);
978
978
  },
979
979
  async list(l, c, d) {
980
- const u = c.offset ?? 0, p = c.limit ?? 100;
981
- return ae(await r("nas.files.list", { path: l, ...c, offset: u, limit: p }, d), u, p);
980
+ const u = c.offset ?? 0, g = c.limit ?? 100;
981
+ return ae(await r("nas.files.list", { path: l, ...c, offset: u, limit: g }, d), u, g);
982
982
  },
983
983
  async info(l, c) {
984
984
  return ve(await r("nas.files.info", { path: l }, c));
@@ -3244,7 +3244,7 @@ const Sj = "Speichern im Hintergrund", _j = "Nach Ihrer Abmeldung speichert dies
3244
3244
  approve: kx,
3245
3245
  confirmChange: Dx,
3246
3246
  password: Cx
3247
- }, Mx = "Guardados en segundo plano", qx = "Después de cerrar sesión, esta aplicación sigue guardando archivos completos en la carpeta que elija. Los archivos existentes nunca se reemplazan", Tx = "Permitir que esta aplicación guarde aquí después de cerrar sesión, hasta que revoque el acceso", Ex = "Revocar acceso", Rx = "Elegir carpeta", Lx = "Un administrador debe aprobar los guardados en segundo plano antes de que pueda elegir una carpeta", Ix = "Activar guardados en segundo plano", jx = "Los guardados en segundo plano están desactivados. Un administrador puede activarlos; después deberá elegir de nuevo un destino", xx = "El resultado es desconocido. Revise esta tarea original y el destino antes de realizar otra acción. Esta aplicación no volverá a guardarlo automáticamente", Nx = "Se denegó el acceso. Compruebe los permisos de la carpeta y vuelva a elegir el destino", Ux = "No tiene permiso para escribir en esta carpeta. Cuando se restablezca el permiso, vuelva a guardar; no necesita elegir la carpeta de nuevo", Ox = "No tiene permiso para escribir en esta carpeta, por lo que no se autorizó. Elija otra carpeta o vuelva a elegir esta cuando se restablezca el permiso", Fx = "La carpeta de destino ya no existe. Vuelva a moverla a su sitio para guardar allí de nuevo, o elija otro destino", Hx = "Los privilegios de aplicaciones de DSM no le permiten usar esta aplicación desde esta dirección. Pida a un administrador que cambie la regla o vuelva a guardar desde una dirección permitida", Bx = "Los privilegios de aplicaciones de DSM no le permiten usar esta aplicación desde esta dirección. Pida a un administrador que cambie la regla o vuelva a elegir la carpeta desde una dirección permitida", Wx = "Vuelva a iniciar sesión en DSM y luego actualice", Vx = "Ya existe un archivo con este nombre. Revise el destino y elija otro nombre para una tarea nueva", Jx = "No hay suficiente espacio. Revise el destino antes de iniciar una tarea nueva", Kx = "No se pudo confirmar la acción. Actualice para comprobar el resultado actual antes de realizar otra acción", Gx = "El ámbito permitido cambió. Vuelva a elegir su carpeta de guardado. Los archivos guardados se conservan", Zx = "Guardar archivo de ejemplo", Yx = "Guarde un pequeño archivo de ejemplo en el destino activo con sus propios permisos", Qx = "Volver a intentar", Xx = "Carpeta de guardado", eN = "Sin elegir", tN = "Cancelar", nN = "Cambiar la carpeta de destino requiere su contraseña de usuario y revoca las autorizaciones de destino de todos los usuarios. Los archivos guardados se conservan", oN = "Los usuarios solo pueden elegir dónde guardar dentro de esta carpeta", aN = "Aprobar", iN = "Confirmar cambio", sN = "Contraseña de usuario", rN = {
3247
+ }, Mx = "Guardados en segundo plano", qx = "Después de cerrar sesión, esta aplicación sigue guardando archivos completos en la carpeta que elija. Los archivos existentes nunca se reemplazan", Tx = "Permitir que esta aplicación guarde aquí después de cerrar sesión, hasta que revoque el acceso", Ex = "Revocar acceso", Rx = "Elegir carpeta", Lx = "Un administrador debe aprobar los guardados en segundo plano antes de que pueda elegir una carpeta", Ix = "Activar guardados en segundo plano", jx = "Los guardados en segundo plano están desactivados. Un administrador puede activarlos; después deberá elegir de nuevo un destino", xx = "El resultado es desconocido. Revise esta tarea original y el destino antes de realizar otra acción. Esta aplicación no volverá a guardarlo automáticamente", Nx = "Se denegó el acceso. Compruebe los permisos de la carpeta y vuelva a elegir el destino", Ux = "No tiene permiso para escribir en esta carpeta. Cuando se restablezca el permiso, vuelva a guardar; no necesita elegir la carpeta de nuevo", Ox = "No tiene permiso para escribir en esta carpeta, por lo que no se autorizó. Elija otra carpeta o vuelva a elegir esta cuando se restablezca el permiso", Fx = "La carpeta de destino ya no existe. Vuelva a moverla a su sitio para guardar allí de nuevo, o elija otro destino", Hx = "Los privilegios de aplicaciones de DSM no le permiten usar esta aplicación desde esta dirección. Pida a un administrador que cambie la regla o vuelva a guardar desde una dirección permitida", Bx = "Los privilegios de aplicaciones de DSM no le permiten usar esta aplicación desde esta dirección. Pida a un administrador que cambie la regla o vuelva a elegir la carpeta desde una dirección permitida", Wx = "Vuelva a iniciar sesión en DSM y luego actualice", Vx = "Ya existe un archivo con este nombre. Revise el destino y elija otro nombre para una tarea nueva", Jx = "No hay suficiente espacio. Revise el destino antes de iniciar una tarea nueva", Kx = "No se pudo confirmar la acción. Actualice para comprobar el resultado actual antes de realizar otra acción", Gx = "El ámbito permitido cambió. Vuelva a elegir su carpeta de guardado. Los archivos guardados se conservan", Zx = "Guardar archivo de ejemplo", Yx = "Guarde un pequeño archivo de ejemplo en el destino activo con sus propios permisos", Qx = "Volver a intentar", Xx = "Carpeta de guardado", e0 = "Sin elegir", t0 = "Cancelar", n0 = "Cambiar la carpeta de destino requiere su contraseña de usuario y revoca las autorizaciones de destino de todos los usuarios. Los archivos guardados se conservan", o0 = "Los usuarios solo pueden elegir dónde guardar dentro de esta carpeta", a0 = "Aprobar", i0 = "Confirmar cambio", s0 = "Contraseña de usuario", r0 = {
3248
3248
  title: Mx,
3249
3249
  help: qx,
3250
3250
  selection: Tx,
@@ -3269,114 +3269,114 @@ const Sj = "Speichern im Hintergrund", _j = "Nach Ihrer Abmeldung speichert dies
3269
3269
  exampleHelp: Yx,
3270
3270
  retry: Qx,
3271
3271
  folder: Xx,
3272
- folderNone: eN,
3273
- cancelChange: tN,
3274
- changeHelp: nN,
3275
- approveHelp: oN,
3276
- approve: aN,
3277
- confirmChange: iN,
3278
- password: sN
3279
- }, cN = "Enregistrements en arrière-plan", lN = "Après votre déconnexion, cette application continue d’enregistrer des fichiers entiers dans le dossier choisi. Les fichiers existants ne sont jamais remplacés", dN = "Autoriser cette application à enregistrer ici après votre déconnexion, jusqu’à ce que vous révoquiez l’accès", uN = "Révoquer l’accès", pN = "Choisir un dossier", hN = "Un administrateur doit approuver les enregistrements en arrière-plan avant que vous puissiez choisir un dossier", gN = "Activer les enregistrements en arrière-plan", mN = "Les enregistrements en arrière-plan sont désactivés. Un administrateur peut les activer ; vous devrez ensuite choisir à nouveau une destination", fN = "Le résultat est inconnu. Vérifiez cette tâche d’origine et la destination avant toute autre action. Cette application ne l’enregistrera pas à nouveau automatiquement", $N = "L’accès a été refusé. Vérifiez les autorisations du dossier, puis choisissez à nouveau la destination", vN = "Vous n'avez pas l'autorisation d'écrire dans ce dossier. Une fois l'autorisation rétablie, enregistrez à nouveau ; inutile de choisir à nouveau le dossier", bN = "Vous n'avez pas l'autorisation d'écrire dans ce dossier ; il n’a donc pas été autorisé. Choisissez un autre dossier, ou choisissez à nouveau celui-ci une fois l'autorisation rétablie", SN = "Le dossier de destination n'existe plus. Remettez-le en place pour y enregistrer à nouveau, ou choisissez une autre destination", _N = "Les privilèges d’application de DSM ne vous autorisent pas à utiliser cette application depuis cette adresse. Demandez à un administrateur de modifier la règle ou enregistrez à nouveau depuis une adresse autorisée", zN = "Les privilèges d’application de DSM ne vous autorisent pas à utiliser cette application depuis cette adresse. Demandez à un administrateur de modifier la règle ou choisissez à nouveau le dossier depuis une adresse autorisée", yN = "Reconnectez-vous à DSM, puis actualisez", AN = "Un fichier portant ce nom existe déjà. Vérifiez la destination et choisissez un autre nom pour une nouvelle tâche", wN = "L’espace est insuffisant. Vérifiez la destination avant de lancer une nouvelle tâche", kN = "L’action n’a pas pu être confirmée. Actualisez pour vérifier le résultat actuel avant toute autre action", DN = "La portée autorisée a changé. Choisissez à nouveau votre dossier d’enregistrement. Les fichiers enregistrés sont conservés", CN = "Enregistrer un fichier d’exemple", PN = "Enregistrez un petit fichier exemple dans la destination active avec vos propres autorisations", MN = "Réessayer", qN = "Dossier d’enregistrement", TN = "Non choisi", EN = "Annuler", RN = "La modification du dossier nécessite votre mot de passe utilisateur et révoque les autorisations de destination de tous les utilisateurs. Les fichiers enregistrés sont conservés", LN = "Les utilisateurs ne peuvent choisir un emplacement d’enregistrement que dans ce dossier", IN = "Approuver", jN = "Confirmer la modification", xN = "Mot de passe utilisateur", NN = {
3280
- title: cN,
3281
- help: lN,
3282
- selection: dN,
3283
- revoke: uN,
3284
- choose: pN,
3285
- needs: hN,
3286
- enable: gN,
3287
- disabled: mN,
3288
- uncertainHelp: fN,
3289
- denied: $N,
3290
- permission: vN,
3291
- permissionSelect: bN,
3292
- missing: SN,
3293
- appPrivilege: _N,
3294
- appPrivilegeSelect: zN,
3295
- session: yN,
3296
- conflict: AN,
3297
- space: wN,
3298
- error: kN,
3299
- reselect: DN,
3300
- example: CN,
3301
- exampleHelp: PN,
3302
- retry: MN,
3303
- folder: qN,
3304
- folderNone: TN,
3305
- cancelChange: EN,
3306
- changeHelp: RN,
3307
- approveHelp: LN,
3308
- approve: IN,
3309
- confirmChange: jN,
3310
- password: xN
3311
- }, UN = "Salvataggi in background", ON = "Dopo la disconnessione, questa app continua a salvare file interi nella cartella scelta. I file esistenti non vengono mai sostituiti", FN = "Consentire a questa app di salvare qui dopo la disconnessione, fino alla revoca dell’accesso", HN = "Revoca accesso", BN = "Scegli cartella", WN = "Un amministratore deve approvare i salvataggi in background prima di poter scegliere una cartella", VN = "Attiva salvataggi in background", JN = "I salvataggi in background sono disattivati. Un amministratore può attivarli; sarà poi necessario scegliere di nuovo una destinazione", KN = "Il risultato è sconosciuto. Controllare questo processo originale e la destinazione prima di intraprendere altre azioni. Questa app non lo salverà di nuovo automaticamente", GN = "Accesso negato. Controllare le autorizzazioni della cartella, quindi scegliere di nuovo la destinazione", ZN = "Autorizzazione di scrittura mancante per questa cartella. Dopo il ripristino dell'autorizzazione, salvare di nuovo; non è necessario scegliere di nuovo la cartella", YN = "Autorizzazione di scrittura mancante per questa cartella, quindi la cartella non è stata autorizzata. Scegliere un'altra cartella oppure sceglierla di nuovo dopo il ripristino dell'autorizzazione", QN = "La cartella di destinazione non esiste più. Riportarla al suo posto per salvarvi di nuovo, oppure scegliere un'altra destinazione", XN = "I privilegi delle applicazioni DSM non consentono di usare questa app da questo indirizzo. Chiedere a un amministratore di modificare la regola oppure salvare di nuovo da un indirizzo consentito", e0 = "I privilegi delle applicazioni DSM non consentono di usare questa app da questo indirizzo. Chiedere a un amministratore di modificare la regola oppure scegliere di nuovo la cartella da un indirizzo consentito", t0 = "Accedere di nuovo a DSM, quindi aggiornare", n0 = "Esiste già un file con questo nome. Controllare la destinazione e scegliere un altro nome per un nuovo processo", o0 = "Spazio insufficiente. Controllare la destinazione prima di avviare un nuovo processo", a0 = "Impossibile confermare l’azione. Aggiornare per controllare il risultato attuale prima di intraprendere altre azioni", i0 = "L’ambito consentito è cambiato. Scegliere di nuovo la cartella di salvataggio. I file salvati restano", s0 = "Salva file di esempio", r0 = "Salvare un piccolo file di esempio nella destinazione attiva con le proprie autorizzazioni", c0 = "Riprova", l0 = "Cartella di salvataggio", d0 = "Non scelta", u0 = "Annulla", p0 = "La modifica della cartella richiede la password utente e revoca le autorizzazioni di destinazione di tutti gli utenti. I file salvati rimangono", h0 = "Gli utenti possono scegliere dove salvare solo all’interno di questa cartella", g0 = "Approva", m0 = "Conferma modifica", f0 = "Password utente", $0 = {
3312
- title: UN,
3313
- help: ON,
3314
- selection: FN,
3315
- revoke: HN,
3316
- choose: BN,
3317
- needs: WN,
3318
- enable: VN,
3319
- disabled: JN,
3320
- uncertainHelp: KN,
3321
- denied: GN,
3322
- permission: ZN,
3323
- permissionSelect: YN,
3324
- missing: QN,
3325
- appPrivilege: XN,
3326
- appPrivilegeSelect: e0,
3327
- session: t0,
3328
- conflict: n0,
3329
- space: o0,
3330
- error: a0,
3331
- reselect: i0,
3332
- example: s0,
3333
- exampleHelp: r0,
3334
- retry: c0,
3335
- folder: l0,
3336
- folderNone: d0,
3337
- cancelChange: u0,
3338
- changeHelp: p0,
3339
- approveHelp: h0,
3340
- approve: g0,
3341
- confirmChange: m0,
3342
- password: f0
3343
- }, v0 = "バックグラウンド保存", b0 = "サインアウト後も、このアプリは選択したフォルダにファイル全体を保存し続けます。既存のファイルは置き換えられません", S0 = "アクセスを取り消すまで、サインアウト後もこのアプリがここに保存することを許可します", _0 = "アクセスを取り消す", z0 = "フォルダを選択", y0 = "フォルダを選択するには、管理者がバックグラウンド保存を承認する必要があります", A0 = "バックグラウンド保存を有効にする", w0 = "バックグラウンド保存は無効です。管理者が有効にできます。その後、保存先を選び直す必要があります", k0 = "結果が不明です。次の操作を行う前に、この元のジョブと保存先を確認してください。このアプリが自動的に再保存することはありません", D0 = "アクセスが拒否されました。フォルダの権限を確認してから、保存先を選び直してください", C0 = "このフォルダへの書き込み権限がありません。権限が戻ったらもう一度保存してください。フォルダを選び直す必要はありません", P0 = "このフォルダへの書き込み権限がないため、このフォルダは承認されませんでした。別のフォルダを選ぶか、権限が戻ってからこのフォルダを選び直してください", M0 = "保存先フォルダが存在しません。元の場所に戻すと再び保存できます。または別の保存先を選択してください", q0 = "DSM のアプリケーション権限で、このアドレスからこのアプリを使用することが許可されていません。管理者にルールの変更を依頼するか、許可されたアドレスからもう一度保存してください", T0 = "DSM のアプリケーション権限で、このアドレスからこのアプリを使用することが許可されていません。管理者にルールの変更を依頼するか、許可されたアドレスからフォルダを選び直してください", E0 = "DSM に再度サインインしてから、最新の情報に更新してください", R0 = "同じ名前のファイルがすでに存在します。保存先を確認し、新しいジョブには別の名前を選んでください", L0 = "空き容量が不足しています。新しいジョブを開始する前に保存先を確認してください", I0 = "操作の結果を確認できませんでした。次の操作を行う前に、最新の情報に更新して現在の結果を確認してください", j0 = "許可する範囲が変更されました。保存フォルダを選び直してください。保存済みのファイルは残ります", x0 = "サンプルファイルを保存", N0 = "自分の権限で小さなサンプルファイルを現在の保存先に保存します", U0 = "再試行", O0 = "保存フォルダ", F0 = "未選択", H0 = "キャンセル", B0 = "保存先フォルダの変更には ユーザーパスワードが必要です。すべてのユーザーの保存先の承認が解除されます。保存済みのファイルは残ります", W0 = "ユーザーは、このフォルダ内でのみ保存先を選択できます", V0 = "承認", J0 = "変更を確定", K0 = "ユーザーパスワード", G0 = {
3344
- title: v0,
3345
- help: b0,
3346
- selection: S0,
3347
- revoke: _0,
3348
- choose: z0,
3349
- needs: y0,
3350
- enable: A0,
3351
- disabled: w0,
3352
- uncertainHelp: k0,
3353
- denied: D0,
3354
- permission: C0,
3355
- permissionSelect: P0,
3356
- missing: M0,
3357
- appPrivilege: q0,
3358
- appPrivilegeSelect: T0,
3359
- session: E0,
3360
- conflict: R0,
3361
- space: L0,
3362
- error: I0,
3363
- reselect: j0,
3364
- example: x0,
3365
- exampleHelp: N0,
3366
- retry: U0,
3367
- folder: O0,
3368
- folderNone: F0,
3369
- cancelChange: H0,
3370
- changeHelp: B0,
3371
- approveHelp: W0,
3372
- approve: V0,
3373
- confirmChange: J0,
3374
- password: K0
3375
- }, Z0 = "백그라운드 저장", Y0 = "로그아웃한 후에도 이 앱은 선택한 폴더에 전체 파일을 계속 저장합니다. 기존 파일은 덮어쓰지 않습니다", Q0 = "액세스를 취소할 때까지 로그아웃한 후에도 이 앱이 여기에 저장하도록 허용합니다", X0 = "액세스 취소", eU = "폴더 선택", tU = "폴더를 선택하려면 먼저 관리자가 백그라운드 저장을 승인해야 합니다", nU = "백그라운드 저장 활성화", oU = "백그라운드 저장이 비활성화되었습니다. 관리자가 활성화할 수 있으며, 그 후 대상을 다시 선택해야 합니다", aU = "결과를 알 수 없습니다. 다른 작업을 하기 전에 이 원래 작업과 대상을 확인하십시오. 이 앱은 자동으로 다시 저장하지 않습니다", iU = "액세스가 거부되었습니다. 폴더 권한을 확인한 후 대상을 다시 선택하십시오", sU = "이 폴더에 쓸 권한이 없습니다. 권한이 복원되면 다시 저장하십시오. 폴더를 다시 선택할 필요는 없습니다", rU = "이 폴더에 쓸 권한이 없으므로 이 폴더가 승인되지 않았습니다. 다른 폴더를 선택하거나 권한이 복원된 후 이 폴더를 다시 선택하십시오", cU = "대상 폴더가 더 이상 없습니다. 원래 위치로 되돌리면 다시 저장할 수 있으며, 다른 대상을 선택할 수도 있습니다", lU = "DSM 응용 프로그램 권한 규칙에서 이 주소의 앱 사용을 허용하지 않습니다. 관리자에게 규칙 변경을 요청하거나 허용된 주소에서 다시 저장하십시오", dU = "DSM 응용 프로그램 권한 규칙에서 이 주소의 앱 사용을 허용하지 않습니다. 관리자에게 규칙 변경을 요청하거나 허용된 주소에서 폴더를 다시 선택하십시오", uU = "DSM에 다시 로그인한 후 새로 고치십시오", pU = "같은 이름의 파일이 이미 있습니다. 대상을 확인하고 새 작업에는 다른 이름을 선택하십시오", hU = "공간이 부족합니다. 새 작업을 시작하기 전에 대상을 확인하십시오", gU = "작업 결과를 확인할 수 없습니다. 다른 작업을 하기 전에 새로 고쳐 현재 결과를 확인하십시오", mU = "허용 범위가 변경되었습니다. 저장 폴더를 다시 선택하십시오. 저장된 파일은 유지됩니다", fU = "예제 파일 저장", $U = "자신의 권한으로 작은 예제 파일을 현재 대상에 저장합니다", vU = "재시도", bU = "저장 폴더", SU = "선택 안 함", _U = "취소", zU = "저장 폴더를 변경하려면 사용자 비밀번호가 필요하며 모든 사용자의 대상 권한이 해제됩니다. 이미 저장된 파일은 유지됩니다", yU = "사용자는 이 폴더 안에서만 저장 위치를 선택할 수 있습니다", AU = "승인", wU = "변경 확인", kU = "사용자 비밀번호", DU = {
3376
- title: Z0,
3377
- help: Y0,
3378
- selection: Q0,
3379
- revoke: X0,
3272
+ folderNone: e0,
3273
+ cancelChange: t0,
3274
+ changeHelp: n0,
3275
+ approveHelp: o0,
3276
+ approve: a0,
3277
+ confirmChange: i0,
3278
+ password: s0
3279
+ }, c0 = "Enregistrements en arrière-plan", l0 = "Après votre déconnexion, cette application continue d’enregistrer des fichiers entiers dans le dossier choisi. Les fichiers existants ne sont jamais remplacés", d0 = "Autoriser cette application à enregistrer ici après votre déconnexion, jusqu’à ce que vous révoquiez l’accès", u0 = "Révoquer l’accès", p0 = "Choisir un dossier", h0 = "Un administrateur doit approuver les enregistrements en arrière-plan avant que vous puissiez choisir un dossier", g0 = "Activer les enregistrements en arrière-plan", m0 = "Les enregistrements en arrière-plan sont désactivés. Un administrateur peut les activer ; vous devrez ensuite choisir à nouveau une destination", f0 = "Le résultat est inconnu. Vérifiez cette tâche d’origine et la destination avant toute autre action. Cette application ne l’enregistrera pas à nouveau automatiquement", $0 = "L’accès a été refusé. Vérifiez les autorisations du dossier, puis choisissez à nouveau la destination", v0 = "Vous n'avez pas l'autorisation d'écrire dans ce dossier. Une fois l'autorisation rétablie, enregistrez à nouveau ; inutile de choisir à nouveau le dossier", b0 = "Vous n'avez pas l'autorisation d'écrire dans ce dossier ; il n’a donc pas été autorisé. Choisissez un autre dossier, ou choisissez à nouveau celui-ci une fois l'autorisation rétablie", S0 = "Le dossier de destination n'existe plus. Remettez-le en place pour y enregistrer à nouveau, ou choisissez une autre destination", _0 = "Les privilèges d’application de DSM ne vous autorisent pas à utiliser cette application depuis cette adresse. Demandez à un administrateur de modifier la règle ou enregistrez à nouveau depuis une adresse autorisée", z0 = "Les privilèges d’application de DSM ne vous autorisent pas à utiliser cette application depuis cette adresse. Demandez à un administrateur de modifier la règle ou choisissez à nouveau le dossier depuis une adresse autorisée", y0 = "Reconnectez-vous à DSM, puis actualisez", A0 = "Un fichier portant ce nom existe déjà. Vérifiez la destination et choisissez un autre nom pour une nouvelle tâche", w0 = "L’espace est insuffisant. Vérifiez la destination avant de lancer une nouvelle tâche", k0 = "L’action n’a pas pu être confirmée. Actualisez pour vérifier le résultat actuel avant toute autre action", D0 = "La portée autorisée a changé. Choisissez à nouveau votre dossier d’enregistrement. Les fichiers enregistrés sont conservés", C0 = "Enregistrer un fichier d’exemple", P0 = "Enregistrez un petit fichier exemple dans la destination active avec vos propres autorisations", M0 = "Réessayer", q0 = "Dossier d’enregistrement", T0 = "Non choisi", E0 = "Annuler", R0 = "La modification du dossier nécessite votre mot de passe utilisateur et révoque les autorisations de destination de tous les utilisateurs. Les fichiers enregistrés sont conservés", L0 = "Les utilisateurs ne peuvent choisir un emplacement d’enregistrement que dans ce dossier", I0 = "Approuver", j0 = "Confirmer la modification", x0 = "Mot de passe utilisateur", N0 = {
3280
+ title: c0,
3281
+ help: l0,
3282
+ selection: d0,
3283
+ revoke: u0,
3284
+ choose: p0,
3285
+ needs: h0,
3286
+ enable: g0,
3287
+ disabled: m0,
3288
+ uncertainHelp: f0,
3289
+ denied: $0,
3290
+ permission: v0,
3291
+ permissionSelect: b0,
3292
+ missing: S0,
3293
+ appPrivilege: _0,
3294
+ appPrivilegeSelect: z0,
3295
+ session: y0,
3296
+ conflict: A0,
3297
+ space: w0,
3298
+ error: k0,
3299
+ reselect: D0,
3300
+ example: C0,
3301
+ exampleHelp: P0,
3302
+ retry: M0,
3303
+ folder: q0,
3304
+ folderNone: T0,
3305
+ cancelChange: E0,
3306
+ changeHelp: R0,
3307
+ approveHelp: L0,
3308
+ approve: I0,
3309
+ confirmChange: j0,
3310
+ password: x0
3311
+ }, U0 = "Salvataggi in background", O0 = "Dopo la disconnessione, questa app continua a salvare file interi nella cartella scelta. I file esistenti non vengono mai sostituiti", F0 = "Consentire a questa app di salvare qui dopo la disconnessione, fino alla revoca dell’accesso", H0 = "Revoca accesso", B0 = "Scegli cartella", W0 = "Un amministratore deve approvare i salvataggi in background prima di poter scegliere una cartella", V0 = "Attiva salvataggi in background", J0 = "I salvataggi in background sono disattivati. Un amministratore può attivarli; sarà poi necessario scegliere di nuovo una destinazione", K0 = "Il risultato è sconosciuto. Controllare questo processo originale e la destinazione prima di intraprendere altre azioni. Questa app non lo salverà di nuovo automaticamente", G0 = "Accesso negato. Controllare le autorizzazioni della cartella, quindi scegliere di nuovo la destinazione", Z0 = "Autorizzazione di scrittura mancante per questa cartella. Dopo il ripristino dell'autorizzazione, salvare di nuovo; non è necessario scegliere di nuovo la cartella", Y0 = "Autorizzazione di scrittura mancante per questa cartella, quindi la cartella non è stata autorizzata. Scegliere un'altra cartella oppure sceglierla di nuovo dopo il ripristino dell'autorizzazione", Q0 = "La cartella di destinazione non esiste più. Riportarla al suo posto per salvarvi di nuovo, oppure scegliere un'altra destinazione", X0 = "I privilegi delle applicazioni DSM non consentono di usare questa app da questo indirizzo. Chiedere a un amministratore di modificare la regola oppure salvare di nuovo da un indirizzo consentito", eN = "I privilegi delle applicazioni DSM non consentono di usare questa app da questo indirizzo. Chiedere a un amministratore di modificare la regola oppure scegliere di nuovo la cartella da un indirizzo consentito", tN = "Accedere di nuovo a DSM, quindi aggiornare", nN = "Esiste già un file con questo nome. Controllare la destinazione e scegliere un altro nome per un nuovo processo", oN = "Spazio insufficiente. Controllare la destinazione prima di avviare un nuovo processo", aN = "Impossibile confermare l’azione. Aggiornare per controllare il risultato attuale prima di intraprendere altre azioni", iN = "L’ambito consentito è cambiato. Scegliere di nuovo la cartella di salvataggio. I file salvati restano", sN = "Salva file di esempio", rN = "Salvare un piccolo file di esempio nella destinazione attiva con le proprie autorizzazioni", cN = "Riprova", lN = "Cartella di salvataggio", dN = "Non scelta", uN = "Annulla", pN = "La modifica della cartella richiede la password utente e revoca le autorizzazioni di destinazione di tutti gli utenti. I file salvati rimangono", hN = "Gli utenti possono scegliere dove salvare solo all’interno di questa cartella", gN = "Approva", mN = "Conferma modifica", fN = "Password utente", $N = {
3312
+ title: U0,
3313
+ help: O0,
3314
+ selection: F0,
3315
+ revoke: H0,
3316
+ choose: B0,
3317
+ needs: W0,
3318
+ enable: V0,
3319
+ disabled: J0,
3320
+ uncertainHelp: K0,
3321
+ denied: G0,
3322
+ permission: Z0,
3323
+ permissionSelect: Y0,
3324
+ missing: Q0,
3325
+ appPrivilege: X0,
3326
+ appPrivilegeSelect: eN,
3327
+ session: tN,
3328
+ conflict: nN,
3329
+ space: oN,
3330
+ error: aN,
3331
+ reselect: iN,
3332
+ example: sN,
3333
+ exampleHelp: rN,
3334
+ retry: cN,
3335
+ folder: lN,
3336
+ folderNone: dN,
3337
+ cancelChange: uN,
3338
+ changeHelp: pN,
3339
+ approveHelp: hN,
3340
+ approve: gN,
3341
+ confirmChange: mN,
3342
+ password: fN
3343
+ }, vN = "バックグラウンド保存", bN = "サインアウト後も、このアプリは選択したフォルダにファイル全体を保存し続けます。既存のファイルは置き換えられません", SN = "アクセスを取り消すまで、サインアウト後もこのアプリがここに保存することを許可します", _N = "アクセスを取り消す", zN = "フォルダを選択", yN = "フォルダを選択するには、管理者がバックグラウンド保存を承認する必要があります", AN = "バックグラウンド保存を有効にする", wN = "バックグラウンド保存は無効です。管理者が有効にできます。その後、保存先を選び直す必要があります", kN = "結果が不明です。次の操作を行う前に、この元のジョブと保存先を確認してください。このアプリが自動的に再保存することはありません", DN = "アクセスが拒否されました。フォルダの権限を確認してから、保存先を選び直してください", CN = "このフォルダへの書き込み権限がありません。権限が戻ったらもう一度保存してください。フォルダを選び直す必要はありません", PN = "このフォルダへの書き込み権限がないため、このフォルダは承認されませんでした。別のフォルダを選ぶか、権限が戻ってからこのフォルダを選び直してください", MN = "保存先フォルダが存在しません。元の場所に戻すと再び保存できます。または別の保存先を選択してください", qN = "DSM のアプリケーション権限で、このアドレスからこのアプリを使用することが許可されていません。管理者にルールの変更を依頼するか、許可されたアドレスからもう一度保存してください", TN = "DSM のアプリケーション権限で、このアドレスからこのアプリを使用することが許可されていません。管理者にルールの変更を依頼するか、許可されたアドレスからフォルダを選び直してください", EN = "DSM に再度サインインしてから、最新の情報に更新してください", RN = "同じ名前のファイルがすでに存在します。保存先を確認し、新しいジョブには別の名前を選んでください", LN = "空き容量が不足しています。新しいジョブを開始する前に保存先を確認してください", IN = "操作の結果を確認できませんでした。次の操作を行う前に、最新の情報に更新して現在の結果を確認してください", jN = "許可する範囲が変更されました。保存フォルダを選び直してください。保存済みのファイルは残ります", xN = "サンプルファイルを保存", NN = "自分の権限で小さなサンプルファイルを現在の保存先に保存します", UN = "再試行", ON = "保存フォルダ", FN = "未選択", HN = "キャンセル", BN = "保存先フォルダの変更には ユーザーパスワードが必要です。すべてのユーザーの保存先の承認が解除されます。保存済みのファイルは残ります", WN = "ユーザーは、このフォルダ内でのみ保存先を選択できます", VN = "承認", JN = "変更を確定", KN = "ユーザーパスワード", GN = {
3344
+ title: vN,
3345
+ help: bN,
3346
+ selection: SN,
3347
+ revoke: _N,
3348
+ choose: zN,
3349
+ needs: yN,
3350
+ enable: AN,
3351
+ disabled: wN,
3352
+ uncertainHelp: kN,
3353
+ denied: DN,
3354
+ permission: CN,
3355
+ permissionSelect: PN,
3356
+ missing: MN,
3357
+ appPrivilege: qN,
3358
+ appPrivilegeSelect: TN,
3359
+ session: EN,
3360
+ conflict: RN,
3361
+ space: LN,
3362
+ error: IN,
3363
+ reselect: jN,
3364
+ example: xN,
3365
+ exampleHelp: NN,
3366
+ retry: UN,
3367
+ folder: ON,
3368
+ folderNone: FN,
3369
+ cancelChange: HN,
3370
+ changeHelp: BN,
3371
+ approveHelp: WN,
3372
+ approve: VN,
3373
+ confirmChange: JN,
3374
+ password: KN
3375
+ }, ZN = "백그라운드 저장", YN = "로그아웃한 후에도 이 앱은 선택한 폴더에 전체 파일을 계속 저장합니다. 기존 파일은 덮어쓰지 않습니다", QN = "액세스를 취소할 때까지 로그아웃한 후에도 이 앱이 여기에 저장하도록 허용합니다", XN = "액세스 취소", eU = "폴더 선택", tU = "폴더를 선택하려면 먼저 관리자가 백그라운드 저장을 승인해야 합니다", nU = "백그라운드 저장 활성화", oU = "백그라운드 저장이 비활성화되었습니다. 관리자가 활성화할 수 있으며, 그 후 대상을 다시 선택해야 합니다", aU = "결과를 알 수 없습니다. 다른 작업을 하기 전에 이 원래 작업과 대상을 확인하십시오. 이 앱은 자동으로 다시 저장하지 않습니다", iU = "액세스가 거부되었습니다. 폴더 권한을 확인한 후 대상을 다시 선택하십시오", sU = "이 폴더에 쓸 권한이 없습니다. 권한이 복원되면 다시 저장하십시오. 폴더를 다시 선택할 필요는 없습니다", rU = "이 폴더에 쓸 권한이 없으므로 이 폴더가 승인되지 않았습니다. 다른 폴더를 선택하거나 권한이 복원된 후 이 폴더를 다시 선택하십시오", cU = "대상 폴더가 더 이상 없습니다. 원래 위치로 되돌리면 다시 저장할 수 있으며, 다른 대상을 선택할 수도 있습니다", lU = "DSM 응용 프로그램 권한 규칙에서 이 주소의 앱 사용을 허용하지 않습니다. 관리자에게 규칙 변경을 요청하거나 허용된 주소에서 다시 저장하십시오", dU = "DSM 응용 프로그램 권한 규칙에서 이 주소의 앱 사용을 허용하지 않습니다. 관리자에게 규칙 변경을 요청하거나 허용된 주소에서 폴더를 다시 선택하십시오", uU = "DSM에 다시 로그인한 후 새로 고치십시오", pU = "같은 이름의 파일이 이미 있습니다. 대상을 확인하고 새 작업에는 다른 이름을 선택하십시오", hU = "공간이 부족합니다. 새 작업을 시작하기 전에 대상을 확인하십시오", gU = "작업 결과를 확인할 수 없습니다. 다른 작업을 하기 전에 새로 고쳐 현재 결과를 확인하십시오", mU = "허용 범위가 변경되었습니다. 저장 폴더를 다시 선택하십시오. 저장된 파일은 유지됩니다", fU = "예제 파일 저장", $U = "자신의 권한으로 작은 예제 파일을 현재 대상에 저장합니다", vU = "재시도", bU = "저장 폴더", SU = "선택 안 함", _U = "취소", zU = "저장 폴더를 변경하려면 사용자 비밀번호가 필요하며 모든 사용자의 대상 권한이 해제됩니다. 이미 저장된 파일은 유지됩니다", yU = "사용자는 이 폴더 안에서만 저장 위치를 선택할 수 있습니다", AU = "승인", wU = "변경 확인", kU = "사용자 비밀번호", DU = {
3376
+ title: ZN,
3377
+ help: YN,
3378
+ selection: QN,
3379
+ revoke: XN,
3380
3380
  choose: eU,
3381
3381
  needs: tU,
3382
3382
  enable: nU,
@@ -3468,7 +3468,7 @@ const Sj = "Speichern im Hintergrund", _j = "Nach Ihrer Abmeldung speichert dies
3468
3468
  approve: R4,
3469
3469
  confirmChange: L4,
3470
3470
  password: I4
3471
- }, Ae = /* @__PURE__ */ k(/* @__PURE__ */ Object.assign({ "../../i18n/save/de.json": Yj, "../../i18n/save/en.json": Px, "../../i18n/save/es.json": rN, "../../i18n/save/fr.json": NN, "../../i18n/save/it.json": $0, "../../i18n/save/ja.json": G0, "../../i18n/save/ko.json": DU, "../../i18n/save/zh-CN.json": i4, "../../i18n/save/zh-TW.json": j4 }));
3471
+ }, Ae = /* @__PURE__ */ k(/* @__PURE__ */ Object.assign({ "../../i18n/save/de.json": Yj, "../../i18n/save/en.json": Px, "../../i18n/save/es.json": r0, "../../i18n/save/fr.json": N0, "../../i18n/save/it.json": $N, "../../i18n/save/ja.json": GN, "../../i18n/save/ko.json": DU, "../../i18n/save/zh-CN.json": i4, "../../i18n/save/zh-TW.json": j4 }));
3472
3472
  function x4(e = "en") {
3473
3473
  return Ae[y(e)];
3474
3474
  }
@@ -3815,9 +3815,9 @@ const se = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/, A6 = [
3815
3815
  "synologymeet"
3816
3816
  ], re = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/, w6 = ["registered", "unregistered", "cleanup-required"], k6 = { dsm_4100: "portal_alias_invalid", dsm_4102: "portal_alias_reserved", dsm_4103: "portal_alias_in_use", dsm_105: "admin_required" }, ce = (e) => e?.code;
3817
3817
  function bF(e) {
3818
- function t(h, m, v) {
3818
+ function t(h, f, v) {
3819
3819
  const $ = { state: h, canManage: v === !0, controlPanel: v !== void 0, defaultAlias: e.defaultAlias };
3820
- return h === "active" && m && ($.alias = m, $.url = `${e.location.protocol}//${e.location.host}/${encodeURIComponent(m)}/`), $;
3820
+ return h === "active" && f && ($.alias = f, $.url = `${e.location.protocol}//${e.location.host}/${encodeURIComponent(f)}/`), $;
3821
3821
  }
3822
3822
  function a(h) {
3823
3823
  return h?.state === "active" && typeof h.alias == "string" && re.test(h.alias) ? t("active", h.alias) : t(h?.state === "inactive" ? "inactive" : "unavailable");
@@ -3832,9 +3832,9 @@ function bF(e) {
3832
3832
  async function o() {
3833
3833
  try {
3834
3834
  if (!(((await e.send("SYNO.API.Info", "query", 1, { query: "SYNO.Core.AppPortal" }))?.["SYNO.Core.AppPortal"]?.maxVersion ?? 0) >= 2)) return t("unavailable", void 0, !1);
3835
- const m = await e.send("SYNO.Core.AppPortal", "get", 2, { id: e.appId, additional: ["default_setting"] });
3836
- if (m?.id !== e.appId) return t("unavailable", void 0, !1);
3837
- const v = typeof m.alias == "string" && re.test(m.alias) ? m.alias : "", $ = t(v ? "active" : "inactive", v, !0), b = m.additional?.default_setting?.alias;
3835
+ const f = await e.send("SYNO.Core.AppPortal", "get", 2, { id: e.appId, additional: ["default_setting"] });
3836
+ if (f?.id !== e.appId) return t("unavailable", void 0, !1);
3837
+ const v = typeof f.alias == "string" && re.test(f.alias) ? f.alias : "", $ = t(v ? "active" : "inactive", v, !0), b = f.additional?.default_setting?.alias;
3838
3838
  return typeof b == "string" && se.test(b) && ($.defaultAlias = b), $;
3839
3839
  } catch {
3840
3840
  return t("unavailable", void 0, !1);
@@ -3848,60 +3848,60 @@ function bF(e) {
3848
3848
  return e.isAdmin() ? t("unavailable", void 0, !1) : t("unavailable");
3849
3849
  }
3850
3850
  if (!e.isAdmin()) return a(h);
3851
- const m = w6.find(($) => $ === h?.entry);
3852
- if (!m) return t("unavailable", void 0, !1);
3853
- if (m === "registered") return { ...await o(), entry: m };
3851
+ const f = w6.find(($) => $ === h?.entry);
3852
+ if (!f) return t("unavailable", void 0, !1);
3853
+ if (f === "registered") return { ...await o(), entry: f };
3854
3854
  const v = a(h);
3855
- return { ...t(m === "unregistered" ? "inactive" : v.state, v.alias, !0), entry: m };
3855
+ return { ...t(f === "unregistered" ? "inactive" : v.state, v.alias, !0), entry: f };
3856
3856
  }
3857
3857
  let s = Promise.resolve(), r, l, c = 0;
3858
3858
  async function d() {
3859
3859
  const h = ++c;
3860
3860
  await s;
3861
- const m = e.entry ? await i() : e.isAdmin() ? await o() : await n();
3862
- return h === c && (r = m), m;
3861
+ const f = e.entry ? await i() : e.isAdmin() ? await o() : await n();
3862
+ return h === c && (r = f), f;
3863
3863
  }
3864
3864
  function u() {
3865
3865
  return l ??= d().finally(() => {
3866
3866
  l = void 0;
3867
3867
  });
3868
3868
  }
3869
- async function p(h) {
3869
+ async function g(h) {
3870
3870
  if (!e.isAdmin()) throw { code: "admin_required" };
3871
- const m = e.call(h, {});
3872
- s = m.catch(() => {
3871
+ const f = e.call(h, {});
3872
+ s = f.catch(() => {
3873
3873
  }), l = void 0;
3874
3874
  try {
3875
- await m;
3875
+ await f;
3876
3876
  } catch (v) {
3877
3877
  throw { code: ce(v) === "ADMIN_REQUIRED" ? "admin_required" : "PORTAL_FAILED" };
3878
3878
  }
3879
3879
  return d();
3880
3880
  }
3881
- async function g(h) {
3881
+ async function m(h) {
3882
3882
  if (!e.isAdmin()) throw { code: "admin_required" };
3883
3883
  try {
3884
3884
  await e.send("SYNO.Core.AppPortal", "set", 2, { id: e.appId, alias: h });
3885
- } catch (m) {
3886
- throw { code: k6[ce(m) ?? ""] ?? "portal_unavailable" };
3885
+ } catch (f) {
3886
+ throw { code: k6[ce(f) ?? ""] ?? "portal_unavailable" };
3887
3887
  }
3888
3888
  return d();
3889
3889
  }
3890
- const f = {
3890
+ const p = {
3891
3891
  messages: G4(e.locale),
3892
3892
  status: u,
3893
3893
  lastStatus: () => r,
3894
3894
  async apply(h) {
3895
3895
  if (typeof h != "string" || !se.test(h)) throw { code: "portal_alias_invalid" };
3896
3896
  if (A6.includes(h)) throw { code: "portal_alias_reserved" };
3897
- return g(h);
3897
+ return m(h);
3898
3898
  },
3899
- disable: () => g(null),
3899
+ disable: () => m(null),
3900
3900
  openControlPanel() {
3901
3901
  e.launch("SYNO.SDS.AdminCenter.Application", { fn: "SYNO.SDS.AdminCenter.Login.Main", tab: "applications" });
3902
3902
  }
3903
3903
  };
3904
- return e.entry && (f.register = () => p("portal.register"), f.unregister = () => p("portal.unregister")), u(), f;
3904
+ return e.entry && (p.register = () => g("portal.register"), p.unregister = () => g("portal.unregister")), u(), p;
3905
3905
  }
3906
3906
  const D6 = {
3907
3907
  "sharedfolder.title": "Freigegebene Ordner",
@@ -4244,17 +4244,17 @@ function _F(e) {
4244
4244
  const t = e.locale ?? "en", a = we({ call: e.call, locale: t, isAdmin: () => !1 }), n = /* @__PURE__ */ new Set();
4245
4245
  let o = [], i, s, r = 0;
4246
4246
  function l(u) {
4247
- const p = /* @__PURE__ */ new Map();
4248
- for (const g of u) p.set(JSON.stringify([g.account, g.share, g.required]), g);
4249
- o = [...p.values()];
4250
- for (const g of n) g(o);
4247
+ const g = /* @__PURE__ */ new Map();
4248
+ for (const m of u) g.set(JSON.stringify([m.account, m.share, m.required]), m);
4249
+ o = [...g.values()];
4250
+ for (const m of n) m(o);
4251
4251
  }
4252
4252
  function c(u) {
4253
4253
  if (s) return s;
4254
- const p = r;
4255
- return s = a.status().then((g) => {
4256
- const f = g.folders.filter((h) => h.state === "pending" && h.required !== "none").map((h) => ({ account: g.account, share: h.name, required: h.required }));
4257
- u && p === r ? l(f) : f.length && l([...f, ...o]);
4254
+ const g = r;
4255
+ return s = a.status().then((m) => {
4256
+ const p = m.folders.filter((h) => h.state === "pending" && h.required !== "none").map((h) => ({ account: m.account, share: h.name, required: h.required }));
4257
+ u && g === r ? l(p) : p.length && l([...p, ...o]);
4258
4258
  }).finally(() => {
4259
4259
  s = void 0;
4260
4260
  }), s;
@@ -4269,14 +4269,14 @@ function _F(e) {
4269
4269
  return c(!0);
4270
4270
  },
4271
4271
  handle(u) {
4272
- const p = U6(u);
4273
- return p ? (r++, l([...o, p]), !0) : !1;
4272
+ const g = U6(u);
4273
+ return g ? (r++, l([...o, g]), !0) : !1;
4274
4274
  },
4275
- async call(u, p, g) {
4275
+ async call(u, g, m) {
4276
4276
  try {
4277
- return await e.call(u, p, g);
4278
- } catch (f) {
4279
- throw d.handle(f), f;
4277
+ return await e.call(u, g, m);
4278
+ } catch (p) {
4279
+ throw d.handle(p), p;
4280
4280
  }
4281
4281
  },
4282
4282
  subscribe(u) {
@@ -4497,19 +4497,19 @@ function wF(e, t, a) {
4497
4497
  }
4498
4498
  };
4499
4499
  }
4500
- const K = /* @__PURE__ */ new WeakMap(), R = "[redacted]";
4500
+ const K = /* @__PURE__ */ new WeakMap(), T = "[redacted]";
4501
4501
  class ke {
4502
4502
  constructor(t) {
4503
4503
  K.set(this, t), Object.freeze(this);
4504
4504
  }
4505
4505
  toString() {
4506
- return R;
4506
+ return T;
4507
4507
  }
4508
4508
  toJSON() {
4509
- return R;
4509
+ return T;
4510
4510
  }
4511
4511
  [Symbol.toPrimitive]() {
4512
- return R;
4512
+ return T;
4513
4513
  }
4514
4514
  clear() {
4515
4515
  K.delete(this);
@@ -4533,14 +4533,14 @@ function W6(e, t = []) {
4533
4533
  }
4534
4534
  }
4535
4535
  function DF(e, t = [], a = []) {
4536
- const n = ["password", "passwd", "passphrase", "otp", "token", "secret", "authorization", "cookie", "synotoken", "sid"], o = (l) => n.includes(l.toLowerCase()) || l.toLowerCase() === "x-syno-token" || a.includes(l), i = [...t].filter(Boolean).sort((l, c) => c.length - l.length), s = (l) => i.reduce((c, d) => c.split(d).join(R), l);
4536
+ const n = ["password", "passwd", "passphrase", "otp", "token", "secret", "authorization", "cookie", "synotoken", "sid", "media_grant", "set-cookie"], o = (l) => n.includes(l.toLowerCase()) || l.toLowerCase() === "x-syno-token" || a.includes(l), i = [...t].filter(Boolean).sort((l, c) => c.length - l.length), s = (l) => i.reduce((c, d) => c.split(d).join(T), l.replace(/([?&]media_grant=)[^&#\s]*/gi, `$1${T}`));
4537
4537
  function r(l) {
4538
- return typeof l == "string" ? s(l) : Array.isArray(l) ? l.map(r) : l && typeof l == "object" ? Object.fromEntries(Object.entries(l).map(([c, d]) => [s(c), o(c) ? R : r(d)])) : l;
4538
+ return typeof l == "string" ? s(l) : Array.isArray(l) ? l.map(r) : l && typeof l == "object" ? Object.fromEntries(Object.entries(l).map(([c, d]) => [s(c), o(c) ? T : r(d)])) : l;
4539
4539
  }
4540
4540
  try {
4541
4541
  return r(JSON.parse(JSON.stringify(e)));
4542
4542
  } catch {
4543
- return R;
4543
+ return T;
4544
4544
  }
4545
4545
  }
4546
4546
  function V6(e) {
@@ -4564,44 +4564,44 @@ function V6(e) {
4564
4564
  function CF(e) {
4565
4565
  const t = e.fetch ?? globalThis.fetch, a = e.sessionRetry?.session, n = a?.token ?? e.token, o = a?.ready ?? e.ready, i = new Set(Object.entries(e.sessionRetry?.operations ?? {}).filter(([, r]) => r?.effect === "read" && r.kind === "rpc").map(([r]) => r));
4566
4566
  async function s(r, l, c) {
4567
- const d = [], u = new AbortController(), p = { code: "request_canceled", message: "request canceled" };
4568
- let g;
4569
- const f = () => {
4570
- g = p, u.abort();
4567
+ const d = [], u = new AbortController(), g = { code: "request_canceled", message: "request canceled" };
4568
+ let m;
4569
+ const p = () => {
4570
+ m = g, u.abort();
4571
4571
  }, h = setTimeout(() => {
4572
- g = { code: "request_timeout", message: "request timeout" }, u.abort();
4573
- }, I(e.requestTimeout)), m = l?.signal;
4574
- if (m?.aborted)
4575
- throw clearTimeout(h), p;
4576
- m?.addEventListener("abort", f);
4572
+ m = { code: "request_timeout", message: "request timeout" }, u.abort();
4573
+ }, I(e.requestTimeout)), f = l?.signal;
4574
+ if (f?.aborted)
4575
+ throw clearTimeout(h), g;
4576
+ f?.addEventListener("abort", p);
4577
4577
  let v;
4578
- const $ = new Promise((z, T) => {
4579
- v = () => T(g ?? p), u.signal.addEventListener("abort", v, { once: !0 });
4578
+ const $ = new Promise((z, E) => {
4579
+ v = () => E(m ?? g), u.signal.addEventListener("abort", v, { once: !0 });
4580
4580
  }), b = (z) => Promise.race([z, $]);
4581
4581
  try {
4582
- const z = W6(r, d), T = d.length > 0;
4582
+ const z = W6(r, d), E = d.length > 0;
4583
4583
  o && !n?.() && await b(o());
4584
4584
  for (let D = 0; D < 2; D++) {
4585
- if (g) throw g;
4585
+ if (m) throw m;
4586
4586
  const P = n?.(), M = await b(t(e.endpoint, { method: "POST", mode: "same-origin", credentials: "same-origin", redirect: "error", cache: "no-store", headers: { "Content-Type": "application/json", ...P ? { "X-SYNO-TOKEN": P } : {} }, body: z, signal: u.signal })), C = await b(M.json());
4587
4587
  if (M.ok === !1 || !C || typeof C != "object" || !("success" in C)) throw { code: "bad_response", message: "unexpected response" };
4588
4588
  const A = C;
4589
4589
  if (A.success === !0) return A.data;
4590
4590
  const j = A.error ?? { code: "bad_response", message: "unexpected response" };
4591
- if (T || A.success !== !1 || j.code !== "session_required" || D !== 0 || !a || !c || !i.has(c)) throw j;
4591
+ if (E || A.success !== !1 || j.code !== "session_required" || D !== 0 || !a || !c || !i.has(c)) throw j;
4592
4592
  let H;
4593
4593
  try {
4594
4594
  H = await b(a.refresh(P));
4595
4595
  } catch {
4596
- throw g ?? j;
4596
+ throw m ?? j;
4597
4597
  }
4598
- if (g) throw g;
4598
+ if (m) throw m;
4599
4599
  if (!H || H === P) throw j;
4600
4600
  }
4601
4601
  } catch (z) {
4602
- throw g ?? z;
4602
+ throw m ?? z;
4603
4603
  } finally {
4604
- clearTimeout(h), m?.removeEventListener("abort", f), u.signal.removeEventListener("abort", v);
4604
+ clearTimeout(h), f?.removeEventListener("abort", p), u.signal.removeEventListener("abort", v);
4605
4605
  }
4606
4606
  }
4607
4607
  return { call: (r, l, c) => s({ method: r, params: l ?? {} }, c, r), batch: V6(s) };
@@ -4639,21 +4639,21 @@ async function J6(e, t) {
4639
4639
  const l = (c) => typeof c == "string" ? c.trim() : "";
4640
4640
  return r.port_info.flatMap((c) => {
4641
4641
  if (!c || typeof c != "object") return [];
4642
- const d = c, u = l(d.port_id), p = l(d.protocol);
4642
+ const d = c, u = l(d.port_id), g = l(d.protocol);
4643
4643
  if (!u || !Array.isArray(d.dst_port)) return [];
4644
- const g = d.dst_port.flatMap((f) => {
4645
- const h = /^(\d{1,5})(?:[-:](\d{1,5}))?$/.exec(l(f));
4644
+ const m = d.dst_port.flatMap((p) => {
4645
+ const h = /^(\d{1,5})(?:[-:](\d{1,5}))?$/.exec(l(p));
4646
4646
  if (!h) return [];
4647
- const m = Number(h[1]), v = Number(h[2] ?? h[1]);
4648
- return m >= 1 && v <= 65535 && v >= m ? [{ first: m, last: v }] : [];
4647
+ const f = Number(h[1]), v = Number(h[2] ?? h[1]);
4648
+ return f >= 1 && v <= 65535 && v >= f ? [{ first: f, last: v }] : [];
4649
4649
  });
4650
4650
  return [{
4651
4651
  id: u,
4652
4652
  name: l(d.name),
4653
4653
  desc: l(d.desc),
4654
- protocol: p,
4655
- ports: d.dst_port.map(l).filter((f) => /^\d{1,5}$/.test(f)).map(Number).filter((f) => f >= 1 && f <= 65535),
4656
- ranges: g
4654
+ protocol: g,
4655
+ ports: d.dst_port.map(l).filter((p) => /^\d{1,5}$/.test(p)).map(Number).filter((p) => p >= 1 && p <= 65535),
4656
+ ranges: m
4657
4657
  }];
4658
4658
  });
4659
4659
  } catch {
@@ -4677,8 +4677,71 @@ async function PF(e, t, a) {
4677
4677
  const l = n?.keepLaunchApp ? i.searchParams.get("launchApp") : null, c = l ? i.searchParams.get("launchParam") : null;
4678
4678
  return i.protocol = "https:", i.port = String(r[0]), i.pathname = "/webman/", i.search = "", i.hash = "", l && (i.searchParams.set("launchApp", l), c !== null && i.searchParams.set("launchParam", c)), i.href;
4679
4679
  }
4680
+ async function MF(e, t) {
4681
+ const a = t.prefix ?? "media", n = new AbortController(), o = () => ({ code: "request_canceled", message: "media renewal disposed" });
4682
+ let i = !1, s, r, l;
4683
+ const c = () => {
4684
+ i = !0, clearTimeout(s), n.abort(), t.signal?.removeEventListener("abort", c);
4685
+ };
4686
+ t.signal?.addEventListener("abort", c, { once: !0 }), t.signal?.aborted && c();
4687
+ function d(p) {
4688
+ if (!p || !/^[a-f0-9]{64}$/.test(p.media_grant) || typeof p.url != "string" || !p.url.startsWith("/") || p.url.startsWith("//") || p.url.includes("\\")) throw { code: "bad_response", message: "invalid media grant" };
4689
+ const h = new URL(p.url, "https://media.invalid");
4690
+ if (h.hash || h.username || h.password || h.searchParams.size !== 2 || h.searchParams.get("method") !== `${a}.content` || h.searchParams.get("media_grant") !== p.media_grant || !Number.isFinite(p.ttl_ms) || p.ttl_ms <= 0 || p.ttl_ms / 2 > 2147483647 || !Number.isFinite(Date.parse(p.expires_at))) throw { code: "bad_response", message: "invalid media grant" };
4691
+ }
4692
+ let u;
4693
+ try {
4694
+ if (i || (u = await e.call(`${a}.issue`, { asset: t.asset }, { signal: n.signal }), d(u), i)) throw o();
4695
+ } catch (p) {
4696
+ throw c(), p;
4697
+ }
4698
+ function g() {
4699
+ clearTimeout(s), i || (s = setTimeout(() => {
4700
+ m().catch((p) => {
4701
+ if (!i) {
4702
+ r = p;
4703
+ try {
4704
+ t.onError?.(p);
4705
+ } catch {
4706
+ }
4707
+ }
4708
+ });
4709
+ }, u.ttl_ms / 2));
4710
+ }
4711
+ function m() {
4712
+ return i ? Promise.reject(o()) : l || (clearTimeout(s), l = (async () => {
4713
+ const p = await e.call(`${a}.renew`, { media_grant: u.media_grant }, { signal: n.signal });
4714
+ if (d(p), i) throw o();
4715
+ if (p.url !== u.url || p.media_grant !== u.media_grant) throw { code: "bad_response", message: "media renewal changed the URL" };
4716
+ u = p, r = void 0, g();
4717
+ })().catch((p) => {
4718
+ throw r = p, p;
4719
+ }).finally(() => {
4720
+ l = void 0;
4721
+ }), l);
4722
+ }
4723
+ return g(), {
4724
+ get url() {
4725
+ return u.url;
4726
+ },
4727
+ get media_grant() {
4728
+ return u.media_grant;
4729
+ },
4730
+ get expiresAt() {
4731
+ return u.expires_at;
4732
+ },
4733
+ get error() {
4734
+ return r;
4735
+ },
4736
+ renew: m,
4737
+ async revoke() {
4738
+ c(), await e.call(`${a}.revoke`, { media_grant: u.media_grant });
4739
+ },
4740
+ dispose: c
4741
+ };
4742
+ }
4680
4743
  export {
4681
- TF as DEFAULT_REQUEST_TIMEOUT,
4744
+ EF as DEFAULT_REQUEST_TIMEOUT,
4682
4745
  V as FILE_STATION_APP,
4683
4746
  Fy as LIFECYCLE_RETRY_MAX_MS,
4684
4747
  Hy as LIFECYCLE_STARTING_RETRY_MAX_MS,
@@ -4721,13 +4784,14 @@ export {
4721
4784
  Be as format,
4722
4785
  jC as identityCatalogs,
4723
4786
  gF as identityCopy,
4724
- EF as isFullPage,
4787
+ RF as isFullPage,
4725
4788
  tF as joinSentences,
4726
4789
  eF as labelSeparator,
4727
4790
  X as launchRoute,
4728
4791
  By as lifecycleCopy,
4729
4792
  Z as lifecycleRefusal,
4730
4793
  dF as lifecycleRetryDelay,
4794
+ MF as mediaUrl,
4731
4795
  X6 as mergeCatalogs,
4732
4796
  ze as nasCatalogs,
4733
4797
  uF as nasCopy,
@@ -42,3 +42,4 @@ export { createClient, type Batch, type BatchCall, type BatchResult, type Client
42
42
  export { readDsmPorts, type DsmPort, type DsmPortRange } from './dsm/service-ports';
43
43
  export { readDsmHttpsURL, type DsmHttpsURLOptions } from './dsm/https';
44
44
  export { requestSecret, RequestSecret, redactSecrets } from './secret';
45
+ export { mediaUrl, type MediaGrant, type MediaOptions, type MediaURL } from './media';
@@ -0,0 +1,30 @@
1
+ import type { Context } from './context';
2
+ export interface MediaGrant {
3
+ media_grant: string;
4
+ url: string;
5
+ expires_at: string;
6
+ ttl_ms: number;
7
+ }
8
+ export interface MediaOptions {
9
+ asset: string;
10
+ /** App permission prefix, matching the Go media.Config; defaults to media. */
11
+ prefix?: string;
12
+ signal?: AbortSignal;
13
+ /** Renewal stops on failure. The App can show the error and explicitly renew. */
14
+ onError?: (error: unknown) => void;
15
+ }
16
+ export interface MediaURL {
17
+ /** Stable across renewals: assign to audio/video.src once. */
18
+ readonly url: string;
19
+ readonly media_grant: string;
20
+ readonly expiresAt: string;
21
+ readonly error: unknown;
22
+ renew(): Promise<void>;
23
+ revoke(): Promise<void>;
24
+ /** Stops renewal; does not revoke the grant or unload the media element. */
25
+ dispose(): void;
26
+ }
27
+ /** Obtain an owner-checked native media URL and renew without replacing src.
28
+ * Uses the normal authenticated ctx.call transport. No token enters the URL.
29
+ * Dispose on unmount; pause/unload the element yourself to release bytes. */
30
+ export declare function mediaUrl(ctx: Pick<Context, 'call'>, options: MediaOptions): Promise<MediaURL>;
package/dist/vue.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { D as dt, i as Ba } from "./context-DWEbBTIr.js";
2
2
  import { c as Io } from "./context-DWEbBTIr.js";
3
3
  import { appRefusal as va, appDenial as He, delegateCopy as Ie, createDsmFileStation as ct, appLifecycle as Pe, lifecycleRetryDelay as Ca, joinSentences as Fa, lifecycleCopy as Oe, shellCopy as oa, uiLocale as Oa, format as Ge, nasCopy as Ve, nasErrorCopy as qa, saveCopy as $a, saveError as ia, createNasProvider as Ma, labelSeparator as Sa, identityCopy as Ka, backgroundCopy as vt, createBackgroundPickerProvider as ft, backgroundErrorCopy as pt, requestKey as _a, lifecycleRefusal as mt, errorCopy as yt, scopedPicker as bt, authorizationCopy as Ha, createEntryCheck as gt } from "./index.js";
4
- import { FILE_STATION_APP as Lo, LIFECYCLE_RETRY_MAX_MS as No, LIFECYCLE_STARTING_RETRY_MAX_MS as Vo, MAX_LAUNCH_ROUTE as Bo, RequestSecret as Fo, activePage as Oo, authorizationCatalogs as qo, backgroundCatalogs as Mo, bridgeCatalogs as Ko, bridgeErrorCopy as Ho, catalogs as Xo, createBackgroundSaveFacade as Go, createClient as Wo, createDsmSession as Jo, createFileTransfers as Yo, createPortalAccess as Qo, createSharedFolderAccess as Zo, createSharedFolderPermission as jo, createStandaloneContext as ei, createStandaloneHost as ai, decodeResponse as ti, delegateCatalogs as li, dsmLaunchURL as ni, encodeRequest as si, fileStationPath as oi, followLaunchRoute as ii, identityCatalogs as ui, launchRoute as ri, mergeCatalogs as di, nasCatalogs as ci, openFileInFileStation as vi, openFolderInFileStation as fi, portalCatalogs as pi, portalMessages as mi, protocolCodes as yi, protocolOps as bi, protocolSchemas as gi, readDsmHttpsURL as hi, readDsmPorts as ki, redactSecrets as _i, requestSecret as wi, saveCatalogs as xi, sharedFolderAccessFor as Ci, sharedFolderCatalogs as $i, sharedFolderMessages as Si, sharedFolderPermissionMessage as Ei, shellCatalogs as Pi, shellPages as Ai, uiLocales as Ti } from "./index.js";
4
+ import { FILE_STATION_APP as Lo, LIFECYCLE_RETRY_MAX_MS as No, LIFECYCLE_STARTING_RETRY_MAX_MS as Vo, MAX_LAUNCH_ROUTE as Bo, RequestSecret as Fo, activePage as Oo, authorizationCatalogs as qo, backgroundCatalogs as Mo, bridgeCatalogs as Ko, bridgeErrorCopy as Ho, catalogs as Xo, createBackgroundSaveFacade as Go, createClient as Wo, createDsmSession as Jo, createFileTransfers as Yo, createPortalAccess as Qo, createSharedFolderAccess as Zo, createSharedFolderPermission as jo, createStandaloneContext as ei, createStandaloneHost as ai, decodeResponse as ti, delegateCatalogs as li, dsmLaunchURL as ni, encodeRequest as si, fileStationPath as oi, followLaunchRoute as ii, identityCatalogs as ui, launchRoute as ri, mediaUrl as di, mergeCatalogs as ci, nasCatalogs as vi, openFileInFileStation as fi, openFolderInFileStation as pi, portalCatalogs as mi, portalMessages as yi, protocolCodes as bi, protocolOps as gi, protocolSchemas as hi, readDsmHttpsURL as ki, readDsmPorts as _i, redactSecrets as wi, requestSecret as xi, saveCatalogs as Ci, sharedFolderAccessFor as $i, sharedFolderCatalogs as Si, sharedFolderMessages as Ei, sharedFolderPermissionMessage as Pi, shellCatalogs as Ai, shellPages as Ti, uiLocales as zi } from "./index.js";
5
5
  import { inject as ze, ref as b, computed as C, onBeforeUnmount as ke, Comment as ht, Text as kt, Fragment as ee, watch as We, onMounted as xe, defineComponent as ve, openBlock as l, createElementBlock as w, createElementVNode as x, toDisplayString as o, createCommentVNode as y, renderList as me, normalizeClass as Re, createVNode as p, unref as e, createTextVNode as h, createBlock as g, renderSlot as ge, withCtx as s, resolveDynamicComponent as je, normalizeProps as ua, mergeProps as Ea, withModifiers as Je, isRef as ra, provide as Xe, useTemplateRef as Ne, watchEffect as la, useSlots as Xa, guardReactiveProps as za, createSlots as fa, Teleport as Ga, markRaw as _t, h as wt, useId as xt, shallowRef as Ct, onUnmounted as Wa, nextTick as $t } from "vue";
6
6
  import { Timer as St, Info as Et, ShieldCheck as Ja, ChevronRight as Ya, LogOut as Pt, ChevronLeft as At, RotateCw as Tt } from "@lucide/vue";
7
7
  import { SettingsSection as we, Callout as j, Button as D, SettingsRow as $e, Skeleton as Be, Badge as ea, PathDisplay as Fe, Form as Ye, FormItem as Ae, Select as Pa, Input as Ue, Dialog as qe, ensureDeviceViewport as zt, AppRoot as Rt, ConfigProvider as Ut, PageContent as Ra, PageHeader as Ua, AppLayout as It, LoadingArea as Qa, AppSidebar as Dt, AppSidebarUser as Lt, IconButton as sa, AppToolbar as Nt, InfoTip as Za, FileTypeIcon as ha, Breadcrumb as Vt, FilePicker as Bt, TreeView as Ft, DataGrid as Ot, Link as wa, FormActions as pa, Card as Ia, Checkbox as qt, ListItem as Da } from "@synopackageland/ui";
@@ -4434,35 +4434,36 @@ export {
4434
4434
  Oe as lifecycleCopy,
4435
4435
  mt as lifecycleRefusal,
4436
4436
  Ca as lifecycleRetryDelay,
4437
- di as mergeCatalogs,
4438
- ci as nasCatalogs,
4437
+ di as mediaUrl,
4438
+ ci as mergeCatalogs,
4439
+ vi as nasCatalogs,
4439
4440
  Ve as nasCopy,
4440
4441
  qa as nasErrorCopy,
4441
- vi as openFileInFileStation,
4442
- fi as openFolderInFileStation,
4443
- pi as portalCatalogs,
4444
- mi as portalMessages,
4445
- yi as protocolCodes,
4446
- bi as protocolOps,
4447
- gi as protocolSchemas,
4448
- hi as readDsmHttpsURL,
4449
- ki as readDsmPorts,
4450
- _i as redactSecrets,
4442
+ fi as openFileInFileStation,
4443
+ pi as openFolderInFileStation,
4444
+ mi as portalCatalogs,
4445
+ yi as portalMessages,
4446
+ bi as protocolCodes,
4447
+ gi as protocolOps,
4448
+ hi as protocolSchemas,
4449
+ ki as readDsmHttpsURL,
4450
+ _i as readDsmPorts,
4451
+ wi as redactSecrets,
4451
4452
  _a as requestKey,
4452
- wi as requestSecret,
4453
- xi as saveCatalogs,
4453
+ xi as requestSecret,
4454
+ Ci as saveCatalogs,
4454
4455
  $a as saveCopy,
4455
4456
  ia as saveError,
4456
4457
  bt as scopedPicker,
4457
- Ci as sharedFolderAccessFor,
4458
- $i as sharedFolderCatalogs,
4459
- Si as sharedFolderMessages,
4460
- Ei as sharedFolderPermissionMessage,
4461
- Pi as shellCatalogs,
4458
+ $i as sharedFolderAccessFor,
4459
+ Si as sharedFolderCatalogs,
4460
+ Ei as sharedFolderMessages,
4461
+ Pi as sharedFolderPermissionMessage,
4462
+ Ai as shellCatalogs,
4462
4463
  oa as shellCopy,
4463
- Ai as shellPages,
4464
+ Ti as shellPages,
4464
4465
  Oa as uiLocale,
4465
- Ti as uiLocales,
4466
+ zi as uiLocales,
4466
4467
  ao as useAuthorization,
4467
4468
  Mt as useExecutorPreload,
4468
4469
  et as useExecutorSetup,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "formatVersion": 1,
3
- "sdkVersion": "0.50.5",
3
+ "sdkVersion": "0.50.7",
4
4
  "executorVersion": "0.49.5",
5
5
  "executorDigests": {
6
6
  "x86_64": "1a2dbb1c93a5d7cf5c4d5cafd2526c152e1cc21611649875db8e1c23837c2874",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synopackageland/sdk",
3
- "version": "0.50.5",
3
+ "version": "0.50.7",
4
4
  "description": "Frontend SDK for DSM packages built with synopkgland: headless client and Vue components",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/synopackageland/syno-pkg-land-sdk/tree/main/ts#readme",