@streamscloud/embeddable 6.2.1 → 6.3.0
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/dist/core/image-preloader.d.ts +1 -0
- package/dist/core/image-preloader.js +10 -0
- package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +1 -0
- package/dist/short-videos/short-videos-player/short-videos-player-view.svelte +29 -15
- package/dist/ui/icon/cmp.icon.svelte +2 -0
- package/dist/ui/player/player-buffer.svelte.d.ts +4 -2
- package/dist/ui/player/player-buffer.svelte.js +11 -5
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const preloadImage: (src: string, throwOnError?: boolean) => Promise<void>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const preloadImage = (src, throwOnError = false) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
const img = new Image();
|
|
4
|
+
img.decoding = 'async';
|
|
5
|
+
img.loading = 'eager';
|
|
6
|
+
img.onload = () => resolve();
|
|
7
|
+
img.onerror = (e) => (throwOnError ? reject(e) : resolve());
|
|
8
|
+
img.src = src;
|
|
9
|
+
});
|
|
10
|
+
};
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { handleEsc } from '../../core/document.event-handlers';
|
|
11
|
+
import { preloadImage } from '../../core/image-preloader';
|
|
11
12
|
import { ShortVideoViewer } from '../short-video-viewer';
|
|
12
|
-
import { InternalShortVideoPlayerProvider } from './internal-short-video-player-provider';
|
|
13
13
|
import { Loading } from '../../ui/loading';
|
|
14
14
|
import { PlayerBuffer, PlayerSlider } from '../../ui/player';
|
|
15
15
|
import { SpotlightLayout } from '../../ui/spotlight-layout';
|
|
@@ -17,34 +17,44 @@ import { SwipeIndicator } from '../../ui/swipe-indicator';
|
|
|
17
17
|
import { default as Controls } from './controls.svelte';
|
|
18
18
|
import { ShortVideosPlayerLocalization } from './short-videos-player-localization';
|
|
19
19
|
import { ShortVideosPlayerUiManager } from './ui-manager.svelte';
|
|
20
|
-
import {
|
|
20
|
+
import { untrack } from 'svelte';
|
|
21
21
|
let { dataProvider, socialInteractionsHandler, localization: localizationInit = 'en', showStreamsCloudWatermark, disableBackground, on, categoriesSwitcher, playerLogo = null, fadeContent = false } = $props();
|
|
22
22
|
const localization = $derived(new ShortVideosPlayerLocalization(localizationInit));
|
|
23
23
|
let everTouched = $state(false);
|
|
24
24
|
let background = $state(null);
|
|
25
|
-
let
|
|
25
|
+
let bufferIsLoading = $state(false);
|
|
26
|
+
let buffer = $state.raw(null);
|
|
27
|
+
$effect(() => {
|
|
26
28
|
void dataProvider;
|
|
27
|
-
|
|
29
|
+
untrack(() => {
|
|
30
|
+
let bufferInstance = null;
|
|
31
|
+
bufferIsLoading = true;
|
|
32
|
+
bufferInstance = new PlayerBuffer(dataProvider, {
|
|
33
|
+
preloaded: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
+
if (bufferInstance === null || bufferInstance === void 0 ? void 0 : bufferInstance.loaded.length) {
|
|
35
|
+
const coverUrl = resolveVideoCover(bufferInstance.loaded[0]);
|
|
36
|
+
yield preloadImage(coverUrl);
|
|
37
|
+
background = coverUrl;
|
|
38
|
+
}
|
|
39
|
+
buffer = bufferInstance;
|
|
40
|
+
bufferIsLoading = false;
|
|
41
|
+
})
|
|
42
|
+
});
|
|
43
|
+
});
|
|
28
44
|
});
|
|
29
45
|
const uiManager = new ShortVideosPlayerUiManager();
|
|
30
|
-
onMount(() => {
|
|
31
|
-
if (dataProvider instanceof InternalShortVideoPlayerProvider) {
|
|
32
|
-
initBuffer(dataProvider);
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
const initBuffer = (provider) => __awaiter(void 0, void 0, void 0, function* () {
|
|
36
|
-
yield provider.prefetch();
|
|
37
|
-
buffer = new PlayerBuffer(provider);
|
|
38
|
-
});
|
|
39
46
|
const onItemActivated = (id) => {
|
|
40
47
|
var _a;
|
|
41
48
|
const shortVideo = buffer === null || buffer === void 0 ? void 0 : buffer.loaded.find((x) => x.id === id);
|
|
42
49
|
if (!shortVideo) {
|
|
43
50
|
return;
|
|
44
51
|
}
|
|
45
|
-
background = shortVideo
|
|
52
|
+
background = resolveVideoCover(shortVideo);
|
|
46
53
|
(_a = on === null || on === void 0 ? void 0 : on.videoActivated) === null || _a === void 0 ? void 0 : _a.call(on, id);
|
|
47
54
|
};
|
|
55
|
+
const resolveVideoCover = (shortVideo) => {
|
|
56
|
+
return shortVideo.media.isImage ? shortVideo.media.url : shortVideo.media.thumbnailUrl;
|
|
57
|
+
};
|
|
48
58
|
const contentMounted = (node) => {
|
|
49
59
|
const markAsTouched = () => {
|
|
50
60
|
everTouched = true;
|
|
@@ -78,6 +88,7 @@ const onPlayerClose = () => {
|
|
|
78
88
|
<div
|
|
79
89
|
class="short-videos-player-container"
|
|
80
90
|
class:short-videos-player-container--background-enabled={!disableBackground}
|
|
91
|
+
class:short-videos-player-container--background-loading={!disableBackground && !background}
|
|
81
92
|
class:short-videos-player-container--faded={fadeContent}
|
|
82
93
|
style={background && !disableBackground ? `--background-image: url(${background})` : null}>
|
|
83
94
|
{#if categoriesSwitcher}
|
|
@@ -95,7 +106,7 @@ const onPlayerClose = () => {
|
|
|
95
106
|
</a>
|
|
96
107
|
</div>
|
|
97
108
|
{/if}
|
|
98
|
-
{#if buffer}
|
|
109
|
+
{#if buffer && !bufferIsLoading}
|
|
99
110
|
<SpotlightLayout ratio={9 / 16} on={{ dimensionsChanged: handleDimensionsChanged }}>
|
|
100
111
|
<div class="short-videos-player__content" use:contentMounted>
|
|
101
112
|
<PlayerSlider
|
|
@@ -160,6 +171,9 @@ const onPlayerClose = () => {
|
|
|
160
171
|
background-size: cover;
|
|
161
172
|
background-blend-mode: multiply;
|
|
162
173
|
}
|
|
174
|
+
.short-videos-player-container--background-loading {
|
|
175
|
+
background-color: transparent;
|
|
176
|
+
}
|
|
163
177
|
.short-videos-player-container--faded {
|
|
164
178
|
--short-videos-player--elements-opacity: 0;
|
|
165
179
|
}
|
|
@@ -31,6 +31,7 @@ let { src, color = null } = $props();
|
|
|
31
31
|
--_icon--color: var(--icon--color);
|
|
32
32
|
--_icon--size: var(--icon--size, 1.25em);
|
|
33
33
|
--_icon--stroke-width: var(--icon--stroke-width, 0);
|
|
34
|
+
--_icon--filter: var(--icon--filter, none);
|
|
34
35
|
display: contents;
|
|
35
36
|
}
|
|
36
37
|
.icon--white {
|
|
@@ -79,6 +80,7 @@ let { src, color = null } = $props();
|
|
|
79
80
|
display: inline-block;
|
|
80
81
|
color: inherit;
|
|
81
82
|
fill: var(--_icon--color, currentColor);
|
|
83
|
+
filter: var(--_icon--filter);
|
|
82
84
|
height: var(--_icon--size);
|
|
83
85
|
min-height: var(--_icon--size);
|
|
84
86
|
max-height: var(--_icon--size);
|
|
@@ -13,10 +13,12 @@ export declare class PlayerBuffer<T extends {
|
|
|
13
13
|
private _loaded;
|
|
14
14
|
private loadMoreFn;
|
|
15
15
|
private isLoading;
|
|
16
|
-
constructor(provider: IPlayerItemsProvider<T
|
|
16
|
+
constructor(provider: IPlayerItemsProvider<T>, on?: {
|
|
17
|
+
preloaded?: () => void;
|
|
18
|
+
});
|
|
17
19
|
loadNext: () => Promise<void>;
|
|
18
20
|
loadPrevious: () => Promise<void>;
|
|
19
|
-
reset: () => void;
|
|
21
|
+
reset: (onPreloaded?: () => void) => void;
|
|
20
22
|
private warmUpBuffer;
|
|
21
23
|
}
|
|
22
24
|
export interface IPlayerItemsProvider<T> {
|
|
@@ -11,7 +11,7 @@ export class PlayerBuffer {
|
|
|
11
11
|
_loaded = $state.raw([]);
|
|
12
12
|
loadMoreFn;
|
|
13
13
|
isLoading = false;
|
|
14
|
-
constructor(provider) {
|
|
14
|
+
constructor(provider, on) {
|
|
15
15
|
this.loadMoreFn = provider.loadMore;
|
|
16
16
|
this._loaded = provider.initialData.prefetchedItems;
|
|
17
17
|
this._currentIndex = this._loaded.length
|
|
@@ -19,7 +19,7 @@ export class PlayerBuffer {
|
|
|
19
19
|
? this._loaded.length - 1
|
|
20
20
|
: provider.initialData.startIndex
|
|
21
21
|
: -1;
|
|
22
|
-
this.warmUpBuffer();
|
|
22
|
+
this.warmUpBuffer(on?.preloaded);
|
|
23
23
|
this.loadNext = Utils.throttle(this.loadNext, this.animationDuration);
|
|
24
24
|
this.loadPrevious = Utils.throttle(this.loadPrevious, this.animationDuration);
|
|
25
25
|
}
|
|
@@ -36,15 +36,18 @@ export class PlayerBuffer {
|
|
|
36
36
|
}
|
|
37
37
|
--this._currentIndex;
|
|
38
38
|
};
|
|
39
|
-
reset = () => {
|
|
39
|
+
reset = (onPreloaded) => {
|
|
40
40
|
this._loaded = [];
|
|
41
41
|
this._currentIndex = -1;
|
|
42
42
|
this.isLoading = false;
|
|
43
|
-
this.warmUpBuffer();
|
|
43
|
+
this.warmUpBuffer(onPreloaded);
|
|
44
44
|
};
|
|
45
|
-
warmUpBuffer = async () => {
|
|
45
|
+
warmUpBuffer = async (onPreloaded) => {
|
|
46
46
|
const bufferSize = 5;
|
|
47
47
|
if (this._loaded.length >= this.currentIndex + bufferSize || this.isLoading) {
|
|
48
|
+
if (onPreloaded) {
|
|
49
|
+
onPreloaded();
|
|
50
|
+
}
|
|
48
51
|
return;
|
|
49
52
|
}
|
|
50
53
|
this.isLoading = true;
|
|
@@ -58,6 +61,9 @@ export class PlayerBuffer {
|
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
finally {
|
|
64
|
+
if (onPreloaded) {
|
|
65
|
+
onPreloaded();
|
|
66
|
+
}
|
|
61
67
|
this.isLoading = false;
|
|
62
68
|
}
|
|
63
69
|
};
|