diff --git a/copyparty/web/browser.css b/copyparty/web/browser.css index f1887ac7..adffcadc 100644 --- a/copyparty/web/browser.css +++ b/copyparty/web/browser.css @@ -18,7 +18,7 @@ --btn-bg-a: rgba(128,128,128,0.15); --btn-bg-a: color-mix(in oklab, var(--bg-max) 85%, var(--fg-max) 20%); --btn-bg: rgba(128,128,128,0.15); - --btn-bg: linear-gradient(-5deg, color-mix(in oklab, var(--btn-bg-a) 40%, transparent), color-mix(in oklab, var(--btn-bg-a)70%, var(--a-gray))); + --btn-bg: color-mix(in oklab, var(--bg-u5), transparent); --btn-h-fg: var(--a-hil); --btn-h-bg: color-mix(in oklab, var(--a-gray) 45%, var(--bg-max)); --btn-1-fg: var(--bg); @@ -129,6 +129,7 @@ html.y { html.b { --op-aa-sh: 0 0 .2em var(--bg-d3) inset; + --btn-bg: linear-gradient(-5deg, color-mix(in oklab, var(--btn-bg-a) 40%, transparent), color-mix(in oklab, var(--btn-bg-a)70%, var(--a-gray))); --btn-bs: .1em .2em .1em var(--mp-sh); } html.bz { @@ -141,7 +142,6 @@ html.by { html.a { --btn-bs: 0 .05em 0 var(--bg-d3) inset; --btn-1-bs: 0 .05em 0 var(--btn-1h-bg) inset; - --btn-bg: color-mix(in oklab, var(--bg-u5), transparent); --tree-bg: var(--bg); @@ -1708,6 +1708,7 @@ html.b #mu_outer { .opview.splitsub { margin-bottom: 0; } +#acc_cbopen:checked+span, .opview.act { display: block; } @@ -1815,6 +1816,9 @@ html.y #ops svg circle { .pfp.placeholder { text-shadow: 1px 1px 0 var(--bg-half), 1px -1px 0 var(--bg-half), -1px -1px 0 var(--bg-half), -1px 1px 0 var(--bg-half); } +#op_acc:not(.act) { + display: none; +} .opbox { padding: .5em; border-radius: 5px; @@ -2209,7 +2213,9 @@ html.b .btn { min-height: 1.4em; white-space: nowrap; } -#docul a:hover, +#docul a:hover { + color: var(--btn-h-fg); +} #tree .ntree a + a:hover { background: var(--btn-h-bg); color: var(--btn-h-fg); @@ -2248,7 +2254,7 @@ html.b .btn { white-space: nowrap; } #files th:hover .cfg { - display: block; + display: none; width: 1em; border-radius: var(--radius); margin: -1.2em auto 0 auto; @@ -2311,6 +2317,9 @@ html.b .btn { #u2tdate { opacity: .3; } +.disabled { + cursor: default; +} #up_quick.disabled { display: none; } @@ -2504,10 +2513,16 @@ input[type="text"].invalid { #docul li.bn { text-align: center; padding: .5em; + white-space: normal; } #docul li.bn span { - font-weight: bold; - color: var(--fg-max); + color: var(--fg-weak); + vertical-align: center; + text-shadow: none; +} +#docul li a { + display: inline; + padding: 0 !important; } #doc.prism { padding-left: 3em; @@ -3513,7 +3528,7 @@ details .setting { details { border: var(--bg-u3) solid 1px; border-radius: var(--radius); - margin: .3em 0; + margin: .3em; } details:not(.open) .setting { display: none; @@ -5059,7 +5074,7 @@ html.e #wtc { padding: 1em; pointer-events: none; transition: width .05s; - background: linear-gradient(to top, var(--bg-u2), transparent); + background: linear-gradient(to top, var(--bg-u2), color-mix(in oklab, var(--bg-u2) 80%, transparent), transparent); } .popup_button { border-radius: var(--radius); @@ -5081,6 +5096,9 @@ html.e #wtc { margin-top: .3em; text-align: right; } +#opa_acc label { + cursor: pointer !important; +} #ops input[type=submit], #ops #goh { font-size: medium; diff --git a/copyparty/web/browser.html b/copyparty/web/browser.html index 0135ed2e..20e9e9d5 100644 --- a/copyparty/web/browser.html +++ b/copyparty/web/browser.html @@ -37,18 +37,6 @@
- - -
-

-
-
- control-panel -
- - -
-
@@ -68,17 +56,32 @@
- 🔎 - 🧯 - 🚀 - 🎈 -

+

📂
- 📟 - ⚙️ - 👤 -
+ 🔎 + 🧯 + 🚀 + 🎈 +

+

📂
+ 📟 + ⚙️ + + +
+ + + +

Login

+
+
{{ srv_info }}
+ control-panel +
+ + +
+
+
+
diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index 51b77b76..58034dd9 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -1531,7 +1531,6 @@ ebi('rcm').innerHTML = ( ops[a].href = '#v=' + v; } - ebi('opa_acc').appendChild(ebi('op_acc')); ebi('op_acc').onclick = function (e){ e.stopPropagation(); }; @@ -1663,6 +1662,10 @@ function goto(dest) { window.onhashchange = function() { console.log('hash change: ' + location.hash) + // keep it clean + if(location.hash == '') + hist_replace(location.pathname + location.search); + var a_modal = QS('.modal.vis'); if(location.hash.length <= 1 && a_modal){ modaltoggle(a_modal.id); @@ -6187,6 +6190,10 @@ window.thegrid = (function () { ebi('h_hidden').onclick = function () { clmod(this.parentElement, 'open', 't'); + if(!clgot(this.parentElement, 'open') && filecols.picking){ + filecols.unpick(); + clmod(ebi('hcolsh'), 'on', r.picking) + } } var r = { @@ -8987,18 +8994,20 @@ function apply_perms(res) { ebi('acc_pfp').innerHTML = acct.substring(0, 1); ebi('accessType').innerHTML = ''; ebi('blogout').value = L.logout; - ebi('acc_button').onclick = function(){}; } else{ ebi('blogout').style.display = 'none'; ebi('acc_name').innerHTML = L.login; ebi('acc_pfp').innerHTML = fun_tgl ? '👤' : 'acc'; - ebi('acc_button').onclick = goHome; } clmod(ebi('acc_pfp'), 'placeholder', acct == '*'); - var o = QSA('#ops>a[data-perm]'); + var o = QSA('#ops>a'); for (var a = 0; a < o.length; a++) { + if(!o[a].hasAttribute('data-perm')){ + clmod(o[a], 'disabled', false); + continue; + } var display = ''; var enabled = true; var needed = o[a].getAttribute('data-perm').split(' '); diff --git a/copyparty/web/splash.css b/copyparty/web/splash.css index 33abc871..377e568d 100644 --- a/copyparty/web/splash.css +++ b/copyparty/web/splash.css @@ -100,6 +100,9 @@ a { padding: .2em .6em; margin: 0 .3em; } +#lo{ + padding: .35em .6em; +} #lo:hover, #lo:focus-visible, a:hover, a:focus-visible { background: rgb(10, 134, 206); diff --git a/copyparty/web/ui.css b/copyparty/web/ui.css index 92ceb749..34d4eb9b 100644 --- a/copyparty/web/ui.css +++ b/copyparty/web/ui.css @@ -32,6 +32,9 @@ --bg-d3: #0b0b0b; --bgg: var(--bg); + + background: var(--bg); + color: var(--fg); } html.y { color-scheme: light; diff --git a/docs/devnotes.md b/docs/devnotes.md index a12f43e3..a0ce6bc1 100644 --- a/docs/devnotes.md +++ b/docs/devnotes.md @@ -494,9 +494,13 @@ to get started, first `cd` into the `scripts` folder * if you want to build a pypi package, now run `./make-pypi-release.sh d` * if you want to build a docker-image, you have two options: - * if you want to use podman to build all docker-images for all supported architectures, now run `(cd docker; ./make.sh hclean; ./make.sh hclean pull img)` - * if you want to use docker to build all docker-images for your native architecture, now run `sudo make -C docker` + * if you want to use podman to build all docker-images for all supported architectures, now run `(cd docker; make -C base; ./make.sh hclean; ./make.sh hclean pull img)` + * if you want to use docker to build just the `ac` docker-image for your native architecture, now run `sudo make -C docker` + * to use docker to build something other than `ac`, list the image variants you want; `sudo make -C docker min im ac iv dj` * if you want to do something else, please take a look at `docker/make.sh` or `docker/Makefile` for inspiration + * beware of the following: + * if you build with docker, you get the [stock alpine-provided ffmpeg](https://github.com/9001/copyparty/blob/hovudstraum/docs/bad-codecs.md), which makes the docker-image almost twice as big + * if you build with podman (make.sh) you get the copyparty-official legally-comfy custom ffmpeg, but the first build takes about 2-3 hours longer * if you want to build the windows exe, first grab some snacks and a beer, [you'll need it](https://github.com/9001/copyparty/tree/hovudstraum/scripts/pyinstaller) diff --git a/scripts/docker/Dockerfile.ac b/scripts/docker/Dockerfile.ac index ae9706f2..d549627f 100644 --- a/scripts/docker/Dockerfile.ac +++ b/scripts/docker/Dockerfile.ac @@ -6,8 +6,9 @@ LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \ org.opencontainers.image.title="copyparty-ac" \ org.opencontainers.image.description="copyparty with Pillow and FFmpeg (image/audio/video thumbnails, audio transcoding, media tags)" ENV XDG_CONFIG_HOME=/cfg +ARG ADD_PKG="" -RUN apk --no-cache add !pyc \ +RUN apk --no-cache add !pyc ${ADD_PKG} \ tzdata wget mimalloc2 mimalloc2-insecure \ py3-jinja2 py3-argon2-cffi py3-pyzmq \ py3-openssl py3-paramiko py3-pillow diff --git a/scripts/docker/Dockerfile.dj b/scripts/docker/Dockerfile.dj index d78aa5ea..ec82be50 100644 --- a/scripts/docker/Dockerfile.dj +++ b/scripts/docker/Dockerfile.dj @@ -6,11 +6,12 @@ LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \ org.opencontainers.image.title="copyparty-dj" \ org.opencontainers.image.description="copyparty with all optional dependencies, including musical key / bpm detection" ENV XDG_CONFIG_HOME=/cfg +ARG ADD_PKG="" COPY i/bin/mtag/install-deps.sh ./ COPY i/bin/mtag/audio-bpm.py /mtag/ COPY i/bin/mtag/audio-key.py /mtag/ -RUN apk add -U !pyc \ +RUN apk add -U !pyc ${ADD_PKG} \ tzdata wget mimalloc2 mimalloc2-insecure \ py3-jinja2 py3-argon2-cffi py3-pyzmq \ py3-openssl py3-paramiko py3-pillow \ @@ -29,7 +30,7 @@ RUN apk add -U !pyc \ libraw-dev py3-numpy-dev cython \ && rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \ && 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 --no-binary rawpy rawpy \ && bash install-deps.sh \ && apk del py3-pip .bd \ && chmod 777 /root \ diff --git a/scripts/docker/Dockerfile.im b/scripts/docker/Dockerfile.im index 4828520b..580f0d06 100644 --- a/scripts/docker/Dockerfile.im +++ b/scripts/docker/Dockerfile.im @@ -6,8 +6,9 @@ LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \ org.opencontainers.image.title="copyparty-im" \ org.opencontainers.image.description="copyparty with Pillow and Mutagen (image thumbnails, media tags)" ENV XDG_CONFIG_HOME=/cfg +ARG ADD_PKG="" -RUN apk --no-cache add !pyc \ +RUN apk --no-cache add !pyc ${ADD_PKG} \ tzdata wget mimalloc2 mimalloc2-insecure \ py3-jinja2 py3-argon2-cffi \ py3-openssl py3-paramiko py3-pillow py3-mutagen diff --git a/scripts/docker/Dockerfile.iv b/scripts/docker/Dockerfile.iv index 51360dd8..dff98cd0 100644 --- a/scripts/docker/Dockerfile.iv +++ b/scripts/docker/Dockerfile.iv @@ -6,8 +6,9 @@ LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \ org.opencontainers.image.title="copyparty-iv" \ org.opencontainers.image.description="copyparty with Pillow, FFmpeg, libvips (image/audio/video thumbnails, audio transcoding, media tags)" ENV XDG_CONFIG_HOME=/cfg +ARG ADD_PKG="" -RUN apk add -U !pyc \ +RUN apk add -U !pyc ${ADD_PKG} \ tzdata wget mimalloc2 mimalloc2-insecure \ py3-jinja2 py3-argon2-cffi py3-pyzmq \ py3-openssl py3-paramiko py3-pillow \ @@ -21,7 +22,7 @@ RUN apk add -U !pyc \ libraw-dev py3-numpy-dev cython \ && rm -f /usr/lib/python3*/EXTERNALLY-MANAGED \ && 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 --no-binary rawpy rawpy \ && apk del py3-pip .bd COPY i innvikler.sh ./ diff --git a/scripts/docker/Dockerfile.min b/scripts/docker/Dockerfile.min index ca7b718f..9b289d53 100644 --- a/scripts/docker/Dockerfile.min +++ b/scripts/docker/Dockerfile.min @@ -6,8 +6,9 @@ LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \ org.opencontainers.image.title="copyparty-min" \ org.opencontainers.image.description="just copyparty, no thumbnails / media tags / audio transcoding" ENV XDG_CONFIG_HOME=/cfg +ARG ADD_PKG="" -RUN apk --no-cache add !pyc \ +RUN apk --no-cache add !pyc ${ADD_PKG} \ py3-jinja2 COPY i innvikler.sh ./ diff --git a/scripts/docker/Makefile b/scripts/docker/Makefile index 8b8ff68a..26c7d8e3 100644 --- a/scripts/docker/Makefile +++ b/scripts/docker/Makefile @@ -1,57 +1,32 @@ self := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -all: - -service docker start - -systemctl start docker - +.PHONY: i min im ac iv dj clean hclean purge sh + +all: ac + +i: rm -rf i mkdir i - tar -cC../.. dist/copyparty-sfx.py bin/mtag | tar -xvCi - + tar -cC../../dist copyparty-sfx.py | tar -xvCi + tar -cC../.. bin/mtag | tar -xvCi +# # use stock ffmpeg because ./base/Makefile requires podman; +# # beware: https://github.com/9001/copyparty/blob/hovudstraum/docs/bad-codecs.md + touch i/stock_ffmpeg + +min: i docker build -t copyparty/min:latest -f Dockerfile.min . - echo 'scale=1;'`docker save copyparty/min:latest | pigz -c | wc -c`/1024/1024 | bc - -# docker build -t copyparty/min-pip:latest -f Dockerfile.min.pip . -# echo 'scale=1;'`docker save copyparty/min-pip:latest | pigz -c | wc -c`/1024/1024 | bc +im: i docker build -t copyparty/im:latest -f Dockerfile.im . - echo 'scale=1;'`docker save copyparty/im:latest | pigz -c | wc -c`/1024/1024 | bc - docker build -t copyparty/iv:latest -f Dockerfile.iv . - echo 'scale=1;'`docker save copyparty/iv:latest | pigz -c | wc -c`/1024/1024 | bc +ac: i + docker build -t copyparty/ac:latest -f Dockerfile.ac --build-arg ADD_PKG=ffmpeg . - docker build -t copyparty/ac:latest -f Dockerfile.ac . - echo 'scale=1;'`docker save copyparty/ac:latest | pigz -c | wc -c`/1024/1024 | bc +iv: i + docker build -t copyparty/iv:latest -f Dockerfile.iv --build-arg ADD_PKG=ffmpeg . - docker build -t copyparty/dj:latest -f Dockerfile.dj . - echo 'scale=1;'`docker save copyparty/dj:latest | pigz -c | wc -c`/1024/1024 | bc - - docker image ls - -min: - rm -rf i - mkdir i - tar -cC../.. dist/copyparty-sfx.py bin/mtag | tar -xvCi - - podman build --squash --pull=always -t copyparty/min:latest -f Dockerfile.min . - echo 'scale=1;'`podman save copyparty/min:latest | pigz -c | wc -c`/1024/1024 | bc - -push: - docker push copyparty/min - docker push copyparty/im - docker push copyparty/iv - docker push copyparty/ac - docker push copyparty/dj - docker image tag copyparty/min:latest ghcr.io/9001/copyparty-min:latest - docker image tag copyparty/im:latest ghcr.io/9001/copyparty-im:latest - docker image tag copyparty/iv:latest ghcr.io/9001/copyparty-iv:latest - docker image tag copyparty/ac:latest ghcr.io/9001/copyparty-ac:latest - docker image tag copyparty/dj:latest ghcr.io/9001/copyparty-dj:latest - docker push ghcr.io/9001/copyparty-min:latest - docker push ghcr.io/9001/copyparty-im:latest - docker push ghcr.io/9001/copyparty-iv:latest - docker push ghcr.io/9001/copyparty-ac:latest - docker push ghcr.io/9001/copyparty-dj:latest +dj: i + docker build -t copyparty/dj:latest -f Dockerfile.dj --build-arg ADD_PKG=ffmpeg . clean: -docker kill `docker ps -q` diff --git a/scripts/docker/innvikler.sh b/scripts/docker/innvikler.sh index d6b113fb..4495e740 100644 --- a/scripts/docker/innvikler.sh +++ b/scripts/docker/innvikler.sh @@ -15,7 +15,7 @@ ised() { } # use custom ffmpeg if relevant -echo $1 | grep -qE 'ac|iv|dj' && ( +echo $1 | grep -qE 'ac|iv|dj' && [ ! -e "/z/stock_ffmpeg" ] && ( cp -pv /z/packages/*.pub /etc/apk/keys/ cd /z/packages/$(cat /etc/apk/arch) apk add ./ffmpeg-*.apk