Return width/height from API and set aspect-ratio on <img> so the
browser allocates the correct card height before the image loads.
This prevents masonryAdd from misplacing cards and stops flickering.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Clicking a card now replaces the selection (single-select mode).
A "多选" button in the footer enables multi-select mode (original
behavior: toggle each card independently).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add search pane with artwork/tag search and artist search, both with
infinite scroll and tab caching
- Replace CSS columns masonry with JS shortest-column algorithm to
eliminate gaps caused by column-fill:balance
- Add /pixiv/search/illusts and /pixiv/search/users API endpoints
- Search results: illusts use masonry grid, artists use list layout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Switch grid to CSS columns (masonry) so images show at natural aspect
ratios packed edge-to-edge, no more forced square crop
- Remove '确认选择' button; every card click / deselect / clear now
immediately writes to the artwork_ids widget via commitSelection()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Bookmark button now toggles: ♥ click cancels bookmark via bookmark_delete API
- Add is_followed to user data in _fmt_illusts
- Add POST /pixiv/bookmark_delete and POST /pixiv/follow endpoints
- Add '↗' artist button on each card (hover): jumps to artists tab and
loads that artist's works with name header + follow/已关注 badge
- Follow button in artist works header; replaces itself with 已关注 on success
- Artist works area restructured to flex-column for header + scrollable grid
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Include is_bookmarked in _fmt_illusts response
- Add POST /pixiv/bookmark endpoint (add-only, never removes)
- Show heart button on each card: filled pink if already bookmarked,
hidden until hover if not; clicking only adds, never toggles off
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All tabs (推荐/排行榜/收藏/画师) now cache their DOM node on switch-away
and restore it on switch-back without reloading. Each tab has a '↻ 刷新'
button that clears the cache and reloads on demand.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Switching away from recommended now saves the pane DOM node; switching
back restores it instantly without re-fetching. A '↻ 刷新' button in
the sub-bar clears the cache and reloads on demand.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add a sub-toolbar in the ranking tab with 7 modes: day/week/month/
day_male/day_female/week_original/week_rookie. Clicking a mode clears
the grid and reloads with the new mode parameter.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
illust_recommended's next_url contains array params like "viewed[]"
which are invalid Python identifiers and crash **kwargs unpacking.
Filter to isidentifier() keys only so pagination works correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pixivpy3 versions without next_qs method caused infinite scroll to fail.
Implement _next_qs() using urllib.parse as a drop-in replacement.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace PIL-level conditional resize with PyTorch F.interpolate so that
shape comparison and resizing happen at the tensor level, fixing the
torch.stack size mismatch error when selecting images of different
resolutions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
IntersectionObserver with root:pane is unreliable inside ComfyUI DOM
widgets. Replace with scroll event listeners on the pane element.
Also: auto-fill pane when initial batch doesn't cause overflow, and
abort stale async loads when tab/artist changes mid-flight.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The browser UI is now embedded directly inside the ComfyUI node using
addDOMWidget. Each node instance gets its own independent state. All DOM
queries are scoped to the node container so multiple nodes work correctly.
Mouse/wheel events are stopped from propagating to the canvas.
Default node size 700x500; user can resize freely.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_fmt_illusts now includes original_url from browse data (meta_single_page /
meta_pages). The confirm button writes id|url pairs to the widget. The node
parses the pairs and downloads directly, removing N extra API calls that
were being rate-limited and silently failing for multi-image selections.
Falls back to get_original_url for legacy plain-ID widget values.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New "已选" tab shows all selected images in a grid; each card has
an X button (top-right) to remove that image from the selection
- "清除全部" button in header clears all selections at once
- illustCache persists illust thumbnails across modal opens so the
panel can display images selected in previous sessions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Multiple selected artworks can have different resolutions; torch.stack
requires equal shapes. Resize all to the first image's dimensions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pixiv CDN blocks python-requests default UA with 403. Using the same
PixivIOSApp UA as the mobile API client passes CDN checks.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Track auth time; re-auth after 55 min so node execution doesn't hit
expired access tokens (1-hour TTL)
- Use API's additional_headers in download_image_bytes for consistency
- Collect per-image error messages and include them in the ValueError
so the ComfyUI error dialog shows the actual failure reason
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Document Refresh Token (gppt) as recommended login method and OAuth
as fallback. Add FAQ entry for pixiv:// URL not appearing issue.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add POST /pixiv/auth/set_token endpoint for direct refresh_token auth.
Redesign login page with two tabs: recommended gppt token flow and
fallback OAuth flow with pixiv:// URL validation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>