Releases: threehappypenguins/VideoSphere
Releases · threehappypenguins/VideoSphere
Release list
0.2.3
VideoSphere 0.2.3
Fixes
- Tolerate cleared/corrupt OAuth refresh tokens so reconnect flows work instead of failing on decrypt
- Keep connection card actions in-flow on narrow screens (no overflow)
Features
- Show/hide toggles for YouTube main and temporary stream keys
- Livestream list thumbnails for scheduled, live, and past streams
Changes
- Default JWT session lifetime is now 10 years (browsers may still drop cookies earlier, e.g. Chromium ~400 days)
- Docs/TypeDoc clarifications for JWT cookie browser caps and OAuth token decrypt behavior
0.2.2
VideoSphere 0.2.2
YouTube import: embed preview fallback
Fresh or recently processed YouTube videos (especially post-live VODs) often expose only DASH/HLS formats to yt-dlp, with no browser-streamable progressive MP4 for the trim editor. Import no longer hard-fails in that case.
Added
- Embed preview mode — When yt-dlp returns formats but none are browser-streamable, resolve succeeds with
previewMode: 'embed'and the import modal uses YouTube’s IFrame Player for trim preview instead of the proxied HTML5 stream. YouTubeEmbedPreviewPlayer— Loads the YouTube IFrame API once per page and exposespreviewAt/getCurrentTimefor trim handle sync.NoBrowserStreamableFormatError— Typed signal for the DASH/HLS-only case; resolve maps it to embed fallback while other preview failures still return 502.
Changed
- Import trim UI (embed mode) — Smart cut is required and locked on; frame nudge buttons and live keyframe snapping are hidden; coarse jump-step controls remain.
- Resolve API — Successful direct preview responses now include
previewMode: 'direct'explicitly.
Fixed
- Empty yt-dlp format lists — Treated as a real metadata failure (502), not embed fallback, so JS-challenge or auth failures are not masked as “processing” videos.
- Smart cut copy — Embed-mode helper text and tooltips now describe frame-accurate cuts after download instead of incorrectly saying cuts snap to keyframes.
0.2.1
VideoSphere 0.2.1
YouTube import
- Faster, more reliable downloads — imports now fetch the full source with parallel fragments and tuned HTTP chunking, then trim with ffmpeg instead of using
--download-sections. - Smoother progress — download progress accounts for separate video and audio streams so the bar no longer jumps when the second stream starts.
- Better audio compatibility — prefers AAC/m4a audio when merging so imported files stay closer to the source format.
YouTube trim editor
- Finer trim controls — frame-step buttons, configurable jump steps (e.g. 5s / 10s), and click-to-edit timestamps (
0:10,1:30,1:02:03). - Keyframe snapping — snapping runs from the new frame-step controls; keyboard/drag behavior is unchanged for preview seeking.
Mobile UX
- Responsive modal footers — draft and livestream metadata modals use a stacked mobile layout on narrow screens.
- Hydration fix — viewport detection defaults to the mobile layout during SSR/first paint to avoid layout flicker on small screens.
Livestreams
- Delete from the edit modal — remove drafts or livestreams directly from the metadata modal, with a confirmation step.
- Shared delete helper — livestream deletion logic is centralized for consistent API calls and toast feedback.
Fixes
- Trim timestamp inputs no longer commit twice on blur after pressing Enter.
0.2.0
VideoSphere 0.2.0
Release notes for changes on dev since main (0.1.1).
Highlights
- YouTube import — Import videos from a connected YouTube account, preview and trim in the browser, then save to a draft and upload to platforms on Upload & Save.
- Draft labels — Color-coded organizational labels on the Uploads list, with profile-level label management.
- SermonAudio cross-publish & scheduling — Cross Publish on publish (Facebook, X, Instagram), plus scheduled publication via
publishTimestamp. - Dashboard refresh — The former Drafts section is now Uploads, with nested history routes and a mobile navigation drawer.
✨ New features
YouTube import
- End-to-end pipeline: resolve source URL → download → trim → draft → platform upload.
- In-modal trim preview (proxied HTML5 player) with keyframe-aware range slider.
- Import picker paginates two videos at a time; supports streamed broadcasts and row thumbnails.
- Server-side import job scheduling; platform upload deferred until Upload & Save.
- Cancel with confirmation; downloads interrupt cleanly on cancel.
- Friendly errors for private/unavailable videos.
Draft labels
- Create, edit, and delete organizational labels with custom colors.
- Apply labels to drafts from the Uploads list; mobile-friendly chip layouts.
- Profile settings section for managing labels.
SermonAudio
- Cross Publish enabled on publish, with connection-aware draft UI.
- Schedule publications with a datetime picker and scheduled upload status.
- Instagram added as a Cross Publish destination.
- Social connections API for cross-publish account discovery.
Dashboard & navigation
/dashboard/drafts→/dashboard/uploads(legacy routes redirect automatically).- Upload and distribution history nested under
/dashboard/uploads/history. - Livestream history remains under
/dashboard/livestreams/history. - Mobile nav drawer; improved quick actions and onboarding tour updates.
Scheduling
- Single-field free-form time entry in the schedule picker.
- Schedule picker popover layout fixes.
🐛 Bug fixes & hardening
- YouTube import: Near-expiry preview refresh; hardened start/preview/finalize paths; OAuth handling improvements; bounded preview media cache.
- Livestreams: MongoDB pagination for history/import lists.
- Draft labels: Stricter validation, cascade removal on bulk delete, 404 handling for missing profiles, no partial-success label sync failures.
- SermonAudio: Auto-publish default restored when clearing a schedule.
- Dashboard: Nav drawer state derived correctly; streamed history reconciled on first page load only.
📦 Deployment & ops
Docker
- Production image now includes ffmpeg and yt-dlp (required for YouTube import).
- Rebuild and redeploy the image for this release.
Optional environment variables
# YT_IMPORT_WORKDIR=/tmp/yt-import # default: /tmp/yt-import
# YT_IMPORT_MAX_DURATION_SECONDS=14400 # default: 4 hours