Short-video mode showed a black screen on iOS Safari/WebKit while working
on desktop. iOS does not composite an inline <video> nested inside a
`position: fixed` ancestor: the video decodes and plays but its layer
never paints. `.shorts-page` used `position: fixed; inset: 0`, trapping
every shorts video.
Make `.shorts-page` a normal-flow full-viewport block
(`position: relative; height: 100svh` with dvh/vh fallbacks) instead.
The immersive scroll lock is already provided by the component setting
html/body `overflow: hidden` on mount, so the look and behavior are
unchanged. Fixes the iOS black screen; desktop is unaffected.
Expose per-crawler teaser settings on crawler cards and persist them through the admin API.\n\nWhen preview generation is disabled, crawler imports still create thumbnails and fingerprints while marking previews disabled and allowing migration without waiting for teaser files.\n\nPreserve the latest teaser setting after crawler runs so stale crawl state cannot overwrite a user toggle.
Implement a new GuangYaPan cloud drive integration across the backend, admin UI, playback proxy, and Spider91 migration flow.
Backend changes:\n- Add a GuangYaPan drive driver with token refresh, QR/device login support, directory listing, stream link resolution, directory creation, rename/delete operations, OSS multipart upload, and upload task polling.\n- Register GuangYaPan as a supported storage kind in configuration, catalog normalization, admin APIs, public drive labels, and 302 playback redirects.\n- Allow Spider91 crawler uploads to target GuangYaPan through a dedicated migration adapter.\n- Add scan, thumbnail, preview, and fingerprint cooldown handling for GuangYaPan based on explicit HTTP status codes, Retry-After values, and structured provider codes instead of natural-language message matching.\n- Tighten existing provider cooldown detectors so OneDrive, Google Drive, 115, PikPak, 123pan, Wopan, and media workers avoid treating arbitrary response text as a rate-limit signal.\n- Keep large videos eligible for preview generation unless the user disables preview generation.
Admin and tooling changes:\n- Add GuangYaPan as a selectable drive type with QR login UI and token/root-path credential fields.\n- Add crawler upload target support for GuangYaPan in the admin UI.\n- Add drive branding, labels, metadata display, and docs/config examples for GuangYaPan.\n- Include a standalone GuangYaPan QR login helper script for manual credential acquisition.
Tests:\n- Add GuangYaPan driver, QR login, proxy, admin API, crawler upload target, fingerprint, cooldown, and form coverage.\n- Update rate-limit tests to assert that message-only throttling text no longer starts cooldowns.\n- Cover explicit HTTP status parsing through shared drive helper tests.
Remove shorts recommendation preference, keep a six-video viewed cache window, preload the next two videos after healthy buffering, and avoid premature seen-list resets between sessions.
Remove the hide action from the video detail page and keep delete as the only management action.
Adjust mobile delete dialog and ArtPlayer settings UI, disable persisted player settings, and add a temporary loop option.
- Active video loads with priority; next video preloads only after the
active one has 12s of forward buffer or is buffered to the end
- Add high/low watermark hysteresis (12s grant / 4s revoke) so the
preload grant no longer thrashes around the threshold, discarding
already-preloaded data
- Treat buffered-to-end as healthy to avoid revoking preload near the
end of short clips
- Mark sources as cacheable on first canplay and keep src bound for
cached adjacent slides in both directions, so swiping back (and
forward again) reuses the browser buffer instead of reloading
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add Unicom cloud drive support for source-file deletion and crawler uploads.
- Implement source-file removal for Unicom cloud drive so deleting videos can also remove the original cloud-drive file when requested.
- Resolve Unicom cloud drive source identifiers across file FID, object ID, directory ID, rename, and delete flows.
- Add upload support for Spider91 crawler imports targeting Unicom cloud drive storage.
- Add Unicom cloud drive QR login backend APIs, frontend form support, and tests.
- Extend drive capability metadata, scanner behavior, proxy handling, preview handling, and migration coverage for cloud-drive source operations.
- Rename Chinese display labels from 联通沃盘 to 联通网盘 and from 123 云盘 to 123网盘 while keeping the root README aligned with origin/main.
- Add referrer-policy coverage for 302 video playback and update related frontend playback tests.
- Count crawler assets by crawler source ID prefix after cloud migration
- Add crawler API totals for cumulative, local, and migrated videos
- Let crawler thumbnail and preview readiness inherit equivalent canonical videos
- Show cumulative crawl data in crawler management cards
- Remove low-value expanded crawler metadata fields from the card body
- Move return-to-site into the main admin navigation with grouped sections
- Rename the content admin group to management and adjust footer icon sizing
- Update backend and frontend tests for crawler/admin behavior
Redesign crawler management around imported Python scripts instead of built-in crawler storage. Crawler scripts now declare CRAWLER_NAME, imports validate metadata, crawler IDs are generated internally, and deleted crawler scripts are detached without deleting already imported videos.
Add backend support for file and URL script imports, dry-run testing, metadata parsing, safer job paths, original filename preservation, and crawler listing that ignores detached script records. Remove the legacy built-in Spider91 script path flow and hidden Python/config JSON fields from the crawler API.
Rework the admin crawler page into an independent crawler console with script import, dry-run testing, status metrics, spider iconography, and simplified controls. Update docs, examples, installer checks, Docker/release packaging, and tests for the new protocol.
- add generic scriptcrawler backend runner using the crawler.v1 JSONL protocol
- support crawler script upload and HTTP(S) URL import from the admin crawler page
- simplify the user-facing crawler contract to title, media_url, optional thumbnail_url and optional source_id
- convert Spider91 into a normal script crawler and reject new Spider91 storage-drive configs
- keep legacy Spider91 storage rows visible only for cleanup/deletion
- add crawler protocol docs, example script, admin UI, tests and migration coverage
Add per-drive and global admin controls to stop scan, preview, thumbnail, and fingerprint work.
Keep stopped pending generation resumable, wire cancellation through workers and nightly runs, and refine mobile drive-management UI/history behavior.
- Split DrivesPage.tsx (1821→594 lines) into modular components under src/admin/drive/
- Add Escape key to close any modal dialog
- Pause drive list polling when browser tab is hidden (Page Visibility API)
- Remove duplicate formatBytes from VideosPage, unify to storageFormat.ts
- Batch delete (TagsPage) and batch regen (VideosPage) now use Promise.allSettled for concurrency
- Add mobile bottom sheet for logout and check-update (previously hidden on <768px)
- Update adminDriveForm tests to cover extracted component files
Restore the previous fixed-tag classification flow, including startup backfill for existing videos and the 91porn spider tag.
Also commit the current drive scanning, preview scheduling, and admin drive-control updates present in the workspace.