copyparty 1.16.17__py3-none-any.whl → 1.16.19__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/up2k.py CHANGED
@@ -2,7 +2,6 @@
2
2
  from __future__ import print_function, unicode_literals
3
3
 
4
4
  import errno
5
- import gzip
6
5
  import hashlib
7
6
  import json
8
7
  import math
@@ -42,6 +41,7 @@ from .util import (
42
41
  fsenc,
43
42
  gen_filekey,
44
43
  gen_filekey_dbg,
44
+ gzip,
45
45
  hidedir,
46
46
  humansize,
47
47
  min_ex,
@@ -91,7 +91,7 @@ VF_AFFECTS_INDEXING = set(zsg.split(" "))
91
91
 
92
92
  SBUSY = "cannot receive uploads right now;\nserver busy with %s.\nPlease wait; the client will retry..."
93
93
 
94
- HINT_HISTPATH = "you could try moving the database to another location (preferably an SSD or NVME drive) using either the --hist argument (global option for all volumes), or the hist volflag (just for this volume)"
94
+ HINT_HISTPATH = "you could try moving the database to another location (preferably an SSD or NVME drive) using either the --hist argument (global option for all volumes), or the hist volflag (just for this volume), or, if you want to keep the thumbnails in the current location and only move the database itself, then use --dbpath or volflag dbpath"
95
95
 
96
96
 
97
97
  NULLSTAT = os.stat_result((0, -1, -1, 0, 0, 0, 0, 0, 0, 0))
@@ -1089,9 +1089,9 @@ class Up2k(object):
1089
1089
  self, ptop , flags
1090
1090
  ) :
1091
1091
  """mutex(main,reg) me"""
1092
- histpath = self.vfs.histtab.get(ptop)
1092
+ histpath = self.vfs.dbpaths.get(ptop)
1093
1093
  if not histpath:
1094
- self.log("no histpath for %r" % (ptop,))
1094
+ self.log("no dbpath for %r" % (ptop,))
1095
1095
  return None
1096
1096
 
1097
1097
  db_path = os.path.join(histpath, "up2k.db")
@@ -1336,12 +1336,15 @@ class Up2k(object):
1336
1336
  ]
1337
1337
  excl += [absreal(x) for x in excl]
1338
1338
  excl += list(self.vfs.histtab.values())
1339
+ excl += list(self.vfs.dbpaths.values())
1339
1340
  if WINDOWS:
1340
1341
  excl = [x.replace("/", "\\") for x in excl]
1341
1342
  else:
1342
1343
  # ~/.wine/dosdevices/z:/ and such
1343
1344
  excl.extend(("/dev", "/proc", "/run", "/sys"))
1344
1345
 
1346
+ excl = list({k: 1 for k in excl})
1347
+
1345
1348
  if self.args.re_dirsz:
1346
1349
  db.c.execute("delete from ds")
1347
1350
  db.n += 1
@@ -2903,7 +2906,6 @@ class Up2k(object):
2903
2906
  if ptop not in self.registry:
2904
2907
  raise Pebkac(410, "location unavailable")
2905
2908
 
2906
- cj["name"] = sanitize_fn(cj["name"], "")
2907
2909
  cj["poke"] = now = self.db_act = self.vol_act[ptop] = time.time()
2908
2910
  wark = dwark = self._get_wark(cj)
2909
2911
  job = None
@@ -3220,6 +3222,7 @@ class Up2k(object):
3220
3222
  job["ptop"] = vfs.realpath
3221
3223
  job["vtop"] = vfs.vpath
3222
3224
  job["prel"] = rem
3225
+ job["name"] = sanitize_fn(job["name"], "")
3223
3226
  if zvfs.vpath != vfs.vpath:
3224
3227
  # print(json.dumps(job, sort_keys=True, indent=4))
3225
3228
  job["hash"] = cj["hash"]
@@ -3692,8 +3695,9 @@ class Up2k(object):
3692
3695
  if self.idx_wark(vflags, *z2):
3693
3696
  del self.registry[ptop][wark]
3694
3697
  else:
3695
- for k in "host tnam busy sprs poke t0c".split():
3698
+ for k in "host tnam busy sprs poke".split():
3696
3699
  del job[k]
3700
+ job.pop("t0c", None)
3697
3701
  job["t0"] = int(job["t0"])
3698
3702
  job["hash"] = []
3699
3703
  job["done"] = 1
@@ -4972,6 +4976,7 @@ class Up2k(object):
4972
4976
  job["ptop"] = vfs.realpath
4973
4977
  job["vtop"] = vfs.vpath
4974
4978
  job["prel"] = rem
4979
+ job["name"] = sanitize_fn(job["name"], "")
4975
4980
  if zvfs.vpath != vfs.vpath:
4976
4981
  self.log("xbu reloc2:%d..." % (depth,), 6)
4977
4982
  return self._handle_json(job, depth + 1)
@@ -5076,7 +5081,7 @@ class Up2k(object):
5076
5081
 
5077
5082
  def _snap_reg(self, ptop , reg ) :
5078
5083
  now = time.time()
5079
- histpath = self.vfs.histtab.get(ptop)
5084
+ histpath = self.vfs.dbpaths.get(ptop)
5080
5085
  if not histpath:
5081
5086
  return
5082
5087
 
copyparty/util.py CHANGED
@@ -31,6 +31,17 @@ from collections import Counter
31
31
  from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network
32
32
  from queue import Queue
33
33
 
34
+ try:
35
+ from zlib_ng import gzip_ng as gzip
36
+ from zlib_ng import zlib_ng as zlib
37
+
38
+ sys.modules["gzip"] = gzip
39
+ # sys.modules["zlib"] = zlib
40
+ # `- somehow makes tarfile 3% slower with default malloc, and barely faster with mimalloc
41
+ except:
42
+ import gzip
43
+ import zlib
44
+
34
45
  from .__init__ import (
35
46
  ANYWIN,
36
47
  EXE,
@@ -103,8 +114,14 @@ IP6ALL = "0:0:0:0:0:0:0:0"
103
114
 
104
115
 
105
116
  try:
106
- import ctypes
107
117
  import fcntl
118
+
119
+ HAVE_FCNTL = True
120
+ except:
121
+ HAVE_FCNTL = False
122
+
123
+ try:
124
+ import ctypes
108
125
  import termios
109
126
  except:
110
127
  pass
@@ -213,6 +230,9 @@ SYMTIME = PY36 and os.utime in os.supports_follow_symlinks
213
230
 
214
231
  META_NOBOTS = '<meta name="robots" content="noindex, nofollow">\n'
215
232
 
233
+ # smart enough to understand javascript while also ignoring rel="nofollow"
234
+ BAD_BOTS = r"Barkrowler|bingbot|BLEXBot|Googlebot|GoogleOther|GPTBot|PetalBot|SeekportBot|SemrushBot|YandexBot"
235
+
216
236
  FFMPEG_URL = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z"
217
237
 
218
238
  URL_PRJ = "https://github.com/9001/copyparty"
@@ -427,6 +447,8 @@ UNHUMANIZE_UNITS = {
427
447
 
428
448
  VF_CAREFUL = {"mv_re_t": 5, "rm_re_t": 5, "mv_re_r": 0.1, "rm_re_r": 0.1}
429
449
 
450
+ FN_EMB = set([".prologue.html", ".epilogue.html", "readme.md", "preadme.md"])
451
+
430
452
 
431
453
  def read_ram() :
432
454
  a = b = 0
@@ -1369,8 +1391,6 @@ def stackmon(fp , ival , suffix ) :
1369
1391
  buf = st.encode("utf-8", "replace")
1370
1392
 
1371
1393
  if fp.endswith(".gz"):
1372
- import gzip
1373
-
1374
1394
  # 2459b 2304b 2241b 2202b 2194b 2191b lv3..8
1375
1395
  # 0.06s 0.08s 0.11s 0.13s 0.16s 0.19s
1376
1396
  buf = gzip.compress(buf, compresslevel=6)
@@ -1450,6 +1470,12 @@ def vol_san(vols , txt ) :
1450
1470
  txt = txt.replace(bap.replace(b"\\", b"\\\\"), bvp)
1451
1471
  txt = txt.replace(bhp.replace(b"\\", b"\\\\"), bvph)
1452
1472
 
1473
+ if vol.histpath != vol.dbpath:
1474
+ bdp = vol.dbpath.encode("utf-8")
1475
+ bdph = b"$db(/" + bvp + b")"
1476
+ txt = txt.replace(bdp, bdph)
1477
+ txt = txt.replace(bdp.replace(b"\\", b"\\\\"), bdph)
1478
+
1453
1479
  if txt != txt0:
1454
1480
  txt += b"\r\nNOTE: filepaths sanitized; see serverlog for correct values"
1455
1481
 
@@ -3829,8 +3855,74 @@ def hidedir(dp) :
3829
3855
  pass
3830
3856
 
3831
3857
 
3858
+ _flocks = {}
3859
+
3860
+
3861
+ def _lock_file_noop(ap ) :
3862
+ return True
3863
+
3864
+
3865
+ def _lock_file_ioctl(ap ) :
3866
+ try:
3867
+ fd = _flocks.pop(ap)
3868
+ os.close(fd)
3869
+ except:
3870
+ pass
3871
+
3872
+ fd = os.open(ap, os.O_RDWR | os.O_CREAT, 438)
3873
+ # NOTE: the fcntl.lockf identifier is (pid,node);
3874
+ # the lock will be dropped if os.close(os.open(ap))
3875
+ # is performed anywhere else in this thread
3876
+
3877
+ try:
3878
+ fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
3879
+ _flocks[ap] = fd
3880
+ return True
3881
+ except Exception as ex:
3882
+ eno = getattr(ex, "errno", -1)
3883
+ try:
3884
+ os.close(fd)
3885
+ except:
3886
+ pass
3887
+ if eno in (errno.EAGAIN, errno.EACCES):
3888
+ return False
3889
+ print("WARNING: unexpected errno %d from fcntl.lockf; %r" % (eno, ex))
3890
+ return True
3891
+
3892
+
3893
+ def _lock_file_windows(ap ) :
3894
+ try:
3895
+ import msvcrt
3896
+
3897
+ try:
3898
+ fd = _flocks.pop(ap)
3899
+ os.close(fd)
3900
+ except:
3901
+ pass
3902
+
3903
+ fd = os.open(ap, os.O_RDWR | os.O_CREAT, 438)
3904
+ msvcrt.locking(fd, msvcrt.LK_NBLCK, 1)
3905
+ return True
3906
+ except Exception as ex:
3907
+ eno = getattr(ex, "errno", -1)
3908
+ if eno == errno.EACCES:
3909
+ return False
3910
+ print("WARNING: unexpected errno %d from msvcrt.locking; %r" % (eno, ex))
3911
+ return True
3912
+
3913
+
3914
+ if os.environ.get("PRTY_NO_DB_LOCK"):
3915
+ lock_file = _lock_file_noop
3916
+ elif ANYWIN:
3917
+ lock_file = _lock_file_windows
3918
+ elif HAVE_FCNTL:
3919
+ lock_file = _lock_file_ioctl
3920
+ else:
3921
+ lock_file = _lock_file_noop
3922
+
3923
+
3832
3924
  try:
3833
- if sys.version_info < (3, 10):
3925
+ if sys.version_info < (3, 10) or os.environ.get("PRTY_NO_IMPRESO"):
3834
3926
  # py3.8 doesn't have .files
3835
3927
  # py3.9 has broken .is_file
3836
3928
  raise ImportError()
@@ -3958,9 +4050,22 @@ class WrongPostKey(Pebkac):
3958
4050
  self.datagen = datagen
3959
4051
 
3960
4052
 
3961
- _ = (mp, BytesIO, quote, unquote, SQLITE_VER, JINJA_VER, PYFTPD_VER, PARTFTPY_VER)
4053
+ _ = (
4054
+ gzip,
4055
+ mp,
4056
+ zlib,
4057
+ BytesIO,
4058
+ quote,
4059
+ unquote,
4060
+ SQLITE_VER,
4061
+ JINJA_VER,
4062
+ PYFTPD_VER,
4063
+ PARTFTPY_VER,
4064
+ )
3962
4065
  __all__ = [
4066
+ "gzip",
3963
4067
  "mp",
4068
+ "zlib",
3964
4069
  "BytesIO",
3965
4070
  "quote",
3966
4071
  "unquote",
Binary file
Binary file
Binary file
copyparty/web/ui.css.gz CHANGED
Binary file
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: copyparty
3
- Version: 1.16.17
3
+ Version: 1.16.19
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
@@ -54,6 +54,7 @@ Provides-Extra: pwhash
54
54
  Requires-Dist: argon2-cffi; extra == "pwhash"
55
55
  Provides-Extra: zeromq
56
56
  Requires-Dist: pyzmq; extra == "zeromq"
57
+ Dynamic: license-file
57
58
 
58
59
  <img src="https://github.com/9001/copyparty/raw/hovudstraum/docs/logo.svg" width="250" align="right"/>
59
60
 
@@ -157,7 +158,7 @@ turn almost any device into a file server with resumable uploads/downloads using
157
158
  * [custom mimetypes](#custom-mimetypes) - change the association of a file extension
158
159
  * [GDPR compliance](#GDPR-compliance) - imagine using copyparty professionally...
159
160
  * [feature chickenbits](#feature-chickenbits) - buggy feature? rip it out
160
- * [feature beefybits](#feature-beefybits) - force-enable incompatible features
161
+ * [feature beefybits](#feature-beefybits) - force-enable features with known issues on your OS/env
161
162
  * [packages](#packages) - the party might be closer than you think
162
163
  * [arch package](#arch-package) - now [available on aur](https://aur.archlinux.org/packages/copyparty) maintained by [@icxes](https://github.com/icxes)
163
164
  * [fedora package](#fedora-package) - does not exist yet
@@ -338,6 +339,8 @@ small collection of user feedback
338
339
 
339
340
  `good enough`, `surprisingly correct`, `certified good software`, `just works`, `why`, `wow this is better than nextcloud`
340
341
 
342
+ * UI просто ужасно. Если буду описывать детально не смогу удержаться в рамках приличий
343
+
341
344
 
342
345
  # motivations
343
346
 
@@ -386,7 +389,8 @@ roughly sorted by chance of encounter
386
389
  * `--th-ff-jpg` may fix video thumbnails on some FFmpeg versions (macos, some linux)
387
390
  * `--th-ff-swr` may fix audio thumbnails on some FFmpeg versions
388
391
  * if the `up2k.db` (filesystem index) is on a samba-share or network disk, you'll get unpredictable behavior if the share is disconnected for a bit
389
- * use `--hist` or the `hist` volflag (`-v [...]:c,hist=/tmp/foo`) to place the db on a local disk instead
392
+ * use `--hist` or the `hist` volflag (`-v [...]:c,hist=/tmp/foo`) to place the db and thumbnails on a local disk instead
393
+ * or, if you only want to move the db (and not the thumbnails), then use `--dbpath` or the `dbpath` volflag
390
394
  * all volumes must exist / be available on startup; up2k (mtp especially) gets funky otherwise
391
395
  * probably more, pls let me know
392
396
 
@@ -439,7 +443,8 @@ same order here too
439
443
  * this is an msys2 bug, the regular windows edition of python is fine
440
444
 
441
445
  * VirtualBox: sqlite throws `Disk I/O Error` when running in a VM and the up2k database is in a vboxsf
442
- * use `--hist` or the `hist` volflag (`-v [...]:c,hist=/tmp/foo`) to place the db inside the vm instead
446
+ * use `--hist` or the `hist` volflag (`-v [...]:c,hist=/tmp/foo`) to place the db and thumbnails inside the vm instead
447
+ * or, if you only want to move the db (and not the thumbnails), then use `--dbpath` or the `dbpath` volflag
443
448
  * also happens on mergerfs, so put the db elsewhere
444
449
 
445
450
  * Ubuntu: dragging files from certain folders into firefox or chrome is impossible
@@ -861,6 +866,8 @@ if you are resuming a massive upload and want to skip hashing the files which al
861
866
 
862
867
  if the server is behind a proxy which imposes a request-size limit, you can configure up2k to sneak below the limit with server-option `--u2sz` (the default is 96 MiB to support Cloudflare)
863
868
 
869
+ if you want to replace existing files on the server with new uploads by default, run with `--u2ow 2` (only works if users have the delete-permission, and can still be disabled with `🛡️` in the UI)
870
+
864
871
 
865
872
  ### file-search
866
873
 
@@ -1649,6 +1656,8 @@ copyparty creates a subfolder named `.hist` inside each volume where it stores t
1649
1656
  this can instead be kept in a single place using the `--hist` argument, or the `hist=` volflag, or a mix of both:
1650
1657
  * `--hist ~/.cache/copyparty -v ~/music::r:c,hist=-` sets `~/.cache/copyparty` as the default place to put volume info, but `~/music` gets the regular `.hist` subfolder (`-` restores default behavior)
1651
1658
 
1659
+ by default, the per-volume `up2k.db` sqlite3-database for `-e2d` and `-e2t` is stored next to the thumbnails according to the `--hist` option, but the global-option `--dbpath` and/or volflag `dbpath` can be used to put the database somewhere else
1660
+
1652
1661
  note:
1653
1662
  * putting the hist-folders on an SSD is strongly recommended for performance
1654
1663
  * markdown edits are always stored in a local `.hist` subdirectory
@@ -2184,7 +2193,9 @@ buggy feature? rip it out by setting any of the following environment variables
2184
2193
 
2185
2194
  | env-var | what it does |
2186
2195
  | -------------------- | ------------ |
2196
+ | `PRTY_NO_DB_LOCK` | do not lock session/shares-databases for exclusive access |
2187
2197
  | `PRTY_NO_IFADDR` | disable ip/nic discovery by poking into your OS with ctypes |
2198
+ | `PRTY_NO_IMPRESO` | do not try to load js/css files using `importlib.resources` |
2188
2199
  | `PRTY_NO_IPV6` | disable some ipv6 support (should not be necessary since windows 2000) |
2189
2200
  | `PRTY_NO_LZMA` | disable streaming xz compression of incoming uploads |
2190
2201
  | `PRTY_NO_MP` | disable all use of the python `multiprocessing` module (actual multithreading, cpu-count for parsers/thumbnailers) |
@@ -2502,6 +2513,8 @@ below are some tweaks roughly ordered by usefulness:
2502
2513
  * `--no-hash .` when indexing a network-disk if you don't care about the actual filehashes and only want the names/tags searchable
2503
2514
  * if your volumes are on a network-disk such as NFS / SMB / s3, specifying larger values for `--iobuf` and/or `--s-rd-sz` and/or `--s-wr-sz` may help; try setting all of them to `524288` or `1048576` or `4194304`
2504
2515
  * `--no-htp --hash-mt=0 --mtag-mt=1 --th-mt=1` minimizes the number of threads; can help in some eccentric environments (like the vscode debugger)
2516
+ * when running on AlpineLinux or other musl-based distro, try mimalloc for higher performance (and twice as much RAM usage); `apk add mimalloc2` and run copyparty with env-var `LD_PRELOAD=/usr/lib/libmimalloc-secure.so.2`
2517
+ * note that mimalloc requires special care when combined with prisonparty and/or bubbleparty/bubblewrap; you must give it access to `/proc` and `/sys` otherwise you'll encounter issues with FFmpeg (audio transcoding, thumbnails)
2505
2518
  * `-j0` enables multiprocessing (actual multithreading), can reduce latency to `20+80/numCores` percent and generally improve performance in cpu-intensive workloads, for example:
2506
2519
  * lots of connections (many users or heavy clients)
2507
2520
  * simultaneous downloads and uploads saturating a 20gbps connection
@@ -1,38 +1,38 @@
1
- copyparty/__init__.py,sha256=VR6ZZhB9IxaK5TDXDTBM_OIP5ydkrdbaEnstktLM__s,2649
2
- copyparty/__main__.py,sha256=hlYwQuq_c1ML_Mkn4U3YSOllU-SavqtkMt72VMdi9os,117346
3
- copyparty/__version__.py,sha256=ouQegJYN1YmTy_TtphfQsiIWHiCpzBMamgsfT-_sPxU,252
4
- copyparty/authsrv.py,sha256=nZ27CC3HxwVbbCLPMEO9v6NZV7pLYP3euwrQ9qwT3gg,111163
1
+ copyparty/__init__.py,sha256=TnFSStmHlwlRIClWW8jSHxZpt3dl_kN6_pEnqBqh3mE,2638
2
+ copyparty/__main__.py,sha256=RuEnJf0a2d7ZbV2bOBj43iNkdBIG_zDUh0DbVUgsc50,119139
3
+ copyparty/__version__.py,sha256=M7ZuH7-ojW4ae8FrXsuVGdN6xOoyyx4SciZROZSQbUg,251
4
+ copyparty/authsrv.py,sha256=S4HrUq-C6wpe_IT3KN75yo9GJw9Uzj5y558ooYCQqng,113286
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
8
8
  copyparty/broker_util.py,sha256=76mfnFOpX1gUUvtjm8UQI7jpTIaVINX10QonM-B7ggc,1680
9
9
  copyparty/cert.py,sha256=0ZAPeXeMR164vWn9GQU3JDKooYXEq_NOQkDeg543ivg,8009
10
- copyparty/cfg.py,sha256=cL2_gysqgLR6kU_sqaq6XheED0jbbTcqBFGEnYj_pA4,13996
10
+ copyparty/cfg.py,sha256=EilhOIMLopgvn5j72MaRFS0q78K9Xf0NU0I7EAs3YAQ,14269
11
11
  copyparty/dxml.py,sha256=vu5uZQtwvwoqnFHbULs2Zh_y2DETu0T-ENpMZ1i2CV4,2505
12
12
  copyparty/fsutil.py,sha256=NC_CJC4TDag399vVDH9_uQfdfpTMwRFLNxERSWhlVvs,4594
13
- copyparty/ftpd.py,sha256=T97SFS7JFtvRLbJX8C4fJSYwe13vhN3-E6emtlVmqLA,17608
14
- copyparty/httpcli.py,sha256=O7iCliCPY57KzD_QI64cu7kS8UQIv1fo4BpmXo783kg,220444
13
+ copyparty/ftpd.py,sha256=G7PApVIFeSzRo4-D-9uRb8NxYgz6nFwTEbrOk1ErYCU,17969
14
+ copyparty/httpcli.py,sha256=pRZtGqx13FDCKpjxc4vlnqEuqVFLaXX7Ylx029bkCIw,222050
15
15
  copyparty/httpconn.py,sha256=mQSgljh0Q-jyWjF4tQLrHbRKRe9WKl19kGqsGMsJpWo,6880
16
16
  copyparty/httpsrv.py,sha256=pxH_Eh8ElBLvOEDejgpP9Bvk65HNEou-03aYIcgXhrs,18090
17
- copyparty/ico.py,sha256=eWSxEae4wOCfheHl-m-wchYvFRAR_97kJDb4NGaB-Z8,3561
17
+ copyparty/ico.py,sha256=-7QjF_jIxnPo4Vr0oUPksQ_U_Ef0HRsSPm3s71idOz8,3879
18
18
  copyparty/mdns.py,sha256=G73OWWg1copda47LgayCRK7qjVrk6cnUGpMR5ugmi7o,18315
19
19
  copyparty/metrics.py,sha256=1dim0ShnsD5cfspRbeN9Mt14wOIxPRtxCZY2IScikKw,8974
20
- copyparty/mtag.py,sha256=wWWc3BHMRP0u85KvdZpX3Dp4djDgAbXVrL9Pvab4nPQ,19925
20
+ copyparty/mtag.py,sha256=7lINRFc1Vrc-ebP2hU3dBHH3BRFOnEmEZ0jzlpYb8Jg,19910
21
21
  copyparty/multicast.py,sha256=Me4XEEJijvvK2lMRwmGU2hsaI5_E9AEpCjIC4b9UefA,12393
22
- copyparty/pwhash.py,sha256=X87RWeay8IhzGVZLDKE5LctF9YVUcYxPAJ1BX6r_9CU,4248
22
+ copyparty/pwhash.py,sha256=zHoz9FHGkFBxoRvSfG1XyjN3ibww_h5GE6_m5yS-fws,4246
23
23
  copyparty/smbd.py,sha256=dixFl2wlWymq_Cycc8a4cVB4gY8RSg2e3tE7Xr-aDa0,14614
24
24
  copyparty/ssdp.py,sha256=R1Z61GZOxBMF2Sk4RTxKWMOemogmcjEWG-CvLihd45k,7023
25
25
  copyparty/star.py,sha256=tV5BbX6AiQ7N4UU8DYtSTckNYeoeey4DBqq4LjfymbY,3818
26
26
  copyparty/sutil.py,sha256=6zEEGl4hRe6bTB83Y_RtnBGxr2JcUa__GdiAMqNJZnY,3208
27
- copyparty/svchub.py,sha256=EPkbchicmP5Acq64rhpIshL-zvGEltcRJelkzW_dx5s,41542
28
- copyparty/szip.py,sha256=HFtnwOiBgx0HMLUf-h_T84zSlRijPxmhRo5PM613kRA,8602
29
- copyparty/tcpsrv.py,sha256=2q18dGR8jnezA4SMfUXa-wrGRGX3nHIwkxkWvkTzF2A,19889
30
- copyparty/tftpd.py,sha256=PXgG4rTmiaU_TavSyZWD5cFphdfChs9YvNY21qfExt8,13611
31
- copyparty/th_cli.py,sha256=PxDAmUvO_8Vm5edXiWtsCft0Fw69QL9rCHf9zLmUNeA,4800
32
- copyparty/th_srv.py,sha256=tHbh_Ve3v8tYclWH2thLs5oFufeXgJi1duUMveKIx9k,30725
33
- copyparty/u2idx.py,sha256=G6MDbD4I_sJSOwaNFZ6XLTQhnEDrB12pVKuKhzQ_leE,13676
34
- copyparty/up2k.py,sha256=abULiz0KK3dcuw9hsapJBnueaqrCWry6rQe8VgsJITM,177330
35
- copyparty/util.py,sha256=QOl_gNH8eHYNrnvoNPpGgkGAq8vV-r_Kr5Tp30qZo-M,100520
27
+ copyparty/svchub.py,sha256=A2yxlg9hzilOypMKPlZOn80YzJ3A6W5pHWWLSAvji0I,45782
28
+ copyparty/szip.py,sha256=7_RVwHCGk7ON79sAB5HAIUbTEbjDDtn99141aGaI_MA,8596
29
+ copyparty/tcpsrv.py,sha256=L8jsmFhs6GdJYA58gnsUM1RDakFzHSQGlDcsaeTq-8w,20472
30
+ copyparty/tftpd.py,sha256=HAXNbIM7I3yFng_a4ubLWGQ4trRTineAZsUPTZDWNQs,14001
31
+ copyparty/th_cli.py,sha256=IEX5tCb0gw9Z2aRIDL9bwdvJ6g5jhWZ8OEAAz16_xN4,5426
32
+ copyparty/th_srv.py,sha256=-V4eNfAYzl-NkJrAjLGqU1cS1dUDS9QLK3iYiXoUz1U,31277
33
+ copyparty/u2idx.py,sha256=4Y5OOPyVkc-pS0z6e3p4StXAMnjHobSOMmMsvNUTD34,13674
34
+ copyparty/up2k.py,sha256=0Fj2yT2XnJ4MhwdEcDRs1T-gsdxVhdIxdaZSjGyGKBA,177682
35
+ copyparty/util.py,sha256=qkPD9LFPgLhpmCic_IBvutS2extujDiRrG75PnLMY90,102987
36
36
  copyparty/bos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  copyparty/bos/bos.py,sha256=Wb7eWsXJgR5AFlBR9ZOyKrLTwy-Kct9RrGiOu4Jo37Y,1622
38
38
  copyparty/bos/path.py,sha256=yEjCq2ki9CvxA5sCT8pS0keEXwugs0ZeUyUhdBziOCI,777
@@ -55,9 +55,9 @@ copyparty/stolen/ifaddr/_posix.py,sha256=-67NdfGrCktfQPakT2fLbjl2U00QMvyBGkSvrUu
55
55
  copyparty/stolen/ifaddr/_shared.py,sha256=uNC4SdEIgdSLKvuUzsf1aM-H1Xrc_9mpLoOT43YukGs,6206
56
56
  copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
57
57
  copyparty/web/baguettebox.js.gz,sha256=r2c_hOZV_RTyl4CqWWX14FDWP8nnDVwGkDl4Sfk0rU4,8239
58
- copyparty/web/browser.css.gz,sha256=_HiFW5vPUusWadoqdY8ZihuWizY9UECAc5nIamBPRi4,11654
58
+ copyparty/web/browser.css.gz,sha256=kPN35ttg9KAACfAB-aZnxFX1GQGqRnK0cLCZXBAu_lc,11654
59
59
  copyparty/web/browser.html,sha256=auvhLVE_t0aIN0q-nk0zOWFqITgDhroMAAviBNLoFfc,4788
60
- copyparty/web/browser.js.gz,sha256=48fDqIqQKCkrH0VsYVj03sDOx9gEZ-DfiHDaqEUuyr0,92341
60
+ copyparty/web/browser.js.gz,sha256=zxztzuGQuEr4SFTy_i_OWLJFe2ZnGWqz7hx0QeXPw8Y,92425
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
@@ -82,7 +82,7 @@ copyparty/web/splash.html,sha256=QEnTH9QZXFmAuyVtgqOuuHKBtIdi7uclpRqe0ZMewj4,624
82
82
  copyparty/web/splash.js.gz,sha256=4VqNznN10-bT33IJm3VWzBEJ1s08XZyxFB1TYPUkuAo,2739
83
83
  copyparty/web/svcs.html,sha256=dnE1fG15zOpq7u0GYt8ij6BUv_LTwsiipFeneVYlMsM,14140
84
84
  copyparty/web/svcs.js.gz,sha256=lMXEP9W-VlXyANlva4q0ASSxvvHYlE2CrmxGgZXZop0,713
85
- copyparty/web/ui.css.gz,sha256=0sHIwGsL3_xH8Uu6N0Ag3bKBTjf-e_yfFbKynEZXAnk,2800
85
+ copyparty/web/ui.css.gz,sha256=iDjrmq32aDN6l2S5AjCQdKjD6bxmzP6ji2WjM1FjKiU,2819
86
86
  copyparty/web/up2k.js.gz,sha256=VQVWBXK2gEz1b8if_ujXHNHnfBO7cdrKoSjqX397VUI,24519
87
87
  copyparty/web/util.js.gz,sha256=rD9iLfVLKRhxC8hmakal-s18xN_rs6GuOqyRPii6HQ8,15110
88
88
  copyparty/web/w.hash.js.gz,sha256=JhJagnqIkcKng_hs6otEgzcuQE7keToG_r5dd2o3EfU,1108
@@ -100,7 +100,7 @@ copyparty/web/deps/busy.mp3.gz,sha256=EVphk1_HYyRKJmtpeK99vbAstF7ub1f9ndu020H8PQ
100
100
  copyparty/web/deps/easymde.css.gz,sha256=vWxfueI64rPikuqFj69wJBtGisqf93AheQtOZqgUI_c,3041
101
101
  copyparty/web/deps/easymde.js.gz,sha256=rHBs4XWQe2bmv7ZzDIk43oxnTwrwpq5laYHhV5sKQQo,77014
102
102
  copyparty/web/deps/fuse.py,sha256=6j4Zy3VpQg629pwwIW77v2LJ1hy-qlyrxwhXfKl9B7I,33426
103
- copyparty/web/deps/marked.js.gz,sha256=M6FwmQujGDX33fpo32JZRbxqtSdPzmh7WcaHK6SpZlc,22650
103
+ copyparty/web/deps/marked.js.gz,sha256=6GrdpSikQ-tt9GrcAl7wA7mp_Il_2T2ZvBeACVX1j1k,22665
104
104
  copyparty/web/deps/mini-fa.css.gz,sha256=CTPrNaH8OTVmxajrGP88E2MkjadY9_81TBVnd9sw9Y8,572
105
105
  copyparty/web/deps/mini-fa.woff,sha256=L9DNncV2TIyvsrspMbJouvnnt7F068Hbn7YZYvN76AU,2784
106
106
  copyparty/web/deps/prism.css.gz,sha256=Z_A6rJ3MN5KWnjvXaV787aTW_5DT-xjFd0YZ7_W-Krk,1468
@@ -109,9 +109,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV
109
109
  copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
110
110
  copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
111
111
  copyparty/web/deps/sha512.hw.js.gz,sha256=UAed2_ocklZCnIzcSYz2h4P1ycztlCLj-ewsRTud2lU,7939
112
- copyparty-1.16.17.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
113
- copyparty-1.16.17.dist-info/METADATA,sha256=mv4zOlv-ElE_ldsed5zneXRYtUjsFF5L9vCh7cTSi7Q,158632
114
- copyparty-1.16.17.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
115
- copyparty-1.16.17.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
116
- copyparty-1.16.17.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
117
- copyparty-1.16.17.dist-info/RECORD,,
112
+ copyparty-1.16.19.dist-info/licenses/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
113
+ copyparty-1.16.19.dist-info/METADATA,sha256=-QmQvp2dZJ8RVVHlm6Pf4B6WUpiNJNnBUXCwmyMExAI,160161
114
+ copyparty-1.16.19.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
115
+ copyparty-1.16.19.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
116
+ copyparty-1.16.19.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
117
+ copyparty-1.16.19.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5