copyparty 1.11.1__py3-none-any.whl → 1.12.0__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/sutil.py CHANGED
@@ -1,6 +1,7 @@
1
1
  # coding: utf-8
2
2
  from __future__ import print_function, unicode_literals
3
3
 
4
+ import argparse
4
5
  import os
5
6
  import tempfile
6
7
  from datetime import datetime
@@ -14,10 +15,12 @@ class StreamArc(object):
14
15
  def __init__(
15
16
  self,
16
17
  log ,
18
+ args ,
17
19
  fgen ,
18
20
  **kwargs
19
21
  ):
20
22
  self.log = log
23
+ self.args = args
21
24
  self.fgen = fgen
22
25
  self.stopped = False
23
26
 
@@ -72,7 +75,9 @@ def enthumb(
72
75
  ) :
73
76
  rem = f["vp"]
74
77
  ext = rem.rsplit(".", 1)[-1].lower()
75
- if fmt == "opus" and ext in "aac|m4a|mp3|ogg|opus|wma".split("|"):
78
+ if (fmt == "mp3" and ext == "mp3") or (
79
+ fmt == "opus" and ext in "aac|m4a|mp3|ogg|opus|wma".split("|")
80
+ ):
76
81
  raise Exception()
77
82
 
78
83
  vp = vjoin(vtop, rem.split("/", 1)[1])
copyparty/svchub.py CHANGED
@@ -22,7 +22,7 @@ from datetime import datetime, timedelta
22
22
  # print(currentframe().f_lineno)
23
23
 
24
24
 
25
- from .__init__ import ANYWIN, E, EXE, MACOS, TYPE_CHECKING, EnvParams, unicode
25
+ from .__init__ import ANYWIN, EXE, MACOS, TYPE_CHECKING, E, EnvParams, unicode
26
26
  from .authsrv import BAD_CFG, AuthSrv
27
27
  from .cert import ensure_cert
28
28
  from .mtag import HAVE_FFMPEG, HAVE_FFPROBE
@@ -167,6 +167,26 @@ class SvcHub(object):
167
167
  self.log("root", t.format(args.j), c=3)
168
168
  args.no_fpool = True
169
169
 
170
+ for name, arg in (
171
+ ("iobuf", "iobuf"),
172
+ ("s-rd-sz", "s_rd_sz"),
173
+ ("s-wr-sz", "s_wr_sz"),
174
+ ):
175
+ zi = getattr(args, arg)
176
+ if zi < 32768:
177
+ t = "WARNING: expect very poor performance because you specified a very low value (%d) for --%s"
178
+ self.log("root", t % (zi, name), 3)
179
+ zi = 2
180
+ zi2 = 2 ** (zi - 1).bit_length()
181
+ if zi != zi2:
182
+ zi3 = 2 ** ((zi - 1).bit_length() - 1)
183
+ t = "WARNING: expect poor performance because --%s is not a power-of-two; consider using %d or %d instead of %d"
184
+ self.log("root", t % (name, zi2, zi3, zi), 3)
185
+
186
+ if args.s_rd_sz > args.iobuf:
187
+ t = "WARNING: --s-rd-sz (%d) is larger than --iobuf (%d); this may lead to reduced performance"
188
+ self.log("root", t % (args.s_rd_sz, args.iobuf), 3)
189
+
170
190
  bri = "zy"[args.theme % 2 :][:1]
171
191
  ch = "abcdefghijklmnopqrstuvwx"[int(args.theme / 2)]
172
192
  args.theme = "{0}{1} {0} {1}".format(ch, bri)
@@ -250,6 +270,11 @@ class SvcHub(object):
250
270
  if want_ff and ANYWIN:
251
271
  self.log("thumb", "download FFmpeg to fix it:\033[0m " + FFMPEG_URL, 3)
252
272
 
273
+ if not args.no_acode:
274
+ if not re.match("^(0|[qv][0-9]|[0-9]{2,3}k)$", args.q_mp3.lower()):
275
+ t = "invalid mp3 transcoding quality [%s] specified; only supports [0] to disable, a CBR value such as [192k], or a CQ/CRF value such as [v2]"
276
+ raise Exception(t % (args.q_mp3,))
277
+
253
278
  args.th_poke = min(args.th_poke, args.th_maxage, args.ac_maxage)
254
279
 
255
280
  zms = ""
copyparty/szip.py CHANGED
@@ -1,6 +1,7 @@
1
1
  # coding: utf-8
2
2
  from __future__ import print_function, unicode_literals
3
3
 
4
+ import argparse
4
5
  import calendar
5
6
  import stat
6
7
  import time
@@ -212,12 +213,13 @@ class StreamZip(StreamArc):
212
213
  def __init__(
213
214
  self,
214
215
  log ,
216
+ args ,
215
217
  fgen ,
216
218
  utf8 = False,
217
219
  pre_crc = False,
218
220
  **kwargs
219
221
  ) :
220
- super(StreamZip, self).__init__(log, fgen)
222
+ super(StreamZip, self).__init__(log, args, fgen)
221
223
 
222
224
  self.utf8 = utf8
223
225
  self.pre_crc = pre_crc
@@ -242,7 +244,7 @@ class StreamZip(StreamArc):
242
244
 
243
245
  crc = 0
244
246
  if self.pre_crc:
245
- for buf in yieldfile(src):
247
+ for buf in yieldfile(src, self.args.iobuf):
246
248
  crc = zlib.crc32(buf, crc)
247
249
 
248
250
  crc &= 0xFFFFFFFF
@@ -251,7 +253,7 @@ class StreamZip(StreamArc):
251
253
  buf = gen_hdr(None, name, sz, ts, self.utf8, crc, self.pre_crc)
252
254
  yield self._ct(buf)
253
255
 
254
- for buf in yieldfile(src):
256
+ for buf in yieldfile(src, self.args.iobuf):
255
257
  if not self.pre_crc:
256
258
  crc = zlib.crc32(buf, crc)
257
259
 
copyparty/tftpd.py CHANGED
@@ -337,6 +337,9 @@ class Tftpd(object):
337
337
  if not self.args.tftp_nols and bos.path.isdir(ap):
338
338
  return self._ls(vpath, "", 0, True)
339
339
 
340
+ if not a:
341
+ a = [self.args.iobuf]
342
+
340
343
  return open(ap, mode, *a, **ka)
341
344
 
342
345
  def _mkdir(self, vpath , *a) :
copyparty/th_cli.py CHANGED
@@ -54,7 +54,7 @@ class ThumbCli(object):
54
54
  if is_vid and "dvthumb" in dbv.flags:
55
55
  return None
56
56
 
57
- want_opus = fmt in ("opus", "caf")
57
+ want_opus = fmt in ("opus", "caf", "mp3")
58
58
  is_au = ext in self.fmt_ffa
59
59
  if is_au:
60
60
  if want_opus:
copyparty/th_srv.py CHANGED
@@ -16,9 +16,9 @@ from .__init__ import ANYWIN, TYPE_CHECKING
16
16
  from .authsrv import VFS
17
17
  from .bos import bos
18
18
  from .mtag import HAVE_FFMPEG, HAVE_FFPROBE, ffprobe
19
+ from .util import BytesIO # type: ignore
19
20
  from .util import (
20
21
  FFMPEG_URL,
21
- BytesIO, # type: ignore
22
22
  Cooldown,
23
23
  Daemon,
24
24
  Pebkac,
@@ -106,7 +106,7 @@ def thumb_path(histpath , rem , mtime , fmt , ffa ) :
106
106
  h = hashlib.sha512(afsenc(fn)).digest()
107
107
  fn = base64.urlsafe_b64encode(h).decode("ascii")[:24]
108
108
 
109
- if fmt in ("opus", "caf"):
109
+ if fmt in ("opus", "caf", "mp3"):
110
110
  cat = "ac"
111
111
  else:
112
112
  fc = fmt[:1]
@@ -304,6 +304,8 @@ class ThumbSrv(object):
304
304
  elif lib == "ff" and ext in self.fmt_ffa:
305
305
  if tpath.endswith(".opus") or tpath.endswith(".caf"):
306
306
  funs.append(self.conv_opus)
307
+ elif tpath.endswith(".mp3"):
308
+ funs.append(self.conv_mp3)
307
309
  elif tpath.endswith(".png"):
308
310
  funs.append(self.conv_waves)
309
311
  png_ok = True
@@ -634,8 +636,47 @@ class ThumbSrv(object):
634
636
  cmd += [fsenc(tpath)]
635
637
  self._run_ff(cmd, vn)
636
638
 
639
+ def conv_mp3(self, abspath , tpath , fmt , vn ) :
640
+ quality = self.args.q_mp3.lower()
641
+ if self.args.no_acode or not quality:
642
+ raise Exception("disabled in server config")
643
+
644
+ self.wait4ram(0.2, tpath)
645
+ ret, _ = ffprobe(abspath, int(vn.flags["convt"] / 2))
646
+ if "ac" not in ret:
647
+ raise Exception("not audio")
648
+
649
+ if quality.endswith("k"):
650
+ qk = b"-b:a"
651
+ qv = quality.encode("ascii")
652
+ else:
653
+ qk = b"-q:a"
654
+ qv = quality[1:].encode("ascii")
655
+
656
+ # extremely conservative choices for output format
657
+ # (always 2ch 44k1) because if a device is old enough
658
+ # to not support opus then it's probably also super picky
659
+
660
+ # fmt: off
661
+ cmd = [
662
+ b"ffmpeg",
663
+ b"-nostdin",
664
+ b"-v", b"error",
665
+ b"-hide_banner",
666
+ b"-i", fsenc(abspath),
667
+ b"-map_metadata", b"-1",
668
+ b"-map", b"0:a:0",
669
+ b"-ar", b"44100",
670
+ b"-ac", b"2",
671
+ b"-c:a", b"libmp3lame",
672
+ qk, qv,
673
+ fsenc(tpath)
674
+ ]
675
+ # fmt: on
676
+ self._run_ff(cmd, vn, oom=300)
677
+
637
678
  def conv_opus(self, abspath , tpath , fmt , vn ) :
638
- if self.args.no_acode:
679
+ if self.args.no_acode or not self.args.q_opus:
639
680
  raise Exception("disabled in server config")
640
681
 
641
682
  self.wait4ram(0.2, tpath)
@@ -659,6 +700,7 @@ class ThumbSrv(object):
659
700
  pass
660
701
 
661
702
  caf_src = abspath if src_opus else tmp_opus
703
+ bq = ("%dk" % (self.args.q_opus,)).encode("ascii")
662
704
 
663
705
  if not want_caf or not src_opus:
664
706
  # fmt: off
@@ -671,7 +713,7 @@ class ThumbSrv(object):
671
713
  b"-map_metadata", b"-1",
672
714
  b"-map", b"0:a:0",
673
715
  b"-c:a", b"libopus",
674
- b"-b:a", b"128k",
716
+ b"-b:a", bq,
675
717
  fsenc(tmp_opus)
676
718
  ]
677
719
  # fmt: on
@@ -694,7 +736,7 @@ class ThumbSrv(object):
694
736
  b"-map_metadata", b"-1",
695
737
  b"-ac", b"2",
696
738
  b"-c:a", b"libopus",
697
- b"-b:a", b"128k",
739
+ b"-b:a", bq,
698
740
  b"-f", b"caf",
699
741
  fsenc(tpath)
700
742
  ]
@@ -768,7 +810,7 @@ class ThumbSrv(object):
768
810
 
769
811
  def _clean(self, cat , thumbpath ) :
770
812
  # self.log("cln {}".format(thumbpath))
771
- exts = ["jpg", "webp", "png"] if cat == "th" else ["opus", "caf"]
813
+ exts = ["jpg", "webp", "png"] if cat == "th" else ["opus", "caf", "mp3"]
772
814
  maxage = getattr(self.args, cat + "_maxage")
773
815
  now = time.time()
774
816
  prev_b64 = None
copyparty/up2k.py CHANGED
@@ -3917,7 +3917,7 @@ class Up2k(object):
3917
3917
  csz = up2k_chunksize(fsz)
3918
3918
  ret = []
3919
3919
  suffix = " MB, {}".format(path)
3920
- with open(fsenc(path), "rb", 512 * 1024) as f:
3920
+ with open(fsenc(path), "rb", self.args.iobuf) as f:
3921
3921
  if self.mth and fsz >= 1024 * 512:
3922
3922
  tlt = self.mth.hash(f, fsz, csz, self.pp, prefix, suffix)
3923
3923
  ret = [x[0] for x in tlt]
copyparty/util.py CHANGED
@@ -1379,10 +1379,15 @@ def ren_open(
1379
1379
 
1380
1380
  class MultipartParser(object):
1381
1381
  def __init__(
1382
- self, log_func , sr , http_headers
1382
+ self,
1383
+ log_func ,
1384
+ args ,
1385
+ sr ,
1386
+ http_headers ,
1383
1387
  ):
1384
1388
  self.sr = sr
1385
1389
  self.log = log_func
1390
+ self.args = args
1386
1391
  self.headers = http_headers
1387
1392
 
1388
1393
  self.re_ctype = re.compile(r"^content-type: *([^; ]+)", re.IGNORECASE)
@@ -1481,7 +1486,7 @@ class MultipartParser(object):
1481
1486
 
1482
1487
  def _read_data(self) :
1483
1488
  blen = len(self.boundary)
1484
- bufsz = 32 * 1024
1489
+ bufsz = self.args.s_rd_sz
1485
1490
  while True:
1486
1491
  try:
1487
1492
  buf = self.sr.recv(bufsz)
@@ -2222,10 +2227,11 @@ def shut_socket(log , sck , timeout = 3) :
2222
2227
  sck.close()
2223
2228
 
2224
2229
 
2225
- def read_socket(sr , total_size ) :
2230
+ def read_socket(
2231
+ sr , bufsz , total_size
2232
+ ) :
2226
2233
  remains = total_size
2227
2234
  while remains > 0:
2228
- bufsz = 32 * 1024
2229
2235
  if bufsz > remains:
2230
2236
  bufsz = remains
2231
2237
 
@@ -2239,16 +2245,16 @@ def read_socket(sr , total_size ) :
2239
2245
  yield buf
2240
2246
 
2241
2247
 
2242
- def read_socket_unbounded(sr ) :
2248
+ def read_socket_unbounded(sr , bufsz ) :
2243
2249
  try:
2244
2250
  while True:
2245
- yield sr.recv(32 * 1024)
2251
+ yield sr.recv(bufsz)
2246
2252
  except:
2247
2253
  return
2248
2254
 
2249
2255
 
2250
2256
  def read_socket_chunked(
2251
- sr , log = None
2257
+ sr , bufsz , log = None
2252
2258
  ) :
2253
2259
  err = "upload aborted: expected chunk length, got [{}] |{}| instead"
2254
2260
  while True:
@@ -2282,7 +2288,7 @@ def read_socket_chunked(
2282
2288
  if log:
2283
2289
  log("receiving %d byte chunk" % (chunklen,))
2284
2290
 
2285
- for chunk in read_socket(sr, chunklen):
2291
+ for chunk in read_socket(sr, bufsz, chunklen):
2286
2292
  yield chunk
2287
2293
 
2288
2294
  x = sr.recv_ex(2, False)
@@ -2340,10 +2346,11 @@ def build_netmap(csv ):
2340
2346
  return NetMap(ips, cidrs, True)
2341
2347
 
2342
2348
 
2343
- def yieldfile(fn ) :
2344
- with open(fsenc(fn), "rb", 512 * 1024) as f:
2349
+ def yieldfile(fn , bufsz ) :
2350
+ readsz = min(bufsz, 128 * 1024)
2351
+ with open(fsenc(fn), "rb", bufsz) as f:
2345
2352
  while True:
2346
- buf = f.read(128 * 1024)
2353
+ buf = f.read(readsz)
2347
2354
  if not buf:
2348
2355
  break
2349
2356
 
Binary file
Binary file
Binary file
Binary file
Binary file
copyparty/web/md.css.gz CHANGED
Binary file
copyparty/web/md.js.gz CHANGED
Binary file
copyparty/web/md2.css.gz CHANGED
Binary file
copyparty/web/md2.js.gz CHANGED
Binary file
copyparty/web/mde.css.gz CHANGED
Binary file
copyparty/web/mde.js.gz CHANGED
Binary file
copyparty/web/msg.css.gz CHANGED
Binary file
Binary file
Binary file
copyparty/web/ui.css.gz CHANGED
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.1
2
2
  Name: copyparty
3
- Version: 1.11.1
3
+ Version: 1.12.0
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
@@ -148,6 +148,7 @@ turn almost any device into a file server with resumable uploads/downloads using
148
148
  * [gotchas](#gotchas) - behavior that might be unexpected
149
149
  * [cors](#cors) - cross-site request config
150
150
  * [filekeys](#filekeys) - prevent filename bruteforcing
151
+ * [dirkeys](#dirkeys) - share specific folders in a volume
151
152
  * [password hashing](#password-hashing) - you can hash passwords
152
153
  * [https](#https) - both HTTP and HTTPS are accepted
153
154
  * [recovering from crashes](#recovering-from-crashes)
@@ -253,7 +254,7 @@ firewall-cmd --reload
253
254
  * browser
254
255
  * ☑ [navpane](#navpane) (directory tree sidebar)
255
256
  * ☑ file manager (cut/paste, delete, [batch-rename](#batch-rename))
256
- * ☑ audio player (with [OS media controls](https://user-images.githubusercontent.com/241032/215347492-b4250797-6c90-4e09-9a4c-721edf2fb15c.png) and opus transcoding)
257
+ * ☑ audio player (with [OS media controls](https://user-images.githubusercontent.com/241032/215347492-b4250797-6c90-4e09-9a4c-721edf2fb15c.png) and opus/mp3 transcoding)
257
258
  * ☑ image gallery with webm player
258
259
  * ☑ textfile browser with syntax hilighting
259
260
  * ☑ [thumbnails](#thumbnails)
@@ -641,7 +642,7 @@ you can also zip a selection of files or folders by clicking them in the browser
641
642
 
642
643
  ![copyparty-zipsel-fs8](https://user-images.githubusercontent.com/241032/129635374-e5136e01-470a-49b1-a762-848e8a4c9cdc.png)
643
644
 
644
- cool trick: download a folder by appending url-params `?tar&opus` to transcode all audio files (except aac|m4a|mp3|ogg|opus|wma) to opus before they're added to the archive
645
+ cool trick: download a folder by appending url-params `?tar&opus` or `?tar&mp3` to transcode all audio files (except aac|m4a|mp3|ogg|opus|wma) to opus/mp3 before they're added to the archive
645
646
  * super useful if you're 5 minutes away from takeoff and realize you don't have any music on your phone but your server only has flac files and downloading those will burn through all your data + there wouldn't be enough time anyways
646
647
  * and url-params `&j` / `&w` produce jpeg/webm thumbnails/spectrograms instead of the original audio/video/images
647
648
  * can also be used to pregenerate thumbnails; combine with `--th-maxage=9999999` or `--th-clean=0`
@@ -832,9 +833,9 @@ open the `[🎺]` media-player-settings tab to configure it,
832
833
  * `[loop]` keeps looping the folder
833
834
  * `[next]` plays into the next folder
834
835
  * "transcode":
835
- * `[flac]` converts `flac` and `wav` files into opus
836
- * `[aac]` converts `aac` and `m4a` files into opus
837
- * `[oth]` converts all other known formats into opus
836
+ * `[flac]` converts `flac` and `wav` files into opus (if supported by browser) or mp3
837
+ * `[aac]` converts `aac` and `m4a` files into opus (if supported by browser) or mp3
838
+ * `[oth]` converts all other known formats into opus (if supported by browser) or mp3
838
839
  * `aac|ac3|aif|aiff|alac|alaw|amr|ape|au|dfpwm|dts|flac|gsm|it|m4a|mo3|mod|mp2|mp3|mpc|mptm|mt2|mulaw|ogg|okt|opus|ra|s3m|tak|tta|ulaw|wav|wma|wv|xm|xpk`
839
840
  * "tint" reduces the contrast of the playback bar
840
841
 
@@ -1345,6 +1346,8 @@ you may experience poor upload performance this way, but that can sometimes be f
1345
1346
 
1346
1347
  someone has also tested geesefs in combination with [gocryptfs](https://nuetzlich.net/gocryptfs/) with surprisingly good results, getting 60 MiB/s upload speeds on a gbit line, but JuiceFS won with 80 MiB/s using its built-in encryption
1347
1348
 
1349
+ you may improve performance by specifying larger values for `--iobuf` / `--s-rd-sz` / `--s-wr-sz`
1350
+
1348
1351
 
1349
1352
  ## hiding from google
1350
1353
 
@@ -1794,6 +1797,7 @@ below are some tweaks roughly ordered by usefulness:
1794
1797
  * `--hist` pointing to a fast location (ssd) will make directory listings and searches faster when `-e2d` or `-e2t` is set
1795
1798
  * and also makes thumbnails load faster, regardless of e2d/e2t
1796
1799
  * `--no-hash .` when indexing a network-disk if you don't care about the actual filehashes and only want the names/tags searchable
1800
+ * 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`
1797
1801
  * `--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)
1798
1802
  * `-j0` enables multiprocessing (actual multithreading), can reduce latency to `20+80/numCores` percent and generally improve performance in cpu-intensive workloads, for example:
1799
1803
  * lots of connections (many users or heavy clients)
@@ -1890,12 +1894,29 @@ cors can be configured with `--acao` and `--acam`, or the protections entirely d
1890
1894
 
1891
1895
  prevent filename bruteforcing
1892
1896
 
1893
- volflag `c,fk` generates filekeys (per-file accesskeys) for all files; users which have full read-access (permission `r`) will then see URLs with the correct filekey `?k=...` appended to the end, and `g` users must provide that URL including the correct key to avoid a 404
1897
+ volflag `fk` generates filekeys (per-file accesskeys) for all files; users which have full read-access (permission `r`) will then see URLs with the correct filekey `?k=...` appended to the end, and `g` users must provide that URL including the correct key to avoid a 404
1894
1898
 
1895
1899
  by default, filekeys are generated based on salt (`--fk-salt`) + filesystem-path + file-size + inode (if not windows); add volflag `fka` to generate slightly weaker filekeys which will not be invalidated if the file is edited (only salt + path)
1896
1900
 
1897
1901
  permissions `wG` (write + upget) lets users upload files and receive their own filekeys, still without being able to see other uploads
1898
1902
 
1903
+ ### dirkeys
1904
+
1905
+ share specific folders in a volume without giving away full read-access to the rest -- the visitor only needs the `g` (get) permission to view the link
1906
+
1907
+ volflag `dk` generates dirkeys (per-directory accesskeys) for all folders, granting read-access to that folder; by default only that folder itself, no subfolders
1908
+
1909
+ volflag `dky` disables the actual key-check, meaning anyone can see the contents of a folder where they have `g` access, but not its subdirectories
1910
+
1911
+ * `dk` + `dky` gives the same behavior as if all users with `g` access have full read-access, but subfolders are hidden files (their names start with a dot), so `dky` is an alternative to renaming all the folders for that purpose, maybe just for some users
1912
+
1913
+ volflag `dks` lets people enter subfolders as well, and also enables download-as-zip/tar
1914
+
1915
+ dirkeys are generated based on another salt (`--dk-salt`) + filesystem-path and have a few limitations:
1916
+ * the key does not change if the contents of the folder is modified
1917
+ * if you need a new dirkey, either change the salt or rename the folder
1918
+ * linking to a textfile (so it opens in the textfile viewer) is not possible if recipient doesn't have read-access
1919
+
1899
1920
 
1900
1921
  ## password hashing
1901
1922
 
@@ -1,7 +1,7 @@
1
- copyparty/__init__.py,sha256=34xcU8AoRRQscgVSx2gC6DeUyu7ZLmEVlXjttdQgXnI,1752
2
- copyparty/__main__.py,sha256=g7Bc8ULfcXm-VdklVrnhaFP8bXXQrO4dgN5z7joEnEI,93648
3
- copyparty/__version__.py,sha256=t7CMwcd2WnYMbd2jiG9kC5xZ3t08Ojcs-zat5rSuRDw,263
4
- copyparty/authsrv.py,sha256=cP9egYM142f4x4WiwssF8YVFkOlARy4hvQjibzhcD0I,83737
1
+ copyparty/__init__.py,sha256=fUINM1abqDGzCCH_JcXdOnLdKOV-SrTI2Xo2QgQW2P4,1703
2
+ copyparty/__main__.py,sha256=e9hqYxGdNJDzebB6wcUoc0J_MJ7QjDFOd8U0lHMg6so,94463
3
+ copyparty/__version__.py,sha256=jARmXj1ooaOsD7tTXj7PQut35A5JlMrdGV1wNuozsHs,250
4
+ copyparty/authsrv.py,sha256=qHC_sSExXnd4LLKdSKQM5RA_Xrvl2zdNT_TZRJhA454,84436
5
5
  copyparty/broker_mp.py,sha256=4mEZC5tiHUazJMgYuwInNo2dxS7jrbzrGb1qs2UBt9k,3948
6
6
  copyparty/broker_mpw.py,sha256=4ZI7bJYOwUibeAJVv9_FPGNmHrr9eOtkj_Kz0JEppTU,3197
7
7
  copyparty/broker_thr.py,sha256=eKr--HJGig5zqvNGwH9UoBG9Nvi9mT2axrRmJwknd0s,1759
@@ -10,29 +10,29 @@ copyparty/cert.py,sha256=bt1n-629-Gtez1C_CroXq53gXEmUsVjkTbkQ6Gu2Zfc,7323
10
10
  copyparty/cfg.py,sha256=CQKSyixyhxeM2narwbOfjUsjn0DZ_VYXbdMSa_tv4gw,9189
11
11
  copyparty/dxml.py,sha256=lZpg-kn-kQsXRtNY1n6fRaS-b7uXzMCyv8ovKnhZcZc,1548
12
12
  copyparty/fsutil.py,sha256=c4fTvmclKbVABNsjU4rGddsjCgRwi9YExAyo-06ATc8,3932
13
- copyparty/ftpd.py,sha256=sNfoGZnO7KxnIovbnSBOt8jiPecUtRK-_izrlZjAtt8,15944
14
- copyparty/httpcli.py,sha256=AVjbUNDAti3OMDDdsEEYeSV25swuy-jQrbuSNc7vbX4,145586
13
+ copyparty/ftpd.py,sha256=OIExjfqOEw-Y_ygez6cIZUQec4SFOmoxEH_WOVvw-aE,15961
14
+ copyparty/httpcli.py,sha256=oxMEY8rzE-f6LN2JlzvqY-dc7v85swecpFffvHjEqck,148735
15
15
  copyparty/httpconn.py,sha256=gLOURB2Nb1w6n2ihGBspEnzEfUND9Osa4klzYuAbgzI,6829
16
16
  copyparty/httpsrv.py,sha256=af6LdApfj-Q4mWC5mVQjhnyrFzNy8_bXK3VUe0xKkeY,16368
17
17
  copyparty/ico.py,sha256=AYHdK6NlYBfBgafVYXia3jHQ9XHZdUL1D8WftLMAzIU,3545
18
18
  copyparty/mdns.py,sha256=CcraggbDxTT1ntYzD8Ebgqmw5Q4HkyZcfh5ymtCV_ak,17469
19
19
  copyparty/metrics.py,sha256=OqXFkAuoVhayGAGd_Sv-OQ9SVmdXYV8M7CxitkzE3lo,8854
20
- copyparty/mtag.py,sha256=OZM6cVJafOe_LZ4bPJzVJbORA_omzewwJh-N11u3nak,16855
20
+ copyparty/mtag.py,sha256=wiXd26ZSYgOu4lkRDn4KLaqo6H2V7cpqUMepTHTCfKE,16851
21
21
  copyparty/multicast.py,sha256=4N_NQVIrGSF5ZNWYdpAfYHoZefkSowN3w1GfWAxhTL0,12291
22
22
  copyparty/pwhash.py,sha256=D82y8emnwpHDQq7Cr8lNuppHshbNA9ptcR2XsGOOk6E,3937
23
23
  copyparty/smbd.py,sha256=iACj5pbiKsX7bVu20BK3ebPQLB_qA7WS2l-ytrSfT3Y,14054
24
24
  copyparty/ssdp.py,sha256=H6ZftXttydcnBxcg2-Prm4P-XiybgT3xiJRUXU1pbrE,6343
25
- copyparty/star.py,sha256=IqKPEjSxMoQsPQaIPhixMZN9nNyO4oMAJq_PzmZXhMM,3748
26
- copyparty/sutil.py,sha256=dZhDAzVAp02i6YmGqcedy4LaYVffnJCSp3F6WEwfz7c,2967
27
- copyparty/svchub.py,sha256=aG8T0ZoW12sswYOoFYvlgLVtDRLAjsyC7WP3lC2lDzU,30458
28
- copyparty/szip.py,sha256=SJg5nzN_5oaIsIYXlRvcLHVTqngLAOPfe4_WVsuhSkw,8520
25
+ copyparty/star.py,sha256=K4NuzyfT4956uoW6GJSQ2II-JsSV57apQZwRZ4mjFoo,3790
26
+ copyparty/sutil.py,sha256=_G4TM0YFa1vXzhRypHJ88QBdZWtYgDbom4CZjGvGIwc,3074
27
+ copyparty/svchub.py,sha256=mf101Y51z4H86DYjJ0YD1LOWzygTKdHWevUNaQUOGR8,31701
28
+ copyparty/szip.py,sha256=631TsEwGKV22yAnusJtvE-9fGFWr61HPGBinu-jk1QA,8591
29
29
  copyparty/tcpsrv.py,sha256=2LGUqOBAIrsmL-1pwrbsPXR71gutHccqRp-hjzt91Us,17289
30
- copyparty/tftpd.py,sha256=5ONxspbOyyaBCUmo1GCfYILRVc2B3uHYGIuHM7HreXE,13104
31
- copyparty/th_cli.py,sha256=e2FF-wVY4qcwAO8hrtTlwn3EJIOHyZt5sYhl0N8eudk,4378
32
- copyparty/th_srv.py,sha256=HBw6mq0RrJkAJupJpwFAjCMNS67Y9hda6sv7gFSzRwk,25764
30
+ copyparty/tftpd.py,sha256=7EHAZ9LnjAXupwRNIENJ2eA8Q0lFynnwwbziV3fyzns,13157
31
+ copyparty/th_cli.py,sha256=eSW7sBiaZAsh_XffXFzb035CTSbS3J3Q0G-BMzQGuSY,4385
32
+ copyparty/th_srv.py,sha256=X_nQB7YlwPuj5_4v2jVGh7H2UtNgf_lDAD8aBjcmJag,27161
33
33
  copyparty/u2idx.py,sha256=JBEqKX1ZM8GIvQrDYb5VQ_5QiFNFsjWF6H9drHlPVEY,12709
34
- copyparty/up2k.py,sha256=NhOq-4IzwLDAWAzTGG2lUX3gKDg8HvPjvE7U_dIXVfw,140718
35
- copyparty/util.py,sha256=62c16lzJ-tTn13Q8v231Vqf53riNrWKo_06RP0sNCTI,80901
34
+ copyparty/up2k.py,sha256=834EGhamt6oXmdHdHS9BxG2LiHm4Q2Ax3NpUv8DbMr4,140723
35
+ copyparty/util.py,sha256=sClrlGCL-sGVSYAuMAFR-SNXIIj5T2Tl12y6XLR_ikE,81016
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
@@ -54,31 +54,31 @@ copyparty/stolen/ifaddr/__init__.py,sha256=_BUN7eM5oD2Jgib6B22tEFSb20fD9urNPPaAl
54
54
  copyparty/stolen/ifaddr/_posix.py,sha256=-67NdfGrCktfQPakT2fLbjl2U00QMvyBGkSvrUuTOrU,2626
55
55
  copyparty/stolen/ifaddr/_shared.py,sha256=cJACl8cOxQ-HSYphZTzKMAjAx_TAFyJwUPjfD102Xqw,6111
56
56
  copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
57
- copyparty/web/baguettebox.js.gz,sha256=63fwdFjmxwu4uLxfex7S6XHSoBBxwSCDv871TFXJ5i8,7671
58
- copyparty/web/browser.css.gz,sha256=qNsSKexPMkT5uTC6ADVuE2Z_oKVCbHyfzzIznQcOdvc,11434
57
+ copyparty/web/baguettebox.js.gz,sha256=zf2x1n512edRty2zjP6L3-N_jpb2pMWDOjuLFynNyM8,7669
58
+ copyparty/web/browser.css.gz,sha256=dvCrWbY4MswsS5tmDR50eaWk1rhsAecos3x8iKd3v6w,11434
59
59
  copyparty/web/browser.html,sha256=uAejLJd11rV_tQx3h2nHnJ1XY6zn1JV-meIAv74Lc8o,4873
60
- copyparty/web/browser.js.gz,sha256=LM_3CYIowvCedz0klqRG-JvcFY7PzFZHoFuhPoepfS8,66357
60
+ copyparty/web/browser.js.gz,sha256=hzmgXRCwVPg7rxWnOCGcSsAmOYFjVpgztWU0Yo4639g,67267
61
61
  copyparty/web/browser2.html,sha256=ciQlgr9GWuIapdsRBFNRvRFvN5T_5n920LqDMbsj5-g,1605
62
62
  copyparty/web/cf.html,sha256=lJThtNFNAQT1ClCHHlivAkDGE0LutedwopXD62Z8Nys,589
63
63
  copyparty/web/dbg-audio.js.gz,sha256=Ma-KZtK8LnmiwNvNKFKXMPYl_Nn_3U7GsJ6-DRWC2HE,688
64
- copyparty/web/md.css.gz,sha256=t7qPxsL-ETVc-yZhdh8vR1e69vI0f1DX85YLMpNlga4,2032
64
+ copyparty/web/md.css.gz,sha256=UZpN0J7ubVM05CZkbZYkQRJeGgJt_GNDEzKTGSQd8h4,2032
65
65
  copyparty/web/md.html,sha256=qnJpj_5-MoVYr9j5Rhy7dS40wctqdWbjELmNa-J9cUY,4110
66
- copyparty/web/md.js.gz,sha256=OMecpy-UHxn8rWM9Bj6BIq0jpjXNHri1A2NLe8de4_E,4179
67
- copyparty/web/md2.css.gz,sha256=NfHqy77R1TfKn6ZXfthdLb74v1dgcwrDH0dhoH0rbgA,699
68
- copyparty/web/md2.js.gz,sha256=LI1dxu7-IaF1DMb6_vgqV-5_AiUvGlAq2tkYNYNs6X0,8350
69
- copyparty/web/mde.css.gz,sha256=QgC399DmXxcCL285jnsbeJH0fKJx-bWhS_PhNjHkMtM,942
66
+ copyparty/web/md.js.gz,sha256=AHRQ3a-PZq_UiGh4CjNwXRllJCvA0IqqYmeHhFWhCig,4179
67
+ copyparty/web/md2.css.gz,sha256=uIVHKScThdbcfhXNSHgKZnALYpxbnXC-WuEzOJ20Lpc,699
68
+ copyparty/web/md2.js.gz,sha256=8xLixaTfTXC808538OOSLhp9AqKowYaunjDeBsbiBEw,8350
69
+ copyparty/web/mde.css.gz,sha256=2SkAEDKIRPqywNJ8t_heQaeBQ_R73Rf-pQI_bDoKF6o,942
70
70
  copyparty/web/mde.html,sha256=FMMq4ySXoOrQV5E836KmQCry3COOhMu0DSstAdJZL_g,1678
71
- copyparty/web/mde.js.gz,sha256=WkK28WXGGwWuhzeoV0MedaHaHtuXCPnzEx3MMa4qgJ4,2224
72
- copyparty/web/msg.css.gz,sha256=RHvNHYTne6HuYkS8i6rlJu6jleVUVQut4zgRa--EKbI,300
71
+ copyparty/web/mde.js.gz,sha256=kN2eUSvr4mFuksfK4-4LimJmWdwsao39Sea2lWtu8L0,2224
72
+ copyparty/web/msg.css.gz,sha256=u90fXYAVrMD-jqwf5XFVC1ptSpSHZUe8Mez6PX101P8,300
73
73
  copyparty/web/msg.html,sha256=XDg51WLO7RruZnoFnKpeJ33k47-tBHP3bR7l55Jwre4,896
74
- copyparty/web/splash.css.gz,sha256=ImOPcJ4KvuMYYesHvEyKAjMTOrybWNvWtjyMUDOIETU,949
74
+ copyparty/web/splash.css.gz,sha256=1IV-0cAs-RNCnvHu-wbSVzKMCkHIblManOLB8d3xcqk,949
75
75
  copyparty/web/splash.html,sha256=KFAvTnofyVURBQyTnrYwuDdEKN_iGtvdjicn5b33tL8,3822
76
- copyparty/web/splash.js.gz,sha256=J8d5JEzEe7absMjw2_5RprS6mc0yduqfUD9aqlbhb5Q,1420
76
+ copyparty/web/splash.js.gz,sha256=2R8UYlAN8WpIABg8clgWckWqgD8nKtz3eGZFu2y1g88,1420
77
77
  copyparty/web/svcs.html,sha256=s7vUSrCrELC3iTemksodRBhQpssO7s4xW1vA-CX6vU8,11702
78
78
  copyparty/web/svcs.js.gz,sha256=k81ZvZ3I-f4fMHKrNGGOgOlvXnCBz0mVjD-8mieoWCA,520
79
- copyparty/web/ui.css.gz,sha256=dm7bH5LWyqxHDdLo5azIRdN1P9pULYtJ9a-_iBM4qOM,2616
80
- copyparty/web/up2k.js.gz,sha256=G2O-0EUj81mmWSMbQ-nnj4UxnQD4X1TskCH9ypAVnSM,22120
81
- copyparty/web/util.js.gz,sha256=-eCegkkPnAsoj33Rspwy93nyvWeYldon1DMgFoiG_1A,14368
79
+ copyparty/web/ui.css.gz,sha256=skuzZHqTU0ag5hButpQmKI9wM7ro-UJ2PnpTodTWYF4,2616
80
+ copyparty/web/up2k.js.gz,sha256=ZuxLQW8mJSvLu_Aa8fDT3F9rptuAzNDmaOLd0MeMrd8,22114
81
+ copyparty/web/util.js.gz,sha256=Ag3zWWzbHoWYQtRnn8frhl3PcUzTIjSOUQiSxQWp1M8,14330
82
82
  copyparty/web/w.hash.js.gz,sha256=__hBMd5oZWfTrb8ZCJNT21isoSqyrxKE6qdaKGQVAhc,1060
83
83
  copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
84
  copyparty/web/a/partyfuse.py,sha256=MuRkaSuYsdfWfBFMOkbPwDXqSvNTw3sd7QhhlKCDZ8I,32311
@@ -90,9 +90,10 @@ copyparty/web/dd/4.png,sha256=fIwEVmtZNZtloZuVEKPKnkx3SELwRJmB3US61y7t2lI,248
90
90
  copyparty/web/dd/5.png,sha256=Lfpu8-yOlhONuoMbygloKqQVPXSm9gjxH2gUYn5QQAE,250
91
91
  copyparty/web/dd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
92
  copyparty/web/deps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
+ copyparty/web/deps/busy.mp3.gz,sha256=EVphk1_HYyRKJmtpeK99vbAstF7ub1f9ndu020H8PQ8,106
93
94
  copyparty/web/deps/easymde.css.gz,sha256=vWxfueI64rPikuqFj69wJBtGisqf93AheQtOZqgUI_c,3041
94
95
  copyparty/web/deps/easymde.js.gz,sha256=1FykpDM7_FiL4EeZAg4Qcggjoo4PE_MBTgRcBWvjD90,77000
95
- copyparty/web/deps/marked.js.gz,sha256=WhUw0LPWs5cxqORQmW-zajQiUc5rSRkcvf3eT3-XSZc,22372
96
+ copyparty/web/deps/marked.js.gz,sha256=ltXpV8Z7mOCygryr9tkSw1Ydo2lV0CSLxOOsTqGUDiw,22422
96
97
  copyparty/web/deps/mini-fa.css.gz,sha256=CTPrNaH8OTVmxajrGP88E2MkjadY9_81TBVnd9sw9Y8,572
97
98
  copyparty/web/deps/mini-fa.woff,sha256=L9DNncV2TIyvsrspMbJouvnnt7F068Hbn7YZYvN76AU,2784
98
99
  copyparty/web/deps/prism.css.gz,sha256=Z_A6rJ3MN5KWnjvXaV787aTW_5DT-xjFd0YZ7_W-Krk,1468
@@ -101,9 +102,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV
101
102
  copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
102
103
  copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
103
104
  copyparty/web/deps/sha512.hw.js.gz,sha256=vqoXeracj-99Z5MfY3jK2N4WiSzYQdfjy0RnUlQDhSU,8110
104
- copyparty-1.11.1.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
105
- copyparty-1.11.1.dist-info/METADATA,sha256=_nQ2ixAFewk545RfFxWaJ1WZP9IsYoDjh1qbT0hqClA,115911
106
- copyparty-1.11.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
107
- copyparty-1.11.1.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
108
- copyparty-1.11.1.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
109
- copyparty-1.11.1.dist-info/RECORD,,
105
+ copyparty-1.12.0.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
106
+ copyparty-1.12.0.dist-info/METADATA,sha256=aJEMFtvG-b_ofuoUiX9c9oD8ilOhsZyafcf7eeGpfAU,117598
107
+ copyparty-1.12.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
108
+ copyparty-1.12.0.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
109
+ copyparty-1.12.0.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
110
+ copyparty-1.12.0.dist-info/RECORD,,