an e621 download-o-match for a danish good boy
- C# 92.2%
- HTML 5.4%
- Shell 2.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| Api | ||
| assets | ||
| docs | ||
| installer | ||
| Themes | ||
| .gitignore | ||
| AboutDialog.xaml | ||
| AboutDialog.xaml.cs | ||
| ApiNudgeDialog.xaml | ||
| ApiNudgeDialog.xaml.cs | ||
| app.manifest | ||
| App.xaml | ||
| App.xaml.cs | ||
| CHANGELOG.md | ||
| CredentialStore.cs | ||
| DanishFapcache.csproj | ||
| DarkTitleBar.cs | ||
| DbNagDialog.xaml | ||
| DbNagDialog.xaml.cs | ||
| deploy.sh | ||
| DownloadModeDialog.xaml | ||
| DownloadModeDialog.xaml.cs | ||
| GalleryView.xaml | ||
| GalleryView.xaml.cs | ||
| GalleryViewer.xaml | ||
| GalleryViewer.xaml.cs | ||
| GifInfo.cs | ||
| LoginDialog.xaml | ||
| LoginDialog.xaml.cs | ||
| MainWindow.xaml | ||
| MainWindow.xaml.cs | ||
| make-installer.sh | ||
| NaturalComparer.cs | ||
| OptionsWindow.xaml | ||
| OptionsWindow.xaml.cs | ||
| PostMetadata.cs | ||
| README.md | ||
| release.sh | ||
| Settings.cs | ||
| SPEC.md | ||
| UpdateService.cs | ||
| version.json | ||
| VideoThumbnailer.cs | ||
| ViewerItem.cs | ||
Danish Fapcache
A native Windows (WPF, .NET 8) client for e621: log in with your API key, search by tags, skip posts with unwanted tags, and batch-download in your chosen order.
Screenshots
Features
- Login via a Log in/Log out button and dialog — get an API key at
https://e621.net/api_keys (also linked in the dialog). The key is stored
encrypted with Windows DPAPI under
%APPDATA%\DanishFapcache; logging out deletes it. - Tag pills: hitting space commits a typed tag into a removable pill;
skip-tag pills are tinted red. An optional date range narrows results
(API metatags; local
created_atfilter in export mode). - Result actions: hover for full metadata, double-click for a resizable preview window, right-click to download one post or open it on e621.
- Gallery mode: browse downloaded folders with thumbnails — paged 500 at a time so 100k-file libraries stay fast — with filename filtering, type filtering (images/animations), sorting (newest/oldest/recently downloaded/natural A–Z), a fullscreen WebView2 viewer (webm/mp4/gif included, with remembered volume), and a slideshow over the whole filtered set, not just the visible page.
- Slideshow niceties: controls and cursor stay out of the way while it runs, images change with a subtle dip-to-black (manual browsing stays instant), + / − adjust the speed on the fly, and with play-through (⇥) on, videos advance when they finish and animated gifs finish their loop first — short loops repeat until your delay is filled.
- Installer & updates:
make-installer.shbuilds a per-user MSI (Start-menu shortcut, Add/Remove entry, no elevation) and stages it with aversion.jsonmanifest in the repo, which doubles as the update channel — the app checks it on startup and offers one-click updates. - Artist blacklist in Options: their posts never appear, from either source.
- Search with include tags and skip tags; order by latest, oldest, most
popular (
order:score), or most favourited (order:favcount). - Two sources: live API queries, or e621's daily DB export — a ~2 GB
posts.csv.gzdump downloaded once and imported into a local indexed database (a couple of minutes, once per dump), after which even huge searches answer in milliseconds and cost the site nothing. - Downloads panel showing each file's thumbnail, name, size, resolution, score, favourites, rating, and live status/progress.
- Options: User-Agent template, API request interval (clamped to e621's
2 req/s hard limit), delay between downloads, download folder, and filename
template (
{id} {artist} {md5} {score} {rating} {ext}). - Files land in
Downloads\DanishFapcache\<tag-slug>\by default; already downloaded files are skipped.
Building from WSL
The app is cross-built from Linux with EnableWindowsTargeting and run on the
Windows side (needs the .NET 8 Windows Desktop runtime there):
./deploy.sh # publish, copy to %LOCALAPPDATA%\DanishFapcache, launch
./deploy.sh --no-launch
Being a good API citizen
The client sends a descriptive User-Agent identifying the app (your username is
included only if you add {username} to the template yourself), paces API
calls at ~1/sec by default, and never exceeds the 2 req/s hard limit — the
Options dialog clamps whatever you enter.
