A Spotify downloader written in rust, which does not require a premium account

Overview

DownOnSpot

A Spotify downloader written in Rust

drawing

Build project Codacy Badge GitHub license GitHub issues GitHub forks GitHub stars Stability: Experimental

Disclaimer

DownOnSpot was not developed for piracy.
It is meant to be used in compliance with DMCA, Section 1201, for educational, private and fair use.
I am not responsible in any way for the usage of the source code.

Features

  • Works with free Spotify accounts (if using free-librespot fork)
  • Download 96, 160kbit/s audio with a free, 256 and 320 kbit/s audio with a premium account from Spotify, directly
  • Multi-threaded
  • Download tracks, playlists, albums and artists
  • Convert to mp3
  • Metadata tagging
  • Simple usage over CLI

Building

Clone the repository using git and change to the local repository directory:

git clone https://github.com/oSumAtrIX/DownOnSpot.git
cd DownOnSpot

A private ssh key is needed to use free Spotify accounts. Follow this answer by DopeGhoti on stackexchange.com on how to set up ssh with the required private key. A sample ~/.ssh/config file could look like this:

Host github.com
  IdentityFile ~/.ssh/free_librespot_private_key

If you do not want to use free-librespot, then remove the git dependency of free-librespot. For that, delete git = "ssh://[email protected]/oSumAtrIX/free-librespot.git" inside Cargo.toml.

Nightly Rust is required to build this project. Install it by following rustup.rs instructions.

cargo build --release

If you get a linker error, you might need to download the standard libmp3lame library.

Usage/ Examples

Running DownOnSpot once will create the default configuration file in the same directory as your shell.

$ down_on_spot.exe
Settings could not be loaded, because of the following error: IO: NotFound No such file or directory. (os error 2)...
..but default settings have been created successfully. Edit them and run the program again.

$ down_on_spot.exe
Usage:
down_on_spot.exe (track_url | album_url | playlist_url | artist_url)

Template variables

Following variables are available for path and filename_template in the settings.json:

  • %0disc%
  • %0track%
  • %album%
  • %albumArtist%
  • %albumArtists%
  • %artist%
  • %disc%
  • %id%
  • %title%
  • %track%

Known issues

  • Downloads often slow
  • Downloads fail sometimes due to channel error

Authors

License

GPL3

Comments
  • My settings file isn't working. What do I change in here?

    My settings file isn't working. What do I change in here?

    DownOnSpot doesn't work with my settings, can you please fix what's wrong and add to what exactly you should put in the settings file on the README?

    settings.txt

    elaboration needed question not an issue 
    opened by Rekulous 14
  • Cannot Build Application [invalid number of arguments]

    Cannot Build Application [invalid number of arguments]

    To Reproduce Steps to reproduce the behavior: clone repo, cd into repo, install rust-nightly, edit toml, install visual studio and c++ dependencies, Attempt to build.

    Screenshots image image

    Desktop (please complete the following information):

    • OS: Win10
    opened by ohitstom 5
  • Allow Building without mp3 support

    Allow Building without mp3 support

    Is your feature request related to a problem? Please describe. Installing the libmp3lame dependency on macOS looks annoying, and I don't plan on using the mp3 feature anyway, so it'd be nice to not include it in the build process.

    Describe the solution you'd like An option to build without mp3 conversion support, excluding mp3lame

    feature request 
    opened by DavidBuchanan314 5
  • Audio Key Error

    Audio Key Error

    The program exits without downloading anything, giving the message "Audio Key Error"

    image

    It doesn't matter if I give a track link or if I use the search function. My config file is identical to the one automatically generated, except for the account credentials (free account) and client_id and client_secret. I also tried to create a new Spotify App from the dashboard and using different client credentials but the issue persists.

    elaboration needed 
    opened by Puncia 4
  • Does not compile on macOS 12

    Does not compile on macOS 12

    Describe the bug 7 errors trying to build the application with cargo build --release

    To Reproduce Steps to reproduce the behavior:

    cargo build --release

    Compiling down_on_spot v0.2.2 (/Users/tom/workspace/DownOnSpot) error[E0308]: mismatched types --> src/spotify.rs:34:25 | 34 | Some(Cache::new(Some(Path::new("credentials_cache")), None, None, None).unwrap()), | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected u64, found &std::path::Path | | | arguments to this enum variant are incorrect | note: tuple variant defined here

    error[E0061]: this function takes 3 arguments but 4 arguments were supplied --> src/spotify.rs:34:9 | 34 | Some(Cache::new(Some(Path::new("credentials_cache")), None, None, None).unwrap()), | ^^^^^^^^^^ ---- argument of type std::option::Option<_> unexpected | note: associated function defined here --> /Users/tom/.cargo/registry/src/github.com-1ecc6299db9ec823/librespot-core-0.3.1/src/cache.rs:240:12 | 240 | pub fn new<P: AsRef>( | ^^^ help: remove the extra argument | 34 | Some(Cache::new(Some(Path::new("credentials_cache")), None, None).unwrap()), | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    error[E0061]: this function takes 3 arguments but 4 arguments were supplied --> src/spotify.rs:31:22 | 31 | let (session, _) = Session::connect( | ^^^^^^^^^^^^^^^^ ... 35 | true, | ---- argument of type bool unexpected | note: associated function defined here --> /Users/tom/.cargo/registry/src/github.com-1ecc6299db9ec823/librespot-core-0.3.1/src/session.rs:65:18 | 65 | pub async fn connect( | ^^^^^^^ help: remove the extra argument | 31 | let (session, _) = Session::connect(SessionConfig::default(), credentials, Some(Cache::new(Some(Path::new("credentials_cache")), None, None, None).unwrap())) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    error[E0308]: mismatched types --> src/spotify.rs:31:7 | 31 | let (session, ) = Session::connect( | ___________^^^^^^^^^^^^- | | | | | expected struct Session, found tuple 32 | | SessionConfig::default(), 33 | | credentials, 34 | | Some(Cache::new(Some(Path::new("credentials_cache")), None, None, None).unwrap()), 35 | | true, 36 | | ) 37 | | .await?; | |_______________- this expression has type Session | = note: expected struct Session found tuple (_, _)

    error[E0599]: no method named unwrap found for struct std::string::String in the current scope --> src/downloader.rs:507:52 | 507 | info!("{} Using {:?} format.", id.to_base62().unwrap(), format); | ^^^^^^ method not found in std::string::String

    error[E0599]: no method named unwrap found for struct std::string::String in the current scope --> src/downloader.rs:518:53 | 518 | warn!("{} Falling back to: {:?}", id.to_base62().unwrap(), quality); | ^^^^^^ method not found in std::string::String

    error[E0599]: no method named unwrap found for struct std::string::String in the current scope --> src/downloader.rs:576:54 | 576 | info!("Done downloading: {}", track.id.to_base62().unwrap()); | ^^^^^^ method not found in std::string::String

    Some errors have detailed explanations: E0061, E0308, E0599. For more information about an error, try rustc --explain E0061. error: could not compile down_on_spot due to 7 previous errors

    Expected behavior Expected DownOnSpot.exe to be compiled

    Screenshots If applicable, add screenshots to help explain your problem.

    Desktop (please complete the following information):

    • OS: macOS 12

    Additional context Using: cargo --version
    cargo 1.64.0-nightly (c0bbd42ce 2022-07-03)

    Added librespot = "0.3.1" in the Cargo.toml file

    opened by tom-schaek 3
  • Support downloading only specific artist album categories

    Support downloading only specific artist album categories

    Hey, is it possibly to download only specific albums from an artist page, for example: https://open.spotify.com/artist/6soJo0dtX31T30OxtS4A39/discography/album Without downloading singles, features, compilations, etc.

    Regards Jonas

    question 
    opened by onny 3
  • fails to build with librespot 0.4.1

    fails to build with librespot 0.4.1

    Describe the bug Latest git master appears to fail to build with librespot 0.4.1:

    [...]
         Running `rustc --crate-name down_on_spot --edition=2018 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C opt-level=z -C panic=abort -C lto -C codegen-units=1 -C metadata=aa39fab80418720c -C extra-filename=-aa39fab80418720c --out-dir /var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps -C strip=symbols -L dependency=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps --extern aspotify=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libaspotify-3d852b42ac3c0fd5.rlib --extern async_std=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libasync_std-584bfecd61e96e9b.rlib --extern async_stream=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libasync_stream-13b28bb4a41a6f4e.rlib --extern chrono=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libchrono-b6bcec46be8af3fe.rlib --extern clap=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libclap-03d30cccd0fdd37b.rlib --extern colored=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libcolored-be2e0a4e74392096.rlib --extern dirs=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libdirs-c25871509c978ea6.rlib --extern futures=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libfutures-c75800f9d5c398ca.rlib --extern id3=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libid3-8763aa4b1a4aac36.rlib --extern lame=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liblame-fd027a582b23205f.rlib --extern lewton=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liblewton-063eb5229c29146f.rlib --extern librespot=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liblibrespot-f16cb0bc6570ea88.rlib --extern log=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liblog-bcec5e812547e20c.rlib --extern oggvorbismeta=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liboggvorbismeta-5c8c13f15f02c049.rlib --extern protobuf=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libprotobuf-cd6754c7a9ae51f8.rlib --extern reqwest=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libreqwest-64c6a387a59d8d54.rlib --extern sanitize_filename=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libsanitize_filename-4bb7e209f20c5bb6.rlib --extern serde=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libserde-9c6bbe49fcef0f4d.rlib --extern serde_json=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libserde_json-c6b6feb44f3fe8b6.rlib --extern tokio=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libtokio-ce317e2ef4916b06.rlib --extern url=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liburl-cadf23cdef707d32.rlib -L native=/usr/x86_64-pc-linux-gnu/lib`
    error[E0061]: this function takes 4 arguments but 3 arguments were supplied
      --> src/spotify.rs:29:17
       |
    29 |         let session = Session::connect(SessionConfig::default(), credentials, None).await?;
       |                       ^^^^^^^^^^^^^^^^ ------------------------  -----------  ---- supplied 3 arguments
       |                       |
       |                       expected 4 arguments
       |
    note: associated function defined here
      --> /var/cache/paludis/distfiles/cargo-home/registry/src/github.com-1ecc6299db9ec823/librespot-core-0.4.1/src/session.rs:65:18
       |
    65 |     pub async fn connect(
       |                  ^^^^^^^
    
    error[E0308]: mismatched types
      --> src/spotify.rs:37:16
       |
    37 |         Ok(Spotify { session, spotify })
       |                      ^^^^^^^ expected struct `Session`, found tuple
       |
       = note: expected struct `Session`
                   found tuple `(Session, Credentials)`
    
    error[E0277]: `Result<std::string::String, FromUtf8Error>` doesn't implement `std::fmt::Display`
       --> src/downloader.rs:507:37
        |
    507 |                     info!("{} Using {:?} format.", id.to_base62(), format);
        |                                                    ^^^^^^^^^^^^^^ `Result<std::string::String, FromUtf8Error>` cannot be formatted with the default formatter
        |
        = help: the trait `std::fmt::Display` is not implemented for `Result<std::string::String, FromUtf8Error>`
        = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
        = note: this error originates in the macro `format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
    
    error[E0277]: `Result<std::string::String, FromUtf8Error>` doesn't implement `std::fmt::Display`
       --> src/downloader.rs:518:38
        |
    518 |             warn!("{} Falling back to: {:?}", id.to_base62(), quality);
        |                                               ^^^^^^^^^^^^^^ `Result<std::string::String, FromUtf8Error>` cannot be formatted with the default formatter
        |
        = help: the trait `std::fmt::Display` is not implemented for `Result<std::string::String, FromUtf8Error>`
        = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
        = note: this error originates in the macro `format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
    
    error[E0277]: `Result<std::string::String, FromUtf8Error>` doesn't implement `std::fmt::Display`
       --> src/downloader.rs:576:33
        |
    576 |         info!("Done downloading: {}", track.id.to_base62());
        |                                       ^^^^^^^^^^^^^^^^^^^^ `Result<std::string::String, FromUtf8Error>` cannot be formatted with the default formatter
        |
        = help: the trait `std::fmt::Display` is not implemented for `Result<std::string::String, FromUtf8Error>`
        = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
        = note: this error originates in the macro `format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
    
    Some errors have detailed explanations: E0061, E0277, E0308.
    For more information about an error, try `rustc --explain E0061`.
    error: could not compile `down_on_spot` due to 5 previous errors
    
    Caused by:
      process didn't exit successfully: `rustc --crate-name down_on_spot --edition=2018 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C opt-level=z -C panic=abort -C lto -C codegen-units=1 -C metadata=aa39fab80418720c -C extra-filename=-aa39fab80418720c --out-dir /var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps -C strip=symbols -L dependency=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps --extern aspotify=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libaspotify-3d852b42ac3c0fd5.rlib --extern async_std=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libasync_std-584bfecd61e96e9b.rlib --extern async_stream=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libasync_stream-13b28bb4a41a6f4e.rlib --extern chrono=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libchrono-b6bcec46be8af3fe.rlib --extern clap=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libclap-03d30cccd0fdd37b.rlib --extern colored=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libcolored-be2e0a4e74392096.rlib --extern dirs=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libdirs-c25871509c978ea6.rlib --extern futures=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libfutures-c75800f9d5c398ca.rlib --extern id3=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libid3-8763aa4b1a4aac36.rlib --extern lame=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liblame-fd027a582b23205f.rlib --extern lewton=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liblewton-063eb5229c29146f.rlib --extern librespot=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liblibrespot-f16cb0bc6570ea88.rlib --extern log=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liblog-bcec5e812547e20c.rlib --extern oggvorbismeta=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liboggvorbismeta-5c8c13f15f02c049.rlib --extern protobuf=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libprotobuf-cd6754c7a9ae51f8.rlib --extern reqwest=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libreqwest-64c6a387a59d8d54.rlib --extern sanitize_filename=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libsanitize_filename-4bb7e209f20c5bb6.rlib --extern serde=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libserde-9c6bbe49fcef0f4d.rlib --extern serde_json=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libserde_json-c6b6feb44f3fe8b6.rlib --extern tokio=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/libtokio-ce317e2ef4916b06.rlib --extern url=/var/tmp/paludis/build/dev-rust-down_on_spot-0.2.0/work/DownOnSpot-cad94d74e9ebd2a926c9d0ece6f43fed14da0d16/target/release/deps/liburl-cadf23cdef707d32.rlib -L native=/usr/x86_64-pc-linux-gnu/lib` (exit status: 1)
    

    To Reproduce Steps to reproduce the behavior:

    1. Clone project
    2. Edit Cargo.toml to use librespot 0.4.1
    3. Try to build
    4. See error

    Expected behavior Allow to build with latest librespot release 0.4.1, using 0.3.1 instead works well though.

    Desktop (please complete the following information):

    • OS: Linux

    Additional context

    bug 
    opened by tgurr 2
  • Unable to build project

    Unable to build project

    Describe the bug Attempting to build but encounter issue with steam-cipher version within crates.io

    $ cargo build --release
        Updating crates.io index
    error: failed to select a version for the requirement `stream-cipher = "^0.3"`
    candidate versions found which didn't match: 0.99.99, 0.7.1, 0.6.0, ...
    location searched: crates.io index
    required by package `aes-ctr v0.3.0`
        ... which satisfies dependency `aes-ctr = "^0.3"` of package `librespot-audio v0.1.5`
        ... which satisfies dependency `librespot-audio = "^0.1.5"` of package `librespot v0.1.5`
        ... which satisfies dependency `librespot = "^0.1.5"` of package `down_on_spot v0.2.0 
    

    To Reproduce Steps to reproduce the behavior:

    Using Rust cargo 1.62.0-nightly (f63f23ff1 2022-04-28) Have Spotify Premium so removed free-librespot line and set to librespot = "0.1.5" in cargo.toml Run cargo build --release in Git Bash dir containing clone of DownOnSpot

    Expected behavior Expected down_on_spot.exe to compile successfully so I can set config for spotify account and try downloading a playlist.

    Screenshots Error output added above

    Desktop (please complete the following information):

    • OS: Windows 10

    Additional context Not sure whether there's additional config I've missed or if this is someting inherant with newer versions of rust Hopefully I've not missed any additional info needed.

    not an issue 
    opened by darw00d 2
  • Program exits without downloading files.

    Program exits without downloading files.

    Describe the bug Program exists without downloading music and without any error/indication of something going wrong

    Expected behavior Downloading of files should start

    Screenshots image

    Desktop (please complete the following information):

    • OS: Windows 10

    Additional context Adding a debug option should be helpful for future issues

    not an issue 
    opened by Devansh-bit 2
  • Template variables in path not being replaced with their values

    Template variables in path not being replaced with their values

    Basically the title. Setting the path as C:/Users/[user]/Downloads/%albumArtist%/%album%, for example, creates two folders, literally named "%albumArtist%" and "%album%".

    Your README mentions that template variables are available in the path. Or am I using it wrong?

    question issue 
    opened by aczw 2
  • Can't figure out how to access `free-librespot`

    Can't figure out how to access `free-librespot`

    Describe the bug I've been scratching my head over this for over a week but can't seem to successfully access your free-librespot git. I've tried following different YouTube videos, created SSH key from GitHub but still unsuccessful.

    To Reproduce Steps I've tried so far:

    1. ssh-keygen -t rsa -C "hammadXP" (Filename: Default, Passphrase: Empty)
    2. cd /d ".ssh"
    3. start-ssh-agent
    4. Then created new SSH key on GitHub: Key type: Authentication Key (Default), Key: contents of id_rsa.pub file
    5. Then tried running git clone "ssh://[email protected]/oSumAtrIX/free-librespot.git" and still got the ERROR: Repository not found.

    Expected behavior The free-librespot git repository should be accessible with the SSH Key.

    Desktop (please complete the following information):

    • OS: Windows 11

    Additional context I can use your app with temporary premium subscription because I'm a free user, but if a free way is available, I would like to take it. I know this issue has been opened at least two times but you just answer with looking at the readme but that doesn't help mush. Can you please try giving the procedure yourself and also if the git is actually not down. Thanks 🙂

    opened by hammadxp 1
  • Project depends on the GitHub repository that doesn't exist

    Project depends on the GitHub repository that doesn't exist

    Describe the bug This line points to the project that doesn't exist: DownOnSpot/Cargo.toml:librespot = { git = "ssh://[email protected]/oSumAtrIX/free-librespot.git" }

    opened by yurivict 1
  • Template for track order in playlist

    Template for track order in playlist

    I'm trying to download a spotify playlist for my music class. I really need to include the playlist # in the filename, because we study the pieces inside chronologically, but I can't find a template for it. So far I've tried %0track% and %track%, but it seems to be track number of the album the piece is in, not of the playlist.

    Describe the solution you'd like A new template for the playlist number of the piece.

    enhancement 
    opened by sclsj 5
  • Convert to rspotify and add podcast support

    Convert to rspotify and add podcast support

    Is your feature request related to a problem? Please describe. I want to download podcast episodes, but with aspotify this doesn't seem possible. As the lib is deprecated and rspotify provides the same functionality plus a lot more it would be better to use rspotify instead.

    Describe the solution you'd like Use rspotify instead of aspotify

    Thank you guys and keep up the awesome work!

    feature request 
    opened by dominicrico 0
  • Support release year template variable

    Support release year template variable

    Is your feature request related to a problem? Please describe.

    I'd like to be consistent with my existing media library naming scheme. The only missing part is that DownOnSpot doesn't provide the relase year of an album as template variable (i.e. 2016)

    Describe the solution you'd like

    DownOnSpot should provide a template variable (i.e. %albumYear%).

    enhancement 
    opened by varac 1
  • sanitize_filename used incorrectly

    sanitize_filename used incorrectly

    Describe the bug Using sanitize_filename::sanitize with default options possibly truncates some parts of the track filename. However, the final assembled filename is not truncated at all, which may exceed file name limits of some filesystems (e.g. utf 8 - Is the Ext3 filename limited to 255 symbols or 255 bytes? - Server Fault

    To Reproduce Steps to reproduce the behavior:

    1. Set the filename_template to %0track% %artist% - %title% - %title% - %title% - %title%

      "filename_template": "%0track% %artist% - %title% - %title% - %title% - %title%",
      
    2. Run

      down_on_spot spotify:track:1JTU0397lTr8kM4ghhG0Cf
      
    3. Observe IO: InvalidFilename File name too long (os error 36)

      Settings successfully loaded.
      Continuing with spotify account: [email protected]
      Login succeeded.
      Preparing...       | Track 1 - Die Dritte Macht - Perry Rhodan - Silber Edition 1
      
      Elapsed second(s): 0
      IO: InvalidFilename File name too long (os error 36) | Track 1 - Die Dritte Macht - Perry Rhodan - Silber Edition 1
      Finished download(s) in 4 second(s).
      

    Expected behavior Applying sanitize to each component of the assembled track title path (including the extension!) instead of arbitrary tags gives a better result.

    For example, in Python the applicable algorithm would be (sorry, I don't speak Rust):

    path = "/".join((sanitize(_p) for _p in path.split("/")))
    

    Desktop (please complete the following information):

    • OS: GNU/Linux Ubuntu 10.04
    bug 
    opened by wolfmanx 0
Owner
oSumAtrIX
19 yrs. old hyper-enthusiastic full time blockhead, who had the great idea to study computer science.
oSumAtrIX
ncspot is a ncurses Spotify client written in Rust using librespot.

ncspot is a ncurses Spotify client written in Rust using librespot. It is heavily inspired by ncurses MPD clients, such as ncmpc. My motivation was to provide a simple and resource friendly alternative to the official client as well as to support platforms that currently don't have a Spotify client, such as the *BSDs.

Henrik Friedrichsen 3.4k Jan 8, 2023
Gtk/Rust native Spotify client for the GNOME desktop.

Gtk/Rust native Spotify client for the GNOME desktop.

Alexandre Trendel 1.7k Jan 1, 2023
A spotify daemon

Spotifyd An open source Spotify client running as a UNIX daemon. Spotifyd streams music just like the official client, but is more lightweight and sup

null 8.4k Dec 31, 2022
🎧 a self-hosted Spotify → Discord music bot

Aoede is a Discord music bot that directly streams from Spotify to Discord. The only interface is Spotify itself. Note: a Spotify Premium account is c

Max Isom 159 Dec 29, 2022
Psst - Fast and multi-platform Spotify client with native GUI

Psst Fast Spotify client with native GUI, without Electron, built in Rust. Very early in development, lacking in features, stability, and general user

Jan Pochyla 7.2k Jan 2, 2023
code to connect + communicate with a Spotify Car Thing

spotify_carthing_bt A grab-bag of spotify car thing related hacks I'm working on. deskthing-rs A Rust port of https://github.com/relative/deskthing, w

Daniel Prilik 6 Dec 19, 2022
Effortlessly beautify your Spotify playlists with just a single, enchanting script 💫 🎵

harmonia harmonia, effortlessly beautify your Spotify playlists with just a single, enchanting script. ?? ?? HANDLE WITH LOVE: Since harmonia is bloss

Gülce 4 Jun 23, 2023
A command line application to organize Spotify playlists.

Sortify A command line application to organize Spotify playlists. Using Sortify, you can choose a playlist as the source playlist, and then have the o

Francisco Cunha 4 Aug 14, 2024
Minimalist multi-track audio recorder which may be controlled via OSC or MIDI.

smrec Minimalist multi-track audio recorder which may be controlled via OSC or MIDI. I did this because I needed a simple multi-track audio recorder w

Ali Somay 18 Oct 22, 2023
A music theory guide written in Rust.

Rust Music Theory A library and executable that provides programmatic implementation of the basis of the music theory. Table of Contents Overview Usag

Ozan Kaşıkçı 551 Dec 21, 2022
musify is a simple discord bot to play music within a voice channel, written in the rust programming language.

musify-rs musify is a simple discord bot to play music within a voice channel, written in the rust programming language. Features A simple song queue

NV6 5 Aug 14, 2022
Terminal Music Player written in Rust

Terminal Music Player written in Rust Listen to music freely as both in freedom and free of charge! Freedom: As time goes by, online service providers

null 376 Jan 3, 2023
Loopers is graphical live looper, written in Rust, designed for ease of use and rock-solid stability

Loopers Loopers is a graphical live looper, written in Rust, designed for ease of use and rock-solid stability. It can be used as a practice tool, com

Micah Wylde 81 Dec 29, 2022
Synthesizer IO - a synthesizer written in Rust.

Synthesizer IO Hopefully, this will become a synthesizer written in Rust. At the moment, it's experimental bits of technology toward that end. Running

Raph Levien 278 Dec 13, 2022
A drum machine written in Rust

rudiments rudiments is a step-sequencing drum machine that plays rhythm patterns using audio samples. Features 16-step programmable measures. Configur

Jonas Michel 141 Nov 23, 2022
VST2 frequency modulation synthesizer written in Rust

OctaSine VST2 frequency modulation synthesizer written in Rust. Official website with downloads OctaSine.com Audio examples SoundCloud Screenshots Lig

Joakim Frostegård 412 Dec 30, 2022
🎵 A super simple VST written in Rust

DigiDist This is a simple little VST plugin, developed in Rust using the vst2 crate. It doesn't sound particularly great, but it demonstrates just how

Joe Clay 34 May 29, 2022
A simple GUI audio player written in Rust with egui. Inspired by foobar2000.

Music Player A simple GUI music player inspired by foobar2000 written in Rust using egui. The goal of this project is to learn about making gui/ nativ

Ryan Blecher 5 Sep 16, 2022
Small music theory library with MIDI capabilities written in Rust

mumuse Small music theory library with MIDI capabilities written in Rust (wip). Examples Creating notes and transpositions // Declare Note from &str l

Alexis LOUIS 4 Jul 27, 2022