Um downloader automático para Soulseek desenvolvido com Soulseek.NET. Aceita arquivos CSV, bem como URLs do Spotify e do YouTube.
Suporta downloads de playlists e álbuns; seleciona os melhores arquivos de acordo com as condições e heurísticas de arquivo configuradas pelo usuário.
Veja os exemplos de uso.
Usage: sldl <input> [OPTIONS]
<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
-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)
--write-playlist Create an m3u playlist file in the output directory
--playlist-path <path> Override default path for m3u playlist file
--no-skip-existing Do not skip downloaded tracks
--no-write-index Do not create a file indexing all downloaded tracks
--index-path <path> Override default path for sldl index
--skip-check-cond Check file conditions when skipping existing files
--skip-check-pref-cond Check preferred conditions when skipping existing files
--skip-music-dir <path> Also skip downloading tracks found in a music library by
comparing filenames. Not 100% reliable.
--skip-not-found Skip searching for tracks that weren't found on Soulseek
during the last run.
--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 run 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
--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 -x causes yt-dlp to 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-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-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.
--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
--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
--strict-title File name must contain title
--strict-artist File path must contain artist name
--strict-album File path must contain album name
--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.
-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
-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
Acrônimos de sinalizadores de duas e três palavras também são aceitos, por exemplo, --twf. Se a opção contiver a palavra 'max', o m deverá estar em maiúscula. 'taxa de bits', 'sameplerate' e 'profundidade de bits' devem ser tratados como duas palavras separadas, por exemplo, --Mbr para --max-bitrate.
Os sinalizadores podem ser explicitamente desabilitados definindo-os como falsos, por exemplo, '--interactive false'
O tipo de entrada geralmente é determinado automaticamente. Para forçar um tipo de entrada específico, defina --input-type [spotify|youtube|csv|string|bandcamp|list]. Os seguintes tipos de entrada estão disponíveis:
Caminho para um arquivo CSV local: Use um arquivo csv contendo informações da faixa das músicas para download. Os nomes das colunas devem ser Artista, Título, Álbum, Duração, embora nomes alternativos também sejam normalmente detectados. Apenas a coluna do título ou do álbum é obrigatória, mas informações extras podem melhorar a classificação dos resultados de pesquisa. Cada linha que não tiver um texto na coluna de título será tratada como um download de álbum.
URL da playlist: Baixe músicas de uma playlist do YouTube. O método padrão para recuperar playlists nem sempre retorna todos os vídeos, especialmente aqueles que não estão disponíveis. Para obter todos os títulos de vídeo, você pode usar a API oficial fornecendo uma chave com --youtube-key. Obtenha aqui https://console.cloud.google.com. Crie um novo projeto, clique em "Ativar API" e pesquise "dados do YouTube" e siga as instruções.
Um URL de lista de reprodução/álbum ou 'spotify-likes': Baixe uma lista de reprodução, álbum ou suas músicas favoritas do Spotify. As credenciais são necessárias ao baixar uma lista de reprodução privada ou músicas favoritas.
Crie um aplicativo Spotify em https://developer.spotify.com/dashboard/applications com um URL de redirecionamento http://localhost:48721/callback. Obtenha um ID e um segredo do aplicativo no painel do aplicativo criado.
Inicie o sldl com as credenciais obtidas e uma ação autorizada para acionar o fluxo de login do aplicativo Spotify:
sldl spotify-likes --spotify-id 123456 --spotify-secret 123456 -n 1 --print-tracks
sldl tentará abrir um navegador automaticamente, mas retornará ao registro da URL do fluxo de login para saída. Após a conclusão do fluxo de login, o sldl gerará um token e um token de atualização e concluirá a execução do comando atual.
Para ignorar a necessidade de fluxo de login sempre que o sldl for usado, o token e o token de atualização podem ser fornecidos ao sldl (dica: armazene essas informações no arquivo de configuração para tornar os comandos menos detalhados):
sldl spotify-likes --spotify-id 123456 --spotify-secret 123456 --spotify-refresh 123456 --spotify-token 123456 -n 1 --pt
O acesso ao token spotify é válido apenas por 1 hora. spotify-refresh permitirá que o sldl renove o acesso sempre que for executado (e pode ser usado sem incluir o spotify-token)
URL do bandcamp: baixe uma única faixa, um álbum ou a discografia completa de um artista. Extrai o nome do artista, o nome do álbum e define --album-track-count="n+", onde n é o número de faixas visíveis na página do bandcamp.
Nome da faixa, álbum ou artista a ser pesquisado: pode ser qualquer string de pesquisa típica (como a que você inseriria na barra de pesquisa do soulseek) ou uma lista de propriedades separadas por vírgulas, como 'title=Nome da música, artista= Nome do artista, comprimento=215'.
As seguintes propriedades são aceitas:
title
artist
album
length (in seconds)
artist-maybe-wrong
album-track-count
Exemplos de entradas e suas interpretações:
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 |
Um caminho para um arquivo de texto onde cada linha tem o seguinte formato:
"some input" "conditions" "preferred conditions"
por exemplo:
"artist=Artist, album=Album" "format=mp3; br > 128" "br >= 320"
Onde "alguma entrada" é qualquer um dos tipos de entrada acima. As aspas podem ser omitidas se o campo não contiver espaços. Os campos de condição são adicionados às condições configuradas e também podem ser omitidos. A entrada da lista deve ser ativada manualmente com --input-type=list.
Ele também aceita uma abreviatura para downloads de álbuns: a:"Artist - Album"
. Observe que o a:
deve aparecer fora das aspas.
O padrão. Baixa um único arquivo para cada entrada de entrada.
sldl irá procurar o álbum e baixar uma pasta inteira, incluindo arquivos que não sejam de áudio. Ativado quando a entrada é um link para um álbum do Spotify ou Bandcamp, quando a string de entrada ou linha CSV não tem título de faixa ou quando -a/--album está habilitado.
Com -g/--gregate, o sldl realiza uma pesquisa comum pela entrada e depois tenta agrupar os resultados em músicas distintas e baixar uma de cada tipo, começando pela compartilhada pela maioria dos usuários.
Observe que --min-shares-gregate é 2 por padrão, o que significa que as músicas compartilhadas por apenas um usuário serão ignoradas.
Ativado quando --album e --agregate estão habilitados. sldl agrupará compartilhamentos e baixará um de cada álbum distinto, começando pelo compartilhado pelo maior número de usuários. É recomendado emparelhar isso com --interactive.
Observe que --min-shares-gregate é 2 por padrão, o que significa que os álbuns compartilhados por apenas um usuário serão ignorados.
A consulta de pesquisa é determinada da seguinte forma:
O servidor irá bani-lo por 30 minutos se muitas pesquisas forem realizadas em um curto espaço de tempo. O programa possui um limitador de pesquisa que pode ser ajustado com --searches-per-time e --searches-renew-time (quando o limite for atingido, o status dos downloads será "Aguardando"). Por padrão, ele está configurado para permitir até 34 pesquisas a cada 220 segundos. Os valores padrão foram determinados através de experimentação, portanto podem estar incorretos.
As opções a seguir tornarão o processo mais rápido, mas poderão diminuir a qualidade dos resultados da pesquisa ou causar instabilidade:
Os arquivos que não atenderem às condições exigidas não serão baixados. Arquivos que satisfaçam as pré-condições serão preferidos; a configuração --pref-format "flac,wav" fará com que ele baixe arquivos sem perdas, se disponíveis, e só baixe arquivos com perdas se não houver mais nada.
Não há condições obrigatórias padrão. As condições preferenciais padrão são:
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
O sldl irá, portanto, preferir arquivos mp3 com taxa de bits entre 200 e 2500 kbps e cujo comprimento difere do comprimento fornecido em não mais que 3 segundos. Ele também preferirá arquivos cujos caminhos contenham o título e o álbum fornecidos (ignorando maiúsculas e minúsculas e delimitados por caracteres de limite) e que tenham comprimento não nulo. Não é recomendado alterar as três últimas condições preferidas.
Observe que os arquivos que satisfazem um subconjunto das condições preferenciais ainda serão preferidos aos arquivos que não satisfazem nenhuma condição, mas algumas condições têm precedência sobre outras. Por exemplo, um arquivo que satisfaça apenas o título estrito (se habilitado) sempre terá preferência sobre um arquivo que satisfaça apenas a condição de formato. Execute com --print "resultados completos" para revelar a lógica de classificação.
As condições também podem ser fornecidas como uma string delimitada por ponto e vírgula com --cond e --pref, por exemplo --cond "br >= 320; format = mp3,ogg; sr < 96000".
As opções --strict-title, --strict-artist e --strict-album irão filtrar qualquer arquivo que não contenha o título/artista/álbum no nome do arquivo (ignorando maiúsculas e minúsculas, delimitado por caracteres de limite).
Outra maneira de evitar downloads falsos é definir --length-tol como 3 ou menos para ignorar qualquer música que difira da entrada em mais de 3 segundos. No entanto, todas as 4 opções já estão habilitadas como condições 'preferenciais' por padrão, o que significa que tais arquivos só serão baixados como último recurso. Portanto, só é recomendado ativá-los se você precisar minimizar ao máximo os downloads falsos, ou para casos especiais como faixas ou álbuns cujo nome tenha apenas um ou dois caracteres.
Algumas informações podem estar indisponíveis dependendo do cliente usado pelo par. Por exemplo, o cliente Soulseek padrão não compartilha a taxa de bits do arquivo. Se (por exemplo) --min-bitrate estiver definido, então o sldl ainda aceitará qualquer arquivo com taxa de bits desconhecida. Você pode configurá-lo para rejeitar todos os arquivos onde uma ou mais das propriedades verificadas são nulas (desconhecidas) habilitando --strict-conditions.
Como consequência, se --min-bitrate também estiver definido, todos os arquivos compartilhados pelos usuários com o cliente padrão serão ignorados. Observe também que as condições preferenciais padrão já afetarão a classificação com esta opção devido às verificações de taxa de bits e taxa de amostragem.
As variáveis entre {} serão substituídas pelo valor da tag de arquivo correspondente. O formato do nome suporta subdiretórios, bem como expressões condicionais como {tag1|tag2} - Se tag1 for nulo, use tag2. Literais de string entre parênteses são ignorados na verificação de nulos.
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)
sldl procurará um arquivo chamado sldl.conf nos seguintes locais:
~/AppData/Roaming/sldl/sldl.conf
~/.config/sldl/sldl.conf
bem como no diretório do executável.
Exemplo de arquivo de configuração:
username = your-username
password = your-password
pref-format = flac
fast-search = true
Linhas que começam com hashtags (#) serão ignoradas. Os tils nos caminhos são expandidos como o diretório do usuário.
Perfis são suportados:
[lossless]
pref-format = flac,wav
Para ativar o perfil acima, execute --profile "lossless". Para listar todos os perfis disponíveis, execute --profile "help".
Os perfis podem ser ativados automaticamente com base em algumas condições simples:
[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
Os seguintes operadores são suportados para uso em profile-cond: &&, ||, ==, !=, !{bool}.
As seguintes variáveis estão disponíveis:
input-type ("youtube"|"csv"|"string"|"bandcamp"|"spotify")
download-mode ("normal"|"aggregate"|"album"|"album-aggregate")
interactive (bool)
Baixe faixas de um arquivo csv:
sldl test.csv
Baixe curtidas do Spotify:
sldl spotify-likes
Download do álbum interativo:
sldl "Some Album" -a -t
Baixe uma música específica pelo nome, preferindo sem perdas:
sldl "MC MENTAL @ HIS BEST, length=242" --pref-format "flac,wav"
Baixe o álbum de cada música em uma playlist do Spotify:
sldl https://spotify/playlist/id -a
Recupere nomes de vídeos excluídos e baixe de uma lista de reprodução do YouTube com substituto para yt-dlp:
sldl https://www.youtube.com/playlist/id --get-deleted --yt-dlp
Imprima todas as músicas de um artista que não esteja na sua biblioteca:
sldl "artist=MC MENTAL" --aggregate --skip-music-dir "path/to/music" --print results-full
Baixe todos os álbuns de um artista encontrado no soulseek:
sldl "artist=MC MENTAL" -a -g -t
Crie um arquivo chamado wishlist.txt
e adicione alguns itens conforme detalhado em Tipos de entrada: Lista:
" Artist - My Favorite Song "
a: " Artist - Some Album, album-track-count=5 " " format=flac "
Adicione um perfil ao seu sldl.conf
:
[wishlist]
input = ~/sldl/wishlist.txt
input-type = list
index-path = ~/sldl/wishlist-index.sldl
Isso criará um arquivo de índice global wishlist-index.sldl
que será verificado toda vez que o sldl for executado para ignorar os itens da lista de desejos que já foram baixados. Se você quiser continuar pesquisando até que uma versão que atenda às condições preferidas seja baixada, adicione também skip-check-pref-cond = true
(observe que isso requer que os arquivos permaneçam no mesmo local após o download).
Por fim, configure um cron job (ou uma tarefa agendada no Windows) para executar periodicamente o sldl com a seguinte opção:
sldl --profile wishlist
chmod +x publish.sh && sh publish.sh
. Para Macs Intel, remova o comentário do x64 e comente a seção arm64 em subscribe.sh.--no-progress
em caso de problemas. Um contêiner docker para executar sldl
pode ser construído a partir deste repositório. A imagem suporta Linux x86/ARM.
Para construir e iniciar o contêiner:
clone https://github.com/fiso64/slsk-batchdl
cd slsk-batchdl
docker compose up -d
exec
no contêiner para começar a usar sldl
:
docker compose exec sldl sh
sldl --help
A pilha de composição monta dois diretórios relativos ao local onde docker-compose.yml
está localizado, que podem ser usados para gerenciamento de arquivos:
/config
(em ./config
no host) - coloque sua configuração sldl.conf
neste diretório e então use sldl -c /config ...
para usar sua configuração no contêiner/data
(em ./data
no host) - use como diretório de download IE sldl -p /data ...
Se você estiver executando o Docker em um host Linux, deverá especificar as permissões user:group
do usuário que possui o diretório de configuração e dados no host para evitar problemas de permissão de arquivo do docker. Estes podem ser especificados usando as variáveis ambientais PUID e PGID .
Para obter o UID e o GID do usuário atual, execute estes comandos em um terminal:
id -u
– imprime UIDid -g
– imprime GID Substitua-os pela variável correspondente ( PUID
PGID
) em docker-compose.yml
.
Um ou mais comandos sldl
podem ser executados de acordo com uma programação usando o cron integrado ao contêiner.
Para criar um agendamento, crie um novo arquivo no host ./config/crontabs/abc
e use-o com a sintaxe padrão do crontab.
Certifique-se de reiniciar o contêiner após fazer quaisquer alterações no arquivo cron.
Exemplo => Execute sldl
todos os domingos à 1h, procure por faixas ausentes na lista de reprodução especificada do Spotify
# 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 pode ser usado para ajudar com a expressão de agendamento.