mirror of
https://github.com/9001/copyparty.git
synced 2025-08-17 17:12:13 -06:00
batch-rename: add functions and presets
This commit is contained in:
parent
1d61bcc4f3
commit
65e14cf348
|
@ -387,9 +387,13 @@ in advanced mode,
|
||||||
* `[case]` toggles case-sensitive regex
|
* `[case]` toggles case-sensitive regex
|
||||||
* `regex` is the regex pattern to apply to the original filename; any files which don't match will be skipped
|
* `regex` is the regex pattern to apply to the original filename; any files which don't match will be skipped
|
||||||
* `format` is the new filename, taking values from regex capturing groups and/or from file tags
|
* `format` is the new filename, taking values from regex capturing groups and/or from file tags
|
||||||
* very loosely based on foobar2000 syntax, no functions yet tho
|
* very loosely based on foobar2000 syntax
|
||||||
* `presets` lets you save rename rules for later
|
* `presets` lets you save rename rules for later
|
||||||
|
|
||||||
|
available functions:
|
||||||
|
* `$lpad(text, length, pad_char)`
|
||||||
|
* `$rpad(text, length, pad_char)`
|
||||||
|
|
||||||
so,
|
so,
|
||||||
|
|
||||||
say you have a file named [`meganeko - Eclipse - 07 Sirius A.mp3`](https://www.youtube.com/watch?v=-dtb0vDPruI) (absolutely fantastic album btw) and the tags are: `Album:Eclipse`, `Artist:meganeko`, `Title:Sirius A`, `tn:7`
|
say you have a file named [`meganeko - Eclipse - 07 Sirius A.mp3`](https://www.youtube.com/watch?v=-dtb0vDPruI) (absolutely fantastic album btw) and the tags are: `Album:Eclipse`, `Artist:meganeko`, `Title:Sirius A`, `tn:7`
|
||||||
|
@ -408,6 +412,8 @@ or a mix of both since it doesn't have functions yet (for example to add leading
|
||||||
* `format` = `(1). (artist) - (title).(ext)`
|
* `format` = `(1). (artist) - (title).(ext)`
|
||||||
* `output` = `07. meganeko - Sirius A.mp3`
|
* `output` = `07. meganeko - Sirius A.mp3`
|
||||||
|
|
||||||
|
the metadata keys you can use in the format field are the ones in the file-browser table header (whatever is collected with `-mte` and `-mtp`)
|
||||||
|
|
||||||
|
|
||||||
## markdown viewer
|
## markdown viewer
|
||||||
|
|
||||||
|
|
|
@ -807,6 +807,7 @@ input.eq_gain {
|
||||||
#wrap {
|
#wrap {
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
min-height: 90vh;
|
min-height: 90vh;
|
||||||
|
padding-bottom: 5em;
|
||||||
}
|
}
|
||||||
#tree {
|
#tree {
|
||||||
display: none;
|
display: none;
|
||||||
|
|
|
@ -1463,17 +1463,18 @@ function play_linked() {
|
||||||
|
|
||||||
function fmt_ren(re, md, fmt) {
|
function fmt_ren(re, md, fmt) {
|
||||||
var ptr = 0;
|
var ptr = 0;
|
||||||
function dive() {
|
function dive(stop_ch) {
|
||||||
var ret = '', ng = 0;
|
var ret = '', ng = 0;
|
||||||
while (ptr < fmt.length) {
|
while (ptr < fmt.length) {
|
||||||
var ch = fmt[ptr++];
|
var dbg = fmt.slice(ptr),
|
||||||
|
ch = fmt[ptr++];
|
||||||
|
|
||||||
if (ch == '\\') {
|
if (ch == '\\') {
|
||||||
ret += fmt[ptr++];
|
ret += fmt[ptr++];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ch == ')' || ch == ']')
|
if (ch == ')' || ch == ']' || ch == stop_ch)
|
||||||
return [ng, ret];
|
return [ng, ret];
|
||||||
|
|
||||||
if (ch == '[') {
|
if (ch == '[') {
|
||||||
|
@ -1484,7 +1485,7 @@ function fmt_ren(re, md, fmt) {
|
||||||
else if (ch == '(') {
|
else if (ch == '(') {
|
||||||
var end = fmt.indexOf(')', ptr);
|
var end = fmt.indexOf(')', ptr);
|
||||||
if (end < 0)
|
if (end < 0)
|
||||||
throw 'the $( was never closed: ' + fmt.slice(0, ptr);
|
throw 'the ( was never closed: ' + fmt.slice(0, ptr);
|
||||||
|
|
||||||
var arg = fmt.slice(ptr, end), v = null;
|
var arg = fmt.slice(ptr, end), v = null;
|
||||||
ptr = end + 1;
|
ptr = end + 1;
|
||||||
|
@ -1511,7 +1512,33 @@ function fmt_ren(re, md, fmt) {
|
||||||
throw 'no function name after the $ here: ' + fmt.slice(0, ptr);
|
throw 'no function name after the $ here: ' + fmt.slice(0, ptr);
|
||||||
|
|
||||||
var fun = fmt.slice(ptr - 1, end);
|
var fun = fmt.slice(ptr - 1, end);
|
||||||
throw 'function not implemented: "' + fun + '"';
|
ptr = end + 1;
|
||||||
|
|
||||||
|
if (fun == "lpad") {
|
||||||
|
var str = dive(',')[1];
|
||||||
|
var len = dive(',')[1];
|
||||||
|
var chr = dive()[1];
|
||||||
|
if (!len || !chr)
|
||||||
|
throw 'invalid arguments to ' + fun;
|
||||||
|
|
||||||
|
while (str.length < len)
|
||||||
|
str = chr + str;
|
||||||
|
|
||||||
|
ret += str;
|
||||||
|
}
|
||||||
|
else if (fun == "rpad") {
|
||||||
|
var str = dive(',')[1];
|
||||||
|
var len = dive(',')[1];
|
||||||
|
var chr = dive()[1];
|
||||||
|
if (!len || !chr)
|
||||||
|
throw 'invalid arguments to ' + fun;
|
||||||
|
|
||||||
|
while (str.length < len)
|
||||||
|
str += chr;
|
||||||
|
|
||||||
|
ret += str;
|
||||||
|
}
|
||||||
|
else throw 'function not implemented: "' + fun + '"';
|
||||||
}
|
}
|
||||||
else ret += ch;
|
else ret += ch;
|
||||||
}
|
}
|
||||||
|
@ -1717,7 +1744,44 @@ var fileman = (function () {
|
||||||
ifmt = ebi('rn_fmt'),
|
ifmt = ebi('rn_fmt'),
|
||||||
ipre = ebi('rn_pre'),
|
ipre = ebi('rn_pre'),
|
||||||
idel = ebi('rn_pdel'),
|
idel = ebi('rn_pdel'),
|
||||||
inew = ebi('rn_pnew');
|
inew = ebi('rn_pnew'),
|
||||||
|
presets = jread("rn_pre", {});
|
||||||
|
|
||||||
|
function spresets() {
|
||||||
|
var keys = Object.keys(presets), o;
|
||||||
|
keys.sort();
|
||||||
|
ipre.innerHTML = '<option value=""></option>';
|
||||||
|
for (var a = 0; a < keys.length; a++) {
|
||||||
|
o = mknod('option');
|
||||||
|
o.setAttribute('value', keys[a]);
|
||||||
|
o.textContent = keys[a];
|
||||||
|
ipre.appendChild(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inew.onclick = function () {
|
||||||
|
var name = prompt('provide a name for your new preset', ifmt.value);
|
||||||
|
if (!name)
|
||||||
|
return toast.warn(3, 'aborted');
|
||||||
|
|
||||||
|
presets[name] = [ire.value, ifmt.value];
|
||||||
|
jwrite('rn_pre', presets);
|
||||||
|
spresets();
|
||||||
|
ipre.value = name;
|
||||||
|
};
|
||||||
|
idel.onclick = function () {
|
||||||
|
delete presets[ipre.value];
|
||||||
|
jwrite('rn_pre', presets);
|
||||||
|
spresets();
|
||||||
|
};
|
||||||
|
ipre.oninput = function () {
|
||||||
|
var cfg = presets[ipre.value];
|
||||||
|
if (cfg) {
|
||||||
|
ire.value = cfg[0];
|
||||||
|
ifmt.value = cfg[1];
|
||||||
|
}
|
||||||
|
ifmt.oninput();
|
||||||
|
};
|
||||||
|
spresets();
|
||||||
|
|
||||||
ire.oninput = ifmt.oninput = function (e) {
|
ire.oninput = ifmt.oninput = function (e) {
|
||||||
var ptn = ire.value,
|
var ptn = ire.value,
|
||||||
|
@ -1755,7 +1819,7 @@ var fileman = (function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
function rn_apply() {
|
function rn_apply() {
|
||||||
while (f.length && !f[0].ok)
|
while (f.length && (!f[0].ok || f[0].ofn == f[0].inew.value))
|
||||||
f.shift();
|
f.shift();
|
||||||
|
|
||||||
if (!f.length) {
|
if (!f.length) {
|
||||||
|
@ -1779,8 +1843,6 @@ var fileman = (function () {
|
||||||
|
|
||||||
f.shift().inew.value = '( OK )';
|
f.shift().inew.value = '( OK )';
|
||||||
return rn_apply();
|
return rn_apply();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
var xhr = new XMLHttpRequest();
|
||||||
|
|
Loading…
Reference in a new issue