# slsk-batchdl
A batch downloader for Soulseek built with Soulseek.NET. Accepts CSV files or Spotify and YouTube urls.
#### Download tracks from a csv file:
```
slsk-batchdl test.csv
```
Use `--print tracks` before downloading to check if everything has been parsed correctly. The names of the columns in the csv should be: `Artist`, `Title`, `Album`, `Length`, though alternative names are sometimes inferred as well. Only the title column is required, but any additional info improves search results.
#### Download spotify likes while skipping existing songs:
```
slsk-batchdl spotify-likes --skip-existing
```
To download private playlists or liked songs you will need to provide a client id and secret, which you can get here https://developer.spotify.com/dashboard/applications. Create an app and add `http://localhost:48721/callback` as a redirect url in its settings.
#### Download youtube playlist (with fallback to yt-dlp), including deleted videos:
```
slsk-batchdl --get-deleted --yt-dlp "https://www.youtube.com/playlist?list=PLI_eFW8NAFzYAXZ5DrU6E6mQ_XfhaLBUX"
```
Playlists are retrieved using the YoutubeExplode library which unfortunately doesn't always return all videos. 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.
#### Search & download a specific song:
```
slsk-batchdl "title=MC MENTAL @ HIS BEST,length=242" --pref-format "flac,wav"
```
#### See which songs by an artist are missing in your library:
```
slsk-batchdl "artist=MC MENTAL" --aggregate --print tracks-full --skip-existing --music-dir "path\to\music"
```
### Options:
```
Usage: slsk-batchdl [OPTIONS]
is one of the following:
Spotify playlist url or "spotify-likes": Download a spotify
playlist or your liked songs. --spotify-id and
--spotify-secret may be required in addition.
Youtube playlist url: Download songs from a youtube playlist.
Provide a --youtube-key to include unavailabe uploads.
Path to a local CSV file: Use a csv file containing track
info to download. The names of the columns should be Artist,
Title, Album, Length. Only the title column is required, but
any extra info improves search results.
Name of the track, album, or artist to search for:
Can either be any typical search string or a comma-separated
list like "title=Song Name,artist=Artist Name,length=215"
Allowed properties are: title, artist, album, length (sec)
Options:
--user Soulseek username
--pass Soulseek password
--spotify-id spotify client ID
--spotify-secret spotify client secret
--youtube-key Youtube data API key
--get-deleted Attempt to retrieve titles of deleted videos from wayback
machine. Requires yt-dlp.
--time-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 file contains YouTube video titles and
channel names; attempt to parse them into title and artist
names.
-a --aggregate When input is a string: Instead of downloading a single
track matching the search string, find and download all
distinct songs associated with the provided artist, album,
or track title. Input string must be a list of properties.
--min-users-aggregate Minimum number of users sharing a track before it is
downloaded in aggregate mode. Setting it to higher values
will significantly reduce false positives, but may introduce
false negatives. Default: 2
--relax Slightly relax file filtering in aggregate mode to include
more results
-p --path Download folder
-f --folder Subfolder name (default: playlist/csv name)
-n --number Download the first n tracks of a playlist
-o --offset Skip a specified number of tracks
-r --reverse Download tracks in reverse order
--remove-from-playlist Remove downloaded tracks from playlist (spotify only)
--name-format Name format for downloaded tracks, e.g "{artist} - {title}"
--m3u Create an m3u8 playlist file
--format Accepted file format(s), comma-separated
--length-tol Length tolerance in seconds (default: 3)
--min-bitrate Minimum file bitrate
--max-bitrate Maximum file bitrate
--max-samplerate Maximum file sample rate
--strict-title Only download if filename contains track title
--strict-artist Only download if filepath contains track artist
--banned-users Comma-separated list of users to ignore
--pref-format Preferred file format(s), comma-separated (default: mp3)
--pref-length-tol Preferred length tolerance in seconds (default: 2)
--pref-min-bitrate Preferred minimum bitrate (default: 200)
--pref-max-bitrate Preferred maximum bitrate (default: 2200)
--pref-max-samplerate Preferred maximum sample rate (default: 96000)
--pref-strict-artist Prefer download if filepath contains track artist
--pref-banned-users Comma-separated list of users to deprioritize
-s --skip-existing Skip if a track matching file conditions is found in the
output folder or your music library (if provided)
--skip-mode name: Use only filenames to check if a track exists
name-precise (default): Use filenames and check conditions
tag: Use file tags (slower)
tag-precise: Use file tags and check file conditions
--music-dir Specify to 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.
--remove-ft Remove "ft." or "feat." and everything after from the
track names before searching
--remove-regex Remove a regex from all track titles and artist names
--no-artist-search Perform an additional search without artist name if nothing
was found. Useful for sources such as youtube or soundcloud
where the "artist" could just be an uploader.
--artist-search Also try to find track by searching for the artist only
--no-diacr-search Also perform a search without diacritics
--no-regex-search Also perform a search without a regex pattern
--yt-dlp Use yt-dlp to download tracks that weren't found on
Soulseek. yt-dlp must be available from the command line.
--config Manually specify config file location
--search-timeout Max search time in ms (default: 6000)
--max-stale-time Max download time without progress in ms (default: 50000)
--concurrent-downloads Max concurrent downloads (default: 2)
--searches-per-time Max searches per time interval. Higher values may cause
30-minute bans. (default: 34)
--searches-time Controls how often available searches are replenished.
Lower values may cause 30-minute bans. (default: 220)
--display