@lazycatcloud/vue-media-preview 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/components/MediaPreview.vue.d.ts +2 -2
- package/dist/components/PreviewStage.vue.d.ts +8 -4
- package/dist/core/gestures/dismissGesture.d.ts +3 -0
- package/dist/core/gestures/openingGesture.d.ts +18 -0
- package/dist/core/gestures/pointerVelocity.d.ts +7 -0
- package/dist/core/gestures/zoomBounds.d.ts +5 -0
- package/dist/core/rendering/image.d.ts +17 -0
- package/dist/core/resources/bitmap/client.d.ts +4 -0
- package/dist/core/resources/bitmap/decode.worker.d.ts +1 -0
- package/dist/core/resources/bitmap/types.d.ts +14 -0
- package/dist/core/resources/imageLimits.d.ts +1 -1
- package/dist/core/resources/imageOwnership.d.ts +9 -0
- package/dist/core/resources/imageRequest.d.ts +1 -1
- package/dist/core/resources/imageResource.d.ts +11 -0
- package/dist/core/resources/imageStore.d.ts +3 -0
- package/dist/core/resources/imageTransport.d.ts +4 -4
- package/dist/core/resources/validation/image.d.ts +13 -0
- package/dist/core/types.d.ts +6 -0
- package/dist/core/usePreviewViewport.d.ts +1 -1
- package/dist/core/video/source/session.d.ts +8 -0
- package/dist/core/video/source/types.d.ts +8 -0
- package/dist/core/video/timeline/buffered.d.ts +12 -0
- package/dist/core/video/timeline/index.d.ts +15 -0
- package/dist/core/video/timeline/time.d.ts +3 -0
- package/dist/core/video/useVideoPlayback.d.ts +22 -6
- package/dist/core/video/useVideoSource.d.ts +3 -3
- package/dist/index.d.ts +3 -1
- package/dist/renderers/ImageCanvasRenderer.vue.d.ts +15 -4
- package/dist/renderers/LivePhotoRenderer.vue.d.ts +7 -2
- package/dist/renderers/VideoDomRenderer.vue.d.ts +29 -8
- package/dist/vue-media-preview.cjs +2 -1
- package/dist/vue-media-preview.css +1 -1
- package/dist/vue-media-preview.js +1907 -1516
- package/docs/testing.md +12 -2
- package/docs/vue-media-preview.md +35 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ Demo 内置 48 个日期分组条目,复用 16 份图片、视频和实况素
|
|
|
24
24
|
- **Canvas 图片**:当前画面优先,再预取邻页;下载可取消并有并发、流量和像素保护,原图状态以真实解码结果为准。
|
|
25
25
|
- **三页翻页轨道**:当前项及相邻两项,拖动跟手,松手根据距离和速度翻页或回弹,首尾有阻尼。
|
|
26
26
|
- **海量列表**:日期分组虚拟时间线、分页事件、按 ID 定位收回;列表追加/重排保留当前媒体,删除当前项切到邻项。
|
|
27
|
-
-
|
|
27
|
+
- **手势**:单击工具栏、双击缩放、双指缩放(适屏大小的 1–16 倍,越界阻尼与松手回弹)、放大后平移、越过水平边缘切页并同步缩回 1 倍、适配比例下拉关闭;图片和内联视频均支持缩放。
|
|
28
28
|
- **桌面操作**:左右方向键、Escape、`+` / `-` / `0`;Ctrl / Command + 滚轮缩放,放大后普通滚轮平移。
|
|
29
29
|
- **媒体**:图片 Canvas;视频使用原生 video 与自定义相册控制层,包含居中播放、播放/暂停、时间与缓冲进度、拖动定位、重播、声音开关和全屏;实况 Canvas 封面与视频切换。离开当前项暂停视频,退出释放组件资源。
|
|
30
30
|
- **外壳**:移动端与桌面 Demo、工具栏插槽、收藏状态、详情、图片导入、失败重试、预览键盘操作和减少动态效果设置。
|
|
@@ -65,7 +65,7 @@ import type { PreviewMedia, PreviewAnchor } from '@lazycatcloud/vue-media-previe
|
|
|
65
65
|
|
|
66
66
|
详见 [接入与架构](docs/vue-media-preview.md) 和 [测试说明](docs/testing.md)。
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
大原图通过独立适屏资源预览;默认原图上限为 32MiB / 6400 万像素,`resourcePolicy.maxOriginalPixels` 同时用于原图请求前检查和实际图片尺寸检查,未实现瓦片式超大图。真实相册业务与特殊格式边界见接入文档。
|
|
69
69
|
|
|
70
70
|
## npm 发布
|
|
71
71
|
|
|
@@ -94,7 +94,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_WithDefaults<__VLS
|
|
|
94
94
|
closing: () => void;
|
|
95
95
|
change: (index: number) => void;
|
|
96
96
|
close: () => void;
|
|
97
|
-
ready: (index: number, quality: "
|
|
97
|
+
ready: (index: number, quality: "full" | "thumbnail" | "screen") => void;
|
|
98
98
|
originalState: (media: PreviewMedia, status: OriginalStatus, reason: string) => void;
|
|
99
99
|
opened: (index: number) => void;
|
|
100
100
|
loadMore: (index: number) => void;
|
|
@@ -118,7 +118,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_WithDefaults<__VLS
|
|
|
118
118
|
};
|
|
119
119
|
}>>> & {
|
|
120
120
|
onError?: ((error: Error, media: PreviewMedia) => any) | undefined;
|
|
121
|
-
onReady?: ((index: number, quality: "
|
|
121
|
+
onReady?: ((index: number, quality: "full" | "thumbnail" | "screen") => any) | undefined;
|
|
122
122
|
onOriginalState?: ((media: PreviewMedia, status: OriginalStatus, reason: string) => any) | undefined;
|
|
123
123
|
onChange?: ((index: number) => any) | undefined;
|
|
124
124
|
onClose?: (() => any) | undefined;
|
|
@@ -41,7 +41,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
41
41
|
rendering: boolean;
|
|
42
42
|
paging: boolean;
|
|
43
43
|
}>, {
|
|
44
|
-
onPointerDown: (event: PointerEvent, origin?: DOMRect) => boolean;
|
|
44
|
+
onPointerDown: (event: PointerEvent, origin?: DOMRect, target?: HTMLElement) => boolean;
|
|
45
45
|
onPointerMove: (event: PointerEvent) => void;
|
|
46
46
|
onPointerUp: (event: PointerEvent) => void;
|
|
47
47
|
onPointerCancel: (event: PointerEvent) => void;
|
|
@@ -55,13 +55,17 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
55
55
|
togglePlayback: () => void;
|
|
56
56
|
toggleFullscreen: () => Promise<void>;
|
|
57
57
|
captureFrame: () => {
|
|
58
|
-
image:
|
|
58
|
+
image: HTMLImageElement | ImageBitmap;
|
|
59
|
+
scale: number;
|
|
60
|
+
} | {
|
|
61
|
+
image: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;
|
|
59
62
|
scale: number;
|
|
60
63
|
};
|
|
64
|
+
retainFrame: () => import("../index.ts").RetainedPreviewFrame;
|
|
61
65
|
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
62
66
|
error: (error: Error) => void;
|
|
63
67
|
close: () => void;
|
|
64
|
-
ready: (quality: "
|
|
68
|
+
ready: (quality: "full" | "thumbnail" | "screen") => void;
|
|
65
69
|
originalState: (status: OriginalStatus, reason: string) => void;
|
|
66
70
|
liveState: (status: LivePhotoStatus) => void;
|
|
67
71
|
liveEnded: () => void;
|
|
@@ -93,7 +97,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
93
97
|
paging: boolean;
|
|
94
98
|
}>>> & {
|
|
95
99
|
onError?: ((error: Error) => any) | undefined;
|
|
96
|
-
onReady?: ((quality: "
|
|
100
|
+
onReady?: ((quality: "full" | "thumbnail" | "screen") => any) | undefined;
|
|
97
101
|
onOriginalState?: ((status: OriginalStatus, reason: string) => any) | undefined;
|
|
98
102
|
onLiveState?: ((status: LivePhotoStatus) => any) | undefined;
|
|
99
103
|
onLiveEnded?: (() => any) | undefined;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createPointerVelocity } from "./pointerVelocity";
|
|
2
|
+
import type { PreviewSize } from "../types";
|
|
3
|
+
/** Keep a contact across the opening handoff without enabling gestures on the moving card. */
|
|
4
|
+
export declare function createOpeningGesture(): {
|
|
5
|
+
clear: () => void;
|
|
6
|
+
take: () => {
|
|
7
|
+
down: PointerEvent;
|
|
8
|
+
latest: PointerEvent;
|
|
9
|
+
target: HTMLElement;
|
|
10
|
+
velocity: ReturnType<typeof createPointerVelocity>;
|
|
11
|
+
kind: "pointer";
|
|
12
|
+
} | {
|
|
13
|
+
kind: "empty";
|
|
14
|
+
};
|
|
15
|
+
move: (event: PointerEvent) => void;
|
|
16
|
+
start(event: PointerEvent): void;
|
|
17
|
+
finish(event: PointerEvent, viewport: PreviewSize): boolean;
|
|
18
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PreviewPoint } from "../types";
|
|
2
|
+
/** Event timestamps preserve motion timing when an opening contact is handed to the stage. */
|
|
3
|
+
export declare function createPointerVelocity(): {
|
|
4
|
+
reset(point: PreviewPoint, time: number): void;
|
|
5
|
+
move(point: PreviewPoint, time: number): void;
|
|
6
|
+
read(time: number): PreviewPoint;
|
|
7
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const defaultZoomLimit = 16;
|
|
2
|
+
/** Preserve normal pinch tracking, with bounded resistance outside the resting range. */
|
|
3
|
+
export declare function resistZoom(level: number, maximum: number): number;
|
|
4
|
+
/** Re-grabbing a returning image starts at its visible scale without a second resistance step. */
|
|
5
|
+
export declare function unresistZoom(level: number, maximum: number): number;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PreviewRotation, PreviewSize } from "../types";
|
|
2
|
+
export interface ImageFrame {
|
|
3
|
+
viewport: PreviewSize;
|
|
4
|
+
size: PreviewSize;
|
|
5
|
+
offsetX: number;
|
|
6
|
+
offsetY: number;
|
|
7
|
+
rotation: PreviewRotation;
|
|
8
|
+
}
|
|
9
|
+
/** Visible rectangle in the unrotated image's rendered CSS pixels. */
|
|
10
|
+
export declare function visibleImageRect(frame: ImageFrame): {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
};
|
|
16
|
+
/** Crop before sampling so zoomed originals do not resample offscreen pixels. */
|
|
17
|
+
export declare function drawViewportImage(context: CanvasRenderingContext2D, image: HTMLImageElement | ImageBitmap, frame: ImageFrame, moving: boolean): void;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PreparedBitmaps } from "./types";
|
|
2
|
+
export declare function closeBitmaps({ full, motion }: PreparedBitmaps): void;
|
|
3
|
+
/** Each queued store load owns its worker; cancellation terminates its decode/resize work. */
|
|
4
|
+
export declare function prepareJpegBitmaps(blob: Blob, maxMotionPixels: number, signal: AbortSignal): Promise<PreparedBitmaps>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface DecodeRequest {
|
|
2
|
+
blob: Blob;
|
|
3
|
+
maxMotionPixels: number;
|
|
4
|
+
}
|
|
5
|
+
export interface PreparedBitmaps {
|
|
6
|
+
full: ImageBitmap;
|
|
7
|
+
motion: ImageBitmap;
|
|
8
|
+
}
|
|
9
|
+
export type DecodeResult = ({
|
|
10
|
+
status: "ready";
|
|
11
|
+
} & PreparedBitmaps) | {
|
|
12
|
+
status: "error";
|
|
13
|
+
message: string;
|
|
14
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Resource budgets shared by transport, caching and Canvas renderers. */
|
|
2
2
|
export declare const imageLimits: {
|
|
3
|
-
readonly maxDecodedPixels:
|
|
3
|
+
readonly maxDecodedPixels: 64000000;
|
|
4
4
|
readonly maxCanvasPixels: 6000000;
|
|
5
5
|
readonly maxDevicePixelRatio: 2.5;
|
|
6
6
|
readonly maxOriginalBytes: number;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ImageLease } from "./imageStore";
|
|
2
|
+
/** Request replacement must not release pixels that are still displayed. */
|
|
3
|
+
export declare function createImageOwnership(): {
|
|
4
|
+
replace(leases: ImageLease[]): void;
|
|
5
|
+
display(lease: ImageLease): void;
|
|
6
|
+
retainDisplay(): () => void;
|
|
7
|
+
clearDisplay(): void;
|
|
8
|
+
dispose(): void;
|
|
9
|
+
};
|
|
@@ -11,5 +11,5 @@ interface ImageRequest {
|
|
|
11
11
|
originalReason: string;
|
|
12
12
|
}
|
|
13
13
|
/** Decide resource tiers and safety before the renderer acquires any transport leases. */
|
|
14
|
-
export declare function planImageRequest(media: PreviewMedia, requestedQuality: ImageQuality, policy: ImagePolicy, resolveSource: ImageSourceResolver, targetWidth: number): ImageRequest;
|
|
14
|
+
export declare function planImageRequest(media: PreviewMedia, requestedQuality: ImageQuality, policy: ImagePolicy, resolveSource: ImageSourceResolver, targetWidth: number, originalEnabled?: boolean): ImageRequest;
|
|
15
15
|
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** The DOM image supplies geometry and the public media handle; Canvas uses the prepared pixel source. */
|
|
2
|
+
export interface ImageResource {
|
|
3
|
+
image: HTMLImageElement;
|
|
4
|
+
source: HTMLImageElement | ImageBitmap;
|
|
5
|
+
motionSource: HTMLImageElement | ImageBitmap;
|
|
6
|
+
bytes: number;
|
|
7
|
+
dispose: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function imageElementResource(image: HTMLImageElement): ImageResource;
|
|
10
|
+
/** Blob decoding avoids Chromium's scale-dependent lazy JPEG decode during drawImage. */
|
|
11
|
+
export declare function prepareImageResource(image: HTMLImageElement, blob: Blob, signal: AbortSignal): Promise<ImageResource>;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { ImageLoader } from "./imageTransport";
|
|
2
|
+
import type { ImageResource } from "./imageResource";
|
|
2
3
|
export interface ImageLease {
|
|
3
4
|
ready: Promise<HTMLImageElement>;
|
|
5
|
+
resource: Promise<ImageResource>;
|
|
4
6
|
release: () => void;
|
|
5
7
|
}
|
|
6
8
|
export interface ImageRequestOptions {
|
|
7
9
|
priority?: number;
|
|
8
10
|
maxBytes?: number;
|
|
11
|
+
maxPixels?: number;
|
|
9
12
|
}
|
|
10
13
|
/** Shared ownership, bounded fetch/decode concurrency and cancellation of unowned requests. */
|
|
11
14
|
export declare class ImageStore {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
}
|
|
1
|
+
import type { ImageResource } from "./imageResource";
|
|
2
|
+
export { ImageLimitError } from "./validation/image";
|
|
4
3
|
export interface ImageLoadOptions {
|
|
5
4
|
signal: AbortSignal;
|
|
6
5
|
readonly maxBytes: number;
|
|
6
|
+
readonly maxPixels: number;
|
|
7
7
|
}
|
|
8
|
-
export type ImageLoader = (url: string, options: ImageLoadOptions) => Promise<
|
|
8
|
+
export type ImageLoader = (url: string, options: ImageLoadOptions) => Promise<ImageResource>;
|
|
9
9
|
export declare const loadImage: ImageLoader;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class ImageLimitError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
/** Apply the same decoded-pixel boundary to downloads and every cached-resource owner. */
|
|
5
|
+
export declare function assertImagePixels(image: HTMLImageElement, maxPixels: number): void;
|
|
6
|
+
export declare const originalLimitReason = "\u539F\u56FE\u8D85\u8FC7\u8D44\u6E90\u9650\u5236";
|
|
7
|
+
export declare function originalLoadFailure(error: unknown): {
|
|
8
|
+
status: "blocked";
|
|
9
|
+
reason: string;
|
|
10
|
+
} | {
|
|
11
|
+
status: "error";
|
|
12
|
+
reason: string;
|
|
13
|
+
};
|
package/dist/core/types.d.ts
CHANGED
|
@@ -21,6 +21,12 @@ export type PreviewAnchor = {
|
|
|
21
21
|
kind: "unavailable";
|
|
22
22
|
};
|
|
23
23
|
export type PreviewPhase = "closed" | "opening" | "open" | "closing";
|
|
24
|
+
/** The caller owns captured pixels until the transition finishes, fails or is cancelled. */
|
|
25
|
+
export interface RetainedPreviewFrame {
|
|
26
|
+
image: CanvasImageSource;
|
|
27
|
+
scale: number;
|
|
28
|
+
release: () => void;
|
|
29
|
+
}
|
|
24
30
|
export interface PreviewPoint {
|
|
25
31
|
x: number;
|
|
26
32
|
y: number;
|
|
@@ -20,7 +20,7 @@ interface Options {
|
|
|
20
20
|
}
|
|
21
21
|
export declare function usePreviewViewport(options?: Options): {
|
|
22
22
|
core: PreviewViewportCore;
|
|
23
|
-
onPointerDown: (event: PointerEvent, origin?: DOMRect) => boolean;
|
|
23
|
+
onPointerDown: (event: PointerEvent, origin?: DOMRect, target?: HTMLElement) => boolean;
|
|
24
24
|
onPointerMove: (event: PointerEvent) => void;
|
|
25
25
|
onPointerUp: (event: PointerEvent) => void;
|
|
26
26
|
onPointerCancel: (event: PointerEvent) => void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PreviewMedia } from "../../types";
|
|
2
|
+
import type { VideoSourceLoader, VideoSourceObserver } from "./types";
|
|
3
|
+
/** Retire callbacks before cleanup can dispatch queued media/transport events. */
|
|
4
|
+
export declare function createVideoSourceSession(observer: VideoSourceObserver): {
|
|
5
|
+
clear: () => void;
|
|
6
|
+
dispose: () => void;
|
|
7
|
+
start(video: HTMLVideoElement, media: PreviewMedia, loader: VideoSourceLoader): void;
|
|
8
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PreviewMedia } from "../../types";
|
|
2
|
+
/** Hosts own transport; the component owns playback and the effective timeline. */
|
|
3
|
+
export type VideoSourceLoader = (video: HTMLVideoElement, media: PreviewMedia, reportError: (error: Error) => void, reportDuration: (seconds: number) => void) => () => void;
|
|
4
|
+
export interface VideoSourceObserver {
|
|
5
|
+
error: (error: Error) => void;
|
|
6
|
+
duration: (seconds: number) => void;
|
|
7
|
+
reset: () => void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface BufferedRange {
|
|
2
|
+
start: number;
|
|
3
|
+
end: number;
|
|
4
|
+
}
|
|
5
|
+
export type CompletedBuffer = {
|
|
6
|
+
kind: "pending";
|
|
7
|
+
} | {
|
|
8
|
+
kind: "retained";
|
|
9
|
+
end: number;
|
|
10
|
+
};
|
|
11
|
+
/** Preserve holes and normalize the retained tail once playback has reached its end. */
|
|
12
|
+
export declare function readBufferedRanges(video: HTMLVideoElement, duration: number, completed: CompletedBuffer): BufferedRange[];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type BufferedRange } from "./buffered";
|
|
2
|
+
export interface VideoTimelineSnapshot {
|
|
3
|
+
duration: number;
|
|
4
|
+
time: number;
|
|
5
|
+
buffered: number;
|
|
6
|
+
bufferedRanges: BufferedRange[];
|
|
7
|
+
}
|
|
8
|
+
export declare function emptyVideoTimeline(): VideoTimelineSnapshot;
|
|
9
|
+
/** One source of timing truth for text, seek bounds, playback and retained buffers. */
|
|
10
|
+
export declare function createVideoTimeline(): {
|
|
11
|
+
setDuration(seconds: number): void;
|
|
12
|
+
complete(video: HTMLVideoElement): void;
|
|
13
|
+
reset(): void;
|
|
14
|
+
read(video: HTMLVideoElement, ended: boolean): VideoTimelineSnapshot;
|
|
15
|
+
};
|
|
@@ -1,22 +1,30 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { formatVideoTime } from "./timeline/time";
|
|
2
2
|
/** Playback owns media state; the preview still owns navigation and transitions. */
|
|
3
3
|
export declare function useVideoPlayback(video: () => HTMLVideoElement, reportError: (error: Error) => void): {
|
|
4
4
|
state: {
|
|
5
|
-
playing: boolean;
|
|
6
|
-
buffering: boolean;
|
|
7
|
-
duration: number;
|
|
8
|
-
time: number;
|
|
9
|
-
buffered: number;
|
|
10
5
|
muted: boolean;
|
|
11
6
|
ended: boolean;
|
|
12
7
|
scrubbing: boolean;
|
|
13
8
|
scrubTime: number;
|
|
14
9
|
status: "loading" | "ready" | "error";
|
|
10
|
+
duration: number;
|
|
11
|
+
time: number;
|
|
12
|
+
buffered: number;
|
|
13
|
+
bufferedRanges: {
|
|
14
|
+
start: number;
|
|
15
|
+
end: number;
|
|
16
|
+
}[];
|
|
17
|
+
playing: boolean;
|
|
18
|
+
buffering: boolean;
|
|
15
19
|
};
|
|
16
20
|
seekable: import("vue").ComputedRef<boolean>;
|
|
17
21
|
displayTime: import("vue").ComputedRef<number>;
|
|
18
22
|
progress: import("vue").ComputedRef<number>;
|
|
19
23
|
bufferedProgress: import("vue").ComputedRef<number>;
|
|
24
|
+
bufferedRanges: import("vue").ComputedRef<{
|
|
25
|
+
left: number;
|
|
26
|
+
width: number;
|
|
27
|
+
}[]>;
|
|
20
28
|
events: {
|
|
21
29
|
loadedmetadata: () => void;
|
|
22
30
|
durationchange: () => void;
|
|
@@ -24,6 +32,7 @@ export declare function useVideoPlayback(video: () => HTMLVideoElement, reportEr
|
|
|
24
32
|
progress: () => void;
|
|
25
33
|
loadeddata: () => void;
|
|
26
34
|
canplay: () => void;
|
|
35
|
+
canplaythrough: () => void;
|
|
27
36
|
play: () => void;
|
|
28
37
|
playing: () => void;
|
|
29
38
|
pause: () => void;
|
|
@@ -42,5 +51,12 @@ export declare function useVideoPlayback(video: () => HTMLVideoElement, reportEr
|
|
|
42
51
|
endScrub: (commit?: boolean) => void;
|
|
43
52
|
toggleMuted: () => void;
|
|
44
53
|
retry: () => void;
|
|
54
|
+
setSourceDuration: (seconds: number) => void;
|
|
55
|
+
resetSource: () => void;
|
|
56
|
+
sourceObserver: {
|
|
57
|
+
error: (error: Error) => void;
|
|
58
|
+
duration: (seconds: number) => void;
|
|
59
|
+
reset: () => void;
|
|
60
|
+
};
|
|
45
61
|
dispose: () => void;
|
|
46
62
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PreviewMedia } from "../types";
|
|
2
|
-
|
|
3
|
-
export type VideoSourceLoader
|
|
2
|
+
import type { VideoSourceLoader, VideoSourceObserver } from "./source/types";
|
|
3
|
+
export type { VideoSourceLoader } from "./source/types";
|
|
4
4
|
export declare const nativeVideoSource: VideoSourceLoader;
|
|
5
|
-
export declare function useVideoSource(video: () => HTMLVideoElement, media: () => PreviewMedia, enabled: () => boolean, loader: () => VideoSourceLoader,
|
|
5
|
+
export declare function useVideoSource(video: () => HTMLVideoElement, media: () => PreviewMedia, enabled: () => boolean, loader: () => VideoSourceLoader, observer: VideoSourceObserver): () => number;
|
package/dist/index.d.ts
CHANGED
|
@@ -6,12 +6,14 @@ export { default as VideoDomRenderer } from "./renderers/VideoDomRenderer.vue";
|
|
|
6
6
|
export { default as LivePhotoRenderer } from "./renderers/LivePhotoRenderer.vue";
|
|
7
7
|
export { usePreviewViewport } from "./core/usePreviewViewport";
|
|
8
8
|
export { formatVideoTime } from "./core/video/useVideoPlayback";
|
|
9
|
-
export type { PreviewAnchor, PreviewPhase, PreviewMedia, PreviewMediaType, PreviewViewportCore, LivePhotoStatus, } from "./core/types";
|
|
9
|
+
export type { PreviewAnchor, PreviewPhase, RetainedPreviewFrame, PreviewMedia, PreviewMediaType, PreviewViewportCore, LivePhotoStatus, } from "./core/types";
|
|
10
10
|
export type { InitialImage } from "./core/resources/initialImage";
|
|
11
11
|
export { default as VirtualTimeline } from "./components/VirtualTimeline.vue";
|
|
12
12
|
export { defaultImagePolicy, defaultImageSource } from "./core/resources/imagePolicy";
|
|
13
13
|
export type { ImagePolicy, ImageSourceResolver, ImageQuality, OriginalStatus, } from "./core/resources/imagePolicy";
|
|
14
14
|
export { previewImageStore, ImageStore } from "./core/resources/imageStore";
|
|
15
|
+
export type { ImageLease, ImageRequestOptions } from "./core/resources/imageStore";
|
|
16
|
+
export type { ImageResource } from "./core/resources/imageResource";
|
|
15
17
|
export type { TimelineGroup, VirtualTimelineHandle } from "./core/timeline/layout";
|
|
16
18
|
export { nativeVideoSource } from "./core/video/useVideoSource";
|
|
17
19
|
export type { VideoSourceLoader } from "./core/video/useVideoSource";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { InitialImage } from "../core/resources/initialImage";
|
|
2
2
|
import type { ImagePolicy, ImageQuality, ImageSourceResolver, OriginalStatus } from "../core/resources/imagePolicy";
|
|
3
|
-
import type { PreviewMedia, PreviewViewportCore } from "../core/types";
|
|
3
|
+
import type { RetainedPreviewFrame, PreviewMedia, PreviewViewportCore } from "../core/types";
|
|
4
4
|
type __VLS_Props = {
|
|
5
5
|
media: PreviewMedia;
|
|
6
6
|
core: PreviewViewportCore;
|
|
@@ -8,42 +8,53 @@ type __VLS_Props = {
|
|
|
8
8
|
rendering?: boolean;
|
|
9
9
|
requestVersion?: number;
|
|
10
10
|
loadEnabled?: boolean;
|
|
11
|
+
originalEnabled?: boolean;
|
|
11
12
|
priority?: number;
|
|
12
13
|
resourcePolicy?: ImagePolicy;
|
|
13
14
|
resolveSource?: ImageSourceResolver;
|
|
14
15
|
initialImage?: InitialImage;
|
|
15
16
|
};
|
|
17
|
+
declare function captureFrame(): {
|
|
18
|
+
image: HTMLImageElement | ImageBitmap;
|
|
19
|
+
scale: number;
|
|
20
|
+
};
|
|
16
21
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
|
|
17
22
|
quality: string;
|
|
18
23
|
initialImage: () => InitialImage;
|
|
19
24
|
rendering: boolean;
|
|
20
25
|
loadEnabled: boolean;
|
|
26
|
+
originalEnabled: boolean;
|
|
21
27
|
requestVersion: number;
|
|
22
28
|
priority: number;
|
|
23
29
|
resourcePolicy: () => ImagePolicy;
|
|
24
30
|
resolveSource: ImageSourceResolver;
|
|
25
|
-
}>,
|
|
31
|
+
}>, {
|
|
32
|
+
captureFrame: typeof captureFrame;
|
|
33
|
+
retainFrame: () => RetainedPreviewFrame;
|
|
34
|
+
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
26
35
|
error: (error: Error) => void;
|
|
27
|
-
ready: (quality: "
|
|
36
|
+
ready: (quality: "full" | "thumbnail" | "screen") => void;
|
|
28
37
|
originalState: (status: OriginalStatus, reason: string) => void;
|
|
29
38
|
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
|
|
30
39
|
quality: string;
|
|
31
40
|
initialImage: () => InitialImage;
|
|
32
41
|
rendering: boolean;
|
|
33
42
|
loadEnabled: boolean;
|
|
43
|
+
originalEnabled: boolean;
|
|
34
44
|
requestVersion: number;
|
|
35
45
|
priority: number;
|
|
36
46
|
resourcePolicy: () => ImagePolicy;
|
|
37
47
|
resolveSource: ImageSourceResolver;
|
|
38
48
|
}>>> & {
|
|
39
49
|
onError?: ((error: Error) => any) | undefined;
|
|
40
|
-
onReady?: ((quality: "
|
|
50
|
+
onReady?: ((quality: "full" | "thumbnail" | "screen") => any) | undefined;
|
|
41
51
|
onOriginalState?: ((status: OriginalStatus, reason: string) => any) | undefined;
|
|
42
52
|
}, {
|
|
43
53
|
quality: ImageQuality;
|
|
44
54
|
rendering: boolean;
|
|
45
55
|
requestVersion: number;
|
|
46
56
|
loadEnabled: boolean;
|
|
57
|
+
originalEnabled: boolean;
|
|
47
58
|
priority: number;
|
|
48
59
|
resourcePolicy: ImagePolicy;
|
|
49
60
|
resolveSource: ImageSourceResolver;
|
|
@@ -35,9 +35,14 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
35
35
|
resolveSource: ImageSourceResolver;
|
|
36
36
|
}>, {
|
|
37
37
|
captureFrame: typeof captureFrame;
|
|
38
|
+
retainFrame: () => {
|
|
39
|
+
release: () => void;
|
|
40
|
+
image: HTMLCanvasElement;
|
|
41
|
+
scale: number;
|
|
42
|
+
};
|
|
38
43
|
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
39
44
|
error: (error: Error) => void;
|
|
40
|
-
ready: (quality: "
|
|
45
|
+
ready: (quality: "full" | "thumbnail" | "screen") => void;
|
|
41
46
|
originalState: (status: OriginalStatus, reason: string) => void;
|
|
42
47
|
liveState: (status: LivePhotoStatus) => void;
|
|
43
48
|
liveEnded: () => void;
|
|
@@ -55,7 +60,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
55
60
|
resolveSource: ImageSourceResolver;
|
|
56
61
|
}>>> & {
|
|
57
62
|
onError?: ((error: Error) => any) | undefined;
|
|
58
|
-
onReady?: ((quality: "
|
|
63
|
+
onReady?: ((quality: "full" | "thumbnail" | "screen") => any) | undefined;
|
|
59
64
|
onOriginalState?: ((status: OriginalStatus, reason: string) => any) | undefined;
|
|
60
65
|
onLiveState?: ((status: LivePhotoStatus) => any) | undefined;
|
|
61
66
|
onLiveEnded?: (() => any) | undefined;
|
|
@@ -27,7 +27,7 @@ type __VLS_Props = {
|
|
|
27
27
|
};
|
|
28
28
|
declare function toggleFullscreen(): Promise<void>;
|
|
29
29
|
declare function captureFrame(): {
|
|
30
|
-
image:
|
|
30
|
+
image: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;
|
|
31
31
|
scale: number;
|
|
32
32
|
};
|
|
33
33
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
|
|
@@ -54,21 +54,29 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
54
54
|
toggleFullscreen: typeof toggleFullscreen;
|
|
55
55
|
playback: {
|
|
56
56
|
state: {
|
|
57
|
-
playing: boolean;
|
|
58
|
-
buffering: boolean;
|
|
59
|
-
duration: number;
|
|
60
|
-
time: number;
|
|
61
|
-
buffered: number;
|
|
62
57
|
muted: boolean;
|
|
63
58
|
ended: boolean;
|
|
64
59
|
scrubbing: boolean;
|
|
65
60
|
scrubTime: number;
|
|
66
61
|
status: "loading" | "ready" | "error";
|
|
62
|
+
duration: number;
|
|
63
|
+
time: number;
|
|
64
|
+
buffered: number;
|
|
65
|
+
bufferedRanges: {
|
|
66
|
+
start: number;
|
|
67
|
+
end: number;
|
|
68
|
+
}[];
|
|
69
|
+
playing: boolean;
|
|
70
|
+
buffering: boolean;
|
|
67
71
|
};
|
|
68
72
|
seekable: import("vue").ComputedRef<boolean>;
|
|
69
73
|
displayTime: import("vue").ComputedRef<number>;
|
|
70
74
|
progress: import("vue").ComputedRef<number>;
|
|
71
75
|
bufferedProgress: import("vue").ComputedRef<number>;
|
|
76
|
+
bufferedRanges: import("vue").ComputedRef<{
|
|
77
|
+
left: number;
|
|
78
|
+
width: number;
|
|
79
|
+
}[]>;
|
|
72
80
|
events: {
|
|
73
81
|
loadedmetadata: () => void;
|
|
74
82
|
durationchange: () => void;
|
|
@@ -76,6 +84,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
76
84
|
progress: () => void;
|
|
77
85
|
loadeddata: () => void;
|
|
78
86
|
canplay: () => void;
|
|
87
|
+
canplaythrough: () => void;
|
|
79
88
|
play: () => void;
|
|
80
89
|
playing: () => void;
|
|
81
90
|
pause: () => void;
|
|
@@ -94,12 +103,24 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
94
103
|
endScrub: (commit?: boolean) => void;
|
|
95
104
|
toggleMuted: () => void;
|
|
96
105
|
retry: () => void;
|
|
106
|
+
setSourceDuration: (seconds: number) => void;
|
|
107
|
+
resetSource: () => void;
|
|
108
|
+
sourceObserver: {
|
|
109
|
+
error: (error: Error) => void;
|
|
110
|
+
duration: (seconds: number) => void;
|
|
111
|
+
reset: () => void;
|
|
112
|
+
};
|
|
97
113
|
dispose: () => void;
|
|
98
114
|
};
|
|
99
115
|
captureFrame: typeof captureFrame;
|
|
116
|
+
retainFrame: () => {
|
|
117
|
+
release: () => void;
|
|
118
|
+
image: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;
|
|
119
|
+
scale: number;
|
|
120
|
+
};
|
|
100
121
|
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
101
122
|
error: (error: Error) => void;
|
|
102
|
-
ready: (quality: "
|
|
123
|
+
ready: (quality: "full" | "thumbnail" | "screen") => void;
|
|
103
124
|
originalState: (status: OriginalStatus, reason: string) => void;
|
|
104
125
|
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
|
|
105
126
|
initialImage: () => InitialImage;
|
|
@@ -122,7 +143,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__V
|
|
|
122
143
|
controlsTarget: string;
|
|
123
144
|
}>>> & {
|
|
124
145
|
onError?: ((error: Error) => any) | undefined;
|
|
125
|
-
onReady?: ((quality: "
|
|
146
|
+
onReady?: ((quality: "full" | "thumbnail" | "screen") => any) | undefined;
|
|
126
147
|
onOriginalState?: ((status: OriginalStatus, reason: string) => any) | undefined;
|
|
127
148
|
}, {
|
|
128
149
|
active: boolean;
|