Compare commits

...

101 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
ed e1c22eaf0e v1.20.7 2026-02-14 23:15:27 +00:00
/dev/urandom 914f84ce5e
update Esperanto translation (#1296)
translate skip-silence section

Signed-off-by: /dev/urandom <53902042+slashdevslashurandom@users.noreply.github.com>
2026-02-14 21:42:41 +00:00
ed ddd5ca84c1 s-s: s/atk/fade/ 2026-02-14 21:24:16 +00:00
ed 0ca4c1bda4 explain fika 2026-02-14 20:06:23 +00:00
ed 3c1bade452 exe: update deps 2026-02-14 19:44:31 +00:00
ed 27ae2e1e66 vips can read most RAWs (not .arw (sony)) 2026-02-14 19:43:33 +00:00
ed dc99c872e0 fix thumbnail names in archives 2026-02-14 19:41:09 +00:00
ed 40e13419e5 th_srv: fix a warning 2026-02-14 19:40:20 +00:00
ed 756494a1c3 audioplayer: hide s-s when unavailable 2026-02-14 19:32:18 +00:00
ed bf01ca4891 docker: add DI_PREPARTY and modding docs 2026-02-14 19:26:21 +00:00
ed cd927e7837 audioplayer: s-s: weave it in 2026-02-13 20:52:56 +00:00
ed 17145ba074 audioplayer: fix eq/s-s compat 2026-02-13 07:22:21 +00:00
ed 3089896be7 simplify <code> in tooltips + misc i18n 2026-02-12 21:27:56 +00:00
ed c8dfcc86f8 add missing localizations; closes #1293 2026-02-12 20:59:26 +00:00
/dev/urandom 418bf2f979
Update Esperanto translation (#1292)
Most `//m` lines are okay, but some suffered from english-isms or needed grammar/capitalization fixes.

Signed-off-by: /dev/urandom <53902042+slashdevslashurandom@users.noreply.github.com>
2026-02-12 19:24:32 +00:00
Brandon Philips 84e687a00d
opds: add opensearch support (#1287)
tested with Moon Reader and Koreader; based on:
https://specs.opds.io/opds-1.2#3-search
https://github.com/koreader/koreader/pull/7380

Signed-off-by: Brandon Philips <brandon@ifup.org>
2026-02-11 22:47:24 +01:00
ed d44ea24530 add fika 2026-02-10 21:25:15 +00:00
ed a9a7c7e746 fix mimes: heics, heifs 2026-02-10 21:22:36 +00:00
exci e5d0a0572d
custom url-origin for ctrl-c (#1288)
add check for alternative clipboard url origin on ctrl-c
2026-02-10 00:01:28 +00:00
ed 0e8913c2d0 jxl in cbz 2026-02-09 20:46:00 +00:00
ed 48c1017843 jxl-enc: add th-qvx (separate qscale) + misc 2026-02-09 20:18:00 +00:00
ed fef34b5465 black 2026-02-09 18:26:35 +00:00
ed 31e7d2d622 del is technically illegal too 2026-02-09 18:11:20 +00:00
Skye e8609b87af
graalpy: workaround buggy inet_pton (#1282) 2026-02-09 08:46:10 +00:00
ed d692838095 rw_edit fixes 2026-02-08 00:43:21 +00:00
ed fd09638567 cfg: lowercase headernames 2026-02-07 23:58:53 +00:00
ed 312f48e17c add rw_edit (closes #1276);
previously, only .md files were editable with permissions read+write;
all other file-extensions required the delete-permission in addition

rw_edit is the list of file-extensions to allow read+write editing of
2026-02-07 23:55:23 +00:00
ed f02e9cf6d3 textfile-viewer: xhr large docs; closes #1279 2026-02-07 22:12:43 +00:00
stackxp fc8a4b8ea2
rcm: disable in textfile-viewer; fixes #1280 (#1281) 2026-02-07 21:47:27 +00:00
ed 76041fdba8 hide dotvols in more apis;
also default-set unlistcr/unlistcw to hide in controlpanel
2026-02-07 20:29:38 +00:00
ed a368fc66b3 tail/follow: add windows support; closes #1262 2026-02-06 18:57:00 +00:00
ed 4cb4e820f6 descript.ion without e2d/e2t; closes #1277 2026-02-05 22:27:56 +00:00
ed 6c96c64605 meta: adjust bug-report template (#1275) 2026-02-05 21:53:37 +00:00
ed dfadb5a7ba truncate chunked PUT at sizelimit; closes #1272 2026-02-05 19:56:04 +00:00
ed 16403d8c6c jxl-thumbs through ?tar/zip 2026-02-04 00:39:25 +00:00
Ivan Shapovalov 59de5e2ca8 th: deduplicate libvips logic between ThumbSrv.conv_{vips,raw}()
No functional change intended.

This would potentially be useful later if and when libvips gains
additional encoding/decoding options for other formats (like jxl)
and we decide to use them.
2026-02-04 01:34:04 +01:00
Ivan Shapovalov a7a25debe4 th: hack: configure pyvips cache and invalidate images
Attempt to reduce memory usage.
2026-02-04 01:34:04 +01:00
Ivan Shapovalov a65a30b1b4 web, th: rudimentary jxl support
Fixes #724.
2026-02-04 01:34:04 +01:00
Ivan Shapovalov 93ffc65c14 web: baguettebox: sort and add missing image extensions 2026-02-04 01:34:04 +01:00
Ivan Shapovalov 720c83b2ff th: factor out IMG_EXTS 2026-02-04 01:34:04 +01:00
Ivan Shapovalov b2711e05b6 th: account for HAVE_WEBP when computing PIL-able extensions 2026-02-04 01:34:04 +01:00
exci 6694998985
audioplayer: add skip-silence feature (#1265)
* add skip silence option
2026-02-02 22:45:17 +00:00
ed 598df44e87 cfg: warn on quotes 2026-02-02 19:08:56 +00:00
ed 96aeb898ae intuitive config-syntax in logs 2026-02-02 19:07:54 +00:00
ed 9b436eb52e update pkgs to 1.20.6 2026-01-31 20:06:34 +00:00
ed ff2200ff85 v1.20.6 2026-01-31 20:01:36 +00:00
ed 0a41d0c03b shares: require at least one permission 2026-01-31 19:57:48 +00:00
ed 72224d29d6 allow X-Forwarded-HTTP-Version;
the request-header safeguard added in v1.20.5 was too strict
2026-01-31 19:11:16 +00:00
ed 95b827f1a5 shares: add get perm (closes #1264);
option was available in ui but never implemented serverside
2026-01-31 18:06:22 +00:00
ed 32c11f142e update pkgs to 1.20.5 2026-01-30 21:49:40 +00:00
ed e2dc6d33bf v1.20.5 2026-01-30 21:45:16 +00:00
ed 9c14972da6 ctrl-c also copies links to clipboard; closes #1182 2026-01-30 20:39:48 +00:00
ed 530afddc6a readme: mention cbz reader 2026-01-30 20:16:16 +00:00
ed 08b0abdbdd small optimizations 2026-01-30 20:08:29 +00:00
ed ed6a8d5a73 optimize CL/TE check;
replace the heavyhanded connection:close added in b4fddbc3d
with a comparison of content-length to num bytes consumed

this approach also covers incorrectly configured servers
where the reverseproxy was not detected

also adds explicit TE/CL handling, even though most
(all?) reverseproxies already prevent such issues

also adds explicit sanchk of up2k chunk-receiver,
in case any bugs are ever added there
2026-01-30 20:06:02 +00:00
Skye 73d06eaf84
add support for GraalPy (#1260)
Co-authored-by: ed <s@ocv.me>
2026-01-30 17:49:02 +00:00
stackxp 22cdc0f8c9
remove nth and fix nih description (#1257)
Co-authored-by: ed <s@ocv.me>
2026-01-29 18:28:21 +00:00
charel 79273a7d97
OpenRC: Add checkconfig function (#1259)
I found it slightly cumbersome to write a config when the only feedback OpenRC gives is `crashed`, so I added a small QOL function to run copyparty with the `--exit cfg` flag directly from the service.

Signed-off-by: charel <charel@lotsaspaghetti.com>
2026-01-29 18:16:25 +00:00
ed 2f57228fd4 webdeps: vendor busy.mp3 (#1252);
mainly with reproducible builds in mind,
and after all it's only 106 bytes
2026-01-26 23:34:06 +00:00
ed b6bf6d5f7a shares: fix lifetime-extend; closes #1248 2026-01-25 21:40:16 +00:00
ed 24141b494b another request-smuggling failsafe;
could concievably help when behind a buggy reverseproxy
2026-01-25 21:38:18 +00:00
ed 8e046fb6a8 webdav: fix macos-finder connect delay (closes #1242);
if both `quota-available-bytes` and `quotaused` are ignored
(not even returned as 404), then macos Finder is able to
connect instantly, avoiding this longstanding bug in macos

the presence of `quotaused` is the trigger for this logic, which
is a property apple invented and only apple uses, meaning we can
safely break the webdav spec as required in this case

thx @freddyheppell for the observation
2026-01-25 16:35:15 +00:00
Josh Willox 296362fc84
webdav: x-oc-mtime as float (#1240); closes #1239 2026-01-25 16:31:45 +00:00
ed b20d32593e prism: change language subset;
* add nasm (+0.3 K)
* rm autohotkey (-3.8 K)
* rm cmake (-4.0 K)
2026-01-25 16:26:23 +00:00
000yesnt 69fa1d10bc
update Portuguese translation (#1245)
* portuguese tl: verify and adjust strings
* portuguese tl: fix newlines
* portuguese tl: change rc_zip wording
2026-01-25 16:25:30 +00:00
ed 5c4ba376a0 fix ie11 spinlock in write-only folders 2026-01-25 00:25:24 +00:00
ed bef30ac04d webdeps: vendor asmcrypto.js;
npm is no longer able to build it, and the build output
never changed since copyparty v0.11.20 (2021-06-20) /
asmcrypto 2821dd1dedd1196c378f5854037dda5c869313f3 (2018-12-02)

one final pass of reasonable size-golfing was done by hand

deflated with pigz -11 -I250
2026-01-25 00:22:54 +00:00
ed d734786c1d meta: gitattributes 2026-01-24 19:37:54 +00:00
George Rawlinson 59e2d77df9
update prism webdep (#1238)
* update prism to 1.30.0
* split out prism plugins
* deps: list all prism langs
2026-01-24 17:16:20 +00:00
ed d750f3f0d2 update pkgs to 1.20.4 2026-01-23 00:59:41 +00:00
ed c249ee457b v1.20.4 2026-01-23 00:55:08 +00:00
ed b4fddbc3d2 no keepalive when request is proxied;
consider each request individually
rather than the previous general approach
2026-01-23 00:46:05 +00:00
ed 81e5eb7b27 shares: lan button; closes #1232 2026-01-23 00:31:13 +00:00
/dev/urandom 1142ac2563
Esperanto translation update (#1229)
Important changes:

The "shift" key is called "MAJ" (short for "majuskla" for "uppercase") in the translation, so the new lines have been updated.

"beligi json" is technically a valid string, but the "-on" ending could be confused for a grammatical ending, with the whole string being interpreted as "beautify javascript" instead, so instead "JSON" is capitalized and another "on" ending is added.

A few commas are added for readability.

Signed-off-by: /dev/urandom <53902042+slashdevslashurandom@users.noreply.github.com>
2026-01-23 00:14:30 +00:00
Diego Passos Couto ffca67f25a
rcm: new file/folder in gridview (#1235)
enables creation of files/folders in grid-view

---------

Co-authored-by: ed <s@ocv.me>
2026-01-23 00:06:11 +00:00
ed e1eff21623 no keepalive when proxied (#1231);
might help prevent desync
2026-01-22 23:54:42 +00:00
ed dc8c229bcd update pkgs to 1.20.3 2026-01-21 05:09:47 +00:00
104 changed files with 3287 additions and 695 deletions

1
.gitattributes vendored
View file

@ -4,3 +4,4 @@
*.png binary *.png binary
*.gif binary *.gif binary
*.gz binary

View file

@ -9,7 +9,9 @@ assignees: '9001'
<!-- NOTE: <!-- NOTE:
**please use english, or include an english translation.** aside from that, **please use english, or include an english translation.** aside from that,
all of the below are optional, consider them as inspiration, delete and rewrite at will, thx md --> include all of the information that might possibly be necessary to help diagnose your issue,
especially things like the server config and server logs; that said,
any parts below which are obviously and definitely irrelevant can be skipped -->
### Describe the bug ### Describe the bug
a description of what the bug is a description of what the bug is

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

@ -286,6 +286,7 @@ also see [comparison to similar software](./docs/versus.md)
* ☑ play video files as audio (converted on server) * ☑ play video files as audio (converted on server)
* ☑ create and play [m3u8 playlists](#playlists) * ☑ create and play [m3u8 playlists](#playlists)
* ☑ image gallery with webm player * ☑ image gallery with webm player
* ☑ and cbz manga/comics reader
* ☑ [textfile browser](#textfile-viewer) with syntax highlighting * ☑ [textfile browser](#textfile-viewer) with syntax highlighting
* ☑ realtime streaming of growing files (logfiles and such) * ☑ realtime streaming of growing files (logfiles and such)
* ☑ [thumbnails](#thumbnails) * ☑ [thumbnails](#thumbnails)
@ -491,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
@ -760,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:
@ -1437,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)
@ -2423,6 +2426,7 @@ buggy feature? rip it out by setting any of the following environment variables
| env-var | what it does | | env-var | what it does |
| -------------------- | ------------ | | -------------------- | ------------ |
| `PRTY_NO_CTYPES` | do not use features from external libraries such as kernel32 |
| `PRTY_NO_DB_LOCK` | do not lock session/shares-databases for exclusive access | | `PRTY_NO_DB_LOCK` | do not lock session/shares-databases for exclusive access |
| `PRTY_NO_IFADDR` | disable ip/nic discovery by poking into your OS with ctypes | | `PRTY_NO_IFADDR` | disable ip/nic discovery by poking into your OS with ctypes |
| `PRTY_NO_IMPRESO` | do not try to load js/css files using `importlib.resources` | | `PRTY_NO_IMPRESO` | do not try to load js/css files using `importlib.resources` |
@ -3087,6 +3091,7 @@ set any of the following environment variables to disable its associated optiona
| `PRTY_NO_PILF` | disable Pillow `ImageFont` text rendering, used for folder thumbnails | | `PRTY_NO_PILF` | disable Pillow `ImageFont` text rendering, used for folder thumbnails |
| `PRTY_NO_PIL_AVIF` | disable Pillow avif support (internal and/or [plugin](https://pypi.org/project/pillow-avif-plugin/)) | | `PRTY_NO_PIL_AVIF` | disable Pillow avif support (internal and/or [plugin](https://pypi.org/project/pillow-avif-plugin/)) |
| `PRTY_NO_PIL_HEIF` | disable 3rd-party Pillow plugin for [HEIF support](https://pypi.org/project/pillow-heif/) | | `PRTY_NO_PIL_HEIF` | disable 3rd-party Pillow plugin for [HEIF support](https://pypi.org/project/pillow-heif/) |
| `PRTY_NO_PIL_JXL` | disable 3rd-party Pillow plugin for [JXL support](https://pypi.org/project/pillow-jxl-plugin/) |
| `PRTY_NO_PIL_WEBP` | disable use of native webp support in Pillow | | `PRTY_NO_PIL_WEBP` | disable use of native webp support in Pillow |
| `PRTY_NO_PSUTIL` | do not use [psutil](https://pypi.org/project/psutil/) for reaping stuck hooks and plugins on Windows | | `PRTY_NO_PSUTIL` | do not use [psutil](https://pypi.org/project/psutil/) for reaping stuck hooks and plugins on Windows |
| `PRTY_NO_PYFTPD` | disable ftp(s) server ([pyftpdlib](https://pypi.org/project/pyftpdlib/)-based) | | `PRTY_NO_PYFTPD` | disable ftp(s) server ([pyftpdlib](https://pypi.org/project/pyftpdlib/)-based) |

View file

@ -9,10 +9,19 @@
# you may want to: # you may want to:
# change '/usr/bin/python' to another interpreter # change '/usr/bin/python' to another interpreter
# change '/mnt::rw' to another location or permission-set # change '/mnt::rw' to another location or permission-set
# use a config file instead of command arguments, e.g.:
# command_args="-c /etc/copyparty.conf"
name="$SVCNAME" name="$SVCNAME"
command_background=true command_background=true
extra_commands="checkconfig"
pidfile="/var/run/$SVCNAME.pid" pidfile="/var/run/$SVCNAME.pid"
command="/usr/bin/python3 /usr/local/bin/copyparty-sfx.py" command="/usr/bin/python3 /usr/local/bin/copyparty-sfx.py"
command_args="-q -v /mnt::rw" command_args="-q -v /mnt::rw"
checkconfig() {
ebegin "Checking $RC_SVCNAME configuration"
$command $command_args --exit cfg
eend $?
}

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.2" 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=("f4fc7a53a6d23163426f4f0f407c7aa53984e0b7a7b0b33700464bc7d7f3bd95") 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.2 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=("f4fc7a53a6d23163426f4f0f407c7aa53984e0b7a7b0b33700464bc7d7f3bd95") 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.2/copyparty-1.20.2.tar.gz", "url": "https://github.com/9001/copyparty/releases/download/v1.20.10/copyparty-1.20.10.tar.gz",
"version": "1.20.2", "version": "1.20.10",
"hash": "sha256-9Px6U6bSMWNCb08PQHx6pTmE4LensLM3AEZLx9fzvZU=" "hash": "sha256-plHfKrdo698vQbf/Hh/seIroo0hIziKMGJ8tD1Zsn9k="
} }

View file

@ -36,7 +36,7 @@
for (var a = 0; a < files.length; a++) { for (var a = 0; a < files.length; a++) {
var file = files[a], var file = files[a],
is_pic = /\.(jpe?g|png|gif|webp)$/i.exec(file.vp), is_pic = /\.(jpe?g|png|gif|webp|jxl)$/i.exec(file.vp),
is_audio = re_au_all.exec(file.vp), is_audio = re_au_all.exec(file.vp),
basename = file.vp.replace(/\.[^\.]+$/, ""), basename = file.vp.replace(/\.[^\.]+$/, ""),
entry = pairs[basename]; entry = pairs[basename];

View file

@ -44,6 +44,8 @@ ANYWIN = WINDOWS or sys.platform in ["msys", "cygwin"]
MACOS = platform.system() == "Darwin" MACOS = platform.system() == "Darwin"
GRAAL = platform.python_implementation() == "GraalVM"
EXE = bool(getattr(sys, "frozen", False)) EXE = bool(getattr(sys, "frozen", False))
try: try:
@ -106,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

@ -63,6 +63,7 @@ from .util import (
Daemon, Daemon,
align_tab, align_tab,
b64enc, b64enc,
ctypes,
dedent, dedent,
has_resource, has_resource,
load_resource, load_resource,
@ -70,6 +71,7 @@ from .util import (
pybin, pybin,
read_utf8, read_utf8,
termsize, termsize,
wk32,
wrap, wrap,
) )
@ -477,6 +479,21 @@ def expand_cfg(argv) -> list[str]:
return argv return argv
def quotecheck(al):
for zs1, zco in vars(al).items():
zsl = [u(x) for x in zco] if isinstance(zco, list) else [u(zco)]
for zs2 in zsl:
zs2 = zs2.strip()
zs3 = zs2.strip("\"'")
if zs2 == zs3 or len(zs2) - len(zs3) < 2:
continue
if al.c:
t = "found the following global-config: %s: %s\n values should not be quoted; did you mean: %s: %s"
else:
t = 'found the following config-option: "--%s=%s"\n values should not be quoted; did you mean: "--%s=%s"'
warn(t % (zs1, zs2, zs1, zs3))
def sighandler(sig: Optional[int] = None, frame: Optional[FrameType] = None) -> None: def sighandler(sig: Optional[int] = None, frame: Optional[FrameType] = None) -> None:
msg = [""] * 5 msg = [""] * 5
for th in threading.enumerate(): for th in threading.enumerate():
@ -489,8 +506,10 @@ def sighandler(sig: Optional[int] = None, frame: Optional[FrameType] = None) ->
def disable_quickedit() -> None: def disable_quickedit() -> None:
if not ctypes:
raise Exception("no ctypes")
import atexit import atexit
import ctypes
from ctypes import wintypes from ctypes import wintypes
def ecb(ok: bool, fun: Any, args: list[Any]) -> list[Any]: def ecb(ok: bool, fun: Any, args: list[Any]) -> list[Any]:
@ -500,10 +519,10 @@ def disable_quickedit() -> None:
raise ctypes.WinError(err) # type: ignore raise ctypes.WinError(err) # type: ignore
return args return args
k32 = ctypes.WinDLL(str("kernel32"), use_last_error=True) # type: ignore
if PY2: if PY2:
wintypes.LPDWORD = ctypes.POINTER(wintypes.DWORD) wintypes.LPDWORD = ctypes.POINTER(wintypes.DWORD)
k32 = wk32
k32.GetStdHandle.errcheck = ecb # type: ignore k32.GetStdHandle.errcheck = ecb # type: ignore
k32.GetConsoleMode.errcheck = ecb # type: ignore k32.GetConsoleMode.errcheck = ecb # type: ignore
k32.SetConsoleMode.errcheck = ecb # type: ignore k32.SetConsoleMode.errcheck = ecb # type: ignore
@ -1040,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
@ -1056,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
@ -1242,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)")
@ -1459,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)")
@ -1558,9 +1581,8 @@ def add_optouts(ap):
ap2.add_argument("--no-mv", action="store_true", help="disable move/rename operations") ap2.add_argument("--no-mv", action="store_true", help="disable move/rename operations")
ap2.add_argument("--no-cp", action="store_true", help="disable copy operations") ap2.add_argument("--no-cp", action="store_true", help="disable copy operations")
ap2.add_argument("--no-fs-abrt", action="store_true", help="disable ability to abort ongoing copy/move") ap2.add_argument("--no-fs-abrt", action="store_true", help="disable ability to abort ongoing copy/move")
ap2.add_argument("-nth", action="store_true", help="no title hostname; don't show \033[33m--name\033[0m in <title>") ap2.add_argument("-nih", action="store_true", help="no info hostname -- removes it from the UI corner, but the value of \033[33m--bname\033[0m still shows in the browsertab title")
ap2.add_argument("-nih", action="store_true", help="no info hostname -- don't show in UI") ap2.add_argument("-nid", action="store_true", help="no info disk-usage -- don't show in UI. This is the same as \033[33m--du-who no\033[0m")
ap2.add_argument("-nid", action="store_true", help="no info disk-usage -- don't show in UI. This is the same as --du-who no")
ap2.add_argument("-nb", action="store_true", help="no powered-by-copyparty branding in UI") ap2.add_argument("-nb", action="store_true", help="no powered-by-copyparty branding in UI")
ap2.add_argument("--smsg", metavar="T,T", type=u, default="POST", help="HTTP-methods to allow ?smsg for; will execute xm hooks like urlform / message-to-serverlog; dangerous example: [\033[32mGET,POST\033[0m]. \033[1;31mWARNING:\033[0m The default (POST) is safe, but GET is dangerous; security/CSRF hazard") ap2.add_argument("--smsg", metavar="T,T", type=u, default="POST", help="HTTP-methods to allow ?smsg for; will execute xm hooks like urlform / message-to-serverlog; dangerous example: [\033[32mGET,POST\033[0m]. \033[1;31mWARNING:\033[0m The default (POST) is safe, but GET is dangerous; security/CSRF hazard")
ap2.add_argument("--zipmaxn", metavar="N", type=u, default="0", help="reject download-as-zip if more than \033[33mN\033[0m files in total; optionally takes a unit suffix: [\033[32m256\033[0m], [\033[32m9K\033[0m], [\033[32m4G\033[0m] (volflag=zipmaxn)") ap2.add_argument("--zipmaxn", metavar="N", type=u, default="0", help="reject download-as-zip if more than \033[33mN\033[0m files in total; optionally takes a unit suffix: [\033[32m256\033[0m], [\033[32m9K\033[0m], [\033[32m4G\033[0m] (volflag=zipmaxn)")
@ -1654,7 +1676,7 @@ def add_logging(ap):
ap2.add_argument("--log-htp", action="store_true", help="debug: print http-server threadpool scaling") ap2.add_argument("--log-htp", action="store_true", help="debug: print http-server threadpool scaling")
ap2.add_argument("--ihead", metavar="HEADER", type=u, action='append', help="print request \033[33mHEADER\033[0m; [\033[32m*\033[0m]=all") ap2.add_argument("--ihead", metavar="HEADER", type=u, action='append', help="print request \033[33mHEADER\033[0m; [\033[32m*\033[0m]=all")
ap2.add_argument("--ohead", metavar="HEADER", type=u, action='append', help="print response \033[33mHEADER\033[0m; [\033[32m*\033[0m]=all") ap2.add_argument("--ohead", metavar="HEADER", type=u, action='append', help="print response \033[33mHEADER\033[0m; [\033[32m*\033[0m]=all")
ap2.add_argument("--lf-url", metavar="RE", type=u, default=r"^/\.cpr/|[?&]th=[wjp]|/\.(_|ql_|DS_Store$|localized$)", help="dont log URLs matching regex \033[33mRE\033[0m") ap2.add_argument("--lf-url", metavar="RE", type=u, default=r"^/\.cpr/|[?&]th=[xwjp]|/\.(_|ql_|DS_Store$|localized$)", help="dont log URLs matching regex \033[33mRE\033[0m")
ap2.add_argument("--scan-st-r", metavar="SEC", type=float, default=0.1, help="fs-indexing: wait \033[33mSEC\033[0m between each status-message") ap2.add_argument("--scan-st-r", metavar="SEC", type=float, default=0.1, help="fs-indexing: wait \033[33mSEC\033[0m between each status-message")
ap2.add_argument("--scan-pr-r", metavar="SEC", type=float, default=10, help="fs-indexing: wait \033[33mSEC\033[0m between each 'progress:' message") ap2.add_argument("--scan-pr-r", metavar="SEC", type=float, default=10, help="fs-indexing: wait \033[33mSEC\033[0m between each 'progress:' message")
ap2.add_argument("--scan-pr-s", metavar="MiB", type=float, default=1, help="fs-indexing: say 'file: <name>' when a file larger than \033[33mMiB\033[0m is about to be hashed") ap2.add_argument("--scan-pr-s", metavar="MiB", type=float, default=1, help="fs-indexing: say 'file: <name>' when a file larger than \033[33mMiB\033[0m is about to be hashed")
@ -1688,10 +1710,12 @@ def add_thumbnail(ap):
ap2.add_argument("--th-ram-max", metavar="GB", type=float, default=th_ram, help="max memory usage (GiB) permitted by thumbnailer; not very accurate") ap2.add_argument("--th-ram-max", metavar="GB", type=float, default=th_ram, help="max memory usage (GiB) permitted by thumbnailer; not very accurate")
ap2.add_argument("--th-crop", metavar="TXT", type=u, default="y", help="crop thumbnails to 4:3 or keep dynamic height; client can override in UI unless force. [\033[32my\033[0m]=crop, [\033[32mn\033[0m]=nocrop, [\033[32mfy\033[0m]=force-y, [\033[32mfn\033[0m]=force-n (volflag=crop)") ap2.add_argument("--th-crop", metavar="TXT", type=u, default="y", help="crop thumbnails to 4:3 or keep dynamic height; client can override in UI unless force. [\033[32my\033[0m]=crop, [\033[32mn\033[0m]=nocrop, [\033[32mfy\033[0m]=force-y, [\033[32mfn\033[0m]=force-n (volflag=crop)")
ap2.add_argument("--th-x3", metavar="TXT", type=u, default="n", help="show thumbs at 3x resolution; client can override in UI unless force. [\033[32my\033[0m]=yes, [\033[32mn\033[0m]=no, [\033[32mfy\033[0m]=force-yes, [\033[32mfn\033[0m]=force-no (volflag=th3x)") ap2.add_argument("--th-x3", metavar="TXT", type=u, default="n", help="show thumbs at 3x resolution; client can override in UI unless force. [\033[32my\033[0m]=yes, [\033[32mn\033[0m]=no, [\033[32mfy\033[0m]=force-yes, [\033[32mfn\033[0m]=force-no (volflag=th3x)")
ap2.add_argument("--th-qv", metavar="N", type=int, default=40, help="thumbnail quality (10~90); higher is larger filesize and better quality (volflag=th_qv)") ap2.add_argument("--th-qv", metavar="N", type=int, default=40, help="webp/jpg thumbnail quality (10~90); higher is larger filesize and better quality (volflag=th_qv)")
ap2.add_argument("--th-dec", metavar="LIBS", default="vips,pil,raw,ff", help="image decoders, in order of preference") ap2.add_argument("--th-qvx", metavar="N", type=int, default=64, help="jxl thumbnail quality (10~90); higher is larger filesize and better quality (volflag=th_qvx)")
ap2.add_argument("--th-dec", metavar="LIBS", default="vips,raw,pil,ff", help="image decoders, in order of preference")
ap2.add_argument("--th-no-jpg", action="store_true", help="disable jpg output") ap2.add_argument("--th-no-jpg", action="store_true", help="disable jpg output")
ap2.add_argument("--th-no-webp", action="store_true", help="disable webp output") ap2.add_argument("--th-no-webp", action="store_true", help="disable webp output")
ap2.add_argument("--th-no-jxl", action="store_true", help="disable jpeg-xl output")
ap2.add_argument("--th-ff-jpg", action="store_true", help="force jpg output for video thumbs (avoids issues on some FFmpeg builds)") ap2.add_argument("--th-ff-jpg", action="store_true", help="force jpg output for video thumbs (avoids issues on some FFmpeg builds)")
ap2.add_argument("--th-ff-swr", action="store_true", help="use swresample instead of soxr for audio thumbs (faster, lower accuracy, avoids issues on some FFmpeg builds)") ap2.add_argument("--th-ff-swr", action="store_true", help="use swresample instead of soxr for audio thumbs (faster, lower accuracy, avoids issues on some FFmpeg builds)")
ap2.add_argument("--th-poke", metavar="SEC", type=int, default=300, help="activity labeling cooldown -- avoids doing keepalive pokes (updating the mtime) on thumbnail folders more often than \033[33mSEC\033[0m seconds") ap2.add_argument("--th-poke", metavar="SEC", type=int, default=300, help="activity labeling cooldown -- avoids doing keepalive pokes (updating the mtime) on thumbnail folders more often than \033[33mSEC\033[0m seconds")
@ -1703,9 +1727,9 @@ def add_thumbnail(ap):
# https://github.com/libvips/libvips # https://github.com/libvips/libvips
# https://stackoverflow.com/a/47612661 # https://stackoverflow.com/a/47612661
# ffmpeg -hide_banner -demuxers | awk '/^ D /{print$2}' | while IFS= read -r x; do ffmpeg -hide_banner -h demuxer=$x; done | grep -E '^Demuxer |extensions:' # ffmpeg -hide_banner -demuxers | awk '/^ D /{print$2}' | while IFS= read -r x; do ffmpeg -hide_banner -h demuxer=$x; done | grep -E '^Demuxer |extensions:'
ap2.add_argument("--th-r-pil", metavar="T,T", type=u, default="avif,avifs,blp,bmp,cbz,dcx,dds,dib,emf,eps,epub,fits,flc,fli,fpx,gif,heic,heics,heif,heifs,icns,ico,im,j2p,j2k,jp2,jpeg,jpg,jpx,pbm,pcx,pgm,png,pnm,ppm,psd,qoi,sgi,spi,tga,tif,tiff,webp,wmf,xbm,xpm", help="image formats to decode using pillow") ap2.add_argument("--th-r-pil", metavar="T,T", type=u, default="avif,avifs,blp,bmp,cbz,dcx,dds,dib,emf,eps,epub,fits,flc,fli,fpx,gif,heic,heics,heif,heifs,icns,ico,im,j2p,j2k,jp2,jpeg,jpg,jpx,jxl,pbm,pcx,pgm,png,pnm,ppm,psd,qoi,sgi,spi,tga,tif,tiff,webp,wmf,xbm,xpm", help="image formats to decode using pillow")
ap2.add_argument("--th-r-vips", metavar="T,T", type=u, default="avif,exr,fit,fits,fts,gif,hdr,heic,heics,heif,heifs,jp2,jpeg,jpg,jpx,jxl,nii,pfm,pgm,png,ppm,svg,tif,tiff,webp", help="image formats to decode using pyvips") ap2.add_argument("--th-r-vips", metavar="T,T", type=u, default="3fr,avif,cr2,cr3,crw,dcr,dng,erf,exr,fit,fits,fts,gif,hdr,heic,heics,heif,heifs,jp2,jpeg,jpg,jpx,jxl,k25,mdc,mef,mrw,nef,nii,pfm,pgm,png,ppm,raf,raw,sr2,srf,svg,tif,tiff,webp,x3f", help="image formats to decode using pyvips")
ap2.add_argument("--th-r-raw", metavar="T,T", type=u, default="arw,cr2,cr3,crw,dcr,dng,erf,k25,kdc,mrw,nef,orf,pef,raf,raw,sr2,srf,x3f", help="image formats to decode using rawpy") ap2.add_argument("--th-r-raw", metavar="T,T", type=u, default="3fr,arw,cr2,cr3,crw,dcr,dng,erf,k25,kdc,mdc,mef,mos,mrw,nef,nrw,orf,pef,raf,raw,sr2,srf,srw,x3f", help="image formats to decode using rawpy")
ap2.add_argument("--th-r-ffi", metavar="T,T", type=u, default="apng,avif,avifs,bmp,cbz,dds,dib,epub,fit,fits,fts,gif,hdr,heic,heics,heif,heifs,icns,ico,jp2,jpeg,jpg,jpx,jxl,pbm,pcx,pfm,pgm,png,pnm,ppm,psd,qoi,sgi,tga,tif,tiff,webp,xbm,xpm", help="image formats to decode using ffmpeg") ap2.add_argument("--th-r-ffi", metavar="T,T", type=u, default="apng,avif,avifs,bmp,cbz,dds,dib,epub,fit,fits,fts,gif,hdr,heic,heics,heif,heifs,icns,ico,jp2,jpeg,jpg,jpx,jxl,pbm,pcx,pfm,pgm,png,pnm,ppm,psd,qoi,sgi,tga,tif,tiff,webp,xbm,xpm", help="image formats to decode using ffmpeg")
ap2.add_argument("--th-r-ffv", metavar="T,T", type=u, default="3gp,asf,av1,avc,avi,flv,h264,h265,hevc,m4v,mjpeg,mjpg,mkv,mov,mp4,mpeg,mpeg2,mpegts,mpg,mpg2,mts,nut,ogm,ogv,rm,ts,vob,webm,wmv", help="video formats to decode using ffmpeg") ap2.add_argument("--th-r-ffv", metavar="T,T", type=u, default="3gp,asf,av1,avc,avi,flv,h264,h265,hevc,m4v,mjpeg,mjpg,mkv,mov,mp4,mpeg,mpeg2,mpegts,mpg,mpg2,mts,nut,ogm,ogv,rm,ts,vob,webm,wmv", help="video formats to decode using ffmpeg")
ap2.add_argument("--th-r-ffa", metavar="T,T", type=u, default="aac,ac3,aif,aiff,alac,alaw,amr,apac,ape,au,bonk,dfpwm,dts,flac,gsm,ilbc,it,itgz,itxz,itz,m4a,mdgz,mdxz,mdz,mo3,mod,mp2,mp3,mpc,mptm,mt2,mulaw,oga,ogg,okt,opus,ra,s3m,s3gz,s3xz,s3z,tak,tta,ulaw,wav,wma,wv,xm,xmgz,xmxz,xmz,xpk", help="audio formats to decode using ffmpeg") ap2.add_argument("--th-r-ffa", metavar="T,T", type=u, default="aac,ac3,aif,aiff,alac,alaw,amr,apac,ape,au,bonk,dfpwm,dts,flac,gsm,ilbc,it,itgz,itxz,itz,m4a,mdgz,mdxz,mdz,mo3,mod,mp2,mp3,mpc,mptm,mt2,mulaw,oga,ogg,okt,opus,ra,s3m,s3gz,s3xz,s3z,tak,tta,ulaw,wav,wma,wv,xm,xmgz,xmxz,xmz,xpk", help="audio formats to decode using ffmpeg")
@ -1757,6 +1781,7 @@ def add_db_general(ap, hcores):
ap2.add_argument("-e2vp", action="store_true", help="on hash mismatch: panic and quit copyparty") ap2.add_argument("-e2vp", action="store_true", help="on hash mismatch: panic and quit copyparty")
ap2.add_argument("--hist", metavar="PATH", type=u, default="", help="where to store volume data (db, thumbs); default is a folder named \".hist\" inside each volume (volflag=hist)") ap2.add_argument("--hist", metavar="PATH", type=u, default="", help="where to store volume data (db, thumbs); default is a folder named \".hist\" inside each volume (volflag=hist)")
ap2.add_argument("--dbpath", metavar="PATH", type=u, default="", help="override where the volume databases are to be placed; default is the same as \033[33m--hist\033[0m (volflag=dbpath)") ap2.add_argument("--dbpath", metavar="PATH", type=u, default="", help="override where the volume databases are to be placed; default is the same as \033[33m--hist\033[0m (volflag=dbpath)")
ap2.add_argument("--fika", metavar="TXT", type=u, default="ucd", help="list of user-actions to allow while filesystem-indexer is still busy; set blank to never interrupt indexing (old default). [\033[32mu\033[0m]=uploads, [\033[32mc\033[0m]=filecopy, [\033[32mm\033[0m]=move/rename, [\033[32md\033[0m]=delete. NOTE: [\033[32mm\033[0m] is untested/scary, and blank is recommended if dedup enabled")
ap2.add_argument("--no-hash", metavar="PTN", type=u, default="", help="regex: disable hashing of matching absolute-filesystem-paths during e2ds folder scans (must be specified as one big regex, not multiple times) (volflag=nohash)") ap2.add_argument("--no-hash", metavar="PTN", type=u, default="", help="regex: disable hashing of matching absolute-filesystem-paths during e2ds folder scans (must be specified as one big regex, not multiple times) (volflag=nohash)")
ap2.add_argument("--no-idx", metavar="PTN", type=u, default=noidx, help="regex: disable indexing of matching absolute-filesystem-paths during e2ds folder scan (must be specified as one big regex, not multiple times) (volflag=noidx)") ap2.add_argument("--no-idx", metavar="PTN", type=u, default=noidx, help="regex: disable indexing of matching absolute-filesystem-paths during e2ds folder scan (must be specified as one big regex, not multiple times) (volflag=noidx)")
ap2.add_argument("--no-dirsz", action="store_true", help="do not show total recursive size of folders in listings, show inode size instead; slightly faster (volflag=nodirsz)") ap2.add_argument("--no-dirsz", action="store_true", help="do not show total recursive size of folders in listings, show inode size instead; slightly faster (volflag=nodirsz)")
@ -1798,6 +1823,7 @@ def add_db_metadata(ap):
def add_txt(ap): def add_txt(ap):
ap2 = ap.add_argument_group("textfile options") ap2 = ap.add_argument_group("textfile options")
ap2.add_argument("--rw-edit", metavar="T,T", type=u, default="md", help="comma-sep. list of file-extensions to allow editing with permissions read+write; all others require read+write+delete (volflag=rw_edit)")
ap2.add_argument("--md-no-br", action="store_true", help="markdown: disable newline-is-newline; will only render a newline into the html given two trailing spaces or a double-newline (volflag=md_no_br)") ap2.add_argument("--md-no-br", action="store_true", help="markdown: disable newline-is-newline; will only render a newline into the html given two trailing spaces or a double-newline (volflag=md_no_br)")
ap2.add_argument("--md-hist", metavar="TXT", type=u, default="s", help="where to store old version of markdown files; [\033[32ms\033[0m]=subfolder, [\033[32mv\033[0m]=volume-histpath, [\033[32mn\033[0m]=nope/disabled (volflag=md_hist)") ap2.add_argument("--md-hist", metavar="TXT", type=u, default="s", help="where to store old version of markdown files; [\033[32ms\033[0m]=subfolder, [\033[32mv\033[0m]=volume-histpath, [\033[32mn\033[0m]=nope/disabled (volflag=md_hist)")
ap2.add_argument("--txt-eol", metavar="TYPE", type=u, default="", help="enable EOL conversion when writing documents; supported: CRLF, LF (volflag=txt_eol)") ap2.add_argument("--txt-eol", metavar="TYPE", type=u, default="", help="enable EOL conversion when writing documents; supported: CRLF, LF (volflag=txt_eol)")
@ -2139,6 +2165,8 @@ def main(argv: Optional[list[str]] = None) -> None:
except: except:
sys.exit(1) sys.exit(1)
quotecheck(al)
if al.chdir: if al.chdir:
os.chdir(al.chdir) os.chdir(al.chdir)

View file

@ -1,8 +1,8 @@
# coding: utf-8 # coding: utf-8
VERSION = (1, 20, 3) VERSION = (1, 20, 10)
CODENAME = "sftp is fine too" CODENAME = "sftp is fine too"
BUILD_DT = (2026, 1, 21) 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

@ -249,9 +249,9 @@ class Lim(object):
return return
x = broker.ask(volgetter, ptop) x = broker.ask(volgetter, ptop)
nbytes, nfiles = x.get() self.c_vb_v, nfiles = x.get()
if self.vbmax and self.vbmax < nbytes + sz: if self.vbmax and self.vbmax < self.c_vb_v + sz:
raise Pebkac(400, "volume has exceeded max size") raise Pebkac(400, "volume has exceeded max size")
if self.vnmax and self.vnmax < nfiles + 1: if self.vnmax and self.vnmax < nfiles + 1:
@ -1286,9 +1286,14 @@ class AuthSrv(object):
if not bos.path.exists(src): if not bos.path.exists(src):
self.log("warning: filesystem-path did not exist: %r" % (src,), 3) self.log("warning: filesystem-path did not exist: %r" % (src,), 3)
vf = {}
if dst.startswith(".") or "/." in dst:
vf["unlistcr"] = True
vf["unlistcw"] = True
mount[dst] = (src, dst0) mount[dst] = (src, dst0)
daxs[dst] = AXS() daxs[dst] = AXS()
mflags[dst] = {} mflags[dst] = vf
return (src, dst) return (src, dst)
def _e(self, desc: Optional[str] = None) -> None: def _e(self, desc: Optional[str] = None) -> None:
@ -1442,7 +1447,7 @@ class AuthSrv(object):
if "=" in zs: if "=" in zs:
t = "WARNING: found an option named [%s] in your [global] config; did you mean to say [%s: %s] instead?" t = "WARNING: found an option named [%s] in your [global] config; did you mean to say [%s: %s] instead?"
zs1, zs2 = zs.split("=", 1) zs1, zs2 = zs.split("=", 1)
self.log(t % (zs, zs1, zs2), 3) self.log(t % (zs, zs1, zs2), 1)
if za is True: if za is True:
self._e("└─argument [{}]".format(zs)) self._e("└─argument [{}]".format(zs))
else: else:
@ -1917,7 +1922,7 @@ class AuthSrv(object):
vol.all_vps.sort(key=lambda x: len(x[0]), reverse=True) vol.all_vps.sort(key=lambda x: len(x[0]), reverse=True)
vol.root = vfs vol.root = vfs
zs = "du_iwho ls_q_m neversymlink" zs = "du_iwho emb_all ls_q_m neversymlink"
k_ign = set(zs.split()) k_ign = set(zs.split())
for vol in vfs.all_vols.values(): for vol in vfs.all_vols.values():
unknown_flags = set() unknown_flags = set()
@ -1965,6 +1970,7 @@ class AuthSrv(object):
[sun] if "w" in s_pr else [], [sun] if "w" in s_pr else [],
[sun] if "m" in s_pr else [], [sun] if "m" in s_pr else [],
[sun] if "d" in s_pr else [], [sun] if "d" in s_pr else [],
[sun] if "g" in s_pr else [],
) )
# don't know the abspath yet + wanna ensure the user # don't know the abspath yet + wanna ensure the user
@ -2443,7 +2449,7 @@ class AuthSrv(object):
if vf not in vol.flags: if vf not in vol.flags:
vol.flags[vf] = getattr(self.args, ga) vol.flags[vf] = getattr(self.args, ga)
zs = "forget_ip gid nrand tail_who th_qv th_spec_p u2abort u2ow uid unp_who ups_who zip_who" zs = "forget_ip gid nrand tail_who th_qv th_qvx th_spec_p u2abort u2ow uid unp_who ups_who zip_who"
for k in zs.split(): for k in zs.split():
if k in vol.flags: if k in vol.flags:
vol.flags[k] = int(vol.flags[k]) vol.flags[k] = int(vol.flags[k])
@ -2470,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)
@ -2583,6 +2589,11 @@ class AuthSrv(object):
t = "WARNING: volume [/%s]: invalid value specified for ext-th: %s" t = "WARNING: volume [/%s]: invalid value specified for ext-th: %s"
self.log(t % (vol.vpath, etv), 3) self.log(t % (vol.vpath, etv), 3)
zsl = [x.strip() for x in vol.flags["rw_edit"].split(",")]
zsl = [x for x in zsl if x]
vol.flags["rw_edit"] = ",".join(zsl)
vol.flags["rw_edit_set"] = set(x for x in zsl if x)
emb_all = vol.flags["emb_all"] = set() emb_all = vol.flags["emb_all"] = set()
zsl1 = [x for x in vol.flags["preadmes"].split(",") if x] zsl1 = [x for x in vol.flags["preadmes"].split(",") if x]
@ -2882,6 +2893,7 @@ class AuthSrv(object):
have_e2d = False have_e2d = False
have_e2t = False have_e2t = False
have_dedup = False have_dedup = False
have_symdup = False
unsafe_dedup = [] unsafe_dedup = []
t = "volumes and permissions:\n" t = "volumes and permissions:\n"
for zv in vfs.all_vols.values(): for zv in vfs.all_vols.values():
@ -2921,15 +2933,18 @@ class AuthSrv(object):
if "dedup" in zv.flags: if "dedup" in zv.flags:
have_dedup = True have_dedup = True
if ( if "hardlink" not in zv.flags and "reflink" not in zv.flags:
"e2d" not in zv.flags have_symdup = True
and "hardlink" not in zv.flags if "e2d" not in zv.flags:
and "reflink" not in zv.flags unsafe_dedup.append("/" + zv.vpath)
):
unsafe_dedup.append("/" + zv.vpath)
t += "\n" t += "\n"
if have_symdup and self.args.fika:
t = "WARNING: disabling fika due to symlink-based dedup in at least one volume; uploads/deletes will be blocked during filesystem-indexing. Consider --reflink or --hardlink"
# self.args.fika = self.args.fika.replace("m", "").replace("d", "") # probably not enough
self.args.fika = ""
if self.warn_anonwrite and verbosity > 4: if self.warn_anonwrite and verbosity > 4:
if not self.args.no_voldump: if not self.args.no_voldump:
self.log(t) self.log(t)
@ -3171,6 +3186,7 @@ class AuthSrv(object):
"unlist": vf.get("unlist") or "", "unlist": vf.get("unlist") or "",
"sb_lg": "" if "no_sb_lg" in vf else (vf.get("lg_sbf") or "y"), "sb_lg": "" if "no_sb_lg" in vf else (vf.get("lg_sbf") or "y"),
"sb_md": "" if "no_sb_md" in vf else (vf.get("md_sbf") or "y"), "sb_md": "" if "no_sb_md" in vf else (vf.get("md_sbf") or "y"),
"rw_edit": vf["rw_edit"],
} }
if "ufavico_h" in vf: if "ufavico_h" in vf:
vn.js_ls["ufavico"] = vf["ufavico_h"] vn.js_ls["ufavico"] = vf["ufavico_h"]
@ -3196,6 +3212,7 @@ class AuthSrv(object):
"sb_md": vn.js_ls["sb_md"], "sb_md": vn.js_ls["sb_md"],
"sba_md": vf.get("md_sba") or "", "sba_md": vf.get("md_sba") or "",
"sba_lg": vf.get("lg_sba") or "", "sba_lg": vf.get("lg_sba") or "",
"rw_edit": vf["rw_edit"],
"txt_ext": self.args.textfiles.replace(",", " "), "txt_ext": self.args.textfiles.replace(",", " "),
"def_hcols": list(vf.get("mth") or []), "def_hcols": list(vf.get("mth") or []),
"unlist0": vf.get("unlist") or "", "unlist0": vf.get("unlist") or "",

View file

@ -106,14 +106,14 @@ def utime(
def utime_c( def utime_c(
log: Union["NamedLogger", Any], log: Union["NamedLogger", Any],
p: str, p: str,
ts: int, ts: float,
follow_symlinks: bool = True, follow_symlinks: bool = True,
throw: bool = False, throw: bool = False,
) -> Optional[int]: ) -> Optional[float]:
clamp = 0 clamp = 0
ov = ts ov = ts
bp = fsenc(p) bp = fsenc(p)
now = int(time.time()) now = time.time()
while True: while True:
try: try:
if SYMTIME: if SYMTIME:

View file

@ -139,6 +139,7 @@ def vf_vmap() -> dict[str, str]:
"rss_sort", "rss_sort",
"rss_fmt_t", "rss_fmt_t",
"rss_fmt_d", "rss_fmt_d",
"rw_edit",
"shr_who", "shr_who",
"sort", "sort",
"tail_fd", "tail_fd",
@ -147,6 +148,7 @@ def vf_vmap() -> dict[str, str]:
"tail_who", "tail_who",
"tcolor", "tcolor",
"th_qv", "th_qv",
"th_qvx",
"th_spec_p", "th_spec_p",
"txt_eol", "txt_eol",
"unlist", "unlist",
@ -306,7 +308,8 @@ flagcats = {
"thsize": "thumbnail res; WxH", "thsize": "thumbnail res; WxH",
"crop": "center-cropping (y/n/fy/fn)", "crop": "center-cropping (y/n/fy/fn)",
"th3x": "3x resolution (y/n/fy/fn)", "th3x": "3x resolution (y/n/fy/fn)",
"th_qv=40": "thumbnail quality (10~90)", "th_qv=40": "webp/jpg thumbnail quality (10~90)",
"th_qvx=40": "jxl thumbnail quality (10~90)",
"convt": "convert-to-image timeout in seconds", "convt": "convert-to-image timeout in seconds",
"aconvt": "convert-to-audio timeout in seconds", "aconvt": "convert-to-audio timeout in seconds",
"th_spec_p=1": "make spectrograms? 0=never 1=fallback 2=always", "th_spec_p=1": "make spectrograms? 0=never 1=fallback 2=always",
@ -389,6 +392,7 @@ flagcats = {
"opds_exts": "file formats to list in OPDS feeds; leave empty to show everything", "opds_exts": "file formats to list in OPDS feeds; leave empty to show everything",
}, },
"textfiles": { "textfiles": {
"rw_edit=md,txt": "only require read+write to edit .md and .txt",
"md_no_br": "newline only on double-newline or two tailing spaces", "md_no_br": "newline only on double-newline or two tailing spaces",
"md_hist": "where to put markdown backups; s=subfolder, v=volHist, n=nope", "md_hist": "where to put markdown backups; s=subfolder, v=volHist, n=nope",
"exp": "enable textfile expansion; see --help-exp", "exp": "enable textfile expansion; see --help-exp",

View file

@ -64,6 +64,7 @@ from .util import (
b64dec, b64dec,
eol_conv, eol_conv,
exclude_dotfiles, exclude_dotfiles,
exclude_dotfiles_ls,
formatdate, formatdate,
fsenc, fsenc,
gen_content_disposition, gen_content_disposition,
@ -90,6 +91,7 @@ from .util import (
loadpy, loadpy,
log_reloc, log_reloc,
min_ex, min_ex,
open_nolock,
pathmod, pathmod,
quotep, quotep,
rand_name, rand_name,
@ -152,7 +154,7 @@ ALL_COOKIES = "k304 no304 js idxh dots cppwd cppws".split()
BADXFF = " due to dangerous misconfiguration (the http-header specified by --xff-hdr was received from an untrusted reverse-proxy)" BADXFF = " due to dangerous misconfiguration (the http-header specified by --xff-hdr was received from an untrusted reverse-proxy)"
BADXFF2 = ". Some copyparty features are now disabled as a safety measure.\n\n\n" BADXFF2 = ". Some copyparty features are now disabled as a safety measure.\n\n\n"
BADXFP = ', or change the copyparty global-option "xf-proto" to another header-name to read this value from. Alternatively, if your reverseproxy is not able to provide a header similar to "X-Forwarded-Proto", then you must tell copyparty which protocol to assume by setting global-option --xf-proto-fb to either http or https' BADXFP = ', or change the copyparty global-option "xf-proto" to another header-name to read this value from. Alternatively, if your reverseproxy is not able to provide a header similar to "X-Forwarded-Proto", then you must tell copyparty which protocol to assume; either "--xf-proto-fb=http" or "--xf-proto-fb=https"'
BADXFFB = "<b>NOTE: serverlog has a message regarding your reverse-proxy config</b>" BADXFFB = "<b>NOTE: serverlog has a message regarding your reverse-proxy config</b>"
H_CONN_KEEPALIVE = "Connection: Keep-Alive" H_CONN_KEEPALIVE = "Connection: Keep-Alive"
@ -166,15 +168,17 @@ A_FILE = os.stat_result(
(0o644, -1, -1, 1, 1000, 1000, 8, 0x39230101, 0x39230101, 0x39230101) (0o644, -1, -1, 1, 1000, 1000, 8, 0x39230101, 0x39230101, 0x39230101)
) )
RE_CC = re.compile(r"[\x00-\x1f]") # search always faster RE_CC = re.compile(r"[\x00-\x1f\x7f]") # search always faster
RE_USAFE = re.compile(r'[\x00-\x1f<>"]') # search always faster RE_USAFE = re.compile(r'[\x00-\x1f\x7f<>"]') # search always faster
RE_HSAFE = re.compile(r"[\x00-\x1f<>\"'&]") # search always much faster RE_HSAFE = re.compile(r"[\x00-\x1f\x7f<>\"'&]") # search always much faster
RE_HOST = re.compile(r"[^][0-9a-zA-Z.:_-]") # search faster <=17ch RE_HOST = re.compile(r"[^][0-9a-zA-Z.:_-]") # search faster <=17ch
RE_MHOST = re.compile(r"^[][0-9a-zA-Z.:_-]+$") # match faster >=18ch RE_MHOST = re.compile(r"^[][0-9a-zA-Z.:_-]+$") # match faster >=18ch
RE_K = re.compile(r"[^0-9a-zA-Z_-]") # search faster <=17ch RE_K = re.compile(r"[^0-9a-zA-Z_-]") # search faster <=17ch
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())
@ -187,7 +191,7 @@ PERMS_rwh = [
def _build_zip_xcode() -> Sequence[str]: def _build_zip_xcode() -> Sequence[str]:
ret = "opus mp3 flac wav p".split() ret = "opus mp3 flac wav p".split()
for codec in ("w", "j"): for codec in ("j", "w", "x"):
for suf in ("", "f", "f3", "3"): for suf in ("", "f", "f3", "3"):
ret.append("%s%s" % (codec, suf)) ret.append("%s%s" % (codec, suf))
return ret return ret
@ -197,6 +201,10 @@ ZIP_XCODE_L = _build_zip_xcode()
ZIP_XCODE_S = set(ZIP_XCODE_L) ZIP_XCODE_S = set(ZIP_XCODE_L)
def _arg2cfg(txt: str) -> str:
return re.sub(r' "--([^=]{3,12})=', r' global-option "\1: ', txt)
class HttpCli(object): class HttpCli(object):
""" """
Spawned by HttpConn to process one http transaction Spawned by HttpConn to process one http transaction
@ -285,12 +293,6 @@ class HttpCli(object):
uname = self.asrv.iacct.get(b) or self.asrv.sesa.get(b) uname = self.asrv.iacct.get(b) or self.asrv.sesa.get(b)
return "%s\033[7m %s \033[27m%s" % (a, uname, c) return "%s\033[7m %s \033[27m%s" % (a, uname, c)
def _check_nonfatal(self, ex: Pebkac, post: bool) -> bool:
if post:
return ex.code < 300
return ex.code < 400 or ex.code in [404, 429]
def _assert_safe_rem(self, rem: str) -> None: def _assert_safe_rem(self, rem: str) -> None:
# sanity check to prevent any disasters # sanity check to prevent any disasters
# (this function hopefully serves no purpose; validation has already happened at this point, this only exists as a last-ditch effort just in case) # (this function hopefully serves no purpose; validation has already happened at this point, this only exists as a last-ditch effort just in case)
@ -348,11 +350,6 @@ class HttpCli(object):
if not headerlines: if not headerlines:
return False return False
if not headerlines[0]:
# seen after login with IE6.0.2900.5512.xpsp.080413-2111 (xp-sp3)
self.log("BUG: trailing newline from previous request", c="1;31")
headerlines.pop(0)
try: try:
self.mode, self.req, self.http_ver = headerlines[0].split(" ") self.mode, self.req, self.http_ver = headerlines[0].split(" ")
@ -361,6 +358,8 @@ class HttpCli(object):
for header_line in headerlines[1:]: for header_line in headerlines[1:]:
k, zs = header_line.split(":", 1) k, zs = header_line.split(":", 1)
self.headers[k.lower()] = zs.strip() self.headers[k.lower()] = zs.strip()
if zs.endswith(" HTTP/1.1") and RE_HTTP1.search(zs):
raise Exception()
except: except:
headerlines = [repr(x) for x in headerlines] headerlines = [repr(x) for x in headerlines]
msg = "#[ " + " ]\n#[ ".join(headerlines) + " ]" msg = "#[ " + " ]\n#[ ".join(headerlines) + " ]"
@ -383,6 +382,7 @@ class HttpCli(object):
return False return False
self.sr.nb = 0
self.conn.hsrv.nreq += 1 self.conn.hsrv.nreq += 1
self.ua = self.headers.get("user-agent", "") self.ua = self.headers.get("user-agent", "")
@ -392,6 +392,19 @@ class HttpCli(object):
self.keepalive = "close" not in zs and ( self.keepalive = "close" not in zs and (
self.http_ver != "HTTP/1.0" or zs == "keep-alive" self.http_ver != "HTTP/1.0" or zs == "keep-alive"
) )
if (
"transfer-encoding" in self.headers
and self.headers["transfer-encoding"].lower() != "identity"
):
self.sr.te = 1
if "content-length" in self.headers:
# rfc9112:6.2: ignore CL if TE
self.keepalive = False
self.headers.pop("content-length")
t = "suspicious request (has both TE and CL); ignoring CL and disabling keepalive"
self.log(t, 3)
self.host = self.headers.get("host") or "" self.host = self.headers.get("host") or ""
if not self.host: if not self.host:
if self.s.family == socket.AF_UNIX: if self.s.family == socket.AF_UNIX:
@ -442,6 +455,8 @@ class HttpCli(object):
t += t2 % (zs or "NOT-PROVIDED") t += t2 % (zs or "NOT-PROVIDED")
if zs: if zs:
t += ". If that is the address that visitors are supposed to use to access your server -- or, in other words, it is not some internal address you wish to keep secret -- then the current choice of using the [Host] header is fine (usually the case)" t += ". If that is the address that visitors are supposed to use to access your server -- or, in other words, it is not some internal address you wish to keep secret -- then the current choice of using the [Host] header is fine (usually the case)"
if self.args.c:
t = _arg2cfg(t)
self.log(t + "\n\n\n", 3) self.log(t + "\n\n\n", 3)
pip = self.conn.addr[0] pip = self.conn.addr[0]
@ -460,7 +475,10 @@ class HttpCli(object):
zs = IPv6Network(pip + "/64", False).compressed zs = IPv6Network(pip + "/64", False).compressed
zs2 = ' or "--xff-src=lan"' if self.conn.xff_lan.map(pip) else "" zs2 = ' or "--xff-src=lan"' if self.conn.xff_lan.map(pip) else ""
self.log(t % (self.args.xff_hdr, pip, cli_ip, zso, zs, zs2), 3) t = t % (self.args.xff_hdr, pip, cli_ip, zso, zs, zs2)
if self.args.c:
t = _arg2cfg(t)
self.log(t, 3)
self.bad_xff = True self.bad_xff = True
else: else:
self.ip = cli_ip self.ip = cli_ip
@ -475,7 +493,10 @@ class HttpCli(object):
self.bad_xff = True self.bad_xff = True
self.host = "example.com" self.host = "example.com"
t = 'got proxied request without header "%s" (global-option "xf-proto"). This header must contain either "http" or "https". Either fix your reverse-proxy config to include this header%s%s' t = 'got proxied request without header "%s" (global-option "xf-proto"). This header must contain either "http" or "https". Either fix your reverse-proxy config to include this header%s%s'
self.log(t % (self.args.xf_proto, BADXFP, BADXFF2), 3) t = t % (self.args.xf_proto, BADXFP, BADXFF2)
if self.args.c:
t = _arg2cfg(t)
self.log(t, 3)
# the semantics of trusted_xff and bad_xff are different; # the semantics of trusted_xff and bad_xff are different;
# trusted_xff is whether the connection came from a trusted reverseproxy, # trusted_xff is whether the connection came from a trusted reverseproxy,
@ -567,13 +588,12 @@ class HttpCli(object):
ptn_cc = RE_CC ptn_cc = RE_CC
k_safe = UPARAM_CC_OK k_safe = UPARAM_CC_OK
for k in arglist.split("&"): for k in arglist.split("&"):
sv = ""
if "=" in k: if "=" in k:
k, zs = k.split("=", 1) k, zs = k.split("=", 1)
# x-www-form-urlencoded (url query part) uses # x-www-form-urlencoded (url query part) uses
# either + or %20 for 0x20 so handle both # either + or %20 for 0x20 so handle both
sv = unquotep(zs.strip().replace("+", " ")) sv = unquotep(zs.strip().replace("+", " "))
else:
sv = ""
m = re_k.search(k) m = re_k.search(k)
if m: if m:
@ -630,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"]
@ -889,8 +909,12 @@ class HttpCli(object):
self.terse_reply(b"", 500) self.terse_reply(b"", 500)
return False return False
post = self.mode in ["POST", "PUT"] or "content-length" in self.headers post = (
if not self._check_nonfatal(pex, post): self.mode in ("POST", "PUT")
or "content-length" in self.headers
or self.sr.te
)
if pex.code >= (300 if post else 400):
self.keepalive = False self.keepalive = False
em = str(ex) em = str(ex)
@ -1541,6 +1565,7 @@ class HttpCli(object):
hits = idx.run_query(self.uname, [self.vn], uq, uv, False, False, nmax)[0] hits = idx.run_query(self.uname, [self.vn], uq, uv, False, False, nmax)[0]
q_pw = a_pw = ""
pwk = self.args.pw_urlp pwk = self.args.pw_urlp
if pwk in self.ouparam and "nopw" not in self.ouparam: if pwk in self.ouparam and "nopw" not in self.ouparam:
zs = self.ouparam[pwk] zs = self.ouparam[pwk]
@ -1548,8 +1573,6 @@ class HttpCli(object):
a_pw = "&%s=%s" % (pwk, quotep(zs)) a_pw = "&%s=%s" % (pwk, quotep(zs))
for i in hits: for i in hits:
i["rp"] += a_pw if "?" in i["rp"] else q_pw i["rp"] += a_pw if "?" in i["rp"] else q_pw
else:
q_pw = a_pw = ""
title = self.uparam.get("title") or self.vpath.split("/")[-1] title = self.uparam.get("title") or self.vpath.split("/")[-1]
etitle = html_escape(title, True, True) etitle = html_escape(title, True, True)
@ -1821,11 +1844,14 @@ class HttpCli(object):
if not self.can_read: if not self.can_read:
vfs_ls = [] vfs_ls = []
if not self.can_dot: if not self.can_dot:
names = set(exclude_dotfiles([x[0] for x in vfs_ls])) vfs_ls = exclude_dotfiles_ls(vfs_ls)
vfs_ls = [x for x in vfs_ls if x[0] in names]
fgen = [{"vp": vp, "st": st} for vp, st in vfs_ls] fgen = [{"vp": vp, "st": st} for vp, st in vfs_ls]
fgen += [{"vp": v, "st": vst} for v in vfs_virt]
if vfs_virt:
zsl = list(vfs_virt)
if not self.can_dot:
zsl = exclude_dotfiles(zsl)
fgen += [{"vp": v, "st": vst} for v in zsl]
else: else:
t = "invalid depth value '{}' (must be either '0' or '1'{})" t = "invalid depth value '{}' (must be either '0' or '1'{})"
@ -1838,7 +1864,9 @@ class HttpCli(object):
zi = ( zi = (
vn.flags["du_iwho"] vn.flags["du_iwho"]
if vn.realpath and "quota-available-bytes" in props if vn.realpath
and "quota-available-bytes" in props
and "quotaused" not in props # macos finder; ingnore it
else 0 else 0
) )
if zi and ( if zi and (
@ -1869,10 +1897,6 @@ class HttpCli(object):
"quota-available-bytes": str(bfree), "quota-available-bytes": str(bfree),
"quota-used-bytes": str(btot - bfree), "quota-used-bytes": str(btot - bfree),
} }
if "quotaused" in props: # macos finder crazytalk
df["quotaused"] = df["quota-used-bytes"]
if "quota" in props:
df["quota"] = df["quota-available-bytes"] # idk, makes it happy
else: else:
df = {} df = {}
else: else:
@ -1922,7 +1946,6 @@ class HttpCli(object):
pvs["getcontentlength"] = str(st.st_size) pvs["getcontentlength"] = str(st.st_size)
elif df: elif df:
pvs.update(df) pvs.update(df)
df = {}
for k, v in pvs.items(): for k, v in pvs.items():
if k not in props: if k not in props:
@ -2213,7 +2236,7 @@ class HttpCli(object):
raise Pebkac(403 if self.pw else 401, t % (self.uname, self.vn.vpath)) raise Pebkac(403 if self.pw else 401, t % (self.uname, self.vn.vpath))
if not self.args.no_dav and self._applesan(): if not self.args.no_dav and self._applesan():
return self.headers.get("content-length") == "0" return False
if self.headers.get("expect", "").lower() == "100-continue": if self.headers.get("expect", "").lower() == "100-continue":
try: try:
@ -2553,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))
@ -2601,9 +2628,23 @@ class HttpCli(object):
else: else:
f, fn = ren_open(fn, *open_a, **params) f, fn = ren_open(fn, *open_a, **params)
max_sz = 0
if lim and remains < 0:
if lim.vbmax:
max_sz = lim.c_vb_v
if lim.smax and (not max_sz or max_sz > lim.smax):
max_sz = lim.smax
try: try:
path = os.path.join(fdir, fn) path = os.path.join(fdir, fn)
post_sz, sha_hex, sha_b64 = copier(reader, f, hasher, 0, self.args.s_wr_slp) post_sz, sha_hex, sha_b64 = copier(
reader, f, hasher, max_sz, self.args.s_wr_slp
)
except:
if max_sz and self.sr.nb >= max_sz:
f.close() # windows
wunlink(self.log, path, vfs.flags)
raise
finally: finally:
f.close() f.close()
@ -2623,7 +2664,7 @@ class HttpCli(object):
at = mt = time.time() - lifetime at = mt = time.time() - lifetime
cli_mt = self.headers.get("x-oc-mtime") cli_mt = self.headers.get("x-oc-mtime")
if cli_mt: if cli_mt:
bos.utime_c(self.log, path, int(cli_mt), False) bos.utime_c(self.log, path, float(cli_mt), False)
if nameless and "magic" in vfs.flags: if nameless and "magic" in vfs.flags:
try: try:
@ -3210,7 +3251,7 @@ class HttpCli(object):
t = "your chunk got corrupted somehow (received {} bytes); expected vs received hash:\n{}\n{}" t = "your chunk got corrupted somehow (received {} bytes); expected vs received hash:\n{}\n{}"
raise Pebkac(400, t.format(post_sz, chash, sha_b64)) raise Pebkac(400, t.format(post_sz, chash, sha_b64))
remains -= chunksize remains -= post_sz
if len(cstart) > 1 and path != os.devnull: if len(cstart) > 1 and path != os.devnull:
t = " & ".join(unicode(x) for x in cstart[1:]) t = " & ".join(unicode(x) for x in cstart[1:])
@ -3288,6 +3329,12 @@ class HttpCli(object):
spd = self._spd(postsize) spd = self._spd(postsize)
self.log("%70s thank %r" % (spd, cinf)) self.log("%70s thank %r" % (spd, cinf))
if remains:
t = "incorrect content-length from client"
self.log("%s; header=%d, remains=%d" % (t, postsize, remains), 3)
raise Pebkac(400, t)
self.reply(b"thank") self.reply(b"thank")
return True return True
@ -3490,9 +3537,12 @@ class HttpCli(object):
vfs, rem = self.asrv.vfs.get(self.vpath, self.uname, False, True) vfs, rem = self.asrv.vfs.get(self.vpath, self.uname, False, True)
self._assert_safe_rem(rem) self._assert_safe_rem(rem)
if not self.can_delete and not new_file.lower().endswith(".md"): if not self.can_delete and (
t = "you can only create .md files because you don't have the delete-permission" "." not in new_file
raise Pebkac(400, t) or new_file.rsplit(".", 1)[1].lower() not in vfs.flags["rw_edit_set"]
):
t = "you can only create %s files because you don't have the delete-permission"
raise Pebkac(400, t % (vfs.flags["rw_edit"].replace(",", "/")))
sanitized = sanitize_fn(new_file) sanitized = sanitize_fn(new_file)
fdir = vfs.canonical(rem) fdir = vfs.canonical(rem)
@ -4009,8 +4059,12 @@ class HttpCli(object):
rem = "{}/{}".format(rp, fn).strip("/") rem = "{}/{}".format(rp, fn).strip("/")
dbv, vrem = vfs.get_dbv(rem) dbv, vrem = vfs.get_dbv(rem)
if not rem.lower().endswith(".md") and not self.can_delete: if not self.can_delete and (
raise Pebkac(400, "only markdown pls") "." not in rem
or rem.rsplit(".", 1)[1].lower() not in vfs.flags["rw_edit_set"]
):
t = "you can only edit %s files because you don't have the delete-permission"
raise Pebkac(400, t % (vfs.flags["rw_edit"].replace(",", "/")))
if nullwrite: if nullwrite:
response = json.dumps({"ok": True, "lastmod": 0}) response = json.dumps({"ok": True, "lastmod": 0})
@ -4541,14 +4595,13 @@ class HttpCli(object):
if stat.S_ISDIR(st.st_mode): if stat.S_ISDIR(st.st_mode):
continue continue
sz = st.st_size
if stat.S_ISBLK(st.st_mode): if stat.S_ISBLK(st.st_mode):
fd = bos.open(fs_path, os.O_RDONLY) fd = bos.open(fs_path, os.O_RDONLY)
try: try:
sz = os.lseek(fd, 0, os.SEEK_END) sz = os.lseek(fd, 0, os.SEEK_END)
finally: finally:
os.close(fd) os.close(fd)
else:
sz = st.st_size
file_ts = max(file_ts, st.st_mtime) file_ts = max(file_ts, st.st_mtime)
editions[ext or "plain"] = (fs_path, sz) editions[ext or "plain"] = (fs_path, sz)
@ -4797,7 +4850,7 @@ class HttpCli(object):
f = None f = None
try: try:
st = os.stat(abspath) st = os.stat(abspath)
f = open(*open_args) f = open_nolock(*open_args)
f.seek(0, os.SEEK_END) f.seek(0, os.SEEK_END)
eof = f.tell() eof = f.tell()
f.seek(0) f.seek(0)
@ -4831,6 +4884,7 @@ class HttpCli(object):
pass pass
gone = 0 gone = 0
unsent = False
t_fd = t_ka = time.time() t_fd = t_ka = time.time()
while True: while True:
assert f # !rm assert f # !rm
@ -4847,6 +4901,7 @@ class HttpCli(object):
t_fd = t_ka = now t_fd = t_ka = now
self.s.sendall(buf) self.s.sendall(buf)
sent += len(buf) sent += len(buf)
unsent = False
dls[dl_id] = (time.time(), sent) dls[dl_id] = (time.time(), sent)
continue continue
@ -4857,14 +4912,16 @@ class HttpCli(object):
if t_fd < now - sec_fd: if t_fd < now - sec_fd:
try: try:
st2 = os.stat(open_args[0]) st2 = os.stat(open_args[0])
szd = st2.st_size - st.st_size
if ( if (
st2.st_ino != st.st_ino st2.st_ino != st.st_ino
or st2.st_size < sent or st2.st_size < sent
or st2.st_size < st.st_size or szd < 0
or unsent
): ):
assert f # !rm assert f # !rm
# open new file before closing previous to avoid toctous (open may fail; cannot null f before) # open new file before closing previous to avoid toctous (open may fail; cannot null f before)
f2 = open(*open_args) f2 = open_nolock(*open_args)
f.close() f.close()
f = f2 f = f2
f.seek(0, os.SEEK_END) f.seek(0, os.SEEK_END)
@ -4879,7 +4936,10 @@ class HttpCli(object):
ofs = sent # just new fd? resume from same ofs ofs = sent # just new fd? resume from same ofs
f.seek(ofs) f.seek(ofs)
self.log("reopened at byte %d: %r" % (ofs, abspath), 6) self.log("reopened at byte %d: %r" % (ofs, abspath), 6)
unsent = False
gone = 0 gone = 0
elif szd:
unsent = True
st = st2 st = st2
except: except:
gone += 1 gone += 1
@ -4993,7 +5053,7 @@ class HttpCli(object):
self.log("moved to tier %d (%s)" % (tier, tiers[tier])) self.log("moved to tier %d (%s)" % (tier, tiers[tier]))
try: try:
with open(ap_data, "rb", self.args.iobuf) as f: with open_nolock(ap_data, "rb", self.args.iobuf) as f:
f.seek(lower) f.seek(lower)
page = f.read(min(winsz, data_end - lower, upper - lower)) page = f.read(min(winsz, data_end - lower, upper - lower))
if not page: if not page:
@ -5026,7 +5086,7 @@ class HttpCli(object):
break break
if lower < upper and not broken: if lower < upper and not broken:
with open(req_path, "rb") as f: with open_nolock(req_path, "rb") as f:
remains = sendfile_py( remains = sendfile_py(
self.log, self.log,
lower, lower,
@ -5573,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))
@ -5769,7 +5832,7 @@ class HttpCli(object):
not self.args.no_scandir, not self.args.no_scandir,
PERMS_rwh, PERMS_rwh,
) )
dots = self.uname in vn.axs.udot dots = self.uname in vn.axs.udot and "dots" in self.uparam
dk_sz = vn.flags.get("dk") dk_sz = vn.flags.get("dk")
except: except:
dk_sz = None dk_sz = None
@ -5782,7 +5845,7 @@ class HttpCli(object):
dirs = [x[0] for x in vfs_ls if stat.S_ISDIR(x[1].st_mode)] dirs = [x[0] for x in vfs_ls if stat.S_ISDIR(x[1].st_mode)]
if not dots or "dots" not in self.uparam: if not dots:
dirs = exclude_dotfiles(dirs) dirs = exclude_dotfiles(dirs)
dirs = [quotep(x) for x in dirs if x != excl] dirs = [quotep(x) for x in dirs if x != excl]
@ -5796,8 +5859,10 @@ class HttpCli(object):
kdirs.append(dn + "?k=" + zs) kdirs.append(dn + "?k=" + zs)
dirs = kdirs dirs = kdirs
for x in vfs_virt: if vfs_virt:
if x != excl: for x in vfs_virt:
if x == excl:
continue
try: try:
dvn, drem = vfs.get(vjoin(top, x), self.uname, False, False) dvn, drem = vfs.get(vjoin(top, x), self.uname, False, False)
if ( if (
@ -5809,7 +5874,9 @@ class HttpCli(object):
bos.stat(dvn.canonical(drem, False)) bos.stat(dvn.canonical(drem, False))
except: except:
x += "\n" x += "\n"
dirs.append(x) dirs.append(quotep(x))
if not dots:
dirs = exclude_dotfiles(dirs)
ret["a"] = dirs ret["a"] = dirs
return ret return ret
@ -6344,10 +6411,14 @@ class HttpCli(object):
# ensure user has requested perms # ensure user has requested perms
s_rd = "read" in req["perms"] s_rd = "read" in req["perms"]
s_wr = "write" in req["perms"] s_wr = "write" in req["perms"]
s_mv = "move" in req["perms"] s_get = "get" in req["perms"]
s_del = "delete" in req["perms"] s_axs = [s_rd, s_wr, False, False, s_get]
if s_axs == [False] * 5:
raise Pebkac(400, "select at least one permission")
try: try:
vfs, rem = self.asrv.vfs.get(vp, self.uname, s_rd, s_wr, s_mv, s_del) vfs, rem = self.asrv.vfs.get(vp, self.uname, *s_axs)
except: except:
raise Pebkac(400, "you dont have all the perms you tried to grant") raise Pebkac(400, "you dont have all the perms you tried to grant")
@ -6359,9 +6430,7 @@ class HttpCli(object):
else: else:
raise Pebkac(400, "you dont have perms to create shares from this volume") raise Pebkac(400, "you dont have perms to create shares from this volume")
ap, reals, _ = vfs.ls( ap, reals, _ = vfs.ls(rem, self.uname, not self.args.no_scandir, [s_axs])
rem, self.uname, not self.args.no_scandir, [[s_rd, s_wr, s_mv, s_del]]
)
rfns = set([x[0] for x in reals]) rfns = set([x[0] for x in reals])
for fn in fns: for fn in fns:
if fn not in rfns: if fn not in rfns:
@ -6373,7 +6442,7 @@ class HttpCli(object):
sexp = req["exp"] sexp = req["exp"]
exp = int(sexp) if sexp else 0 exp = int(sexp) if sexp else 0
exp = now + exp * 60 if exp else 0 exp = now + exp * 60 if exp else 0
pr = "".join(zc for zc, zb in zip("rwmd", (s_rd, s_wr, s_mv, s_del)) if zb) pr = "".join(zc for zc, zb in zip("rwmdg", s_axs) if zb)
q = "insert into sh values (?,?,?,?,?,?,?,?)" q = "insert into sh values (?,?,?,?,?,?,?,?)"
cur.execute(q, (skey, pw, vp, pr, len(fns), self.uname, now, exp)) cur.execute(q, (skey, pw, vp, pr, len(fns), self.uname, now, exp))
@ -6799,9 +6868,14 @@ class HttpCli(object):
fk_pass = True fk_pass = True
if not is_dir and (self.can_read or self.can_get): if not is_dir and (self.can_read or self.can_get):
if not self.can_read and not fk_pass and "fk" in vn.flags: if (
if not use_filekey: not self.can_read
return self.tx_404(True) and not fk_pass
and "fk" in vn.flags
and not use_filekey
and not self.vpath.startswith(self.args.shr1 or "\n")
):
return self.tx_404(True)
is_md = abspath.lower().endswith(".md") is_md = abspath.lower().endswith(".md")
if add_og and not is_md: if add_og and not is_md:
@ -6816,13 +6890,20 @@ class HttpCli(object):
vpnodes.pop() vpnodes.pop()
if ( if (
(is_md or self.can_delete) (
and "nohtml" not in vn.flags
and (
(is_md and "v" in self.uparam) (is_md and "v" in self.uparam)
or "edit" in self.uparam or "edit" in self.uparam
or "edit2" in self.uparam or "edit2" in self.uparam
) )
and "nohtml" not in vn.flags
and (
is_md
or self.can_delete
or (
"." in abspath
and abspath.rsplit(".", 1)[1].lower() in vn.flags["rw_edit_set"]
)
)
): ):
return self.tx_md(vn, abspath) return self.tx_md(vn, abspath)
@ -6983,6 +7064,14 @@ class HttpCli(object):
if "zip" in self.uparam or "tar" in self.uparam: if "zip" in self.uparam or "tar" in self.uparam:
raise Pebkac(403) raise Pebkac(403)
zsl = j2a["files"] = []
if is_js:
j2a["ls0"] = cgv["ls0"] = {
"dirs": zsl,
"files": zsl,
"taglist": zsl,
}
html = self.j2s(tpl, **j2a) html = self.j2s(tpl, **j2a)
self.reply(html.encode("utf-8", "replace")) self.reply(html.encode("utf-8", "replace"))
return True return True
@ -7005,7 +7094,7 @@ class HttpCli(object):
) )
stats = {k: v for k, v in vfs_ls} stats = {k: v for k, v in vfs_ls}
ls_names = [x[0] for x in vfs_ls] ls_names = [x[0] for x in vfs_ls]
ls_names.extend(list(vfs_virt.keys())) ls_names.extend(list(vfs_virt))
if add_og and og_fn and not self.can_read: if add_og and og_fn and not self.can_read:
ls_names = [og_fn] ls_names = [og_fn]
@ -7272,10 +7361,15 @@ class HttpCli(object):
else: else:
fn, desc = ln.split(" ", 1) fn, desc = ln.split(" ", 1)
try: try:
items[fn.lower()]["tags"]["descript.ion"] = desc item = items[fn.lower().strip("/")]
except: except:
t = "<li><code>%s</code> %s</li>" t = "<li><code>%s</code> %s</li>"
rem.append(t % (html_escape(fn), html_escape(desc))) rem.append(t % (html_escape(fn), html_escape(desc)))
continue
try:
item["tags"]["descript.ion"] = desc
except:
item["tags"] = {"descript.ion": desc}
except: except:
pass pass
if "descript.ion" not in taglist: if "descript.ion" not in taglist:
@ -7312,6 +7406,7 @@ class HttpCli(object):
else: else:
self.log("doc 2big: %r" % (doc,), 6) self.log("doc 2big: %r" % (doc,), 6)
doctxt = "( size of textfile exceeds serverside limit )" doctxt = "( size of textfile exceeds serverside limit )"
# NOTE: browser.js expects this exact message
else: else:
self.log("doc 404: %r" % (doc,), 6) self.log("doc 404: %r" % (doc,), 6)
doctxt = "( textfile not found )" doctxt = "( textfile not found )"
@ -7325,12 +7420,70 @@ class HttpCli(object):
dirs.sort(key=itemgetter("name")) dirs.sort(key=itemgetter("name"))
if is_opds: if is_opds:
# OpenSearch Description format requires a full-qualified URL and a "Short Name" under 16 characters
# which will be the longname truncated in the template.
# Relevant specs:
# https://specs.opds.io/opds-1.2#3-search
# https://developer.mozilla.org/en-US/docs/Web/XML/Guides/OpenSearch
if "osd" in self.uparam:
j2a["longname"] = "%s %s" % (self.args.bname, self.vpath)
j2a["search_url"] = self.args.SRS + vpath
xml = self.j2s("opds_osd", **j2a)
self.reply(
xml.encode("utf-8"), mime="application/opensearchdescription+xml"
)
return True
if "q" in self.uparam:
q = self.uparam["q"]
idx = self.conn.get_u2idx()
if not idx:
raise Pebkac(500, "indexer not available")
# generate a raw query similar to web interface for multiple words
r = " and ".join(("name like *%s*" % (x,)) for x in q.split())
hits, _, _ = idx.search(self.uname, [self.vn], r, 1000)
files = []
dirs = []
prefix = quotep(vpath + "/" if vpath else "")
for h in hits:
rp = h["rp"]
if not rp.startswith(prefix):
continue
zd = datetime.fromtimestamp(h["ts"], UTC)
dt = "%04d-%02d-%02d %02d:%02d:%02d" % (
zd.year,
zd.month,
zd.day,
zd.hour,
zd.minute,
zd.second,
)
item = {
"href": self.args.SRS + rp,
"name": unquotep(rp[len(prefix) :].split("?")[0]),
"sz": h["sz"],
"dt": dt,
"ts": h["ts"],
}
files.append(item)
# exclude files which don't match --opds-exts # exclude files which don't match --opds-exts
allowed_exts = vf.get("opds_exts") or self.args.opds_exts allowed_exts = vf.get("opds_exts") or self.args.opds_exts
if allowed_exts: if allowed_exts:
files = [ files = [
x for x in files if x["name"].rsplit(".", 1)[-1] in allowed_exts x for x in files if x["name"].rsplit(".", 1)[-1] in allowed_exts
] ]
j2a["opds_osd"] = "%s%s?opds&osd" % (self.args.SRS, quotep(vpath))
for item in dirs: for item in dirs:
href = item["href"] href = item["href"]
href += ("&" if "?" in href else "?") + "opds" href += ("&" if "?" in href else "?") + "opds"

View file

@ -222,6 +222,21 @@ class HttpConn(object):
if not self.cli.run(): if not self.cli.run():
return return
if self.sr.te == 1:
self.log("closing socket (leftover TE)", "90")
return
if (
"content-length" in self.cli.headers
and int(self.cli.headers["content-length"]) != self.sr.nb
):
self.log("closing socket (CL mismatch)", "90")
return
# note: proxies reject PUT sans Content-Length; illegal for HTTP/1.1
self.sr.nb = self.sr.te = 0
if self.u2idx: if self.u2idx:
self.hsrv.put_u2idx(str(self.addr), self.u2idx) self.hsrv.put_u2idx(str(self.addr), self.u2idx)
self.u2idx = None self.u2idx = None

View file

@ -188,6 +188,7 @@ class HttpSrv(object):
] ]
self.j2 = {x: env.get_template(x + ".html") for x in jn} self.j2 = {x: env.get_template(x + ".html") for x in jn}
self.j2["opds"] = env.get_template("opds.xml") self.j2["opds"] = env.get_template("opds.xml")
self.j2["opds_osd"] = env.get_template("opds_osd.xml")
self.prism = has_resource(self.E, "web/deps/prism.js.gz") self.prism = has_resource(self.E, "web/deps/prism.js.gz")
if self.args.ipu: if self.args.ipu:

View file

@ -16,7 +16,7 @@ from .multicast import MC_Sck, MCast
from .util import IP6_LL, CachedSet, Daemon, Netdev, list_ips, min_ex from .util import IP6_LL, CachedSet, Daemon, Netdev, list_ips, min_ex
try: try:
if os.getenv("PRTY_SYS_ALL") or os.getenv("PRTY_SYS_DNSLIB"): if os.environ.get("PRTY_SYS_ALL") or os.environ.get("PRTY_SYS_DNSLIB"):
raise ImportError() raise ImportError()
from .stolen.dnslib import ( from .stolen.dnslib import (
AAAA, AAAA,
@ -66,7 +66,7 @@ if TYPE_CHECKING:
if True: # pylint: disable=using-constant-test if True: # pylint: disable=using-constant-test
from typing import Any, Optional, Union from typing import Any, Optional, Union
if os.getenv("PRTY_MODSPEC"): if os.environ.get("PRTY_MODSPEC"):
from inspect import getsourcefile from inspect import getsourcefile
print("PRTY_MODSPEC: dnslib:", getsourcefile(A)) print("PRTY_MODSPEC: dnslib:", getsourcefile(A))

View file

@ -64,7 +64,7 @@ def have_ff(scmd: str) -> bool:
HAVE_FFMPEG = not os.environ.get("PRTY_NO_FFMPEG") and have_ff("ffmpeg") HAVE_FFMPEG = not os.environ.get("PRTY_NO_FFMPEG") and have_ff("ffmpeg")
HAVE_FFPROBE = not os.environ.get("PRTY_NO_FFPROBE") and have_ff("ffprobe") HAVE_FFPROBE = not os.environ.get("PRTY_NO_FFPROBE") and have_ff("ffprobe")
CBZ_PICS = set("png jpg jpeg gif bmp tga tif tiff webp avif".split()) CBZ_PICS = set("png jpg jpeg gif bmp tga tif tiff webp avif jxl".split())
CBZ_01 = re.compile(r"(^|[^0-9v])0+[01]\b") CBZ_01 = re.compile(r"(^|[^0-9v])0+[01]\b")
FMT_AU = set("mp3 ogg flac wav".split()) FMT_AU = set("mp3 ogg flac wav".split())

View file

@ -4,7 +4,7 @@ from __future__ import print_function, unicode_literals
import os import os
try: try:
if os.getenv("PRTY_SYS_ALL") or os.getenv("PRTY_SYS_QRCG"): if os.environ.get("PRTY_SYS_ALL") or os.environ.get("PRTY_SYS_QRCG"):
raise ImportError() raise ImportError()
from .stolen.qrcodegen import QrCode from .stolen.qrcodegen import QrCode
@ -14,7 +14,7 @@ except ImportError:
VENDORED = False VENDORED = False
from qrcodegen import QrCode from qrcodegen import QrCode
if os.getenv("PRTY_MODSPEC"): if os.environ.get("PRTY_MODSPEC"):
from inspect import getsourcefile from inspect import getsourcefile
print("PRTY_MODSPEC: qrcode:", getsourcefile(QrCode)) print("PRTY_MODSPEC: qrcode:", getsourcefile(QrCode))

View file

@ -805,6 +805,10 @@ class Sftpd(object):
self.bound.append(ip) self.bound.append(ip)
except Exception as ex: except Exception as ex:
if ip == "0.0.0.0" and "::" in self.bound: if ip == "0.0.0.0" and "::" in self.bound:
try:
srv.close() # type: ignore
except:
pass
return # dualstack return # dualstack
self.log("could not listen on (%s,%s): %r" % (ip, port, ex), 3) self.log("could not listen on (%s,%s): %r" % (ip, port, ex), 3)

View file

@ -8,6 +8,7 @@ https://github.com/pydron/ifaddr/tree/0.2.0
""" """
import os import os
import platform
from ._shared import IP, Adapter from ._shared import IP, Adapter
@ -16,20 +17,28 @@ def nope(include_unconfigured=False):
return [] return []
try: host_os = platform.system()
S390X = os.uname().machine == "s390x" machine = platform.machine()
except: py_impl = platform.python_implementation()
S390X = False
if os.environ.get("PRTY_NO_IFADDR") or S390X: if os.environ.get("PRTY_NO_IFADDR"):
get_adapters = nope
elif machine in ("s390x",) or host_os in ("IRIX32",):
# s390x deadlocks at libc.getifaddrs # s390x deadlocks at libc.getifaddrs
# irix libc does not have getifaddrs at all
print("ifaddr unavailable; can't determine LAN IP: unsupported OS")
get_adapters = nope
elif py_impl in ("GraalVM",):
print("ifaddr unavailable; can't determine LAN IP: unsupported interpreter")
get_adapters = nope get_adapters = nope
elif os.name == "nt": elif os.name == "nt":
from ._win32 import get_adapters from ._win32 import get_adapters
elif os.name == "posix": elif os.name == "posix":
from ._posix import get_adapters from ._posix import get_adapters
else: else:
raise RuntimeError("Unsupported Operating System: %s" % os.name) print("ifaddr unavailable; can't determine LAN IP: unsupported OS")
get_adapters = nope
__all__ = ["Adapter", "IP", "get_adapters"] __all__ = ["Adapter", "IP", "get_adapters"]

View file

@ -9,6 +9,7 @@ from .__init__ import CORES
from .authsrv import VFS, AuthSrv from .authsrv import VFS, AuthSrv
from .bos import bos from .bos import bos
from .th_cli import ThumbCli from .th_cli import ThumbCli
from .th_srv import TH_CH
from .util import UTC, vjoin, vol_san from .util import UTC, vjoin, vol_san
if True: # pylint: disable=using-constant-test if True: # pylint: disable=using-constant-test
@ -95,7 +96,7 @@ def enthumb(
if not thp: if not thp:
raise Exception() raise Exception()
ext = "jpg" if fmt == "j" else "webp" if fmt == "w" else fmt ext = fmt if fmt == "wav" else TH_CH.get(fmt[:1], fmt)
sz = bos.path.getsize(thp) sz = bos.path.getsize(thp)
st: os.stat_result = f["st"] st: os.stat_result = f["st"]
ts = st.st_mtime ts = st.st_mtime

View file

@ -35,14 +35,14 @@ from .mtag import HAVE_FFMPEG, HAVE_FFPROBE, HAVE_MUTAGEN
from .pwhash import HAVE_ARGON2 from .pwhash import HAVE_ARGON2
from .tcpsrv import TcpSrv from .tcpsrv import TcpSrv
from .th_srv import ( from .th_srv import (
HAVE_AVIF, H_PIL_AVIF,
H_PIL_HEIF,
H_PIL_WEBP,
HAVE_FFMPEG, HAVE_FFMPEG,
HAVE_FFPROBE, HAVE_FFPROBE,
HAVE_HEIF,
HAVE_PIL, HAVE_PIL,
HAVE_RAW, HAVE_RAW,
HAVE_VIPS, HAVE_VIPS,
HAVE_WEBP,
ThumbSrv, ThumbSrv,
) )
from .up2k import Up2k from .up2k import Up2k
@ -371,10 +371,6 @@ class SvcHub(object):
t = ", ".join(self.args.th_dec) or "(None available)" t = ", ".join(self.args.th_dec) or "(None available)"
self.log("thumb", "decoder preference: {}".format(t)) self.log("thumb", "decoder preference: {}".format(t))
if "pil" in self.args.th_dec and not HAVE_WEBP:
msg = "disabling webp thumbnails because either libwebp is not available or your Pillow is too old"
self.log("thumb", msg, c=3)
if self.args.th_dec: if self.args.th_dec:
self.thumbsrv = ThumbSrv(self) self.thumbsrv = ThumbSrv(self)
else: else:
@ -954,14 +950,14 @@ class SvcHub(object):
(HAVE_SQLITE3, "sqlite", "sessions and file/media indexing"), (HAVE_SQLITE3, "sqlite", "sessions and file/media indexing"),
(HAVE_PIL, "pillow", "image thumbnails (plenty fast)"), (HAVE_PIL, "pillow", "image thumbnails (plenty fast)"),
(HAVE_VIPS, "vips", "image thumbnails (faster, eats more ram)"), (HAVE_VIPS, "vips", "image thumbnails (faster, eats more ram)"),
(HAVE_WEBP, "pillow-webp", "create thumbnails as webp files"), (H_PIL_WEBP, "pillow-webp", "create thumbnails as webp files"),
(HAVE_FFMPEG, "ffmpeg", t_ff + ", good-but-slow image thumbnails"), (HAVE_FFMPEG, "ffmpeg", t_ff + ", good-but-slow image thumbnails"),
(HAVE_FFPROBE, "ffprobe", t_ff + ", read audio/media tags"), (HAVE_FFPROBE, "ffprobe", t_ff + ", read audio/media tags"),
(HAVE_MUTAGEN, "mutagen", "read audio tags (ffprobe is better but slower)"), (HAVE_MUTAGEN, "mutagen", "read audio tags (ffprobe is better but slower)"),
(HAVE_ARGON2, "argon2", "secure password hashing (advanced users only)"), (HAVE_ARGON2, "argon2", "secure password hashing (advanced users only)"),
(HAVE_ZMQ, "pyzmq", "send zeromq messages from event-hooks"), (HAVE_ZMQ, "pyzmq", "send zeromq messages from event-hooks"),
(HAVE_HEIF, "pillow-heif", "read .heif images with pillow (rarely useful)"), (H_PIL_HEIF, "pillow-heif", "read .heif pics with pillow (rarely useful)"),
(HAVE_AVIF, "pillow-avif", "read .avif images with pillow (rarely useful)"), (H_PIL_AVIF, "pillow-avif", "read .avif pics with pillow (rarely useful)"),
(HAVE_RAW, "rawpy", "read RAW images"), (HAVE_RAW, "rawpy", "read RAW images"),
] ]
if ANYWIN: if ANYWIN:
@ -1033,7 +1029,11 @@ class SvcHub(object):
t = "WARNING:\nDisabling WebDAV support because dxml selftest failed. Please report this bug;\n%s\n...and include the following information in the bug-report:\n%s | expat %s\n" t = "WARNING:\nDisabling WebDAV support because dxml selftest failed. Please report this bug;\n%s\n...and include the following information in the bug-report:\n%s | expat %s\n"
self.log("root", t % (URL_BUG, VERSIONS, expat_ver()), 1) self.log("root", t % (URL_BUG, VERSIONS, expat_ver()), 1)
if not E.scfg and not al.unsafe_state and not os.getenv("PRTY_UNSAFE_STATE"): if (
not E.scfg
and not al.unsafe_state
and not os.environ.get("PRTY_UNSAFE_STATE")
):
t = "because runtime config is currently being stored in an untrusted emergency-fallback location. Please fix your environment so either XDG_CONFIG_HOME or ~/.config can be used instead, or disable this safeguard with --unsafe-state or env-var PRTY_UNSAFE_STATE=1." t = "because runtime config is currently being stored in an untrusted emergency-fallback location. Please fix your environment so either XDG_CONFIG_HOME or ~/.config can be used instead, or disable this safeguard with --unsafe-state or env-var PRTY_UNSAFE_STATE=1."
if not al.no_ses: if not al.no_ses:
al.no_ses = True al.no_ses = True
@ -1077,6 +1077,12 @@ class SvcHub(object):
vs = [x.lower() for x in vs] vs = [x.lower() for x in vs]
setattr(al, n, vs) setattr(al, n, vs)
ns = "ihead ohead"
for n in ns.split(" "):
vs = getattr(al, n) or []
vs = [x.lower() for x in vs]
setattr(al, n, vs)
R = al.rp_loc R = al.rp_loc
if "//" in R or ":" in R: if "//" in R or ":" in R:
t = "found URL in --rp-loc; it should be just the location, for example /foo/bar" t = "found URL in --rp-loc; it should be just the location, for example /foo/bar"
@ -1150,10 +1156,11 @@ class SvcHub(object):
elif al.ban_url == "no": elif al.ban_url == "no":
al.sus_urls = None al.sus_urls = None
al.xff_hdr = al.xff_hdr.lower() zs = "fika idp_h_grp idp_h_key pw_hdr pw_urlp xf_host xf_proto xf_proto_fb xff_hdr"
for k in zs.split(" "):
setattr(al, k, str(getattr(al, k)).lower().strip())
al.idp_h_usr = [x.lower() for x in al.idp_h_usr or []] al.idp_h_usr = [x.lower() for x in al.idp_h_usr or []]
al.idp_h_grp = al.idp_h_grp.lower()
al.idp_h_key = al.idp_h_key.lower()
al.idp_hm_usr_p = {} al.idp_hm_usr_p = {}
for zs0 in al.idp_hm_usr or []: for zs0 in al.idp_hm_usr or []:
@ -1432,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)
@ -1442,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
@ -1741,7 +1749,7 @@ class SvcHub(object):
def sd_notify(self) -> None: def sd_notify(self) -> None:
try: try:
zb = os.getenv("NOTIFY_SOCKET") zb = os.environ.get("NOTIFY_SOCKET")
if not zb: if not zb:
return return

View file

@ -8,7 +8,7 @@ import stat
from .__init__ import TYPE_CHECKING from .__init__ import TYPE_CHECKING
from .authsrv import VFS from .authsrv import VFS
from .bos import bos from .bos import bos
from .th_srv import EXTS_AC, HAVE_WEBP, thumb_path from .th_srv import EXTS_AC, H_PIL_JXL, H_PIL_WEBP, thumb_path
from .util import Cooldown, Pebkac from .util import Cooldown, Pebkac
if True: # pylint: disable=using-constant-test if True: # pylint: disable=using-constant-test
@ -20,6 +20,8 @@ if TYPE_CHECKING:
IOERROR = "reading the file was denied by the server os; either due to filesystem permissions, selinux, apparmor, or similar:\n%r" IOERROR = "reading the file was denied by the server os; either due to filesystem permissions, selinux, apparmor, or similar:\n%r"
IMG_EXTS = set(["webp", "jpg", "png", "jxl"])
class ThumbCli(object): class ThumbCli(object):
def __init__(self, hsrv: "HttpSrv") -> None: def __init__(self, hsrv: "HttpSrv") -> None:
@ -50,8 +52,9 @@ class ThumbCli(object):
self.fmt_ffa = c["ffa"] self.fmt_ffa = c["ffa"]
# defer args.th_ff_jpg, can change at runtime # defer args.th_ff_jpg, can change at runtime
d = next((x for x in self.args.th_dec if x in ("vips", "pil")), None) nonpil = next((x for x in self.args.th_dec if x in ("vips", "ff")), None)
self.can_webp = HAVE_WEBP or d == "vips" self.can_webp = H_PIL_WEBP or nonpil
self.can_jxl = H_PIL_JXL or nonpil
def log(self, msg: str, c: Union[int, str] = 0) -> None: def log(self, msg: str, c: Union[int, str] = 0) -> None:
self.log_func("thumbcli", msg, c) self.log_func("thumbcli", msg, c)
@ -89,10 +92,10 @@ class ThumbCli(object):
preferred = self.args.th_dec[0] if self.args.th_dec else "" preferred = self.args.th_dec[0] if self.args.th_dec else ""
if rem.startswith(".hist/th/") and rem.split(".")[-1] in ["webp", "jpg", "png"]: if rem.startswith(".hist/th/") and rem.split(".")[-1] in IMG_EXTS:
return os.path.join(ptop, rem) return os.path.join(ptop, rem)
if fmt[:1] in "jw" and fmt != "wav": if fmt[:1] in "jwx" and fmt != "wav":
sfmt = fmt[:1] sfmt = fmt[:1]
if sfmt == "j" and self.args.th_no_jpg: if sfmt == "j" and self.args.th_no_jpg:
@ -101,11 +104,15 @@ class ThumbCli(object):
if sfmt == "w": if sfmt == "w":
if ( if (
self.args.th_no_webp self.args.th_no_webp
or (is_img and not self.can_webp) or not self.can_webp
or (self.args.th_ff_jpg and (not is_img or preferred == "ff")) or (self.args.th_ff_jpg and (not is_img or preferred == "ff"))
): ):
sfmt = "j" sfmt = "j"
if sfmt == "x":
if self.args.th_no_jxl or not self.can_jxl:
sfmt = "w"
vf_crop = dbv.flags["crop"] vf_crop = dbv.flags["crop"]
vf_th3x = dbv.flags["th3x"] vf_th3x = dbv.flags["th3x"]
@ -133,9 +140,12 @@ class ThumbCli(object):
tpath = thumb_path(histpath, rem, mtime, fmt, self.fmt_ffa) tpath = thumb_path(histpath, rem, mtime, fmt, self.fmt_ffa)
tpaths = [tpath] tpaths = [tpath]
if fmt[:1] == "w" and fmt != "wav": fmtc = fmt[:1]
if fmtc == "w" and fmt != "wav":
# also check for jpg (maybe webp is unavailable) # also check for jpg (maybe webp is unavailable)
tpaths.append(tpath.rsplit(".", 1)[0] + ".jpg") tpaths.append(tpath.rsplit(".", 1)[0] + ".jpg")
elif fmtc == "x":
tpaths.append(tpath.rsplit(".", 1)[0] + ".webp")
ret = None ret = None
abort = False abort = False

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
@ -36,7 +37,7 @@ from .util import (
) )
if True: # pylint: disable=using-constant-test if True: # pylint: disable=using-constant-test
from typing import Any, Optional, Union from typing import Any, Callable, Optional, Union
if TYPE_CHECKING: if TYPE_CHECKING:
from .svchub import SvcHub from .svchub import SvcHub
@ -46,11 +47,14 @@ if PY2:
HAVE_PIL = False HAVE_PIL = False
HAVE_PILF = False HAVE_PILF = False
HAVE_HEIF = False H_PIL_HEIF = False
HAVE_AVIF = False H_PIL_AVIF = False
HAVE_WEBP = False H_PIL_WEBP = False
H_PIL_JXL = False
EXTS_TH = set(["jpg", "webp", "png"]) TH_CH = {"j": "jpg", "p": "png", "w": "webp", "x": "jxl"}
EXTS_TH = set(["jpg", "webp", "jxl", "png"])
EXTS_AC = set(["opus", "owa", "caf", "mp3", "flac", "wav"]) EXTS_AC = set(["opus", "owa", "caf", "mp3", "flac", "wav"])
EXTS_SPEC_SAFE = set("aif aiff flac mp3 opus wav".split()) EXTS_SPEC_SAFE = set("aif aiff flac mp3 opus wav".split())
@ -128,7 +132,21 @@ try:
raise Exception() raise Exception()
Image.new("RGB", (2, 2)).save(BytesIO(), format="webp") Image.new("RGB", (2, 2)).save(BytesIO(), format="webp")
HAVE_WEBP = True H_PIL_WEBP = True
except:
pass
try:
if os.environ.get("PRTY_NO_PIL_JXL"):
raise Exception()
try:
import pillow_jxl
except ImportError:
pass
Image.new("RGB", (2, 2)).save(BytesIO(), format="jxl")
H_PIL_JXL = True
except: except:
pass pass
@ -142,7 +160,7 @@ try:
from pyheif_pillow_opener import register_heif_opener from pyheif_pillow_opener import register_heif_opener
register_heif_opener() register_heif_opener()
HAVE_HEIF = True H_PIL_HEIF = True
except: except:
pass pass
@ -151,12 +169,12 @@ try:
raise Exception() raise Exception()
if ".avif" in Image.registered_extensions(): if ".avif" in Image.registered_extensions():
HAVE_AVIF = True H_PIL_AVIF = True
raise Exception() raise Exception()
import pillow_avif # noqa: F401 # pylint: disable=unused-import import pillow_avif # noqa: F401 # pylint: disable=unused-import
HAVE_AVIF = True H_PIL_AVIF = True
except: except:
pass pass
@ -171,6 +189,7 @@ try:
HAVE_VIPS = True HAVE_VIPS = True
import pyvips import pyvips
pyvips.cache_set_max(0)
logging.getLogger("pyvips").setLevel(logging.WARNING) logging.getLogger("pyvips").setLevel(logging.WARNING)
except Exception as e: except Exception as e:
HAVE_VIPS = False HAVE_VIPS = False
@ -203,7 +222,7 @@ def thumb_path(histpath: str, rem: str, mtime: float, fmt: str, ffa: set[str]) -
# spectrograms are never cropped; strip fullsize flag # spectrograms are never cropped; strip fullsize flag
ext = rem.split(".")[-1].lower() ext = rem.split(".")[-1].lower()
if ext in ffa and fmt[:2] in ("wf", "jf"): if ext in ffa and fmt[:2] in ("wf", "jf", "xf"):
fmt = fmt.replace("f", "") fmt = fmt.replace("f", "")
dcache = th_dir_cache dcache = th_dir_cache
@ -224,8 +243,7 @@ def thumb_path(histpath: str, rem: str, mtime: float, fmt: str, ffa: set[str]) -
if fmt in EXTS_AC: if fmt in EXTS_AC:
cat = "ac" cat = "ac"
else: else:
fc = fmt[:1] fmt = TH_CH[fmt[:1]]
fmt = "webp" if fc == "w" else "png" if fc == "p" else "jpg"
cat = "th" cat = "th"
return "%s/%s/%s/%s.%x.%s" % (histpath, cat, rd, fn, int(mtime), fmt) return "%s/%s/%s/%s.%x.%s" % (histpath, cat, rd, fn, int(mtime), fmt)
@ -292,14 +310,22 @@ class ThumbSrv(object):
] ]
] ]
if not HAVE_HEIF: if not H_PIL_HEIF:
for f in "heif heifs heic heics".split(" "): for f in "heif heifs heic heics".split(" "):
self.fmt_pil.discard(f) self.fmt_pil.discard(f)
if not HAVE_AVIF: if not H_PIL_AVIF:
for f in "avif avifs".split(" "): for f in "avif avifs".split(" "):
self.fmt_pil.discard(f) self.fmt_pil.discard(f)
if not H_PIL_WEBP:
for f in "webp".split(" "):
self.fmt_pil.discard(f)
if not H_PIL_JXL:
for f in "jxl".split(" "):
self.fmt_pil.discard(f)
self.thumbable: set[str] = set() self.thumbable: set[str] = set()
if "pil" in self.args.th_dec: if "pil" in self.args.th_dec:
@ -407,7 +433,7 @@ class ThumbSrv(object):
zs = "th_dec th_no_webp th_no_jpg" zs = "th_dec th_no_webp th_no_jpg"
for zs in zs.split(" "): for zs in zs.split(" "):
ret.append("%s(%s)\n" % (zs, getattr(self.args, zs))) ret.append("%s(%s)\n" % (zs, getattr(self.args, zs)))
zs = "th_qv thsize th_spec_p convt" zs = "th_qv th_qvx thsize th_spec_p convt"
for zs in zs.split(" "): for zs in zs.split(" "):
ret.append("%s(%s)\n" % (zs, vn.flags.get(zs))) ret.append("%s(%s)\n" % (zs, vn.flags.get(zs)))
return "".join(ret) return "".join(ret)
@ -489,7 +515,7 @@ class ThumbSrv(object):
ext in self.fmt_ffa or ext in self.fmt_ffv ext in self.fmt_ffa or ext in self.fmt_ffv
) )
if lib == "pil" and ext in self.fmt_pil: if lib == "pil" and ext in self.fmt_pil and tex in self.fmt_pil:
funs.append(self.conv_pil) funs.append(self.conv_pil)
elif lib == "vips" and ext in self.fmt_vips: elif lib == "vips" and ext in self.fmt_vips:
funs.append(self.conv_vips) funs.append(self.conv_vips)
@ -529,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 _:
@ -621,7 +648,8 @@ class ThumbSrv(object):
im.thumbnail(self.getres(vn, fmt)) im.thumbnail(self.getres(vn, fmt))
fmts = ["RGB", "L"] fmts = ["RGB", "L"]
args = {"quality": vn.flags["th_qv"]} zs = "th_qvx" if tpath.endswith(".jxl") else "th_qv"
args = {"quality": vn.flags[zs]}
if tpath.endswith(".webp"): if tpath.endswith(".webp"):
# quality 80 = pillow-default # quality 80 = pillow-default
@ -646,8 +674,9 @@ class ThumbSrv(object):
with Image.open(fsenc(abspath)) as im: with Image.open(fsenc(abspath)) as im:
self.conv_image_pil(im, tpath, fmt, vn) self.conv_image_pil(im, tpath, fmt, vn)
def conv_vips(self, abspath: str, tpath: str, fmt: str, vn: VFS) -> None: def conv_image_vips(
self.wait4ram(0.2, tpath) self, loader: "Callable[[int, dict], Any]", tpath: str, fmt: str, vn: VFS
) -> None:
crops = ["centre", "none"] crops = ["centre", "none"]
if "f" in fmt: if "f" in fmt:
crops = ["none"] crops = ["none"]
@ -655,10 +684,11 @@ class ThumbSrv(object):
w, h = self.getres(vn, fmt) w, h = self.getres(vn, fmt)
kw = {"height": h, "size": "down", "intent": "relative"} kw = {"height": h, "size": "down", "intent": "relative"}
img = None
for c in crops: for c in crops:
try: try:
kw["crop"] = c kw["crop"] = c
img = pyvips.Image.thumbnail(abspath, w, **kw) img = loader(w, kw)
break break
except: except:
if c == crops[-1]: if c == crops[-1]:
@ -670,7 +700,20 @@ class ThumbSrv(object):
if tpath.endswith("jpg"): if tpath.endswith("jpg"):
qv = VIPS_JPG_Q[qv // 5] qv = VIPS_JPG_Q[qv // 5]
args["optimize_coding"] = True args["optimize_coding"] = True
elif tpath.endswith("jxl"):
qv = vn.flags["th_qvx"]
# args["effort"] = 8
# `- not worth it; twice as slow, size drops 12%, no visual improvement unlike ffmpeg
img.write_to_file(tpath, Q=qv, strip=True, **args) img.write_to_file(tpath, Q=qv, strip=True, **args)
img.invalidate()
def conv_vips(self, abspath: str, tpath: str, fmt: str, vn: VFS) -> None:
self.wait4ram(0.2, tpath)
def _loader(w: int, kw: dict) -> Any:
return pyvips.Image.thumbnail(abspath, w, **kw)
self.conv_image_vips(_loader, tpath, fmt, vn)
def conv_raw(self, abspath: str, tpath: str, fmt: str, vn: VFS) -> None: def conv_raw(self, abspath: str, tpath: str, fmt: str, vn: VFS) -> None:
self.wait4ram(0.2, tpath) self.wait4ram(0.2, tpath)
@ -682,34 +725,15 @@ class ThumbSrv(object):
with open(tpath, "wb") as f: with open(tpath, "wb") as f:
f.write(thumb.data) f.write(thumb.data)
if HAVE_VIPS: if HAVE_VIPS:
crops = ["centre", "none"]
if "f" in fmt:
crops = ["none"]
w, h = self.getres(vn, fmt)
kw = {"height": h, "size": "down", "intent": "relative"}
for c in crops: def _loader(w: int, kw: dict) -> Any:
try: if thumb.format == rawpy.ThumbFormat.BITMAP:
kw["crop"] = c img = pyvips.Image.new_from_array(thumb.data, interpretation="rgb")
if thumb.format == rawpy.ThumbFormat.BITMAP: return img.thumbnail_image(w, **kw)
img = pyvips.Image.new_from_array( else:
thumb.data, interpretation="rgb" return pyvips.Image.thumbnail_buffer(thumb.data, w, **kw)
)
img = img.thumbnail_image(w, **kw)
else:
img = pyvips.Image.thumbnail_buffer(thumb.data, w, **kw)
break
except:
if c == crops[-1]:
raise
assert img # type: ignore # !rm self.conv_image_vips(_loader, tpath, fmt, vn)
args = {}
qv = vn.flags["th_qv"]
if tpath.endswith("jpg"):
qv = VIPS_JPG_Q[qv // 5]
args["optimize_coding"] = True
img.write_to_file(tpath, Q=qv, strip=True, **args)
elif HAVE_PIL: elif HAVE_PIL:
if thumb.format == rawpy.ThumbFormat.BITMAP: if thumb.format == rawpy.ThumbFormat.BITMAP:
im = Image.fromarray(thumb.data, "RGB") im = Image.fromarray(thumb.data, "RGB")
@ -770,11 +794,21 @@ class ThumbSrv(object):
] ]
# fmt: on # fmt: on
self._ffmpeg_im_o(tpath, vn, cmd)
def _ffmpeg_im_o(self, tpath: str, vn: VFS, cmd: list[bytes]) -> None:
if tpath.endswith(".jpg"): if tpath.endswith(".jpg"):
cmd += [ cmd += [
b"-q:v", b"-q:v",
FF_JPG_Q[vn.flags["th_qv"] // 5], # default=?? FF_JPG_Q[vn.flags["th_qv"] // 5], # default=??
] ]
elif tpath.endswith(".jxl"):
cmd += [
b"-q:v",
unicode(vn.flags["th_qvx"]).encode("ascii"), # default=??
b"-effort:v",
b"8", # default=7, 1=fast, 9=max, 9~=8 but slower
]
else: else:
cmd += [ cmd += [
b"-q:v", b"-q:v",
@ -794,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 (
@ -809,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
@ -828,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:
@ -979,21 +1024,7 @@ class ThumbSrv(object):
] ]
# fmt: on # fmt: on
if tpath.endswith(".jpg"): self._ffmpeg_im_o(tpath, vn, cmd)
cmd += [
b"-q:v",
FF_JPG_Q[vn.flags["th_qv"] // 5], # default=??
]
else:
cmd += [
b"-q:v",
unicode(vn.flags["th_qv"]).encode("ascii"), # default=75
b"-compression_level:v",
b"6", # default=4, 0=fast, 6=max
]
cmd += [fsenc(tpath)]
self._run_ff(cmd, vn, "convt")
def conv_mp3(self, abspath: str, tpath: str, fmt: str, vn: VFS) -> None: def conv_mp3(self, abspath: str, tpath: str, fmt: str, vn: VFS) -> None:
quality = self.args.q_mp3.lower() quality = self.args.q_mp3.lower()

View file

@ -166,6 +166,7 @@ class Up2k(object):
self.gt0 = 0 self.gt0 = 0
self.gt1 = 0 self.gt1 = 0
self.stop = False self.stop = False
self.fika = ""
self.mutex = threading.Lock() self.mutex = threading.Lock()
self.reload_mutex = threading.Lock() self.reload_mutex = threading.Lock()
self.reload_flag = 0 self.reload_flag = 0
@ -1152,7 +1153,7 @@ class Up2k(object):
ft = "\033[0;32m{}{:.0}" ft = "\033[0;32m{}{:.0}"
ff = "\033[0;35m{}{:.0}" ff = "\033[0;35m{}{:.0}"
fv = "\033[0;36m{}:\033[90m{}" fv = "\033[0;36m{}:\033[90m{}"
zs = "bcasechk du_iwho emb_all emb_lgs emb_mds ext_th_d html_head html_head_d html_head_s ls_q_m put_name2 mv_re_r mv_re_t rm_re_r rm_re_t srch_re_dots srch_re_nodot zipmax zipmaxn_v zipmaxs_v" zs = "bcasechk du_iwho emb_all emb_lgs emb_mds ext_th_d html_head html_head_d html_head_s ls_q_m put_name2 mv_re_r mv_re_t rm_re_r rm_re_t rw_edit_set srch_re_dots srch_re_nodot zipmax zipmaxn_v zipmaxs_v"
fx = set(zs.split()) fx = set(zs.split())
fd = vf_bmap() fd = vf_bmap()
fd.update(vf_cmap()) fd.update(vf_cmap())
@ -1475,6 +1476,23 @@ class Up2k(object):
return True, bool(n_add or n_rm or do_vac) return True, bool(n_add or n_rm or do_vac)
def _fika(self, db: Dbw) -> None:
zs = self.fika
self.fika = ""
if zs not in self.args.fika:
return
t = "fika(%s); commit %d new files; %d updates"
self.log(t % (zs, db.nf, db.n))
db.c.connection.commit()
db.n = db.nf = 0
db.t = time.time()
self.mutex.release()
time.sleep(0.5)
self.mutex.acquire()
db.t = time.time()
def _build_dir( def _build_dir(
self, self,
db: Dbw, db: Dbw,
@ -1527,8 +1545,12 @@ class Up2k(object):
gl = sorted(g) gl = sorted(g)
partials = set([x[0] for x in gl if "PARTIAL" in x[0]]) partials = set([x[0] for x in gl if "PARTIAL" in x[0]])
for iname, inf in gl: for iname, inf in gl:
if self.stop: if self.fika:
return -1, 0, 0 if not self.stop:
self._fika(db)
if self.stop:
self.fika = "f"
return -1, 0, 0
rp = rds + iname rp = rds + iname
abspath = cdirs + iname abspath = cdirs + iname
@ -1675,8 +1697,12 @@ class Up2k(object):
seen_files = set([x[2] for x in files]) # for dropcheck seen_files = set([x[2] for x in files]) # for dropcheck
for sz, lmod, fn in files: for sz, lmod, fn in files:
if self.stop: if self.fika:
return -1, 0, 0 if not self.stop:
self._fika(db)
if self.stop:
self.fika = "f"
return -1, 0, 0
rp = rds + fn rp = rds + fn
abspath = cdirs + fn abspath = cdirs + fn
@ -2978,6 +3004,7 @@ class Up2k(object):
raise Pebkac(503, SBUSY % ("fs-reload",)) raise Pebkac(503, SBUSY % ("fs-reload",))
got_lock = False got_lock = False
self.fika = "u"
try: try:
# bit expensive; 3.9=10x 3.11=2x # bit expensive; 3.9=10x 3.11=2x
if self.mutex.acquire(timeout=10): if self.mutex.acquire(timeout=10):
@ -3643,6 +3670,7 @@ class Up2k(object):
def handle_chunks( def handle_chunks(
self, ptop: str, wark: str, chashes: list[str] self, ptop: str, wark: str, chashes: list[str]
) -> tuple[list[str], int, list[list[int]], str, float, int, bool]: ) -> tuple[list[str], int, list[list[int]], str, float, int, bool]:
self.fika = "u"
with self.mutex, self.reg_mutex: with self.mutex, self.reg_mutex:
self.db_act = self.vol_act[ptop] = time.time() self.db_act = self.vol_act[ptop] = time.time()
job = self.registry[ptop].get(wark) job = self.registry[ptop].get(wark)
@ -3745,6 +3773,7 @@ class Up2k(object):
def confirm_chunks( def confirm_chunks(
self, ptop: str, wark: str, written: list[str], locked: list[str] self, ptop: str, wark: str, written: list[str], locked: list[str]
) -> tuple[int, str]: ) -> tuple[int, str]:
self.fika = "u"
with self.mutex, self.reg_mutex: with self.mutex, self.reg_mutex:
return self._confirm_chunks(ptop, wark, written, locked, True) return self._confirm_chunks(ptop, wark, written, locked, True)
@ -3784,6 +3813,7 @@ class Up2k(object):
def finish_upload(self, ptop: str, wark: str, busy_aps: dict[str, int]) -> None: def finish_upload(self, ptop: str, wark: str, busy_aps: dict[str, int]) -> None:
self.busy_aps = busy_aps self.busy_aps = busy_aps
self.fika = "u"
with self.mutex, self.reg_mutex: with self.mutex, self.reg_mutex:
self._finish_upload(ptop, wark) self._finish_upload(ptop, wark)
@ -4138,6 +4168,7 @@ class Up2k(object):
vn0, rem0 = self.vfs.get(vpath, uname, *permsets[0]) vn0, rem0 = self.vfs.get(vpath, uname, *permsets[0])
vn, rem = vn0.get_dbv(rem0) vn, rem = vn0.get_dbv(rem0)
ptop = vn.realpath ptop = vn.realpath
self.fika = "d"
with self.mutex, self.reg_mutex: with self.mutex, self.reg_mutex:
abrt_cfg = vn.flags.get("u2abort", 1) abrt_cfg = vn.flags.get("u2abort", 1)
addr = (ip or "\n") if abrt_cfg in (1, 2) else "" addr = (ip or "\n") if abrt_cfg in (1, 2) else ""
@ -4266,6 +4297,7 @@ class Up2k(object):
continue continue
n_files += 1 n_files += 1
self.fika = "d"
with self.mutex, self.reg_mutex: with self.mutex, self.reg_mutex:
cur = None cur = None
try: try:
@ -4330,6 +4362,7 @@ class Up2k(object):
raise Pebkac(400, "file does not exist case-sensitively") raise Pebkac(400, "file does not exist case-sensitively")
if stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode): if stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode):
self.fika = "c"
with self.mutex: with self.mutex:
try: try:
ret = self._cp_file(uname, ip, svp, dvp, curs) ret = self._cp_file(uname, ip, svp, dvp, curs)
@ -4351,6 +4384,7 @@ class Up2k(object):
# don't use svn_dbv; would skip subvols due to _ls `if not rem:` # don't use svn_dbv; would skip subvols due to _ls `if not rem:`
g = svn.walk("", srem, [], uname, permsets, dots, scandir, True) g = svn.walk("", srem, [], uname, permsets, dots, scandir, True)
self.fika = "c"
with self.mutex: with self.mutex:
try: try:
for dbv, vrem, _, atop, files, rd, vd in g: for dbv, vrem, _, atop, files, rd, vd in g:
@ -4556,6 +4590,7 @@ class Up2k(object):
raise Pebkac(400, "file does not exist case-sensitively") raise Pebkac(400, "file does not exist case-sensitively")
if stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode): if stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode):
self.fika = "m"
with self.mutex: with self.mutex:
try: try:
ret = self._mv_file(uname, ip, svp, dvp, curs) ret = self._mv_file(uname, ip, svp, dvp, curs)
@ -4579,6 +4614,7 @@ class Up2k(object):
raise Pebkac(400, "mv: source folder contains other volumes") raise Pebkac(400, "mv: source folder contains other volumes")
g = svn.walk("", srem, [], uname, permsets, 2, scandir, True) g = svn.walk("", srem, [], uname, permsets, 2, scandir, True)
self.fika = "m"
with self.mutex: with self.mutex:
try: try:
for dbv, vrem, _, atop, files, rd, vd in g: for dbv, vrem, _, atop, files, rd, vd in g:
@ -5317,6 +5353,7 @@ class Up2k(object):
self.do_snapshot() self.do_snapshot()
def do_snapshot(self) -> None: def do_snapshot(self) -> None:
self.fika = "u"
with self.mutex, self.reg_mutex: with self.mutex, self.reg_mutex:
for k, reg in self.registry.items(): for k, reg in self.registry.items():
self._snap_reg(k, reg) self._snap_reg(k, reg)
@ -5597,6 +5634,7 @@ class Up2k(object):
def shutdown(self) -> None: def shutdown(self) -> None:
self.stop = True self.stop = True
self.fika = "f"
if self.mth: if self.mth:
self.mth.stop = True self.mth.stop = True

View file

@ -45,6 +45,7 @@ except:
from .__init__ import ( from .__init__ import (
ANYWIN, ANYWIN,
EXE, EXE,
GRAAL,
MACOS, MACOS,
PY2, PY2,
PY36, PY36,
@ -56,6 +57,11 @@ from .__init__ import (
) )
from .__version__ import S_BUILD_DT, S_VERSION from .__version__ import S_BUILD_DT, S_VERSION
def noop(*a, **ka):
pass
try: try:
from datetime import datetime, timezone from datetime import datetime, timezone
@ -135,16 +141,28 @@ except:
HAVE_FICLONE = False HAVE_FICLONE = False
try: try:
import ctypes
import termios import termios
except: except:
pass pass
try:
if os.environ.get("PRTY_NO_CTYPES"):
raise Exception()
import ctypes
except:
ctypes = None
try:
wk32 = ctypes.WinDLL(str("kernel32"), use_last_error=True) # type: ignore
except:
wk32 = None
try: try:
if os.environ.get("PRTY_NO_IFADDR"): if os.environ.get("PRTY_NO_IFADDR"):
raise Exception() raise Exception()
try: try:
if os.getenv("PRTY_SYS_ALL") or os.getenv("PRTY_SYS_IFADDR"): if os.environ.get("PRTY_SYS_ALL") or os.environ.get("PRTY_SYS_IFADDR"):
raise ImportError() raise ImportError()
from .stolen.ifaddr import get_adapters from .stolen.ifaddr import get_adapters
@ -196,7 +214,7 @@ try:
except: except:
pass pass
if os.getenv("PRTY_MODSPEC"): if os.environ.get("PRTY_MODSPEC"):
from inspect import getsourcefile from inspect import getsourcefile
print("PRTY_MODSPEC: ifaddr:", getsourcefile(get_adapters)) print("PRTY_MODSPEC: ifaddr:", getsourcefile(get_adapters))
@ -252,6 +270,20 @@ try:
socket.inet_pton(socket.AF_INET6, "::1") socket.inet_pton(socket.AF_INET6, "::1")
HAVE_IPV6 = True HAVE_IPV6 = True
if GRAAL:
try:
# --python.PosixModuleBackend=java throws OSError: illegal IP address
socket.inet_pton(socket.AF_INET, "127.0.0.1")
except:
_inet_pton = socket.inet_pton
def inet_pton(fam, ip):
if fam == socket.AF_INET:
return socket.inet_aton(ip)
return _inet_pton(fam, ip)
socket.inet_pton = inet_pton
except: except:
def inet_pton(fam, ip): def inet_pton(fam, ip):
@ -280,6 +312,9 @@ except:
BITNESS = struct.calcsize("P") * 8 BITNESS = struct.calcsize("P") * 8
CAN_SIGMASK = not (ANYWIN or PY2 or GRAAL)
RE_ANSI = re.compile("\033\\[[^mK]*[mK]") RE_ANSI = re.compile("\033\\[[^mK]*[mK]")
RE_HTML_SH = re.compile(r"[<>&$?`\"';]") RE_HTML_SH = re.compile(r"[<>&$?`\"';]")
RE_CTYPE = re.compile(r"^content-type: *([^; ]+)", re.IGNORECASE) RE_CTYPE = re.compile(r"^content-type: *([^; ]+)", re.IGNORECASE)
@ -462,7 +497,7 @@ application p7s=pkcs7-signature dcm=dicom shx=vnd.shx shp=vnd.shp dbf=x-dbf gml=
application swf=x-shockwave-flash m3u=vnd.apple.mpegurl db3=vnd.sqlite3 sqlite=vnd.sqlite3 application swf=x-shockwave-flash m3u=vnd.apple.mpegurl db3=vnd.sqlite3 sqlite=vnd.sqlite3
text ass=plain ssa=plain text ass=plain ssa=plain
image jpg=jpeg xpm=x-xpixmap psd=vnd.adobe.photoshop jpf=jpx tif=tiff ico=x-icon djvu=vnd.djvu image jpg=jpeg xpm=x-xpixmap psd=vnd.adobe.photoshop jpf=jpx tif=tiff ico=x-icon djvu=vnd.djvu
image heic=heic-sequence heif=heif-sequence hdr=vnd.radiance svg=svg+xml image heics=heic-sequence heifs=heif-sequence hdr=vnd.radiance svg=svg+xml
image arw=x-sony-arw cr2=x-canon-cr2 crw=x-canon-crw dcr=x-kodak-dcr dng=x-adobe-dng erf=x-epson-erf image arw=x-sony-arw cr2=x-canon-cr2 crw=x-canon-crw dcr=x-kodak-dcr dng=x-adobe-dng erf=x-epson-erf
image k25=x-kodak-k25 kdc=x-kodak-kdc mrw=x-minolta-mrw nef=x-nikon-nef orf=x-olympus-orf image k25=x-kodak-k25 kdc=x-kodak-kdc mrw=x-minolta-mrw nef=x-nikon-nef orf=x-olympus-orf
image pef=x-pentax-pef raf=x-fuji-raf raw=x-panasonic-raw sr2=x-sony-sr2 srf=x-sony-srf x3f=x-sigma-x3f image pef=x-pentax-pef raf=x-fuji-raf raw=x-panasonic-raw sr2=x-sony-sr2 srf=x-sony-srf x3f=x-sigma-x3f
@ -779,7 +814,7 @@ class Daemon(threading.Thread):
self.start() self.start()
def run(self): def run(self):
if not ANYWIN and not PY2: if CAN_SIGMASK:
signal.pthread_sigmask( signal.pthread_sigmask(
signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1] signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1]
) )
@ -962,6 +997,7 @@ class _Unrecv(object):
self.log = log self.log = log
self.buf: bytes = b"" self.buf: bytes = b""
self.nb = 0 self.nb = 0
self.te = 0
def recv(self, nbytes: int, spins: int = 1) -> bytes: def recv(self, nbytes: int, spins: int = 1) -> bytes:
if self.buf: if self.buf:
@ -1655,15 +1691,15 @@ def log_thrs(log: Callable[[str, str, int], None], ival: float, name: str) -> No
log(name, "\033[0m \033[33m".join(tv), 3) log(name, "\033[0m \033[33m".join(tv), 3)
def sigblock(): def _sigblock():
if ANYWIN or PY2:
return
signal.pthread_sigmask( signal.pthread_sigmask(
signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1] signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1]
) )
sigblock = _sigblock if CAN_SIGMASK else noop
def vol_san(vols: list["VFS"], txt: bytes) -> bytes: def vol_san(vols: list["VFS"], txt: bytes) -> bytes:
txt0 = txt txt0 = txt
for vol in vols: for vol in vols:
@ -2350,6 +2386,12 @@ def exclude_dotfiles(filepaths: list[str]) -> list[str]:
return [x for x in filepaths if not x.split("/")[-1].startswith(".")] return [x for x in filepaths if not x.split("/")[-1].startswith(".")]
def exclude_dotfiles_ls(
vfs_ls: list[tuple[str, os.stat_result]]
) -> list[tuple[str, os.stat_result]]:
return [x for x in vfs_ls if not x[0].split("/")[-1].startswith(".")]
def odfusion( def odfusion(
base: Union[ODict[str, bool], ODict["LiteralString", bool]], oth: str base: Union[ODict[str, bool], ODict["LiteralString", bool]], oth: str
) -> ODict[str, bool]: ) -> ODict[str, bool]:
@ -2877,7 +2919,7 @@ def get_df(abspath: str, prune: bool) -> tuple[int, int, str]:
bfree = ctypes.c_ulonglong(0) bfree = ctypes.c_ulonglong(0)
btotal = ctypes.c_ulonglong(0) btotal = ctypes.c_ulonglong(0)
bavail = ctypes.c_ulonglong(0) bavail = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW( # type: ignore wk32.GetDiskFreeSpaceExW( # type: ignore
ctypes.c_wchar_p(abspath), ctypes.c_wchar_p(abspath),
ctypes.pointer(bavail), ctypes.pointer(bavail),
ctypes.pointer(btotal), ctypes.pointer(btotal),
@ -2936,6 +2978,8 @@ def shut_socket(log: "NamedLogger", sck: socket.socket, timeout: int = 3) -> Non
sck.shutdown(socket.SHUT_RDWR) sck.shutdown(socket.SHUT_RDWR)
except: except:
pass pass
except OSError as ex:
log("shut(%d): ok; client has already disconnected; %s" % (fd, ex.errno), "90")
except Exception as ex: except Exception as ex:
log("shut({}): {}".format(fd, ex), "90") log("shut({}): {}".format(fd, ex), "90")
finally: finally:
@ -2999,6 +3043,7 @@ def read_socket_chunked(
if chunklen == 0: if chunklen == 0:
x = sr.recv_ex(2, False) x = sr.recv_ex(2, False)
if x == b"\r\n": if x == b"\r\n":
sr.te = 2
return return
t = "protocol error after final chunk: want b'\\r\\n', got {!r}" t = "protocol error after final chunk: want b'\\r\\n', got {!r}"
@ -3394,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:
@ -4270,8 +4317,8 @@ def termsize() -> tuple[int, int]:
def hidedir(dp) -> None: def hidedir(dp) -> None:
if ANYWIN: if ANYWIN:
try: try:
assert ctypes # type: ignore # !rm assert wk32 # type: ignore # !rm
k32 = ctypes.WinDLL("kernel32") k32 = wk32
attrs = k32.GetFileAttributesW(dp) attrs = k32.GetFileAttributesW(dp)
if attrs >= 0: if attrs >= 0:
k32.SetFileAttributesW(dp, attrs | 2) k32.SetFileAttributesW(dp, attrs | 2)
@ -4346,6 +4393,31 @@ else:
lock_file = _lock_file_noop lock_file = _lock_file_noop
def _open_nolock_windows(bap: Union[str, bytes], *a, **ka) -> typing.BinaryIO:
assert ctypes # !rm
assert wk32 # !rm
import msvcrt
try:
ap = bap.decode("utf-8", "replace") # type: ignore
except:
ap = bap
fh = wk32.CreateFileW(ap, 0x80000000, 7, None, 3, 0x80, None)
# `-ap, GENERIC_READ, FILE_SHARE_READ|WRITE|DELETE, None, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, None
if fh == -1:
ec = ctypes.get_last_error() # type: ignore
raise ctypes.WinError(ec) # type: ignore
fd = msvcrt.open_osfhandle(fh, os.O_RDONLY) # type: ignore
return os.fdopen(fd, "rb")
if ANYWIN:
open_nolock = _open_nolock_windows
else:
open_nolock = open
try: try:
if sys.version_info < (3, 10) or os.environ.get("PRTY_NO_IMPRESO"): if sys.version_info < (3, 10) or os.environ.get("PRTY_NO_IMPRESO"):
# py3.8 doesn't have .files # py3.8 doesn't have .files

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

@ -36,10 +36,11 @@ window.baguetteBox = (function () {
touchFlag = false, // busy touchFlag = false, // busy
scrollCSS = ['', ''], scrollCSS = ['', ''],
scrollTimer = 0, scrollTimer = 0,
re_i = /^[^?]+\.(a?png|avif|bmp|gif|heif|jpe?g|jfif|svg|webp)(\?|$)/i, re_i = APPLE ?
/^[^?]+\.(a?png|avif|bmp|gif|hei[cf]s?|jfif|jpe?g|jxl|svg|tiff?|webp)(\?|$)/i :
/^[^?]+\.(a?png|avif|bmp|gif|jfif|jpe?g|jxl|svg|tiff?|webp)(\?|$)/i,
re_v = /^[^?]+\.(webm|mkv|mp4|m4v|mov)(\?|$)/i, re_v = /^[^?]+\.(webm|mkv|mp4|m4v|mov)(\?|$)/i,
re_cbz = /^[^?]+\.(cbz)(\?|$)/i, re_cbz = /^[^?]+\.(cbz)(\?|$)/i,
cbz_pics = ["png", "jpg", "jpeg", "gif", "bmp", "tga", "tif", "tiff", "webp", "avif"],
anims = ['slideIn', 'fadeIn', 'none'], anims = ['slideIn', 'fadeIn', 'none'],
data = {}, // all galleries data = {}, // all galleries
imagesElements = [], imagesElements = [],
@ -251,8 +252,7 @@ window.baguetteBox = (function () {
var imagesList = fileList.map(function (file) { var imagesList = fileList.map(function (file) {
return file["fn"]; return file["fn"];
}).filter(function (file) { }).filter(function (file) {
return file.indexOf(".") !== -1 return re_i.test(file);
&& cbz_pics.indexOf(file.split(".").pop()) !== -1;
}).sort(); }).sort();
if (imagesList.length === 0) { if (imagesList.length === 0) {

View file

@ -1456,7 +1456,8 @@ html.dz input {
width: calc(100% - 16.2em); width: calc(100% - 16.2em);
} }
input.drc_v, input.drc_v,
input.eq_gain { input.eq_gain,
input.ssconf_v {
width: 3em; width: 3em;
text-align: center; text-align: center;
margin: 0 .6em; margin: 0 .6em;
@ -1466,7 +1467,8 @@ input.eq_gain {
border-collapse: collapse; border-collapse: collapse;
} }
#audio_drc td, #audio_drc td,
#audio_eq td { #audio_eq td,
#audio_ss td {
text-align: center; text-align: center;
} }
#audio_eq a.eq_step { #audio_eq a.eq_step {
@ -1474,15 +1476,22 @@ input.eq_gain {
display: block; display: block;
padding: 0; padding: 0;
} }
#au_ss,
#au_drc, #au_drc,
#au_eq { #au_eq {
display: block; display: block;
margin-top: .5em; margin-top: .5em;
padding: 1.3em .3em; padding: 1.3em .3em;
} }
#au_ss,
#au_drc { #au_drc {
padding: .4em .3em; padding: .4em .3em;
} }
#au_ss.on {
width: 3em;
height: 1em;
overflow: hidden;
}
#ico1 { #ico1 {
cursor: pointer; cursor: pointer;
} }

View file

@ -2,10 +2,10 @@
var J_BRW = 1; var J_BRW = 1;
if (!window.drcm) alert('FATAL ERROR: receiving stale data from the server; this may be due to a broken reverse-proxy (stuck cache). Try restarting copyparty and press CTRL-SHIFT-R in the browser'); if (window.rw_edit === undefined)
alert('FATAL ERROR: receiving stale data from the server; this may be due to a broken reverse-proxy (stuck cache). Try restarting copyparty and press CTRL-SHIFT-R in the browser');
var XHR = XMLHttpRequest, var XHR = XMLHttpRequest;
img_re = /\.(a?png|avif|bmp|gif|heif|jpe?g|jfif|svg|webp|webm|mkv|mp4|m4v|mov)(\?|$)/i;
if (1) if (1)
Ls.eng = { Ls.eng = {
@ -121,7 +121,7 @@ if (1)
"login": "Login", "login": "Login",
"access": " access", "access": " access",
"ot_close": "close submenu", "ot_close": "close submenu",
"ot_search": "search for files by attributes, path / name, music tags, or any combination of those$N$N&lt;code&gt;foo bar&lt;/code&gt; = must contain both «foo» and «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = must contain «foo» but not «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = start with «yana» and be an «opus» file$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = contain exactly «try unite»$N$Nthe date format is iso-8601, like$N&lt;code&gt;2009-12-31&lt;/code&gt; or &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`search for files by attributes, path / name, music tags, or any combination of those$N$N`foo bar` = must contain both «foo» and «bar»,$N`foo -bar` = must contain «foo» but not «bar»,$N`^yana .opus$` = start with «yana» and be an «opus» file$N`&quot;try unite&quot;` = contain exactly «try unite»$N$Nthe date format is iso-8601, like$N`2009-12-31` or `2020-09-12 23:30:00`",
"ot_unpost": "unpost: delete your recent uploads, or abort unfinished ones", "ot_unpost": "unpost: delete your recent uploads, or abort unfinished ones",
"ot_bup": "bup: basic uploader, even supports netscape 4.0", "ot_bup": "bup: basic uploader, even supports netscape 4.0",
"ot_mkdir": "mkdir: create a new directory", "ot_mkdir": "mkdir: create a new directory",
@ -270,9 +270,9 @@ if (1)
"cdt_lim": "max number of files to show in a folder", "cdt_lim": "max number of files to show in a folder",
"cdt_ask": "when scrolling to the bottom,$Ninstead of loading more files,$Nask what to do", "cdt_ask": "when scrolling to the bottom,$Ninstead of loading more files,$Nask what to do",
"cdt_hsort": "how many sorting rules (&lt;code&gt;,sorthref&lt;/code&gt;) to include in media-URLs. Setting this to 0 will also ignore sorting-rules included in media links when clicking them", "cdt_hsort": "`how many sorting rules (`,sorthref`) to include in media-URLs. Setting this to 0 will also ignore sorting-rules included in media links when clicking them",
"cdt_ren": "enable custom right-click menu, you can still access the regular menu by pressing the shift key and right-clicking", "cdt_ren": "enable custom right-click menu, you can still access the regular menu by pressing the shift key and right-clicking\">enable",
"cdt_rdb": "show the regular right-click menu when the custom one is already open and right-clicking again", "cdt_rdb": "show the regular right-click menu when the custom one is already open and right-clicking again\">double",
"tt_entree": "show navpane (directory tree sidebar)$NHotkey: B", "tt_entree": "show navpane (directory tree sidebar)$NHotkey: B",
"tt_detree": "show breadcrumbs$NHotkey: B", "tt_detree": "show breadcrumbs$NHotkey: B",
@ -290,6 +290,7 @@ if (1)
"ml_tint": "tint", "ml_tint": "tint",
"ml_eq": "audio equalizer", "ml_eq": "audio equalizer",
"ml_drc": "dynamic range compressor", "ml_drc": "dynamic range compressor",
"ml_ss": "skip silence",
"mt_loop": "loop/repeat one song\">🔁", "mt_loop": "loop/repeat one song\">🔁",
"mt_one": "stop after one song\">1⃣", "mt_one": "stop after one song\">1⃣",
@ -325,8 +326,13 @@ if (1)
"mt_c2ng": "your device does not seem to support this output format, but let's try anyways", "mt_c2ng": "your device does not seem to support this output format, but let's try anyways",
"mt_xowa": "there are bugs in iOS preventing background playback using this format; please use caf or mp3 instead", "mt_xowa": "there are bugs in iOS preventing background playback using this format; please use caf or mp3 instead",
"mt_tint": "background level (0-100) on the seekbar$Nto make buffering less distracting", "mt_tint": "background level (0-100) on the seekbar$Nto make buffering less distracting",
"mt_eq": "enables the equalizer and gain control;$N$Nboost &lt;code&gt;0&lt;/code&gt; = standard 100% volume (unmodified)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = standard stereo (unmodified)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% left-right crossfeed$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = vocal removal :^)$N$Nenabling the equalizer makes gapless albums fully gapless, so leave it on with all the values at zero (except width = 1) if you care about that", "mt_eq": "`enables the equalizer and gain control;$N$Nboost `0` = standard 100% volume (unmodified)$N$Nwidth `1 &nbsp;` = standard stereo (unmodified)$Nwidth `0.5` = 50% left-right crossfeed$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = vocal removal :^)$N$Nenabling the equalizer makes gapless albums fully gapless, so leave it on with all the values at zero (except width = 1) if you care about that",
"mt_drc": "enables the dynamic range compressor (volume flattener / brickwaller); will also enable EQ to balance the spaghetti, so set all EQ fields except for 'width' to 0 if you don't want it$N$Nlowers the volume of audio above THRESHOLD dB; for every RATIO dB past THRESHOLD there is 1 dB of output, so default values of tresh -24 and ratio 12 means it should never get louder than -22 dB and it is safe to increase the equalizer boost to 0.8, or even 1.8 with ATK 0 and a huge RLS like 90 (only works in firefox; RLS is max 1 in other browsers)$N$N(see wikipedia, they explain it much better)", "mt_drc": "enables the dynamic range compressor (volume flattener / brickwaller); will also enable EQ to balance the spaghetti, so set all EQ fields except for 'width' to 0 if you don't want it$N$Nlowers the volume of audio above THRESHOLD dB; for every RATIO dB past THRESHOLD there is 1 dB of output, so default values of 'tresh' -24 and 'ratio' 12 means it should never get louder than -22 dB and it is safe to increase the equalizer boost to 0.8, or even 1.8 with ATK 0 and a huge RLS like 90 (only works in firefox; RLS is max 1 in other browsers)$N$N(see wikipedia, they explain it much better)",
"mt_ss": "`enables skip-silence; multiplies playback speed by `ffwd` near the start/end of songs when volume is under `vol` and the playback position is within the first `start`% or the last `end`% of the track",
"mt_ssvt": "volume threshold (0-255)\">vol",
"mt_ssts": "active threshold (% of track, start)\">start",
"mt_sste": "active threshold (% of track, end)\">end",
"mt_sssm": "playback speed multiplier (range: 0.15 to 8)\">ffwd",
"mb_play": "play", "mb_play": "play",
"mm_hashplay": "play this audio file?", "mm_hashplay": "play this audio file?",
@ -405,8 +411,8 @@ if (1)
"fr_case": "case-sensitive regex\">case", "fr_case": "case-sensitive regex\">case",
"fr_win": "windows-safe names; replace <code>&lt;&gt;:&quot;\\|?*</code> with japanese fullwidth characters\">win", "fr_win": "windows-safe names; replace <code>&lt;&gt;:&quot;\\|?*</code> with japanese fullwidth characters\">win",
"fr_slash": "replace <code>/</code> with a character that doesn't cause new folders to be created\">no /", "fr_slash": "replace <code>/</code> with a character that doesn't cause new folders to be created\">no /",
"fr_re": "regex search pattern to apply to original filenames; capturing groups can be referenced in the format field below like &lt;code&gt;(1)&lt;/code&gt; and &lt;code&gt;(2)&lt;/code&gt; and so on", "fr_re": "`regex search pattern to apply to original filenames; capturing groups can be referenced in the format field below like `(1)` and `(2)` and so on",
"fr_fmt": "inspired by foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; is replaced by song title,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; skips [this] part if artist is blank$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; pads tracknumber to 2 digits", "fr_fmt": "`inspired by foobar2000:$N`(title)` is replaced by song title,$N`[(artist) - ](title)` skips [this] part if artist is blank$N`$lpad((tn),2,0)` pads tracknumber to 2 digits",
"fr_pdel": "delete", "fr_pdel": "delete",
"fr_pnew": "save as", "fr_pnew": "save as",
"fr_pname": "provide a name for your new preset", "fr_pname": "provide a name for your new preset",
@ -455,7 +461,7 @@ if (1)
"mk_noname": "type a name into the text field on the left before you do that :p", "mk_noname": "type a name into the text field on the left before you do that :p",
"nmd_i1": "also add the file extension you want, for example <code>.md</code>", "nmd_i1": "also add the file extension you want, for example <code>.md</code>",
"nmd_i2": "you can only create <code>.md</code> files because you don't have the delete-permission", "nmd_i2": "you can only create <code>.{0}</code> files because you don't have the delete-permission",
"tv_load": "Loading text document:\n\n{0}\n\n{1}% ({2} of {3} MiB loaded)", "tv_load": "Loading text document:\n\n{0}\n\n{1}% ({2} of {3} MiB loaded)",
"tv_xe1": "could not load textfile:\n\nerror ", "tv_xe1": "could not load textfile:\n\nerror ",
@ -684,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", "한국어"],
@ -999,7 +1006,7 @@ ebi('op_cfg').innerHTML = (
' </div>\n' + ' </div>\n' +
'</div>\n' + '</div>\n' +
'<div><h3>' + L.cl_keytype + '</h3><div><select id="key_notation"></select></div></div>\n' + '<div><h3>' + L.cl_keytype + '</h3><div><select id="key_notation"></select></div></div>\n' +
(!MOBILE ? '<div><h3>' + L.cl_rcm + '</h3><div><a id="rcm_en" class="tgl btn" href="#" tt="' + L.cdt_ren + '">enable</a><a id="rcm_db" class="tgl btn" href="#" tt="' + L.cdt_rdb + '">double</a></div></div>' : '') + (!MOBILE ? '<div><h3>' + L.cl_rcm + '</h3><div><a id="rcm_en" class="tgl btn" href="#" tt="' + L.cdt_ren + '</a><a id="rcm_db" class="tgl btn" href="#" tt="' + L.cdt_rdb + '</a></div></div>' : '') +
'<div><h3>' + L.cl_hiddenc + ' &nbsp;' + (MOBILE ? '<a href="#" id="hcolsh">' + L.cl_hidec + '</a> / ' : '') + '<a href="#" id="hcolsr">' + L.cl_reset + '</a></h3><div id="hcols"></div></div>' '<div><h3>' + L.cl_hiddenc + ' &nbsp;' + (MOBILE ? '<a href="#" id="hcolsh">' + L.cl_hidec + '</a> / ' : '') + '<a href="#" id="hcolsr">' + L.cl_reset + '</a></h3><div id="hcols"></div></div>'
); );
@ -1147,22 +1154,31 @@ function read_sbw() {
onresize100.add(read_sbw, true); onresize100.add(read_sbw, true);
var have_webp = sread('have_webp'); function check_image_support(format, uri) {
(function () { var cached
if (have_webp !== null) = window['have_' + format]
= sread('have_' + format);
if (cached !== null)
return; return;
var img = new Image(); var img = new Image();
img.onload = function () { img.onload = function () {
have_webp = img.width > 0 && img.height > 0; window['have_' + format] = img.width > 0 && img.height > 0;
swrite('have_webp', 'ya'); swrite('have_' + format, 'ya');
}; };
img.onerror = function () { img.onerror = function () {
have_webp = false; window['have_' + format] = false;
swrite('have_webp', ''); swrite('have_' + format, '');
}; };
img.src = "data:image/webp;base64,UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA=="; img.src = uri;
})(); }
check_image_support('webp', "data:image/webp;base64,UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==");
check_image_support('jxl', "data:image/jxl;base64,/woIAAAMABKIAgC4AF3lEgA=");
var img_re = APPLE ?
/\.(a?png|avif|bmp|gif|hei[cf]s?|jpe?g|jfif|svg|webp|webm|mkv|mp4|m4v|mov)(\?|$)/i :
/\.(a?png|avif|bmp|gif|jpe?g|jfif|svg|webp|webm|mkv|mp4|m4v|mov)(\?|$)/i;
function set_files_html(html) { function set_files_html(html) {
@ -1313,6 +1329,7 @@ var mpl = (function () {
'<div><h3 id="h_drc">' + L.ml_drc + '</h3><div id="audio_drc"></div></div>' + '<div><h3 id="h_drc">' + L.ml_drc + '</h3><div id="audio_drc"></div></div>' +
'<div><h3>' + L.ml_eq + '</h3><div id="audio_eq"></div></div>' + '<div><h3>' + L.ml_eq + '</h3><div id="audio_eq"></div></div>' +
'<div><h3>' + L.ml_ss + '</h3><div id="audio_ss"></div></div>' +
''); '');
var r = { var r = {
@ -1714,6 +1731,7 @@ function MPlayer() {
r.ftimer = null; r.ftimer = null;
r.fade_in = function () { r.fade_in = function () {
r.nopause(); r.nopause();
start_actx();
r.fvol = 0; r.fvol = 0;
r.fdir = 0.025 * r.vol * (CHROME ? 1.5 : 1); r.fdir = 0.025 * r.vol * (CHROME ? 1.5 : 1);
if (r.au) { if (r.au) {
@ -1724,6 +1742,7 @@ function MPlayer() {
} }
}; };
r.fade_out = function () { r.fade_out = function () {
mpss.stop();
r.fvol = r.vol; r.fvol = r.vol;
r.fdir = -0.05 * r.vol * (CHROME ? 2 : 1); r.fdir = -0.05 * r.vol * (CHROME ? 2 : 1);
r.ftid = r.au.tid; r.ftid = r.au.tid;
@ -1750,8 +1769,10 @@ function MPlayer() {
if (isNum(t)) if (isNum(t))
r.au.currentTime = Math.max(t, 0); r.au.currentTime = Math.max(t, 0);
} }
else if (r.fvol > r.vol) else if (r.fvol > r.vol) {
r.fvol = r.vol; r.fvol = r.vol;
mpss.go();
}
else else
done = false; done = false;
@ -2690,11 +2711,14 @@ var afilt = (function () {
var r = { var r = {
"eqen": false, "eqen": false,
"drcen": false, "drcen": false,
"ssen": false,
"bands": [31.25, 62.5, 125, 250, 500, 1000, 2000, 4000, 8000, 16000], "bands": [31.25, 62.5, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],
"gains": [4, 3, 2, 1, 0, 0, 1, 2, 3, 4], "gains": [4, 3, 2, 1, 0, 0, 1, 2, 3, 4],
"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_sssm],
"sscv": [1, 5, 5, 5.0],
"drcn": null, "drcn": null,
"filters": [], "filters": [],
"filterskip": [], "filterskip": [],
@ -2706,7 +2730,10 @@ var afilt = (function () {
}; };
function setvis(vis) { function setvis(vis) {
ebi('audio_eq').parentNode.style.display = ebi('audio_drc').parentNode.style.display = (vis ? '' : 'none'); ebi('audio_eq').parentNode.style.display =
ebi('audio_drc').parentNode.style.display =
ebi('audio_ss').parentNode.style.display =
(vis ? '' : 'none');
} }
setvis(ACtx); setvis(ACtx);
@ -2769,6 +2796,8 @@ var afilt = (function () {
r.gains = gains; r.gains = gains;
r.drcv = jread('au_drcv', r.drcv); r.drcv = jread('au_drcv', r.drcv);
r.sscv = jread('au_sscv', r.sscv);
mpss.load();
} }
catch (ex) { } catch (ex) { }
@ -2786,6 +2815,7 @@ var afilt = (function () {
}; };
r.stop = function () { r.stop = function () {
mpss.stop();
if (r.filters.length) if (r.filters.length)
for (var a = 0; a < r.filters.length; a++) for (var a = 0; a < r.filters.length; a++)
r.filters[a].disconnect(); r.filters[a].disconnect();
@ -2813,10 +2843,12 @@ var afilt = (function () {
bcfg_set('au_eq', r.eqen = false); bcfg_set('au_eq', r.eqen = false);
bcfg_set('au_drc', r.drcen = false); bcfg_set('au_drc', r.drcen = false);
} }
else if (v === true && r.drcen && !r.eqen) else if (v === true && (r.drcen || r.ssen) && !r.eqen)
bcfg_set('au_eq', r.eqen = true); bcfg_set('au_eq', r.eqen = true);
else if (v === false && !r.eqen) else if (v === false && !r.eqen) {
bcfg_set('au_drc', r.drcen = false); bcfg_set('au_drc', r.drcen = false);
bcfg_set('au_ss', r.ssen = false);
}
r.drcn = null; r.drcn = null;
@ -2833,6 +2865,9 @@ var afilt = (function () {
au.id = au.id || Date.now(); au.id = au.id || Date.now();
mp.acs = r.acst[au.id] = r.acst[au.id] || actx.createMediaElementSource(au); mp.acs = r.acst[au.id] = r.acst[au.id] || actx.createMediaElementSource(au);
if (r.ssen)
add_ss();
if (r.eqen) if (r.eqen)
add_eq(); add_eq();
@ -2846,6 +2881,15 @@ var afilt = (function () {
mp.acs.connect(r.filters.length ? mp.acs.connect(r.filters.length ?
r.filters[r.filters.length - 1] : actx.destination); r.filters[r.filters.length - 1] : actx.destination);
if (!au.paused)
mpss.go();
}
function add_ss() {
r.filters.push(afilt.ssg = actx.createGain());
r.filters.push(afilt.ssa = actx.createAnalyser());
afilt.ssa.fftSize = 256;
} }
function add_eq() { function add_eq() {
@ -2998,6 +3042,29 @@ var afilt = (function () {
clmod(this, 'err', err); clmod(this, 'err', err);
} }
function adj_ss() {
var err = false;
try {
var n = this.getAttribute('k'),
ov = r.sscv[n],
vs = this.value,
v = parseFloat(vs);
if (!isNum(v) || v + '' != vs)
throw new Error('inval v');
if (v == ov)
return;
r.sscv[n] = v;
jwrite('au_sscv', r.sscv);
mpss.load();
}
catch (ex) {
err = true;
}
clmod(this, 'err', err);
}
function eq_mod(e) { function eq_mod(e) {
ev(e); ev(e);
adj_band(this, 0); adj_band(this, 0);
@ -3057,6 +3124,19 @@ var afilt = (function () {
html += h2.join('\n') + '</tr><table>'; html += h2.join('\n') + '</tr><table>';
ebi('audio_drc').innerHTML = html; ebi('audio_drc').innerHTML = html;
h2 = [];
html = ['<table><tr><td rowspan="2">',
'<a id="au_ss" class="tgl btn" href="#" tt="' + L.mt_ss + '">' + L.enable + '</a></td>'];
for (var a = 0; a < r.sscl.length; a++) {
html.push('<td tt="' + r.sscl[a] + '</td>');
h2.push('<td><input type="text" class="ssconf_v" ' + NOAC + ' k="' + a + '" value="' + r.sscv[a] + '" /></td>');
}
html = html.join('\n') + '</tr><tr>';
html += h2.join('\n') + '</tr><table>';
ebi('audio_ss').innerHTML = html;
var stp = QSA('a.eq_step'); var stp = QSA('a.eq_step');
for (var a = 0, aa = stp.length; a < aa; a++) for (var a = 0, aa = stp.length; a < aa; a++)
stp[a].onclick = eq_step; stp[a].onclick = eq_step;
@ -3070,8 +3150,13 @@ var afilt = (function () {
for (var a = 0; a < txt.length; a++) for (var a = 0; a < txt.length; a++)
txt[a].oninput = txt[a].onkeydown = adj_drc; txt[a].oninput = txt[a].onkeydown = adj_drc;
txt = QSA('input.ssconf_v');
for (var a = 0; a < txt.length; a++)
txt[a].oninput = txt[a].onkeydown = adj_ss;
bcfg_bind(r, 'eqen', 'au_eq', false, r.apply); bcfg_bind(r, 'eqen', 'au_eq', false, r.apply);
bcfg_bind(r, 'drcen', 'au_drc', false, r.apply); bcfg_bind(r, 'drcen', 'au_drc', false, r.apply);
bcfg_bind(r, 'ssen', 'au_ss', false, r.apply);
r.draw(); r.draw();
return r; return r;
@ -3213,6 +3298,7 @@ function play(tid, is_ev, seek) {
if (mpl.waves) if (mpl.waves)
pbar.loadwaves(url.replace(/\bth=(opus|mp3)&/, '') + '&th=p'); pbar.loadwaves(url.replace(/\bth=(opus|mp3)&/, '') + '&th=p');
mpss.go();
mpui.progress_updater(); mpui.progress_updater();
pbar.onresize(); pbar.onresize();
vbar.onresize(); vbar.onresize();
@ -3758,6 +3844,12 @@ function fmt_ren(re, md, fmt) {
} }
function enre_rw_edit() {
window.re_rw_edit = new RegExp('\.(' + rw_edit.replace(/,/g, '|') + ')$', 'i');
}
enre_rw_edit();
function fs_abrt() { function fs_abrt() {
toast.inf(30, L.fp_abrt); toast.inf(30, L.fp_abrt);
fileman.sn++; fileman.sn++;
@ -4556,6 +4648,12 @@ var fileman = (function () {
r.ccp = true; r.ccp = true;
r.clip = vps.slice(2); r.clip = vps.slice(2);
var prefix = sread("clip_uo") || location.origin;
try {
cliptxt(prefix + r.clip.join('\n' + prefix));
}
catch (ex) {}
try { try {
vps = JSON.stringify(vps); vps = JSON.stringify(vps);
if (vps.length > 1024 * 1024) if (vps.length > 1024 * 1024)
@ -4858,7 +4956,7 @@ var showfile = (function () {
'nrend': 0, 'nrend': 0,
}; };
r.map = { r.map = {
'.ahk': 'autohotkey', '.asm': 'nasm',
'.bas': 'basic', '.bas': 'basic',
'.bat': 'batch', '.bat': 'batch',
'.cxx': 'cpp', '.cxx': 'cpp',
@ -4881,6 +4979,8 @@ var showfile = (function () {
'.rs': 'rust', '.rs': 'rust',
'.sh': 'bash', '.sh': 'bash',
'.service': 'systemd', '.service': 'systemd',
'.socket': 'systemd',
'.timer': 'systemd',
'.txt': 'ans', '.txt': 'ans',
'.vb': 'vbnet', '.vb': 'vbnet',
'.v': 'verilog', '.v': 'verilog',
@ -4889,10 +4989,9 @@ var showfile = (function () {
'.yml': 'yaml' '.yml': 'yaml'
}; };
r.nmap = { r.nmap = {
'cmakelists.txt': 'cmake',
'dockerfile': 'docker' 'dockerfile': 'docker'
}; };
var x = txt_ext + ' ans c cfg conf cpp cs css diff glsl go html ini java js json jsx kt kts latex less lisp lua makefile md nim py r rss rb ruby sass scss sql svg swift tex toml ts vhdl xml yaml zig'; var x = txt_ext + ' ans c cfg conf cpp cs css diff glsl go html ini java js json jsx kt kts latex less lisp lua makefile md nasm nim nix py r rss rb ruby sass scss sql svg swift tex toml ts vhdl xml yaml zig';
x = x.split(/ +/g); x = x.split(/ +/g);
for (var a = 0; a < x.length; a++) for (var a = 0; a < x.length; a++)
if (!r.map["." + x[a]]) if (!r.map["." + x[a]])
@ -4972,7 +5071,7 @@ var showfile = (function () {
} }
r.mktree(); r.mktree();
if (em) { if (em) {
if (r.taildoc) if (r.taildoc || em[2] == '( size of textfile exceeds serverside limit )')
r.show(em[0], true); r.show(em[0], true);
else else
render(em); render(em);
@ -5095,7 +5194,7 @@ var showfile = (function () {
ebi('files').style.display = ebi('gfiles').style.display = ebi('lazy').style.display = ebi('pro').style.display = ebi('epi').style.display = 'none'; ebi('files').style.display = ebi('gfiles').style.display = ebi('lazy').style.display = ebi('pro').style.display = ebi('epi').style.display = 'none';
ebi('dldoc').setAttribute('href', url); ebi('dldoc').setAttribute('href', url);
ebi('editdoc').setAttribute('href', addq(url, 'edit')); ebi('editdoc').setAttribute('href', addq(url, 'edit'));
ebi('editdoc').style.display = (has(perms, 'write') && (is_md || has(perms, 'delete'))) ? '' : 'none'; ebi('editdoc').style.display = (has(perms, 'write') && (re_rw_edit.test(name) || has(perms, 'delete'))) ? '' : 'none';
var wr = ebi('bdoc'), var wr = ebi('bdoc'),
nrend = r.nrend, nrend = r.nrend,
@ -5624,7 +5723,7 @@ var thegrid = (function () {
}; };
function loadgrid() { function loadgrid() {
if (have_webp === null) if (have_webp === null || have_jxl === null)
return setTimeout(loadgrid, 50); return setTimeout(loadgrid, 50);
r.setvis(); r.setvis();
@ -5677,7 +5776,11 @@ var thegrid = (function () {
ihref = ext_th[ext] || ext_th[ext0]; ihref = ext_th[ext] || ext_th[ext0];
} }
else if (r.thumbs) { else if (r.thumbs) {
ihref = addq(ihref, 'th=' + (have_webp ? 'w' : 'j')); ihref = addq(ihref, 'th=' + (
have_jxl ? 'x' :
have_webp ? 'w' :
'j'
));
if (!r.crop) if (!r.crop)
ihref += 'f'; ihref += 'f';
if (r.x3) if (r.x3)
@ -7520,7 +7623,7 @@ var treectl = (function () {
reload_tree(); reload_tree();
reload_browser(); reload_browser();
tree_scrollto(); tree_scrollto();
if (res.acct) { if (res.cfg) {
acct = res.acct; acct = res.acct;
have_up2k_idx = res.idx; have_up2k_idx = res.idx;
have_tags_idx = res.itag; have_tags_idx = res.itag;
@ -7560,9 +7663,10 @@ var treectl = (function () {
qsr('#bbsw'); qsr('#bbsw');
srvinf = ebi('srv_info').innerHTML.slice(6, -7); srvinf = ebi('srv_info').innerHTML.slice(6, -7);
if (ls0 === null) { if (ls0 === null) {
setck('js=y');
r.ls_cb = showfile.addlinks; r.ls_cb = showfile.addlinks;
return r.reqls(get_evpath(), false, undefined, true); return setck('js=y', function () {
r.reqls(get_evpath(), false, undefined, true);
});
} }
ls0.unlist = unlist0; ls0.unlist = unlist0;
ls0.u2ts = u2ts; ls0.u2ts = u2ts;
@ -7908,7 +8012,10 @@ function apply_perms(res) {
if (up2k) if (up2k)
up2k.set_fsearch(); up2k.set_fsearch();
ebi('new_mdi').innerHTML = has(perms, "delete") ? L.nmd_i1 : L.nmd_i2; if (res.cfg)
rw_edit = res.rw_edit;
enre_rw_edit();
ebi('new_mdi').innerHTML = has(perms, "delete") ? L.nmd_i1 : L.nmd_i2.format(rw_edit.replace(/,/g, '/'));
widget.setvis(); widget.setvis();
thegrid.setvis(); thegrid.setvis();
@ -8714,9 +8821,9 @@ var msel = (function () {
tb = QS('#op_new_md input[name="name"]'); tb = QS('#op_new_md input[name="name"]');
form.onsubmit = function (e) { form.onsubmit = function (e) {
if (!has(perms, "delete") && !/\.md$/.test(tb.value)) { if (!has(perms, "delete") && !re_rw_edit.test(tb.value)) {
ev(e); ev(e);
toast.err(10, L.nmd_i2); toast.err(10, L.nmd_i2.format(rw_edit.replace(/,/g, '/')));
return false; return false;
} }
if (tb.value) { if (tb.value) {
@ -9393,7 +9500,7 @@ function wintitle(txt, noname) {
txt += uricom_dec(get_evpath()).slice(1, -1).split('/').pop(); txt += uricom_dec(get_evpath()).slice(1, -1).split('/').pop();
document.title = txt; document.title = txt || "copyparty";
} }
@ -9514,11 +9621,20 @@ var rcm = (function () {
var selFile = jcp(nsFile); var selFile = jcp(nsFile);
function mktemp(is_dir) { function mktemp(is_dir) {
var row = mknod('tr', 'temp', qsr('#rcm_tmp');
'<td>-new-</td>' + if (!thegrid.en) {
'<td colspan="' + (QSA("#files thead th").length - 1) + '"><input id="tempname" class="i" type="text" placeholder="' + (is_dir ? 'Folder' : "File") + ' Name"></td>' var row = mknod('tr', 'rcm_tmp',
); '<td>-new-</td><td colspan="' + (QSA("#files thead th").length - 1) + '"><input id="tempname" class="i" type="text" placeholder="' + (is_dir ? 'Folder' : 'File') + ' Name"></td>');
QS("#files tbody").appendChild(row); QS("#files tbody").appendChild(row);
}
else {
var row = mknod('a', 'rcm_tmp',
'<span class="dir" style="align-self:end"><input id="tempname" class="dir" type="text" placeholder="' + (is_dir ? 'Folder' : 'File') + ' Name"></span>');
if (is_dir)
row.className = 'dir';
row.style.display = 'flex';
QS("#ggrid").appendChild(row);
}
function sendit(name) { function sendit(name) {
name = ('' + name).trim(); name = ('' + name).trim();
@ -9572,7 +9688,7 @@ var rcm = (function () {
break; break;
case 'ply': selFile.type == 'gf' ? thegrid.imshow(selFile.name) : play('f-' + selFile.id); break; case 'ply': selFile.type == 'gf' ? thegrid.imshow(selFile.name) : play('f-' + selFile.id); break;
case 'pla': play('f-' + selFile.id); break; case 'pla': play('f-' + selFile.id); break;
case 'txt': location = selFile.dpath + '?doc=' + selFile.name; break; case 'txt': showfile.show(selFile.name); break;
case 'md': location = selFile.path + (has(selFile.path, '?') ? '&v' : '?v'); break; case 'md': location = selFile.path + (has(selFile.path, '?') ? '&v' : '?v'); break;
case 'cpl': cliptxt(selFile.url, function() {toast.ok(2, L.clipped)}); break; case 'cpl': cliptxt(selFile.url, function() {toast.ok(2, L.clipped)}); break;
case 'dl': ebi('seldl').click(); break; case 'dl': ebi('seldl').click(); break;
@ -9674,7 +9790,7 @@ var rcm = (function () {
} }
ebi('wrap').oncontextmenu = function(e) { ebi('wrap').oncontextmenu = function(e) {
if (!r.enabled || e.shiftKey || (r.double && menu.style.display)) { if (!r.enabled || e.shiftKey || (r.double && menu.style.display) || /doc=/.exec(location.search)) {
r.hide(true); r.hide(true);
return true; return true;
} }
@ -9913,6 +10029,92 @@ function reload_browser() {
dsel_init(); dsel_init();
})(); })();
var mpss = (function() {
var r = {}, config, ssint, npaint = 0;
r.load = function () {
if (!afilt.ssg)
return false;
config = {
vthresh: afilt.sscv[0],
sthresh: afilt.sscv[1],
etresh: afilt.sscv[2],
sspeed: clamp(afilt.sscv[3], 0.15, 8.0),
rspeed: 0.2,
loopInterval: 25,
};
return true;
};
r.go = function () {
if (!ssint && afilt.ssen && r.load())
ssint = setInterval(detectSilence, config.loopInterval);
};
r.stop = function () {
clearInterval(ssint);
ssint = null;
if (!mp) return;
if (afilt.ssg) afilt.ssg.gain.value = 1.0;
if (mp.au && mp.au._ss) mp.au.playbackRate = 1.0;
if (mp.au2 && mp.au2._ss) mp.au2.playbackRate = 1.0;
};
function detectSilence() {
var ae = mp.au;
ae._ss = true;
var gain = afilt.ssg.gain;
var duration = ae.duration || 0;
var slimit = duration * (config.sthresh / 100);
var elimit = duration * (1 - (config.etresh / 100));
var in_limits = ae.currentTime < slimit || ae.currentTime > elimit;
var tspeed = 1.0;
var tvol = 1.0;
var is_silent = false;
if (in_limits) {
var analyser = afilt.ssa;
var da = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(da);
var maxvol = 0;
for (var i = 0; i < da.length; i++) {
if (da[i] > maxvol) maxvol = da[i];
}
if (++npaint > 4) {
npaint = 0;
ebi('au_ss').innerHTML = maxvol;
}
if (maxvol < config.vthresh) {
tspeed = config.sspeed;
tvol = 0.0;
is_silent = true;
}
}
if (is_silent) {
if (Math.abs(ae.playbackRate - tspeed) > 0.01) {
ae.playbackRate += (tspeed - ae.playbackRate) * config.rspeed;
}
if (Math.abs(gain.value - tvol) > 0.01) {
gain.value += (tvol - gain.value) * config.rspeed;
}
} else {
ae.playbackRate = 1.0;
gain.value = 1.0;
}
}
return r;
})();
treectl.hydrate(); treectl.hydrate();
J_BRW = 2; J_BRW = 2;

View file

@ -0,0 +1,18 @@
this folder *mostly* contains third-party dependencies; run `make -C scripts/deps-docker` to build the following files and have them appear here:
* `easymde.css.gz` and `easymde.js.gz` is the fancy markdown editor, [EasyMDE](https://github.com/Ionaru/easy-markdown-editor)
* `marked.js.gz` is the markdown rendering library [Marked](https://github.com/markedjs/marked)
* `mini-fa.css.gz` and `mini-fa.woff` is a small subset of [fontawesome](https://github.com/FortAwesome/Font-Awesome)
* `prism.css.gz` and `prism.js.gz` is the syntax highlighter [PrismJS](https://prismjs.com/)
* `scp.woff2` is a subset of the monospace font [Source Code Pro](https://github.com/adobe-fonts/source-code-pro)
* `sha512.hw.js.gz` is the Wasm sha512 library [hash-wasm](https://github.com/Daninet/hash-wasm)
additionally, the following files are vendored into the copyparty git repository, but do NOT originate from the copyparty project (as mentioned in `--license`):
* `sha512.ac.js.gz` is a compiled and slightly golfed/modified [asmcrypto.js](https://github.com/asmcrypto/asmcrypto.js), © 2013 Artem S Vybornov (MIT-Licensed)
* vendored because it no longer builds with modern versions of NodeJS/npm
* is only loaded by *really old* webbrowsers (ie11, firefox 51, chrome 56)
finally, there is also the following files which *does* originate from the copyparty project, yet appear here for technical reasons:
* `busy.mp3.gz` is a short mp3-file to make iphones stop glitching out

Binary file not shown.

Binary file not shown.

View file

@ -1,8 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"> <feed xmlns="http://www.w3.org/2005/Atom">
<link rel="search"
href="{{ opds_osd | e }}"
type="application/opensearchdescription+xml"/>
{%- for d in dirs %} {%- for d in dirs %}
<entry> <entry>
<title>{{ d.name }}</title> <title>{{ d.name | e }}</title>
<link rel="subsection" <link rel="subsection"
href="{{ d.href | e }}" href="{{ d.href | e }}"
type="application/atom+xml;profile=opds-catalog"/> type="application/atom+xml;profile=opds-catalog"/>
@ -11,7 +14,7 @@
{%- endfor %} {%- endfor %}
{%- for f in files %} {%- for f in files %}
<entry> <entry>
<title>{{ f.name }}</title> <title>{{ f.name | e }}</title>
<updated>{{ f.iso8601 }}</updated> <updated>{{ f.iso8601 }}</updated>
<link rel="http://opds-spec.org/acquisition" <link rel="http://opds-spec.org/acquisition"
href="{{ f.href | e }}" href="{{ f.href | e }}"
@ -28,4 +31,4 @@
{%- endif %} {%- endif %}
</entry> </entry>
{%- endfor %} {%- endfor %}
</feed> </feed>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>{{ longname | truncate(16) | e }}</ShortName>
<Description>{{ longname | e }}</Description>
<Url type="application/atom+xml;profile=opds-catalog" template="{{ search_url }}?opds&amp;q={searchTerms}"/>
</OpenSearchDescription>

View file

@ -6,7 +6,7 @@
<title>{{ s_doctitle }}</title> <title>{{ s_doctitle }}</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=0.8"> <meta name="viewport" content="width=device-width, initial-scale=0.8">
<meta name="robots" content="noindex, nofollow"> <meta name="robots" content="noindex, nofollow">
<meta name="theme-color" content="#{{ tcolor }}"> <meta name="theme-color" content="#{{ tcolor }}">
<link rel="stylesheet" media="screen" href="{{ r }}/.cpr/rups.css?_={{ ts }}"> <link rel="stylesheet" media="screen" href="{{ r }}/.cpr/rups.css?_={{ ts }}">
<link rel="stylesheet" media="screen" href="{{ r }}/.cpr/ui.css?_={{ ts }}"> <link rel="stylesheet" media="screen" href="{{ r }}/.cpr/ui.css?_={{ ts }}">

View file

@ -6,7 +6,7 @@
<title>{{ s_doctitle }}</title> <title>{{ s_doctitle }}</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=0.8"> <meta name="viewport" content="width=device-width, initial-scale=0.8">
<meta name="robots" content="noindex, nofollow"> <meta name="robots" content="noindex, nofollow">
<meta name="theme-color" content="#{{ tcolor }}"> <meta name="theme-color" content="#{{ tcolor }}">
<link rel="stylesheet" media="screen" href="{{ r }}/.cpr/shares.css?_={{ ts }}"> <link rel="stylesheet" media="screen" href="{{ r }}/.cpr/shares.css?_={{ ts }}">
<link rel="stylesheet" media="screen" href="{{ r }}/.cpr/ui.css?_={{ ts }}"> <link rel="stylesheet" media="screen" href="{{ r }}/.cpr/ui.css?_={{ ts }}">
@ -19,7 +19,7 @@
<a id="xpnd" href="#">files</a> <a id="xpnd" href="#">files</a>
<a href="{{ r }}/?h">control-panel</a> <a href="{{ r }}/?h">control-panel</a>
<span>axs = perms (read,write,move,delet)</span> <span>axs = perms (read,write,get)</span>
<span>nf = numFiles (0=dir)</span> <span>nf = numFiles (0=dir)</span>
<span>min/hrs = time left</span> <span>min/hrs = time left</span>
@ -40,8 +40,8 @@
{%- for k, pw, vp, pr, st, un, t0, t1 in rows %} {%- for k, pw, vp, pr, st, un, t0, t1 in rows %}
<tr> <tr>
<td> <td>
<a href="{{ site }}{{ shr }}{{ k }}?qr">qr</a> <a href="{{ site }}{{ shr }}{{ k }}/?qr">qr</a>
<a href="{{ r }}{{ shr }}{{ k }}">{{ k }}</a> <a href="{{ r }}{{ shr }}{{ k }}/">{{ k }}</a>
</td> </td>
<td><a href="#" k="{{ k }}">delete</a></td> <td><a href="#" k="{{ k }}">delete</a></td>
<td>{{ "yes" if pw else "--" }}</td> <td>{{ "yes" if pw else "--" }}</td>

View file

@ -16,7 +16,7 @@ function rm() {
} }
function bump() { function bump() {
var k = this.closest('tr').getElementsByTagName('a')[2].getAttribute('k'), var k = this.closest('tr').querySelector('a[k]').getAttribute('k'),
u = SR + '/?skey=' + uricom_enc(k) + '&eshare=' + this.value, u = SR + '/?skey=' + uricom_enc(k) + '&eshare=' + this.value,
xhr = new XHR(); xhr = new XHR();
@ -63,7 +63,17 @@ function showqr(href) {
var buf = []; var buf = [];
for (var a = 0; a < tr.length; a++) { for (var a = 0; a < tr.length; a++) {
tr[a].cells[0].getElementsByTagName('a')[0].onclick = qr; var td = tr[a].cells[0],
sa = td.getElementsByTagName('a'),
h0 = sa[0].href,
h1 = sa[1].href;
sa[0].onclick = qr;
if (!h0.startsWith(h1)) {
var a2 = mknod('a', '', sa[1].innerHTML);
a2.href = h0.slice(0, -3);
sa[1].innerHTML = 'LAN';
td.appendChild(a2);
}
for (var b = 7; b < 9; b++) for (var b = 7; b < 9; b++)
buf.push(parseInt(tr[a].cells[b].innerHTML)); buf.push(parseInt(tr[a].cells[b].innerHTML));
} }

View file

@ -114,7 +114,7 @@ Ls.chi = {
"login": "登录", //m "login": "登录", //m
"access": " 访问", "access": " 访问",
"ot_close": "关闭子菜单", "ot_close": "关闭子菜单",
"ot_search": "按属性、路径/名称、音乐标签或上述内容的任意组合搜索文件$N$N&lt;code&gt;foo bar&lt;/code&gt; = 必须包含 «foo» 和 «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = 包含 «foo» 而不包含 «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = 以 «yama» 为开头的 «opus» 文件$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = 正好包含 «try unite»$N$N时间格式为 iso-8601, 比如:$N&lt;code&gt;2009-12-31&lt;/code&gt; or &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`按属性、路径/名称、音乐标签或上述内容的任意组合搜索文件$N$N`foo bar` = 必须包含 «foo» 和 «bar»,$N`foo -bar` = 包含 «foo» 而不包含 «bar»,$N`^yana .opus$` = 以 «yama» 为开头的 «opus» 文件$N`&quot;try unite&quot;` = 正好包含 «try unite»$N$N时间格式为 iso-8601, 比如:$N`2009-12-31` or `2020-09-12 23:30:00`",
"ot_unpost": "取消发布:删除最近上传的内容,或中止未完成的内容", "ot_unpost": "取消发布:删除最近上传的内容,或中止未完成的内容",
"ot_bup": "bup基础上传器甚至支持 Netscape 4.0", "ot_bup": "bup基础上传器甚至支持 Netscape 4.0",
"ot_mkdir": "mkdir创建新目录", "ot_mkdir": "mkdir创建新目录",
@ -263,9 +263,9 @@ Ls.chi = {
"cdt_lim": "文件夹中显示的最大文件数", "cdt_lim": "文件夹中显示的最大文件数",
"cdt_ask": "滚动到底部时,$N不会加载更多文件$N而是询问你该怎么做", "cdt_ask": "滚动到底部时,$N不会加载更多文件$N而是询问你该怎么做",
"cdt_hsort": "包含在媒体 URL 中的排序规则 (&lt;code&gt;,sorthref&lt;/code&gt;) 数量。将其设置为 0 时,点击媒体链接时也会忽略排序规则。", //m "cdt_hsort": "`包含在媒体 URL 中的排序规则 (`,sorthref`) 数量。将其设置为 0 时,点击媒体链接时也会忽略排序规则。", //m
"cdt_ren": "启用自定义右键菜单,按住 shift 键并右键单击仍可访问常规菜单", //m "cdt_ren": "启用自定义右键菜单,按住 shift 键并右键单击仍可访问常规菜单\">启用", //m
"cdt_rdb": "当自定义右键菜单已打开并再次右键点击时显示常规右键菜单", //m "cdt_rdb": "当自定义右键菜单已打开并再次右键点击时显示常规右键菜单\">x2", //m
"tt_entree": "显示导航面板(目录树侧边栏)$N快捷键: B", "tt_entree": "显示导航面板(目录树侧边栏)$N快捷键: B",
"tt_detree": "显示面包屑导航$N快捷键: B", "tt_detree": "显示面包屑导航$N快捷键: B",
@ -283,6 +283,7 @@ Ls.chi = {
"ml_tint": "透明度", "ml_tint": "透明度",
"ml_eq": "音频均衡器", "ml_eq": "音频均衡器",
"ml_drc": "动态范围压缩器", "ml_drc": "动态范围压缩器",
"ml_ss": "跳过静音", //m
"mt_loop": "循环播放当前的歌曲\">🔁", //m "mt_loop": "循环播放当前的歌曲\">🔁", //m
"mt_one": "只播放一首歌后停止\">1⃣", //m "mt_one": "只播放一首歌后停止\">1⃣", //m
@ -318,8 +319,13 @@ Ls.chi = {
"mt_c2ng": "您的设备似乎不支持此输出格式,不过我们还是试试看吧。", //m "mt_c2ng": "您的设备似乎不支持此输出格式,不过我们还是试试看吧。", //m
"mt_xowa": "iOS 系统仍存在无法后台播放 owa 音乐的错误,请改用 caf 或 mp3 格式。", //m "mt_xowa": "iOS 系统仍存在无法后台播放 owa 音乐的错误,请改用 caf 或 mp3 格式。", //m
"mt_tint": "在进度条上设置背景级别0-100", "mt_tint": "在进度条上设置背景级别0-100",
"mt_eq": "启用均衡器和增益控制;$N$Nboost &lt;code&gt;0&lt;/code&gt; = 标准 100% 音量(默认)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = 标准立体声(默认)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% 左右交叉反馈$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = 单声道$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = 人声移除 )$N$N启用均衡器使无缝专辑完全无缝所以如果你在乎这一点请保持启用所有值设为零除了宽度 = 1", "mt_eq": "`启用均衡器和增益控制;$N$Nboost `0` = 标准 100% 音量(默认)$N$Nwidth `1 &nbsp;` = 标准立体声(默认)$Nwidth `0.5` = 50% 左右交叉反馈$Nwidth `0 &nbsp;` = 单声道$N$Nboost `-0.8` &amp; width `10` = 人声移除 )$N$N启用均衡器使无缝专辑完全无缝所以如果你在乎这一点请保持启用所有值设为零除了宽度 = 1",
"mt_drc": "启用动态范围压缩器(音量平滑器 / 限幅器);还会启用均衡器以平衡音频,因此如果你不想要它,请将均衡器字段除了 '宽度' 外的所有字段设置为 0$N$N降低 THRESHOLD dB 以上的音频的音量;每超过 THRESHOLD dB 的 RATIO 会有 1 dB 输出,所以默认值 tresh -24 和 ratio 12 意味着它的音量不应超过 -22 dB可以安全地将均衡器增益提高到 0.8,甚至在 ATK 0 和 RLS 如 90 的情况下提高到 1.8(仅在 Firefox 中有效;其他浏览器中 RLS 最大为 1$N$N见维基百科他们解释得更好", "mt_drc": "启用动态范围压缩器(音量平滑器 / 限幅器);还会启用均衡器以平衡音频,因此如果你不想要它,请将均衡器字段除了 '宽度' 外的所有字段设置为 0$N$N降低 THRESHOLD dB 以上的音频的音量;每超过 THRESHOLD dB 的 RATIO 会有 1 dB 输出,所以默认值 tresh -24 和 ratio 12 意味着它的音量不应超过 -22 dB可以安全地将均衡器增益提高到 0.8,甚至在 ATK 0 和 RLS 如 90 的情况下提高到 1.8(仅在 Firefox 中有效;其他浏览器中 RLS 最大为 1$N$N见维基百科他们解释得更好",
"mt_ss": "`启用跳过静音;当音量低于 `音量`,且播放位置在曲目前 `开始`% 或后 `结束`% 时,在接近歌曲开始/结束处将播放速度乘以 `快进`", //m
"mt_ssvt": "音量阈值 (0-255)\">音量", //m
"mt_ssts": "活动阈值 (曲目百分比,开始)\">开始", //m
"mt_sste": "活动阈值 (曲目百分比,结束)\">结束", //m
"mt_sssm": "播放速度倍率\">快进", //m
"mb_play": "播放", "mb_play": "播放",
"mm_hashplay": "播放这个音频文件?", "mm_hashplay": "播放这个音频文件?",
@ -398,8 +404,8 @@ Ls.chi = {
"fr_case": "区分大小写的正则表达式\">case", "fr_case": "区分大小写的正则表达式\">case",
"fr_win": "Windows 安全名称;将 <code>&lt;&gt;:&quot;\\|?*</code> 替换为日文全角字符\">win", "fr_win": "Windows 安全名称;将 <code>&lt;&gt;:&quot;\\|?*</code> 替换为日文全角字符\">win",
"fr_slash": "将 <code>/</code> 替换为不会导致新文件夹创建的字符\">不使用 /", "fr_slash": "将 <code>/</code> 替换为不会导致新文件夹创建的字符\">不使用 /",
"fr_re": "正则表达式搜索模式应用于原始文件名;$N可以在下面的格式字段中引用捕获组&lt;code&gt;(1)&lt;/code&gt;和&lt;code&gt;(2)&lt;/code&gt;等等。", "fr_re": "`正则表达式搜索模式应用于原始文件名;$N可以在下面的格式字段中引用捕获组`(1)`和`(2)`等等。",
"fr_fmt": "受到 foobar2000 的启发:$N&lt;code&gt;(title)&lt;/code&gt; 被歌曲名称替换,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; 仅当歌曲艺术家不为空时才包含&lt;code&gt;[此]&lt;/code&gt;部分$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; 将曲目编号填充为 2 位数字", "fr_fmt": "`受到 foobar2000 的启发:$N`(title)` 被歌曲名称替换,$N`[(artist) - ](title)` 仅当歌曲艺术家不为空时才包含`[此]`部分$N`$lpad((tn),2,0)` 将曲目编号填充为 2 位数字",
"fr_pdel": "删除", "fr_pdel": "删除",
"fr_pnew": "另存为", "fr_pnew": "另存为",
"fr_pname": "为你的新预设提供一个名称", "fr_pname": "为你的新预设提供一个名称",
@ -448,7 +454,7 @@ Ls.chi = {
"mk_noname": "在左侧文本框中输入名称,然后再执行此操作 :p", "mk_noname": "在左侧文本框中输入名称,然后再执行此操作 :p",
"nmd_i1": "还可以添加需要的文件扩展名,例如 <code>.md</code>", //m "nmd_i1": "还可以添加需要的文件扩展名,例如 <code>.md</code>", //m
"nmd_i2": "由于没有删除权限,你只能创建 <code>.md</code> 文件", //m "nmd_i2": "由于没有删除权限,你只能创建 <code>.{0}</code> 文件", //m
"tv_load": "加载文本文件:\n\n{0}\n\n{1}% ({2} 的 {3} MiB 已加载)", "tv_load": "加载文本文件:\n\n{0}\n\n{1}% ({2} 的 {3} MiB 已加载)",
"tv_xe1": "无法加载文本文件:\n\n错误 ", "tv_xe1": "无法加载文本文件:\n\n错误 ",

View file

@ -118,7 +118,7 @@ Ls.cze = {
"login": "Přihlásit se", //m "login": "Přihlásit se", //m
"access": " přístup", "access": " přístup",
"ot_close": "zavřít podnabídku", "ot_close": "zavřít podnabídku",
"ot_search": "hledat soubory podle atributů, cesty / názvu, hudebních tagů nebo jejich kombinace$N$N&lt;code&gt;foo bar&lt;/code&gt; = musí obsahovat jak «foo» tak «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = musí obsahovat «foo» ale ne «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = začíná na «yana» a je to «opus» soubor$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = obsahuje přesně «try unite»$N$Nformát data je iso-8601, jako$N&lt;code&gt;2009-12-31&lt;/code&gt; nebo &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`hledat soubory podle atributů, cesty / názvu, hudebních tagů nebo jejich kombinace$N$N`foo bar` = musí obsahovat jak «foo» tak «bar»,$N`foo -bar` = musí obsahovat «foo» ale ne «bar»,$N`^yana .opus$` = začíná na «yana» a je to «opus» soubor$N`&quot;try unite&quot;` = obsahuje přesně «try unite»$N$Nformát data je iso-8601, jako$N`2009-12-31` nebo `2020-09-12 23:30:00`",
"ot_unpost": "unpost: smazat vaše nedávné nahrání nebo zrušit nedokončené", "ot_unpost": "unpost: smazat vaše nedávné nahrání nebo zrušit nedokončené",
"ot_bup": "bup: základní nahrávač, podporuje i netscape 4.0", "ot_bup": "bup: základní nahrávač, podporuje i netscape 4.0",
"ot_mkdir": "mkdir: vytvořit nový adresář", "ot_mkdir": "mkdir: vytvořit nový adresář",
@ -267,9 +267,9 @@ Ls.cze = {
"cdt_lim": "maximální počet souborů k zobrazení ve složce", "cdt_lim": "maximální počet souborů k zobrazení ve složce",
"cdt_ask": "při posunování na konec,$Nmísto načítání více souborů,$N se zeptat co dělat", "cdt_ask": "při posunování na konec,$Nmísto načítání více souborů,$N se zeptat co dělat",
"cdt_hsort": "kolik pravidel řazení (&lt;code&gt;,sorthref&lt;/code&gt;) zahrnout do media-URL. Nastavení na 0 bude také ignorovat pravidla řazení zahrnutá v media odkazech při kliknutí na ně", "cdt_hsort": "`kolik pravidel řazení (`,sorthref`) zahrnout do media-URL. Nastavení na 0 bude také ignorovat pravidla řazení zahrnutá v media odkazech při kliknutí na ně",
"cdt_ren": "povolit vlastní kontextovou nabídku, běžnou nabídku lze otevřít podržením klávesy shift a kliknutím pravým tlačítkem", //m "cdt_ren": "povolit vlastní kontextovou nabídku, běžnou nabídku lze otevřít podržením klávesy shift a kliknutím pravým tlačítkem\">povolit", //m
"cdt_rdb": "zobrazit běžné menu pravého tlačítka, když je vlastní již otevřené a znovu se klikne pravým", //m "cdt_rdb": "zobrazit běžné menu pravého tlačítka, když je vlastní již otevřené a znovu se klikne pravým\">x2", //m
"tt_entree": "zobrazit navigační panel (postranní strom adresářů)$NKlávesová zkratka: B", "tt_entree": "zobrazit navigační panel (postranní strom adresářů)$NKlávesová zkratka: B",
"tt_detree": "zobrazit drobečkovou navigaci$NKlávesová zkratka: B", "tt_detree": "zobrazit drobečkovou navigaci$NKlávesová zkratka: B",
@ -287,6 +287,7 @@ Ls.cze = {
"ml_tint": "odstín", "ml_tint": "odstín",
"ml_eq": "audio ekvalizér", "ml_eq": "audio ekvalizér",
"ml_drc": "kompresor dynamického rozsahu", "ml_drc": "kompresor dynamického rozsahu",
"ml_ss": "přeskočit ticho", //m
"mt_loop": "smyčka/opakovat jednu skladbu\">🔁", "mt_loop": "smyčka/opakovat jednu skladbu\">🔁",
"mt_one": "zastavit po jedné skladbě\">1⃣", "mt_one": "zastavit po jedné skladbě\">1⃣",
@ -322,8 +323,13 @@ Ls.cze = {
"mt_c2ng": "vaše zařízení, zdá se, nepodporuje tento výstupní formát, ale zkusíme to", "mt_c2ng": "vaše zařízení, zdá se, nepodporuje tento výstupní formát, ale zkusíme to",
"mt_xowa": "v iOS jsou chyby bránící přehrávání na pozadí s tímto formátem; použijte prosím caf nebo mp3", "mt_xowa": "v iOS jsou chyby bránící přehrávání na pozadí s tímto formátem; použijte prosím caf nebo mp3",
"mt_tint": "úroveň pozadí (0-100) na posuvníku$Nabyste učinili ukládání do vyrovnávací paměti méně rušivým", "mt_tint": "úroveň pozadí (0-100) na posuvníku$Nabyste učinili ukládání do vyrovnávací paměti méně rušivým",
"mt_eq": "povoluje ekvalizér a ovládání zisku;$N$Nboost &lt;code&gt;0&lt;/code&gt; = standardní 100% hlasitost (nezměněno)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = standardní stereo (nezměněno)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% levý-pravý crossfeed$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = odstranění vokálů :^)$N$Npovolení ekvalizéru činí alba bez mezer zcela bez mezer, takže to nechte zapnuté se všemi hodnotami na nule (kromě width = 1), pokud vám na tom záleží", "mt_eq": "`povoluje ekvalizér a ovládání zisku;$N$Nboost `0` = standardní 100% hlasitost (nezměněno)$N$Nwidth `1 &nbsp;` = standardní stereo (nezměněno)$Nwidth `0.5` = 50% levý-pravý crossfeed$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = odstranění vokálů :^)$N$Npovolení ekvalizéru činí alba bez mezer zcela bez mezer, takže to nechte zapnuté se všemi hodnotami na nule (kromě width = 1), pokud vám na tom záleží",
"mt_drc": "povoluje kompresor dynamického rozsahu (vyrovnávač hlasitosti / brickwaller); také povolí EQ pro vyvážení špaget, takže nastavte všechna EQ pole kromě 'width' na 0, pokud to nechcete$N$Nsnižuje hlasitost zvuku nad THRESHOLD dB; pro každý RATIO dB za THRESHOLD je 1 dB výstupu, takže výchozí hodnoty tresh -24 a ratio 12 znamenají, že by nikdy nemělo být hlasitější než -22 dB a je bezpečné zvýšit boost ekvalizéru na 0.8, nebo dokonce 1.8 s ATK 0 a obrovským RLS jako 90 (funguje pouze ve firefoxu; RLS je max 1 v jiných prohlížečích)$N$N(viz wikipedia, vysvětlují to mnohem lépe)", "mt_drc": "povoluje kompresor dynamického rozsahu (vyrovnávač hlasitosti / brickwaller); také povolí EQ pro vyvážení špaget, takže nastavte všechna EQ pole kromě 'width' na 0, pokud to nechcete$N$Nsnižuje hlasitost zvuku nad THRESHOLD dB; pro každý RATIO dB za THRESHOLD je 1 dB výstupu, takže výchozí hodnoty tresh -24 a ratio 12 znamenají, že by nikdy nemělo být hlasitější než -22 dB a je bezpečné zvýšit boost ekvalizéru na 0.8, nebo dokonce 1.8 s ATK 0 a obrovským RLS jako 90 (funguje pouze ve firefoxu; RLS je max 1 v jiných prohlížečích)$N$N(viz wikipedia, vysvětlují to mnohem lépe)",
"mt_ss": "`povolí přeskočení ticha; násobí rychlost přehrávání `rych` u začátku/konce skladeb, když je hlasitost pod `hl` a pozice je v prvních `zač`% nebo posledních `kon`%", //m
"mt_ssvt": "prahová hlasitost (0-255)\">hl", //m
"mt_ssts": "aktivní práh (% stopy, začátek)\">zač", //m
"mt_sste": "aktivní práh (% stopy, konec)\">kon", //m
"mt_sssm": "násobič rychlosti přehrávání\">rych", //m
"mb_play": "přehrát", "mb_play": "přehrát",
"mm_hashplay": "přehrát tento audio soubor?", "mm_hashplay": "přehrát tento audio soubor?",
@ -402,8 +408,8 @@ Ls.cze = {
"fr_case": "regex citlivý na velikost písmen\">velikost", "fr_case": "regex citlivý na velikost písmen\">velikost",
"fr_win": "názvy bezpečné pro windows; nahradit <code>&lt;&gt;:&quot;\\|?*</code> japonskými plnošířkovými znaky\">win", "fr_win": "názvy bezpečné pro windows; nahradit <code>&lt;&gt;:&quot;\\|?*</code> japonskými plnošířkovými znaky\">win",
"fr_slash": "nahradit <code>/</code> znakem který nezpůsobí vytvoření nových složek\">žádné /", "fr_slash": "nahradit <code>/</code> znakem který nezpůsobí vytvoření nových složek\">žádné /",
"fr_re": "vzor regex hledání k aplikaci na původní názvy souborů; zachycené skupiny mohou být odkazovány v poli formátu níže jako &lt;code&gt;(1)&lt;/code&gt; a &lt;code&gt;(2)&lt;/code&gt; atd.", "fr_re": "`vzor regex hledání k aplikaci na původní názvy souborů; zachycené skupiny mohou být odkazovány v poli formátu níže jako `(1)` a `(2)` atd.",
"fr_fmt": "inspirováno foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; je nahrazeno názvem skladby,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; přeskočí [tuto] část pokud je umělec prázdný$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; doplní číslo stopy na 2 číslice", "fr_fmt": "`inspirováno foobar2000:$N`(title)` je nahrazeno názvem skladby,$N`[(artist) - ](title)` přeskočí [tuto] část pokud je umělec prázdný$N`$lpad((tn),2,0)` doplní číslo stopy na 2 číslice",
"fr_pdel": "smazat", "fr_pdel": "smazat",
"fr_pnew": "uložit jako", "fr_pnew": "uložit jako",
"fr_pname": "zadejte název pro vaše nové přednastavení", "fr_pname": "zadejte název pro vaše nové přednastavení",
@ -452,7 +458,7 @@ Ls.cze = {
"mk_noname": "napište název do textového pole vlevo předtím než to uděláte :p", "mk_noname": "napište název do textového pole vlevo předtím než to uděláte :p",
"nmd_i1": "můžeš také přidat příponu souboru, například <code>.md</code>", //m "nmd_i1": "můžeš také přidat příponu souboru, například <code>.md</code>", //m
"nmd_i2": "můžeš vytvářet pouze <code>.md</code> soubory, protože nemáš oprávnění mazat", //m "nmd_i2": "můžeš vytvářet pouze <code>.{0}</code> soubory, protože nemáš oprávnění mazat", //m
"tv_load": "Načítání textového dokumentu:\n\n{0}\n\n{1}% ({2} z {3} MiB načteno)", "tv_load": "Načítání textového dokumentu:\n\n{0}\n\n{1}% ({2} z {3} MiB načteno)",
"tv_xe1": "nelze načíst textový soubor:\n\nchyba ", "tv_xe1": "nelze načíst textový soubor:\n\nchyba ",

View file

@ -114,7 +114,7 @@ Ls.deu = {
"login": "Anmelden", "login": "Anmelden",
"access": " Zugriff", "access": " Zugriff",
"ot_close": "Submenu schliessen", "ot_close": "Submenu schliessen",
"ot_search": "Dateien nach Attributen, Pfad/Name, Musiktags oder beliebiger Kombination suchen$N$N&lt;code&gt;foo bar&lt;/code&gt; = muss «foo» und «bar» enthalten,$N&lt;code&gt;foo -bar&lt;/code&gt; = muss «foo» aber nicht «bar» enthalten,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = beginnt mit «yana» und ist «opus»-Datei$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = genau «try unite» enthalten$N$NDatumsformat ist iso-8601, z.B.$N&lt;code&gt;2009-12-31&lt;/code&gt; oder &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`Dateien nach Attributen, Pfad/Name, Musiktags oder beliebiger Kombination suchen$N$N`foo bar` = muss «foo» und «bar» enthalten,$N`foo -bar` = muss «foo» aber nicht «bar» enthalten,$N`^yana .opus$` = beginnt mit «yana» und ist «opus»-Datei$N`&quot;try unite&quot;` = genau «try unite» enthalten$N$NDatumsformat ist iso-8601, z.B.$N`2009-12-31` oder `2020-09-12 23:30:00`",
"ot_unpost": "unpost: lösche deine letzten Uploads oder breche unvollständige ab", "ot_unpost": "unpost: lösche deine letzten Uploads oder breche unvollständige ab",
"ot_bup": "bup: Basic Uploader, unterstützt sogar Neuheiten wie Netscape 4.0", "ot_bup": "bup: Basic Uploader, unterstützt sogar Neuheiten wie Netscape 4.0",
"ot_mkdir": "mkdir: neuen Ordner erstellen", "ot_mkdir": "mkdir: neuen Ordner erstellen",
@ -263,9 +263,9 @@ Ls.deu = {
"cdt_lim": "max. Anz. Dateien, die in einem Ordner gezeigt werden sollen", "cdt_lim": "max. Anz. Dateien, die in einem Ordner gezeigt werden sollen",
"cdt_ask": "beim Runterscrollen nach $NAktion fragen statt mehr,$NDateien zu laden", "cdt_ask": "beim Runterscrollen nach $NAktion fragen statt mehr,$NDateien zu laden",
"cdt_hsort": "Menge an Sortierregeln (&lt;code&gt;,sorthref&lt;/code&gt;) in Media-URLs enthalten sein sollen. Ein Wert von 0 sorgt dafür, dass Sortierregeln in Media-URLs ignoriert werden", "cdt_hsort": "`Menge an Sortierregeln (`,sorthref`) in Media-URLs enthalten sein sollen. Ein Wert von 0 sorgt dafür, dass Sortierregeln in Media-URLs ignoriert werden",
"cdt_ren": "spezielles Rechtsklick-Menü aktivieren, das Browser-Menü ist weiterhin mit Shift + Rechtsklick erreichbar", "cdt_ren": "spezielles Rechtsklick-Menü aktivieren, das Browser-Menü ist weiterhin mit Shift + Rechtsklick erreichbar\">aktivieren",
"cdt_rdb": "normales Rechtsklick-Menü anzeigen, wenn das benutzerdefinierte bereits offen ist und erneut rechts geklickt wird", //m "cdt_rdb": "normales Rechtsklick-Menü anzeigen, wenn das benutzerdefinierte bereits offen ist und erneut rechts geklickt wird\">x2", //m
"tt_entree": "Navpane anzeigen (Ordnerbaum Sidebar)$NHotkey: B", "tt_entree": "Navpane anzeigen (Ordnerbaum Sidebar)$NHotkey: B",
"tt_detree": "Breadcrumbs anzeigen$NHotkey: B", "tt_detree": "Breadcrumbs anzeigen$NHotkey: B",
@ -283,6 +283,7 @@ Ls.deu = {
"ml_tint": "färben", "ml_tint": "färben",
"ml_eq": "Audio Equalizer", "ml_eq": "Audio Equalizer",
"ml_drc": "Dynamic Range Compressor", "ml_drc": "Dynamic Range Compressor",
"ml_ss": "Stille Überspringen", //m
"mt_loop": "Song wiederholen\">🔁", "mt_loop": "Song wiederholen\">🔁",
"mt_one": "Wiedergabe nach diesem Song beenden\">1⃣", "mt_one": "Wiedergabe nach diesem Song beenden\">1⃣",
@ -318,8 +319,13 @@ Ls.deu = {
"mt_c2ng": "Dein Gerät scheint dieses Ausgabeformat nicht zu unterstützen, aber lass trotzdem mal probieren", "mt_c2ng": "Dein Gerät scheint dieses Ausgabeformat nicht zu unterstützen, aber lass trotzdem mal probieren",
"mt_xowa": "Es gibt Bugs in iOS, die die Hintergrund-Wiedergabe mit diesem Format verhindern; bitte nutze caf oder mp3 stattdessen", "mt_xowa": "Es gibt Bugs in iOS, die die Hintergrund-Wiedergabe mit diesem Format verhindern; bitte nutze caf oder mp3 stattdessen",
"mt_tint": "Hintergrundlevel (0-100) auf der Seekbar$Num Buffern weniger ablenkend zu machen", "mt_tint": "Hintergrundlevel (0-100) auf der Seekbar$Num Buffern weniger ablenkend zu machen",
"mt_eq": "Aktiviert Equalizer und Lautstärkeregelung;$N$Nboost &lt;code&gt;0&lt;/code&gt; = Standard 100% Lautstärke (unverändert)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = Standard Stereo (unverändert)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% Links-Rechts-Crossfeed$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = Mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = Gesangsentfernung :^)$N$NDer Equalizer macht nahtlose Alben vollständig nahtlos, also lass' ihn mit allen Werten auf Null (außer width = 1) aktiviert, wenn dir das wichtig ist", "mt_eq": "`Aktiviert Equalizer und Lautstärkeregelung;$N$Nboost `0` = Standard 100% Lautstärke (unverändert)$N$Nwidth `1 &nbsp;` = Standard Stereo (unverändert)$Nwidth `0.5` = 50% Links-Rechts-Crossfeed$Nwidth `0 &nbsp;` = Mono$N$Nboost `-0.8` &amp; width `10` = Gesangsentfernung :^)$N$NDer Equalizer macht nahtlose Alben vollständig nahtlos, also lass' ihn mit allen Werten auf Null (außer width = 1) aktiviert, wenn dir das wichtig ist",
"mt_drc": "Aktiviert den Dynamic Range Compressor (Lautstärkeglättung/-begrenzung); aktiviert auch den Equalizer zum Ausgleich, setze alle EQ-Felder außer 'width' auf 0, wenn du das nicht willst$N$Nsenkt die Lautstärke von Audio über SCHWELLENWERT dB; für jedes VERHÄLTNIS dB über SCHWELLENWERT gibt es 1 dB Ausgabe, also bedeuten Standardwerte von tresh -24 und ratio 12, dass es nie lauter als -22 dB werden sollte und der Equalizer-Boost sicher auf 0.8 oder sogar 1.8 mit ATK 0 und einem großen RLS wie 90 erhöht werden kann (funktioniert nur in Firefox; in anderen Browsern ist RLS max. 1)$N$N(siehe Wikipedia, dort wird es viel besser erklärt)", "mt_drc": "Aktiviert den Dynamic Range Compressor (Lautstärkeglättung/-begrenzung); aktiviert auch den Equalizer zum Ausgleich, setze alle EQ-Felder außer 'width' auf 0, wenn du das nicht willst$N$Nsenkt die Lautstärke von Audio über SCHWELLENWERT dB; für jedes VERHÄLTNIS dB über SCHWELLENWERT gibt es 1 dB Ausgabe, also bedeuten Standardwerte von tresh -24 und ratio 12, dass es nie lauter als -22 dB werden sollte und der Equalizer-Boost sicher auf 0.8 oder sogar 1.8 mit ATK 0 und einem großen RLS wie 90 erhöht werden kann (funktioniert nur in Firefox; in anderen Browsern ist RLS max. 1)$N$N(siehe Wikipedia, dort wird es viel besser erklärt)",
"mt_ss": "`Aktiviert Stille-Überspringen; multipliziert die Wiedergabegeschwindigkeit mit `vor`, nahe Anfang/Ende von Titeln, wenn die Lautstärke unter `laut` liegt und die Position innerhalb der ersten `anf`% oder letzten `end`% ist", //m
"mt_ssvt": "Lautstärkeschwelle (0-255)\">laut", //m
"mt_ssts": "Aktiv-Schwelle (% Titel, Anfang)\">anf", //m
"mt_sste": "Aktiv-Schwelle (% Titel, Ende)\">end", //m
"mt_sssm": "Wiedergabegeschwindigkeits-Multiplikator\">vor", //m
"mb_play": "Abspielen", "mb_play": "Abspielen",
"mm_hashplay": "Diese Audiodatei abspielen?", "mm_hashplay": "Diese Audiodatei abspielen?",
@ -398,8 +404,8 @@ Ls.deu = {
"fr_case": "Groß-/Kleinschreibung beachten (Regex)\">Großschreibung", "fr_case": "Groß-/Kleinschreibung beachten (Regex)\">Großschreibung",
"fr_win": "Windows-kompatible Namen; ersetzt <code>&lt;&gt;:&quot;\\|?*</code> durch japanische Fullwidth-Zeichen\">win", "fr_win": "Windows-kompatible Namen; ersetzt <code>&lt;&gt;:&quot;\\|?*</code> durch japanische Fullwidth-Zeichen\">win",
"fr_slash": "Ersetzt <code>/</code> durch ein Zeichen, das keine neuen Ordner erstellt\">no /", "fr_slash": "Ersetzt <code>/</code> durch ein Zeichen, das keine neuen Ordner erstellt\">no /",
"fr_re": "Regex-Suchmuster für Originaldateinamen; Erfassungsgruppen können im Formatfeld unten als &lt;code&gt;(1)&lt;/code&gt; und &lt;code&gt;(2)&lt;/code&gt; usw. referenziert werden", "fr_re": "`Regex-Suchmuster für Originaldateinamen; Erfassungsgruppen können im Formatfeld unten als `(1)` und `(2)` usw. referenziert werden",
"fr_fmt": "inspiriert von foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; wird durch Songtitel ersetzt,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; überspringt [diesen] Teil falls Interpret leer$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; füllt die Titelnummer auf 2 Ziffern auf", "fr_fmt": "`inspiriert von foobar2000:$N`(title)` wird durch Songtitel ersetzt,$N`[(artist) - ](title)` überspringt [diesen] Teil falls Interpret leer$N`$lpad((tn),2,0)` füllt die Titelnummer auf 2 Ziffern auf",
"fr_pdel": "Löschen", "fr_pdel": "Löschen",
"fr_pnew": "Speichern als", "fr_pnew": "Speichern als",
"fr_pname": "Gib der Vorlage einen Namen", "fr_pname": "Gib der Vorlage einen Namen",
@ -448,7 +454,7 @@ Ls.deu = {
"mk_noname": "Tipp' mal vorher lieber einen Namen in das Textfeld links, bevor du das machst :p", "mk_noname": "Tipp' mal vorher lieber einen Namen in das Textfeld links, bevor du das machst :p",
"nmd_i1": "Füge auch die Dateiendung hinzu, z.B. <code>.md</code>", "nmd_i1": "Füge auch die Dateiendung hinzu, z.B. <code>.md</code>",
"nmd_i2": "Du kannst nur <code>.md</code>-Dateien erstellen, da dir Lösch-Rechte fehlen", "nmd_i2": "Du kannst nur <code>.{0}</code>-Dateien erstellen, da dir Lösch-Rechte fehlen",
"tv_load": "Textdatei wird geladen:\n\n{0}\n\n{1}% ({2} von {3} MiB geladen)", "tv_load": "Textdatei wird geladen:\n\n{0}\n\n{1}% ({2} von {3} MiB geladen)",
"tv_xe1": "Konnte Textdatei nicht laden:\n\nFehler ", "tv_xe1": "Konnte Textdatei nicht laden:\n\nFehler ",

View file

@ -84,8 +84,8 @@ Ls.epo = {
["M", "fermi dosieron"], ["M", "fermi dosieron"],
["E", "redakti dosieron"], ["E", "redakti dosieron"],
["S", "elekti dosieron (por eltondado/kopiado/alinomado)"], ["S", "elekti dosieron (por eltondado/kopiado/alinomado)"],
["Y", "elŝuti tekstodosieron"], //m ["Y", "elŝuti tekstodosieron"],
["⇧ J", "beligi json"], //m ["⇧ J", "beligi JSONon"],
] ]
], ],
@ -114,11 +114,11 @@ 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&lt;code&gt;foo bar&lt;/code&gt; = devas enhavi ambaŭ «foo» kaj «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = devas enhavi «foo», sed ne «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = komenci per «yana» kaj esti dosieron de formato «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = enhavi precipe «try unite»$N$Nformato de datoj estas iso-8601, ekzemple$N&lt;code&gt;2009-12-31&lt;/code&gt; aŭ &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "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",
"ot_md": "new-file: krei novan tekstodosieron", //m "ot_md": "new-file: krei novan tekstodosieron",
"ot_msg": "msg: sendi mesaĝon al servila protokolo", "ot_msg": "msg: sendi mesaĝon al servila protokolo",
"ot_mp": "agordoj de medialudilo", "ot_mp": "agordoj de medialudilo",
"ot_cfg": "aliaj agordoj", "ot_cfg": "aliaj agordoj",
@ -127,7 +127,7 @@ Ls.epo = {
"ot_noie": 'Bonvolu uzi retumilojn Chrome / Firefox / Edge', "ot_noie": 'Bonvolu uzi retumilojn Chrome / Firefox / Edge',
"ab_mkdir": "krei dosierujon", "ab_mkdir": "krei dosierujon",
"ab_mkdoc": "krei tekstodosieron", //m "ab_mkdoc": "krei tekstodosieron",
"ab_msg": "sendi mesaĝon al protokolo", "ab_msg": "sendi mesaĝon al protokolo",
"ay_path": "iri al dosierujoj", "ay_path": "iri al dosierujoj",
@ -155,7 +155,7 @@ Ls.epo = {
"ul_par": "paralelaj alŝutoj:", "ul_par": "paralelaj alŝutoj:",
"ut_rand": "hazardigi dosiernomojn", "ut_rand": "hazardigi dosiernomojn",
"ut_u2ts": "kopii la tempon de lasta modifo$Nel via dosiersistemo al la servilo\">📅", "ut_u2ts": "kopii la tempon de lasta modifo$Nel via dosiersistemo al la servilo\">📅",
"ut_ow": "ĉu anstataŭigi dosierojn ĉe la servilo?$N🛡: neniam (dosiero estos alŝutita kun nova dosiernomo)$N🕒: anstataŭigi, se servila dosiero estas pli malnova ol via$N♻: ĉiam anstataŭigi, se dosieroj estas malsamaj$N⏭: senkondiĉe preterlasi ĉiujn ekzistantajn dosierojn", //m "ut_ow": "ĉu anstataŭigi dosierojn ĉe la servilo?$N🛡: neniam (dosiero estos alŝutita kun nova dosiernomo)$N🕒: anstataŭigi, se servila dosiero estas pli malnova ol via$N♻: ĉiam anstataŭigi, se dosieroj estas malsamaj$N⏭: senkondiĉe preterlasi ĉiujn ekzistantajn dosierojn",
"ut_mt": "daŭri kalkuladon de kontrolsumoj por aliaj dosieroj dum alŝutado$N$Nmalŝaltinda, se via procesoro aŭ disko ne estas sufiĉe rapidaj", "ut_mt": "daŭri kalkuladon de kontrolsumoj por aliaj dosieroj dum alŝutado$N$Nmalŝaltinda, se via procesoro aŭ disko ne estas sufiĉe rapidaj",
"ut_ask": 'peti konfirmon antaŭ komenco de alŝutado">💭', "ut_ask": 'peti konfirmon antaŭ komenco de alŝutado">💭',
"ut_pot": "plirapidigi alŝutadon por malrapidaj komputiloj$Nper malkomplikado de fasado", "ut_pot": "plirapidigi alŝutadon por malrapidaj komputiloj$Nper malkomplikado de fasado",
@ -220,19 +220,19 @@ Ls.epo = {
"cl_reset": "restarigi", "cl_reset": "restarigi",
"cl_hpick": "alklaki la kapojn de kolumnoj por kasi en la suban tabelon", "cl_hpick": "alklaki la kapojn de kolumnoj por kasi en la suban tabelon",
"cl_hcancel": "kaŝado de kolumno nuligita", "cl_hcancel": "kaŝado de kolumno nuligita",
"cl_rcm": "dekstra-klaka menuo", //m "cl_rcm": "dekstra-klaka menuo",
"ct_grid": '田 krado', "ct_grid": '田 krado',
"ct_ttips": '◔ ◡ ◔"> ŝpruchelpiloj', "ct_ttips": '◔ ◡ ◔"> ŝpruchelpiloj',
"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', //m "ct_dsel": 'uzi tren-elekton en krado-vido">treni',
"ct_dl": 'devigi elŝuton (ne montri enkadre) kiam dosiero estas alklakita">dl', //m "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',
"ct_nsort": 'numera ordigo de dosiernomoj (ekz. &lt;code&gt;2&lt;/code&gt; antaŭ &lt;code&gt;11&lt;/code&gt;)">№.ord', "ct_nsort": '`numera ordigo de dosiernomoj (ekz. `2` antaŭ `11`)">№.ord',
"ct_utc": 'montri ĉiuj datoj kaj tempoj per UTC">UTC', "ct_utc": 'montri ĉiuj datoj kaj tempoj per UTC">UTC',
"ct_readme": 'montri enhavon de README.md en listaĵo de dosieroj">📜 readme', "ct_readme": 'montri enhavon de README.md en listaĵo de dosieroj">📜 readme',
"ct_idxh": 'montri paĝon index.html anstataŭ listaĵo de dosieroj">htm', "ct_idxh": 'montri paĝon index.html anstataŭ listaĵo de dosieroj">htm',
@ -263,9 +263,9 @@ Ls.epo = {
"cdt_lim": "maks. nombro de dosieroj por montri en dosierujo", "cdt_lim": "maks. nombro de dosieroj por montri en dosierujo",
"cdt_ask": "je malsupro de paĝo, peti por ago$Nanstataŭ ŝarĝi pli da dosieroj", "cdt_ask": "je malsupro de paĝo, peti por ago$Nanstataŭ ŝarĝi pli da dosieroj",
"cdt_hsort": "kiom da ordigo-reguloj (&lt;code&gt;,sorthref&lt;/code&gt;) inkludi en adreso de la paĝo. Se agordita kiel 0, reguloj, inkluditaj en la adreso, estos ignoritaj", "cdt_hsort": "`kiom da ordigo-reguloj (`,sorthref`) inkludi en adreso de la paĝo. Se agordita kiel 0, reguloj, inkluditaj en la adreso, estos ignoritaj",
"cdt_ren": "ebligi propran dekstra-klakan menuon, la normala menuo restas alirebla per shift + dekstra klako", //m "cdt_ren": "ebligi propran dekstra-klakan menuon, la normala menuo restas alirebla per MAJ + dekstra klako\">ŝalti",
"cdt_rdb": "montri la normalan dekstraklakan menuon kiam la propra jam estas malfermita kaj oni denove dekstre klakas", //m "cdt_rdb": "montri la normalan dekstraklakan menuon, kiam la propra jam estas malfermita kaj oni denove dekstre klakas\">duobla",
"tt_entree": "montri arbovidan navig-panelon$NFulmoklavo: B", "tt_entree": "montri arbovidan navig-panelon$NFulmoklavo: B",
"tt_detree": "montri paĝnivelan navig-panelon$NFulmoklavo: B", "tt_detree": "montri paĝnivelan navig-panelon$NFulmoklavo: B",
@ -283,6 +283,7 @@ Ls.epo = {
"ml_tint": "kolorado", "ml_tint": "kolorado",
"ml_eq": "ekvalizilo", "ml_eq": "ekvalizilo",
"ml_drc": "kompresoro", "ml_drc": "kompresoro",
"ml_ss": "preterpasi silenton",
"mt_loop": "ripeti unu kanton\">🔁", "mt_loop": "ripeti unu kanton\">🔁",
"mt_one": "haltigi post unu kanto\">1⃣", "mt_one": "haltigi post unu kanto\">1⃣",
@ -290,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",
@ -318,8 +319,13 @@ Ls.epo = {
"mt_c2ng": "via aparato ŝajne ne subtenas ĉi tiun formaton, sed ni provu uzi ĝin malgraŭe", "mt_c2ng": "via aparato ŝajne ne subtenas ĉi tiun formaton, sed ni provu uzi ĝin malgraŭe",
"mt_xowa": "estas difektoj en iOS, kiuj preventas fonan ludadon per ĉi tiu formato; bonvolu uzi caf aŭ mp3 anstataŭe", "mt_xowa": "estas difektoj en iOS, kiuj preventas fonan ludadon per ĉi tiu formato; bonvolu uzi caf aŭ mp3 anstataŭe",
"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) &lt;code&gt;0&lt;/code&gt; = senmodifa 100%a laŭteco$N$Nwidth (larĝo) &lt;code&gt;1 &nbsp;&lt;/code&gt; = senmodifa dukanala sono$Nwidth (larĝo) &lt;code&gt;0.5&lt;/code&gt; = 50% miksado inter maldekstra kaj dekstra kanaloj$Nwidth (larĝo) &lt;code&gt;0 &nbsp;&lt;/code&gt; = unukanala sono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = 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 `×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": "maksimuma laŭtnivelo por silentsaltado (0-255)\">laŭt",
"mt_ssts": "komenca intervalo por silentsaltado (% de trakolongo)\">ek%",
"mt_sste": "fina intervalo por silentsaltado (% de trakolongo)\">fin%",
"mt_sssm": "multiplikado de ludrapideco dum silentsaltado\">×rapid",
"mb_play": "ludi", "mb_play": "ludi",
"mm_hashplay": "ludi ĉi tiun aŭdiodosieron?", "mm_hashplay": "ludi ĉi tiun aŭdiodosieron?",
@ -336,7 +342,7 @@ Ls.epo = {
"mm_eunk": "Nekonata eraro", "mm_eunk": "Nekonata eraro",
"mm_e404": "Ne povas ludi aŭdiaĵon; eraro 404: Dosiero ne trovita.", "mm_e404": "Ne povas ludi aŭdiaĵon; eraro 404: Dosiero ne trovita.",
"mm_e403": "Ne povas ludi aŭdiaĵon; eraro 403: Atingo malpermesita.\n\nKlopodu reŝargi paĝon per klavo F5, eble via seanco senvalidiĝis", "mm_e403": "Ne povas ludi aŭdiaĵon; eraro 403: Atingo malpermesita.\n\nKlopodu reŝargi paĝon per klavo F5, eble via seanco senvalidiĝis",
"mm_e415": "Ne povas ludi aŭdiaĵon; eraro 415: Transkodigo de dosiero malsukcesis; rigardu la protokolojn de servilo.", //m "mm_e415": "Ne povas ludi aŭdiaĵon; eraro 415: Transkodigo de dosiero malsukcesis; rigardu la protokolojn de la servilo.",
"mm_e500": "Ne povas ludi aŭdiaĵon; eraro 500: Rigardu la protokolojn de servilo.", "mm_e500": "Ne povas ludi aŭdiaĵon; eraro 500: Rigardu la protokolojn de servilo.",
"mm_e5xx": "Ne povas ludi aŭdiaĵon; servila eraro ", "mm_e5xx": "Ne povas ludi aŭdiaĵon; servila eraro ",
"mm_nof": "neniuj aŭdio-dosieroj trovitaj proksime", "mm_nof": "neniuj aŭdio-dosieroj trovitaj proksime",
@ -356,7 +362,7 @@ Ls.epo = {
"f_anota": "nur {0} de {1} eroj estis elektita;\nrulumi al la malsupro por elekti la tutan dosierujon", "f_anota": "nur {0} de {1} eroj estis elektita;\nrulumi al la malsupro por elekti la tutan dosierujon",
"f_dls": 'la ligiloj de dosieroj en ĉi tiu dosierujo estis\nanstataŭigitaj per elŝuto-ligiloj', "f_dls": 'la ligiloj de dosieroj en ĉi tiu dosierujo estis\nanstataŭigitaj per elŝuto-ligiloj',
"f_dl_nd": 'preterlasante dosierujon (uzu zip/tar-elŝuton anstataŭe):\n', //m "f_dl_nd": 'dosierujo preterlasita (uzu zip/tar-elŝuton anstataŭe):\n',
"f_partial": "Por sendifekta elŝuto de nune-alŝutata dosiero, elektu dosieron kun sama nomo, sed sen etendaĵo <code>.PARTIAL</code>. Bonvolu uzi la butonon \"Rezigni\" aŭ klavon ESK por fari tion.\n\nSe vi uzas OK / Enter, la provizora dosiero <code>.PARTIAL</code> estos elŝutita, kiu tre probable enhavas nekompletajn datumojn.", "f_partial": "Por sendifekta elŝuto de nune-alŝutata dosiero, elektu dosieron kun sama nomo, sed sen etendaĵo <code>.PARTIAL</code>. Bonvolu uzi la butonon \"Rezigni\" aŭ klavon ESK por fari tion.\n\nSe vi uzas OK / Enter, la provizora dosiero <code>.PARTIAL</code> estos elŝutita, kiu tre probable enhavas nekompletajn datumojn.",
@ -398,8 +404,8 @@ Ls.epo = {
"fr_case": "uskleciva regula esprimo\">uskleco", "fr_case": "uskleciva regula esprimo\">uskleco",
"fr_win": "Windows-taŭgaj nomoj; signoj <code>&lt;&gt;:&quot;\\|?*</code> estos anstataŭigitaj per japanaj duobla-larĝaj signoj\">win", "fr_win": "Windows-taŭgaj nomoj; signoj <code>&lt;&gt;:&quot;\\|?*</code> estos anstataŭigitaj per japanaj duobla-larĝaj signoj\">win",
"fr_slash": "anstataŭigi <code>/</code>n per signo, kiu ne devigas kreadon de novaj dosierujoj\">sen /", "fr_slash": "anstataŭigi <code>/</code>n per signo, kiu ne devigas kreadon de novaj dosierujoj\">sen /",
"fr_re": "ŝablono de regula esprimo, kiu estos aplikita al originalaj dosiernomoj; kaptogrupoj povas esti referencita en formatkampo, ekz. &lt;code&gt;(1)&lt;/code&gt;, &lt;code&gt;(2)&lt;/code&gt; k.t.p.", "fr_re": "`ŝablono de regula esprimo, kiu estos aplikita al originalaj dosiernomoj; kaptogrupoj povas esti referencita en formatkampo, ekz. `(1)`, `(2)` k.t.p.",
"fr_fmt": "inspirita de foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; anstataŭigitas per nomo de muzikaĵo,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; preterpasas [ĉi tiun] parton, se artisto ne estas specifita$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; aldonas nulojn en trakonombro ĝis 2 ciferoj", "fr_fmt": "`inspirita de foobar2000:$N`(title)` anstataŭigitas per nomo de muzikaĵo,$N`[(artist) - ](title)` preterpasas [ĉi tiun] parton, se artisto ne estas specifita$N`$lpad((tn),2,0)` aldonas nulojn en trakonombro ĝis 2 ciferoj",
"fr_pdel": "forigi", "fr_pdel": "forigi",
"fr_pnew": "konservi kiel", "fr_pnew": "konservi kiel",
"fr_pname": "nomu vian novan ŝablonon", "fr_pname": "nomu vian novan ŝablonon",
@ -425,10 +431,10 @@ Ls.epo = {
"fcc_warn": '{0} aĵoj kopiitaj al tondujo\n\nnur <b>ĉi tiu</b> langeto de retumilo povas alglui ilin\n(pro la grando de elektaĵo)', "fcc_warn": '{0} aĵoj kopiitaj al tondujo\n\nnur <b>ĉi tiu</b> langeto de retumilo povas alglui ilin\n(pro la grando de elektaĵo)',
"fp_apply": "uzi ĉi tiujn nomojn", "fp_apply": "uzi ĉi tiujn nomojn",
"fp_skip": "preterpasi konfliktojn", //m "fp_skip": "preterpasi konfliktojn",
"fp_ecut": "unue eltondi aŭ kopii dosier(uj)ojn, do alglui ĝin poste\n\nnoto: tondujo ankaŭ funkcias inter aliaj langetoj de retumilo", "fp_ecut": "unue eltondi aŭ kopii dosier(uj)ojn, do alglui ĝin poste\n\nnoto: tondujo ankaŭ funkcias inter aliaj langetoj de retumilo",
"fp_ename": "{0} aĵoj ne povas esti movitaj, ĉar iliaj nomoj estas jam uzataj. Alinomi ilin sube aŭ lasi la nomokampojn malplenaj (\"preterpasi konfliktojn\") por preterpasi:", //m "fp_ename": "{0} aĵoj ne povas esti movitaj, ĉar iliaj nomoj estas jam uzataj. Alinomi ilin sube aŭ lasi la nomokampojn malplenaj (\"preterpasi konfliktojn\") por preterpasi:",
"fcp_ename": "{0} aĵoj ne povas esti kopiitaj, ĉar iliaj nomoj estas jam uzataj. Alinomi ilin sube aŭ lasi la nomokampojn malplenaj (\"preterpasi konfliktojn\") por preterpasi:", //m "fcp_ename": "{0} aĵoj ne povas esti kopiitaj, ĉar iliaj nomoj estas jam uzataj. Alinomi ilin sube aŭ lasi la nomokampojn malplenaj (\"preterpasi konfliktojn\") por preterpasi:",
"fp_emore": "ankoraŭ restas koincidoj de dosiernomoj, kiuj bezonas solvon", "fp_emore": "ankoraŭ restas koincidoj de dosiernomoj, kiuj bezonas solvon",
"fp_ok": "movado sukcesis", "fp_ok": "movado sukcesis",
"fcp_ok": "kopiado sukcesis", "fcp_ok": "kopiado sukcesis",
@ -447,8 +453,8 @@ Ls.epo = {
"fcp_both_b": '<a href="#" id="modal-ok">Kopii</a><a href="#" id="modal-ng">Alŝuti</a>', "fcp_both_b": '<a href="#" id="modal-ok">Kopii</a><a href="#" id="modal-ng">Alŝuti</a>',
"mk_noname": "tajpu nomon en tekstokampo maldekstre antaŭ vi faras ĉi tion :p", "mk_noname": "tajpu nomon en tekstokampo maldekstre antaŭ vi faras ĉi tion :p",
"nmd_i1": "vi povas aldoni la deziratan sufikson, ekzemple <code>.md</code>", //m "nmd_i1": "vi povas aldoni la deziratan sufikson, ekzemple <code>.md</code>",
"nmd_i2": "vi povas krei nur <code>.md</code>-dosierojn ĉar vi ne havas forigan permeson", //m "nmd_i2": "vi povas krei nur <code>.{0}</code>-dosierojn, ĉar vi ne rajtas forigi dosierojn",
"tv_load": "Ŝargado de teksto-dokumento:\n\n{0}\n\n{1}% ({2} da {3} MiB ŝargita)", "tv_load": "Ŝargado de teksto-dokumento:\n\n{0}\n\n{1}% ({2} da {3} MiB ŝargita)",
"tv_xe1": "ne povas ŝargi teksto-dosieron:\n\neraro ", "tv_xe1": "ne povas ŝargi teksto-dosieron:\n\neraro ",
@ -459,7 +465,7 @@ Ls.epo = {
"tvt_prev": "montri malsekvan dokumenton$NFulmoklavo: i\">⬆ malsekva", "tvt_prev": "montri malsekvan dokumenton$NFulmoklavo: i\">⬆ malsekva",
"tvt_next": "montri sekvan dokumenton$NFulmoklavo: K\">⬇ sekva", "tvt_next": "montri sekvan dokumenton$NFulmoklavo: K\">⬇ sekva",
"tvt_sel": "elekti dosieron &nbsp; ( por eltondado / kopiado / forigado / ... )$NFulmoklavo: S\">elekti", "tvt_sel": "elekti dosieron &nbsp; ( por eltondado / kopiado / forigado / ... )$NFulmoklavo: S\">elekti",
"tvt_j": "beligi json$NFulmoklavo: shift-J\">j", //m "tvt_j": "beligi JSONon$NFulmoklavo: MAJ-J\">j",
"tvt_edit": "malfermi dosieron en teksto-redaktilo$NFulmoklavo: E\">✏️ redakti", "tvt_edit": "malfermi dosieron en teksto-redaktilo$NFulmoklavo: E\">✏️ redakti",
"tvt_tail": "observi ŝanĝojn en dosiero; novaj linioj estos tuje montritaj\">📡 gvati", "tvt_tail": "observi ŝanĝojn en dosiero; novaj linioj estos tuje montritaj\">📡 gvati",
"tvt_wrap": "linifaldo\">↵", "tvt_wrap": "linifaldo\">↵",
@ -644,25 +650,25 @@ Ls.epo = {
"ur_um": "Finita;\n{0} alŝutoj sukcesis,\n{1} alŝutoj malsukcesis, pardonon", "ur_um": "Finita;\n{0} alŝutoj sukcesis,\n{1} alŝutoj malsukcesis, pardonon",
"ur_sm": "Finita;\n{0} dosieroj trovitaj ĉe la servilo,\n{1} dosieroj NE trovitaj ĉe la servilo", "ur_sm": "Finita;\n{0} dosieroj trovitaj ĉe la servilo,\n{1} dosieroj NE trovitaj ĉe la servilo",
"rc_opn": "malfermi", //m "rc_opn": "malfermi",
"rc_ply": "Ludi", //m "rc_ply": "ludi",
"rc_pla": "Ludi kiel sonon", //m "rc_pla": "ludi kiel aŭdiaĵo",
"rc_txt": "malfermi en dosiera vidilo", //m "rc_txt": "malfermi per tekstovidilo",
"rc_md": "malfermi en tekstredaktilo", //m "rc_md": "malfermi per tekstoredaktilo",
"rc_dl": "elŝuti", //m "rc_dl": "elŝuti",
"rc_zip": "elŝuti kiel arkivon", //m "rc_zip": "elŝuti kiel arkivo",
"rc_cpl": "kopii ligilon", //m "rc_cpl": "kopii ligilon",
"rc_del": "forigi", //m "rc_del": "forigi",
"rc_cut": "eltondi", //m "rc_cut": "eltondi",
"rc_cpy": "kopii", //m "rc_cpy": "kopii",
"rc_pst": "alglui", //m "rc_pst": "alglui",
"rc_rnm": "alinomi", //m "rc_rnm": "alinomi",
"rc_nfo": "nova dosierujo", //m "rc_nfo": "nova dosierujo",
"rc_nfi": "nova dosiero", //m "rc_nfi": "nova dosiero",
"rc_sal": "elekti ĉion", //m "rc_sal": "elekti ĉiujn",
"rc_sin": "inversigi elekton", //m "rc_sin": "inversigi elekton",
"rc_shf": "kunhavigi ĉi tiun dosierujon", //m "rc_shf": "kunhavigi ĉi tiun dosierujon",
"rc_shs": "kunhavigi elekton", //m "rc_shs": "kunhavigi elekton",
"lang_set": "ĉu reŝargi paĝon por efektivigi lingvo-ŝanĝon?", "lang_set": "ĉu reŝargi paĝon por efektivigi lingvo-ŝanĝon?",
@ -705,8 +711,8 @@ Ls.epo = {
"ta1": "entajpu novan pasvorton unue", "ta1": "entajpu novan pasvorton unue",
"ta2": "retajpu por konfirmi:", "ta2": "retajpu por konfirmi:",
"ta3": "tajpo-eraro; bonvolu provu denove", "ta3": "tajpo-eraro; bonvolu provu denove",
"nop": "ERARO: Pasvorto ne povas esti malplena", //m "nop": "ERARO: Pasvorto ne povas esti malplena",
"nou": "ERARO: Uzantnomo kaj/aŭ pasvorto ne povas esti malplena", //m "nou": "ERARO: Uzantnomo kaj/aŭ pasvorto ne povas esti malplena",
"aa1": "aktivaj alŝutoj:", "aa1": "aktivaj alŝutoj:",
"ab1": "malŝalti no304-on", "ab1": "malŝalti no304-on",
"ac1": "ŝalti no304-on", "ac1": "ŝalti no304-on",

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&lt;code&gt;foo bar&lt;/code&gt; = täytyy sisältää sekä «foo» että «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = täytyy sisältää «foo» mutta ei «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = alkaa «yana» ja on «opus»-tiedosto$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = sisältää täsmälleen «try unite»$N$Npäivämäärän muoto on iso-8601, kuten$N&lt;code&gt;2009-12-31&lt;/code&gt; tai &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "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',
@ -263,9 +263,9 @@ 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öä (&lt;code&gt;,sorthref&lt;/code&gt;) 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", //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", //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,6 +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 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⃣",
@ -311,15 +312,20 @@ 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",
"mt_xowa": "iOS:ssä on bugeja jotka estävät taustatoiston tällä formaatilla; käytä caf:ia tai mp3:a sen sijaan", "mt_xowa": "iOS:ssä on bugeja jotka estävät taustatoiston tällä formaatilla; käytä caf:ia tai mp3:a sen sijaan",
"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 &lt;code&gt;0&lt;/code&gt; = normaali 100% äänenvoimakkuus (muokkaamaton)$N$Nleveys &lt;code&gt;1 &nbsp;&lt;/code&gt; = normaali stereo (muokkaamaton)$Nleveys &lt;code&gt;0.5&lt;/code&gt; = 50% vasen-oikea ristisyöttö$Nleveys &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nvahvistus &lt;code&gt;-0.8&lt;/code&gt; &amp; leveys &lt;code&gt;10&lt;/code&gt; = 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 `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 kynnysarvo (0-255)\">vol",
"mt_ssts": "alkuraja (prosenttia kappaleen alusta)\">alk",
"mt_sste": "loppuraja (prosenttia kappaleen lopusta)\">lop",
"mt_sssm": "toistonopeuden kerroin (min. 0.15, max. 8))\">nop",
"mb_play": "toista", "mb_play": "toista",
"mm_hashplay": "soita tämä äänitiedosto?", "mm_hashplay": "soita tämä äänitiedosto?",
@ -336,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ä",
@ -356,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.",
@ -398,8 +404,8 @@ Ls.fin = {
"fr_case": "isot ja pienet kirjaimet erottava regex\">kirjainkoko", "fr_case": "isot ja pienet kirjaimet erottava regex\">kirjainkoko",
"fr_win": "windows-yhteensopivat nimet; korvaa <code>&lt;&gt;:&quot;\\|?*</code> japanilaisilla leveillä merkeillä\">win", "fr_win": "windows-yhteensopivat nimet; korvaa <code>&lt;&gt;:&quot;\\|?*</code> japanilaisilla leveillä merkeillä\">win",
"fr_slash": "korvaa <code>/</code> merkillä joka ei aiheuta uusien hakemistoiden luomista\">ei /", "fr_slash": "korvaa <code>/</code> merkillä joka ei aiheuta uusien hakemistoiden luomista\">ei /",
"fr_re": "regex hakukuvio jota käytetään alkuperäisiin tiedostonimiin; kaappausryhmiin voi viitata alla olevassa muotoilukentässä kuten &lt;code&gt;(1)&lt;/code&gt; ja &lt;code&gt;(2)&lt;/code&gt; ja niin edelleen", "fr_re": "`regex hakukuvio jota käytetään alkuperäisiin tiedostonimiin; kaappausryhmiin voi viitata alla olevassa muotoilukentässä kuten `(1)` ja `(2)` ja niin edelleen",
"fr_fmt": "foobar2000 innoittama:$N&lt;code&gt;(title)&lt;/code&gt; korvataan kappaleen nimellä,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; sivuuttaa [tämän] osan jos artisti on tyhjä$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; ", "fr_fmt": "`foobar2000 innoittama:$N`(title)` korvataan kappaleen nimellä,$N`[(artist) - ](title)` sivuuttaa [tämän] osan jos artisti on tyhjä$N`$lpad((tn),2,0)` ",
"fr_pdel": "poista", "fr_pdel": "poista",
"fr_pnew": "tallenna nimellä", "fr_pnew": "tallenna nimellä",
"fr_pname": "anna nimi uudelle esiasetuksellesi", "fr_pname": "anna nimi uudelle esiasetuksellesi",
@ -425,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?",
@ -447,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>.md</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 ",
@ -459,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\">↵",
@ -644,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?",
@ -682,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>',
@ -705,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

@ -114,7 +114,7 @@ Ls.fra = {
"login": "Se connecter", //m "login": "Se connecter", //m
"access": " accès", "access": " accès",
"ot_close": "fermer le sous-menu", "ot_close": "fermer le sous-menu",
"ot_search": "chercher des fichiers par leurs attributs, chemin / nom, tag musicaux, ou nimporte quelle combinaison de ces options$N$N&lt;code&gt;foo bar&lt;/code&gt; = doit contenir à la fois «foo» et «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = doit contenir «foo» mais pas «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = commence par «yana» et est un fichier «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = contient exactement «try unite»$N$Nle format de date est iso-8601, comme$N&lt;code&gt;2009-12-31&lt;/code&gt; ou &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`chercher des fichiers par leurs attributs, chemin / nom, tag musicaux, ou nimporte quelle combinaison de ces options$N$N`foo bar` = doit contenir à la fois «foo» et «bar»,$N`foo -bar` = doit contenir «foo» mais pas «bar»,$N`^yana .opus$` = commence par «yana» et est un fichier «opus»$N`&quot;try unite&quot;` = contient exactement «try unite»$N$Nle format de date est iso-8601, comme$N`2009-12-31` ou `2020-09-12 23:30:00`",
"ot_unpost": "unpost: supprimer vos téléchargements récents, ou annuler ceux en cours", "ot_unpost": "unpost: supprimer vos téléchargements récents, ou annuler ceux en cours",
"ot_bup": "bup: téléverseur de base, prend même en charge netscape 4.0", "ot_bup": "bup: téléverseur de base, prend même en charge netscape 4.0",
"ot_mkdir": "mkdir: créer un nouveau répertoire", "ot_mkdir": "mkdir: créer un nouveau répertoire",
@ -263,9 +263,9 @@ Ls.fra = {
"cdt_lim": "nombre maximum de fichiers à afficher dans un dossier", "cdt_lim": "nombre maximum de fichiers à afficher dans un dossier",
"cdt_ask": "lorsque vous faites défiler vers le bas,$Nau lieu de charger plus de fichiers,$Ndemander quoi faire", "cdt_ask": "lorsque vous faites défiler vers le bas,$Nau lieu de charger plus de fichiers,$Ndemander quoi faire",
"cdt_hsort": "combien de règles de tri (&lt;code&gt;,sorthref&lt;/code&gt;) à inclure dans les media-URLs. Définir cette valeur à 0 ignorera également les règles de tri incluses dans les liens média lorsque vous cliquez dessus.", "cdt_hsort": "`combien de règles de tri (`,sorthref`) à inclure dans les media-URLs. Définir cette valeur à 0 ignorera également les règles de tri incluses dans les liens média lorsque vous cliquez dessus.",
"cdt_ren": "activer le menu contextuel personnalisé, le menu normal reste accessible avec shift + clic droit", //m "cdt_ren": "activer le menu contextuel personnalisé, le menu normal reste accessible avec shift + clic droit\">activer", //m
"cdt_rdb": "afficher le menu clic droit normal lorsque le menu personnalisé est déjà ouvert et quon clique à nouveau", //m "cdt_rdb": "afficher le menu clic droit normal lorsque le menu personnalisé est déjà ouvert et quon clique à nouveau\">x2", //m
"tt_entree": "afficher le panneau de navigation (arborescence des dossiers)$NHotkey: B", "tt_entree": "afficher le panneau de navigation (arborescence des dossiers)$NHotkey: B",
"tt_detree": "afficher le fil dAriane$NHotkey: B", "tt_detree": "afficher le fil dAriane$NHotkey: B",
@ -283,6 +283,7 @@ Ls.fra = {
"ml_tint": "teinte", "ml_tint": "teinte",
"ml_eq": "égaliseur audio", "ml_eq": "égaliseur audio",
"ml_drc": "compresseur de plage dynamique", "ml_drc": "compresseur de plage dynamique",
"ml_ss": "ignorer les silences", //m
"mt_loop": "répéter en boucle une musique\">🔁", "mt_loop": "répéter en boucle une musique\">🔁",
"mt_one": "stopper après une musique\">1⃣", "mt_one": "stopper après une musique\">1⃣",
@ -318,8 +319,13 @@ Ls.fra = {
"mt_c2ng": "votre appareil ne semble pas prendre en charge ce format de sortie, mais essayons quand même", "mt_c2ng": "votre appareil ne semble pas prendre en charge ce format de sortie, mais essayons quand même",
"mt_xowa": "il y a des bugs dans iOS qui empeche d'avoir une lecture en ariere plan en utilisant ce format; utilisez caf ou mp3 à la place", "mt_xowa": "il y a des bugs dans iOS qui empeche d'avoir une lecture en ariere plan en utilisant ce format; utilisez caf ou mp3 à la place",
"mt_tint": "niveau darrière-plan (0100) de la barre de progression$Npour rendre la mise en mémoire tampon moins gênante", "mt_tint": "niveau darrière-plan (0100) de la barre de progression$Npour rendre la mise en mémoire tampon moins gênante",
"mt_eq": "active l'égaliseur et le contrôle de gain;$N$Nboost &lt;code&gt;0&lt;/code&gt; = volume standard 100% (non modifié)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = stéréo standard (non modifié)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% de crossfeed gauche-droite$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = suppression vocale :^)$N$Nl'activation de l'égaliseur rend les albums gapless entièrement gapless, alors laissez-le activé avec toutes les valeurs à zéro (sauf largeur = 1) si vous vous en souciez", "mt_eq": "`active l'égaliseur et le contrôle de gain;$N$Nboost `0` = volume standard 100% (non modifié)$N$Nwidth `1 &nbsp;` = stéréo standard (non modifié)$Nwidth `0.5` = 50% de crossfeed gauche-droite$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = suppression vocale :^)$N$Nl'activation de l'égaliseur rend les albums gapless entièrement gapless, alors laissez-le activé avec toutes les valeurs à zéro (sauf largeur = 1) si vous vous en souciez",
"mt_drc": "active le compresseur de plage dynamique (aplanisseur de volume / brickwaller); activera également l'EQ pour équilibrer les choses, donc définissez tous les champs EQ sauf 'width' sur 0 si vous ne le voulez pas$N$Ndiminue le volume de l'audio au-dessus de THRESHOLD dB; pour chaque RATIO dB au-delà de THRESHOLD, il y a 1 dB de sortie, donc des valeurs par défaut de tresh -24 et ratio 12 signifient qu'il ne devrait jamais être plus fort que -22 dB et qu'il est sûr d'augmenter le boost de l'égaliseur à 0.8, ou même 1.8 avec ATK 0 et un énorme RLS comme 90 (ne fonctionne que dans firefox; RLS est max 1 dans les autres navigateurs)$N$N(voir wikipedia, ils expliquent cela beaucoup mieux)", "mt_drc": "active le compresseur de plage dynamique (aplanisseur de volume / brickwaller); activera également l'EQ pour équilibrer les choses, donc définissez tous les champs EQ sauf 'width' sur 0 si vous ne le voulez pas$N$Ndiminue le volume de l'audio au-dessus de THRESHOLD dB; pour chaque RATIO dB au-delà de THRESHOLD, il y a 1 dB de sortie, donc des valeurs par défaut de tresh -24 et ratio 12 signifient qu'il ne devrait jamais être plus fort que -22 dB et qu'il est sûr d'augmenter le boost de l'égaliseur à 0.8, ou même 1.8 avec ATK 0 et un énorme RLS comme 90 (ne fonctionne que dans firefox; RLS est max 1 dans les autres navigateurs)$N$N(voir wikipedia, ils expliquent cela beaucoup mieux)",
"mt_ss": "`active le saut de silence ; multiplie la vitesse de lecture par `av` près du début/fin quand le volume est sous `vol` et la position est dans les `deb`% premiers ou `fin`% derniers", //m
"mt_ssvt": "seuil de volume (0-255)\">vol", //m
"mt_ssts": "seuil actif (% piste, début)\">deb", //m
"mt_sste": "seuil actif (% piste, fin)\">fin", //m
"mt_sssm": "multiplicateur de vitesse de lecture\">av", //m
"mb_play": "lecture", "mb_play": "lecture",
"mm_hashplay": "lire ce fichier audio ?", "mm_hashplay": "lire ce fichier audio ?",
@ -398,8 +404,8 @@ Ls.fra = {
"fr_case": "regex sensible à la casse\">case", "fr_case": "regex sensible à la casse\">case",
"fr_win": "noms windows-safe; remplacer <code>&lt;&gt;:&quot;\\|?*</code> par des caractères japonais en pleine largeur\">win", "fr_win": "noms windows-safe; remplacer <code>&lt;&gt;:&quot;\\|?*</code> par des caractères japonais en pleine largeur\">win",
"fr_slash": "remplacer <code>/</code> par un caractère qui ne provoque pas la création de nouveaux dossiers\">no /", "fr_slash": "remplacer <code>/</code> par un caractère qui ne provoque pas la création de nouveaux dossiers\">no /",
"fr_re": "modèle de recherche regex à appliquer aux noms de fichiers originaux ; les groupes capturés peuvent être référencés dans le champ de format ci-dessous comme &lt;code&gt;(1)&lt;/code&gt; et &lt;code&gt;(2)&lt;/code&gt; et ainsi de suite", "fr_re": "`modèle de recherche regex à appliquer aux noms de fichiers originaux ; les groupes capturés peuvent être référencés dans le champ de format ci-dessous comme `(1)` et `(2)` et ainsi de suite",
"fr_fmt": "inspiré par foobar2000 : $N&lt;code&gt;(title)&lt;/code&gt; est remplacé par le titre de la chanson, $N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; saute [cette] partie si l'artiste est vide, $N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; remplit le numéro de piste à 2 chiffres", "fr_fmt": "`inspiré par foobar2000 : $N`(title)` est remplacé par le titre de la chanson, $N`[(artist) - ](title)` saute [cette] partie si l'artiste est vide, $N`$lpad((tn),2,0)` remplit le numéro de piste à 2 chiffres",
"fr_pdel": "supprimer", "fr_pdel": "supprimer",
"fr_pnew": "enregistrer sous", "fr_pnew": "enregistrer sous",
"fr_pname": "donnez un nom pour le nouveau preset", "fr_pname": "donnez un nom pour le nouveau preset",
@ -448,7 +454,7 @@ Ls.fra = {
"mk_noname": "entrez un nom dans le champ de texte à gauche avant de faire ça :p", "mk_noname": "entrez un nom dans le champ de texte à gauche avant de faire ça :p",
"nmd_i1": "ajoutez aussi lextension souhaitée, par exemple <code>.md</code>", //m "nmd_i1": "ajoutez aussi lextension souhaitée, par exemple <code>.md</code>", //m
"nmd_i2": "vous ne pouvez créer que des fichiers <code>.md</code> car vous navez pas la permission deffacer", //m "nmd_i2": "vous ne pouvez créer que des fichiers <code>.{0}</code> car vous navez pas la permission deffacer", //m
"tv_load": "Chargement du document texte:\n\n{0}\n\n{1}% ({2} de {3} MiB chargés)", "tv_load": "Chargement du document texte:\n\n{0}\n\n{1}% ({2} de {3} MiB chargés)",
"tv_xe1": "impossible de charger le fichier texte:\n\nerreur", "tv_xe1": "impossible de charger le fichier texte:\n\nerreur",

View file

@ -114,7 +114,7 @@ Ls.grc = {
"login": "Σύνδεση", //m "login": "Σύνδεση", //m
"access": " πρόσβαση", "access": " πρόσβαση",
"ot_close": "κλείσιμο υπομενού", "ot_close": "κλείσιμο υπομενού",
"ot_search": "αναζήτηση αρχείων με βάση χαρακτηριστικά, διαδρομή / όνομα, μουσικά tags ή οποιονδήποτε συνδυασμό$N$N&lt;code&gt;foo bar&lt;/code&gt; = πρέπει να περιέχει και τα «foo» και «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = πρέπει να περιέχει το «foo» αλλά όχι το «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = να ξεκινά με «yana» και να είναι αρχείο «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = να περιέχει ακριβώς «try unite»$N$Nη μορφή ημερομηνίας είναι iso-8601, όπως$N&lt;code&gt;2009-12-31&lt;/code&gt; ή &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`αναζήτηση αρχείων με βάση χαρακτηριστικά, διαδρομή / όνομα, μουσικά tags ή οποιονδήποτε συνδυασμό$N$N`foo bar` = πρέπει να περιέχει και τα «foo» και «bar»,$N`foo -bar` = πρέπει να περιέχει το «foo» αλλά όχι το «bar»,$N`^yana .opus$` = να ξεκινά με «yana» και να είναι αρχείο «opus»$N`&quot;try unite&quot;` = να περιέχει ακριβώς «try unite»$N$Nη μορφή ημερομηνίας είναι iso-8601, όπως$N`2009-12-31` ή `2020-09-12 23:30:00`",
"ot_unpost": "unpost: διαγραφή πρόσφατων μεταφορτώσεων ή ακύρωση ανολοκλήρωτων", "ot_unpost": "unpost: διαγραφή πρόσφατων μεταφορτώσεων ή ακύρωση ανολοκλήρωτων",
"ot_bup": "bup: βασικός uploader, υποστηρίζει μέχρι και netscape 4.0", "ot_bup": "bup: βασικός uploader, υποστηρίζει μέχρι και netscape 4.0",
"ot_mkdir": "mkdir: δημιουργία νέου φακέλου", "ot_mkdir": "mkdir: δημιουργία νέου φακέλου",
@ -263,9 +263,9 @@ Ls.grc = {
"cdt_lim": "μέγιστος αριθμός αρχείων προς εμφάνιση σε ένα φάκελο", "cdt_lim": "μέγιστος αριθμός αρχείων προς εμφάνιση σε ένα φάκελο",
"cdt_ask": "όταν φτάνεις στο τέλος,$Nαντί να φορτώσει περισσότερα αρχεία,$Nρωτά τι να κάνει", "cdt_ask": "όταν φτάνεις στο τέλος,$Nαντί να φορτώσει περισσότερα αρχεία,$Nρωτά τι να κάνει",
"cdt_hsort": "πόσους κανόνες ταξινόμησης (&lt;code&gt;,sorthref&lt;/code&gt;) να συμπεριλάβει σε URLs πολυμέσων. Αν το βάλεις 0 αγνοεί και κανόνες ταξινόμησης στους συνδέσμους πολυμέσων", "cdt_hsort": "`πόσους κανόνες ταξινόμησης (`,sorthref`) να συμπεριλάβει σε URLs πολυμέσων. Αν το βάλεις 0 αγνοεί και κανόνες ταξινόμησης στους συνδέσμους πολυμέσων",
"cdt_ren": "ενεργοποίηση προσαρμοσμένου μενού δεξιού κλικ, το κανονικό μενού είναι προσβάσιμο με shift + δεξί κλικ", //m "cdt_ren": "ενεργοποίηση προσαρμοσμένου μενού δεξιού κλικ, το κανονικό μενού είναι προσβάσιμο με shift + δεξί κλικ\">ενεργοποίηση", //m
"cdt_rdb": "εμφάνιση του κανονικού μενού δεξιού κλικ όταν το προσαρμοσμένο είναι ήδη ανοιχτό και γίνεται ξανά δεξί κλικ", //m "cdt_rdb": "εμφάνιση του κανονικού μενού δεξιού κλικ όταν το προσαρμοσμένο είναι ήδη ανοιχτό και γίνεται ξανά δεξί κλικ\">x2", //m
"tt_entree": "εμφάνιση navpane (δέντρο διαδρομών)$NΠλήκτρο συντόμευσης: B", "tt_entree": "εμφάνιση navpane (δέντρο διαδρομών)$NΠλήκτρο συντόμευσης: B",
"tt_detree": "εμφάνιση breadcrumbs (καρτέλες διαδρομών)$NΠλήκτρο συντόμευσης: B", "tt_detree": "εμφάνιση breadcrumbs (καρτέλες διαδρομών)$NΠλήκτρο συντόμευσης: B",
@ -283,6 +283,7 @@ Ls.grc = {
"ml_tint": "φίλτρο χρώματος", "ml_tint": "φίλτρο χρώματος",
"ml_eq": "ισοσταθμιστής ήχου", "ml_eq": "ισοσταθμιστής ήχου",
"ml_drc": "συμπιεστής δυναμικής εμβέλειας", "ml_drc": "συμπιεστής δυναμικής εμβέλειας",
"ml_ss": "παράβλεψη σιωπής", //m
"mt_loop": "επανάληψη ενός τραγουδιού\">🔁", "mt_loop": "επανάληψη ενός τραγουδιού\">🔁",
"mt_one": "σταμάτα μετά από ένα τραγούδι\">1⃣", "mt_one": "σταμάτα μετά από ένα τραγούδι\">1⃣",
@ -318,8 +319,13 @@ Ls.grc = {
"mt_c2ng": "η συσκευή σου φαίνεται να μην υποστηρίζει αυτήν τη μορφή εξόδου, αλλά ας το δοκιμάσουμε ούτως ή άλλως", "mt_c2ng": "η συσκευή σου φαίνεται να μην υποστηρίζει αυτήν τη μορφή εξόδου, αλλά ας το δοκιμάσουμε ούτως ή άλλως",
"mt_xowa": "υπάρχουν bugs σε iOS που εμποδίζουν την αναπαραγωγή στο παρασκήνιο με αυτήν τη μορφή· χρησιμοποίησε caf ή mp3 αντ’ αυτού", "mt_xowa": "υπάρχουν bugs σε iOS που εμποδίζουν την αναπαραγωγή στο παρασκήνιο με αυτήν τη μορφή· χρησιμοποίησε caf ή mp3 αντ’ αυτού",
"mt_tint": "επίπεδο φόντου (0-100) στην μπάρα αναζήτησης$Nγια να κάνεις το buffering λιγότερο ενοχλητικό", "mt_tint": "επίπεδο φόντου (0-100) στην μπάρα αναζήτησης$Nγια να κάνεις το buffering λιγότερο ενοχλητικό",
"mt_eq": "ενεργοποιεί τον ισοσταθμιστή και τον έλεγχο ενίσχυσης;$N$Nενίσχυση &lt;code&gt;0&lt;/code&gt; = στάνταρ 100% ένταση (απαράλλαχτη)$N$Nεύρος &lt;code&gt;1 &nbsp;&lt;/code&gt; = στάνταρ στερεοφωνικό (απαράλλαχτο)$Nεύρος &lt;code&gt;0.5&lt;/code&gt; = 50% αριστερά-δεξιά μίξη ήχου$Nεύρος &lt;code&gt;0 &nbsp;&lt;/code&gt; = μονοφωνικό$N$Nενίσχυση &lt;code&gt;-0.8&lt;/code&gt; &amp; εύρος &lt;code&gt;10&lt;/code&gt; = αφαίρεση φωνής :^)$N$Nη ενεργοποίηση του ισοσταθμιστή κάνει τα άλμπουμ χωρίς κενά, να παίζουν χωρίς καθόλου κενά, οπότε άφησέ το ενεργό με όλες τις τιμές στο μηδέν (εκτός από εύρος = 1) αν σε νοιάζει", "mt_eq": "`ενεργοποιεί τον ισοσταθμιστή και τον έλεγχο ενίσχυσης;$N$Nενίσχυση `0` = στάνταρ 100% ένταση (απαράλλαχτη)$N$Nεύρος `1 &nbsp;` = στάνταρ στερεοφωνικό (απαράλλαχτο)$Nεύρος `0.5` = 50% αριστερά-δεξιά μίξη ήχου$Nεύρος `0 &nbsp;` = μονοφωνικό$N$Nενίσχυση `-0.8` &amp; εύρος `10` = αφαίρεση φωνής :^)$N$Nη ενεργοποίηση του ισοσταθμιστή κάνει τα άλμπουμ χωρίς κενά, να παίζουν χωρίς καθόλου κενά, οπότε άφησέ το ενεργό με όλες τις τιμές στο μηδέν (εκτός από εύρος = 1) αν σε νοιάζει",
"mt_drc": "ενεργοποιεί τον συμπιεστή δυναμικής εμβέλειας (εξομάλυνση έντασης / ακραία συμπίεση έντασης); θα ενεργοποιήσει και τον ισοσταθμιστή για να ισορροπήσει τον ήχο, οπότε βάλε όλα τα πεδία ισοσταθμιστή εκτός από το 'εύρος' στο 0 αν δεν το θες$N$Nχαμηλώνει την ένταση του ήχου πάνω από το όριο (THRESHOLD) dB; για κάθε RATIO dB πέρα από το όριο υπάρχει 1 dB εξόδου, οπότε οι προεπιλεγμένες τιμές όριο -24 και 'λόγος' 12 σημαίνουν ότι δεν θα ξεπεράσει ποτέ τα -22 dB και είναι ασφαλές να αυξήσεις την ενίσχυση ισοσταθμιστή σε 0.8, ή και 1.8 με ATK 0 και μεγάλο RLS όπως 90 (δουλεύει μόνο σε firefox· το RLS είναι max 1 σε άλλους browsers)$N$N(δες wikipedia, το εξηγούν καλύτερα)", "mt_drc": "ενεργοποιεί τον συμπιεστή δυναμικής εμβέλειας (εξομάλυνση έντασης / ακραία συμπίεση έντασης); θα ενεργοποιήσει και τον ισοσταθμιστή για να ισορροπήσει τον ήχο, οπότε βάλε όλα τα πεδία ισοσταθμιστή εκτός από το 'εύρος' στο 0 αν δεν το θες$N$Nχαμηλώνει την ένταση του ήχου πάνω από το όριο (THRESHOLD) dB; για κάθε RATIO dB πέρα από το όριο υπάρχει 1 dB εξόδου, οπότε οι προεπιλεγμένες τιμές όριο -24 και 'λόγος' 12 σημαίνουν ότι δεν θα ξεπεράσει ποτέ τα -22 dB και είναι ασφαλές να αυξήσεις την ενίσχυση ισοσταθμιστή σε 0.8, ή και 1.8 με ATK 0 και μεγάλο RLS όπως 90 (δουλεύει μόνο σε firefox· το RLS είναι max 1 σε άλλους browsers)$N$N(δες wikipedia, το εξηγούν καλύτερα)",
"mt_ss": "`ἐνεργοποιεῖ τὴν παράλειψιν σιγῆς· πολλαπλασιάζει τὴν ταχύτητα διὰ `ταχ` πλησίον ἀρχῆς/τέλους, ὅταν ἡ φωνὴ ὑπὸ `φων` καὶ ἡ θέσις ἐν τοῖς πρώτοις `ἀρχ`% ἢ τελευταίοις `τελ`%", //m
"mt_ssvt": "ὅριον φωνῆς (0-255)\">φων", //m
"mt_ssts": "ἐνεργὸν ὅριον (% τροχιᾶς, ἀρχή)\">ἀρχ", //m
"mt_sste": "ἐνεργὸν ὅριον (% τροχιᾶς, τέλος)\">τελ", //m
"mt_sssm": "πολλαπλασιαστὴς ταχύτητος\">ταχ", //m
"mb_play": "παίξε", "mb_play": "παίξε",
"mm_hashplay": "να παίξω αυτό το αρχείο ήχου;", "mm_hashplay": "να παίξω αυτό το αρχείο ήχου;",
@ -398,8 +404,8 @@ Ls.grc = {
"fr_case": "regex με διάκριση πεζών/κεφαλαίων\">case", "fr_case": "regex με διάκριση πεζών/κεφαλαίων\">case",
"fr_win": "ασφαλή ονόματα για windows; αντικαθιστά <code>&lt;&gt;:&quot;\\|?*</code> με ιαπωνικούς χαρακτήρες πλήρους πλάτους\">win", "fr_win": "ασφαλή ονόματα για windows; αντικαθιστά <code>&lt;&gt;:&quot;\\|?*</code> με ιαπωνικούς χαρακτήρες πλήρους πλάτους\">win",
"fr_slash": "αντικαθίσταται <code>/</code> με χαρακτήρα που δεν δημιουργεί νέους φακέλους\">όχι /", "fr_slash": "αντικαθίσταται <code>/</code> με χαρακτήρα που δεν δημιουργεί νέους φακέλους\">όχι /",
"fr_re": "μοτίβα αναζήτησης (regex) για αναζήτηση στα αρχικά ονόματα; τα καταγραφόμενα groups μπορούν να χρησιμοποιηθούν στο πεδίο μορφοποίησης παρακάτω όπως &lt;code&gt;(1)&lt;/code&gt; και &lt;code&gt;(2)&lt;/code&gt; και ούτω καθεξής", "fr_re": "`μοτίβα αναζήτησης (regex) για αναζήτηση στα αρχικά ονόματα; τα καταγραφόμενα groups μπορούν να χρησιμοποιηθούν στο πεδίο μορφοποίησης παρακάτω όπως `(1)` και `(2)` και ούτω καθεξής",
"fr_fmt": "εμπνευσμένο από foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; αντικαθίσταται από τίτλο τραγουδιού,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; παραλείπει το [this] αν το artist είναι κενό$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; γεμίζει τον αριθμό κομματιού σε 2 ψηφία", "fr_fmt": "`εμπνευσμένο από foobar2000:$N`(title)` αντικαθίσταται από τίτλο τραγουδιού,$N`[(artist) - ](title)` παραλείπει το [this] αν το artist είναι κενό$N`$lpad((tn),2,0)` γεμίζει τον αριθμό κομματιού σε 2 ψηφία",
"fr_pdel": "διαγραφή", "fr_pdel": "διαγραφή",
"fr_pnew": "αποθήκευση ως", "fr_pnew": "αποθήκευση ως",
"fr_pname": "δώσε όνομα για τη νέα προεπιλογή", "fr_pname": "δώσε όνομα για τη νέα προεπιλογή",
@ -448,7 +454,7 @@ Ls.grc = {
"mk_noname": "γράψε ένα όνομα στο πεδίο κειμένου αριστερά πριν το κάνεις :p", "mk_noname": "γράψε ένα όνομα στο πεδίο κειμένου αριστερά πριν το κάνεις :p",
"nmd_i1": "μπορείτε επίσης να προσθέσετε την κατάληξη που θέλετε, όπως <code>.md</code>", //m "nmd_i1": "μπορείτε επίσης να προσθέσετε την κατάληξη που θέλετε, όπως <code>.md</code>", //m
"nmd_i2": "μπορείτε να δημιουργήσετε μόνο αρχεία <code>.md</code> επειδή δεν έχετε δικαίωμα διαγραφής", //m "nmd_i2": "μπορείτε να δημιουργήσετε μόνο αρχεία <code>.{0}</code> επειδή δεν έχετε δικαίωμα διαγραφής", //m
"tv_load": "Φόρτωση αρχείου κειμένου:\n\n{0}\n\n{1}% ({2} από {3} MiB φορτωμένα)", "tv_load": "Φόρτωση αρχείου κειμένου:\n\n{0}\n\n{1}% ({2} από {3} MiB φορτωμένα)",
"tv_xe1": "αδυναμία φόρτωσης αρχείου κειμένου:\n\nσφάλμα ", "tv_xe1": "αδυναμία φόρτωσης αρχείου κειμένου:\n\nσφάλμα ",

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

@ -114,7 +114,7 @@ Ls.ita = {
"login": "Accedi", //m "login": "Accedi", //m
"access": " accesso", "access": " accesso",
"ot_close": "chiudi sottomenu", "ot_close": "chiudi sottomenu",
"ot_search": "cerca file per attributi, percorso / nome, tag musicali, o qualsiasi combinazione di questi$N$N&lt;code&gt;foo bar&lt;/code&gt; = deve contenere sia «foo» che «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = deve contenere «foo» ma non «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = inizia con «yana» ed è un file «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = contiene esattamente «try unite»$N$Nil formato data è iso-8601, come$N&lt;code&gt;2009-12-31&lt;/code&gt; o &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`cerca file per attributi, percorso / nome, tag musicali, o qualsiasi combinazione di questi$N$N`foo bar` = deve contenere sia «foo» che «bar»,$N`foo -bar` = deve contenere «foo» ma non «bar»,$N`^yana .opus$` = inizia con «yana» ed è un file «opus»$N`&quot;try unite&quot;` = contiene esattamente «try unite»$N$Nil formato data è iso-8601, come$N`2009-12-31` o `2020-09-12 23:30:00`",
"ot_unpost": "unpost: elimina i tuoi caricamenti recenti, o interrompi quelli non completati", "ot_unpost": "unpost: elimina i tuoi caricamenti recenti, o interrompi quelli non completati",
"ot_bup": "bup: uploader di base, supporta anche netscape 4.0", "ot_bup": "bup: uploader di base, supporta anche netscape 4.0",
"ot_mkdir": "mkdir: crea una nuova directory", "ot_mkdir": "mkdir: crea una nuova directory",
@ -263,9 +263,9 @@ Ls.ita = {
"cdt_lim": "numero massimo di file da mostrare in una cartella", "cdt_lim": "numero massimo di file da mostrare in una cartella",
"cdt_ask": "quando scorri verso il fondo,$Ninvece di caricare più file,$Nchiedi cosa fare", "cdt_ask": "quando scorri verso il fondo,$Ninvece di caricare più file,$Nchiedi cosa fare",
"cdt_hsort": "quante regole di ordinamento (&lt;code&gt;,sorthref&lt;/code&gt;) includere negli URL multimediali. Impostandolo a 0 ignorerà anche le regole di ordinamento incluse nei link multimediali quando li clicchi", "cdt_hsort": "`quante regole di ordinamento (`,sorthref`) includere negli URL multimediali. Impostandolo a 0 ignorerà anche le regole di ordinamento incluse nei link multimediali quando li clicchi",
"cdt_ren": "abilita il menu contestuale personalizzato, il menu normale è accessibile con shift + clic destro", //m "cdt_ren": "abilita il menu contestuale personalizzato, il menu normale è accessibile con shift + clic destro\">abilita", //m
"cdt_rdb": "mostra il menu normale con il tasto destro quando quello personalizzato è già aperto e si clicca di nuovo", //m "cdt_rdb": "mostra il menu normale con il tasto destro quando quello personalizzato è già aperto e si clicca di nuovo\">x2", //m
"tt_entree": "mostra pannello nav (barra laterale albero directory)$NTasto rapido: B", "tt_entree": "mostra pannello nav (barra laterale albero directory)$NTasto rapido: B",
"tt_detree": "mostra breadcrumb$NTasto rapido: B", "tt_detree": "mostra breadcrumb$NTasto rapido: B",
@ -283,6 +283,7 @@ Ls.ita = {
"ml_tint": "tinta", "ml_tint": "tinta",
"ml_eq": "equalizzatore audio", "ml_eq": "equalizzatore audio",
"ml_drc": "compressore gamma dinamica", "ml_drc": "compressore gamma dinamica",
"ml_ss": "salta i silenzi", //m
"mt_loop": "loop/ripeti una canzone\">🔁", "mt_loop": "loop/ripeti una canzone\">🔁",
"mt_one": "fermati dopo una canzone\">1⃣", "mt_one": "fermati dopo una canzone\">1⃣",
@ -318,8 +319,13 @@ Ls.ita = {
"mt_c2ng": "il tuo dispositivo non sembra supportare questo formato di output, ma proviamo comunque", "mt_c2ng": "il tuo dispositivo non sembra supportare questo formato di output, ma proviamo comunque",
"mt_xowa": "ci sono bug in iOS che prevengono la riproduzione in background usando questo formato; usa caf o mp3 invece", "mt_xowa": "ci sono bug in iOS che prevengono la riproduzione in background usando questo formato; usa caf o mp3 invece",
"mt_tint": "livello sfondo (0-100) sulla barra di ricerca$Nper rendere il buffering meno distraente", "mt_tint": "livello sfondo (0-100) sulla barra di ricerca$Nper rendere il buffering meno distraente",
"mt_eq": "abilita l'equalizzatore e controllo guadagno;$N$Nboost &lt;code&gt;0&lt;/code&gt; = volume standard 100% (non modificato)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = stereo standard (non modificato)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% crossfeed sinistra-destra$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = rimozione vocale :^)$N$Nabilitando l'equalizzatore rende gli album senza interruzioni completamente senza interruzioni, quindi lascialo acceso con tutti i valori a zero (eccetto width = 1) se ti importa di quello", "mt_eq": "`abilita l'equalizzatore e controllo guadagno;$N$Nboost `0` = volume standard 100% (non modificato)$N$Nwidth `1 &nbsp;` = stereo standard (non modificato)$Nwidth `0.5` = 50% crossfeed sinistra-destra$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = rimozione vocale :^)$N$Nabilitando l'equalizzatore rende gli album senza interruzioni completamente senza interruzioni, quindi lascialo acceso con tutti i valori a zero (eccetto width = 1) se ti importa di quello",
"mt_drc": "abilita il compressore gamma dinamica (appiattitore volume / brickwaller); abiliterà anche EQ per bilanciare gli spaghetti, quindi imposta tutti i campi EQ eccetto 'width' a 0 se non lo vuoi$N$NAbbassa il volume dell'audio sopra THRESHOLD dB; per ogni RATIO dB oltre THRESHOLD c'è 1 dB di output, quindi i valori di default di tresh -24 e ratio 12 significa che non dovrebbe mai diventare più forte di -22 dB ed è sicuro aumentare il boost equalizzatore a 0.8, o anche 1.8 con ATK 0 e un RLS enorme come 90 (funziona solo in firefox; RLS è max 1 in altri browser)$N$N(vedi wikipedia, lo spiegano molto meglio)", "mt_drc": "abilita il compressore gamma dinamica (appiattitore volume / brickwaller); abiliterà anche EQ per bilanciare gli spaghetti, quindi imposta tutti i campi EQ eccetto 'width' a 0 se non lo vuoi$N$NAbbassa il volume dell'audio sopra THRESHOLD dB; per ogni RATIO dB oltre THRESHOLD c'è 1 dB di output, quindi i valori di default di tresh -24 e ratio 12 significa che non dovrebbe mai diventare più forte di -22 dB ed è sicuro aumentare il boost equalizzatore a 0.8, o anche 1.8 con ATK 0 e un RLS enorme come 90 (funziona solo in firefox; RLS è max 1 in altri browser)$N$N(vedi wikipedia, lo spiegano molto meglio)",
"mt_ss": "`abilita il salto del silenzio; moltiplica la velocità di riproduzione per `av` vicino a inizio/fine quando il volume è sotto `vol` e la posizione è nei primi `ini`% o ultimi `fin`%", //m
"mt_ssvt": "soglia volume (0-255)\">vol", //m
"mt_ssts": "soglia attiva (% traccia, inizio)\">ini", //m
"mt_sste": "soglia attiva (% traccia, fine)\">fin", //m
"mt_sssm": "moltiplicatore velocità riproduzione\">av", //m
"mb_play": "riproduci", "mb_play": "riproduci",
"mm_hashplay": "riprodurre questo file audio?", "mm_hashplay": "riprodurre questo file audio?",
@ -398,8 +404,8 @@ Ls.ita = {
"fr_case": "regex case-sensitive\">maiusc", "fr_case": "regex case-sensitive\">maiusc",
"fr_win": "nomi sicuri per windows; sostituisce <code>&lt;&gt;:&quot;\\|?*</code> con caratteri giapponesi fullwidth\">win", "fr_win": "nomi sicuri per windows; sostituisce <code>&lt;&gt;:&quot;\\|?*</code> con caratteri giapponesi fullwidth\">win",
"fr_slash": "sostituisce <code>/</code> con un carattere che non causa la creazione di nuove cartelle\">no /", "fr_slash": "sostituisce <code>/</code> con un carattere che non causa la creazione di nuove cartelle\">no /",
"fr_re": "pattern di ricerca regex da applicare ai nomi file originali; i gruppi di cattura possono essere referenziati nel campo formato sottostante come &lt;code&gt;(1)&lt;/code&gt; e &lt;code&gt;(2)&lt;/code&gt; e così via", "fr_re": "`pattern di ricerca regex da applicare ai nomi file originali; i gruppi di cattura possono essere referenziati nel campo formato sottostante come `(1)` e `(2)` e così via",
"fr_fmt": "ispirato da foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; è sostituito dal titolo della canzone,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; salta [questa] parte se artista è vuoto$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; aggiunge padding al numero traccia a 2 cifre", "fr_fmt": "`ispirato da foobar2000:$N`(title)` è sostituito dal titolo della canzone,$N`[(artist) - ](title)` salta [questa] parte se artista è vuoto$N`$lpad((tn),2,0)` aggiunge padding al numero traccia a 2 cifre",
"fr_pdel": "elimina", "fr_pdel": "elimina",
"fr_pnew": "salva come", "fr_pnew": "salva come",
"fr_pname": "fornisci un nome per il tuo nuovo preset", "fr_pname": "fornisci un nome per il tuo nuovo preset",
@ -448,7 +454,7 @@ Ls.ita = {
"mk_noname": "scrivi un nome nel campo di testo a sinistra prima di farlo :p", "mk_noname": "scrivi un nome nel campo di testo a sinistra prima di farlo :p",
"nmd_i1": "puoi anche aggiungere lestensione che vuoi, per esempio <code>.md</code>", //m "nmd_i1": "puoi anche aggiungere lestensione che vuoi, per esempio <code>.md</code>", //m
"nmd_i2": "puoi creare solo file <code>.md</code> perché non hai il permesso di eliminare", //m "nmd_i2": "puoi creare solo file <code>.{0}</code> perché non hai il permesso di eliminare", //m
"tv_load": "Caricando documento di testo:\n\n{0}\n\n{1}% ({2} di {3} MiB caricati)", "tv_load": "Caricando documento di testo:\n\n{0}\n\n{1}% ({2} di {3} MiB caricati)",
"tv_xe1": "impossibile caricare file di testo:\n\nerrore ", "tv_xe1": "impossibile caricare file di testo:\n\nerrore ",

View file

@ -114,7 +114,7 @@ Ls.jpn = {
"login": "ログイン", "login": "ログイン",
"access": " アクセス", "access": " アクセス",
"ot_close": "サブメニューを閉じる", "ot_close": "サブメニューを閉じる",
"ot_search": "属性、パス/名前、音楽タグ、またはそれらの組み合わせでファイルを検索$N$N&lt;code&gt;foo bar&lt;/code&gt; = «foo» と «bar» の両方を含める。$N&lt;code&gt;foo -bar&lt;/code&gt; = «foo» を含み、«bar» を含まない必要があります。$N&lt;code&gt;^yana .opus$&lt;/code&gt; = «yana» で始まり、«opus» ファイルである$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = «try unite» だけを含む$N$N日付形式は iso-8601。たとえば、$N&lt;code&gt;2009-12-31&lt;/code&gt; や &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`属性、パス/名前、音楽タグ、またはそれらの組み合わせでファイルを検索$N$N`foo bar` = «foo» と «bar» の両方を含める。$N`foo -bar` = «foo» を含み、«bar» を含まない必要があります。$N`^yana .opus$` = «yana» で始まり、«opus» ファイルである$N`&quot;try unite&quot;` = «try unite» だけを含む$N$N日付形式は iso-8601。たとえば、$N`2009-12-31` や `2020-09-12 23:30:00`",
"ot_unpost": "unpost: 最近アップロードした投稿を削除するか、未完成の投稿を中止", "ot_unpost": "unpost: 最近アップロードした投稿を削除するか、未完成の投稿を中止",
"ot_bup": "bup: 基本的なアップローダー。Netscape 4.0 もサポートしています。", "ot_bup": "bup: 基本的なアップローダー。Netscape 4.0 もサポートしています。",
"ot_mkdir": "mkdir: 新しいディレクトリを作成", "ot_mkdir": "mkdir: 新しいディレクトリを作成",
@ -263,9 +263,9 @@ Ls.jpn = {
"cdt_lim": "フォルダに表示するファイルの最大数", "cdt_lim": "フォルダに表示するファイルの最大数",
"cdt_ask": "一番下までスクロールしたときに$N更にファイルを読み込む代わりに$N何をするか尋ねる", "cdt_ask": "一番下までスクロールしたときに$N更にファイルを読み込む代わりに$N何をするか尋ねる",
"cdt_hsort": "メディアURLに含めるソートルール (&lt;code&gt;,sorthref&lt;/code&gt;) の数。0に設定するとメディアリンクをクリックした際にそのリンクに含まれるソートルールも無視されます。", "cdt_hsort": "`メディアURLに含めるソートルール (`,sorthref`) の数。0に設定するとメディアリンクをクリックした際にそのリンクに含まれるソートルールも無視されます。",
"cdt_ren": "カスタム右クリックメニューを有効にしてもShiftキーを押しながら右クリックすることで通常のメニューにアクセスできます。", "cdt_ren": "カスタム右クリックメニューを有効にしてもShiftキーを押しながら右クリックすることで通常のメニューにアクセスできます。\">有効",
"cdt_rdb": "カスタム右クリックメニューが開いている状態で再度右クリックしたときに通常のメニューを表示する", //m "cdt_rdb": "カスタム右クリックメニューが開いている状態で再度右クリックしたときに通常のメニューを表示する\">x2", //m
"tt_entree": "ナビペインを表示(ディレクトリツリーサイドバー)$Nホットキー: B", "tt_entree": "ナビペインを表示(ディレクトリツリーサイドバー)$Nホットキー: B",
"tt_detree": "パンくずリストを表示$Nホットキー: B", "tt_detree": "パンくずリストを表示$Nホットキー: B",
@ -283,6 +283,7 @@ Ls.jpn = {
"ml_tint": "色合い", "ml_tint": "色合い",
"ml_eq": "オーディオイコライザー", "ml_eq": "オーディオイコライザー",
"ml_drc": "ダイナミックレンジコンプレッサー", "ml_drc": "ダイナミックレンジコンプレッサー",
"ml_ss": "無音をスキップ", //m
"mt_loop": "1曲をループ/リピート再生\">🔁", "mt_loop": "1曲をループ/リピート再生\">🔁",
"mt_one": "1曲で止める\">1⃣", "mt_one": "1曲で止める\">1⃣",
@ -318,8 +319,13 @@ Ls.jpn = {
"mt_c2ng": "現在のデバイスはこの出力形式をサポートしていないようですが、とにかく試してみましょう", "mt_c2ng": "現在のデバイスはこの出力形式をサポートしていないようですが、とにかく試してみましょう",
"mt_xowa": "iOSにはこのフォーマットを使用したバックグラウンド再生を妨げるバグがあります; 代わりにcafまたはmp3を使用してください", "mt_xowa": "iOSにはこのフォーマットを使用したバックグラウンド再生を妨げるバグがあります; 代わりにcafまたはmp3を使用してください",
"mt_tint": "シークバーの背景レベル0100を調整し$Nバッファリングの邪魔にならにようにする", "mt_tint": "シークバーの背景レベル0100を調整し$Nバッファリングの邪魔にならにようにする",
"mt_eq": "イコライザーとゲイン制御を有効にします;$N$Nブースト &lt;code&gt;0&lt;/code&gt; = 標準音量100%(変更なし)$N$N幅 &lt;code&gt;1 &nbsp;&lt;/code&gt; = 標準ステレオ(変更なし)$N幅 &lt;code&gt;0.5&lt;/code&gt; = 左右のクロスフィード50%$N幅 &lt;code&gt;0 &nbsp;&lt;/code&gt; = モノラル$N$Nブースト &lt;code&gt;-0.8&lt;/code&gt; &amp; 幅 &lt;code&gt;10&lt;/code&gt; = ボーカル除去 :^)$N$Nイコライザーを有効にするとギャップレスアルバムは完全にギャップレスになります。そのため、それを気に場合すべての値をゼロ幅 = 1を除くにしてイコライザーをオンにしたままにしてください。", "mt_eq": "`イコライザーとゲイン制御を有効にします;$N$Nブースト `0` = 標準音量100%(変更なし)$N$N幅 `1 &nbsp;` = 標準ステレオ(変更なし)$N幅 `0.5` = 左右のクロスフィード50%$N幅 `0 &nbsp;` = モノラル$N$Nブースト `-0.8` &amp; 幅 `10` = ボーカル除去 :^)$N$Nイコライザーを有効にするとギャップレスアルバムは完全にギャップレスになります。そのため、それを気に場合すべての値をゼロ幅 = 1を除くにしてイコライザーをオンにしたままにしてください。",
"mt_drc": "ダイナミックレンジコンプレッサー(ボリュームフラットナー / ブリックウォーラー)を有効にします; EQでスパゲッティのバランスをとることもできます。そのため、EQのフィールドを「幅」以外すべて0に設定してください。$N$Nしきい値を超えるオーディオの音量を下げる; しきい値を超えるRATIO dBごとに1dBの出力されますしきい値-24と比率12のデフォルト値は、-22dBを超えることはなく、イコライザーのブーストを0.8に、またはATK 0とRLS 90などの非常に大きな値にした場合1.8まで安全に上げられます (Firefoxでのみ機能し、他のブラウザーではRLSは最大 1 です)。$N$NWikipedia を参照してください。もっとわかりやすく説明されています)", "mt_drc": "ダイナミックレンジコンプレッサー(ボリュームフラットナー / ブリックウォーラー)を有効にします; EQでスパゲッティのバランスをとることもできます。そのため、EQのフィールドを「幅」以外すべて0に設定してください。$N$Nしきい値を超えるオーディオの音量を下げる; しきい値を超えるRATIO dBごとに1dBの出力されますしきい値-24と比率12のデフォルト値は、-22dBを超えることはなく、イコライザーのブーストを0.8に、またはATK 0とRLS 90などの非常に大きな値にした場合1.8まで安全に上げられます (Firefoxでのみ機能し、他のブラウザーではRLSは最大 1 です)。$N$NWikipedia を参照してください。もっとわかりやすく説明されています)",
"mt_ss": "`無音スキップを有効化;音量が `音` 未満で、再生位置が最初の `始`% または最後の `終`% にある場合、開始/終了付近で再生速度を `速` 倍します", //m
"mt_ssvt": "音量しきい値 (0-255)\">音", //m
"mt_ssts": "有効しきい値 (トラック%, 開始)\">始", //m
"mt_sste": "有効しきい値 (トラック%, 終了)\">終", //m
"mt_sssm": "再生速度倍率\">速", //m
"mb_play": "再生", "mb_play": "再生",
"mm_hashplay": "このオーディオファイルを再生しますか?", "mm_hashplay": "このオーディオファイルを再生しますか?",
@ -398,8 +404,8 @@ Ls.jpn = {
"fr_case": "大文字と小文字を区別する正規表現\">case", "fr_case": "大文字と小文字を区別する正規表現\">case",
"fr_win": "Windowsで安全な名前; <code>&lt;&gt;:&quot;\\|?*</code>を日本語の全角文字に置き換える\">win", "fr_win": "Windowsで安全な名前; <code>&lt;&gt;:&quot;\\|?*</code>を日本語の全角文字に置き換える\">win",
"fr_slash": "<code>/</code>を新しいフォルダが作成されない文字に置き換える\">no /", "fr_slash": "<code>/</code>を新しいフォルダが作成されない文字に置き換える\">no /",
"fr_re": "元のファイル名に適用する正規表現検索パターン; キャプチャグループは、&lt;code&gt;(1)&lt;/code&gt; や &lt;code&gt;(2)&lt;/code&gt; のように、以下のフォーマットフィールドで参照することができるので、", "fr_re": "`元のファイル名に適用する正規表現検索パターン; キャプチャグループは、`(1)` や `(2)` のように、以下のフォーマットフィールドで参照することができるので、",
"fr_fmt": "foobar2000 を参考にしています:$N&lt;code&gt;(title)&lt;/code&gt; は曲名に置き換えられます。$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; はアーティストが空白の場合は[この]部分をスキップします。$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; はトラック番号を2桁にパディングします。", "fr_fmt": "`foobar2000 を参考にしています:$N`(title)` は曲名に置き換えられます。$N`[(artist) - ](title)` はアーティストが空白の場合は[この]部分をスキップします。$N`$lpad((tn),2,0)` はトラック番号を2桁にパディングします。",
"fr_pdel": "削除", "fr_pdel": "削除",
"fr_pnew": "名前をつけて保存", "fr_pnew": "名前をつけて保存",
"fr_pname": "新しいプリセットの名前を入力します", "fr_pname": "新しいプリセットの名前を入力します",
@ -448,7 +454,7 @@ Ls.jpn = {
"mk_noname": "それをする前に左側のテキストフィールドに名前を入力してください :p", "mk_noname": "それをする前に左側のテキストフィールドに名前を入力してください :p",
"nmd_i1": "必要なファイル拡張子も追加します。例: <code>.md</code>", "nmd_i1": "必要なファイル拡張子も追加します。例: <code>.md</code>",
"nmd_i2": "削除権限がないため、<code>.md</code> ファイルのみを作成できます", "nmd_i2": "削除権限がないため、<code>.{0}</code> ファイルのみを作成できます",
"tv_load": "テキストドキュメントの読み込み中:\n\n{0}\n\n{1}%{2} / {3} MiB ロード済み)", "tv_load": "テキストドキュメントの読み込み中:\n\n{0}\n\n{1}%{2} / {3} MiB ロード済み)",
"tv_xe1": "テキストファイルを読み込めませんでした:\n\nエラー ", "tv_xe1": "テキストファイルを読み込めませんでした:\n\nエラー ",

View file

@ -114,7 +114,7 @@ Ls.kor = {
"login": "로그인", //m "login": "로그인", //m
"access": " 액세스", "access": " 액세스",
"ot_close": "하위 메뉴 닫기", "ot_close": "하위 메뉴 닫기",
"ot_search": "속성, 경로/이름, 음악 태그 또는 이들의 조합으로 파일을 검색합니다.$N$N&lt;code&gt;foo bar&lt;/code&gt; = «foo»와 «bar»를 모두 포함해야 함,$N&lt;code&gt;foo -bar&lt;/code&gt; = «foo»는 포함하지만 «bar»는 포함하지 않아야 함,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = «yana»로 시작하고 «opus» 파일이어야 함$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = 정확히 «try unite»를 포함해야 함$N$N날짜 형식은 ISO-8601입니다. 예:$N&lt;code&gt;2009-12-31&lt;/code&gt; 또는 &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`속성, 경로/이름, 음악 태그 또는 이들의 조합으로 파일을 검색합니다.$N$N`foo bar` = «foo»와 «bar»를 모두 포함해야 함,$N`foo -bar` = «foo»는 포함하지만 «bar»는 포함하지 않아야 함,$N`^yana .opus$` = «yana»로 시작하고 «opus» 파일이어야 함$N`&quot;try unite&quot;` = 정확히 «try unite»를 포함해야 함$N$N날짜 형식은 ISO-8601입니다. 예:$N`2009-12-31` 또는 `2020-09-12 23:30:00`",
"ot_unpost": "주워담기: 최근 업로드한 항목을 삭제하거나 미완료된 업로드를 중단합니다", "ot_unpost": "주워담기: 최근 업로드한 항목을 삭제하거나 미완료된 업로드를 중단합니다",
"ot_bup": "bup: 기본 업로더. 넷스케이프 4.0도 지원합니다", "ot_bup": "bup: 기본 업로더. 넷스케이프 4.0도 지원합니다",
"ot_mkdir": "mkdir: 새 디렉터리를 만듭니다", "ot_mkdir": "mkdir: 새 디렉터리를 만듭니다",
@ -263,9 +263,9 @@ Ls.kor = {
"cdt_lim": "폴더에 표시할 최대 파일 수", "cdt_lim": "폴더에 표시할 최대 파일 수",
"cdt_ask": "맨 아래로 스크롤할 때$N더 많은 파일을 불러오는 대신$N무엇을 할지 묻기", "cdt_ask": "맨 아래로 스크롤할 때$N더 많은 파일을 불러오는 대신$N무엇을 할지 묻기",
"cdt_hsort": "미디어 URL에 포함할 정렬 규칙 (&lt;code&gt;,sorthref&lt;/code&gt;)의 수. 0으로 설정하면 미디어 링크를 클릭할 때 포함된 정렬 규칙도 무시됩니다.", "cdt_hsort": "`미디어 URL에 포함할 정렬 규칙 (`,sorthref`)의 수. 0으로 설정하면 미디어 링크를 클릭할 때 포함된 정렬 규칙도 무시됩니다.",
"cdt_ren": "사용자 지정 우클릭 메뉴를 활성화합니다. shift 키를 누른 채 우클릭하면 기본 메뉴를 사용할 수 있습니다", //m "cdt_ren": "사용자 지정 우클릭 메뉴를 활성화합니다. shift 키를 누른 채 우클릭하면 기본 메뉴를 사용할 수 있습니다\">활성화", //m
"cdt_rdb": "사용자 정의 우클릭 메뉴가 이미 열려 있을 때 다시 우클릭하면 기본 메뉴 표시", //m "cdt_rdb": "사용자 정의 우클릭 메뉴가 이미 열려 있을 때 다시 우클릭하면 기본 메뉴 표시\">x2", //m
"tt_entree": "탐색 창 (디렉터리 트리 사이드바) 표시$N단축키: B", "tt_entree": "탐색 창 (디렉터리 트리 사이드바) 표시$N단축키: B",
"tt_detree": "이동 경로 표시$N단축키: B", "tt_detree": "이동 경로 표시$N단축키: B",
@ -283,6 +283,7 @@ Ls.kor = {
"ml_tint": "틴트", "ml_tint": "틴트",
"ml_eq": "오디오 이퀄라이저", "ml_eq": "오디오 이퀄라이저",
"ml_drc": "다이내믹 레인지 압축기", "ml_drc": "다이내믹 레인지 압축기",
"ml_ss": "무음 건너뛰기", //m
"mt_loop": "한 곡 반복 재생\">🔁", "mt_loop": "한 곡 반복 재생\">🔁",
"mt_one": "한 곡 재생 후 중지\">1⃣", "mt_one": "한 곡 재생 후 중지\">1⃣",
@ -318,8 +319,13 @@ Ls.kor = {
"mt_c2ng": "기기가 이 출력 형식을 지원하지 않는 것 같지만, 시도해 보겠습니다", "mt_c2ng": "기기가 이 출력 형식을 지원하지 않는 것 같지만, 시도해 보겠습니다",
"mt_xowa": "iOS에서 이 형식의 백그라운드 재생이 안되는 버그가 있습니다. 대신 caf나 mp3를 사용해주세요.", "mt_xowa": "iOS에서 이 형식의 백그라운드 재생이 안되는 버그가 있습니다. 대신 caf나 mp3를 사용해주세요.",
"mt_tint": "탐색 바의 배경 레벨 (0-100)$N버퍼링이 덜 눈시리게 만듦", "mt_tint": "탐색 바의 배경 레벨 (0-100)$N버퍼링이 덜 눈시리게 만듦",
"mt_eq": "이퀄라이저 및 게인 제어 활성화;$N$Nboost &lt;code&gt;0&lt;/code&gt; = 표준 100% 볼륨 (수정 없음)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = 표준 스테레오 (수정 없음)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% 좌우 크로스피드$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = 모노$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = 보컬 제거 :^)$N$N이퀄라이저를 활성화하면 끊김 없는 앨범이 온전히 끊김 없이 재생되므로, 그 점이 중요하다면 모든 값을 0으로 두고 (width=1 제외) 켜두세요.", "mt_eq": "`이퀄라이저 및 게인 제어 활성화;$N$Nboost `0` = 표준 100% 볼륨 (수정 없음)$N$Nwidth `1 &nbsp;` = 표준 스테레오 (수정 없음)$Nwidth `0.5` = 50% 좌우 크로스피드$Nwidth `0 &nbsp;` = 모노$N$Nboost `-0.8` &amp; width `10` = 보컬 제거 :^)$N$N이퀄라이저를 활성화하면 끊김 없는 앨범이 온전히 끊김 없이 재생되므로, 그 점이 중요하다면 모든 값을 0으로 두고 (width=1 제외) 켜두세요.",
"mt_drc": "다이내믹 레인지 컴프레서(볼륨 평탄화/벽돌화)를 활성화합니다. 스파게티의 균형을 맞추기 위해 EQ도 활성화되므로, 원하지 않으면 'width'를 제외한 모든 EQ 필드를 0으로 설정하세요.$N$NTHRESHOLD dB 이상의 오디오 볼륨을 낮춥니다. THRESHOLD를 초과하는 모든 RATIO dB에 대해 1dB의 출력이 있으므로, 기본값인 tresh -24 및 ratio 12는 볼륨이 -22dB보다 커지지 않음을 의미하며, 이퀄라이저 부스트를 0.8 또는 ATK 0과 큰 RLS (예: 90)를 사용하여 1.8까지 안전하게 높일 수 있습니다 (firefox에서만 작동, 다른 브라우저에서는 RLS 최대 1).$N$N(위키백과를 참조하세요, 훨씬 더 잘 설명되어 있습니다)", "mt_drc": "다이내믹 레인지 컴프레서(볼륨 평탄화/벽돌화)를 활성화합니다. 스파게티의 균형을 맞추기 위해 EQ도 활성화되므로, 원하지 않으면 'width'를 제외한 모든 EQ 필드를 0으로 설정하세요.$N$NTHRESHOLD dB 이상의 오디오 볼륨을 낮춥니다. THRESHOLD를 초과하는 모든 RATIO dB에 대해 1dB의 출력이 있으므로, 기본값인 tresh -24 및 ratio 12는 볼륨이 -22dB보다 커지지 않음을 의미하며, 이퀄라이저 부스트를 0.8 또는 ATK 0과 큰 RLS (예: 90)를 사용하여 1.8까지 안전하게 높일 수 있습니다 (firefox에서만 작동, 다른 브라우저에서는 RLS 최대 1).$N$N(위키백과를 참조하세요, 훨씬 더 잘 설명되어 있습니다)",
"mt_ss": "`무음 건너뛰기 활성화; 볼륨이 `음` 미만이고 위치가 처음 `시`% 또는 마지막 `끝`% 이내일 때 시작/끝 근처에서 재생 속도를 `고` 배로 합니다", //m
"mt_ssvt": "볼륨 임계값 (0-255)\">음", //m
"mt_ssts": "활성 임계값 (% 트랙, 시작)\">시", //m
"mt_sste": "활성 임계값 (% 트랙, 끝)\">끝", //m
"mt_sssm": "재생 속도 배율\">고", //m
"mb_play": "재생", "mb_play": "재생",
"mm_hashplay": "이 오디오 파일을 재생할까요?", "mm_hashplay": "이 오디오 파일을 재생할까요?",
@ -398,8 +404,8 @@ Ls.kor = {
"fr_case": "대소문자 구분 정규식\">대소문자", "fr_case": "대소문자 구분 정규식\">대소문자",
"fr_win": "Windows 안전 이름; <code>&lt;&gt;:&quot;\\|?*</code>를 일본어 전각 문자로 바꿉니다\">win", "fr_win": "Windows 안전 이름; <code>&lt;&gt;:&quot;\\|?*</code>를 일본어 전각 문자로 바꿉니다\">win",
"fr_slash": "<code>/</code>를 새 폴더를 만들지 않는 문자로 바꿉니다\">/ 없음", "fr_slash": "<code>/</code>를 새 폴더를 만들지 않는 문자로 바꿉니다\">/ 없음",
"fr_re": "원본 파일 이름에 적용할 정규식 검색 패턴; 캡처링 그룹은 아래 형식 필드에서 &lt;code&gt;(1)&lt;/code&gt;, &lt;code&gt;(2)&lt;/code&gt; 등으로 참조할 수 있습니다", "fr_re": "`원본 파일 이름에 적용할 정규식 검색 패턴; 캡처링 그룹은 아래 형식 필드에서 `(1)`, `(2)` 등으로 참조할 수 있습니다",
"fr_fmt": "foobar2000에서 영감을 받음:$N&lt;code&gt;(title)&lt;/code&gt;은(는) 곡 제목으로 대체됨,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt;은(는) 아티스트가 비어 있으면 [이] 부분을 건너뜀$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt;은(는) 트랙 번호를 2자리로 채움", "fr_fmt": "`foobar2000에서 영감을 받음:$N`(title)`은(는) 곡 제목으로 대체됨,$N`[(artist) - ](title)`은(는) 아티스트가 비어 있으면 [이] 부분을 건너뜀$N`$lpad((tn),2,0)`은(는) 트랙 번호를 2자리로 채움",
"fr_pdel": "삭제", "fr_pdel": "삭제",
"fr_pnew": "다른 이름으로 저장", "fr_pnew": "다른 이름으로 저장",
"fr_pname": "새 프리셋의 이름을 입력하세요", "fr_pname": "새 프리셋의 이름을 입력하세요",
@ -448,7 +454,7 @@ Ls.kor = {
"mk_noname": "왼쪽 텍스트 필드에 이름을 먼저 입력해주세요 :p", "mk_noname": "왼쪽 텍스트 필드에 이름을 먼저 입력해주세요 :p",
"nmd_i1": "원하는 파일 확장자를 추가할 수 있습니다. 예: <code>.md</code>", //m "nmd_i1": "원하는 파일 확장자를 추가할 수 있습니다. 예: <code>.md</code>", //m
"nmd_i2": "삭제 권한이 없어서 <code>.md</code> 파일만 만들 수 있습니다", //m "nmd_i2": "삭제 권한이 없어서 <code>.{0}</code> 파일만 만들 수 있습니다", //m
"tv_load": "텍스트 문서 불러오는 중:\n\n{0}\n\n{1}% ({3} MiB 중 {2} MiB 로드됨)", "tv_load": "텍스트 문서 불러오는 중:\n\n{0}\n\n{1}% ({3} MiB 중 {2} MiB 로드됨)",
"tv_xe1": "텍스트 파일을 불러올 수 없습니다:\n\n오류 ", "tv_xe1": "텍스트 파일을 불러올 수 없습니다:\n\n오류 ",

View file

@ -114,7 +114,7 @@ Ls.nld = {
"login": "Inloggen", //m "login": "Inloggen", //m
"access": " Toegang", "access": " Toegang",
"ot_close": "Sluit onder-menu", "ot_close": "Sluit onder-menu",
"ot_search": "Zoek voor bestanden bij attributes, pad / naam, muziek tags, of elk andere combinatie tussen$N$N&lt;code&gt;foo bar&lt;/code&gt; = moet beide «foo» en «bar» bevatten,$N&lt;code&gt;foo -bar&lt;/code&gt; = moet «foo» bevatten maar geen «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = start met «yana» en moet een «opus» bestand zijn$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = moet precies «try unite» bevatten$N$Nde datum formaat is iso-8601, zoals$N&lt;code&gt;2009-12-31&lt;/code&gt; of &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`Zoek voor bestanden bij attributes, pad / naam, muziek tags, of elk andere combinatie tussen$N$N`foo bar` = moet beide «foo» en «bar» bevatten,$N`foo -bar` = moet «foo» bevatten maar geen «bar»,$N`^yana .opus$` = start met «yana» en moet een «opus» bestand zijn$N`&quot;try unite&quot;` = moet precies «try unite» bevatten$N$Nde datum formaat is iso-8601, zoals$N`2009-12-31` of `2020-09-12 23:30:00`",
"ot_unpost": "unpost: verwijder je recente uploads, of onvoltooide uploads afbreken", "ot_unpost": "unpost: verwijder je recente uploads, of onvoltooide uploads afbreken",
"ot_bup": "bup: Basisuploader, supports zelfs netscape 4.0", "ot_bup": "bup: Basisuploader, supports zelfs netscape 4.0",
"ot_mkdir": "mkdir: Maak een nieuwe map", "ot_mkdir": "mkdir: Maak een nieuwe map",
@ -263,9 +263,9 @@ Ls.nld = {
"cdt_lim": "Max aantal bestanden laten zien in een map", "cdt_lim": "Max aantal bestanden laten zien in een map",
"cdt_ask": "Als helemaal naar beneden gescrolld bent,$Nin plaats van meer inladen,$Nvraag wat het moet doen", "cdt_ask": "Als helemaal naar beneden gescrolld bent,$Nin plaats van meer inladen,$Nvraag wat het moet doen",
"cdt_hsort": "Hoeveel sorteerregels (&lt;code&gt;,sorthref&lt;/code&gt;) moeten er in media-URL's worden opgenomen? Als je dit op 0 instelt, worden de sorteerregels in medialinks ook genegeerd wanneer erop geklikt word.", "cdt_hsort": "`Hoeveel sorteerregels (`,sorthref`) moeten er in media-URL's worden opgenomen? Als je dit op 0 instelt, worden de sorteerregels in medialinks ook genegeerd wanneer erop geklikt word.",
"cdt_ren": "Aangepast rechtermuisknopmenu inschakelen, het normale menu blijft beschikbaar met shift + rechtermuisknop", //m "cdt_ren": "Aangepast rechtermuisknopmenu inschakelen, het normale menu blijft beschikbaar met shift + rechtermuisknop\">inschakelen", //m
"cdt_rdb": "toon het normale rechtermuisknopmenu wanneer het aangepaste al open is en opnieuw wordt geklikt", //m "cdt_rdb": "toon het normale rechtermuisknopmenu wanneer het aangepaste al open is en opnieuw wordt geklikt\">x2", //m
"tt_entree": "Laat navpane zien (directoryboom zijbalk)$NHotkey: B", "tt_entree": "Laat navpane zien (directoryboom zijbalk)$NHotkey: B",
"tt_detree": "Laat breadcrumbs zien$NHotkey: B", "tt_detree": "Laat breadcrumbs zien$NHotkey: B",
@ -283,6 +283,7 @@ Ls.nld = {
"ml_tint": "Tint", "ml_tint": "Tint",
"ml_eq": "Audio-equalizer", "ml_eq": "Audio-equalizer",
"ml_drc": "Dynamisch bereikcompressor", "ml_drc": "Dynamisch bereikcompressor",
"ml_ss": "Stiltes overslaan", //m
"mt_loop": "Loop/herhaal een nummer\">🔁", "mt_loop": "Loop/herhaal een nummer\">🔁",
"mt_one": "Stop na een nummer\">1⃣", "mt_one": "Stop na een nummer\">1⃣",
@ -318,8 +319,13 @@ Ls.nld = {
"mt_c2ng": "Uw apparaat lijkt dit uitvoerformaat niet te ondersteunen, maar we gaan het toch proberen", "mt_c2ng": "Uw apparaat lijkt dit uitvoerformaat niet te ondersteunen, maar we gaan het toch proberen",
"mt_xowa": "iOS bevat bugs waardoor dit formaat niet op de achtergrond kan worden afgespeeld; gebruik in plaats daarvan caf of mp3.", "mt_xowa": "iOS bevat bugs waardoor dit formaat niet op de achtergrond kan worden afgespeeld; gebruik in plaats daarvan caf of mp3.",
"mt_tint": "Achtergrond helderheid (0-100) op de zoekbalk om bufferen minder storend te maken", "mt_tint": "Achtergrond helderheid (0-100) op de zoekbalk om bufferen minder storend te maken",
"mt_eq": "Schakelt de equalizer en gain-control in;$N$Nboost &lt;code&gt;0&lt;/code&gt; = standaard 100% volume (ongeweijzigd)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = standaard stereo (ongeweijzigd)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% links-rechts crossfeed$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = stemverwijdering :^)$N$NDoor de equalizer in te schakelen, worden gapless albums volledig gapless. Laat hem dus aanstaan met alle waarden op nul (behalve width = 1) als je dat belangrijk vindt.", "mt_eq": "`Schakelt de equalizer en gain-control in;$N$Nboost `0` = standaard 100% volume (ongeweijzigd)$N$Nwidth `1 &nbsp;` = standaard stereo (ongeweijzigd)$Nwidth `0.5` = 50% links-rechts crossfeed$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = stemverwijdering :^)$N$NDoor de equalizer in te schakelen, worden gapless albums volledig gapless. Laat hem dus aanstaan met alle waarden op nul (behalve width = 1) als je dat belangrijk vindt.",
"mt_drc": "Schakelt de dynamic range compressor in (volume flattener / brickwaller); schakelt ook EQ in om de spaghetti te balanceren, dus zet alle EQ velden behalve width op 0 als je dat niet wilt.$N$Nverlaagt het volume van audio boven THRESHOLD dB; voor elke RATIO dB voorbij THRESHOLD is er 1 dB output, dus standaardwaarden van tresh -24 en ratio 12 betekenen dat het nooit luider dan -22 dB zou moeten worden en het is veilig om de equalizer boost te verhogen tot 0.8, of zelfs 1.8 met ATK 0 en een enorme RLS zoals 90 (werkt alleen in firefox; RLS is max 1 in andere browsers)$N$N(zie wikipedia, die legt het veel beter uit)", "mt_drc": "Schakelt de dynamic range compressor in (volume flattener / brickwaller); schakelt ook EQ in om de spaghetti te balanceren, dus zet alle EQ velden behalve width op 0 als je dat niet wilt.$N$Nverlaagt het volume van audio boven THRESHOLD dB; voor elke RATIO dB voorbij THRESHOLD is er 1 dB output, dus standaardwaarden van tresh -24 en ratio 12 betekenen dat het nooit luider dan -22 dB zou moeten worden en het is veilig om de equalizer boost te verhogen tot 0.8, of zelfs 1.8 met ATK 0 en een enorme RLS zoals 90 (werkt alleen in firefox; RLS is max 1 in andere browsers)$N$N(zie wikipedia, die legt het veel beter uit)",
"mt_ss": "`Schakelt stilte-overslaan in; vermenigvuldigt afspeelsnelheid met `vrs` nabij begin/einde wanneer volume onder `vol` is en positie binnen de eerste `beg`% of laatste `eind`%", //m
"mt_ssvt": "Volumedrempel (0-255)\">vol", //m
"mt_ssts": "Actieve drempel (% track, begin)\">beg", //m
"mt_sste": "Actieve drempel (% track, einde)\">eind", //m
"mt_sssm": "Vermenigvuldiger afspeelsnelheid\">vrs", //m
"mb_play": "Afspelen", "mb_play": "Afspelen",
"mm_hashplay": "Deze audio bestand afspelen?", "mm_hashplay": "Deze audio bestand afspelen?",
@ -398,8 +404,8 @@ Ls.nld = {
"fr_case": "Hoofdlettergevoelige regex\">case", "fr_case": "Hoofdlettergevoelige regex\">case",
"fr_win": "Windows-veilige namen; vervangen <code>&lt;&gt;:&quot;\\|?*</code> met japanse tekens over de volledige breedte\">win", "fr_win": "Windows-veilige namen; vervangen <code>&lt;&gt;:&quot;\\|?*</code> met japanse tekens over de volledige breedte\">win",
"fr_slash": "Vervang <code>/</code> met een teken waardoor er geen nieuwe mappen worden gemaakt\">geen /", "fr_slash": "Vervang <code>/</code> met een teken waardoor er geen nieuwe mappen worden gemaakt\">geen /",
"fr_re": "Regex zoekpatroon om toe te passen op originele bestandsnamen; naar capturing groups kan worden verwezen in het onderstaande opmaakveld zoals &lt;code&gt;(1)&lt;/code&gt; en &lt;code&gt;(2)&lt;/code&gt; enzovoort", "fr_re": "`Regex zoekpatroon om toe te passen op originele bestandsnamen; naar capturing groups kan worden verwezen in het onderstaande opmaakveld zoals `(1)` en `(2)` enzovoort",
"fr_fmt": "Geïnspireerd door foobar2000 :$N&lt;code&gt;(titel)&lt;/code&gt; wordt vervangen door de titel van het nummer,$N&lt;code&gt;[(artiest) - ](titel)&lt;/code&gt; sla [dit] gedeelte over als artiest leeg is$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; vult tracknummer op tot 2 cijfers (0X)", "fr_fmt": "`Geïnspireerd door foobar2000 :$N`(titel)` wordt vervangen door de titel van het nummer,$N`[(artiest) - ](titel)` sla [dit] gedeelte over als artiest leeg is$N`$lpad((tn),2,0)` vult tracknummer op tot 2 cijfers (0X)",
"fr_pdel": "Verwijderen", "fr_pdel": "Verwijderen",
"fr_pnew": "Opslaan als", "fr_pnew": "Opslaan als",
"fr_pname": "Geef een naam op voor je nieuwe preset", "fr_pname": "Geef een naam op voor je nieuwe preset",
@ -448,7 +454,7 @@ Ls.nld = {
"mk_noname": "Voer een naam in het tekstveld aan de linkerkant voordat je verder gaat :p", "mk_noname": "Voer een naam in het tekstveld aan de linkerkant voordat je verder gaat :p",
"nmd_i1": "Voeg ook de gewenste extensie toe, bijvoorbeeld <code>.md</code>", //m "nmd_i1": "Voeg ook de gewenste extensie toe, bijvoorbeeld <code>.md</code>", //m
"nmd_i2": "Je kunt alleen <code>.md</code>-bestanden maken omdat je geen verwijderrechten hebt", //m "nmd_i2": "Je kunt alleen <code>.{0}</code>-bestanden maken omdat je geen verwijderrechten hebt", //m
"tv_load": "Tekstdocument laden:\n\n{0}\n\n{1}% ({2} van de {3} MiB geladen)", "tv_load": "Tekstdocument laden:\n\n{0}\n\n{1}% ({2} van de {3} MiB geladen)",
"tv_xe1": "Kon tekstbestand niet laden:\n\nfout ", "tv_xe1": "Kon tekstbestand niet laden:\n\nfout ",

View file

@ -111,7 +111,7 @@ Ls.nno = {
"login": "Logg inn", "login": "Logg inn",
"access": " åtgang", "access": " åtgang",
"ot_close": "lukk reiskap", "ot_close": "lukk reiskap",
"ot_search": "søk etter filer ved å angje filnamn, mappenamn, tid, storleik, eller metadata som songtittel / artist / osv.$N$N&lt;code&gt;foo bar&lt;/code&gt; = inneheld båe «foo» og «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = innehold «foo» men ikkje «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = startar med «yana», filtype «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = «try unite» eksakt$N$Ndatoformat er iso-8601, så f.eks.$N&lt;code&gt;2009-12-31&lt;/code&gt; eller &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`søk etter filer ved å angje filnamn, mappenamn, tid, storleik, eller metadata som songtittel / artist / osv.$N$N`foo bar` = inneheld båe «foo» og «bar»,$N`foo -bar` = innehold «foo» men ikkje «bar»,$N`^yana .opus$` = startar med «yana», filtype «opus»$N`&quot;try unite&quot;` = «try unite» eksakt$N$Ndatoformat er iso-8601, så f.eks.$N`2009-12-31` eller `2020-09-12 23:30:00`",
"ot_unpost": "unpost: slett filer som du nyleg har lastet opp; «angre-knappen»", "ot_unpost": "unpost: slett filer som du nyleg har lastet opp; «angre-knappen»",
"ot_bup": "bup: tradisjonell / primitiv filopplasting,$N$Nfungerar i om lag samtlege nettlesarar", "ot_bup": "bup: tradisjonell / primitiv filopplasting,$N$Nfungerar i om lag samtlege nettlesarar",
"ot_mkdir": "mkdir: lag ei ny mappe", "ot_mkdir": "mkdir: lag ei ny mappe",
@ -260,9 +260,9 @@ Ls.nno = {
"cdt_lim": "maks mengd filer å vise per mappe", "cdt_lim": "maks mengd filer å vise per mappe",
"cdt_ask": "vis knappar for å laste fleire filer nederst på sida i staden for å gradvis laste meir av mappea når man scroller ned", "cdt_ask": "vis knappar for å laste fleire filer nederst på sida i staden for å gradvis laste meir av mappea når man scroller ned",
"cdt_hsort": "antall sorteringsreglar (&lt;code&gt;,sorthref&lt;/code&gt;) som skal inkluderast når media-URL'ar genererast. Dersom denne er 0 så vil sorteringsreglar i URL'ar korkje bli generert eller lest", "cdt_hsort": "`antall sorteringsreglar (`,sorthref`) som skal inkluderast når media-URL'ar genererast. Dersom denne er 0 så vil sorteringsreglar i URL'ar korkje bli generert eller lest",
"cdt_ren": "slå på tilpassa høgreklikkmeny (den vanlege menyen er tilgjengeleg med shift + høgreklikk)", "cdt_ren": "slå på tilpassa høgreklikkmeny (den vanlege menyen er tilgjengeleg med shift + høgreklikk)\">aktiv",
"cdt_rdb": "høgreklikk to gonger for å vise den vanlege høgreklikkmenyen", "cdt_rdb": "høgreklikk to gonger for å vise den vanlege høgreklikkmenyen\">x2",
"tt_entree": "bytt åt mappehierarki$NSnarvei: B", "tt_entree": "bytt åt mappehierarki$NSnarvei: B",
"tt_detree": "bytt åt tradisjonell stivising$NSnarvei: B", "tt_detree": "bytt åt tradisjonell stivising$NSnarvei: B",
@ -280,6 +280,7 @@ Ls.nno = {
"ml_tint": "tint", "ml_tint": "tint",
"ml_eq": "audio equalizer (tonejustering)", "ml_eq": "audio equalizer (tonejustering)",
"ml_drc": "compressor (volumutjevning)", "ml_drc": "compressor (volumutjevning)",
"ml_ss": "spol forbi stillheit",
"mt_loop": "spel den same songen om og om igjen\">🔁", "mt_loop": "spel den same songen om og om igjen\">🔁",
"mt_one": "spel kun éin song\">1⃣", "mt_one": "spel kun éin song\">1⃣",
@ -315,8 +316,13 @@ Ls.nno = {
"mt_c2ng": "ser verkelig ikkje ut som enheiten din taklar dette formatet... men ok, vi prøver", "mt_c2ng": "ser verkelig ikkje ut som enheiten din taklar dette formatet... men ok, vi prøver",
"mt_xowa": "iOS har fortsatt problem med avspeling av owa-musikk i bakgrunnen. Bruk caf eller mp3 i staden for", "mt_xowa": "iOS har fortsatt problem med avspeling av owa-musikk i bakgrunnen. Bruk caf eller mp3 i staden for",
"mt_tint": "nivå av bakgrunnsfarge på søkestripa (0-100),$Ngjer oppdateringer mindre distraherande", "mt_tint": "nivå av bakgrunnsfarge på søkestripa (0-100),$Ngjer oppdateringer mindre distraherande",
"mt_eq": "aktivér tonekontroll og forsterker;$N$Nboost &lt;code&gt;0&lt;/code&gt; = normal volumskala$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = normal stereo$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% blanding venstre-høgre$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = instrumental :^)$N$Nreduserer óg daudtid mellom songfiler", "mt_eq": "`aktivér tonekontroll og forsterker;$N$Nboost `0` = normal volumskala$N$Nwidth `1 &nbsp;` = normal stereo$Nwidth `0.5` = 50% blanding venstre-høgre$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = instrumental :^)$N$Nreduserer óg daudtid mellom songfiler",
"mt_drc": "aktivér volum-utjevning (dynamic range compressor); vil óg aktivere tonejustering, så sett alle EQ-feltene bortsett frå 'width' åt 0 viss du ikkje vil ha nokon EQ$N$Nfilteret vil dempe volumet på alt som er høgare enn TRESH dB; for kvar RATIO dB over grensa er det 1dB som treff høgtalarane, så standardverdiane tresh -24 og ratio 12 skal bety at volumet ikkje gjeng høgare enn -22 dB, slik at ein trygt kan øke boost-verdien i equalizeren åt rundt 0.8, eller 1.8 kombinert med ATK 0 og RLS 90 (berre mulig i firefox; andre nettlesarar tek ikkje høgare RLS enn 1)$N$Nwikipedia forklarar dette mykje betre forresten", "mt_drc": "aktivér volum-utjevning (dynamic range compressor); vil óg aktivere tonejustering, så sett alle EQ-feltene bortsett frå 'width' åt 0 viss du ikkje vil ha nokon EQ$N$Nfilteret vil dempe volumet på alt som er høgare enn TRESH dB; for kvar RATIO dB over grensa er det 1dB som treff høgtalarane, så standardverdiane tresh -24 og ratio 12 skal bety at volumet ikkje gjeng høgare enn -22 dB, slik at ein trygt kan øke boost-verdien i equalizeren åt rundt 0.8, eller 1.8 kombinert med ATK 0 og RLS 90 (berre mulig i firefox; andre nettlesarar tek ikkje høgare RLS enn 1)$N$Nwikipedia forklarar dette mykje betre forresten",
"mt_ss": "`spolar forbi stille parti i songar; spelar `ffwd` gongar raskare nær starten/slutten av songen når volumet er under `volum` og posisjonen er innanfor dei første `start`% eller dei siste `slutt`% av songen",
"mt_ssvt": "volumterskel (0-255)\">volum",
"mt_ssts": "aktiv innanfor første % av songen\">start",
"mt_sste": "aktiv innanfor siste % av songen\">slutt",
"mt_sssm": "avspelingshastigheitsmultiplikator\">ffwd",
"mb_play": "lytt", "mb_play": "lytt",
"mm_hashplay": "spel denne songen?", "mm_hashplay": "spel denne songen?",
@ -395,8 +401,8 @@ Ls.nno = {
"fr_case": "versalfølsomme uttrykk\">Aa", "fr_case": "versalfølsomme uttrykk\">Aa",
"fr_win": "bytt ut bokstavane <code>&lt;&gt;:&quot;\\|?*</code> med$Ntilsvarande som windows ikkje får panikk av\">win", "fr_win": "bytt ut bokstavane <code>&lt;&gt;:&quot;\\|?*</code> med$Ntilsvarande som windows ikkje får panikk av\">win",
"fr_slash": "bytt ut bokstaven <code>/</code> slik at den ikkje forårsakar at nye mapper opprettes\">ikke /", "fr_slash": "bytt ut bokstaven <code>/</code> slik at den ikkje forårsakar at nye mapper opprettes\">ikke /",
"fr_re": "regex-mønster som køyrast på kvart filnamn. Grupper kan leses ut i format-feltet nedanfor, f.eks. &lt;code&gt;(1)&lt;/code&gt; og &lt;code&gt;(2)&lt;/code&gt; osv.", "fr_re": "`regex-mønster som køyrast på kvart filnamn. Grupper kan leses ut i format-feltet nedanfor, f.eks. `(1)` og `(2)` osv.",
"fr_fmt": "inspirert av foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; byttast ut med songtittel,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; dropper [dette] viss artist er blank$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; visar songnr. med 2 siffer", "fr_fmt": "`inspirert av foobar2000:$N`(title)` byttast ut med songtittel,$N`[(artist) - ](title)` dropper [dette] viss artist er blank$N`$lpad((tn),2,0)` visar songnr. med 2 siffer",
"fr_pdel": "slett", "fr_pdel": "slett",
"fr_pnew": "lagre som", "fr_pnew": "lagre som",
"fr_pname": "gje innstillingane dine eit namn", "fr_pname": "gje innstillingane dine eit namn",
@ -444,8 +450,8 @@ Ls.nno = {
"fcp_both_b": '<a href="#" id="modal-ok">Kopiér</a><a href="#" id="modal-ng">Last opp</a>', "fcp_both_b": '<a href="#" id="modal-ok">Kopiér</a><a href="#" id="modal-ng">Last opp</a>',
"mk_noname": "skriv inn eit namn i tekstboksa åt venstre først :p", "mk_noname": "skriv inn eit namn i tekstboksa åt venstre først :p",
"nmd_i1": "leggja også til filendinga du vil, til dømes <code>.md</code>", //m "nmd_i1": "leggja også til filendinga du vil, til dømes <code>.md</code>",
"nmd_i2": "du kan berre laga <code>.md</code>-filer fordi du ikkje har delete-tilgang", //m "nmd_i2": "du kan berre laga <code>.{0}</code>-filer fordi du ikkje har delete-tilgang",
"tv_load": "Lastar inn tekstfil:\n\n{0}\n\n{1}% ({2} av {3} MiB lasta ned)", "tv_load": "Lastar inn tekstfil:\n\n{0}\n\n{1}% ({2} av {3} MiB lasta ned)",
"tv_xe1": "kunne ikkje laste tekstfil:\n\nfeil ", "tv_xe1": "kunne ikkje laste tekstfil:\n\nfeil ",

View file

@ -111,7 +111,7 @@ Ls.nor = {
"login": "Logg inn", "login": "Logg inn",
"access": " tilgang", "access": " tilgang",
"ot_close": "lukk verktøy", "ot_close": "lukk verktøy",
"ot_search": "søk etter filer ved å angi filnavn, mappenavn, tid, størrelse, eller metadata som sangtittel / artist / osv.$N$N&lt;code&gt;foo bar&lt;/code&gt; = inneholder både «foo» og «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = inneholder «foo» men ikke «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = starter med «yana», filtype «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = «try unite» eksakt$N$Ndatoformat er iso-8601, så f.eks.$N&lt;code&gt;2009-12-31&lt;/code&gt; eller &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`søk etter filer ved å angi filnavn, mappenavn, tid, størrelse, eller metadata som sangtittel / artist / osv.$N$N`foo bar` = inneholder både «foo» og «bar»,$N`foo -bar` = inneholder «foo» men ikke «bar»,$N`^yana .opus$` = starter med «yana», filtype «opus»$N`&quot;try unite&quot;` = «try unite» eksakt$N$Ndatoformat er iso-8601, så f.eks.$N`2009-12-31` eller `2020-09-12 23:30:00`",
"ot_unpost": "unpost: slett filer som du nylig har lastet opp; «angre-knappen»", "ot_unpost": "unpost: slett filer som du nylig har lastet opp; «angre-knappen»",
"ot_bup": "bup: tradisjonell / primitiv filopplastning,$N$Nfungerer i omtrent samtlige nettlesere", "ot_bup": "bup: tradisjonell / primitiv filopplastning,$N$Nfungerer i omtrent samtlige nettlesere",
"ot_mkdir": "mkdir: lag en ny mappe", "ot_mkdir": "mkdir: lag en ny mappe",
@ -260,9 +260,9 @@ Ls.nor = {
"cdt_lim": "maks antall filer å vise per mappe", "cdt_lim": "maks antall filer å vise per mappe",
"cdt_ask": "vis knapper for å laste flere filer nederst på siden istedenfor å gradvis laste mer av mappen når man scroller ned", "cdt_ask": "vis knapper for å laste flere filer nederst på siden istedenfor å gradvis laste mer av mappen når man scroller ned",
"cdt_hsort": "antall sorterings-regler (&lt;code&gt;,sorthref&lt;/code&gt;) som skal inkluderes når media-URL'er genereres. Hvis denne er 0 så vil sorterings-regler i URL'er hverken bli generert eller lest", "cdt_hsort": "`antall sorterings-regler (`,sorthref`) som skal inkluderes når media-URL'er genereres. Hvis denne er 0 så vil sorterings-regler i URL'er hverken bli generert eller lest",
"cdt_ren": "bruk egendefinert høyreklikkmeny (den vanlige menyen er tilgjengelig med shift + høyreklikk)", "cdt_ren": "bruk egendefinert høyreklikkmeny (den vanlige menyen er tilgjengelig med shift + høyreklikk)\">aktiv",
"cdt_rdb": "høyreklikk to ganger for å vise den vanlige høyreklikkmenyen", "cdt_rdb": "høyreklikk to ganger for å vise den vanlige høyreklikkmenyen\">x2",
"tt_entree": "bytt til mappehierarki$NSnarvei: B", "tt_entree": "bytt til mappehierarki$NSnarvei: B",
"tt_detree": "bytt til tradisjonell sti-visning$NSnarvei: B", "tt_detree": "bytt til tradisjonell sti-visning$NSnarvei: B",
@ -280,6 +280,7 @@ Ls.nor = {
"ml_tint": "tint", "ml_tint": "tint",
"ml_eq": "audio equalizer (tonejustering)", "ml_eq": "audio equalizer (tonejustering)",
"ml_drc": "compressor (volum-utjevning)", "ml_drc": "compressor (volum-utjevning)",
"ml_ss": "spol forbi stillhet",
"mt_loop": "spill den samme sangen om og om igjen\">🔁", "mt_loop": "spill den samme sangen om og om igjen\">🔁",
"mt_one": "spill kun én sang\">1⃣", "mt_one": "spill kun én sang\">1⃣",
@ -315,8 +316,13 @@ Ls.nor = {
"mt_c2ng": "ser virkelig ikke ut som enheten din takler dette formatet... men ok, vi prøver", "mt_c2ng": "ser virkelig ikke ut som enheten din takler dette formatet... men ok, vi prøver",
"mt_xowa": "iOS har fortsatt problemer med avspilling av owa-musikk i bakgrunnen. Bruk caf eller mp3 istedenfor", "mt_xowa": "iOS har fortsatt problemer med avspilling av owa-musikk i bakgrunnen. Bruk caf eller mp3 istedenfor",
"mt_tint": "nivå av bakgrunnsfarge på søkestripa (0-100),$Ngjør oppdateringer mindre distraherende", "mt_tint": "nivå av bakgrunnsfarge på søkestripa (0-100),$Ngjør oppdateringer mindre distraherende",
"mt_eq": "aktiver tonekontroll og forsterker;$N$Nboost &lt;code&gt;0&lt;/code&gt; = normal volumskala$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = normal stereo$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% blanding venstre-høyre$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = instrumental :^)$N$Nreduserer også dødtid imellom sangfiler", "mt_eq": "`aktiver tonekontroll og forsterker;$N$Nboost `0` = normal volumskala$N$Nwidth `1 &nbsp;` = normal stereo$Nwidth `0.5` = 50% blanding venstre-høyre$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = instrumental :^)$N$Nreduserer også dødtid imellom sangfiler",
"mt_drc": "aktiver volum-utjevning (dynamic range compressor); vil også aktivere tonejustering, så sett alle EQ-feltene bortsett fra 'width' til 0 hvis du ikke vil ha noe EQ$N$Nfilteret vil dempe volumet på alt som er høyere enn TRESH dB; for hver RATIO dB over grensen er det 1dB som treffer høyttalerne, så standardverdiene tresh -24 og ratio 12 skal bety at volumet ikke går høyere enn -22 dB, slik at man trygt kan øke boost-verdien i equalizer'n til rundt 0.8, eller 1.8 kombinert med ATK 0 og RLS 90 (bare mulig i firefox; andre nettlesere tar ikke høyere RLS enn 1)$N$Nwikipedia forklarer dette mye bedre forresten", "mt_drc": "aktiver volum-utjevning (dynamic range compressor); vil også aktivere tonejustering, så sett alle EQ-feltene bortsett fra 'width' til 0 hvis du ikke vil ha noe EQ$N$Nfilteret vil dempe volumet på alt som er høyere enn TRESH dB; for hver RATIO dB over grensen er det 1dB som treffer høyttalerne, så standardverdiene tresh -24 og ratio 12 skal bety at volumet ikke går høyere enn -22 dB, slik at man trygt kan øke boost-verdien i equalizer'n til rundt 0.8, eller 1.8 kombinert med ATK 0 og RLS 90 (bare mulig i firefox; andre nettlesere tar ikke høyere RLS enn 1)$N$Nwikipedia forklarer dette mye bedre forresten",
"mt_ss": "`spoler forbi stillhet i sanger; spiller `ffwd` ganger raskere nær start/slutt av sangen når volum er under `vol` og posisjonen er innenfor de første `start`% eller siste `slutt`% av sangen",
"mt_ssvt": "volumterskel (0-255)\">volum",
"mt_ssts": "aktiv innenfor første % av sangen\">start",
"mt_sste": "aktiv innenfor siste % av sangen\">slutt",
"mt_sssm": "avspillingshastighetsmultiplikator\">ffwd",
"mb_play": "lytt", "mb_play": "lytt",
"mm_hashplay": "spill denne sangen?", "mm_hashplay": "spill denne sangen?",
@ -395,8 +401,8 @@ Ls.nor = {
"fr_case": "versalfølsomme uttrykk\">Aa", "fr_case": "versalfølsomme uttrykk\">Aa",
"fr_win": "bytt ut bokstavene <code>&lt;&gt;:&quot;\\|?*</code> med$Ntilsvarende som windows ikke får panikk av\">win", "fr_win": "bytt ut bokstavene <code>&lt;&gt;:&quot;\\|?*</code> med$Ntilsvarende som windows ikke får panikk av\">win",
"fr_slash": "bytt ut bokstaven <code>/</code> slik at den ikke forårsaker at nye mapper opprettes\">ikke /", "fr_slash": "bytt ut bokstaven <code>/</code> slik at den ikke forårsaker at nye mapper opprettes\">ikke /",
"fr_re": "regex-mønster som kjøres på hvert filnavn. Grupper kan leses ut i format-feltet nedenfor, f.eks. &lt;code&gt;(1)&lt;/code&gt; og &lt;code&gt;(2)&lt;/code&gt; osv.", "fr_re": "`regex-mønster som kjøres på hvert filnavn. Grupper kan leses ut i format-feltet nedenfor, f.eks. `(1)` og `(2)` osv.",
"fr_fmt": "inspirert av foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; byttes ut med sangtittel,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; dropper [dette] hvis artist er blank$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; viser sangnr. med 2 siffer", "fr_fmt": "`inspirert av foobar2000:$N`(title)` byttes ut med sangtittel,$N`[(artist) - ](title)` dropper [dette] hvis artist er blank$N`$lpad((tn),2,0)` viser sangnr. med 2 siffer",
"fr_pdel": "slett", "fr_pdel": "slett",
"fr_pnew": "lagre som", "fr_pnew": "lagre som",
"fr_pname": "gi innstillingene dine et navn", "fr_pname": "gi innstillingene dine et navn",
@ -444,8 +450,8 @@ Ls.nor = {
"fcp_both_b": '<a href="#" id="modal-ok">Kopiér</a><a href="#" id="modal-ng">Last opp</a>', "fcp_both_b": '<a href="#" id="modal-ok">Kopiér</a><a href="#" id="modal-ng">Last opp</a>',
"mk_noname": "skriv inn et navn i tekstboksen til venstre først :p", "mk_noname": "skriv inn et navn i tekstboksen til venstre først :p",
"nmd_i1": "legg også til ønsket filtype, for eksempel <code>.md</code>", //m "nmd_i1": "legg også til ønsket filtype, for eksempel <code>.md</code>",
"nmd_i2": "du kan bare lage <code>.md</code>-filer fordi du ikke har delete-tilgang", //m "nmd_i2": "du kan bare lage <code>.{0}</code>-filer fordi du ikke har delete-tilgang",
"tv_load": "Laster inn tekstfil:\n\n{0}\n\n{1}% ({2} av {3} MiB lastet ned)", "tv_load": "Laster inn tekstfil:\n\n{0}\n\n{1}% ({2} av {3} MiB lastet ned)",
"tv_xe1": "kunne ikke laste tekstfil:\n\nfeil ", "tv_xe1": "kunne ikke laste tekstfil:\n\nfeil ",

View file

@ -117,7 +117,7 @@ Ls.pol = {
"login": "Zaloguj się", //m "login": "Zaloguj się", //m
"access": " dostęp", "access": " dostęp",
"ot_close": "zamknij pod-menu", "ot_close": "zamknij pod-menu",
"ot_search": "szukaj plików po atrybutach, ścieżce / nazwie, tagach muzyki, bądź dowolnej ich kombinacji$N$N&lt;code&gt;foo bar&lt;/code&gt; = musi zawierać «foo» oraz «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = musi zawierać «foo», lecz nie «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = musi zaczynać się od «yana» i być plikiem «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = zawierać dokładnie «try unite»$N$Nformatem daty jest iso-8601, czyli$N&lt;code&gt;2009-12-31&lt;/code&gt; lub &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`szukaj plików po atrybutach, ścieżce / nazwie, tagach muzyki, bądź dowolnej ich kombinacji$N$N`foo bar` = musi zawierać «foo» oraz «bar»,$N`foo -bar` = musi zawierać «foo», lecz nie «bar»,$N`^yana .opus$` = musi zaczynać się od «yana» i być plikiem «opus»$N`&quot;try unite&quot;` = zawierać dokładnie «try unite»$N$Nformatem daty jest iso-8601, czyli$N`2009-12-31` lub `2020-09-12 23:30:00`",
"ot_unpost": "unpost: usuń ostatnio przesłane pliki lub przerwij przesyłanie", "ot_unpost": "unpost: usuń ostatnio przesłane pliki lub przerwij przesyłanie",
"ot_bup": "bup: podstawowe przesyłanie danych, wspiera nawet netscape 4.0", "ot_bup": "bup: podstawowe przesyłanie danych, wspiera nawet netscape 4.0",
"ot_mkdir": "mkdir: tworzy nowy folder", "ot_mkdir": "mkdir: tworzy nowy folder",
@ -266,9 +266,9 @@ Ls.pol = {
"cdt_lim": "maksymalna liczba plików do pokazania na raz w folderze", "cdt_lim": "maksymalna liczba plików do pokazania na raz w folderze",
"cdt_ask": "przy przewijaniu w dół,$Nzapytaj co robić,$Nzamiast wczytywać kolejne pliki", "cdt_ask": "przy przewijaniu w dół,$Nzapytaj co robić,$Nzamiast wczytywać kolejne pliki",
"cdt_hsort": "ile zasad sortowania (&lt;code&gt;,sorthref&lt;/code&gt;) zawierać w generowanych linkach multimediów. Wartość 0 sprawi, że zasady sortowania zawarte w linkach multimediów przy otwarciu również będą ignorowane", "cdt_hsort": "`ile zasad sortowania (`,sorthref`) zawierać w generowanych linkach multimediów. Wartość 0 sprawi, że zasady sortowania zawarte w linkach multimediów przy otwarciu również będą ignorowane",
"cdt_ren": "włącz niestandardowe menu kontekstowe, standardowe menu jest dostępne po wciśnięciu shift i kliknięciu prawym przyciskiem", //m "cdt_ren": "włącz niestandardowe menu kontekstowe, standardowe menu jest dostępne po wciśnięciu shift i kliknięciu prawym przyciskiem\">włącz", //m
"cdt_rdb": "pokaż standardowe menu prawego przycisku, gdy niestandardowe jest już otwarte i nastąpi ponowne kliknięcie", //m "cdt_rdb": "pokaż standardowe menu prawego przycisku, gdy niestandardowe jest już otwarte i nastąpi ponowne kliknięcie\">x2", //m
"tt_entree": "pokaż panel nawigacyjny (panel boczny z drzewem folderów)$NSkrót: B", "tt_entree": "pokaż panel nawigacyjny (panel boczny z drzewem folderów)$NSkrót: B",
"tt_detree": "pokaż ślad nawigacyjny$NSkrót: B", "tt_detree": "pokaż ślad nawigacyjny$NSkrót: B",
@ -286,6 +286,7 @@ Ls.pol = {
"ml_tint": "odcień", "ml_tint": "odcień",
"ml_eq": "korektor dźwięku (equalizer)", "ml_eq": "korektor dźwięku (equalizer)",
"ml_drc": "kompresor zasięgu dynamiki", "ml_drc": "kompresor zasięgu dynamiki",
"ml_ss": "pomijaj ciszę", //m
"mt_loop": "pętla/powtarzaj jeden utwór\">🔁", "mt_loop": "pętla/powtarzaj jeden utwór\">🔁",
"mt_one": "zatrzymaj po jednym utworze\">1⃣", "mt_one": "zatrzymaj po jednym utworze\">1⃣",
@ -321,8 +322,13 @@ Ls.pol = {
"mt_c2ng": "wygląda na to, że to urządzenie nie wspiera tego formatu, lecz spróbujmy i tak", "mt_c2ng": "wygląda na to, że to urządzenie nie wspiera tego formatu, lecz spróbujmy i tak",
"mt_xowa": "iOS zawiera błędy uniemożliwiające odtwarzanie w tle używając tego formatu; wybierz caf lub mp3", "mt_xowa": "iOS zawiera błędy uniemożliwiające odtwarzanie w tle używając tego formatu; wybierz caf lub mp3",
"mt_tint": "jasność tła (0-100) paska,$Naby zmniejszyć widoczność buforowania", "mt_tint": "jasność tła (0-100) paska,$Naby zmniejszyć widoczność buforowania",
"mt_eq": "włącza korektor dźwięku (equalizer) i kontrolę wzmocnienia dźwięku;$N$Nboost &lt;code&gt;0&lt;/code&gt; = standardowa głośność 100% (niezmodyfikowana)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = standardowe stereo (niezmodyfikowane)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% crossfeed lewo-prawo$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = usuwanie wokalu :^)$N$Nwłączenie korektora sprawia, że albumy bezprzerwowe są w pełni bez przerw, więc jeśli jest to dla ciebie ważne, zostaw wszystko na 0 (poza width = 1)", "mt_eq": "`włącza korektor dźwięku (equalizer) i kontrolę wzmocnienia dźwięku;$N$Nboost `0` = standardowa głośność 100% (niezmodyfikowana)$N$Nwidth `1 &nbsp;` = standardowe stereo (niezmodyfikowane)$Nwidth `0.5` = 50% crossfeed lewo-prawo$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = usuwanie wokalu :^)$N$Nwłączenie korektora sprawia, że albumy bezprzerwowe są w pełni bez przerw, więc jeśli jest to dla ciebie ważne, zostaw wszystko na 0 (poza width = 1)",
"mt_drc": "włącza kompresor zakresu dynamiki (normalizacja głośności); włącza również korektor w celu zbalansowania tego spaghetti, więc ustaw wszystkie opcje korektora, oprócz 'width',na 0, jeśli go nie chcesz$N$Nobniża głośność audio nad THRESHOLD (próg) dB; dla każdego RATIO (współczynnika) dB, będącego ponad THRESHOLDem jest 1 dB wyjścia, więc domyślne wartości progu -24 i współczynnika 12 znaczą, że nigdy nie powinno być głośniej niż -22 dB i bezpieczne jest zwiększenie wzmocnienia korektora do 0.8, lub nawet 1.8 z ATK 0 i ogromnym RLS, jak 90 (działa tylko na firefoxie, inne przeglądarki mają limit RLS 1)$N$N(na wikipedii tłumaczą to dużo lepiej)", "mt_drc": "włącza kompresor zakresu dynamiki (normalizacja głośności); włącza również korektor w celu zbalansowania tego spaghetti, więc ustaw wszystkie opcje korektora, oprócz 'width',na 0, jeśli go nie chcesz$N$Nobniża głośność audio nad THRESHOLD (próg) dB; dla każdego RATIO (współczynnika) dB, będącego ponad THRESHOLDem jest 1 dB wyjścia, więc domyślne wartości progu -24 i współczynnika 12 znaczą, że nigdy nie powinno być głośniej niż -22 dB i bezpieczne jest zwiększenie wzmocnienia korektora do 0.8, lub nawet 1.8 z ATK 0 i ogromnym RLS, jak 90 (działa tylko na firefoxie, inne przeglądarki mają limit RLS 1)$N$N(na wikipedii tłumaczą to dużo lepiej)",
"mt_ss": "`włącza pomijanie ciszy; mnoży prędkość odtwarzania przez `szyb` blisko początku/końca, gdy głośność jest poniżej `gł` i pozycja w pierwszych `pocz`% lub ostatnich `kon`%", //m
"mt_ssvt": "próg głośności (0-255)\">gł", //m
"mt_ssts": "aktywny próg (% utworu, początek)\">pocz", //m
"mt_sste": "aktywny próg (% utworu, koniec)\">kon", //m
"mt_sssm": "mnożnik prędkości odtwarzania\">szyb", //m
"mb_play": "odtwórz", "mb_play": "odtwórz",
"mm_hashplay": "odtworzyć ten plik audio?", "mm_hashplay": "odtworzyć ten plik audio?",
@ -401,8 +407,8 @@ Ls.pol = {
"fr_case": "rozróżnianie wielkości liter w regex\">wlit", "fr_case": "rozróżnianie wielkości liter w regex\">wlit",
"fr_win": "nazwy bezpieczne dla systemu Windows; zamienia symbole <code>&lt;&gt;:&quot;\\|?*</code> na japońskie odpowiedniki\">win", "fr_win": "nazwy bezpieczne dla systemu Windows; zamienia symbole <code>&lt;&gt;:&quot;\\|?*</code> na japońskie odpowiedniki\">win",
"fr_slash": "zamienia <code>/</code> symbolem, który nie tworzy nowych folderów\">brak /", "fr_slash": "zamienia <code>/</code> symbolem, który nie tworzy nowych folderów\">brak /",
"fr_re": "wzorzec wyszukiwania regex stosowany do oryginalnych nazw plików; do grup przechwytywania można się odwołać w polu formatu poniżej, np. &lt;code&gt;(1)&lt;/code&gt; i &lt;code&gt;(2)&lt;/code&gt; itd.", "fr_re": "`wzorzec wyszukiwania regex stosowany do oryginalnych nazw plików; do grup przechwytywania można się odwołać w polu formatu poniżej, np. `(1)` i `(2)` itd.",
"fr_fmt": "inspirowane programem foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; zostaje zamienione na tytuł utworu,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; pomija [tą] część jeśli pole artysty jest puste$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; wyrównuje numer utworu do 2 cyfr (np. 01, 06, 09, 16)", "fr_fmt": "`inspirowane programem foobar2000:$N`(title)` zostaje zamienione na tytuł utworu,$N`[(artist) - ](title)` pomija [tą] część jeśli pole artysty jest puste$N`$lpad((tn),2,0)` wyrównuje numer utworu do 2 cyfr (np. 01, 06, 09, 16)",
"fr_pdel": "usuń", "fr_pdel": "usuń",
"fr_pnew": "zapisz jako", "fr_pnew": "zapisz jako",
"fr_pname": "podaj nazwę nowego szablonu", "fr_pname": "podaj nazwę nowego szablonu",
@ -451,7 +457,7 @@ Ls.pol = {
"mk_noname": "wpisz nazwę do pola po lewej zanim to zrobisz :p", "mk_noname": "wpisz nazwę do pola po lewej zanim to zrobisz :p",
"nmd_i1": "możesz też dodać wybrane rozszerzenie, np. <code>.md</code>", //m "nmd_i1": "możesz też dodać wybrane rozszerzenie, np. <code>.md</code>", //m
"nmd_i2": "możesz tworzyć tylko pliki <code>.md</code>, ponieważ nie masz uprawnień do usuwania", //m "nmd_i2": "możesz tworzyć tylko pliki <code>.{0}</code>, ponieważ nie masz uprawnień do usuwania", //m
"tv_load": "Wczytywanie pliku tekstowego:\n\n{0}\n\n{1}% (wczytano {2} z {3} MiB)", "tv_load": "Wczytywanie pliku tekstowego:\n\n{0}\n\n{1}% (wczytano {2} z {3} MiB)",
"tv_xe1": "nie udało się wczytać pliku:\n\nbłąd ", "tv_xe1": "nie udało się wczytać pliku:\n\nbłąd ",

View file

@ -84,8 +84,8 @@ Ls.por = {
["M", "fechar arquivo de texto"], ["M", "fechar arquivo de texto"],
["E", "editar arquivo de texto"], ["E", "editar arquivo de texto"],
["S", "selecionar arquivo (para recortar/copiar/renomear)"], ["S", "selecionar arquivo (para recortar/copiar/renomear)"],
["Y", "baixar arquivo de texto"], //m ["Y", "baixar arquivo de texto"],
["⇧ J", "embelezar json"], //m ["⇧ J", "embelezar json"],
] ]
], ],
@ -114,11 +114,11 @@ Ls.por = {
"login": "Fazer login", "login": "Fazer login",
"access": " acesso", "access": " acesso",
"ot_close": "fechar submenu", "ot_close": "fechar submenu",
"ot_search": "procurar arquivos por atributos, caminho / nome, tags de música ou qualquer combinação deles$N$N&lt;code&gt;foo bar&lt;/code&gt; = deve conter ambos «foo» e «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = deve conter «foo» mas não «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = começar com «yana» e ser um arquivo «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = conter exatamente «try unite»$N$No formato de data é iso-8601, como$N&lt;code&gt;2009-12-31&lt;/code&gt; ou &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`procurar arquivos por atributos, caminho / nome, tags de música ou qualquer combinação deles$N$N`foo bar` = deve conter ambos «foo» e «bar»,$N`foo -bar` = deve conter «foo» mas não «bar»,$N`^yana .opus$` = começar com «yana» e ser um arquivo «opus»$N`&quot;try unite&quot;` = conter exatamente «try unite»$N$No formato de data é iso-8601, como$N`2009-12-31` ou `2020-09-12 23:30:00`",
"ot_unpost": "despublicar: excluir seus uploads recentes, ou abortar os que não foram concluídos", "ot_unpost": "despublicar: excluir seus uploads recentes, ou abortar os que não foram concluídos",
"ot_bup": "bup: uploader básico, até suporta netscape 4.0", "ot_bup": "bup: uploader básico, até suporta netscape 4.0",
"ot_mkdir": "mkdir: criar um novo diretório", "ot_mkdir": "mkdir: criar um novo diretório",
"ot_md": "new-file: criar um novo ficheiro de texto", //m "ot_md": "new-file: criar um novo arquivo de texto",
"ot_msg": "msg: enviar uma mensagem para o log do servidor", "ot_msg": "msg: enviar uma mensagem para o log do servidor",
"ot_mp": "opções do reprodutor de mídia", "ot_mp": "opções do reprodutor de mídia",
"ot_cfg": "opções de configuração", "ot_cfg": "opções de configuração",
@ -127,7 +127,7 @@ Ls.por = {
"ot_noie": 'Por favor, use Chrome / Firefox / Edge', "ot_noie": 'Por favor, use Chrome / Firefox / Edge',
"ab_mkdir": "criar diretório", "ab_mkdir": "criar diretório",
"ab_mkdoc": "novo ficheiro de texto", //m "ab_mkdoc": "novo arquivo de texto",
"ab_msg": "enviar msg para o log do srv", "ab_msg": "enviar msg para o log do srv",
"ay_path": "pular para pastas", "ay_path": "pular para pastas",
@ -155,12 +155,12 @@ Ls.por = {
"ul_par": "uploads paralelos:", "ul_par": "uploads paralelos:",
"ut_rand": "randomizar nomes de arquivos", "ut_rand": "randomizar nomes de arquivos",
"ut_u2ts": "copiar o carimbo de data/hora de última modificação$Ndo seu sistema de arquivos para o servidor\">📅", "ut_u2ts": "copiar o carimbo de data/hora de última modificação$Ndo seu sistema de arquivos para o servidor\">📅",
"ut_ow": "substituir arquivos existentes no servidor?$N🛡: nunca (irá gerar um novo nome de arquivo em vez disso)$N🕒: substituir se o arquivo no servidor for mais antigo que o seu$N♻: sempre substituir se os arquivos forem diferentes$N⏭: ignorar incondicionalmente todos os arquivos existentes", //m "ut_ow": "substituir arquivos existentes no servidor?$N🛡: nunca (irá gerar um novo nome de arquivo em vez disso)$N🕒: substituir se o arquivo no servidor for mais antigo que o seu$N♻: sempre substituir se os arquivos forem diferentes$N⏭: ignorar incondicionalmente todos os arquivos existentes",
"ut_mt": "continuar a fazer o hash de outros arquivos enquanto faz upload$N$Ntalvez desativar se sua CPU ou HDD for um gargalo", "ut_mt": "continuar a fazer o hash de outros arquivos enquanto faz upload$N$Ntalvez desativar se sua CPU ou HDD for um gargalo",
"ut_ask": 'pedir confirmação antes do upload começar">💭', "ut_ask": 'pedir confirmação antes do upload começar">💭',
"ut_pot": "melhorar a velocidade de upload em dispositivos lentos$Ntornando a UI menos complexa", "ut_pot": "melhorar a velocidade de upload em dispositivos lentos$Ntornando a UI menos complexa",
"ut_srch": "não fazer upload, em vez disso verificar se os arquivos já$N existem no servidor (irá escanear todas as pastas que você pode ler)", "ut_srch": "não fazer upload, em vez disso verificar se os arquivos já$N existem no servidor (irá escanear todas as pastas que você pode ler)",
"ut_par": "pausar uploads definindo para 0$N$naumentar se sua conexão for lenta / alta latência$N$nmanter em 1 em LAN ou se o HDD do servidor for um gargalo", "ut_par": "pausar uploads definindo para 0$N$Naumentar se sua conexão for lenta / alta latência$N$Nmanter em 1 em LAN ou se o HDD do servidor for um gargalo",
"ul_btn": "soltar arquivos / pastas<br>aqui (ou clique em mim)", "ul_btn": "soltar arquivos / pastas<br>aqui (ou clique em mim)",
"ul_btnu": "U P L O A D", "ul_btnu": "U P L O A D",
"ul_btns": "B U S C A R", "ul_btns": "B U S C A R",
@ -206,7 +206,7 @@ Ls.por = {
"u_nav_b": '<a href="#" id="modal-ok">Arquivos</a><a href="#" id="modal-ng">Uma pasta</a>', "u_nav_b": '<a href="#" id="modal-ok">Arquivos</a><a href="#" id="modal-ng">Uma pasta</a>',
"cl_opts": "interruptores", "cl_opts": "interruptores",
"cl_hfsz": "tamanho do arquivo", //m "cl_hfsz": "tamanho do arquivo",
"cl_themes": "tema", "cl_themes": "tema",
"cl_langs": "idioma", "cl_langs": "idioma",
"cl_ziptype": "download de pasta", "cl_ziptype": "download de pasta",
@ -220,14 +220,14 @@ Ls.por = {
"cl_reset": "resetar", "cl_reset": "resetar",
"cl_hpick": "toque nos cabeçalhos das colunas para ocultá-los na tabela abaixo", "cl_hpick": "toque nos cabeçalhos das colunas para ocultá-los na tabela abaixo",
"cl_hcancel": "ocultar coluna abortado", "cl_hcancel": "ocultar coluna abortado",
"cl_rcm": "menu de clique direito", //m "cl_rcm": "menu de clique direito",
"ct_grid": '田 a grade', "ct_grid": '田 a grade',
"ct_ttips": '◔ ◡ ◔"> dicas de ferramentas', "ct_ttips": '◔ ◡ ◔"> dicas de ferramentas',
"ct_thumb": 'na visualização de grade, alternar entre ícones ou miniaturas$NHotkey: T">🖼️ miniaturas', "ct_thumb": 'na visualização de grade, alternar entre ícones ou miniaturas$NHotkey: T">🖼️ miniaturas',
"ct_csel": 'usar CTRL e SHIFT para seleção de arquivo na visualização de grade">sel', "ct_csel": 'usar CTRL e SHIFT para seleção de arquivo na visualização de grade">sel',
"ct_dsel": 'usar seleção por arrasto na visualização de grade">arrastar', //m "ct_dsel": 'usar seleção por arrasto na visualização de grade">arrastar',
"ct_dl": 'forçar download (não exibir inline) ao clicar em um arquivo">dl', //m "ct_dl": 'forçar download (não exibir na página) ao clicar em um arquivo">dl',
"ct_ihop": 'quando o visualizador de imagens for fechado, rolar para o último arquivo visualizado">g⮯', "ct_ihop": 'quando o visualizador de imagens for fechado, rolar para o último arquivo visualizado">g⮯',
"ct_dots": 'mostrar arquivos ocultos (se o servidor permitir)">dotfiles', "ct_dots": 'mostrar arquivos ocultos (se o servidor permitir)">dotfiles',
"ct_qdel": 'ao excluir arquivos, pedir confirmação apenas uma vez">qdel', "ct_qdel": 'ao excluir arquivos, pedir confirmação apenas uma vez">qdel',
@ -242,18 +242,18 @@ Ls.por = {
"cut_turbo": "o botão yolo, você provavelmente NÃO quer habilitar isso:$N$Nuse isto se você estava fazendo upload de uma enorme quantidade de arquivos e teve que reiniciar por algum motivo, e quer continuar o upload o mais rápido possível$N$Nisto substitui a verificação de hash por uma simples <em>&quot;este arquivo tem o mesmo tamanho no servidor?&quot;</em> então se o conteúdo do arquivo for diferente ele NÃO será enviado$N$Nvocê deve desativar isso quando o upload estiver concluído, e então &quot;enviar&quot; os mesmos arquivos novamente para permitir que o cliente os verifique\">turbo", "cut_turbo": "o botão yolo, você provavelmente NÃO quer habilitar isso:$N$Nuse isto se você estava fazendo upload de uma enorme quantidade de arquivos e teve que reiniciar por algum motivo, e quer continuar o upload o mais rápido possível$N$Nisto substitui a verificação de hash por uma simples <em>&quot;este arquivo tem o mesmo tamanho no servidor?&quot;</em> então se o conteúdo do arquivo for diferente ele NÃO será enviado$N$Nvocê deve desativar isso quando o upload estiver concluído, e então &quot;enviar&quot; os mesmos arquivos novamente para permitir que o cliente os verifique\">turbo",
"cut_datechk": "não tem efeito a menos que o botão turbo esteja ativado$N$Nreduz o fator yolo por uma pequena quantidade; verifica se os carimbos de data/hora dos arquivos no servidor correspondem aos seus$N$ndeve <em>teoricamente</em> pegar a maioria dos uploads incompletos / corrompidos, mas não é um substituto para fazer uma verificação com o turbo desativado depois\">date-chk", "cut_datechk": "não tem efeito a menos que o botão turbo esteja ativado$N$Nreduz o fator yolo por uma pequena quantidade; verifica se os carimbos de data/hora dos arquivos no servidor correspondem aos seus$N$Ndeve <em>teoricamente</em> pegar a maioria dos uploads incompletos / corrompidos, mas não é um substituto para fazer uma verificação com o turbo desativado depois\">date-chk",
"cut_u2sz": "tamanho (em MiB) de cada bloco de upload; valores grandes voam melhor pelo atlântico. Tente valores baixos em conexões muito não confiáveis", "cut_u2sz": "tamanho (em MiB) de cada bloco de upload; valores grandes voam melhor pelo atlântico. Tente valores baixos em conexões muito não confiáveis",
"cut_flag": "garantir que apenas uma aba esteja fazendo upload por vez $N -- outras abas devem ter isso ativado também $N -- só afeta abas no mesmo domínio", "cut_flag": "garantir que apenas uma aba esteja fazendo upload por vez $N -- outras abas devem ter isso ativado também $N -- só afeta abas no mesmo domínio",
"cut_az": "enviar arquivos em ordem alfabética, em vez de o menor primeiro$N$na ordem alfabética pode tornar mais fácil de verificar se algo deu errado no servidor, mas torna o upload um pouco mais lento em fibra / LAN", "cut_az": "enviar arquivos em ordem alfabética, em vez de o menor primeiro$N$Na ordem alfabética pode tornar mais fácil de verificar se algo deu errado no servidor, mas torna o upload um pouco mais lento em fibra / LAN",
"cut_nag": "notificação do SO quando o upload for concluído$N(somente se o navegador ou aba não estiver ativo)", "cut_nag": "notificação do SO quando o upload for concluído$N(somente se o navegador ou aba não estiver ativo)",
"cut_sfx": "alerta audível quando o upload for concluído$N(somente se o navegador ou aba não estiver ativo)", "cut_sfx": "alerta audível quando o upload for concluído$N(somente se o navegador ou aba não estiver ativo)",
"cut_mt": "usar multithreading para acelerar o hash de arquivos$N$nisto usa web-workers e requer$Nmais RAM (até 512 MiB extras)$N$ntorna https 30% mais rápido, http 4.5x mais rápido\">mt", "cut_mt": "usar multithreading para acelerar o hash de arquivos$N$Nisto usa web-workers e requer$Nmais RAM (até 512 MiB extras)$N$Ntorna https 30% mais rápido, http 4.5x mais rápido\">mt",
"cut_wasm": "usar wasm em vez do hasher embutido do navegador; melhora a velocidade em navegadores baseados em chrome mas aumenta a carga da CPU, e muitas versões antigas do chrome têm bugs que fazem o navegador consumir toda a RAM e travar se isso for ativado\">wasm", "cut_wasm": "usar wasm em vez do hasher embutido do navegador; melhora a velocidade em navegadores baseados em chrome mas aumenta a carga da CPU, e muitas versões antigas do chrome têm bugs que fazem o navegador consumir toda a RAM e travar se isso for ativado\">wasm",
@ -262,10 +262,10 @@ Ls.por = {
"cft_bg": "cor do fundo", "cft_bg": "cor do fundo",
"cdt_lim": "número máximo de arquivos para mostrar em uma pasta", "cdt_lim": "número máximo de arquivos para mostrar em uma pasta",
"cdt_ask": "ao rolar para o final,$nem vez de carregar mais arquivos,$nperguntar o que fazer", "cdt_ask": "ao rolar para o final,$Nem vez de carregar mais arquivos,$Nperguntar o que fazer",
"cdt_hsort": "quantas regras de ordenação (&lt;code&gt;,sorthref&lt;/code&gt;) incluir em URLs de mídia. Definir isso para 0 também ignorará as regras de ordenação incluídas em links de mídia quando você clicar neles", "cdt_hsort": "`quantas regras de ordenação (`,sorthref`) incluir em URLs de mídia. Definir isso para 0 também ignorará as regras de ordenação incluídas em links de mídia quando você clicar neles",
"cdt_ren": "ativar menu de clique direito personalizado, o menu normal permanece acessível com shift + clique direito", //m "cdt_ren": "ativar menu de clique direito personalizado, o menu normal permanece acessível com shift + clique direito\">ativar",
"cdt_rdb": "mostrar o menu padrão do botão direito quando o personalizado já estiver aberto e houver novo clique", //m "cdt_rdb": "mostrar o menu padrão do botão direito quando o menu personalizado já estiver aberto e houver um novo clique\">x2", //m
"tt_entree": "mostrar painel de navegação (árvore de diretórios)$NHotkey: B", "tt_entree": "mostrar painel de navegação (árvore de diretórios)$NHotkey: B",
"tt_detree": "mostrar breadcrumbs$NHotkey: B", "tt_detree": "mostrar breadcrumbs$NHotkey: B",
@ -283,11 +283,12 @@ Ls.por = {
"ml_tint": "matiz", "ml_tint": "matiz",
"ml_eq": "equalizador de áudio", "ml_eq": "equalizador de áudio",
"ml_drc": "compressor de faixa dinâmica", "ml_drc": "compressor de faixa dinâmica",
"ml_ss": "ignorar silêncio", //m
"mt_loop": "loop/repetir uma música\">🔁", "mt_loop": "loop/repetir uma música\">🔁",
"mt_one": "parar depois de uma música\">1⃣", "mt_one": "parar depois de uma música\">1⃣",
"mt_shuf": "embaralhar as músicas em cada pasta\">🔀", "mt_shuf": "embaralhar as músicas em cada pasta\">🔀",
"mt_aplay": "reproduzir automaticamente se houver um ID de música no link que você clicou para acessar o servidor$N$ndesativar isso também impedirá que a URL da página seja atualizada com IDs de música ao tocar música, para evitar a reprodução automática se essas configurações forem perdidas mas a URL permanecer\">a▶", "mt_aplay": "reproduzir automaticamente se houver um ID de música no link que você clicou para acessar o servidor$N$Ndesativar isso também impedirá que a URL da página seja atualizada com IDs de música ao tocar música, para evitar a reprodução automática se essas configurações forem perdidas mas a URL permanecer\">a▶",
"mt_preload": "começar a carregar a próxima música perto do final para uma reprodução sem interrupções\">preload", "mt_preload": "começar a carregar a próxima música perto do final para uma reprodução sem interrupções\">preload",
"mt_prescan": "ir para a próxima pasta antes que a última música$Ntermine, mantendo o navegador feliz$Npara que ele não pare a reprodução\">nav", "mt_prescan": "ir para a próxima pasta antes que a última música$Ntermine, mantendo o navegador feliz$Npara que ele não pare a reprodução\">nav",
"mt_fullpre": "tentar pré-carregar a música inteira;$N✅ ativar em conexões <b>não confiáveis</b>,$N❌ <b>desativar</b> em conexões lentas provavelmente\">full", "mt_fullpre": "tentar pré-carregar a música inteira;$N✅ ativar em conexões <b>não confiáveis</b>,$N❌ <b>desativar</b> em conexões lentas provavelmente\">full",
@ -296,7 +297,7 @@ Ls.por = {
"mt_npclip": "mostrar botões para copiar a música que está tocando para a área de transferência\">/np", "mt_npclip": "mostrar botões para copiar a música que está tocando para a área de transferência\">/np",
"mt_m3u_c": "mostrar botões para copiar as$Nmúsicas selecionadas como entradas de playlist m3u8 para a área de transferência\">📻", "mt_m3u_c": "mostrar botões para copiar as$Nmúsicas selecionadas como entradas de playlist m3u8 para a área de transferência\">📻",
"mt_octl": "integração com o SO (atalhos de mídia / osd)\">os-ctl", "mt_octl": "integração com o SO (atalhos de mídia / osd)\">os-ctl",
"mt_oseek": "permitir busca através da integração com o SO$N$nnota: em alguns dispositivos (iPhones),$nisto substitui o botão de próxima música\">seek", "mt_oseek": "permitir busca através da integração com o SO$N$Nnota: em alguns dispositivos (iPhones),$Nisto substitui o botão de próxima música\">seek",
"mt_oscv": "mostrar capa do álbum no osd\">art", "mt_oscv": "mostrar capa do álbum no osd\">art",
"mt_follow": "manter a faixa que está tocando rolando à vista\">🎯", "mt_follow": "manter a faixa que está tocando rolando à vista\">🎯",
"mt_compact": "controles compactos\">⟎", "mt_compact": "controles compactos\">⟎",
@ -318,8 +319,13 @@ Ls.por = {
"mt_c2ng": "seu dispositivo não parece suportar este formato de saída, mas vamos tentar mesmo assim", "mt_c2ng": "seu dispositivo não parece suportar este formato de saída, mas vamos tentar mesmo assim",
"mt_xowa": "existem bugs no iOS que impedem a reprodução em segundo plano usando este formato; por favor, use caf ou mp3 em vez disso", "mt_xowa": "existem bugs no iOS que impedem a reprodução em segundo plano usando este formato; por favor, use caf ou mp3 em vez disso",
"mt_tint": "nível de fundo (0-100) na barra de busca$Npara tornar o buffer menos distrativo", "mt_tint": "nível de fundo (0-100) na barra de busca$Npara tornar o buffer menos distrativo",
"mt_eq": "ativa o equalizador e o controle de ganho;$N$nimpulsão &lt;code&gt;0&lt;/code&gt; = volume padrão de 100% (não modificado)$N$nlargura &lt;code&gt;1 &nbsp;&lt;/code&gt; = estéreo padrão (não modificado)$nlargura &lt;code&gt;0.5&lt;/code&gt; = 50% de crossfeed esquerda-direita$nlargura &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$nimpulsão &lt;code&gt;-0.8&lt;/code&gt; & largura &lt;code&gt;10&lt;/code&gt; = remoção de vocal :^)$N$natvar o equalizador torna os álbuns sem interrupções totalmente sem interrupções, então deixe-o ligado com todos os valores em zero (exceto largura = 1) se você se importa com isso", "mt_eq": "`ativa o equalizador e o controle de ganho;$N$Nimpulsão `0` = volume padrão de 100% (não modificado)$N$Nlargura `1 &nbsp;` = estéreo padrão (não modificado)$Nlargura `0.5` = 50% de crossfeed esquerda-direita$Nlargura `0 &nbsp;` = mono$N$Nimpulsão `-0.8` & largura `10` = remoção de vocal :^)$N$Natvar o equalizador torna os álbuns sem interrupções totalmente sem interrupções, então deixe-o ligado com todos os valores em zero (exceto largura = 1) se você se importa com isso",
"mt_drc": "ativa o compressor de faixa dinâmica (nivelador de volume / brickwaller); também ativará o EQ para equilibrar o spaghetti, então defina todos os campos EQ exceto 'width' para 0 se você não quiser$N$nabaixa o volume do áudio acima do THRESHOLD dB; para cada RATIO dB após o THRESHOLD há 1 dB de saída, então os valores padrão de tresh -24 e ratio 12 significam que nunca deve ficar mais alto que -22 dB e é seguro aumentar o impulso do equalizador para 0.8, ou até 1.8 com ATK 0 e um enorme RLS como 90 (só funciona no firefox; RLS é no máximo 1 em outros navegadores)$N$n(veja a wikipedia, eles explicam muito melhor)", "mt_drc": "ativa o compressor de faixa dinâmica (nivelador de volume / brickwaller); também ativará o EQ para equilibrar o spaghetti, então defina todos os campos EQ exceto 'width' para 0 se você não quiser$N$Nabaixa o volume do áudio acima do THRESHOLD dB; para cada RATIO dB após o THRESHOLD há 1 dB de saída, então os valores padrão de tresh -24 e ratio 12 significam que nunca deve ficar mais alto que -22 dB e é seguro aumentar o impulso do equalizador para 0.8, ou até 1.8 com ATK 0 e um enorme RLS como 90 (só funciona no firefox; RLS é no máximo 1 em outros navegadores)$N$N(veja a wikipedia, eles explicam muito melhor)",
"mt_ss": "`ativa pular silêncio; multiplica a velocidade por `av` perto do início/fim quando o volume está abaixo de `vol` e a posição está nos primeiros `ini`% ou últimos `fim`%", //m
"mt_ssvt": "limiar de volume (0-255)\">vol", //m
"mt_ssts": "limiar ativo (% faixa, início)\">ini", //m
"mt_sste": "limiar ativo (% faixa, fim)\">fim", //m
"mt_sssm": "multiplicador de velocidade de reprodução\">av", //m
"mb_play": "reproduzir", "mb_play": "reproduzir",
"mm_hashplay": "reproduzir este arquivo de áudio?", "mm_hashplay": "reproduzir este arquivo de áudio?",
@ -336,7 +342,7 @@ Ls.por = {
"mm_eunk": "Erro Desconhecido", "mm_eunk": "Erro Desconhecido",
"mm_e404": "Não foi possível reproduzir áudio; erro 404: Arquivo não encontrado.", "mm_e404": "Não foi possível reproduzir áudio; erro 404: Arquivo não encontrado.",
"mm_e403": "Não foi possível reproduzir áudio; erro 403: Acesso negado.\n\nTente pressionar F5 para recarregar, talvez você tenha saído da conta", "mm_e403": "Não foi possível reproduzir áudio; erro 403: Acesso negado.\n\nTente pressionar F5 para recarregar, talvez você tenha saído da conta",
"mm_e415": "Não foi possível reproduzir áudio; erro 415: Falha na conversão do ficheiro; verifique os logs do servidor.", //m "mm_e415": "Não foi possível reproduzir áudio; erro 415: Falha na conversão do arquivo; verifique os logs do servidor.",
"mm_e500": "Não foi possível reproduzir áudio; erro 500: Verifique os logs do servidor.", "mm_e500": "Não foi possível reproduzir áudio; erro 500: Verifique os logs do servidor.",
"mm_e5xx": "Não foi possível reproduzir áudio; erro do servidor ", "mm_e5xx": "Não foi possível reproduzir áudio; erro do servidor ",
"mm_nof": "não encontrando mais arquivos de áudio por perto", "mm_nof": "não encontrando mais arquivos de áudio por perto",
@ -356,7 +362,7 @@ Ls.por = {
"f_anota": "apenas {0} dos {1} itens foram selecionados;\npara selecionar a pasta inteira, primeiro role para o final", "f_anota": "apenas {0} dos {1} itens foram selecionados;\npara selecionar a pasta inteira, primeiro role para o final",
"f_dls": 'os links de arquivo na pasta atual foram\nalterados para links de download', "f_dls": 'os links de arquivo na pasta atual foram\nalterados para links de download',
"f_dl_nd": 'a ignorar pasta (use o download zip/tar em vez disso):\n', //m "f_dl_nd": 'pulando pasta (use o download zip/tar em vez disso):\n',
"f_partial": "Para baixar com segurança um arquivo que está sendo enviado, por favor, clique no arquivo que tem o mesmo nome, mas sem a extensão <code>.PARTIAL</code>. Por favor, pressione CANCELAR ou Escape para fazer isso.\n\nPressionar OK / Enter irá ignorar este aviso e continuar baixando o arquivo temporário <code>.PARTIAL</code>, o que quase certamente lhe dará dados corrompidos.", "f_partial": "Para baixar com segurança um arquivo que está sendo enviado, por favor, clique no arquivo que tem o mesmo nome, mas sem a extensão <code>.PARTIAL</code>. Por favor, pressione CANCELAR ou Escape para fazer isso.\n\nPressionar OK / Enter irá ignorar este aviso e continuar baixando o arquivo temporário <code>.PARTIAL</code>, o que quase certamente lhe dará dados corrompidos.",
@ -398,8 +404,8 @@ Ls.por = {
"fr_case": "regex sensível a maiúsculas e minúsculas\">case", "fr_case": "regex sensível a maiúsculas e minúsculas\">case",
"fr_win": "nomes seguros para windows; substituir <code>&lt;&gt;:&quot;\\|?*</code> por caracteres japoneses de largura total\">win", "fr_win": "nomes seguros para windows; substituir <code>&lt;&gt;:&quot;\\|?*</code> por caracteres japoneses de largura total\">win",
"fr_slash": "substituir <code>/</code> por um caractere que não cause a criação de novas pastas\">no /", "fr_slash": "substituir <code>/</code> por um caractere que não cause a criação de novas pastas\">no /",
"fr_re": "padrão de busca regex para aplicar aos nomes de arquivos originais; grupos de captura podem ser referenciados no campo de formato abaixo como &lt;code&gt;(1)&lt;/code&gt; e &lt;code&gt;(2)&lt;/code&gt; e assim por diante", "fr_re": "`padrão de busca regex para aplicar aos nomes de arquivos originais; grupos de captura podem ser referenciados no campo de formato abaixo como `(1)` e `(2)` e assim por diante",
"fr_fmt": "inspirado por foobar2000:$N&lt;code&gt;(título)&lt;/code&gt; é substituído pelo título da música,$N&lt;code&gt;[(artista) - ](título)&lt;/code&gt; pula esta parte se o artista estiver em branco$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; preenche o número da faixa com 2 dígitos", "fr_fmt": "`inspirado por foobar2000:$N`(título)` é substituído pelo título da música,$N`[(artista) - ](título)` pula esta parte se o artista estiver em branco$N`$lpad((tn),2,0)` preenche o número da faixa com 2 dígitos",
"fr_pdel": "excluir", "fr_pdel": "excluir",
"fr_pnew": "salvar como", "fr_pnew": "salvar como",
"fr_pname": "forneça um nome para seu novo preset", "fr_pname": "forneça um nome para seu novo preset",
@ -425,10 +431,10 @@ Ls.por = {
"fcc_warn": 'copiado {0} itens para a área de transferência\n\nmas: apenas <b>esta</b> aba do navegador pode colá-los\n(já que a seleção é tão absolutamente massiva)', "fcc_warn": 'copiado {0} itens para a área de transferência\n\nmas: apenas <b>esta</b> aba do navegador pode colá-los\n(já que a seleção é tão absolutamente massiva)',
"fp_apply": "usar estes nomes", "fp_apply": "usar estes nomes",
"fp_skip": "pular conflitos", //m "fp_skip": "pular conflitos",
"fp_ecut": "primeiro recorte ou copie alguns arquivos / pastas para colar / mover\n\nnota: você pode recortar / colar entre abas diferentes do navegador", "fp_ecut": "primeiro recorte ou copie alguns arquivos / pastas para colar / mover\n\nnota: você pode recortar / colar entre abas diferentes do navegador",
"fp_ename": "{0} itens não podem ser movidos para cá porque os nomes já estão em uso. Dê a eles novos nomes abaixo para continuar, ou deixe o nome em branco (\"pular conflitos\") para pular:", //m "fp_ename": "{0} itens não podem ser movidos para cá porque os nomes já estão em uso. Dê a eles novos nomes abaixo para continuar, ou deixe o nome em branco (\"pular conflitos\") para pular:",
"fcp_ename": "{0} itens não podem ser copiados para cá porque os nomes já estão em uso. Dê a eles novos nomes abaixo para continuar, ou deixe o nome em branco (\"pular conflitos\") para pular:", //m "fcp_ename": "{0} itens não podem ser copiados para cá porque os nomes já estão em uso. Dê a eles novos nomes abaixo para continuar, ou deixe o nome em branco (\"pular conflitos\") para pular:",
"fp_emore": "ainda há algumas colisões de nome de arquivo para consertar", "fp_emore": "ainda há algumas colisões de nome de arquivo para consertar",
"fp_ok": "movimento OK", "fp_ok": "movimento OK",
"fcp_ok": "cópia OK", "fcp_ok": "cópia OK",
@ -447,8 +453,8 @@ Ls.por = {
"fcp_both_b": '<a href="#" id="modal-ok">Copiar</a><a href="#" id="modal-ng">Enviar</a>', "fcp_both_b": '<a href="#" id="modal-ok">Copiar</a><a href="#" id="modal-ng">Enviar</a>',
"mk_noname": "digite um nome no campo de texto à esquerda antes de fazer isso :p", "mk_noname": "digite um nome no campo de texto à esquerda antes de fazer isso :p",
"nmd_i1": "também pode adicionar a extensão desejada, por exemplo <code>.md</code>", //m "nmd_i1": "também adicione a extensão desejada, por exemplo <code>.md</code>",
"nmd_i2": "só pode criar ficheiros <code>.md</code> porque não tem permissão para apagar", //m "nmd_i2": "só pode criar arquivos <code>.{0}</code> porque não tem permissão para apagar",
"tv_load": "Carregando documento de texto:\n\n{0}\n\n{1}% ({2} de {3} MiB carregados)", "tv_load": "Carregando documento de texto:\n\n{0}\n\n{1}% ({2} de {3} MiB carregados)",
"tv_xe1": "não foi possível carregar o arquivo de texto:\n\nerro ", "tv_xe1": "não foi possível carregar o arquivo de texto:\n\nerro ",
@ -459,7 +465,7 @@ Ls.por = {
"tvt_prev": "mostrar documento anterior$NHotkey: i\">⬆ anterior", "tvt_prev": "mostrar documento anterior$NHotkey: i\">⬆ anterior",
"tvt_next": "mostrar próximo documento$NHotkey: K\">⬇ próximo", "tvt_next": "mostrar próximo documento$NHotkey: K\">⬇ próximo",
"tvt_sel": "selecionar arquivo &nbsp; ( para recortar / copiar / excluir / ... )$NHotkey: S\">sel", "tvt_sel": "selecionar arquivo &nbsp; ( para recortar / copiar / excluir / ... )$NHotkey: S\">sel",
"tvt_j": "embelezar json$NHotkey: shift-J\">j", //m "tvt_j": "embelezar json$NHotkey: shift-J\">j",
"tvt_edit": "abrir arquivo no editor de texto$NHotkey: E\">✏️ editar", "tvt_edit": "abrir arquivo no editor de texto$NHotkey: E\">✏️ editar",
"tvt_tail": "monitorar arquivo para alterações; mostrar novas linhas em tempo real\">📡 seguir", "tvt_tail": "monitorar arquivo para alterações; mostrar novas linhas em tempo real\">📡 seguir",
"tvt_wrap": "quebra de linha\">↵", "tvt_wrap": "quebra de linha\">↵",
@ -472,7 +478,7 @@ Ls.por = {
"m3u_clip": "playlist m3u agora copiada para a área de transferência\n\nvocê deve criar um novo arquivo de texto chamado something.m3u e colar a playlist nesse documento; isso a tornará reproduzível", "m3u_clip": "playlist m3u agora copiada para a área de transferência\n\nvocê deve criar um novo arquivo de texto chamado something.m3u e colar a playlist nesse documento; isso a tornará reproduzível",
"gt_vau": "não mostrar vídeos, apenas tocar o áudio\">🎧", "gt_vau": "não mostrar vídeos, apenas tocar o áudio\">🎧",
"gt_msel": "ativar seleção de arquivo; ctrl-clique em um arquivo para substituir$N$n&lt;em&gt;quando ativo: clique duas vezes em um arquivo / pasta para abri-lo&&gt;t;/em&gt;$N$nHotkey: S\">multisseleção", "gt_msel": "ativar seleção de arquivo; ctrl-clique em um arquivo para substituir$N$N&lt;em&gt;quando ativo: clique duas vezes em um arquivo / pasta para abri-lo&&gt;t;/em&gt;$N$NHotkey: S\">multisseleção",
"gt_crop": "cortar miniaturas ao centro\">cortar", "gt_crop": "cortar miniaturas ao centro\">cortar",
"gt_3x": "miniaturas de alta resolução\">3x", "gt_3x": "miniaturas de alta resolução\">3x",
"gt_zoom": "zoom", "gt_zoom": "zoom",
@ -530,11 +536,11 @@ Ls.por = {
"fz_tar": "arquivo gnu-tar não comprimido (linux / mac)", "fz_tar": "arquivo gnu-tar não comprimido (linux / mac)",
"fz_pax": "tar de formato pax não comprimido (mais lento)", "fz_pax": "tar de formato pax não comprimido (mais lento)",
"fz_targz": "gnu-tar com compressão gzip nível 3$N$nisto é geralmente muito lento, então$nuse tar não comprimido em vez disso", "fz_targz": "gnu-tar com compressão gzip nível 3$N$Nisto é geralmente muito lento, então$Nuse tar não comprimido em vez disso",
"fz_tarxz": "gnu-tar com compressão xz nível 1$N$nisto é geralmente muito lento, então$nuse tar não comprimido em vez disso", "fz_tarxz": "gnu-tar com compressão xz nível 1$N$Nisto é geralmente muito lento, então$Nuse tar não comprimido em vez disso",
"fz_zip8": "zip com nomes de arquivos utf8 (pode ser instável no windows 7 e mais antigos)", "fz_zip8": "zip com nomes de arquivos utf8 (pode ser instável no windows 7 e mais antigos)",
"fz_zipd": "zip com nomes de arquivos cp437 tradicionais, para software realmente antigo", "fz_zipd": "zip com nomes de arquivos cp437 tradicionais, para software realmente antigo",
"fz_zipc": "cp437 com crc32 calculado antecipadamente,$npara MS-DOS PKZIP v2.04g (outubro de 1993)$n(leva mais tempo para processar antes que o download possa começar)", "fz_zipc": "cp437 com crc32 calculado antecipadamente,$Npara MS-DOS PKZIP v2.04g (outubro de 1993)$N(leva mais tempo para processar antes que o download possa começar)",
"un_m1": "você pode excluir seus uploads recentes (ou abortar os que não foram concluídos) abaixo", "un_m1": "você pode excluir seus uploads recentes (ou abortar os que não foram concluídos) abaixo",
"un_upd": "atualizar", "un_upd": "atualizar",
@ -644,25 +650,25 @@ Ls.por = {
"ur_um": "Concluído;\n{0} uploads OK,\n{1} uploads falharam, desculpe", "ur_um": "Concluído;\n{0} uploads OK,\n{1} uploads falharam, desculpe",
"ur_sm": "Concluído;\n{0} arquivos encontrados no servidor,\n{1} arquivos NÃO encontrados no servidor", "ur_sm": "Concluído;\n{0} arquivos encontrados no servidor,\n{1} arquivos NÃO encontrados no servidor",
"rc_opn": "abrir", //m "rc_opn": "abrir",
"rc_ply": "reproduzir", //m "rc_ply": "reproduzir",
"rc_pla": "reproduzir como áudio", //m "rc_pla": "reproduzir como áudio",
"rc_txt": "abrir no visualizador de arquivos", //m "rc_txt": "abrir no leitor de texto",
"rc_md": "abrir no editor de texto", //m "rc_md": "abrir no leitor markdown",
"rc_dl": "baixar", //m "rc_dl": "baixar",
"rc_zip": "baixar como arquivo", //m "rc_zip": "baixar compactado",
"rc_cpl": "copiar link", //m "rc_cpl": "copiar link",
"rc_del": "excluir", //m "rc_del": "excluir",
"rc_cut": "recortar", //m "rc_cut": "recortar",
"rc_cpy": "copiar", //m "rc_cpy": "copiar",
"rc_pst": "colar", //m "rc_pst": "colar",
"rc_rnm": "renomear", //m "rc_rnm": "renomear",
"rc_nfo": "nova pasta", //m "rc_nfo": "nova pasta",
"rc_nfi": "novo arquivo", //m "rc_nfi": "novo arquivo",
"rc_sal": "selecionar tudo", //m "rc_sal": "selecionar tudo",
"rc_sin": "inverter seleção", //m "rc_sin": "inverter seleção",
"rc_shf": "compartilhar esta pasta", //m "rc_shf": "compartilhar esta pasta",
"rc_shs": "compartilhar seleção", //m "rc_shs": "compartilhar seleção",
"lang_set": "atualizar para a mudança ter efeito?", "lang_set": "atualizar para a mudança ter efeito?",
@ -705,8 +711,8 @@ Ls.por = {
"ta1": "primeiro digite sua nova senha", "ta1": "primeiro digite sua nova senha",
"ta2": "repita para confirmar a nova senha:", "ta2": "repita para confirmar a nova senha:",
"ta3": "há um erro; por favor, tente novamente", "ta3": "há um erro; por favor, tente novamente",
"nop": "ERRO: A senha não pode estar em branco", //m "nop": "ERRO: A senha não pode estar em branco",
"nou": "ERRO: O nome de usuário e/ou a senha não podem estar em branco", //m "nou": "ERRO: O nome de usuário e/ou a senha não podem estar em branco",
"aa1": "arquivos de entrada:", "aa1": "arquivos de entrada:",
"ab1": "desativar no304", "ab1": "desativar no304",
"ac1": "ativar no304", "ac1": "ativar no304",

View file

@ -114,7 +114,7 @@ Ls.rus = {
"login": "Войти", //m "login": "Войти", //m
"access": " доступ", "access": " доступ",
"ot_close": "закрыть подменю", "ot_close": "закрыть подменю",
"ot_search": "искать файлы по атрибутам, пути / имени, музыкальным тегам или любой другой комбинации из следующих конструкций$N$N&lt;code&gt;foo bar&lt;/code&gt; = обязано содержать «foo» И «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = обязано содержать «foo», но не «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = начинается с «yana» и имеет расширение «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = содержит именно «try unite»$N$Nформат времени задаётся по стандарту iso-8601, например$N&lt;code&gt;2009-12-31&lt;/code&gt; или &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`искать файлы по атрибутам, пути / имени, музыкальным тегам или любой другой комбинации из следующих конструкций$N$N`foo bar` = обязано содержать «foo» И «bar»,$N`foo -bar` = обязано содержать «foo», но не «bar»,$N`^yana .opus$` = начинается с «yana» и имеет расширение «opus»$N`&quot;try unite&quot;` = содержит именно «try unite»$N$Nформат времени задаётся по стандарту iso-8601, например$N`2009-12-31` или `2020-09-12 23:30:00`",
"ot_unpost": "unpost: удалить ваши недавние загрузки и отменить незавершённые", "ot_unpost": "unpost: удалить ваши недавние загрузки и отменить незавершённые",
"ot_bup": "bup: легковесный загрузчик файлов, поддерживает даже netscape 4.0", "ot_bup": "bup: легковесный загрузчик файлов, поддерживает даже netscape 4.0",
"ot_mkdir": "mkdir: создать новую папку", "ot_mkdir": "mkdir: создать новую папку",
@ -263,9 +263,9 @@ Ls.rus = {
"cdt_lim": "максимальное количество файлов для показа в папке", "cdt_lim": "максимальное количество файлов для показа в папке",
"cdt_ask": "внизу страницы спрашивать о действии вместо автоматической загрузки следующих файлов", "cdt_ask": "внизу страницы спрашивать о действии вместо автоматической загрузки следующих файлов",
"cdt_hsort": "сколько правил сортировки (&lt;code&gt;,sorthref&lt;/code&gt;) включать в адрес страницы. Если значение равно 0, по нажатии на ссылки будут игнорироваться правила, включённые в них", "cdt_hsort": "`сколько правил сортировки (`,sorthref`) включать в адрес страницы. Если значение равно 0, по нажатии на ссылки будут игнорироваться правила, включённые в них",
"cdt_ren": "включить настраиваемое контекстное меню, обычное меню доступно при нажатии shift и правой кнопки мыши", //m "cdt_ren": "включить настраиваемое контекстное меню, обычное меню доступно при нажатии shift и правой кнопки мыши\">вкл.",
"cdt_rdb": "показывать обычное меню правого клика, если пользовательское уже открыто и выполняется повторный клик", //m "cdt_rdb": "показывать обычное меню правого клика, если пользовательское уже открыто и выполняется повторный клик\">двойное",
"tt_entree": "показать панель навигации$NГорячая клавиша: B", "tt_entree": "показать панель навигации$NГорячая клавиша: B",
"tt_detree": "скрыть панель навигации$NГорячая клавиша: B", "tt_detree": "скрыть панель навигации$NГорячая клавиша: B",
@ -283,6 +283,7 @@ Ls.rus = {
"ml_tint": "затемн.", "ml_tint": "затемн.",
"ml_eq": "эквалайзер", "ml_eq": "эквалайзер",
"ml_drc": "компрессор", "ml_drc": "компрессор",
"ml_ss": "пропускать тишину", //m
"mt_loop": "повторять один трек\">🔁", "mt_loop": "повторять один трек\">🔁",
"mt_one": "остановить после этого трека\">1⃣", "mt_one": "остановить после этого трека\">1⃣",
@ -318,8 +319,13 @@ Ls.rus = {
"mt_c2ng": "не похоже, что ваше устройство поддерживает этот формат, но давайте попробуем и узнаем наверняка", "mt_c2ng": "не похоже, что ваше устройство поддерживает этот формат, но давайте попробуем и узнаем наверняка",
"mt_xowa": "в iOS есть баги, препятствующие фоновому воспроизведению этого формата. Пожалуйста, используйте caf или mp3", "mt_xowa": "в iOS есть баги, препятствующие фоновому воспроизведению этого формата. Пожалуйста, используйте caf или mp3",
"mt_tint": "непрозрачность фона (0-100) на полосе воспроизведения$N$Nделает буферизацию менее отвлекающей", "mt_tint": "непрозрачность фона (0-100) на полосе воспроизведения$N$Nделает буферизацию менее отвлекающей",
"mt_eq": "включить эквалайзер$N$Nboost &lt;code&gt;0&lt;/code&gt; = стандартная громкость$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = обычное стерео$Nwidth &lt;code&gt;0.5&lt;/code&gt; = микширование левого и правого каналов на 50%$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = моно$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; и width &lt;code&gt;10&lt;/code&gt; = удаление голоса :^)$N$Nвключённый эквалайзер полностью убирает задержку между треками, поэтому следует его включить со всеми значениями на 0 (кроме width = 1), если вам нужно бесшовное воспроизведение", "mt_eq": "`включить эквалайзер$N$Nboost `0` = стандартная громкость$N$Nwidth `1 &nbsp;` = обычное стерео$Nwidth `0.5` = микширование левого и правого каналов на 50%$Nwidth `0 &nbsp;` = моно$N$Nboost `-0.8` и width `10` = удаление голоса :^)$N$Nвключённый эквалайзер полностью убирает задержку между треками, поэтому следует его включить со всеми значениями на 0 (кроме width = 1), если вам нужно бесшовное воспроизведение",
"mt_drc": "включить компрессор; также включит эквалайзер для баланса вселенной, так что выставьте всё на 0 кроме width, если он вам не нужен$N$Nпонижает громкость при волне выше значения dB в tresh; каждый dB в ratio равен одному dB на выходе, так что стандартные значения tresh = -24 и ratio = 12 сделают так, что звук никогда не будет громче -22 dB. При таком раскладе можно поставить boost в эквалайзере на 0.8 или даже 1.8 при значении atk = 0 и огромном rls вроде 90 (работает только в Firefox, rls не может быть выше 1 в других браузерах)$N$N(загляните в википедию, там всё объяснено подробнее)", "mt_drc": "включить компрессор; также включит эквалайзер для баланса вселенной, так что выставьте всё на 0 кроме width, если он вам не нужен$N$Nпонижает громкость при волне выше значения dB в tresh; каждый dB в ratio равен одному dB на выходе, так что стандартные значения tresh = -24 и ratio = 12 сделают так, что звук никогда не будет громче -22 dB. При таком раскладе можно поставить boost в эквалайзере на 0.8 или даже 1.8 при значении atk = 0 и огромном rls вроде 90 (работает только в Firefox, rls не может быть выше 1 в других браузерах)$N$N(загляните в википедию, там всё объяснено подробнее)",
"mt_ss": "`включает пропуск тишины; умножает скорость на `уск` возле начала/конца, когда громкость ниже `гром` и позиция в первых `нач`% или последних `кон`%", //m
"mt_ssvt": "порог громкости (0-255)\">гром", //m
"mt_ssts": "активный порог (% трека, начало)\">нач", //m
"mt_sste": "активный порог (% трека, конец)\">кон", //m
"mt_sssm": "множитель скорости воспроизведения\">уск", //m
"mb_play": "играть", "mb_play": "играть",
"mm_hashplay": "воспроизвести этот музыкальный файл?", "mm_hashplay": "воспроизвести этот музыкальный файл?",
@ -398,8 +404,8 @@ Ls.rus = {
"fr_case": "чувствительный к регистру regex\">РеГиСтР", "fr_case": "чувствительный к регистру regex\">РеГиСтР",
"fr_win": "совместимые с windows имена; заменяет <code>&lt;&gt;:&quot;\\|?*</code> японскими полноширинными символами\">win", "fr_win": "совместимые с windows имена; заменяет <code>&lt;&gt;:&quot;\\|?*</code> японскими полноширинными символами\">win",
"fr_slash": "заменяет <code>/</code> символом, который не создаёт новые папки\">без /", "fr_slash": "заменяет <code>/</code> символом, который не создаёт новые папки\">без /",
"fr_re": "поиск по шаблону regex, применяемый к оригинальным именам; группы захвата могут применяться в поле форматирования с помощью &lt;code&gt;(1)&lt;/code&gt; и &lt;code&gt;(2)&lt;/code&gt; и так далее", "fr_re": "`поиск по шаблону regex, применяемый к оригинальным именам; группы захвата могут применяться в поле форматирования с помощью `(1)` и `(2)` и так далее",
"fr_fmt": "вдохновлено foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; заменяется названием трека,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; пропускает [эту] часть, если композитор не указан$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; добавляет ведущие нули до двух цифр", "fr_fmt": "`вдохновлено foobar2000:$N`(title)` заменяется названием трека,$N`[(artist) - ](title)` пропускает [эту] часть, если композитор не указан$N`$lpad((tn),2,0)` добавляет ведущие нули до двух цифр",
"fr_pdel": "удалить", "fr_pdel": "удалить",
"fr_pnew": "сохранить как", "fr_pnew": "сохранить как",
"fr_pname": "предоставьте название для нового шаблона", "fr_pname": "предоставьте название для нового шаблона",
@ -448,7 +454,7 @@ Ls.rus = {
"mk_noname": "введите имя в текстовое поле слева перед тем, как это делать :p", "mk_noname": "введите имя в текстовое поле слева перед тем, как это делать :p",
"nmd_i1": "вы также можете указать нужное расширение, например <code>.md</code>", //m "nmd_i1": "вы также можете указать нужное расширение, например <code>.md</code>", //m
"nmd_i2": "вы можете создавать только файлы <code>.md</code>, так как у вас нет разрешения на удаление", //m "nmd_i2": "вы можете создавать только файлы <code>.{0}</code>, так как у вас нет разрешения на удаление", //m
"tv_load": "Загружаю текстовый документ:\n\n{0}\n\n{1}% ({2} из {3} МиБ загружено)", "tv_load": "Загружаю текстовый документ:\n\n{0}\n\n{1}% ({2} из {3} МиБ загружено)",
"tv_xe1": "не удалось загрузить текстовый файл:\n\nошибка ", "tv_xe1": "не удалось загрузить текстовый файл:\n\nошибка ",

View file

@ -114,7 +114,7 @@ Ls.spa = {
"login": "Iniciar sesión", //m "login": "Iniciar sesión", //m
"access": " acceso", "access": " acceso",
"ot_close": "cerrar submenú", "ot_close": "cerrar submenú",
"ot_search": "buscar archivos por atributos, ruta / nombre, etiquetas de música, o cualquier combinación$N$N&lt;code&gt;foo bar&lt;/code&gt; = debe contener «foo» y «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = debe contener «foo» pero no «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = empieza con «yana» y es un archivo «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = contiene exactamente «try unite»$N$Nel formato de fecha es iso-8601, como$N&lt;code&gt;2009-12-31&lt;/code&gt; o &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`buscar archivos por atributos, ruta / nombre, etiquetas de música, o cualquier combinación$N$N`foo bar` = debe contener «foo» y «bar»,$N`foo -bar` = debe contener «foo» pero no «bar»,$N`^yana .opus$` = empieza con «yana» y es un archivo «opus»$N`&quot;try unite&quot;` = contiene exactamente «try unite»$N$Nel formato de fecha es iso-8601, como$N`2009-12-31` o `2020-09-12 23:30:00`",
"ot_unpost": "dessubir: elimina tus subidas recientes, o aborta las inacabadas", "ot_unpost": "dessubir: elimina tus subidas recientes, o aborta las inacabadas",
"ot_bup": "bup: uploader básico, soporta hasta netscape 4.0", "ot_bup": "bup: uploader básico, soporta hasta netscape 4.0",
"ot_mkdir": "mkdir: crear un nuevo directorio", "ot_mkdir": "mkdir: crear un nuevo directorio",
@ -262,9 +262,9 @@ Ls.spa = {
"cdt_lim": "número máximo de archivos a mostrar en una carpeta", "cdt_lim": "número máximo de archivos a mostrar en una carpeta",
"cdt_ask": "al llegar al final,$Nen lugar de cargar más archivos,$Npreguntar qué hacer", "cdt_ask": "al llegar al final,$Nen lugar de cargar más archivos,$Npreguntar qué hacer",
"cdt_hsort": "cuántas reglas de ordenación (&lt;code&gt;,sorthref&lt;/code&gt;) incluir en las URLs de medios. Ponerlo a 0 también ignorará las reglas de ordenación incluidas en los enlaces de medios al hacer clic en ellos", "cdt_hsort": "`cuántas reglas de ordenación (`,sorthref`) incluir en las URLs de medios. Ponerlo a 0 también ignorará las reglas de ordenación incluidas en los enlaces de medios al hacer clic en ellos",
"cdt_ren": "habilitar menú contextual personalizado, el menú normal sigue siendo accesible con shift + clic derecho", //m "cdt_ren": "habilitar menú contextual personalizado, el menú normal sigue siendo accesible con shift + clic derecho\">activar", //m
"cdt_rdb": "mostrar el menú normal de clic derecho cuando el personalizado ya está abierto y se vuelve a hacer clic", //m "cdt_rdb": "mostrar el menú normal de clic derecho cuando el personalizado ya está abierto y se vuelve a hacer clic\">x2", //m
"tt_entree": "mostrar panel de navegación (barra lateral con árbol de directorios)$NAtajo: B", "tt_entree": "mostrar panel de navegación (barra lateral con árbol de directorios)$NAtajo: B",
"tt_detree": "mostrar breadcrumbs$NAtajo: B", "tt_detree": "mostrar breadcrumbs$NAtajo: B",
@ -282,6 +282,7 @@ Ls.spa = {
"ml_tint": "tinte", "ml_tint": "tinte",
"ml_eq": "ecualizador de audio", "ml_eq": "ecualizador de audio",
"ml_drc": "compresor de rango dinámico", "ml_drc": "compresor de rango dinámico",
"ml_ss": "saltar silencios", //m
"mt_loop": 'poner en bucle/repetir una canción">🔁', "mt_loop": 'poner en bucle/repetir una canción">🔁',
"mt_one": 'parar después de una canción">1⃣', "mt_one": 'parar después de una canción">1⃣',
@ -317,8 +318,13 @@ Ls.spa = {
"mt_c2ng": "tu dispositivo no parece soportar este formato de salida, pero intentémoslo de todas formas", "mt_c2ng": "tu dispositivo no parece soportar este formato de salida, pero intentémoslo de todas formas",
"mt_xowa": "hay errores en iOS que impiden la reproducción en segundo plano con este formato; por favor, usa caf o mp3 en su lugar", "mt_xowa": "hay errores en iOS que impiden la reproducción en segundo plano con este formato; por favor, usa caf o mp3 en su lugar",
"mt_tint": "nivel de fondo (0-100) en la barra de búsqueda$Npara hacer el buffering menos molesto", "mt_tint": "nivel de fondo (0-100) en la barra de búsqueda$Npara hacer el buffering menos molesto",
"mt_eq": "activa el ecualizador y el control de ganancia;$N$Nganancia &lt;code&gt;0&lt;/code&gt; = volumen estándar 100% (sin modificar)$N$Nancho &lt;code&gt;1 &nbsp;&lt;/code&gt; = estéreo estándar (sin modificar)$Nancho &lt;code&gt;0.5&lt;/code&gt; = 50% de crossfeed izq-der$Nancho &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nganancia &lt;code&gt;-0.8&lt;/code&gt; y ancho &lt;code&gt;10&lt;/code&gt; = eliminación de voz :^)$N$Nactivar el ecualizador hace que los álbumes sin pausas sean completamente sin pausas, así que déjalo activado con todos los valores a cero (excepto ancho = 1) si eso te importa", "mt_eq": "`activa el ecualizador y el control de ganancia;$N$Nganancia `0` = volumen estándar 100% (sin modificar)$N$Nancho `1 &nbsp;` = estéreo estándar (sin modificar)$Nancho `0.5` = 50% de crossfeed izq-der$Nancho `0 &nbsp;` = mono$N$Nganancia `-0.8` y ancho `10` = eliminación de voz :^)$N$Nactivar el ecualizador hace que los álbumes sin pausas sean completamente sin pausas, así que déjalo activado con todos los valores a cero (excepto ancho = 1) si eso te importa",
"mt_drc": "activa el compresor de rango dinámico (aplanador de volumen / brickwaller); también activará el EQ para equilibrar el espagueti, así que pon todos los campos de EQ excepto 'ancho' a 0 si no lo quieres$N$Nbaja el volumen del audio por encima de THRESHOLD dB; por cada RATIO dB pasado THRESHOLD hay 1 dB de salida, así que los valores por defecto de umbral -24 y ratio 12 significan que nunca debería sonar más fuerte de -22 dB y es seguro aumentar la ganancia del ecualizador a 0.8, o incluso 1.8 con ATK 0 y un RLS enorme como 90 (solo funciona en firefox; RLS es máx. 1 en otros navegadores)$N$N(ver wikipedia, lo explican mucho mejor)", "mt_drc": "activa el compresor de rango dinámico (aplanador de volumen / brickwaller); también activará el EQ para equilibrar el espagueti, así que pon todos los campos de EQ excepto 'ancho' a 0 si no lo quieres$N$Nbaja el volumen del audio por encima de THRESHOLD dB; por cada RATIO dB pasado THRESHOLD hay 1 dB de salida, así que los valores por defecto de umbral -24 y ratio 12 significan que nunca debería sonar más fuerte de -22 dB y es seguro aumentar la ganancia del ecualizador a 0.8, o incluso 1.8 con ATK 0 y un RLS enorme como 90 (solo funciona en firefox; RLS es máx. 1 en otros navegadores)$N$N(ver wikipedia, lo explican mucho mejor)",
"mt_ss": "`activa salto de silencio; multiplica la velocidad por `av` cerca del inicio/fin cuando el volumen está bajo `vol` y la posición está en los primeros `ini`% o últimos `fin`%", //m
"mt_ssvt": "umbral de volumen (0-255)\">vol", //m
"mt_ssts": "umbral activo (% pista, inicio)\">ini", //m
"mt_sste": "umbral activo (% pista, fin)\">fin", //m
"mt_sssm": "multiplicador de velocidad de reproducción\">av", //m
"mb_play": "reproducir", "mb_play": "reproducir",
"mm_hashplay": "¿reproducir este archivo de audio?", "mm_hashplay": "¿reproducir este archivo de audio?",
@ -397,8 +403,8 @@ Ls.spa = {
"fr_case": "regex sensible a mayúsculas\">mayús", "fr_case": "regex sensible a mayúsculas\">mayús",
"fr_win": "nombres seguros para windows; reemplaza <code>&lt;&gt;:&quot;\\|?*</code> con caracteres japoneses de ancho completo\">win", "fr_win": "nombres seguros para windows; reemplaza <code>&lt;&gt;:&quot;\\|?*</code> con caracteres japoneses de ancho completo\">win",
"fr_slash": "reemplaza <code>/</code> con un carácter que no cree nuevas carpetas\">sin /", "fr_slash": "reemplaza <code>/</code> con un carácter que no cree nuevas carpetas\">sin /",
"fr_re": "patrón de búsqueda regex para aplicar a los nombres de archivo originales; los grupos de captura se pueden referenciar en el campo de formato de abajo como &lt;code&gt;(1)&lt;/code&gt; y &lt;code&gt;(2)&lt;/code&gt; y así sucesivamente", "fr_re": "`patrón de búsqueda regex para aplicar a los nombres de archivo originales; los grupos de captura se pueden referenciar en el campo de formato de abajo como `(1)` y `(2)` y así sucesivamente",
"fr_fmt": "inspirado en foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; se reemplaza por el título de la canción,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; omite la parte [entre corchetes] si el artista está en blanco$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; rellena el número de pista a 2 dígitos", "fr_fmt": "`inspirado en foobar2000:$N`(title)` se reemplaza por el título de la canción,$N`[(artist) - ](title)` omite la parte [entre corchetes] si el artista está en blanco$N`$lpad((tn),2,0)` rellena el número de pista a 2 dígitos",
"fr_pdel": "eliminar", "fr_pdel": "eliminar",
"fr_pnew": "guardar como", "fr_pnew": "guardar como",
"fr_pname": "proporciona un nombre para tu nuevo preajuste", "fr_pname": "proporciona un nombre para tu nuevo preajuste",
@ -447,7 +453,7 @@ Ls.spa = {
"mk_noname": "escribe un nombre en el campo de texto de la izquierda antes de hacer eso :p", "mk_noname": "escribe un nombre en el campo de texto de la izquierda antes de hacer eso :p",
"nmd_i1": "también puedes añadir la extensión que quieras, por ejemplo <code>.md</code>", //m "nmd_i1": "también puedes añadir la extensión que quieras, por ejemplo <code>.md</code>", //m
"nmd_i2": "solo puedes crear archivos <code>.md</code> porque no tienes permiso para borrar", //m "nmd_i2": "solo puedes crear archivos <code>.{0}</code> porque no tienes permiso para borrar", //m
"tv_load": "Cargando documento de texto:\n\n{0}\n\n{1}% ({2} de {3} MiB cargados)", "tv_load": "Cargando documento de texto:\n\n{0}\n\n{1}% ({2} de {3} MiB cargados)",
"tv_xe1": "no se pudo cargar el archivo de texto:\n\nerror ", "tv_xe1": "no se pudo cargar el archivo de texto:\n\nerror ",

View file

@ -114,7 +114,7 @@ Ls.swe = {
"login": "Logga in", //m "login": "Logga in", //m
"access": "-rättighet", "access": "-rättighet",
"ot_close": "stäng undermeny", "ot_close": "stäng undermeny",
"ot_search": "sök efter filer via attribut, sökväg / namn, musiktaggar, eller någon kombination av dessa$N$N&lt;code&gt;foo bar&lt;/code&gt; = måste innehålla både «foo» och «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = måste innehålla «foo» men inte «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = måste börja med «yana» och vara en «opus»-fil$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = måste innehålla exakt «try unite»$N$Ndatumformatet är iso-8601, t.ex.$N&lt;code&gt;2009-12-31&lt;/code&gt; eller &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`sök efter filer via attribut, sökväg / namn, musiktaggar, eller någon kombination av dessa$N$N`foo bar` = måste innehålla både «foo» och «bar»,$N`foo -bar` = måste innehålla «foo» men inte «bar»,$N`^yana .opus$` = måste börja med «yana» och vara en «opus»-fil$N`&quot;try unite&quot;` = måste innehålla exakt «try unite»$N$Ndatumformatet är iso-8601, t.ex.$N`2009-12-31` eller `2020-09-12 23:30:00`",
"ot_unpost": "unpost: radera dina senaste uppladdningar, eller avbryt pågående sådana", "ot_unpost": "unpost: radera dina senaste uppladdningar, eller avbryt pågående sådana",
"ot_bup": "bup: enkel uppladdare, stödjer t o m netscape 4.0", "ot_bup": "bup: enkel uppladdare, stödjer t o m netscape 4.0",
"ot_mkdir": "mkdir: skapa en ny mapp", "ot_mkdir": "mkdir: skapa en ny mapp",
@ -263,9 +263,9 @@ Ls.swe = {
"cdt_lim": "högsta antal filer att visa in en mapp", "cdt_lim": "högsta antal filer att visa in en mapp",
"cdt_ask": "när du når botten av vyn,$Nbe om en åtgärd istället för att ladda fler filer", "cdt_ask": "när du når botten av vyn,$Nbe om en åtgärd istället för att ladda fler filer",
"cdt_hsort": "hur många sorteringsregler (&lt;code&gt;,sorthref&lt;/code&gt;) att inkludera i media-URL:er. Sätts detta till 0 kommer regler i klickade medialänkar även att ignoreras", "cdt_hsort": "`hur många sorteringsregler (`,sorthref`) att inkludera i media-URL:er. Sätts detta till 0 kommer regler i klickade medialänkar även att ignoreras",
"cdt_ren": "aktivera anpassad högerklicksmeny, den vanliga menyn är tillgänglig med shift + högerklick", //m "cdt_ren": "aktivera anpassad högerklicksmeny, den vanliga menyn är tillgänglig med shift + högerklick\">aktivera", //m
"cdt_rdb": "visa den vanliga högerklicksmenyn när den anpassade redan är öppen och man högerklickar igen", //m "cdt_rdb": "visa den vanliga högerklicksmenyn när den anpassade redan är öppen och man högerklickar igen\">x2", //m
"tt_entree": "visa trädvy$NSnabbtangent: B", "tt_entree": "visa trädvy$NSnabbtangent: B",
"tt_detree": "visa brödsmulor$NSnabbtangent: B", "tt_detree": "visa brödsmulor$NSnabbtangent: B",
@ -283,6 +283,7 @@ Ls.swe = {
"ml_tint": "hy", "ml_tint": "hy",
"ml_eq": "ljudutjämnare", "ml_eq": "ljudutjämnare",
"ml_drc": "dynamikkompressor", "ml_drc": "dynamikkompressor",
"ml_ss": "hoppa över tystnad", //m
"mt_loop": "upprepa en låt\">🔁", "mt_loop": "upprepa en låt\">🔁",
"mt_one": "stoppa uppspelningen efter en låt\">1⃣", "mt_one": "stoppa uppspelningen efter en låt\">1⃣",
@ -318,8 +319,13 @@ Ls.swe = {
"mt_c2ng": "din enhet verkar inte stödja det här formatet, men vi provar ändå", "mt_c2ng": "din enhet verkar inte stödja det här formatet, men vi provar ändå",
"mt_xowa": "det finns buggar i iOS som hindrar uppspelning i bakgrunden med detta format; vänligen använd caf eller mp3 istället", "mt_xowa": "det finns buggar i iOS som hindrar uppspelning i bakgrunden med detta format; vänligen använd caf eller mp3 istället",
"mt_tint": "nivå på bakgrundsfärg (0-100) på uppspelningsreglaget;$Ngör buffring mindre distraherande", "mt_tint": "nivå på bakgrundsfärg (0-100) på uppspelningsreglaget;$Ngör buffring mindre distraherande",
"mt_eq": "aktiverar utjämning och förstärkning;$N$Nboost &lt;code&gt;0&lt;/code&gt; = standard 100%-volym (omodifierad)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = standard stereo (omodifierad)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% vänster-höger crossfeed$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = tar bort sång :^)$N$Nnär utjämningen är aktiverad blir gaplösa album verkligen gaplösa, så låt den stå påslagen med alla värden satta till 0 (förutom width = 1) om du bryr dig om det", "mt_eq": "`aktiverar utjämning och förstärkning;$N$Nboost `0` = standard 100%-volym (omodifierad)$N$Nwidth `1 &nbsp;` = standard stereo (omodifierad)$Nwidth `0.5` = 50% vänster-höger crossfeed$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = tar bort sång :^)$N$Nnär utjämningen är aktiverad blir gaplösa album verkligen gaplösa, så låt den stå påslagen med alla värden satta till 0 (förutom width = 1) om du bryr dig om det",
"mt_drc": "aktiverar dynamikkompressorn (volymtillplattning / brickwaller); aktiverar även utjämnaren för att balansera röran, så sätt alla fält i utjämnaren förutom 'width' till 0 om du inte vill ha den$N$Nsänker all volym över THRESHOLD dB; för varje RATIO dB över THRESHOLD blir det 1 dB av output, så standardvärdena tresh = -24 och ratio = 12 innebär att volymen aldrig bör bli högre än -22 dB och det är säkert att höja utjämnarens boost till 0.8, eller t.o.m. 1.8 med ATK 0 och ett högt RLS-värde t.ex. 90 (fungerar endast i firefox; RLS är låst till högst 1 i andra webbläsare)$N$N(se wikipedia för en bättre förklaring)", "mt_drc": "aktiverar dynamikkompressorn (volymtillplattning / brickwaller); aktiverar även utjämnaren för att balansera röran, så sätt alla fält i utjämnaren förutom 'width' till 0 om du inte vill ha den$N$Nsänker all volym över THRESHOLD dB; för varje RATIO dB över THRESHOLD blir det 1 dB av output, så standardvärdena tresh = -24 och ratio = 12 innebär att volymen aldrig bör bli högre än -22 dB och det är säkert att höja utjämnarens boost till 0.8, eller t.o.m. 1.8 med ATK 0 och ett högt RLS-värde t.ex. 90 (fungerar endast i firefox; RLS är låst till högst 1 i andra webbläsare)$N$N(se wikipedia för en bättre förklaring)",
"mt_ss": "`aktiverar tystnadshopp; multiplicerar uppspelningshastigheten med `sn` nära start/slut när volymen är under `vol` och positionen är inom första `sta`% eller sista `slt`%", //m
"mt_ssvt": "volymtröskel (0-255)\">vol", //m
"mt_ssts": "aktiv tröskel (% spår, start)\">sta", //m
"mt_sste": "aktiv tröskel (% spår, slut)\">slt", //m
"mt_sssm": "uppspelningshastighetsmultiplikator\">sn", //m
"mb_play": "play", "mb_play": "play",
"mm_hashplay": "spela upp den här ljudfilen?", "mm_hashplay": "spela upp den här ljudfilen?",
@ -398,8 +404,8 @@ Ls.swe = {
"fr_case": "skiftlägeskänsligt reguljärt uttryck\">skift", "fr_case": "skiftlägeskänsligt reguljärt uttryck\">skift",
"fr_win": "windows-säkra namn; ersätt <code>&lt;&gt;:&quot;\\|?*</code> med japanska fullbreddtecken\">win", "fr_win": "windows-säkra namn; ersätt <code>&lt;&gt;:&quot;\\|?*</code> med japanska fullbreddtecken\">win",
"fr_slash": "ersätt <code>/</code> med ett tecken som inte skapar nya mappar\">ingen /", "fr_slash": "ersätt <code>/</code> med ett tecken som inte skapar nya mappar\">ingen /",
"fr_re": "reguljärt sökuttryck att tillämpa på ursprungliga filnamn; grupper kan hänvisas till i formatfältet nedan via &lt;code&gt;(1)&lt;/code&gt; och &lt;code&gt;(2)&lt;/code&gt; osv.", "fr_re": "`reguljärt sökuttryck att tillämpa på ursprungliga filnamn; grupper kan hänvisas till i formatfältet nedan via `(1)` och `(2)` osv.",
"fr_fmt": "inspirerat av foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; ersätts av låttitel,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; skippar [detta] om artisten är tom$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; fyller i spårnumret till 2 siffror", "fr_fmt": "`inspirerat av foobar2000:$N`(title)` ersätts av låttitel,$N`[(artist) - ](title)` skippar [detta] om artisten är tom$N`$lpad((tn),2,0)` fyller i spårnumret till 2 siffror",
"fr_pdel": "ta bort", "fr_pdel": "ta bort",
"fr_pnew": "spara som", "fr_pnew": "spara som",
"fr_pname": "ge ett nytt namn på din inställning", "fr_pname": "ge ett nytt namn på din inställning",
@ -448,7 +454,7 @@ Ls.swe = {
"mk_noname": "skriv ett namn i fältet till vänster först :p", "mk_noname": "skriv ett namn i fältet till vänster först :p",
"nmd_i1": "lägg också till filändelsen du vill ha, till exempel <code>.md</code>", //m "nmd_i1": "lägg också till filändelsen du vill ha, till exempel <code>.md</code>", //m
"nmd_i2": "du kan bara skapa <code>.md</code>-filer eftersom du inte har borttagningsbehörighet", //m "nmd_i2": "du kan bara skapa <code>.{0}</code>-filer eftersom du inte har borttagningsbehörighet", //m
"tv_load": "Laddar textfil:\n\n{0}\n\n{1}% ({2} av {3} MiB laddat)", "tv_load": "Laddar textfil:\n\n{0}\n\n{1}% ({2} av {3} MiB laddat)",
"tv_xe1": "kunde ej ladda textfil:\n\nfel ", "tv_xe1": "kunde ej ladda textfil:\n\nfel ",

View file

@ -114,7 +114,7 @@ Ls.tur = {
"login": "Giriş", "login": "Giriş",
"access": " erişim", "access": " erişim",
"ot_close": "alt menüyü kapat", "ot_close": "alt menüyü kapat",
"ot_search": "dosyaları özniteliklere, yol / ad, müzik etiketlerine veya bunların herhangi bir kombinasyonuna göre arayın$N$N&lt;code&gt;foo bar&lt;/code&gt; = hem «foo» hem de «bar» içermelidir,$N&lt;code&gt;foo -bar&lt;/code&gt; = «foo» içermeli ancak «bar» içermemelidir,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = «yana» ile başlamalı ve bir «opus» dosyası olmalıdır$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = tam olarak «try unite» içermelidir$N$N tarih formatı iso-8601'dir, gibi$N&lt;code&gt;2009-12-31&lt;/code&gt; veya &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`dosyaları özniteliklere, yol / ad, müzik etiketlerine veya bunların herhangi bir kombinasyonuna göre arayın$N$N`foo bar` = hem «foo» hem de «bar» içermelidir,$N`foo -bar` = «foo» içermeli ancak «bar» içermemelidir,$N`^yana .opus$` = «yana» ile başlamalı ve bir «opus» dosyası olmalıdır$N`&quot;try unite&quot;` = tam olarak «try unite» içermelidir$N$N tarih formatı iso-8601'dir, gibi$N`2009-12-31` veya `2020-09-12 23:30:00`",
"ot_unpost": "unpost: son yüklemelerinizi silin veya tamamlanmamış olanları iptal edin", "ot_unpost": "unpost: son yüklemelerinizi silin veya tamamlanmamış olanları iptal edin",
"ot_bup": "bup: temel yükleyici, hatta netscape 4.0'ı destekler", "ot_bup": "bup: temel yükleyici, hatta netscape 4.0'ı destekler",
"ot_mkdir": "mkdir: yeni bir dizin oluştur", "ot_mkdir": "mkdir: yeni bir dizin oluştur",
@ -263,9 +263,9 @@ Ls.tur = {
"cdt_lim": "bir klasörde gösterilecek maksimum dosya sayısı", "cdt_lim": "bir klasörde gösterilecek maksimum dosya sayısı",
"cdt_ask": "aşağı kaydırırken,$Ndaha fazla dosya yüklemek yerine,$Nne yapılacağını sor", "cdt_ask": "aşağı kaydırırken,$Ndaha fazla dosya yüklemek yerine,$Nne yapılacağını sor",
"cdt_hsort": "medya-URL'lerinde dahil edilecek sıralama kurallarının sayısı (&lt;code&gt;,sorthref&lt;/code&gt;). Bunu 0 olarak ayarlamak, tıklanırken medya bağlantılarına dahil edilen sıralama kurallarını da yok sayacaktır", "cdt_hsort": "`medya-URL'lerinde dahil edilecek sıralama kurallarının sayısı (`,sorthref`). Bunu 0 olarak ayarlamak, tıklanırken medya bağlantılarına dahil edilen sıralama kurallarını da yok sayacaktır",
"cdt_ren": "özel sağ tık menüsünü etkinleştir, normal menü shift + sağ tık ile erişilebilir", //m "cdt_ren": "özel sağ tık menüsünü etkinleştir, normal menü shift + sağ tık ile erişilebilir\">etkinleştir", //m
"cdt_rdb": "özel menü zaten açıkken tekrar sağ tıklanınca normal sağ tık menüsünü göster", //m "cdt_rdb": "özel menü zaten açıkken tekrar sağ tıklanınca normal sağ tık menüsünü göster\">x2", //m
"tt_entree": "navigasyon panosunu göster (yan dizin panosu)$NHotkey: B", "tt_entree": "navigasyon panosunu göster (yan dizin panosu)$NHotkey: B",
"tt_detree": "içerik haritasını göster$Kısayol: B", "tt_detree": "içerik haritasını göster$Kısayol: B",
@ -283,6 +283,7 @@ Ls.tur = {
"ml_tint": "tonlama", "ml_tint": "tonlama",
"ml_eq": "ses eşitleyici", "ml_eq": "ses eşitleyici",
"ml_drc": "dinamik aralık sıkıştırıcı", "ml_drc": "dinamik aralık sıkıştırıcı",
"ml_ss": "sessizliği atla", //m
"mt_loop": "bir şarkıyı döngüye al / tekrar et\">🔁", "mt_loop": "bir şarkıyı döngüye al / tekrar et\">🔁",
"mt_one": "bir şarkıdan sonra dur\">1⃣", "mt_one": "bir şarkıdan sonra dur\">1⃣",
@ -318,8 +319,13 @@ Ls.tur = {
"mt_c2ng": "cihazınız bu çıkış formatını desteklemiyor gibi görünüyor, ama yine de deneyelim", "mt_c2ng": "cihazınız bu çıkış formatını desteklemiyor gibi görünüyor, ama yine de deneyelim",
"mt_xowa": "iOS'ta bu formatta arka plan oynatımını engelleyen hatalar var; lütfen bunun yerine caf veya mp3 kullanın", "mt_xowa": "iOS'ta bu formatta arka plan oynatımını engelleyen hatalar var; lütfen bunun yerine caf veya mp3 kullanın",
"mt_tint": "seekbar'da arka plan seviyesi (0-100)$ön belleğin daha az dikkat dağıtıcı olmasını sağlar", "mt_tint": "seekbar'da arka plan seviyesi (0-100)$ön belleğin daha az dikkat dağıtıcı olmasını sağlar",
"mt_eq": "ekolayzer ve kazanç kontrolünü aktifleştirir;$N$Nboost &lt;code&gt;0&lt;/code&gt; = standart %100 ses (varsayılan)$N$Ngenişlik &lt;code&gt;1 &nbsp;&lt;/code&gt; = standart çift kanal (varsayılan)$Ngenişlik &lt;code&gt;0.5&lt;/code&gt; = %50 sol-sağ crossfeed$Ngenişlik &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nartış &lt;code&gt;-0.8&lt;/code&gt; &amp; artış &lt;code&gt;10&lt;/code&gt; = vokal kaldırma :^)$N$Nekolayzeri aktifleştirmek, aralıksız albümleri gerçekten aralıksız yapar, bu yüzden tüm değerleri 0'da bırakın (width = 1 hariç) tabii bunu umursuyorsnaız", "mt_eq": "`ekolayzer ve kazanç kontrolünü aktifleştirir;$N$Nboost `0` = standart %100 ses (varsayılan)$N$Ngenişlik `1 &nbsp;` = standart çift kanal (varsayılan)$Ngenişlik `0.5` = %50 sol-sağ crossfeed$Ngenişlik `0 &nbsp;` = mono$N$Nartış `-0.8` &amp; artış `10` = vokal kaldırma :^)$N$Nekolayzeri aktifleştirmek, aralıksız albümleri gerçekten aralıksız yapar, bu yüzden tüm değerleri 0'da bırakın (width = 1 hariç) tabii bunu umursuyorsnaız",
"mt_drc": "dinamik aralık sıkıştırıcıyı (ses düzleştiriciyi) aktifleştirir; spagettiyi dengelemek için aynı zamanda EQ'yu da açar, bunun olmasını istemiyorsanız EQ'daki 'genişlik' hariç tüm alanları 0 yapın$N$Nsınır dB'inin üstündeki tüm sesleri kısar; sınırı geçen her 1 dB için ancak 1 dB ses verilir, yani varsayılan eşik -24 ve oran 12 değerleri sesin -22 dB'den yükseğe çıkmayacağını ve EQ artışının 0,8'e, hatta ATK 0 ve hayvan gibi RLS (örneğin 90, bu sadece Firefox'ta çalışır; diğer tarayıcılarda RLS en fazla 1'dir) gibi değerlerle 1.,8'e kadar güvenle çıkabileceğini gösteriyor$N$N(git vikipediye bak, orada daha iyi açıklanıyor)", "mt_drc": "dinamik aralık sıkıştırıcıyı (ses düzleştiriciyi) aktifleştirir; spagettiyi dengelemek için aynı zamanda EQ'yu da açar, bunun olmasını istemiyorsanız EQ'daki 'genişlik' hariç tüm alanları 0 yapın$N$Nsınır dB'inin üstündeki tüm sesleri kısar; sınırı geçen her 1 dB için ancak 1 dB ses verilir, yani varsayılan eşik -24 ve oran 12 değerleri sesin -22 dB'den yükseğe çıkmayacağını ve EQ artışının 0,8'e, hatta ATK 0 ve hayvan gibi RLS (örneğin 90, bu sadece Firefox'ta çalışır; diğer tarayıcılarda RLS en fazla 1'dir) gibi değerlerle 1.,8'e kadar güvenle çıkabileceğini gösteriyor$N$N(git vikipediye bak, orada daha iyi açıklanıyor)",
"mt_ss": "`sessizlik atlamayı etkinleştirir; ses `ses` altındayken ve konum ilk `bas`% veya son `son`% içindeyken başlangıç/bitiş yakınında oynatma hızını `ileri` ile çarpar", //m
"mt_ssvt": "ses eşiği (0-255)\">ses", //m
"mt_ssts": "etkin eşik (% parça, başlangıç)\">bas", //m
"mt_sste": "etkin eşik (% parça, bitiş)\">son", //m
"mt_sssm": "oynatma hızı çarpanı\">ileri", //m
"mb_play": "oynat", "mb_play": "oynat",
"mm_hashplay": "bu ses dosyası oynatılsın mı?", "mm_hashplay": "bu ses dosyası oynatılsın mı?",
@ -398,8 +404,8 @@ Ls.tur = {
"fr_case": "büyük/küçük harf duyarlı regex\">büyük/küçük harf", "fr_case": "büyük/küçük harf duyarlı regex\">büyük/küçük harf",
"fr_win": "windows'a uygun adlar; <code>&lt;&gt;:&quot;\\|?*</code> karakterlerini Japonca tam genişlik karakterleriyle değiştir\">win", "fr_win": "windows'a uygun adlar; <code>&lt;&gt;:&quot;\\|?*</code> karakterlerini Japonca tam genişlik karakterleriyle değiştir\">win",
"fr_slash": "<code>/</code> karakterini yeni klasörlerin oluşturulmasına neden olmayan bir karakterle değiştir\">/ yok", "fr_slash": "<code>/</code> karakterini yeni klasörlerin oluşturulmasına neden olmayan bir karakterle değiştir\">/ yok",
"fr_re": "orijinal dosya adlarına uygulanacak regex arama deseni; yakalama grupları aşağıdaki format alanında &lt;code&gt;(1)&lt;/code&gt; ve &lt;code&gt;(2)&lt;/code&gt; gibi belirtilebilir", "fr_re": "`orijinal dosya adlarına uygulanacak regex arama deseni; yakalama grupları aşağıdaki format alanında `(1)` ve `(2)` gibi belirtilebilir",
"fr_fmt": "foobar2000'den esinlenilmiştir:$N&lt;code&gt;(title)&lt;/code&gt; şarkı başlığıyla değiştirilir,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; sanatçı boşsa [bu] kısmı atlar$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; parça numarasını 2 basamağa doldurur", "fr_fmt": "`foobar2000'den esinlenilmiştir:$N`(title)` şarkı başlığıyla değiştirilir,$N`[(artist) - ](title)` sanatçı boşsa [bu] kısmı atlar$N`$lpad((tn),2,0)` parça numarasını 2 basamağa doldurur",
"fr_pdel": "sil", "fr_pdel": "sil",
"fr_pnew": "farklı kaydet", "fr_pnew": "farklı kaydet",
"fr_pname": "yeni ayarınızı adlandırın", "fr_pname": "yeni ayarınızı adlandırın",
@ -448,7 +454,7 @@ Ls.tur = {
"mk_noname": "bunu yapmadan önce soldaki boşluğa bir şeyler yazsana :p", "mk_noname": "bunu yapmadan önce soldaki boşluğa bir şeyler yazsana :p",
"nmd_i1": "ayrıca istediğin dosya uzantısını ekleyebilirsin, örneğin <code>.md</code>", //m "nmd_i1": "ayrıca istediğin dosya uzantısını ekleyebilirsin, örneğin <code>.md</code>", //m
"nmd_i2": "silme iznin olmadığı için yalnızca <code>.md</code> dosyaları oluşturabilirsin", //m "nmd_i2": "silme iznin olmadığı için yalnızca <code>.{0}</code> dosyaları oluşturabilirsin", //m
"tv_load": "Metin belgesi yükleniyor:\n\n{0}\n\n{1}% ({2} of {3} MiB yüklendi)", "tv_load": "Metin belgesi yükleniyor:\n\n{0}\n\n{1}% ({2} of {3} MiB yüklendi)",
"tv_xe1": "metin dosyası yüklenemedi:\n\nhata ", "tv_xe1": "metin dosyası yüklenemedi:\n\nhata ",

View file

@ -114,7 +114,7 @@ Ls.ukr = {
"login": "увійти", //m "login": "увійти", //m
"access": " доступ", "access": " доступ",
"ot_close": "закрити підменю", "ot_close": "закрити підменю",
"ot_search": "пошук файлів за атрибутами, шляхом / іменем, музичними тегами, або будь-якою комбінацією$N$N&lt;code&gt;foo bar&lt;/code&gt; = має містити «foo» і «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = має містити «foo», але не «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = починатися з «yana» і бути файлом «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = містити точно «try unite»$N$Nформат дати - iso-8601, наприклад$N&lt;code&gt;2009-12-31&lt;/code&gt; або &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`пошук файлів за атрибутами, шляхом / іменем, музичними тегами, або будь-якою комбінацією$N$N`foo bar` = має містити «foo» і «bar»,$N`foo -bar` = має містити «foo», але не «bar»,$N`^yana .opus$` = починатися з «yana» і бути файлом «opus»$N`&quot;try unite&quot;` = містити точно «try unite»$N$Nформат дати - iso-8601, наприклад$N`2009-12-31` або `2020-09-12 23:30:00`",
"ot_unpost": "скасувати: видалити недавні завантаження або перервати незавершені", "ot_unpost": "скасувати: видалити недавні завантаження або перервати незавершені",
"ot_bup": "bup: основний завантажувач, підтримує навіть netscape 4.0", "ot_bup": "bup: основний завантажувач, підтримує навіть netscape 4.0",
"ot_mkdir": "mkdir: створити нову папку", "ot_mkdir": "mkdir: створити нову папку",
@ -263,9 +263,9 @@ Ls.ukr = {
"cdt_lim": "максимальна кількість файлів для показу в папці", "cdt_lim": "максимальна кількість файлів для показу в папці",
"cdt_ask": "при прокрутці до низу,$Nзамість завантаження більше файлів,$Nзапитати, що робити", "cdt_ask": "при прокрутці до низу,$Nзамість завантаження більше файлів,$Nзапитати, що робити",
"cdt_hsort": "скільки правил сортування (&lt;code&gt;,sorthref&lt;/code&gt;) включати в медіа-URL. Встановлення цього в 0 також буде ігнорувати правила сортування, включені в медіа посилання при їх натисканні", "cdt_hsort": "`скільки правил сортування (`,sorthref`) включати в медіа-URL. Встановлення цього в 0 також буде ігнорувати правила сортування, включені в медіа посилання при їх натисканні",
"cdt_ren": "увімкнути користувацьке контекстне меню, звичайне меню доступне при натисканні shift і правої кнопки миші", //m "cdt_ren": "увімкнути користувацьке контекстне меню, звичайне меню доступне при натисканні shift і правої кнопки миші\">увімкнути", //m
"cdt_rdb": "показувати звичайне меню правої кнопки, якщо власне меню вже відкрите і відбувається повторне клацання", //m "cdt_rdb": "показувати звичайне меню правої кнопки, якщо власне меню вже відкрите і відбувається повторне клацання\">x2", //m
"tt_entree": "показати панель навігації (бічна панель дерева каталогів)$NГаряча клавіша: B", "tt_entree": "показати панель навігації (бічна панель дерева каталогів)$NГаряча клавіша: B",
"tt_detree": "показати хлібні крихти$NГаряча клавіша: B", "tt_detree": "показати хлібні крихти$NГаряча клавіша: B",
@ -283,6 +283,7 @@ Ls.ukr = {
"ml_tint": "відтінок", "ml_tint": "відтінок",
"ml_eq": "аудіо еквалайзер", "ml_eq": "аудіо еквалайзер",
"ml_drc": "компресор динамічного діапазону", "ml_drc": "компресор динамічного діапазону",
"ml_ss": "пропускати тишу", //m
"mt_loop": "зациклити/повторити одну пісню\">🔁", "mt_loop": "зациклити/повторити одну пісню\">🔁",
"mt_one": "зупинити після однієї пісні\">1⃣", "mt_one": "зупинити після однієї пісні\">1⃣",
@ -318,8 +319,13 @@ Ls.ukr = {
"mt_c2ng": "ваш пристрій, здається, не підтримує цей вихідний формат, але давайте все одно спробуємо", "mt_c2ng": "ваш пристрій, здається, не підтримує цей вихідний формат, але давайте все одно спробуємо",
"mt_xowa": "є баги в iOS, які запобігають фоновому відтворенню з використанням цього формату; будь ласка, використовуйте caf або mp3 замість цього", "mt_xowa": "є баги в iOS, які запобігають фоновому відтворенню з використанням цього формату; будь ласка, використовуйте caf або mp3 замість цього",
"mt_tint": "рівень фону (0-100) на смузі перемотування$Nщоб зробити буферизацію менш відвертаючою", "mt_tint": "рівень фону (0-100) на смузі перемотування$Nщоб зробити буферизацію менш відвертаючою",
"mt_eq": "вмикає еквалайзер і контроль посилення;$N$Nпосилення &lt;code&gt;0&lt;/code&gt; = стандартна 100% гучність (немодифікована)$N$Nширина &lt;code&gt;1 &nbsp;&lt;/code&gt; = стандартне стерео (немодифіковане)$Nширина &lt;code&gt;0.5&lt;/code&gt; = 50% перехресне живлення ліво-право$Nширина &lt;code&gt;0 &nbsp;&lt;/code&gt; = моно$N$Nпосилення &lt;code&gt;-0.8&lt;/code&gt; &amp; ширина &lt;code&gt;10&lt;/code&gt; = видалення вокалу :^)$N$Nвключення еквалайзера робить безшовні альбоми повністю безшовними, тому залишайте його увімкненим з усіма значеннями в нулі (окрім ширини = 1), якщо вам це важливо", "mt_eq": "`вмикає еквалайзер і контроль посилення;$N$Nпосилення `0` = стандартна 100% гучність (немодифікована)$N$Nширина `1 &nbsp;` = стандартне стерео (немодифіковане)$Nширина `0.5` = 50% перехресне живлення ліво-право$Nширина `0 &nbsp;` = моно$N$Nпосилення `-0.8` &amp; ширина `10` = видалення вокалу :^)$N$Nвключення еквалайзера робить безшовні альбоми повністю безшовними, тому залишайте його увімкненим з усіма значеннями в нулі (окрім ширини = 1), якщо вам це важливо",
"mt_drc": "вмикає компресор динамічного діапазону (вирівнювач гучності / цегловий вал); також увімкне EQ для балансування спагеті, тому встановіть всі поля EQ окрім 'width' в 0, якщо ви цього не хочете$N$Nзнижує гучність аудіо вище THRESHOLD дБ; для кожного RATIO дБ понад THRESHOLD є 1 дБ виходу, тому стандартні значення tresh -24 і ratio 12 означають, що він ніколи не повинен стати гучнішим за -22 дБ і безпечно збільшити посилення еквалайзера до 0.8, або навіть 1.8 з ATK 0 і величезним RLS як 90 (працює тільки в firefox; RLS максимум 1 в інших браузерах)$N$N(дивіться вікіпедію, вони пояснюють це набагато краще)", "mt_drc": "вмикає компресор динамічного діапазону (вирівнювач гучності / цегловий вал); також увімкне EQ для балансування спагеті, тому встановіть всі поля EQ окрім 'width' в 0, якщо ви цього не хочете$N$Nзнижує гучність аудіо вище THRESHOLD дБ; для кожного RATIO дБ понад THRESHOLD є 1 дБ виходу, тому стандартні значення tresh -24 і ratio 12 означають, що він ніколи не повинен стати гучнішим за -22 дБ і безпечно збільшити посилення еквалайзера до 0.8, або навіть 1.8 з ATK 0 і величезним RLS як 90 (працює тільки в firefox; RLS максимум 1 в інших браузерах)$N$N(дивіться вікіпедію, вони пояснюють це набагато краще)",
"mt_ss": "`вмикає пропуск тиші; множить швидкість на `шв` біля початку/кінця, коли гучність нижче `гуч` і позиція в перших `поч`% або останніх `кін`%", //m
"mt_ssvt": "поріг гучності (0-255)\">гуч", //m
"mt_ssts": "активний поріг (% треку, початок)\">поч", //m
"mt_sste": "активний поріг (% треку, кінець)\">кін", //m
"mt_sssm": "множник швидкості відтворення\">шв", //m
"mb_play": "відтворити", "mb_play": "відтворити",
"mm_hashplay": "відтворити цей аудіо файл?", "mm_hashplay": "відтворити цей аудіо файл?",
@ -398,8 +404,8 @@ Ls.ukr = {
"fr_case": "регулярний вираз з урахуванням регістру\">регістр", "fr_case": "регулярний вираз з урахуванням регістру\">регістр",
"fr_win": "безпечні для windows імена; замінити <code>&lt;&gt;:&quot;\\|?*</code> на японські повноширинні символи\">win", "fr_win": "безпечні для windows імена; замінити <code>&lt;&gt;:&quot;\\|?*</code> на японські повноширинні символи\">win",
"fr_slash": "замінити <code>/</code> на символ, який не призводить до створення нових папок\">без /", "fr_slash": "замінити <code>/</code> на символ, який не призводить до створення нових папок\">без /",
"fr_re": "шаблон пошуку регулярного виразу для застосування до оригінальних імен файлів; групи захоплення можна посилатися в полі формату нижче як &lt;code&gt;(1)&lt;/code&gt; і &lt;code&gt;(2)&lt;/code&gt; і так далі", "fr_re": "`шаблон пошуку регулярного виразу для застосування до оригінальних імен файлів; групи захоплення можна посилатися в полі формату нижче як `(1)` і `(2)` і так далі",
"fr_fmt": "натхненний foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; замінюється назвою пісні,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; пропускає [цю] частину, якщо виконавець порожній$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; доповнює номер треку до 2 цифр", "fr_fmt": "`натхненний foobar2000:$N`(title)` замінюється назвою пісні,$N`[(artist) - ](title)` пропускає [цю] частину, якщо виконавець порожній$N`$lpad((tn),2,0)` доповнює номер треку до 2 цифр",
"fr_pdel": "видалити", "fr_pdel": "видалити",
"fr_pnew": "зберегти як", "fr_pnew": "зберегти як",
"fr_pname": "надайте ім'я для вашого нового пресету", "fr_pname": "надайте ім'я для вашого нового пресету",
@ -448,7 +454,7 @@ Ls.ukr = {
"mk_noname": "введіть ім'я в текстове поле зліва перед тим, як робити це :p", "mk_noname": "введіть ім'я в текстове поле зліва перед тим, як робити це :p",
"nmd_i1": "ви також можете додати потрібне розширення, наприклад <code>.md</code>", //m "nmd_i1": "ви також можете додати потрібне розширення, наприклад <code>.md</code>", //m
"nmd_i2": "ви можете створювати тільки файли <code>.md</code>, оскільки не маєте дозволу на видалення", //m "nmd_i2": "ви можете створювати тільки файли <code>.{0}</code>, оскільки не маєте дозволу на видалення", //m
"tv_load": "Завантаження текстового документа:\n\n{0}\n\n{1}% ({2} з {3} MiB завантажено)", "tv_load": "Завантаження текстового документа:\n\n{0}\n\n{1}% ({2} з {3} MiB завантажено)",
"tv_xe1": "не вдалося завантажити текстовий файл:\n\nпомилка ", "tv_xe1": "не вдалося завантажити текстовий файл:\n\nпомилка ",

View file

@ -110,7 +110,7 @@ Ls.vie = {
"access": "quyền truy cập", "access": "quyền truy cập",
"ot_close": "đóng menu con", "ot_close": "đóng menu con",
"ot_search": "tìm kiếm các tệp theo thuộc tính, đường dẫn / tên, tag nhạc hoặc bất kỳ sự kết hợp nào của chúng$N$N&lt;code&gt;foo bar&lt;/code&gt; = phải chứa cả «foo» và «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = phải chứa «foo» nhưng không chứa «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = bắt đầu bằng «yana» và là tệp «opus»$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = chứa chính xác «try unite»$N$Nđịnh dạng ngày là iso-8601, như$N&lt;code&gt;2009-12-31&lt;/code&gt; hoặc &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`tìm kiếm các tệp theo thuộc tính, đường dẫn / tên, tag nhạc hoặc bất kỳ sự kết hợp nào của chúng$N$N`foo bar` = phải chứa cả «foo» và «bar»,$N`foo -bar` = phải chứa «foo» nhưng không chứa «bar»,$N`^yana .opus$` = bắt đầu bằng «yana» và là tệp «opus»$N`&quot;try unite&quot;` = chứa chính xác «try unite»$N$Nđịnh dạng ngày là iso-8601, như$N`2009-12-31` hoặc `2020-09-12 23:30:00`",
"ot_unpost": "unpost: xoá các tệp đã tải lên gần đây hoặc huỷ những tệp đang tải dở", "ot_unpost": "unpost: xoá các tệp đã tải lên gần đây hoặc huỷ những tệp đang tải dở",
"ot_bup": "bup: trình tải lên cơ bản, hỗ trợ cả Netscape 4.0", "ot_bup": "bup: trình tải lên cơ bản, hỗ trợ cả Netscape 4.0",
@ -267,9 +267,9 @@ Ls.vie = {
// big dirs // big dirs
"cdt_lim": "số tệp tối đa hiển thị trong thư mục", "cdt_lim": "số tệp tối đa hiển thị trong thư mục",
"cdt_ask": "khi cuộn xuống cuối,$Nthay vì tải thêm tệp,$Nhỏi người dùng muốn làm gì", "cdt_ask": "khi cuộn xuống cuối,$Nthay vì tải thêm tệp,$Nhỏi người dùng muốn làm gì",
"cdt_hsort": "số lượng luật sắp xếp(&lt;code&gt;,sorthref&lt;/code&gt;) được đưa vào URL media. Đặt bằng 0 cũng sẽ bỏ qua các quy tắc sắp xếp trong liên kết media khi nhấp vào chúng", "cdt_hsort": "`số lượng luật sắp xếp(`,sorthref`) được đưa vào URL media. Đặt bằng 0 cũng sẽ bỏ qua các quy tắc sắp xếp trong liên kết media khi nhấp vào chúng",
"cdt_ren": "bật menu chuột phải tùy chỉnh, menu mặc định vẫn truy cập được bằng shift + chuột phải", //m "cdt_ren": "bật menu chuột phải tùy chỉnh, menu mặc định vẫn truy cập được bằng shift + chuột phải\">bật", //m
"cdt_rdb": "hiển thị menu chuột phải thông thường khi menu tùy chỉnh đã mở và nhấp chuột phải lần nữa", //m "cdt_rdb": "hiển thị menu chuột phải thông thường khi menu tùy chỉnh đã mở và nhấp chuột phải lần nữa\">x2", //m
"tt_entree": "hiển thị thanh điều hướng (cây thư mục)$NPhím tắt: B", "tt_entree": "hiển thị thanh điều hướng (cây thư mục)$NPhím tắt: B",
"tt_detree": "hiển thị đường dẫn$NPhím tắt: B", "tt_detree": "hiển thị đường dẫn$NPhím tắt: B",
@ -283,13 +283,11 @@ Ls.vie = {
"ml_pmode": "ở cuối thư mục...", "ml_pmode": "ở cuối thư mục...",
"ml_btns": "lệnh", "ml_btns": "lệnh",
"ml_tcode": "mã hoá lại", "ml_tcode": "mã hoá lại",
// chắc là phần nhạc
"ml_tcode2": "mã hoá lại thành", "ml_tcode2": "mã hoá lại thành",
"ml_tint": "tô màu", "ml_tint": "tô màu",
"ml_eq": "bộ cân bằng âm thanh", "ml_eq": "bộ cân bằng âm thanh",
"ml_drc": "bộ nén dải động", "ml_drc": "bộ nén dải động",
"ml_ss": "bỏ qua khoảng lặng", //m
// nhạc
"mt_loop": "lặp lại một bài\">🔁", "mt_loop": "lặp lại một bài\">🔁",
"mt_one": "dừng sau một bài\">1⃣", "mt_one": "dừng sau một bài\">1⃣",
@ -326,10 +324,16 @@ Ls.vie = {
"mt_xowa": "có một vài lỗi trên iOS ngăn phát nền với định dạng này; vui lòng dùng caf hoặc mp3", "mt_xowa": "có một vài lỗi trên iOS ngăn phát nền với định dạng này; vui lòng dùng caf hoặc mp3",
"mt_tint": "mức nền (0-100) trên thanh tiến trình", "mt_tint": "mức nền (0-100) trên thanh tiến trình",
"mt_eq": "bật bộ cân bằng âm thanh và bộ tăng ích;$N$Nboost &lt;code&gt;0 &nbsp;&lt;/code&gt; = âm lượng chuẩn 100% (không chỉnh)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = stereo chuẩn (không chỉnh)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% pha trái-phải$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = loại bỏ lời hát :^)$N$Nbật EQ giúp cho album được phát liền mạch không ngắt quãng, nên giữ các giá trị bằng 0 (trừ width = 1) nếu bạn không muốn thay đổi âm thanh gốc", "mt_eq": "`bật bộ cân bằng âm thanh và bộ tăng ích;$N$Nboost `0 &nbsp;` = âm lượng chuẩn 100% (không chỉnh)$N$Nwidth `1 &nbsp;` = stereo chuẩn (không chỉnh)$Nwidth `0.5` = 50% pha trái-phải$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = loại bỏ lời hát :^)$N$Nbật EQ giúp cho album được phát liền mạch không ngắt quãng, nên giữ các giá trị bằng 0 (trừ width = 1) nếu bạn không muốn thay đổi âm thanh gốc",
"mt_drc": "bật bộ nén dải động (làm phẳng âm lượng / brickwaller); cũng bật EQ để cân bằng, nên đặt tất cả EQ trừ 'width' = 0 nếu không muốn$N$Ngiảm âm thanh trên THRESHOLD dB; với mỗi RATIO dB vượt THRESHOLD thì có 1 dB đầu ra, ví dụ tresh -24 và ratio 12 => âm lượng không vượt -22 dB, có thể tăng EQ boost lên 0.8 hoặc 1.8 với ATK 0 và RLS lớn 90 (chỉ Firefox; RLS max 1 trên browser khác)$N$NXem Wikipedia để hiểu chi tiết hơn", "mt_drc": "bật bộ nén dải động (làm phẳng âm lượng / brickwaller); cũng bật EQ để cân bằng, nên đặt tất cả EQ trừ 'width' = 0 nếu không muốn$N$Ngiảm âm thanh trên THRESHOLD dB; với mỗi RATIO dB vượt THRESHOLD thì có 1 dB đầu ra, ví dụ tresh -24 và ratio 12 => âm lượng không vượt -22 dB, có thể tăng EQ boost lên 0.8 hoặc 1.8 với ATK 0 và RLS lớn 90 (chỉ Firefox; RLS max 1 trên browser khác)$N$NXem Wikipedia để hiểu chi tiết hơn",
"mt_ss": "`bật bỏ qua im lặng; nhân tốc độ phát với `nh` gần đầu/cuối khi âm lượng dưới `am` và vị trí trong `dau`% đầu hoặc `cuoi`% cuối", //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_sste": "ngưỡng hoạt động (% bài, cuối)\">cuoi", //m
"mt_sssm": "hệ số tốc độ phát\">nh", //m
"mb_play": "phát", "mb_play": "phát",
"mm_hashplay": "phát bản nhạc này?", "mm_hashplay": "phát bản nhạc này?",
"mm_m3u": "bấm <code>Enter/OK</code> để phát\nbấm <code>ESC/Cancel</code> để chỉnh sửa", "mm_m3u": "bấm <code>Enter/OK</code> để phát\nbấm <code>ESC/Cancel</code> để chỉnh sửa",
@ -407,8 +411,8 @@ Ls.vie = {
"fr_case": "regex phân biệt hoa thường\">case", "fr_case": "regex phân biệt hoa thường\">case",
"fr_win": "tên tương thích Windows; thay <code>&lt;&gt;:&quot;\\|?*</code> bằng ký tự fullwidth tiếng Nhật\">win", "fr_win": "tên tương thích Windows; thay <code>&lt;&gt;:&quot;\\|?*</code> bằng ký tự fullwidth tiếng Nhật\">win",
"fr_slash": "thay <code>/</code> bằng ký tự khác để tránh tạo thư mục mới\">no /", "fr_slash": "thay <code>/</code> bằng ký tự khác để tránh tạo thư mục mới\">no /",
"fr_re": "regex áp dụng lên tên gốc; các nhóm bắt có thể được tham chiếu trong trường định dạng bên dưới như &lt;code&gt;(1)&lt;/code&gt;, &lt;code&gt;(2)&lt;/code&gt; ...", "fr_re": "`regex áp dụng lên tên gốc; các nhóm bắt có thể được tham chiếu trong trường định dạng bên dưới như `(1)`, `(2)` ...",
"fr_fmt": "lấy cảm hứng từ foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; được thay bằng tên bài hát,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; bỏ qua phần trong ngoặc nếu artist trống,$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; thêm số 0 để tracknumber đủ 2 chữ số", "fr_fmt": "`lấy cảm hứng từ foobar2000:$N`(title)` được thay bằng tên bài hát,$N`[(artist) - ](title)` bỏ qua phần trong ngoặc nếu artist trống,$N`$lpad((tn),2,0)` thêm số 0 để tracknumber đủ 2 chữ số",
"fr_pdel": "xóa", "fr_pdel": "xóa",
"fr_pnew": "lưu dưới tên mới", "fr_pnew": "lưu dưới tên mới",
"fr_pname": "nhập tên cho preset mới", "fr_pname": "nhập tên cho preset mới",
@ -457,7 +461,7 @@ Ls.vie = {
"mk_noname": "hãy nhập tên vào ô bên trái trước khi thực hiện :p", "mk_noname": "hãy nhập tên vào ô bên trái trước khi thực hiện :p",
"nmd_i1": "hãy thêm cả phần mở rộng tệp bạn muốn, ví dụ <code>.md</code>", "nmd_i1": "hãy thêm cả phần mở rộng tệp bạn muốn, ví dụ <code>.md</code>",
"nmd_i2": "bạn chỉ có thể tạo tệp <code>.md</code> vì bạn không có quyền xóa", "nmd_i2": "bạn chỉ có thể tạo tệp <code>.{0}</code> vì bạn không có quyền xóa",
"tv_load": "Đang tải tài liệu văn bản:\n\n{0}\n\n{1}% ({2} / {3} MiB)", "tv_load": "Đang tải tài liệu văn bản:\n\n{0}\n\n{1}% ({2} / {3} MiB)",
"tv_xe1": "không thể tải tệp văn bản:\n\nlỗi ", "tv_xe1": "không thể tải tệp văn bản:\n\nlỗi ",

View file

@ -1326,9 +1326,10 @@ function scfg_bind(obj, oname, cname, defval, cb) {
return v; return v;
} }
function setck(v) { function setck(v, cb) {
var xhr = new XHR(); var xhr = new XHR();
xhr.open('GET', SR + '/?setck=' + v, true); xhr.open('GET', SR + '/?setck=' + v, true);
xhr.onload = cb;
xhr.send(); xhr.send();
} }
@ -1560,6 +1561,13 @@ var tt = (function () {
if (!msg) if (!msg)
return; return;
if (msg.startsWith('`')) {
var x = false;
msg = msg.slice(1);
while (msg.indexOf('`') + 1)
msg = msg.replace('`', (x = !x) ? '<code>' : '</code>')
}
r.el = this; r.el = this;
var pos = this.getBoundingClientRect(), var pos = this.getBoundingClientRect(),
dir = this.getAttribute('ttd') || '', dir = this.getAttribute('ttd') || '',

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,180 @@
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 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
## 🧪 new features
* #1264 now possible to grant the `get` permission when creating a share 95b827f1
* the button was already there, but until now it did nothing
## 🩹 bugfixes
* a safeguard (24141b49) added in [v1.20.5](https://github.com/9001/copyparty/releases/tag/v1.20.5) was too strict and would block requests from certain reverseproxies, specifically anything that adds `X-Forwarded-HTTP-Version` 72224d29
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2026-0130-2145 `v1.20.5` fast again
<img src="https://github.com/9001/copyparty/raw/hovudstraum/docs/logo.svg" width="250" align="right"/>
* read-only demo server at https://a.ocv.me/pub/demo/
* [docker image](https://github.com/9001/copyparty/tree/hovudstraum/scripts/docker) [similar software](https://github.com/9001/copyparty/blob/hovudstraum/docs/versus.md) [client testbed](https://cd.ocv.me/b/)
there is a [discord server](https://discord.gg/25J8CdTT6G) with an `@everyone` in case of future important updates, such as [vulnerabilities](https://github.com/9001/copyparty/security) (most recently 2025-09-07)
## 🧪 new features
* #1240 webdav clients can now set fractional last-modified timestamps (thx @jcwillox!) 296362fc
* #1260 add support for running the server with GraalPy (thx @vgskye!) 73d06eaf
* #1182 pressing CTRL-C will copy links of selected files to clipboard 9c14972d
## 🩹 bugfixes
* #1248 shares: fix the buttons for extending expiration time b6bf6d5f
* #1242 webdav: fix «MacOS Finder» taking forever to connect (thx @freddyheppell!) 8e046fb6
* ie11 would spinlock in write-only folders 5c4ba376
## 🔧 other changes
* fast again! ed6a8d5a
* replaced the `connection:close` band-aid added in [v1.20.4](https://github.com/9001/copyparty/releases/tag/v1.20.4) with a proper fix that doesn't make things slower behind reverseproxies
* I've tried everything I can think of (with nginx as reverseproxy) and can't notice any difference in behavior, but please let me know if this breaks anything for you 🙏
* #1245 updated Portuguese translation (thx @000yesnt!) 69fa1d10
* #1259 OpenRC: add command to test config (thx @lotsospaghetti!) 79273a7d
* #1257 removed the `nth` global-option because it was never implemented (thx @stackxp!) 22cdc0f8
* syntax highlighter: added languages `nasm` + `nix`, removed `autohotkey` + `cmake` b20d3259
## 🌠 fun facts
* http/1.1 still tends to be faster than http/2 and http/3 for large transfers which is the main reason copyparty hasn't made the change
* eh, not really a *fun* fact I suppose ┐( ´ w `)┌
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2026-0123-0055 `v1.20.4` a fresh pair of sock(et)s
## 🩹 bugfixes
* #1235 rightclick-menu: fix creating new files/folders in gridview (thx @SpaceXCheeseWheel!) ffca67f2
* #1231 fix http desync if the [`urlform`](https://copyparty.eu/cli/#urlform-help-page) global-option was changed to `get`
* this initial fix only applies when reverse-proxied, in which case copyparty will now always `connection:close` (don't reuse tcp/uds connections), as giving each client a fresh socket helps avoid all such issues e1eff216 b4fddbc3
* the expected performance impact from this change is near-zero for real use, even if benchmarks show a 40% reduction in requests/sec in the absolute-worst-case (burst of cheap requests)
* a future version will also fix this issue for non-proxied clients
## 🔧 other changes
* #1229 updated the Esperanto translation (thx @slashdevslashurandom!) 1142ac25
* #1232 shares: if an external domain is configured, then show both the LAN and external link for each share 81e5eb7b
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2026-0121-0505 `v1.20.3` dillo approves
## 🧪 new features
* send-message-to-serverlog now also available as url-parameter `?smsg=foo` 6dcb1efb
* option `smsg` configures which HTTP-methods to allow; can be set to `GET,POST` but default is only `POST` because `GET` is dangerous (CSRF)
## 🩹 bugfixes
* #1227 [dillo](https://dillo-browser.github.io/) was not able to login because dillo is more standards-compliant than every other browser (nice) b4df8fa2
* a web-scraper which got banned for making malicious requests could remain banned for one request longer than intended (wait why did I fix this) ba67b279
* `?ls` was still a bit jank 0a3a8072
## 🌠 fun facts
* this 6AM release was [powered by void/mournfinale](https://www.youtube.com/watch?v=lFEEXloqk9Q&list=PLlEk36g9RI8Ppjr3HhaO3wjjmA6HnSo2U)
* was going to name the release "dilla på dillo" but somehow google-translate thinks that means "fuck on fuck" which would have been inappropriate
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
# 2026-0119-0126 `v1.20.2` xattrs + range-select # 2026-0119-0126 `v1.20.2` xattrs + range-select

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
@ -1015,7 +1015,7 @@
ohead: set-cooke # hint; default is unset ohead: set-cooke # hint; default is unset
# dont log URLs matching regex RE # dont log URLs matching regex RE
lf-url: ^/\.cpr/|[?&]th=[wjp]|/\.(_|ql_|DS_Store$|localized$) # default lf-url: ^/\.cpr/|[?&]th=[xwjp]|/\.(_|ql_|DS_Store$|localized$) # default
###000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\ ###000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
###// admin panel options \\000000000000000000000000000000000000000000000000000000000000000000\ ###// admin panel options \\000000000000000000000000000000000000000000000000000000000000000000\
@ -1091,6 +1091,9 @@
# disable webp output # disable webp output
th-no-webp th-no-webp
# disable jpeg-xl output
th-no-jxl
# force jpg output for video thumbs (avoids issues on some FFmpeg builds) # force jpg output for video thumbs (avoids issues on some FFmpeg builds)
th-ff-jpg th-ff-jpg

View file

@ -46,7 +46,7 @@ https://github.com/Daninet/hash-wasm/
C: 2020 Dani Biró C: 2020 Dani Biró
L: MIT L: MIT
https://github.com/openpgpjs/asmcrypto.js/ https://github.com/asmcrypto/asmcrypto.js/
C: 2013 Artem S Vybornov C: 2013 Artem S Vybornov
L: MIT L: MIT

View file

@ -26,6 +26,7 @@ classifiers = [
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: Jython", "Programming Language :: Python :: Implementation :: Jython",
"Programming Language :: Python :: Implementation :: PyPy", "Programming Language :: Python :: Implementation :: PyPy",

View file

@ -1,13 +1,12 @@
FROM alpine:3.18 FROM alpine:3.23
WORKDIR /z WORKDIR /z
ENV ver_asmcrypto=c72492f4a66e17a0e5dd8ad7874de354f3ccdaa5 \ ENV ver_hashwasm=4.12.0 \
ver_hashwasm=4.12.0 \
ver_marked=4.3.0 \ ver_marked=4.3.0 \
ver_dompf=3.3.1 \ ver_dompf=3.3.1 \
ver_mde=2.18.0 \ ver_mde=2.18.0 \
ver_codemirror=5.65.18 \ ver_codemirror=5.65.18 \
ver_fontawesome=5.13.0 \ ver_fontawesome=5.13.0 \
ver_prism=1.29.0 \ ver_prism=1.30.0 \
ver_zopfli=1.0.3 ver_zopfli=1.0.3
# versioncheck: # versioncheck:
@ -16,7 +15,6 @@ ENV ver_asmcrypto=c72492f4a66e17a0e5dd8ad7874de354f3ccdaa5 \
# https://github.com/codemirror/codemirror5/releases # https://github.com/codemirror/codemirror5/releases
# https://github.com/cure53/DOMPurify/releases # https://github.com/cure53/DOMPurify/releases
# https://github.com/Daninet/hash-wasm/releases # https://github.com/Daninet/hash-wasm/releases
# https://github.com/openpgpjs/asmcrypto.js/commits/main/
# https://github.com/google/zopfli/tags # https://github.com/google/zopfli/tags
@ -28,7 +26,6 @@ RUN mkdir -p /z/dist/no-pk \
bash brotli cmake make g++ git gzip lame npm patch pigz \ bash brotli cmake make g++ git gzip lame npm patch pigz \
python3 python3-dev py3-brotli sox tar unzip wget \ python3 python3-dev py3-brotli sox tar unzip wget \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \ && rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& wget https://github.com/openpgpjs/asmcrypto.js/archive/$ver_asmcrypto.tar.gz -O asmcrypto.tgz \
&& wget https://github.com/markedjs/marked/archive/v$ver_marked.tar.gz -O marked.tgz \ && wget https://github.com/markedjs/marked/archive/v$ver_marked.tar.gz -O marked.tgz \
&& wget https://github.com/Ionaru/easy-markdown-editor/archive/$ver_mde.tar.gz -O mde.tgz \ && wget https://github.com/Ionaru/easy-markdown-editor/archive/$ver_mde.tar.gz -O mde.tgz \
&& wget https://github.com/codemirror/codemirror5/archive/$ver_codemirror.tar.gz -O codemirror.tgz \ && wget https://github.com/codemirror/codemirror5/archive/$ver_codemirror.tar.gz -O codemirror.tgz \
@ -41,9 +38,6 @@ RUN mkdir -p /z/dist/no-pk \
&& (mkdir hash-wasm \ && (mkdir hash-wasm \
&& cd hash-wasm \ && cd hash-wasm \
&& unzip ../hash-wasm.zip) \ && unzip ../hash-wasm.zip) \
&& (tar --no-same-owner -xf asmcrypto.tgz \
&& cd asmcrypto.js-$ver_asmcrypto \
&& npm install ) \
&& (tar --no-same-owner -xf marked.tgz \ && (tar --no-same-owner -xf marked.tgz \
&& cd marked-$ver_marked \ && cd marked-$ver_marked \
&& npm install \ && npm install \
@ -62,15 +56,16 @@ RUN mkdir -p /z/dist/no-pk \
&& tar --no-same-owner -xf zopfli.tgz && tar --no-same-owner -xf zopfli.tgz
COPY busy-mp3.sh /z/ #COPY busy-mp3.sh /z/
RUN /z/busy-mp3.sh \ #RUN /z/busy-mp3.sh \
&& mv -v /dev/shm/busy.mp3.gz /z/dist # && mv -v /dev/shm/busy.mp3.gz /z/dist
# build fonttools (which needs zopfli) # build fonttools (which needs zopfli)
RUN tar --no-same-owner -xf zopfli.tgz \ RUN tar --no-same-owner -xf zopfli.tgz \
&& cd zopfli* \ && cd zopfli* \
&& cmake \ && cmake \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
-DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_PREFIX=/usr \
-DZOPFLI_BUILD_SHARED=ON \ -DZOPFLI_BUILD_SHARED=ON \
-B build \ -B build \
@ -81,13 +76,6 @@ RUN tar --no-same-owner -xf zopfli.tgz \
&& python3 -m pip install fonttools zopfli && python3 -m pip install fonttools zopfli
# build asmcrypto
RUN cd asmcrypto.js-$ver_asmcrypto \
&& echo "export { Sha512 } from './hash/sha512/sha512';" > src/entry-export_all.ts \
&& node -r esm build.js \
&& awk '/HMAC state/{o=1} /var HEAP/{o=0} /function hmac_reset/{o=1} /return \{/{o=0} /var __extends =/{o=1} /var Hash =/{o=0} /hmac_|pbkdf2_/{next} o{next} {gsub(/IllegalStateError/,"Exception")} {sub(/^ +/,"");sub(/^\/\/ .*/,"");sub(/;$/," ;")} 1' < asmcrypto.all.es5.js > /z/dist/sha512.ac.js
# build hash-wasm # build hash-wasm
RUN cd hash-wasm/dist \ RUN cd hash-wasm/dist \
&& mv sha512.umd.min.js /z/dist/sha512.hw.js && mv sha512.umd.min.js /z/dist/sha512.hw.js

View file

@ -1,63 +1,320 @@
#!/bin/bash #!/bin/bash
set -e set -e
plugins=(
line-highlight
line-numbers
autolinker
)
langs=( langs=(
markup markup
css css
clike clike
javascript javascript
autohotkey # abap
# abnf
# actionscript
# ada
# agda
# al
# antlr4
# apacheconf
# apex
# apl
# applescript
# aql
# arduino
# arff
# armasm
# arturo
# asciidoc
# aspnet
# asm6502
# asmatmel
# autohotkey
# autoit
# avisynth
# avro-idl
# awk
bash bash
basic basic
batch batch
# bbcode
# bbj
# bicep
# birb
# bison
# bnf
# bqn
# brainfuck
# brightscript
# bro
# bsl
c c
csharp csharp
cpp cpp
cmake # cfscript
# chaiscript
# cil
# cilkc
# cilkcpp
# clojure
# cmake
# cobol
# coffeescript
# concurnas
# csp
# cooklang
# coq
# crystal
# css-extras
# csv
# cue
# cypher
# d
# dart
# dataweave
# dax
# dhall
diff diff
# django
# dns-zone-file
docker docker
# dot
# ebnf
# editorconfig
# eiffel
# ejs
elixir elixir
# elm
# etlua
# erb
# erlang
# excel-formula
# fsharp
# factor
# false
# firestore-security-rules
# flow
# fortran
# ftl
# gml
# gap
# gcode
# gdscript
# gedcom
# gettext
# gherkin
# git
glsl glsl
# gn
# linker-script
go go
# go-module
# gradle
# graphql
# groovy
# haml
# handlebars
# haskell
# haxe
# hcl
# hlsl
# hoon
# http
# hpkp
# hsts
# ichigojam
# icon
# icu-message-format
# idris
# ignore
# inform7
ini ini
# io
# j
java java
# javadoc
# javadoclike
# javastacktrace
# jexl
# jolie
# jq
# jsdoc
# js-extras
json json
# json5
# jsonp
# jsstacktrace
# js-templates
# julia
# keepalived
# keyman
kotlin kotlin
# kumir
# kusto
latex latex
# latte
less less
# lilypond
# liquid
lisp lisp
# livescript
# llvm
# log
# lolcode
lua lua
# magma
makefile makefile
# markdown
# markup-templating
# mata
matlab matlab
# maxscript
# mel
# mermaid
# metafont
# mizar
# mongodb
# monkey
moonscript moonscript
# n1ql
# n4js
# nand2tetris-hdl
# naniscript
nasm
# neon
# nevod
# nginx
nim nim
nix
# nsis
objectivec objectivec
# ocaml
# odin
# opencl
# openqasm
# oz
# parigp
# parser
# pascal
# pascaligo
# psl
# pcaxis
# peoplecode
perl perl
# php
# phpdoc
# php-extras
# plant-uml
# plsql
# powerquery
powershell powershell
# processing
# prolog
# promql
# properties
# protobuf
# pug
# puppet
# pure
# purebasic
# purescript
python python
# qsharp
# q
# qml
# qore
r r
# racket
# cshtml
jsx jsx
# tsx
# reason
# regex
# rego
# renpy
# rescript
# rest
# rip
# roboconf
# robotframework
ruby ruby
rust rust
# sas
sass sass
scss scss
# scala
# scheme
# shell-session
# smali
# smalltalk
# smarty
# sml
# solidity
# solution-file
# soy
# sparql
# splunk-spl
# sqf
sql sql
# squirrel
# stan
# stata
# iecst
# stylus
# supercollider
swift swift
systemd systemd
# t4-templating
# t4-cs
# t4-vb
# tap
# tcl
# tt2
# textile
toml toml
# tremor
# turtle
# twig
typescript typescript
# typoscript
# unrealscript
# uorazor
# uri
# v
# vala
vbnet vbnet
# velocity
verilog verilog
vhdl vhdl
# vim
# visual-basic
# warpscript
# wasm
# web-idl
# wgsl
# wiki
# wolfram
# wren
# xeora
# xml-doc
# xojo
# xquery
yaml yaml
# yang
zig zig
) )
slangs="${langs[*]}" slangs="${langs[*]}"
slangs="${slangs// /+}" slangs="${slangs// /+}"
splugins="${plugins[*]}"
splugins="${splugins// /+}"
for theme in prism-funky prism ; do for theme in prism-funky prism ; do
u="https://prismjs.com/download.html#themes=$theme&languages=$slangs&plugins=line-highlight+line-numbers+autolinker" u="https://prismjs.com/download.html#themes=$theme&languages=$slangs&plugins=$splugins"
echo "$u" echo "$u"
./genprism.py --dir prism-$1 --js-out prism.js --css-out $theme.css "$u" ./genprism.py --dir prism-$1 --js-out prism.js --css-out $theme.css "$u"
done done

View file

@ -10,13 +10,11 @@ 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
EXPOSE 3923 EXPOSE 3923
ENTRYPOINT ["python3", "-m", "copyparty", "-c", "/z/initcfg"] ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "-c", "/z/initcfg"]

View file

@ -15,18 +15,18 @@ 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 cython \ 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 \ libraw-dev py3-numpy-dev cython \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \ && rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& python3 -m pip install pyvips \ && python3 -m pip install pyvips \
&& 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}')" \
@ -35,10 +35,9 @@ 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
EXPOSE 3923 EXPOSE 3923
ENTRYPOINT ["python3", "-m", "copyparty", "-c", "/z/initcfg"] ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "-c", "/z/initcfg"]

View file

@ -12,10 +12,9 @@ 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
EXPOSE 3923 EXPOSE 3923
ENTRYPOINT ["python3", "-m", "copyparty", "-c", "/z/initcfg"] ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "-c", "/z/initcfg"]

View file

@ -12,23 +12,21 @@ 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 cython \ 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 py3-wheel libffi-dev \ python3-dev py3-wheel libffi-dev \
libraw-dev py3-numpy-dev \ libraw-dev py3-numpy-dev cython \
&& rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \ && rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \
&& python3 -m pip install pyvips \ && python3 -m pip install pyvips \
&& 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
EXPOSE 3923 EXPOSE 3923
ENTRYPOINT ["python3", "-m", "copyparty", "-c", "/z/initcfg"] ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "-c", "/z/initcfg"]

View file

@ -10,9 +10,9 @@ 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
EXPOSE 3923 EXPOSE 3923
ENTRYPOINT ["python3", "-m", "copyparty", "--no-thumb", "-c", "/z/initcfg"] ENTRYPOINT ["/bin/ash", "/z/cpp.sh", "--no-thumb", "-c", "/z/initcfg"]

View file

@ -120,6 +120,7 @@ add the following three config entries into the `[global]` section of your `copy
* `ftp: 3921` to enable the service, listening for connections on port 3921 * `ftp: 3921` to enable the service, listening for connections on port 3921
* `ftp-nat: 127.0.0.1` but replace `127.0.0.1` with the actual external IP of your server; the clients will only be able to connect to this IP, even if the server has multiple IPs * `ftp-nat: 127.0.0.1` but replace `127.0.0.1` with the actual external IP of your server; the clients will only be able to connect to this IP, even if the server has multiple IPs
* do not add `ftp-nat` if you are running the container with host networking
* `ftp-pr: 12000-12099` to restrict the [passive-mode](http://slacksite.com/other/ftp.html#passive) port selection range; this allows up to 100 simultaneous file transfers * `ftp-pr: 12000-12099` to restrict the [passive-mode](http://slacksite.com/other/ftp.html#passive) port selection range; this allows up to 100 simultaneous file transfers
@ -129,3 +130,8 @@ then finally update your docker config so that the port-range you specified (120
# build the images yourself # build the images yourself
basically `./make.sh hclean pull img push` but see [devnotes.md](./devnotes.md) basically `./make.sh hclean pull img push` but see [devnotes.md](./devnotes.md)
## adding new packages to the image
in case you wish to make a small modification to the official image, for example [add a python package you need](https://github.com/9001/copyparty/issues/479#issuecomment-3152026483), then you don't *really* need to build the whole image from scratch -- see [modifying an image](./devnotes.md#modifying-an-image) in devnotes

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

@ -1,5 +1,7 @@
# building the images yourself # building the images yourself
if you want to build the image from scratch then you've come to the right place -- however if you only want to make small modifications to the official image then jump down to [modifying an image](#modifying-an-image) or possibly [modding on the fly](#modding-on-the-fly)
```bash ```bash
./make.sh hclean pull img push ./make.sh hclean pull img push
``` ```
@ -33,3 +35,74 @@ apk add qemu-openrc qemu-tools qemu-{arm,armeb,aarch64,s390x,ppc64le}
rc-update add qemu-binfmt rc-update add qemu-binfmt
service qemu-binfmt start service qemu-binfmt start
``` ```
# modifying an image
if you want to make a small change to the official image, for example [install a python package you need](https://github.com/9001/copyparty/issues/479), then the best approach is to build a new image based on the official one. There's a quick summary below, but check the internets if you want a better walkthrough.
**NOTE:** the `min` image is **not** a good idea to modify (brittle from shoehorning); use any of the other variants instead (`im`, `ac`, `iv`, `dj`)
first, create a new folder, and then create a new blank textfile named `Dockerfile` inside that folder:
```bash
mkdir customparty
cd customparty
nano Dockerfile
```
assuming you want to install the python-package "[requests](https://pypi.org/project/requests/)", which in [alpine](https://alpinelinux.org/) is called [py3-requests](https://pkgs.alpinelinux.org/package/edge/main/x86_64/py3-requests), then put the following contents into your `Dockerfile`:
```docker
FROM docker.io/copyparty/ac:latest
RUN apk add --no-cache py3-requests
```
build the new docker-image with the additional package you added:
```bash
docker pull docker.io/copyparty/ac:latest
docker build -t customparty .
```
now you can run the image `localhost/customparty:latest` which is `copyparty/ac:latest` with your changes
**one important thing to remember:** Whenever you want to update your copyparty version, you must rebuild that image by running those two docker commands (`pull` and `build`) in that folder
## modding on the fly
if you are not able to build your own image, then it is also possible to apply *some* changes as the image is starting up, before copyparty itself is launched. This is hacky but mostly-safe if done correctly
**NOTE:** the `min` image is **not** a good idea to modify (brittle from shoehorning); use any of the other variants instead (`im`, `ac`, `iv`, `dj`)
you should have a docker-volume which is mapped to `/cfg` in the container; in that volume, create a shellscript named (for example) `strikk-og-binders.sh` and then ensure that the docker-container is always executed with the environment-variable `DI_PREPARTY` set to `strikk-og-binders.sh`
* if you use docker-compose then see the [LD_PRELOAD](https://github.com/9001/copyparty/blob/hovudstraum/docs/examples/docker/basic-docker-compose/docker-compose.yml) example
**NOTE:** if you are doing this to [install a package you need](https://github.com/9001/copyparty/issues/479), then please make sure you **do not** download the package every time you restart copyparty, because that would result in excessive strain on Alpine's poor servers. You should cache the package locally. Here's an example `strikk-og-binders.sh` with caching, using [exiftool](https://pkgs.alpinelinux.org/package/edge/community/x86_64/exiftool) and [py3-requests](https://pkgs.alpinelinux.org/package/edge/main/x86_64/py3-requests) as the example packages to install
```bash
set -e # if something below goes wrong, then panic and crash
#set -x # uncomment this to debug (enable command-logging)
# packages to install
pkgs="exiftool py3-requests"
# if the docker-image is newer than the cache, then delete the cache
[ /z/initcfg -nt /cfg/apks/t ] && rm -rf /cfg/apks
# if the cache has the wrong packages, then delete the cache
grep -qF "$pkgs" /cfg/apks/t || rm -rf /cfg/apks
# if there is a cache, then just install those packages (remove -q to debug)
[ -e /cfg/apks ] && exec apk add -q --progress=no /cfg/apks/*.apk
# there is no cache; need to download+cache+install
mkdir /cfg/apks
apk add --cache-predownload --cache-dir /cfg/apks --progress=no $pkgs
echo "$pkgs" >/cfg/apks/t
touch -r /z/initcfg /cfg/apks/t
```
security-wise this is safe because apk-files are signed and thus tamper-proof

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
@ -38,6 +52,25 @@ cat >initcfg <<'EOF'
% /cfg % /cfg
EOF EOF
# the bootstrap
cat >cpp.sh <<'EOF'
#!/bin/ash
set -e
[ "$DI_PREPARTY" ] && {
p="$DI_PREPARTY"
[ "$p" = "${p##*/}" ] || {
echo "ERROR: DI_PREPARTY must be filename only"
exit 1
}
echo "running DI_PREPARTY (/cfg/$p)"
/bin/ash "/cfg/$p" || { e=$?
echo "ERROR: DI_PREPARTY returned error $e"
exit $e
}
}
exec /usr/bin/python3 -m copyparty "$@"
EOF
# unpack sfx and dive in # unpack sfx and dive in
python3 copyparty-sfx.py --version python3 copyparty-sfx.py --version
cd /tmp/pe-copyparty.0 cd /tmp/pe-copyparty.0
@ -51,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,8 @@ 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
# build # build
python3 -m build python3 -m 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/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

@ -91,7 +91,8 @@ grep -qE "^VERSION *= \(${commaver}\)$" copyparty/__version__.py ||
} }
rm -rf .vscode rm -rf .vscode
rm \ rm -f \
copyparty/web/deps/README.md \
.gitattributes \ .gitattributes \
.gitignore .gitignore

View file

@ -28,8 +28,8 @@ f4b4e330995ebe96c0bd06e16e5b26062ece9473f06d369775aa68eab261dedcf32dfdd159acaa22
00731cfdd9d5c12efef04a7161c90c1e5ed1dc4677aa88a1d4054aff836f3430df4da5262ed4289c21637358a9e10e5df16f76743cbf5a29bb3a44b146c19cf3 MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl 00731cfdd9d5c12efef04a7161c90c1e5ed1dc4677aa88a1d4054aff836f3430df4da5262ed4289c21637358a9e10e5df16f76743cbf5a29bb3a44b146c19cf3 MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl
8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl 8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl
a726fb46cce24f781fc8b55a3e6dea0a884ebc3b2b400ea74aa02333699f4955a5dc1e2ec5927ac72f35a624401f3f3b442882ba1cc4cadaf9c88558b5b8bdae packaging-25.0-py3-none-any.whl a726fb46cce24f781fc8b55a3e6dea0a884ebc3b2b400ea74aa02333699f4955a5dc1e2ec5927ac72f35a624401f3f3b442882ba1cc4cadaf9c88558b5b8bdae packaging-25.0-py3-none-any.whl
c26171ef5f108553209f937e6839311dc6b232033564aa3aca1c623fea7342069d3e859189de9c5ed41ac62d618725cad4ce61094a69aa1311beaef375d43022 pillow-12.1.0-cp313-cp313-win_amd64.whl efc712162da7fb005c8869a7612d2f4983d2d073ec79e16a58e7bf1fcd01c88b1cc26656f0893c68edd2294be7c3990db2f6bd77e7e3f2613539d57994b6a033 pillow-12.1.1-cp313-cp313-win_amd64.whl
b9b98714dfca6fa80b0b3f222965724d63be9c54d19435d1fe768e07016913d6db8d6e043fcb185b55a9bd6fe370a80cf961814fc096046a5f4640d99ed575ef pyinstaller-6.15.0-py3-none-win_amd64.whl b9b98714dfca6fa80b0b3f222965724d63be9c54d19435d1fe768e07016913d6db8d6e043fcb185b55a9bd6fe370a80cf961814fc096046a5f4640d99ed575ef pyinstaller-6.15.0-py3-none-win_amd64.whl
cad0f7cf39de691813b1d4abc7d33f8bda99a87d9c5886039b814752e8690364150da26fb61b3e28d5698ff57a90e6dcd619ed2b64b04f72b5aadb75e201bdb0 pyinstaller_hooks_contrib-2025.8-py3-none-any.whl cad0f7cf39de691813b1d4abc7d33f8bda99a87d9c5886039b814752e8690364150da26fb61b3e28d5698ff57a90e6dcd619ed2b64b04f72b5aadb75e201bdb0 pyinstaller_hooks_contrib-2025.8-py3-none-any.whl
1735728ae50e003badc5266638e41a73358f2151405e7888b6dc45697c074a60e6e58c8507b49a3f42d8f4fe4005fbc225cd766ab6582cbf85aa79bab699c08f python-3.13.11-amd64.exe 50dba4a63957220247be2985bd4ed6928679d9f6dc8cb7cee36394dda4e69cdee910fb39b01965d1358133855ace535eb1e08774fed7090feb8618dfc5fd2441 python-3.13.12-amd64.exe
2a0420f7faaa33d2132b82895a8282688030e939db0225ad8abb95a47bdb87b45318f10985fc3cee271a9121441c1526caa363d7f2e4a4b18b1a674068766e87 setuptools-80.9.0-py3-none-any.whl 2a0420f7faaa33d2132b82895a8282688030e939db0225ad8abb95a47bdb87b45318f10985fc3cee271a9121441c1526caa363d7f2e4a4b18b1a674068766e87 setuptools-80.9.0-py3-none-any.whl

View file

@ -39,10 +39,10 @@ fns=(
MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl
mutagen-1.47.0-py3-none-any.whl mutagen-1.47.0-py3-none-any.whl
packaging-25.0-py3-none-any.whl packaging-25.0-py3-none-any.whl
pillow-12.1.0-cp313-cp313-win_amd64.whl pillow-12.1.1-cp313-cp313-win_amd64.whl
pyinstaller-6.15.0-py3-none-win_amd64.whl pyinstaller-6.15.0-py3-none-win_amd64.whl
pyinstaller_hooks_contrib-2025.8-py3-none-any.whl pyinstaller_hooks_contrib-2025.8-py3-none-any.whl
python-3.13.11-amd64.exe python-3.13.12-amd64.exe
setuptools-80.9.0-py3-none-any.whl setuptools-80.9.0-py3-none-any.whl
) )
[ $w7 ] && fns+=( [ $w7 ] && fns+=(

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

@ -102,6 +102,7 @@ copyparty/web/mde.html,
copyparty/web/mde.js, copyparty/web/mde.js,
copyparty/web/msg.html, copyparty/web/msg.html,
copyparty/web/opds.xml, copyparty/web/opds.xml,
copyparty/web/opds_osd.xml,
copyparty/web/rups.css, copyparty/web/rups.css,
copyparty/web/rups.html, copyparty/web/rups.html,
copyparty/web/rups.js, copyparty/web/rups.js,
@ -121,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

@ -25,6 +25,9 @@ function langmod() {
// //
// you do not need to translate the TLNotes, those are just for you :-) // you do not need to translate the TLNotes, those are just for you :-)
// //
// note: if a line starts with ` then that is to enable
// turning `foo` into <code>foo</code> (only possible for tooltips)
//
// when you are happy with this translation and want to submit it, // when you are happy with this translation and want to submit it,
// copy the text below into a new file in the translations folder; // copy the text below into a new file in the translations folder;
// https://github.com/9001/copyparty/tree/hovudstraum/copyparty/web/tl // https://github.com/9001/copyparty/tree/hovudstraum/copyparty/web/tl
@ -143,7 +146,7 @@ Ls.hmn = {
"login": "Login", "login": "Login",
"access": " access", "access": " access",
"ot_close": "close submenu", "ot_close": "close submenu",
"ot_search": "search for files by attributes, path / name, music tags, or any combination of those$N$N&lt;code&gt;foo bar&lt;/code&gt; = must contain both «foo» and «bar»,$N&lt;code&gt;foo -bar&lt;/code&gt; = must contain «foo» but not «bar»,$N&lt;code&gt;^yana .opus$&lt;/code&gt; = start with «yana» and be an «opus» file$N&lt;code&gt;&quot;try unite&quot;&lt;/code&gt; = contain exactly «try unite»$N$Nthe date format is iso-8601, like$N&lt;code&gt;2009-12-31&lt;/code&gt; or &lt;code&gt;2020-09-12 23:30:00&lt;/code&gt;", "ot_search": "`search for files by attributes, path / name, music tags, or any combination of those$N$N`foo bar` = must contain both «foo» and «bar»,$N`foo -bar` = must contain «foo» but not «bar»,$N`^yana .opus$` = start with «yana» and be an «opus» file$N`&quot;try unite&quot;` = contain exactly «try unite»$N$Nthe date format is iso-8601, like$N`2009-12-31` or `2020-09-12 23:30:00`",
"ot_unpost": "unpost: delete your recent uploads, or abort unfinished ones", "ot_unpost": "unpost: delete your recent uploads, or abort unfinished ones",
"ot_bup": "bup: basic uploader, even supports netscape 4.0", "ot_bup": "bup: basic uploader, even supports netscape 4.0",
"ot_mkdir": "mkdir: create a new directory", "ot_mkdir": "mkdir: create a new directory",
@ -292,9 +295,9 @@ Ls.hmn = {
"cdt_lim": "max number of files to show in a folder", "cdt_lim": "max number of files to show in a folder",
"cdt_ask": "when scrolling to the bottom,$Ninstead of loading more files,$Nask what to do", "cdt_ask": "when scrolling to the bottom,$Ninstead of loading more files,$Nask what to do",
"cdt_hsort": "how many sorting rules (&lt;code&gt;,sorthref&lt;/code&gt;) to include in media-URLs. Setting this to 0 will also ignore sorting-rules included in media links when clicking them", "cdt_hsort": "`how many sorting rules (`,sorthref`) to include in media-URLs. Setting this to 0 will also ignore sorting-rules included in media links when clicking them",
"cdt_ren": "enable custom right-click menu, you can still access the regular menu by pressing the shift key and right-clicking", "cdt_ren": "enable custom right-click menu, you can still access the regular menu by pressing the shift key and right-clicking\">enable",
"cdt_rdb": "show the regular right-click menu when the custom one is already open and right-clicking again", "cdt_rdb": "show the regular right-click menu when the custom one is already open and right-clicking again\">double",
"tt_entree": "show navpane (directory tree sidebar)$NHotkey: B", "tt_entree": "show navpane (directory tree sidebar)$NHotkey: B",
"tt_detree": "show breadcrumbs$NHotkey: B", "tt_detree": "show breadcrumbs$NHotkey: B",
@ -312,6 +315,7 @@ Ls.hmn = {
"ml_tint": "tint", "ml_tint": "tint",
"ml_eq": "audio equalizer", "ml_eq": "audio equalizer",
"ml_drc": "dynamic range compressor", "ml_drc": "dynamic range compressor",
"ml_ss": "skip silence",
"mt_loop": "loop/repeat one song\">🔁", "mt_loop": "loop/repeat one song\">🔁",
"mt_one": "stop after one song\">1⃣", "mt_one": "stop after one song\">1⃣",
@ -347,8 +351,14 @@ Ls.hmn = {
"mt_c2ng": "your device does not seem to support this output format, but let's try anyways", "mt_c2ng": "your device does not seem to support this output format, but let's try anyways",
"mt_xowa": "there are bugs in iOS preventing background playback using this format; please use caf or mp3 instead", "mt_xowa": "there are bugs in iOS preventing background playback using this format; please use caf or mp3 instead",
"mt_tint": "background level (0-100) on the seekbar$Nto make buffering less distracting", "mt_tint": "background level (0-100) on the seekbar$Nto make buffering less distracting",
"mt_eq": "enables the equalizer and gain control;$N$Nboost &lt;code&gt;0&lt;/code&gt; = standard 100% volume (unmodified)$N$Nwidth &lt;code&gt;1 &nbsp;&lt;/code&gt; = standard stereo (unmodified)$Nwidth &lt;code&gt;0.5&lt;/code&gt; = 50% left-right crossfeed$Nwidth &lt;code&gt;0 &nbsp;&lt;/code&gt; = mono$N$Nboost &lt;code&gt;-0.8&lt;/code&gt; &amp; width &lt;code&gt;10&lt;/code&gt; = vocal removal :^)$N$Nenabling the equalizer makes gapless albums fully gapless, so leave it on with all the values at zero (except width = 1) if you care about that", "mt_eq": "`enables the equalizer and gain control;$N$Nboost `0` = standard 100% volume (unmodified)$N$Nwidth `1 &nbsp;` = standard stereo (unmodified)$Nwidth `0.5` = 50% left-right crossfeed$Nwidth `0 &nbsp;` = mono$N$Nboost `-0.8` &amp; width `10` = vocal removal :^)$N$Nenabling the equalizer makes gapless albums fully gapless, so leave it on with all the values at zero (except width = 1) if you care about that",
"mt_drc": "enables the dynamic range compressor (volume flattener / brickwaller); will also enable EQ to balance the spaghetti, so set all EQ fields except for 'width' to 0 if you don't want it$N$Nlowers the volume of audio above THRESHOLD dB; for every RATIO dB past THRESHOLD there is 1 dB of output, so default values of tresh -24 and ratio 12 means it should never get louder than -22 dB and it is safe to increase the equalizer boost to 0.8, or even 1.8 with ATK 0 and a huge RLS like 90 (only works in firefox; RLS is max 1 in other browsers)$N$N(see wikipedia, they explain it much better)", "mt_drc": "enables the dynamic range compressor (volume flattener / brickwaller); will also enable EQ to balance the spaghetti, so set all EQ fields except for 'width' to 0 if you don't want it$N$Nlowers the volume of audio above THRESHOLD dB; for every RATIO dB past THRESHOLD there is 1 dB of output, so default values of 'tresh' -24 and 'ratio' 12 means it should never get louder than -22 dB and it is safe to increase the equalizer boost to 0.8, or even 1.8 with ATK 0 and a huge RLS like 90 (only works in firefox; RLS is max 1 in other browsers)$N$N(see wikipedia, they explain it much better)",
"mt_ss": "`enables skip-silence; multiplies playback speed by `ffwd` near the start/end of songs when volume is under `vol` and the playback position is within the first `start`% or the last `end`% of the track",
"mt_ssvt": "volume threshold (0-255)\">vol",
"mt_ssts": "active threshold (% of track, start)\">start",
"mt_sste": "active threshold (% of track, end)\">end",
"mt_ssrt": "volume/speed ramp up/down time\">fade",
"mt_sssm": "playback speed multiplier\">ffwd",
"mb_play": "play", "mb_play": "play",
"mm_hashplay": "play this audio file?", "mm_hashplay": "play this audio file?",
@ -427,8 +437,8 @@ Ls.hmn = {
"fr_case": "case-sensitive regex\">case", "fr_case": "case-sensitive regex\">case",
"fr_win": "windows-safe names; replace <code>&lt;&gt;:&quot;\\|?*</code> with japanese fullwidth characters\">win", "fr_win": "windows-safe names; replace <code>&lt;&gt;:&quot;\\|?*</code> with japanese fullwidth characters\">win",
"fr_slash": "replace <code>/</code> with a character that doesn't cause new folders to be created\">no /", "fr_slash": "replace <code>/</code> with a character that doesn't cause new folders to be created\">no /",
"fr_re": "regex search pattern to apply to original filenames; capturing groups can be referenced in the format field below like &lt;code&gt;(1)&lt;/code&gt; and &lt;code&gt;(2)&lt;/code&gt; and so on", "fr_re": "`regex search pattern to apply to original filenames; capturing groups can be referenced in the format field below like `(1)` and `(2)` and so on",
"fr_fmt": "inspired by foobar2000:$N&lt;code&gt;(title)&lt;/code&gt; is replaced by song title,$N&lt;code&gt;[(artist) - ](title)&lt;/code&gt; skips [this] part if artist is blank$N&lt;code&gt;$lpad((tn),2,0)&lt;/code&gt; pads tracknumber to 2 digits", "fr_fmt": "`inspired by foobar2000:$N`(title)` is replaced by song title,$N`[(artist) - ](title)` skips [this] part if artist is blank$N`$lpad((tn),2,0)` pads tracknumber to 2 digits",
"fr_pdel": "delete", "fr_pdel": "delete",
"fr_pnew": "save as", "fr_pnew": "save as",
"fr_pname": "provide a name for your new preset", "fr_pname": "provide a name for your new preset",
@ -477,7 +487,7 @@ Ls.hmn = {
"mk_noname": "type a name into the text field on the left before you do that :p", "mk_noname": "type a name into the text field on the left before you do that :p",
"nmd_i1": "also add the file extension you want, for example <code>.md</code>", "nmd_i1": "also add the file extension you want, for example <code>.md</code>",
"nmd_i2": "you can only create <code>.md</code> files because you don't have the delete-permission", "nmd_i2": "you can only create <code>.{0}</code> files because you don't have the delete-permission",
"tv_load": "Loading text document:\n\n{0}\n\n{1}% ({2} of {3} MiB loaded)", "tv_load": "Loading text document:\n\n{0}\n\n{1}% ({2} of {3} MiB loaded)",
"tv_xe1": "could not load textfile:\n\nerror ", "tv_xe1": "could not load textfile:\n\nerror ",

View file

@ -62,6 +62,9 @@ function langmod() {{
//{note2} //{note2}
// you do not need to translate the TLNotes, those are just for you :-) // you do not need to translate the TLNotes, those are just for you :-)
// //
// note: if a line starts with ` then that is to enable
// turning `foo` into <code>foo</code> (only possible for tooltips)
//
// when you are happy with this translation and want to submit it, // when you are happy with this translation and want to submit it,
// copy the text below into a new file in the translations folder; // copy the text below into a new file in the translations folder;
// https://github.com/9001/copyparty/tree/hovudstraum/copyparty/web/tl // https://github.com/9001/copyparty/tree/hovudstraum/copyparty/web/tl

Some files were not shown because too many files have changed in this diff Show more