Skip to main content

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

Downloads

Both sites are downloaded from the same way. A transfer that gives out partway is resumed from where it stopped rather than started over, and one that keeps dropping is retried for as long as it keeps gaining ground — a pack whose connection breaks every few hundred megabytes still arrives. A server that is merely busy is waited out and asked again; one that says the archive is not there is believed the first time.

A download either lands or fails, and a job says which. Nothing partial is left on disk, and nothing that failed is recorded as installed — an error page served in place of an archive is a failure, not an empty chart.

Quitting is prompt whatever is in flight: downloads are told to stop and give up where they are, rather than being waited out. A pack with gigabytes still to fetch does not hold the process open, and neither does a backoff with minutes left to run.

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. A download that fails stays pending too, with the error against it, so a chart is never marked current at a version that is not on disk.
  • Charts a pack download missed. A Zenius pack with no downloadable archive is fetched a chart at a time, and any chart that does not arrive is queued as pending instead of being inventoried as installed. What is missing is visible in the Updates view and one click from being fetched again.
  • Packs you added yourself. A pack folder copied into the songs directory is picked up on its own — at startup, when you open Installed Packs, and on every check — and listed as local. Nothing is guessed about where it came from, so it stays out of update checking until you link it. A folder with no song folders in it yet is left alone, so a copy still in progress is not adopted half-finished.
  • Linking to Zenius. Any pack without a category can be matched to one by name, from the Installed Packs view or a scan. 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 — attitude on disk against Attitude on 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 and your Zenius links — nothing on disk is touched, and your packs are picked up again from the songs directory on the next start.

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

smfetch-1.5.0.tar.gz (153.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

smfetch-1.5.0-py3-none-any.whl (62.6 kB view details)

Uploaded Python 3

File details

Details for the file smfetch-1.5.0.tar.gz.

File metadata

  • Download URL: smfetch-1.5.0.tar.gz
  • Upload date:
  • Size: 153.5 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

Hashes for smfetch-1.5.0.tar.gz
Algorithm Hash digest
SHA256 877b17ad67d5035149b3875ea6182649d28e894f77e30268ea6735ad73d8a199
MD5 ba18f448b8da1b7399f5168ba257fdc8
BLAKE2b-256 e7b12aea0b2e6bbfecf8de1eabbbdd561b23a5daedf9e2b26842dc754764b024

See more details on using hashes here.

File details

Details for the file smfetch-1.5.0-py3-none-any.whl.

File metadata

  • Download URL: smfetch-1.5.0-py3-none-any.whl
  • Upload date:
  • Size: 62.6 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

Hashes for smfetch-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 436c41f5b376d58864f3a73c63c5fdcc93afb1e456da5e1d4b345de4769704b0
MD5 39d49e33d8bb630458fe31e2b0367914
BLAKE2b-256 f1dd2d85ed67c04f013464a630da585ebd7bc2ec493f66de2320891f2d8c9b4e

See more details on using hashes here.

Release history Release notifications | RSS feed

1.5.1

2 files

This release

1.5.0 This release

2 files

1.4.1

2 files

1.4.0

2 files

1.3.4

2 files

1.3.3

2 files

1.3.2

2 files

1.3.1

2 files

1.3.0

2 files

1.2.0

2 files

1.1.0

2 files

1.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page