mirror of
				https://github.com/9001/copyparty.git
				synced 2025-11-04 05:43:17 +00:00 
			
		
		
		
	Compare commits
	
		
			7 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					02c7061945 | ||
| 
						 | 
					9209e44cd3 | ||
| 
						 | 
					ebed37394e | ||
| 
						 | 
					4c7a2a7ec3 | ||
| 
						 | 
					0a25a88a34 | ||
| 
						 | 
					6aa9025347 | ||
| 
						 | 
					a918cc67eb | 
@@ -1,8 +1,8 @@
 | 
			
		||||
# coding: utf-8
 | 
			
		||||
 | 
			
		||||
VERSION = (0, 12, 6)
 | 
			
		||||
VERSION = (0, 12, 8)
 | 
			
		||||
CODENAME = "fil\033[33med"
 | 
			
		||||
BUILD_DT = (2021, 7, 31)
 | 
			
		||||
BUILD_DT = (2021, 8, 1)
 | 
			
		||||
 | 
			
		||||
S_VERSION = ".".join(map(str, VERSION))
 | 
			
		||||
S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
 | 
			
		||||
 
 | 
			
		||||
@@ -1405,7 +1405,7 @@ class Up2k(object):
 | 
			
		||||
                    try:
 | 
			
		||||
                        ptop = dbv.realpath
 | 
			
		||||
                        cur, wark, _, _, _, _ = self._find_from_vpath(ptop, volpath)
 | 
			
		||||
                        self._forget_file(ptop, volpath, cur, wark)
 | 
			
		||||
                        self._forget_file(ptop, volpath, cur, wark, True)
 | 
			
		||||
                    finally:
 | 
			
		||||
                        cur.connection.commit()
 | 
			
		||||
 | 
			
		||||
@@ -1491,10 +1491,10 @@ class Up2k(object):
 | 
			
		||||
            fsize = st.st_size
 | 
			
		||||
 | 
			
		||||
        if w:
 | 
			
		||||
            if c2:
 | 
			
		||||
            if c2 and c2 != c1:
 | 
			
		||||
                self._copy_tags(c1, c2, w)
 | 
			
		||||
 | 
			
		||||
            self._forget_file(svn.realpath, srem, c1, w)
 | 
			
		||||
            self._forget_file(svn.realpath, srem, c1, w, c1 != c2)
 | 
			
		||||
            self._relink(w, svn.realpath, srem, dabs)
 | 
			
		||||
            c1.connection.commit()
 | 
			
		||||
 | 
			
		||||
@@ -1535,14 +1535,16 @@ class Up2k(object):
 | 
			
		||||
            return cur, wark, ftime, fsize, ip, at
 | 
			
		||||
        return cur, None, None, None, None, None
 | 
			
		||||
 | 
			
		||||
    def _forget_file(self, ptop, vrem, cur, wark):
 | 
			
		||||
    def _forget_file(self, ptop, vrem, cur, wark, drop_tags):
 | 
			
		||||
        """forgets file in db, fixes symlinks, does not delete"""
 | 
			
		||||
        srd, sfn = vsplit(vrem)
 | 
			
		||||
        self.log("forgetting {}".format(vrem))
 | 
			
		||||
        if wark:
 | 
			
		||||
            self.log("found {} in db".format(wark))
 | 
			
		||||
            self._relink(wark, ptop, vrem, None)
 | 
			
		||||
            if self._relink(wark, ptop, vrem, None):
 | 
			
		||||
                drop_tags = False
 | 
			
		||||
 | 
			
		||||
            if drop_tags:
 | 
			
		||||
                q = "delete from mt where w=?"
 | 
			
		||||
                cur.execute(q, (wark[:16],))
 | 
			
		||||
                self.db_rm(cur, srd, sfn)
 | 
			
		||||
@@ -1581,7 +1583,7 @@ class Up2k(object):
 | 
			
		||||
                    self.log("found {} dupe: [{}] {}".format(wark, ptop, dvrem))
 | 
			
		||||
 | 
			
		||||
        if not dupes:
 | 
			
		||||
            return
 | 
			
		||||
            return 0
 | 
			
		||||
 | 
			
		||||
        full = {}
 | 
			
		||||
        links = {}
 | 
			
		||||
@@ -1618,6 +1620,8 @@ class Up2k(object):
 | 
			
		||||
 | 
			
		||||
            self._symlink(dabs, alink, False)
 | 
			
		||||
 | 
			
		||||
        return len(full) + len(links)
 | 
			
		||||
 | 
			
		||||
    def _get_wark(self, cj):
 | 
			
		||||
        if len(cj["name"]) > 1024 or len(cj["hash"]) > 512 * 1024:  # 16TiB
 | 
			
		||||
            raise Pebkac(400, "name or numchunks not according to spec")
 | 
			
		||||
 
 | 
			
		||||
@@ -1068,6 +1068,43 @@ html.light #ggrid a:hover {
 | 
			
		||||
	margin: 0;
 | 
			
		||||
	padding: 0;
 | 
			
		||||
}
 | 
			
		||||
#rui {
 | 
			
		||||
	position: fixed;
 | 
			
		||||
	top: 0;
 | 
			
		||||
	left: 0;
 | 
			
		||||
	width: calc(100% - 2em);
 | 
			
		||||
	height: auto;
 | 
			
		||||
	overflow: auto;
 | 
			
		||||
	max-height: calc(100% - 2em);
 | 
			
		||||
	border-bottom: .5em solid #999;
 | 
			
		||||
	background: #333;
 | 
			
		||||
	padding: 1em;
 | 
			
		||||
	z-index: 765;
 | 
			
		||||
}
 | 
			
		||||
#rui div+div {
 | 
			
		||||
	margin-top: 1em;
 | 
			
		||||
}
 | 
			
		||||
#rui table {
 | 
			
		||||
	width: 100%;
 | 
			
		||||
}
 | 
			
		||||
#rui td {
 | 
			
		||||
	padding: .2em .5em;
 | 
			
		||||
}
 | 
			
		||||
#rui td+td,
 | 
			
		||||
#rui td input {
 | 
			
		||||
	width: 100%;
 | 
			
		||||
}
 | 
			
		||||
#rui input[readonly] {
 | 
			
		||||
	color: #fff;
 | 
			
		||||
	background: #444;
 | 
			
		||||
	border: 1px solid #777;
 | 
			
		||||
	padding: .2em .25em;
 | 
			
		||||
}
 | 
			
		||||
#rui h1 {
 | 
			
		||||
	margin: 0 0 .3em 0;
 | 
			
		||||
	padding: 0;
 | 
			
		||||
	font-size: 1.5em;
 | 
			
		||||
}
 | 
			
		||||
#pvol,
 | 
			
		||||
#barbuf,
 | 
			
		||||
#barpos,
 | 
			
		||||
 
 | 
			
		||||
@@ -522,15 +522,14 @@ var mp = new MPlayer();
 | 
			
		||||
makeSortable(ebi('files'), mp.read_order.bind(mp));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function get_np() {
 | 
			
		||||
function ft2dict(tr) {
 | 
			
		||||
	var th = ebi('files').tHead.rows[0].cells,
 | 
			
		||||
		tr = QS('#files tr.play').cells,
 | 
			
		||||
		rv = [],
 | 
			
		||||
		ra = [],
 | 
			
		||||
		rt = {};
 | 
			
		||||
 | 
			
		||||
	for (var a = 1, aa = th.length; a < aa; a++) {
 | 
			
		||||
		var tv = tr[a].textContent,
 | 
			
		||||
		var tv = tr.cells[a].textContent,
 | 
			
		||||
			tk = a == 1 ? 'file' : th[a].getAttribute('name').split('/').slice(-1)[0],
 | 
			
		||||
			vis = th[a].className.indexOf('min') === -1;
 | 
			
		||||
 | 
			
		||||
@@ -541,6 +540,12 @@ function get_np() {
 | 
			
		||||
		rt[tk] = tv;
 | 
			
		||||
	}
 | 
			
		||||
	return [rt, rv, ra];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function get_np() {
 | 
			
		||||
	var tr = QS('#files tr.play');
 | 
			
		||||
	return ft2dict(tr);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1499,11 +1504,68 @@ var fileman = (function () {
 | 
			
		||||
			base = vsp[0],
 | 
			
		||||
			ofn = uricom_dec(vsp[1])[0];
 | 
			
		||||
 | 
			
		||||
		var fn = prompt('new filename:', ofn);
 | 
			
		||||
		if (!fn || fn == ofn)
 | 
			
		||||
			return toast.warn(1, 'rename aborted');
 | 
			
		||||
		var rui = ebi('rui');
 | 
			
		||||
		if (!rui) {
 | 
			
		||||
			rui = mknod('div');
 | 
			
		||||
			rui.setAttribute('id', 'rui');
 | 
			
		||||
			document.body.appendChild(rui);
 | 
			
		||||
		}
 | 
			
		||||
		var html = [
 | 
			
		||||
			'<h1>rename file</h1>',
 | 
			
		||||
			'<div><table>',
 | 
			
		||||
			'<tr><td>old:</td><td><input type="text" id="rn_old" readonly /></td></tr>',
 | 
			
		||||
			'<tr><td>new:</td><td><input type="text" id="rn_new" /></td></tr>',
 | 
			
		||||
			'</table></div>',
 | 
			
		||||
			'<div>',
 | 
			
		||||
			'<button id="rn_dec">url-decode</button>',
 | 
			
		||||
			'|',
 | 
			
		||||
			'<button id="rn_reset">↺ reset</button>',
 | 
			
		||||
			'<button id="rn_cancel">❌ cancel</button>',
 | 
			
		||||
			'<button id="rn_apply">✅ apply rename</button>',
 | 
			
		||||
			'</div>',
 | 
			
		||||
			'<div><table>'
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		var dst = base + uricom_enc(fn, false);
 | 
			
		||||
		var vars = ft2dict(ebi(sel[0].id).closest('tr')),
 | 
			
		||||
			keys = vars[1].concat(vars[2]);
 | 
			
		||||
 | 
			
		||||
		vars = vars[0];
 | 
			
		||||
		for (var a = 0; a < keys.length; a++)
 | 
			
		||||
			html.push('<tr><td>' + esc(keys[a]) + '</td><td><input type="text" readonly value="' + esc(vars[keys[a]]) + '" /></td></tr>');
 | 
			
		||||
 | 
			
		||||
		html.push('</table></div>');
 | 
			
		||||
		rui.innerHTML = html.join('\n');
 | 
			
		||||
		var iold = ebi('rn_old'),
 | 
			
		||||
			inew = ebi('rn_new');
 | 
			
		||||
 | 
			
		||||
		function rn_reset() {
 | 
			
		||||
			inew.value = iold.value;
 | 
			
		||||
			inew.focus();
 | 
			
		||||
			inew.setSelectionRange(0, inew.value.lastIndexOf('.'), "forward");
 | 
			
		||||
		}
 | 
			
		||||
		function rn_cancel() {
 | 
			
		||||
			rui.parentNode.removeChild(rui);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		inew.onkeydown = function (e) {
 | 
			
		||||
			if (e.key == 'Escape')
 | 
			
		||||
				return rn_cancel();
 | 
			
		||||
 | 
			
		||||
			if (e.key == 'Enter')
 | 
			
		||||
				return rn_apply();
 | 
			
		||||
		};
 | 
			
		||||
		ebi('rn_cancel').onclick = rn_cancel;
 | 
			
		||||
		ebi('rn_reset').onclick = rn_reset;
 | 
			
		||||
		ebi('rn_apply').onclick = rn_apply;
 | 
			
		||||
		ebi('rn_dec').onclick = function () {
 | 
			
		||||
			inew.value = uricom_dec(inew.value)[0];
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		iold.value = ofn;
 | 
			
		||||
		rn_reset();
 | 
			
		||||
 | 
			
		||||
		function rn_apply() {
 | 
			
		||||
			var dst = base + uricom_enc(inew.value, false);
 | 
			
		||||
 | 
			
		||||
			function rename_cb() {
 | 
			
		||||
				if (this.readyState != XMLHttpRequest.DONE)
 | 
			
		||||
@@ -1516,12 +1578,14 @@ var fileman = (function () {
 | 
			
		||||
				}
 | 
			
		||||
				toast.ok(2, 'rename OK');
 | 
			
		||||
				treectl.goto(get_evpath());
 | 
			
		||||
				rn_cancel();
 | 
			
		||||
			}
 | 
			
		||||
			var xhr = new XMLHttpRequest();
 | 
			
		||||
			xhr.open('GET', src + '?move=' + dst, true);
 | 
			
		||||
			xhr.onreadystatechange = rename_cb;
 | 
			
		||||
			xhr.send();
 | 
			
		||||
		};
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	r.delete = function (e) {
 | 
			
		||||
		ev(e);
 | 
			
		||||
@@ -1627,12 +1691,12 @@ var fileman = (function () {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (exists.length)
 | 
			
		||||
			alert('these ' + exists.length + ' items cannot be pasted here (names already exist):\n\n' + exists.join('\n'));
 | 
			
		||||
			alert('these ' + exists.length + ' items cannot be pasted here (names already exist):\n\n' + uricom_adec(exists).join('\n'));
 | 
			
		||||
 | 
			
		||||
		if (!req.length)
 | 
			
		||||
			return;
 | 
			
		||||
 | 
			
		||||
		if (!confirm('paste these ' + req.length + ' items here?\n\n' + req.join('\n')))
 | 
			
		||||
		if (!confirm('paste these ' + req.length + ' items here?\n\n' + uricom_adec(req).join('\n')))
 | 
			
		||||
			return;
 | 
			
		||||
 | 
			
		||||
		function paster() {
 | 
			
		||||
@@ -1645,7 +1709,7 @@ var fileman = (function () {
 | 
			
		||||
				r.tx(srcdir);
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			toast.inf(0, 'pasting ' + (req.length + 1) + ' items\n\n' + vp);
 | 
			
		||||
			toast.inf(0, 'pasting ' + (req.length + 1) + ' items\n\n' + uricom_dec(vp)[0]);
 | 
			
		||||
 | 
			
		||||
			var dst = get_evpath() + vp.split('/').slice(-1)[0];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -398,6 +398,15 @@ function uricom_dec(txt) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function uricom_adec(arr) {
 | 
			
		||||
    var ret = [];
 | 
			
		||||
    for (var a = 0; a < arr.length; a++)
 | 
			
		||||
        ret.push(uricom_dec(arr[a])[0]);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function get_evpath() {
 | 
			
		||||
    var ret = document.location.pathname;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -79,6 +79,10 @@ command -v gdate && date() { gdate "$@"; }; while true; do t=$(date +%s.%N); (ti
 | 
			
		||||
# get all up2k search result URLs
 | 
			
		||||
var t=[]; var b=document.location.href.split('#')[0].slice(0, -1); document.querySelectorAll('#u2tab .prog a').forEach((x) => {t.push(b+encodeURI(x.getAttribute("href")))}); console.log(t.join("\n"));
 | 
			
		||||
 | 
			
		||||
# rename all selected songs to <leading-track-number> + <Title> + <extension>
 | 
			
		||||
var sel=msel.getsel(), ci=find_file_col('Title')[0], re=[]; for (var a=0; a<sel.length; a++) { var url=sel[a].vp, tag=ebi(sel[a].id).closest('tr').querySelectorAll('td')[ci].textContent, name=uricom_dec(vsplit(url)[1])[0], m=/^([0-9]+[\. -]+)?.*(\.[^\.]+$)/.exec(name), name2=(m[1]||'')+tag+m[2], url2=vsplit(url)[0]+uricom_enc(name2,false); if (url!=url2) re.push([url, url2]); }
 | 
			
		||||
console.log(JSON.stringify(re, null, '  '));
 | 
			
		||||
function f() { if (!re.length) return treectl.goto(get_evpath()); var [u1,u2] = re.shift(); fetch(u1+'?move='+u2).then((rsp) => {if (rsp.ok) f(); }); }; f();
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
## bash oneliners
 | 
			
		||||
 
 | 
			
		||||
@@ -268,7 +268,7 @@ zdir="$tmpdir/cpp-mksfx"
 | 
			
		||||
mkdir -p "$zdir"
 | 
			
		||||
echo a > "$zdir/$stamp"
 | 
			
		||||
nf=$(ls -1 "$zdir"/arc.* | wc -l)
 | 
			
		||||
[ $nf -ge 10 ] && [ ! $repack ] && use_zdir=1 || use_zdir=
 | 
			
		||||
[ $nf -ge 2 ] && [ ! $repack ] && use_zdir=1 || use_zdir=
 | 
			
		||||
 | 
			
		||||
[ $use_zdir ] || {
 | 
			
		||||
	echo "$nf alts += 1"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user