cloudcmd
Version:
File manager for the web with console and editor
169 lines (131 loc) • 4.24 kB
JavaScript
const RENAME_FILE = 'Rename file';
const CDN = 'https://cdn.jsdelivr.net';
const CDN_GH = `${CDN}/gh/cloudcmd/user-menu@1.2.4`;
export default {
'__settings': {
select: [RENAME_FILE],
run: false,
},
[`F2 - ${RENAME_FILE}`]: async ({DOM}) => {
await DOM.renameCurrent();
},
'F6 - Copy URL to current file': runFromCDN('copy-url-to-current-file'),
'R - cd /': async ({CloudCmd}) => {
await CloudCmd.changeDir('/');
},
'Y - Convert YouTube to MP3': async ({CloudCmd, DOM}) => {
const {convertYouTubeToMp3} = await import(`${CDN}/menu/convert-youtube-to-mp3.js`);
await convertYouTubeToMp3({
CloudCmd,
DOM,
});
},
'F - Convert flac to mp3 [ffmpeg]': async ({CloudCmd, DOM}) => {
const {convertFlacToMp3} = await import(`${CDN}/menu/ffmpeg.js`);
await convertFlacToMp3({
CloudCmd,
DOM,
});
},
'M - Convert mp4 to mp3 [ffmpeg]': async ({CloudCmd, DOM}) => {
const {convertMp4ToMp3} = await import(`${CDN}/menu/ffmpeg.js`);
await convertMp4ToMp3({
CloudCmd,
DOM,
});
},
'O - Convert mov to mp3 [ffmpeg]': async ({CloudCmd, DOM}) => {
const {convertMovToMp3} = await import(`${CDN}/menu/ffmpeg.js`);
await convertMovToMp3({
CloudCmd,
DOM,
});
},
'C - Create User Menu File': async ({DOM, CloudCmd}) => {
const {Dialog, CurrentInfo} = DOM;
const currentFile = DOM.getCurrentByName('.cloudcmd.menu.js');
if (currentFile) {
const [cancel] = await Dialog.confirm(`Looks like file '.cloudcmd.menu.js' already exists. Overwrite?`);
if (cancel)
return;
}
const {dirPath} = CurrentInfo;
const path = `${dirPath}.cloudcmd.menu.js`;
const {prefix} = CloudCmd;
const data = await readDefaultMenu({
prefix,
});
await createDefaultMenu({
path,
data,
DOM,
CloudCmd,
});
},
'D - Compare directories': ({DOM}) => {
const {
CurrentInfo,
getFilenames,
getCurrentByName,
selectFile,
} = DOM;
const {
files,
filesPassive,
panel,
panelPassive,
} = CurrentInfo;
const names = getFilenames(files);
const namesPassive = getFilenames(filesPassive);
const selectedNames = compare(names, namesPassive);
const selectedNamesPassive = compare(namesPassive, names);
selectNames(selectedNames, panel, {
selectFile,
getCurrentByName,
});
selectNames(selectedNamesPassive, panelPassive, {
selectFile,
getCurrentByName,
});
},
};
async function createDefaultMenu({path, data, DOM, CloudCmd}) {
const {IO} = DOM;
await IO.write(path, data);
await CloudCmd.refresh();
DOM.setCurrentByName('.cloudcmd.menu.js');
await CloudCmd.EditFile.show();
}
async function readDefaultMenu({prefix}) {
const res = await fetch(`${prefix}/api/v1/user-menu/default`);
return await res.text();
}
export const _selectNames = selectNames;
function selectNames(names, panel, {selectFile, getCurrentByName}) {
for (const name of names) {
const file = getCurrentByName(name, panel);
selectFile(file);
}
}
export const _compare = compare;
function compare(a, b) {
const result = [];
for (const el of a) {
if (b.includes(el))
continue;
result.push(el);
}
return result;
}
const MAP = {
'copy-url-to-current-file': 'copyURLToCurrentFile',
};
function runFromCDN(name) {
return async (...a) => {
const fnName = MAP[name];
const {
[fnName]: fn,
} = await import(`${CDN_GH}/menu/${name}.js`);
await fn(...a);
};
}