A simple tool to take the work out of uploading on Gazelle-based trackers. It generates spectrals, gathers metadata, allows re-tagging/renaming files, and automates the upload process.
- Interactive Uploading β Supports multiple trackers (RED / OPS).
- Upconvert Detection β Checks 24-bit flac files for potential upconverts.
- MQA Detection β Checks files for common MQA markers.
- Duplicate Upload Detection β Prevents redundant uploads.
- Spectral Analysis β Generates, compresses, and verifies spectrals, exposed via a web interface.
- Spectral Upload β Can generate spectrals for an existing upload (based on local files), and update the release description.
- Lossy Master Report Generation β Supports lossy master reports during upload.
- Metadata Retrieval β Fetches metadata from:
- Bandcamp, Beatport, Deezer, Discogs, iTunes, JunoDownload, MusicBrainz, Qobuz, Tidal.
- File Management β
- Retags and renames files to standard formats (based on metadata).
- Checks file integrity and sanitizes if needed.
- Request Filling β Scans for matching requests on trackers.
- Description generation β Edition description generation (tracklist, sources, available streaming platforms, encoding details...).
- Down-convert and Transcode β Can downconvert 24-bit flac files to 16-bit, and transcode to mp3.
- Update Notifications β Informs users when a new version is available.
Manual installation instructions can be found on the Wiki.
These steps use uv for installing the smoked-salmon package. pipx also works.
Installing with pip is not recommended because uv (and pipx) manage python versions and isolate the smoked-salmon installation from the system python installation.
-
Install system packages:
sudo apt install sox flac ffmpeg mp3val curl unzip lame
-
Install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh -
Install smoked-salmon package from github:
uv tool install git+https://github.com/smokin-salmon/smoked-salmon
-
Install required system packages using winget:
winget install -e Gyan.FFmpeg ChrisBagwell.SoX Xiph.FLAC LAME.LAME ring0.MP3val.WF -
Fix sox Unicode filename handling issue on Windows:
$soxDir = $((Get-Command sox).Source | Split-Path) $zipPath = Join-Path -Path $soxDir -ChildPath "sox_windows_fix.zip" Invoke-WebRequest -Uri "https://raw.githubusercontent.com/DevYukine/red_oxide/master/.github/dependency-fixes/sox_windows_fix.zip" -OutFile $zipPath Expand-Archive -Path $zipPath -DestinationPath $soxDir -Force regedit "$soxDir\PreferExternalManifest.reg" Remove-Item $zipPath
-
Install uv:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
-
Install smoked-salmon package from github:
uv tool install git+https://github.com/smokin-salmon/smoked-salmon
-
Install Homebrew (if you haven't already):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
Install system packages using Homebrew:
brew install sox flac ffmpeg mp3val curl unzip lame
-
Install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh -
Install smoked-salmon package from github:
uv tool install git+https://github.com/smokin-salmon/smoked-salmon
-
Run salmon for the first time and follow the instructions to create a default configuration:
salmon-user@salmon:~$ salmon Could not find configuration path at /home/salmon-user/.config/smoked-salmon/config.toml. Do you want smoked-salmon to create a default config file at /home/salmon-user/.config/smoked-salmon/config.default.toml? [y/N]: -
Copy the default config to
~/.config/smoked-salmon/config.toml.cp ~/.config/smoked-salmon/config.default.toml ~/.config/smoked-salmon/config.toml -
Edit the
config.tomlfile with your preferred text editor to add your API keys, session cookies and update your preferences (see the Configuration Wiki). -
Use the
checkconfcommand to verify that the connection to the trackers is working:salmon checkconf -
Use the
healthcommand to verify that all necesasary command line dependencies are installed:salmon health
A Docker image is generated per release.
Disclaimer: I am not actively using the docker image myself, feedback is appreciated regarding that guide.
-
Pull the latest image:
docker pull ghcr.io/smokin-salmon/smoked-salmon:latest
-
Copy the content of the file
config.tomlto a location on your host server.
Edit theconfig.tomlfile with your preferred text editor to add your API keys, session cookies and update your preferences (see the Configuration Wiki). -
Configure rclone if needed. The Docker Compose configuration expects an rclone configuration file. You can get the path to your rclone config file by running
rclone config fileon your host system.
-
Check Configuration -> Run Migration -> Run the Web UI
Run the container with thecheckconfcommand to verify that the connection to the trackers is working:docker run --rm -it --network=host \ -v /path/to/your/music:/app/.music \ -v /path/to/your/config.toml/directory:/root/.config/smoked-salmon/ \ -v /path/to/your/smoked.db/directory:/root/.local/share/smoked-salmon/ \ -v /path/to/your/generated/dottorrents:/app/.torrents \ -v /get/this/from/"rclone config file":/root/.config/rclone/rclone.conf # Optional: only if using rclone features \ ghcr.io/smokin-salmon/smoked-salmon:latest checkconf
If the configuration is valid, use the
migratecommand to initialize or upgrade the database schema: Once migration is complete, you may launch container in persistent mode withwebcommand. -
Connect to the Running Container
To manually execute operations inside the container(webcommand required), connect via SSH and run:docker exec -it smoked-salmon /bin/shThen, inside the container, you can run the commands like this:
.venv/bin/salmon up "/path/to/your/music" -s WEB
-
Permission Issues
The container currently able to handle permissions properly.
If your torrent client is not run as root, or if new uploads are inaccessible, you may need to:- Manually adjust file/folder ownership (
chown) or permissions (chmod) - Ensure the container and torrent client users are compatible
- Optionally run containers with matching
--userflags or addumasklogicuser: "1001:100" environment: - PUID=1001 - PGID=100
- Manually adjust file/folder ownership (
-
.torrent Directory Mapping
Depending on how you've set theDOTTORRENTS_DIRin yourconfig.toml, you may need to map an additional directory for.torrentfile output. Add:-v /your/host/torrent/output:/app/.torrents
-
rclone Configuration
If you're using rclone features, make sure to map your rclone configuration file. This is optional and only needed if you plan to use rclone functionality. You can find your rclone config file location by runningrclone config fileon your host system:-v /path/to/your/rclone.conf:/root/.config/rclone/rclone.conf
If using Portainer or Docker Compose, here's an example stack for persistent usage:
version: "3"
services:
smoked-salmon:
image: ghcr.io/smokin-salmon/smoked-salmon:latest
container_name: smoked-salmon
network_mode: host
restart: unless-stopped
volumes:
- /path/to/your/music:/app/.music
- /path/to/your/config.toml/directory:/root/.config/smoked-salmon/
- /path/to/your/smoked.db/directory:/root/.local/share/smoked-salmon/
- /path/to/your/generated/dottorrents:/app/.torrents
- /get/this/from/"rclone config file":/root/.config/rclone/rclone.conf # Optional: only if using rclone features
command: websmoked-salmon uses distinct terminal colors for different types of messages:
- Default β General information
- Red β Errors or critical failures
- Green β Success messages
- Yellow β Information headers
- Cyan β Section headers
- Magenta β User prompts
smoked-salmon runs in CLI mode, except for spectral visualization, which launches a web server. Quick start usage instructions can be found on the Wiki Usage page.
The examples below show how to run smoked-salmon directly. If you're using Docker, you'll need to adjust them accordingly, but the underlying principles remain the same.
On the first run, you will need to create the database:
salmon migrateTo see the available commands, just type:
salmonTo test the connection to the trackers, run:
salmon checkconfTo check the status of salmon's command line and config dependencies, run:
salmon healthTo start an upload (with the WEB source):
salmon up /data/path/to/album -s WEBYou can get help directly from the CLI by appending --help to any command. This is especially useful for the up command which has a lot of possible options.
Spectrals are viewable via a built-in web server. By default, access it at: http://localhost:55110/spectrals
For normal installs:
uv tool update salmonFor manual installs:
cd smoked-salmon
git pull
uv syncFor Docker users:
docker pull ghcr.io/smokin-salmon/smoked-salmon:latestFor bug reports and feature requests, use GitHub Issues. Or use the forums.
"Salmon filled the void in my heart. I no longer chase after girls." ~boot
"With the help of salmon, I overcame my addiction to kpop thots." ~b
"I warn 5 people every day on the forums using salmon!" ~jon
- Originally created by ligh7s. Huge thanks!
- Further development & maintenance by elghoto, xmoforf, miandru, redusys and others. Keeping the dream alive.
- Docker image build workflow and update notification mechanisms heavily inspired from the awesome work of Audionut on his Upload Assistant tool !