Compare commits

..

24 commits

Author SHA1 Message Date
exci 7c60adc69c
audioplayer: s-s: use clamp from util (#1313) 2026-02-25 17:07:45 +00:00
ed d3260b27a6 update pkgs to 1.20.10 2026-02-25 15:37:31 +00:00
ed e2ace1dab7 v1.20.10 2026-02-25 15:33:12 +00:00
ed a29037a0e2 warn that reload doesn't do global-options 2026-02-25 15:27:03 +00:00
ed ecdfd2d1ab fix cookie OWS; v1.20.9 broke login 2026-02-25 15:24:51 +00:00
ed 00ab7888d7 update pkgs to 1.20.9 2026-02-25 08:39:42 +00:00
ed e00e11225f v1.20.9 2026-02-25 08:34:57 +00:00
ed d21242fc62 dav-port as daw alternative 2026-02-25 08:30:41 +00:00
ed 31b2801fd0 fix GHSA-62cr-6wp5-q43h: setck xss 2026-02-25 08:29:51 +00:00
ed 9951e0333d readme: daw rephrase; closes #1305 2026-02-25 00:26:34 +00:00
ed ab8bd0178b docker: fix sftpd (ungolf); closes #1306 2026-02-23 08:13:47 +00:00
ed 7be73721fb update pkgs to 1.20.8 2026-02-22 15:13:27 +00:00
ed 1cc2c4e2fe v1.20.8 2026-02-22 15:07:22 +00:00
ed 1bec91d11c docker: no265 2026-02-22 14:31:56 +00:00
exci f5e70c7f67
audioplayer: s-s: clamp ffwd; closes #1302 (#1303)
* remove s-s fade setting;
   easier to just set this to 0.2, changing it doesn't
   make a whole lot of difference anyway

* limit s-s playback speed multi to 8;
   browsers don't play any audio if the playbackrate is
   too high or too low; on firefox, 0.15 ~ 8.0 seem to work
2026-02-21 21:25:54 +00:00
exci c2b71dab25
i18n: check/fix finnish (#1304) 2026-02-21 21:20:56 +00:00
ed 6f1d664754 tests: dks: assert parent dk not exposed 2026-02-19 17:53:32 +00:00
ed f1a433a617 audioplayer: fix s-s crash on folder change 2026-02-17 18:54:00 +00:00
ed d68028890d minify translations a little;
saves 7.4 KiB after zopfli; reduction from 343.8 to 336.4
2026-02-16 21:24:42 +00:00
ed f37c3b9608 enable hungarian translation 2026-02-16 19:11:13 +00:00
SoNaCl eefb181b33
Add Hungarian translation (#1298)
* Add Hungarian translation

---------

Signed-off-by: SoNaCl <81562723+sonacl@users.noreply.github.com>
2026-02-16 19:06:28 +00:00
Сашка724ая 5a7504fdbf
Support 4-digit chmod (#1299)
* Support 4-digit chmod octal values

---------

Signed-off-by: Aleksandr Ksenofontov <github@sashok724.net>
2026-02-16 18:06:04 +00:00
/dev/urandom c39d149378
extra esperanto tweaks (#1297) 2026-02-16 17:14:52 +00:00
ed d067d2a638 update pkgs to 1.20.7 2026-02-14 23:19:29 +00:00
63 changed files with 1499 additions and 163 deletions

4
.gitignore vendored
View file

@ -29,6 +29,10 @@ copyparty.egg-info/
copyparty/res/COPYING.txt copyparty/res/COPYING.txt
copyparty/web/deps/ copyparty/web/deps/
srv/ srv/
scripts/docker/base/b/
scripts/docker/base/cver*
scripts/docker/base/test-aac/
scripts/docker/base/whl/
scripts/docker/i/ scripts/docker/i/
scripts/deps-docker/uncomment.py scripts/deps-docker/uncomment.py
contrib/package/arch/pkg/ contrib/package/arch/pkg/

View file

@ -492,6 +492,9 @@ upgrade notes
* thumbnails are broken (you get a colorful square which says the filetype instead) * thumbnails are broken (you get a colorful square which says the filetype instead)
* you need to install `FFmpeg` or `Pillow`; see [thumbnails](#thumbnails) * you need to install `FFmpeg` or `Pillow`; see [thumbnails](#thumbnails)
* thumbnails are broken, specifically for photos and videos taken by iphones
* the [docker image](https://github.com/9001/copyparty/blob/hovudstraum/scripts/docker) and [bootable flashdrive](https://a.ocv.me/pub/stuff/edcd001/enterprise-edition/) are not able to read heif/heic images and h265/HEVC video due to [legal reasons](docs/bad-codecs.md)
* thumbnails are broken (some images appear, but other files just get a blank box, and/or the broken-image placeholder) * thumbnails are broken (some images appear, but other files just get a blank box, and/or the broken-image placeholder)
* probably due to a reverse-proxy messing with the request URLs and stripping the query parameters (`?th=w`), so check your URL rewrite rules * probably due to a reverse-proxy messing with the request URLs and stripping the query parameters (`?th=w`), so check your URL rewrite rules
* could also be due to incorrect caching settings in reverse-proxies and/or CDNs, so make sure that nothing is set to ignore the query string * could also be due to incorrect caching settings in reverse-proxies and/or CDNs, so make sure that nothing is set to ignore the query string
@ -761,8 +764,7 @@ to show `/icons/exe.png` and `/icons/elf.gif` as the thumbnail for all `.exe` an
* be careful with svg; chrome will crash if you have too many unique svg files showing on the same page (the limit is 250 or so) -- showing the same handful of svg files thousands of times is ok however * be careful with svg; chrome will crash if you have too many unique svg files showing on the same page (the limit is 250 or so) -- showing the same handful of svg files thousands of times is ok however
note: note:
* heif/heifs/heic/heics images usually require the `libvips` [optional dependency](#optional-dependencies) (available in the `iv` docker image, `withFastThumbnails` in nixos) * heif/heifs/heic/heics images usually require the `libvips` [optional dependency](#optional-dependencies) but this is not possible with the docker-images due to [legal reasons](docs/bad-codecs.md)
* technical trivia: FFmpeg has basic support for tiled heic as of v7.0; need `-show_stream_groups` for correct resolution
config file example: config file example:
@ -1438,7 +1440,7 @@ general usage:
on macos, connect from finder: on macos, connect from finder:
* [Go] -> [Connect to Server...] -> http://192.168.123.1:3923/ * [Go] -> [Connect to Server...] -> http://192.168.123.1:3923/
to upload or edit files with WebDAV clients, enable the `daw` volflag (because most WebDAV clients expect this) and give your account the delete-permission. This avoids getting several copies of the same file on the server. HOWEVER: This will also make all PUT-uploads overwrite existing files if the user has delete-access, so use with caution. to be able to edit existing files, the client must have the Delete-permission, and some webdav clients will also require the [daw](https://copyparty.eu/cli/#g-daw) volflag or global-option (not necessary if the client sends the `x-oc-mtime` header). Without `daw`, those clients will fail to modify existing files and instead create new copies with names like `notes.txt-1771978661.726032-3i9GPghL.txt`. **NOTE:** Enabling `daw` will also make all PUT-uploads overwrite existing files if the user has delete-access, so use with caution. Another alternative is the [dav-port](https://copyparty.eu/cli/#g-dav-port) option
> note: if you have enabled [IdP authentication](#identity-providers) then that may cause issues for some/most webdav clients; see [the webdav section in the IdP docs](https://github.com/9001/copyparty/blob/hovudstraum/docs/idp.md#connecting-webdav-clients) > note: if you have enabled [IdP authentication](#identity-providers) then that may cause issues for some/most webdav clients; see [the webdav section in the IdP docs](https://github.com/9001/copyparty/blob/hovudstraum/docs/idp.md#connecting-webdav-clients)

View file

@ -3,7 +3,7 @@
# NOTE: You generally shouldn't use this PKGBUILD on Arch, as it is mainly for testing purposes. Install copyparty using pacman instead. # NOTE: You generally shouldn't use this PKGBUILD on Arch, as it is mainly for testing purposes. Install copyparty using pacman instead.
pkgname=copyparty pkgname=copyparty
pkgver="1.20.6" pkgver="1.20.10"
pkgrel=1 pkgrel=1
pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++" pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++"
arch=("any") arch=("any")
@ -24,7 +24,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") source=("https://github.com/9001/${pkgname}/releases/download/v${pkgver}/${pkgname}-${pkgver}.tar.gz")
backup=("etc/${pkgname}/copyparty.conf" ) backup=("etc/${pkgname}/copyparty.conf" )
sha256sums=("c1656e07a0fd49983bb1caa93c5d5e9519a8a08b5d85e65bef3eea761ad06d30") sha256sums=("a651df2ab768ebdf2f41b7ff1e1fec788ae8a34848ce228c189f2d0f566c9fd9")
build() { build() {
cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web" cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web"

View file

@ -2,7 +2,7 @@
pkgname=copyparty pkgname=copyparty
pkgver=1.20.6 pkgver=1.20.10
pkgrel=1 pkgrel=1
pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++" pkgdesc="File server with accelerated resumable uploads, dedup, WebDAV, SFTP, FTP, TFTP, zeroconf, media indexer, thumbnails++"
arch=("any") arch=("any")
@ -21,7 +21,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") source=("https://github.com/9001/${pkgname}/releases/download/v${pkgver}/${pkgname}-${pkgver}.tar.gz")
backup=("/etc/${pkgname}.d/init" ) backup=("/etc/${pkgname}.d/init" )
sha256sums=("c1656e07a0fd49983bb1caa93c5d5e9519a8a08b5d85e65bef3eea761ad06d30") sha256sums=("a651df2ab768ebdf2f41b7ff1e1fec788ae8a34848ce228c189f2d0f566c9fd9")
build() { build() {
cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web" cd "${srcdir}/${pkgname}-${pkgver}/copyparty/web"

View file

@ -1,5 +1,5 @@
{ {
"url": "https://github.com/9001/copyparty/releases/download/v1.20.6/copyparty-1.20.6.tar.gz", "url": "https://github.com/9001/copyparty/releases/download/v1.20.10/copyparty-1.20.10.tar.gz",
"version": "1.20.6", "version": "1.20.10",
"hash": "sha256-wWVuB6D9SZg7scqpPF1elRmooItdheZb7z7qdhrQbTA=" "hash": "sha256-plHfKrdo698vQbf/Hh/seIroo0hIziKMGJ8tD1Zsn9k="
} }

View file

@ -108,6 +108,7 @@ web/tl/epo.js
web/tl/fin.js web/tl/fin.js
web/tl/fra.js web/tl/fra.js
web/tl/grc.js web/tl/grc.js
web/tl/hun.js
web/tl/ita.js web/tl/ita.js
web/tl/jpn.js web/tl/jpn.js
web/tl/kor.js web/tl/kor.js

View file

@ -1059,13 +1059,17 @@ def get_sects():
similarly, \033[33m--chmod-d\033[0m and \033[33mchmod_d\033[0m sets the directory/folder perm similarly, \033[33m--chmod-d\033[0m and \033[33mchmod_d\033[0m sets the directory/folder perm
the value is a three-digit octal number such as \033[32m755\033[0m, \033[32m750\033[0m, \033[32m644\033[0m, etc. the value is a three- or four-digit octal number such as \033[32m755\033[0m, \033[32m0644\033[0m, \033[32m2750\033[0m, etc.
first digit = "User"; permission for the unix-user if 3 digits: User, Group, Other
second digit = "Group"; permission for the unix-group if 4 digits: Special, User, Group, Other
third digit = "Other"; permission for all other users/groups
for files: "Special" digit (sum of the following):
\033[32m1\033[0m = sticky (files: n/a; dirs: files in directory can be deleted only by their owners)
\033[32m2\033[0m = setgid (files: run executable as file group; dirs: files inherit group from directory)
\033[32m4\033[0m = setuid (files: run executable as file owner; dirs: n/a)
"User", "Group", "Other" digits for files:
\033[32m0\033[0m = \033[35m---\033[0m = no access \033[32m0\033[0m = \033[35m---\033[0m = no access
\033[32m1\033[0m = \033[35m--x\033[0m = can execute the file as a program \033[32m1\033[0m = \033[35m--x\033[0m = can execute the file as a program
\033[32m2\033[0m = \033[35m-w-\033[0m = can write \033[32m2\033[0m = \033[35m-w-\033[0m = can write
@ -1075,7 +1079,7 @@ def get_sects():
\033[32m6\033[0m = \033[35mrw-\033[0m = can read and write \033[32m6\033[0m = \033[35mrw-\033[0m = can read and write
\033[32m7\033[0m = \033[35mrwx\033[0m = can read, write, execute \033[32m7\033[0m = \033[35mrwx\033[0m = can read, write, execute
for directories/folders: "User", "Group", "Other" digits for directories/folders:
\033[32m0\033[0m = \033[35m---\033[0m = no access \033[32m0\033[0m = \033[35m---\033[0m = no access
\033[32m1\033[0m = \033[35m--x\033[0m = can read files in folder but not list contents \033[32m1\033[0m = \033[35m--x\033[0m = can read files in folder but not list contents
\033[32m2\033[0m = \033[35m-w-\033[0m = n/a \033[32m2\033[0m = \033[35m-w-\033[0m = n/a
@ -1261,7 +1265,7 @@ def add_upload(ap):
ap2.add_argument("--no-fpool", action="store_true", help="disable file-handle pooling -- instead, repeatedly close and reopen files during upload (bad idea to enable this on windows and/or cow filesystems)") ap2.add_argument("--no-fpool", action="store_true", help="disable file-handle pooling -- instead, repeatedly close and reopen files during upload (bad idea to enable this on windows and/or cow filesystems)")
ap2.add_argument("--use-fpool", action="store_true", help="force file-handle pooling, even when it might be dangerous (multiprocessing, filesystems lacking sparse-files support, ...)") ap2.add_argument("--use-fpool", action="store_true", help="force file-handle pooling, even when it might be dangerous (multiprocessing, filesystems lacking sparse-files support, ...)")
ap2.add_argument("--chmod-f", metavar="UGO", type=u, default="", help="unix file permissions to use when creating files; default is probably 644 (OS-decided), see --help-chmod. Examples: [\033[32m644\033[0m] = owner-RW + all-R, [\033[32m755\033[0m] = owner-RWX + all-RX, [\033[32m777\033[0m] = full-yolo (volflag=chmod_f)") ap2.add_argument("--chmod-f", metavar="UGO", type=u, default="", help="unix file permissions to use when creating files; default is probably 644 (OS-decided), see --help-chmod. Examples: [\033[32m644\033[0m] = owner-RW + all-R, [\033[32m755\033[0m] = owner-RWX + all-RX, [\033[32m777\033[0m] = full-yolo (volflag=chmod_f)")
ap2.add_argument("--chmod-d", metavar="UGO", type=u, default="755", help="unix file permissions to use when creating directories; see --help-chmod. Examples: [\033[32m755\033[0m] = owner-RW + all-R, [\033[32m777\033[0m] = full-yolo (volflag=chmod_d)") ap2.add_argument("--chmod-d", metavar="UGO", type=u, default="755", help="unix file permissions to use when creating directories; see --help-chmod. Examples: [\033[32m755\033[0m] = owner-RW + all-R, [\033[32m2750\033[0m] = setgid + owner-RW + group-R, [\033[32m777\033[0m] = full-yolo (volflag=chmod_d)")
ap2.add_argument("--uid", metavar="N", type=int, default=-1, help="unix user-id to chown new files/folders to; default = -1 = do-not-change (volflag=uid)") ap2.add_argument("--uid", metavar="N", type=int, default=-1, help="unix user-id to chown new files/folders to; default = -1 = do-not-change (volflag=uid)")
ap2.add_argument("--gid", metavar="N", type=int, default=-1, help="unix group-id to chown new files/folders to; default = -1 = do-not-change (volflag=gid)") ap2.add_argument("--gid", metavar="N", type=int, default=-1, help="unix group-id to chown new files/folders to; default = -1 = do-not-change (volflag=gid)")
ap2.add_argument("--wram", action="store_true", help="allow uploading even if a volume is inside a ramdisk, meaning that all data will be lost on the next server reboot (volflag=wram)") ap2.add_argument("--wram", action="store_true", help="allow uploading even if a volume is inside a ramdisk, meaning that all data will be lost on the next server reboot (volflag=wram)")
@ -1478,7 +1482,7 @@ def add_ftp(ap):
def add_webdav(ap): def add_webdav(ap):
ap2 = ap.add_argument_group("WebDAV options") ap2 = ap.add_argument_group("WebDAV options")
ap2.add_argument("--daw", action="store_true", help="enable full write support, even if client may not be webdav. \033[1;31mWARNING:\033[0m This has side-effects -- PUT-operations will now \033[1;31mOVERWRITE\033[0m existing files, rather than inventing new filenames to avoid loss of data. You might want to instead set this as a volflag where needed. By not setting this flag, uploaded files can get written to a filename which the client does not expect (which might be okay, depending on client)") ap2.add_argument("--daw", action="store_true", help="enable full write support, even if client may not be webdav. Some webdav clients need this option for editing existing files; not necessary for clients that send the 'x-oc-mtime' header. Regardless, the delete-permission must always be given. \033[1;31mWARNING:\033[0m This has side-effects -- PUT-operations will now \033[1;31mOVERWRITE\033[0m existing files, rather than inventing new filenames to avoid loss of data. You might want to instead set this as a volflag where needed. By not setting this flag, uploaded files can get written to a filename which the client does not expect (which might be okay, depending on client)")
ap2.add_argument("--dav-inf", action="store_true", help="allow depth:infinite requests (recursive file listing); extremely server-heavy but required for spec compliance -- luckily few clients rely on this") ap2.add_argument("--dav-inf", action="store_true", help="allow depth:infinite requests (recursive file listing); extremely server-heavy but required for spec compliance -- luckily few clients rely on this")
ap2.add_argument("--dav-mac", action="store_true", help="disable apple-garbage filter -- allow macos to create junk files (._* and .DS_Store, .Spotlight-*, .fseventsd, .Trashes, .AppleDouble, __MACOS)") ap2.add_argument("--dav-mac", action="store_true", help="disable apple-garbage filter -- allow macos to create junk files (._* and .DS_Store, .Spotlight-*, .fseventsd, .Trashes, .AppleDouble, __MACOS)")
ap2.add_argument("--dav-rt", action="store_true", help="show symlink-destination's lastmodified instead of the link itself; always enabled for recursive listings (volflag=davrt)") ap2.add_argument("--dav-rt", action="store_true", help="show symlink-destination's lastmodified instead of the link itself; always enabled for recursive listings (volflag=davrt)")

View file

@ -1,8 +1,8 @@
# coding: utf-8 # coding: utf-8
VERSION = (1, 20, 7) VERSION = (1, 20, 10)
CODENAME = "sftp is fine too" CODENAME = "sftp is fine too"
BUILD_DT = (2026, 2, 14) BUILD_DT = (2026, 2, 25)
S_VERSION = ".".join(map(str, VERSION)) S_VERSION = ".".join(map(str, VERSION))
S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT) S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)

View file

@ -2476,8 +2476,8 @@ class AuthSrv(object):
if not zs: if not zs:
vol.flags.pop(k, None) vol.flags.pop(k, None)
continue continue
if not re.match("^[0-7]{3}$", zs): if not re.match("^[0-7]{3,4}$", zs):
t = "config-option '%s' must be a three-digit octal value such as [755] or [644] but the value was [%s]" t = "config-option '%s' must be a three- or four-digit octal value such as [0755] or [644] but the value was [%s]"
t = t % (k, zs) t = t % (k, zs)
self.log(t, 1) self.log(t, 1)
raise Exception(t) raise Exception(t)

View file

@ -178,6 +178,7 @@ RE_HTTP1 = re.compile(r"(GET|HEAD|POST|PUT) [^ ]+ HTTP/1.1$")
RE_HR = re.compile(r"[<>\"'&]") RE_HR = re.compile(r"[<>\"'&]")
RE_MDV = re.compile(r"(.*)\.([0-9]+\.[0-9]{3})(\.[Mm][Dd])$") RE_MDV = re.compile(r"(.*)\.([0-9]+\.[0-9]{3})(\.[Mm][Dd])$")
RE_RSS_KW = re.compile(r"(\{[^} ]+\})") RE_RSS_KW = re.compile(r"(\{[^} ]+\})")
RE_SETCK = re.compile(r"[^0-9a-z=]")
UPARAM_CC_OK = set("doc move tree".split()) UPARAM_CC_OK = set("doc move tree".split())
@ -649,8 +650,8 @@ class HttpCli(object):
if len(zso) > self.args.cookie_cmax: if len(zso) > self.args.cookie_cmax:
self.loud_reply("cookie header too big", status=400) self.loud_reply("cookie header too big", status=400)
return False return False
zsll = [x.split("=", 1) for x in zso.split(";") if "=" in x] zsll = [x.lstrip().split("=", 1) for x in zso.split(";") if "=" in x]
cookies = {k.strip(): unescape_cookie(zs) for k, zs in zsll} cookies = {k.rstrip(): unescape_cookie(zs.strip(), k) for k, zs in zsll}
cookie_pw = cookies.get("cppws" if self.is_https else "cppwd") or "" cookie_pw = cookies.get("cppws" if self.is_https else "cppwd") or ""
if "b" in cookies and "b" not in uparam: if "b" in cookies and "b" not in uparam:
uparam["b"] = cookies["b"] uparam["b"] = cookies["b"]
@ -2575,6 +2576,10 @@ class HttpCli(object):
vfs.flags.get("daw") vfs.flags.get("daw")
or "replace" in self.headers or "replace" in self.headers
or "x-oc-mtime" in self.headers or "x-oc-mtime" in self.headers
or (
self.args.dav_port
and self.args.dav_port == self.s.getsockname()[1]
)
) )
) or ( ) or (
not bos.path.exists(os.path.join(fdir, tnam)) not bos.path.exists(os.path.join(fdir, tnam))
@ -5628,7 +5633,10 @@ class HttpCli(object):
return True return True
def setck(self) -> bool: def setck(self) -> bool:
k, v = self.uparam["setck"].split("=", 1) zs = self.uparam["setck"]
if len(zs) > 9 or RE_SETCK.search(zs):
raise Pebkac(400, "illegal value")
k, v = zs.split("=")
t = 0 if v in ("", "x") else 86400 * 299 t = 0 if v in ("", "x") else 86400 * 299
ck = gencookie(k, v, self.args.R, True, False, t) ck = gencookie(k, v, self.args.R, True, False, t)
self.out_headerlist.append(("Set-Cookie", ck)) self.out_headerlist.append(("Set-Cookie", ck))

View file

@ -1439,7 +1439,7 @@ class SvcHub(object):
self.log("root", "ssdp startup failed;\n" + min_ex(), 3) self.log("root", "ssdp startup failed;\n" + min_ex(), 3)
def reload(self, rescan_all_vols: bool, up2k: bool) -> str: def reload(self, rescan_all_vols: bool, up2k: bool) -> str:
t = "config has been reloaded" t = "users, volumes, and volflags have been reloaded"
with self.reload_mutex: with self.reload_mutex:
self.log("root", "reloading config") self.log("root", "reloading config")
self.asrv.reload(9 if up2k else 4) self.asrv.reload(9 if up2k else 4)
@ -1449,6 +1449,7 @@ class SvcHub(object):
t += "; volumes are now reinitializing" t += "; volumes are now reinitializing"
else: else:
self.log("root", "reload done") self.log("root", "reload done")
t += "\n\nchanges to global options (if any) require a restart of copyparty to take effect"
self.broker.reload() self.broker.reload()
return t return t

View file

@ -6,6 +6,7 @@ import io
import logging import logging
import os import os
import re import re
import shlex
import shutil import shutil
import subprocess as sp import subprocess as sp
import tempfile import tempfile
@ -554,11 +555,12 @@ class ThumbSrv(object):
conv_ok = True conv_ok = True
break break
except Exception as ex: except Exception as ex:
r321 = getattr(ex, "returncode", 0) == 321
msg = "%s could not create thumbnail of %r\n%s" msg = "%s could not create thumbnail of %r\n%s"
msg = msg % (fun.__name__, abspath, min_ex()) msg = msg % (fun.__name__, abspath, ex if r321 else min_ex())
c: Union[str, int] = 1 if "<Signals.SIG" in msg else "90" c: Union[str, int] = 1 if "<Signals.SIG" in msg else "90"
self.log(msg, c) self.log(msg, c)
if getattr(ex, "returncode", 0) != 321: if not r321:
if fun == funs[-1]: if fun == funs[-1]:
try: try:
with open(ttpath, "wb") as _: with open(ttpath, "wb") as _:
@ -826,7 +828,13 @@ class ThumbSrv(object):
c: Union[str, int] = "90" c: Union[str, int] = "90"
t = "FFmpeg failed (probably a corrupt file):\n" t = "FFmpeg failed (probably a corrupt file):\n"
if (
if "but no decoder found for: hevc" in serr:
t = "thumbnail cannot be created due to legal reasons; https://github.com/9001/copyparty/blob/hovudstraum/docs/bad-codecs.md \033[0;90m\n"
ret = 321
c = 3
elif (
(not self.args.th_ff_jpg or time.time() - int(self.args.th_ff_jpg) < 60) (not self.args.th_ff_jpg or time.time() - int(self.args.th_ff_jpg) < 60)
and cmd[-1].lower().endswith(b".webp") and cmd[-1].lower().endswith(b".webp")
and ( and (
@ -841,7 +849,7 @@ class ThumbSrv(object):
ret = 321 ret = 321
c = 1 c = 1
if ( elif (
not self.args.th_ff_swr or time.time() - int(self.args.th_ff_swr) < 60 not self.args.th_ff_swr or time.time() - int(self.args.th_ff_swr) < 60
) and ( ) and (
"Requested resampling engine is unavailable" in serr "Requested resampling engine is unavailable" in serr
@ -860,7 +868,12 @@ class ThumbSrv(object):
if len(txt) > 5000: if len(txt) > 5000:
txt = txt[:2500] + "...\nff: [...]\nff: ..." + txt[-2500:] txt = txt[:2500] + "...\nff: [...]\nff: ..." + txt[-2500:]
self.log(t + txt, c=c) try:
zs = shlex.join([x.decode("utf-8", "replace") for x in cmd])
except:
zs = "'" + (b"' '".join(cmd2)).decode("utf-8", "replace") + "'"
self.log("%scmd: %s\n%s" % (t, zs, txt), c=c)
raise sp.CalledProcessError(ret, (cmd[0], b"...", cmd[-1])) raise sp.CalledProcessError(ret, (cmd[0], b"...", cmd[-1]))
def conv_waves(self, abspath: str, tpath: str, fmt: str, vn: VFS) -> None: def conv_waves(self, abspath: str, tpath: str, fmt: str, vn: VFS) -> None:

View file

@ -3439,8 +3439,10 @@ def rmdirs_up(top: str, stop: str) -> tuple[list[str], list[str]]:
return [top] + ok, ng return [top] + ok, ng
def unescape_cookie(orig: str) -> str: def unescape_cookie(orig: str, name: str) -> str:
# mw=idk; doot=qwe%2Crty%3Basd+fgh%2Bjkl%25zxc%26vbn # qwe,rty;asd fgh+jkl%zxc&vbn # mw=idk; doot=qwe%2Crty%3Basd+fgh%2Bjkl%25zxc%26vbn # qwe,rty;asd fgh+jkl%zxc&vbn
if not name.startswith("cppw"):
orig = orig[:3]
ret = [] ret = []
esc = "" esc = ""
for ch in orig: for ch in orig:

View file

@ -6,6 +6,11 @@ pk: $(addsuffix .gz, $(wildcard tl/*.js *.js *.css) \
a/webdav-cfg.txt ) a/webdav-cfg.txt )
un: $(addsuffix .un, $(wildcard tl/*.gz *.gz a/*.gz)) un: $(addsuffix .un, $(wildcard tl/*.gz *.gz a/*.gz))
tl/%.js.gz: tl/%.js
./Makefile.s1 <$< | pigz -c11 -J 34 -I 573 >$@
touch -r $< $@
rm $<
%.gz: % %.gz: %
pigz -c11 -J 34 -I 573 <$< >$@ pigz -c11 -J 34 -I 573 <$< >$@
touch -r $< $@ touch -r $< $@

1
copyparty/web/Makefile.s1 Executable file
View file

@ -0,0 +1 @@
sed -r 's/^\t+//;s/^"([a-zA-Z][a-zA-Z0-9_]*)": /\1:/; /^\/\//d; s/([^\]["'\''],) *\/\/.*/\1/; /^$/d'

View file

@ -332,8 +332,7 @@ if (1)
"mt_ssvt": "volume threshold (0-255)\">vol", "mt_ssvt": "volume threshold (0-255)\">vol",
"mt_ssts": "active threshold (% of track, start)\">start", "mt_ssts": "active threshold (% of track, start)\">start",
"mt_sste": "active threshold (% of track, end)\">end", "mt_sste": "active threshold (% of track, end)\">end",
"mt_ssrt": "volume/speed ramp up/down time\">fade", "mt_sssm": "playback speed multiplier (range: 0.15 to 8)\">ffwd",
"mt_sssm": "playback speed multiplier\">ffwd",
"mb_play": "play", "mb_play": "play",
"mm_hashplay": "play this audio file?", "mm_hashplay": "play this audio file?",
@ -691,6 +690,7 @@ var LANGN = [
["fin", "Suomi"], ["fin", "Suomi"],
["fra", "français"], ["fra", "français"],
["grc", "Ελληνικά"], ["grc", "Ελληνικά"],
["hun", "Magyar"],
["ita", "Italiano"], ["ita", "Italiano"],
["jpn", "日本語"], ["jpn", "日本語"],
["kor", "한국어"], ["kor", "한국어"],
@ -2717,8 +2717,8 @@ var afilt = (function () {
"drcv": [-24, 30, 12, 0.01, 0.25], "drcv": [-24, 30, 12, 0.01, 0.25],
"drch": ['tresh', 'knee', 'ratio', 'atk', 'rls'], "drch": ['tresh', 'knee', 'ratio', 'atk', 'rls'],
"drck": ['threshold', 'knee', 'ratio', 'attack', 'release'], "drck": ['threshold', 'knee', 'ratio', 'attack', 'release'],
"sscl": [L.mt_ssvt, L.mt_ssts, L.mt_sste, L.mt_ssrt, L.mt_sssm], "sscl": [L.mt_ssvt, L.mt_ssts, L.mt_sste, L.mt_sssm],
"sscv": [1, 5, 5, 5.0, 0.2], "sscv": [1, 5, 5, 5.0],
"drcn": null, "drcn": null,
"filters": [], "filters": [],
"filterskip": [], "filterskip": [],
@ -2887,9 +2887,9 @@ var afilt = (function () {
} }
function add_ss() { function add_ss() {
r.filters.push(mp.ssg = actx.createGain()); r.filters.push(afilt.ssg = actx.createGain());
r.filters.push(mp.ssa = actx.createAnalyser()); r.filters.push(afilt.ssa = actx.createAnalyser());
mp.ssa.fftSize = 256; afilt.ssa.fftSize = 256;
} }
function add_eq() { function add_eq() {
@ -10034,15 +10034,15 @@ var mpss = (function() {
var r = {}, config, ssint, npaint = 0; var r = {}, config, ssint, npaint = 0;
r.load = function () { r.load = function () {
if (!mp || !mp.ssg) if (!afilt.ssg)
return false; return false;
config = { config = {
vthresh: afilt.sscv[0], vthresh: afilt.sscv[0],
sthresh: afilt.sscv[1], sthresh: afilt.sscv[1],
etresh: afilt.sscv[2], etresh: afilt.sscv[2],
sspeed: afilt.sscv[3], sspeed: clamp(afilt.sscv[3], 0.15, 8.0),
rspeed: afilt.sscv[4], rspeed: 0.2,
loopInterval: 25, loopInterval: 25,
}; };
return true; return true;
@ -10057,7 +10057,7 @@ var mpss = (function() {
clearInterval(ssint); clearInterval(ssint);
ssint = null; ssint = null;
if (!mp) return; if (!mp) return;
if (mp.ssg) mp.ssg.gain.value = 1.0; if (afilt.ssg) afilt.ssg.gain.value = 1.0;
if (mp.au && mp.au._ss) mp.au.playbackRate = 1.0; if (mp.au && mp.au._ss) mp.au.playbackRate = 1.0;
if (mp.au2 && mp.au2._ss) mp.au2.playbackRate = 1.0; if (mp.au2 && mp.au2._ss) mp.au2.playbackRate = 1.0;
}; };
@ -10066,6 +10066,7 @@ var mpss = (function() {
var ae = mp.au; var ae = mp.au;
ae._ss = true; ae._ss = true;
var gain = afilt.ssg.gain;
var duration = ae.duration || 0; var duration = ae.duration || 0;
var slimit = duration * (config.sthresh / 100); var slimit = duration * (config.sthresh / 100);
@ -10077,7 +10078,7 @@ var mpss = (function() {
var is_silent = false; var is_silent = false;
if (in_limits) { if (in_limits) {
var analyser = mp.ssa; var analyser = afilt.ssa;
var da = new Uint8Array(analyser.frequencyBinCount); var da = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(da); analyser.getByteFrequencyData(da);
@ -10102,12 +10103,12 @@ var mpss = (function() {
if (Math.abs(ae.playbackRate - tspeed) > 0.01) { if (Math.abs(ae.playbackRate - tspeed) > 0.01) {
ae.playbackRate += (tspeed - ae.playbackRate) * config.rspeed; ae.playbackRate += (tspeed - ae.playbackRate) * config.rspeed;
} }
if (Math.abs(mp.ssg.gain.value - tvol) > 0.01) { if (Math.abs(gain.value - tvol) > 0.01) {
mp.ssg.gain.value += (tvol - mp.ssg.gain.value) * config.rspeed; gain.value += (tvol - gain.value) * config.rspeed;
} }
} else { } else {
ae.playbackRate = 1.0; ae.playbackRate = 1.0;
mp.ssg.gain.value = 1.0; gain.value = 1.0;
} }
} }

View file

@ -325,7 +325,6 @@ Ls.chi = {
"mt_ssvt": "音量阈值 (0-255)\">音量", //m "mt_ssvt": "音量阈值 (0-255)\">音量", //m
"mt_ssts": "活动阈值 (曲目百分比,开始)\">开始", //m "mt_ssts": "活动阈值 (曲目百分比,开始)\">开始", //m
"mt_sste": "活动阈值 (曲目百分比,结束)\">结束", //m "mt_sste": "活动阈值 (曲目百分比,结束)\">结束", //m
"mt_ssrt": "音量/速度 渐变时间\">攻", //m
"mt_sssm": "播放速度倍率\">快进", //m "mt_sssm": "播放速度倍率\">快进", //m
"mb_play": "播放", "mb_play": "播放",

View file

@ -329,7 +329,6 @@ Ls.cze = {
"mt_ssvt": "prahová hlasitost (0-255)\">hl", //m "mt_ssvt": "prahová hlasitost (0-255)\">hl", //m
"mt_ssts": "aktivní práh (% stopy, začátek)\">zač", //m "mt_ssts": "aktivní práh (% stopy, začátek)\">zač", //m
"mt_sste": "aktivní práh (% stopy, konec)\">kon", //m "mt_sste": "aktivní práh (% stopy, konec)\">kon", //m
"mt_ssrt": "doba náběhu/útlumu hlasitosti/rychlosti\">fade", //m
"mt_sssm": "násobič rychlosti přehrávání\">rych", //m "mt_sssm": "násobič rychlosti přehrávání\">rych", //m
"mb_play": "přehrát", "mb_play": "přehrát",

View file

@ -325,7 +325,6 @@ Ls.deu = {
"mt_ssvt": "Lautstärkeschwelle (0-255)\">laut", //m "mt_ssvt": "Lautstärkeschwelle (0-255)\">laut", //m
"mt_ssts": "Aktiv-Schwelle (% Titel, Anfang)\">anf", //m "mt_ssts": "Aktiv-Schwelle (% Titel, Anfang)\">anf", //m
"mt_sste": "Aktiv-Schwelle (% Titel, Ende)\">end", //m "mt_sste": "Aktiv-Schwelle (% Titel, Ende)\">end", //m
"mt_ssrt": "Ein/Ausblendzeit Lautstärke/Geschwindigkeit\">fade", //m
"mt_sssm": "Wiedergabegeschwindigkeits-Multiplikator\">vor", //m "mt_sssm": "Wiedergabegeschwindigkeits-Multiplikator\">vor", //m
"mb_play": "Abspielen", "mb_play": "Abspielen",

View file

@ -114,7 +114,7 @@ Ls.epo = {
"login": "Ensaluti", "login": "Ensaluti",
"access": " atingo", "access": " atingo",
"ot_close": "fermi submenuon", "ot_close": "fermi submenuon",
"ot_search": "`serĉi dosierojn per atributoj, indiko / nomo, etikedoj de muziko aŭ ĉiu kombinaĵo de tiuj parametroj$N$N`foo bar` = devas enhavi ambaŭ «foo» kaj «bar»,$N`foo -bar` = devas enhavi «foo», sed ne «bar»,$N`^yana .opus$` = komenci per «yana» kaj esti dosieron de formato «opus»$N`&quot;try unite&quot;` = enhavi precipe «try unite»$N$Nformato de datoj estas iso-8601, ekzemple$N`2009-12-31` aŭ `2020-09-12 23:30:00`", "ot_search": "`serĉi dosierojn per atributoj, indiko / nomo, etikedoj de muziko aŭ ĉiu kombinaĵo de tiuj parametroj$N$N`foo bar` = devas enhavi ambaŭ «foo» kaj «bar»,$N`foo -bar` = devas enhavi «foo», sed ne «bar»,$N`^yana .opus$` = komenci per «yana» kaj esti dosiero de formato «opus»$N`&quot;try unite&quot;` = enhavi precipe «try unite»$N$Nformato de datoj estas iso-8601, ekzemple$N`2009-12-31` aŭ `2020-09-12 23:30:00`",
"ot_unpost": "unpost: forigi viaj plej lastaj alŝutoj, aŭ ĉesigi nefinigitajn", "ot_unpost": "unpost: forigi viaj plej lastaj alŝutoj, aŭ ĉesigi nefinigitajn",
"ot_bup": "bup: fundamenta alŝutilo, funkias eĉ kun netscape 4.0", "ot_bup": "bup: fundamenta alŝutilo, funkias eĉ kun netscape 4.0",
"ot_mkdir": "mkdir: krei novan dosierujon", "ot_mkdir": "mkdir: krei novan dosierujon",
@ -227,8 +227,8 @@ Ls.epo = {
"ct_thumb": 'dum krado-vido, baskuli montradon de simboloj aŭ bildetoj$NFulmoklavo: T">🖼️ bildetoj', "ct_thumb": 'dum krado-vido, baskuli montradon de simboloj aŭ bildetoj$NFulmoklavo: T">🖼️ bildetoj',
"ct_csel": 'uzi STIR kaj MAJ por elekti dosierojn en krado-vido">elekto', "ct_csel": 'uzi STIR kaj MAJ por elekti dosierojn en krado-vido">elekto',
"ct_dsel": 'uzi tren-elekton en krado-vido">treni', "ct_dsel": 'uzi tren-elekton en krado-vido">treni',
"ct_dl": 'devigi elŝuton (ne montri enkadre), kiam dosiero estas alklakita">dl', "ct_dl": 'devigi elŝuton (ne montri enkadre), kiam dosiero estas alklakita">elŝuti',
"ct_ihop": 'montri la lastan viditan bildo-dosieron post fermado de bildo-vidilo">g⮯', "ct_ihop": 'rulumi al la lasta vidita bildo-dosiero post fermado de bildo-vidilo">🖼️⮯',
"ct_dots": 'montri kaŝitajn dosierojn (se servilo permesas)">kaŝitaj', "ct_dots": 'montri kaŝitajn dosierojn (se servilo permesas)">kaŝitaj',
"ct_qdel": 'peti konfirmon nur unufoje antaŭ forigado">rapid-forig.', "ct_qdel": 'peti konfirmon nur unufoje antaŭ forigado">rapid-forig.',
"ct_dir1st": 'ordigi dosierujojn antaŭ dosieroj">📁 unue', "ct_dir1st": 'ordigi dosierujojn antaŭ dosieroj">📁 unue',
@ -291,10 +291,10 @@ Ls.epo = {
"mt_aplay": "ludi aŭtomate, se ligilo enhavas identigilon de kanto$N$Nmalŝaltado de ĉi tiu agordo ankaŭ malŝaltas ĝisdatigadon de paĝ-adreso, por ke ludado ne rekomenciĝas, se la paĝo estos poste malfermita sen aliaj agordoj\">a▶", "mt_aplay": "ludi aŭtomate, se ligilo enhavas identigilon de kanto$N$Nmalŝaltado de ĉi tiu agordo ankaŭ malŝaltas ĝisdatigadon de paĝ-adreso, por ke ludado ne rekomenciĝas, se la paĝo estos poste malfermita sen aliaj agordoj\">a▶",
"mt_preload": "komenci ŝargadon de sekva kanto antaŭ la fino de la nuna, por kontinua ludado\">antaŭŝarg.", "mt_preload": "komenci ŝargadon de sekva kanto antaŭ la fino de la nuna, por kontinua ludado\">antaŭŝarg.",
"mt_prescan": "eniri la sekvan dosierujon antaŭ la fino de la lasta kanto, $Npor ke la retumilo ne interrompis la ludadon\">nav", "mt_prescan": "eniri la sekvan dosierujon antaŭ la fino de la lasta kanto, $Npor ke la retumilo ne interrompis la ludadon\">nav",
"mt_fullpre": "antaŭŝargi la tutan kanton;$N✅ ŝalti por <b>malaltkvalitaj</b> konektoj,$N❌ eble <b>malŝalti</b> por malrapidaj konektoj\">full", "mt_fullpre": "antaŭŝargi la tutan kanton;$N✅ ŝalti por <b>malaltkvalitaj</b> konektoj,$N❌ eble <b>malŝalti</b> por malrapidaj konektoj\">tute",
"mt_fau": "por poŝtelefonoj: komenci sekvan kanton, eĉ se ĝi ne estis tute ŝargita (povas difektigi la montradon de muzikaĵ-etikedoj)\">☕️", "mt_fau": "por poŝtelefonoj: komenci sekvan kanton, eĉ se ĝi ne estis tute ŝargita (povas difektigi la montradon de muzikaĵ-etikedoj)\">☕️",
"mt_waves": "bildigo:$Nmontri amplitudon de ludanta kanto en ludadbreto\">~", "mt_waves": "bildigo:$Nmontri amplitudon de ludanta kanto en ludadbreto\">~",
"mt_npclip": "montri butonojn por kopiado de ludanta kanto\">/np", "mt_npclip": "montri butonojn por kopiado de ludanta kanto\">/np", //ne tradukita: "/np" estas referenco al komando, uzata en IRC-babilejoj
"mt_m3u_c": "montri butonojn por kopiado de elektitaj kantoj kiel m3u8-ludlisto\">📻", "mt_m3u_c": "montri butonojn por kopiado de elektitaj kantoj kiel m3u8-ludlisto\">📻",
"mt_octl": "integrado kun operaciumo (medio-klavoj kaj montriloj)\">integr.", "mt_octl": "integrado kun operaciumo (medio-klavoj kaj montriloj)\">integr.",
"mt_oseek": "movi tra kanto per operaciumaj stiriloj$N$Nnoto: en iuj komputiloj (iPhone),$N ĉi tiu agordo anstataŭigas la butonon de sekva kanto\">movado", "mt_oseek": "movi tra kanto per operaciumaj stiriloj$N$Nnoto: en iuj komputiloj (iPhone),$N ĉi tiu agordo anstataŭigas la butonon de sekva kanto\">movado",
@ -321,11 +321,10 @@ Ls.epo = {
"mt_tint": "travideblo (0-100) de ludadbreto$Nvi povas ŝanĝi ĝin, se ĝi aspektas tro distre dum ŝargado", "mt_tint": "travideblo (0-100) de ludadbreto$Nvi povas ŝanĝi ĝin, se ĝi aspektas tro distre dum ŝargado",
"mt_eq": "`ŝaltas ekvalizilon kaj stirilon de plifortigado;$N$Nboost (plifortigado) `0` = senmodifa 100%a laŭteco$N$Nwidth (larĝo) `1 &nbsp;` = senmodifa dukanala sono$Nwidth (larĝo) `0.5` = 50% miksado inter maldekstra kaj dekstra kanaloj$Nwidth (larĝo) `0 &nbsp;` = unukanala sono$N$Nboost `-0.8` &amp; width `10` = senvokigo :^)$N$Nŝaltita ekvalizilo ankaŭ forigas paŭzojn inter muzikaĵoj en senpaŭzaj albumoj, agordi ĉion kiel 0 (sed 'width' kiel 1), se vi volas nur tion", "mt_eq": "`ŝaltas ekvalizilon kaj stirilon de plifortigado;$N$Nboost (plifortigado) `0` = senmodifa 100%a laŭteco$N$Nwidth (larĝo) `1 &nbsp;` = senmodifa dukanala sono$Nwidth (larĝo) `0.5` = 50% miksado inter maldekstra kaj dekstra kanaloj$Nwidth (larĝo) `0 &nbsp;` = unukanala sono$N$Nboost `-0.8` &amp; width `10` = senvokigo :^)$N$Nŝaltita ekvalizilo ankaŭ forigas paŭzojn inter muzikaĵoj en senpaŭzaj albumoj, agordi ĉion kiel 0 (sed 'width' kiel 1), se vi volas nur tion",
"mt_drc": "ŝaltas kompresoron de dinamiko (glatigas laŭtecon de muzikaĵoj); ankaŭ ŝaltas ekvalizilon, do agordu ĉion (sed 'width') kiel 0, se vi ne volas ĝin; $N$Nplimalgrandigas laŭtecon de aŭdio super sojlo-valoro ('tresh') da dB; ĉiu proporcio-valoro ('ratio') da dB post 'tresh' 1 dB estos eligita, do implicitaj valoroj (tresh = -24, ratio = 12) faras, ke laŭteco neniam pli grandas ol -22 dB; tiel estas sendanĝera agordi 'boost'on kiel 0.8 aŭ eĉ 1.8 dum ATK = 0 kaj grandega RLS, kiel 90 (funkcias nur en Firefox, RLS estas maksimume 1 en aliaj retumiloj)$N$N(rigardu vikipedion, ĝi klariĝas pli bone)", "mt_drc": "ŝaltas kompresoron de dinamiko (glatigas laŭtecon de muzikaĵoj); ankaŭ ŝaltas ekvalizilon, do agordu ĉion (sed 'width') kiel 0, se vi ne volas ĝin; $N$Nplimalgrandigas laŭtecon de aŭdio super sojlo-valoro ('tresh') da dB; ĉiu proporcio-valoro ('ratio') da dB post 'tresh' 1 dB estos eligita, do implicitaj valoroj (tresh = -24, ratio = 12) faras, ke laŭteco neniam pli grandas ol -22 dB; tiel estas sendanĝera agordi 'boost'on kiel 0.8 aŭ eĉ 1.8 dum ATK = 0 kaj grandega RLS, kiel 90 (funkcias nur en Firefox, RLS estas maksimume 1 en aliaj retumiloj)$N$N(rigardu vikipedion, ĝi klariĝas pli bone)",
"mt_ss": "`ebligas transsalti silenton; multobligas la ludrapidon per `rap` ĉe komenco/fino de aŭdiaĵoj, kiam la laŭteco estas sub `laŭt` kaj la pozicio estas ene de la komencaj `kom`% aŭ finaj `fin`%", "mt_ss": "`ebligas transsalti silenton; multobligas la ludrapidon per `×rapid` ĉe komenco/fino de aŭdiaĵoj, kiam la laŭteco estas sub `laŭt` kaj la pozicio estas ene de la komencaj `ek%` aŭ finaj `fin%`",
"mt_ssvt": "laŭteca intervalo por silentsaltado (0-255)\">laŭt", "mt_ssvt": "maksimuma laŭtnivelo por silentsaltado (0-255)\">laŭt",
"mt_ssts": "komenca intervalo por silentsaltado (% de trakolongo)\">kom", "mt_ssts": "komenca intervalo por silentsaltado (% de trakolongo)\">ek%",
"mt_sste": "fina intervalo por silentsaltado (% de trakolongo)\">fin", "mt_sste": "fina intervalo por silentsaltado (% de trakolongo)\">fin%",
"mt_ssrt": "tempo por laŭgrada ŝanĝo de laŭteco/rapideco dum silentsaltado\">ŝanĝ⏱",
"mt_sssm": "multiplikado de ludrapideco dum silentsaltado\">×rapid", "mt_sssm": "multiplikado de ludrapideco dum silentsaltado\">×rapid",
"mb_play": "ludi", "mb_play": "ludi",

View file

@ -84,8 +84,8 @@ Ls.fin = {
["M", "sulje tekstitiedosto"], ["M", "sulje tekstitiedosto"],
["E", "muokkaa tekstitiedostoa"], ["E", "muokkaa tekstitiedostoa"],
["S", "valitse tiedosto (leikkausta/kopiointia/uudelleennimeämistä varten)"], ["S", "valitse tiedosto (leikkausta/kopiointia/uudelleennimeämistä varten)"],
["Y", "lataa tekstitiedosto"], //m ["Y", "lataa tekstitiedosto"],
["⇧ J", "kaunista json"], //m ["⇧ J", "muotoile/siisti json"],
] ]
], ],
@ -111,14 +111,14 @@ Ls.fin = {
"gou": 'ylempi hakemisto">ylös', "gou": 'ylempi hakemisto">ylös',
"gon": 'seuraava hakemisto">seur', "gon": 'seuraava hakemisto">seur',
"logout": "Kirjaudu ulos ", "logout": "Kirjaudu ulos ",
"login": "Kirjaudu sisään", //m "login": "Kirjaudu sisään",
"access": " -oikeudet", "access": " -oikeudet",
"ot_close": "sulje alavalikko", "ot_close": "sulje alavalikko",
"ot_search": "`etsi tiedostoja ominaisuuksien, tiedostopolun tai -nimen, musiikkitägien tai näiden yhdistelmän perusteella$N$N`foo bar` = täytyy sisältää sekä «foo» että «bar»,$N`foo -bar` = täytyy sisältää «foo» mutta ei «bar»,$N`^yana .opus$` = alkaa «yana» ja on «opus»-tiedosto$N`&quot;try unite&quot;` = sisältää täsmälleen «try unite»$N$Npäivämäärän muoto on iso-8601, kuten$N`2009-12-31` tai `2020-09-12 23:30:00`", "ot_search": "`etsi tiedostoja ominaisuuksien, tiedostopolun tai -nimen, musiikkitägien tai näiden yhdistelmän perusteella$N$N`foo bar` = täytyy sisältää sekä «foo» että «bar»,$N`foo -bar` = täytyy sisältää «foo» mutta ei «bar»,$N`^yana .opus$` = alkaa «yana» ja on «opus»-tiedosto$N`&quot;try unite&quot;` = sisältää täsmälleen «try unite»$N$Npäivämäärän muoto on iso-8601, kuten$N`2009-12-31` tai `2020-09-12 23:30:00`",
"ot_unpost": "unpost: poista viimeaikaiset tai keskeytä keskeneräiset lataukset", "ot_unpost": "unpost: poista viimeaikaiset tai keskeytä keskeneräiset lataukset",
"ot_bup": "bup: tiedostojen 'perus'lähetysohjelma, tukee jopa netscape 4.0", "ot_bup": "bup: tiedostojen 'perus'lähetysohjelma, tukee jopa netscape 4.0",
"ot_mkdir": "mkdir: luo uusi hakemisto", "ot_mkdir": "mkdir: luo uusi hakemisto",
"ot_md": "new-file: luo uusi tekstitiedosto", //m "ot_md": "new-file: luo uusi tekstitiedosto",
"ot_msg": "msg: lähetä viesti palvelinlokiin", "ot_msg": "msg: lähetä viesti palvelinlokiin",
"ot_mp": "mediasoittimen asetukset", "ot_mp": "mediasoittimen asetukset",
"ot_cfg": "asetukset", "ot_cfg": "asetukset",
@ -127,7 +127,7 @@ Ls.fin = {
"ot_noie": 'Suosittelemme käyttämään uudempaa selainta.', "ot_noie": 'Suosittelemme käyttämään uudempaa selainta.',
"ab_mkdir": "luo hakemisto", "ab_mkdir": "luo hakemisto",
"ab_mkdoc": "luo tekstitiedosto", //m "ab_mkdoc": "luo tekstitiedosto",
"ab_msg": "lähetä viesti palvelinlokiin", "ab_msg": "lähetä viesti palvelinlokiin",
"ay_path": "siirry hakemistoihin", "ay_path": "siirry hakemistoihin",
@ -155,7 +155,7 @@ Ls.fin = {
"ul_par": "rinnakkaislatausten lkm:", "ul_par": "rinnakkaislatausten lkm:",
"ut_rand": "satunnaisgeneroidut tiedostonimet", "ut_rand": "satunnaisgeneroidut tiedostonimet",
"ut_u2ts": "kopioi viimeksi muokattu aikaleima$Ntiedostojärjestelmästäsi palvelimelle\">📅", "ut_u2ts": "kopioi viimeksi muokattu aikaleima$Ntiedostojärjestelmästäsi palvelimelle\">📅",
"ut_ow": "korvaa olemassa olevat tiedostot palvelimella?$N🛡: ei koskaan (luo sen sijaan uuden tiedostonimen)$N🕒: korvaa jos palvelintiedosto on vanhempi kuin omasi$N♻: korvaa aina jos tiedostot ovat erilaisia$N⏭: ohita kaikki olemassa olevat tiedostot ehdottomasti", //m "ut_ow": "korvaa olemassa olevat tiedostot palvelimella?$N🛡: ei koskaan (luo sen sijaan uuden tiedostonimen)$N🕒: korvaa jos palvelintiedosto on vanhempi kuin omasi$N♻: korvaa aina jos tiedostot ovat erilaisia$N⏭: ohita kaikki olemassa olevat tiedostot ehdottomasti",
"ut_mt": "jatka muiden tiedostojen tiivisteiden laskemista latauksen aikana$N$Nkannattanee poistaa käytöstä, mikäli prosessori tai kovalevy on vanhempaa mallia", "ut_mt": "jatka muiden tiedostojen tiivisteiden laskemista latauksen aikana$N$Nkannattanee poistaa käytöstä, mikäli prosessori tai kovalevy on vanhempaa mallia",
"ut_ask": 'kysy vahvistusta ennen latauksen aloittamista">💭', "ut_ask": 'kysy vahvistusta ennen latauksen aloittamista">💭',
"ut_pot": "paranna latausnopeutta hitailla laitteilla$Nvähentämällä käyttöliittymän monimutkaisuutta", "ut_pot": "paranna latausnopeutta hitailla laitteilla$Nvähentämällä käyttöliittymän monimutkaisuutta",
@ -206,7 +206,7 @@ Ls.fin = {
"u_nav_b": '<a href="#" id="modal-ok">Tiedostoja</a><a href="#" id="modal-ng">Yksi hakemisto</a>', "u_nav_b": '<a href="#" id="modal-ok">Tiedostoja</a><a href="#" id="modal-ng">Yksi hakemisto</a>',
"cl_opts": "asetukset", "cl_opts": "asetukset",
"cl_hfsz": "tiedostokoko", //m "cl_hfsz": "tiedostokoko",
"cl_themes": "teema", "cl_themes": "teema",
"cl_langs": "kieli", "cl_langs": "kieli",
"cl_ziptype": "hakemiston pakkaustyyppi", "cl_ziptype": "hakemiston pakkaustyyppi",
@ -220,14 +220,14 @@ Ls.fin = {
"cl_reset": "palauta", "cl_reset": "palauta",
"cl_hpick": "napauta sarakeotsikoita piilottaaksesi alla olevassa taulukossa", "cl_hpick": "napauta sarakeotsikoita piilottaaksesi alla olevassa taulukossa",
"cl_hcancel": "sarakkeiden piilotus peruttu", "cl_hcancel": "sarakkeiden piilotus peruttu",
"cl_rcm": "hiiren oikean painikkeen valikko", //m "cl_rcm": "hiiren pikavalikko",
"ct_grid": '田 kuvanäkymä', "ct_grid": '田 kuvanäkymä',
"ct_ttips": '◔ ◡ ◔"> vihjelaatikot', "ct_ttips": '◔ ◡ ◔"> vihjelaatikot',
"ct_thumb": 'valitse kuvakkeiden / pienoiskuvien välillä kuvanäkymässä $NPikanäppäin: T">🖼️ pienoiskuvat', "ct_thumb": 'valitse kuvakkeiden / pienoiskuvien välillä kuvanäkymässä $NPikanäppäin: T">🖼️ pienoiskuvat',
"ct_csel": 'käytä CTRL ja SHIFT tiedostojen valintaan kuvanäkymässä">valitse', "ct_csel": 'käytä CTRL ja SHIFT tiedostojen valintaan kuvanäkymässä">valitse',
"ct_dsel": 'käytä aluevalintaa tiedostojen valintaan kuvanäkymässä">aluevalinta', "ct_dsel": 'käytä aluevalintaa tiedostojen valintaan kuvanäkymässä">aluevalinta',
"ct_dl": 'pakota lataus (älä näytä upotettuna), kun tiedostoa napsautetaan">dl', //m "ct_dl": 'pakota lataus (älä näytä upotettuna), kun tiedostoa klikataan">dl',
"ct_ihop": 'kun kuvakatselin suljetaan, vieritä alas viimeksi katsottuun tiedostoon">g⮯', "ct_ihop": 'kun kuvakatselin suljetaan, vieritä alas viimeksi katsottuun tiedostoon">g⮯',
"ct_dots": 'näytä piilotetut tiedostot (jos palvelin sallii)">piilotiedostot', "ct_dots": 'näytä piilotetut tiedostot (jos palvelin sallii)">piilotiedostot',
"ct_qdel": 'kysy vahvistusta vain kerran tiedostoja poistaessa">qdel', "ct_qdel": 'kysy vahvistusta vain kerran tiedostoja poistaessa">qdel',
@ -264,8 +264,8 @@ Ls.fin = {
"cdt_lim": "tiedostojen enimmäismäärä näytettäväksi hakemistossa", "cdt_lim": "tiedostojen enimmäismäärä näytettäväksi hakemistossa",
"cdt_ask": "sivun lopussa, sen sijaan että lataa $Nautomaattisesti lisää tiedostoja, kysy mitä tehdä", "cdt_ask": "sivun lopussa, sen sijaan että lataa $Nautomaattisesti lisää tiedostoja, kysy mitä tehdä",
"cdt_hsort": "`kuinka monta lajittelusääntöä (`,sorthref`) sisällyttää media-URL:eihin. Tämän asettaminen nollaan jättää myös huomioimatta media-linkeissä sisällytetyt lajittelusäännöt kun napsautat niitä", "cdt_hsort": "`kuinka monta lajittelusääntöä (`,sorthref`) sisällyttää media-URL:eihin. Tämän asettaminen nollaan jättää myös huomioimatta media-linkeissä sisällytetyt lajittelusäännöt kun napsautat niitä",
"cdt_ren": "ota käyttöön mukautettu valikko, tavallinen valikko on käytettävissä painamalla shift ja napsauttamalla oikealla\">aktivoi", //m "cdt_ren": "ota käyttöön mukautettu pikavalikko, tavallinen valikko on käytettävissä painamalla shift ja napsauttamalla hiiren oikeanpuoleisella painikkeella\">aktivoi",
"cdt_rdb": "näytä tavallinen oikean painikkeen valikko, kun mukautettu on jo auki ja oikeaa painiketta painetaan uudelleen\">x2", //m "cdt_rdb": "näytä tavallinen pikavalikko, kun mukautettu on jo auki ja oikeanpuoleista painiketta painetaan uudelleen\">x2",
"tt_entree": "näytä navigointipaneeli$NPikanäppäin: B", "tt_entree": "näytä navigointipaneeli$NPikanäppäin: B",
"tt_detree": "näytä linkkipolku$NPikanäppäin: B", "tt_detree": "näytä linkkipolku$NPikanäppäin: B",
@ -283,7 +283,7 @@ Ls.fin = {
"ml_tint": "sävy", "ml_tint": "sävy",
"ml_eq": "taajuuskorjain", "ml_eq": "taajuuskorjain",
"ml_drc": "dynaaminen alueen kompressori", "ml_drc": "dynaaminen alueen kompressori",
"ml_ss": "ohita hiljaisuus", //m "ml_ss": "ohita hiljaiset kohdat",
"mt_loop": "toista samaa kappaletta\">🔁", "mt_loop": "toista samaa kappaletta\">🔁",
"mt_one": "lopeta yhden toiston jälkeen\">1⃣", "mt_one": "lopeta yhden toiston jälkeen\">1⃣",
@ -312,8 +312,8 @@ Ls.fin = {
"mt_c2owa": "opus-weba, iOS 17.5:lle ja uudemmille\">owa", "mt_c2owa": "opus-weba, iOS 17.5:lle ja uudemmille\">owa",
"mt_c2caf": "opus-caf, iOS 11:lle - 17:lle\">caf", "mt_c2caf": "opus-caf, iOS 11:lle - 17:lle\">caf",
"mt_c2mp3": "käytä tätä erittäin vanhoissa laitteissa\">mp3", "mt_c2mp3": "käytä tätä erittäin vanhoissa laitteissa\">mp3",
"mt_c2flac": "paras äänenlaatu, mutta isot lataukset\">flac", //m "mt_c2flac": "paras äänenlaatu, suuremmat latauskoot\">flac",
"mt_c2wav": "pakkaamaton toisto (vielä suurempi tiedosto)\">wav", //m "mt_c2wav": "pakkaamaton toisto, suurimmat latauskoot\">wav",
"mt_c2ok": "hienoa, hyvä valinta", "mt_c2ok": "hienoa, hyvä valinta",
"mt_c2nd": "tuo ei ole suositeltu formaatti laitteellesi, mutta tee miten lystäät", "mt_c2nd": "tuo ei ole suositeltu formaatti laitteellesi, mutta tee miten lystäät",
"mt_c2ng": "laitteesi ei näytä tukevan tätä formaattia, mutta yritetään nyt silti", "mt_c2ng": "laitteesi ei näytä tukevan tätä formaattia, mutta yritetään nyt silti",
@ -321,12 +321,11 @@ Ls.fin = {
"mt_tint": "taustan taso (0-100) liukupalkissa$Ntehden puskuroinnista vähemmän häiritsevän", "mt_tint": "taustan taso (0-100) liukupalkissa$Ntehden puskuroinnista vähemmän häiritsevän",
"mt_eq": "`aktivoi taajuuskorjaimen ja vahvistussäätimen;$N$Nvahvistus `0` = normaali 100% äänenvoimakkuus (muokkaamaton)$N$Nleveys `1 &nbsp;` = normaali stereo (muokkaamaton)$Nleveys `0.5` = 50% vasen-oikea ristisyöttö$Nleveys `0 &nbsp;` = mono$N$Nvahvistus `-0.8` &amp; leveys `10` = laulun poisto :^)$N$Nequalizerin käyttöönotto tekee saumattomista albumeista täysin saumattomia, joten jätä se päälle kaikilla arvoilla nollassa (paitsi leveys = 1) jos välität siitä", "mt_eq": "`aktivoi taajuuskorjaimen ja vahvistussäätimen;$N$Nvahvistus `0` = normaali 100% äänenvoimakkuus (muokkaamaton)$N$Nleveys `1 &nbsp;` = normaali stereo (muokkaamaton)$Nleveys `0.5` = 50% vasen-oikea ristisyöttö$Nleveys `0 &nbsp;` = mono$N$Nvahvistus `-0.8` &amp; leveys `10` = laulun poisto :^)$N$Nequalizerin käyttöönotto tekee saumattomista albumeista täysin saumattomia, joten jätä se päälle kaikilla arvoilla nollassa (paitsi leveys = 1) jos välität siitä",
"mt_drc": "aktivoi dynaamisen alueen kompressorin; ottaa myös käyttöön taajuuskorjaimen tasapainottamaan spagettia, joten aseta kaikki EQ-kentät paitsi 'leveys' nollaan jos et halua sitä$N$Nalentaa äänenvoimakkuutta KYNNYS dB:n yläpuolella; jokaisesta SUHDE dB:stä KYNNYKSEN yli tulee 1 dB ulos, joten oletusarvot kynnys -24 ja suhde 12 tarkoittaa ettei sen pitäisi koskaan tulla kovempaa kuin -22 dB ja on turvallista nostaa equalizerin vahvistus 0.8:aan, tai jopa 1.8:aan ATK 0:lla ja valtavalla RLS:llä kuten 90 (toimii vain firefoxissa; RLS on max 1 muissa selaimissa)$N$N(katso wikipedia, he selittävät sen paljon paremmin)", "mt_drc": "aktivoi dynaamisen alueen kompressorin; ottaa myös käyttöön taajuuskorjaimen tasapainottamaan spagettia, joten aseta kaikki EQ-kentät paitsi 'leveys' nollaan jos et halua sitä$N$Nalentaa äänenvoimakkuutta KYNNYS dB:n yläpuolella; jokaisesta SUHDE dB:stä KYNNYKSEN yli tulee 1 dB ulos, joten oletusarvot kynnys -24 ja suhde 12 tarkoittaa ettei sen pitäisi koskaan tulla kovempaa kuin -22 dB ja on turvallista nostaa equalizerin vahvistus 0.8:aan, tai jopa 1.8:aan ATK 0:lla ja valtavalla RLS:llä kuten 90 (toimii vain firefoxissa; RLS on max 1 muissa selaimissa)$N$N(katso wikipedia, he selittävät sen paljon paremmin)",
"mt_ss": "`ottaa käyttöön hiljaisuuden ohituksen; moninkertaistaa toistonopeuden `pik` lähellä kappaleen alkua/loppua, kun äänenvoimakkuus on alle `vol` ja sijainti on ensimmäisessä `alk`% tai viimeisessä `lop`%", //m "mt_ss": "`ottaa käyttöön hiljaisuuden ohituksen; moninkertaistaa toistonopeuden `nop`:lla lähellä kappaleen alkua/loppua, kun äänenvoimakkuus on alle `vol` ja kappaleesta on kulunut vasta on `alk`% tai sitä on jäljellä enää `lop`%",
"mt_ssvt": "äänenvoimakkuuden kynnys (0-255)\">vol", //m "mt_ssvt": "äänenvoimakkuuden kynnysarvo (0-255)\">vol",
"mt_ssts": "aktiivikynnys (% kappale, alku)\">alk", //m "mt_ssts": "alkuraja (prosenttia kappaleen alusta)\">alk",
"mt_sste": "aktiivikynnys (% kappale, loppu)\">lop", //m "mt_sste": "loppuraja (prosenttia kappaleen lopusta)\">lop",
"mt_ssrt": "äänenvoim./nopeuden nousu/laskuaika\">häiv", //m "mt_sssm": "toistonopeuden kerroin (min. 0.15, max. 8))\">nop",
"mt_sssm": "toistonopeuden kerroin\">pik", //m
"mb_play": "toista", "mb_play": "toista",
"mm_hashplay": "soita tämä äänitiedosto?", "mm_hashplay": "soita tämä äänitiedosto?",
@ -343,7 +342,7 @@ Ls.fin = {
"mm_eunk": "Tuntematon virhe", "mm_eunk": "Tuntematon virhe",
"mm_e404": "Kappaletta ei voitu toistaa; virhe 404: Tiedostoa ei löydy.", "mm_e404": "Kappaletta ei voitu toistaa; virhe 404: Tiedostoa ei löydy.",
"mm_e403": "Kappaletta ei voitu toistaa; virhe 403: Pääsy kielletty.\n\nKokeile painaa F5 päivittääksesi, ehkä kirjauduit ulos", "mm_e403": "Kappaletta ei voitu toistaa; virhe 403: Pääsy kielletty.\n\nKokeile painaa F5 päivittääksesi, ehkä kirjauduit ulos",
"mm_e415": "Kappaletta ei voitu toistaa; virhe 415: Tiedoston muunnos epäonnistui; tarkista palvelinlokit.", //m "mm_e415": "Kappaletta ei voitu toistaa; virhe 415: Tiedoston muunnos epäonnistui; tarkista palvelimen lokitiedostot.",
"mm_e500": "Kappaletta ei voitu toistaa; virhe 500: Tarkista palvelinlokit.", "mm_e500": "Kappaletta ei voitu toistaa; virhe 500: Tarkista palvelinlokit.",
"mm_e5xx": "Kappaletta ei voitu toistaa; palvelinvirhe ", "mm_e5xx": "Kappaletta ei voitu toistaa; palvelinvirhe ",
"mm_nof": "ei löydy enempää äänitiedostoja lähistöltä", "mm_nof": "ei löydy enempää äänitiedostoja lähistöltä",
@ -363,7 +362,7 @@ Ls.fin = {
"f_anota": "vain {0} / {1} kohdetta valittiin;\nvalitaksesi koko hakemiston, vieritä ensin loppuun", "f_anota": "vain {0} / {1} kohdetta valittiin;\nvalitaksesi koko hakemiston, vieritä ensin loppuun",
"f_dls": 'nykyisen hakemiston tiedostolinkit on\nvaihdettu latauslinkeiksi', "f_dls": 'nykyisen hakemiston tiedostolinkit on\nvaihdettu latauslinkeiksi',
"f_dl_nd": 'ohitetaan kansio (käytä zip/tar-latausta sen sijaan):\n', //m "f_dl_nd": 'ohitetaan kansio (käytä sen sijaan zip/tar-latausta):\n',
"f_partial": "Ladataksesi turvallisesti tiedoston joka on parhaillaan latautumassa, klikkaa tiedostoa jolla on sama nimi mutta ilman <code>.PARTIAL</code> päätettä. Paina PERUUTA tai Escape tehdäksesi tämän.\n\nOK / Enter painaminen sivuuttaa tämän varoituksen ja jatkaa <code>.PARTIAL</code> väliaikaistiedoston lataamista, mikä todennäköisesti antaa sinulle vioittunutta dataa.", "f_partial": "Ladataksesi turvallisesti tiedoston joka on parhaillaan latautumassa, klikkaa tiedostoa jolla on sama nimi mutta ilman <code>.PARTIAL</code> päätettä. Paina PERUUTA tai Escape tehdäksesi tämän.\n\nOK / Enter painaminen sivuuttaa tämän varoituksen ja jatkaa <code>.PARTIAL</code> väliaikaistiedoston lataamista, mikä todennäköisesti antaa sinulle vioittunutta dataa.",
@ -432,16 +431,16 @@ Ls.fin = {
"fcc_warn": 'kopioitiin {0} kohdetta leikepöydälle\n\nmutta: vain <b>tämä</b> selain-välilehti voi liittää ne\n(koska valinta on niin valtavan suuri)', "fcc_warn": 'kopioitiin {0} kohdetta leikepöydälle\n\nmutta: vain <b>tämä</b> selain-välilehti voi liittää ne\n(koska valinta on niin valtavan suuri)',
"fp_apply": "käytä näitä nimiä", "fp_apply": "käytä näitä nimiä",
"fp_skip": "ohita ristiriidat", //m "fp_skip": "ohita ristiriitatilanteissa",
"fp_ecut": "leikkaa tai kopioi ensin joitakin tiedostoja / hakemistoja liitettäväksi / siirrettäväksi\n\nhuom: voit leikata / liittää eri selain-välilehtien välillä", "fp_ecut": "leikkaa tai kopioi ensin joitakin tiedostoja / hakemistoja liitettäväksi / siirrettäväksi\n\nhuom: voit leikata / liittää eri selain-välilehtien välillä",
"fp_ename": "{0} kohdetta ei voida siirtää tänne koska nimet ovat jo käytössä. Anna niille uudet nimet alla jatkaaksesi, tai tyhjennä nimi (\"ohita ristiriidat\") ohittaaksesi ne:", //m "fp_ename": "{0} kohdetta ei voida siirtää tänne koska nimet ovat jo käytössä. Anna niille uudet nimet alla jatkaaksesi, tai tyhjennä nimi (\"ohita ristiriitatilanteissa\") ohittaaksesi ne:",
"fcp_ename": "{0} kohdetta ei voida kopioida tänne koska nimet ovat jo käytössä. Anna niille uudet nimet alla jatkaaksesi, tai tyhjennä nimi (\"ohita ristiriidat\") ohittaaksesi ne:", //m "fcp_ename": "{0} kohdetta ei voida kopioida tänne koska nimet ovat jo käytössä. Anna niille uudet nimet alla jatkaaksesi, tai tyhjennä nimi (\"ohita ristiriitatilanteissa\") ohittaaksesi ne:",
"fp_emore": "tiedostonimien törmäyksiä on vielä korjaamatta", "fp_emore": "tiedostonimien törmäyksiä on vielä korjaamatta",
"fp_ok": "siirto OK", "fp_ok": "siirto OK",
"fcp_ok": "kopiointi OK", "fcp_ok": "kopiointi OK",
"fp_busy": "siirretään {0} kohdetta...\n\n{1}", "fp_busy": "siirretään {0} kohdetta...\n\n{1}",
"fcp_busy": "kopioidaan {0} kohdetta...\n\n{1}", "fcp_busy": "kopioidaan {0} kohdetta...\n\n{1}",
"fp_abrt": "keskeytetään...", //m "fp_abrt": "keskeytetään...",
"fp_err": "siirto epäonnistui:\n", "fp_err": "siirto epäonnistui:\n",
"fcp_err": "kopiointi epäonnistui:\n", "fcp_err": "kopiointi epäonnistui:\n",
"fp_confirm": "siirrä nämä {0} kohdetta tänne?", "fp_confirm": "siirrä nämä {0} kohdetta tänne?",
@ -454,8 +453,8 @@ Ls.fin = {
"fcp_both_b": '<a href="#" id="modal-ok">Kopioi</a><a href="#" id="modal-ng">Lähetä</a>', "fcp_both_b": '<a href="#" id="modal-ok">Kopioi</a><a href="#" id="modal-ng">Lähetä</a>',
"mk_noname": "kirjoita nimi vasemmalla olevaan tekstikenttään ennen kuin teet tuon :p", "mk_noname": "kirjoita nimi vasemmalla olevaan tekstikenttään ennen kuin teet tuon :p",
"nmd_i1": "voit myös lisätä haluamasi tiedostopäätteen, esimerkiksi <code>.md</code>", //m "nmd_i1": "voit myös lisätä haluamasi tiedostopäätteen, esimerkiksi <code>.md</code>",
"nmd_i2": "voit luoda vain <code>.{0}</code>-tiedostoja, koska sinulla ei ole poistolupaa", //m "nmd_i2": "voit luoda vain <code>.{0}</code>-tiedostoja, koska sinulla ei ole “delete”-oikeutta",
"tv_load": "Ladataan tekstidokumenttia:\n\n{0}\n\n{1}% ({2} / {3} Mt ladattu)", "tv_load": "Ladataan tekstidokumenttia:\n\n{0}\n\n{1}% ({2} / {3} Mt ladattu)",
"tv_xe1": "tekstitiedoston lataaminen epäonnistui:\n\nvirhe ", "tv_xe1": "tekstitiedoston lataaminen epäonnistui:\n\nvirhe ",
@ -466,7 +465,7 @@ Ls.fin = {
"tvt_prev": "näytä edellinen dokumentti$NPikanäppäin: i\">⬆ edell", "tvt_prev": "näytä edellinen dokumentti$NPikanäppäin: i\">⬆ edell",
"tvt_next": "näytä seuraava dokumentti$NPikanäppäin: K\">⬇ seur", "tvt_next": "näytä seuraava dokumentti$NPikanäppäin: K\">⬇ seur",
"tvt_sel": "valitse tiedosto &nbsp; ( leikkausta / kopiointia / poistoa / ... varten )$NPikanäppäin: S\">val", "tvt_sel": "valitse tiedosto &nbsp; ( leikkausta / kopiointia / poistoa / ... varten )$NPikanäppäin: S\">val",
"tvt_j": "kaunista json$NPikanäppäin: shift-J\">j", //m "tvt_j": "muotoile/siisti json$NPikanäppäin: shift-J\">j",
"tvt_edit": "avaa tiedosto tekstieditorissa$NPikanäppäin: E\">✏️ muokkaa", "tvt_edit": "avaa tiedosto tekstieditorissa$NPikanäppäin: E\">✏️ muokkaa",
"tvt_tail": "seuraa tiedoston muutoksia; näytä uudet rivit reaaliaikaisesti\">📡 seuraa", "tvt_tail": "seuraa tiedoston muutoksia; näytä uudet rivit reaaliaikaisesti\">📡 seuraa",
"tvt_wrap": "rivitys\">↵", "tvt_wrap": "rivitys\">↵",
@ -651,25 +650,25 @@ Ls.fin = {
"ur_um": "Valmis;\n{0} latausta OK,\n{1} latausta epäonnistui, pahoittelen", "ur_um": "Valmis;\n{0} latausta OK,\n{1} latausta epäonnistui, pahoittelen",
"ur_sm": "Valmis;\n{0} tiedostoa löytyi palvelimelta,\n{1} tiedostoa EI löytynyt palvelimelta", "ur_sm": "Valmis;\n{0} tiedostoa löytyi palvelimelta,\n{1} tiedostoa EI löytynyt palvelimelta",
"rc_opn": "avaa", //m "rc_opn": "avaa",
"rc_ply": "toista", //m "rc_ply": "toista",
"rc_pla": "toista äänenä", //m "rc_pla": "toista äänitiedostona",
"rc_txt": "avaa tiedostoselaimessa", //m "rc_txt": "avaa tekstinäkymässä",
"rc_md": "avaa tekstieditorissa", //m "rc_md": "avaa markdown-näkymässä",
"rc_dl": "Lataa", //m "rc_dl": "lataa",
"rc_zip": "Lataa arkistona", //m "rc_zip": "lataa arkistona",
"rc_cpl": "kopioi linkki", //m "rc_cpl": "kopioi linkki",
"rc_del": "poista", //m "rc_del": "poista",
"rc_cut": "Leikkaa", //m "rc_cut": "leikkaa",
"rc_cpy": "kopioi", //m "rc_cpy": "kopioi",
"rc_pst": "Liitä", //m "rc_pst": "liitä",
"rc_rnm": "nimeä uudelleen", //m "rc_rnm": "nimeä uudelleen",
"rc_nfo": "uusi kansio", //m "rc_nfo": "uusi kansio",
"rc_nfi": "uusi tiedosto", //m "rc_nfi": "uusi tiedosto",
"rc_sal": "valitse kaikki", //m "rc_sal": "valitse kaikki",
"rc_sin": "käännä valinta", //m "rc_sin": "käänteinen valinta",
"rc_shf": "jaa tämä kansio", //m "rc_shf": "jaa tämä kansio",
"rc_shs": "jaa valinta", //m "rc_shs": "jaa valinta",
"lang_set": "ladataanko sivu uudestaan kielen vaihtamiseksi?", "lang_set": "ladataanko sivu uudestaan kielen vaihtamiseksi?",
@ -689,11 +688,11 @@ Ls.fin = {
"j1": "k304 katkaisee yhteytesi jokaisella HTTP 304:llä, mikä voi estää joitain bugisia välityspalvelimia jumittumasta/lopettamasta sivujen lataamista, <em>mutta</em> se myös vähentää suorituskykyä", "j1": "k304 katkaisee yhteytesi jokaisella HTTP 304:llä, mikä voi estää joitain bugisia välityspalvelimia jumittumasta/lopettamasta sivujen lataamista, <em>mutta</em> se myös vähentää suorituskykyä",
"k1": "nollaa asetukset", "k1": "nollaa asetukset",
"l1": "kirjaudu sisään:", "l1": "kirjaudu sisään:",
"ls3": "kirjaudu sisään", //m "ls3": "kirjaudu sisään",
"lu4": "käyttäjätunnus", //m "lu4": "käyttäjätunnus",
"lp4": "salasana", //m "lp4": "salasana",
"lo3": "kirjaa “{0}” ulos kaikkialta", //m "lo3": "kirjaa “{0}” ulos kaikkialta",
"lo2": "tämä lopettaa istunnon kaikissa selaimissa", //m "lo2": "tämä lopettaa istunnon kaikissa selaimissa",
"m1": "tervetuloa takaisin,", "m1": "tervetuloa takaisin,",
"n1": "404: ei löytynyt mitään &nbsp;┐( ´ -`)┌", "n1": "404: ei löytynyt mitään &nbsp;┐( ´ -`)┌",
"o1": 'tai ehkä sinulla ei vain ole käyttöoikeuksia? kokeile salasanaa tai <a href="' + SR + '/?h">mene kotiin</a>', "o1": 'tai ehkä sinulla ei vain ole käyttöoikeuksia? kokeile salasanaa tai <a href="' + SR + '/?h">mene kotiin</a>',
@ -712,8 +711,8 @@ Ls.fin = {
"ta1": "täytä ensin uusi salasana", "ta1": "täytä ensin uusi salasana",
"ta2": "toista vahvistaaksesi uuden salasanan:", "ta2": "toista vahvistaaksesi uuden salasanan:",
"ta3": "löytyi kirjoitusvirhe; yritä uudelleen", "ta3": "löytyi kirjoitusvirhe; yritä uudelleen",
"nop": "VIRHE: Salasana ei voi olla tyhjä", //m "nop": "VIRHE: Salasana ei voi olla tyhjä",
"nou": "VIRHE: Käyttäjänimi ja/tai salasana ei voi olla tyhjä", //m "nou": "VIRHE: Käyttäjänimi ja/tai salasana ei voi olla tyhjä",
"aa1": "saapuvat:", "aa1": "saapuvat:",
"ab1": "poista no304 käytöstä", "ab1": "poista no304 käytöstä",
"ac1": "ota no304 käyttöön", "ac1": "ota no304 käyttöön",

View file

@ -325,7 +325,6 @@ Ls.fra = {
"mt_ssvt": "seuil de volume (0-255)\">vol", //m "mt_ssvt": "seuil de volume (0-255)\">vol", //m
"mt_ssts": "seuil actif (% piste, début)\">deb", //m "mt_ssts": "seuil actif (% piste, début)\">deb", //m
"mt_sste": "seuil actif (% piste, fin)\">fin", //m "mt_sste": "seuil actif (% piste, fin)\">fin", //m
"mt_ssrt": "temps de montée/descente volume/vitesse\">fondu", //m
"mt_sssm": "multiplicateur de vitesse de lecture\">av", //m "mt_sssm": "multiplicateur de vitesse de lecture\">av", //m
"mb_play": "lecture", "mb_play": "lecture",

View file

@ -325,7 +325,6 @@ Ls.grc = {
"mt_ssvt": "ὅριον φωνῆς (0-255)\">φων", //m "mt_ssvt": "ὅριον φωνῆς (0-255)\">φων", //m
"mt_ssts": "ἐνεργὸν ὅριον (% τροχιᾶς, ἀρχή)\">ἀρχ", //m "mt_ssts": "ἐνεργὸν ὅριον (% τροχιᾶς, ἀρχή)\">ἀρχ", //m
"mt_sste": "ἐνεργὸν ὅριον (% τροχιᾶς, τέλος)\">τελ", //m "mt_sste": "ἐνεργὸν ὅριον (% τροχιᾶς, τέλος)\">τελ", //m
"mt_ssrt": "χρόνος αὔξησης/μείωσης φωνῆς/ταχύτητος\">σβέσις", //m
"mt_sssm": "πολλαπλασιαστὴς ταχύτητος\">ταχ", //m "mt_sssm": "πολλαπλασιαστὴς ταχύτητος\">ταχ", //m
"mb_play": "παίξε", "mb_play": "παίξε",

725
copyparty/web/tl/hun.js Normal file
View file

@ -0,0 +1,725 @@
Ls.hun = {
"tt": 'Magyar',
"cols": {
"c": 'műveletek',
"dur": 'hossz',
"q": 'minőség / bitrate',
"Ac": 'audió kodek',
"Vc": 'videó kodek',
"Fmt": 'konténer',
"Ahash": 'audió hash',
"Vhash": 'videó hash',
"Res": 'felbontás',
"T": 'típus',
"aq": 'audió minőség / bitrate',
"vq": 'videó minőség / bitrate',
"pixfmt": 'színkódolás / pixel',
"resw": 'szélesség',
"resh": 'magasság',
"chs": 'csatornák',
"hz": 'mintavételezés',
},
"hks": [
[
'egyéb',
['ESC', 'minden bezárása'],
'fájlkezelő',
['G', 'lista / rács nézet'],
['T', 'ikon / indexkép váltás'],
['⇧ A/D', 'méret módosítása'],
['ctrl-K', 'kijelöltek törlése'],
['ctrl-X', 'kivágás vágólapra'],
['ctrl-C', 'másolás vágólapra'],
['ctrl-V', 'beillesztés ide'],
['Y', 'kijelöltek letöltése'],
['F2', 'átnevezés'],
'kijelölés',
['space', 'fájl kijelölése'],
['↑/↓', 'kurzor mozgatása'],
['ctrl ↑/↓', 'kurzor + nézet mozgatása'],
['⇧ ↑/↓', 'fájlok kijelölése'],
['ctrl-A', 'mindet kijelöli'],
],
[
'navigáció',
['B', 'fa / breadcrumbs váltás'],
['I/K', 'előző/következő mappa'],
['M', 'vissza a főmappába'],
['V', 'fájlok mutatása az oldalsávon'],
['A/D', 'oldalsáv mérete'],
],
[
'zenelejátszó',
['J/L', 'előző/következő szám'],
['U/O', '10 mp tekerés (vissza/előre)'],
['0..9', 'ugrás (0%..90%)'],
['P', 'play/pause'],
['S', 'épp szóló szám kijelölése'],
['Y', 'szám letöltése'],
],
[
'képnézegető',
['J/L, ←/→', 'előző/következő kép'],
['Home/End', 'első/utolsó kép'],
['F', 'teljes képernyő'],
['R', 'forgatás jobbra'],
['⇧ R', 'forgatás balra'],
['S', 'kép kijelölése'],
['Y', 'kép letöltése'],
],
[
'videólejátszó',
['U/O', '10 mp tekerés (vissza/előre)'],
['P/K/Space', 'play/pause'],
['C', 'folyamatos lejátszás'],
['V', 'ismétlés'],
['M', 'némítás'],
['[ és ]', 'ismétlési tartomány'],
],
[
'szövegszerkesztő',
['I/K', 'előző/következő fájl'],
['M', 'bezárás'],
['E', 'szerkesztés'],
['S', 'kijelöl fv művelethez'],
['Y', 'letöltés'],
['⇧ J', 'json formázás (beautify)'],
],
],
"m_ok": 'ok',
"m_ng": 'mégse',
"enable": 'bekapcsolva',
"danger": 'FIGYELEM',
"clipped": 'vágólapra másolva',
"ht_s1": 'másodperce',
"ht_s2": 'másodperce',
"ht_m1": 'perce',
"ht_m2": 'perce',
"ht_h1": 'órája',
"ht_h2": 'órája',
"ht_d1": 'napja',
"ht_d2": 'napja',
"ht_and": ' és ',
"goh": 'irányítópult',
"gop": 'előző mappába">előző',
"gou": 'szülőmappa">fel',
"gon": 'következő mappába">következő',
"logout": 'Kilépés ',
"login": 'Belépés',
"access": ' hozzáférés',
"ot_close": 'almenü bezárása',
"ot_search": '`keresés attribútumok, név, elérési út vagy metaadatok alapján$N$N`valami más` = szerepelnie kell mindkettőnek,$N`valami -más` = tartalmazza a «valami»-t, de a «más»-t nem,$N`^kezd .mp3$` = «kezd»-del induló mp3 fájlok$N`&quot;pontosan ez&quot;` = pontos egyezés$N$Ndátum formátum iso-8601, pl.$N`2024-12-31` vagy `2024-09-12 23:30:00`',
"ot_unpost": 'töröld a nemrég feltöltött fájljaidat, vagy állítsd le a folyamatban lévőket',
"ot_bup": 'bup: egyszerű feltöltő (még netscape 4-en is megy)',
"ot_mkdir": 'új mappa létrehozása',
"ot_md": 'új szöveges fájl',
"ot_msg": 'üzenet küldése a szerver logba',
"ot_mp": 'lejátszó beállításai',
"ot_cfg": 'beállítások',
"ot_u2i": 'up2k: fájlok feltöltése (ha van írási jogod) vagy keresés a szerveren$N$Nfolytatható, többszálú, dátumokat megőrzi, de CPU-éhesebb az egyszerű [🎈]-nél.<br /><br />feltöltés közben az ikon mutatja a haladást!',
"ot_u2w": 'up2k: feltöltés folytatási támogatással (böngésző bezárás után is folytathatod)$N$Ntöbbszálú, dátumokat megőrzi, de CPU-éhesebb az egyszerűnél.<br /><br />feltöltés közben az ikon mutatja a haladást!',
"ot_noie": 'Kérlek használj Chrome-ot / Firefox-ot / Edge-et',
"ab_mkdir": 'mappa létrehozása',
"ab_mkdoc": 'új szövegfájl',
"ab_msg": 'log üzenet küldése',
"ay_path": 'ugrás a mappákhoz',
"ay_files": 'ugrás a fájlokhoz',
"wt_ren": 'átnevezés$Ngyorsbillentyű: F2',
"wt_del": 'törlés$Ngyorsbillentyű: ctrl-K',
"wt_cut": 'kivágás &lt;small&gt;(beillesztéshez)&lt;/small&gt;$Ngyorsbillentyű: ctrl-X',
"wt_cpy": 'másolás vágólapra$Ngyorsbillentyű: ctrl-C',
"wt_pst": 'beillesztés$Ngyorsbillentyű: ctrl-V',
"wt_selall": 'összes kijelölése$Ngyorsbillentyű: ctrl-A',
"wt_selinv": 'kijelölés megfordítása',
"wt_zip1": 'mappa letöltése zip/tar-ként',
"wt_selzip": 'kijelöltek letöltése archívumként',
"wt_seldl": 'kijelöltek letöltése külön fájlokként$Ngyorsbillentyű: Y',
"wt_npirc": 'irc-formátumú infó másolása',
"wt_nptxt": 'egyszerű szöveges infó másolása',
"wt_m3ua": 'hozzáadás m3u listához (később <code>📻másolás</code>)',
"wt_m3uc": 'm3u lista másolása vágólapra',
"wt_grid": 'lista / rács nézet váltás$Ngyorsbillentyű: G',
"wt_prev": 'előző szám$Ngyorsbillentyű: J',
"wt_play": 'lejátszás / szünet$Ngyorsbillentyű: P',
"wt_next": 'következő szám$Ngyorsbillentyű: L',
"ul_par": 'párhuzamos szálak:',
"ut_rand": 'véletlen fájlnevek',
"ut_u2ts": 'helyi dátumok$Nátvitele a szerverre">📅',
"ut_ow": 'felülírás?$N🛡: soha (új nevet ad)$N🕒: csak ha a tiéd újabb$N♻: mindig, ha más a tartalom$N⏭: létezőket kihagy',
"ut_mt": 'háttérben hashelés feltöltés alatt$N$Nkapcsold ki, ha fagy a géped',
"ut_ask": 'megerősítés feltöltés előtt">💭',
"ut_pot": 'feltöltés gyorsítása (egyszerűbb UI)',
"ut_srch": 'csak létezés ellenőrzése$N(nem tölt fel semmit)',
"ut_par": '0 = szünet$N$Nnöveld, ha lassú a net$N$NHDD limit vagy LAN esetén hagyd 1-en',
"ul_btn": 'dobd ide a fájlokat/mappákat<br>(vagy kattints)',
"ul_btnu": 'F E L T Ö L T É S',
"ul_btns": 'K E R E S É S',
"ul_hash": 'hash',
"ul_send": 'küldés',
"ul_done": 'kész',
"ul_idle1": 'nincs várakozó feltöltés',
"ut_etah": 'átlagos &lt;em&gt;hashelési&lt;/em&gt; sebesség és becsült idő',
"ut_etau": 'átlagos &lt;em&gt;feltöltési&lt;/em&gt; sebesség és becsült idő',
"ut_etat": 'átlagos &lt;em&gt;össz&lt;/em&gt; sebesség és becsült idő',
"uct_ok": 'sikerült',
"uct_ng": 'hiba / elutasítva',
"uct_done": 'összesen',
"uct_bz": 'hashelés vagy feltöltés...',
"uct_q": 'várakozik',
"utl_name": 'fájlnév',
"utl_ulist": 'lista',
"utl_ucopy": 'másolás',
"utl_links": 'linkek',
"utl_stat": 'státusz',
"utl_prog": 'haladás',
"utl_404": '404',
"utl_err": 'HIBA',
"utl_oserr": 'OS-hiba',
"utl_found": 'megvan',
"utl_defer": 'halasztva',
"utl_yolo": 'YOLO',
"utl_done": 'kész',
"ul_flagblk": 'fájlok a várólistán</b><br>egy másik lapon már fut egy feltöltés,<br>megvárjuk, amíg az végez',
"ul_btnlk": 'szerveroldali korlátozás miatt nem módosítható',
"udt_up": 'Feltöltés',
"udt_srch": 'Keresés',
"udt_drop": 'dobd ide',
"u_nav_m": '<h6>mit töltsünk fel?</h6><code>Enter</code> = Fájlok (egy vagy több)\n<code>ESC</code> = Egy mappa (almappákkal)',
"u_nav_b": '<a href="#" id="modal-ok">Fájlok</a><a href="#" id="modal-ng">Egy mappa</a>',
"cl_opts": 'beállítások',
"cl_hfsz": 'méret',
"cl_themes": 'téma',
"cl_langs": 'nyelv',
"cl_ziptype": 'mappa letöltés',
"cl_uopts": 'up2k beállítások',
"cl_favico": 'favicon',
"cl_bigdir": 'limit feletti mappák',
"cl_hsort": '#rendezés',
"cl_keytype": 'hangnem-jelölés',
"cl_hiddenc": 'rejtett oszlopok',
"cl_hidec": 'rejt',
"cl_reset": 'alaphelyzet',
"cl_hpick": 'kattints az oszlopfejlécre az elrejtéshez',
"cl_hcancel": 'elrejtés megszakítva',
"cl_rcm": 'jobb-klikkes menü',
"ct_grid": '田 rács nézet',
"ct_ttips": '◔ ◡ ◔"> segítő szövegek',
"ct_thumb": 'rács nézetben ikonok/indexképek váltása$Ngyorsbillentyű: T">🖼️ képek',
"ct_csel": 'kijelölés CTRL és SHIFT gombokkal rács nézetben">kijelölés',
"ct_dsel": 'kijelölés egérhúzással rács nézetben">húzás',
"ct_dl": 'azonnali letöltés (beágyazás helyett)">letöltés',
"ct_ihop": 'nézegető bezárásakor ugorjon az utolsó képhez">g⮯',
"ct_dots": 'rejtett fájlok mutatása (ha szabad)">rejtett',
"ct_qdel": 'csak egyszer kérdezzen rá a törlésre">gyorstörlés',
"ct_dir1st": 'mappák előre rendezése">📁 előre',
"ct_nsort": 'természetes rendezés (pl. 1, 2, 10)">rendezés',
"ct_utc": 'időpontok UTC-ben">UTC',
"ct_readme": 'README.md mutatása a mappákban">📜 readme',
"ct_idxh": 'index.html mutatása listázás helyett">htm',
"ct_sbars": 'gördítősávok mutatása">⟊',
"cut_umod": 'létező fájl dátumának frissítése a helyire (írható+törölhető jog kell)">re📅',
"cut_turbo": 'yolo gomb, nem ajánlott:$N$Nrengeteg fájl újraellenőrzéséhez jó$N$Ncsak méretet néz, tartalmat nem! ha a méret egyezik, NEM tölti újra, még ha a fájl más is.$N$Nha kész vagy, kapcsold ki!">turbo',
"cut_datechk": 'csak turbo módban számít$N$Nnézi a dátumokat is a méret mellé$N$Nvalamivel biztosabb a turbónál, de nem váltja ki a rendes ellenőrzést">dátum-chk',
"cut_u2sz": 'feltöltési egység (chunk) mérete (MiB); nagy érték jó a távoli szerverekhez, kicsi a gyenge nethez',
"cut_flag": 'egyszerre csak egy fül tölthessen fel (azonos domainen belül hat)',
"cut_az": 'fájlok feltöltése ABC-sorrendben (nem a legkisebb-először módon)',
"cut_nag": 'értesítés, ha kész a feltöltés (ha nem ezen a fülön állsz)',
"cut_sfx": 'hangjelzés, ha kész a feltöltés',
"cut_mt": 'többszálú hashelés (gyorsítás)$N$Nplusz RAM-ot kér (max 512 MiB)$N$Nhttps-t 30%-kal, http-t 4.5x gyorsítja">mt',
"cut_wasm": 'wasm hashelő; chrome-on gyorsabb, de CPU-igényes és régebbi verzióknál fagyhat">wasm',
"cft_text": 'favicon szöveg (üresen kikapcsol)',
"cft_fg": 'szöveg színe',
"cft_bg": 'háttér színe',
"cdt_lim": 'lista hossza (max fájl/mappa)',
"cdt_ask": 'lista végén ne töltsön be automatikusan, inkább kérdezzen rá',
"cdt_hsort": 'rendezési szabályok száma a linkekben. 0 = tiltás',
"cdt_ren": 'egyedi jobb-klikkes menü (gyári: SHIFT + jobb-klikk)">bekapcsolva',
"cdt_rdb": 'mutassa a böngészőnek jobb-klikkes menüjét, ha az egyedi már nyitva van és megint jobb-klikkelsz">dupla',
"tt_entree": 'oldalsáv (mappafa) mutatása$Ngyorsbillentyű: B',
"tt_detree": 'elérési út mutatása$Ngyorsbillentyű: B',
"tt_visdir": 'gördítés a kijelölt mappához',
"tt_ftree": 'mappák / szövegfájlok váltása$Ngyorsbillentyű: V',
"tt_pdock": 'szülőmappák rögzítése felül',
"tt_dynt": 'automatikus méretezés nyitáskor',
"tt_wrap": 'sortörés',
"tt_hover": 'túl hosszú sorok mutatása rámutatáskor',
"ml_pmode": 'mappa végén...',
"ml_btns": 'gombok',
"ml_tcode": 'átkódolás',
"ml_tcode2": 'átkódolás ide:',
"ml_tint": 'színezés',
"ml_eq": 'eq',
"ml_drc": 'dinamikatartomány-tömörítő',
"ml_ss": 'csönd átugrása',
"mt_loop": 'egy szám ismétlése">🔁',
"mt_one": 'leállás egy szám után">1⃣',
"mt_shuf": 'véletlenszerű lejátszás mappánként">🔀',
"mt_aplay": 'automatikus kezdés a link alapján$N$Nha kikapcsolod, a linkek sem fognak szám-azonosítót tartalmazni">a▶',
"mt_preload": 'következő szám betöltése a végén (gapless)">preload',
"mt_prescan": 'mappaváltás az utolsó szám vége előtt, hogy a böngésző ne álljon le">nav',
"mt_fullpre": 'teljes szám előtöltése;$N✅ instabil netre,$N❌ lassú neten inkább kapcsold ki">full',
"mt_fau": 'mobilon megakadályozza a leállást, ha lassú az előtöltés (a tagek kijelzése hibás lehet)">☕️',
"mt_waves": 'hullámforma a tekerősávon:$Nhangerő amplitúdó mutatása a sávban">~s',
"mt_npclip": 'gombok a most szóló szám infójának másolásához">/np',
"mt_m3u_c": 'gombok a kijelöltek m3u8 listába másolásához">📻',
"mt_octl": 'rendszerintegráció (média gombok / osd)">os-ctl',
"mt_oseek": 'tekerés engedése a rendszer szinten$N$Nmegjegyzés: iphonon ez felülírja a következő szám gombot">seek',
"mt_oscv": 'albumkép mutatása az osd-n">art',
"mt_follow": 'fókuszban tartja az aktuális számot">🎯',
"mt_compact": 'kompakt vezérlők">⟎',
"mt_uncache": 'gyorsítótár ürítése (próbáld ezt, ha a böngésző hibás fájlt mentett el és nem játssza le)">uncache',
"mt_mloop": 'mappa ismétlése">🔁 ismétlés',
"mt_mnext": 'következő mappa betöltése és folytatás">📂 tovább',
"mt_mstop": 'stop">⏸ stop',
"mt_cflac": 'flac / wav konvertálása ide: {0}">flac',
"mt_caac": 'aac / m4a konvertálása ide: {0}">aac',
"mt_coth": 'egyéb (nem mp3) konvertálása ide: {0}">egyéb',
"mt_c2opus": 'asztali gép, laptop, android kedvence">opus',
"mt_c2owa": 'opus-weba (iOS 17.5+)">owa',
"mt_c2caf": 'opus-caf (iOS 11-17)">caf',
"mt_c2mp3": 'nagyon régi eszközökhöz">mp3',
"mt_c2flac": 'legjobb minőség, de hatalmas fájlok">flac',
"mt_c2wav": 'tömörítetlen (még nagyobb)">wav',
"mt_c2ok": 'szuper, jó választás',
"mt_c2nd": 'nem javasolt ehhez az eszközhöz, de rendben',
"mt_c2ng": 'úgy tűnik, az eszközöd nem támogatja, de próbáljuk meg',
"mt_xowa": 'iOS hiba akadályozza a háttérben lejátszást ezzel; használd inkább a caf-ot vagy mp3-at',
"mt_tint": 'háttérszint (0-100) a tekerősávon, hogy ne zavarjon a betöltés',
"mt_eq": '`eq és erősítés;$N$Nboost `0` = alap hangerő (100%)$N$Nszélesség `1 &nbsp;` = standard sztereó$Nszélesség `0.5` = 50% áthallás$Nszélesség `0 &nbsp;` = monó$N$Nboost `-0.8` &amp; szélesség `10` = ének eltávolítása :^)$N$Nha az EQ be van kapcsolva, a lemezek teljesen folytonosak lesznek (gapless), hagyd bekapcsolva nullán is, ha ez számít',
"mt_drc": 'dinamikatartomány-tömörítés (hangerő-kiegyenlítő); az EQ-t is bekapcsolja, ha nem kell, az értékeit hagyd nullán (kivéve szélesség=1)$N$Nevvel sosem lesz túl hangos, -24 thresh és 12 ratio mellett -22 dB-nél megáll, biztonságos feltekerni a boost-ot 0.8-ra vagy akár 1.8-ra',
"mt_ss": '`csönd átugrása; felgyorsít `ffwd`-szeresére a számok elején/végén, ha a hangerő `vol` alatt van és a pozíció a szám első/utolsó `start/end` százalékában van',
"mt_ssvt": 'hangerő küszöb (0-255)">vol',
"mt_ssts": 'aktív tartomány (%, eleje)">start',
"mt_sste": 'aktív tartomány (%, vége)">end',
"mt_sssm": 'lejátszási sebesség szorzó">ffwd',
"mb_play": 'play',
"mm_hashplay": 'lejátsszam ezt a fájlt?',
"mm_m3u": '<code>Enter/OK</code>: Lejátszás\n<code>ESC/Cancel</code>: Szerkesztés',
"mp_breq": "firefox 82+, chrome 73+, vagy iOS 15+ szükséges",
"mm_bload": 'betöltés...',
"mm_bconv": 'konvertálás ide: {0}, várj légy szíves...',
"mm_opusen": 'a böngésződ nem támogatja az aac / m4a fájlokat;\nátkódolás opus-ba bekapcsolva',
"mm_playerr": 'lejátszási hiba: ',
"mm_eabrt": 'lejátszás megszakítva',
"mm_enet": 'szakadozik a neted',
"mm_edec": 'ez a fájl valahogy sérült??',
"mm_esupp": 'a böngésződ nem ismeri ezt a formátumot',
"mm_eunk": 'ismeretlen hiba',
"mm_e404": 'audió hiba 404: fájl nem található.',
"mm_e403": 'audió hiba 403: hozzáférés megtagadva.\n\npróbáld meg az F5-öt, hátha kiléptetett a rendszer',
"mm_e415": 'audió hiba 415: átkódolás sikertelen; nézd meg a szerver logot.',
"mm_e500": 'audió hiba 500: nézd meg a szerver logot.',
"mm_e5xx": 'audió hiba; szerver hiba ',
"mm_nof": 'nem találok több zenét a környéken',
"mm_prescan": 'következő szám keresése...',
"mm_scank": 'következő megvan:',
"mm_uncache": 'gyorsítótár ürítve; minden számot újra letölt az újabb lejátszásnál',
"mm_hnf": 'ez a szám már nem létezik',
"im_hnf": 'ez a kép már nem létezik',
"f_empty": 'a mappa üres',
"f_chide": 'ez elrejti a(z) «{0}» oszlopot\n\nvisszakapcsolhatod a beállításoknál',
"f_bigtxt": 'ez a fájl {0} MiB -- valóban megnyitod szövegként?',
"f_bigtxt2": 'csak a fájl végét nézed meg? ez bekapcsolja a követést (tail) is, az új sorok élőben jelennek meg',
"fbd_more": '<div id="blazy"><code>{0}</code> / <code>{1}</code> fájl látszik; <a href="#" id="bd_more">mutass még {2}-t</a> vagy <a href="#" id="bd_all">mutasd mindet</a></div>',
"fbd_all": '<div id="blazy"><code>{0}</code> / <code>{1}</code> fájl látszik; <a href="#" id="bd_all">mutasd mindet</a></div>',
"f_anota": 'csak {0} fájl van kijelölve a {1}-ből;\naz egész mappa kijelöléséhez görgess az aljára',
"f_dls": 'a mappában lévő linkek letöltési linkekké alakultak',
"f_dl_nd": 'mappa kihagyása (használd a zip/tar letöltést):\n',
"f_partial": 'egy épp feltöltés alatt álló fájlt akarsz letölteni. Inkább válaszd azt, aminek megegyezik a neve, de nincs rajta a <code>.PARTIAL</code> kiterjesztés.\n\nha mégis OK-t nyomsz, valószínűleg hibás adatot kapsz.',
"ft_paste": 'beillesztés: {0} elem$Ngyorsbillentyű: ctrl-V',
"fr_eperm": 'nem tudom átnevezni:\nnincs “mozgatás” jogod ebben a mappában',
"fd_eperm": 'nem tudom törölni:\nnincs “törlés” jogod ebben a mappában',
"fc_eperm": 'nem tudom kivágni:\nnincs “ mozgatás ” jogod ebben a mappában',
"fp_eperm": 'nem tudom beilleszteni:\nnincs “írás” jogod ebben a mappában',
"fr_emore": 'jelölj ki legalább egy elemet az átnevezéshez',
"fd_emore": 'jelölj ki legalább egy elemet a törléshez',
"fc_emore": 'jelölj ki legalább egy elemet a kivágáshoz',
"fcp_emore": 'jelölj ki legalább egy elemet a másoláshoz',
"fs_sc": 'mappa megosztása',
"fs_ss": 'kijelöltek megosztása',
"fs_just1d": 'nem tudsz egyszerre több mappát,\nvagy fájlokat és mappákat vegyesen megosztani',
"fs_abrt": '❌ mégse',
"fs_rand": '🎲 random név',
"fs_go": '✅ megosztás létrehozása',
"fs_name": 'név',
"fs_src": 'forrás',
"fs_pwd": 'jelszó',
"fs_exp": 'lejárat',
"fs_tmin": 'perc',
"fs_thrs": 'óra',
"fs_tdays": 'nap',
"fs_never": 'örök',
"fs_pname": 'nem kötelező link név; üresen véletlenszerű lesz',
"fs_tsrc": 'a megosztandó fájl vagy mappa',
"fs_ppwd": 'nem kötelező jelszó',
"fs_w8": 'megosztás létrehozása...',
"fs_ok": '<code>Enter/OK</code>: Másolás vágólapra\n<code>ESC/Cancel</code>: Bezárás',
"frt_dec": 'helyreállíthatja a hibás fájlneveket">url-decode',
"frt_rst": 'eredeti nevek visszaállítása">↺ alaphelyzet',
"frt_abrt": 'ablak bezárása">❌ mégse',
"frb_apply": 'ÁTNEVEZÉS',
"fr_adv": 'tömeges / metaadat / minta alapú átnevezés">haladó',
"fr_case": 'kis/nagybetű érzékeny regex">case',
"fr_win": 'windows-biztos nevek; cseréli a <code>&lt;&gt;:&quot;\\|?*</code> karaktereket japán teljes szélességűekre">win',
"fr_slash": '<code>/</code> cseréje olyanra, ami nem hoz létre új mappát">no /',
"fr_re": '`regex keresési minta; a csoportokra így hivatkozhatsz lent: `(1)`, `(2)` stb.',
"fr_fmt": '`foobar2000 stílus:$N`(title)` = zeneszám címe,$N`[(artist) - ](title)` = kihagyja az előadót, ha üres$N`$lpad((tn),2,0)` = sorszám 2 számjegyen',
"fr_pdel": 'törlés',
"fr_pnew": 'mentés mint',
"fr_pname": 'adj nevet az új presetnek',
"fr_aborted": 'megszakítva',
"fr_lold": 'régi név',
"fr_lnew": 'új név',
"fr_tags": 'tagek a kijelölt fájlokban (csak olvasásra):',
"fr_busy": '{0} elem átnevezése...\n\n{1}',
"fr_efail": 'átnevezés sikertelen:\n',
"fr_nchg": '{0} név módosult a <code>win</code> vagy <code>no /</code> miatt\n\nfolytassuk az új nevekkel?',
"fd_ok": 'törölve',
"fd_err": 'törlés sikertelen:\n',
"fd_none": 'semmi sem lett törölve; lehet, hogy a szerver tiltja (xbd)?',
"fd_busy": '{0} elem törlése...\n\n{1}',
"fd_warn1": 'TÖRLÖD ezt a(z) {0} elemet?',
"fd_warn2": '<b>Utolsó esély!</b> Nem vonható vissza. Törlöd?',
"fc_ok": '{0} elem kivágva',
"fc_warn": '{0} elem kivágva\n\nde: csak <b>ez</b> a fül tudja beilleszteni őket\n(mivel a kijelölés brutálisan nagy)',
"fcc_ok": '{0} elem vágólapra másolva',
"fcc_warn": '{0} elem vágólapra másolva\n\nde: csak <b>ez</b> a fül tudja beilleszteni őket\n(mivel a kijelölés brutálisan nagy)',
"fp_apply": 'nevek mentése',
"fp_skip": 'ütközések kihagyása',
"fp_ecut": 'előbb vágj ki vagy másolj valamit\n\nmegjegyzés: néha fülek között is megy',
"fp_ename": '{0} elem nem mozgatható ide névütközés miatt. Adj nekik új nevet, vagy hagyd üresen (“kihagyás”) a skippeléshez:',
"fcp_ename": '{0} elem nem másolható ide névütközés miatt. Adj nekik új nevet, vagy hagyd üresen (“kihagyás”) a skippeléshez:',
"fp_emore": 'maradt még néhány névütközés',
"fp_ok": 'mozgatás kész',
"fcp_ok": 'másolás kész',
"fp_busy": '{0} elem mozgatása...\n\n{1}',
"fcp_busy": '{0} elem másolása...\n\n{1}',
"fp_abrt": 'megszakítás...',
"fp_err": 'mozgatás sikertelen:\n',
"fcp_err": 'másolás sikertelen:\n',
"fp_confirm": 'mozgassuk ide ezt a {0} elemet?',
"fcp_confirm": 'másoljuk ide ezt a {0} elemet?',
"fp_etab": 'nem sikerült a vágólap olvasása másik fülről',
"fp_name": 'fájl feltöltése. Adj neki nevet:',
"fp_both_m": '<h6>mi legyen?</h6><code>Enter</code> = Mozgatás: {0} elem innen: «{1}»\n<code>ESC</code> = Feltöltés: {2} fájl a gépedről',
"fcp_both_m": '<h6>mi legyen?</h6><code>Enter</code> = Másolás: {0} elem innen: «{1}»\n<code>ESC</code> = Feltöltés: {2} fájl a gépedről',
"fp_both_b": '<a href="#" id="modal-ok">Mozgatás</a><a href="#" id="modal-ng">Feltöltés</a>',
"fcp_both_b": '<a href="#" id="modal-ok">Másolás</a><a href="#" id="modal-ng">Feltöltés</a>',
"mk_noname": 'írj be egy nevet a bal oldali mezőbe :p',
"nmd_i1": 'add meg a kiterjesztést is, pl. <code>.md</code>',
"nmd_i2": 'csak <code>.{0}</code> fájlt hozhatsz létre, mert nincs törlési jogod',
"tv_load": 'Szövegfájl betöltése:\n\n{0}\n\n{1}% ({2} / {3} MiB betöltve)',
"tv_xe1": 'nem sikerült betölteni:\n\nhiba ',
"tv_xe2": '404, fájl nem található',
"tv_lst": 'szövegfájlok a mappában:',
"tvt_close": 'vissza a mappába$Ngyorsbillentyű: M (vagy Esc)">❌ bezárás',
"tvt_dl": 'fájl letöltése$Ngyorsbillentyű: Y">💾 letöltés',
"tvt_prev": 'előző dokumentum$Ngyorsbillentyű: i">⬆ előző',
"tvt_next": 'következő dokumentum$Ngyorsbillentyű: K">⬇ következő',
"tvt_sel": 'kijelölés (vágáshoz/másoláshoz/törléshez)$Ngyorsbillentyű: S">kijelöl',
"tvt_j": 'json formázás$Ngyorsbillentyű: shift-J">j',
"tvt_edit": 'szerkesztés szövegként$Ngyorsbillentyű: E">✏️ szerkeszt',
"tvt_tail": 'fájl figyelése; új sorok mutatása élőben">📡 követve',
"tvt_wrap": 'sortörés">↵',
"tvt_atail": 'gördítés az aljára rögzítve">⚓',
"tvt_ctail": 'terminál színek (ansi escape) dekódolása">🌈',
"tvt_ntail": 'visszapörgetési limit (hány bájt szöveg maradjon a memóriában)',
"m3u_add1": 'szám hozzáadva az m3u listához',
"m3u_addn": '{0} szám hozzáadva az m3u listához',
"m3u_clip": 'm3u lista vágólapra másolva\n\nhozz létre egy új szövegfájlt valami.m3u névvel és illeszd bele; így már lejátszható lesz',
"gt_vau": 'videó elrejtése, csak a hang lejátszása">🎧',
"gt_msel": 'kijelölés engedélyezése; ctrl-klikk a felülbíráláshoz$N$N&lt;em&gt;ha aktív: dupla klikk a megnyitáshoz&lt;/em&gt;$N$Ngyorsbillentyű: S">tömeges',
"gt_crop": 'középre vágott indexképek">crop',
"gt_3x": 'nagy felbontású indexképek">3x',
"gt_zoom": 'zoom',
"gt_chop": 'vágás',
"gt_sort": 'rendezés:',
"gt_name": 'név',
"gt_sz": 'méret',
"gt_ts": 'dátum',
"gt_ext": 'típus',
"gt_c1": 'rövidebb fájlnevek',
"gt_c2": 'hosszabb fájlnevek',
"sm_w8": 'keresés...',
"sm_prev": 'az alábbi eredmények egy korábbi keresésből vannak:\n ',
"sl_close": 'eredmények bezárása',
"sl_hits": '{0} találat',
"sl_moar": 'továbbiak betöltése',
"s_sz": 'méret',
"s_dt": 'dátum',
"s_rd": 'útvonal',
"s_fn": 'név',
"s_ta": 'tagek',
"s_ua": 'feltöltve',
"s_ad": 'haladó',
"s_s1": 'minimum MiB',
"s_s2": 'maximum MiB',
"s_d1": 'min. iso8601',
"s_d2": 'max. iso8601',
"s_u1": 'ezután töltve',
"s_u2": 'vagy ez előtt',
"s_r1": 'útvonal tartalmazza (szóközzel elválasztva)',
"s_f1": 'név tartalmazza (negálás pl -nemez)',
"s_t1": 'tagek tartalmazzák (^=kezdet, vég=$)',
"s_a1": 'specifikus metaadatok',
"md_eshow": 'nem sikerült megjeleníteni ',
"md_off": '[📜<em>readme</em>] kikapcsolva a beállításokban -- rejtve',
"badreply": 'Hibás válasz a szervertől',
"xhr403": '403: Hozzáférés megtagadva\n\npróbáld az F5-öt, hátha kiléptetett a rendszer',
"xhr0": 'ismeretlen hiba (valószínűleg megszakadt a kapcsolat)',
"cf_ok": 'bocsi, DD' + wah + 'oS védelem bekapcsolt\n\nkb. 30 mp múlva folytatódik\n\nha nem történik semmi, nyomj F5-öt',
"tl_xe1": 'almappák listázása sikertelen:\n\nhiba ',
"tl_xe2": '404: mappa nem található',
"fl_xe1": 'fájlok listázása sikertelen:\n\nhiba ',
"fl_xe2": '404: mappa nem található',
"fd_xe1": 'almappa létrehozása sikertelen:\n\nhiba ',
"fd_xe2": '404: szülőmappa nincs meg',
"fsm_xe1": 'üzenetküldés sikertelen:\n\nhiba ',
"fsm_xe2": '404: szülőmappa nincs meg',
"fu_xe1": 'unpost lista betöltése sikertelen:\n\nhiba ',
"fu_xe2": '404: fájl nincs meg??',
"fz_tar": 'tömörítetlen gnu-tar (linux / mac)',
"fz_pax": 'tömörítetlen pax-formátumú tar (lassabb)',
"fz_targz": 'gnu-tar gzip 3-as szinten$N$Náltalában lassú, inkább használd a sima tar-t',
"fz_tarxz": 'gnu-tar xz 1-es szinten$N$Náltalában lassú, inkább használd a sima tar-t',
"fz_zip8": 'zip utf8 nevekkel (régi windows alatt hibás lehet)',
"fz_zipd": 'zip cp437 nevekkel (nagyon régi szoftverekhez)',
"fz_zipc": 'cp437 crc32 gyorsítással,$NMS-DOS PKZIP v2.04g-hez (1993 októbere)$N(letöltés előtt hosszabb ideig tarthat a feldolgozás)',
"un_m1": 'itt törölheted a nemrég feltöltött fájljaidat (vagy leállíthatod a futókat)',
"un_upd": 'frissítés',
"un_m4": 'vagy oszd meg az alábbi fájlokat:',
"un_ulist": 'mutasd',
"un_ucopy": 'másold',
"un_flt": 'szűrő:&nbsp; az URL tartalmazza:',
"un_fclr": 'szűrő törlése',
"un_derr": 'törlés sikertelen:\n',
"un_f5": 'valami elromlott, próbáld meg frissíteni az oldalt',
"un_uf5": 'frissítened kell az oldalt (F5 vagy CTRL-R), mielőtt ezt leállíthatnád',
"un_nou": '<b>figyelem:</b> a szerver túlterhelt a futó feltöltések listázásához; próbáld később',
"un_noc": '<b>figyelem:</b> a kész feltöltések törlése nincs engedélyezve a szerveren',
"un_max": 'az első 2000 fájl látszik (használd a szűrőt)',
"un_avail": '{0} kész feltöltés törölhető<br />{1} folyamatban lévő leállítható',
"un_m2": 'idő szerint rendezve (legfrissebb legelöl):',
"un_no1": 'semmi! nincsenek nemrég feltöltött fájljaid',
"un_no2": 'semmi! nincs a szűrőnek megfelelő friss feltöltés',
"un_next": 'következő {0} fájl törlése',
"un_abrt": 'leállítás',
"un_del": 'törlés',
"un_m3": 'legutóbbi feltöltések betöltése...',
"un_busy": '{0} fájl törlése...',
"un_clip": '{0} link vágólapra másolva',
"u_https1": 'érdemesebb lenne',
"u_https2": 'https-re váltani',
"u_https3": 'a jobb sebességért',
"u_ancient": 'lenyűgözően őskori a böngésződ -- talán <a href="#" onclick="goto(\'bup\')">használd inkább az egyszerű uploader-t</a>',
"u_nowork": 'legalább Firefox 53, Chrome 57 vagy iOS 11 kell',
"tail_2old": 'legalább Firefox 105, Chrome 71 vagy iOS 14.5 kell',
"u_nodrop": 'a böngésződ túl öreg a drag-and-drop-hoz',
"u_notdir": 'ez nem egy mappa!\n\na böngésződ túl öreg,\npróbáld meg inkább behúzni',
"u_uri": 'képek behúzásához más ablakból,\ndobd rá a nagy feltöltés gombra',
"u_enpot": 'váltás <a href="#">egyszerű UI-ra</a> (gyorsíthat a feltöltésen)',
"u_depot": 'váltás <a href="#">vibráló UI-ra</a> (visszafoghatja a sebességet)',
"u_gotpot": 'átváltottunk egyszerű UI-ra a sebesség miatt,\nde bármikor visszaválthatsz!',
"u_pott": '<p>fájlok: &nbsp; <b>{0}</b> kész, &nbsp; <b>{1}</b> hiba, &nbsp; <b>{2}</b> fut, &nbsp; <b>{3}</b> vár</p>',
"u_ever": 'ez az egyszerű feltöltő; az up2k-hoz legalább<br>chrome 21 // firefox 13 // edge 12 // opera 12 // safari 5.1 kell',
"u_su2k": 'ez az egyszerű feltöltő; az <a href="#" id="u2yea">up2k</a> sokkal jobb',
"u_uput": 'sebességre optimalizál (ellenőrzés nélkül)',
"u_ewrite": 'nincs írási jogod ebben a mappában',
"u_eread": 'nincs olvasási jogod ebben a mappában',
"u_enoi": 'fájlkeresés letiltva a szerveren',
"u_enoow": 'felülírás nem fog menni; törlési jog kell hozzá',
"u_badf": 'Ez a(z) {0} fájl ({1}-ből) kimaradt, valószínűleg jogok miatt:\n\n',
"u_blankf": 'Ez a(z) {0} fájl ({1}-ből) teljesen üres; biztos feltöltöd?\n\n',
"u_applef": 'Ez a(z) {0} fájl ({1}-ből) valószínűleg felesleges;\nNyomj <code>OK/Enter</code>-t a KIHAGYÁSHOZ,\nvagy <code>Cancel/ESC</code>-et a FELTÖLTÉSHEZ:\n\n',
"u_just1": '\nlehet, hogy jobban működik, ha csak egy fájlt jelölsz ki',
"u_ff_many": 'ha <b>Linux / MacOS / Android</b> rendszert használsz, ennyi fájl <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1790500" target="_blank">fagyást okozhat Firefoxban!</a>\nha ez történik, próbáld újra (vagy használd a Chrome-ot).',
"u_up_life": 'ez a feltöltés a befejezés után\n{0} múlva törlődik a szerverről',
"u_asku": 'feltöltsem ezt a {0} fájlt ide: <code>{1}</code>?',
"u_unpt": 'visszavonhatod/törölheted a feltöltést a bal felső 🧯 gombbal',
"u_bigtab": '{0} fájl listázása következik\n\nez lefagyaszthatja a böngészőt, biztos?',
"u_scan": 'Fájlok beolvasása...',
"u_dirstuck": 'a rendszer elakadt az alábbi {0} elemnél; kihagyjuk őket:',
"u_etadone": 'Kész ({0}, {1} fájl)',
"u_etaprep": '(előkészítés...)',
"u_hashdone": 'hashelés kész',
"u_hashing": 'hash',
"u_hs": 'kapcsolódás...',
"u_started": 'a feltöltés elindult; lásd [🚀]',
"u_dupdefer": 'másolat; a végén fogjuk feldolgozni',
"u_actx": 'kattints ide, hogy a böngésző ne fogja vissza a sebességet,\nha más ablakba/fülre mész',
"u_fixed": 'Oké! Javítva 👍',
"u_cuerr": 'hiba a(z) {0} / {1}. egység feltöltésekor;\nvalószínűleg nem gond, folytatjuk\n\nfájl: {2}',
"u_cuerr2": 'szerver elutasította az egységet ({0} / {1});\nkésőbb újrapróbáljuk\n\nfájl: {2}\n\nhiba ',
"u_ehstmp": 'újrapróbálás; lásd jobb lent',
"u_ehsfin": 'szerver elutasította a befejezést; újrapróbáljuk...',
"u_ehssrch": 'szerver elutasította a keresést; újrapróbáljuk...',
"u_ehsinit": 'szerver elutasította a kezdést; újrapróbáljuk...',
"u_eneths": 'hálózati hiba a kapcsolódáskor; újrapróbálás...',
"u_enethd": 'hálózati hiba az ellenőrzéskor; újrapróbálás...',
"u_cbusy": 'várakozás, hogy a szerver megint bízzon bennünk hiba után...',
"u_ehsdf": 'a szerveren elfogyott a hely!\n\naddig próbálkozunk, amíg valaki\nfel nem szabadít egy kis területet',
"u_emtleak1": 'úgy tűnik, a böngésződ memóriát szivárogtat;\nkérlek',
"u_emtleak2": ' <a href="{0}">válts https-re (ajánlott)</a> vagy ',
"u_emtleak3": ' ',
"u_emtleakc": 'próbáld a következőt:\n<ul><li>nyomj <code>F5</code>-öt</li><li>kapcsold ki az &nbsp;<code>mt</code>&nbsp; gombot a &nbsp;<code>⚙️ beállításokban</code></li><li>majd próbáld újra</li></ul>Lassabb lesz, de legalább lemegy.\nBocsi a kellemetlenségért!\n\nPS: a chrome v107 már <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1354816" target="_blank">javított ezen</a>',
"u_emtleakf": 'próbáld a következőt:\n<ul><li>nyomj <code>F5</code>-öt</li><li>kapcsold be az <code>egyszerű</code> módot<li>majd próbáld újra megint</li></ul>\nPS: remélhetőleg a firefox is <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1790500" target="_blank">javítja egyszer</a>',
"u_s404": 'nincs a szerveren',
"u_expl": 'magyarázat',
"u_maxconn": 'a legtöbb böngésző limitje 6, de Firefoxban az <code>about:config</code> alatt a <code>connections-per-server</code> értékkel növelhető',
"u_tu": '<p class="warn">FIGYELEM: turbo bekapcsolva, <span>&nbsp;lehet, hogy nem veszi észre a félbeszakadt feltöltéseket; lásd a súgót</span></p>',
"u_ts": '<p class="warn">FIGYELEM: turbo bekapcsolva, <span>&nbsp;a keresési eredmények hibásak lehetnek; lásd a súgót</span></p>',
"u_turbo_c": 'turbo letiltva a szerveren',
"u_turbo_g": 'turbo kikapcsolva, mert nincs jogod mappalistázáshoz ezen a köteten',
"u_life_cfg": 'autotörlés <input id="lifem" p="60" /> perc (vagy <input id="lifeh" p="3600" /> óra) múlva',
"u_life_est": 'a feltöltés törlődni fog ekkor: <span id="lifew" tt="helyi idő">---</span>',
"u_life_max": 'ez a mappa kényszeríti a\nmax élettartamot: {0}',
"u_unp_ok": 'unpost engedélyezve eddig: {0}',
"u_unp_ng": 'unpost NEM lesz engedélyezve',
"ue_ro": 'ebben a mappában csak olvasási jogod van\n\n',
"ue_nl": 'nem vagy belépve',
"ue_la": 'jelenleg mint “{0}” vagy bejelentkezve',
"ue_sr": 'kereső módban vagy\n\nválts feltöltésre a nagy KERESÉS gomb melletti nagyítóra 🔎 kattintva,\nés próbáld újra\n\nbocsi',
"ue_ta": 'próbáld meg újra, most már mennie kell',
"ue_ab": 'ez a fájl már fel van töltve egy másik mappába, várd meg, amíg az kész lesz.\n\nmegszakíthatod a korábbi próbálkozást a bal felső 🧯 gombbal',
"ur_1uo": 'OK: Fájl sikeresen feltöltve',
"ur_auo": 'OK: Mind a(z) {0} fájl feltöltve',
"ur_1so": 'OK: Fájl megvan a szerveren',
"ur_aso": 'OK: Mind a(z) {0} fájl megvan a szerveren',
"ur_1un": 'A feltöltés nem sikerült',
"ur_aun": 'Az összes ({0}) feltöltés megszakadt',
"ur_1sn": 'Fájl nincs a szerveren',
"ur_asn": 'A(z) {0} fájl nincs a szerveren',
"ur_um": 'Kész;\n{0} sikeres,\n{1} sajnos nem sikerült',
"ur_sm": 'Kész;\n{0} megvan a szerveren,\n{1} nincs meg',
"rc_opn": 'megnyitás',
"rc_ply": 'lejátszás',
"rc_pla": 'lejátszás audióként',
"rc_txt": 'megnyitás szövegként',
"rc_md": 'megnyitás markdownként',
"rc_dl": 'letöltés',
"rc_zip": 'letöltés archívumként',
"rc_cpl": 'link másolása',
"rc_del": 'törlés',
"rc_cut": 'kivágás',
"rc_cpy": 'másolás',
"rc_pst": 'beillesztés',
"rc_rnm": 'átnevezés',
"rc_nfo": 'új mappa',
"rc_nfi": 'új fájl',
"rc_sal": 'összes kijelölése',
"rc_sin": 'kijelölés megfordítása',
"rc_shf": 'mappa megosztása',
"rc_shs": 'kijelöltek megosztása',
"lang_set": 'frissítsünk, hogy átálljon a nyelv?',
"splash": {
"a1": 'frissítés',
"b1": 'üdv idegen &nbsp; <small>(nem vagy bejelentkezve)</small>',
"c1": 'kilépés',
"d1": 'dump stack',
"d2": 'minden aktív szál állapotának mutatása',
"e1": 'config újratöltés',
"e2": 'konfigurációs fájlok (fiókok/kötetek) és e2ds kötetek újraszkennelése$N$Nmegjegyzés: a globális beállításokhoz$Nteljes újraindítás kell',
"f1": 'böngészhető:',
"g1": 'ide tudsz feltölteni:',
"cc1": 'egyéb dolgok:',
"h1": 'k304 kikapcsolása',
"i1": 'k304 bekapcsolása',
"j1": 'a k304 lekapcsolja a klienst minden HTTP 304-nél, ami segíthet némely akadózó proxynál, de amúgy lassítja a dolgokat',
"k1": 'beállítások alaphelyzetbe állítása',
"l1": 'jelentkezz be a többiért:',
"ls3": 'belépés',
"lu4": 'felhasználónév',
"lp4": 'jelszó',
"lo3": '“{0}” kijelentkeztetése mindenhonnan',
"lo2": 'minden böngészőben lelövi a munkamenetet',
"m1": 'üdv újra,',
"n1": '404 nincs meg &nbsp;┐( ´ -`)┌',
"o1": 'vagy nincs jogod -- próbálj belépni vagy <a href="' + SR + '/?h">menj a főoldalra</a>',
"p1": '403 tiltva &nbsp;~┻━┻',
"q1": 'kell egy jelszó vagy <a href="' + SR + '/?h">menj a főoldalra</a>',
"r1": 'vissza a főoldalra',
".s1": 'újraszkennelés',
"t1": 'művelet',
"u2": 'utolsó írás óta eltelt idő$N( feltöltés / átnevezés / ... )$N$N17n = 17 nap$N1ó23 = 1 óra 23 perc$N4p56 = 4 perc 56 másodperc',
"v1": 'csatlakozás',
"v2": 'szerver használata helyi meghajtóként',
"w1": 'váltás https-re',
"x1": 'jelszó megváltoztatása',
"y1": 'megosztások szerkesztése',
"z1": 'megosztás feloldása:',
"ta1": 'írd be az új jelszavad',
"ta2": 'új jelszó még egyszer:',
"ta3": 'elírtad; próbáld újra',
"nop": 'HIBA: A jelszó nem lehet üres',
"nou": 'HIBA: A felhasználónév és jelszó nem lehet üres',
"aa1": 'érkező fájlok:',
"ab1": 'no304 kikapcsolása',
"ac1": 'no304 bekapcsolása',
"ad1": 'a no304 kikapcsolja a gyorsítótárazást; akkor használd, ha a k304 nem segített. Figyelem: ez jelentős adatforgalmat generál!',
"ae1": 'futó letöltések:',
"af1": 'utóbbi feltöltések mutatása',
"ag1": 'idp cache megtekintése',
},
};

View file

@ -325,7 +325,6 @@ Ls.ita = {
"mt_ssvt": "soglia volume (0-255)\">vol", //m "mt_ssvt": "soglia volume (0-255)\">vol", //m
"mt_ssts": "soglia attiva (% traccia, inizio)\">ini", //m "mt_ssts": "soglia attiva (% traccia, inizio)\">ini", //m
"mt_sste": "soglia attiva (% traccia, fine)\">fin", //m "mt_sste": "soglia attiva (% traccia, fine)\">fin", //m
"mt_ssrt": "tempo rampa volume/velocità\">fade", //m
"mt_sssm": "moltiplicatore velocità riproduzione\">av", //m "mt_sssm": "moltiplicatore velocità riproduzione\">av", //m
"mb_play": "riproduci", "mb_play": "riproduci",

View file

@ -325,7 +325,6 @@ Ls.jpn = {
"mt_ssvt": "音量しきい値 (0-255)\">音", //m "mt_ssvt": "音量しきい値 (0-255)\">音", //m
"mt_ssts": "有効しきい値 (トラック%, 開始)\">始", //m "mt_ssts": "有効しきい値 (トラック%, 開始)\">始", //m
"mt_sste": "有効しきい値 (トラック%, 終了)\">終", //m "mt_sste": "有効しきい値 (トラック%, 終了)\">終", //m
"mt_ssrt": "音量/速度 ランプ時間\">フェード", //m
"mt_sssm": "再生速度倍率\">速", //m "mt_sssm": "再生速度倍率\">速", //m
"mb_play": "再生", "mb_play": "再生",

View file

@ -325,7 +325,6 @@ Ls.kor = {
"mt_ssvt": "볼륨 임계값 (0-255)\">음", //m "mt_ssvt": "볼륨 임계값 (0-255)\">음", //m
"mt_ssts": "활성 임계값 (% 트랙, 시작)\">시", //m "mt_ssts": "활성 임계값 (% 트랙, 시작)\">시", //m
"mt_sste": "활성 임계값 (% 트랙, 끝)\">끝", //m "mt_sste": "활성 임계값 (% 트랙, 끝)\">끝", //m
"mt_ssrt": "볼륨/속도 램프 시간\">페이드", //m
"mt_sssm": "재생 속도 배율\">고", //m "mt_sssm": "재생 속도 배율\">고", //m
"mb_play": "재생", "mb_play": "재생",

View file

@ -325,7 +325,6 @@ Ls.nld = {
"mt_ssvt": "Volumedrempel (0-255)\">vol", //m "mt_ssvt": "Volumedrempel (0-255)\">vol", //m
"mt_ssts": "Actieve drempel (% track, begin)\">beg", //m "mt_ssts": "Actieve drempel (% track, begin)\">beg", //m
"mt_sste": "Actieve drempel (% track, einde)\">eind", //m "mt_sste": "Actieve drempel (% track, einde)\">eind", //m
"mt_ssrt": "Op/aflooptijd volume/snelheid\">fade", //m
"mt_sssm": "Vermenigvuldiger afspeelsnelheid\">vrs", //m "mt_sssm": "Vermenigvuldiger afspeelsnelheid\">vrs", //m
"mb_play": "Afspelen", "mb_play": "Afspelen",

View file

@ -322,7 +322,6 @@ Ls.nno = {
"mt_ssvt": "volumterskel (0-255)\">volum", "mt_ssvt": "volumterskel (0-255)\">volum",
"mt_ssts": "aktiv innanfor første % av songen\">start", "mt_ssts": "aktiv innanfor første % av songen\">start",
"mt_sste": "aktiv innanfor siste % av songen\">slutt", "mt_sste": "aktiv innanfor siste % av songen\">slutt",
"mt_ssrt": "kor fort volum/tempo skal justerast\">fade",
"mt_sssm": "avspelingshastigheitsmultiplikator\">ffwd", "mt_sssm": "avspelingshastigheitsmultiplikator\">ffwd",
"mb_play": "lytt", "mb_play": "lytt",

View file

@ -322,7 +322,6 @@ Ls.nor = {
"mt_ssvt": "volumterskel (0-255)\">volum", "mt_ssvt": "volumterskel (0-255)\">volum",
"mt_ssts": "aktiv innenfor første % av sangen\">start", "mt_ssts": "aktiv innenfor første % av sangen\">start",
"mt_sste": "aktiv innenfor siste % av sangen\">slutt", "mt_sste": "aktiv innenfor siste % av sangen\">slutt",
"mt_ssrt": "hvor fort volum/tempo skal justeres\">fade",
"mt_sssm": "avspillingshastighetsmultiplikator\">ffwd", "mt_sssm": "avspillingshastighetsmultiplikator\">ffwd",
"mb_play": "lytt", "mb_play": "lytt",

View file

@ -328,7 +328,6 @@ Ls.pol = {
"mt_ssvt": "próg głośności (0-255)\">gł", //m "mt_ssvt": "próg głośności (0-255)\">gł", //m
"mt_ssts": "aktywny próg (% utworu, początek)\">pocz", //m "mt_ssts": "aktywny próg (% utworu, początek)\">pocz", //m
"mt_sste": "aktywny próg (% utworu, koniec)\">kon", //m "mt_sste": "aktywny próg (% utworu, koniec)\">kon", //m
"mt_ssrt": "czas narastania/opadania głośn./pręd.\">fade", //m
"mt_sssm": "mnożnik prędkości odtwarzania\">szyb", //m "mt_sssm": "mnożnik prędkości odtwarzania\">szyb", //m
"mb_play": "odtwórz", "mb_play": "odtwórz",

View file

@ -325,7 +325,6 @@ Ls.por = {
"mt_ssvt": "limiar de volume (0-255)\">vol", //m "mt_ssvt": "limiar de volume (0-255)\">vol", //m
"mt_ssts": "limiar ativo (% faixa, início)\">ini", //m "mt_ssts": "limiar ativo (% faixa, início)\">ini", //m
"mt_sste": "limiar ativo (% faixa, fim)\">fim", //m "mt_sste": "limiar ativo (% faixa, fim)\">fim", //m
"mt_ssrt": "tempo de rampa volume/velocidade\">fade", //m
"mt_sssm": "multiplicador de velocidade de reprodução\">av", //m "mt_sssm": "multiplicador de velocidade de reprodução\">av", //m
"mb_play": "reproduzir", "mb_play": "reproduzir",

View file

@ -325,7 +325,6 @@ Ls.rus = {
"mt_ssvt": "порог громкости (0-255)\">гром", //m "mt_ssvt": "порог громкости (0-255)\">гром", //m
"mt_ssts": "активный порог (% трека, начало)\">нач", //m "mt_ssts": "активный порог (% трека, начало)\">нач", //m
"mt_sste": "активный порог (% трека, конец)\">кон", //m "mt_sste": "активный порог (% трека, конец)\">кон", //m
"mt_ssrt": "время нарастания/спада громк./скор.\">фейд", //m
"mt_sssm": "множитель скорости воспроизведения\">уск", //m "mt_sssm": "множитель скорости воспроизведения\">уск", //m
"mb_play": "играть", "mb_play": "играть",

View file

@ -324,7 +324,6 @@ Ls.spa = {
"mt_ssvt": "umbral de volumen (0-255)\">vol", //m "mt_ssvt": "umbral de volumen (0-255)\">vol", //m
"mt_ssts": "umbral activo (% pista, inicio)\">ini", //m "mt_ssts": "umbral activo (% pista, inicio)\">ini", //m
"mt_sste": "umbral activo (% pista, fin)\">fin", //m "mt_sste": "umbral activo (% pista, fin)\">fin", //m
"mt_ssrt": "tiempo de rampa volumen/velocidad\">fund", //m
"mt_sssm": "multiplicador de velocidad de reproducción\">av", //m "mt_sssm": "multiplicador de velocidad de reproducción\">av", //m
"mb_play": "reproducir", "mb_play": "reproducir",

View file

@ -325,7 +325,6 @@ Ls.swe = {
"mt_ssvt": "volymtröskel (0-255)\">vol", //m "mt_ssvt": "volymtröskel (0-255)\">vol", //m
"mt_ssts": "aktiv tröskel (% spår, start)\">sta", //m "mt_ssts": "aktiv tröskel (% spår, start)\">sta", //m
"mt_sste": "aktiv tröskel (% spår, slut)\">slt", //m "mt_sste": "aktiv tröskel (% spår, slut)\">slt", //m
"mt_ssrt": "upp/ned-rampningstid volym/hastighet\">fade", //m
"mt_sssm": "uppspelningshastighetsmultiplikator\">sn", //m "mt_sssm": "uppspelningshastighetsmultiplikator\">sn", //m
"mb_play": "play", "mb_play": "play",

View file

@ -325,7 +325,6 @@ Ls.tur = {
"mt_ssvt": "ses eşiği (0-255)\">ses", //m "mt_ssvt": "ses eşiği (0-255)\">ses", //m
"mt_ssts": "etkin eşik (% parça, başlangıç)\">bas", //m "mt_ssts": "etkin eşik (% parça, başlangıç)\">bas", //m
"mt_sste": "etkin eşik (% parça, bitiş)\">son", //m "mt_sste": "etkin eşik (% parça, bitiş)\">son", //m
"mt_ssrt": "ses/hız rampa süresi\">fade", //m
"mt_sssm": "oynatma hızı çarpanı\">ileri", //m "mt_sssm": "oynatma hızı çarpanı\">ileri", //m
"mb_play": "oynat", "mb_play": "oynat",

View file

@ -325,7 +325,6 @@ Ls.ukr = {
"mt_ssvt": "поріг гучності (0-255)\">гуч", //m "mt_ssvt": "поріг гучності (0-255)\">гуч", //m
"mt_ssts": "активний поріг (% треку, початок)\">поч", //m "mt_ssts": "активний поріг (% треку, початок)\">поч", //m
"mt_sste": "активний поріг (% треку, кінець)\">кін", //m "mt_sste": "активний поріг (% треку, кінець)\">кін", //m
"mt_ssrt": "час нарост./спаду гучн./швидк.\">фейд", //m
"mt_sssm": "множник швидкості відтворення\">шв", //m "mt_sssm": "множник швидкості відтворення\">шв", //m
"mb_play": "відтворити", "mb_play": "відтворити",

View file

@ -332,7 +332,6 @@ Ls.vie = {
"mt_ssvt": "ngưỡng âm lượng (0-255)\">am", //m "mt_ssvt": "ngưỡng âm lượng (0-255)\">am", //m
"mt_ssts": "ngưỡng hoạt động (% bài, đầu)\">dau", //m "mt_ssts": "ngưỡng hoạt động (% bài, đầu)\">dau", //m
"mt_sste": "ngưỡng hoạt động (% bài, cuối)\">cuoi", //m "mt_sste": "ngưỡng hoạt động (% bài, cuối)\">cuoi", //m
"mt_ssrt": "thời gian tăng/giảm âm lượng/tốc độ\">fade", //m
"mt_sssm": "hệ số tốc độ phát\">nh", //m "mt_sssm": "hệ số tốc độ phát\">nh", //m
"mb_play": "phát", "mb_play": "phát",

53
docs/bad-codecs.md Normal file
View file

@ -0,0 +1,53 @@
due to legal reasons, the copyparty [docker image](https://github.com/9001/copyparty/blob/hovudstraum/scripts/docker) and [bootable flashdrive](https://a.ocv.me/pub/stuff/edcd001/enterprise-edition/) are not able to decode and display images and videos which were made using certain codecs
* specifically, photos and videos taken with iphones will not work, and perhaps some samsung phones, idk
* this also includes thumbnails thereof
I suggest you stop reading at this point, unless you want to share my frustration, in which case please do continue
## why hevc is not included
the following is my understanding, which is probably wrong because [I anal](https://en.wikipedia.org/wiki/IANAL)
* the h265 codec, also known as h.265 and hevc, is patent-encumbered and legally problematic to distribute;
* there are several patent-pools of patent-holders with conflicting and unclear requirements
* even FOSS is not exempt from demands of payment; https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding#Provision_for_costless_software
* I have no idea how "number of sales" maps to FOSS, but copyparty doesn't have telemetry so it would be impossible to satisfy the requirements either way
* due to this, both chrome and firefox refuse to add a built-in decoder for hevc; https://caniuse.com/hevc
* and while I haven't discussed this with a lawyer, I presume the reason is they did
* most heif/heic images are hevc, meaning they are equally troublesome
* safari is the only webbrowser willing to decode and display heif/heic photos, for self-inflicted reasons https://caniuse.com/heif
and anyways there's no reason to use hevc in the first place because [av1](https://en.wikipedia.org/wiki/AV1) gives higher quality at a smaller filesize, is entirely free, and avif (its heif counterpart) is widely supported across all browsers: https://caniuse.com/avif
## why only the docker and flashdrive images are affected
supposedly, royalties is like a jigsaw puzzle, where whoever lays down the last piece wins the responsibility of dealing with that mess -- and because the docker-image has everything bundled as one big ball of software, that might(?) be a problem...idk, i anal
so because ffmpeg is the component that handles everything regarding hevc, only the packages which include ffmpeg are affected, which means the docker-image and bootable-flashdrive-image
if you use or install copyparty in any other way, then you are in charge of obtaining and providing an ffmpeg for copyparty to use, and thus nothing has changed
## how hevc support was removed
the regular ffmpeg package from the alpinelinux repos was replaced with a [custom ffmpeg build](https://github.com/9001/copyparty/tree/hovudstraum/scripts/docker/base) where the hevc decoder was physically stripped out, meaning hevc is not just "disabled", but entirely removed from all official copyparty distributions
oh and the aac support has also been tampered with; now only AAC-LC can be decoded, which is fine because that's like 99% of all aac files (nobody uses HE-AAC or AAC-LD), and LC-AAC has become royalty-free in all relevant parts of the world at this point
and any traces of vvc was also stripped out because that codec was dead on arrival, unable to compete with av1 (and soon av2)
the silver lining is that this has made the docker images *much* smaller; the `ac` image is now half the size -- it went from 67 to 35 MiB gzipped, from 195 to 99 MiB installed, which is nice
## how to enable hevc support
all I can say is good luck; I legally cannot help you with that
see, here's the fun part -- apparently I'm not allowed to assist with a technical explanation on how it could be done, because that would "facilitate access" as they call it?? but all copyparty does is call `ffmpeg` to generate the thumbnail; copyparty doesn't even know or care what "hevc" is; this is all purely on the ffmpeg side of things -- so technically none of this is even related to copyparty itself in the first place... ah whatever
man I just wanna write software, I hate this
pain peko

View file

@ -1,3 +1,88 @@
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2026-0225-0834 `v1.20.9` SECURITY: XSS fix
## ⚠️ ATTN: this release fixes an XSS vulnerability
[GHSA-62cr-6wp5-q43h](https://github.com/9001/copyparty/security/advisories/GHSA-62cr-6wp5-q43h) could let an attacker execute arbitrary JS by tricking you into clicking a malicious link 31b2801f
## 🔧 other changes
* webdav: [dav-port](https://copyparty.eu/cli/#g-dav-port) can be used as an alternative to [daw](https://copyparty.eu/cli/#g-daw) d21242fc
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2026-0222-1507 `v1.20.8` no265
## 🧪 new features
* #1298 add Hungarian translation (thx @sonacl!) eefb181b f37c3b96
* #1299 chown now accepts 4-digit values (thx @new-sashok724!) 5a7504fd
## 🩹 bugfixes
* audioplayer skip-silence:
* #1303 clamp ffwd to safe values (thx @icxes!) f5e70c7f
* fix crash on folderchange f1a433a6
## 🔧 other changes
* due to [legal reasons](https://github.com/9001/copyparty/blob/hovudstraum/docs/bad-codecs.md), the [docker-images](https://github.com/9001/copyparty/blob/hovudstraum/scripts/docker) and [bootable flashdrive](https://a.ocv.me/pub/stuff/edcd001/enterprise-edition/) are now unable to create thumbnails of HEVC/h265 videos and heif/heic images 1bec91d1
* this primarily means photos/videos taken with iphones (and maybe some samsung phones)
* on the bright side, this has made the docker-images much smaller; `ac` is now half the size it used to be, and `iv` / `dj` are each 97 MiB smaller
## 🌠 fun facts
* if you wanna see your car doing its best impression of a frictionless spherical cow, I can warmly (heh) recommend the icy snowcoated countryroads of viken this weekend
* goes oddly well with [sakuraburst - deconstructing nature](https://www.youtube.com/watch?v=MJjO-pwYpJg)
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2026-0214-2315 `v1.20.7` fika
## 🧪 new features
* now possible to upload/delete files while the filesystem-indexer is still busy d44ea245 0ca4c1bd
* global-option [fika](https://copyparty.eu/cli/#g-fika) decides which actions to allow while still indexing; default is upload+copy+delete
* full deduplication is only guaranteed if this option is set blank, as dupes are allowed while indexing
* #1266 browsers can request thumbnails as jxl images, and view jxl files in the gallery (thx @intelfx!) b2711e05 720c83b2 93ffc65c a65a30b1 a7a25deb 59de5e2c 16403d8c 48c10178 0e8913c2
* only works in browsers which support jxl, which is FINALLY happening ([sure took a while](https://issues.chromium.org/issues/40168998))
* some notes on memory/RAM usage though -- it is fine on Alpine Linux, so docker is also fine, just don't enable mimalloc
* jxl can be disabled with global-option [th-no-jxl](https://copyparty.eu/cli/#g-th-no-jxl) if necessary on baremetal deployments until libvips fixes this
* #1265 audioplayer can "skip silence" now (thx @icxes!) 66949989
* #1287 opensearch support for opds (thx @philips!) 84e687a0
* #1276 option [rw-edit](https://copyparty.eu/cli/#g-rw-edit) is the list of file-extensions that can be edited as textfiles with only permissions read+write (default is `md` like before); all other files still require read+write+delete 312f48e1 d6928380
* #1288 option to customize the links copied when selecting files and pressing ctrl-c (thx @icxes!) e5d0a057
* docker: add env-var [DI_PREPARTY](https://github.com/9001/copyparty/blob/hovudstraum/scripts/docker/devnotes.md#modding-on-the-fly) to run an arbitrary script during startup, for customizations and such bf01ca48
## 🩹 bugfixes
* #1279 the textfile-viewer would refuse to load huge documents when hotlinked f02e9cf6
* #1280 the custom rightclick-menu was enabled in the textfile viewer fc8a4b8e
* #1262 logtail now works on windows; would previously take an exclusive-lock on the monitored file, as windows does by default a368fc66
## 🔧 other changes
* volumes are hidden from the treeview if the name starts with a dot 76041fdb
* #1277 `descript.ion` files no longer require the `e2d` and `e2t` options to be enabled 4cb4e820
* chunked PUT-uploads are now terminated if they exceed a configured size limit dfadb5a7
* #1282 improved compatibility with GraalPy (thx @vgskye!) e8609b87
* #1292 #1296 updated Esperanto translation (thx @slashdevslashurandom!) 418bf2f9 914f84ce
* thumbnails: use libvips as fallback for rawpy 27ae2e1e
* libvips doesn't support .arw files (sony) yet, so still need rawpy
* make server config slightly easier:
* improve xff warnings 96aeb898
* warn if config-values are quoted 598df44e
* lowercase headernames in configs fd096385
## 🌠 fun facts
* the `fika` option sends the filesystem-indexer on [a coffee break](https://en.wikipedia.org/wiki/Coffee_in_Sweden#Fika)
* exci wants me to mention aoi yuuki here for some reason :^) so here's [gekisou gungnir](https://www.youtube.com/watch?v=feeFscLH6QE)
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2026-0131-2001 `v1.20.6` one safeguard too many # 2026-0131-2001 `v1.20.6` one safeguard too many

View file

@ -164,7 +164,7 @@
# 📂 also available as volflag "chmod_f" # 📂 also available as volflag "chmod_f"
chmod-f: 644 # hint; default is unset chmod-f: 644 # hint; default is unset
# unix file permissions to use when creating directories; see --help-chmod. Examples: [755] = owner-RW + all-R, [777] = full-yolo # unix file permissions to use when creating directories; see --help-chmod. Examples: [755] = owner-RW + all-R, [2750] = owner-RW + group-R + setgid, [777] = full-yolo
# 📂 also available as volflag "chmod_d" # 📂 also available as volflag "chmod_d"
chmod-d: 755 # default chmod-d: 755 # default

View file

@ -10,11 +10,9 @@ ENV XDG_CONFIG_HOME=/cfg
RUN apk --no-cache add !pyc \ RUN apk --no-cache add !pyc \
tzdata wget mimalloc2 mimalloc2-insecure \ tzdata wget mimalloc2 mimalloc2-insecure \
py3-jinja2 py3-argon2-cffi py3-pyzmq \ py3-jinja2 py3-argon2-cffi py3-pyzmq \
py3-openssl py3-paramiko py3-pillow \ py3-openssl py3-paramiko py3-pillow
ffmpeg
COPY i/dist/copyparty-sfx.py innvikler.sh ./ COPY i innvikler.sh ./
ADD base ./base
RUN ash innvikler.sh ac RUN ash innvikler.sh ac
WORKDIR /state WORKDIR /state

View file

@ -15,15 +15,15 @@ RUN apk add -U !pyc \
py3-jinja2 py3-argon2-cffi py3-pyzmq \ py3-jinja2 py3-argon2-cffi py3-pyzmq \
py3-openssl py3-paramiko py3-pillow \ py3-openssl py3-paramiko py3-pillow \
py3-pip py3-cffi \ py3-pip py3-cffi \
ffmpeg \
py3-magic \ py3-magic \
vips-jxl vips-heif vips-poppler vips-magick \ vips-jxl vips-poppler vips-magick \
py3-numpy fftw libsndfile \ py3-numpy fftw libsndfile \
vamp-sdk vamp-sdk-libs keyfinder-cli \ vamp-sdk vamp-sdk-libs keyfinder-cli \
libraw py3-numpy \ libraw py3-numpy \
&& apk add -t .bd \ && apk add -t .bd \
bash wget gcc g++ make cmake patchelf \ bash wget gcc g++ make cmake patchelf \
python3-dev ffmpeg-dev fftw-dev libsndfile-dev \ ffmpeg ffmpeg-dev \
python3-dev fftw-dev libsndfile-dev \
py3-wheel py3-numpy-dev libffi-dev \ py3-wheel py3-numpy-dev libffi-dev \
vamp-sdk-dev \ vamp-sdk-dev \
libraw-dev py3-numpy-dev cython \ libraw-dev py3-numpy-dev cython \
@ -35,8 +35,7 @@ RUN apk add -U !pyc \
&& chmod 777 /root \ && chmod 777 /root \
&& ln -s /root/vamp /root/.local / && ln -s /root/vamp /root/.local /
COPY i/dist/copyparty-sfx.py innvikler.sh ./ COPY i innvikler.sh ./
ADD base ./base
RUN ash innvikler.sh dj RUN ash innvikler.sh dj
WORKDIR /state WORKDIR /state

View file

@ -12,8 +12,7 @@ RUN apk --no-cache add !pyc \
py3-jinja2 py3-argon2-cffi \ py3-jinja2 py3-argon2-cffi \
py3-openssl py3-paramiko py3-pillow py3-mutagen py3-openssl py3-paramiko py3-pillow py3-mutagen
COPY i/dist/copyparty-sfx.py innvikler.sh ./ COPY i innvikler.sh ./
ADD base ./base
RUN ash innvikler.sh im RUN ash innvikler.sh im
WORKDIR /state WORKDIR /state

View file

@ -12,9 +12,8 @@ RUN apk add -U !pyc \
py3-jinja2 py3-argon2-cffi py3-pyzmq \ py3-jinja2 py3-argon2-cffi py3-pyzmq \
py3-openssl py3-paramiko py3-pillow \ py3-openssl py3-paramiko py3-pillow \
py3-pip py3-cffi \ py3-pip py3-cffi \
ffmpeg \
py3-magic \ py3-magic \
vips-jxl vips-heif vips-poppler vips-magick \ vips-jxl vips-poppler vips-magick \
libraw py3-numpy \ libraw py3-numpy \
&& apk add -t .bd \ && apk add -t .bd \
bash wget gcc g++ make cmake patchelf \ bash wget gcc g++ make cmake patchelf \
@ -25,8 +24,7 @@ RUN apk add -U !pyc \
&& python3 -m pip install "$(wget -O- https://api.github.com/repos/letmaik/rawpy/releases/latest | awk -F\" '$2=="tarball_url"{print$4}')" \ && python3 -m pip install "$(wget -O- https://api.github.com/repos/letmaik/rawpy/releases/latest | awk -F\" '$2=="tarball_url"{print$4}')" \
&& apk del py3-pip .bd && apk del py3-pip .bd
COPY i/dist/copyparty-sfx.py innvikler.sh ./ COPY i innvikler.sh ./
ADD base ./base
RUN ash innvikler.sh iv RUN ash innvikler.sh iv
WORKDIR /state WORKDIR /state

View file

@ -10,7 +10,7 @@ ENV XDG_CONFIG_HOME=/cfg
RUN apk --no-cache add !pyc \ RUN apk --no-cache add !pyc \
py3-jinja2 py3-jinja2
COPY i/dist/copyparty-sfx.py innvikler.sh ./ COPY i innvikler.sh ./
RUN ash innvikler.sh min RUN ash innvikler.sh min
WORKDIR /state WORKDIR /state

View file

@ -2,4 +2,7 @@ FROM alpine:latest
WORKDIR /z WORKDIR /z
RUN apk add py3-pip make gcc musl-dev python3-dev RUN apk add py3-pip make gcc musl-dev python3-dev
RUN pip wheel https://files.pythonhosted.org/packages/c4/a7/0b7673be5945071e99364a3ac1987b02fc1d416617e97f3e8816d275174e/zlib_ng-0.5.1.tar.gz
RUN pip wheel https://files.pythonhosted.org/packages/46/7d/901c6e333fb031b5bfbd1532099200cf859f12aa83689be494eade6685ec/zlib_ng-1.0.0.tar.gz \
&& mkdir whl \
&& mv *.whl whl

View file

@ -1,14 +1,26 @@
self := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) self := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
all: all:
# build all outdated
bash verchk.sh
ff:
# legally comfy
/usr/bin/time ./build-no265.sh img
zlib:
# build zlib-ng from source so we know how the sausage was made # build zlib-ng from source so we know how the sausage was made
# (still only doing the archs which are officially supported/tested) # (still only doing the archs which are officially supported/tested)
podman build --arch amd64 -t localhost/cpp-zlibng-amd64:latest -f Dockerfile.zlibng . podman build --arch amd64 -t localhost/cpp-zlibng-amd64:latest -f Dockerfile.zlibng .
podman run --arch amd64 --rm --log-driver=none -i localhost/cpp-zlibng-amd64:latest tar -cC/z . | tar -xv podman run --arch amd64 --rm --log-driver=none -i localhost/cpp-zlibng-amd64:latest tar -cC/z whl | tar -xv
podman build --arch arm64 -t localhost/cpp-zlibng-amd64:latest -f Dockerfile.zlibng . podman build --arch arm64 -t localhost/cpp-zlibng-amd64:latest -f Dockerfile.zlibng .
podman run --arch arm64 --rm --log-driver=none -i localhost/cpp-zlibng-amd64:latest tar -cC/z . | tar -xv podman run --arch arm64 --rm --log-driver=none -i localhost/cpp-zlibng-amd64:latest tar -cC/z whl | tar -xv
sh: sh:
@printf "\n\033[1;31mopening a shell in the most recently created docker image\033[0m\n" @printf "\n\033[1;31mopening a shell in the most recently created docker image\033[0m\n"

View file

@ -0,0 +1,65 @@
#!/bin/ash
set -e
[ $1 = 1 ] && hub=1
uname -a
apk add alpine-sdk doas wget
echo permit nopass root > /etc/doas.d/u.conf
cp -pv /root/.abuild/*.pub /etc/apk/keys/ || abuild-keygen -ina
##
## yeet h265
mkdir /ffmpeg
cd /ffmpeg
base=https://github.com/alpinelinux/aports/raw/refs/heads/3.23-stable/community/ffmpeg/
wget ${base}APKBUILD
awk <APKBUILD -vb="$base" '/"/{o=0}/^source=/{o=1;next}o{print b $1}' | wget -i-
cp -pv APKBUILD /root/
# grep -E '^extern const.* FF[^ ]+ +ff_(hevc|vvc)_' libavcodec/allcodecs.c libavcodec/hwaccels.h libavcodec/bitstream_filters.c libavcodec/parsers.c libavformat/allformats.c | sed -r 's/.* ff_([^/;]*)_([^/;]*);.*/--disable-\2=\1/' | tr '\n' ' '
sed -ri 's/--enable-libx265/--disable-decoder=hevc --disable-decoder=hevc_qsv --disable-decoder=hevc_rkmpp --disable-encoder=hevc_rkmpp --disable-decoder=hevc_v4l2m2m --disable-decoder=vvc --disable-encoder=hevc_amf --disable-decoder=hevc_amf --disable-decoder=hevc_cuvid --disable-encoder=hevc_d3d12va --disable-decoder=hevc_mediacodec --disable-encoder=hevc_mediacodec --disable-encoder=hevc_mf --disable-encoder=hevc_nvenc --disable-decoder=hevc_oh --disable-encoder=hevc_oh --disable-encoder=hevc_qsv --disable-encoder=hevc_v4l2m2m --disable-encoder=hevc_vaapi --disable-encoder=hevc_videotoolbox --disable-encoder=hevc_vulkan --disable-decoder=vvc_qsv --disable-hwaccel=hevc_d3d11va --disable-hwaccel=hevc_d3d11va2 --disable-hwaccel=hevc_d3d12va --disable-hwaccel=hevc_dxva2 --disable-hwaccel=hevc_nvdec --disable-hwaccel=hevc_vaapi --disable-hwaccel=hevc_vdpau --disable-hwaccel=hevc_videotoolbox --disable-hwaccel=hevc_vulkan --disable-hwaccel=vvc_vaapi --disable-bsf=hevc_metadata --disable-bsf=hevc_mp4toannexb --disable-bsf=vvc_metadata --disable-bsf=vvc_mp4toannexb --disable-parser=hevc --disable-parser=vvc --disable-demuxer=hevc --disable-muxer=hevc --disable-demuxer=vvc --disable-muxer=vvc /;s/\bx265-dev\b//' APKBUILD
##
## yeet aac he/he+/ld (sbr/ps); keep lc only
cat >>APKBUILD <<'EOF'
prepare() {
default_prepare
tar -cC/opt/patch/ffmpeg . | tar -x
patch -p1 <aac-lc-only.patch
}
EOF
##
## shrink-ray
sed -ri 's/--enable-lib(bluray|placebo|rav1e|shaderc)/--disable-lib\1/; s/--enable-(vdpau)/--disable-\1/; s/\b(rav1e|shaderc)-dev//; s/\blib(bluray|placebo|vdpau|xfixes)-dev\b//' APKBUILD
# `- rm placebo+shaderc to drop spirv-tools (1.7 MiB apk)
sed -ri 's/--enable-libxcb/--disable-libxcb --disable-indev=xcbgrab --disable-ffplay --disable-encoder=opus /' APKBUILD
sed -ri 's/\bffplay$//; s/\bsdl2-dev\b//' APKBUILD
##
## golflympics; decode-only, super-specific for copyparty only
[ $hub ] || {
sed -ri 's/--enable-(ladspa|lv2|vaapi|vulkan)/--disable-\1/' APKBUILD
sed -ri 's/--enable-lib(aom|ass|drm|fontconfig|freetype|fribidi|harfbuzz|pulse|rist|srt|ssh|v4l2|vidstab|x264|xvid|zimg|vpl)/--disable-lib\1/' APKBUILD
sed -ri 's/\b(v4l-utils|libvpx)-dev\b//' APKBUILD # (try to) drop v4l2_m2m, and use builtin vp8/vp9 instead of libvpx for decode
sed -ri 's/(--disable-vulkan)/\1 --disable-devices --disable-hwaccels --disable-encoders --enable-encoder=flac --enable-encoder=libjxl --enable-encoder=libmp3lame --enable-encoder=libopus --enable-encoder=libwebp --enable-encoder=mjpeg --enable-encoder=pcm_s16le --enable-encoder=pcm_s16le_planar --enable-encoder=png --enable-encoder=rawvideo --enable-encoder=vnull --enable-encoder=wrapped_avframe --disable-muxers --enable-muxer=aiff --enable-muxer=apng --enable-muxer=caf --enable-muxer=ffmetadata --enable-muxer=fifo --enable-muxer=flac --enable-muxer=image2 --enable-muxer=image2pipe --enable-muxer=matroska --enable-muxer=matroska_audio --enable-muxer=mjpeg --enable-muxer=mp3 --enable-muxer=null --enable-muxer=opus --enable-muxer=pcm_s16le --enable-muxer=wav --enable-muxer=webm --enable-muxer=webp --enable-muxer=yuv4mpegpipe --disable-filters --enable-filter=anoisesrc --enable-filter=asplit --enable-filter=amerge --enable-filter=amix --enable-filter=aresample --enable-filter=crop --enable-filter=showspectrumpic --enable-filter=showwavespic --enable-filter=convolution --enable-filter=volume --enable-filter=compand --enable-filter=setsar --enable-filter=scale --disable-decoder=av1 --disable-hwaccel=v4l2_m2m --disable-decoder=h263_v4l2m2m --disable-decoder=h264_v4l2m2m --disable-decoder=mpeg1_v4l2m2m --disable-decoder=mpeg2_v4l2m2m --disable-decoder=mpeg4_v4l2m2m --disable-decoder=vc1_v4l2m2m --disable-decoder=vp8_v4l2m2m --disable-decoder=vp9_v4l2m2m --disable-decoder=subrip --disable-decoder=srt --disable-decoder=pgssub --disable-decoder=cc_dec --disable-decoder=dvdsub --disable-decoder=dvbsub --disable-decoder=ssa --disable-decoder=ass --disable-decoder=opus /' APKBUILD
# `- s/av1/libdav1d/; s/libvorbis/vorbis/; s/opus/libopus/; libvorbis and mpg123 gets pulled in by openmpt
}
p=/root/packages/$(abuild -A)
rm -rf $p
abuild -FrcK
mkdir $p/ex
mv $p/ffmpeg-d* $p/ex # dbg,dev,doc
cp -pv src/ffmpeg-*/ffbuild/config.log $p/
[ $hub ] && rm -rf $p.hub && mv $p $p.hub
cp -pv /root/.abuild/*.pub ~/packages/

View file

@ -0,0 +1,99 @@
#!/bin/bash
set -e
[ $(id -u) -eq 0 ] && {
echo dont root
exit 1
}
self=$(cd -- "$(dirname "$BASH_SOURCE")"; pwd -P)
cd "$self"
sarchs="386 amd64 arm/v7 arm64/v8 ppc64le s390x"
archs="amd64 amd64 386 arm64 arm s390x ppc64le"
err=
for x in awk jq podman python3 tar wget ; do
command -v $x >/dev/null && continue
err=1; echo ERROR: missing dependency: $x
done
[ $err ] && exit 1
for v in "$@"; do
[ "$v" = pull ] && pull=1
[ "$v" = img ] && img=1
done
[ $# -gt 0 ] || {
echo "need list of commands, for example: pull img"
exit 1
}
wt() {
printf '\033]0;%s\033\\' "$*"
[ -z "$TMUX" ] || tmux renamew "$*"
}
[ $pull ] && {
for a in $sarchs; do # arm/v6
podman pull --arch=$a alpine:latest
done
podman images --format "{{.ID}} {{.History}}" |
awk '/library\/alpine/{print$1}' |
while read id; do
tag=alpine-$(podman inspect $id | jq -r '.[]|.Architecture' | tr / -)
[ -e .tag-$tag ] && continue
touch .tag-$tag
echo tagging $tag
podman untag $id
podman tag $id $tag
done
rm .tag-*
}
[ $img ] && {
mkdir -p "$self/b"
# enable arm32 crossbuild from aarch64 (macbook or whatever)
[ $(uname -m) = aarch64 ] && [ ! -e /proc/sys/fs/binfmt_misc/qemu-arm ] &&
echo ":qemu-arm:M:0:\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:F" |
sudo tee >/dev/null /proc/sys/fs/binfmt_misc/register
# kill abandoned builders
ps aux | awk '/bin\/qemu-[^-]+-static/{print$2}' | xargs -r kill -9
n=0; set -x
for a in $archs; do
n=$((n+1)); wt "$n/$a"
#[ $n -le 3 ] || continue
touch b/t.$a.1.$(date +%s)
tar -c arbeidspakke.sh patch/ffmpeg |
time nice podman run \
--rm -i --pull=never -v "$self/b:/root:z" localhost/alpine-$a \
/bin/ash -c "cd /opt;tar -x;/bin/ash ./arbeidspakke.sh $n $a" 2>&1 |
tee b/log.$a
touch b/t.$a.2.$(date +%s)
done
wt -;wt ""
}
echo ok
# just-no265
# 4m18.77 x64
# 4m22.81 386
# 45m36.44 arm64
# 34m31.22 ppc64le
# 50m01.04 s390x
# golflympics
# 4:09 x86_64-hub
# 2:57 x86_64
# 2:54 x86
# 31:13 aarch64
# 22:38 armv7
# 32:17 s390x
# 24:27 ppc64le
# 2:00:35 summa summarum

View file

@ -0,0 +1,59 @@
remove all advanced aac features, leaving only aac-lc which is
no longer patent-encumbered in any relevant parts of the world
( and 99% of all aac files are lc-aac anyways so that's fine )
diff --git a/libavcodec/aac/aacdec.c b/libavcodec/aac/aacdec.c
index b8d53036d4..054c46f84e 100644
--- a/libavcodec/aac/aacdec.c
+++ b/libavcodec/aac/aacdec.c
@@ -880,9 +880,7 @@ static int decode_pce(AVCodecContext *avctx, MPEG4AudioConfig *m4ac,
*/
static int decode_ga_specific_config(AACDecContext *ac, AVCodecContext *avctx,
- GetBitContext *gb,
- int get_bit_alignment,
- MPEG4AudioConfig *m4ac,
- int channel_config)
+ GetBitContext *gb, int get_bit_alignment, MPEG4AudioConfig *m4ac, int channel_config)
{
+ if (m4ac->sbr > 0) return AVERROR_DECODER_NOT_FOUND;
int extension_flag, ret, ep_config, res_flags;
uint8_t layout_map[MAX_ELEM_ID*4][3];
@@ -961,8 +959,7 @@ static int decode_ga_specific_config(AACDecContext *ac, AVCodecContext *avctx,
static int decode_eld_specific_config(AACDecContext *ac, AVCodecContext *avctx,
- GetBitContext *gb,
- MPEG4AudioConfig *m4ac,
- int channel_config)
+ GetBitContext *gb, MPEG4AudioConfig *m4ac, int channel_config)
{
+ return AVERROR_DECODER_NOT_FOUND; // kill ELD support
int ret, ep_config, res_flags;
uint8_t layout_map[MAX_ELEM_ID*4][3];
@@ -1070,5 +1067,4 @@ static int decode_audio_specific_config_gb(AACDecContext *ac,
case AOT_AAC_LTP:
case AOT_ER_AAC_LC:
- case AOT_ER_AAC_LD:
if ((ret = decode_ga_specific_config(ac, avctx, gb, get_bit_alignment,
&oc->m4ac, m4ac->chan_config)) < 0)
@@ -1948,4 +1944,5 @@ static int decode_extension_payload(AACDecContext *ac, GetBitContext *gb, int cn
crc_flag++;
case EXT_SBR_DATA:
+ return res; // kill HE/SBR support
if (!che) {
av_log(ac->avctx, AV_LOG_ERROR, "SBR was found before the first channel element.\n");
@@ -2087,4 +2084,5 @@ static void spectral_to_sample(AACDecContext *ac, int samples)
}
if (ac->oc[1].m4ac.sbr > 0) {
+ exit(1); // kill HE/SBR support
ac->proc.sbr_apply(ac, che, type,
che->ch[0].output,
diff --git a/libavcodec/aacsbr_template.c b/libavcodec/aacsbr_template.c
index 31d2d844c4..b55f93752a 100644
--- a/libavcodec/aacsbr_template.c
+++ b/libavcodec/aacsbr_template.c
@@ -639,4 +639,5 @@ static int read_sbr_grid(AACDecContext *ac, SpectralBandReplication *sbr,
GetBitContext *gb, SBRData *ch_data)
{
+ exit(1); // kill SBR support
int i;
int bs_pointer = 0;

View file

@ -0,0 +1,26 @@
// just the signatures from the original file; all bodies/logic removed
#include <stdint.h>
#include "libavutil/common.h"
#include "libavutil/mathematics.h"
#include "libavutil/mem_internal.h"
#include "aacps.h"
#if USE_FIXED
#include "aacps_fixed_tablegen.h"
#else
#include "libavutil/internal.h"
#include "aacps_tablegen.h"
#endif /* USE_FIXED */
static void hybrid_analysis(PSDSPContext *dsp, INTFLOAT out[91][32][2],
INTFLOAT in[5][44][2], INTFLOAT L[2][38][64],
int is34, int len) {}
static void hybrid_synthesis(PSDSPContext *dsp, INTFLOAT out[2][38][64],
INTFLOAT in[91][32][2], int is34, int len) {}
static void decorrelation(PSContext *ps, INTFLOAT (*out)[32][2], const INTFLOAT (*s)[32][2], int is34) {}
int AAC_RENAME(ff_ps_apply)(PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top) { return 0; }
av_cold void AAC_RENAME(ff_ps_init)(void) {}

View file

@ -0,0 +1,41 @@
// just the signatures from the original file; all bodies/logic removed
#define USE_FIXED 0
#include "aac.h"
#include "sbr.h"
#include "aacsbr.h"
#include "aacsbrdata.h"
#include "aacps.h"
#include "sbrdsp.h"
#include "libavutil/internal.h"
#include "libavutil/intfloat.h"
#include "libavutil/libm.h"
#include "libavutil/avassert.h"
#include "libavutil/mem_internal.h"
#include <stdint.h>
#include <float.h>
#include <math.h>
static void aacsbr_func_ptr_init(AACSBRContext *c);
static void make_bands(int16_t* bands, int start, int stop, int num_bands) {}
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac) {}
static void sbr_hf_inverse_filter(SBRDSPContext *dsp,
float (*alpha0)[2], float (*alpha1)[2],
const float X_low[32][40][2], int k0) {}
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data) {}
static void sbr_gain_calc(SpectralBandReplication *sbr,
SBRData *ch_data, const int e_a[2]) {}
static void sbr_hf_assemble(float Y1[38][64][2],
const float X_high[64][40][2],
SpectralBandReplication *sbr, SBRData *ch_data,
const int e_a[2]) {}
#include "aacsbr_template.c"

View file

@ -0,0 +1,45 @@
// just the signatures from the original file; all bodies/logic removed
#define USE_FIXED 1
#include "aac.h"
#include "sbr.h"
#include "aacsbr.h"
#include "aacsbrdata.h"
#include "aacps.h"
#include "sbrdsp.h"
#include "libavutil/internal.h"
#include "libavutil/libm.h"
#include "libavutil/avassert.h"
#include <stdint.h>
#include <float.h>
#include <math.h>
static void aacsbr_func_ptr_init(AACSBRContext *c);
static const int CONST_RECIP_LN2 = Q31(0.7);
static const int CONST_076923 = Q31(0.7);
static const int fixed_log_table[] = {Q31(0)};
static int fixed_log(int x) {return 1;}
static void make_bands(int16_t* bands, int start, int stop, int num_bands) {}
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac) {}
static void sbr_hf_inverse_filter(SBRDSPContext *dsp,
int (*alpha0)[2], int (*alpha1)[2],
const int X_low[32][40][2], int k0) {}
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data) {}
static void sbr_gain_calc(SpectralBandReplication *sbr,
SBRData *ch_data, const int e_a[2]) {}
static void sbr_hf_assemble(int Y1[38][64][2],
const int X_high[64][40][2],
SpectralBandReplication *sbr, SBRData *ch_data,
const int e_a[2]) {}
#include "aacsbr_template.c"

View file

@ -0,0 +1,16 @@
// just the signatures from the original file; all bodies/logic removed
#ifndef AVCODEC_AACSBRDATA_H
#define AVCODEC_AACSBRDATA_H
#include <stdint.h>
#include "libavutil/mem_internal.h"
#include "aac_defines.h"
static const int8_t sbr_offset[6][16] = {};
static const DECLARE_ALIGNED(32, INTFLOAT, sbr_qmf_window_ds)[320] = {};
static const DECLARE_ALIGNED(32, INTFLOAT, sbr_qmf_window_us)[640] = {};
#endif /* AVCODEC_AACSBRDATA_H */

24
scripts/docker/base/verchk.sh Executable file
View file

@ -0,0 +1,24 @@
#!/bin/bash
set -e
v=3.23
mkdir -p cver
rm -rf cver2
mkdir cver2
cd cver2
curl \
-Lo1 https://raw.githubusercontent.com/alpinelinux/aports/refs/heads/$v-stable/main/musl/APKBUILD \
-Lo2 https://raw.githubusercontent.com/alpinelinux/aports/refs/heads/$v-stable/main/python3/APKBUILD \
-Lo3 https://raw.githubusercontent.com/alpinelinux/aports/refs/heads/$v-stable/community/ffmpeg/APKBUILD \
;
zlib= ff=
cmp 1 ../cver/1 || zlib=1
cmp 2 ../cver/2 || zlib=1
cmp 3 ../cver/3 || ff=1
echo zlib=$zlib ff=$ff
[ $zlib ] && { make zlib; cp -pv 1 2 ../cver/; }
[ $ff ] && { make ff; cp -pv 3 ../cver/; }
rm -rf cver2

View file

@ -14,15 +14,29 @@ ised() {
tmv "$2" tmv "$2"
} }
# use custom ffmpeg if relevant
echo $1 | grep -qE 'ac|iv|dj' && (
cp -pv /z/packages/*.pub /etc/apk/keys/
cd /z/packages/$(cat /etc/apk/arch)
apk add ./ffmpeg-*.apk
cd /z/test-aac
for f in *.m4a; do ffmpeg -v 0 -i $f ${f%.*}.flac || true; done
ls -1 *.flac | tee /dev/stderr | tr '\n' ' ' | grep -qE '^(lc.flac *)?$' || {
echo ERROR: incorrect aac decoder subset
exit 1
}
)
rm -rf /z/packages /z/test-aac
# use zlib-ng if available # use zlib-ng if available
f=/z/base/zlib_ng-0.5.1-cp312-cp312-linux_$(cat /etc/apk/arch).whl f=/z/whl/zlib_ng-0.5.1-cp312-cp312-linux_$(cat /etc/apk/arch).whl
[ "$1" != min ] && [ -e $f ] && { [ "$1" != min ] && [ -e $f ] && {
apk add -t .bd !pyc py3-pip apk add -t .bd !pyc py3-pip
rm -f /usr/lib/python3*/EXTERNALLY-MANAGED rm -f /usr/lib/python3*/EXTERNALLY-MANAGED
pip install $f pip install $f
apk del .bd apk del .bd
} }
rm -rf /z/base rm -rf /z/whl
# cleanup for flavors with python build steps (dj/iv) # cleanup for flavors with python build steps (dj/iv)
rm -rf /var/cache/apk/* /root/.cache rm -rf /var/cache/apk/* /root/.cache
@ -70,6 +84,11 @@ rm -rf \
/tmp/pe-* /z/copyparty-sfx.py \ /tmp/pe-* /z/copyparty-sfx.py \
ensurepip pydoc_data turtle.py turtledemo lib2to3 ensurepip pydoc_data turtle.py turtledemo lib2to3
cd /usr/lib/python3.*/site-packages
rm -rf \
numpy/*/tests \
/usr/share/mime/packages/freedesktop.org.xml
cd /usr/lib/python3.*/site-packages/copyparty/ cd /usr/lib/python3.*/site-packages/copyparty/
rm stolen/surrogateescape.py rm stolen/surrogateescape.py
iawk '/^[^ ]/{s=0}/^if not VENDORED:/{s=1}!s' qrkode.py iawk '/^[^ ]/{s=0}/^if not VENDORED:/{s=1}!s' qrkode.py

View file

@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
self=$(cd -- "$(dirname "$BASH_SOURCE")"; pwd -P)
cd "$self"
[ $(id -u) -eq 0 ] && { [ $(id -u) -eq 0 ] && {
echo dont root echo dont root
@ -78,6 +80,20 @@ filt=
} }
[ $img ] && { [ $img ] && {
[ -e base/test-aac/lc.m4a ] || (
echo building aac smoketest
mkdir -p base/test-aac
cd base/test-aac
ffmpeg -nostdin -y -f lavfi -i sine -ac 2 -t 1 a.wav &&
fdkaac -m 3 -o lc.m4a a.wav &&
fdkaac -m 2 -p 5 -o he.m4a a.wav &&
fdkaac -m 1 -p 29 -o he2.m4a a.wav &&
fdkaac -m 3 -p 23 -o ld.m4a a.wav &&
fdkaac -m 3 -p 39 -o eld.m4a a.wav ||
echo "nevermind, failed to build test files, cannot verify aac decoding"
rm -f a.wav
)
fp=../../dist/copyparty-sfx.py fp=../../dist/copyparty-sfx.py
[ -e $fp ] || { [ -e $fp ] || {
echo downloading copyparty-sfx.py ... echo downloading copyparty-sfx.py ...
@ -96,7 +112,11 @@ filt=
# grab deps # grab deps
rm -rf i err rm -rf i err
mkdir i mkdir i
tar -cC../.. dist/copyparty-sfx.py bin/mtag | tar -xvCi tar -cC "$self/base" whl test-aac \
-C "$self/base/b" packages \
-C "$self/../.." bin/mtag \
-C dist copyparty-sfx.py \
| tar -xvCi
for i in $imgs; do for i in $imgs; do
podman rm copyparty-$i || true # old manifest podman rm copyparty-$i || true # old manifest

View file

@ -150,7 +150,7 @@ done
rm -rf contrib rm -rf contrib
[ $fast ] && sed -ri s/573/10/ copyparty/web/Makefile [ $fast ] && sed -ri s/573/10/ copyparty/web/Makefile
(cd copyparty/web && make -j$(nproc) && rm Makefile) (cd copyparty/web && make -j$(nproc) && rm Makefile*)
rm -f copyparty/web/deps/README.md rm -f copyparty/web/deps/README.md
# build # build

View file

@ -435,7 +435,11 @@ find -name py.typed -delete
find -type f \( -name .DS_Store -or -name ._.DS_Store \) -delete find -type f \( -name .DS_Store -or -name ._.DS_Store \) -delete
find -type f -name ._\* | while IFS= read -r f; do cmp <(printf '\x00\x05\x16') <(head -c 3 -- "$f") && rm -fv -- "$f"; done find -type f -name ._\* | while IFS= read -r f; do cmp <(printf '\x00\x05\x16') <(head -c 3 -- "$f") && rm -fv -- "$f"; done
rm -f copyparty/web/deps/*.full.* copyparty/web/deps/README.md copyparty/web/dbg-* copyparty/web/Makefile rm -f \
copyparty/web/deps/*.full.* \
copyparty/web/deps/README.md \
copyparty/web/dbg-* \
copyparty/web/Makefile*
find copyparty | LC_ALL=C sort | sed -r 's/\.gz$//;s/$/,/' > have find copyparty | LC_ALL=C sort | sed -r 's/\.gz$//;s/$/,/' > have
cat have | while IFS= read -r x; do cat have | while IFS= read -r x; do
@ -599,6 +603,10 @@ gzres() {
np=$(nproc) np=$(nproc)
echo "$pk #$np" echo "$pk #$np"
find copyparty/web/tl | grep '\.js$' | while IFS= read -r f; do
/bin/sh ../copyparty/web/Makefile.s1 <"$f" >t; tmv "$f"
done
while IFS=' ' read -r _ f; do while IFS=' ' read -r _ f; do
while true; do while true; do
na=$(ps auxwww | grep -F "$pk" | wc -l) na=$(ps auxwww | grep -F "$pk" | wc -l)

View file

@ -23,6 +23,7 @@ v=$1; shift
printf '%s\n' "$v" | grep -qE '^[0-9\.]+$' || exit 1 printf '%s\n' "$v" | grep -qE '^[0-9\.]+$' || exit 1
grep -E "(${v//./, })" ../copyparty/__version__.py || exit 1 grep -E "(${v//./, })" ../copyparty/__version__.py || exit 1
make -C docker/base
./make-sfx.sh nopk gz ./make-sfx.sh nopk gz
../dist/copyparty-sfx.py --version >/dev/null ../dist/copyparty-sfx.py --version >/dev/null

View file

@ -122,6 +122,7 @@ copyparty/web/tl/epo.js,
copyparty/web/tl/fin.js, copyparty/web/tl/fin.js,
copyparty/web/tl/fra.js, copyparty/web/tl/fra.js,
copyparty/web/tl/grc.js, copyparty/web/tl/grc.js,
copyparty/web/tl/hun.js,
copyparty/web/tl/ita.js, copyparty/web/tl/ita.js,
copyparty/web/tl/jpn.js, copyparty/web/tl/jpn.js,
copyparty/web/tl/kor.js, copyparty/web/tl/kor.js,

View file

@ -15,7 +15,7 @@ from copyparty.httpcli import HttpCli
from copyparty.u2idx import U2idx from copyparty.u2idx import U2idx
from copyparty.up2k import Up2k from copyparty.up2k import Up2k
from tests import util as tu from tests import util as tu
from tests.util import Cfg from tests.util import J2_ENV, Cfg
try: try:
from typing import Optional from typing import Optional
@ -23,15 +23,16 @@ except:
pass pass
def hdr(query, uname): def hdr(query, uname, extra=""):
h = "GET /%s HTTP/1.1\r\nPW: %s\r\nConnection: close\r\n\r\n" h = "GET /%s HTTP/1.1\r\nPW: %s\r\nConnection: close\r\n%s\r\n"
return (h % (query, uname)).encode("utf-8") return (h % (query, uname, extra)).encode("utf-8")
class TestDots(unittest.TestCase): class TestDots(unittest.TestCase):
def __init__(self, *a, **ka): def __init__(self, *a, **ka):
super(TestDots, self).__init__(*a, **ka) super(TestDots, self).__init__(*a, **ka)
self.is_dut = True self.is_dut = True
self.j2_brw = None
def setUp(self): def setUp(self):
self.conn: Optional[tu.VHttpConn] = None self.conn: Optional[tu.VHttpConn] = None
@ -49,6 +50,13 @@ class TestDots(unittest.TestCase):
self.conn = None self.conn = None
self.conn = tu.VHttpConn(self.args, self.asrv, self.log, b"") self.conn = tu.VHttpConn(self.args, self.asrv, self.log, b"")
if not self.j2_brw:
zs = os.path.dirname(__file__)
with open("%s/../copyparty/web/browser.html" % (zs,), "rb") as f:
zs = f.read().decode("utf-8")
self.j2_brw = J2_ENV.from_string(zs)
self.conn.hsrv.j2["browser"] = self.j2_brw
def test_dots(self): def test_dots(self):
td = os.path.join(self.td, "vfs") td = os.path.join(self.td, "vfs")
os.mkdir(td) os.mkdir(td)
@ -150,8 +158,10 @@ class TestDots(unittest.TestCase):
os.chdir(td) os.chdir(td)
vcfg = [] vcfg = []
for k in "dk dks dky fk fka dk,fk dks,fk".split(): zs = "dk dks=12 dky fk fka dk,fk dks=12:c,fk"
vcfg += ["{0}:{0}:r.,u1:g,u2:c,{0}".format(k)] for k2 in zs.split():
k = k2.replace("=12", "").replace(":c,", ",")
vcfg += ["{0}:{0}:r.,u1:g,u2:c,{1}".format(k, k2)]
zs = "%s/s1/s2" % (k,) zs = "%s/s1/s2" % (k,)
os.makedirs(zs) os.makedirs(zs)
@ -220,6 +230,15 @@ class TestDots(unittest.TestCase):
zs = self.curl("dks/%s&ls" % (s1), "u2")[1] zs = self.curl("dks/%s&ls" % (s1), "u2")[1]
self.assertIn('"s2/?k=', zs) self.assertIn('"s2/?k=', zs)
# parent key should not exist in response
self.assertNotIn(dk["dks"], zs)
# and not in html either
for ck in ("", "Cookie: js=y\r\n"):
zb = hdr("dks/%s" % (s1), "u2", ck)
zs = self.curl("", "", False, zb)[1]
self.assertNotIn(dk["dks"], zs)
self.assertIn('"s2/?k=', zs)
## ##
## dks thumbs ## dks thumbs
@ -366,7 +385,7 @@ class TestDots(unittest.TestCase):
zb = zs.encode("utf-8") zb = zs.encode("utf-8")
hdr = "POST /%s HTTP/1.1\r\nPW: %s\r\nConnection: close\r\nContent-Type: multipart/form-data; boundary=XD\r\nContent-Length: %d\r\n\r\n" hdr = "POST /%s HTTP/1.1\r\nPW: %s\r\nConnection: close\r\nContent-Type: multipart/form-data; boundary=XD\r\nContent-Length: %d\r\n\r\n"
req = (hdr % (url, uname, len(zb))).encode("utf-8") + zb req = (hdr % (url, uname, len(zb))).encode("utf-8") + zb
h, b = self.curl("/" + url, uname, True, req) h, b = self.curl("", "", True, req)
tar = tarfile.open(fileobj=io.BytesIO(b), mode="r|").getnames() tar = tarfile.open(fileobj=io.BytesIO(b), mode="r|").getnames()
return " ".join(tar) return " ".join(tar)