Compare commits

..

7 Commits

Author SHA1 Message Date
ed
02c7061945 v0.12.8 2021-08-01 00:17:05 +02:00
ed
9209e44cd3 heh 2021-08-01 00:08:50 +02:00
ed
ebed37394e better rename ui 2021-08-01 00:04:53 +02:00
ed
4c7a2a7ec3 uridec alerts 2021-07-31 22:05:31 +02:00
ed
0a25a88a34 add mojibake fixer 2021-07-31 14:31:39 +02:00
ed
6aa9025347 v0.12.7 2021-07-31 13:21:43 +02:00
ed
a918cc67eb only drop tags when its safe 2021-07-31 13:19:02 +02:00
7 changed files with 157 additions and 39 deletions

View File

@@ -1,8 +1,8 @@
# coding: utf-8 # coding: utf-8
VERSION = (0, 12, 6) VERSION = (0, 12, 8)
CODENAME = "fil\033[33med" CODENAME = "fil\033[33med"
BUILD_DT = (2021, 7, 31) BUILD_DT = (2021, 8, 1)
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

@@ -1405,7 +1405,7 @@ class Up2k(object):
try: try:
ptop = dbv.realpath ptop = dbv.realpath
cur, wark, _, _, _, _ = self._find_from_vpath(ptop, volpath) cur, wark, _, _, _, _ = self._find_from_vpath(ptop, volpath)
self._forget_file(ptop, volpath, cur, wark) self._forget_file(ptop, volpath, cur, wark, True)
finally: finally:
cur.connection.commit() cur.connection.commit()
@@ -1491,10 +1491,10 @@ class Up2k(object):
fsize = st.st_size fsize = st.st_size
if w: if w:
if c2: if c2 and c2 != c1:
self._copy_tags(c1, c2, w) 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) self._relink(w, svn.realpath, srem, dabs)
c1.connection.commit() c1.connection.commit()
@@ -1535,14 +1535,16 @@ class Up2k(object):
return cur, wark, ftime, fsize, ip, at return cur, wark, ftime, fsize, ip, at
return cur, None, None, None, None, None 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""" """forgets file in db, fixes symlinks, does not delete"""
srd, sfn = vsplit(vrem) srd, sfn = vsplit(vrem)
self.log("forgetting {}".format(vrem)) self.log("forgetting {}".format(vrem))
if wark: if wark:
self.log("found {} in db".format(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=?" q = "delete from mt where w=?"
cur.execute(q, (wark[:16],)) cur.execute(q, (wark[:16],))
self.db_rm(cur, srd, sfn) self.db_rm(cur, srd, sfn)
@@ -1581,7 +1583,7 @@ class Up2k(object):
self.log("found {} dupe: [{}] {}".format(wark, ptop, dvrem)) self.log("found {} dupe: [{}] {}".format(wark, ptop, dvrem))
if not dupes: if not dupes:
return return 0
full = {} full = {}
links = {} links = {}
@@ -1618,6 +1620,8 @@ class Up2k(object):
self._symlink(dabs, alink, False) self._symlink(dabs, alink, False)
return len(full) + len(links)
def _get_wark(self, cj): def _get_wark(self, cj):
if len(cj["name"]) > 1024 or len(cj["hash"]) > 512 * 1024: # 16TiB if len(cj["name"]) > 1024 or len(cj["hash"]) > 512 * 1024: # 16TiB
raise Pebkac(400, "name or numchunks not according to spec") raise Pebkac(400, "name or numchunks not according to spec")

View File

@@ -1068,6 +1068,43 @@ html.light #ggrid a:hover {
margin: 0; margin: 0;
padding: 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, #pvol,
#barbuf, #barbuf,
#barpos, #barpos,

View File

@@ -522,15 +522,14 @@ var mp = new MPlayer();
makeSortable(ebi('files'), mp.read_order.bind(mp)); makeSortable(ebi('files'), mp.read_order.bind(mp));
function get_np() { function ft2dict(tr) {
var th = ebi('files').tHead.rows[0].cells, var th = ebi('files').tHead.rows[0].cells,
tr = QS('#files tr.play').cells,
rv = [], rv = [],
ra = [], ra = [],
rt = {}; rt = {};
for (var a = 1, aa = th.length; a < aa; a++) { 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], tk = a == 1 ? 'file' : th[a].getAttribute('name').split('/').slice(-1)[0],
vis = th[a].className.indexOf('min') === -1; vis = th[a].className.indexOf('min') === -1;
@@ -541,6 +540,12 @@ function get_np() {
rt[tk] = tv; rt[tk] = tv;
} }
return [rt, rv, ra]; 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], base = vsp[0],
ofn = uricom_dec(vsp[1])[0]; ofn = uricom_dec(vsp[1])[0];
var fn = prompt('new filename:', ofn); var rui = ebi('rui');
if (!fn || fn == ofn) if (!rui) {
return toast.warn(1, 'rename aborted'); 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() { function rename_cb() {
if (this.readyState != XMLHttpRequest.DONE) if (this.readyState != XMLHttpRequest.DONE)
@@ -1516,12 +1578,14 @@ var fileman = (function () {
} }
toast.ok(2, 'rename OK'); toast.ok(2, 'rename OK');
treectl.goto(get_evpath()); treectl.goto(get_evpath());
rn_cancel();
} }
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
xhr.open('GET', src + '?move=' + dst, true); xhr.open('GET', src + '?move=' + dst, true);
xhr.onreadystatechange = rename_cb; xhr.onreadystatechange = rename_cb;
xhr.send(); xhr.send();
}; };
};
r.delete = function (e) { r.delete = function (e) {
ev(e); ev(e);
@@ -1627,12 +1691,12 @@ var fileman = (function () {
} }
if (exists.length) 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) if (!req.length)
return; 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; return;
function paster() { function paster() {
@@ -1645,7 +1709,7 @@ var fileman = (function () {
r.tx(srcdir); r.tx(srcdir);
return; 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]; var dst = get_evpath() + vp.split('/').slice(-1)[0];

View File

@@ -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() { function get_evpath() {
var ret = document.location.pathname; var ret = document.location.pathname;

View File

@@ -79,6 +79,10 @@ command -v gdate && date() { gdate "$@"; }; while true; do t=$(date +%s.%N); (ti
# get all up2k search result URLs # 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")); 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 ## bash oneliners

View File

@@ -268,7 +268,7 @@ zdir="$tmpdir/cpp-mksfx"
mkdir -p "$zdir" mkdir -p "$zdir"
echo a > "$zdir/$stamp" echo a > "$zdir/$stamp"
nf=$(ls -1 "$zdir"/arc.* | wc -l) 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 ] || { [ $use_zdir ] || {
echo "$nf alts += 1" echo "$nf alts += 1"