Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating and merging with recent commits #2

Open
wants to merge 54 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
139336a
fix(reddit): use `fetch` instead of `CosmosAsync` (#2892)
rxri Mar 12, 2024
a5f2154
fix: implement missing class for cards for `1.2.33` and higher (#2894)
rxri Mar 12, 2024
4741c93
ci: remove 'update the homebrew tap' step (#2896)
rxri Mar 12, 2024
03668a3
fix: disable sentry completely (#2898)
rxri Mar 12, 2024
ef0b493
fix: properly set every value in state (#2899)
rxri Mar 12, 2024
e181309
fix: repair helpers to work on newer versions (#2888)
rxri Mar 12, 2024
c9b6250
fix(homeConfig): support all versions (#2897)
ohitstom Mar 12, 2024
c77801a
fix(styledClassName): add another key and exclude one (#2902)
rxri Mar 13, 2024
5e1dce1
fix(wrapper/MenuItem): set `isEnabled` not `_isEnabled` (#2905)
rxri Mar 13, 2024
c904733
fix(lyrics-plus): access props when copying translated lyrics (#2908)
rxri Mar 21, 2024
2a005de
feat: add support for new global navbar (#2911)
rxri Mar 21, 2024
3cf0568
fix(NavLinkSidebar): use `TextComponent`, not `TextWrapper` (#2912)
rxri Mar 21, 2024
9ef07f9
docs: create `contributing.md` (#2915)
b-chen00 Mar 23, 2024
cac4af8
feat(config): add another folder to `potentialList` (#2916)
rxri Mar 25, 2024
6f88fb6
fix: make various changes to global navbar (#2913)
rxri Mar 25, 2024
4950982
feat(shuffle+): add an option to shuffle queue (#2923)
rxri Mar 26, 2024
03770a9
feat: add support for pre-Library X UI again (#2922)
rxri Mar 26, 2024
80437c9
fix(wrapper): adapt `checkForUpdate` to new changelog (#2926)
rxri Mar 28, 2024
8bc619f
feat(navlink): match spotify style & use `SeekToCloseParen` (#2927)
rxri Mar 29, 2024
ccb023b
ci(release): add support for windows `arm64` (#2928)
rxri Apr 1, 2024
29fc298
feat(windows/install): add support for `arm64` (#2933)
rxri Apr 1, 2024
6dbc53c
fix(ci/build): add arm64 to 7z checks (#2934)
rxri Apr 2, 2024
1d9de3a
fix(install/linux): properly parse `--root` flag and tag option (#2932)
rxri Apr 6, 2024
9ee6202
fix: do not replace color variables in mini player css (#2948)
rxri Apr 7, 2024
cb3e8f8
fix(new-releases): update `viewportSelector` for `1.2.34` and higher …
rxri Apr 7, 2024
b82f6e2
chore(deps): bump golang.org/x/net from 0.22.0 to 0.24.0 (#2945)
dependabot[bot] Apr 7, 2024
32c7006
fix(wrapper/cards): change hook for `Default` card component (#2942)
harbassan Apr 7, 2024
1e4f069
feat(cmd/update): add support for `arm64` (#2952)
rxri Apr 8, 2024
445868e
fix(manifest): remove borked extensions on marketplace (#2953)
rxri Apr 8, 2024
6591a1a
feat(windows/install): add help text for `?` choices (#2957)
Bergbok Apr 8, 2024
c77623b
fix: adapt regexes for `1.2.35` (#2958)
rxri Apr 8, 2024
84273d1
fix(getStyledClassName): add `$semanticColor` to included keys (#2962)
rxri Apr 10, 2024
d31784f
fix(lyrics-plus): add second selector for viewport (#2961)
rxri Apr 12, 2024
1ba6ef0
fix(config): check for duplicates when adding multiple values (#2963)
rxri Apr 15, 2024
83c3ad8
fix: make changes for `1.2.36` (#2973)
rxri Apr 22, 2024
43c3b8b
fix(css-map): add missing classes across the client (#2978)
rxri Apr 23, 2024
7849eb2
fix(getStyledClassName): remove `$` from `childrenProps` (#2979)
rxri Apr 23, 2024
49d5cbd
fix(getStyledClassName): add `paddingBottom` back to `customExactKeys…
rxri Apr 23, 2024
205a28b
feat(wrapper/cards): re-add "Default" as `FeatureCard` (#2990)
rxri Apr 27, 2024
d0faddf
chore(wrapper): remove additional graphql getters (#2986)
rxri Apr 29, 2024
1723d79
fix(translator): force setting `currentLyrics` on cache hit (#2983)
rxri Apr 30, 2024
ffdb5c1
fix(wrapper): revert `CardImage` component (#2996)
rxri May 2, 2024
df1bcb2
feat(css-map): map home classes (#3002)
rxri May 2, 2024
95969fb
fix(install/windows): use `System.IO` to get `TEMP` path (#2995)
rxri May 2, 2024
8ec27dd
fix(shuffle+): lower limit & bring back `queryArtistOverview` (#3001)
rxri May 2, 2024
ffec2ad
feat(css-map): add search bar (#3006)
veryboringhwl May 3, 2024
564cf2d
feat(css-map): map settings classes (#3003)
rxri May 3, 2024
bf98eb4
feat(css-map): 1.2.36 tracklist row hearts (#3005)
ohitstom May 3, 2024
8ac6ad3
fix(wrapper/platform): assign product state to old prop (#3011)
rxri May 7, 2024
9a39e97
chore(deps): bump golang.org/x/net from 0.24.0 to 0.25.0 (#3010)
dependabot[bot] May 9, 2024
fef1c42
feat(css-map): map text next to cover art (#3016)
veryboringhwl May 9, 2024
49a279f
chore(css-map): search carousel (#3017)
ohitstom May 9, 2024
2a10bdf
fix(keyboardShortcut): correctly call functions for volume (#3019)
senisia May 11, 2024
e23e0f2
feat(css-map): add device picker + equalizer gif classes (#3021)
veryboringhwl May 13, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 2 additions & 15 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
run: echo "IS_UNIX=${{ matrix.os != 'windows' && matrix.arch != '386' }}" >> $GITHUB_ENV

- name: Is Windows Platform
run: echo "IS_WIN=${{ matrix.os == 'windows' && matrix.arch != 'arm64' }}" >> $GITHUB_ENV
run: echo "IS_WIN=${{ matrix.os == 'windows' }}" >> $GITHUB_ENV

- name: Setup Go
uses: actions/setup-go@v5
Expand Down Expand Up @@ -78,7 +78,7 @@ jobs:
if: env.IS_WIN == 'true'
uses: edgarrc/action-7z@v1
with:
args: 7z a -bb0 -mx9 "spicetify-${{ env.TAG }}-${{ matrix.os }}-${{ matrix.arch == 'amd64' && 'x64' || 'x32' }}.zip" "./spicetify.exe" "./CustomApps" "./Extensions" "./Themes" "./jsHelper" "globals.d.ts" "css-map.json"
args: 7z a -bb0 -mx9 "spicetify-${{ env.TAG }}-${{ matrix.os }}-${{ (matrix.arch == 'amd64' && 'x64') || (matrix.arch == 'arm64' && 'arm64') || 'x32' }}.zip" "./spicetify.exe" "./CustomApps" "./Extensions" "./Themes" "./jsHelper" "globals.d.ts" "css-map.json"

- name: Release
if: env.IS_UNIX == 'true' || env.IS_WIN == 'true'
Expand All @@ -98,19 +98,6 @@ jobs:
with:
url: https://vps.itsmeow.dev/spicetify-update
method: GET
- name: Update Homebrew tap
uses: mislav/bump-homebrew-formula-action@v3
if: ${{ !contains(github.ref, '-') }}
with:
formula-name: spicetify-cli
formula-path: spicetify-cli.rb
homebrew-tap: spicetify/homebrew-tap
base-branch: main
download-url: https://github.com/spicetify/spicetify-cli/archive/${{ github.ref_name }}.tar.gz
commit-message: |
feat: {{version}} release
env:
COMMITTER_TOKEN: ${{ secrets.SPICETIFY_GITHUB_TOKEN }}
- name: Update Winget package
uses: vedantmgoyal2009/winget-releaser@v2
with:
Expand Down
120 changes: 120 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# Contributing to Spicetify-cli

## Table of Contents

- [I Have a Question](#i-have-a-question)
- [How to Contribute](#how-to-contribute)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Enhancements](#suggesting-enhancements)
- [Your First Code Contribution](#your-first-code-contribution)
- [Improving The Documentation](#improving-the-documentation)
- [Commit Message Format](#commit-message-format)

## I Have a Question

> If you want to ask a question, we assume that you have read the available [Documentation](https://spicetify.app/docs/getting-started/).

Before you ask a question, it is best to search for existing [issues](https://github.com/spicetify/spicetify-cli/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.

If you then still feel the need to ask a question and need clarification, we recommend the following:

- Open an [issue](https://github.com/spicetify/spicetify-cli/issues/new).
- Provide both Spicetify and Spotify version.
- Explain what the problem is.

We will then take care of the issue as soon as possible.

## How to Contribute

> ### Legal Notice
> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.

### Reporting Bugs

#### Before Submitting a Bug Report

A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.

- Make sure that you are using the latest version.
- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](https://spicetify.app/docs/getting-started/). If you are looking for support, you might want to check [this section](#i-have-a-question)).
- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/spicetify/spicetify-cli/labels/%F0%9F%90%9B%20bug).

#### How Do I Submit a Good Bug Report?

We use GitHub issues to track bugs and errors. If you run into an issue with the project:

- Open an [issue](https://github.com/spicetify/spicetify-cli/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
- Use the provided [bug template](https://github.com/spicetify/spicetify-cli/issues/new?assignees=&labels=%F0%9F%90%9B+bug&projects=&template=bug_report.yml).
- Explain the behavior you would expect and the actual behavior.
- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
- Provide the information you collected in the previous section.

### Suggesting Enhancements

This section guides you through submitting an enhancement suggestion for spicetify, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.

#### Before Submitting an Enhancement

- Make sure that you are using the latest version.
- Read the [documentation](https://spicetify.app/docs/getting-started/) carefully and find out if the functionality is already covered, maybe by an individual configuration.
- Perform a [search](https://github.com/spicetify/spicetify-cli/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.

#### How Do I Submit a Good Enhancement Suggestion?

Enhancement suggestions are tracked as [GitHub issues](https://github.com/spicetify/spicetify-cli/issues). Create an enhancement suggestion using the provided [feature request template](https://github.com/spicetify/spicetify-cli/issues/new?assignees=&labels=%E2%9C%A8+feature&projects=&template=feature_request.yml).

- Use a **clear and descriptive title** for the issue to identify the suggestion.
- Provide a **step-by-step description of the suggested enhancement** in as many details as possible.
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.
- For GUIs, you may want to **include screenshots** which help you demonstrate the steps or point out the part which the suggestion is related to. Animated GIFS and videos may be helpful but are not expected. Some tools available are the [built-in screen recorder](https://support.apple.com/en-us/102618) on macOS, [LICEcap](https://www.cockos.com/licecap/) on macOS and Windows, and [ShareX](https://getsharex.com/) on Linux.
- **Explain why this enhancement would be useful** to most spicetify users. You may also want to point out the other projects that solved it better and which could serve as inspiration.

### Your First Code Contribution

#### Requirements

- [Go](https://go.dev/dl/)

#### Environment Setup and Development

Follow the steps outlined in the [documentation](https://spicetify.app/docs/development/compiling) or the steps below.
1. Clone the repository using `git clone https://github.com/spicetify/spicetify-cli`.
2. Enter the repository directory and build the project.
* Windows
```
cd spicetify-cli
go build -o spicetify.exe
```
* Linux and MacOS
```
cd spicetify-cli
go build -o spicetify
```
3. Execute the executable file generated by `go build` using `./spicetify` or `./spicetify.exe`.

### Improving The Documentation

To improve the [documentation](https://spicetify.app/docs/getting-started), navigate to the documentation [repository](https://github.com/spicetify/spicetify-docs).

### Commit Message Format

<type>(<scope>): <subject>
<BLANK LINE>
<body>[optional]

* **type:** feat | fix | docs | chore | revert
* **feat:** A new feature
* **fix:** A bug fix
* **docs:** Documentation only changes
* **chore:** Changes to build process, auxiliary tools, libraries, and other things
* **revert:** A reversion to a previous commit
* **scope:** Anything specifying place of the commit change
* **subject:** What changes you have done
* Use the imperative, present tense: "change" not "changed" nor "changes"
* Don't capitalize first letter
* No dot (.) at the end
* **body**: More details of your changes, you can mention the most important changes here
* Use the imperative, present tense: "change" not "changed" nor "changes"

If you want to learn more, view the [Angular - Git Commit Guidelines](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines).
2 changes: 1 addition & 1 deletion CustomApps/lyrics-plus/Pages.js
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@ const SyncedExpandedLyricsPage = react.memo(({ lyrics, provider, copyright, isKa
});

const UnsyncedLyricsPage = react.memo(({ lyrics, provider, copyright }) => {
const rawLyrics = lyrics.map(lyrics => lyrics.text).join("\n");
const rawLyrics = lyrics.map(lyrics => (typeof lyrics.text !== "object" ? lyrics.text : lyrics.text?.props?.children?.[0])).join("\n");

return react.createElement(
"div",
Expand Down
5 changes: 3 additions & 2 deletions CustomApps/lyrics-plus/TabBar.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ const TabBarMore = react.memo(({ items, switchTo, lockIn }) => {
});

const TopBarContent = ({ links, activeLink, lockLink, switchCallback, lockCallback }) => {
const resizeHost = document.querySelector(".Root__main-view .os-resize-observer-host");
const resizeHost =
document.querySelector(".Root__main-view .os-resize-observer-host") ?? document.querySelector(".Root__main-view .os-size-observer");
const [windowSize, setWindowSize] = useState(resizeHost.clientWidth);
const resizeHandler = () => setWindowSize(resizeHost.clientWidth);

Expand Down Expand Up @@ -196,7 +197,7 @@ const TabBar = react.memo(({ links, activeLink, lockLink, switchCallback, lockCa
items: droplistItem.map(i => options[i]).filter(Boolean),
switchTo: switchCallback,
lockIn: lockCallback
})
})
: null
)
);
Expand Down
60 changes: 54 additions & 6 deletions CustomApps/lyrics-plus/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -323,13 +323,59 @@ class LyricsContainer extends react.Component {
if (CACHE[info.uri]?.[CONFIG.modes[mode]]) {
this.resetDelay();
this.setState({ ...CACHE[info.uri], isCached });
{
let mode = -1;
if (this.state.explicitMode !== -1) {
mode = this.state.explicitMode;
} else if (this.state.lockMode !== -1) {
mode = this.state.lockMode;
} else {
// Auto switch
if (this.state.karaoke) {
mode = KARAOKE;
} else if (this.state.synced) {
mode = SYNCED;
} else if (this.state.unsynced) {
mode = UNSYNCED;
} else if (this.state.genius) {
mode = GENIUS;
}
}
const lyricsState = CACHE[info.uri][CONFIG.modes[mode]];
if (lyricsState) {
this.state.currentLyrics = this.state[CONFIG.visual["translate:translated-lyrics-source"]] ?? lyricsState;
}
}
this.translateLyrics();
return;
}
} else {
if (CACHE[info.uri]) {
this.resetDelay();
this.setState({ ...CACHE[info.uri], isCached });
{
let mode = -1;
if (this.state.explicitMode !== -1) {
mode = this.state.explicitMode;
} else if (this.state.lockMode !== -1) {
mode = this.state.lockMode;
} else {
// Auto switch
if (this.state.karaoke) {
mode = KARAOKE;
} else if (this.state.synced) {
mode = SYNCED;
} else if (this.state.unsynced) {
mode = UNSYNCED;
} else if (this.state.genius) {
mode = GENIUS;
}
}
const lyricsState = CACHE[info.uri][CONFIG.modes[mode]];
if (lyricsState) {
this.state.currentLyrics = this.state[CONFIG.visual["translate:translated-lyrics-source"]] ?? lyricsState;
}
}
this.translateLyrics();
return;
}
Expand Down Expand Up @@ -385,16 +431,15 @@ class LyricsContainer extends react.Component {

// Seemingly long delay so it can be cleared later for accurate timing
showNotification(10000);
const lyricText = lyrics.map(lyric => lyric.text).join("\n");

for (const params of [
["romaji", "spaced", "romaji"],
["hiragana", "furigana", "furigana"],
["hiragana", "normal", "hiragana"],
["katakana", "normal", "katakana"]
]) {
if (language !== "ja") continue;
this.translator.romajifyText(lyricText, params[0], params[1]).then(result => {
Promise.all(lyrics.map(lyric => this.translator.romajifyText(lyric.text, params[0], params[1]))).then(results => {
const result = results.join("\n");
Utils.processTranslatedLyrics(result, lyrics, { state: this.state, stateName: params[2] });
showNotification(200);
lyricContainerUpdate?.();
Expand All @@ -406,7 +451,8 @@ class LyricsContainer extends react.Component {
["romaja", "romaja"]
]) {
if (language !== "ko") continue;
this.translator.convertToRomaja(lyricText, params[1]).then(result => {
Promise.all(lyrics.map(lyric => this.translator.convertToRomaja(lyric.text, params[1]))).then(results => {
const result = results.join("\n");
Utils.processTranslatedLyrics(result, lyrics, { state: this.state, stateName: params[1] });
showNotification(200);
lyricContainerUpdate?.();
Expand All @@ -421,7 +467,8 @@ class LyricsContainer extends react.Component {
["t", "tw"]
]) {
if (!language.includes("zh") || (language === "zh-hans" && params[0] === "t") || (language === "zh-hant" && params[0] === "cn")) continue;
this.translator.convertChinese(lyricText, params[0], params[1]).then(result => {
Promise.all(lyrics.map(lyric => this.translator.convertChinese(lyric.text, params[0], params[1]))).then(results => {
const result = results.join("\n");
Utils.processTranslatedLyrics(result, lyrics, { state: this.state, stateName: params[1] });
showNotification(200);
lyricContainerUpdate?.();
Expand Down Expand Up @@ -559,7 +606,8 @@ class LyricsContainer extends react.Component {
this.forceUpdate();
};

this.viewPort = document.querySelector(".Root__main-view .os-viewport");
this.viewPort =
document.querySelector(".Root__main-view .os-viewport") ?? document.querySelector(".Root__main-view .main-view-container__scroll-node");

this.configButton = new Spicetify.Menu.Item("Lyrics Plus config", false, openConfig, "lyrics");
this.configButton.register();
Expand Down
4 changes: 2 additions & 2 deletions CustomApps/new-releases/Card.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ function DraggableComponent({ uri, title, children }) {
? react.cloneElement(children, {
onDragStart: dragHandler,
draggable: "true"
})
})
: children;
}

Expand Down Expand Up @@ -53,7 +53,7 @@ class Card extends react.Component {
})
})
})
})
})
: Spicetify.showNotification(`Dismissed <b>${this.title}</b> from <br>${this.artist.name}</b>`);

event.stopPropagation();
Expand Down
2 changes: 1 addition & 1 deletion CustomApps/new-releases/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ let separatedByDate = {};
let dateList = [];

class Grid extends react.Component {
viewportSelector = "#main .os-viewport";
viewportSelector = document.querySelector("#main .os-viewport") ? "#main .os-viewport" : "#main .main-view-container__scroll-node";

constructor() {
super();
Expand Down
5 changes: 3 additions & 2 deletions CustomApps/reddit/TabBar.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ const TabBarMore = react.memo(({ items, switchTo }) => {
});

const TopBarContent = ({ links, activeLink, switchCallback }) => {
const resizeHost = document.querySelector(".Root__main-view .os-resize-observer-host");
const resizeHost =
document.querySelector(".Root__main-view .os-resize-observer-host") ?? document.querySelector(".Root__main-view .os-size-observer");
const [windowSize, setWindowSize] = useState(resizeHost.clientWidth);
const resizeHandler = () => setWindowSize(resizeHost.clientWidth);

Expand Down Expand Up @@ -166,7 +167,7 @@ const TabBar = react.memo(({ links, activeLink, switchCallback, windowSize = Num
? react.createElement(TabBarMore, {
items: droplistItem.map(i => options[i]).filter(Boolean),
switchTo: switchCallback
})
})
: null
)
);
Expand Down
4 changes: 2 additions & 2 deletions CustomApps/reddit/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ const typesLocale = {
};

class Grid extends react.Component {
viewportSelector = "#main .os-viewport";
viewportSelector = document.querySelector("#main .os-viewport") ? "#main .os-viewport" : "#main .main-view-container__scroll-node";

constructor(props) {
super(props);
Expand Down Expand Up @@ -298,7 +298,7 @@ async function getSubreddit(after = "") {
url += `&t=${sortConfig.time}`;
}

return await Spicetify.CosmosAsync.get(url);
return await fetch(url, { method: "GET" }).then(res => res.json());
}

async function fetchPlaylist(post) {
Expand Down
4 changes: 2 additions & 2 deletions Extensions/keyboardShortcut.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@
"ctrl+right": { callback: () => Spicetify.Player.next() },

// CTRL + Arrow Up Increase Volume CTRL + Arrow Down Decrease Volume
"ctrl+up": { callback: () => Spicetify.Player.setVolume(Spicetify.Player.getVolume() - 0.05) },
"ctrl+down": { callback: () => Spicetify.Player.setVolume(Spicetify.Player.getVolume() + 0.05) },
"ctrl+up": { callback: () => Spicetify.Player.setVolume(Spicetify.Player.getVolume() + 0.05) },
"ctrl+down": { callback: () => Spicetify.Player.setVolume(Spicetify.Player.getVolume() - 0.05) },

// Activate Vim mode and set cancel key to 'ESCAPE'
f: {
Expand Down
Loading