Commit Graph
119 Commits
Author SHA1 Message Date
Leo Vasanko 6de9b443ae preview: ffmpeg CLI fallback for HEIC/HDR, worker pool fixes, logging improvements
- Use ffmpeg CLI directly for HEIC/HEIF previews (bypassing pyvips which
  cannot encode >8-bit AVIF on current system). ffmpeg handles tile
  assembly, EXIF rotation, HDR metadata and ICC profiles automatically.
- pyvips remains primary for other image formats; ffmpeg is fallback.
- Simplify _get_image_dimensions() to use pyvips header read for all
  formats including HEIC, with ffprobe as fallback.
- Move all imports to top of preview.py; remove lazy OnlyOffice import.
- Worker pool: add readiness handshake (\x01 byte), bounded idle wait
  with PREVIEW_TIMEOUT, eager module import before signalling.
- Fix dispatch data check bug (was 'if data is not None' -> 'if data').
- Add logger.exception for unhandled preview/dispatch errors.
- EmojiFormatter now includes tracebacks for exception logs.
- Return 503 on preview timeouts instead of 504.
2026-05-01 22:48:30 +00:00
Leo Vasanko 49cb4a8255 Separate OnlyOffice async handling, add office_previews WS flag, framed worker protocol
- Move OnlyOffice conversion out of worker subprocesses into async event loop
  using httpx.AsyncClient with shared client and clean shutdown hook
- Add OOConversionManager with in-flight deduplication (asyncio.Future) and
  configurable concurrency limit (OO_MAX_CONCURRENT=2)
- Add 10s total timeout for office previews via asyncio.wait_for
- Return 503 when OnlyOffice is unavailable, 504 on timeout
- Remove office handling from worker dispatch(); workers now only do
  images, video, and PDFs
- Replace PNG tempfile bridge with framed binary input protocol on worker
  stdin: (json_size)(data_size)(json)(raw_data)
- Add process_image_buffer() for in-memory AVIF conversion via pyvips
- Add office_previews to WS server message, cached every 30s from OO
  availability check
- Frontend gates only office document previews on office_previews flag;
  images, video, PDFs remain unconditional
- Change default OnlyOffice port from 8080 to 8988
2026-05-01 03:42:03 +00:00
Leo Vasanko cb954db537 preview: increase timeout to 10s, add priority queue scheduling (images > video > pdf > office) 2026-04-27 04:51:41 +00:00
Leo Vasanko bcbcef219e session: rename cookie to 'cista', add __Host- prefix on HTTPS 2026-04-27 04:00:14 +00:00
Leo Vasanko d6d5eb85d6 Revert an accidental change of functionality that was breaking file listings, originally done for linting purposes in commit 3767fb0. 2026-04-27 04:00:14 +00:00
Leo Vasanko 1e75763f77 Add share token support with virtual filesystem and selection toolbar button 2026-04-26 07:46:14 +00:00
Leo Vasanko fb0ddd20e0 Add OnlyOffice-based preview for office documents
Replace Aspose.Words with OnlyOffice Document Server for generating
bitmap previews of office documents (Word, Excel, PowerPoint, etc.).

Backend:
- Add cista/onlyoffice.py conversion client
- Convert office docs directly to PNG via OnlyOffice, then AVIF via pyvips
- Make office previews optional based on OnlyOffice availability
- Remove Aspose.Words dependency and all related code
- Add spreadsheet and presentation format support

Frontend:
- Mark office files as previewable in Document.ts
- Add office extensions to MediaPreview.vue preview list
- Fix pre-existing @ts-ignore in HeaderMain.vue

Tests:
- Fix test_lrucache.py parameter name (open -> opener)

Also run ruff format across the codebase to satisfy linter checks.
2026-04-26 06:59:01 +00:00
Leo Vasanko 3767fb0cec lint: apply manual ruff cleanup (non-preview files) 2026-04-26 06:16:42 +00:00
Leo Vasanko 9321961a11 sso: use /auth/api/check for token permission checks 2026-04-26 05:46:09 +00:00
LeoVasanko 123cb45daa WebDAV sync support, access tokens, REST control endpoints (#10)
Implement complete WebDAV file serving compatible with various clients from Windows File Explorer to more specialized sync tools. The old control WebSocket has been updated to part-DAV, part REST API instead. Implemented user:pass BASIC auth. Added UI and backend for creating tokens that avoid the need to use actual username and password for requests from CLI or DAV.

Reviewed-on: #10
2026-04-26 06:22:52 +01:00
LeoVasanko 91e07d61b6 Uploads by PUT range requests rather than WS, remove dead code WS handlers (#9)
Increases block size to 16 MiB and adjusts progress display to work smoothly with that. Also removes download WS that was already unused. Provides faster upload speed than over WS.

Reviewed-on: #9
2026-04-25 03:55:52 +01:00
Leo Vasanko a88a22571a Remove CISTA_PIL and Pillow preview mode 2026-04-25 02:06:40 +00:00
Leo Vasanko d58748439a Adjust emoji log spacing 2026-04-25 02:05:20 +00:00
Leo Vasanko c51701c252 Improve preview worker error propagation and logging 2026-04-25 01:51:49 +00:00
Leo Vasanko 88a032acfe Preview: add pdf+pyvips encode path and simplify timings 2026-04-25 00:20:19 +00:00
Leo Vasanko bbb73be07e Preview: simplify pyvips timing to single processing ms + req total. 2026-04-25 00:06:35 +00:00
Leo Vasanko fc2f357470 Preview: persistent worker pool, fast AVIF encode, access-log timing
- Add preview_worker.py: long-lived subprocess; JSONL request / framed binary
  response protocol (BLAKE3 checksum + LE uint32 sizes + msgspec JSON + payload)
- Add _PreviewWorkerPool: asyncio queue-based pool; kill+replace workers on timeout,
  checksum error, or protocol error; PREVIEW_TIMEOUT=3s, PREVIEW_WORKERS=cpu-scaled
- Use pyvips effort=0,strip=True for fast AVIF thumbnails; CISTA_PIL=1 env forces Pillow
- Report load/process/save ms in PreviewResponse; inject into access log via req.ctx._log_extra
- Wire start/shutdown_preview_workers into Sanic lifecycle hooks (app.py)
- Call configure_main_logging() after Sanic() to install emoji formatter
- Silence worker stderr (DEVNULL)
2026-04-24 23:53:23 +00:00
Leo Vasanko e579dbc61f Logging: emoji formatter and access-log extra field 2026-04-24 23:52:34 +00:00
Leo Vasanko 3e337bf1f2 Use client IP (potentially proxied) in logs, handle [ipv6]. 2026-04-24 20:13:11 +00:00
Leo Vasanko 522dd49f3f Avoid useless check. 2026-04-24 00:04:58 +00:00
Leo Vasanko 7b3252c588 Handle missing preview files with silent 404 2026-04-23 19:02:54 +00:00
Leo Vasanko 4626f1cdff Add cleaner access logging for HTTP requests and WebSockets 2026-04-23 18:06:22 +00:00
Leo Vasanko 1795506090 Faster image previews by pyvips. 2026-04-23 17:19:24 +00:00
Leo Vasanko e490cbe0fe Set avif=1 flag for SVT-AV1 when encoding a single image, for increased efficiency and less memory usage. 2026-04-23 16:57:27 +00:00
Leo Vasanko 2c74779102 Consistent forwarding of host/origin/ua over HTTP and WS to Paskia. 2026-02-10 23:56:42 +00:00
Leo Vasanko b65404beba Cleanup 2026-02-10 23:52:07 +00:00
Leo Vasanko 67d1fa65fb Cleaner WebSocket/Paskia proxying. 2026-02-10 23:42:13 +00:00
Leo Vasanko 6b009dea40 Attempt to get allocated size on Windows which needs WINAPI. Fallback to file size if not possible. 2026-02-05 20:31:46 +00:00
Leo Vasanko 7b19739875 Fix --listen docopt parsing (only -l was working). 2026-02-05 20:01:26 +00:00
Leo Vasanko 362a9f47c9 Remove invalid Sanic kwarg when binding to all interfaces (not needed anyway). 2026-02-05 19:56:54 +00:00
Leo Vasanko 7b3a39a58e Better proxy header processing, pass original user-agent without httpx overriding it. 2026-02-05 17:53:52 +00:00
Leo Vasanko 204a308396 Pass the new allocated field through search filtering. Fixes issue where 0 allocated was reported in search results. 2026-02-04 23:55:05 +00:00
Leo Vasanko 82062d1d7a Cache previews in server RAM for much faster access (they are about 70kB each). 2026-02-04 20:56:16 +00:00
Leo Vasanko ad37a48df9 Brighter low free space colors. 2026-02-04 20:40:59 +00:00
Leo Vasanko 84d80518a6 Auth restricted endpoint is picky about the trailing slash, use it consistently. 2026-02-04 20:35:29 +00:00
Leo Vasanko e520d9361c Auth mode indication on startupbox 2026-02-04 20:24:21 +00:00
Leo Vasanko 5b4be95ace Correctly handle customized server name in admin settings dialog. 2026-02-04 20:15:56 +00:00
Leo Vasanko b3df715e25 Fix free/used disk space handling. Implement file disk usage tracking. Display indicators on FileExplorer for incomplete files (sparse allocation, upload in progress). 2026-02-04 19:15:09 +00:00
Leo Vasanko 0656a027f4 Implement server name config to override the default of using share folder name. 2026-02-04 18:00:21 +00:00
Leo Vasanko 3a86fe26a7 Remove refresh wwwroot support and static files serving, only using vite to serve frontend in dev mode (avoid accidentally using stale builds). 2026-02-01 06:14:35 +00:00
Leo Vasanko 5c530652fa Change default port to 8989 like Droppy. Using 8999 for backend in dev mode. 2026-02-01 06:09:56 +00:00
Leo Vasanko 1e207b38b7 Use fastapi-vue parse_endpoint instead of our own logic. 2026-02-01 06:00:30 +00:00
Leo Vasanko 80453e98ab Unified watcher that *may* receive events from inotify and other sources. Added change notify messages from control and upload WebSockets. Cleanup debug printouts. 2026-02-01 02:44:52 +00:00
Leo Vasanko add9d7ac82 New inotify watcher with efficient algorithms. 2026-01-31 23:46:43 +00:00
Leo Vasanko 7e4b56d9ae Performance profile file change watching. 2026-01-31 22:53:17 +00:00
Leo Vasanko 79875d3190 Simplified startup box unix socket formatting. 2026-01-31 22:09:57 +00:00
Leo Vasanko 5590a756ca Better error logging on preview generation errors. 2026-01-31 22:00:26 +00:00
Leo Vasanko bb0c4075d0 Basic details in startup box. 2026-01-31 21:55:08 +00:00
Leo Vasanko 40fb7bf398 Implement background worker to make search response faster and avoid hanging the UI when there are a lot of files. Implement better toast messages for transitional events that automatically disappear. 2026-01-31 21:02:16 +00:00
Leo Vasanko 9879eea7c4 More robust zip download processing; don't let aborted requests hang threads, use a larger threadpool separate of preview generation. 2026-01-31 19:43:23 +00:00