copyparty 1.19.15__py3-none-any.whl → 1.19.17__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 +19 -0
- copyparty/__main__.py +47 -11
- copyparty/__version__.py +2 -2
- copyparty/authsrv.py +45 -9
- copyparty/bos/bos.py +5 -1
- copyparty/cfg.py +20 -0
- copyparty/ftpd.py +5 -3
- copyparty/httpcli.py +114 -27
- copyparty/mdns.py +53 -18
- copyparty/mtag.py +18 -4
- copyparty/qrkode.py +107 -0
- copyparty/res/COPYING.txt +76 -5
- copyparty/smbd.py +1 -1
- copyparty/stolen/qrcodegen.py +1 -64
- copyparty/svchub.py +13 -2
- copyparty/tcpsrv.py +6 -7
- copyparty/tftpd.py +1 -1
- copyparty/th_srv.py +11 -5
- copyparty/up2k.py +40 -16
- copyparty/util.py +63 -16
- copyparty/web/baguettebox.js.gz +0 -0
- copyparty/web/browser.css.gz +0 -0
- copyparty/web/browser.html +3 -1
- copyparty/web/browser.js.gz +0 -0
- copyparty/web/splash.html +3 -0
- copyparty/web/splash.js.gz +0 -0
- copyparty/web/tl/chi.js.gz +0 -0
- copyparty/web/tl/cze.js.gz +0 -0
- copyparty/web/tl/deu.js.gz +0 -0
- copyparty/web/tl/epo.js.gz +0 -0
- copyparty/web/tl/fin.js.gz +0 -0
- copyparty/web/tl/fra.js.gz +0 -0
- copyparty/web/tl/grc.js.gz +0 -0
- copyparty/web/tl/ita.js.gz +0 -0
- copyparty/web/tl/kor.js.gz +0 -0
- copyparty/web/tl/nld.js.gz +0 -0
- copyparty/web/tl/nno.js.gz +0 -0
- copyparty/web/tl/nor.js.gz +0 -0
- copyparty/web/tl/pol.js.gz +0 -0
- copyparty/web/tl/por.js.gz +0 -0
- copyparty/web/tl/rus.js.gz +0 -0
- copyparty/web/tl/spa.js.gz +0 -0
- copyparty/web/tl/swe.js.gz +0 -0
- copyparty/web/tl/tur.js.gz +0 -0
- copyparty/web/tl/ukr.js.gz +0 -0
- copyparty/web/util.js.gz +0 -0
- {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/METADATA +47 -2
- {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/RECORD +52 -32
- {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/WHEEL +0 -0
- {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/entry_points.txt +0 -0
- {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/licenses/LICENSE +0 -0
- {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/top_level.txt +0 -0
copyparty/util.py
CHANGED
|
@@ -55,7 +55,6 @@ from .__init__ import (
|
|
|
55
55
|
unicode,
|
|
56
56
|
)
|
|
57
57
|
from .__version__ import S_BUILD_DT, S_VERSION
|
|
58
|
-
from .stolen import surrogateescape
|
|
59
58
|
|
|
60
59
|
try:
|
|
61
60
|
from datetime import datetime, timezone
|
|
@@ -81,6 +80,9 @@ except:
|
|
|
81
80
|
|
|
82
81
|
if PY2:
|
|
83
82
|
range = xrange # type: ignore
|
|
83
|
+
from .stolen import surrogateescape
|
|
84
|
+
|
|
85
|
+
surrogateescape.register_surrogateescape()
|
|
84
86
|
|
|
85
87
|
|
|
86
88
|
if sys.version_info >= (3, 7) or (
|
|
@@ -127,8 +129,10 @@ try:
|
|
|
127
129
|
import fcntl
|
|
128
130
|
|
|
129
131
|
HAVE_FCNTL = True
|
|
132
|
+
HAVE_FICLONE = hasattr(fcntl, "FICLONE")
|
|
130
133
|
except:
|
|
131
134
|
HAVE_FCNTL = False
|
|
135
|
+
HAVE_FICLONE = False
|
|
132
136
|
|
|
133
137
|
try:
|
|
134
138
|
import ctypes
|
|
@@ -136,6 +140,25 @@ try:
|
|
|
136
140
|
except:
|
|
137
141
|
pass
|
|
138
142
|
|
|
143
|
+
try:
|
|
144
|
+
if os.environ.get("PRTY_NO_IFADDR"):
|
|
145
|
+
raise Exception()
|
|
146
|
+
try:
|
|
147
|
+
if os.getenv("PRTY_SYS_ALL") or os.getenv("PRTY_SYS_IFADDR"):
|
|
148
|
+
raise ImportError()
|
|
149
|
+
|
|
150
|
+
from .stolen.ifaddr import get_adapters
|
|
151
|
+
except ImportError:
|
|
152
|
+
from ifaddr import get_adapters
|
|
153
|
+
|
|
154
|
+
HAVE_IFADDR = True
|
|
155
|
+
except:
|
|
156
|
+
HAVE_IFADDR = False
|
|
157
|
+
|
|
158
|
+
def get_adapters(include_unconfigured=False):
|
|
159
|
+
return []
|
|
160
|
+
|
|
161
|
+
|
|
139
162
|
try:
|
|
140
163
|
if os.environ.get("PRTY_NO_SQLITE"):
|
|
141
164
|
raise Exception()
|
|
@@ -173,6 +196,11 @@ try:
|
|
|
173
196
|
except:
|
|
174
197
|
pass
|
|
175
198
|
|
|
199
|
+
if os.getenv("PRTY_MODSPEC"):
|
|
200
|
+
from inspect import getsourcefile
|
|
201
|
+
|
|
202
|
+
print("PRTY_MODSPEC: ifaddr:", getsourcefile(get_adapters))
|
|
203
|
+
|
|
176
204
|
if TYPE_CHECKING:
|
|
177
205
|
from .authsrv import VFS
|
|
178
206
|
from .broker_util import BrokerCli
|
|
@@ -248,7 +276,6 @@ RE_MEMAVAIL = re.compile("^MemAvailable:.* kB")
|
|
|
248
276
|
BOS_SEP = ("%s" % (os.sep,)).encode("ascii")
|
|
249
277
|
|
|
250
278
|
|
|
251
|
-
surrogateescape.register_surrogateescape()
|
|
252
279
|
if WINDOWS and PY2:
|
|
253
280
|
FS_ENCODING = "utf-8"
|
|
254
281
|
else:
|
|
@@ -310,6 +337,8 @@ IMPLICATIONS = [
|
|
|
310
337
|
["hardlink_only", "hardlink"],
|
|
311
338
|
["hardlink", "dedup"],
|
|
312
339
|
["tftpvv", "tftpv"],
|
|
340
|
+
["nodupem", "nodupe"],
|
|
341
|
+
["no_dupe_m", "no_dupe"],
|
|
313
342
|
["smbw", "smb"],
|
|
314
343
|
["smb1", "smb"],
|
|
315
344
|
["smbvvv", "smbvv"],
|
|
@@ -1391,20 +1420,24 @@ def trace(*args , **kwargs ) :
|
|
|
1391
1420
|
nuprint(msg)
|
|
1392
1421
|
|
|
1393
1422
|
|
|
1394
|
-
def alltrace() :
|
|
1423
|
+
def alltrace(verbose = True) :
|
|
1395
1424
|
threads = {}
|
|
1396
1425
|
names = dict([(t.ident, t.name) for t in threading.enumerate()])
|
|
1397
1426
|
for tid, stack in sys._current_frames().items():
|
|
1398
|
-
|
|
1427
|
+
if verbose:
|
|
1428
|
+
name = "%s (%x)" % (names.get(tid), tid)
|
|
1429
|
+
else:
|
|
1430
|
+
name = str(names.get(tid))
|
|
1399
1431
|
threads[name] = stack
|
|
1400
1432
|
|
|
1401
1433
|
rret = []
|
|
1402
1434
|
bret = []
|
|
1435
|
+
np = -3 if verbose else -2
|
|
1403
1436
|
for name, stack in sorted(threads.items()):
|
|
1404
1437
|
ret = ["\n\n# %s" % (name,)]
|
|
1405
1438
|
pad = None
|
|
1406
1439
|
for fn, lno, name, line in traceback.extract_stack(stack):
|
|
1407
|
-
fn = os.sep.join(fn.split(os.sep)[
|
|
1440
|
+
fn = os.sep.join(fn.split(os.sep)[np:])
|
|
1408
1441
|
ret.append('File: "%s", line %d, in %s' % (fn, lno, name))
|
|
1409
1442
|
if line:
|
|
1410
1443
|
ret.append(" " + str(line.strip()))
|
|
@@ -2838,8 +2871,6 @@ def read_socket_chunked(
|
|
|
2838
2871
|
|
|
2839
2872
|
|
|
2840
2873
|
def list_ips() :
|
|
2841
|
-
from .stolen.ifaddr import get_adapters
|
|
2842
|
-
|
|
2843
2874
|
ret = set()
|
|
2844
2875
|
for nic in get_adapters():
|
|
2845
2876
|
for ipo in nic.ips:
|
|
@@ -3514,11 +3545,13 @@ def retchk(
|
|
|
3514
3545
|
|
|
3515
3546
|
def _parsehook(
|
|
3516
3547
|
log , cmd
|
|
3517
|
-
)
|
|
3548
|
+
) :
|
|
3518
3549
|
areq = ""
|
|
3519
3550
|
chk = False
|
|
3520
3551
|
fork = False
|
|
3521
3552
|
jtxt = False
|
|
3553
|
+
imp = False
|
|
3554
|
+
sin = False
|
|
3522
3555
|
wait = 0.0
|
|
3523
3556
|
tout = 0.0
|
|
3524
3557
|
kill = "t"
|
|
@@ -3532,6 +3565,10 @@ def _parsehook(
|
|
|
3532
3565
|
fork = True
|
|
3533
3566
|
elif arg == "j":
|
|
3534
3567
|
jtxt = True
|
|
3568
|
+
elif arg == "I":
|
|
3569
|
+
imp = True
|
|
3570
|
+
elif arg == "s":
|
|
3571
|
+
sin = True
|
|
3535
3572
|
elif arg.startswith("w"):
|
|
3536
3573
|
wait = float(arg[1:])
|
|
3537
3574
|
elif arg.startswith("t"):
|
|
@@ -3576,7 +3613,7 @@ def _parsehook(
|
|
|
3576
3613
|
|
|
3577
3614
|
argv[0] = os.path.expandvars(os.path.expanduser(argv[0]))
|
|
3578
3615
|
|
|
3579
|
-
return areq, chk, fork, jtxt, wait, sp_ka, argv
|
|
3616
|
+
return areq, chk, imp, fork, sin, jtxt, wait, sp_ka, argv
|
|
3580
3617
|
|
|
3581
3618
|
|
|
3582
3619
|
def runihook(
|
|
@@ -3586,7 +3623,7 @@ def runihook(
|
|
|
3586
3623
|
vol ,
|
|
3587
3624
|
ups ,
|
|
3588
3625
|
) :
|
|
3589
|
-
_, chk, fork, jtxt, wait, sp_ka, acmd = _parsehook(log, cmd)
|
|
3626
|
+
_, chk, _, fork, _, jtxt, wait, sp_ka, acmd = _parsehook(log, cmd)
|
|
3590
3627
|
bcmd = [sfsenc(x) for x in acmd]
|
|
3591
3628
|
if acmd[0].endswith(".py"):
|
|
3592
3629
|
bcmd = [sfsenc(pybin)] + bcmd
|
|
@@ -3765,7 +3802,7 @@ def _runhook(
|
|
|
3765
3802
|
txt ,
|
|
3766
3803
|
) :
|
|
3767
3804
|
ret = {"rc": 0}
|
|
3768
|
-
areq, chk, fork, jtxt, wait, sp_ka, acmd = _parsehook(log, cmd)
|
|
3805
|
+
areq, chk, imp, fork, sin, jtxt, wait, sp_ka, acmd = _parsehook(log, cmd)
|
|
3769
3806
|
if areq:
|
|
3770
3807
|
for ch in areq:
|
|
3771
3808
|
if ch not in perms:
|
|
@@ -3773,7 +3810,7 @@ def _runhook(
|
|
|
3773
3810
|
if log:
|
|
3774
3811
|
log(t % (uname, cmd, areq, perms))
|
|
3775
3812
|
return ret # fallthrough to next hook
|
|
3776
|
-
if jtxt:
|
|
3813
|
+
if imp or jtxt:
|
|
3777
3814
|
ja = {
|
|
3778
3815
|
"ap": ap,
|
|
3779
3816
|
"vp": vp,
|
|
@@ -3785,11 +3822,17 @@ def _runhook(
|
|
|
3785
3822
|
"user": uname,
|
|
3786
3823
|
"perms": perms,
|
|
3787
3824
|
"src": src,
|
|
3788
|
-
"txt": txt,
|
|
3789
3825
|
}
|
|
3826
|
+
if txt:
|
|
3827
|
+
ja["txt"] = txt[0]
|
|
3828
|
+
ja["body"] = txt[1]
|
|
3829
|
+
if imp:
|
|
3830
|
+
ja["log"] = log
|
|
3831
|
+
mod = loadpy(acmd[0], False)
|
|
3832
|
+
return mod.main(ja)
|
|
3790
3833
|
arg = json.dumps(ja)
|
|
3791
3834
|
else:
|
|
3792
|
-
arg = txt
|
|
3835
|
+
arg = txt[0] if txt else ap
|
|
3793
3836
|
|
|
3794
3837
|
if acmd[0].startswith("zmq:"):
|
|
3795
3838
|
zi, zs = _zmq_hook(log, verbose, src, acmd[0][4:].lower(), arg, wait, sp_ka)
|
|
@@ -3797,7 +3840,11 @@ def _runhook(
|
|
|
3797
3840
|
raise Exception("zmq says %d" % (zi,))
|
|
3798
3841
|
return {"rc": 0, "stdout": zs}
|
|
3799
3842
|
|
|
3800
|
-
|
|
3843
|
+
if sin:
|
|
3844
|
+
sp_ka["sin"] = (arg + "\n").encode("utf-8", "replace")
|
|
3845
|
+
else:
|
|
3846
|
+
acmd += [arg]
|
|
3847
|
+
|
|
3801
3848
|
if acmd[0].endswith(".py"):
|
|
3802
3849
|
acmd = [pybin] + acmd
|
|
3803
3850
|
|
|
@@ -3880,7 +3927,7 @@ def runhook(
|
|
|
3880
3927
|
else:
|
|
3881
3928
|
ret[k] = v
|
|
3882
3929
|
except Exception as ex:
|
|
3883
|
-
(log or print)("hook:
|
|
3930
|
+
(log or print)("hook: %r, %s" % (ex, ex))
|
|
3884
3931
|
if ",c," in "," + cmd:
|
|
3885
3932
|
return {}
|
|
3886
3933
|
break
|
copyparty/web/baguettebox.js.gz
CHANGED
|
Binary file
|
copyparty/web/browser.css.gz
CHANGED
|
Binary file
|
copyparty/web/browser.html
CHANGED
|
@@ -134,7 +134,6 @@
|
|
|
134
134
|
CGV = {{ cgv|tojson }},
|
|
135
135
|
TS = "{{ ts }}",
|
|
136
136
|
dtheme = "{{ dtheme }}",
|
|
137
|
-
srvinf = "{{ srv_info }}",
|
|
138
137
|
lang = "{{ lang }}",
|
|
139
138
|
dfavico = "{{ favico }}",
|
|
140
139
|
have_tags_idx = {{ have_tags_idx }},
|
|
@@ -146,6 +145,9 @@
|
|
|
146
145
|
document.documentElement.className = (STG && STG.cpp_thm) || dtheme;
|
|
147
146
|
</script>
|
|
148
147
|
<script src="{{ r }}/.cpr/util.js?_={{ ts }}"></script>
|
|
148
|
+
{%- if lang != "eng" %}
|
|
149
|
+
<script src="{{ r }}/.cpr/tl/{{ lang }}.js?_={{ ts }}"></script>
|
|
150
|
+
{%- endif %}
|
|
149
151
|
<script src="{{ r }}/.cpr/baguettebox.js?_={{ ts }}"></script>
|
|
150
152
|
<script src="{{ r }}/.cpr/browser.js?_={{ ts }}"></script>
|
|
151
153
|
<script src="{{ r }}/.cpr/up2k.js?_={{ ts }}"></script>
|
copyparty/web/browser.js.gz
CHANGED
|
Binary file
|
copyparty/web/splash.html
CHANGED
|
@@ -211,6 +211,9 @@ document.documentElement.className = (STG && STG.cpp_thm) || "{{ this.args.theme
|
|
|
211
211
|
|
|
212
212
|
</script>
|
|
213
213
|
<script src="{{ r }}/.cpr/util.js?_={{ ts }}"></script>
|
|
214
|
+
{%- if lang != "eng" %}
|
|
215
|
+
<script src="{{ r }}/.cpr/tl/{{ lang }}.js?_={{ ts }}"></script>
|
|
216
|
+
{%- endif %}
|
|
214
217
|
<script src="{{ r }}/.cpr/splash.js?_={{ ts }}"></script>
|
|
215
218
|
{%- if js %}
|
|
216
219
|
<script src="{{ js }}_={{ ts }}"></script>
|
copyparty/web/splash.js.gz
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
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.19.
|
|
3
|
+
Version: 1.19.17
|
|
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
|
|
@@ -203,6 +203,7 @@ made in Norway 🇳🇴
|
|
|
203
203
|
* [dependencies](#dependencies) - mandatory deps
|
|
204
204
|
* [optional dependencies](#optional-dependencies) - install these to enable bonus features
|
|
205
205
|
* [dependency chickenbits](#dependency-chickenbits) - prevent loading an optional dependency
|
|
206
|
+
* [dependency unvendoring](#dependency-unvendoring) - force use of system modules
|
|
206
207
|
* [optional gpl stuff](#optional-gpl-stuff)
|
|
207
208
|
* [sfx](#sfx) - the self-contained "binary" (recommended!)
|
|
208
209
|
* [copyparty.exe](#copypartyexe) - download [copyparty.exe](https://github.com/9001/copyparty/releases/latest/download/copyparty.exe) (win8+) or [copyparty32.exe](https://github.com/9001/copyparty/releases/latest/download/copyparty32.exe) (win7+)
|
|
@@ -278,6 +279,7 @@ you may also want these, especially on servers:
|
|
|
278
279
|
|
|
279
280
|
* [contrib/systemd/copyparty.service](contrib/systemd/copyparty.service) to run copyparty as a systemd service (see guide inside)
|
|
280
281
|
* [contrib/systemd/prisonparty.service](contrib/systemd/prisonparty.service) to run it in a chroot (for extra security)
|
|
282
|
+
* [contrib/podman-systemd/](contrib/podman-systemd/) to run copyparty in a Podman container as a systemd service (see guide inside)
|
|
281
283
|
* [contrib/openrc/copyparty](contrib/openrc/copyparty) to run copyparty on Alpine / Gentoo
|
|
282
284
|
* [contrib/rc/copyparty](contrib/rc/copyparty) to run copyparty on FreeBSD
|
|
283
285
|
* [nixos module](#nixos-module) to run copyparty on NixOS hosts
|
|
@@ -586,6 +588,9 @@ examples:
|
|
|
586
588
|
|
|
587
589
|
if you want to grant access to all users who are logged in, the group `acct` will always contain all known users, so for example `-v /mnt/music:music:r,@acct`
|
|
588
590
|
|
|
591
|
+
* to do the opposite, granting access to everyone who is NOT logged in. `*,-@acct` does the trick, for example `-v /srv/welcome:welcome:r,*,-@acct`
|
|
592
|
+
* single users can also be subtracted from a group: `@admins,-james`
|
|
593
|
+
|
|
589
594
|
anyone trying to bruteforce a password gets banned according to `--ban-pw`; default is 24h ban for 9 failed attempts in 1 hour
|
|
590
595
|
|
|
591
596
|
and if you want to use config files instead of commandline args (good!) then here's the same examples as a configfile; save it as `foobar.conf` and use it like this: `python copyparty-sfx.py -c foobar.conf`
|
|
@@ -794,6 +799,10 @@ to show `/icons/exe.png` and `/icons/elf.gif` as the thumbnail for all `.exe` an
|
|
|
794
799
|
* the supported image formats are [jpg, png, gif, webp, ico](https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types)
|
|
795
800
|
* be careful with svg; chrome will crash if you have too many unique svg files showing on the same page (the limit is 250 or so) -- showing the same handful of svg files thousands of times is ok however
|
|
796
801
|
|
|
802
|
+
note:
|
|
803
|
+
* heif/heifs/heic/heics images usually require the `libvips` [optional dependency](#optional-dependencies) (available in the `iv` docker image, `withFastThumbnails` in nixos)
|
|
804
|
+
* technical trivia: FFmpeg has basic support for tiled heic as of v7.0; need `-show_stream_groups` for correct resolution
|
|
805
|
+
|
|
797
806
|
config file example:
|
|
798
807
|
|
|
799
808
|
```yaml
|
|
@@ -1062,6 +1071,8 @@ available functions:
|
|
|
1062
1071
|
* `$lpad(text, length, pad_char)`
|
|
1063
1072
|
* `$rpad(text, length, pad_char)`
|
|
1064
1073
|
|
|
1074
|
+
two counters are available; `.n.s` is the nth file in the selection, and `.n.d` the nth file in the folder, for example rename-output `file(.n.d).(ext)` gives `file5.bin`, and `beach-$lpad((.n.s),3,0).(ext)` is `beach-017.jpg` and the initial value of each counter can be set in the textboxes underneath the preset dropdown
|
|
1075
|
+
|
|
1065
1076
|
so,
|
|
1066
1077
|
|
|
1067
1078
|
say you have a file named [`meganeko - Eclipse - 07 Sirius A.mp3`](https://www.youtube.com/watch?v=-dtb0vDPruI) (absolutely fantastic album btw) and the tags are: `Album:Eclipse`, `Artist:meganeko`, `Title:Sirius A`, `tn:7`
|
|
@@ -1097,6 +1108,8 @@ url parameters:
|
|
|
1097
1108
|
|
|
1098
1109
|
* `pw=hunter2` for password auth
|
|
1099
1110
|
* if you enabled `--usernames` then do `pw=username:password` instead
|
|
1111
|
+
* `nopw` disables embedding the password (if provided) into item-URLs in the feed
|
|
1112
|
+
* `nopw=a` disables mentioning the password anywhere at all in the feed; may break some readers
|
|
1100
1113
|
* `recursive` to also include subfolders
|
|
1101
1114
|
* `title=foo` changes the feed title (default: folder name)
|
|
1102
1115
|
* `fext=mp3,opus` only include mp3 and opus files (default: all)
|
|
@@ -1163,6 +1176,7 @@ some highlights:
|
|
|
1163
1176
|
* shows the audio waveform in the seekbar
|
|
1164
1177
|
* not perfectly gapless but can get really close (see settings + eq below); good enough to enjoy gapless albums as intended
|
|
1165
1178
|
* videos can be played as audio, without wasting bandwidth on the video
|
|
1179
|
+
* adding `?v` to the end of an audio/video/image link will make it open in the mediaplayer
|
|
1166
1180
|
|
|
1167
1181
|
click the `play` link next to an audio file, or copy the link target to [share it](https://a.ocv.me/pub/demo/music/Ubiktune%20-%20SOUNDSHOCK%202%20-%20FM%20FUNK%20TERRROR!!/#af-1fbfba61&t=18) (optionally with a timestamp to start playing from, like that example does)
|
|
1168
1182
|
|
|
@@ -1547,7 +1561,12 @@ tweaking the ui
|
|
|
1547
1561
|
* to sort in music order (album, track, artist, title) with filename as fallback, you could `--sort tags/Circle,tags/.tn,tags/Artist,tags/Title,href`
|
|
1548
1562
|
* to sort by upload date, first enable showing the upload date in the listing with `-e2d -mte +.up_at` and then `--sort tags/.up_at`
|
|
1549
1563
|
|
|
1550
|
-
see [./docs/rice](./docs/rice) for more, including
|
|
1564
|
+
see [./docs/rice](./docs/rice) for more, including:
|
|
1565
|
+
* how to [hide ui-elements](./docs/rice/README.md#hide-ui-elements)
|
|
1566
|
+
* [custom fonts](./docs/rice/README.md#custom-fonts)
|
|
1567
|
+
* [custom loading-spinner](./docs/rice/README.md#boring-loader-spinner)
|
|
1568
|
+
* adding stuff (css/`<meta>`/...) [to the html `<head>` tag](./docs/rice/README.md#head)
|
|
1569
|
+
* [adding your own translation](./docs/rice/README.md#translations)
|
|
1551
1570
|
|
|
1552
1571
|
|
|
1553
1572
|
## opengraph
|
|
@@ -2530,6 +2549,10 @@ copyparty on NixOS is configured via `services.copyparty` options, for example:
|
|
|
2530
2549
|
```nix
|
|
2531
2550
|
services.copyparty = {
|
|
2532
2551
|
enable = true;
|
|
2552
|
+
# the user to run the service as
|
|
2553
|
+
user = "copyparty";
|
|
2554
|
+
# the group to run the service as
|
|
2555
|
+
group = "copyparty";
|
|
2533
2556
|
# directly maps to values in the [global] section of the copyparty config.
|
|
2534
2557
|
# see `copyparty --help` for available options
|
|
2535
2558
|
settings = {
|
|
@@ -2554,6 +2577,12 @@ services.copyparty = {
|
|
|
2554
2577
|
k.passwordFile = "/run/keys/copyparty/k_password";
|
|
2555
2578
|
};
|
|
2556
2579
|
|
|
2580
|
+
# create a group
|
|
2581
|
+
groups = {
|
|
2582
|
+
# users "ed" and "k" are part of the group g1
|
|
2583
|
+
g1 = [ "ed" "k" ];
|
|
2584
|
+
};
|
|
2585
|
+
|
|
2557
2586
|
# create a volume
|
|
2558
2587
|
volumes = {
|
|
2559
2588
|
# create a volume at "/" (the webroot), which will
|
|
@@ -3043,6 +3072,20 @@ example: `PRTY_NO_PIL=1 python3 copyparty-sfx.py`
|
|
|
3043
3072
|
* python2.7 on windows: `PRTY_NO_FFMPEG` + `PRTY_NO_FFPROBE` saves startup time
|
|
3044
3073
|
|
|
3045
3074
|
|
|
3075
|
+
### dependency unvendoring
|
|
3076
|
+
|
|
3077
|
+
force use of system modules instead of the vendored versions:
|
|
3078
|
+
|
|
3079
|
+
| env-var | what it does |
|
|
3080
|
+
| -------------------- | ------------ |
|
|
3081
|
+
| `PRTY_SYS_ALL` | all of the below |
|
|
3082
|
+
| `PRTY_SYS_DNSLIB` | replace [stolen/dnslib](./copyparty/stolen/dnslib) with [upstream](https://pypi.org/project/dnslib/) |
|
|
3083
|
+
| `PRTY_SYS_IFADDR` | replace [stolen/ifaddr](./copyparty/stolen/ifaddr) with [upstream](https://pypi.org/project/ifaddr/) |
|
|
3084
|
+
| `PRTY_SYS_QRCG` | replace [stolen/qrcodegen.py](./copyparty/stolen/qrcodegen.py) with [upstream](https://github.com/nayuki/QR-Code-generator/blob/master/python/qrcodegen.py) |
|
|
3085
|
+
|
|
3086
|
+
to debug, run copyparty with `PRTY_MODSPEC=1` to see where it's getting each module from
|
|
3087
|
+
|
|
3088
|
+
|
|
3046
3089
|
## optional gpl stuff
|
|
3047
3090
|
|
|
3048
3091
|
some bundled tools have copyleft dependencies, see [./bin/#mtag](bin/#mtag)
|
|
@@ -3105,6 +3148,8 @@ if you want thumbnails (photos+videos) and you're okay with spending another 132
|
|
|
3105
3148
|
|
|
3106
3149
|
* or if you want to use `vips` for photo-thumbs instead, `pkg install libvips && python -m pip install --user -U wheel && python -m pip install --user -U pyvips && (cd /data/data/com.termux/files/usr/lib/; ln -s libgobject-2.0.so{,.0}; ln -s libvips.so{,.42})`
|
|
3107
3150
|
|
|
3151
|
+
if you are suddenly unable to access storage (permission issues), try forcequitting termux, revoke all of its permissions in android settings, and run the command `termux-setup-storage`
|
|
3152
|
+
|
|
3108
3153
|
|
|
3109
3154
|
# install on iOS
|
|
3110
3155
|
|
|
@@ -1,46 +1,47 @@
|
|
|
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=7fjx-1nxaxr6UHo6A7MocA3-UPZTPP6jfgrNNfP38bk,2926
|
|
2
|
+
copyparty/__main__.py,sha256=uzOymQUZzDEFQa9SNZWLtbu7zbCd_6NEID0lmgrLtng,150194
|
|
3
|
+
copyparty/__version__.py,sha256=pQd30Cga5MCctT15TAcN5imWPCkMU0k4XYeP-zt5IGw,253
|
|
4
|
+
copyparty/authsrv.py,sha256=JDUjrEra0e9yUDT_xqWju4wWhuVZjEz3iBlr9sotkR8,135540
|
|
5
5
|
copyparty/broker_mp.py,sha256=QdOXXvV2Xn6J0CysEqyY3GZbqxQMyWnTpnba-a5lMc0,4987
|
|
6
6
|
copyparty/broker_mpw.py,sha256=LXQlmxzOvdpqP1aZoiIvWHAYUV_PoewLORLD1BGRs0g,3449
|
|
7
7
|
copyparty/broker_thr.py,sha256=fjoYtpSscUA7-nMl4r1n2R7UK3J9lrvLS3rUZ-iJzKQ,1721
|
|
8
8
|
copyparty/broker_util.py,sha256=oZ3dGdJXLYvmdV4KSFdUv_PGErkgU-7kgr1SIglkjCU,1663
|
|
9
9
|
copyparty/cert.py,sha256=OGTUBxhqPbseG0Bd4cHD6e5T5T8JdGqp3q0KAYqX0Cc,8031
|
|
10
|
-
copyparty/cfg.py,sha256=
|
|
10
|
+
copyparty/cfg.py,sha256=MPSVOamweuBhz65UdZQ7PVIzMle8BOyWQVBZBtesoZ4,17782
|
|
11
11
|
copyparty/dxml.py,sha256=VZADJS9z18LalENSvVfjk29ddnpaDQ-v8AVm_THwS1c,2607
|
|
12
12
|
copyparty/fsutil.py,sha256=kGvNM9G9YLeqcQjhDGfmT8gV7fn2WU0xye9BulL4h04,6469
|
|
13
|
-
copyparty/ftpd.py,sha256=
|
|
14
|
-
copyparty/httpcli.py,sha256=
|
|
13
|
+
copyparty/ftpd.py,sha256=uw8HOpkBfDPX-MpUvWgzuZhT3VLx3PNdoCAXgGdgGSA,18627
|
|
14
|
+
copyparty/httpcli.py,sha256=XtNzx_aUP2VkXRurOB7GW2RpP2t6G4G53as6zN6pZa4,250071
|
|
15
15
|
copyparty/httpconn.py,sha256=IA9fdCjigawZ4kWhgvVN3nSiy5pb3W2qaE6rFqUYdq0,6943
|
|
16
16
|
copyparty/httpsrv.py,sha256=6Al4seTbEqARBYkPwx_8YLS6qz6-oJQHwFdO1rqEgd4,19094
|
|
17
17
|
copyparty/ico.py,sha256=-7QjF_jIxnPo4Vr0oUPksQ_U_Ef0HRsSPm3s71idOz8,3879
|
|
18
|
-
copyparty/mdns.py,sha256=
|
|
18
|
+
copyparty/mdns.py,sha256=OfAms3kqolF5KFkorwwKH7ysd6_DRQzi3Ri62vTdCHA,19293
|
|
19
19
|
copyparty/metrics.py,sha256=1dim0ShnsD5cfspRbeN9Mt14wOIxPRtxCZY2IScikKw,8974
|
|
20
|
-
copyparty/mtag.py,sha256=
|
|
20
|
+
copyparty/mtag.py,sha256=xfo6dm769Qq9kCGcYt9vyyS6774v0NPjNSXoUq3A3tw,23184
|
|
21
21
|
copyparty/multicast.py,sha256=aqiY_ufCxcJ_VHn89jmdJFz61UukjEbQmHLGS6L-6JY,12423
|
|
22
22
|
copyparty/pwhash.py,sha256=58txP8GXIHOtWd__Tni8qkilHEGpOFsKIPuzjdFLc6M,4426
|
|
23
|
-
copyparty/
|
|
23
|
+
copyparty/qrkode.py,sha256=dkjcHDfEdxozFVwVAY8bFFf5P0cqieYmaMdnFixeiuM,2681
|
|
24
|
+
copyparty/smbd.py,sha256=e-IBDEVzFgSHspQjpUm2d5K58koBT109ZOPJup1yBJ0,14892
|
|
24
25
|
copyparty/ssdp.py,sha256=R1Z61GZOxBMF2Sk4RTxKWMOemogmcjEWG-CvLihd45k,7023
|
|
25
26
|
copyparty/star.py,sha256=tV5BbX6AiQ7N4UU8DYtSTckNYeoeey4DBqq4LjfymbY,3818
|
|
26
27
|
copyparty/sutil.py,sha256=E65jAaOzHlJYnqsOKDMPVT8kALPUVexpkSStWBdItkY,3231
|
|
27
|
-
copyparty/svchub.py,sha256=
|
|
28
|
+
copyparty/svchub.py,sha256=Qvcicxab_Xwy3pA22PIGTM2aIqVbmhRM7YwQDJ8aLpI,54964
|
|
28
29
|
copyparty/szip.py,sha256=9srQzjsTBrBadf6QMh4YRAL70rkZLevAOHqXWK5jvr8,8846
|
|
29
|
-
copyparty/tcpsrv.py,sha256=
|
|
30
|
-
copyparty/tftpd.py,sha256=
|
|
30
|
+
copyparty/tcpsrv.py,sha256=xQEJsDES9cYJnXaxy1GqN_M_8rYeAKM94Fkbg9sZWRI,22305
|
|
31
|
+
copyparty/tftpd.py,sha256=TA5-8b_JAmSWuN9YiHiRVBw_4Wusnr2ENidr06Uyej8,14500
|
|
31
32
|
copyparty/th_cli.py,sha256=n3MMbnN7HTVSBHkTI2qLIjgwVvHkGsfTW7-aPJ-2o4s,5545
|
|
32
|
-
copyparty/th_srv.py,sha256=
|
|
33
|
+
copyparty/th_srv.py,sha256=r4I8PaMfg_eOf7Zo3GZpT22U-DsYnQO_R0fiZjB9R38,38573
|
|
33
34
|
copyparty/u2idx.py,sha256=9Fcm8cDgLU4DdrH_2Q-lHAbMz4VfzLnANS0s4QgWZzE,14890
|
|
34
|
-
copyparty/up2k.py,sha256
|
|
35
|
-
copyparty/util.py,sha256=
|
|
35
|
+
copyparty/up2k.py,sha256=-Cqg7g6iAshI0k-89-1yVOmFhbFNYHnOb83L6z9mFvc,185204
|
|
36
|
+
copyparty/util.py,sha256=b_f1Ff2K4hfjOB6uHyJ3gyr8xX6S2wCA_Vxy4mTaaVE,110639
|
|
36
37
|
copyparty/bos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
-
copyparty/bos/bos.py,sha256=
|
|
38
|
+
copyparty/bos/bos.py,sha256=5Cp0Ob5XnCt8Zmr56QLQmsc9rkdz8Y1UBeB0026TqoE,3388
|
|
38
39
|
copyparty/bos/path.py,sha256=yEjCq2ki9CvxA5sCT8pS0keEXwugs0ZeUyUhdBziOCI,777
|
|
39
|
-
copyparty/res/COPYING.txt,sha256=
|
|
40
|
+
copyparty/res/COPYING.txt,sha256=Zfcbw5KN_KJ7PQeLgoXwyWcAXXb0gc41iQiHcnGSNxg,19902
|
|
40
41
|
copyparty/res/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
42
|
copyparty/res/insecure.pem,sha256=FEt7jgrn6ZHTlFopq_LFAN027YIoaHi0HQFBbzYnEwc,2876
|
|
42
43
|
copyparty/stolen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
|
-
copyparty/stolen/qrcodegen.py,sha256=
|
|
44
|
+
copyparty/stolen/qrcodegen.py,sha256=nvcGFPSFwyhxnwRLzOqxzZdvAYaV7luzkYB3Kku1sZY,20679
|
|
44
45
|
copyparty/stolen/surrogateescape.py,sha256=-ZfRWrbgJrh74dXfXLNMvo_iiCVUhXbFs_anHIrWPts,5573
|
|
45
46
|
copyparty/stolen/dnslib/__init__.py,sha256=SmYdaHdL5czxKxrOFGvzbfmojOthRky1GXKgmWj4QeM,159
|
|
46
47
|
copyparty/stolen/dnslib/bimap.py,sha256=j_ah40P3kOw0AQT5vvMcv7XbMtS0jV6Oe9YGCh7J57s,1182
|
|
@@ -54,10 +55,10 @@ copyparty/stolen/ifaddr/__init__.py,sha256=vpREjAyPubr5s1NJi91icXV3q1o4DrKAvHABw
|
|
|
54
55
|
copyparty/stolen/ifaddr/_posix.py,sha256=-67NdfGrCktfQPakT2fLbjl2U00QMvyBGkSvrUuTOrU,2626
|
|
55
56
|
copyparty/stolen/ifaddr/_shared.py,sha256=uNC4SdEIgdSLKvuUzsf1aM-H1Xrc_9mpLoOT43YukGs,6206
|
|
56
57
|
copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
|
|
57
|
-
copyparty/web/baguettebox.js.gz,sha256=
|
|
58
|
-
copyparty/web/browser.css.gz,sha256=
|
|
59
|
-
copyparty/web/browser.html,sha256=
|
|
60
|
-
copyparty/web/browser.js.gz,sha256=
|
|
58
|
+
copyparty/web/baguettebox.js.gz,sha256=B0gNOVblZWC3dcOektvuqT2jfVK99WY6ThRo9t1iu_A,9499
|
|
59
|
+
copyparty/web/browser.css.gz,sha256=DPIruSmxA-yw7yv6vBiQZoIKOCcDLOrxORm3ae5GNWQ,15878
|
|
60
|
+
copyparty/web/browser.html,sha256=IxHHqvGMlrG8B4hYkoIaH2cX6qCOCCZ6TQbAx9oB8KY,4865
|
|
61
|
+
copyparty/web/browser.js.gz,sha256=vfurFx7CklzzYDs_GDJ_AXkTJHN-O46jO7gx4qr7WfI,72501
|
|
61
62
|
copyparty/web/browser2.html,sha256=NRUZ08GH-e2YcGXcoz0UjYg6JIVF42u4IMX4HHwWTmg,1587
|
|
62
63
|
copyparty/web/cf.html,sha256=lJThtNFNAQT1ClCHHlivAkDGE0LutedwopXD62Z8Nys,589
|
|
63
64
|
copyparty/web/dbg-audio.js.gz,sha256=fNf4wGVGdz5fDtn-97ks3XPIglTKnTKiYo4Dk2m-NoA,688
|
|
@@ -80,13 +81,13 @@ copyparty/web/shares.css.gz,sha256=ChgHt-2dPgvPCpwClNeijX39OWJIbwj7NBIZXLLvaT0,5
|
|
|
80
81
|
copyparty/web/shares.html,sha256=SWgcgiAXEtV6xFqYDUlgg6WmrjedmgP3hCaVksNk1y4,2582
|
|
81
82
|
copyparty/web/shares.js.gz,sha256=LGgFdYhtTwBp96x6CtWZpMWrGaZW7vn5LYvIhPQqm8g,942
|
|
82
83
|
copyparty/web/splash.css.gz,sha256=Ez7MRPtPzYEiSsLsI7S9o8_jGFQxUFvK2j92ow5AoDg,1155
|
|
83
|
-
copyparty/web/splash.html,sha256=
|
|
84
|
-
copyparty/web/splash.js.gz,sha256=
|
|
84
|
+
copyparty/web/splash.html,sha256=NOYmsKmPpzJN0UbavTEq5Pfb9993URrOC9rBl6EJOBY,7578
|
|
85
|
+
copyparty/web/splash.js.gz,sha256=QPvYszEB_HAR98nb1pnEYnuuz23zHjH3wUTJGaa_Myo,1182
|
|
85
86
|
copyparty/web/svcs.html,sha256=eBT6zq130hLHcD7OzYZD4ozFEd_bmU1-hTqDTt09Xs8,17576
|
|
86
87
|
copyparty/web/svcs.js.gz,sha256=DapO-UcJYln4VPyZ6Pwi0Lzhlyx0Hul7y7E2ephu34c,971
|
|
87
88
|
copyparty/web/ui.css.gz,sha256=Txx36dDbFI7_9I2LPUO40nCFnxLFKVpdkBsHFwI7JoE,2848
|
|
88
89
|
copyparty/web/up2k.js.gz,sha256=3-_qOof3UR00_jVDxTGpQFv-DH3gfPS8k1QByHZtd14,25035
|
|
89
|
-
copyparty/web/util.js.gz,sha256=
|
|
90
|
+
copyparty/web/util.js.gz,sha256=YGNczP3-yjio2iU2lUBsMKSiikiji-vgZIljSANu_z0,16387
|
|
90
91
|
copyparty/web/w.hash.js.gz,sha256=rI-78PyXCdVjOpULbD9raBRyxxaPls5OjR7wonzXZPE,1193
|
|
91
92
|
copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
93
|
copyparty/web/a/partyfuse.py,sha256=QxBoe0iu4LTedmxWdIsuBUlwdxQ7zQh9LAFtjAFcPpo,28206
|
|
@@ -106,9 +107,28 @@ copyparty/web/deps/prismd.css.gz,sha256=VPKuZhPmVyhTKHo2xN6IBX-C2A8Eo313vIPxQ2Hx
|
|
|
106
107
|
copyparty/web/deps/scp.woff2,sha256=mmjmsoLDBPKa5VHcEdxZiJcDR1S1TOvCjIg5Cf1iL0s,8684
|
|
107
108
|
copyparty/web/deps/sha512.ac.js.gz,sha256=OLk7EjA5e-DtJGlV0IQbvokpmoyE5v7djezx9kZBabE,7046
|
|
108
109
|
copyparty/web/deps/sha512.hw.js.gz,sha256=UAed2_ocklZCnIzcSYz2h4P1ycztlCLj-ewsRTud2lU,7939
|
|
109
|
-
copyparty
|
|
110
|
-
copyparty
|
|
111
|
-
copyparty
|
|
112
|
-
copyparty
|
|
113
|
-
copyparty
|
|
114
|
-
copyparty
|
|
110
|
+
copyparty/web/tl/chi.js.gz,sha256=TMOdOsT5e6g5JkJSNfxMBj8j9Lcgp5CPAPSU_TBrWI4,14686
|
|
111
|
+
copyparty/web/tl/cze.js.gz,sha256=tWbPL2LyQj95z1THu0oIhKZT0xDW3nC3QqqyBUsSmEo,15424
|
|
112
|
+
copyparty/web/tl/deu.js.gz,sha256=Xw-PejKnh8VNEMkS9yh7FUgZYn_pj7G9iqgWlhpLbPM,15567
|
|
113
|
+
copyparty/web/tl/epo.js.gz,sha256=d9b2MLwN6jstK522tZWRcf6j5c4Q6Vm3VrV-C5Z_lu0,14213
|
|
114
|
+
copyparty/web/tl/fin.js.gz,sha256=7SUK-xUwBe8aq49gPxdEX2GbjNCVzN4v_rJC7zZHgac,15168
|
|
115
|
+
copyparty/web/tl/fra.js.gz,sha256=9Jhn3878w-7BiMI9fRqZDJcWjs-8DJuLCza4LTC9bOU,15825
|
|
116
|
+
copyparty/web/tl/grc.js.gz,sha256=Q6vsE2hX8O7hv05AIjRXI46ozgHvsuifcz9S3Pse-e0,17752
|
|
117
|
+
copyparty/web/tl/ita.js.gz,sha256=IYjg4KqMayWSVr_jUaprRHf93Vvmpi64ZgGTaoXbisY,14661
|
|
118
|
+
copyparty/web/tl/kor.js.gz,sha256=XWlZvsX1nDVA_s-9vZXJh5gZpiScu4vcRkudmM0vXvg,15326
|
|
119
|
+
copyparty/web/tl/nld.js.gz,sha256=6d9tDZDK44IpUiEQqU7XLrzv4fKqakOBQzuoh-eyHdI,15430
|
|
120
|
+
copyparty/web/tl/nno.js.gz,sha256=i-bzHEOBfqyRV9fT5UmSZKZfNX_7XkU66E7mkBd-M00,14817
|
|
121
|
+
copyparty/web/tl/nor.js.gz,sha256=RADjEOWqkzm7JSZbGMZhoXhbw21ks8Df1DDPBe_f2Io,14598
|
|
122
|
+
copyparty/web/tl/pol.js.gz,sha256=IIhRwrdmJ29HWCQXO0aLQKT7K4Tql4KJnRw5rOG7Nx4,15694
|
|
123
|
+
copyparty/web/tl/por.js.gz,sha256=rwBCgtgdL24r-oNCPyODhA0ldv0dJnLTg273YHEDI5E,14886
|
|
124
|
+
copyparty/web/tl/rus.js.gz,sha256=SoH7G1VcAUnbv-yhYJB1x-ZSRiHCwwZ-xQ7ImykryaM,16909
|
|
125
|
+
copyparty/web/tl/spa.js.gz,sha256=pEqdC_qfbF1JNJQg5UX7bj6XXVZoLWzWCLkeT_oVNFk,14956
|
|
126
|
+
copyparty/web/tl/swe.js.gz,sha256=JAz_p2ceHLxsu-lBfc3zcukszbnCDkcvE4IU4nzW2Kk,14393
|
|
127
|
+
copyparty/web/tl/tur.js.gz,sha256=yOgKEuZ8zpGJo7E-wPXIKjwVcQMAoDLDiJow_B3yomo,14977
|
|
128
|
+
copyparty/web/tl/ukr.js.gz,sha256=3ZUR27PBTI_QyhEcoX0yo6_KawvehTRzqbJ0q1pc_bo,17243
|
|
129
|
+
copyparty-1.19.17.dist-info/licenses/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
|
|
130
|
+
copyparty-1.19.17.dist-info/METADATA,sha256=-xwwzxdEnbrnryX-iV-Cx1mm0FVXGRqeTusKHmKa_kU,182009
|
|
131
|
+
copyparty-1.19.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
132
|
+
copyparty-1.19.17.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
|
|
133
|
+
copyparty-1.19.17.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
|
|
134
|
+
copyparty-1.19.17.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|