copyparty 1.19.12__tar.gz → 1.19.22__tar.gz

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 (154) hide show
  1. {copyparty-1.19.12 → copyparty-1.19.22}/PKG-INFO +127 -16
  2. {copyparty-1.19.12 → copyparty-1.19.22}/README.md +126 -15
  3. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/__init__.py +26 -2
  4. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/__main__.py +81 -16
  5. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/__version__.py +2 -2
  6. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/authsrv.py +184 -52
  7. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/bos/bos.py +6 -2
  8. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/cert.py +18 -4
  9. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/cfg.py +58 -2
  10. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/fsutil.py +51 -3
  11. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/ftpd.py +29 -21
  12. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/httpcli.py +605 -298
  13. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/httpsrv.py +3 -2
  14. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/mdns.py +64 -24
  15. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/metrics.py +2 -2
  16. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/mtag.py +19 -5
  17. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/multicast.py +4 -1
  18. copyparty-1.19.22/copyparty/qrkode.py +107 -0
  19. copyparty-1.19.22/copyparty/res/COPYING.txt +223 -0
  20. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/smbd.py +23 -18
  21. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/qrcodegen.py +1 -64
  22. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/svchub.py +30 -6
  23. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/tcpsrv.py +11 -7
  24. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/tftpd.py +23 -18
  25. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/th_srv.py +149 -16
  26. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/u2idx.py +16 -1
  27. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/up2k.py +106 -46
  28. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/util.py +140 -58
  29. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/a/u2c.py +17 -5
  30. copyparty-1.19.22/copyparty/web/a/webdav-cfg.txt.gz +0 -0
  31. copyparty-1.19.22/copyparty/web/baguettebox.js.gz +0 -0
  32. copyparty-1.19.22/copyparty/web/browser.css.gz +0 -0
  33. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/browser.html +6 -4
  34. copyparty-1.19.22/copyparty/web/browser.js.gz +0 -0
  35. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/dbg-audio.js.gz +0 -0
  36. copyparty-1.19.22/copyparty/web/deps/marked.js.gz +0 -0
  37. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/idp.html +1 -1
  38. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/md.css.gz +0 -0
  39. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/md.html +3 -2
  40. copyparty-1.19.22/copyparty/web/md.js.gz +0 -0
  41. copyparty-1.19.22/copyparty/web/md2.css.gz +0 -0
  42. copyparty-1.19.22/copyparty/web/md2.js.gz +0 -0
  43. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/mde.css.gz +0 -0
  44. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/mde.html +1 -1
  45. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/mde.js.gz +0 -0
  46. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/msg.html +8 -3
  47. copyparty-1.19.22/copyparty/web/opds.xml +31 -0
  48. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/rups.css.gz +0 -0
  49. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/rups.html +1 -1
  50. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/rups.js.gz +0 -0
  51. copyparty-1.19.22/copyparty/web/shares.css.gz +0 -0
  52. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/shares.html +4 -3
  53. copyparty-1.19.22/copyparty/web/shares.js.gz +0 -0
  54. copyparty-1.19.22/copyparty/web/splash.css.gz +0 -0
  55. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/splash.html +30 -19
  56. copyparty-1.19.22/copyparty/web/splash.js.gz +0 -0
  57. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/svcs.html +2 -2
  58. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/svcs.js.gz +0 -0
  59. copyparty-1.19.22/copyparty/web/tl/chi.js.gz +0 -0
  60. copyparty-1.19.22/copyparty/web/tl/cze.js.gz +0 -0
  61. copyparty-1.19.22/copyparty/web/tl/deu.js.gz +0 -0
  62. copyparty-1.19.22/copyparty/web/tl/epo.js.gz +0 -0
  63. copyparty-1.19.22/copyparty/web/tl/fin.js.gz +0 -0
  64. copyparty-1.19.22/copyparty/web/tl/fra.js.gz +0 -0
  65. copyparty-1.19.22/copyparty/web/tl/grc.js.gz +0 -0
  66. copyparty-1.19.22/copyparty/web/tl/ita.js.gz +0 -0
  67. copyparty-1.19.22/copyparty/web/tl/kor.js.gz +0 -0
  68. copyparty-1.19.22/copyparty/web/tl/nld.js.gz +0 -0
  69. copyparty-1.19.22/copyparty/web/tl/nno.js.gz +0 -0
  70. copyparty-1.19.22/copyparty/web/tl/nor.js.gz +0 -0
  71. copyparty-1.19.22/copyparty/web/tl/pol.js.gz +0 -0
  72. copyparty-1.19.22/copyparty/web/tl/por.js.gz +0 -0
  73. copyparty-1.19.22/copyparty/web/tl/rus.js.gz +0 -0
  74. copyparty-1.19.22/copyparty/web/tl/spa.js.gz +0 -0
  75. copyparty-1.19.22/copyparty/web/tl/swe.js.gz +0 -0
  76. copyparty-1.19.22/copyparty/web/tl/tur.js.gz +0 -0
  77. copyparty-1.19.22/copyparty/web/tl/ukr.js.gz +0 -0
  78. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/ui.css.gz +0 -0
  79. copyparty-1.19.22/copyparty/web/up2k.js.gz +0 -0
  80. copyparty-1.19.22/copyparty/web/util.js.gz +0 -0
  81. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/w.hash.js.gz +0 -0
  82. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty.egg-info/PKG-INFO +127 -16
  83. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty.egg-info/SOURCES.txt +23 -3
  84. {copyparty-1.19.12 → copyparty-1.19.22}/pyproject.toml +13 -1
  85. copyparty-1.19.12/copyparty/res/COPYING.txt +0 -152
  86. copyparty-1.19.12/copyparty/web/a/webdav-cfg.bat +0 -45
  87. copyparty-1.19.12/copyparty/web/baguettebox.js.gz +0 -0
  88. copyparty-1.19.12/copyparty/web/browser.css.gz +0 -0
  89. copyparty-1.19.12/copyparty/web/browser.js.gz +0 -0
  90. copyparty-1.19.12/copyparty/web/deps/marked.js.gz +0 -0
  91. copyparty-1.19.12/copyparty/web/md.js.gz +0 -0
  92. copyparty-1.19.12/copyparty/web/md2.css.gz +0 -0
  93. copyparty-1.19.12/copyparty/web/md2.js.gz +0 -0
  94. copyparty-1.19.12/copyparty/web/msg.css.gz +0 -0
  95. copyparty-1.19.12/copyparty/web/shares.css.gz +0 -0
  96. copyparty-1.19.12/copyparty/web/shares.js.gz +0 -0
  97. copyparty-1.19.12/copyparty/web/splash.css.gz +0 -0
  98. copyparty-1.19.12/copyparty/web/splash.js.gz +0 -0
  99. copyparty-1.19.12/copyparty/web/up2k.js.gz +0 -0
  100. copyparty-1.19.12/copyparty/web/util.js.gz +0 -0
  101. {copyparty-1.19.12 → copyparty-1.19.22}/LICENSE +0 -0
  102. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/bos/__init__.py +0 -0
  103. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/bos/path.py +0 -0
  104. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/broker_mp.py +0 -0
  105. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/broker_mpw.py +0 -0
  106. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/broker_thr.py +0 -0
  107. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/broker_util.py +0 -0
  108. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/dxml.py +0 -0
  109. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/httpconn.py +0 -0
  110. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/ico.py +0 -0
  111. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/pwhash.py +0 -0
  112. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/res/__init__.py +0 -0
  113. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/res/insecure.pem +0 -0
  114. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/ssdp.py +0 -0
  115. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/star.py +0 -0
  116. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/__init__.py +0 -0
  117. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/dnslib/__init__.py +0 -0
  118. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/dnslib/bimap.py +0 -0
  119. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/dnslib/bit.py +0 -0
  120. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/dnslib/buffer.py +0 -0
  121. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/dnslib/dns.py +0 -0
  122. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/dnslib/label.py +0 -0
  123. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/dnslib/lex.py +0 -0
  124. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/dnslib/ranges.py +0 -0
  125. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/ifaddr/__init__.py +0 -0
  126. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/ifaddr/_posix.py +0 -0
  127. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/ifaddr/_shared.py +0 -0
  128. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/ifaddr/_win32.py +0 -0
  129. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/stolen/surrogateescape.py +0 -0
  130. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/sutil.py +0 -0
  131. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/szip.py +0 -0
  132. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/th_cli.py +0 -0
  133. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/a/__init__.py +0 -0
  134. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/a/partyfuse.py +0 -0
  135. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/browser2.html +0 -0
  136. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/cf.html +0 -0
  137. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/__init__.py +0 -0
  138. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/busy.mp3.gz +0 -0
  139. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/easymde.css.gz +0 -0
  140. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/easymde.js.gz +0 -0
  141. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/fuse.py +0 -0
  142. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/mini-fa.css.gz +0 -0
  143. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/mini-fa.woff +0 -0
  144. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/prism.css.gz +0 -0
  145. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/prism.js.gz +0 -0
  146. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/prismd.css.gz +0 -0
  147. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/scp.woff2 +0 -0
  148. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/sha512.ac.js.gz +0 -0
  149. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty/web/deps/sha512.hw.js.gz +0 -0
  150. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty.egg-info/dependency_links.txt +0 -0
  151. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty.egg-info/entry_points.txt +0 -0
  152. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty.egg-info/requires.txt +0 -0
  153. {copyparty-1.19.12 → copyparty-1.19.22}/copyparty.egg-info/top_level.txt +0 -0
  154. {copyparty-1.19.12 → copyparty-1.19.22}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: copyparty
3
- Version: 1.19.12
3
+ Version: 1.19.22
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
@@ -86,6 +86,7 @@ made in Norway 🇳🇴
86
86
 
87
87
  * top
88
88
  * [quickstart](#quickstart) - just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py)** -- that's it! 🎉
89
+ * [mirrors](#mirrors) - other places to download copyparty from
89
90
  * [at home](#at-home) - make it accessible over the internet
90
91
  * [on servers](#on-servers) - you may also want these, especially on servers
91
92
  * [features](#features) - also see [comparison to similar software](./docs/versus.md)
@@ -115,6 +116,7 @@ made in Norway 🇳🇴
115
116
  * [shares](#shares) - share a file or folder by creating a temporary link
116
117
  * [batch rename](#batch-rename) - select some files and press `F2` to bring up the rename UI
117
118
  * [rss feeds](#rss-feeds) - monitor a folder with your RSS reader
119
+ * [opds feeds](#opds-feeds) - browse and download files from your e-book reader
118
120
  * [recent uploads](#recent-uploads) - list all recent uploads
119
121
  * [media player](#media-player) - plays almost every audio format there is
120
122
  * [playlists](#playlists) - create and play [m3u8](https://en.wikipedia.org/wiki/M3U) playlists
@@ -181,6 +183,7 @@ made in Norway 🇳🇴
181
183
  * [nix package](#nix-package) - `nix profile install github:9001/copyparty`
182
184
  * [nixos module](#nixos-module)
183
185
  * [browser support](#browser-support) - TLDR: yes
186
+ * [server hall of fame](#server-hall-of-fame) - unexpected things that run copyparty
184
187
  * [client examples](#client-examples) - interact with copyparty using non-browser clients
185
188
  * [folder sync](#folder-sync) - sync folders to/from copyparty
186
189
  * [mount as drive](#mount-as-drive) - a remote copyparty server as a local filesystem
@@ -202,6 +205,7 @@ made in Norway 🇳🇴
202
205
  * [dependencies](#dependencies) - mandatory deps
203
206
  * [optional dependencies](#optional-dependencies) - install these to enable bonus features
204
207
  * [dependency chickenbits](#dependency-chickenbits) - prevent loading an optional dependency
208
+ * [dependency unvendoring](#dependency-unvendoring) - force use of system modules
205
209
  * [optional gpl stuff](#optional-gpl-stuff)
206
210
  * [sfx](#sfx) - the self-contained "binary" (recommended!)
207
211
  * [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+)
@@ -220,7 +224,7 @@ just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/
220
224
 
221
225
  * or install through [pypi](https://pypi.org/project/copyparty/): `python3 -m pip install --user -U copyparty`
222
226
  * or if you cannot install python, you can use [copyparty.exe](#copypartyexe) instead
223
- * or install [on arch](#arch-package) ╱ [on NixOS](#nixos-module) ╱ [through nix](#nix-package)
227
+ * or install [on arch](#arch-package) / [homebrew](#homebrew-formulae) ╱ [on NixOS](#nixos-module) ╱ [through nix](#nix-package)
224
228
  * or if you are on android, [install copyparty in termux](#install-on-android)
225
229
  * or maybe an iPhone or iPad? [install in a-Shell on iOS](#install-on-iOS)
226
230
  * or maybe you have a [synology nas / dsm](./docs/synology-dsm.md)
@@ -255,7 +259,19 @@ some recommended options:
255
259
  * `-e2ts` enables audio metadata indexing (needs either FFprobe or Mutagen)
256
260
  * `-v /mnt/music:/music:r:rw,foo -a foo:bar` shares `/mnt/music` as `/music`, `r`eadable by anyone, and read-write for user `foo`, password `bar`
257
261
  * replace `:r:rw,foo` with `:r,foo` to only make the folder readable by `foo` and nobody else
258
- * see [accounts and volumes](#accounts-and-volumes) (or `--help-accounts`) for the syntax and other permissions
262
+ * see [accounts and volumes](#accounts-and-volumes) (or [`--help-accounts`](https://copyparty.eu/cli/#accounts-help-page)) for the syntax and other permissions
263
+
264
+
265
+ ### mirrors
266
+
267
+ other places to download copyparty from (non-github links):
268
+
269
+ * https://copyparty.eu/ (hetzner, finland, official mirror):
270
+ * https://copyparty.eu/py = https://copyparty.eu/copyparty-sfx.py = the sfx
271
+ * https://copyparty.eu/en = https://copyparty.eu/copyparty-en.py = the english-only sfx
272
+ * https://copyparty.eu/pyz = https://copyparty.eu/copyparty.pyz = the zipapp
273
+ * https://copyparty.eu/enz = https://copyparty.eu/copyparty-en.pyz = the enterprise pyz
274
+ * https://copyparty.eu/cli = online cli helptext
259
275
 
260
276
 
261
277
  ### at home
@@ -277,6 +293,7 @@ you may also want these, especially on servers:
277
293
 
278
294
  * [contrib/systemd/copyparty.service](contrib/systemd/copyparty.service) to run copyparty as a systemd service (see guide inside)
279
295
  * [contrib/systemd/prisonparty.service](contrib/systemd/prisonparty.service) to run it in a chroot (for extra security)
296
+ * [contrib/podman-systemd/](contrib/podman-systemd/) to run copyparty in a Podman container as a systemd service (see guide inside)
280
297
  * [contrib/openrc/copyparty](contrib/openrc/copyparty) to run copyparty on Alpine / Gentoo
281
298
  * [contrib/rc/copyparty](contrib/rc/copyparty) to run copyparty on FreeBSD
282
299
  * [nixos module](#nixos-module) to run copyparty on NixOS hosts
@@ -371,7 +388,7 @@ small collection of user feedback
371
388
 
372
389
  project goals / philosophy
373
390
 
374
- * inverse linux philosophy -- do all the things, and do an *okay* job
391
+ * inverse unix philosophy -- do all the things, and do an *okay* job
375
392
  * quick drop-in service to get a lot of features in a pinch
376
393
  * some of [the alternatives](./docs/versus.md) might be a better fit for you
377
394
  * run anywhere, support everything
@@ -499,6 +516,12 @@ upgrade notes
499
516
  * CopyParty?
500
517
  * nope! the name is either copyparty (all-lowercase) or Copyparty -- it's [one word](https://en.wiktionary.org/wiki/copyparty) after all :>
501
518
 
519
+ * what is a volflag?
520
+ * per-volume configuration; many (not all) global-options can be set as volflags, and most (not all) volflags can be set as global-options; [complete list of volflags](https://copyparty.eu/cli/#flags-help-page)
521
+
522
+ * what is a volume?
523
+ * a mapping from a URL (`/music/`) to a folder on your server's local filesystem (`C:\Users\ed\Music`) which can then be accessed through copyparty, depending on the permissions and options you set on it -- see [accounts and volumes](#accounts-and-volumes)
524
+
502
525
  * can I change the 🌲 spinning pine-tree loading animation?
503
526
  * [yeah...](https://github.com/9001/copyparty/tree/hovudstraum/docs/rice#boring-loader-spinner) :-(
504
527
 
@@ -546,7 +569,7 @@ per-folder, per-user permissions - if your setup is getting complex, consider m
546
569
  * much easier to manage, and you can modify the config at runtime with `systemctl reload copyparty` or more conveniently using the `[reload cfg]` button in the control-panel (if the user has `a`/admin in any volume)
547
570
  * changes to the `[global]` config section requires a restart to take effect
548
571
 
549
- a quick summary can be seen using `--help-accounts`
572
+ a quick summary can be seen using [`--help-accounts`](https://copyparty.eu/cli/#accounts-help-page)
550
573
 
551
574
  configuring accounts/volumes with arguments:
552
575
  * `-a usr:pwd` adds account `usr` with password `pwd`
@@ -585,6 +608,9 @@ examples:
585
608
 
586
609
  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`
587
610
 
611
+ * 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`
612
+ * single users can also be subtracted from a group: `@admins,-james`
613
+
588
614
  anyone trying to bruteforce a password gets banned according to `--ban-pw`; default is 24h ban for 9 failed attempts in 1 hour
589
615
 
590
616
  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`
@@ -680,7 +706,7 @@ the main tabs in the ui
680
706
  * `[🧯]` [unpost](#unpost): undo/delete accidental uploads
681
707
  * `[🚀]` and `[🎈]` are the [uploaders](#uploading)
682
708
  * `[📂]` mkdir: create directories
683
- * `[📝]` new-md: create a new markdown document
709
+ * `[📝]` new-file: create a new textfile
684
710
  * `[📟]` send-msg: either to server-log or into textfiles if `--urlform save`
685
711
  * `[🎺]` audio-player config options
686
712
  * `[⚙️]` general client config options
@@ -793,6 +819,10 @@ to show `/icons/exe.png` and `/icons/elf.gif` as the thumbnail for all `.exe` an
793
819
  * the supported image formats are [jpg, png, gif, webp, ico](https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types)
794
820
  * 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
795
821
 
822
+ note:
823
+ * heif/heifs/heic/heics images usually require the `libvips` [optional dependency](#optional-dependencies) (available in the `iv` docker image, `withFastThumbnails` in nixos)
824
+ * technical trivia: FFmpeg has basic support for tiled heic as of v7.0; need `-show_stream_groups` for correct resolution
825
+
796
826
  config file example:
797
827
 
798
828
  ```yaml
@@ -933,6 +963,8 @@ the files will be hashed on the client-side, and each hash is sent to the server
933
963
  files go into `[ok]` if they exist (and you get a link to where it is), otherwise they land in `[ng]`
934
964
  * the main reason filesearch is combined with the uploader is cause the code was too spaghetti to separate it out somewhere else, this is no longer the case but now i've warmed up to the idea too much
935
965
 
966
+ if you have a "wark" (file-identifier/checksum) then you can also search for that in the [🔎] tab by putting `w = kFpDiztbZc8Z1Lzi` in the `raw` field
967
+
936
968
 
937
969
  ### unpost
938
970
 
@@ -1059,6 +1091,8 @@ available functions:
1059
1091
  * `$lpad(text, length, pad_char)`
1060
1092
  * `$rpad(text, length, pad_char)`
1061
1093
 
1094
+ 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
1095
+
1062
1096
  so,
1063
1097
 
1064
1098
  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`
@@ -1094,6 +1128,8 @@ url parameters:
1094
1128
 
1095
1129
  * `pw=hunter2` for password auth
1096
1130
  * if you enabled `--usernames` then do `pw=username:password` instead
1131
+ * `nopw` disables embedding the password (if provided) into item-URLs in the feed
1132
+ * `nopw=a` disables mentioning the password anywhere at all in the feed; may break some readers
1097
1133
  * `recursive` to also include subfolders
1098
1134
  * `title=foo` changes the feed title (default: folder name)
1099
1135
  * `fext=mp3,opus` only include mp3 and opus files (default: all)
@@ -1105,6 +1141,28 @@ url parameters:
1105
1141
  * uppercase = reverse-sort; `M` = oldest file first
1106
1142
 
1107
1143
 
1144
+ ## opds feeds
1145
+
1146
+ browse and download files from your e-book reader
1147
+
1148
+ enabled with the `opds` volflag or `--opds` global option
1149
+
1150
+ add `?opds` to the end of the url you would like to browse, then input that in your opds client.
1151
+ for example: `https://copyparty.example/books/?opds`.
1152
+
1153
+ to log in with a password, enter it into either of the username or password fields in your client.
1154
+
1155
+ - if you've enabled `--usernames`, then you need to enter both username and password .
1156
+
1157
+ note: some clients (e.g. Moon+ Reader) will not send the password when downloading cover images, which will
1158
+ cause your ip to be banned by copyparty. to work around this, you can grant the [`g` permission](#accounts-and-volumes)
1159
+ to unauthenticated requests and enable [filekeys](#filekeys) to prevent guessing filenames. for example:
1160
+ `-vbooks:books:r,ed:g:c,fk,opds`
1161
+
1162
+ by default, not all file types will be listed in opds feeds. to change this, add the extension to
1163
+ `--opds-exts` (volflag: `opds_exts`), or empty the list to list everything
1164
+
1165
+
1108
1166
  ## recent uploads
1109
1167
 
1110
1168
  list all recent uploads by clicking "show recent uploads" in the controlpanel
@@ -1138,6 +1196,7 @@ some highlights:
1138
1196
  * shows the audio waveform in the seekbar
1139
1197
  * not perfectly gapless but can get really close (see settings + eq below); good enough to enjoy gapless albums as intended
1140
1198
  * videos can be played as audio, without wasting bandwidth on the video
1199
+ * adding `?v` to the end of an audio/video/image link will make it open in the mediaplayer
1141
1200
 
1142
1201
  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)
1143
1202
 
@@ -1275,7 +1334,7 @@ see [./srv/expand/](./srv/expand/) for usage and examples
1275
1334
 
1276
1335
  * and `PREADME.md` / `preadme.md` is shown above directory listings unless `--no-readme` or `.prologue.html`
1277
1336
 
1278
- * `README.md` and `*logue.html` can contain placeholder values which are replaced server-side before embedding into directory listings; see `--help-exp`
1337
+ * `README.md` and `*logue.html` can contain placeholder values which are replaced server-side before embedding into directory listings; see [`--help-exp`](https://copyparty.eu/cli/#exp-help-page)
1279
1338
 
1280
1339
 
1281
1340
  ## searching
@@ -1305,10 +1364,9 @@ using arguments or config files, or a mix of both:
1305
1364
  * or click the `[reload cfg]` button in the control-panel if the user has `a`/admin in any volume
1306
1365
  * changes to the `[global]` config section requires a restart to take effect
1307
1366
 
1308
- **NB:** as humongous as this readme is, there is also a lot of undocumented features. Run copyparty with `--help` to see all available global options; all of those can be used in the `[global]` section of config files, and everything listed in `--help-flags` can be used in volumes as volflags.
1367
+ **NB:** as humongous as this readme is, there is also a lot of undocumented features. Run copyparty with [`--help`](https://copyparty.eu/cli/) (or click that link) to see all available global options; all of those can be used in the `[global]` section of config files, and everything listed in [`--help-flags`](https://copyparty.eu/cli/#flags-help-page) can be used in volumes as volflags (per-volume configuration).
1309
1368
  * if running in docker/podman, try this: `docker run --rm -it copyparty/ac --help`
1310
- * or see this: https://ocv.me/copyparty/helptext.html
1311
- * or if you prefer plaintext, https://ocv.me/copyparty/helptext.txt
1369
+ * or if you prefer plaintext, https://copyparty.eu/helptext.txt
1312
1370
 
1313
1371
 
1314
1372
  ## zeroconf
@@ -1522,7 +1580,12 @@ tweaking the ui
1522
1580
  * 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`
1523
1581
  * 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`
1524
1582
 
1525
- 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
1583
+ see [./docs/rice](./docs/rice) for more, including:
1584
+ * how to [hide ui-elements](./docs/rice/README.md#hide-ui-elements)
1585
+ * [custom fonts](./docs/rice/README.md#custom-fonts)
1586
+ * [custom loading-spinner](./docs/rice/README.md#boring-loader-spinner)
1587
+ * adding stuff (css/`<meta>`/...) [to the html `<head>` tag](./docs/rice/README.md#head)
1588
+ * [adding your own translation](./docs/rice/README.md#translations)
1526
1589
 
1527
1590
 
1528
1591
  ## opengraph
@@ -1619,6 +1682,7 @@ the same arguments can be set as volflags, in addition to `d2d`, `d2ds`, `d2t`,
1619
1682
 
1620
1683
  note:
1621
1684
  * upload-times can be displayed in the file listing by enabling the `.up_at` metadata key, either globally with `-e2d -mte +.up_at` or per-volume with volflags `e2d,mte=+.up_at` (will have a ~17% performance impact on directory listings)
1685
+ * and file checksums can be shown with global-option `-e2d -mte +w` or volflag `e2d,mte=+w` (always active for users with permission `a`)
1622
1686
  * `e2tsr` is probably always overkill, since `e2ds`/`e2dsa` would pick up any file modifications and `e2ts` would then reindex those, unless there is a new copyparty version with new parsers and the release note says otherwise
1623
1687
 
1624
1688
  config file example (these options are recommended btw):
@@ -1789,6 +1853,8 @@ notes:
1789
1853
  * `:c,magic` enables filetype detection for nameless uploads, same as `--magic`
1790
1854
  * needs https://pypi.org/project/python-magic/ `python3 -m pip install --user -U python-magic`
1791
1855
  * on windows grab this instead `python3 -m pip install --user -U python-magic-bin`
1856
+ * `cachectl` changes how webbrowser will cache responses (the `Cache-Control` response-header); default is `no-cache` which will prevent repeated downloading of the same file unless necessary (browser will ask copyparty if the file has changed)
1857
+ * adding `?cache` to a link will override this with "fully cache this for 69 seconds"; `?cache=321` is 321 seconds, and `?cache=i` is 7 days
1792
1858
 
1793
1859
 
1794
1860
  ## database location
@@ -1895,7 +1961,7 @@ trigger a program on uploads, renames etc ([examples](./bin/hooks/))
1895
1961
 
1896
1962
  you can set hooks before and/or after an event happens, and currently you can hook uploads, moves/renames, and deletes
1897
1963
 
1898
- there's a bunch of flags and stuff, see `--help-hooks`
1964
+ there's a bunch of flags and stuff, see [`--help-hooks`](https://copyparty.eu/cli/#hooks-help-page)
1899
1965
 
1900
1966
  if you want to write your own hooks, see [devnotes](./docs/devnotes.md#event-hooks)
1901
1967
 
@@ -2418,6 +2484,8 @@ it comes with a [systemd service](./contrib/systemd/copyparty@.service) as well
2418
2484
 
2419
2485
  after installing, start either the system service or the user service and navigate to http://127.0.0.1:3923 for further instructions (unless you already edited the config files, in which case you are good to go, probably)
2420
2486
 
2487
+ > to start the systemd service, either do `systemctl start --user copyparty` to start it as your own user, or `systemctl start copyparty@bob` to use unix-user `bob`
2488
+
2421
2489
 
2422
2490
  ## fedora package
2423
2491
 
@@ -2504,6 +2572,10 @@ copyparty on NixOS is configured via `services.copyparty` options, for example:
2504
2572
  ```nix
2505
2573
  services.copyparty = {
2506
2574
  enable = true;
2575
+ # the user to run the service as
2576
+ user = "copyparty";
2577
+ # the group to run the service as
2578
+ group = "copyparty";
2507
2579
  # directly maps to values in the [global] section of the copyparty config.
2508
2580
  # see `copyparty --help` for available options
2509
2581
  settings = {
@@ -2528,6 +2600,12 @@ services.copyparty = {
2528
2600
  k.passwordFile = "/run/keys/copyparty/k_password";
2529
2601
  };
2530
2602
 
2603
+ # create a group
2604
+ groups = {
2605
+ # users "ed" and "k" are part of the group g1
2606
+ g1 = [ "ed" "k" ];
2607
+ };
2608
+
2531
2609
  # create a volume
2532
2610
  volumes = {
2533
2611
  # create a volume at "/" (the webroot), which will
@@ -2620,6 +2698,15 @@ quick summary of more eccentric web-browsers trying to view a directory index:
2620
2698
  <p align="center"><img src="https://github.com/user-attachments/assets/88deab3d-6cad-4017-8841-2f041472b853" /></p>
2621
2699
 
2622
2700
 
2701
+ # server hall of fame
2702
+
2703
+ unexpected things that run copyparty:
2704
+
2705
+ * an old [allwinner](https://a.ocv.me/pub/g/nerd-stuff/cpp/servers/aallwinner.jpg) android tv-box (ziptie-strapped to an HDD) running a firmware which flips the CPU into Big-Endian mode early during boot
2706
+ * copyparty is [certified BE ready](https://a.ocv.me/pub/g/nerd-stuff/cpp/servers/be-ready.png)
2707
+ * a [wristwatch](https://a.ocv.me/pub/g/nerd-stuff/cpp/servers/clockyparty.jpg)
2708
+
2709
+
2623
2710
  # client examples
2624
2711
 
2625
2712
  interact with copyparty using non-browser clients
@@ -2807,7 +2894,7 @@ some notes on hardening
2807
2894
  * cors doesn't work right otherwise
2808
2895
  * if you allow anonymous uploads or otherwise don't trust the contents of a volume, you can prevent XSS with volflag `nohtml`
2809
2896
  * this returns html documents as plaintext, and also disables markdown rendering
2810
- * when running behind a reverse-proxy, listen on a unix-socket for tighter access control (and more performance); see [reverse-proxy](#reverse-proxy) or `--help-bind`
2897
+ * when running behind a reverse-proxy, listen on a unix-socket for tighter access control (and more performance); see [reverse-proxy](#reverse-proxy) or [`--help-bind`](https://copyparty.eu/cli/#bind-help-page)
2811
2898
 
2812
2899
  safety profiles:
2813
2900
 
@@ -2895,7 +2982,7 @@ dirkeys are generated based on another salt (`--dk-salt`) + filesystem-path and
2895
2982
 
2896
2983
  ## password hashing
2897
2984
 
2898
- you can hash passwords before putting them into config files / providing them as arguments; see `--help-pwhash` for all the details
2985
+ you can hash passwords before putting them into config files / providing them as arguments; see [`--help-pwhash`](https://copyparty.eu/cli/#pwhash-help-page) for all the details
2899
2986
 
2900
2987
  `--ah-alg argon2` enables it, and if you have any plaintext passwords then it'll print the hashed versions on startup so you can replace them
2901
2988
 
@@ -2921,6 +3008,11 @@ if [cfssl](https://github.com/cloudflare/cfssl/releases/latest) is installed, co
2921
3008
  * this will be a self-signed certificate so you must install your `ca.pem` into all your browsers/devices
2922
3009
  * if you want to avoid the hassle of distributing certs manually, please consider using a reverse proxy
2923
3010
 
3011
+ to install cfssl on windows:
3012
+ * [download](https://github.com/cloudflare/cfssl/releases/latest) `cfssl_windows_amd64.exe`, `cfssljson_windows_amd64.exe`, `cfssl-certinfo_windows_amd64.exe`
3013
+ * rename them to `cfssl.exe`, `cfssljson.exe`, `cfssl-certinfo.exe`
3014
+ * put them in PATH, for example inside `c:\windows\system32`
3015
+
2924
3016
 
2925
3017
  # recovering from crashes
2926
3018
 
@@ -2979,7 +3071,9 @@ enable sending [zeromq messages](#zeromq) from event-hooks: `pyzmq`
2979
3071
 
2980
3072
  enable [smb](#smb-server) support (**not** recommended): `impacket==0.12.0`
2981
3073
 
2982
- `pyvips` gives higher quality thumbnails than `Pillow` and is 320% faster, using 270% more ram: `sudo apt install libvips42 && python3 -m pip install --user -U pyvips`
3074
+ `pyvips` gives higher quality thumbnails than `Pillow` and is 320% faster, using 270% more ram
3075
+ * to install `pyvips` on Linux: `sudo apt install libvips42 && python3 -m pip install --user -U pyvips`
3076
+ * to install `pyvips` on windows: `pip install --user -U "pyvips[binary]"`
2983
3077
 
2984
3078
  to install FFmpeg on Windows, grab [a recent build](https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z) -- you need `ffmpeg.exe` and `ffprobe.exe` from inside the `bin` folder; copy them into `C:\Windows\System32` or any other folder that's in your `%PATH%`
2985
3079
 
@@ -3017,6 +3111,20 @@ example: `PRTY_NO_PIL=1 python3 copyparty-sfx.py`
3017
3111
  * python2.7 on windows: `PRTY_NO_FFMPEG` + `PRTY_NO_FFPROBE` saves startup time
3018
3112
 
3019
3113
 
3114
+ ### dependency unvendoring
3115
+
3116
+ force use of system modules instead of the vendored versions:
3117
+
3118
+ | env-var | what it does |
3119
+ | -------------------- | ------------ |
3120
+ | `PRTY_SYS_ALL` | all of the below |
3121
+ | `PRTY_SYS_DNSLIB` | replace [stolen/dnslib](./copyparty/stolen/dnslib) with [upstream](https://pypi.org/project/dnslib/) |
3122
+ | `PRTY_SYS_IFADDR` | replace [stolen/ifaddr](./copyparty/stolen/ifaddr) with [upstream](https://pypi.org/project/ifaddr/) |
3123
+ | `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) |
3124
+
3125
+ to debug, run copyparty with `PRTY_MODSPEC=1` to see where it's getting each module from
3126
+
3127
+
3020
3128
  ## optional gpl stuff
3021
3129
 
3022
3130
  some bundled tools have copyleft dependencies, see [./bin/#mtag](bin/#mtag)
@@ -3062,7 +3170,8 @@ another emergency alternative, [copyparty.pyz](https://github.com/9001/copyparty
3062
3170
  run it by doubleclicking it, or try typing `python copyparty.pyz` in your terminal/console/commandline/telex if that fails
3063
3171
 
3064
3172
  it is a python [zipapp](https://docs.python.org/3/library/zipapp.html) meaning it doesn't have to unpack its own python code anywhere to run, so if the filesystem is busted it has a better chance of getting somewhere
3065
- * but note that it currently still needs to extract the web-resources somewhere (they'll land in the default TEMP-folder of your OS)
3173
+
3174
+ > there is also [copyparty-en.pyz](https://github.com/9001/copyparty/releases/latest/download/copyparty-en.pyz), english-only and without smb support (enterprise-friendly)
3066
3175
 
3067
3176
 
3068
3177
  # install on android
@@ -3079,6 +3188,8 @@ if you want thumbnails (photos+videos) and you're okay with spending another 132
3079
3188
 
3080
3189
  * 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})`
3081
3190
 
3191
+ 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`
3192
+
3082
3193
 
3083
3194
  # install on iOS
3084
3195