mirror of
https://github.com/9001/copyparty.git
synced 2025-08-18 01:22:13 -06:00
ui-button to use upload-time instead of local last-modified
This commit is contained in:
parent
9f32e9e11d
commit
dc2b67f155
|
@ -806,6 +806,7 @@ def add_upload(ap):
|
||||||
ap2.add_argument("--no-dedup", action="store_true", help="disable symlink/hardlink creation; copy file contents instead (volflag=copydupes)")
|
ap2.add_argument("--no-dedup", action="store_true", help="disable symlink/hardlink creation; copy file contents instead (volflag=copydupes)")
|
||||||
ap2.add_argument("--no-dupe", action="store_true", help="reject duplicate files during upload; only matches within the same volume (volflag=nodupe)")
|
ap2.add_argument("--no-dupe", action="store_true", help="reject duplicate files during upload; only matches within the same volume (volflag=nodupe)")
|
||||||
ap2.add_argument("--no-snap", action="store_true", help="disable snapshots -- forget unfinished uploads on shutdown; don't create .hist/up2k.snap files -- abandoned/interrupted uploads must be cleaned up manually")
|
ap2.add_argument("--no-snap", action="store_true", help="disable snapshots -- forget unfinished uploads on shutdown; don't create .hist/up2k.snap files -- abandoned/interrupted uploads must be cleaned up manually")
|
||||||
|
ap2.add_argument("--u2ts", metavar="TXT", type=u, default="c", help="how to timestamp uploaded files; [\033[32mc\033[0m]=client-last-modified, [\033[32mu\033[0m]=upload-time, [\033[32mfc\033[0m]=force-c, [\033[32mfu\033[0m]=force-u (volflag=u2ts)")
|
||||||
ap2.add_argument("--rand", action="store_true", help="force randomized filenames, --nrand chars long (volflag=rand)")
|
ap2.add_argument("--rand", action="store_true", help="force randomized filenames, --nrand chars long (volflag=rand)")
|
||||||
ap2.add_argument("--nrand", metavar="NUM", type=int, default=9, help="randomized filenames length (volflag=nrand)")
|
ap2.add_argument("--nrand", metavar="NUM", type=int, default=9, help="randomized filenames length (volflag=nrand)")
|
||||||
ap2.add_argument("--magic", action="store_true", help="enable filetype detection on nameless uploads (volflag=magic)")
|
ap2.add_argument("--magic", action="store_true", help="enable filetype detection on nameless uploads (volflag=magic)")
|
||||||
|
|
|
@ -42,7 +42,7 @@ def vf_bmap() -> dict[str, str]:
|
||||||
def vf_vmap() -> dict[str, str]:
|
def vf_vmap() -> dict[str, str]:
|
||||||
"""argv-to-volflag: simple values"""
|
"""argv-to-volflag: simple values"""
|
||||||
ret = {"th_convt": "convt", "th_size": "thsize"}
|
ret = {"th_convt": "convt", "th_size": "thsize"}
|
||||||
for k in ("dbd", "lg_sbf", "md_sbf", "nrand", "sort", "unlist"):
|
for k in ("dbd", "lg_sbf", "md_sbf", "nrand", "sort", "unlist", "u2ts"):
|
||||||
ret[k] = k
|
ret[k] = k
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
|
@ -3834,6 +3834,7 @@ class HttpCli(object):
|
||||||
"idx": e2d,
|
"idx": e2d,
|
||||||
"itag": e2t,
|
"itag": e2t,
|
||||||
"dsort": vf["sort"],
|
"dsort": vf["sort"],
|
||||||
|
"u2ts": vf["u2ts"],
|
||||||
"lifetime": vn.flags.get("lifetime") or 0,
|
"lifetime": vn.flags.get("lifetime") or 0,
|
||||||
"frand": bool(vn.flags.get("rand")),
|
"frand": bool(vn.flags.get("rand")),
|
||||||
"unlist": unlist,
|
"unlist": unlist,
|
||||||
|
@ -3845,6 +3846,7 @@ class HttpCli(object):
|
||||||
"ls0": None,
|
"ls0": None,
|
||||||
"acct": self.uname,
|
"acct": self.uname,
|
||||||
"perms": perms,
|
"perms": perms,
|
||||||
|
"u2ts": vf["u2ts"],
|
||||||
"lifetime": ls_ret["lifetime"],
|
"lifetime": ls_ret["lifetime"],
|
||||||
"frand": bool(vn.flags.get("rand")),
|
"frand": bool(vn.flags.get("rand")),
|
||||||
"def_hcols": [],
|
"def_hcols": [],
|
||||||
|
|
|
@ -2339,6 +2339,9 @@ class Up2k(object):
|
||||||
vols = [(ptop, jcur)] if jcur else []
|
vols = [(ptop, jcur)] if jcur else []
|
||||||
if vfs.flags.get("xlink"):
|
if vfs.flags.get("xlink"):
|
||||||
vols += [(k, v) for k, v in self.cur.items() if k != ptop]
|
vols += [(k, v) for k, v in self.cur.items() if k != ptop]
|
||||||
|
if vfs.flags.get("up_ts", "") == "fu" or not cj["lmod"]:
|
||||||
|
# force upload time rather than last-modified
|
||||||
|
cj["lmod"] = int(time.time())
|
||||||
|
|
||||||
alts: list[tuple[int, int, dict[str, Any]]] = []
|
alts: list[tuple[int, int, dict[str, Any]]] = []
|
||||||
for ptop, cur in vols:
|
for ptop, cur in vols:
|
||||||
|
|
|
@ -2502,14 +2502,14 @@ html.y #bbox-overlay figcaption a {
|
||||||
min-width: 24em;
|
min-width: 24em;
|
||||||
}
|
}
|
||||||
#u2cards.w {
|
#u2cards.w {
|
||||||
width: 44em;
|
width: 48em;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
#u2cards.ww {
|
#u2cards.ww {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
#u2etaw.w {
|
#u2etaw.w {
|
||||||
width: 52em;
|
width: 55em;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
margin: 2em auto -2.7em auto;
|
margin: 2em auto -2.7em auto;
|
||||||
}
|
}
|
||||||
|
@ -2554,10 +2554,10 @@ html.y #bbox-overlay figcaption a {
|
||||||
width: 30em;
|
width: 30em;
|
||||||
}
|
}
|
||||||
#u2conf.w {
|
#u2conf.w {
|
||||||
width: 48em;
|
width: 51em;
|
||||||
}
|
}
|
||||||
#u2conf.ww {
|
#u2conf.ww {
|
||||||
width: 78em;
|
width: 82em;
|
||||||
}
|
}
|
||||||
#u2conf.ww #u2c3w {
|
#u2conf.ww #u2c3w {
|
||||||
width: 29em;
|
width: 29em;
|
||||||
|
@ -3054,6 +3054,16 @@ html.d #treepar {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@media (max-width: 32em) {
|
||||||
|
#u2conf {
|
||||||
|
font-size: .9em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 28em) {
|
||||||
|
#u2conf {
|
||||||
|
font-size: .8em;
|
||||||
|
}
|
||||||
|
}
|
||||||
@media (min-width: 70em) {
|
@media (min-width: 70em) {
|
||||||
#barpos,
|
#barpos,
|
||||||
#barbuf {
|
#barbuf {
|
||||||
|
|
|
@ -137,6 +137,7 @@ var Ls = {
|
||||||
|
|
||||||
"ul_par": "parallel uploads:",
|
"ul_par": "parallel uploads:",
|
||||||
"ut_rand": "randomize filenames",
|
"ut_rand": "randomize filenames",
|
||||||
|
"ut_u2ts": "copy the last-modified timestamp$Nfrom your filesystem to the server",
|
||||||
"ut_mt": "continue hashing other files while uploading$N$Nmaybe disable if your CPU or HDD is a bottleneck",
|
"ut_mt": "continue hashing other files while uploading$N$Nmaybe disable if your CPU or HDD is a bottleneck",
|
||||||
"ut_ask": "ask for confirmation before upload starts",
|
"ut_ask": "ask for confirmation before upload starts",
|
||||||
"ut_pot": "improve upload speed on slow devices$Nby making the UI less complex",
|
"ut_pot": "improve upload speed on slow devices$Nby making the UI less complex",
|
||||||
|
@ -168,6 +169,7 @@ var Ls = {
|
||||||
"utl_prog": "progress",
|
"utl_prog": "progress",
|
||||||
|
|
||||||
"ul_flagblk": "the files were added to the queue</b><br>however there is a busy up2k in another browser tab,<br>so waiting for that to finish first",
|
"ul_flagblk": "the files were added to the queue</b><br>however there is a busy up2k in another browser tab,<br>so waiting for that to finish first",
|
||||||
|
"ul_btnlk": "the server configuration has locked this switch into this state",
|
||||||
|
|
||||||
"udt_up": "Upload",
|
"udt_up": "Upload",
|
||||||
"udt_srch": "Search",
|
"udt_srch": "Search",
|
||||||
|
@ -606,6 +608,7 @@ var Ls = {
|
||||||
|
|
||||||
"ul_par": "samtidige handl.:",
|
"ul_par": "samtidige handl.:",
|
||||||
"ut_rand": "finn opp nye tilfeldige filnavn",
|
"ut_rand": "finn opp nye tilfeldige filnavn",
|
||||||
|
"ut_u2ts": "gi filen på serveren samme$Ntidsstempel som lokalt hos deg",
|
||||||
"ut_mt": "fortsett å befare køen mens opplastning foregår$N$Nskru denne av dersom du har en$Ntreg prosessor eller harddisk",
|
"ut_mt": "fortsett å befare køen mens opplastning foregår$N$Nskru denne av dersom du har en$Ntreg prosessor eller harddisk",
|
||||||
"ut_ask": "bekreft filutvalg før opplastning starter",
|
"ut_ask": "bekreft filutvalg før opplastning starter",
|
||||||
"ut_pot": "forbedre ytelsen på trege enheter ved å$Nforenkle brukergrensesnittet",
|
"ut_pot": "forbedre ytelsen på trege enheter ved å$Nforenkle brukergrensesnittet",
|
||||||
|
@ -637,6 +640,7 @@ var Ls = {
|
||||||
"utl_prog": "fremdrift",
|
"utl_prog": "fremdrift",
|
||||||
|
|
||||||
"ul_flagblk": "filene har blitt lagt i køen</b><br>men det er en annen nettleserfane som holder på med befaring eller opplastning akkurat nå,<br>så venter til den er ferdig først",
|
"ul_flagblk": "filene har blitt lagt i køen</b><br>men det er en annen nettleserfane som holder på med befaring eller opplastning akkurat nå,<br>så venter til den er ferdig først",
|
||||||
|
"ul_btnlk": "bryteren har blitt låst til denne tilstanden i serverens konfigurasjon",
|
||||||
|
|
||||||
"udt_up": "Last opp",
|
"udt_up": "Last opp",
|
||||||
"udt_srch": "Søk",
|
"udt_srch": "Søk",
|
||||||
|
@ -1042,6 +1046,10 @@ ebi('op_up2k').innerHTML = (
|
||||||
' <input type="checkbox" id="u2rand" />\n' +
|
' <input type="checkbox" id="u2rand" />\n' +
|
||||||
' <label for="u2rand" tt="' + L.ut_rand + '">🎲</label>\n' +
|
' <label for="u2rand" tt="' + L.ut_rand + '">🎲</label>\n' +
|
||||||
' </td>\n' +
|
' </td>\n' +
|
||||||
|
' <td class="c" rowspan="2">\n' +
|
||||||
|
' <input type="checkbox" id="u2ts" />\n' +
|
||||||
|
' <label for="u2ts" tt="' + L.ut_u2ts + '">🕒</a>\n' +
|
||||||
|
' </td>\n' +
|
||||||
' <td class="c" data-perm="read" data-dep="idx" rowspan="2">\n' +
|
' <td class="c" data-perm="read" data-dep="idx" rowspan="2">\n' +
|
||||||
' <input type="checkbox" id="fsearch" />\n' +
|
' <input type="checkbox" id="fsearch" />\n' +
|
||||||
' <label for="fsearch" tt="' + L.ut_srch + '">🔎</label>\n' +
|
' <label for="fsearch" tt="' + L.ut_srch + '">🔎</label>\n' +
|
||||||
|
@ -6299,6 +6307,7 @@ function apply_perms(res) {
|
||||||
if (res.frand)
|
if (res.frand)
|
||||||
ebi('u2rand').parentNode.style.display = 'none';
|
ebi('u2rand').parentNode.style.display = 'none';
|
||||||
|
|
||||||
|
u2ts = res.u2ts;
|
||||||
if (up2k)
|
if (up2k)
|
||||||
up2k.set_fsearch();
|
up2k.set_fsearch();
|
||||||
|
|
||||||
|
|
|
@ -861,6 +861,7 @@ function up2k_init(subtle) {
|
||||||
bcfg_bind(uc, 'multitask', 'multitask', true, null, false);
|
bcfg_bind(uc, 'multitask', 'multitask', true, null, false);
|
||||||
bcfg_bind(uc, 'potato', 'potato', false, set_potato, false);
|
bcfg_bind(uc, 'potato', 'potato', false, set_potato, false);
|
||||||
bcfg_bind(uc, 'ask_up', 'ask_up', true, null, false);
|
bcfg_bind(uc, 'ask_up', 'ask_up', true, null, false);
|
||||||
|
bcfg_bind(uc, 'u2ts', 'u2ts', !u2ts.endsWith('u'), set_u2ts, false);
|
||||||
bcfg_bind(uc, 'fsearch', 'fsearch', false, set_fsearch, false);
|
bcfg_bind(uc, 'fsearch', 'fsearch', false, set_fsearch, false);
|
||||||
|
|
||||||
bcfg_bind(uc, 'flag_en', 'flag_en', false, apply_flag_cfg);
|
bcfg_bind(uc, 'flag_en', 'flag_en', false, apply_flag_cfg);
|
||||||
|
@ -1361,7 +1362,7 @@ function up2k_init(subtle) {
|
||||||
name = good_files[a][1],
|
name = good_files[a][1],
|
||||||
fdir = evpath,
|
fdir = evpath,
|
||||||
now = Date.now(),
|
now = Date.now(),
|
||||||
lmod = fobj.lastModified || now,
|
lmod = uc.u2ts ? (fobj.lastModified || now) : 0,
|
||||||
ofs = name.lastIndexOf('/') + 1;
|
ofs = name.lastIndexOf('/') + 1;
|
||||||
|
|
||||||
if (ofs) {
|
if (ofs) {
|
||||||
|
@ -2620,7 +2621,7 @@ function up2k_init(subtle) {
|
||||||
wpx = window.innerWidth,
|
wpx = window.innerWidth,
|
||||||
fpx = parseInt(getComputedStyle(bar)['font-size']),
|
fpx = parseInt(getComputedStyle(bar)['font-size']),
|
||||||
wem = wpx * 1.0 / fpx,
|
wem = wpx * 1.0 / fpx,
|
||||||
wide = wem > 54 ? 'w' : '',
|
wide = wem > 57 ? 'w' : '',
|
||||||
parent = ebi(wide ? 'u2btn_cw' : 'u2btn_ct'),
|
parent = ebi(wide ? 'u2btn_cw' : 'u2btn_ct'),
|
||||||
btn = ebi('u2btn');
|
btn = ebi('u2btn');
|
||||||
|
|
||||||
|
@ -2629,7 +2630,7 @@ function up2k_init(subtle) {
|
||||||
ebi('u2conf').className = ebi('u2cards').className = ebi('u2etaw').className = wide;
|
ebi('u2conf').className = ebi('u2cards').className = ebi('u2etaw').className = wide;
|
||||||
}
|
}
|
||||||
|
|
||||||
wide = wem > 82 ? 'ww' : wide;
|
wide = wem > 86 ? 'ww' : wide;
|
||||||
parent = ebi(wide == 'ww' ? 'u2c3w' : 'u2c3t');
|
parent = ebi(wide == 'ww' ? 'u2c3w' : 'u2c3t');
|
||||||
var its = [ebi('u2etaw'), ebi('u2cards')];
|
var its = [ebi('u2etaw'), ebi('u2cards')];
|
||||||
if (its[0].parentNode !== parent) {
|
if (its[0].parentNode !== parent) {
|
||||||
|
@ -2851,6 +2852,9 @@ function up2k_init(subtle) {
|
||||||
ebi('u2cards').style.display = ebi('u2tab').style.display = potato ? 'none' : '';
|
ebi('u2cards').style.display = ebi('u2tab').style.display = potato ? 'none' : '';
|
||||||
ebi('u2mu').style.display = potato ? '' : 'none';
|
ebi('u2mu').style.display = potato ? '' : 'none';
|
||||||
|
|
||||||
|
if (u2ts.startsWith('f') || !sread('u2ts'))
|
||||||
|
uc.u2ts = bcfg_upd_ui('u2ts', !u2ts.endsWith('u'));
|
||||||
|
|
||||||
draw_turbo();
|
draw_turbo();
|
||||||
draw_life();
|
draw_life();
|
||||||
onresize();
|
onresize();
|
||||||
|
@ -2875,12 +2879,24 @@ function up2k_init(subtle) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function set_u2sort() {
|
function set_u2sort(en) {
|
||||||
if (u2sort.indexOf('f') < 0)
|
if (u2sort.indexOf('f') < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bcfg_set('u2sort', uc.az = u2sort.indexOf('n') + 1);
|
var fen = uc.az = u2sort.indexOf('n') + 1;
|
||||||
localStorage.removeItem('u2sort');
|
bcfg_upd_ui('u2sort', fen);
|
||||||
|
if (en != fen)
|
||||||
|
toast.warn(10, L.ul_btnlk);
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_u2ts(en) {
|
||||||
|
if (u2ts.indexOf('f') < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var fen = !u2ts.endsWith('u');
|
||||||
|
bcfg_upd_ui('u2ts', fen);
|
||||||
|
if (en != fen)
|
||||||
|
toast.warn(10, L.ul_btnlk);
|
||||||
}
|
}
|
||||||
|
|
||||||
function set_hashw() {
|
function set_hashw() {
|
||||||
|
@ -2978,7 +2994,7 @@ ebi('ico1').onclick = function () {
|
||||||
if (QS('#op_up2k.act'))
|
if (QS('#op_up2k.act'))
|
||||||
goto_up2k();
|
goto_up2k();
|
||||||
|
|
||||||
apply_perms({ "perms": perms, "frand": frand });
|
apply_perms({ "perms": perms, "frand": frand, "u2ts": u2ts });
|
||||||
|
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
|
|
|
@ -982,13 +982,14 @@ function bcfg_set(name, val) {
|
||||||
function bcfg_upd_ui(name, val) {
|
function bcfg_upd_ui(name, val) {
|
||||||
var o = ebi(name);
|
var o = ebi(name);
|
||||||
if (!o)
|
if (!o)
|
||||||
return;
|
return val;
|
||||||
|
|
||||||
if (o.getAttribute('type') == 'checkbox')
|
if (o.getAttribute('type') == 'checkbox')
|
||||||
o.checked = val;
|
o.checked = val;
|
||||||
else if (o) {
|
else if (o) {
|
||||||
clmod(o, 'on', val);
|
clmod(o, 'on', val);
|
||||||
}
|
}
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
function bcfg_bind(obj, oname, cname, defval, cb, un_ev) {
|
function bcfg_bind(obj, oname, cname, defval, cb, un_ev) {
|
||||||
|
|
Loading…
Reference in a new issue