{"id":13503684,"url":"https://github.com/aome510/spotify-player","last_synced_at":"2026-04-02T18:29:04.815Z","repository":{"id":37025943,"uuid":"383971950","full_name":"aome510/spotify-player","owner":"aome510","description":"A Spotify player in the terminal with full feature parity","archived":false,"fork":false,"pushed_at":"2026-03-29T22:03:14.000Z","size":3324,"stargazers_count":6426,"open_issues_count":115,"forks_count":330,"subscribers_count":18,"default_branch":"master","last_synced_at":"2026-03-29T22:22:56.078Z","etag":null,"topics":["cli","music","music-player","player","rust","spotify","spotify-api","spotify-tui","terminal","terminal-based","tui","vim"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aome510.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-07-08T01:51:43.000Z","updated_at":"2026-03-29T22:03:13.000Z","dependencies_parsed_at":"2022-07-08T15:51:39.531Z","dependency_job_id":"8069a6a5-fa59-4b9a-a6d6-6f0148c5674c","html_url":"https://github.com/aome510/spotify-player","commit_stats":{"total_commits":398,"total_committers":9,"mean_commits":44.22222222222222,"dds":0.02010050251256279,"last_synced_commit":"f49b58827e3a9b474b6759903e16b095e4d5353a"},"previous_names":[],"tags_count":57,"template":false,"template_full_name":null,"purl":"pkg:github/aome510/spotify-player","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aome510%2Fspotify-player","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aome510%2Fspotify-player/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aome510%2Fspotify-player/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aome510%2Fspotify-player/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aome510","download_url":"https://codeload.github.com/aome510/spotify-player/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aome510%2Fspotify-player/sbom","scorecard":{"id":200944,"data":{"date":"2025-08-11","repo":{"name":"github.com/aome510/spotify-player","commit":"b92c7379b192e6492ec37b722ecb9934e6803c2f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.2,"checks":[{"name":"Maintained","score":10,"reason":"20 commit(s) and 18 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":7,"reason":"Found 21/29 approved changesets -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/cd.yml:1","Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/docker.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cd.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/cd.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/cd.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/cd.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/cd.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/cd.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/cd.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/cd.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/aome510/spotify-player/docker.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:6: pin your Docker image by updating gcr.io/distroless/cc to gcr.io/distroless/cc@sha256:00cc20b928afcc8296b72525fa68f39ab332f758c4f2a9e8d90845d3e06f1dc4","Warn: containerImage not pinned by hash: ci/Dockerfile-cross:2","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   9 third-party GitHubAction dependencies pinned","Info:   0 out of   3 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":7,"reason":"3 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: RUSTSEC-2024-0436","Warn: Project is vulnerable to: RUSTSEC-2023-0071","Warn: Project is vulnerable to: RUSTSEC-2025-0047 / GHSA-qx2v-8332-m4fv"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T22:49:49.589Z","repository_id":37025943,"created_at":"2025-08-16T22:49:49.589Z","updated_at":"2025-08-16T22:49:49.589Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31312896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","music","music-player","player","rust","spotify","spotify-api","spotify-tui","terminal","terminal-based","tui","vim"],"created_at":"2024-07-31T23:00:43.294Z","updated_at":"2026-04-02T18:29:04.806Z","avatar_url":"https://github.com/aome510.png","language":"Rust","readme":"# spotify_player\n\n## Table of Contents\n\n- [Introduction](#introduction)\n- [Examples](#examples)\n- [Installation](#installation)\n- [Features](#features)\n  - [Spotify Connect](#spotify-connect)\n  - [Streaming](#streaming)\n  - [Audio Visualization](#audio-visualization)\n  - [Media Control](#media-control)\n  - [Image](#image)\n  - [Notify](#notify)\n  - [Mouse support](#mouse-support)\n  - [Daemon](#daemon)\n  - [Fuzzy search](#fuzzy-search)\n  - [CLI commands](#cli-commands)\n- [Commands](#commands)\n- [Configurations](#configurations)\n- [Caches](#caches)\n  - [Logging](#logging)\n- [Acknowledgement](#acknowledgement)\n\n## Introduction\n\n`spotify_player` is a fast, easy to use, and configurable terminal music player.\n\n**Features**\n\n- Minimalist UI with an intuitive paging and popup system.\n- Highly [configurable](https://github.com/aome510/spotify-player/blob/master/docs/config.md)\n- Feature parity with the official Spotify application.\n- Support remote control with [Spotify Connect](#spotify-connect).\n- Support [streaming](#streaming) songs directly from the terminal.\n- Support [audio visualization](#audio-visualization).\n- Support synced lyrics.\n- Support [cross-platform media control](#media-control).\n- Support [image rendering](#image).\n- Support [desktop notification](#notify).\n- Support running the application as [a daemon](#daemon)\n- Offer a wide range of [CLI commands](#cli-commands)\n\n## Examples\n\nA demo of `spotify_player` `v0.5.0-pre-release` on [youtube](https://www.youtube.com/watch/Jbfe9GLNWbA) or on [asciicast](https://asciinema.org/a/446913):\n\nCheckout [examples/README.md](https://github.com/aome510/spotify-player/blob/master/examples/README.md) for more examples.\n\n## Installation\n\nBy default, the application's installed binary is `spotify_player`.\n\n### Requirements\n\nA Spotify Premium account is **required**.\n\n#### Dependencies\n\n##### Windows and MacOS\n\n- [Rust and cargo](https://www.rust-lang.org/tools/install) as the build dependencies\n\n##### Linux\n\n- [Rust and cargo](https://www.rust-lang.org/tools/install) as the build dependencies\n- install `openssl`, `alsa-lib` (`streaming` feature), `libdbus` (`media-control` feature).\n  - For example, on Debian based systems, run the below command to install application's dependencies:\n\n    ```shell\n    sudo apt install libssl-dev libasound2-dev libdbus-1-dev\n    ```\n\n  - On RHEL/Fedora based systems, run the below command to install application's dependencies :\n\n    ```shell\n    sudo dnf install openssl-devel alsa-lib-devel dbus-devel\n    ```\n\n    or if you're using `yum`:\n\n    ```shell\n    sudo yum install openssl-devel alsa-lib-devel dbus-devel\n    ```\n\n### Binaries\n\nApplication's prebuilt binaries can be found in the [Releases Page](https://github.com/aome510/spotify-player/releases).\n\n**Note**: to run the application, Linux systems need to install additional dependencies as specified in the [Dependencies section](#linux).\n\n### Homebrew\n\nRun `brew install spotify_player` to install the application.\n\n### Scoop\n\nRun `scoop install spotify-player` to install the application.\n\n### Cargo\n\nInstall via Cargo:\n\n```\ncargo install spotify_player --locked\n```\n\n### Arch Linux\n\nInstall via Arch Linux:\n\n```\npacman -S spotify-player\n```\n\n**Note**: Defaults to PulseAudio/Pipewire. For a different backend, modify the [official PKGBUILD](https://gitlab.archlinux.org/archlinux/packaging/packages/spotify-player) and rebuild manually. See [Audio Backends](#audio-backend).\n\n### Void Linux\n\nInstall via Void Linux:\n\n```\nxbps-install -S spotify-player\n```\n\n### FreeBSD\n\nInstall via FreeBSD:\n\n```\npkg install spotify-player\n```\n\n### NetBSD\n\nInstall via NetBSD:\n\n```\npkgin install spotify-player\n```\n\nBuild from source on NetBSD:\n\n```\ncd /usr/pkgsrc/audio/spotify-player\nmake install\n```\n\n### NixOS\n\n[spotify-player](https://search.nixos.org/packages?channel=unstable\u0026show=spotify-player\u0026from=0\u0026size=50\u0026sort=relevance\u0026type=packages\u0026query=spotify-player) is available as a Nix package. Install via:\n\n```\nnix-shell -p spotify-player\n```\n\nTo build from source locally, run `nix-shell` in the root of the source checkout. The provided `shell.nix` will install prerequisites.\n\n### Docker\n\n**Note**: The streaming feature is disabled in the Docker image.\n\nDownload the latest Docker image:\n\n```\ndocker pull aome510/spotify_player:latest\n```\n\nRun the Docker container:\n\n```\ndocker run --rm -it aome510/spotify_player:latest\n```\n\nTo use your local config and cache folders:\n\n```\ndocker run --rm \\\n-v $APP_CONFIG_FOLDER:/app/config/ \\\n-v $APP_CACHE_FOLDER:/app/cache/ \\\n-it aome510/spotify_player:latest\n```\n\n## Features\n\n### Spotify Connect\n\nControl Spotify remotely with [Spotify Connect](https://support.spotify.com/us/article/spotify-connect/). Press **D** to list devices, then **enter** to connect.\n\n### Streaming\n\nStream music directly from the terminal. The streaming feature is enabled by default and uses the `rodio-backend` audio backend unless otherwise specified.\n\nThe app uses [librespot](https://github.com/librespot-org/librespot) to create an integrated Spotify client, registering a `spotify-player` device accessible via Spotify Connect.\n\n#### Audio backend\n\nDefault audio backend is [rodio](https://github.com/RustAudio/rodio). Available backends:\n\n- `alsa-backend`\n- `pulseaudio-backend`\n- `rodio-backend`\n- `portaudio-backend`\n- `jackaudio-backend`\n- `rodiojack-backend`\n- `sdl-backend`\n- `gstreamer-backend`\n\nTo use a different audio backend, specify the `--features` option when building. For example:\n\n```shell\ncargo install spotify_player --no-default-features --features pulseaudio-backend\n```\n\n**Notes**:\n\n- Use `--no-default-features` to disable the default `rodio-backend`.\n- Additional dependencies may be required for some backends. See [Librespot documentation](https://github.com/librespot-org/librespot/wiki/Compiling#general-dependencies).\n\nTo disable streaming, build with:\n\n```shell\ncargo install spotify_player --no-default-features\n```\n\n### Audio Visualization\n\nReal-time audio visualization is displayed in the playback window as a frequency-band bar chart (64 log-scale bands from bass (left) to treble (right)) while music is streamed locally via the integrated [librespot](https://github.com/librespot-org/librespot) player. The visualization area is hidden when playback is on an external Spotify Connect device or when the playback is not playing.\n\nSet `enable_audio_visualization` to `true` in your config to enable this feature. See [config docs](https://github.com/aome510/spotify-player/blob/master/docs/config.md).\n\n![Audio Visualization](https://github.com/user-attachments/assets/8c21c1b0-5276-4a9e-b719-e0c2bd555537)\n\n### Media Control\n\nMedia control is enabled by default. Set `enable_media_control` to `true` in your config to use it. See [config docs](https://github.com/aome510/spotify-player/blob/master/docs/config.md#media-control).\n\nMedia control uses [MPRIS DBus](https://wiki.archlinux.org/title/MPRIS) on Linux and OS window events on Windows and macOS.\n\n### Image\n\nTo enable image rendering, build with the `image` feature (disabled by default):\n\n```shell\ncargo install spotify_player --features image\n```\n\nFull-resolution images are supported in [Kitty](https://sw.kovidgoyal.net/kitty/graphics-protocol/) and [iTerm2](https://iterm2.com/documentation-images.html). Other terminals display images as [block characters](https://en.wikipedia.org/wiki/Block_Elements).\n\nTo use sixel graphics, build with the `sixel` feature (also enables `image`):\n\n```shell\ncargo install spotify_player --features sixel\n```\n\n**Notes**:\n\n- Not all terminals supported by [libsixel](https://github.com/saitoha/libsixel) are supported by `spotify_player` (see [viuer supported terminals](https://github.com/atanunq/viuer/blob/dc81f44a97727e04be0b000712e9233c92116ff8/src/printer/sixel.rs#L83-L95)).\n- Sixel images may scale oddly; adjust `cover_img_scale` for best results.\n\nImage rendering examples:\n\n- iTerm2:\n\n![iTerm2](https://user-images.githubusercontent.com/40011582/172966798-0aadc431-b0c3-4433-adf3-7526684fc2a0.png)\n\n- Kitty:\n\n![kitty](https://user-images.githubusercontent.com/40011582/172967028-8cfb2daa-1642-499a-a5bf-8ed77f2b3fac.png)\n\n- Sixel (`foot` terminal, `cover_img_scale=1.8`):\n\n![sixel](https://user-images.githubusercontent.com/40011582/219880331-58ac1c30-bbb0-4c99-a6cc-e5b7c9c81455.png)\n\n- Others:\n\n![others](https://user-images.githubusercontent.com/40011582/172967325-d2098037-e19e-440a-a38a-5b076253ecb1.png)\n\n#### Pixelate\n\nFor a pixelated look, enable the `pixelate` feature (also enables `image`):\n\n```shell\ncargo install spotify_player --features pixelate\n```\n\nAdjust the pixelation with the `cover_img_pixels` config option.\n\n| `cover_img_pixels` | `8`                                                                                                                 | `16`                                                                                                                  | `32`                                                                                                                  | `64`                                                                                                                  |\n| ------------------ | ------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |\n| example            | \u003cimg width=\"100\" alt=\"8x8\" src=\"https://github.com/user-attachments/assets/4137aaea-ce28-4019-8cd5-2d14327e72e4\" /\u003e | \u003cimg width=\"100\" alt=\"16x16\" src=\"https://github.com/user-attachments/assets/0ca94748-093a-468c-8fb3-1f5639666eb6\" /\u003e | \u003cimg width=\"100\" alt=\"32x32\" src=\"https://github.com/user-attachments/assets/f5d0f2da-0439-47e4-91c9-3a2aa73ac90c\" /\u003e | \u003cimg width=\"100\" alt=\"64x64\" src=\"https://github.com/user-attachments/assets/d06ef731-38fa-424d-9672-313f56c193d0\" /\u003e |\n\nTo temporarily disable pixelation, set `cover_img_pixels` to a high value (e.g., `512`).\n\n### Notify\n\nTo enable desktop notifications, build with the `notify` feature (disabled by default):\n\n```shell\ncargo install spotify_player --features notify\n```\n\n**Note**: Notification support is limited on macOS and Windows compared to Linux.\n\n### Mouse support\n\nMouse support: You can seek to a position in the playback by left-clicking the progress bar.\n\n### Daemon\n\nTo enable daemon mode, build with the `daemon` feature (disabled by default):\n\n```shell\ncargo install spotify_player --features daemon\n```\n\nRun as a daemon with `-d` or `--daemon`: `spotify_player -d`.\n\n**Notes**:\n\n- Daemon mode is not supported on Windows.\n- Daemon mode requires streaming and an audio backend.\n- On macOS, daemon mode does not work with media control (enabled by default). To use daemon mode on macOS, disable media control:\n\n  ```shell\n  cargo install spotify_player --no-default-features --features daemon,rodio-backend\n  ```\n\n### Fuzzy search\n\nTo enable [fuzzy search](https://en.wikipedia.org/wiki/Approximate_string_matching), build with the `fzf` feature (disabled by default).\n\n### CLI Commands\n\n`spotify_player` provides several CLI commands for interacting with Spotify:\n\n- `get`: Get Spotify data (playlist/album/artist data, user's data, etc)\n- `playback`: Interact with the playback (start a playback, play-pause, next, etc)\n- `search`: Search spotify\n- `connect`: Connect to a Spotify device\n- `like`: Like currently playing track\n- `authenticate`: Authenticate the application\n- `playlist`: Playlist editing (new, delete, import, fork, etc)\n\nFor more details, run `spotify_player -h` or `spotify_player {command} -h`.\n\n**Notes**\n\n- On first use, run `spotify_player authenticate` to authenticate the app.\n- CLI commands communicate with a client socket on port `client_port` (default: `8080`). If no instance is running, a new client is started, which may increase latency.\n\n#### Scripting\n\nThe command-line interface is script-friendly. Use the `search` subcommand to retrieve Spotify data in JSON format, which can be processed with tools like [jq](https://jqlang.github.io/jq/).\n\nExample: Start playback for the first track from a search query:\n\n```sh\nread -p \"Search spotify: \" query\nspotify_player playback start track --id $(spotify_player search \"$query\" | jq '.tracks.[0].id' | xargs)\n```\n\n## Commands\n\nPress `?` or `C-h` to open the shortcut help page (default for `OpenCommandHelp`).\n\n**Tips**:\n\n- Use the `Search` command to search in the shortcut help page and other pages.\n- `RefreshPlayback` manually updates playback status.\n- `RestartIntegratedClient` is useful for switching audio devices without restarting the app.\n\nList of supported commands:\n\n| Command                         | Description                                                                                        | Default shortcuts  |\n| ------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------ |\n| `NextTrack`                     | next track                                                                                         | `n`                |\n| `PreviousTrack`                 | previous track                                                                                     | `p`                |\n| `ResumePause`                   | resume/pause based on the current playback                                                         | `space`            |\n| `PlayRandom`                    | play a random track in the current context                                                         | `.`                |\n| `Repeat`                        | cycle the repeat mode                                                                              | `C-r`              |\n| `Shuffle`                       | toggle the shuffle mode                                                                            | `C-s`              |\n| `VolumeChange`                  | change playback volume by an offset (default shortcuts use 5%)                                     | `+`, `-`           |\n| `Mute`                          | toggle playback volume between 0% and previous level                                               | `_`                |\n| `SeekStart`                     | seek start of current track                                                                        | `^`                |\n| `SeekForward`                   | seek forward by a duration in seconds (defaults to `seek_duration_secs`)                           | `\u003e`                |\n| `SeekBackward`                  | seek backward by a duration in seconds (defaults to `seek_duration_secs`)                          | `\u003c`                |\n| `Quit`                          | quit the application                                                                               | `C-c`, `q`         |\n| `ClosePopup`                    | close a popup                                                                                      | `esc`              |\n| `SelectNextOrScrollDown`        | select the next item in a list/table or scroll down (supports vim-style count: 5j)                 | `j`, `C-n`, `down` |\n| `SelectPreviousOrScrollUp`      | select the previous item in a list/table or scroll up (supports vim-style count: 10k)              | `k`, `C-p`, `up`   |\n| `PageSelectNextOrScrollDown`    | select the next page item in a list/table or scroll a page down (supports vim-style count: 3C-f)   | `page_down`, `C-f` |\n| `PageSelectPreviousOrScrollUp`  | select the previous page item in a list/table or scroll a page up (supports vim-style count: 2C-b) | `page_up`, `C-b`   |\n| `SelectFirstOrScrollToTop`      | select the first item in a list/table or scroll to the top                                         | `g g`, `home`      |\n| `SelectLastOrScrollToBottom`    | select the last item in a list/table or scroll to the bottom                                       | `G`, `end`         |\n| `ChooseSelected`                | choose the selected item                                                                           | `enter`            |\n| `RefreshPlayback`               | manually refresh the current playback                                                              | `r`                |\n| `RestartIntegratedClient`       | restart the integrated client (`streaming` feature only)                                           | `R`                |\n| `ShowActionsOnSelectedItem`     | open a popup showing actions on a selected item                                                    | `g a`, `C-space`   |\n| `ShowActionsOnCurrentTrack`     | open a popup showing actions on the current track                                                  | `a`                |\n| `ShowActionsOnCurrentContext`   | open a popup showing actions on the current context                                                | `A`                |\n| `AddSelectedItemToQueue`        | add the selected item to queue                                                                     | `Z`, `C-z`         |\n| `FocusNextWindow`               | focus the next focusable window (if any)                                                           | `tab`              |\n| `FocusPreviousWindow`           | focus the previous focusable window (if any)                                                       | `backtab`          |\n| `SwitchTheme`                   | open a popup for switching theme                                                                   | `T`                |\n| `SwitchDevice`                  | open a popup for switching device                                                                  | `D`                |\n| `Search`                        | open a popup for searching in the current page                                                     | `/`                |\n| `BrowseUserPlaylists`           | open a popup for browsing user's playlists                                                         | `u p`              |\n| `BrowseUserFollowedArtists`     | open a popup for browsing user's followed artists                                                  | `u a`              |\n| `BrowseUserSavedAlbums`         | open a popup for browsing user's saved albums                                                      | `u A`              |\n| `CurrentlyPlayingContextPage`   | go to the currently playing context page                                                           | `g space`          |\n| `TopTrackPage`                  | go to the user top track page                                                                      | `g t`              |\n| `RecentlyPlayedTrackPage`       | go to the user recently played track page                                                          | `g r`              |\n| `LikedTrackPage`                | go to the user liked track page                                                                    | `g y`              |\n| `LyricsPage`                    | go to the lyrics page of the current track                                                         | `g L`, `l`         |\n| `LibraryPage`                   | go to the user library page                                                                        | `g l`              |\n| `SearchPage`                    | go to the search page                                                                              | `g s`              |\n| `BrowsePage`                    | go to the browse page                                                                              | `g b`              |\n| `Queue`                         | go to the queue page                                                                               | `z`                |\n| `OpenCommandHelp`               | go to the command help page                                                                        | `?`, `C-h`         |\n| `PreviousPage`                  | go to the previous page                                                                            | `backspace`, `C-q` |\n| `OpenSpotifyLinkFromClipboard`  | open a Spotify link from clipboard                                                                 | `O`                |\n| `SortTrackByTitle`              | sort the track table (if any) by track's title                                                     | `s t`              |\n| `SortTrackByArtists`            | sort the track table (if any) by track's artists                                                   | `s a`              |\n| `SortTrackByAlbum`              | sort the track table (if any) by track's album                                                     | `s A`              |\n| `SortTrackByAddedDate`          | sort the track table (if any) by track's added date                                                | `s D`              |\n| `SortTrackByDuration`           | sort the track table (if any) by track's duration                                                  | `s d`              |\n| `SortLibraryAlphabetically`     | sort the library alphabetically                                                                    | `s l a`            |\n| `SortLibraryByRecent`           | sort the library (playlists and albums) by recently added items                                    | `s l r`            |\n| `ReverseOrder`                  | reverse the order of the track table (if any)                                                      | `s r`              |\n| `MovePlaylistItemUp`            | move playlist item up one position                                                                 | `C-k`              |\n| `MovePlaylistItemDown`          | move playlist item down one position                                                               | `C-j`              |\n| `CreatePlaylist`                | create a new playlist                                                                              | `N`                |\n| `JumpToCurrentTrackInContext`   | jump to the current track in the context                                                           | `g c`              |\n| `JumpToHighlightTrackInContext` | jump to the currently highlighted search result in the context                                     | `C-g`              |\n\nTo add or modify shortcuts, see the [keymaps section](https://github.com/aome510/spotify-player/blob/master/docs/config.md#keymaps).\n\n### Actions\n\nNot all actions are available for every Spotify item. To see available actions, use `ShowActionsOnCurrentTrack` or `ShowActionsOnSelectedItem`, then press enter to trigger the action. Some actions may not appear in the popup but can be bound to shortcuts.\n\nList of available actions:\n\n- `GoToArtist`\n- `GoToAlbum`\n- `GoToRadio`\n- `AddToLibrary`\n- `AddToPlaylist`\n- `AddToQueue`\n- `AddToLiked`\n- `DeleteFromLiked`\n- `DeleteFromLibrary`\n- `DeleteFromPlaylist`\n- `ShowActionsOnAlbum`\n- `ShowActionsOnArtist`\n- `ShowActionsOnShow`\n- `ToggleLiked`\n- `CopyLink`\n- `Follow`\n- `Unfollow`\n\nActions can also be bound to shortcuts. To add new shortcuts, see the [actions section](https://github.com/aome510/spotify-player/blob/master/docs/config.md#actions).\n\n### Search Page\n\nWhen entering the search page, focus is on the search input. Enter text, use `backspace` to delete, and `enter` to search.\n\nTo move focus from the search input to other windows (track results, album results, etc.), use `FocusNextWindow` or `FocusPreviousWindow`.\n\n## Configurations\n\nBy default, configuration files are located in `$HOME/.config/spotify-player`. Change this with `-c \u003cFOLDER_PATH\u003e` or `--config-folder \u003cFOLDER_PATH\u003e`.\n\nIf no configuration file is found, one will be created with default values.\n\nSee [configuration documentation](https://github.com/aome510/spotify-player/blob/master/docs/config.md) for details on available options.\n\n## Caches\n\nBy default, cache files are stored in `$HOME/.cache/spotify-player` (logs, credentials, audio cache, etc.). Change this with `-C \u003cFOLDER_PATH\u003e` or `--cache-folder \u003cFOLDER_PATH\u003e`.\n\n### Logging\n\nLogs are stored in `$APP_CACHE_FOLDER/spotify-player-*.log`. For debugging or issues, check the backtrace file in `$APP_CACHE_FOLDER/spotify-player-*.backtrace`.\n\nSet the `RUST_LOG` environment variable to control [logging level](https://docs.rs/log/0.4.14/log/enum.Level.html). Default is `spotify_player=INFO`.\n\n## Acknowledgement\n\n`spotify_player` is written in [Rust](https://www.rust-lang.org) and built on top of libraries like [ratatui](https://github.com/ratatui/ratatui), [rspotify](https://github.com/ramsayleung/rspotify), [librespot](https://github.com/librespot-org/librespot), and more. It is inspired by [spotify-tui](https://github.com/Rigellute/spotify-tui) and [ncspot](https://github.com/hrkfdn/ncspot).\n","funding_links":[],"categories":["Rust","Applications","Terminal","Table of Contents","Awesome Tools","💻 Apps","\u003ca name=\"music\"\u003e\u003c/a\u003eSound and music"],"sub_categories":["Audio and Music","Apps and Tools","Audio Player","Terminal Tools","🎼 Music and Media"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faome510%2Fspotify-player","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faome510%2Fspotify-player","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faome510%2Fspotify-player/lists"}