spotify-downloader
Triggered rules
pip_install_external
`pip install <package>` fetches an unpinned package from PyPI at build time, outside source=() and makepkg's checksums.
-
PKGBUILD:42
pip install --no-deps --target="$site_packages" redis>=5.0.0 spotipy>=2.24.0
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): The PKGBUILD runs `pip install --no-deps --target=... redis>=5.0.0 spotipy>=2.24.0` during the package() phase, pulling live PyPI packages at build time with version ranges (not pinned hashes). This is a genuine supply-chain concern: any future PyPI release of redis or spotipy satisfying those version constraints will be silently bundled into the installed package without integrity verification (sha256sums is also 'SKIP' for the upstream tarball). The packages themselves (redis, spotipy) are well-known and not inherently malicious, but the pattern of unbounded pip-pulling from an external registry during packaging, combined with no hash pinning, represents a real medium-severity supply-chain risk. Additionally, the hardcoded python3.13 path in site_packages will break on any other Python version. The upstream source is a personal GitHub repo with SKIP checksums, adding further uncertainty. This is not a false positive — the cheaper model's assessment is correct.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Mokshit Bindal <your-email@example.com>
pkgname=spotify-downloader
pkgver=1.0.4
pkgrel=1
pkgdesc="Download Spotify playlists, albums, and tracks in FLAC/MP3 format from free sources with beautiful terminal UI"
arch=('any')
url="https://github.com/MokshitBindal/Spotify_Downloader"
license=('MIT')
depends=(
'python'
'ffmpeg'
'yt-dlp'
'python-click'
'python-dotenv'
'python-mutagen'
'python-pydub'
'python-requests'
'python-tqdm'
'python-yaml'
)
makedepends=('python-setuptools' 'python-build' 'python-installer' 'python-wheel' 'python-pip')
optdepends=()
source=("${pkgname}-${pkgver}.tar.gz::https://github.com/MokshitBindal/Spotify_Downloader/archive/v${pkgver}.tar.gz")
sha256sums=('SKIP')
build() {
cd "${srcdir}/Spotify_Downloader-${pkgver}"
python -m build --wheel --no-isolation
}
package() {
cd "${srcdir}/Spotify_Downloader-${pkgver}"
# Install the wheel
python -m installer --destdir="$pkgdir" dist/*.whl
# Bundle redis and spotipy (not available in official Arch repos)
# Note: We always bundle these to avoid conflicts with user-installed system packages
# Users who have python-redis or python-spotipy can uninstall our package first
local site_packages="$pkgdir/usr/lib/python3.13/site-packages"
pip install --no-deps --target="$site_packages" redis>=5.0.0 spotipy>=2.24.0
# Install documentation
install -Dm644 README.md "${pkgdir}/usr/share/doc/${pkgname}/README.md"
# Install license
install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
}
post_install() {
echo ""
echo "======================================================================"
echo " Spotify Downloader installed successfully!"
echo "======================================================================"
echo ""
echo " NOTE: This package bundles python-redis and python-spotipy."
echo " If you have these installed separately, you may see file conflicts."
echo " Solution: sudo pacman -R python-redis && yay -R python-spotipy"
echo ""
echo " First-time setup:"
echo " 1. Get Spotify API credentials: https://developer.spotify.com/dashboard"
echo " 2. Edit: ~/.config/spotify-downloader/config.yaml"
echo ""
echo " Without Spotify credentials, you can still download from:"
echo " - Internet Archive (free FLAC)"
echo " - Jamendo (Creative Commons music)"
echo " - YouTube (fallback)"
echo ""
echo " Refresh shell command cache: hash -r"
echo "======================================================================"
echo ""
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | MEDIUM | 2 |
| 2026-08-02 00:16:08 | MEDIUM | 2 |
| 2026-08-01 00:11:18 | MEDIUM | 2 |
| 2026-07-31 00:14:10 | MEDIUM | 2 |
| 2026-07-30 00:17:23 | MEDIUM | 2 |
| 2026-07-29 00:25:53 | MEDIUM | 2 |
| 2026-07-28 00:07:28 | MEDIUM | 2 |
| 2026-07-27 00:24:32 | MEDIUM | 2 |
| 2026-07-26 00:07:32 | MEDIUM | 2 |
| 2026-07-25 00:13:44 | MEDIUM | 2 |
| 2026-07-24 00:02:28 | MEDIUM | 2 |
| 2026-07-23 00:14:47 | MEDIUM | 2 |
| 2026-07-22 00:29:32 | MEDIUM | 2 |
| 2026-07-21 00:24:15 | MEDIUM | 2 |
| 2026-07-20 00:19:49 | MEDIUM | 2 |
| 2026-07-19 00:17:08 | MEDIUM | 2 |
| 2026-07-18 00:14:48 | MEDIUM | 2 |
| 2026-07-17 00:06:16 | MEDIUM | 2 |
| 2026-07-16 00:05:41 | MEDIUM | 2 |
| 2026-07-15 00:09:25 | MEDIUM | 2 |