A high-level wrapper around jmcomic that provides a fluent search and download API plus a simple CLI.
jmci keeps the most common album search and download workflows, while hiding lower-level details of jmcomic.
- Fluent, chainable search API for albums
- Flexible download API with folder, PDF, and ZIP export formats
- Built-in CLI:
jmci searchandjmci download - Logging and progress output with rich formatting
- Minimal wrapper focused on the most useful
jmcomicworkflows
Requires Python 3.12+
pip install jmciOr with uv:
uv add jmcifrom jmci import Download, Search, SearchType, ExportFormat, enable_logging
# Enable rich logging
enable_logging(True)
# Search albums
results = (
Search("keyword")
.searching(SearchType.author)
.pages([1, 2])
.order_by("score")
.filter_time("week")
.category("doujin")
.sub_category("chinese")
.process()
)
for item in results:
print(item.id, item.title)
# Download one or more albums
(
Download([123456, 789012])
.export_format(ExportFormat.folder | ExportFormat.pdf)
.directory("./downloads")
.jpg(True)
.pictures(30)
.process()
)jmci search "keyword" --search-type author --order-by score --pages 1 2 --filter-time week
jmci download 123456 --directory ./downloads --export-format pdf zip --jpg
jmci download 123456 --coverUse Search to build a search request and execute it with process().
from jmci import Search, SearchType, OrderBy, FilterTime, Category, SubCategory
results = (
Search("keyword")
.searching(SearchType.tag)
.pages([1])
.order_by(OrderBy.latest)
.filter_time(FilterTime.all)
.category(Category.all)
.sub_category(SubCategory.none)
.process()
)Search supports:
searching(type)— chooseSearchType(all, work, author, tag, actor)pages(pages)— search pagination pageskeyword(keyword)— update the search keywordorder_by(order_by)— ordering strategyfilter_time(filter_time)— publication time filtercategory(category)— main category filtersub_category(sub_category)— subcategory filterprocess()— execute the search and return resultsprocess_select(converter)— convert results while processingwhere(filter),sort(key),reverse(),join(...)— filter and transform results
SearchResult objects expose:
idtitletags
Use Download to download albums with configurable export options.
from jmci import Download, ExportFormat
(
Download([123456])
.directory("./downloads")
.export_format(ExportFormat.folder | ExportFormat.zip)
.jpg(True)
.pictures(20)
.process()
)Download supports:
downloading(album_ids)— replace the album listadd(id),remove(id),pop(index),insert(index, id),extend(ids)— manage album IDsexport_format(format)— set output formatadd_export_format(format)/remove_export_format(format)— modify format setdirectory(directory)— output directoryjpg(convert_to_jpg=True)— convert pictures to JPGpictures(pictures)— limit download concurrency per albumprocess()— perform full album download and exportprocess_download_cover()— download album cover images only
Supported export formats:
ExportFormat.folderExportFormat.pdfExportFormat.zip
Formats can be combined using bitwise OR.
jmci exposes enable_logging() to toggle rich logging output.
from jmci import enable_logging
enable_logging(True)Documentation is available under docs/source and can be built with Sphinx:
uv run sphinx-build -b html docs/source docs/buildjmci is a lightweight wrapper and depends on:
jmcomicrichtyperbeartypeimg2pdf
MIT License