From 96acbd3593c9ee2ae4d7384cc138220e16a70d03 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 16:08:44 +0000 Subject: [PATCH 01/10] cleanup * remove cpr bonk (deadcode) * remove get_vpath (wasteful) --- copyparty/httpcli.py | 5 ----- copyparty/web/browser.js | 11 ++++++----- copyparty/web/up2k.js | 2 +- copyparty/web/util.js | 5 ----- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index 92c98922..dd6ba832 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -1206,11 +1206,6 @@ class HttpCli(object): else: return self.tx_res(res_path) - if res_path != undot(res_path): - t = "malicious user; attempted path traversal; req(%r) vp(%r) => %r" - self.log(t % (self.req, "/" + self.vpath, res_path), 1) - self.cbonk(self.conn.hsrv.gmal, self.req, "trav", "path traversal") - self.tx_404() return False diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index e9510474..5f9f082e 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -2555,7 +2555,7 @@ var mpl = (function () { ebi('np_artist').textContent = np.artist || (fns.length > 1 ? fns[0] : ''); ebi('np_title').textContent = np.title || ''; ebi('np_dur').textContent = np['.dur'] || ''; - ebi('np_url').textContent = get_vpath() + np.file.split('?')[0]; + ebi('np_url').textContent = uricom_dec(get_evpath()) + np.file.split('?')[0]; if (!MOBILE && cover) ebi('np_img').setAttribute('src', cover); else @@ -5972,7 +5972,8 @@ var showfile = (function () { }; r.mktree = function () { - var html = ['
  • ' + L.tv_lst + '
    ' + linksplit(get_vpath()).join('/') + '
  • ']; + var crumbs = linksplit(get_evpath()).join('/'), + html = ['
  • ' + L.tv_lst + '
    ' + crumbs + '
  • ']; for (var a = 0; a < r.files.length; a++) { var file = r.files[a]; html.push('
  • '); + msg.push(L.u_asku.format(good_files.length, esc(uricom_dec(get_evpath()))) + '
      '); for (var a = 0, aa = Math.min(20, good_files.length); a < aa; a++) msg.push('
    • ' + esc(good_files[a][1]) + '
    • '); diff --git a/copyparty/web/util.js b/copyparty/web/util.js index 81f972c3..389593b4 100644 --- a/copyparty/web/util.js +++ b/copyparty/web/util.js @@ -857,11 +857,6 @@ function get_evpath() { } -function get_vpath() { - return uricom_dec(get_evpath()); -} - - function noq_href(el) { return el.getAttribute('href').split('?')[0]; } From d1a4d335dfb95ea47c03b0800a07717ccaa04534 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 16:09:14 +0000 Subject: [PATCH 02/10] increase treenav scroll-margins was too small in deep folders, and/or long foldernames --- copyparty/web/browser.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index 5f9f082e..fed2ece1 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -6548,8 +6548,8 @@ function tree_scrolltoo(q) { var ctr = ebi('tree'), em = parseFloat(getComputedStyle(act).fontSize), top = act.offsetTop + ul.offsetTop, - min = top - 11 * em, - max = top - (ctr.offsetHeight - 10 * em); + min = top - 20 * em, + max = top - (ctr.offsetHeight - 16 * em); if (ctr.scrollTop > min) ctr.scrollTop = Math.floor(min); From 233075aee75c5bc6f7a4ed7cc4a9a1e6e7d5e148 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 16:09:49 +0000 Subject: [PATCH 03/10] ctrl-a selects all files in gridview too --- copyparty/web/browser.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index fed2ece1..c162f9a8 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -6720,7 +6720,8 @@ var ahotkeys = function (e) { return ebi('griden').click(); } - if ((aet == 'tr' || aet == 'td') && ae.closest('#files')) { + var in_ftab = (aet == 'tr' || aet == 'td') && ae.closest('#files'); + if (in_ftab) { var d = '', rem = 0; if (aet == 'td') ae = ae.closest('tr'); //ie11 if (k == 'ArrowUp' || k == 'Up') d = 'previous'; @@ -6737,6 +6738,8 @@ var ahotkeys = function (e) { msel.selui(); return ev(e); } + } + if (in_ftab || !aet || (ae && ae.closest('#ggrid'))) { if ((k == 'KeyA' || k == 'a') && ctrl(e)) { var sel = msel.getsel(), all = msel.getall(); From ffc1610980c68142f56b61b5e31dd7900bf30994 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 16:11:36 +0000 Subject: [PATCH 04/10] dont crash if qrcode + mdns + uds --- copyparty/tcpsrv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/copyparty/tcpsrv.py b/copyparty/tcpsrv.py index 99f178c5..d344dfb9 100644 --- a/copyparty/tcpsrv.py +++ b/copyparty/tcpsrv.py @@ -566,7 +566,7 @@ class TcpSrv(object): ip = None ips = list(t1) + list(t2) qri = self.args.qri - if self.args.zm and not qri: + if self.args.zm and not qri and ips: name = self.args.name + ".local" t1[name] = next(v for v in (t1 or t2).values()) ips = [name] + ips From 361aebf877a377b2f6799ec3adac73e60694f149 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 16:38:29 +0000 Subject: [PATCH 05/10] warn on zeroconf with uds-only --- copyparty/svchub.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/copyparty/svchub.py b/copyparty/svchub.py index d0d4de6f..6dcc9fd3 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -770,6 +770,7 @@ class SvcHub(object): self.log("optional-dependencies", t, 6) def _check_env(self) -> None: + al = self.args try: files = os.listdir(E.cfg) except: @@ -786,6 +787,21 @@ class SvcHub(object): if self.args.bauth_last: self.log("root", "WARNING: ignoring --bauth-last due to --no-bauth", 3) + have_tcp = False + for zs in al.i: + if not zs.startswith("unix:"): + have_tcp = True + if not have_tcp: + zb = False + zs = "z zm zm4 zm6 zmv zmvv zs zsv zv" + for zs in zs.split(): + if getattr(al, zs, False): + setattr(al, zs, False) + zb = True + if zb: + t = "only listening on unix-sockets; cannot enable zeroconf/mdns/ssdp as requested" + self.log("root", t, 3) + if not self.args.no_dav: from .dxml import DXML_OK From 98dcaee21033e5a869238f9016cd387967c76333 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 18:51:35 +0000 Subject: [PATCH 06/10] workaround ffmpeg-bug 10797 reduces ram usage from 1534 to 230 MiB when generating spectrograms of files which are decoded by libopenmpt, so most s3xmodit formats --- copyparty/__main__.py | 1 + copyparty/th_srv.py | 50 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/copyparty/__main__.py b/copyparty/__main__.py index 1d8a4056..b6ea33fe 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -1377,6 +1377,7 @@ def add_thumbnail(ap): ap2.add_argument("--th-r-ffi", metavar="T,T", type=u, default="apng,avif,avifs,bmp,cbz,dds,dib,fit,fits,fts,gif,hdr,heic,heics,heif,heifs,icns,ico,jp2,jpeg,jpg,jpx,jxl,pbm,pcx,pfm,pgm,png,pnm,ppm,psd,qoi,sgi,tga,tif,tiff,webp,xbm,xpm", help="image formats to decode using ffmpeg") ap2.add_argument("--th-r-ffv", metavar="T,T", type=u, default="3gp,asf,av1,avc,avi,flv,h264,h265,hevc,m4v,mjpeg,mjpg,mkv,mov,mp4,mpeg,mpeg2,mpegts,mpg,mpg2,mts,nut,ogm,ogv,rm,ts,vob,webm,wmv", help="video formats to decode using ffmpeg") ap2.add_argument("--th-r-ffa", metavar="T,T", type=u, default="aac,ac3,aif,aiff,alac,alaw,amr,apac,ape,au,bonk,dfpwm,dts,flac,gsm,ilbc,it,itgz,itxz,itz,m4a,mdgz,mdxz,mdz,mo3,mod,mp2,mp3,mpc,mptm,mt2,mulaw,ogg,okt,opus,ra,s3m,s3gz,s3xz,s3z,tak,tta,ulaw,wav,wma,wv,xm,xmgz,xmxz,xmz,xpk", help="audio formats to decode using ffmpeg") + ap2.add_argument("--th-spec-cnv", metavar="T,T", type=u, default="it,itgz,itxz,itz,mdgz,mdxz,mdz,mo3,mod,s3m,s3gz,s3xz,s3z,xm,xmgz,xmxz,xmz,xpk", help="audio formats which provoke https://trac.ffmpeg.org/ticket/10797 (huge ram usage for s3xmodit spectrograms)") ap2.add_argument("--au-unpk", metavar="E=F.C", type=u, default="mdz=mod.zip, mdgz=mod.gz, mdxz=mod.xz, s3z=s3m.zip, s3gz=s3m.gz, s3xz=s3m.xz, xmz=xm.zip, xmgz=xm.gz, xmxz=xm.xz, itz=it.zip, itgz=it.gz, itxz=it.xz, cbz=jpg.cbz", help="audio/image formats to decompress before passing to ffmpeg") diff --git a/copyparty/th_srv.py b/copyparty/th_srv.py index dc07556f..14ea4796 100644 --- a/copyparty/th_srv.py +++ b/copyparty/th_srv.py @@ -7,6 +7,7 @@ import os import re import shutil import subprocess as sp +import tempfile import threading import time @@ -19,6 +20,7 @@ from .mtag import HAVE_FFMPEG, HAVE_FFPROBE, au_unpk, ffprobe from .util import BytesIO # type: ignore from .util import ( FFMPEG_URL, + VF_CAREFUL, Cooldown, Daemon, afsenc, @@ -49,6 +51,7 @@ HAVE_WEBP = False EXTS_TH = set(["jpg", "webp", "png"]) EXTS_AC = set(["opus", "owa", "caf", "mp3"]) +EXTS_SPEC_SAFE = set("aif aiff flac mp3 opus wav".split()) PTN_TS = re.compile("^-?[0-9a-f]{8,10}$") @@ -167,12 +170,15 @@ class ThumbSrv(object): self.mutex = threading.Lock() self.busy: dict[str, list[threading.Condition]] = {} + self.untemp: dict[str, list[str]] = {} self.ram: dict[str, float] = {} self.memcond = threading.Condition(self.mutex) self.stopping = False self.rm_nullthumbs = True # forget failed conversions on startup self.nthr = max(1, self.args.th_mt) + self.exts_spec_unsafe = set(self.args.th_spec_cnv.split(",")) + self.q: Queue[Optional[tuple[str, str, str, VFS]]] = Queue(self.nthr * 4) for n in range(self.nthr): Daemon(self.worker, "thumb-{}-{}".format(n, self.nthr)) @@ -413,10 +419,18 @@ class ThumbSrv(object): self.log(t % (ttpath, tpath, ex), 3) pass + untemp = [] with self.mutex: subs = self.busy[tpath] del self.busy[tpath] self.ram.pop(ttpath, None) + untemp = self.untemp.pop(ttpath, None) or [] + + for ap in untemp: + try: + wunlink(self.log, ap, VF_CAREFUL) + except: + pass for x in subs: with x: @@ -670,15 +684,43 @@ class ThumbSrv(object): if "ac" not in ret: raise Exception("not audio") + fext = abspath.split(".")[-1].lower() + # https://trac.ffmpeg.org/ticket/10797 # expect 1 GiB every 600 seconds when duration is tricky; # simple filetypes are generally safer so let's special-case those - safe = ("flac", "wav", "aif", "aiff", "opus") - coeff = 1800 if abspath.split(".")[-1].lower() in safe else 600 - dur = ret[".dur"][1] if ".dur" in ret else 300 + coeff = 1800 if fext in EXTS_SPEC_SAFE else 600 + dur = ret[".dur"][1] if ".dur" in ret else 900 need = 0.2 + dur / coeff self.wait4ram(need, tpath) + infile = abspath + if dur >= 900 or fext in self.exts_spec_unsafe: + with tempfile.NamedTemporaryFile(suffix=".spec.flac", delete=False) as f: + f.write(b"h") + infile = f.name + try: + self.untemp[tpath].append(infile) + except: + self.untemp[tpath] = [infile] + + # fmt: off + cmd = [ + b"ffmpeg", + b"-nostdin", + b"-v", b"error", + b"-hide_banner", + b"-i", fsenc(abspath), + b"-map", b"0:a:0", + b"-ac", b"1", + b"-ar", b"48000", + b"-sample_fmt", b"s16", + b"-t", b"900", + b"-y", fsenc(infile), + ] + # fmt: on + self._run_ff(cmd, vn) + fc = "[0:a:0]aresample=48000{},showspectrumpic=s=" if "3" in fmt: fc += "1280x1024,crop=1420:1056:70:48[o]" @@ -698,7 +740,7 @@ class ThumbSrv(object): b"-nostdin", b"-v", b"error", b"-hide_banner", - b"-i", fsenc(abspath), + b"-i", fsenc(infile), b"-filter_complex", fc.encode("utf-8"), b"-map", b"[o]", b"-frames:v", b"1", From 2bd955ba9fd1147f4cf55f11b6400e765a08327e Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 18:51:45 +0000 Subject: [PATCH 07/10] race-the-beam: improve phrasing --- copyparty/httpcli.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index dd6ba832..a68e2831 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -4246,6 +4246,7 @@ class HttpCli(object): self.log(t % (data_end / M, lower / M, upper / M), 6) with self.u2mutex: if data_end > self.u2fh.aps.get(ap_data, data_end): + fhs: Optional[set[typing.BinaryIO]] = None try: fhs = self.u2fh.cache[ap_data].all_fhs for fh in fhs: @@ -4253,7 +4254,11 @@ class HttpCli(object): self.u2fh.aps[ap_data] = data_end self.log("pipe: flushed %d up2k-FDs" % (len(fhs),)) except Exception as ex: - self.log("pipe: u2fh flush failed: %r" % (ex,)) + if fhs is None: + err = "file is not being written to right now" + else: + err = repr(ex) + self.log("pipe: u2fh flush failed: " + err) if lower >= data_end: if data_end: From 7b2bd6da837b7dbc409f1d56ec9d5570babfeaea Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 21:11:07 +0000 Subject: [PATCH 08/10] fix sorting of japanese folders directory-tree sidebar did not sort correctly for non-ascii names also fix a natural-sort bug; it only took effect for the initial folder load, and not when changing the sort-order also, natural-sort will now apply to all non-numeric fields, not just the filename like before --- copyparty/web/browser.js | 23 +++++++++++------ copyparty/web/util.js | 56 +++++++++++++++++++++++++++++++--------- 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index c162f9a8..891b8b52 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -4433,7 +4433,8 @@ function eval_hash() { function read_dsort(txt) { dnsort = dnsort ? 1 : 0; - clmod(ebi('nsort'), 'on', (sread('nsort') || dnsort) == 1); + ENATSORT = NATSORT && (sread('nsort') || dnsort) == 1; + clmod(ebi('nsort'), 'on', ENATSORT); try { var zt = (('' + txt).trim() || 'href').split(/,+/g); dsort = []; @@ -4479,9 +4480,6 @@ function sortfiles(nodes) { sopts = sopts && sopts.length ? sopts : jcp(dsort); - var collator = !clgot(ebi('nsort'), 'on') ? null : - new Intl.Collator([], {numeric: true}); - try { var is_srch = false; if (nodes[0]['rp']) { @@ -4533,8 +4531,9 @@ function sortfiles(nodes) { } if (v2 === undefined) return 1 * rev; - var ret = rev * (typ == 'int' ? (v1 - v2) : collator ? - collator.compare(v1, v2) : v1.localeCompare(v2)); + var ret = rev * (typ == 'int' ? (v1 - v2) : + ENATSORT ? NATSORT.compare(v1, v2) : + v1.localeCompare(v2)); if (ret === 0) ret = onodes.indexOf(n1) - onodes.indexOf(n2); @@ -7271,6 +7270,7 @@ var treectl = (function () { treesz = clamp(icfg_get('treesz', 16), 10, 50); var resort = function () { + ENATSORT = NATSORT && clgot(ebi('nsort'), 'on'); treectl.gentab(get_evpath(), treectl.lsc); }; bcfg_bind(r, 'ireadme', 'ireadme', true); @@ -8143,9 +8143,16 @@ var treectl = (function () { } delete res['a']; var keys = Object.keys(res); - keys.sort(function (a, b) { return a.localeCompare(b); }); + for (var a = 0; a < keys.length; a++) + keys[a] = [uricom_dec(keys[a]), keys[a]]; + + if (ENATSORT) + keys.sort(function (a, b) { return NATSORT.compare(a[0], b[0]); }); + else + keys.sort(function (a, b) { return a[0].localeCompare(b[0]); }); + for (var a = 0; a < keys.length; a++) { - var kk = keys[a], + var kk = keys[a][1], m = /(\?k=[^\n]+)/.exec(kk), kdk = m ? m[1] : '', ks = kk.replace(kdk, '').slice(1), diff --git a/copyparty/web/util.js b/copyparty/web/util.js index 389593b4..17fb1943 100644 --- a/copyparty/web/util.js +++ b/copyparty/web/util.js @@ -461,6 +461,13 @@ function namesan(txt, win, fslash) { } +var NATSORT, ENATSORT; +try { + NATSORT = new Intl.Collator([], {numeric: true}); +} +catch (ex) { } + + var crctab = (function () { var c, tab = []; for (var n = 0; n < 256; n++) { @@ -614,6 +621,33 @@ function showsort(tab) { } } } +function st_cmp_num(a, b) { + a = a[0]; + b = b[0]; + return ( + a === null ? -1 : + b === null ? 1 : + (a - b) + ); +} +function st_cmp_nat(a, b) { + a = a[0]; + b = b[0]; + return ( + a === null ? -1 : + b === null ? 1 : + NATSORT.compare(a, b) + ); +} +function st_cmp_gen(a, b) { + a = a[0]; + b = b[0]; + return ( + a === null ? -1 : + b === null ? 1 : + a.localeCompare(b) + ); +} function sortTable(table, col, cb) { var tb = table.tBodies[0], th = table.tHead.rows[0].cells, @@ -659,19 +693,17 @@ function sortTable(table, col, cb) { } vl.push([v, a]); } - vl.sort(function (a, b) { - a = a[0]; - b = b[0]; - if (a === null) - return -1; - if (b === null) - return 1; - if (stype == 'int') { - return reverse * (a - b); - } - return reverse * (a.localeCompare(b)); - }); + if (stype == 'int') + vl.sort(st_cmp_num); + else if (ENATSORT) + vl.sort(st_cmp_nat); + else + vl.sort(st_cmp_gen); + + if (reverse < 0) + vl.reverse(); + if (sread('dir1st') !== '0') { var r1 = [], r2 = []; for (var i = 0; i < tr.length; i++) { From c7aa1a355865295d0a4fa8dcc177fb26dc7001d1 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 21:51:39 +0000 Subject: [PATCH 09/10] v1.16.20 --- copyparty/__version__.py | 4 +-- docs/changelog.md | 43 +++++++++++++++++++++++++++++++++ scripts/pyinstaller/deps.sha512 | 2 +- scripts/pyinstaller/notes.txt | 2 +- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/copyparty/__version__.py b/copyparty/__version__.py index 86c380a0..ce8d4d85 100644 --- a/copyparty/__version__.py +++ b/copyparty/__version__.py @@ -1,8 +1,8 @@ # coding: utf-8 -VERSION = (1, 16, 19) +VERSION = (1, 16, 20) CODENAME = "COPYparty" -BUILD_DT = (2025, 4, 8) +BUILD_DT = (2025, 4, 13) S_VERSION = ".".join(map(str, VERSION)) S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT) diff --git a/docs/changelog.md b/docs/changelog.md index 7bf1cac5..68343c03 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,3 +1,46 @@ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +# 2025-0408-2132 `v1.16.19` GHOST + +did you know that every song named `GHOST` is a banger? it's true! [ghost](https://www.youtube.com/watch?v=NoUAwC4yiAw) // [ghost](https://www.youtube.com/watch?v=IKKar5SS29E) // [ghost](https://www.youtube.com/watch?v=tFSFlgm_tsw) + +## 🧪 new features + +* option to store markdown backups out-of-volume fc883418 + * the default is still a subfolder named `.hist` next to the markdown file + * `--md-hist v` puts them in the volume's hist-folder instead + * `--md-hist n` disables markdown-backups entirely +* #149 option to store the volume sqlite databases at a custom locations outside the hist-folder e1b9ac63 + * new option `--dbpath` works like `--hist` but it only moves the database file, not the thumbnails + * they can be combined, in which case `--hist` is applied to thumbnails, `--dbpath` to the db + * useful when you're squeezing every last drop of performance out of your filesystem (see the issue) +* actively prevent sharing certain databases (sessions/shares) between multiple copyparty instances acfaacbd + * an errormessage was added to explain some different alternatives for doing this safely + * for example by setting `XDG_CONFIG_HOME` which now works on all platforms b17ccc38 + +## 🩹 bugfixes + +* #151 mkdir did not work in locations outside the volume root (via symlinks) 2b50fc20 +* improve the ui feedback when trying to play an audio file which failed to transcode f9954bc4 + * also helps with server-filesystem issues, including image-thumbs + +## 🔧 other changes + +* #152 custom fonts are also applied to textboxes and buttons (thx @thaddeuskkr) d450f615 +* be more careful with the shares-db 8e0364ef +* be less careful with the sessions-db 8e0364ef +* update deps c0becc64 + * web: dompurify + * copyparty.exe: python 3.12.10 +* rephrase `-j0` warning on windows to also mention that Microsoft Defender will freak out c0becc64 +* #149 add [a script](https://github.com/9001/copyparty/tree/hovudstraum/contrib#zfs-tunepy) to optimize the sqlite databases for storage on zfs 4f397b9b +* block `GoogleOther` (another recalcitrant bot) from zip-downloads c2034f7b +* rephrase `-j0` warning on windows to also mention that Microsoft Defender will freak out c0becc64 +* update [contributing.md](https://github.com/9001/copyparty/blob/hovudstraum/CONTRIBUTING.md) with a section regarding LLM/AI-written code cec3bee0 +* the [helptext](https://ocv.me/copyparty/helptext.html) will also be uploaded to each github release from now on, [permalink](https://github.com/9001/copyparty/releases/latest/download/helptext.html) +* add review from ixbt forums b383c08c + + + ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ # 2025-0323-2216 `v1.16.18` zlib-ng diff --git a/scripts/pyinstaller/deps.sha512 b/scripts/pyinstaller/deps.sha512 index c9fd8f33..f851d0f1 100644 --- a/scripts/pyinstaller/deps.sha512 +++ b/scripts/pyinstaller/deps.sha512 @@ -27,7 +27,7 @@ ac96786e5d35882e0c5b724794329c9125c2b86ae7847f17acfc49f0d294312c6afc1c3f248655de 6df21f0da408a89f6504417c7cdf9aaafe4ed88cfa13e9b8fa8414f604c0401f885a04bbad0484dc51a29284af5d1548e33c6cc6bfb9896d9992c1b1074f332d MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl 8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl 0203ec2551c4836696cfab0b2c9fff603352f03fa36e7476e2e1ca7ec57a3a0c24bd791fcd92f342bf817f0887854d9f072e0271c643de4b313d8c9569ba8813 packaging-24.1-py3-none-any.whl -12d7921dc7dfd8a4b0ea0fa2bae8f1354fcdd59ece3d7f4e075aed631f9ba791dc142c70b1ccd1e6287c43139df1db26bd57a7a217c8da3a77326036495cdb57 pillow-11.1.0-cp312-cp312-win_amd64.whl +c9051daaf34ec934962c743a5ac2dbe55a9b0cababb693a8cde0001d24d4a50b67bd534d714d935def6ca7b898ec0a352e58bd9ccdce01c54eaf2281b18e478d pillow-11.2.1-cp312-cp312-win_amd64.whl f0463895e9aee97f31a2003323de235fed1b26289766dc0837261e3f4a594a31162b69e9adbb0e9a31e2e2d4b5f25c762ed1669553df7dc89a8ba4f85d297873 pyinstaller-6.11.1-py3-none-win_amd64.whl d550a0a14428386945533de2220c4c2e37c0c890fc51a600f626c6ca90a32d39572c121ec04c157ba3a8d6601cb021f8433d871b5c562a3d342c804fffec90c1 pyinstaller_hooks_contrib-2024.11-py3-none-any.whl 4f9a4d9f65c93e2d851e2674057343a9599f30f5dc582ffca485522237d4fcf43653b3d393ed5eb11e518c4ba93714a07134bbb13a97d421cce211e1da34682e python-3.12.10-amd64.exe diff --git a/scripts/pyinstaller/notes.txt b/scripts/pyinstaller/notes.txt index 3ee64e70..3937febe 100644 --- a/scripts/pyinstaller/notes.txt +++ b/scripts/pyinstaller/notes.txt @@ -38,7 +38,7 @@ fns=( MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl mutagen-1.47.0-py3-none-any.whl packaging-24.1-py3-none-any.whl - pillow-11.1.0-cp312-cp312-win_amd64.whl + pillow-11.2.1-cp312-cp312-win_amd64.whl pyinstaller-6.10.0-py3-none-win_amd64.whl pyinstaller_hooks_contrib-2024.8-py3-none-any.whl python-3.12.10-amd64.exe From d3f1b45ce3eea50345b94ede92828a94d3cb22b7 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 13 Apr 2025 22:32:06 +0000 Subject: [PATCH 10/10] update pkgs to 1.16.20 --- contrib/package/arch/PKGBUILD | 4 ++-- contrib/package/nix/copyparty/pin.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contrib/package/arch/PKGBUILD b/contrib/package/arch/PKGBUILD index 7849aad1..29fae693 100644 --- a/contrib/package/arch/PKGBUILD +++ b/contrib/package/arch/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: icxes pkgname=copyparty -pkgver="1.16.19" +pkgver="1.16.20" pkgrel=1 pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, FTP, TFTP, zeroconf, media indexer, thumbnails++" arch=("any") @@ -22,7 +22,7 @@ optdepends=("ffmpeg: thumbnails for videos, images (slower) and audio, music tag ) source=("https://github.com/9001/${pkgname}/releases/download/v${pkgver}/${pkgname}-${pkgver}.tar.gz") backup=("etc/${pkgname}.d/init" ) -sha256sums=("e18a4a6943d47e87c94ac0bf76006de7674ad78155608b23192e527472e59291") +sha256sums=("eec5c16bca8251467b19e1d1baff5524b03479439604c0568eacedf57dbe2a78") build() { cd "${srcdir}/${pkgname}-${pkgver}" diff --git a/contrib/package/nix/copyparty/pin.json b/contrib/package/nix/copyparty/pin.json index c9c646a0..2b8067ef 100644 --- a/contrib/package/nix/copyparty/pin.json +++ b/contrib/package/nix/copyparty/pin.json @@ -1,5 +1,5 @@ { - "url": "https://github.com/9001/copyparty/releases/download/v1.16.19/copyparty-sfx.py", - "version": "1.16.19", - "hash": "sha256-IdQdoY7uNAQ4LoBrANud9vekL/Mske57D+m6RXfwgW8=" + "url": "https://github.com/9001/copyparty/releases/download/v1.16.20/copyparty-sfx.py", + "version": "1.16.20", + "hash": "sha256-4qeJO9P7VjchSMcShRADJBIYgmCnPV7hqDhIqmvrweU=" } \ No newline at end of file