├── .github └── FUNDING.yml ├── .gitignore ├── src ├── cli.ts ├── commands │ ├── setup.ts │ └── default.ts └── store.ts ├── tsconfig.json ├── package.json ├── readme.md └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [alii] 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import * as Path from "path"; 4 | import { CLI, Shim } from "clime"; 5 | 6 | const cli = new CLI("gitmusic", Path.join(__dirname, "commands")); 7 | 8 | const shim = new Shim(cli); 9 | shim.execute(process.argv); 10 | -------------------------------------------------------------------------------- /src/commands/setup.ts: -------------------------------------------------------------------------------- 1 | import { Command, command, metadata, param } from "clime"; 2 | import { store } from "../store"; 3 | 4 | @command({ description: "Creates a gitmusic config file" }) 5 | export default class extends Command { 6 | @metadata 7 | async execute( 8 | @param({ description: "The discord id to setup a file to", required: true }) 9 | discordId: string 10 | ) { 11 | store.write({ discordId }); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "commonjs", 5 | "declaration": false, 6 | "experimentalDecorators": true, 7 | "emitDecoratorMetadata": true, 8 | "strict": true, 9 | "strictPropertyInitialization": false, 10 | "noImplicitReturns": true, 11 | "noEmitOnError": true, 12 | "noUnusedLocals": true, 13 | "noUnusedParameters": true, 14 | "sourceMap": false, 15 | "skipLibCheck": true, 16 | "newLine": "LF", 17 | "rootDir": "src", 18 | "outDir": "dist" 19 | }, 20 | "include": ["src", "types"] 21 | } 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitmusic", 3 | "version": "1.0.1", 4 | "main": "dist/cli.js", 5 | "repository": "https://github.com/alii/gitmusic", 6 | "author": "Alistair Smith ", 7 | "license": "MIT", 8 | "bin": "./dist/cli.js", 9 | "dependencies": { 10 | "axios": "^0.22.0", 11 | "clime": "^0.5.14", 12 | "colorette": "^2.0.14", 13 | "simple-git": "^2.46.0", 14 | "use-lanyard": "^1.0.2" 15 | }, 16 | "devDependencies": { 17 | "typescript": "^4.4.3" 18 | }, 19 | "scripts": { 20 | "test": "yarn tsc && chmod +x ./dist/cli.js && ./dist/cli.js", 21 | "build": "tsc", 22 | "prepublish": "yarn build" 23 | }, 24 | "files": [ 25 | "dist/**/*", 26 | "package.json" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /src/store.ts: -------------------------------------------------------------------------------- 1 | import { existsSync, readFileSync, writeFileSync } from "fs"; 2 | import * as os from "os"; 3 | import * as path from "path"; 4 | 5 | interface Data { 6 | discordId: string; 7 | } 8 | 9 | export class Store { 10 | public static readonly location = path.join(os.homedir(), ".gitmusic.json"); 11 | 12 | read() { 13 | const exists = existsSync(Store.location); 14 | 15 | if (!exists) { 16 | throw new Error("Config file does not exist. Please run setup command!"); 17 | } 18 | 19 | const file = readFileSync(Store.location).toString("utf-8"); 20 | return JSON.parse(file) as Data; 21 | } 22 | 23 | write(data: Data) { 24 | writeFileSync(Store.location, JSON.stringify(data)); 25 | } 26 | 27 | set(key: T, data: Data[T], read?: Data) { 28 | const config = read ?? this.read(); 29 | this.write({ ...config, [key]: data }); 30 | } 31 | } 32 | 33 | export const store = new Store(); 34 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # gitmusic 2 | 3 | Set your current spotify track as your commit message 4 | 5 | ## Installation 6 | 7 | You can install with npm: `npm i -g gitmusic` 8 | Or with yarn `yarn global add gitmusic` 9 | 10 | Requires node >= 12, an internet connection, and active usage of [lanyard by @Phineas](https://github.com/phineas/lanyard) 11 | 12 | ## Setup 13 | 14 | Firstly, you will have to run the setup command. That can be done as follows 15 | 16 | ``` 17 | gitmusic setup 18 | ``` 19 | 20 | So, for me, I would run `gitmusic setup 268798547439255572` 21 | 22 | ## Usage 23 | 24 | You can now commit just by running `gitmusic`. This will effectively run, under the hood, `git add . && git commit -m "song"`. 25 | 26 | If you want to just get your listening song and not commit, you can append the argument `true` to specify a dry run. E.g. `gitmusic true` 27 | 28 | ### Features 29 | 30 | - idk i made ethis at 6:52am and i am going to bed now 31 | - have fun 32 | - works 33 | -------------------------------------------------------------------------------- /src/commands/default.ts: -------------------------------------------------------------------------------- 1 | import { Command, command, metadata, param } from "clime"; 2 | import axios from "axios"; 3 | import { store } from "../store"; 4 | import { LanyardResponse } from "use-lanyard"; 5 | import git from "simple-git"; 6 | import { blue } from "colorette"; 7 | 8 | @command({ description: "Commits your currently playing song" }) 9 | export default class extends Command { 10 | @metadata 11 | async execute( 12 | @param({ 13 | description: "Whether to run a dry run (no commit, just log command)", 14 | default: false, 15 | }) 16 | dry?: boolean 17 | ) { 18 | const config = store.read(); 19 | 20 | const { data: lanyard } = await axios.get( 21 | `https://api.lanyard.rest/v1/users/${config.discordId}` 22 | ); 23 | 24 | if ("error" in lanyard) { 25 | throw new Error(lanyard.error.message); 26 | } 27 | 28 | const spotify = lanyard.data.spotify; 29 | 30 | if (!spotify) { 31 | throw new Error("You are not playing anything!"); 32 | } 33 | 34 | console.log("You are listening to", blue(spotify.song)); 35 | 36 | if (dry) { 37 | return; 38 | } 39 | 40 | await git(process.cwd()).add(".").commit(spotify.song); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@kwsites/file-exists@^1.1.1": 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" 8 | integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw== 9 | dependencies: 10 | debug "^4.1.1" 11 | 12 | "@kwsites/promise-deferred@^1.1.1": 13 | version "1.1.1" 14 | resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" 15 | integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== 16 | 17 | "@stitches/react@^1.2.1": 18 | version "1.2.4" 19 | resolved "https://registry.yarnpkg.com/@stitches/react/-/react-1.2.4.tgz#0b544e97555ffadaeae5ca07f8fff7a6231a4ef3" 20 | integrity sha512-QiP54385bx7NPk2dNpCdu49bUaC/lxl5bdP6pJOnxS/VKkF6tD1lTvJ+ud0u6wF2J92TUiCP6E5vKWVzV5dCbg== 21 | 22 | ansi-regex@^3.0.0: 23 | version "3.0.0" 24 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 25 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 26 | 27 | ansi-styles@^3.2.1: 28 | version "3.2.1" 29 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 30 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 31 | dependencies: 32 | color-convert "^1.9.0" 33 | 34 | axios@^0.22.0: 35 | version "0.22.0" 36 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.22.0.tgz#bf702c41fb50fbca4539589d839a077117b79b25" 37 | integrity sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w== 38 | dependencies: 39 | follow-redirects "^1.14.4" 40 | 41 | chalk@^2.1.0: 42 | version "2.4.2" 43 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 44 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 45 | dependencies: 46 | ansi-styles "^3.2.1" 47 | escape-string-regexp "^1.0.5" 48 | supports-color "^5.3.0" 49 | 50 | clime@^0.5.14: 51 | version "0.5.14" 52 | resolved "https://registry.yarnpkg.com/clime/-/clime-0.5.14.tgz#01e291895e73d1c54274db8f45d6ee44cead473b" 53 | integrity sha512-+q7UDQ+EcruHtZRtd2QVs+t/jf9MpuOyhHbuHcYWvjX8jdly6AU7z3/7MiI0Kj0hzueIEX9JM7vPnkzBrG082Q== 54 | dependencies: 55 | chalk "^2.1.0" 56 | extendable-error "^0.1.5" 57 | hyphenate "^0.2.1" 58 | parse-messy-time "^2.1.0" 59 | reflect-metadata "^0.1.10" 60 | strip-ansi "^4.0.0" 61 | villa "^0.2.11" 62 | 63 | color-convert@^1.9.0: 64 | version "1.9.3" 65 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 66 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 67 | dependencies: 68 | color-name "1.1.3" 69 | 70 | color-name@1.1.3: 71 | version "1.1.3" 72 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 73 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 74 | 75 | colorette@^2.0.14: 76 | version "2.0.14" 77 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.14.tgz#1629bb27a13cd719ff37d66bc341234af564122e" 78 | integrity sha512-TLcu0rCLNjDIdKGLGqMtPEAOAZmavC1QCX4mEs3P0mrA/DDoU/tA+Y4UQK/862FkX2TTlbyVIkREZNbf7Y9YwA== 79 | 80 | debug@^4.1.1, debug@^4.3.1: 81 | version "4.3.2" 82 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 83 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 84 | dependencies: 85 | ms "2.1.2" 86 | 87 | escape-string-regexp@^1.0.5: 88 | version "1.0.5" 89 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 90 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 91 | 92 | extendable-error@^0.1.5: 93 | version "0.1.7" 94 | resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" 95 | integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== 96 | 97 | follow-redirects@^1.14.4: 98 | version "1.14.4" 99 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" 100 | integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== 101 | 102 | has-flag@^3.0.0: 103 | version "3.0.0" 104 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 105 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 106 | 107 | hyphenate@^0.2.1: 108 | version "0.2.5" 109 | resolved "https://registry.yarnpkg.com/hyphenate/-/hyphenate-0.2.5.tgz#57ac6637b2ce6ac7aa046350873693b0c36ea0cf" 110 | integrity sha512-mSY0+dVLWFq7iIUgiID3EWo5S8rLnZa595mcuWiN8di91n6eL+WS8HKmcpiZZIX7iElri0a/2hOYpwzldsY4gQ== 111 | 112 | ms@2.1.2: 113 | version "2.1.2" 114 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 115 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 116 | 117 | parse-messy-time@^2.1.0: 118 | version "2.1.0" 119 | resolved "https://registry.yarnpkg.com/parse-messy-time/-/parse-messy-time-2.1.0.tgz#7a14ce7a1c4f65b5ede243399cc056d86bd57ad5" 120 | integrity sha1-ehTOehxPZbXt4kM5nMBW2GvVetU= 121 | 122 | reflect-metadata@^0.1.10: 123 | version "0.1.13" 124 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 125 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 126 | 127 | simple-git@^2.46.0: 128 | version "2.46.0" 129 | resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-2.46.0.tgz#d564856705cee9d2ef1d1f98c7143e2bc00e7c3e" 130 | integrity sha512-6eumII1vfP4NpRqxZcVWCcIT5xHH6dRyvBZSjkH4dJRDRpv+0f75hrN5ysp++y23Mfr3AbRC/dO2NDbfj1lJpQ== 131 | dependencies: 132 | "@kwsites/file-exists" "^1.1.1" 133 | "@kwsites/promise-deferred" "^1.1.1" 134 | debug "^4.3.1" 135 | 136 | strip-ansi@^4.0.0: 137 | version "4.0.0" 138 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 139 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 140 | dependencies: 141 | ansi-regex "^3.0.0" 142 | 143 | supports-color@^5.3.0: 144 | version "5.5.0" 145 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 146 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 147 | dependencies: 148 | has-flag "^3.0.0" 149 | 150 | typescript@^4.4.3: 151 | version "4.4.3" 152 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" 153 | integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== 154 | 155 | use-lanyard@^1.0.2: 156 | version "1.0.2" 157 | resolved "https://registry.yarnpkg.com/use-lanyard/-/use-lanyard-1.0.2.tgz#5d0f40996e5a13190becc8f8cfd1e950ce3e9259" 158 | integrity sha512-rXX77QoyA7U/cp15FyBzyyOWVBjP/CtRmzyCtyt1vnMYsKM/bgLNxzcRXoMO6WvH38WiGxByf49F8GOI4CWpnQ== 159 | dependencies: 160 | "@stitches/react" "^1.2.1" 161 | 162 | villa@^0.2.11: 163 | version "0.2.11" 164 | resolved "https://registry.yarnpkg.com/villa/-/villa-0.2.11.tgz#a99a1c0ac01025b7311bb550c1fa7f8e6570692a" 165 | integrity sha1-qZocCsAQJbcxG7VQwfp/jmVwaSo= 166 | --------------------------------------------------------------------------------