diff --git a/copyparty/__version__.py b/copyparty/__version__.py
index 28bf9528..31e98ef7 100644
--- a/copyparty/__version__.py
+++ b/copyparty/__version__.py
@@ -1,8 +1,8 @@
# coding: utf-8
-VERSION = (1, 13, 1)
+VERSION = (1, 13, 2)
CODENAME = "race the beam"
-BUILD_DT = (2024, 5, 6)
+BUILD_DT = (2024, 5, 10)
S_VERSION = ".".join(map(str, VERSION))
S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
diff --git a/copyparty/util.py b/copyparty/util.py
index 16edceb7..4d33608a 100644
--- a/copyparty/util.py
+++ b/copyparty/util.py
@@ -476,7 +476,9 @@ class Daemon(threading.Thread):
def run(self):
if not ANYWIN and not PY2:
- signal.pthread_sigmask(signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1])
+ signal.pthread_sigmask(
+ signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1]
+ )
self.fun(*self.a, **self.ka)
@@ -1323,7 +1325,9 @@ def sigblock():
if ANYWIN or PY2:
return
- signal.pthread_sigmask(signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1])
+ signal.pthread_sigmask(
+ signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1]
+ )
def vol_san(vols: list["VFS"], txt: bytes) -> bytes:
diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js
index 4920a8e8..5c888d32 100644
--- a/copyparty/web/browser.js
+++ b/copyparty/web/browser.js
@@ -3259,7 +3259,7 @@ function autoplay_blocked(seek) {
var tid = mp.au.tid,
fn = mp.tracks[tid].split(/\//).pop();
- fn = uricom_dec(fn.replace(/\+/g, ' '));
+ fn = uricom_dec(fn.replace(/\+/g, ' ').split('?')[0]);
modal.confirm('
' + L.mm_hashplay + '
\n«' + esc(fn) + '»', function () {
// chrome 91 may permanently taint on a failed play()
diff --git a/docs/changelog.md b/docs/changelog.md
index 399b315b..0bbb385d 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -1,3 +1,58 @@
+▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
+# 2024-0506-0029 `v1.13.1` ctrl-v
+
+## new features
+
+* upload files by `ctrl-c` from OS and `ctrl-v` into browser c5f7cfc3
+ * from just about any file manager (windows explorer, thunar on linux, etc.) into the copyparty web-ui
+ * only files, not folders, so drag-drop is still the recommended way
+* empty folders show an "empty folder" banner fdda567f
+* opengraph / discord embeds ea270ab9 36f2c446 48a6789d b15a4ef7
+ * embeds [audio with covers](https://cd.ocv.me/c/d2/d22/snowy.mp3) , [images](https://cd.ocv.me/c/d2/d22/cover.jpg) , [videos](https://cd.ocv.me/c/d2/d21/no-effect.webm) , [audio without coverart](https://cd.ocv.me/c/d2/bitconnect.mp3) (links to one of the copyparty demoservers where the feature is enabled; link those in discord to test)
+ * images are currently not rendering correctly once clicked on android-discord (works on ios and in browser)
+ * default-disabled because opengraph disables hotlinking by design
+ * enable with `--og` and [see readme](https://github.com/9001/copyparty#opengraph) and [the --help](https://github.com/9001/copyparty/assets/241032/2dabf21e-2470-4e20-8ef0-3821b24be1b6)
+* add option to support base64-encoded url queries parceled into the url location 69517e46
+ * because android-specific discord bugs prevent the use of queries in opengraph tags
+* improve server performance when downloading unfinished uploads, especially on slow storage 70a3cf36
+* add dynamic content into `` using `--html-head` which now takes files and/or jinja templates as input b6cf2d30
+* `--au-vol` (default 50, same as before) sets default audio volume in percent da091aec
+* add **[copyparty.pyz](https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py)** buildscript 27485a4c
+* support ie4 and the [version of winzip](https://a.ocv.me/pub/g/nerd-stuff/cpp/win311zip.png) you'd find on an average windows 3.11 pc 603d0ed7
+
+## bugfixes
+
+* when logging in from the 403 page, remember and apply the original url hash f8491970
+* the config-reset button in the control-panel didn't clear the dotfiles preference bc2c1e42
+* the search feature could discover and use stale indexes in volumes where indexing was since disabled 95d9e693
+* when in doubt, periodically recheck if filesystems support sparse files f6e693f0
+ * reduces opportunities for confusion on servers with removable media (usb flashdrives)
+
+----
+
+this release introduces **[copyparty.pyz](https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py)**, yet another way to bring copyparty where it's needed -- very limited and with many drawbacks (see [readme](https://github.com/9001/copyparty#zipapp)) but may work when the others don't
+
+
+
+▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
+# 2024-0420-2232 `v1.13.0` race the beam
+
+## new features
+
+* files can be downloaded before the upload has completed ("almost like peer-to-peer")
+ * watch the [release trailer](http://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm) 👌
+ * if the downloader catches up with the upload, the speed is gradually slowed down so it never runs ahead
+ * can be disabled with `--no-pipe`
+* option `--no-db-ip` disables storing the uploader IP in the database bf585078
+* u2c (cli uploader): option `--ow` to overwrite existing files on the server 439cb7f8
+
+## bugfixes
+
+* when running on windows, using the web-UI to abort an upload could fail 8c552f1a
+* rapidly PUT-uploading and then deleting files could crash the file hasher feecb3e0
+
+
+
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2024-0412-2110 `v1.12.2` ie11 fix
diff --git a/scripts/deps-docker/Dockerfile b/scripts/deps-docker/Dockerfile
index 98689319..b5efa59b 100644
--- a/scripts/deps-docker/Dockerfile
+++ b/scripts/deps-docker/Dockerfile
@@ -3,7 +3,7 @@ WORKDIR /z
ENV ver_asmcrypto=c72492f4a66e17a0e5dd8ad7874de354f3ccdaa5 \
ver_hashwasm=4.10.0 \
ver_marked=4.3.0 \
- ver_dompf=3.0.11 \
+ ver_dompf=3.1.2 \
ver_mde=2.18.0 \
ver_codemirror=5.65.16 \
ver_fontawesome=5.13.0 \
diff --git a/scripts/pyinstaller/deps.sha512 b/scripts/pyinstaller/deps.sha512
index 81353550..1c688b1a 100644
--- a/scripts/pyinstaller/deps.sha512
+++ b/scripts/pyinstaller/deps.sha512
@@ -24,7 +24,7 @@ f298e34356b5590dde7477d7b3a88ad39c622a2bcf3fcd7c53870ce8384dd510f690af81b8f42e12
479a63e14586ab2f2228208116fc149ed8ee7b1e4ff360754f5bda4bf765c61af2e04b5ef123976623d04df4976b7886e0445647269da81436bd0a7b5671d361 windows6.1-kb2533623-x86.msu
ac96786e5d35882e0c5b724794329c9125c2b86ae7847f17acfc49f0d294312c6afc1c3f248655de3f0ccb4ca426d7957d02ba702f4a15e9fcd7e2c314e72c19 zipp-3.15.0-py3-none-any.whl
# win10
-e3e2e6bd511dec484dd0292f4c46c55c88a885eabf15413d53edea2dd4a4dbae1571735b9424f78c0cd7f1082476a8259f31fd3f63990f726175470f636df2b3 Jinja2-3.1.3-py3-none-any.whl
+d1420c8417fad7888766dd26b9706a87c63e8f33dceeb8e26d0056d5127b0b3ed9272e44b4b761132d4b3320327252eab1696520488ca64c25958896b41f547b jinja2-3.1.4-py3-none-any.whl
e21495f1d473d855103fb4a243095b498ec90eb68776b0f9b48e994990534f7286c0292448e129c507e5d70409f8a05cca58b98d59ce2a815993d0a873dfc480 MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl
8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl
1dfe6f66bef5c9d62c9028a964196b902772ec9e19db215f3f41acb8d2d563586988d81b455fa6b895b434e9e1e9d57e4d271d1b1214483bdb3eadffcbba6a33 pillow-10.3.0-cp311-cp311-win_amd64.whl
diff --git a/scripts/pyinstaller/notes.txt b/scripts/pyinstaller/notes.txt
index 636042ba..7e619272 100644
--- a/scripts/pyinstaller/notes.txt
+++ b/scripts/pyinstaller/notes.txt
@@ -24,7 +24,7 @@ fns=(
)
[ $w10 ] && fns+=(
pyinstaller-6.5.0-py3-none-win_amd64.whl
- Jinja2-3.1.3-py3-none-any.whl
+ Jinja2-3.1.4-py3-none-any.whl
MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl
mutagen-1.47.0-py3-none-any.whl
pillow-10.3.0-cp311-cp311-win_amd64.whl