mirror of
				https://github.com/9001/copyparty.git
				synced 2025-10-31 03:53:31 +00:00 
			
		
		
		
	Compare commits
	
		
			21 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | ed48c2d0ed | ||
|  | 26fe84b660 | ||
|  | 5938230270 | ||
|  | 1a33a047fa | ||
|  | 43a8bcefb9 | ||
|  | 2e740e513f | ||
|  | 8a21a86b61 | ||
|  | f600116205 | ||
|  | 1c03705de8 | ||
|  | f7e461fac6 | ||
|  | 03ce6c97ff | ||
|  | ffd9e76e07 | ||
|  | fc49cb1e67 | ||
|  | f5712d9f25 | ||
|  | 161d57bdda | ||
|  | bae0d440bf | ||
|  | fff052dde1 | ||
|  | 73b06eaa02 | ||
|  | 08a8ebed17 | ||
|  | 74d07426b3 | ||
|  | 69a2bba99a | 
| @@ -1,8 +1,8 @@ | ||||
| # coding: utf-8 | ||||
|  | ||||
| VERSION = (0, 13, 7) | ||||
| VERSION = (0, 13, 11) | ||||
| CODENAME = "future-proof" | ||||
| BUILD_DT = (2021, 8, 28) | ||||
| BUILD_DT = (2021, 8, 30) | ||||
|  | ||||
| S_VERSION = ".".join(map(str, VERSION)) | ||||
| S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT) | ||||
|   | ||||
| @@ -873,7 +873,7 @@ class HttpCli(object): | ||||
|         self.parser.drop() | ||||
|  | ||||
|         ck, msg = self.get_pwd_cookie(pwd) | ||||
|         html = self.j2("msg", h1=msg, h2='<a href="/">ack</a>', redir="/") | ||||
|         html = self.j2("msg", h1=msg, h2='<a href="/?h">ack</a>', redir="/?h") | ||||
|         self.reply(html.encode("utf-8"), headers={"Set-Cookie": ck}) | ||||
|         return True | ||||
|  | ||||
|   | ||||
| @@ -177,7 +177,7 @@ class TcpSrv(object): | ||||
|             eps = self.ips_linux() | ||||
|  | ||||
|         if "0.0.0.0" not in listen_ips: | ||||
|             eps = {k: v for k, v in eps if k in listen_ips} | ||||
|             eps = {k: v for k, v in eps.items() if k in listen_ips} | ||||
|  | ||||
|         default_route = None | ||||
|         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | ||||
|   | ||||
| @@ -204,6 +204,9 @@ a, #files tbody div a:last-child { | ||||
| 	color: #f4c; | ||||
| 	border-bottom: 1px solid rgba(255,68,204,0.6); | ||||
| } | ||||
| #repl { | ||||
| 	padding: .33em; | ||||
| } | ||||
| #files tbody a.play { | ||||
| 	color: #e70; | ||||
| 	padding: .2em; | ||||
| @@ -317,7 +320,7 @@ html.light #ggrid>a.sel { | ||||
| } | ||||
| #widget { | ||||
| 	position: fixed; | ||||
| 	font-size: 1.5em; | ||||
| 	font-size: 1.4em; | ||||
| 	left: 0; | ||||
| 	right: 0; | ||||
| 	bottom: -6em; | ||||
| @@ -340,16 +343,19 @@ html.light #ggrid>a.sel { | ||||
| } | ||||
| #wtgrid, | ||||
| #wtico { | ||||
| 	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; | ||||
| 	padding: .1em; | ||||
| 	top: -.12em; | ||||
| } | ||||
| #wtgrid:hover, | ||||
| #wtico { | ||||
| 	cursor: url(/.cpr/dd/4.png), pointer; | ||||
| 	animation: cursor 500ms; | ||||
| } | ||||
| #wtico:hover { | ||||
| 	animation: cursor 500ms infinite; | ||||
| } | ||||
| @@ -366,7 +372,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,23 +383,25 @@ html.light #ggrid>a.sel { | ||||
| 	background: #3c3c3c; | ||||
| 	box-shadow: 0 0 .5em #222; | ||||
| 	border-radius: .3em 0 0 0; | ||||
| 	padding: .2em .2em; | ||||
| 	padding: 0 0 0 .1em; | ||||
| 	color: #fff; | ||||
| } | ||||
| #wzip, #wnp { | ||||
| #wfm, #wzip, #wnp { | ||||
| 	display: none; | ||||
| 	margin-right: .3em; | ||||
| 	padding-right: .3em; | ||||
| } | ||||
| #wzip, #wnp { | ||||
| 	margin-right: .2em; | ||||
| 	padding-right: .2em; | ||||
| 	border-right: .1em solid #555; | ||||
| } | ||||
| #wnp a { | ||||
| 	position: relative; | ||||
| 	font-size: .47em; | ||||
| 	margin: 0 .1em; | ||||
| 	top: -.4em; | ||||
| #wfm.act+#wzip, | ||||
| #wfm.act+#wzip+#wnp { | ||||
| 	margin-left: .2em; | ||||
| 	padding-left: .2em; | ||||
| 	border-left: .1em solid #555; | ||||
| } | ||||
| #wnp a+a { | ||||
| 	margin-left: .33em; | ||||
| #wfm.act { | ||||
| 	display: inline-block; | ||||
| } | ||||
| #wtoggle, | ||||
| #wtoggle * { | ||||
| @@ -406,17 +415,22 @@ html.light #ggrid>a.sel { | ||||
| 	display: none; | ||||
| } | ||||
| #wfm a, | ||||
| #wnp a, | ||||
| #wzip a { | ||||
| 	font-size: .5em; | ||||
| 	padding: 0 .3em; | ||||
| 	margin: -.3em .2em; | ||||
| 	margin: -.3em .1em; | ||||
| 	position: relative; | ||||
| 	display: inline-block; | ||||
| } | ||||
| #wfm span { | ||||
| #wfm span, | ||||
| #wnp span { | ||||
| 	font-size: .6em; | ||||
| 	display: block; | ||||
| } | ||||
| #wnp span { | ||||
| 	font-size: .7em; | ||||
| } | ||||
| #wfm a:not(.en) { | ||||
| 	opacity: .3; | ||||
| 	color: #f6c; | ||||
| @@ -433,7 +447,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 +1673,7 @@ html.light #bbox-overlay figcaption a { | ||||
| 	white-space: nowrap; | ||||
| 	text-align: center; | ||||
| 	overflow: hidden; | ||||
| 	min-width: 24em; | ||||
| } | ||||
| #u2cards.w { | ||||
| 	width: 44em; | ||||
|   | ||||
| @@ -113,6 +113,8 @@ | ||||
| 	<div id="epi" class="logue">{{ logues[1] }}</div> | ||||
|  | ||||
| 	<h2><a href="/?h">control-panel</a></h2> | ||||
| 	 | ||||
| 	<a href="#" id="repl">π</a> | ||||
|  | ||||
| </div> | ||||
|  | ||||
|   | ||||
| @@ -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' + | ||||
| @@ -40,8 +40,8 @@ ebi('widget').innerHTML = ( | ||||
| 	' href="#" id="selinv" tt="invert selection">sel.<br />inv.</a><a' + | ||||
| 	' href="#" id="selzip" tt="download selection as archive">zip</a>' + | ||||
| 	'</span><span id="wnp"><a' + | ||||
| 	' href="#" id="npirc" tt="copy irc-formatted track info">📋irc</a><a' + | ||||
| 	' href="#" id="nptxt" tt="copy plaintext track info">📋txt</a>' + | ||||
| 	' href="#" id="npirc" tt="copy irc-formatted track info">📋<span>irc</span></a><a' + | ||||
| 	' href="#" id="nptxt" tt="copy plaintext track info">📋<span>txt</span></a>' + | ||||
| 	'</span><a' + | ||||
| 	'	href="#" id="wtgrid" tt="toggle grid/list view$NHotkey: G">田</a><a' + | ||||
| 	'	href="#" id="wtico">♫</a>' + | ||||
| @@ -284,7 +284,7 @@ var mpl = (function () { | ||||
| 		r.os_ctl = !r.os_ctl && have_mctl; | ||||
| 		bcfg_set('au_os_ctl', r.os_ctl); | ||||
| 		if (!have_mctl) | ||||
| 			toast.err(5, 'need firefox 82+ or chrome 73+'); | ||||
| 			toast.err(5, 'need firefox 82+ or chrome 73+\n(or iOS 15+ supposedly)'); | ||||
| 	}; | ||||
|  | ||||
| 	ebi('au_osd_cv').onclick = function (e) { | ||||
| @@ -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) || apos < 0 || adur < apos) | ||||
| 			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, | ||||
| @@ -1280,17 +1293,33 @@ function play(tid, is_ev, seek, call_depth) { | ||||
|  | ||||
| 	var url = mp.tracks[tid]; | ||||
| 	if (need_ogv_for(url)) { | ||||
| 		var m = /.* Version\/([0-9]+)\.[0-9\.]+ Mobile\/[^ ]+ Safari\/[0-9\.]+$/.exec(navigator.userAgent), | ||||
| 			safari = m ? parseInt(m[1]) : 99; | ||||
|  | ||||
| 		if (mp.au_ogvjs) { | ||||
| 			mp.au = mp.au_ogvjs; | ||||
| 		} | ||||
| 		else if (window['OGVPlayer']) { | ||||
| 			mp.au = mp.au_ogvjs = new OGVPlayer(); | ||||
| 			mp.loading = true; | ||||
| 			try { | ||||
| 				mp.au = mp.au_ogvjs = new OGVPlayer(); | ||||
| 			} | ||||
| 			catch (ex) { | ||||
| 				return toast.err(30, 'your browser cannot play ogg/vorbis/opus\n\n' + ex + | ||||
| 					'\n\n<a href="#" onclick="new OGVPlayer();">click here</a> for a full crash report'); | ||||
| 			} | ||||
| 			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 if (safari < 14) { | ||||
| 			return toast.err(0, 'because this is an apple device,\nsafari 14 or newer is required to play ogg/vorbis/opus files\n\nyou are using safari ' + safari + '\n(every iOS browser is actually safari)'); | ||||
| 		} | ||||
| 		else { | ||||
| 			if (call_depth !== undefined) | ||||
| 				return toast.err(0, 'failed to load ogv.js:\ncannot play ogg/opus in this browser\n(try a non-apple device)'); | ||||
| @@ -1308,18 +1337,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 +1472,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(); | ||||
| 	}; | ||||
| @@ -1674,7 +1718,7 @@ var fileman = (function () { | ||||
| 		bcut.style.display = have_mv && has(perms, 'move') ? '' : 'none'; | ||||
| 		bpst.style.display = have_mv && has(perms, 'write') ? '' : 'none'; | ||||
| 		bpst.setAttribute('tt', 'paste ' + r.clip.length + ' items$NHotkey: ctrl-V'); | ||||
| 		ebi('wfm').style.display = QS('#wfm a.en:not([display])') ? '' : 'none'; | ||||
| 		clmod(ebi('wfm'), 'act', QS('#wfm a.en:not([style])')); | ||||
| 	}; | ||||
|  | ||||
| 	r.rename = function (e) { | ||||
| @@ -1755,6 +1799,7 @@ var fileman = (function () { | ||||
| 			'</table></div>' | ||||
| 		]); | ||||
|  | ||||
| 		var cheap = f.length > 500; | ||||
| 		if (sel.length == 1) | ||||
| 			html.push( | ||||
| 				'<div><table id="rn_f">\n' + | ||||
| @@ -1767,8 +1812,9 @@ var fileman = (function () { | ||||
| 			for (var a = 0; a < f.length; a++) | ||||
| 				html.push( | ||||
| 					'<tr><td>' + | ||||
| 					'<button class="rn_dec" n="' + a + '">decode</button>', | ||||
| 					'<button class="rn_reset" n="' + a + '">↺ reset</button></td>', | ||||
| 					(cheap ? '</td>' : | ||||
| 						'<button class="rn_dec" n="' + a + '">decode</button>' + | ||||
| 						'<button class="rn_reset" n="' + a + '">↺ reset</button></td>') + | ||||
| 					'<td><input type="text" id="rn_new" n="' + a + '" /></td>' + | ||||
| 					'<td><input type="text" id="rn_old" n="' + a + '" readonly /></td></tr>'); | ||||
| 		} | ||||
| @@ -1789,23 +1835,26 @@ var fileman = (function () { | ||||
| 			f[a].inew = QS('#rn_new' + k); | ||||
| 			f[a].inew.value = f[a].iold.value = f[a].ofn; | ||||
|  | ||||
| 			(function (a) { | ||||
| 				f[a].inew.onkeydown = function (e) { | ||||
| 					rn_ok(a, true); | ||||
| 			if (!cheap) | ||||
| 				(function (a) { | ||||
| 					f[a].inew.onkeydown = function (e) { | ||||
| 						rn_ok(a, true); | ||||
|  | ||||
| 					if (e.key == 'Escape') | ||||
| 						return rn_cancel(); | ||||
| 						if (e.key == 'Escape') | ||||
| 							return rn_cancel(); | ||||
|  | ||||
| 					if (e.key == 'Enter') | ||||
| 						return rn_apply(); | ||||
| 				}; | ||||
| 				QS('.rn_dec' + k).onclick = function () { | ||||
| 					f[a].inew.value = uricom_dec(f[a].inew.value)[0]; | ||||
| 				}; | ||||
| 				QS('.rn_reset' + k).onclick = function () { | ||||
| 					rn_reset(a); | ||||
| 				}; | ||||
| 			})(a); | ||||
| 						if (e.key == 'Enter') | ||||
| 							return rn_apply(); | ||||
| 					}; | ||||
| 					QS('.rn_dec' + k).onclick = function (e) { | ||||
| 						ev(e); | ||||
| 						f[a].inew.value = uricom_dec(f[a].inew.value)[0]; | ||||
| 					}; | ||||
| 					QS('.rn_reset' + k).onclick = function (e) { | ||||
| 						ev(e); | ||||
| 						rn_reset(a); | ||||
| 					}; | ||||
| 				})(a); | ||||
| 		} | ||||
| 		rn_reset(0); | ||||
| 		tt.att(rui); | ||||
| @@ -2939,9 +2988,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); | ||||
|   | ||||
| @@ -8,6 +8,14 @@ html, body { | ||||
| 	font-family: sans-serif; | ||||
| 	line-height: 1.5em; | ||||
| } | ||||
| #repl { | ||||
| 	position: absolute; | ||||
| 	top: 0; | ||||
| 	right: .2em; | ||||
| 	border: none; | ||||
| 	color: inherit; | ||||
| 	background: none; | ||||
| } | ||||
| #mtw { | ||||
| 	display: none; | ||||
| } | ||||
| @@ -506,6 +514,9 @@ blink { | ||||
| 		border-bottom: .07em solid #4ac; | ||||
| 		padding: 0 .3em; | ||||
| 	} | ||||
| 	#repl { | ||||
| 		display: none; | ||||
| 	} | ||||
| 	#toc>ul { | ||||
| 		border-left: .1em solid #84c4dd; | ||||
| 	} | ||||
|   | ||||
| @@ -45,6 +45,7 @@ | ||||
| 		</div> | ||||
| 		<div id="mp"></div> | ||||
| 	</div> | ||||
| 	<a href="#" id="repl">π</a> | ||||
| 	 | ||||
| 	{%- if edit %} | ||||
| 	<div id="helpbox"> | ||||
|   | ||||
| @@ -22,6 +22,15 @@ html, body { | ||||
| 	bottom: auto; | ||||
| 	top: 1.4em; | ||||
| } | ||||
| #repl { | ||||
| 	position: absolute; | ||||
| 	top: 0; | ||||
| 	right: .5em; | ||||
| 	border: none; | ||||
| 	color: inherit; | ||||
| 	background: none; | ||||
| 	text-decoration: none; | ||||
| } | ||||
| #mn { | ||||
| 	font-weight: normal; | ||||
| 	margin: 1.3em 0 .7em 1em; | ||||
|   | ||||
| @@ -21,6 +21,7 @@ | ||||
| 			<textarea id="mt" style="display:none" autocomplete="off">{{ md }}</textarea> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<a href="#" id="repl">π</a> | ||||
| 	<script> | ||||
|  | ||||
| var last_modified = {{ lastmod }}; | ||||
|   | ||||
| @@ -29,6 +29,12 @@ a { | ||||
| 	border-radius: .2em; | ||||
| 	padding: .2em .8em; | ||||
| } | ||||
| #repl { | ||||
| 	border: none; | ||||
| 	background: none; | ||||
| 	color: inherit; | ||||
| 	padding: 0; | ||||
| } | ||||
| table { | ||||
| 	border-collapse: collapse; | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=0.8"> | ||||
|     <link rel="stylesheet" media="screen" href="/.cpr/splash.css?_={{ ts }}"> | ||||
|     <link rel="stylesheet" media="screen" href="/.cpr/ui.css?_={{ ts }}"> | ||||
| </head> | ||||
|  | ||||
| <body> | ||||
| @@ -66,11 +67,13 @@ | ||||
|             </form> | ||||
|         </ul> | ||||
|     </div> | ||||
| 	<a href="#" id="repl">π</a> | ||||
|     <script> | ||||
|  | ||||
| if (localStorage.getItem('lightmode') != 1) | ||||
|     document.documentElement.setAttribute("class", "dark"); | ||||
|  | ||||
| </script> | ||||
| <script src="/.cpr/util.js?_={{ ts }}"></script> | ||||
| </body> | ||||
| </html> | ||||
| </html> | ||||
|   | ||||
| @@ -26,7 +26,9 @@ html { | ||||
| 	right: -1em; | ||||
| 	line-height: 1.5em; | ||||
| 	padding: 1em 1.3em; | ||||
| 	margin-left: 3em; | ||||
| 	border-width: .4em 0; | ||||
| 	overflow-wrap: break-word; | ||||
| 	transform: translateX(100%); | ||||
| 	transition: | ||||
| 		transform .4s cubic-bezier(.2, 1.2, .5, 1), | ||||
| @@ -34,7 +36,14 @@ html { | ||||
| 	text-shadow: 1px 1px 0 #000; | ||||
| 	color: #fff; | ||||
| } | ||||
| #toastc { | ||||
| #toast a { | ||||
| 	color: inherit; | ||||
| 	text-shadow: inherit; | ||||
| 	background: rgba(0, 0, 0, 0.4); | ||||
| 	border-radius: .3em; | ||||
| 	padding: .2em .3em; | ||||
| } | ||||
| #toast a#toastc { | ||||
| 	display: inline-block; | ||||
| 	position: absolute; | ||||
| 	overflow: hidden; | ||||
| @@ -107,6 +116,7 @@ html { | ||||
| 	padding: 1.5em 2em; | ||||
| 	border-width: .5em 0; | ||||
| } | ||||
| #modalc code, | ||||
| #tt code { | ||||
| 	background: #3c3c3c; | ||||
| 	padding: .1em .3em; | ||||
| @@ -125,6 +135,7 @@ html.light #tt, | ||||
| html.light #toast { | ||||
| 	box-shadow: 0 .3em 1em rgba(0,0,0,0.4); | ||||
| } | ||||
| #modalc code, | ||||
| html.light #tt code { | ||||
| 	background: #060; | ||||
| 	color: #fff; | ||||
| @@ -207,6 +218,8 @@ html.light #tt em { | ||||
| } | ||||
| #modali { | ||||
| 	display: block; | ||||
| 	background: #fff; | ||||
| 	color: #000; | ||||
| 	width: calc(100% - 1.25em); | ||||
|     margin: 1em -.1em 0 -.1em; | ||||
| 	padding: .5em; | ||||
|   | ||||
| @@ -800,6 +800,12 @@ function up2k_init(subtle) { | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         good_files.sort(function (a, b) { | ||||
|             a = a[1]; | ||||
|             b = b[1]; | ||||
|             return a < b ? -1 : a > b ? 1 : 0; | ||||
|         }); | ||||
|  | ||||
|         var msg = ['{0} these {1} files?<ul>'.format(fsearch ? 'search' : 'upload', good_files.length)]; | ||||
|         for (var a = 0, aa = Math.min(20, good_files.length); a < aa; a++) | ||||
|             msg.push('<li>' + esc(good_files[a][1]) + '</li>'); | ||||
| @@ -906,7 +912,7 @@ function up2k_init(subtle) { | ||||
|             td = (now - (etaref || now)) / 1000.0; | ||||
|  | ||||
|         etaref = now; | ||||
|         //ebi('acc_info').innerHTML = f2f(st.time.busy, 1) + ' ' + f2f(now / 1000, 1); | ||||
|         //ebi('acc_info').innerHTML = humantime(st.time.busy) + ' ' + f2f(now / 1000, 1); | ||||
|  | ||||
|         if (!nhash) | ||||
|             ebi('u2etah').innerHTML = 'Done ({0}, {1} files)'.format(humansize(st.bytes.hashed), pvis.ctr["ok"] + pvis.ctr["ng"]); | ||||
| @@ -954,14 +960,8 @@ function up2k_init(subtle) { | ||||
|             if (etaskip) | ||||
|                 continue; | ||||
|  | ||||
|             if (eta < 60 * 60 * 24) | ||||
|                 try { | ||||
|                     eta = /.*(..:..:..).*/.exec(new Date(eta * 1000).toUTCString())[1]; | ||||
|                 } | ||||
|                 catch (ex) { } | ||||
|  | ||||
|             ebi(t[a][0]).innerHTML = '{0}, {1}/s, {2}'.format( | ||||
|                 humansize(rem), humansize(bps, 1), eta); | ||||
|                 humansize(rem), humansize(bps, 1), humantime(eta)); | ||||
|         } | ||||
|         if (++etaskip > 2) | ||||
|             etaskip = 0; | ||||
| @@ -1852,7 +1852,7 @@ function up2k_init(subtle) { | ||||
|                 flag = up2k_flagbus(); | ||||
|             } | ||||
|             catch (ex) { | ||||
|                 console.log("flag error: " + ex.toString()); | ||||
|                 toast.err(5, "not supported on your browser:\n" + ex); | ||||
|                 tgl_flag_en(); | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -39,7 +39,8 @@ function vis_exh(msg, url, lineNo, columnNo, error) { | ||||
|  | ||||
|     crashed = true; | ||||
|     window.onerror = undefined; | ||||
|     var html = ['<h1>you hit a bug!</h1><p style="font-size:1.3em;margin:0">try to <a href="#" onclick="localStorage.clear();location.reload();">reset copyparty settings</a> if you are stuck here, or <a href="#" onclick="ignex();">ignore this</a> / <a href="#" onclick="ignex(true);">ignore all</a></p><p>please send me a screenshot arigathanks gozaimuch: <code>ed/irc.rizon.net</code> or <code>ed#2644</code><br />  (and if you can, press F12 and include the "Console" tab in the screenshot too)</p><p>', | ||||
|     var con = is_touch ? '' : '<br />  (and if you can, press F12 and include the "Console" tab in the screenshot too)', | ||||
|         html = ['<h1>you hit a bug!</h1><p style="font-size:1.3em;margin:0">try to <a href="#" onclick="localStorage.clear();location.reload();">reset copyparty settings</a> if you are stuck here, or <a href="#" onclick="ignex();">ignore this</a> / <a href="#" onclick="ignex(true);">ignore all</a></p><p>please send me a screenshot arigathanks gozaimuch: <code>ed/irc.rizon.net</code> or <code>ed#2644</code>' + con + '</p><p>', | ||||
|         esc(url + ' @' + lineNo + ':' + columnNo), '<br />' + esc(String(msg)) + '</p>']; | ||||
|  | ||||
|     try { | ||||
| @@ -63,10 +64,10 @@ function vis_exh(msg, url, lineNo, columnNo, error) { | ||||
|             document.body.appendChild(exbox); | ||||
|  | ||||
|             var s = mknod('style'); | ||||
|             s.innerHTML = '#exbox{background:#333;color:#ddd;font-family:sans-serif;font-size:0.8em;padding:0 1em 1em 1em;z-index:80386;position:fixed;top:0;left:0;right:0;bottom:0;width:100%;height:100%} #exbox h1{margin:.5em 1em 0 0;padding:0} #exbox h3{border-top:1px solid #999;margin:1em 0 0 0} #exbox a{text-decoration:underline;color:#fc0} #exbox code{color:#bf7;background:#222;padding:.1em;margin:.2em;font-size:1.1em;font-family:monospace,monospace} #exbox *{line-height:1.5em}'; | ||||
|             s.innerHTML = '#exbox{background:#333;color:#ddd;font-family:sans-serif;font-size:0.8em;padding:0 1em 1em 1em;z-index:80386;position:fixed;top:0;left:0;right:0;bottom:0;width:100%;height:100%;overflow:auto;width:calc(100% - 2em)} #exbox h1{margin:.5em 1em 0 0;padding:0} #exbox h3{border-top:1px solid #999;margin:1em 0 0 0} #exbox a{text-decoration:underline;color:#fc0} #exbox code{color:#bf7;background:#222;padding:.1em;margin:.2em;font-size:1.1em;font-family:monospace,monospace} #exbox,#exbox *{line-height:1.5em;overflow-wrap:break-word}'; | ||||
|             document.head.appendChild(s); | ||||
|         } | ||||
|         exbox.innerHTML = html.join('\n'); | ||||
|         exbox.innerHTML = html.join('\n').replace(/https?:\/\/[^ \/]+\//g, '/'); | ||||
|         exbox.style.display = 'block'; | ||||
|     } | ||||
|     catch (e) { | ||||
| @@ -429,6 +430,19 @@ function humansize(b, terse) { | ||||
| } | ||||
|  | ||||
|  | ||||
| function humantime(v) { | ||||
|     if (v >= 60 * 60 * 24) | ||||
|         return v; | ||||
|  | ||||
|     try { | ||||
|         return /.*(..:..:..).*/.exec(new Date(v * 1000).toUTCString())[1]; | ||||
|     } | ||||
|     catch (ex) { | ||||
|         return v; | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| function clamp(v, a, b) { | ||||
|     return Math.min(Math.max(v, a), b); | ||||
| } | ||||
| @@ -782,7 +796,13 @@ var modal = (function () { | ||||
|         a = ebi('modal-ok'); | ||||
|         a.onclick = ok; | ||||
|  | ||||
|         (ebi('modali') || a).focus(); | ||||
|         var inp = ebi('modali'); | ||||
|         (inp || a).focus(); | ||||
|         if (inp) | ||||
|             setTimeout(function () { | ||||
|                 inp.setSelectionRange(0, inp.value.length, "forward"); | ||||
|             }, 0); | ||||
|  | ||||
|         document.addEventListener('focus', onfocus); | ||||
|         timer.add(onfocus); | ||||
|     }; | ||||
| @@ -892,3 +912,24 @@ function winpopup(txt) { | ||||
|         body: 'msg=' + uricom_enc(Date.now() + ', ' + txt) | ||||
|     }); | ||||
| } | ||||
|  | ||||
|  | ||||
| function repl(e) { | ||||
|     ev(e); | ||||
|     modal.prompt('js repl (prefix with <code>,</code> to allow raise)', 'var v=Object.keys(localStorage); v.sort(); JSON.stringify(v)', function (cmd) { | ||||
|         if (!cmd) | ||||
|             return toast.inf(3, 'eval aborted'); | ||||
|  | ||||
|         if (cmd.startsWith(',')) | ||||
|             return modal.alert(esc(eval(cmd.slice(1)) + '')) | ||||
|  | ||||
|         try { | ||||
|             modal.alert(esc(eval(cmd) + '')); | ||||
|         } | ||||
|         catch (ex) { | ||||
|             modal.alert('<h6>exception</h6>' + esc(ex + '')); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| if (ebi('repl')) | ||||
|     ebi('repl').onclick = repl; | ||||
|   | ||||
| @@ -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 | ||||
|  | ||||
|   | ||||
| @@ -37,6 +37,7 @@ gtar=$(command -v gtar || command -v gnutar) || true | ||||
| 	sed()  { gsed  "$@"; } | ||||
| 	find() { gfind "$@"; } | ||||
| 	sort() { gsort "$@"; } | ||||
| 	shuf() { gshuf "$@"; } | ||||
| 	sha1sum() { shasum "$@"; } | ||||
| 	unexpand() { gunexpand "$@"; } | ||||
| 	command -v grealpath >/dev/null && | ||||
| @@ -303,7 +304,7 @@ for d in copyparty dep-j2; do find $d -type f; done | | ||||
| sed -r 's/(.*)\.(.*)/\2 \1/' | LC_ALL=C sort | | ||||
| sed -r 's/([^ ]*) (.*)/\2.\1/' | grep -vE '/list1?$' > list1 | ||||
|  | ||||
| (grep -vE '\.(gz|br)$' list1; grep -E '\.(gz|br)$' list1) >list || true | ||||
| (grep -vE '\.(gz|br)$' list1; grep -E '\.(gz|br)$' list1 | shuf) >list || true | ||||
|  | ||||
| echo creating tar | ||||
| args=(--owner=1000 --group=1000) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user