A cross-platform web novel downloader and machine translation (MTL) tool that converts Chinese web novels into English .epub for any e-reader. Available as a PowerShell CLI for Windows and an Android app built with .NET MAUI.
| Site | Example URL |
|---|---|
| 69shuba.com | https://www.69shuba.com/book/90417.htm |
| 52shuku.net | https://www.52shuku.net/bl/09_b/bkd7d.html |
| czbooks.net | https://czbooks.net/n/clgajm |
| dmxs.org | https://www.dmxs.org/gdjk/22982.html |
| quanben.io | https://www.quanben.io/n/aoshidanshen/list.html |
| situu.cc | https://www.situu.cc/5_5792/ |
| yamibo.com | https://www.yamibo.com/novel/267137 |
czbooks.net and 69shuba.com is protected by Cloudflare. Shuka handles this automatically using a headless browser on Windows and a hidden WebView on Android β no extra setup needed.
Requires .NET 9 SDK (Windows CLI) and .NET 10 SDK (Android / MAUI).
dotnet build -c ReleaseWindows installer β publish first then compile with Inno Setup:
dotnet publish Shuka.Windows/Shuka.Windows.csproj -c Release -r win-x64 --self-contained true -o Shuka.Windows/bin/publish
Shuka.Windows/bin/publish/Shuka.exe playwright install chromium
ISCC.exe Shuka.Windows/installer.issAndroid APK:
dotnet publish Shuka.Android/Shuka.Android.csproj -f net10.0-android -c ReleaseImplement ISiteAdapter in Shuka.Core/Adapters/ and register it in BookService.Adapters:
// Shuka.Core/Adapters/MySiteAdapter.cs
public class MySiteAdapter : ISiteAdapter
{
public string SiteName => "mysite.com";
// Return true if the URL belongs to this site
public bool Matches(string url) => url.Contains("mysite.com");
// Normalize an arbitrary page URL to the novel's index/chapter-list URL
public string NormalizeUrl(string url) => /* strip chapter suffix, etc. */;
// Parse the index page HTML β return title, author, cover URL, and ordered chapter list
public IndexInfo ParseIndex(string html, string indexUrl)
{
// IndexInfo(title, author, List<ChapterRef>, coverUrl)
// ChapterRef(url, displayTitle)
var chapters = new List<ChapterRef> { new("https://mysite.com/ch1", "Chapter 1") };
return new IndexInfo("Title", "Author", chapters, coverUrl: null);
}
// Extract paragraph text from a chapter page
public List<string> ExtractChapterText(string html) => /* return one string per paragraph */;
// Set to true only if the site is behind Cloudflare (uses headless browser / WebView)
public bool RequiresCfBypass => false;
}Then register it in the Adapters array:
// Shuka.Core/BookService.cs
public static readonly ISiteAdapter[] Adapters =
[new ShukuAdapter(), new CzBooksAdapter(), new DmxsAdapter(), new ShubaAdapter(),
new QuanbenAdapter(), new SituuAdapter(), new YamiboAdapter(),
new MySiteAdapter()]; // β add hereThat's all β BookService will automatically detect and route downloads to your adapter.
See LICENSE.
