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.
Files changed (52) hide show
  1. copyparty/__init__.py +19 -0
  2. copyparty/__main__.py +47 -11
  3. copyparty/__version__.py +2 -2
  4. copyparty/authsrv.py +45 -9
  5. copyparty/bos/bos.py +5 -1
  6. copyparty/cfg.py +20 -0
  7. copyparty/ftpd.py +5 -3
  8. copyparty/httpcli.py +114 -27
  9. copyparty/mdns.py +53 -18
  10. copyparty/mtag.py +18 -4
  11. copyparty/qrkode.py +107 -0
  12. copyparty/res/COPYING.txt +76 -5
  13. copyparty/smbd.py +1 -1
  14. copyparty/stolen/qrcodegen.py +1 -64
  15. copyparty/svchub.py +13 -2
  16. copyparty/tcpsrv.py +6 -7
  17. copyparty/tftpd.py +1 -1
  18. copyparty/th_srv.py +11 -5
  19. copyparty/up2k.py +40 -16
  20. copyparty/util.py +63 -16
  21. copyparty/web/baguettebox.js.gz +0 -0
  22. copyparty/web/browser.css.gz +0 -0
  23. copyparty/web/browser.html +3 -1
  24. copyparty/web/browser.js.gz +0 -0
  25. copyparty/web/splash.html +3 -0
  26. copyparty/web/splash.js.gz +0 -0
  27. copyparty/web/tl/chi.js.gz +0 -0
  28. copyparty/web/tl/cze.js.gz +0 -0
  29. copyparty/web/tl/deu.js.gz +0 -0
  30. copyparty/web/tl/epo.js.gz +0 -0
  31. copyparty/web/tl/fin.js.gz +0 -0
  32. copyparty/web/tl/fra.js.gz +0 -0
  33. copyparty/web/tl/grc.js.gz +0 -0
  34. copyparty/web/tl/ita.js.gz +0 -0
  35. copyparty/web/tl/kor.js.gz +0 -0
  36. copyparty/web/tl/nld.js.gz +0 -0
  37. copyparty/web/tl/nno.js.gz +0 -0
  38. copyparty/web/tl/nor.js.gz +0 -0
  39. copyparty/web/tl/pol.js.gz +0 -0
  40. copyparty/web/tl/por.js.gz +0 -0
  41. copyparty/web/tl/rus.js.gz +0 -0
  42. copyparty/web/tl/spa.js.gz +0 -0
  43. copyparty/web/tl/swe.js.gz +0 -0
  44. copyparty/web/tl/tur.js.gz +0 -0
  45. copyparty/web/tl/ukr.js.gz +0 -0
  46. copyparty/web/util.js.gz +0 -0
  47. {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/METADATA +47 -2
  48. {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/RECORD +52 -32
  49. {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/WHEEL +0 -0
  50. {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/entry_points.txt +0 -0
  51. {copyparty-1.19.15.dist-info → copyparty-1.19.17.dist-info}/licenses/LICENSE +0 -0
  52. {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
- name = "%s (%x)" % (names.get(tid), tid)
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)[-3:])
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 or ap
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
- acmd += [arg]
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: {}".format(ex))
3930
+ (log or print)("hook: %r, %s" % (ex, ex))
3884
3931
  if ",c," in "," + cmd:
3885
3932
  return {}
3886
3933
  break
Binary file
Binary file
@@ -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>
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>
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.15
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 how to add stuff (css/`<meta>`/...) to the html `<head>` tag, or to add your own translation
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=wmO5wCR1yHdtWbYv1_8LZxLwS4W1s2OxpVYafvLHEBE,2660
2
- copyparty/__main__.py,sha256=z-fnlm_RUJKHSWjPK5OEhfi_EPPBj9_SpoLcF_KCSCY,146886
3
- copyparty/__version__.py,sha256=bjYZAZnxHpvJe1B2F6UR_VdwsdSWasNHpTROGp5cJ-E,252
4
- copyparty/authsrv.py,sha256=_QzlqNkjDv02dOB4z8NLWN5G5fq-DbIJnSFoZd4-uM8,134099
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=8sW0KXoR1zkn9IrSLpbz8SDL0pGDJ0OS_2gn311RBnc,17035
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=gXErlJgWsL2rw9l6REqE61GtLa8lgIaMShm86U9s05I,18531
14
- copyparty/httpcli.py,sha256=GbohXa6c-AvSdd-BPRGBioyGR3fymsReAkms8Lu0Kpc,246795
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=KCxQ0Mv9JTMSEiP0fwryCSM23hG9HUoqV0DCmMlfbAM,18578
18
+ copyparty/mdns.py,sha256=OfAms3kqolF5KFkorwwKH7ysd6_DRQzi3Ri62vTdCHA,19293
19
19
  copyparty/metrics.py,sha256=1dim0ShnsD5cfspRbeN9Mt14wOIxPRtxCZY2IScikKw,8974
20
- copyparty/mtag.py,sha256=HGZDY7YF1Uqq73Pd76eCxMicpVnR-imFtjXze6Z7FsA,22829
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/smbd.py,sha256=53GsMXXsQMHbGCkbUVoeQEo_JU5pV8FEtuJCKZHa93E,14890
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=uR54FunRSOyx4NGsoSyeYmkml7zSgj_9Clm-vSg1Bmw,54477
28
+ copyparty/svchub.py,sha256=Qvcicxab_Xwy3pA22PIGTM2aIqVbmhRM7YwQDJ8aLpI,54964
28
29
  copyparty/szip.py,sha256=9srQzjsTBrBadf6QMh4YRAL70rkZLevAOHqXWK5jvr8,8846
29
- copyparty/tcpsrv.py,sha256=i5JquTEfHNjBFMXVrmdMYNyDO3FxzelWIKm3CGvNQOc,22335
30
- copyparty/tftpd.py,sha256=Y-RFkwjcVGVYI8aHfvoir6eUz3Ai5uI6zax-M523C-o,14498
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=iAWBHgtAaYAshXdCFrUx7IWq4y3NXrH79yzHChsy2dc,38335
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=ozCZFKlSEzE2ql8W5uJDVFDKZnfw95vrkstJARBm6GQ,184182
35
- copyparty/util.py,sha256=1Mrb1xm5E-v3oDmPHXistw5G3fnW7MqJQmqzYEg4m0E,109427
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=aGnph4sLIXe7-SFLo5qo1V67Ab1ZtgiUNbAN8EnHvkA,3371
38
+ copyparty/bos/bos.py,sha256=5Cp0Ob5XnCt8Zmr56QLQmsc9rkdz8Y1UBeB0026TqoE,3388
38
39
  copyparty/bos/path.py,sha256=yEjCq2ki9CvxA5sCT8pS0keEXwugs0ZeUyUhdBziOCI,777
39
- copyparty/res/COPYING.txt,sha256=1LnBxkwJuC8mRBxuoMF2UIcpCjcteIzFHotSUE1Xte0,9776
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=geqrtLSPPjXy8kB7W9Sqj6-_Y55lOEDFAc-MgKBkkNQ,22648
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=IXzu3LvbDUX1XXxtN88YHPaxIoJQEN6fo3Mx9T1mgdI,8365
58
- copyparty/web/browser.css.gz,sha256=vaXkP2qHJBABH8bPf16Xv6es_lfPd6xr1jHXXzEX6B0,15831
59
- copyparty/web/browser.html,sha256=lhelkXI8_HGfuqo_5b6XEGzf8VNodOMXE9kbv31JtbM,4790
60
- copyparty/web/browser.js.gz,sha256=6DuWwYcAv2bvUgnivleXp_0RCwn9Nf8wI_DfogxJkeg,342744
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=7Q9rLKJalKWDNmvG60XXlyrUP7RqCJ5IkHgyCU5lPfQ,7476
84
- copyparty/web/splash.js.gz,sha256=xw5NnAsEthN_Yo1KGjlQxpBtw2mPUerVhzvYIBHKXtA,17721
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=wSjP9oCv0Woa7BWJWiLVa9JI7xY0TNeK7iE7V3lW1dQ,16288
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-1.19.15.dist-info/licenses/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
110
- copyparty-1.19.15.dist-info/METADATA,sha256=TLJxQAXhjv4Ym3jKIEms42xFgif6KV-cyXP_To2zMyA,179248
111
- copyparty-1.19.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
112
- copyparty-1.19.15.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
113
- copyparty-1.19.15.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
114
- copyparty-1.19.15.dist-info/RECORD,,
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,,