copyparty 1.16.3__tar.gz → 1.16.4__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 (122) hide show
  1. {copyparty-1.16.3 → copyparty-1.16.4}/PKG-INFO +1 -1
  2. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/__version__.py +2 -2
  3. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/up2k.py +9 -1
  4. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/a/u2c.py +48 -4
  5. copyparty-1.16.4/copyparty/web/browser.css.gz +0 -0
  6. copyparty-1.16.4/copyparty/web/browser.js.gz +0 -0
  7. copyparty-1.16.4/copyparty/web/up2k.js.gz +0 -0
  8. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty.egg-info/PKG-INFO +1 -1
  9. copyparty-1.16.3/copyparty/web/browser.css.gz +0 -0
  10. copyparty-1.16.3/copyparty/web/browser.js.gz +0 -0
  11. copyparty-1.16.3/copyparty/web/up2k.js.gz +0 -0
  12. {copyparty-1.16.3 → copyparty-1.16.4}/LICENSE +0 -0
  13. {copyparty-1.16.3 → copyparty-1.16.4}/README.md +0 -0
  14. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/__init__.py +0 -0
  15. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/__main__.py +0 -0
  16. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/authsrv.py +0 -0
  17. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/bos/__init__.py +0 -0
  18. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/bos/bos.py +0 -0
  19. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/bos/path.py +0 -0
  20. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/broker_mp.py +0 -0
  21. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/broker_mpw.py +0 -0
  22. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/broker_thr.py +0 -0
  23. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/broker_util.py +0 -0
  24. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/cert.py +0 -0
  25. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/cfg.py +0 -0
  26. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/dxml.py +0 -0
  27. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/fsutil.py +0 -0
  28. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/ftpd.py +0 -0
  29. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/httpcli.py +0 -0
  30. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/httpconn.py +0 -0
  31. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/httpsrv.py +0 -0
  32. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/ico.py +0 -0
  33. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/mdns.py +0 -0
  34. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/metrics.py +0 -0
  35. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/mtag.py +0 -0
  36. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/multicast.py +0 -0
  37. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/pwhash.py +0 -0
  38. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/res/COPYING.txt +0 -0
  39. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/res/__init__.py +0 -0
  40. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/res/insecure.pem +0 -0
  41. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/smbd.py +0 -0
  42. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/ssdp.py +0 -0
  43. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/star.py +0 -0
  44. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/__init__.py +0 -0
  45. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/dnslib/__init__.py +0 -0
  46. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/dnslib/bimap.py +0 -0
  47. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/dnslib/bit.py +0 -0
  48. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/dnslib/buffer.py +0 -0
  49. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/dnslib/dns.py +0 -0
  50. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/dnslib/label.py +0 -0
  51. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/dnslib/lex.py +0 -0
  52. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/dnslib/ranges.py +0 -0
  53. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/ifaddr/__init__.py +0 -0
  54. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/ifaddr/_posix.py +0 -0
  55. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/ifaddr/_shared.py +0 -0
  56. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/ifaddr/_win32.py +0 -0
  57. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/qrcodegen.py +0 -0
  58. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/stolen/surrogateescape.py +0 -0
  59. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/sutil.py +0 -0
  60. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/svchub.py +0 -0
  61. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/szip.py +0 -0
  62. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/tcpsrv.py +0 -0
  63. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/tftpd.py +0 -0
  64. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/th_cli.py +0 -0
  65. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/th_srv.py +0 -0
  66. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/u2idx.py +0 -0
  67. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/util.py +0 -0
  68. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/a/__init__.py +0 -0
  69. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/a/partyfuse.py +0 -0
  70. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/a/webdav-cfg.bat +0 -0
  71. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/baguettebox.js.gz +0 -0
  72. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/browser.html +0 -0
  73. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/browser2.html +0 -0
  74. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/cf.html +0 -0
  75. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/dbg-audio.js.gz +0 -0
  76. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/dd/2.png +0 -0
  77. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/dd/3.png +0 -0
  78. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/dd/4.png +0 -0
  79. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/dd/5.png +0 -0
  80. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/dd/__init__.py +0 -0
  81. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/__init__.py +0 -0
  82. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/busy.mp3.gz +0 -0
  83. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/easymde.css.gz +0 -0
  84. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/easymde.js.gz +0 -0
  85. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/fuse.py +0 -0
  86. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/marked.js.gz +0 -0
  87. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/mini-fa.css.gz +0 -0
  88. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/mini-fa.woff +0 -0
  89. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/prism.css.gz +0 -0
  90. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/prism.js.gz +0 -0
  91. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/prismd.css.gz +0 -0
  92. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/scp.woff2 +0 -0
  93. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/sha512.ac.js.gz +0 -0
  94. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/deps/sha512.hw.js.gz +0 -0
  95. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/md.css.gz +0 -0
  96. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/md.html +0 -0
  97. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/md.js.gz +0 -0
  98. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/md2.css.gz +0 -0
  99. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/md2.js.gz +0 -0
  100. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/mde.css.gz +0 -0
  101. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/mde.html +0 -0
  102. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/mde.js.gz +0 -0
  103. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/msg.css.gz +0 -0
  104. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/msg.html +0 -0
  105. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/shares.css.gz +0 -0
  106. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/shares.html +0 -0
  107. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/shares.js.gz +0 -0
  108. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/splash.css.gz +0 -0
  109. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/splash.html +0 -0
  110. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/splash.js.gz +0 -0
  111. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/svcs.html +0 -0
  112. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/svcs.js.gz +0 -0
  113. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/ui.css.gz +0 -0
  114. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/util.js.gz +0 -0
  115. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty/web/w.hash.js.gz +0 -0
  116. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty.egg-info/SOURCES.txt +0 -0
  117. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty.egg-info/dependency_links.txt +0 -0
  118. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty.egg-info/entry_points.txt +0 -0
  119. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty.egg-info/requires.txt +0 -0
  120. {copyparty-1.16.3 → copyparty-1.16.4}/copyparty.egg-info/top_level.txt +0 -0
  121. {copyparty-1.16.3 → copyparty-1.16.4}/pyproject.toml +0 -0
  122. {copyparty-1.16.3 → copyparty-1.16.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: copyparty
3
- Version: 1.16.3
3
+ Version: 1.16.4
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
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- VERSION = (1, 16, 3)
3
+ VERSION = (1, 16, 4)
4
4
  CODENAME = "COPYparty"
5
- BUILD_DT = (2024, 12, 4)
5
+ BUILD_DT = (2024, 12, 7)
6
6
 
7
7
  S_VERSION = ".".join(map(str, VERSION))
8
8
  S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
@@ -3077,7 +3077,8 @@ class Up2k(object):
3077
3077
  if cur:
3078
3078
  dupe = (cj["prel"], cj["name"], cj["lmod"])
3079
3079
  try:
3080
- self.dupesched[src].append(dupe)
3080
+ if dupe not in self.dupesched[src]:
3081
+ self.dupesched[src].append(dupe)
3081
3082
  except:
3082
3083
  self.dupesched[src] = [dupe]
3083
3084
 
@@ -4652,6 +4653,13 @@ class Up2k(object):
4652
4653
  t = "forgetting partial upload {} ({})"
4653
4654
  p = self._vis_job_progress(job)
4654
4655
  self.log(t.format(wark, p))
4656
+
4657
+ src = djoin(ptop, vrem)
4658
+ zi = len(self.dupesched.pop(src, []))
4659
+ if zi:
4660
+ t = "...and forgetting %d links in dupesched"
4661
+ self.log(t % (zi,))
4662
+
4655
4663
  assert wark
4656
4664
  del reg[wark]
4657
4665
 
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env python3
2
2
  from __future__ import print_function, unicode_literals
3
3
 
4
- S_VERSION = "2.6"
5
- S_BUILD_DT = "2024-11-10"
4
+ S_VERSION = "2.7"
5
+ S_BUILD_DT = "2024-12-06"
6
6
 
7
7
  """
8
8
  u2c.py: upload to copyparty
@@ -1031,8 +1031,8 @@ class Ctl(object):
1031
1031
  handshake(self.ar, file, False)
1032
1032
 
1033
1033
  def _fancy(self):
1034
+ atexit.register(self.cleanup_vt100)
1034
1035
  if VT100 and not self.ar.ns:
1035
- atexit.register(self.cleanup_vt100)
1036
1036
  ss.scroll_region(3)
1037
1037
 
1038
1038
  Daemon(self.hasher)
@@ -1040,6 +1040,7 @@ class Ctl(object):
1040
1040
  Daemon(self.handshaker)
1041
1041
  Daemon(self.uploader)
1042
1042
 
1043
+ last_sp = -1
1043
1044
  while True:
1044
1045
  with self.exit_cond:
1045
1046
  self.exit_cond.wait(0.07)
@@ -1078,6 +1079,12 @@ class Ctl(object):
1078
1079
  else:
1079
1080
  txt = " "
1080
1081
 
1082
+ if not VT100: # OSC9;4 (taskbar-progress)
1083
+ sp = int(self.up_b * 100 / self.nbytes) or 1
1084
+ if last_sp != sp:
1085
+ last_sp = sp
1086
+ txt += "\033]9;4;1;%d\033\\" % (sp,)
1087
+
1081
1088
  if not self.up_br:
1082
1089
  spd = self.hash_b / ((time.time() - self.t0) or 1)
1083
1090
  eta = (self.nbytes - self.hash_b) / (spd or 1)
@@ -1095,6 +1102,8 @@ class Ctl(object):
1095
1102
  tail = "\033[K\033[u" if VT100 and not self.ar.ns else "\r"
1096
1103
 
1097
1104
  t = "%s eta @ %s/s, %s, %d# left\033[K" % (self.eta, spd, sleft, nleft)
1105
+ if not self.hash_b:
1106
+ t = " now hashing..."
1098
1107
  eprint(txt + "\033]0;{0}\033\\\r{0}{1}".format(t, tail))
1099
1108
 
1100
1109
  if self.ar.wlist:
@@ -1115,7 +1124,10 @@ class Ctl(object):
1115
1124
  handshake(self.ar, file, False)
1116
1125
 
1117
1126
  def cleanup_vt100(self):
1118
- ss.scroll_region(None)
1127
+ if VT100:
1128
+ ss.scroll_region(None)
1129
+ else:
1130
+ eprint("\033]9;4;0\033\\")
1119
1131
  eprint("\033[J\033]0;\033\\")
1120
1132
 
1121
1133
  def cb_hasher(self, file, ofs):
@@ -1536,6 +1548,38 @@ source file/folder selection uses rsync syntax, meaning that:
1536
1548
  except:
1537
1549
  pass
1538
1550
 
1551
+ # msys2 doesn't uncygpath absolute paths with whitespace
1552
+ if not VT100:
1553
+ zsl = []
1554
+ for fn in ar.files:
1555
+ if re.search("^/[a-z]/", fn):
1556
+ fn = r"%s:\%s" % (fn[1:2], fn[3:])
1557
+ zsl.append(fn.replace("/", "\\"))
1558
+ ar.files = zsl
1559
+
1560
+ fok = []
1561
+ fng = []
1562
+ for fn in ar.files:
1563
+ if os.path.exists(fn):
1564
+ fok.append(fn)
1565
+ elif VT100:
1566
+ fng.append(fn)
1567
+ else:
1568
+ # windows leaves glob-expansion to the invoked process... okayyy let's get to work
1569
+ from glob import glob
1570
+
1571
+ fns = glob(fn)
1572
+ if fns:
1573
+ fok.extend(fns)
1574
+ else:
1575
+ fng.append(fn)
1576
+
1577
+ if fng:
1578
+ t = "some files/folders were not found:\n %s"
1579
+ raise Exception(t % ("\n ".join(fng),))
1580
+
1581
+ ar.files = fok
1582
+
1539
1583
  if ar.drd:
1540
1584
  ar.dr = True
1541
1585
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: copyparty
3
- Version: 1.16.3
3
+ Version: 1.16.4
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
Binary file
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes