smfetch
Web interface for downloading simfiles from Zenius-i-Vanisher and StepManiaOnline.
Usage
usage: smfetch [-h] [-p PORT]
smfetch web interface
options:
-h, --help show this help message and exit
-p, --port PORT port for the web interface (default: 8095)
Starts a web interface at http://localhost:<port>.
Features
Update tracking
smfetch remembers which packs you have installed and when, then watches Zenius' latest official and latest user listings for changes to those packs. When a chart is revised or added, it is downloaded individually into the pack it belongs to — no re-downloading a whole pack for one chart.
- Review before applying. Detections collect in the Updates view. You choose what to pull and when; nothing downloads on its own.
- One entry per chart. If a chart changes several times between applies it stays a single pending item that advances to the newest version, so applying fetches the latest revision once. If a chart changes again while its download is running it stays pending for the next pass, rather than being silently marked current.
- Adopting what you already have. Scan the songs directory to find pack folders smfetch did not install and link them to their Zenius category by name match. Charts already on disk are treated as current, so only changes published after linking are reported.
- StepManiaOnline packs too. The two sites carry many of the same packs, so
a pack downloaded from StepManiaOnline can be linked to its Zenius
counterpart and updated from there. Linking records the origin separately, so
the pack still shows where it came from. Song folders are matched by name
when linking —
attitudeon disk againstAttitudeon Zenius — so an update replaces the song already installed instead of dropping a second copy beside it. A chart the pack does not have yet arrives under its Zenius title.
Update checking joins on a Zenius pack, so a pack with no link is never
checked. The Installed Packs view marks those unlinked and offers to link
them.
Checks run on a configurable interval (6 hours by default) and on demand. The user listing only reaches back about a week, so an interval of a day or less is worthwhile if you follow user packs.
Zenius-i-Vanisher
- Song search — search by song name and/or artist, select and download individual charts
- Pack search — filter official or user packs, download selected packs
- Bundles — one-click download of arcade, spinoff, or all official packs
StepManiaOnline
- Title search — search packs that contain a chart with a song title
- Artist search — search packs that contain a chart by an artist
- Pack search — filter all packs by name
Interface
The UI is dependency-free HTML, CSS and JavaScript served straight from the package — no build step, and no network fetches at runtime. It follows your system light/dark preference and has a manual toggle.
| Key | Action |
|---|---|
/ |
Focus the current view's search box |
J |
Toggle the downloads panel |
U |
Jump to Updates |
Esc |
Close any panel or dialog |
Storage Defaults
| Config | Songs | Logs | |
|---|---|---|---|
| Linux | ~/.config/smfetch/ |
~/.local/share/smfetch/ |
~/.local/state/smfetch/logs/ |
| macOS | ~/Library/Application Support/smfetch/ |
~/Music/StepMania Songs/ |
~/Library/Logs/smfetch/ |
| Windows | %APPDATA%/smfetch/ |
~/Music/StepMania Songs/ |
%LOCALAPPDATA%/smfetch/logs/ |
Installed packs and pending updates live in library.json inside the config
directory. Deleting it only loses update history — nothing on disk is touched,
and a scan will re-adopt your packs.
Development
make run # start the app
make format # ruff format
make check # ruff lint + ty
make test # pytest
make install # clean, format, check, sync, test
The test suite is fully offline and takes well under a second. Scrapers run
against trimmed captures of real Zenius pages in tests/fixtures/, so changes
to the parsing are checked against the markup the site actually serves; the rest
runs against a scriptable fake site with Zenius' clock pinned, and any
unexpected request fails the test rather than reaching the network. Config,
songs and library state are redirected to a temporary directory, so running the
tests never touches your real collection.
Notes on upstream timestamps
Zenius reports ages relative to its own clock ("2.6 days ago") and exact times only on an individual simfile's page. smfetch derives the site's clock offset from a recent simfile so relative ages resolve to absolute times, screens the listings cheaply with those, and confirms anything that looks changed against the exact timestamp before recording it. Rounded ages carry real slop — a value in weeks is only good to a few hours — so comparisons allow a tolerance scaled to the unit, which is what keeps unchanged charts from reappearing as updates.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file smfetch-1.3.3.tar.gz.
File metadata
- Download URL: smfetch-1.3.3.tar.gz
- Upload date:
- Size: 124.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00702785f950ac81dbfb43a52fd9d7782567bfc313ffa2e0171c3d54cbe4a996
|
|
| MD5 |
37e2e1a6d4799a6ca1b8cb887bcba0d6
|
|
| BLAKE2b-256 |
94ef261ece486feed3c7d1d4391631bdac903044ed172efbd593be0a5fb35c10
|
File details
Details for the file smfetch-1.3.3-py3-none-any.whl.
File metadata
- Download URL: smfetch-1.3.3-py3-none-any.whl
- Upload date:
- Size: 48.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a0723dbf7d888856e3aef2a2ca96973b80775db5f684112b488210fb02a603a
|
|
| MD5 |
67af29fb8db0b6232defb7b73dff1511
|
|
| BLAKE2b-256 |
1b9018be15b1c4f34a48c83117f59006fa7c74251dcfcc8d3bf0d9e11f35c9a6
|