kodilist
Version:
CLI tool for generating Kodi playlists based on filename-embedded tags.
103 lines (89 loc) • 3.07 kB
text/typescript
import path from "path";
import fs from "fs";
import os from "os";
import meow from "meow";
import chalk from "chalk";
import { getKodiFolder, ConfigFile } from "../index";
import Operations from "../operations";
function warnOfInvalidOption(invalid: string, valid: string[]): void {
const opts = valid.map(s => chalk.green(s)).join(", ");
invalid ? console.log(`Invalid option ${chalk.red(invalid || "")}`) : null;
console.log(`Options: ${opts}`);
}
function generateDefaultConfig(configPath: string): void {
const obj = {
directories: [],
ignoreList: [],
kodi: "",
searchTerms: {
sources: [],
tags: [],
people: []
},
configPath
};
fs.writeFileSync(configPath, JSON.stringify(obj, null, " "));
}
function getConfig(): ConfigFile {
const configPath = path.join(os.homedir(), ".kodilist.json");
if (!fs.existsSync(configPath)) generateDefaultConfig(configPath);
const config: ConfigFile = JSON.parse(fs.readFileSync(configPath).toString());
config.save = () =>
fs.writeFileSync(configPath, JSON.stringify(config, null, " "));
if (config.kodi === "" || config.kodi === "MISSING") {
config.kodi = getKodiFolder();
config.save();
}
if (config.kodi === "MISSING") {
console.error("Could not find Kodi installed in the default path");
process.exit(1);
}
return config;
}
const cli = meow(
`
Usage
$ kodilist ${chalk.green("<command>")} ${chalk.blue("[...terms]")}
Examples
$ kodilist generate
${chalk.green("✔️")} ~/videos
${chalk.green("✔️")} /media/birds/video
${chalk.green("✔️")} sources
${chalk.green("✔️")} tags
${chalk.green("✔️")} people
${chalk.green("✔️")} this week's files
${chalk.green("✔️")} alphabetical files
$ kodilist add tag rainbow lorikeet
Now tracking ${chalk.green("rainbow lorikeet")}
$ kodilist add person Dan Koeppel
Now tracking ${chalk.green("Dan Koeppel")}
$ kodilist add source bbc.co.uk
Now tracking ${chalk.green("bbc.co.uk")}
$ kodilist list people
dan koeppel
phoebe snetsinger
$ kodilist ignore *.gif
Now ignoring ${chalk.green("*.gif")}
$ kodilist delete person Dan Koeppel
Stopped tracking ${chalk.green("Dan Koeppel")}
`,
{
version: "1.1.3"
}
);
function main() {
const config = getConfig();
if (cli.input.length === 0) return cli.showHelp();
const operations = Operations(config, cli.input);
if (!operations.hasOwnProperty(cli.input[0])) {
return warnOfInvalidOption(cli.input[0], Object.keys(operations));
}
const cmd = operations[cli.input[0]];
if (typeof cmd === "function") return cmd(cli.input.slice(1));
if (!cmd.hasOwnProperty(cli.input[1])) {
return warnOfInvalidOption(cli.input[1], Object.keys(cmd));
}
cmd[cli.input[1]](cli.input.slice(2));
}
main();