mojibake support for the spa stuff

This commit is contained in:
ed 2021-03-06 22:48:49 +01:00
parent 57d994422d
commit b9a4e47ea2
10 changed files with 104 additions and 53 deletions

View file

@ -6,7 +6,7 @@ import re
import threading
from .__init__ import PY2, WINDOWS
from .util import undot, Pebkac, fsdec, fsenc, statdir, uprint
from .util import undot, Pebkac, fsdec, fsenc, statdir, nuprint
class VFS(object):
@ -106,7 +106,7 @@ class VFS(object):
"""return user-readable [fsdir,real,virt] items at vpath"""
virt_vis = {} # nodes readable by user
abspath = self.canonical(rem)
real = list(statdir(uprint, scandir, lstat, abspath))
real = list(statdir(nuprint, scandir, lstat, abspath))
real.sort()
if not rem:
for name, vn2 in sorted(self.nodes.items()):

View file

@ -1136,7 +1136,7 @@ class HttpCli(object):
vfs_ls = exclude_dotfiles(vfs_ls)
for fn in [x for x in vfs_ls if x != excl]:
dirs.append(fn)
dirs.append(quotep(fn))
for x in vfs_virt.keys():
if x != excl:
@ -1275,7 +1275,12 @@ class HttpCli(object):
del f["rd"]
if icur:
q = "select w from up where rd = ? and fn = ?"
r = icur.execute(q, (rd, fn)).fetchone()
try:
r = icur.execute(q, (rd, fn)).fetchone()
except:
args = s3enc(idx.mem_cur, rd, fn)
r = icur.execute(q, args).fetchone()
if not r:
continue

View file

@ -25,6 +25,8 @@ class U2idx(object):
return
self.cur = {}
self.mem_cur = sqlite3.connect(":memory:")
self.mem_cur.execute(r"create table a (b text)")
def log(self, msg, c=0):
self.log_func("u2idx", msg, c)
@ -112,6 +114,9 @@ class U2idx(object):
if lim <= 0:
break
if rd.startswith("//") or fn.startswith("//"):
rd, fn = s3dec(rd, fn)
rp = os.path.join(vtop, rd, fn).replace("\\", "/")
sret.append({"ts": int(ts), "sz": sz, "rp": rp, "w": w[:16]})

View file

@ -25,8 +25,8 @@ from .util import (
sanitize_fn,
ren_open,
atomic_move,
w8b64enc,
w8b64dec,
s3enc,
s3dec,
statdir,
)
from .mtag import MTag
@ -110,29 +110,6 @@ class Up2k(object):
def log(self, msg, c=0):
self.log_func("up2k", msg + "\033[K", c)
def w8enc(self, rd, fn):
ret = []
for v in [rd, fn]:
try:
self.mem_cur.execute("select * from a where b = ?", (v,))
ret.append(v)
except:
ret.append("//" + w8b64enc(v))
# self.log("mojien/{} [{}] {}".format(k, v, ret[-1][2:]))
return tuple(ret)
def w8dec(self, rd, fn):
ret = []
for k, v in [["d", rd], ["f", fn]]:
if v.startswith("//"):
ret.append(w8b64dec(v[2:]))
# self.log("mojide/{} [{}] {}".format(k, ret[-1], v[2:]))
else:
ret.append(v)
return tuple(ret)
def _vis_job_progress(self, job):
perc = 100 - (len(job["need"]) * 100.0 / len(job["hash"]))
path = os.path.join(job["ptop"], job["prel"], job["name"])
@ -340,7 +317,7 @@ class Up2k(object):
try:
c = dbw[0].execute(sql, (rd, fn))
except:
c = dbw[0].execute(sql, self.w8enc(rd, fn))
c = dbw[0].execute(sql, s3enc(self.mem_cur, rd, fn))
in_db = list(c.fetchall())
if in_db:
@ -394,7 +371,7 @@ class Up2k(object):
for dwark, dts, dsz, drd, dfn in c:
nchecked += 1
if drd.startswith("//") or dfn.startswith("//"):
drd, dfn = self.w8dec(drd, dfn)
drd, dfn = s3dec(drd, dfn)
abspath = os.path.join(top, drd, dfn)
# almost zero overhead dw
@ -480,6 +457,9 @@ class Up2k(object):
if c2.execute(q, (w[:16],)).fetchone():
continue
if rd.startswith("//") or fn.startswith("//"):
rd, fn = s3dec(rd, fn)
abspath = os.path.join(ptop, rd, fn)
self.pp.msg = "c{} {}".format(n_left, abspath)
args = c3, entags, w, abspath
@ -704,7 +684,7 @@ class Up2k(object):
cur = cur.execute(q, argv)
for _, dtime, dsize, dp_dir, dp_fn in cur:
if dp_dir.startswith("//") or dp_fn.startswith("//"):
dp_dir, dp_fn = self.w8dec(dp_dir, dp_fn)
dp_dir, dp_fn = s3dec(self.mem_cur, dp_dir, dp_fn)
dp_abs = os.path.join(cj["ptop"], dp_dir, dp_fn).replace("\\", "/")
# relying on path.exists to return false on broken symlinks
@ -920,7 +900,7 @@ class Up2k(object):
try:
db.execute(sql, (rd, fn))
except:
db.execute(sql, self.w8enc(rd, fn))
db.execute(sql, s3enc(self.mem_cur, rd, fn))
def db_add(self, db, wark, rd, fn, ts, sz):
sql = "insert into up values (?,?,?,?,?)"
@ -928,7 +908,7 @@ class Up2k(object):
try:
db.execute(sql, v)
except:
rd, fn = self.w8enc(rd, fn)
rd, fn = s3enc(self.mem_cur, rd, fn)
v = (wark, ts, sz, rd, fn)
db.execute(sql, v)

View file

@ -135,6 +135,10 @@ def uprint(msg):
print(msg.encode("ascii", "replace").decode(), end="")
def nuprint(msg):
uprint("{}\n".format(msg))
@contextlib.contextmanager
def ren_open(fname, *args, **kwargs):
fdir = kwargs.pop("fdir", None)
@ -600,6 +604,31 @@ else:
fsdec = w8dec
def s3enc(mem_cur, rd, fn):
ret = []
for v in [rd, fn]:
try:
mem_cur.execute("select * from a where b = ?", (v,))
ret.append(v)
except:
ret.append("//" + w8b64enc(v))
# self.log("mojien/{} [{}] {}".format(k, v, ret[-1][2:]))
return tuple(ret)
def s3dec(rd, fn):
ret = []
for k, v in [["d", rd], ["f", fn]]:
if v.startswith("//"):
ret.append(w8b64dec(v[2:]))
# self.log("mojide/{} [{}] {}".format(k, ret[-1], v[2:]))
else:
ret.append(v)
return tuple(ret)
def atomic_move(src, dst):
if not PY2:
os.replace(src, dst)

View file

@ -467,7 +467,7 @@ function play(tid, call_depth) {
var o = ebi(oid);
o.setAttribute('id', 'thx_js');
if (window.history && history.replaceState) {
hist_replace((document.location + '').split('#')[0] + '#' + oid);
hist_replace(document.location.pathname + '#' + oid);
}
else {
document.location.hash = oid;
@ -510,7 +510,7 @@ function evau_error(e) {
if (eplaya.error.message)
err += '\n\n' + eplaya.error.message;
err += '\n\nFile: «' + decodeURIComponent(eplaya.src.split('/').slice(-1)[0]) + '»';
err += '\n\nFile: «' + uricom_dec(eplaya.src.split('/').slice(-1)[0]) + '»';
alert(err);
}
@ -545,7 +545,7 @@ function autoplay_blocked() {
var na = ebi('blk_na');
var fn = mp.tracks[mp.au.tid].split(/\//).pop();
fn = decodeURIComponent(fn.replace(/\+/g, ' '));
fn = uricom_dec(fn.replace(/\+/g, ' '));
go.textContent = 'Play "' + fn + '"';
go.onclick = function (e) {
@ -744,7 +744,7 @@ function autoplay_blocked() {
treefiles.appendChild(ebi('epi'));
swrite('entreed', 'tree');
get_tree("", get_vpath(), true);
get_tree("", get_evpath(), true);
}
function get_tree(top, dst, rst) {
@ -776,7 +776,7 @@ function autoplay_blocked() {
ebi('treeul').setAttribute('ts', this.ts);
var top = this.top == '.' ? this.dst : this.top,
name = top.split('/').slice(-2)[0],
name = uricom_dec(top.split('/').slice(-2)[0]),
rtop = top.replace(/^\/+/, "");
try {
@ -827,7 +827,7 @@ function autoplay_blocked() {
}
function reload_tree() {
var cdir = get_vpath();
var cdir = get_evpath();
var links = document.querySelectorAll('#treeul a+a');
for (var a = 0, aa = links.length; a < aa; a++) {
var href = links[a].getAttribute('href');
@ -912,7 +912,7 @@ function autoplay_blocked() {
for (var a = 0; a < nodes.length; a++) {
var r = nodes[a],
ln = ['<tr><td>' + r.lead + '</td><td><a href="' +
top + r.href + '">' + esc(decodeURIComponent(r.href)) + '</a>', r.sz];
top + r.href + '">' + esc(uricom_dec(r.href)) + '</a>', r.sz];
for (var b = 0; b < res.taglist.length; b++) {
var k = res.taglist[b],
@ -960,12 +960,14 @@ function autoplay_blocked() {
keys.sort();
for (var a = 0; a < keys.length; a++) {
var kk = keys[a],
k = kk.slice(1),
url = '/' + (top ? top + k : k) + '/',
ek = esc(k),
ks = kk.slice(1),
k = uricom_dec(ks),
hek = esc(k),
uek = ks == k ? k : uricom_enc(k, true),
url = '/' + (top ? top + uek : uek) + '/',
sym = res[kk] ? '-' : '+',
link = '<a href="#">' + sym + '</a><a href="' +
esc(url) + '">' + ek + '</a>';
url + '">' + hek + '</a>';
if (res[kk]) {
var subtree = parsetree(res[kk], url.slice(1));
@ -1019,12 +1021,17 @@ function autoplay_blocked() {
window.onpopstate = function (e) {
console.log("h-pop " + e.state);
get_tree("", e.state, true);
reqls(e.state);
if (!e.state)
return;
var url = new URL(e.state, "https://" + document.location.host);
url = url.pathname;
get_tree("", url, true);
reqls(url);
};
if (window.history && history.pushState) {
hist_replace(get_vpath() + window.location.hash);
hist_replace(get_evpath() + window.location.hash);
}
})();
@ -1196,7 +1203,7 @@ function reload_browser(not_mp) {
filecols.set_style();
makeSortable(ebi('files'));
var parts = get_vpath().split('/');
var parts = get_evpath().split('/');
var rm = document.querySelectorAll('#path>a+a+a');
for (a = rm.length - 1; a >= 0; a--)
rm[a].parentNode.removeChild(rm[a]);

View file

@ -65,7 +65,7 @@ function statify(obj) {
if (a > 0)
loc.push(n[a]);
var dec = hesc(decodeURIComponent(n[a]));
var dec = hesc(uricom_dec(n[a]));
nav.push('<a href="/' + loc.join('/') + '">' + dec + '</a>');
}

View file

@ -15,7 +15,7 @@ var dom_md = ebi('mt');
if (a > 0)
loc.push(n[a]);
var dec = decodeURIComponent(n[a]).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
var dec = uricom_dec(n[a]).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
nav.push('<a href="/' + loc.join('/') + '">' + dec + '</a>');
}

View file

@ -332,7 +332,7 @@ function up2k_init(have_crypto) {
"name": fobj.name,
"size": fobj.size,
"lmod": lmod / 1000,
"purl": get_vpath(),
"purl": get_evpath(),
"done": false,
"hash": []
};

View file

@ -220,6 +220,31 @@ function linksplit(rp) {
}
function uricom_enc(txt, do_fb_enc) {
try {
return encodeURIComponent(txt);
}
catch (ex) {
console.log("uce-err [" + txt + "]");
if (do_fb_enc)
return esc(txt);
return txt;
}
}
function uricom_dec(txt) {
try {
return decodeURIComponent(txt);
}
catch (ex) {
console.log("ucd-err [" + txt + "]");
return txt;
}
}
function get_evpath() {
var ret = document.location.pathname;
@ -234,7 +259,7 @@ function get_evpath() {
function get_vpath() {
return decodeURIComponent(get_evpath());
return uricom_dec(get_evpath());
}