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/__main__.py +7 -2
- copyparty/__version__.py +3 -3
- copyparty/authsrv.py +8 -7
- copyparty/cert.py +17 -6
- copyparty/cfg.py +3 -0
- copyparty/httpcli.py +188 -10
- copyparty/httpconn.py +1 -0
- copyparty/httpsrv.py +2 -0
- copyparty/svchub.py +13 -0
- copyparty/th_srv.py +2 -1
- copyparty/up2k.py +124 -60
- copyparty/util.py +101 -29
- copyparty/web/a/u2c.py +8 -4
- copyparty/web/browser.css.gz +0 -0
- copyparty/web/browser.js.gz +0 -0
- copyparty/web/splash.css.gz +0 -0
- copyparty/web/splash.html +1 -1
- copyparty/web/up2k.js.gz +0 -0
- copyparty/web/util.js.gz +0 -0
- {copyparty-1.12.1.dist-info → copyparty-1.13.0.dist-info}/METADATA +29 -4
- {copyparty-1.12.1.dist-info → copyparty-1.13.0.dist-info}/RECORD +25 -25
- {copyparty-1.12.1.dist-info → copyparty-1.13.0.dist-info}/LICENSE +0 -0
- {copyparty-1.12.1.dist-info → copyparty-1.13.0.dist-info}/WHEEL +0 -0
- {copyparty-1.12.1.dist-info → copyparty-1.13.0.dist-info}/entry_points.txt +0 -0
- {copyparty-1.12.1.dist-info → copyparty-1.13.0.dist-info}/top_level.txt +0 -0
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
|
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
|
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
|
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
|
2108
|
-
src
|
2109
|
-
|
2110
|
-
|
2111
|
-
|
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
|
-
|
2114
|
-
|
2157
|
+
k = "rm_re_"
|
2158
|
+
act = "delete"
|
2159
|
+
osfun = os.unlink
|
2160
|
+
args = [bsrc]
|
2115
2161
|
|
2116
|
-
|
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(
|
2135
|
-
|
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.
|
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 = "
|
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(
|
2152
|
-
t = "
|
2153
|
-
log(t % (ex.errno, maxtime + 0.99,
|
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.
|
5
|
-
S_BUILD_DT = "2024-
|
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.
|
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):
|
copyparty/web/browser.css.gz
CHANGED
Binary file
|
copyparty/web/browser.js.gz
CHANGED
Binary file
|
copyparty/web/splash.css.gz
CHANGED
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.
|
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
|

|
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=
|
3
|
-
copyparty/__version__.py,sha256=
|
4
|
-
copyparty/authsrv.py,sha256
|
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=
|
10
|
-
copyparty/cfg.py,sha256=
|
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=
|
15
|
-
copyparty/httpconn.py,sha256=
|
16
|
-
copyparty/httpsrv.py,sha256=
|
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=
|
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=
|
32
|
+
copyparty/th_srv.py,sha256=C2ZBE6ddINCuYDympRQQmhj0ULdlD6HOM6qNK-UB4so,27191
|
33
33
|
copyparty/u2idx.py,sha256=JBEqKX1ZM8GIvQrDYb5VQ_5QiFNFsjWF6H9drHlPVEY,12709
|
34
|
-
copyparty/up2k.py,sha256=
|
35
|
-
copyparty/util.py,sha256=
|
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=
|
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=
|
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=
|
75
|
-
copyparty/web/splash.html,sha256=
|
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=
|
81
|
-
copyparty/web/util.js.gz,sha256=
|
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=
|
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.
|
106
|
-
copyparty-1.
|
107
|
-
copyparty-1.
|
108
|
-
copyparty-1.
|
109
|
-
copyparty-1.
|
110
|
-
copyparty-1.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|