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/__init__.py +0 -1
- copyparty/__main__.py +26 -31
- copyparty/__version__.py +3 -3
- copyparty/authsrv.py +41 -23
- copyparty/ftpd.py +1 -1
- copyparty/httpcli.py +112 -28
- copyparty/mtag.py +1 -2
- copyparty/star.py +4 -2
- copyparty/sutil.py +6 -1
- copyparty/svchub.py +26 -1
- copyparty/szip.py +5 -3
- copyparty/tftpd.py +3 -0
- copyparty/th_cli.py +1 -1
- copyparty/th_srv.py +48 -6
- copyparty/up2k.py +1 -1
- copyparty/util.py +18 -11
- copyparty/web/baguettebox.js.gz +0 -0
- copyparty/web/browser.css.gz +0 -0
- copyparty/web/browser.js.gz +0 -0
- copyparty/web/deps/busy.mp3.gz +0 -0
- copyparty/web/deps/marked.js.gz +0 -0
- copyparty/web/md.css.gz +0 -0
- copyparty/web/md.js.gz +0 -0
- copyparty/web/md2.css.gz +0 -0
- copyparty/web/md2.js.gz +0 -0
- copyparty/web/mde.css.gz +0 -0
- copyparty/web/mde.js.gz +0 -0
- copyparty/web/msg.css.gz +0 -0
- copyparty/web/splash.css.gz +0 -0
- copyparty/web/splash.js.gz +0 -0
- copyparty/web/ui.css.gz +0 -0
- copyparty/web/up2k.js.gz +0 -0
- copyparty/web/util.js.gz +0 -0
- {copyparty-1.11.1.dist-info → copyparty-1.12.0.dist-info}/METADATA +28 -7
- {copyparty-1.11.1.dist-info → copyparty-1.12.0.dist-info}/RECORD +39 -38
- {copyparty-1.11.1.dist-info → copyparty-1.12.0.dist-info}/LICENSE +0 -0
- {copyparty-1.11.1.dist-info → copyparty-1.12.0.dist-info}/WHEEL +0 -0
- {copyparty-1.11.1.dist-info → copyparty-1.12.0.dist-info}/entry_points.txt +0 -0
- {copyparty-1.11.1.dist-info → copyparty-1.12.0.dist-info}/top_level.txt +0 -0
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 == "
|
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,
|
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
copyparty/th_cli.py
CHANGED
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",
|
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",
|
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",
|
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,
|
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 =
|
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(
|
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(
|
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
|
-
|
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(
|
2353
|
+
buf = f.read(readsz)
|
2347
2354
|
if not buf:
|
2348
2355
|
break
|
2349
2356
|
|
copyparty/web/baguettebox.js.gz
CHANGED
Binary file
|
copyparty/web/browser.css.gz
CHANGED
Binary file
|
copyparty/web/browser.js.gz
CHANGED
Binary file
|
Binary file
|
copyparty/web/deps/marked.js.gz
CHANGED
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
|
copyparty/web/splash.css.gz
CHANGED
Binary file
|
copyparty/web/splash.js.gz
CHANGED
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.
|
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
|

|
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 `
|
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=
|
2
|
-
copyparty/__main__.py,sha256=
|
3
|
-
copyparty/__version__.py,sha256=
|
4
|
-
copyparty/authsrv.py,sha256=
|
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=
|
14
|
-
copyparty/httpcli.py,sha256=
|
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=
|
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=
|
26
|
-
copyparty/sutil.py,sha256=
|
27
|
-
copyparty/svchub.py,sha256=
|
28
|
-
copyparty/szip.py,sha256=
|
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=
|
31
|
-
copyparty/th_cli.py,sha256=
|
32
|
-
copyparty/th_srv.py,sha256=
|
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=
|
35
|
-
copyparty/util.py,sha256=
|
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=
|
58
|
-
copyparty/web/browser.css.gz,sha256=
|
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=
|
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=
|
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=
|
67
|
-
copyparty/web/md2.css.gz,sha256=
|
68
|
-
copyparty/web/md2.js.gz,sha256=
|
69
|
-
copyparty/web/mde.css.gz,sha256=
|
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=
|
72
|
-
copyparty/web/msg.css.gz,sha256=
|
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=
|
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=
|
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=
|
80
|
-
copyparty/web/up2k.js.gz,sha256=
|
81
|
-
copyparty/web/util.js.gz,sha256
|
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=
|
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.
|
105
|
-
copyparty-1.
|
106
|
-
copyparty-1.
|
107
|
-
copyparty-1.
|
108
|
-
copyparty-1.
|
109
|
-
copyparty-1.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|