mirror of
https://github.com/9001/copyparty.git
synced 2025-10-31 20:13:34 +00:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
161d57bdda | ||
|
|
bae0d440bf | ||
|
|
fff052dde1 | ||
|
|
73b06eaa02 | ||
|
|
08a8ebed17 | ||
|
|
74d07426b3 | ||
|
|
69a2bba99a |
@@ -1,8 +1,8 @@
|
||||
# coding: utf-8
|
||||
|
||||
VERSION = (0, 13, 7)
|
||||
VERSION = (0, 13, 8)
|
||||
CODENAME = "future-proof"
|
||||
BUILD_DT = (2021, 8, 28)
|
||||
BUILD_DT = (2021, 8, 29)
|
||||
|
||||
S_VERSION = ".".join(map(str, VERSION))
|
||||
S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
|
||||
|
||||
@@ -317,7 +317,7 @@ html.light #ggrid>a.sel {
|
||||
}
|
||||
#widget {
|
||||
position: fixed;
|
||||
font-size: 1.5em;
|
||||
font-size: 1.4em;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: -6em;
|
||||
@@ -343,10 +343,11 @@ html.light #ggrid>a.sel {
|
||||
cursor: url(/.cpr/dd/4.png), pointer;
|
||||
animation: cursor 500ms;
|
||||
position: relative;
|
||||
top: -.06em;
|
||||
font-size: .9em;
|
||||
top: -.04em;
|
||||
}
|
||||
#wtgrid {
|
||||
font-size: .8em;
|
||||
font-size: .75em;
|
||||
top: -.12em;
|
||||
}
|
||||
#wtgrid:hover,
|
||||
@@ -366,7 +367,8 @@ html.light #ggrid>a.sel {
|
||||
#wtoggle {
|
||||
position: absolute;
|
||||
white-space: nowrap;
|
||||
top: -1.2em;
|
||||
font-size: .8em;
|
||||
top: -1em;
|
||||
right: 0;
|
||||
height: 1em;
|
||||
font-size: 2em;
|
||||
@@ -376,7 +378,7 @@ html.light #ggrid>a.sel {
|
||||
background: #3c3c3c;
|
||||
box-shadow: 0 0 .5em #222;
|
||||
border-radius: .3em 0 0 0;
|
||||
padding: .2em .2em;
|
||||
padding: 0;
|
||||
color: #fff;
|
||||
}
|
||||
#wzip, #wnp {
|
||||
@@ -409,7 +411,7 @@ html.light #ggrid>a.sel {
|
||||
#wzip a {
|
||||
font-size: .5em;
|
||||
padding: 0 .3em;
|
||||
margin: -.3em .2em;
|
||||
margin: -.3em .1em;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
@@ -433,7 +435,7 @@ html.light #wfm a:not(.en) {
|
||||
}
|
||||
#wzip a {
|
||||
font-size: .4em;
|
||||
margin: -.3em .3em;
|
||||
margin: -.3em .1em;
|
||||
}
|
||||
#wtoggle.sel #wzip #selzip {
|
||||
top: -.6em;
|
||||
@@ -1659,6 +1661,7 @@ html.light #bbox-overlay figcaption a {
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
overflow: hidden;
|
||||
min-width: 24em;
|
||||
}
|
||||
#u2cards.w {
|
||||
width: 44em;
|
||||
|
||||
@@ -32,7 +32,7 @@ ebi('widget').innerHTML = (
|
||||
'<div id="wtoggle">' +
|
||||
'<span id="wfm"><a' +
|
||||
' href="#" id="fren" tt="rename selected item$NHotkey: F2">✎<span>name</span></a><a' +
|
||||
' href="#" id="fdel" tt="delete selected items$NHotkey: ctrl-K">⌫<span>delete</span></a><a' +
|
||||
' href="#" id="fdel" tt="delete selected items$NHotkey: ctrl-K">⌫<span>del.</span></a><a' +
|
||||
' href="#" id="fcut" tt="cut selected items <small>(then paste somewhere else)</small>$NHotkey: ctrl-X">✂<span>cut</span></a><a' +
|
||||
' href="#" id="fpst" tt="paste a previously cut/copied selection$NHotkey: ctrl-V">📋<span>paste</span></a>' +
|
||||
'</span><span id="wzip"><a' +
|
||||
@@ -399,6 +399,7 @@ function MPlayer() {
|
||||
r.au_native2 = null;
|
||||
r.au_ogvjs = null;
|
||||
r.au_ogvjs2 = null;
|
||||
r.loading = false;
|
||||
r.tracks = {};
|
||||
r.order = [];
|
||||
|
||||
@@ -422,18 +423,14 @@ function MPlayer() {
|
||||
}
|
||||
}
|
||||
|
||||
r.vol = sread('vol');
|
||||
if (r.vol !== null)
|
||||
r.vol = parseFloat(r.vol);
|
||||
else
|
||||
r.vol = 0.5;
|
||||
r.vol = clamp(fcfg_get('vol', 0.5), 0, 1);
|
||||
|
||||
r.expvol = function (v) {
|
||||
return 0.5 * v + 0.5 * v * v;
|
||||
};
|
||||
|
||||
r.setvol = function (vol) {
|
||||
r.vol = Math.max(Math.min(vol, 1), 0);
|
||||
r.vol = clamp(vol, 0, 1);
|
||||
swrite('vol', vol);
|
||||
r.stopfade(true);
|
||||
|
||||
@@ -680,7 +677,7 @@ var pbar = (function () {
|
||||
|
||||
bctx.clearRect(0, 0, bc.w, bc.h);
|
||||
|
||||
if (!mp.au)
|
||||
if (!mp.au || mp.loading)
|
||||
return;
|
||||
|
||||
var sm = bc.w * 1.0 / mp.au.duration,
|
||||
@@ -702,25 +699,26 @@ var pbar = (function () {
|
||||
r.drawpos = function () {
|
||||
var bc = r.buf,
|
||||
pc = r.pos,
|
||||
pctx = pc.ctx;
|
||||
pctx = pc.ctx,
|
||||
apos, adur;
|
||||
|
||||
pctx.clearRect(0, 0, pc.w, pc.h);
|
||||
|
||||
if (!mp.au || isNaN(mp.au.duration) || isNaN(mp.au.currentTime))
|
||||
if (!mp.au || mp.loading || isNaN(adur = mp.au.duration) || isNaN(apos = mp.au.currentTime))
|
||||
return; // not-init || unsupp-codec
|
||||
|
||||
var sm = bc.w * 1.0 / mp.au.duration;
|
||||
var sm = bc.w * 1.0 / adur;
|
||||
|
||||
pctx.fillStyle = light ? 'rgba(0,64,0,0.15)' : 'rgba(204,255,128,0.15)';
|
||||
for (var p = 1, mins = mp.au.duration / 10; p <= mins; p++)
|
||||
for (var p = 1, mins = adur / 10; p <= mins; p++)
|
||||
pctx.fillRect(Math.floor(sm * p * 10), 0, 2, pc.h);
|
||||
|
||||
pctx.fillStyle = light ? 'rgba(0,64,0,0.5)' : 'rgba(192,255,96,0.5)';
|
||||
for (var p = 1, mins = mp.au.duration / 60; p <= mins; p++)
|
||||
for (var p = 1, mins = adur / 60; p <= mins; p++)
|
||||
pctx.fillRect(Math.floor(sm * p * 60), 0, 2, pc.h);
|
||||
|
||||
var w = 8,
|
||||
x = sm * mp.au.currentTime;
|
||||
x = sm * apos;
|
||||
|
||||
pctx.fillStyle = '#573'; pctx.fillRect((x - w / 2) - 1, 0, w + 2, pc.h);
|
||||
pctx.fillStyle = '#dfc'; pctx.fillRect((x - w / 2), 0, 8, pc.h);
|
||||
@@ -731,8 +729,8 @@ var pbar = (function () {
|
||||
pctx.font = '1em sans-serif';
|
||||
|
||||
var m = pctx.measureText.bind(pctx),
|
||||
t1 = s2ms(mp.au.duration),
|
||||
t2 = s2ms(mp.au.currentTime),
|
||||
t1 = s2ms(adur),
|
||||
t2 = s2ms(apos),
|
||||
yt = pc.h / 3 * 2.1,
|
||||
xt1 = pc.w - (m(t1).width + 12),
|
||||
xt2 = x < pc.w / 2 ? (x + 12) : (Math.min(pc.w - m(t1 + ":88").width, x - 12) - m(t2).width);
|
||||
@@ -965,7 +963,7 @@ var mpui = (function () {
|
||||
}
|
||||
|
||||
// preload next song
|
||||
if (mpl.preload && preloaded != mp.au.src) {
|
||||
if (mpl.preload && !mp.loading && preloaded != mp.au.src) {
|
||||
var pos = mp.au.currentTime,
|
||||
len = mp.au.duration;
|
||||
|
||||
@@ -1021,6 +1019,21 @@ function need_ogv_for(url) {
|
||||
}
|
||||
|
||||
|
||||
function start_sinegen() {
|
||||
var af = 'data:audio/wav;base64,UklGRlaxAgBXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAATElTVBoAAABJTkZPSVNGVA4AAABMYXZmNTguNzYuMTAwAGRhdGEQsQIAAAB',
|
||||
body = 'iArcE8AYCCeEKggzaDeQOmA/0D/QPmQ/kDtsNggzhCgMJ8Qa4BGMCAQCe/Un7EPn+9h/1fvMm8hzxaPAM8AzwZ/Ac8SXyfvMf9f32D/lI+539//9';
|
||||
|
||||
while (af.length < 235304)
|
||||
af += body;
|
||||
|
||||
var au = new Audio(af.slice(0, 235304));
|
||||
au.onplay = au.pause.bind(au);
|
||||
au.volume = 0.5;
|
||||
au.play();
|
||||
return au;
|
||||
}
|
||||
|
||||
|
||||
var audio_eq = (function () {
|
||||
var r = {
|
||||
"en": false,
|
||||
@@ -1284,11 +1297,15 @@ function play(tid, is_ev, seek, call_depth) {
|
||||
mp.au = mp.au_ogvjs;
|
||||
}
|
||||
else if (window['OGVPlayer']) {
|
||||
mp.loading = true;
|
||||
mp.au = mp.au_ogvjs = new OGVPlayer();
|
||||
attempt_play = is_ev;
|
||||
mp.au.addEventListener('error', evau_error, true);
|
||||
mp.au.addEventListener('progress', pbar.drawpos);
|
||||
mp.au.addEventListener('ended', next_song);
|
||||
mp.au.onerror = evau_error;
|
||||
mp.au.onprogress = pbar.drawpos;
|
||||
mp.au.onended = next_song;
|
||||
mp.au.onloadedmetadata = mp.au.onloadeddata = function () {
|
||||
mp.loading = false;
|
||||
};
|
||||
widget.open();
|
||||
}
|
||||
else {
|
||||
@@ -1300,6 +1317,10 @@ function play(tid, is_ev, seek, call_depth) {
|
||||
import_js('/.cpr/deps/ogv.js', function () {
|
||||
toast.hide();
|
||||
play(tid, false, seek, 1);
|
||||
|
||||
var m = /.* Version\/([0-9]+)\.[0-9\.]+ Mobile\/[^ ]+ Safari\/[0-9\.]+$/.exec(navigator.userAgent);
|
||||
if (m && parseInt(m[1]) < 14)
|
||||
toast.err(0, 'because this is an apple device,\nsafari 14 or newer is required\n\nyou are using safari version ' + m[1] + ', so playback of ogg/vorbis/opus files will be buggy\n\nnote: every iOS browser is safari');
|
||||
});
|
||||
|
||||
return;
|
||||
@@ -1308,18 +1329,26 @@ function play(tid, is_ev, seek, call_depth) {
|
||||
else {
|
||||
if (!mp.au_native) {
|
||||
mp.au = mp.au_native = new Audio();
|
||||
mp.au.addEventListener('error', evau_error, true);
|
||||
mp.au.addEventListener('progress', pbar.drawpos);
|
||||
mp.au.addEventListener('ended', next_song);
|
||||
mp.au.onerror = evau_error;
|
||||
mp.au.onprogress = pbar.drawpos;
|
||||
mp.au.onended = next_song;
|
||||
widget.open();
|
||||
}
|
||||
mp.au = mp.au_native;
|
||||
mp.loading = false;
|
||||
}
|
||||
|
||||
audio_eq.apply();
|
||||
|
||||
url += (url.indexOf('?') < 0 ? '?cache' : '&cache');
|
||||
if (mp.au.src == url)
|
||||
mp.au.currentTime = 0;
|
||||
else {
|
||||
mp.loading = mp.au == mp.au_ogvjs;
|
||||
mp.au.src = url;
|
||||
}
|
||||
|
||||
mp.au.tid = tid;
|
||||
mp.au.src = url + (url.indexOf('?') < 0 ? '?cache' : '&cache');
|
||||
mp.au.volume = mp.expvol(mp.vol);
|
||||
var oid = 'a' + tid;
|
||||
setclass(oid, 'play act');
|
||||
@@ -1435,9 +1464,16 @@ function autoplay_blocked(seek) {
|
||||
go.textContent = 'Play "' + fn + '"';
|
||||
go.onclick = function (e) {
|
||||
unblocked(e);
|
||||
// chrome 91 may permanently taint on a failed play()
|
||||
// depending on win10 settings or something? idk
|
||||
mp.au_native = mp.au_ogvjs = null;
|
||||
if (mp.au !== mp.au_ogvjs)
|
||||
// chrome 91 may permanently taint on a failed play()
|
||||
// depending on win10 settings or something? idk
|
||||
mp.au_native = null;
|
||||
else
|
||||
// iOS browsers allow playing ogg/vorbis/opus in the background
|
||||
// if there is an <audio> tag which at some point played audio
|
||||
if (!mp.sinegen)
|
||||
mp.sinegen = start_sinegen();
|
||||
|
||||
play(tid, true, seek);
|
||||
mp.fade_in();
|
||||
};
|
||||
@@ -2939,9 +2975,7 @@ var treectl = (function () {
|
||||
prev_winh = null,
|
||||
dyn = bcfg_get('dyntree', true),
|
||||
dots = bcfg_get('dotfiles', false),
|
||||
treesz = icfg_get('treesz', 16);
|
||||
|
||||
treesz = Math.min(Math.max(treesz, 4), 50);
|
||||
treesz = clamp(icfg_get('treesz', 16), 4, 50);
|
||||
|
||||
treectl.entree = function (e) {
|
||||
ev(e);
|
||||
|
||||
@@ -126,6 +126,10 @@ e=6; s=10; d=~/dev/copyparty/srv/aus; n=1; p=0; e=$((e*60)); rm -rf $d; mkdir $d
|
||||
-v srv/aus:aus:r:ce2dsa:ce2ts:cmtp=fgsfds=bin/mtag/sleep.py
|
||||
sqlite3 .hist/up2k.db 'select * from mt where k="fgsfds" or k="t:mtp"' | tee /dev/stderr | wc -l
|
||||
|
||||
# generate the sine meme
|
||||
for ((f=420;f<1200;f++)); do sz=$(ffmpeg -y -f lavfi -i sine=frequency=$f:duration=2 -vf volume=0.1 -ac 1 -ar 44100 -f s16le /dev/shm/a.wav 2>/dev/null; base64 -w0 </dev/shm/a.wav | gzip -c | wc -c); printf '%d %d\n' $f $sz; done | tee /dev/stderr | sort -nrk2,2
|
||||
ffmpeg -y -f lavfi -i sine=frequency=1050:duration=2 -vf volume=0.1 -ac 1 -ar 44100 /dev/shm/a.wav
|
||||
|
||||
|
||||
##
|
||||
## vscode
|
||||
|
||||
@@ -3,7 +3,7 @@ WORKDIR /z
|
||||
ENV ver_asmcrypto=5b994303a9d3e27e0915f72a10b6c2c51535a4dc \
|
||||
ver_hashwasm=4.7.0 \
|
||||
ver_marked=1.1.0 \
|
||||
ver_ogvjs=1.8.0 \
|
||||
ver_ogvjs=1.8.4 \
|
||||
ver_mde=2.14.0 \
|
||||
ver_codemirror=5.59.3 \
|
||||
ver_fontawesome=5.13.0 \
|
||||
@@ -74,23 +74,16 @@ RUN cd hash-wasm \
|
||||
# build ogvjs
|
||||
RUN cd ogvjs-$ver_ogvjs \
|
||||
&& cp -pv \
|
||||
ogv.js \
|
||||
ogv-worker-audio.js \
|
||||
ogv-demuxer-ogg-wasm.js \
|
||||
ogv-demuxer-ogg-wasm.wasm \
|
||||
ogv-demuxer-webm-wasm.js \
|
||||
ogv-demuxer-webm-wasm.wasm \
|
||||
ogv-decoder-audio-opus-wasm.js \
|
||||
ogv-decoder-audio-opus-wasm.wasm \
|
||||
ogv-decoder-audio-vorbis-wasm.js \
|
||||
ogv-decoder-audio-vorbis-wasm.wasm \
|
||||
/z/dist
|
||||
|
||||
# ogv-demuxer-ogg.js \
|
||||
# ogv-demuxer-webm.js \
|
||||
# ogv-decoder-audio-opus.js \
|
||||
# ogv-decoder-audio-vorbis.js \
|
||||
# dynamicaudio.swf \
|
||||
/z/dist \
|
||||
&& cp -pv \
|
||||
ogv-es2017.js /z/dist/ogv.js
|
||||
|
||||
|
||||
# build marked
|
||||
|
||||
@@ -2,7 +2,7 @@ all: $(addsuffix .gz, $(wildcard *.*))
|
||||
|
||||
%.gz: %
|
||||
#brotli -q 11 $<
|
||||
pigz -11 -J 34 -I 573 $<
|
||||
pigz -11 -I 573 $<
|
||||
|
||||
# pigz -11 -J 34 -I 100 -F < $< > $@.first
|
||||
|
||||
|
||||
Reference in New Issue
Block a user