copyparty 1.18.8__py3-none-any.whl → 1.18.9__py3-none-any.whl

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.
copyparty/__main__.py CHANGED
@@ -1540,6 +1540,7 @@ def add_ui(ap, retry):
1540
1540
  ap2 = ap.add_argument_group('ui options')
1541
1541
  ap2.add_argument("--grid", action="store_true", help="show grid/thumbnails by default (volflag=grid)")
1542
1542
  ap2.add_argument("--gsel", action="store_true", help="select files in grid by ctrl-click (volflag=gsel)")
1543
+ ap2.add_argument("--localtime", action="store_true", help="default to local timezone instead of UTC")
1543
1544
  ap2.add_argument("--lang", metavar="LANG", type=u, default="eng", help="language; one of the following: \033[32meng nor chi\033[0m")
1544
1545
  ap2.add_argument("--theme", metavar="NUM", type=int, default=0, help="default theme to use (0..7)")
1545
1546
  ap2.add_argument("--themes", metavar="NUM", type=int, default=8, help="number of themes installed")
copyparty/__version__.py CHANGED
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- VERSION = (1, 18, 8)
3
+ VERSION = (1, 18, 9)
4
4
  CODENAME = "logtail"
5
- BUILD_DT = (2025, 7, 31)
5
+ BUILD_DT = (2025, 8, 1)
6
6
 
7
7
  S_VERSION = ".".join(map(str, VERSION))
8
8
  S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
copyparty/authsrv.py CHANGED
@@ -2766,6 +2766,7 @@ class AuthSrv(object):
2766
2766
  "dth3x": vf["th3x"],
2767
2767
  "dvol": self.args.au_vol,
2768
2768
  "idxh": int(self.args.ih),
2769
+ "dutc": not self.args.localtime,
2769
2770
  "themes": self.args.themes,
2770
2771
  "turbolvl": self.args.turbo,
2771
2772
  "nosubtle": self.args.nosubtle,
@@ -3444,7 +3445,7 @@ def expand_config_file(
3444
3445
  ipath += " -> " + fp
3445
3446
  ret.append("#\033[36m opening cfg file{}\033[0m".format(ipath))
3446
3447
 
3447
- cfg_lines = read_utf8(log, fp, True).split("\n")
3448
+ cfg_lines = read_utf8(log, fp, True).replace("\t", " ").split("\n")
3448
3449
  if True: # diff-golf
3449
3450
  for oln in [x.rstrip() for x in cfg_lines]:
3450
3451
  ln = oln.split(" #")[0].strip()
copyparty/httpcli.py CHANGED
@@ -107,6 +107,7 @@ from .util import (
107
107
  sendfile_py,
108
108
  set_fperms,
109
109
  stat_resource,
110
+ str_anchor,
110
111
  ub64dec,
111
112
  ub64enc,
112
113
  ujoin,
@@ -906,7 +907,7 @@ class HttpCli(object):
906
907
  if status == 304:
907
908
  self.out_headers.pop("Content-Length", None)
908
909
  self.out_headers.pop("Content-Type", None)
909
- self.out_headerlist.clear()
910
+ self.out_headerlist[:] = []
910
911
  if self.k304():
911
912
  self.keepalive = False
912
913
  else:
@@ -2928,7 +2929,7 @@ class HttpCli(object):
2928
2929
  msg = "new password OK"
2929
2930
 
2930
2931
  redir = (self.args.SRS + "?h") if ok else ""
2931
- h2 = '<a href="' + self.args.SRS + '?h">ack</a>'
2932
+ h2 = '<a href="' + self.args.SRS + '?h">continue</a>'
2932
2933
  html = self.j2s("msg", h1=msg, h2=h2, redir=redir)
2933
2934
  self.reply(html.encode("utf-8"))
2934
2935
  return True
@@ -2956,7 +2957,8 @@ class HttpCli(object):
2956
2957
  dst += "_=1#" + html_escape(uhash, True, True)
2957
2958
 
2958
2959
  _, msg = self.get_pwd_cookie(pwd)
2959
- html = self.j2s("msg", h1=msg, h2='<a href="' + dst + '">ack</a>', redir=dst)
2960
+ h2 = '<a href="' + dst + '">continue</a>'
2961
+ html = self.j2s("msg", h1=msg, h2=h2, redir=dst)
2960
2962
  self.reply(html.encode("utf-8"))
2961
2963
  return True
2962
2964
 
@@ -2969,7 +2971,7 @@ class HttpCli(object):
2969
2971
  self.get_pwd_cookie("x")
2970
2972
 
2971
2973
  dst = self.args.SRS + "?h"
2972
- h2 = '<a href="' + dst + '">ack</a>'
2974
+ h2 = '<a href="' + dst + '">continue</a>'
2973
2975
  html = self.j2s("msg", h1="ok bye", h2=h2, redir=dst)
2974
2976
  self.reply(html.encode("utf-8"))
2975
2977
  return True
@@ -3093,6 +3095,20 @@ class HttpCli(object):
3093
3095
  if "fperms" in vfs.flags:
3094
3096
  set_fperms(f, vfs.flags)
3095
3097
 
3098
+ dbv, vrem = vfs.get_dbv(rem)
3099
+ self.conn.hsrv.broker.say(
3100
+ "up2k.hash_file",
3101
+ dbv.realpath,
3102
+ dbv.vpath,
3103
+ dbv.flags,
3104
+ vrem,
3105
+ sanitized,
3106
+ self.ip,
3107
+ bos.stat(fn).st_mtime,
3108
+ self.uname,
3109
+ True,
3110
+ )
3111
+
3096
3112
  vpath = "{}/{}".format(self.vpath, sanitized).lstrip("/")
3097
3113
  self.redirect(vpath, "?edit")
3098
3114
  return True
@@ -5331,15 +5347,16 @@ class HttpCli(object):
5331
5347
  raise Pebkac(500, "sqlite3 not found on server; unpost is disabled")
5332
5348
  raise Pebkac(500, "server busy, cannot unpost; please retry in a bit")
5333
5349
 
5334
- zs = self.uparam.get("filter") or ""
5335
- filt = re.compile(zs, re.I) if zs else None
5336
- lm = "ups %r" % (zs,)
5350
+ sfilt = self.uparam.get("filter") or ""
5351
+ nfi, vfi = str_anchor(sfilt)
5352
+ lm = "ups %d%r" % (nfi, sfilt)
5337
5353
 
5338
5354
  if self.args.shr and self.vpath.startswith(self.args.shr1):
5339
5355
  shr_dbv, shr_vrem = self.vn.get_dbv(self.rem)
5340
5356
  else:
5341
5357
  shr_dbv = None
5342
5358
 
5359
+ wret = {}
5343
5360
  ret = []
5344
5361
  t0 = time.time()
5345
5362
  lim = time.time() - self.args.unpost
@@ -5361,7 +5378,13 @@ class HttpCli(object):
5361
5378
  x = self.conn.hsrv.broker.ask(
5362
5379
  "up2k.get_unfinished_by_user", self.uname, "" if bad_xff else self.ip
5363
5380
  )
5364
- uret = x.get()
5381
+ zdsa = x.get()
5382
+ uret = []
5383
+ if "timeout" in zdsa:
5384
+ wret["nou"] = 1
5385
+ else:
5386
+ uret = zdsa["f"]
5387
+ nu = len(uret)
5365
5388
 
5366
5389
  if not self.args.unpost:
5367
5390
  allvols = []
@@ -5386,8 +5409,14 @@ class HttpCli(object):
5386
5409
  q = "select sz, rd, fn, at from up where ip=? and at>? order by at desc"
5387
5410
  for sz, rd, fn, at in cur.execute(q, (self.ip, lim)):
5388
5411
  vp = "/" + "/".join(x for x in [vol.vpath, rd, fn] if x)
5389
- if filt and not filt.search(vp):
5390
- continue
5412
+ if nfi == 0 or (nfi == 1 and vfi in vp):
5413
+ pass
5414
+ elif nfi == 2:
5415
+ if not vp.startswith(vfi):
5416
+ continue
5417
+ elif nfi == 3:
5418
+ if not vp.endswith(vfi):
5419
+ continue
5391
5420
 
5392
5421
  n -= 1
5393
5422
  if not n:
@@ -5407,6 +5436,8 @@ class HttpCli(object):
5407
5436
 
5408
5437
  if len(ret) > 2000:
5409
5438
  ret = ret[:2000]
5439
+ if len(ret) >= 2000:
5440
+ wret["oc"] = 1
5410
5441
 
5411
5442
  for rv in ret:
5412
5443
  rv["vp"] = quotep(rv["vp"])
@@ -5426,6 +5457,13 @@ class HttpCli(object):
5426
5457
  )
5427
5458
  rv["vp"] += "?k=" + fk[:nfk]
5428
5459
 
5460
+ if not allvols:
5461
+ wret["noc"] = 1
5462
+ ret = []
5463
+
5464
+ nc = len(ret)
5465
+ ret = uret + ret
5466
+
5429
5467
  if shr_dbv:
5430
5468
  # translate vpaths from share-target to share-url
5431
5469
  # to satisfy access checks
@@ -5439,12 +5477,11 @@ class HttpCli(object):
5439
5477
  for v in ret:
5440
5478
  v["vp"] = self.args.SR + v["vp"]
5441
5479
 
5442
- if not allvols:
5443
- ret = [{"kinshi": 1}]
5444
-
5445
- jtxt = '{"u":%s,"c":%s}' % (uret, json.dumps(ret, separators=(",\n", ": ")))
5446
- zi = len(uret.split('\n"pd":')) - 1
5447
- self.log("%s #%d+%d %.2fsec" % (lm, zi, len(ret), time.time() - t0))
5480
+ wret["f"] = ret
5481
+ wret["nu"] = nu
5482
+ wret["nc"] = nc
5483
+ jtxt = json.dumps(wret, separators=(",\n", ": "))
5484
+ self.log("%s #%d+%d %.2fsec" % (lm, nu, nc, time.time() - t0))
5448
5485
  self.reply(jtxt.encode("utf-8", "replace"), mime="application/json")
5449
5486
  return True
5450
5487
 
@@ -5459,8 +5496,8 @@ class HttpCli(object):
5459
5496
  raise Pebkac(500, "server busy, cannot list recent uploads; please retry")
5460
5497
 
5461
5498
  sfilt = self.uparam.get("filter") or ""
5462
- filt = re.compile(sfilt, re.I) if sfilt else None
5463
- lm = "ru %r" % (sfilt,)
5499
+ nfi, vfi = str_anchor(sfilt)
5500
+ lm = "ru %d%r" % (nfi, sfilt)
5464
5501
  self.log(lm)
5465
5502
 
5466
5503
  ret = []
@@ -5495,8 +5532,14 @@ class HttpCli(object):
5495
5532
  q = "select sz, rd, fn, ip, at from up where at>0 order by at desc"
5496
5533
  for sz, rd, fn, ip, at in cur.execute(q):
5497
5534
  vp = "/" + "/".join(x for x in [vol.vpath, rd, fn] if x)
5498
- if filt and not filt.search(vp):
5499
- continue
5535
+ if nfi == 0 or (nfi == 1 and vfi in vp):
5536
+ pass
5537
+ elif nfi == 2:
5538
+ if not vp.startswith(vfi):
5539
+ continue
5540
+ elif nfi == 3:
5541
+ if not vp.endswith(vfi):
5542
+ continue
5500
5543
 
5501
5544
  if not dots and "/." in vp:
5502
5545
  continue
copyparty/svchub.py CHANGED
@@ -1016,6 +1016,8 @@ class SvcHub(object):
1016
1016
  except:
1017
1017
  raise Exception("invalid --mv-retry [%s]" % (self.args.mv_retry,))
1018
1018
 
1019
+ al.js_utc = "false" if al.localtime else "true"
1020
+
1019
1021
  al.tcolor = al.tcolor.lstrip("#")
1020
1022
  if len(al.tcolor) == 3: # fc5 => ffcc55
1021
1023
  al.tcolor = "".join([x * 2 for x in al.tcolor])
copyparty/up2k.py CHANGED
@@ -395,12 +395,14 @@ class Up2k(object):
395
395
 
396
396
  return "{}"
397
397
 
398
- def get_unfinished_by_user(self, uname, ip) :
398
+ def get_unfinished_by_user(self, uname, ip) :
399
+ # returns dict due to ExceptionalQueue
399
400
  if PY2 or not self.reg_mutex.acquire(timeout=2):
400
- return '[{"timeout":1}]'
401
+ return {"timeout": 1}
401
402
 
402
403
  ret = []
403
404
  userset = set([(uname or "\n"), "*"])
405
+ n = 1000
404
406
  try:
405
407
  for ptop, tab2 in self.registry.items():
406
408
  cfg = self.flags.get(ptop, {}).get("u2abort", 1)
@@ -415,7 +417,6 @@ class Up2k(object):
415
417
  or (addr and addr != job["addr"])
416
418
  ):
417
419
  continue
418
-
419
420
  zt5 = (
420
421
  int(job["t0"]),
421
422
  djoin(job["vtop"], job["prel"], job["name"]),
@@ -424,6 +425,9 @@ class Up2k(object):
424
425
  len(job["hash"]),
425
426
  )
426
427
  ret.append(zt5)
428
+ n -= 1
429
+ if not n:
430
+ break
427
431
  finally:
428
432
  self.reg_mutex.release()
429
433
 
@@ -440,7 +444,7 @@ class Up2k(object):
440
444
  }
441
445
  for (at, vp, sz, nn, nh) in ret
442
446
  ]
443
- return json.dumps(ret2, separators=(",\n", ": "))
447
+ return {"f": ret2}
444
448
 
445
449
  def get_unfinished(self) :
446
450
  if PY2 or not self.reg_mutex.acquire(timeout=0.5):
@@ -2812,7 +2816,7 @@ class Up2k(object):
2812
2816
  # v5a -> v5b
2813
2817
  # store rd+fn rather than warks to support nohash vols
2814
2818
  try:
2815
- cur.execute("select ws, rd, fn from iu limit 1").fetchone()
2819
+ cur.execute("select c, w, rd, fn from iu limit 1").fetchone()
2816
2820
  return
2817
2821
  except:
2818
2822
  pass
copyparty/util.py CHANGED
@@ -2310,6 +2310,21 @@ def ujoin(rd , fn ) :
2310
2310
  return rd or fn
2311
2311
 
2312
2312
 
2313
+ def str_anchor(txt) :
2314
+ if not txt:
2315
+ return 0, ""
2316
+ txt = txt.lower()
2317
+ a = txt.startswith("^")
2318
+ b = txt.endswith("$")
2319
+ if not b:
2320
+ if not a:
2321
+ return 1, txt # ~
2322
+ return 2, txt[1:] # ^
2323
+ if not a:
2324
+ return 3, txt[:-1] # $
2325
+ return 4, txt[1:-1] # ^$
2326
+
2327
+
2313
2328
  def log_reloc(
2314
2329
  log ,
2315
2330
  re ,
copyparty/web/a/u2c.py CHANGED
@@ -52,6 +52,7 @@ if PY2:
52
52
 
53
53
  sys.dont_write_bytecode = True
54
54
  bytes = str
55
+ files_decoder = lambda s: unicode(s, "utf8")
55
56
  else:
56
57
  from urllib.parse import quote_from_bytes as quote
57
58
  from urllib.parse import unquote_to_bytes as unquote
@@ -61,6 +62,7 @@ else:
61
62
  from queue import Queue
62
63
 
63
64
  unicode = str
65
+ files_decoder = unicode
64
66
 
65
67
 
66
68
  WTF8 = "replace" if PY2 else "surrogateescape"
@@ -1530,7 +1532,7 @@ source file/folder selection uses rsync syntax, meaning that:
1530
1532
  """)
1531
1533
 
1532
1534
  ap.add_argument("url", type=unicode, help="server url, including destination folder")
1533
- ap.add_argument("files", type=unicode, nargs="+", help="files and/or folders to process")
1535
+ ap.add_argument("files", type=files_decoder, nargs="+", help="files and/or folders to process")
1534
1536
  ap.add_argument("-v", action="store_true", help="verbose")
1535
1537
  ap.add_argument("-a", metavar="PASSWD", help="password or $filepath")
1536
1538
  ap.add_argument("-s", action="store_true", help="file-search (disables upload)")
@@ -110,7 +110,7 @@
110
110
  <tr><td>{{ f.lead }}</td><td><a href="{{ f.href }}">{{ f.name|e }}</a></td><td>{{ f.sz }}</td>
111
111
  {%- if f.tags is defined %}
112
112
  {%- for k in taglist %}<td>{{ f.tags[k]|e }}</td>{%- endfor %}
113
- {%- endif %}<td>{{ f.ext|e }}</td><td>{{ f.dt }}</td></tr>
113
+ {%- endif %}<td>{{ f.ext }}</td><td>{{ f.dt }}</td></tr>
114
114
  {%- endfor %}
115
115
 
116
116
  </tbody>
Binary file
copyparty/web/rups.html CHANGED
@@ -33,6 +33,7 @@
33
33
 
34
34
  var SR="{{ r }}",
35
35
  lang="{{ lang }}",
36
+ dutc={{ this.args.js_utc }},
36
37
  dfavico="{{ favico }}";
37
38
 
38
39
  var STG = window.localStorage;
copyparty/web/rups.js.gz CHANGED
Binary file
copyparty/web/shares.html CHANGED
@@ -66,6 +66,7 @@
66
66
  var SR="{{ r }}",
67
67
  shr="{{ shr }}",
68
68
  lang="{{ lang }}",
69
+ dutc={{ this.args.js_utc }},
69
70
  dfavico="{{ favico }}";
70
71
 
71
72
  var STG = window.localStorage;
Binary file
Binary file
copyparty/web/up2k.js.gz CHANGED
Binary file
copyparty/web/util.js.gz CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: copyparty
3
- Version: 1.18.8
3
+ Version: 1.18.9
4
4
  Summary: Portable file server with accelerated resumable uploads, deduplication, WebDAV, FTP, zeroconf, media indexer, video thumbnails, audio transcoding, and write-only folders
5
5
  Author-email: ed <copyparty@ocv.me>
6
6
  License: MIT
@@ -210,6 +210,7 @@ just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/
210
210
  * or install [on arch](#arch-package) ╱ [on NixOS](#nixos-module) ╱ [through nix](#nix-package)
211
211
  * or if you are on android, [install copyparty in termux](#install-on-android)
212
212
  * or maybe you have a [synology nas / dsm](./docs/synology-dsm.md)
213
+ * or if you have [uv](https://docs.astral.sh/uv/) installed, run `uv tool run copyparty`
213
214
  * or if your computer is messed up and nothing else works, [try the pyz](#zipapp)
214
215
  * or if your OS is dead, give the [bootable flashdrive / cd-rom](https://a.ocv.me/pub/stuff/edcd001/enterprise-edition/) a spin
215
216
  * or if you don't trust copyparty yet and want to isolate it a little, then...
@@ -1,7 +1,7 @@
1
1
  copyparty/__init__.py,sha256=4aJw_Mt3eSNMV8sJ95Nh4ris-tBUYhCOV094Rnxa5Xo,2651
2
- copyparty/__main__.py,sha256=vs0_3Ba4k4BbYF34V3loxPB0Dds_T1akBr44mpXv3TQ,127567
3
- copyparty/__version__.py,sha256=gGmXPkDwpbWAAYBiY30YUl4LnUf0n2C8Y-YiLOAYwuk,249
4
- copyparty/authsrv.py,sha256=luOWk3_6ZvCJI8bp6UmBPSeyQT02HH5Nf6vnakCwzGI,122483
2
+ copyparty/__main__.py,sha256=voGZLR6chtYQGJgsfjcUYk9rhRGU3zwnpbRSfMpPNXE,127673
3
+ copyparty/__version__.py,sha256=vPZH_BWBXQ3lZl1cfIPpgNLx29TvHsPpesL3B_9BvfA,248
4
+ copyparty/authsrv.py,sha256=CHKI5MmroVe7s1oTDkCBG18aFOhpuFbDmqcVMuK5j-E,122551
5
5
  copyparty/broker_mp.py,sha256=QdOXXvV2Xn6J0CysEqyY3GZbqxQMyWnTpnba-a5lMc0,4987
6
6
  copyparty/broker_mpw.py,sha256=PpSS4SK3pItlpfD8OwVr3QmJEPKlUgaf2nuMOozixgU,3347
7
7
  copyparty/broker_thr.py,sha256=fjoYtpSscUA7-nMl4r1n2R7UK3J9lrvLS3rUZ-iJzKQ,1721
@@ -11,7 +11,7 @@ copyparty/cfg.py,sha256=THceFupFmsZWF8iJKDDHR_XUEU3TNQgDRJB50iLiC1k,15734
11
11
  copyparty/dxml.py,sha256=vu5uZQtwvwoqnFHbULs2Zh_y2DETu0T-ENpMZ1i2CV4,2505
12
12
  copyparty/fsutil.py,sha256=NC_CJC4TDag399vVDH9_uQfdfpTMwRFLNxERSWhlVvs,4594
13
13
  copyparty/ftpd.py,sha256=S0w6iMR8AlzLc_Aqn-TKuUJ-vNbmeQF6SQs614-NFOE,18107
14
- copyparty/httpcli.py,sha256=hoc9p9iJ_WegTrUbLTAOkwwqltnvw35eQLO0_ZzvN3I,231645
14
+ copyparty/httpcli.py,sha256=sY5MjJYYj2Q3nrlvTMl-a7QOJrVcSI_tlgUeRnzqACg,232778
15
15
  copyparty/httpconn.py,sha256=IA9fdCjigawZ4kWhgvVN3nSiy5pb3W2qaE6rFqUYdq0,6943
16
16
  copyparty/httpsrv.py,sha256=MCNjOEH_xM2qXCLGcoN6W0RhWlikv68-zBx0nICIheU,18864
17
17
  copyparty/ico.py,sha256=-7QjF_jIxnPo4Vr0oUPksQ_U_Ef0HRsSPm3s71idOz8,3879
@@ -24,15 +24,15 @@ copyparty/smbd.py,sha256=Czo8SRkkl4ndCwEUe9Cbr8v0YOnyQHzubGSguPizuTc,14651
24
24
  copyparty/ssdp.py,sha256=R1Z61GZOxBMF2Sk4RTxKWMOemogmcjEWG-CvLihd45k,7023
25
25
  copyparty/star.py,sha256=tV5BbX6AiQ7N4UU8DYtSTckNYeoeey4DBqq4LjfymbY,3818
26
26
  copyparty/sutil.py,sha256=E65jAaOzHlJYnqsOKDMPVT8kALPUVexpkSStWBdItkY,3231
27
- copyparty/svchub.py,sha256=LVhCj0IxHBlGdDbX-At_wAQioQ2MQD2WPbofHzA08B0,49083
27
+ copyparty/svchub.py,sha256=lAa-4HfD1LSv3Sn3pOtgLWGHyPhtGDXSCzGvpVB21E0,49140
28
28
  copyparty/szip.py,sha256=9srQzjsTBrBadf6QMh4YRAL70rkZLevAOHqXWK5jvr8,8846
29
29
  copyparty/tcpsrv.py,sha256=BCOqlT_mRu1ibHJpPzvf9c4h83AnIMEfd8nBBednCCg,20484
30
30
  copyparty/tftpd.py,sha256=QuPcdx77gLmEpit3lLc0x4Px6BrBBKJpJl4VqINc5O8,14254
31
31
  copyparty/th_cli.py,sha256=IEX5tCb0gw9Z2aRIDL9bwdvJ6g5jhWZ8OEAAz16_xN4,5426
32
32
  copyparty/th_srv.py,sha256=S6ChazjXwXevUxkAajwIwHzA16PyNIwv6kYRFakvLmY,32759
33
33
  copyparty/u2idx.py,sha256=4Y5OOPyVkc-pS0z6e3p4StXAMnjHobSOMmMsvNUTD34,13674
34
- copyparty/up2k.py,sha256=n1ZSEopnFmXbjPEU_B84T3i2nCXvIuLuY308uM4UaJQ,179150
35
- copyparty/util.py,sha256=JYqpB6OM2l6J6sfPphgq5q7JzV95MxAtKIvGXMPAPhk,105423
34
+ copyparty/up2k.py,sha256=QGB2D8ZKlgyAFaY6qoa-KMd_RComhW6F2kP2ukgEsyQ,179269
35
+ copyparty/util.py,sha256=XQN86nmxN4RgWWw4k1dIbWeIAR_Dqh_7Z4X9WobwRFI,105732
36
36
  copyparty/bos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  copyparty/bos/bos.py,sha256=DYt5mJJNt-935rU7HRm8kt_whpcVSI0uSphvD7PXrJo,2247
38
38
  copyparty/bos/path.py,sha256=yEjCq2ki9CvxA5sCT8pS0keEXwugs0ZeUyUhdBziOCI,777
@@ -56,8 +56,8 @@ copyparty/stolen/ifaddr/_shared.py,sha256=uNC4SdEIgdSLKvuUzsf1aM-H1Xrc_9mpLoOT43
56
56
  copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
57
57
  copyparty/web/baguettebox.js.gz,sha256=MxRofvhXjmUN7RtXtC17_9AlROVNUT-66WwJ_pHLY9c,8258
58
58
  copyparty/web/browser.css.gz,sha256=29D3F4uB-VMd6uJo-SxWAwLfn08jcETYZm0SOJFJLAE,11847
59
- copyparty/web/browser.html,sha256=FKyez1jN3I7iG7VlAjZDtNi6PenYue22mahThVv4BTA,4792
60
- copyparty/web/browser.js.gz,sha256=yMy_s-cgUH8Vo0cos3lIZTqaBxyfJpphOGK0oM02jAc,111316
59
+ copyparty/web/browser.html,sha256=lhelkXI8_HGfuqo_5b6XEGzf8VNodOMXE9kbv31JtbM,4790
60
+ copyparty/web/browser.js.gz,sha256=crq0Io0MHZFAOfX7tfWSnp1CixbsNPa7FaGIUT3T-gA,170979
61
61
  copyparty/web/browser2.html,sha256=NRUZ08GH-e2YcGXcoz0UjYg6JIVF42u4IMX4HHwWTmg,1587
62
62
  copyparty/web/cf.html,sha256=lJThtNFNAQT1ClCHHlivAkDGE0LutedwopXD62Z8Nys,589
63
63
  copyparty/web/dbg-audio.js.gz,sha256=Ma-KZtK8LnmiwNvNKFKXMPYl_Nn_3U7GsJ6-DRWC2HE,688
@@ -73,23 +73,23 @@ copyparty/web/mde.js.gz,sha256=kN2eUSvr4mFuksfK4-4LimJmWdwsao39Sea2lWtu8L0,2224
73
73
  copyparty/web/msg.css.gz,sha256=u90fXYAVrMD-jqwf5XFVC1ptSpSHZUe8Mez6PX101P8,300
74
74
  copyparty/web/msg.html,sha256=w9CM3hkLLGJX9fWEaG4gSbTOPe2GcPqW8BpSCDiFzOI,977
75
75
  copyparty/web/rups.css.gz,sha256=pWklsym27oGGr-8tYQR7WnZvGZElAgCwLzlwTDErNAM,647
76
- copyparty/web/rups.html,sha256=iPuz53jBT_mIWIfl1yrjjg5-P7oO2ada6fTFq8PgjGk,1479
77
- copyparty/web/rups.js.gz,sha256=nvvcG8L-fkm7zkhjnlTGhBp_KD0j08mtHEW0sB7zy-Y,854
76
+ copyparty/web/rups.html,sha256=36UfDfHYMltw7_qAWGUGeRF8zaCSw2EjclhsymW94n0,1512
77
+ copyparty/web/rups.js.gz,sha256=99RaGb6fhpER4_eNyauN7yOhA8NFcO4qNKazlnyrano,854
78
78
  copyparty/web/shares.css.gz,sha256=SdPlZCBwz9tkPkgEo5pSPDOZSI079njxEfkJ64-iW3c,547
79
- copyparty/web/shares.html,sha256=YctvUrKuBYu42kxVylyW2_DEHm7Ik6uHqzfzVZ4N0ac,2545
80
- copyparty/web/shares.js.gz,sha256=NQzrF57cikU38NzoaWQhbrINWkQBZhu1sH0jAC2SESQ,967
79
+ copyparty/web/shares.html,sha256=ZZ9BIuzhbVtJCAZOb_PAaEY_z9jo8i93QEJolNDHX3g,2578
80
+ copyparty/web/shares.js.gz,sha256=KEOx1OxQeEQNHNjsPXCvtWGFIRQSKy_tP7XSvreNCXk,966
81
81
  copyparty/web/splash.css.gz,sha256=S8_A7JJl71xACRBYGzafeaD82OacW6Fa7oKPiNyrhAs,1087
82
82
  copyparty/web/splash.html,sha256=0MvDe1lKfGqczi7d4nKjWjG0cRVyvs8J6sDEj3DCPSI,6376
83
- copyparty/web/splash.js.gz,sha256=6ag8Szmjd_S1jr2D0-DgubM1F6Fq7dUU7A8E-qBY2gI,3702
83
+ copyparty/web/splash.js.gz,sha256=8GtUHvIQiOpa3VosmovP4zJT3qTV6lENrJCDtPSZuiY,6278
84
84
  copyparty/web/svcs.html,sha256=mamJdq0hsmHqG2BQsf9jg8G9bAl338wUhUZ2WtXOlGQ,14865
85
85
  copyparty/web/svcs.js.gz,sha256=AYatNKyT_bKRWX8sb3WD_iujBY3L4P7HWBrsuMctsLs,722
86
86
  copyparty/web/ui.css.gz,sha256=e3iIflzddmjoyPrun_1jsu9j7fbdonNQLyhEE2oKKOQ,2819
87
- copyparty/web/up2k.js.gz,sha256=_uOZzORAFO91SG3TUHd9xhKhAIXwL3fUFBNEUKnEVHY,24812
88
- copyparty/web/util.js.gz,sha256=zC_5OONJOR2g33uVlyn4GufUWIOvVZCleUY-VW3lnTc,15327
87
+ copyparty/web/up2k.js.gz,sha256=aoq6uXrL77zlYQnx9y9VNUVL7YBOHc4u-zFlIrQSX14,24811
88
+ copyparty/web/util.js.gz,sha256=nqWl2JXpw9nVirYbwm4zpWPnonLBLpqHB6g8vncJ86Q,15499
89
89
  copyparty/web/w.hash.js.gz,sha256=cFH6Xo4YRgH9Wr7RmHMSEfpuTmmIvEmzmSvv4RLmyPU,1193
90
90
  copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
91
  copyparty/web/a/partyfuse.py,sha256=9p5Hpg_IBiSimv7j9kmPhCGpy-FLXSRUOYnLjJ5JifU,28049
92
- copyparty/web/a/u2c.py,sha256=auXzLj04dt_lw4H70PhNUK0GjrQEThrybo2-77SLsUg,53165
92
+ copyparty/web/a/u2c.py,sha256=f_KR1ZhOjJYBnyYlJbBXY-TnNITeT7HOf0R3pR_9DIM,53248
93
93
  copyparty/web/a/webdav-cfg.bat,sha256=Y4NoGZlksAIg4cBMb7KdJrpKC6Nx97onaTl6yMjaimk,1449
94
94
  copyparty/web/dd/2.png,sha256=gJ14XFPzaw95L6z92fSq9eMPikSQyu-03P1lgiGe0_I,258
95
95
  copyparty/web/dd/3.png,sha256=4lho8Koz5tV7jJ4ODo6GMTScZfkqsT05yp48EDFIlyg,252
@@ -110,9 +110,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV
110
110
  copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
111
111
  copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
112
112
  copyparty/web/deps/sha512.hw.js.gz,sha256=UAed2_ocklZCnIzcSYz2h4P1ycztlCLj-ewsRTud2lU,7939
113
- copyparty-1.18.8.dist-info/licenses/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
114
- copyparty-1.18.8.dist-info/METADATA,sha256=mB3n9kkOR5sdmH_0tpAPDDbQbsPd2nfzlvNRRpY8YzY,167745
115
- copyparty-1.18.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
- copyparty-1.18.8.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
117
- copyparty-1.18.8.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
118
- copyparty-1.18.8.dist-info/RECORD,,
113
+ copyparty-1.18.9.dist-info/licenses/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
114
+ copyparty-1.18.9.dist-info/METADATA,sha256=C696ifH8fB2Wc9FgyFvi21nc4kvfwMZ0WUn_WPBTnUo,167834
115
+ copyparty-1.18.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
+ copyparty-1.18.9.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
117
+ copyparty-1.18.9.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
118
+ copyparty-1.18.9.dist-info/RECORD,,