feat: 4K downloads, watch progress, player controls, new icon
Window chrome: titleBarStyle Overlay (Transparent left the native bar in place, white in dark mode, with a dead strip beneath it). The app now paints that strip itself, so it matches the page background. Player: prev/next through the feed, a full-screen button, a spinner while a stream resolves, Open on YouTube on downloaded videos too, and the description collapsed behind a disclosure. Downloads default to Best, which reaches real 4K — above 1080p YouTube serves VP9/AV1, verified to play natively in WKWebView here. Audio stays pinned to AAC because Opus in MP4 would be silent. A Compatible setting keeps the old 1080p H.264 behaviour. Files are now named '<ISO date> - <title> [<id>].mp4'. Watch progress is recorded and drawn under thumbnails like YouTube's, and reopening a video resumes where it left off. Tiles clamp every text line to a fixed height so they share a baseline, and the search field no longer clips its placeholder. Fixes a Picture-in-Picture leak: WebKit kept a detached video playing after the player closed, so a second video could play over the first with no way to stop it. Every exit path now tears the element down.
This commit is contained in:
+6
-2
@@ -9,6 +9,7 @@ import type {
|
||||
FeedItem,
|
||||
ImportPreview,
|
||||
Prereqs,
|
||||
Quality,
|
||||
RefreshProgress,
|
||||
RefreshSummary,
|
||||
} from "./types";
|
||||
@@ -22,8 +23,11 @@ export const listFeed = (filter: FeedFilter) =>
|
||||
|
||||
export const refreshFeeds = () => invoke<RefreshSummary>("refresh_feeds");
|
||||
|
||||
export const downloadVideo = (videoId: string) =>
|
||||
invoke<void>("download_video", { videoId });
|
||||
export const downloadVideo = (videoId: string, quality: Quality) =>
|
||||
invoke<void>("download_video", { videoId, quality });
|
||||
|
||||
export const savePlayback = (videoId: string, position: number, duration: number) =>
|
||||
invoke<void>("save_playback", { videoId, position, duration });
|
||||
|
||||
export const cancelDownload = (videoId: string) =>
|
||||
invoke<void>("cancel_download", { videoId });
|
||||
|
||||
Reference in New Issue
Block a user