copyparty 1.12.1__py3-none-any.whl → 1.13.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
copyparty/util.py CHANGED
@@ -738,15 +738,46 @@ class CachedSet(object):
738
738
  self.oldest = now
739
739
 
740
740
 
741
+ class CachedDict(object):
742
+ def __init__(self, maxage ) :
743
+ self.c = {}
744
+ self.maxage = maxage
745
+ self.oldest = 0.0
746
+
747
+ def set(self, k , v ) :
748
+ now = time.time()
749
+ self.c[k] = (now, v)
750
+ if now - self.oldest < self.maxage:
751
+ return
752
+
753
+ c = self.c = {k: v for k, v in self.c.items() if now - v[0] < self.maxage}
754
+ try:
755
+ self.oldest = min([x[0] for x in c.values()])
756
+ except:
757
+ self.oldest = now
758
+
759
+ def get(self, k ) :
760
+ try:
761
+ ts, ret = self.c[k]
762
+ now = time.time()
763
+ if now - ts > self.maxage:
764
+ del self.c[k]
765
+ return None
766
+ return ret
767
+ except:
768
+ return None
769
+
770
+
741
771
  class FHC(object):
742
772
  class CE(object):
743
773
  def __init__(self, fh ) :
744
774
  self.ts = 0
745
775
  self.fhs = [fh]
776
+ self.all_fhs = set([fh])
746
777
 
747
778
  def __init__(self) :
748
779
  self.cache = {}
749
- self.aps = set()
780
+ self.aps = {}
750
781
 
751
782
  def close(self, path ) :
752
783
  try:
@@ -758,7 +789,7 @@ class FHC(object):
758
789
  fh.close()
759
790
 
760
791
  del self.cache[path]
761
- self.aps.remove(path)
792
+ del self.aps[path]
762
793
 
763
794
  def clean(self) :
764
795
  if not self.cache:
@@ -779,9 +810,12 @@ class FHC(object):
779
810
  return self.cache[path].fhs.pop()
780
811
 
781
812
  def put(self, path , fh ) :
782
- self.aps.add(path)
813
+ if path not in self.aps:
814
+ self.aps[path] = 0
815
+
783
816
  try:
784
817
  ce = self.cache[path]
818
+ ce.all_fhs.add(fh)
785
819
  ce.fhs.append(fh)
786
820
  except:
787
821
  ce = self.CE(fh)
@@ -2104,26 +2138,29 @@ def lsof(log , abspath ) :
2104
2138
  log("lsof failed; " + min_ex(), 3)
2105
2139
 
2106
2140
 
2107
- def atomic_move(usrc , udst ) :
2108
- src = fsenc(usrc)
2109
- dst = fsenc(udst)
2110
- if not PY2:
2111
- os.replace(src, dst)
2141
+ def _fs_mvrm(
2142
+ log , src , dst , atomic , flags
2143
+ ) :
2144
+ bsrc = fsenc(src)
2145
+ bdst = fsenc(dst)
2146
+ if atomic:
2147
+ k = "mv_re_"
2148
+ act = "atomic-rename"
2149
+ osfun = os.replace
2150
+ args = [bsrc, bdst]
2151
+ elif dst:
2152
+ k = "mv_re_"
2153
+ act = "rename"
2154
+ osfun = os.rename
2155
+ args = [bsrc, bdst]
2112
2156
  else:
2113
- if os.path.exists(dst):
2114
- os.unlink(dst)
2157
+ k = "rm_re_"
2158
+ act = "delete"
2159
+ osfun = os.unlink
2160
+ args = [bsrc]
2115
2161
 
2116
- os.rename(src, dst)
2117
-
2118
-
2119
- def wunlink(log , abspath , flags ) :
2120
- maxtime = flags.get("rm_re_t", 0.0)
2121
- bpath = fsenc(abspath)
2122
- if not maxtime:
2123
- os.unlink(bpath)
2124
- return True
2125
-
2126
- chill = flags.get("rm_re_r", 0.0)
2162
+ maxtime = flags.get(k + "t", 0.0)
2163
+ chill = flags.get(k + "r", 0.0)
2127
2164
  if chill < 0.001:
2128
2165
  chill = 0.1
2129
2166
 
@@ -2131,14 +2168,19 @@ def wunlink(log , abspath , flags ) :
2131
2168
  t0 = now = time.time()
2132
2169
  for attempt in range(90210):
2133
2170
  try:
2134
- if ino and os.stat(bpath).st_ino != ino:
2135
- log("inode changed; aborting delete")
2171
+ if ino and os.stat(bsrc).st_ino != ino:
2172
+ t = "src inode changed; aborting %s %s"
2173
+ log(t % (act, src), 1)
2136
2174
  return False
2137
- os.unlink(bpath)
2175
+ if (dst and not atomic) and os.path.exists(bdst):
2176
+ t = "something appeared at dst; aborting rename [%s] ==> [%s]"
2177
+ log(t % (src, dst), 1)
2178
+ return False
2179
+ osfun(*args)
2138
2180
  if attempt:
2139
2181
  now = time.time()
2140
- t = "deleted in %.2f sec, attempt %d"
2141
- log(t % (now - t0, attempt + 1))
2182
+ t = "%sd in %.2f sec, attempt %d: %s"
2183
+ log(t % (act, now - t0, attempt + 1, src))
2142
2184
  return True
2143
2185
  except OSError as ex:
2144
2186
  now = time.time()
@@ -2148,15 +2190,45 @@ def wunlink(log , abspath , flags ) :
2148
2190
  raise
2149
2191
  if not attempt:
2150
2192
  if not PY2:
2151
- ino = os.stat(bpath).st_ino
2152
- t = "delete failed (err.%d); retrying for %d sec: %s"
2153
- log(t % (ex.errno, maxtime + 0.99, abspath))
2193
+ ino = os.stat(bsrc).st_ino
2194
+ t = "%s failed (err.%d); retrying for %d sec: [%s]"
2195
+ log(t % (act, ex.errno, maxtime + 0.99, src))
2154
2196
 
2155
2197
  time.sleep(chill)
2156
2198
 
2157
2199
  return False # makes pylance happy
2158
2200
 
2159
2201
 
2202
+ def atomic_move(log , src , dst , flags ) :
2203
+ bsrc = fsenc(src)
2204
+ bdst = fsenc(dst)
2205
+ if PY2:
2206
+ if os.path.exists(bdst):
2207
+ _fs_mvrm(log, dst, "", False, flags) # unlink
2208
+
2209
+ _fs_mvrm(log, src, dst, False, flags) # rename
2210
+ elif flags.get("mv_re_t"):
2211
+ _fs_mvrm(log, src, dst, True, flags)
2212
+ else:
2213
+ os.replace(bsrc, bdst)
2214
+
2215
+
2216
+ def wrename(log , src , dst , flags ) :
2217
+ if not flags.get("mv_re_t"):
2218
+ os.rename(fsenc(src), fsenc(dst))
2219
+ return True
2220
+
2221
+ return _fs_mvrm(log, src, dst, False, flags)
2222
+
2223
+
2224
+ def wunlink(log , abspath , flags ) :
2225
+ if not flags.get("rm_re_t"):
2226
+ os.unlink(fsenc(abspath))
2227
+ return True
2228
+
2229
+ return _fs_mvrm(log, abspath, "", False, flags)
2230
+
2231
+
2160
2232
  def get_df(abspath ) :
2161
2233
  try:
2162
2234
  # some fuses misbehave
copyparty/web/a/u2c.py CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env python3
2
2
  from __future__ import print_function, unicode_literals
3
3
 
4
- S_VERSION = "1.15"
5
- S_BUILD_DT = "2024-02-18"
4
+ S_VERSION = "1.16"
5
+ S_BUILD_DT = "2024-04-20"
6
6
 
7
7
  """
8
8
  u2c.py: upload to copyparty
@@ -563,7 +563,7 @@ def handshake(ar, file, search):
563
563
  else:
564
564
  if ar.touch:
565
565
  req["umod"] = True
566
- if ar.dr:
566
+ if ar.ow:
567
567
  req["replace"] = True
568
568
 
569
569
  headers = {"Content-Type": "text/plain"} # <=1.5.1 compat
@@ -1140,6 +1140,7 @@ source file/folder selection uses rsync syntax, meaning that:
1140
1140
  ap.add_argument("-x", type=unicode, metavar="REGEX", default="", help="skip file if filesystem-abspath matches REGEX, example: '.*/\\.hist/.*'")
1141
1141
  ap.add_argument("--ok", action="store_true", help="continue even if some local files are inaccessible")
1142
1142
  ap.add_argument("--touch", action="store_true", help="if last-modified timestamps differ, push local to server (need write+delete perms)")
1143
+ ap.add_argument("--ow", action="store_true", help="overwrite existing files instead of autorenaming")
1143
1144
  ap.add_argument("--version", action="store_true", help="show version and exit")
1144
1145
 
1145
1146
  ap = app.add_argument_group("compatibility")
@@ -1148,7 +1149,7 @@ source file/folder selection uses rsync syntax, meaning that:
1148
1149
 
1149
1150
  ap = app.add_argument_group("folder sync")
1150
1151
  ap.add_argument("--dl", action="store_true", help="delete local files after uploading")
1151
- ap.add_argument("--dr", action="store_true", help="delete remote files which don't exist locally")
1152
+ ap.add_argument("--dr", action="store_true", help="delete remote files which don't exist locally (implies --ow)")
1152
1153
  ap.add_argument("--drd", action="store_true", help="delete remote files during upload instead of afterwards; reduces peak disk space usage, but will reupload instead of detecting renames")
1153
1154
 
1154
1155
  ap = app.add_argument_group("performance tweaks")
@@ -1178,6 +1179,9 @@ source file/folder selection uses rsync syntax, meaning that:
1178
1179
  if ar.drd:
1179
1180
  ar.dr = True
1180
1181
 
1182
+ if ar.dr:
1183
+ ar.ow = True
1184
+
1181
1185
  for k in "dl dr drd".split():
1182
1186
  errs = []
1183
1187
  if ar.safe and getattr(ar, k):
Binary file
Binary file
Binary file
copyparty/web/splash.html CHANGED
@@ -94,7 +94,7 @@
94
94
  <div>
95
95
  <form method="post" enctype="multipart/form-data" action="{{ r }}/{{ qvpath }}">
96
96
  <input type="hidden" name="act" value="login" />
97
- <input type="password" name="cppwd" />
97
+ <input type="password" name="cppwd" placeholder=" password" />
98
98
  <input type="submit" value="Login" />
99
99
  {% if ahttps %}
100
100
  <a id="w" href="{{ ahttps }}">switch to https</a>
copyparty/web/up2k.js.gz CHANGED
Binary file
copyparty/web/util.js.gz CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: copyparty
3
- Version: 1.12.1
3
+ Version: 1.13.0
4
4
  Summary: Portable file server with accelerated resumable uploads, deduplication, WebDAV, FTP, zeroconf, media indexer, video thumbnails, audio transcoding, and write-only folders
5
5
  Author-email: ed <copyparty@ocv.me>
6
6
  License: MIT
@@ -64,13 +64,16 @@ turn almost any device into a file server with resumable uploads/downloads using
64
64
 
65
65
  📷 **screenshots:** [browser](#the-browser) // [upload](#uploading) // [unpost](#unpost) // [thumbnails](#thumbnails) // [search](#searching) // [fsearch](#file-search) // [zip-DL](#zip-downloads) // [md-viewer](#markdown-viewer)
66
66
 
67
+ 🎬 **videos:** [upload](https://a.ocv.me/pub/demo/pics-vids/up2k.webm) // [cli-upload](https://a.ocv.me/pub/demo/pics-vids/u2cli.webm) // [race-the-beam](https://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm)
68
+
67
69
 
68
70
  ## readme toc
69
71
 
70
72
  * top
71
73
  * [quickstart](#quickstart) - just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py)** -- that's it! 🎉
74
+ * [at home](#at-home) - make it accessible over the internet
72
75
  * [on servers](#on-servers) - you may also want these, especially on servers
73
- * [features](#features)
76
+ * [features](#features) - also see [comparison to similar software](./docs/versus.md)
74
77
  * [testimonials](#testimonials) - small collection of user feedback
75
78
  * [motivations](#motivations) - project goals / philosophy
76
79
  * [notes](#notes) - general notes
@@ -91,6 +94,7 @@ turn almost any device into a file server with resumable uploads/downloads using
91
94
  * [file-search](#file-search) - dropping files into the browser also lets you see if they exist on the server
92
95
  * [unpost](#unpost) - undo/delete accidental uploads
93
96
  * [self-destruct](#self-destruct) - uploads can be given a lifetime
97
+ * [race the beam](#race-the-beam) - download files while they're still uploading ([demo video](http://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm))
94
98
  * [file manager](#file-manager) - cut/paste, rename, and delete files/folders (if you have permission)
95
99
  * [batch rename](#batch-rename) - select some files and press `F2` to bring up the rename UI
96
100
  * [media player](#media-player) - plays almost every audio format there is
@@ -180,7 +184,7 @@ enable thumbnails (images/audio/video), media indexing, and audio transcoding by
180
184
 
181
185
  * **Alpine:** `apk add py3-pillow ffmpeg`
182
186
  * **Debian:** `apt install --no-install-recommends python3-pil ffmpeg`
183
- * **Fedora:** rpmfusion + `dnf install python3-pillow ffmpeg`
187
+ * **Fedora:** rpmfusion + `dnf install python3-pillow ffmpeg --allowerasing`
184
188
  * **FreeBSD:** `pkg install py39-sqlite3 py39-pillow ffmpeg`
185
189
  * **MacOS:** `port install py-Pillow ffmpeg`
186
190
  * **MacOS** (alternative): `brew install pillow ffmpeg`
@@ -201,6 +205,17 @@ some recommended options:
201
205
  * see [accounts and volumes](#accounts-and-volumes) (or `--help-accounts`) for the syntax and other permissions
202
206
 
203
207
 
208
+ ### at home
209
+
210
+ make it accessible over the internet by starting a [cloudflare quicktunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/do-more-with-tunnels/trycloudflare/) like so:
211
+
212
+ first download [cloudflared](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/) and then start the tunnel with `cloudflared tunnel --url http://127.0.0.1:3923`
213
+
214
+ as the tunnel starts, it will show a URL which you can share to let anyone browse your stash or upload files to you
215
+
216
+ since people will be connecting through cloudflare, run copyparty with `--xff-hdr cf-connecting-ip` to detect client IPs correctly
217
+
218
+
204
219
  ### on servers
205
220
 
206
221
  you may also want these, especially on servers:
@@ -224,6 +239,8 @@ firewall-cmd --reload
224
239
 
225
240
  ## features
226
241
 
242
+ also see [comparison to similar software](./docs/versus.md)
243
+
227
244
  * backend stuff
228
245
  * ☑ IPv6
229
246
  * ☑ [multiprocessing](#performance) (actual multithreading)
@@ -246,6 +263,7 @@ firewall-cmd --reload
246
263
  * ☑ write-only folders
247
264
  * ☑ [unpost](#unpost): undo/delete accidental uploads
248
265
  * ☑ [self-destruct](#self-destruct) (specified server-side or client-side)
266
+ * ☑ [race the beam](#race-the-beam) (almost like peer-to-peer)
249
267
  * ☑ symlink/discard duplicates (content-matching)
250
268
  * download
251
269
  * ☑ single files in browser
@@ -671,7 +689,7 @@ up2k has several advantages:
671
689
  > it is perfectly safe to restart / upgrade copyparty while someone is uploading to it!
672
690
  > all known up2k clients will resume just fine 💪
673
691
 
674
- see [up2k](#up2k) for details on how it works, or watch a [demo video](https://a.ocv.me/pub/demo/pics-vids/#gf-0f6f5c0d)
692
+ see [up2k](./docs/devnotes.md#up2k) for details on how it works, or watch a [demo video](https://a.ocv.me/pub/demo/pics-vids/#gf-0f6f5c0d)
675
693
 
676
694
  ![copyparty-upload-fs8](https://user-images.githubusercontent.com/241032/129635371-48fc54ca-fa91-48e3-9b1d-ba413e4b68cb.png)
677
695
 
@@ -737,6 +755,13 @@ clients can specify a shorter expiration time using the [up2k ui](#uploading) --
737
755
  specifying a custom expiration time client-side will affect the timespan in which unposts are permitted, so keep an eye on the estimates in the up2k ui
738
756
 
739
757
 
758
+ ### race the beam
759
+
760
+ download files while they're still uploading ([demo video](http://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm)) -- it's almost like peer-to-peer
761
+
762
+ requires the file to be uploaded using up2k (which is the default drag-and-drop uploader), alternatively the command-line program
763
+
764
+
740
765
  ## file manager
741
766
 
742
767
  cut/paste, rename, and delete files/folders (if you have permission)
@@ -1,19 +1,19 @@
1
1
  copyparty/__init__.py,sha256=fUINM1abqDGzCCH_JcXdOnLdKOV-SrTI2Xo2QgQW2P4,1703
2
- copyparty/__main__.py,sha256=e9hqYxGdNJDzebB6wcUoc0J_MJ7QjDFOd8U0lHMg6so,94463
3
- copyparty/__version__.py,sha256=ganlDYyD1fZ-cfML97DrLZ1r_houLJUgM-0rrA-xh-k,250
4
- copyparty/authsrv.py,sha256=qHC_sSExXnd4LLKdSKQM5RA_Xrvl2zdNT_TZRJhA454,84436
2
+ copyparty/__main__.py,sha256=u0RNQ2iZwlKCqngQofFjDsYyKKD50s5q_oht8RONSuU,95386
3
+ copyparty/__version__.py,sha256=Zw2SLEDiKYiPpg31tkxLz17OfRS4iKV7v7yLmGIf3fE,255
4
+ copyparty/authsrv.py,sha256=-MZQnSsrEGD8cTtR90qT5-xoc9xD8PP8cjvBL75HMKo,84501
5
5
  copyparty/broker_mp.py,sha256=4mEZC5tiHUazJMgYuwInNo2dxS7jrbzrGb1qs2UBt9k,3948
6
6
  copyparty/broker_mpw.py,sha256=4ZI7bJYOwUibeAJVv9_FPGNmHrr9eOtkj_Kz0JEppTU,3197
7
7
  copyparty/broker_thr.py,sha256=eKr--HJGig5zqvNGwH9UoBG9Nvi9mT2axrRmJwknd0s,1759
8
8
  copyparty/broker_util.py,sha256=CnX_LAhQQqouONcDLtVkVlcBX3Z6pWuKDQDmmbHGEg4,1489
9
- copyparty/cert.py,sha256=bt1n-629-Gtez1C_CroXq53gXEmUsVjkTbkQ6Gu2Zfc,7323
10
- copyparty/cfg.py,sha256=CQKSyixyhxeM2narwbOfjUsjn0DZ_VYXbdMSa_tv4gw,9189
9
+ copyparty/cert.py,sha256=nCeDdzcCpvjPPUcxT4Oh7wvL_8zvddu4oXtbA-zOb8g,7607
10
+ copyparty/cfg.py,sha256=LawUJv8faoWrFWPudtWpcRlakrW6dp8uUKMYR86Nza8,9305
11
11
  copyparty/dxml.py,sha256=lZpg-kn-kQsXRtNY1n6fRaS-b7uXzMCyv8ovKnhZcZc,1548
12
12
  copyparty/fsutil.py,sha256=c4fTvmclKbVABNsjU4rGddsjCgRwi9YExAyo-06ATc8,3932
13
13
  copyparty/ftpd.py,sha256=OIExjfqOEw-Y_ygez6cIZUQec4SFOmoxEH_WOVvw-aE,15961
14
- copyparty/httpcli.py,sha256=oxMEY8rzE-f6LN2JlzvqY-dc7v85swecpFffvHjEqck,148735
15
- copyparty/httpconn.py,sha256=gLOURB2Nb1w6n2ihGBspEnzEfUND9Osa4klzYuAbgzI,6829
16
- copyparty/httpsrv.py,sha256=af6LdApfj-Q4mWC5mVQjhnyrFzNy8_bXK3VUe0xKkeY,16368
14
+ copyparty/httpcli.py,sha256=aIMmB_kMvI7PbDvHw5WCmMVMdHPuLJ2rer_NPlgMuvE,155100
15
+ copyparty/httpconn.py,sha256=6MOQgBtOGrlVRr6ZiHBKYzkzcls-YWwaWEtqE6DweM0,6873
16
+ copyparty/httpsrv.py,sha256=Xf6wI5V25gzAoyEpiKH8VjEFwUqTzW5z8pcRfo2J40c,16421
17
17
  copyparty/ico.py,sha256=AYHdK6NlYBfBgafVYXia3jHQ9XHZdUL1D8WftLMAzIU,3545
18
18
  copyparty/mdns.py,sha256=CcraggbDxTT1ntYzD8Ebgqmw5Q4HkyZcfh5ymtCV_ak,17469
19
19
  copyparty/metrics.py,sha256=OqXFkAuoVhayGAGd_Sv-OQ9SVmdXYV8M7CxitkzE3lo,8854
@@ -24,15 +24,15 @@ copyparty/smbd.py,sha256=iACj5pbiKsX7bVu20BK3ebPQLB_qA7WS2l-ytrSfT3Y,14054
24
24
  copyparty/ssdp.py,sha256=H6ZftXttydcnBxcg2-Prm4P-XiybgT3xiJRUXU1pbrE,6343
25
25
  copyparty/star.py,sha256=K4NuzyfT4956uoW6GJSQ2II-JsSV57apQZwRZ4mjFoo,3790
26
26
  copyparty/sutil.py,sha256=_G4TM0YFa1vXzhRypHJ88QBdZWtYgDbom4CZjGvGIwc,3074
27
- copyparty/svchub.py,sha256=mf101Y51z4H86DYjJ0YD1LOWzygTKdHWevUNaQUOGR8,31701
27
+ copyparty/svchub.py,sha256=FiX6B70K5XVhCDuQDty8ZXhujThfkFcH3brp1rsEr-A,32258
28
28
  copyparty/szip.py,sha256=631TsEwGKV22yAnusJtvE-9fGFWr61HPGBinu-jk1QA,8591
29
29
  copyparty/tcpsrv.py,sha256=2LGUqOBAIrsmL-1pwrbsPXR71gutHccqRp-hjzt91Us,17289
30
30
  copyparty/tftpd.py,sha256=7EHAZ9LnjAXupwRNIENJ2eA8Q0lFynnwwbziV3fyzns,13157
31
31
  copyparty/th_cli.py,sha256=eSW7sBiaZAsh_XffXFzb035CTSbS3J3Q0G-BMzQGuSY,4385
32
- copyparty/th_srv.py,sha256=X_nQB7YlwPuj5_4v2jVGh7H2UtNgf_lDAD8aBjcmJag,27161
32
+ copyparty/th_srv.py,sha256=C2ZBE6ddINCuYDympRQQmhj0ULdlD6HOM6qNK-UB4so,27191
33
33
  copyparty/u2idx.py,sha256=JBEqKX1ZM8GIvQrDYb5VQ_5QiFNFsjWF6H9drHlPVEY,12709
34
- copyparty/up2k.py,sha256=834EGhamt6oXmdHdHS9BxG2LiHm4Q2Ax3NpUv8DbMr4,140723
35
- copyparty/util.py,sha256=sClrlGCL-sGVSYAuMAFR-SNXIIj5T2Tl12y6XLR_ikE,81016
34
+ copyparty/up2k.py,sha256=co26DRvhYgwHpwbvuXUDQlCWSMjDZiIE29KVXHMwiKs,142833
35
+ copyparty/util.py,sha256=f9e6vxtnsHxBkctkcJX_iaAg_2AWk4K4p67MMzox144,82942
36
36
  copyparty/bos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  copyparty/bos/bos.py,sha256=Wb7eWsXJgR5AFlBR9ZOyKrLTwy-Kct9RrGiOu4Jo37Y,1622
38
38
  copyparty/bos/path.py,sha256=yEjCq2ki9CvxA5sCT8pS0keEXwugs0ZeUyUhdBziOCI,777
@@ -55,9 +55,9 @@ copyparty/stolen/ifaddr/_posix.py,sha256=-67NdfGrCktfQPakT2fLbjl2U00QMvyBGkSvrUu
55
55
  copyparty/stolen/ifaddr/_shared.py,sha256=cJACl8cOxQ-HSYphZTzKMAjAx_TAFyJwUPjfD102Xqw,6111
56
56
  copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
57
57
  copyparty/web/baguettebox.js.gz,sha256=Qcx5ZJWWCU4S1J0ULVXuVKWnm_SuCiEknMlt_uwIkJ8,7830
58
- copyparty/web/browser.css.gz,sha256=dvCrWbY4MswsS5tmDR50eaWk1rhsAecos3x8iKd3v6w,11434
58
+ copyparty/web/browser.css.gz,sha256=VruUcE9yZm8bpJrPml1lcnJwznaR43Db864qW8Rv4d4,11470
59
59
  copyparty/web/browser.html,sha256=uAejLJd11rV_tQx3h2nHnJ1XY6zn1JV-meIAv74Lc8o,4873
60
- copyparty/web/browser.js.gz,sha256=MWB2PUrkTh2u51Dt6Sk8uRdK8AKH-mfJoRvwIw7k3sM,67293
60
+ copyparty/web/browser.js.gz,sha256=_ePuKLuMIrJbKNcwqXcipJHiVzK5ZiaG5JtEExTy440,67893
61
61
  copyparty/web/browser2.html,sha256=ciQlgr9GWuIapdsRBFNRvRFvN5T_5n920LqDMbsj5-g,1605
62
62
  copyparty/web/cf.html,sha256=lJThtNFNAQT1ClCHHlivAkDGE0LutedwopXD62Z8Nys,589
63
63
  copyparty/web/dbg-audio.js.gz,sha256=Ma-KZtK8LnmiwNvNKFKXMPYl_Nn_3U7GsJ6-DRWC2HE,688
@@ -71,18 +71,18 @@ copyparty/web/mde.html,sha256=FMMq4ySXoOrQV5E836KmQCry3COOhMu0DSstAdJZL_g,1678
71
71
  copyparty/web/mde.js.gz,sha256=kN2eUSvr4mFuksfK4-4LimJmWdwsao39Sea2lWtu8L0,2224
72
72
  copyparty/web/msg.css.gz,sha256=u90fXYAVrMD-jqwf5XFVC1ptSpSHZUe8Mez6PX101P8,300
73
73
  copyparty/web/msg.html,sha256=XDg51WLO7RruZnoFnKpeJ33k47-tBHP3bR7l55Jwre4,896
74
- copyparty/web/splash.css.gz,sha256=1IV-0cAs-RNCnvHu-wbSVzKMCkHIblManOLB8d3xcqk,949
75
- copyparty/web/splash.html,sha256=KFAvTnofyVURBQyTnrYwuDdEKN_iGtvdjicn5b33tL8,3822
74
+ copyparty/web/splash.css.gz,sha256=zgDs-SY3VrInsXeARRPcGHziVOUs-1hUtSObzybwD1g,1006
75
+ copyparty/web/splash.html,sha256=mPhMBTO3BMaie5lGJGloS6b8HhoujUzDZYAosfDX8fg,3846
76
76
  copyparty/web/splash.js.gz,sha256=2R8UYlAN8WpIABg8clgWckWqgD8nKtz3eGZFu2y1g88,1420
77
77
  copyparty/web/svcs.html,sha256=s7vUSrCrELC3iTemksodRBhQpssO7s4xW1vA-CX6vU8,11702
78
78
  copyparty/web/svcs.js.gz,sha256=k81ZvZ3I-f4fMHKrNGGOgOlvXnCBz0mVjD-8mieoWCA,520
79
79
  copyparty/web/ui.css.gz,sha256=skuzZHqTU0ag5hButpQmKI9wM7ro-UJ2PnpTodTWYF4,2616
80
- copyparty/web/up2k.js.gz,sha256=ZuxLQW8mJSvLu_Aa8fDT3F9rptuAzNDmaOLd0MeMrd8,22114
81
- copyparty/web/util.js.gz,sha256=g_g4yZX5AhFSV-2SWn_5dL1cNYbrAcTa6gvAGgYO_dA,14368
80
+ copyparty/web/up2k.js.gz,sha256=3IKVXjZq7byJWFKyHVylIIbWozsJ6IL7CrOUCibE8BY,22114
81
+ copyparty/web/util.js.gz,sha256=3Ys57MotfGguhuCdDhj3afyX8wlz3ZgG5ZrnY4_Zqcw,14377
82
82
  copyparty/web/w.hash.js.gz,sha256=__hBMd5oZWfTrb8ZCJNT21isoSqyrxKE6qdaKGQVAhc,1060
83
83
  copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
84
  copyparty/web/a/partyfuse.py,sha256=MuRkaSuYsdfWfBFMOkbPwDXqSvNTw3sd7QhhlKCDZ8I,32311
85
- copyparty/web/a/u2c.py,sha256=Yo_zsjBg1Op53sPFhzcbAkd-VZlm6nZ4DMVN_s0Yu2k,38469
85
+ copyparty/web/a/u2c.py,sha256=qyK4G1mkICAjmo99YV8ubi2Zk6GG8S8yldW6D18Pnos,38626
86
86
  copyparty/web/a/webdav-cfg.bat,sha256=Y4NoGZlksAIg4cBMb7KdJrpKC6Nx97onaTl6yMjaimk,1449
87
87
  copyparty/web/dd/2.png,sha256=gJ14XFPzaw95L6z92fSq9eMPikSQyu-03P1lgiGe0_I,258
88
88
  copyparty/web/dd/3.png,sha256=4lho8Koz5tV7jJ4ODo6GMTScZfkqsT05yp48EDFIlyg,252
@@ -102,9 +102,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV
102
102
  copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
103
103
  copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
104
104
  copyparty/web/deps/sha512.hw.js.gz,sha256=vqoXeracj-99Z5MfY3jK2N4WiSzYQdfjy0RnUlQDhSU,8110
105
- copyparty-1.12.1.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
106
- copyparty-1.12.1.dist-info/METADATA,sha256=9FekTPcL3ex7vZFR5gRWSyizMNgAK3BeXF-7Aj76Eic,117639
107
- copyparty-1.12.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
108
- copyparty-1.12.1.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
109
- copyparty-1.12.1.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
110
- copyparty-1.12.1.dist-info/RECORD,,
105
+ copyparty-1.13.0.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
106
+ copyparty-1.13.0.dist-info/METADATA,sha256=sa7IcvkdDV532CI8LFuQJg8dzUbplA45cB8Qmn3Ppmw,119305
107
+ copyparty-1.13.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
108
+ copyparty-1.13.0.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
109
+ copyparty-1.13.0.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
110
+ copyparty-1.13.0.dist-info/RECORD,,