Sign inSign up

rocketdude147/mylar3

By rocketdude147

Updated 11 days ago

Image
0

4.1K

rocketdude147/mylar3 repository overview

mylar3

A modded Mylar3 — the comic book manager — built on upstream v0.9.0.

Two things distinguish it. The Comic Vine API base URL is settable by environment variable, so Mylar can be pointed at a local caching proxy instead of comicvine.gamespot.com; stock hard-codes it. And it ships seven additional download providers plus bulk library tooling, with every binary those providers need already in the image.

The fork touches 77 files against upstream and adds 16 new ones. Everything below is what that actually buys you.


What's different from stock Mylar3

Comic Vine base URL is an environment variable
# mylar/__init__.py
CONFIG.COMICVINE_BASE_URL = os.environ.get(
    'COMICVINE_BASE_URL',
    'https://comicvine.gamespot.com/api/'
)
CVURL = CONFIG.COMICVINE_BASE_URL

CVURL is driven exclusively by this variable. config.py deliberately no longer writes it — upstream's config.ini-based override clobbered the env value on every config validation, which silently sent Mylar back to the public API mid-run. Unset, behaviour is identical to stock.

Added download providers
ModuleProvider
downloaders/batcave.pyBatCave
downloaders/readcomiconline.pyReadComicOnline (Selenium path — needs Chromium)
downloaders/airdcpp.pyAirDC++ (Direct Connect hubs)
downloaders/jdownloader2.pyJDownloader2 handoff
downloaders/rootz.pyRootz
downloaders/vikingfile.pyVikingFile
downloaders/florenfile.pyFlorenFile

Upstream's mega.py, mediafire.py and pixeldrain.py are also modified.

Added modules
ModulePurpose
bulkops.pyBulk-library operations: CBR→CBZ conversion, incomplete-series query
comicsnake.pyComicSnake search provider
cloudflare.pyCloudflare challenge handling for gated providers
comiccodes.pyComic code lookup helpers

New UI: bulktools.html, gcweeklypull.html, plus a reworked managecomics view in both the default and carbon themes.

Bundled binaries
BinaryWhy
unrarStock relies on the host having it; CBRs fail without it. From ghcr.io/linuxserver/unrar
megatoolsThe bundled mega.py is rate-limit-prone. Pulled from Alpine edge/testing, deps resolved from stable
Chromium + chromedriverThe ReadComicOnline Selenium path needs a real browser. CHROMIUM_PATH / CHROMEDRIVER_PATH are preset

Base is python:3.11-alpine, CMD ["python", "Mylar.py"]. Config format, database schema and the web UI are otherwise unchanged, so an existing install moves across as-is.


Quick start

services:
  mylar3:
    image: rocketdude147/mylar3:latest
    container_name: mylar3
    restart: unless-stopped
    ports:
      - "8090:8090"
    environment:
      - TZ=America/New_York
    volumes:
      - ./config/config.ini:/app/config.ini
      - ./config/mylar.db:/app/mylar.db
      - ./config/cache:/app/cache
      - /srv/media/Comics:/comics
      - /srv/downloads/comics:/downloads
    cpus: 2.5
    mem_limit: 3g
mkdir -p config
touch config/config.ini config/mylar.db     # must exist as FILES first
docker compose up -d

Open http://localhost:8090.

config.ini and mylar.db are bind-mounted as files, not directories. If they do not exist on the host first, Docker creates directories with those names and Mylar fails to start with an unhelpful error. touch them before the first up.

The image has no EXPOSE; Mylar listens on its usual 8090 unless you pass -p.


Pointing it at a Comic Vine cache

The reason the image exists:

    environment:
      - COMICVINE_BASE_URL=http://192.168.1.10:15650/api

Include the /api suffix — the value is used as the full base. Nothing to set in the UI, and nothing that can drift back to the public API on upgrade.

Set the cache up first: see the rocketdude147/comicvinecacher guide.

Verify:

docker logs mylar3 2>&1 | grep -i comicvine | head
curl -s http://192.168.1.10:15650/api/clients      # Mylar should appear

You still need a Comic Vine API key in Mylar's settings. The cache passes it through and rate-limits on your behalf; it does not replace authentication.


Running both together

Run them as separate stacks. The cache has its own lifecycle and (in the full build) nine VPN sidecars; you do not want a Mylar restart cycling that.

Host networking — what the reference stack uses
services:
  mylar3:
    image: rocketdude147/mylar3:latest
    container_name: mylar3
    network_mode: host
    environment:
      - COMICVINE_BASE_URL=http://192.168.1.10:15650/api

No port mapping — Mylar binds 8090 on the host directly.

Shared bridge network
docker network create comicvine_lb
# both stacks
networks:
  comicvine_lb:
    external: true

# mylar service
    networks: [comicvine_lb]
    environment:
      - COMICVINE_BASE_URL=http://comicvine:5000/api

Container-to-container uses the container port 5000, not the published 15650.


Full reference deployment

services:
  mylar3:
    image: rocketdude147/mylar3:latest
    container_name: mylar3
    restart: unless-stopped
    network_mode: host
    environment:
      - TZ=America/New_York
      - COMICVINE_BASE_URL=http://192.168.1.10:15650/api
    volumes:
      - /srv/config/mylar3/config.ini:/app/config.ini
      - /srv/config/mylar3/mylar.db:/app/mylar.db
      - /srv/config/mylar3/images/cache:/app/cache
      - /srv/media/Comics:/comics                    # library
      - /srv/media/Comics to Process:/process        # manual post-processing
      - /srv/downloads/comics:/downloads             # completed downloads
      - /srv/downloads/comicstuff:/comicstuff        # scratch
      - modded_mylar:/cached
    cpus: 2.5
    mem_limit: 3g
    mem_reservation: 1g

volumes:
  modded_mylar:

Paths must match on both sides. Whatever your download client reports as a finished path must be the path Mylar sees. If the client is also containerised, mount /srv/downloads/comics at the same location in both.


Environment reference

Every variable the code reads:

VariableDefaultNotes
COMICVINE_BASE_URLhttps://comicvine.gamespot.com/api/The mod. Include /api. Overrides config.ini
CHROMIUM_PATH/usr/bin/chromiumPreset in the image
CHROMEDRIVER_PATH/usr/bin/chromedriverPreset in the image
TZUTCScheduling and log timestamps

Everything else lives in config.ini or the web UI, as upstream.

Provider settings (web UI → Config)

The added providers use config keys such as ENABLE_BATCAVE, ENABLE_COMICSNAKE, COMICSNAKE_URL, ENABLE_AIRDCPP, AIRDCPP_HOST, AIRDCPP_USERNAME, AIRDCPP_PASSWORD, AIRDCPP_HUBS, AIRDCPP_ANNOUNCE_HUB, AIRDCPP_ANNOUNCE_BOTS, AIRDCPP_DOWNLOAD_DIR, AIRDCPP_VERSION. Set them in the UI rather than hand-editing config.ini.

Command-line flags

CMD is python Mylar.py; override to pass any of:

-v/--verbose, -q/--quiet, -d/--daemon, -p/--port, -b/--backup, -w/--noweekly, -iu/--ignoreupdate, --datadir, --config, --nolaunch, --pidfile, --safe

    command: ["python", "Mylar.py", "--nolaunch", "-p", "8090"]

Volumes

MountPurpose
/app/config.iniConfig file — create on host first
/app/mylar.dbSQLite database file — create on host first
/app/cacheCover art / metadata cache
/comicsLibrary
/downloadsWhere the download client drops completed files
/processManual post-processing drop box
/comicstuffScratch space
/cachedNamed volume for working state

Migrating an existing Mylar3

Schema and config format are unchanged:

  1. Stop the old container.
  2. Copy config.ini and mylar.db to the new host paths.
  3. Start this image with the same library and download mounts.
  4. Optionally add COMICVINE_BASE_URL.

Back up mylar.db first. Rolling back to stock works the same way — stock simply ignores the env var. The added providers write their own config.ini keys, which stock will ignore rather than choke on.


Gotchas

network_mode: host ignores ports:. Set both and the mapping is silently inert.

mem_limit: 3g is not arbitrary. Large post-processing batches and the Selenium path will grow past a smaller ceiling and get OOM-killed mid-import, which can leave a series half-processed.

Comic Vine's rate limit is the real constraint on a first import. 200 requests/hour against a library of thousands of issues is days of walking, regardless of hardware. That is what the cache is for.

ReadComicOnline needs the Chromium env vars. They are preset; if you override CHROMIUM_PATH to something that does not exist, that downloader fails while the rest keep working — so the symptom is one provider quietly never succeeding.

Cloudflare-gated providers can still fail. cloudflare.py handles the common challenge, but a provider that escalates to a full interactive challenge will need an external solver.

megatools comes from Alpine edge/testing. Only that package is pulled from edge; its runtime deps resolve from stable. If a rebuild ever fails on it, that pin is the first place to look.

Tag summary

Content type

Image

Digest

sha256:89d7a1bc9

Size

571.6 MB

Last updated

11 days ago

docker pull rocketdude147/mylar3