MSD

module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 28, 2026 License: GPL-3.0

README

MSD - Multi Site Downloader

CI Go Report Card codecov

MSD resolves supported album, folder, creator, and post URLs into downloadable files, then downloads them concurrently with resume support. It is meant for public links first, while still allowing optional site credentials when a site blocks guest access or requires an account token.

Supported Sites

Site URL shape Notes
Bunkr https://bunkr.cr/a/<id>, https://bunkr.cr/f/<id> Public albums and single files with signed CDN links.
CoomerFans https://coomerfans.com/u/<service>/<id>/<name>, https://coomerfans.com/p/<post>/<id>/<service> Creator pages and single posts. Writes post-links.txt.
Cyberdrop https://cyberdrop.cr/f/<id> Public single files with signed CDN links.
Filester https://filester.me/f/<slug> Public folders with HTML pagination plus generated CDN links.
Gofile https://gofile.io/d/<id> Guest mode by default. Uses a configured token if provided.
Instagram https://www.instagram.com/<username>/, https://www.instagram.com/reel/<shortcode>/ Public profile media and direct reels. Writes post-links.txt; profile filenames use YYMMDD_N.ext, reel filenames use YYMMDD_reel_N.ext.
Kemono/Pawchive https://kemono.cr/<service>/user/<id>, https://pawchive.st/<service>/user/<id> Creator archives. Writes post-links.txt.
Pixeldrain https://pixeldrain.com/l/<id>, https://pixeldrain.com/u/<id> Public lists and single files.
Turbo https://turbo.cr/a/<id>, https://turbo.cr/d/<id> Public albums and single files with signed CDN links.

See docs/sites.md for per-site behavior, limits, and authentication notes.

Install

Pick one install route. Pre-built release binaries are simplest, packages are best for system installs, Docker is useful for isolated runs, and source builds are best for development.

Option 1: pre-built binary

Download the archive for your platform from the latest release, extract it, and put msd on your PATH.

Asset names follow this pattern:

msd-<version>-<os>-<arch>.tar.gz
msd-<version>-windows-amd64.zip

Release builds currently target:

OS Architectures
Linux amd64, arm64
macOS amd64, arm64
Windows amd64

Linux example:

VERSION=$(curl -sIL -o /dev/null -w '%{url_effective}' https://github.com/Wasylq/MSD/releases/latest | sed 's|.*/||')
ARCH=amd64

curl -LO "https://github.com/Wasylq/MSD/releases/download/${VERSION}/msd-${VERSION}-linux-${ARCH}.tar.gz"
tar xzf "msd-${VERSION}-linux-${ARCH}.tar.gz"
sudo install -m 0755 msd /usr/local/bin/msd
msd --version

macOS example:

VERSION=$(curl -sIL -o /dev/null -w '%{url_effective}' https://github.com/Wasylq/MSD/releases/latest | sed 's|.*/||')
ARCH=arm64    # use amd64 for Intel Macs

curl -LO "https://github.com/Wasylq/MSD/releases/download/${VERSION}/msd-${VERSION}-darwin-${ARCH}.tar.gz"
tar xzf "msd-${VERSION}-darwin-${ARCH}.tar.gz"
sudo install -m 0755 msd /usr/local/bin/msd
msd --version

Windows PowerShell example:

$Version = (Invoke-RestMethod -Uri "https://api.github.com/repos/Wasylq/MSD/releases/latest").tag_name

Invoke-WebRequest -Uri "https://github.com/Wasylq/MSD/releases/download/$Version/msd-$Version-windows-amd64.zip" -OutFile msd.zip
Expand-Archive -Path msd.zip -DestinationPath .

New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\bin" | Out-Null
Move-Item -Force msd.exe "$env:USERPROFILE\bin\msd.exe"
[Environment]::SetEnvironmentVariable("Path", "$env:Path;$env:USERPROFILE\bin", "User")

Restart the shell after changing PATH, then run:

msd --version
Option 2: Linux packages

Each tagged release publishes .deb and .rpm packages.

TAG=$(curl -sIL -o /dev/null -w '%{url_effective}' https://github.com/Wasylq/MSD/releases/latest | sed 's|.*/||')
VERSION=${TAG#v}
ARCH=amd64

# Debian / Ubuntu
curl -LO "https://github.com/Wasylq/MSD/releases/download/${TAG}/msd_${VERSION}_${ARCH}.deb"
sudo dpkg -i "msd_${VERSION}_${ARCH}.deb"

# Fedora / RHEL
curl -LO "https://github.com/Wasylq/MSD/releases/download/${TAG}/msd-${VERSION}-1.x86_64.rpm"
sudo rpm -i "msd-${VERSION}-1.x86_64.rpm"

Arch Linux:

yay -S msd
Option 3: Docker
docker pull ghcr.io/wasylq/msd:latest
docker run --rm ghcr.io/wasylq/msd:latest --help

For real downloads, mount an output directory:

docker run --rm \
  --user "$(id -u):$(id -g)" \
  -v "$PWD/downloads:/data" \
  -w /data \
  ghcr.io/wasylq/msd:latest \
  'https://pixeldrain.com/l/<id>'

See docs/docker.md for config mounts, credentials, image tags, and troubleshooting.

Option 4: build from source

Requires Go 1.26.3 or newer, matching the go directive in go.mod.

git clone https://github.com/Wasylq/MSD
cd MSD
make build
./msd --version

Or install directly:

go install github.com/Wasylq/MSD/cmd/msd@latest

Quick Start

Preview what would be downloaded:

msd --dry-run 'https://pixeldrain.com/l/<id>'

Download into the current directory:

msd 'https://pixeldrain.com/l/<id>'

Choose an output directory:

msd -o downloads 'https://pawchive.st/patreon/user/11111111'

Download multiple URLs in one run:

msd -o downloads \
  'https://pixeldrain.com/l/<id>' \
  'https://filester.me/f/<slug>'

Use a password for protected albums:

msd --password 'album-password' 'https://gofile.io/d/<id>'

Use a Gofile token when available:

MSD_GOFILE_TOKEN='your-token' msd 'https://gofile.io/d/<id>'

Or place it in config.yaml:

sites:
  gofile:
    account_token: your-token

Keys are optional. MSD tries guest/no-key access first unless a token is provided. If a site rejects anonymous access, MSD reports an authentication or rate-limit error instead of requiring credentials up front.

Output Layout

Downloads go under the configured output directory. By default, MSD uses the user's Downloads directory; --output, MSD_DOWNLOAD_DIR, or download_dir can override it. If the site provides an album/archive name, MSD creates a sanitized subdirectory:

downloads/
  kemono-patreon-creator/
    2026-03-18 - Post Title - 33333333 - 01 - file.jpg
    post-links.txt

Files are written to .part paths first, then renamed after completion. Existing complete files are skipped. Existing partial files are resumed unless --no-resume is set.

For creator/archive sites that expose source posts, MSD writes post-links.txt beside the downloaded files.

Config File

Optional YAML config lives at:

Platform Path
Linux ~/.config/msd/config.yaml
macOS ~/Library/Application Support/msd/config.yaml
Windows %APPDATA%\msd\config.yaml

Start from config.example.yaml:

mkdir -p ~/.config/msd
cp config.example.yaml ~/.config/msd/config.yaml
chmod 600 ~/.config/msd/config.yaml

download_dir supports ~, $HOME, environment variables, and ${XDG_DOWNLOAD_DIR} for the platform Downloads folder.

Precedence, highest first:

  1. CLI flags
  2. Environment variables
  3. Config file
  4. Built-in defaults

See docs/configuration.md for every config key and credential source.

Documentation

Document Contents
docs/usage.md CLI flags, examples, output behavior, and troubleshooting
docs/configuration.md Config file reference, environment variables, credential precedence
docs/sites.md Supported sites, URL patterns, site-specific notes
docs/background.md Periodic background runs on Linux, macOS, and Windows
docs/docker.md Docker image tags, volumes, config, credentials
docs/architecture.md Internal design for contributors
CONTRIBUTING.md Development workflow and adding site handlers

Development

make test
make lint

Live integration tests use real target sites and are intentionally manual:

make smoke
make smoke-one SITE=pixeldrain

Gofile live smoke tests may require MSD_GOFILE_TOKEN, GOFILE_TOKEN, or sites.gofile.account_token depending on the network and content.

Troubleshooting

No site handler matches URL: check docs/sites.md for supported URL shapes.

Authentication required: the URL may need a password, account token, premium account, or the site may be blocking guest access.

Rate limited: wait and retry with lower concurrency or a longer request delay.

Site structure changed: the target site changed its HTML/API. Run with -d and open an issue with the URL shape and error.

Directories

Path Synopsis
cmd
msd command
internal

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL