Compare commits
3 Commits
159329f7e0
...
7cbab0f4b7
Author | SHA1 | Date |
---|---|---|
Bauke | 7cbab0f4b7 | |
Bauke | 89a1257e60 | |
Bauke | df820240a2 |
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
## Scripts
|
## Scripts
|
||||||
|
|
||||||
- [`bulk`]: bulk doer of things.
|
|
||||||
- [`codium-extensions`]: save and install VS Codium extensions using their identifier.
|
- [`codium-extensions`]: save and install VS Codium extensions using their identifier.
|
||||||
- [`copy-nixos-config`]: copies NixOS configuration from `$BAUKE_DIR/nix/<hostname>/` to `/etc/nixos/`.
|
- [`copy-nixos-config`]: copies NixOS configuration from `$BAUKE_DIR/nix/<hostname>/` to `/etc/nixos/`.
|
||||||
- [`desktop-wallpaper`]: desktop wallpaper changer.
|
- [`desktop-wallpaper`]: desktop wallpaper changer.
|
||||||
|
@ -12,7 +11,6 @@
|
||||||
- [`simple-git-push`]: `git push` with extra semantics.
|
- [`simple-git-push`]: `git push` with extra semantics.
|
||||||
- [`tauon-controls`]: remote control CLI for Tauon Music Box.
|
- [`tauon-controls`]: remote control CLI for Tauon Music Box.
|
||||||
|
|
||||||
[`bulk`]: ./scripts/bulk/bulk.ts
|
|
||||||
[`codium-extensions`]: ./scripts/codium-extensions.ts
|
[`codium-extensions`]: ./scripts/codium-extensions.ts
|
||||||
[`copy-nixos-config`]: ./scripts/copy-nixos-config.ts
|
[`copy-nixos-config`]: ./scripts/copy-nixos-config.ts
|
||||||
[`desktop-wallpaper`]: ./scripts/desktop-wallpaper.ts
|
[`desktop-wallpaper`]: ./scripts/desktop-wallpaper.ts
|
||||||
|
@ -45,8 +43,6 @@ const { options } = await new Command()
|
||||||
console.log(options.file);
|
console.log(options.file);
|
||||||
```
|
```
|
||||||
|
|
||||||
* An example of subcommands can be seen in [`bulk`], each command is created like above but added to the main CLI via `.command("name", Command)`.
|
|
||||||
|
|
||||||
[Cliffy]: https://cliffy.io
|
[Cliffy]: https://cliffy.io
|
||||||
|
|
||||||
## Why `bin/` + `scripts/`
|
## Why `bin/` + `scripts/`
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
#!/usr/bin/env zsh
|
|
||||||
|
|
||||||
deno run \
|
|
||||||
--allow-read \
|
|
||||||
--allow-run \
|
|
||||||
"$BAUKE_DIR/scripts/bulk/bulk.ts" \
|
|
||||||
"$@"
|
|
|
@ -1,16 +0,0 @@
|
||||||
import { Command } from "../dependencies.ts";
|
|
||||||
import { moveCommand } from "./move.ts";
|
|
||||||
import { runCommand } from "./run.ts";
|
|
||||||
|
|
||||||
async function main(): Promise<void> {
|
|
||||||
await new Command()
|
|
||||||
.name("bulk")
|
|
||||||
.description("Bulk doer of things.")
|
|
||||||
.command("move", moveCommand)
|
|
||||||
.command("run", runCommand)
|
|
||||||
.parse(Deno.args);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (import.meta.main) {
|
|
||||||
void main();
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
import { Command, prompt } from "../dependencies.ts";
|
|
||||||
|
|
||||||
export const moveCommand = new Command()
|
|
||||||
.name("move")
|
|
||||||
.description("Interactively move a group of files.")
|
|
||||||
.option(
|
|
||||||
"-d, --directory <directory:string>",
|
|
||||||
"Directories to include files from.",
|
|
||||||
{
|
|
||||||
collect: true,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.action(async ({
|
|
||||||
directory,
|
|
||||||
}) => {
|
|
||||||
await actionHandler({ directories: directory ?? [] });
|
|
||||||
});
|
|
||||||
|
|
||||||
async function actionHandler(
|
|
||||||
options: {
|
|
||||||
directories: string[];
|
|
||||||
},
|
|
||||||
): Promise<void> {
|
|
||||||
for (const directory of options.directories) {
|
|
||||||
for await (const file of Deno.readDir(directory)) {
|
|
||||||
if (!file.isFile) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const filename = file.name;
|
|
||||||
const { destination } = await prompt.prompt([{
|
|
||||||
type: prompt.Input,
|
|
||||||
name: "destination",
|
|
||||||
message: `${filename} Destination:`,
|
|
||||||
}]);
|
|
||||||
|
|
||||||
if (destination === undefined || destination === "") {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Move the file.
|
|
||||||
console.log(filename, destination);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,180 +0,0 @@
|
||||||
import { Command, prompt } from "../dependencies.ts";
|
|
||||||
|
|
||||||
export const runCommand = new Command()
|
|
||||||
.name("run")
|
|
||||||
.description("Run a command over a group of files and directories.")
|
|
||||||
.option(
|
|
||||||
"-d, --directory <directory:string>",
|
|
||||||
"Directories to include files from.",
|
|
||||||
{
|
|
||||||
collect: true,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.option(
|
|
||||||
"--include-directories",
|
|
||||||
"Include directories found inside the directories.",
|
|
||||||
)
|
|
||||||
.option(
|
|
||||||
"--output-script",
|
|
||||||
"Output the commands as a shell script instead of running them.",
|
|
||||||
)
|
|
||||||
.action(async ({ directory, includeDirectories, outputScript }) => {
|
|
||||||
await actionHandler({
|
|
||||||
directories: directory,
|
|
||||||
includeDirectories: includeDirectories ?? false,
|
|
||||||
outputScript: outputScript ?? false,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
async function actionHandler(
|
|
||||||
options: {
|
|
||||||
directories: string[];
|
|
||||||
includeDirectories: boolean;
|
|
||||||
outputScript: boolean;
|
|
||||||
},
|
|
||||||
): Promise<void> {
|
|
||||||
let command: string[] = [];
|
|
||||||
const previousPromptArgs: Map<number, string> = new Map();
|
|
||||||
const suggestedPromptArgs: Set<string> = new Set();
|
|
||||||
const substituteMarkers = {
|
|
||||||
absoluteFile: "$absoluteFile",
|
|
||||||
filename: "$filename",
|
|
||||||
outWithFile: "$outWithFile",
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const directory of options.directories) {
|
|
||||||
console.log(`\n## Input for ${directory}`);
|
|
||||||
const constructedCommands: string[][] = [];
|
|
||||||
const prompts = await prompt.prompt([
|
|
||||||
{
|
|
||||||
type: prompt.List,
|
|
||||||
name: "command",
|
|
||||||
message: "Arguments of the command to run separated by comma",
|
|
||||||
default: command,
|
|
||||||
suggestions: Object.values(substituteMarkers),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: prompt.Confirm,
|
|
||||||
name: "confirmCommands",
|
|
||||||
message: "Manually approve each command invocation",
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
command = prompts.command ?? command;
|
|
||||||
for await (const file of Deno.readDir(directory)) {
|
|
||||||
if (!options.includeDirectories && file.isDirectory) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const absoluteFile = await Deno.realPath(`${directory}/${file.name}`);
|
|
||||||
const constructedCommand: string[] = [];
|
|
||||||
let promptArgCount = 1;
|
|
||||||
const substitutes = [
|
|
||||||
[substituteMarkers.absoluteFile, absoluteFile],
|
|
||||||
[substituteMarkers.filename, file.name],
|
|
||||||
[substituteMarkers.outWithFile, `$out/${file.name}`],
|
|
||||||
];
|
|
||||||
|
|
||||||
argumentLoop:
|
|
||||||
for (const argument of command) {
|
|
||||||
if (argument === "$prompt") {
|
|
||||||
const { promptedArg } = await prompt.prompt([{
|
|
||||||
type: prompt.Input,
|
|
||||||
name: "promptedArg",
|
|
||||||
message: `$prompt ${promptArgCount} for ${absoluteFile}`,
|
|
||||||
default: previousPromptArgs.get(promptArgCount) ?? "",
|
|
||||||
suggestions: Array.from(suggestedPromptArgs),
|
|
||||||
}]);
|
|
||||||
|
|
||||||
previousPromptArgs.set(promptArgCount, promptedArg!);
|
|
||||||
suggestedPromptArgs.add(promptedArg!);
|
|
||||||
constructedCommand.push(promptedArg!);
|
|
||||||
promptArgCount += 1;
|
|
||||||
} else {
|
|
||||||
for (const [marker, substitute] of substitutes) {
|
|
||||||
if (argument === marker) {
|
|
||||||
constructedCommand.push(substitute);
|
|
||||||
continue argumentLoop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
constructedCommand.push(argument);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prompts.confirmCommands) {
|
|
||||||
const { confirmedRun } = await prompt.prompt([
|
|
||||||
{
|
|
||||||
type: prompt.Confirm,
|
|
||||||
name: "confirmedRun",
|
|
||||||
message: `Run "${constructedCommand.join(" ")}"`,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (!confirmedRun) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
constructedCommands.push(constructedCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (constructedCommands.length === 0) {
|
|
||||||
console.log("\n No commands to run.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("\n## Commands");
|
|
||||||
console.log(constructedCommands.map((c) => c.join(" ")).join("\n"));
|
|
||||||
|
|
||||||
const { confirmedRun } = await prompt.prompt([
|
|
||||||
{
|
|
||||||
type: prompt.Confirm,
|
|
||||||
name: "confirmedRun",
|
|
||||||
message: "Is this correct",
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (!confirmedRun) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.outputScript) {
|
|
||||||
const defaultFilename = "bulk-run-script.zsh";
|
|
||||||
const { filename, outputDirectory } = await prompt.prompt([
|
|
||||||
{
|
|
||||||
type: prompt.Input,
|
|
||||||
name: "outputDirectory",
|
|
||||||
message: "Output directory to set as $out",
|
|
||||||
default: ".",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: prompt.Input,
|
|
||||||
name: "filename",
|
|
||||||
message: "Filename for the script",
|
|
||||||
default: defaultFilename,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
const commands = constructedCommands.map((c) => c.join(" ")).join("\n");
|
|
||||||
await Deno.writeTextFile(
|
|
||||||
filename ?? defaultFilename,
|
|
||||||
`#!/usr/bin/env zsh
|
|
||||||
|
|
||||||
source "$HOME/.aliases.zsh"
|
|
||||||
out="${outputDirectory}"
|
|
||||||
${commands}`,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
console.log("\n## Output");
|
|
||||||
for (const constructedCommand of constructedCommands) {
|
|
||||||
await Deno.run({
|
|
||||||
cmd: constructedCommand,
|
|
||||||
}).status();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -21,13 +21,11 @@ async function main(): Promise<void> {
|
||||||
|
|
||||||
if (options.install) {
|
if (options.install) {
|
||||||
const extensions = await getSavedExtensions(options.file);
|
const extensions = await getSavedExtensions(options.file);
|
||||||
const process = Deno.run({
|
await new Deno.Command("codium", {
|
||||||
cmd: [
|
args: [
|
||||||
"codium",
|
|
||||||
...extensions.flatMap((id) => ["--install-extension", id]),
|
...extensions.flatMap((id) => ["--install-extension", id]),
|
||||||
],
|
],
|
||||||
});
|
}).output();
|
||||||
await process.status();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.list) {
|
if (options.list) {
|
||||||
|
@ -48,8 +46,8 @@ async function main(): Promise<void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getInstalledExtensions(): Promise<string[]> {
|
async function getInstalledExtensions(): Promise<string[]> {
|
||||||
const extensions = await runAndReturnStdout({
|
const extensions = await runAndReturnStdout("codium", {
|
||||||
cmd: ["codium", "--list-extensions"],
|
args: ["--list-extensions"],
|
||||||
});
|
});
|
||||||
return extensions.trim().split("\n");
|
return extensions.trim().split("\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ async function main(): Promise<void> {
|
||||||
'Copy NixOS configuration from "$BAUKE_DIR/nix/<hostname>/" to "/etc/nixos/"',
|
'Copy NixOS configuration from "$BAUKE_DIR/nix/<hostname>/" to "/etc/nixos/"',
|
||||||
)
|
)
|
||||||
.option("--hostname", "The machine's configuration to copy.", {
|
.option("--hostname", "The machine's configuration to copy.", {
|
||||||
default: (await runAndReturnStdout({ cmd: ["hostname"] })).trim(),
|
default: (await runAndReturnStdout("hostname")).trim(),
|
||||||
})
|
})
|
||||||
.option("--diff", 'Output diffs between local and "/etc/nixos/" files.', {
|
.option("--diff", 'Output diffs between local and "/etc/nixos/" files.', {
|
||||||
standalone: true,
|
standalone: true,
|
||||||
|
@ -27,29 +27,28 @@ async function main(): Promise<void> {
|
||||||
if (options.diff) {
|
if (options.diff) {
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
const filename = file.slice(file.lastIndexOf("/") + 1);
|
const filename = file.slice(file.lastIndexOf("/") + 1);
|
||||||
await Deno.run({
|
await new Deno.Command("delta", {
|
||||||
cmd: ["delta", `/etc/nixos/${filename}`, file],
|
args: [`/etc/nixos/${filename}`, file],
|
||||||
}).status();
|
}).output();
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await Deno.run({
|
await new Deno.Command("sudo", {
|
||||||
cmd: [
|
args: [
|
||||||
"sudo",
|
|
||||||
"cp",
|
"cp",
|
||||||
"--preserve=timestamps",
|
"--preserve=timestamps",
|
||||||
"--verbose",
|
"--verbose",
|
||||||
...files,
|
...files,
|
||||||
"/etc/nixos/",
|
"/etc/nixos/",
|
||||||
],
|
],
|
||||||
}).status();
|
}).output();
|
||||||
|
|
||||||
if (options.rebuild) {
|
if (options.rebuild) {
|
||||||
await Deno.run({
|
await new Deno.Command("sudo", {
|
||||||
cmd: ["sudo", "nixos-rebuild", options.rebuild],
|
args: ["nixos-rebuild", options.rebuild],
|
||||||
}).status();
|
}).output();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
export { Command } from "https://deno.land/x/cliffy@v0.25.7/command/mod.ts";
|
export { Command } from "https://deno.land/x/cliffy@v0.25.7/command/mod.ts";
|
||||||
export * as prompt from "https://deno.land/x/cliffy@v0.25.7/prompt/mod.ts";
|
export * as prompt from "https://deno.land/x/cliffy@v0.25.7/prompt/mod.ts";
|
||||||
|
|
||||||
export * as nodeFs from "https://deno.land/std@0.167.0/node/fs.ts";
|
export * as toml from "https://deno.land/std@0.190.0/toml/mod.ts";
|
||||||
export * as nodeUtil from "https://deno.land/std@0.167.0/node/util.ts";
|
|
||||||
export * as toml from "https://deno.land/std@0.167.0/encoding/toml.ts";
|
|
||||||
|
|
|
@ -41,17 +41,16 @@ async function main(): Promise<void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function downloadImage(url: string): Promise<void> {
|
async function downloadImage(url: string): Promise<void> {
|
||||||
await Deno.run({
|
await new Deno.Command("curl", {
|
||||||
cmd: ["curl", "-fsLS", url, "-o", imagePath],
|
args: ["-fsLS", url, "-o", imagePath],
|
||||||
}).status();
|
}).output();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setWallpaper(file: string = imagePath): Promise<void> {
|
async function setWallpaper(file: string = imagePath): Promise<void> {
|
||||||
const monitors = ["monitorHDMI-0", "monitorHDMI-1"];
|
const monitors = ["monitorHDMI-0", "monitorHDMI-1"];
|
||||||
for (const monitor of monitors) {
|
for (const monitor of monitors) {
|
||||||
await Deno.run({
|
await new Deno.Command("xfconf-query", {
|
||||||
cmd: [
|
args: [
|
||||||
"xfconf-query",
|
|
||||||
"-c",
|
"-c",
|
||||||
"xfce4-desktop",
|
"xfce4-desktop",
|
||||||
"-p",
|
"-p",
|
||||||
|
@ -59,7 +58,7 @@ async function setWallpaper(file: string = imagePath): Promise<void> {
|
||||||
"-s",
|
"-s",
|
||||||
file,
|
file,
|
||||||
],
|
],
|
||||||
}).status();
|
}).output();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,9 +49,8 @@ async function main(): Promise<void> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await Deno.run({
|
await new Deno.Command("youtube3", {
|
||||||
cmd: [
|
args: [
|
||||||
"youtube3",
|
|
||||||
"videos",
|
"videos",
|
||||||
"update",
|
"update",
|
||||||
"-r",
|
"-r",
|
||||||
|
@ -63,7 +62,7 @@ async function main(): Promise<void> {
|
||||||
"-r",
|
"-r",
|
||||||
`snippet.title=${title}`,
|
`snippet.title=${title}`,
|
||||||
],
|
],
|
||||||
}).status();
|
}).output();
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatDescription(frontmatter: Frontmatter): string {
|
function formatDescription(frontmatter: Frontmatter): string {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Command, nodeFs } from "./dependencies.ts";
|
import { Command } from "./dependencies.ts";
|
||||||
|
import { pathExists } from "./utilities.ts";
|
||||||
|
|
||||||
async function main(): Promise<void> {
|
async function main(): Promise<void> {
|
||||||
const { args, options } = await new Command()
|
const { args, options } = await new Command()
|
||||||
|
@ -20,7 +21,7 @@ async function main(): Promise<void> {
|
||||||
|
|
||||||
const [file, text] = args;
|
const [file, text] = args;
|
||||||
|
|
||||||
if (nodeFs.existsSync(file)) {
|
if (await pathExists(file)) {
|
||||||
if (options.overwrite) {
|
if (options.overwrite) {
|
||||||
await Deno.remove(file);
|
await Deno.remove(file);
|
||||||
} else {
|
} else {
|
||||||
|
@ -29,9 +30,8 @@ async function main(): Promise<void> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await Deno.run({
|
await new Deno.Command("gegl", {
|
||||||
cmd: [
|
args: [
|
||||||
"gegl",
|
|
||||||
"-o",
|
"-o",
|
||||||
file,
|
file,
|
||||||
"--",
|
"--",
|
||||||
|
@ -42,16 +42,15 @@ async function main(): Promise<void> {
|
||||||
width: options.width,
|
width: options.width,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
}).status();
|
}).output();
|
||||||
|
|
||||||
if (!nodeFs.existsSync(file)) {
|
if (!await pathExists(file)) {
|
||||||
console.log("Something went wrong with GEGL.");
|
console.log("Something went wrong with GEGL.");
|
||||||
Deno.exit(1);
|
Deno.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
await Deno.run({
|
await new Deno.Command("convert", {
|
||||||
cmd: [
|
args: [
|
||||||
"convert",
|
|
||||||
file,
|
file,
|
||||||
"-background",
|
"-background",
|
||||||
"transparent",
|
"transparent",
|
||||||
|
@ -61,10 +60,10 @@ async function main(): Promise<void> {
|
||||||
`${options.width}x${options.height}`,
|
`${options.width}x${options.height}`,
|
||||||
file,
|
file,
|
||||||
],
|
],
|
||||||
}).status();
|
}).output();
|
||||||
|
|
||||||
if (options.clean) {
|
if (options.clean) {
|
||||||
await Deno.run({ cmd: ["mat2", "--inplace", file] }).status();
|
await new Deno.Command("mat2", { args: ["--inplace", file] }).output();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,19 +24,19 @@ async function main(): Promise<void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function gitPush(remote: string, args: string[]): Promise<void> {
|
async function gitPush(remote: string, args: string[]): Promise<void> {
|
||||||
await Deno.run({
|
await new Deno.Command("git", {
|
||||||
cmd: [
|
args: [
|
||||||
"git",
|
"git",
|
||||||
"push",
|
"push",
|
||||||
"--follow-tags",
|
"--follow-tags",
|
||||||
remote,
|
remote,
|
||||||
...args,
|
...args,
|
||||||
],
|
],
|
||||||
}).status();
|
}).output();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function gitRemote(): Promise<string[]> {
|
async function gitRemote(): Promise<string[]> {
|
||||||
const output = await runAndReturnStdout({ cmd: ["git", "remote"] });
|
const output = await runAndReturnStdout("git", { args: ["remote"] });
|
||||||
return output.trim().split("\n").filter((remote) => remote.length > 0);
|
return output.trim().split("\n").filter((remote) => remote.length > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Command, nodeFs } from "./dependencies.ts";
|
import { Command } from "./dependencies.ts";
|
||||||
|
import { pathExists } from "./utilities.ts";
|
||||||
|
|
||||||
const hiddenApi = "http://127.0.0.1:7813";
|
const hiddenApi = "http://127.0.0.1:7813";
|
||||||
const remoteApi = "http://127.0.0.1:7814/api1";
|
const remoteApi = "http://127.0.0.1:7814/api1";
|
||||||
|
@ -62,7 +63,7 @@ async function main(): Promise<void> {
|
||||||
if (options.writeImage) {
|
if (options.writeImage) {
|
||||||
const status = await getStatus();
|
const status = await getStatus();
|
||||||
const path = `/tmp/tauon-cover-${status.id}.jpg`;
|
const path = `/tmp/tauon-cover-${status.id}.jpg`;
|
||||||
if (nodeFs.existsSync(path)) {
|
if (await pathExists(path)) {
|
||||||
console.log(path);
|
console.log(path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -95,9 +96,9 @@ async function getStatus(): Promise<Status> {
|
||||||
|
|
||||||
async function notifyCurrentSong(): Promise<void> {
|
async function notifyCurrentSong(): Promise<void> {
|
||||||
const status = await getStatus();
|
const status = await getStatus();
|
||||||
await Deno.run({
|
await new Deno.Command("notify-send", {
|
||||||
cmd: ["notify-send", status.title, status.artist],
|
args: [status.title, status.artist],
|
||||||
}).status();
|
}).output();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (import.meta.main) {
|
if (import.meta.main) {
|
||||||
|
|
|
@ -1,14 +1,25 @@
|
||||||
import { nodeUtil, toml } from "./dependencies.ts";
|
import { toml } from "./dependencies.ts";
|
||||||
|
|
||||||
|
export async function pathExists(path: string): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
await Deno.stat(path);
|
||||||
|
return true;
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function stringifyJsonPretty(input: unknown): string {
|
export function stringifyJsonPretty(input: unknown): string {
|
||||||
return JSON.stringify(input, null, 2);
|
return JSON.stringify(input, null, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function runAndReturnStdout(
|
export async function runAndReturnStdout(
|
||||||
options: Deno.RunOptions,
|
command: string,
|
||||||
|
options: Deno.CommandOptions = {},
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
const process = Deno.run({ stdout: "piped", ...options });
|
const process = new Deno.Command(command, { stdout: "piped", ...options });
|
||||||
return new nodeUtil.TextDecoder().decode(await process.output());
|
const { stdout } = await process.output();
|
||||||
|
return new TextDecoder().decode(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function tomlFrontmatter<T>(
|
export function tomlFrontmatter<T>(
|
||||||
|
|
Loading…
Reference in New Issue