Giter Club home page Giter Club logo

slsk-batchdl's Introduction

slsk-batchdl

An automatic downloader for Soulseek built with Soulseek.NET. Accepts CSV files as well as Spotify and YouTube urls.
See the examples.

Index

Options

Usage: sldl <input> [OPTIONS]

  Required Arguments
    <input>                        A url, search string, or path to a local CSV file.
                                   Run --help "input" to view the accepted inputs.
                                   Can also be passed with -i, --input <input>
    --user <username>              Soulseek username
    --pass <password>              Soulseek password
  General Options
    -p, --path <path>              Download directory
    --input-type <type>            [csv|youtube|spotify|bandcamp|string|list]
    --name-format <format>         Name format for downloaded tracks. See --help name-format
        
    -n, --number <maxtracks>       Download the first n tracks of a playlist
    -o, --offset <offset>          Skip a specified number of tracks
    -r, --reverse                  Download tracks in reverse order
    -c, --config <path>            Set config file location. Set to 'none' to ignore config
    --profile <names>              Configuration profile(s) to use. See --help ""config"".
    --concurrent-downloads <num>   Max concurrent downloads (default: 2)
    --m3u <option>                 Create an m3u8 playlist file in the output directory
                                   'none' (default for string inputs): Do not create 
                                   'index' (default): Write a single line for sldl to index 
                                   all downloaded files, required for skip-existing=m3u
                                   'all': Write the index and a list of paths and fails
    --m3u-path <path>              Override default m3u path
        
    -s, --skip-existing            Skip if a track matching file conditions is found in the
                                   output folder or your music library (if provided)
    --skip-mode <mode>             [name|tag|m3u|name-cond|tag-cond|m3u-cond]
                                   See --help ""skip-existing"".
    --music-dir <path>             Specify to also skip downloading tracks found in a music
                                   library. Use with --skip-existing
    --skip-not-found               Skip searching for tracks that weren't found on Soulseek
                                   during the last run. Fails are read from the m3u file.
    --skip-existing-pref-cond      Use preferred instead of necessary conds for skip-existing    
        
    --listen-port <port>           Port for incoming connections (default: 49998)
    --on-complete <command>        Run a command whenever a file is downloaded.
                                   Available placeholders: {path} (local save path), {title},
                                   {artist},{album},{uri},{length},{failure-reason},{state}.
                                   Prepend a state number to only download in specific cases:
                                   1:, 2:, 3:, 4: for the Downloaded, Failed, Exists, and
                                   NotFoundLastTime states respectively. 
                                   E.g: '1:<cmd>' will only run the command if the file is
                                   downloaded successfully. Prepend 's:' to use the system
                                   shell to execute the command.

    --print <option>               Print tracks or search results instead of downloading:
                                   'tracks': Print all tracks to be downloaded
                                   'tracks-full': Print extended information about all tracks
                                   'results': Print search results satisfying file conditions
                                   'results-full': Print search results including full paths
    --no-progress                  Disable progress bars/percentages, only simple printing
    --debug                        Print extra debug info
  Searching
    --fast-search                  Begin downloading as soon as a file satisfying the preferred
                                   conditions is found. Only for normal download mode.
    --remove-ft                    Remove 'feat.' and everything after before searching
    --no-remove-special-chars      Do not remove special characters before searching
    --remove-brackets              Remove square brackets and their contents before searching
    --regex <regex>                Remove a regexp from all track titles and artist names.
                                   Optionally specify a replacement regex after a semicolon.
                                   Add 'T:', 'A:' or 'L:' at the start to only apply this to
                                   the track title, artist, or album respectively.
    --artist-maybe-wrong           Performs an additional search without the artist name.
                                   Useful for sources like SoundCloud where the "artist"
                                   could just be an uploader. Note that when downloading a
                                   YouTube playlist via url, this option is set automatically
                                   on a per-track basis, so it is best kept off in that case.
    -d, --desperate                Tries harder to find the desired track by searching for the
                                   artist/album/title only, then filtering. (slower search)
    --fails-to-downrank <num>      Number of fails to downrank a user's shares (default: 1)
    --fails-to-ignore <num>        Number of fails to ban/ignore a user's shares (default: 2)

    --yt-dlp                       Use yt-dlp to download tracks that weren't found on
                                   Soulseek. yt-dlp must be available from the command line.
    --yt-dlp-argument <str>        The command line arguments when running yt-dlp. Default:
                                   "{id}" -f bestaudio/best -cix -o "{savepath}.%(ext)s"
                                   Available vars are: {id}, {savedir}, {savepath} (w/o ext).
                                   Note that with -x, yt-dlp will download webms in case
                                   ffmpeg is unavailable.

    --search-timeout <ms>          Max search time in ms (default: 6000)
    --max-stale-time <ms>          Max download time without progress in ms (default: 50000)
    --searches-per-time <num>      Max searches per time interval. Higher values may cause
                                   30-minute bans, see --help "search". (default: 34)
    --searches-renew-time <sec>    Controls how often available searches are replenished.
                                   See --help "search". (default: 220)
  Spotify
    --spotify-id <id>              Spotify client ID
    --spotify-secret <secret>      Spotify client secret
    --spotify-token <token>        Spotify access token
    --spotify-refresh <token>      Spotify refresh token
    --remove-from-source           Remove downloaded tracks from source playlist
  YouTube
    --youtube-key <key>            Youtube data API key
    --get-deleted                  Attempt to retrieve titles of deleted videos from wayback
                                   machine. Requires yt-dlp.
    --deleted-only                 Only retrieve & download deleted music.
  CSV Files
    --artist-col                   Artist column name
    --title-col                    Track title column name
    --album-col                    Album column name
    --length-col                   Track length column name
    --album-track-count-col        Album track count column name (sets --album-track-count)
    --yt-desc-col                  Youtube description column (improves --yt-parse)
    --yt-id-col                    Youtube video id column (improves --yt-parse)

    --time-format <format>         Time format in Length column of the csv file (e.g h:m:s.ms
                                   for durations like 1:04:35.123). Default: s
    --yt-parse                     Enable if the CSV contains YouTube video titles and channel
                                   names; attempt to parse them into title and artist names.
    --remove-from-source           Remove downloaded tracks from source CSV file
  File Conditions
    --format <formats>             Accepted file format(s), comma-separated, without periods
    --length-tol <sec>             Length tolerance in seconds
    --min-bitrate <rate>           Minimum file bitrate
    --max-bitrate <rate>           Maximum file bitrate
    --min-samplerate <rate>        Minimum file sample rate
    --max-samplerate <rate>        Maximum file sample rate
    --min-bitdepth <depth>         Minimum bit depth
    --max-bitdepth <depth>         Maximum bit depth
    --banned-users <list>          Comma-separated list of users to ignore

    --pref-format <formats>        Preferred file format(s), comma-separated (default: mp3)
    --pref-length-tol <sec>        Preferred length tolerance in seconds (default: 3)
    --pref-min-bitrate <rate>      Preferred minimum bitrate (default: 200)
    --pref-max-bitrate <rate>      Preferred maximum bitrate (default: 2500)
    --pref-min-samplerate <rate>   Preferred minimum sample rate
    --pref-max-samplerate <rate>   Preferred maximum sample rate (default: 48000)
    --pref-min-bitdepth <depth>    Preferred minimum bit depth
    --pref-max-bitdepth <depth>    Preferred maximum bit depth
    --pref-banned-users <list>     Comma-separated list of users to downrank

    --strict-conditions            Skip files with missing properties instead of accepting by
                                   default; if --min-bitrate is set, ignores any files with
                                   unknown bitrate.
  Album Download
    -a, --album                    Album download mode: Download a folder
    -t, --interactive              Interactive mode, allows to select the folder and images
    --album-track-count <num>      Specify the exact number of tracks in the album. Add a + or
                                   - for inequalities, e.g '5+' for five or more tracks.
    --album-art <option>           Retrieve additional images after downloading the album:
                                   'default': No additional images
                                   'largest': Download from the folder with the largest image
                                   'most': Download from the folder containing the most images
    --album-art-only               Only download album art for the provided album
    --no-browse-folder             Do not automatically browse user shares to get all files in
                                   in the folder
    --failed-album-path            Path to move all album files to when one of the items from
                                   the directory fails to download. Set to 'delete' to delete
                                   the files instead. Set to 'disable' keep it where it is.
                                   Default: {configured output dir}/failed
  Aggregate Download
    -g, --aggregate                Aggregate download mode: Find and download all distinct
                                   songs associated with the provided artist, album, or title.
    --aggregate-length-tol <tol>   Max length tolerance in seconds to consider two tracks or
                                   albums equal. (Default: 3)
    --min-shares-aggregate <num>   Minimum number of shares of a track or album for it to be
                                   downloaded in aggregate mode. (Default: 2)
    --relax-filtering              Slightly relax file filtering in aggregate mode to include
                                   more results
  Help
    -h, --help [option]            [all|input|download-modes|search|name-format|
                                   file-conditions|skip-existing|config]
  Notes
    Acronyms of two- and --three-word-flags are also accepted, e.g. --twf. If the option
    contains the word 'max' then the m should be uppercase. 'bitrate', 'sameplerate' and
    'bitdepth' should be all treated as two separate words, e.g --Mbr for --max-bitrate.

    Flags can be explicitly disabled by setting them to false, e.g '--interactive false'

Input types

The input type is usually determined automatically. To force a specific input type, set --input-type [spotify|youtube|csv|string|bandcamp|list]. The following input types are available:

CSV file

Path to a local CSV file: Use a csv file containing track info of the songs to download. The names of the columns should be Artist, Title, Album, Length, although alternative names are usually detected as well. Only the title or album column is required, but extra info may improve search result ranking. Every row that does not have a title column text will be treated as an album download.

YouTube

A playlist url: Download songs from a youtube playlist. The default method to retrieve playlists doesn't always return all videos, especially not the ones which are unavailable. To get all video titles, you can use the official API by providing a key with --youtube-key. Get it here https://console.cloud.google.com. Create a new project, click "Enable Api" and search for "youtube data", then follow the prompts.

Spotify

A playlist/album url or 'spotify-likes': Download a spotify playlist, album, or your liked songs. Credentials are required when downloading a private playlist or liked music.

Using Credentials

Click to expand

Create a Spotify application at https://developer.spotify.com/dashboard/applications with a redirect url http://localhost:48721/callback. Obtain an application ID and secret from the created application dashboard.

Start sldl with the obtained credentials and an authorized action to trigger the Spotify app login flow:

sldl spotify-likes --spotify-id 123456 --spotify-secret 123456 -n 1 --print-tracks

sldl will try to open a browser automatically but will fallback to logging the login flow URL to output. After login flow is complete sldl will output a token and refresh token and finish running the current command.

To skip requiring login flow every time sldl is used the token and refresh token can be provided to sldl (hint: store this info in the config file to make commands less verbose):

sldl spotify-likes --spotify-id 123456 --spotify-secret 123456 --spotify-refresh 123456 --spotify-token 123456 -n 1 --pt

spotify-token access is only valid for 1 hour. spotify-refresh will enable sldl to renew access every time it is run (and can be used without including spotify-token)

Bandcamp

A bandcamp url: Download a single track, an album, or an artist's entire discography. Extracts the artist name, album name and sets --album-track-count="n+", where n is the number of visible tracks on the bandcamp page.

Search string

Name of the track, album, or artist to search for: Can either be any typical search string (like what you would enter into the soulseek search bar), or a comma-separated list of properties like 'title=Song Name, artist=Artist Name, length=215'.

The following properties are accepted:

title
artist
album
length (in seconds)
artist-maybe-wrong
album-track-count

Example inputs and their interpretations:

Input String                            | Artist   | Title    | Album    | Length
---------------------------------------------------------------------------------
'Foo Bar'   (without any hyphens)       |          | Foo Bar  |          |
'Foo - Bar'                             | Foo      | Bar      |          |
'Foo - Bar' (with --album enabled)      | Foo      |          | Bar      |
'Artist - Title, length=42'             | Artist   | Title    |          | 42
'artist=AR, title=T, album=AL'          | AR       | T        | AL       |

List

A path to a text file where each line has the following form:

"some input"                    "conditions"                  "preferred conditions"

e.g:

"artist=Artist, album=Album"    "format=mp3; br > 128"        "br >= 320"

Where "some input" is any of the above input types. The quotes can be omitted if the field contains no spaces. The conditions and preferred conditions fields are added on top of the configured conditions and can also be omitted. List input must be manually activated with --input-type=list.

Download modes

Normal

The program will download a single file for every input entry.

Album

sldl will search for the album and download an entire folder including non-audio files. Activated when the input is a link to a spotify or bandcamp album, when the input string or csv row has no track title, or when -a/--album is enabled.

Aggregate

With -g/--aggregate, sldl performs an ordinary search for the input then attempts to group the results into distinct songs and download one of each kind, starting with the one shared by the most users.
Note that --min-shares-aggregate is 2 by default, which means that songs shared by only one user will be ignored.

Album Aggregate

Activated when both --album and --aggregate are enabled. sldl will group shares and download one of each distinct album, starting with the one shared by the most users. It is recommended to pair this with --interactive.
Note that --min-shares-aggregate is 2 by default, which means that albums shared by only one user will be ignored.

Searching

Search Query

The search query is determined as follows:

  • For album downloads: If the album field is non-empty, search for 'Artist Album'. Otherwise, search for 'Artist Title'
  • For all other download types: If the title field is non-empty, search for 'Artist Title'. Otherwise, search for 'Artist Album'

Soulseek's rate limits

The server will ban you for 30 minutes if too many searches are performed within a short timespan. The program has a search limiter which can be adjusted with --searches-per-time and --searches-renew-time (when the limit is reached, the status of the downloads will be "Waiting"). By default it is configured to allow up to 34 searches every 220 seconds. The default values were determined through experimentation, so they may be incorrect.

Speeding things up

The following options will make it go faster, but may decrease search result quality or cause instability:

  • --fast-search skips waiting until the search completes and downloads as soon as a file matching the preferred conditions is found
  • --concurrent-downloads - set it to 4 or more
  • --max-stale-time is set to 50 seconds by default, so it will wait a long time before giving up on a file
  • --searches-per-time - increase at the risk of bans.

File conditions

Files not satisfying the required conditions will not be downloaded. Files satisfying pref- conditions will be preferred; setting --pref-format "flac,wav" will make it download lossless files if available, and only download lossy files if there's nothing else.

There are no default required conditions. The default preferred conditions are:

pref-format = mp3
pref-length-tol = 3
pref-min-bitrate = 200
pref-max-bitrate = 2500
pref-max-samplerate = 48000
pref-strict-title = true
pref-strict-album = true
pref-accept-no-length = false

sldl will therefore prefer mp3 files with bitrate between 200 and 2500 kbps, and whose length differs from the supplied length by no more than 3 seconds. It will also prefer files whose paths contain the supplied title and album (ignoring case, and bounded by boundary characters) and which have non-null length. Changing the last three preferred conditions is not recommended.
Note that files satisfying a subset of the preferred conditions will still be preferred over files that don't satisfy any condition, but some conditions have precedence over others. For instance, a file that only satisfies strict-title (if enabled) will always be preferred over a file that only satisfies the format condition. Run with --print "results-full" to reveal the sorting logic.

Conditions can also be supplied as a semicolon-delimited string with --cond and --pref, e.g --cond "br >= 320; format = mp3,ogg; sr < 96000".

Filtering irrelevant results

The options --strict-title, --strict-artist and --strict-album will filter any file that does not contain the title/artist/album in the filename (ignoring case, bounded by boundary chars).
Another way to prevent false downloads is to set --length-tol to 3 or less to make it ignore any songs that differ from the input by more than 3 seconds. However, all 4 options are already enabled as 'preferred' conditions by default, meaning that such files will only be downloaded as a last resort anyways. Hence it is only recommended to enable them if you need to minimize false downloads as much as possible, or for special cases like tracks or albums whose name is just one or a two characters.

Important note

Some info may be unavailable depending on the client used by the peer. For example, the standard Soulseek client does not share the file bitrate. If (e.g) --min-bitrate is set, then sldl will still accept any file with unknown bitrate. You can configure it to reject all files where one or more of the checked properties is null (unknown) by enabling --strict-conditions.
As a consequence, if --min-bitrate is also set then any files shared by users with the default client will be ignored. Also note that the default preferred conditions will already affect ranking with this option due to the bitrate and samplerate checks.

Name format

Variables enclosed in {} will be replaced by the corresponding file tag value. Name format supports subdirectories as well as conditional expressions like {tag1|tag2} - If tag1 is null, use tag2. String literals enclosed in parentheses are ignored in the null check.

Examples:

  • "{artist} - {title}"
    Always name it 'Artist - Title'. Because some files on Soulseek are untagged, the following is generally preferred:
  • "{artist( - )title|filename}"
    If artist and title are not null, name it 'Artist - Title', otherwise use the original filename.
  • "{albumartist(/)album(/)track(. )title|(missing-tags/)foldername(/)filename}"
    Sort files into artist/album folders if all tags are present, otherwise put them in the 'missing-tags' folder.

Available variables:

artist                          First artist (from the file tags)
sartist                         Source artist (as on CSV/Spotify/YouTube/etc)
artists                         Artists, joined with '&'
albumartist                     First album artist
albumartists                    Album artists, joined with '&'
title                           Track title
stitle                          Source track title
album                           Album name
salbum                          Source album name
year                            Track year or date
track                           Track number
disc                            Disc number
filename                        Soulseek filename without extension
foldername                      Soulseek folder name
extractor                       Name of the extractor used (CSV/Spotify/YouTube/etc)
default-folder                  Default sldl folder name (usually the playlist name)

Skip-existing

sldl can skip downloads that exist in the output directory or a specified directory configured with --music-dir. The following modes are available for --skip-mode:

m3u

Default when checking in the output directory.
Checks whether the output m3u file contains the track in the '#SLDL' line. Does not check if the audio file exists or satisfies the file conditions (use m3u-cond for that). m3u and m3u-cond are the only modes that can skip album downloads.

name

Default when checking in the music directory.
Compares filenames to the track title and artist name to determine if a track already exists. Specifically, a track will be skipped if there exists a file whose name contains the title and whose full path contains the artist name.

tag

Compares file tags to the track title and artist name. A track is skipped if there is a file whose artist tag contains the track artist and whose title tag equals the track title (ignoring case and ws). Slower than name mode as it needs to read all file tags.

m3u-cond, name-cond, tag-cond

Same as the above modes but also checks whether the found file satisfies the configured conditions. Uses necessary conditions by default, run with --skip-existing-pref-cond to use preferred conditions instead. Equivalent to the above modes if no necessary conditions have been specified (except m3u-cond, which always checks if the file exists). May be slower and use a lot of memory for large libraries.

Configuration

Config Location:

sldl will look for a file named sldl.conf in the following locations:

~/AppData/Roaming/sldl/sldl.conf
~/.config/sldl/sldl.conf

as well as in the directory of the executable.

Syntax:

Example config file:

username = your-username
password = your-password
pref-format = flac
fast-search = true

Lines starting with hashtags (#) will be ignored. Tildes in paths are expanded as the user directory.

Configuration profiles:

Profiles are supported:

[lossless]
pref-format = flac,wav

To activate the above profile, run --profile "lossless". To list all available profiles, run --profile "help".
Profiles can be activated automatically based on a few simple conditions:

[no-stale]
profile-cond = interactive && download-mode == "album"
max-stale-time = 999999
# album downloads will never be automatically cancelled in interactive mode

[youtube]
profile-cond = input-type == "youtube"
path = ~/downloads/sldl-youtube
# download to another location for youtube

The following operators are supported for use in profile-cond: &&, ||, ==, !=, !{bool}.
The following variables are available:

input-type        ("youtube"|"csv"|"string"|"bandcamp"|"spotify")
download-mode     ("normal"|"aggregate"|"album"|"album-aggregate")
interactive       (bool)

Examples

Download tracks from a csv file:

sldl test.csv

Download spotify likes:

sldl spotify-likes

Download a specific song by name, preferring lossless:

sldl "MC MENTAL @ HIS BEST, length=242" --pref-format "flac,wav"

Interactive album download:

sldl "Some Album" --album --interactive

Download the album of every song in a spotify playlist:

sldl https://spotify/playlist/id --album --skip-existing

Retrieve deleted video names, then download from a youtube playlist with fallback to yt-dlp:

sldl https://www.youtube.com/playlist/id --get-deleted --yt-dlp

Print all songs by an artist which are not in your library:

sldl "artist=MC MENTAL" --aggregate --skip-existing --music-dir "path/to/music" --print tracks-full

Download all albums by an artist found on soulseek:

sldl "artist=MC MENTAL" --aggregate --album --interactive

Advanced example: Automatic wishlist downloader

Create a file named wishlist.txt, and add some items as detailed in Input types: List:

echo "title=My Favorite Song, artist=Artist" >> wishlist.txt
echo "album=Album, album-track-count=5" "format=mp3" >> wishlist.txt

Add a profile to your sldl.conf:

[wishlist]
input = wishlist.txt 
input-type = list 
skip-existing = true
skip-mode = m3u
m3u = index 
m3u-path = wishlist-archive.sldl

This will create a global archive file wishlist-archive.sldl which will be scanned every time sldl is run to skip wishlist items that have already been downloaded. You can also use --skip-mode m3u-cond together with --skip-existing-pref-cond and specify some preferred conditions to (e.g) only stop searching for an item once a lossless version is downloaded.
Finally, set up a cron job (or a scheduled task on windows) to periodically run sldl with the following option:

sldl --profile wishlist

Notes

  • For macOS builds you can use publish.sh to build the app. Download dotnet from https://dotnet.microsoft.com/en-us/download/dotnet/6.0, then run chmod +x publish.sh && sh publish.sh. For intel macs, uncomment the x64 and comment the arm64 section in publish.sh.
  • The printed output may appear duplicated, overlap, or not update on some configurations (new windows terminal, git bash). Use another terminal or --no-progress in case of issues.

Docker

A docker container for running sldl can be built from this repository. The image supports linux x86/ARM.

To build and start container:

clone https://github.com/fiso64/slsk-batchdl
cd slsk-batchdl
docker compose up -d

exec into the container to start using sldl:

docker compose exec sldl sh
sldl --help

The compose stack mounts two directories relative to where docker-compose.yml is located which can be used for file management:

  • /config (at ./config on host) - put your sldl.conf configuration in this directory and then use sldl -c /config ... to use your configuration in the container
  • /data (at ./data on host) - use as the download directory IE sldl -p /data ...

File Permissions

If you are running Docker on a Linux Host you should specify user:group permissions of the user who owns the configuration and data directory on the host to avoid docker file permission problems. These can be specified using the environmental variables PUID and PGID.

To get the UID and GID for the current user run these commands from a terminal:

  • id -u -- prints UID
  • id -g -- prints GID

Replace these with the corresponding variable (PUID PGID) in docker-compose.yml.

Cron

One or more sldl commands can be run on a schedule using cron built into the container.

To create a schedule make a new file on the host ./config/crontabs/abc and use it with the standard crontab syntax.

Make sure to restart the container after any changes to the cron file are made.

Example => Run sldl every Sunday at 1am, search for missing tracks from the specified Spotify playlist

# min   hour    day     month   weekday command
0 1 * * 0 sldl https://open.spotify.com/playlist/6sf1WR5grXGJ6dET -c /config -p /data --skip-existing --m3u-path /data/index.sldl"

crontab.guru could be used to help with the scheduling expression.

slsk-batchdl's People

Contributors

fiso64 avatar foxxmd avatar oozone avatar

Stargazers

 avatar Manu avatar Thomas Chester avatar fabiomarastoni avatar  avatar  avatar  avatar  avatar sweet avatar Simon Vadée avatar  avatar  avatar dylan-conlin avatar Brayan Medina avatar  avatar Tawmu avatar  avatar Sam Roberts avatar Razvan Sofian avatar Fabian Schober avatar  avatar  avatar  avatar Yacine avatar  avatar Robert Nicolescu avatar Andrew avatar Stanislav Alexandrov avatar Violet avatar  avatar Mike Keefe avatar Daniel avatar  avatar Bảo Minh Lê avatar Vesnine avatar  avatar  avatar Jan-Willem de Bruyn avatar Fahad Zafar avatar quinn_jh avatar  avatar Md Adyelullahil Mamun avatar Boris Topalov avatar  avatar Salief Lewis avatar  avatar Diego Diaz avatar Hermione avatar branon avatar  avatar Danny Chu avatar MaxGreen avatar  avatar  avatar Hunter avatar  avatar  avatar Ricardo Jesus avatar  avatar zombiegg avatar  avatar  avatar Chehan Ratnasiri avatar AssafHaft avatar SAILON BISPO avatar Moinul Hasan avatar E.V. avatar  avatar  avatar jahway603 avatar rh45 avatar Laurent Le Houerou avatar Alex Yang avatar  avatar  avatar MicMag avatar Cole avatar Shifat Shakhawat avatar Jan Zuiderveld avatar Mushfique Shahriar Aurnab avatar Mehedi Hasan avatar Hossain Al Arik avatar Shahadat Hossain Hridoy  avatar AJM Fajlay Rabby avatar Devin Boodoo avatar João Guilherme Wolf e Conte avatar Mx Chelsea Harding avatar  avatar Maurizio Querzoli avatar  avatar  avatar Owen Fahey avatar Dennis Dyallo avatar  avatar Milan Krcadinac avatar Théis Bazin avatar Tomás Palma avatar Aidan Gibson avatar Mark Turner avatar  avatar

Watchers

 avatar  avatar  avatar Flip van Wijk avatar  avatar  avatar

slsk-batchdl's Issues

Files exists but fail to download

The program is stuck on this user, who don't keep the files private but it fails to download for some reason. Should it try to search from another user? I have added the desperate flag as well

When I tried to manually search and download, I can't download from this user as well so maybe it's something with the connection. However I was able to download them from another user

It'd be nice for the program to do automatically. The only way for it to ignore this user now is to add the user to the banned list. Can you make it retry with another user automatically?

image

image

Readme example sldl.conf crashes with incorrect handling of fast-search arg

Platform: MacOS Intel X64

When I provide sldl with a sldl.conf file in the same directory with the following contents:

username="XYZ"
password="XYZ"
pref-format="flac"
fast-search="true"

I get the following error when I run ./sldl spotify-likes:

Unhandled exception. System.ArgumentException: Invalid argument 'spotify-likes'. Input is already set to 'true'
   at Program.Main(String[] args)
   at Program.<Main>(String[] args)

After some debugging locally this seems to happen because the "true" value from the fast-search argument is being treated as its own argument, which fails to hit anything in the arg parse case statement

I was able to fix this error by changing my fast-search line in my sldl.conf file to

fast-search

i.e no ="true"

I'm not sure whether you'd rather handle booleans differently or just update your Readme but thought I'd leave my investigation here for you to do what you need with it!

--skip-existing downloads a variant of the same track (YouTube playlist)

Many thanks for the build, really great.

When loading a YouTube playlist I'm having an issue where , when --skip-existing flag is added, a search is still carried out for tracks that exist in the output folder (i.e have been downloaded before when the playlist was last loaded).

A new file will be found, with a variation on the original title, and downloaded:

  • 1st load (track doesn't exist in output folder yet): Artist - Title downloads
  • 2nd load (track now exists in output folder): 01. Artist - Title downloads
  • 3rd load (track still exists in output folder): Artist - Title [Catalog #] downloads

What I've tried

  • Including --music-dir with the same path (my output and music folders are the same, for now)
  • Trying with a new output folder

Am I missing something in the config? Does --skip-existing apply only to .csv input?

Thanks in advance

Download failed `m3u` tracks

When performing a batch download occasionally some downloads fail.

We do have the option to pass --m3u fails which will keep track of failed downloads.

This subsequently can be used for future downloads to ignore: --skip-not-found

We can pass --skip-existing which will make best attempt at identifying if a track has already downloaded. However sometimes we experience duplication when this match is not 100%.

It would be great to be able to just pass the m3u (or a csv) of the failed downloads in order to attempt downloading again.
Rather than passing entire playlist again which can result in duplication.

"Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array" ?!!

For some reason any sort of attempt to download or print the tracks from CSV list like this:

slsk-batchdl.exe -i list.csv --config "C:\slsk\slsk-batchdl.conf"

or

slsk-batchdl.exe -i list.csv --print tracks-full

Returns the following error:

Parsing CSV track info Using inferred columns: artist:"Artist", title:"Title". Warning: No duration column found, results may be imprecise Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array. at Program.ParseCsvIntoTrackInfo(String path, String artistCol, String trackCol, String lengthCol, String albumCol, String descCol, String ytIdCol, String timeUnit, Boolean ytParse) at Program.Main(String[] args) at Program.<Main>(String[] args)

My list looks just fine, with Artist and Title column, all entries in the CSV file using " as string delimiter, etc. As in, the list worked just fine in previous versions (before 1.5).

Any idea what's happening?

The releaseCount argument must be greater than zero. (Parameter 'releaseCount') Actual value was 0.

Not sure if this is related to my config or not. I get this at a certain point on 100s of songs after entering spotify-likes as an arg. Other playlists seem to be fine. I made the list into another Playlist and got the same error. Here's my config:

name-format="\{sartist}\{salbum}\{artist} - {title} [{year}]" username="XXXX" password="XXXX" pref-format="flac" fast-search="false" skip-existing="true" path="X:\XXXX\Music\Music\Playlists" spotify-id="XXXX" spotify-secret="XXXXX" remove-from-playlist="false" youtube-key="XXXX" format="flac,wav,m4a,mp3" album-art="largest" concurrent-downloads="3" desperate="true" no-remove-special-chars="true" remove-ft="true" remove-brackets="true" yt-dlp="true"

Here's the full debug error:

Wait for login, state: Connected, LoggedIn
Search and download Parov Stelar - Chambermaid Swing (353s)

Exception thrown: System.ArgumentOutOfRangeException: The releaseCount argument must be greater than zero. (Parameter 'releaseCount')
Actual value was 0.
   at System.Threading.SemaphoreSlim.Release(Int32 releaseCount)
   at RateLimitedSemaphore.TryResetSemaphore()
   at RateLimitedSemaphore.WaitAsync()
   at Program.Search(String search, SearchOptions opts, Action`1 rHandler, CancellationToken ct, Action onSearch)
   at Program.RunSearches(Track track, ConcurrentDictionary`2 results, Func`4 getSearchOptions, Action`1 responseHandler, CancellationToken ct, Action onSearch)
   at Program.SearchAndDownload(Track track)
   at Program.<>c__DisplayClass113_0.<<TracksDownloadNormal>b__0>d.MoveNext()

The releaseCount argument must be greater than zero. (Parameter 'releaseCount')
Actual value was 0.
   at System.Threading.SemaphoreSlim.Release(Int32 releaseCount)
   at RateLimitedSemaphore.TryResetSemaphore()
   at RateLimitedSemaphore.WaitAsync()
   at Program.Search(String search, SearchOptions opts, Action`1 rHandler, CancellationToken ct, Action onSearch)
   at Program.RunSearches(Track track, ConcurrentDictionary`2 results, Func`4 getSearchOptions, Action`1 responseHandler, CancellationToken ct, Action onSearch)
   at Program.SearchAndDownload(Track track)
   at Program.<>c__DisplayClass113_0.<<TracksDownloadNormal>b__0>d.MoveNext()

feat: Support subfolders in --name-format

Hello!

I would like to request support for subfolders in the --name-format option. In v1.6.1, the downloaded files are all placed in a single folder. This enhancement would allow the use of / to specify subfolders for keeping downloads organized.

As an example, consider the name format {artist}/{artist} - {title}. This could generate a file structure like

downloads/
  The Beatles/
    The Beatles - Come Together.flac
  Phil Collins/
    Phil Collins - In the Air Tonight.flac

Instead of

downloads/
  The Beatles - Come Together.flac
  Phil Collins - In the Air Tonight.flac

Thank you for making slsk-batchdl. It's been super helpful to fill out the gaps in my library. :)

[Request] Adding a --track-version parameter

Hey,
thanks for your batch dl, very cool!

Would be fantastic to have an option to add a specific version for every research on a track or playlist such as
--track-version <extended/radio/mashup/etc>

For example, I'm interested in adding the word "extended" to every track on Spotify playlist (often those versions are not included in Spotify), but also would be interesting for "Radio" or "Mashup" etc for variations.

Thanks!

Files are not skipped during consecutive runs

The software downloads similar files (differing sometimes only with one character in name, but same format and size) even when using --skip-existing
image

This is the config
Screenshot 2024-08-18 140049

--user ""
--pass ""
--path "/.../sldl/downloads/"
--name-format "{title( - )artist|filename}"
--m3u "all"
--youtube-key ""
--get-deleted
--format "flac,wav,aiff,mp3,m4a"
--pref-format "flac,wav,aiff"
--min-bitrate 320
--pref-min-bitrate 1411
--min-samplerate 48
--min-bitdepth 16
--pref-min-bitdepth 24
--skip-existing
--skip-mode "m3u"
--music-dir "/.../sldl/downloads/"
--remove-brackets
--desperate
--yt-dlp
--yt-dlp-argument "--config-location /.../yt-dlp/yt-dlp.conf"
--concurrent-downloads 8
--display-mode "simple"
--strict-conditions

Command ran:
sldl "https://music.youtube.com/playlist?list=PLmKyWcf1T8nzZ53Vy33rqQiZ8NcN4xAda&si=1Z2xYY2xcM2qgXGy" --config ./sldl.conf

*sorry if it is an issue of me using the software wrong!

Keep getting "Failed to download: <songname>"

Hi there

I've been trying to make this work for some time and I'm currently stuck in this issue with no way to make it work.
I am supplying a program with a spotify playlist. It starts going through the song and as when trying to download the first one I get
"Failed to download : <songname> , skipping".
It skips to the second song, and then prints
"Out of download retries: <songname>, skipping"

I have tried printing the results and can confirm the program is finding lots of options to download for each song.
I have tried using random logins and my own.
I have tried many of the different flags and options to see if anything would let me download but to not success.
image

I have used both SoulseekQT and Nicotine+ with no problem.

If you could help me figure out what's missing here I would appreciate it a lot 👍
Thanks

crashes immediately

i have downloaded in the past and have had no issues. now, whenever I run it, no matter which version or release or how many times I restart, it loads for half a second and then the terminal closes. I can even see the text for a split second when the window opens so I don't know whats going on

straight commands like --format --min-bitrate etc. seem not to work

With those Commands i always get this error codes:
Unhandled exception. System.Exception: Unknown argument: --format
at Program.Main(String[] args)
at Program.

(String[] args)

My Command looks like this for example:
C:\Users\XXX\slsk-batchdl.exe --username XX --password XY --spotify https://open.spotify.com/playlist/XXX --path C:\Users\XX --format flac,wav --skip-existing --desperate

It would be GREAT if i could solve that.... but i cant

Sourcing track data from file tags can lead to duplicates and inconsistencies

When I download the same playlist twice with --skip-duplicates slight variations in spelling seem to cause the file to be downloaded again anyway, causing duplicates.

For example I have this case with a missing accent:

  • Eric Prydz - Generate (Kolsch Remix).mp3
  • Eric Prydz - Generate (Kölsch Remix).mp3

or this one with case problems:

  • Fred again.. - Danielle (Smile on My Face).mp3
  • Fred Again.. - Danielle (Smile on My Face).mp3

Because the name formatter (https://github.com/fiso64/slsk-batchdl/blob/master/slsk-batchdl/Program.cs#L3490) seems to only use the file's embedded tags to figure out track information it depends on the tags the uploader has put there, which can cause variations and lead to duplicate downloads because of these.

Another side effect of this is that untagged files are unable to produce well formatted names.

One approach to solve this I think could work here is to here https://github.com/fiso64/slsk-batchdl/blob/master/slsk-batchdl/Program.cs#L3551 first use track information sourced from Spotify to populate these values, and to then fall back to file tags if they're not present.

This way the tags will be more consistent and more consistently present, leading hopefully to less duplicates and more data for formatting.

Suggestion: Skip/ban user from search

I've come across many users with numerous files that interest me, but who only offer sales or locked files. What would be interesting is the ability to ignore users during searches.

Thank you for everything, the build works great and has been very helpful to me so far!

.exe file refuses to run on Windows 11

I downloaded both versions of the .exe files for windows, and Windows tells me it "protected my PC", because it thinks its a virus. So, I tapped "run anyway". The window opens for half a second and closes itself. Is there something I'm doing wrong? I've also installed NET, if that isolates certain issues.

Spotify login on headless setups

Worked brilliantly thanks very much!

Another quick question.
I can download spot playlists
However spot-likes throws this error

Error: no DISPLAY environment variable specified

Originally posted by @MCMXD in #41 (comment)

Spotify logins currently don't work on headless setups

yt-dlp integration breaks name-format

When the two exist together in the config file it makes the name-format not work at all. Both soulseek and yt-dlp tracks don't get renamed. Using Windows 11.

Building executable on Linux

I understand this is a general question beyond the scope of the app.

I have been using this on Win11 and THANK YOU. I can't even find half of the tracks this baby finds when I manually search slsk. It's slowly fleshing out my new Logitech Media Server home streaming set-up with modern bangers ;)

I really want to move it over to my HoemLab so I can cron it and have it sweep periodically not just when my PC is on and I think to fire it up.

I dont have the Linux experience, and just need a point in the right direction. I'm downloading the slsk-batchdl_linux-x64. How do you go about compiling the executable on ubuntu? Even a guide on 'a hello world project' in the same language would be swell.

If i could use VS it would be easier but im happy mashing away at the CLI until i get it.

many thanks

Can only run the app 1x before reboot is required

hello
When i try a 2nd playlist i get the following error.
Only when i restart my pc it works again.

Microsoft Windows [Version 10.0.22631.3958]
(c) Microsoft Corporation. All rights reserved.

C:\Users\quint>cd C:\tmp\SOULSEEKDOWNLOADER

C:\tmp\SOULSEEKDOWNLOADER>sldl "enei.csv"
Windows: Recommended to use the default command prompt to avoid printing issues.
Using columns: artist:"Artist", album:"Album", title:"Song".
Unhandled exception. Soulseek.ListenException: Failed to start listening on 0.0.0.0:50000; the IP and/or port may be in use or are otherwise unavailable
at Soulseek.SoulseekClient.ConnectAsync(String address, Int32 port, String username, String password, Nullable1 cancellationToken) at Soulseek.SoulseekClient.ConnectAsync(String username, String password, Nullable1 cancellationToken)
at Program.Login(Boolean random, Int32 tries)
at Program.Main(String[] args)
at Program.

(String[] args)

C:\tmp\SOULSEEKDOWNLOADER>

Trojan:Script/Wacatac.B!ml in 1.6

Hi, don't know if this is an error or false positive but when trying to DL the most recent release (1.6 I believe), I was getting flagged with the file containing this Trojan.

"running" but not doing anything. No Errors

I get no error or anything. Any ideas for how to troubleshoot?


Windows: Recommended to use the command prompt instead of terminal app to avoid printing issues.

Parsing CSV track info

Using inferred columns: artist:"Artist", title:"Title".

Warning: No duration column found, results may be imprecise

  XXX - XXX

  XXXX - XXXXX

  ... (etc)

Downloading 10 tracks```

Then it stays there and does nothing.
Windows 11 Pro.

A title with a slash in it creates a folder

When a track's title (perhaps also any other tag) contains a / character it is treated as a path separator and a folder is created. The slash character within tags used for formatting should be escaped and printed as is.

For example, when downloading for Beyoncé - PURE/HONEY the track was saved as as a folder with one file in it:

📂 Beyoncé - PURE/
   🎵 HONEY.mp3

"The server connection must be connected and logged in to perform a search (currently: Disconnected)"

I am using the app with the following .conf parameters (using CSV list as a source):

-s
--skip-mode "name"
--pref-format "mp3"
--format "mp3,wav,flac"
--min-bitrate "256"
--max-bitrate "320"
--skip-not-found
--remove-ft
--search-timeout 6000
--max-stale-time 30000
--display "simple"
--concurrent-downloads 4

and somehow, no matter what I do, or change in this config, I get this error messages printed over and over within 2-3 minutes of this running:

"The server connection must be connected and logged in to perform a search (currently: Disconnected)"

What am I missing?

Are some of the parameters too aggressive and SLSK just keeps booting this app out?

Or is there an issue with the latest release (1.5.1) that might need to be addressed?

no option to use custom yt-dlp config or specificy yt-dlp options

there is no option to use custom yt-dlp config or specificy yt-dlp options, which is quite limiting.

also i dont find the yt-dlp options chosen to be useable. at least use these, considering the aim is to download music
--embed-thumbnail
--embed-metadata
and improve the title formatting, e.g.
-o "%(title)s - %(channel)s.%(ext)s"

if this is fixed soon I will donate :)

yt-dlp files missing from m3u on first pass of a playlist

for some reason files downloaded from yt-dlp are not added to an m3u using --m3u all on the first time downloading a playlist, with empty lines in the m3u where they should be. If i request to download it again even though its already been downloaded, the yt-dlp files are recognised and added to the m3u.

thanks for your hard work!

Files not downloading - No errors

Files are not downloading. No errors reported from --debug.
Tested and failed with csv file, single track search, main user account login, random login.

Main command as below:

/path/to/folder/slsk-batchdl "artist=Otto De Rojas,title= Choca Las Caderas (7 Samurai Ciucciotto Re-Edit)" --random-login --concurrent-downloads 1 --path /path/to/output/folder

debug and print command as below:

/path/to/folder/slsk-batchdl "artist=Otto De Rojas,title= Choca Las Caderas (7 Samurai Ciucciotto Re-Edit)" --random-login --concurrent-downloads 1 --path /path/to/output/folder --debug --print results-full

Output as below:

/path/to/folder/slsk-batchdl "artist=Otto De Rojas,title= Choca Las Caderas (7 Samurai Ciucciotto Re-Edit)" --random-login --concurrent-downloads 1 --path /path/to/output/folder --debug
String download
Got tracks
Checking if tracks exist in library
Login OPBVBI7OON
Wait for internet
Connecting OPBVBI7OON
Setting share count
Logged in OPBVBI7OON
Update started
Main loop
Wait for internet
Wait for login


Item 0     of 100  . (0  %)
Waiting: Otto De Rojas -  Choca Las Caderas (7 Samurai Ciucciotto Re-Edit)
Wait for internet
Item 0     of 100  . (0  %)
Searching: Otto De Rojas -  Choca Las Caderas (7 Samurai Ciucciotto Re-Edit)
Deepo\@@snfuh\Son\7 Samurai\El mundo nuevo (2008) (flac)\04 - Choca Las Caderas - 7S ''Ciucciotto'' re-edit - Otto De Rojas.flac [315s/44100Hz/32.3MB] (nec:Satisfied, prf:StrictTitle fails)
Total: 1

Mainloop done

Thank you for your work.

Error when podcast in playlist - Argument null exception on Swan.PropertyPropertyExtensions.ReadProperty

Thanks for making this! It's super handy. I'm running into a consistent issue after using it a few times, on smaller playlists successfully

EDIT: I think I found the culprit - if a podcast is in the playlist, this error occurs

❯ .\slsk-batchdl {{music playlist of any size with one or more podcasts in it}}
Windows: Recommended to use the command prompt instead of terminal app to avoid printing issues.
Loading Spotify tracks
Unhandled exception. System.ArgumentNullException: Value cannot be null. (Parameter 'obj')
   at Swan.PropertyProxyExtensions.ReadProperty[T](T obj, String propertyName)
   at Spotify.GetPlaylist(String url, Int32 max, Int32 offset)
   at Program.Main(String[] args)
   at Program.<Main>(String[] args)

Config:

--music-dir "D:/Sync/Music"
--path "D:/Sync/Music"
--folder "slsk-batchdl"
--username "myusernamelol"
--password "mypasswordlol
--spotify-id "myspotifyidlol"
--spotify-secret "topsecwet"
--display "single"
--min-bitrate 320
--max-bitrate 700
--pref-max-samplerate 48000
--skip-existing

Default --name-format to Spotify's artist and title data

I've formatted with "{artist} - {title}" and I already have mixed results in my file names. I think a smarter approach would be to utilize Spotify's returned data. This way you can avoid wonky errors and ALSO preserve casing as the artist has meant it to be.

Unhandled exception. System.ArgumentException: An item with the same key has already been added.

Thanks for the great script! Got this error when executing again. The first time works perfectly, then it crashes it with this error. It's on macOS Arm chip if that matters.

slsk-batchdl -i spotify-likes --m3u --skip-existing --skip-mode name  --music-dir <path>/Music/Spotify\ Likes -p <path>/Music/Spotify\ Likes
objc[40659]: Class PlaceholderObject is implemented in both /Users/<me>slsk-batchdl/slsk-batchdl/bin/Release/net6.0/osx-arm64/slsk-batchdl (0x1048453f0) and /Users/<me>/slsk-batchdl/slsk-batchdl/bin/Release/net6.0/osx-arm64/libSystem.Native.dylib (0x104c14600). One of the two will be used. Which one is undefined.
Loading Spotify likes
Checking if tracks exist in library
Unhandled exception. System.ArgumentException: An item with the same key has already been added. Key: Vintage Culture - Free (237s)
   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)
   at Program.<>c__DisplayClass106_0.<RemoveTracksIfExist>b__1(Track x) in /Users/<me>/slsk-batchdl/slsk-batchdl/Program.cs:line 2258
   at System.Collections.Generic.List`1.RemoveAll(Predicate`1 match)
   at Program.RemoveTracksIfExist(List`1 tracks, String dir, FileConditions necessaryCond, Boolean useTags, Boolean precise) in /Users/<me>/slsk-batchdl/slsk-batchdl/Program.cs:line 2256
   at Program.Main(String[] args) in /Users/<me>/slsk-batchdl/slsk-batchdl/Program.cs:line 787
   at Program.<Main>(String[] args)
[1]    40659 abort      slsk-batchdl -i spotify-likes --m3u --skip-existing --skip-mode name   -p

Windows

Hello,

can I run it on windows 10 ?

Suggestion: Add option to remove successful files from Spotify playlist

Hey! Love the program, it works really well 😄

I would love to have an option to clear successful files from Spotify playlists. I use a sort of download queue playlist, and it would be nice to not have it be cluttered with already downloaded songs. I know that the duplicate check exists, but not having them there in the first place saves on processing. Furthermore, by only deleting the successful files I can easily see which ones I either need to retry or find somewhere else.

I'm looking forward to your reaction, and again thank you for your work!

(QUESTION)

Can I use this with a short clip of a song I have and have it search through the database to find a longer version?

Unhandled exception. System.TimeoutException: The wait timed out after 5000 milliseconds

I LOVE your App!

Im getting a lot of this:

It starts to load the spotify songs and then -

Unhandled exception. System.TimeoutException: The wait timed out after 5000 milliseconds
at Soulseek.SoulseekClient.ConnectInternalAsync(String address, IPEndPoint ipEndPoint, String username, String password, CancellationToken cancellationToken)
at Program.Main(String[] args)
at Program.

(String[] args)

Am i writing something wrong?

C:\slsk-batchdl.exe --username xx --password xy--spotify https://open.spotify.com/playlist/zzz --path C:\Soulseek --pref-format flac --skip-existing --concurrent-processes 5

LOVE YOU!

Search query must contain at least one non-exclusion term with length greater than 1 (Parameter 'query')

Seems like that if a song name on a CSV is a single character long, this error pops up, and so skips the song.

Search query must contain at least one non-exclusion term with length greater than 1 (Parameter 'query')
   at Soulseek.SoulseekClient.SearchAsync(SearchQuery query, Action`1 responseHandler, SearchScope scope, Nullable`1 token, SearchOptions options, Nullable`1 cancellationToken)
   at Program.RunSearches(String search, SearchOptions opts, Action`1 rHandler, CancellationToken ct, Action onSearch)
   at Program.SearchAndDownload(Track track)
   at Program.<>c__DisplayClass82_0.<<Main>b__1>d.MoveNext()

slsk-batchdl.conf:

--random-login
--time-format m:s
--length-tol 99999
--no-artist-search

cmd:
slsk-batchdl example.csv

example.csv

Unhandled exception. SmallestCSV.SmallestCSVParser+Error: Unrecognized character 'С' after a parsed column

I'm getting this error when trying to download anything

Unhandled exception. SmallestCSV.SmallestCSVParser+Error: Unrecognized character 'С' after a parsed column
at SmallestCSV.SmallestCSVParser.TryFinishLine()
at SmallestCSV.SmallestCSVParser.ReadNextColumn(Boolean removeEnclosingQuotes)
at SmallestCSV.SmallestCSVParser.ReadNextRow(Boolean removeEnclosingQuotes)
at Program.ParseCsvIntoTrackInfo(String path, String artistCol, String trackCol, String lengthCol, String albumCol, String descCol, String ytIdCol, String trackCountCol, String timeUnit, Boolean ytParse)
at Program.CsvInput()
at Program.Main(String[] args)
at Program.

(String[] args)

Question

Hello! I have a question/idea, Me and my friends are looking for an unreleased album, we have the lengths of the tracks, and I'm assuming it's somewhere on soulseek, is there a way to put the length of each track and search uploads that match in the order?

Spotify Login crashing the app

After trying to download my private playlist, and trying to login, it just crashes. Here are the logs:

PS C:\Users\RyzenInu\Desktop\Apps\Soulseek Batch Download> ./sldl "https://open.spotify.com/playlist/2S11ETQk1qwywDVw2Ht5xS?si=b18b21efb3cb47de&pt=069ead3e6be3f1b1ac0effcd54be5cb2"
Windows: Recommended to use the default command prompt to avoid printing issues.
Loading Spotify playlist
Spotify playlist not found. It may be set to private. Login? [Y/n]
y
Loading Spotify tracks
Unhandled exception. SpotifyAPI.Web.APIException: Resource not found
   at SpotifyAPI.Web.Http.APIConnector.ProcessErrors(IResponse response)
   at SpotifyAPI.Web.Http.APIConnector.DoRequest(IRequest request, CancellationToken cancel)
   at SpotifyAPI.Web.Http.APIConnector.DoSerializedRequest[T](IRequest request, CancellationToken cancel)
   at SpotifyAPI.Web.Http.APIConnector.SendAPIRequest[T](Uri uri, HttpMethod method, IDictionary`2 parameters, Object body, IDictionary`2 headers, CancellationToken cancel)
   at Spotify.GetPlaylist(String url, Int32 max, Int32 offset)
   at Program.SpotifyInput()
   at Program.Main(String[] args)
   at Program.<Main>(String[] args)
PS C:\Users\RyzenInu\Desktop\Apps\Soulseek Batch Download>

Is it possible to search and download by "album=X, artist=X" only? Not using "title=X"

I would like search and download by "album". Is this possible?

I cannot find a way of searching manually or using CSV by just using the input of "artist" & "album". It seems the program errors if no "title" is given. Is this because soulseek list single files? having to include a "title" in a search for an album will not work.
Is it possible to search by name of "directory" by the uploader. Therefore you could search for an album by searching for the album name as a directory name,

having problems inserting Name and or PW

Hi I love you for that programm but still not able to use it.

when i try to insert my username wit ... slsk-btchdl.exe --username XYZ

i get the answer:
Unhandled exception. System.Exception: No url, csv or name provided to download.
at Program.Main(String[] args)
at Program.

(String[] args)

Same thing with Password

When i just try to feed it a playlist link it tells me

Unhandled exception. System.Exception: No soulseek username or password
at Program.Main(String[] args)
at Program.

(String[] args)

What am i doing wrong?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.