- app.py: Removed the
min(30, …)server-side clamp ondays_back; now only enforces a minimum of 1. - sync.html: Removed
max="30"from the days-back input and updated the label to drop the "(1–30)" range hint.
- app.py: Added
build_eft_export()to convert a killmail's victim ship + item flags into EFT-format sections (high/mid/low/rig/subsystem/service plus cargo/drone/fighter/implants/boosters) and pass the string to the kill detail template. - kill_detail.html: Added a new
Copy EFTaction with a readonly export textarea and clipboard copy fallback behavior. - style.css: Styled the EFT export block and monospaced textarea for copy/paste readability.
- config.py: Added
MARKET_ORDER_CONCURRENCY = 20. - fetcher.py: Added
JITA_REGION_ID = 10000002andJITA_STATION_ID = 60003760. Added_fetch_jita_prices_async()— paginatesGET /markets/10000002/orders/?order_type=sell, discovers total pages fromX-Pagesheader on page 1, then fetches remaining pages with up toMARKET_ORDER_CONCURRENCYconcurrent requests via aiohttp. Filters forlocation_id == 60003760, takes minimum sell price pertype_id.fetch_market_prices()now calls this viaasyncio.run()and accepts an optionalprogressdict for live page-count messages. Called fromsync_kills_everefwithprogress=progress. Items not currently listed in Jita will have a price of 0 ISK.
- fetcher.py: Added
ingest_day_progressshared dict (keyed bydate_str, values{kills_done, kills_total, done})._ingest_daycreates an entry when the download completes and updateskills_doneeveryN/100kills during preparation. Main thread setsdone=Trueafterconn.commit(). Empty days are markeddone=Trueimmediately by the worker. - app.py: Added
"ingest_day_progress": {}to the initial progress dict. - sync_progress.html:
<div id="ingest-day-bars">below the ingestion overall bar.updateIngestDayBars()mirrorsupdateFileBars: creates a row per day when first seen, showskills_done / kills_totalas a determinate bar (or "no new kills" for zero-kill days), removes 1 second afterdone.
- config.py: Added
EVEREF_INGEST_WORKERS = 8. RenamedEVEREF_DL_CONNECTIONScomment for clarity. - fetcher.py: Replaced the sequential download→prepare→write loop with a two-pool pipeline. An
ingest_pool(up toEVEREF_INGEST_WORKERSworkers) submits one_ingest_dayclosure per date; each worker blocks on its download future, then filters new kills and prepares row tuples from in-memory dicts. All shared data accessed by workers is read-only (prices,system_sec_map,known_ids). The main thread collects ingest futures in date order and performs sequential DB writes. Removed the inner per-dayThreadPoolExecutor— each ingest worker now does preparation sequentially in its own thread, giving equivalent CPU utilisation with simpler structure.
- gank.py:
run_phase2_gank_detectionnow emitsgank_total/gank_doneprogress through the deduplication loop. After the bulk SQL query returnsNcandidate pairs, progress updates are emitted everyN/200rows (max ~200 updates). While the SQL is still running the bar stays indeterminate (gank_total=0); once the query returns it becomes determinate. - app.py: Added
gank_total: 0andgank_done: 0to the initial progress dict. - sync_progress.html: Gank bar switches from indeterminate to determinate as soon as
gank_total > 0. Label shows"X / Y candidate pairs"while running and the confirmed count when done.
- fetcher.py:
ingest_totalis now set tolen(dates)(days) before the download loop instead of growing per-day.ingest_donetracks days processed (incremented by 1 after each day's DB commit, including empty days). Addedingest_records_donefield for the actual kill count (used for the rate badge). Rate calculation updated to useingest_records_donefor records/s. - gank.py:
run_phase2_gank_detectionaccepts an optionalprogressdict. Emitsgank_phase="running"at entry andgank_phase="done",gank_confirmed,gank_checkedon completion. - app.py: Added
ingest_records_done,gank_phase,gank_confirmed,gank_checkedto the initial progress dict. Passesprogress=progresstorun_phase2_gank_detection. - sync_progress.html: Ingestion bar label changed to
N / M days · X records. Added third "Gank detection" progress bar — indeterminate while pending/running, full when done, label shows confirmed count and CONCORD kills checked.
- fetcher.py: Added
_prefetch_all_systems(conn, progress). CallsGET /universe/systems/(returns all ~8 285 system IDs in one request), then parallel-fetches/universe/systems/{id}/for any not yet insystem_cacheusing 40 concurrent workers. One-time cost ~30–60 s on first run; instant thereafter. - fetcher.py:
sync_kills_everefnow calls_prefetch_all_systemsbefore any killmail downloads instead of loading from the DB and lazily fetching missing systems per-day. The entire per-daymissing_sys/_fetch_sysblock is removed.
- fetcher.py:
_download_everef_daynow streams in 256 KB chunks and updatesfile_progress[date_str](bytes_done,bytes_total,done) in real-time from each download thread. Accepts optionalfile_progressdict. - fetcher.py:
sync_kills_everefcreates adl_file_progressshared dict, adds it to the progress object, and passes it to all download threads viafunctools.partial. - app.py:
dl_file_progress: {}added to initial progress dict. - sync_progress.html: Per-file bars rendered below the overall download bar. Each bar appears when a file starts downloading and is removed 1 second after its
doneflag is set. Shows date, a small progress bar (indeterminate if Content-Length unknown), and MB downloaded. - style.css:
.file-progress-rowgrid layout,.file-bar(6 px tall),.file-date,.file-size.
- fetcher.py: Removed byte-range chunked download (
_download_everef_daywith Range headers). Downloads are now one full connection per file, multiple files in parallel viaThreadPoolExecutor(up toEVEREF_DL_CONNECTIONSworkers)._download_everef_daynow returns(killmails, bytes_downloaded). - fetcher.py:
sync_kills_everefprogress dict restructured — droppedday_current/total,day_date,kills_this_day/total,download_phase/date; addeddl_files_done,dl_files_total,dl_bytes_done,dl_rate_mbps,ingest_done,ingest_total,ingest_rate_rps. Rates computed from per-update deltas. - app.py: Initial progress dict updated to match new fields.
- sync_progress.html: Two progress bars — "Download progress (overall)" (files + MB/s) and "Ingestion progress (overall)" (records; total grows dynamically, records/s). Rate displayed as gold badge.
- style.css: Added
.progress-statsand.rate-badgestyles.