str-native-video-player 1.0.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/Package.swift +28 -0
- package/README.md +232 -0
- package/StrNativeVideoPlayer.podspec +17 -0
- package/android/build.gradle +59 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/strtv/app/STRTV.java +430 -0
- package/android/src/main/java/com/strtv/app/STRTVPlugin.java +236 -0
- package/android/src/main/java/com/strtv/app/VideoPlayer.java +163 -0
- package/android/src/main/res/.gitkeep +0 -0
- package/dist/docs.json +202 -0
- package/dist/esm/IndexedDBInterface.d.ts +48 -0
- package/dist/esm/IndexedDBInterface.js +215 -0
- package/dist/esm/IndexedDBInterface.js.map +1 -0
- package/dist/esm/VideoCacheCoordinator.d.ts +21 -0
- package/dist/esm/VideoCacheCoordinator.js +74 -0
- package/dist/esm/VideoCacheCoordinator.js.map +1 -0
- package/dist/esm/definitions.d.ts +116 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +72 -0
- package/dist/esm/web.js +110 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +411 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +414 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Sources/STRTVPlugin/STRTV.swift +8 -0
- package/ios/Sources/STRTVPlugin/STRTVPlugin.swift +23 -0
- package/ios/Tests/STRTVPluginTests/STRTVPluginTests.swift +15 -0
- package/package.json +80 -0
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
var capacitorSTRTV = (function (exports, core) {
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const STRTV = core.registerPlugin('STRTV', {
|
|
5
|
+
web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.STRTVWeb()),
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
class indexedDB_interface {
|
|
9
|
+
constructor(DBType, DB_version_num = 30) {
|
|
10
|
+
this.currentlyStoringList = [];
|
|
11
|
+
this.DB_version_num = DB_version_num;
|
|
12
|
+
this.dbType = DBType;
|
|
13
|
+
}
|
|
14
|
+
get STORE_NAME() {
|
|
15
|
+
return `${this.dbType}_entries`;
|
|
16
|
+
}
|
|
17
|
+
get DB_NAME() {
|
|
18
|
+
return `${this.dbType}_DB`;
|
|
19
|
+
}
|
|
20
|
+
convertAudSrcEntryNameToStorageName(audSrcEntry_key) {
|
|
21
|
+
let fps_30_blob_name = audSrcEntry_key + '_data';
|
|
22
|
+
if (audSrcEntry_key.includes('.')) {
|
|
23
|
+
fps_30_blob_name = audSrcEntry_key.split('.')[0] + '_data';
|
|
24
|
+
}
|
|
25
|
+
fps_30_blob_name = fps_30_blob_name.replace('_aud_', '_');
|
|
26
|
+
return fps_30_blob_name;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stores the value data under the key
|
|
30
|
+
* @param key
|
|
31
|
+
* @param audSrcFloatSrc
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
async storeInIndexedDB(key, value, operation = 'put') {
|
|
35
|
+
// Prevent the case of double store call
|
|
36
|
+
if (this.currentlyStoringList.includes(key)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.currentlyStoringList.push(key);
|
|
40
|
+
const db = await this.openIndexedDB();
|
|
41
|
+
if (!db)
|
|
42
|
+
return;
|
|
43
|
+
const transaction = db.transaction([this.STORE_NAME], 'readwrite');
|
|
44
|
+
const objectStore = transaction.objectStore(this.STORE_NAME);
|
|
45
|
+
const request = objectStore[operation]({ key: key, data: value });
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
request.onsuccess = () => {
|
|
48
|
+
// console.log('Data stored successfully');
|
|
49
|
+
this.currentlyStoringList = this.currentlyStoringList.filter((a) => a != key);
|
|
50
|
+
resolve();
|
|
51
|
+
};
|
|
52
|
+
request.onerror = (event) => {
|
|
53
|
+
console.error('Error storing data:', event);
|
|
54
|
+
reject();
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Purges all contents from the file store
|
|
60
|
+
* @returns Promise<void>
|
|
61
|
+
*/
|
|
62
|
+
async purgeFileStore() {
|
|
63
|
+
const db = await this.openIndexedDB();
|
|
64
|
+
if (!db)
|
|
65
|
+
return;
|
|
66
|
+
const transaction = db.transaction([this.STORE_NAME], 'readwrite');
|
|
67
|
+
const objectStore = transaction.objectStore(this.STORE_NAME);
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
const request = objectStore.clear();
|
|
70
|
+
request.onsuccess = () => {
|
|
71
|
+
resolve();
|
|
72
|
+
};
|
|
73
|
+
request.onerror = (event) => {
|
|
74
|
+
console.error('Error purging contents:', event);
|
|
75
|
+
reject();
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async removeFromIndexedDB(key) {
|
|
80
|
+
this.currentlyStoringList.push(key);
|
|
81
|
+
const db = await this.openIndexedDB();
|
|
82
|
+
if (!db)
|
|
83
|
+
return;
|
|
84
|
+
const transaction = db.transaction([this.STORE_NAME], 'readwrite');
|
|
85
|
+
const objectStore = transaction.objectStore(this.STORE_NAME);
|
|
86
|
+
const request = objectStore.delete(key); // Delete the item by key
|
|
87
|
+
request.onsuccess = () => {
|
|
88
|
+
// Entry successfully deleted
|
|
89
|
+
this.currentlyStoringList = this.currentlyStoringList.filter((a) => a !== key);
|
|
90
|
+
// console.log(`Data with key "${key}" removed successfully`);
|
|
91
|
+
};
|
|
92
|
+
request.onerror = (event) => {
|
|
93
|
+
console.error('Error removing data:', event);
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Returns true if there is an entry under that key in the IndexedDB
|
|
98
|
+
* @param key
|
|
99
|
+
* @returns
|
|
100
|
+
*/
|
|
101
|
+
async doesEntryExist(key) {
|
|
102
|
+
const db = await this.openIndexedDB();
|
|
103
|
+
if (!db)
|
|
104
|
+
return false;
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
const transaction = db.transaction([this.STORE_NAME], 'readonly');
|
|
107
|
+
const objectStore = transaction.objectStore(this.STORE_NAME);
|
|
108
|
+
const request = objectStore.count(key);
|
|
109
|
+
request.onsuccess = (event) => {
|
|
110
|
+
const count = event.target.result;
|
|
111
|
+
resolve(count > 0); // Resolve true if count > 0 (entry exists), false otherwise
|
|
112
|
+
};
|
|
113
|
+
request.onerror = () => {
|
|
114
|
+
console.error('Error counting entry in IndexedDB');
|
|
115
|
+
reject(false);
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Attempts closing indexed db if this.db set;
|
|
121
|
+
*/
|
|
122
|
+
closeIndexedDB() {
|
|
123
|
+
if (!this.db)
|
|
124
|
+
return;
|
|
125
|
+
this.db.close();
|
|
126
|
+
this.db = null;
|
|
127
|
+
}
|
|
128
|
+
openIndexedDB() {
|
|
129
|
+
return new Promise((resolve) => {
|
|
130
|
+
if (this.db) {
|
|
131
|
+
resolve(this.db);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const request = indexedDB.open(this.DB_NAME, this.DB_version_num);
|
|
135
|
+
request.onblocked = (event) => {
|
|
136
|
+
console.log('blocked ...', event); // in my case this was triggering
|
|
137
|
+
event.target.result.close(); // so close the connection and it worked
|
|
138
|
+
};
|
|
139
|
+
request.onupgradeneeded = (event) => {
|
|
140
|
+
const db = event.target.result;
|
|
141
|
+
if (!db.objectStoreNames.contains(this.STORE_NAME)) {
|
|
142
|
+
db.createObjectStore(this.STORE_NAME, { keyPath: 'key' });
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
request.onsuccess = (event) => {
|
|
146
|
+
const db = event.target.result;
|
|
147
|
+
this.db = db;
|
|
148
|
+
resolve(db);
|
|
149
|
+
};
|
|
150
|
+
request.onerror = (event) => {
|
|
151
|
+
console.error('Error opening IndexedDB:', event);
|
|
152
|
+
resolve(null);
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Fetches from indexed db the value at the key provided from this.store_name
|
|
158
|
+
* @param audSrcEntry_key
|
|
159
|
+
* @returns
|
|
160
|
+
*/
|
|
161
|
+
async getFromIndexedDB(key) {
|
|
162
|
+
let db = this.db;
|
|
163
|
+
if (!db)
|
|
164
|
+
db = await this.openIndexedDB();
|
|
165
|
+
if (!db)
|
|
166
|
+
return null;
|
|
167
|
+
return new Promise((resolve) => {
|
|
168
|
+
if (!db)
|
|
169
|
+
return null;
|
|
170
|
+
const transaction = db.transaction([this.STORE_NAME], 'readonly');
|
|
171
|
+
const objectStore = transaction.objectStore(this.STORE_NAME);
|
|
172
|
+
const request = objectStore.get(key);
|
|
173
|
+
request.onsuccess = (event) => {
|
|
174
|
+
try {
|
|
175
|
+
if (event.target.result) {
|
|
176
|
+
const data = event.target.result.data;
|
|
177
|
+
resolve(data);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
resolve(null);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
resolve(null);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
request.onerror = (event) => {
|
|
188
|
+
console.error('Error fetching data:', event);
|
|
189
|
+
resolve(null);
|
|
190
|
+
};
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Returns all entries in the store
|
|
195
|
+
* @returns array of { key, data }
|
|
196
|
+
*/
|
|
197
|
+
async listEntries() {
|
|
198
|
+
const db = await this.openIndexedDB();
|
|
199
|
+
if (!db)
|
|
200
|
+
return [];
|
|
201
|
+
return new Promise((resolve) => {
|
|
202
|
+
const tx = db.transaction([this.STORE_NAME], 'readonly');
|
|
203
|
+
const store = tx.objectStore(this.STORE_NAME);
|
|
204
|
+
const result = [];
|
|
205
|
+
const request = store.openCursor();
|
|
206
|
+
request.onsuccess = (event) => {
|
|
207
|
+
const cursor = event.target.result;
|
|
208
|
+
if (cursor) {
|
|
209
|
+
result.push({ key: cursor.key, data: cursor.value.data });
|
|
210
|
+
cursor.continue();
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
resolve(result);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
request.onerror = () => {
|
|
217
|
+
resolve(result); // fail silently
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// video-cache-coordinator.ts
|
|
224
|
+
class VideoCacheCoordinator {
|
|
225
|
+
constructor() {
|
|
226
|
+
this.maxCacheSizeBytes = 1000000000; // default 1 GB
|
|
227
|
+
this.db = new indexedDB_interface('videoCache');
|
|
228
|
+
}
|
|
229
|
+
setMaxCacheSize(bytes) {
|
|
230
|
+
this.maxCacheSizeBytes = bytes;
|
|
231
|
+
}
|
|
232
|
+
getMaxCacheSize() {
|
|
233
|
+
return this.maxCacheSizeBytes;
|
|
234
|
+
}
|
|
235
|
+
metadataKey(uuid) {
|
|
236
|
+
return `${uuid}_meta`;
|
|
237
|
+
}
|
|
238
|
+
blobKey(uuid) {
|
|
239
|
+
return `${uuid}_blob`;
|
|
240
|
+
}
|
|
241
|
+
async storeVideo(uuid, blob, url) {
|
|
242
|
+
const metadata = {
|
|
243
|
+
uuid,
|
|
244
|
+
sizeBytes: blob.size,
|
|
245
|
+
lastAccessed: Date.now(),
|
|
246
|
+
url,
|
|
247
|
+
};
|
|
248
|
+
// Store metadata and blob
|
|
249
|
+
await this.db.storeInIndexedDB(this.metadataKey(uuid), metadata);
|
|
250
|
+
await this.db.storeInIndexedDB(this.blobKey(uuid), blob);
|
|
251
|
+
await this.evictIfNeeded();
|
|
252
|
+
}
|
|
253
|
+
async getVideo(uuid) {
|
|
254
|
+
const metadata = await this.db.getFromIndexedDB(this.metadataKey(uuid));
|
|
255
|
+
if (!metadata)
|
|
256
|
+
return null;
|
|
257
|
+
// Update last accessed
|
|
258
|
+
metadata.lastAccessed = Date.now();
|
|
259
|
+
await this.db.storeInIndexedDB(this.metadataKey(uuid), metadata);
|
|
260
|
+
return this.db.getFromIndexedDB(this.blobKey(uuid));
|
|
261
|
+
}
|
|
262
|
+
async listVideos() {
|
|
263
|
+
// IndexedDB wrapper doesn’t give a `getAllKeys` method, so we can store metadata as key = uuid_meta
|
|
264
|
+
// For simplicity, scan all entries in the store
|
|
265
|
+
const allEntries = await this.db.listEntries();
|
|
266
|
+
// Filter for metadata entries
|
|
267
|
+
const videoMetas = allEntries
|
|
268
|
+
.filter((entry) => entry.key.endsWith('_meta'))
|
|
269
|
+
.map((entry) => entry.data);
|
|
270
|
+
return videoMetas;
|
|
271
|
+
}
|
|
272
|
+
async removeVideo(uuid) {
|
|
273
|
+
await this.db.removeFromIndexedDB(this.metadataKey(uuid));
|
|
274
|
+
await this.db.removeFromIndexedDB(this.blobKey(uuid));
|
|
275
|
+
}
|
|
276
|
+
async evictIfNeeded() {
|
|
277
|
+
const videos = await this.listVideos();
|
|
278
|
+
let totalSize = videos.reduce((acc, v) => acc + v.sizeBytes, 0);
|
|
279
|
+
if (totalSize <= this.maxCacheSizeBytes)
|
|
280
|
+
return;
|
|
281
|
+
// Evict LRU
|
|
282
|
+
videos.sort((a, b) => a.lastAccessed - b.lastAccessed);
|
|
283
|
+
for (const video of videos) {
|
|
284
|
+
await this.removeVideo(video.uuid);
|
|
285
|
+
totalSize -= video.sizeBytes;
|
|
286
|
+
if (totalSize <= this.maxCacheSizeBytes)
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
async isCached(uuid) {
|
|
291
|
+
const metadata = await this.db.getFromIndexedDB(this.metadataKey(uuid));
|
|
292
|
+
return !!metadata;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
class STRTVWeb extends core.WebPlugin {
|
|
297
|
+
constructor() {
|
|
298
|
+
super(...arguments);
|
|
299
|
+
this.cache_coord = new VideoCacheCoordinator();
|
|
300
|
+
}
|
|
301
|
+
async echo(options) {
|
|
302
|
+
console.log('ECHO', options);
|
|
303
|
+
return options;
|
|
304
|
+
}
|
|
305
|
+
async play_video(options) {
|
|
306
|
+
if (!options.video_player)
|
|
307
|
+
return { success: false };
|
|
308
|
+
const video_player = options.video_player;
|
|
309
|
+
// Try to get video from cache
|
|
310
|
+
const blob = await this.cache_coord.getVideo(options.uuid);
|
|
311
|
+
let url = options.url;
|
|
312
|
+
if (blob)
|
|
313
|
+
url = URL.createObjectURL(blob); // updating url with local cache url
|
|
314
|
+
video_player.src = url;
|
|
315
|
+
video_player.loop = !!options.loop;
|
|
316
|
+
await video_player.play();
|
|
317
|
+
// if (!blob && options.url) {
|
|
318
|
+
// this.preload_video({ uuid: options.uuid, url: options.url });
|
|
319
|
+
// }
|
|
320
|
+
return { success: true };
|
|
321
|
+
}
|
|
322
|
+
async pause_video(options) {
|
|
323
|
+
if (!options.video_player)
|
|
324
|
+
return { success: false };
|
|
325
|
+
options.video_player.pause();
|
|
326
|
+
return { success: true };
|
|
327
|
+
}
|
|
328
|
+
async stop_video(options) {
|
|
329
|
+
if (!options.video_player)
|
|
330
|
+
return { success: false };
|
|
331
|
+
options.video_player.src = '';
|
|
332
|
+
options.video_player.load();
|
|
333
|
+
options.video_player.pause();
|
|
334
|
+
return { success: true };
|
|
335
|
+
}
|
|
336
|
+
async resume_video(options) {
|
|
337
|
+
if (!options.video_player)
|
|
338
|
+
return { success: false };
|
|
339
|
+
options.video_player.play();
|
|
340
|
+
return { success: true };
|
|
341
|
+
}
|
|
342
|
+
async seek_video(options) {
|
|
343
|
+
if (!options.video_player)
|
|
344
|
+
return { success: false };
|
|
345
|
+
options.video_player.currentTime = options.position_ms / 1000;
|
|
346
|
+
return { success: true };
|
|
347
|
+
}
|
|
348
|
+
async is_video_playing() {
|
|
349
|
+
return { playing: false };
|
|
350
|
+
}
|
|
351
|
+
async preload_video(options) {
|
|
352
|
+
try {
|
|
353
|
+
if (await this.cache_coord.isCached(options.uuid))
|
|
354
|
+
return { success: true };
|
|
355
|
+
const resp = await fetch(options.url);
|
|
356
|
+
const blob = await resp.blob();
|
|
357
|
+
await this.cache_coord.storeVideo(options.uuid, blob, options.url);
|
|
358
|
+
return { success: true };
|
|
359
|
+
}
|
|
360
|
+
catch (err) {
|
|
361
|
+
console.error('Preload failed', err);
|
|
362
|
+
return { success: false };
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
async list_cached_videos() {
|
|
366
|
+
const videos = await this.cache_coord.listVideos();
|
|
367
|
+
return {
|
|
368
|
+
value: videos.map((v) => ({
|
|
369
|
+
uuid: v.uuid,
|
|
370
|
+
url: v.url || '',
|
|
371
|
+
size_bytes: v.sizeBytes,
|
|
372
|
+
last_accessed: v.lastAccessed,
|
|
373
|
+
})),
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
async evict_videos(options) {
|
|
377
|
+
try {
|
|
378
|
+
for (const uuid of options.uuids) {
|
|
379
|
+
await this.cache_coord.removeVideo(uuid);
|
|
380
|
+
}
|
|
381
|
+
return { success: true };
|
|
382
|
+
}
|
|
383
|
+
catch (err) {
|
|
384
|
+
console.error('Eviction failed', err);
|
|
385
|
+
return { success: false };
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
async get_storage_stats() {
|
|
389
|
+
const videos = await this.cache_coord.listVideos();
|
|
390
|
+
const used_bytes_videos = videos.reduce((acc, v) => acc + v.sizeBytes, 0);
|
|
391
|
+
return {
|
|
392
|
+
available_bytes: this.cache_coord.getMaxCacheSize() - used_bytes_videos,
|
|
393
|
+
total_bytes: this.cache_coord.getMaxCacheSize(),
|
|
394
|
+
used_bytes_videos,
|
|
395
|
+
used_bytes_app: 0,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
async set_max_cache_size(options) {
|
|
399
|
+
this.cache_coord.setMaxCacheSize(options.max_bytes);
|
|
400
|
+
return { success: false };
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
var web = /*#__PURE__*/Object.freeze({
|
|
405
|
+
__proto__: null,
|
|
406
|
+
STRTVWeb: STRTVWeb
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
exports.STRTV = STRTV;
|
|
410
|
+
|
|
411
|
+
return exports;
|
|
412
|
+
|
|
413
|
+
})({}, capacitorExports);
|
|
414
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/IndexedDBInterface.js","esm/VideoCacheCoordinator.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\r\nconst STRTV = registerPlugin('STRTV', {\r\n web: () => import('./web').then((m) => new m.STRTVWeb()),\r\n});\r\nexport * from './definitions';\r\nexport { STRTV };\r\n//# sourceMappingURL=index.js.map","export class indexedDB_interface {\r\n constructor(DBType, DB_version_num = 30) {\r\n this.currentlyStoringList = [];\r\n this.DB_version_num = DB_version_num;\r\n this.dbType = DBType;\r\n }\r\n get STORE_NAME() {\r\n return `${this.dbType}_entries`;\r\n }\r\n get DB_NAME() {\r\n return `${this.dbType}_DB`;\r\n }\r\n convertAudSrcEntryNameToStorageName(audSrcEntry_key) {\r\n let fps_30_blob_name = audSrcEntry_key + '_data';\r\n if (audSrcEntry_key.includes('.')) {\r\n fps_30_blob_name = audSrcEntry_key.split('.')[0] + '_data';\r\n }\r\n fps_30_blob_name = fps_30_blob_name.replace('_aud_', '_');\r\n return fps_30_blob_name;\r\n }\r\n /**\r\n * Stores the value data under the key\r\n * @param key\r\n * @param audSrcFloatSrc\r\n * @returns\r\n */\r\n async storeInIndexedDB(key, value, operation = 'put') {\r\n // Prevent the case of double store call\r\n if (this.currentlyStoringList.includes(key)) {\r\n return;\r\n }\r\n this.currentlyStoringList.push(key);\r\n const db = await this.openIndexedDB();\r\n if (!db)\r\n return;\r\n const transaction = db.transaction([this.STORE_NAME], 'readwrite');\r\n const objectStore = transaction.objectStore(this.STORE_NAME);\r\n const request = objectStore[operation]({ key: key, data: value });\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = () => {\r\n // console.log('Data stored successfully');\r\n this.currentlyStoringList = this.currentlyStoringList.filter((a) => a != key);\r\n resolve();\r\n };\r\n request.onerror = (event) => {\r\n console.error('Error storing data:', event);\r\n reject();\r\n };\r\n });\r\n }\r\n /**\r\n * Purges all contents from the file store\r\n * @returns Promise<void>\r\n */\r\n async purgeFileStore() {\r\n const db = await this.openIndexedDB();\r\n if (!db)\r\n return;\r\n const transaction = db.transaction([this.STORE_NAME], 'readwrite');\r\n const objectStore = transaction.objectStore(this.STORE_NAME);\r\n return new Promise((resolve, reject) => {\r\n const request = objectStore.clear();\r\n request.onsuccess = () => {\r\n resolve();\r\n };\r\n request.onerror = (event) => {\r\n console.error('Error purging contents:', event);\r\n reject();\r\n };\r\n });\r\n }\r\n async removeFromIndexedDB(key) {\r\n this.currentlyStoringList.push(key);\r\n const db = await this.openIndexedDB();\r\n if (!db)\r\n return;\r\n const transaction = db.transaction([this.STORE_NAME], 'readwrite');\r\n const objectStore = transaction.objectStore(this.STORE_NAME);\r\n const request = objectStore.delete(key); // Delete the item by key\r\n request.onsuccess = () => {\r\n // Entry successfully deleted\r\n this.currentlyStoringList = this.currentlyStoringList.filter((a) => a !== key);\r\n // console.log(`Data with key \"${key}\" removed successfully`);\r\n };\r\n request.onerror = (event) => {\r\n console.error('Error removing data:', event);\r\n };\r\n }\r\n /**\r\n * Returns true if there is an entry under that key in the IndexedDB\r\n * @param key\r\n * @returns\r\n */\r\n async doesEntryExist(key) {\r\n const db = await this.openIndexedDB();\r\n if (!db)\r\n return false;\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.STORE_NAME], 'readonly');\r\n const objectStore = transaction.objectStore(this.STORE_NAME);\r\n const request = objectStore.count(key);\r\n request.onsuccess = (event) => {\r\n const count = event.target.result;\r\n resolve(count > 0); // Resolve true if count > 0 (entry exists), false otherwise\r\n };\r\n request.onerror = () => {\r\n console.error('Error counting entry in IndexedDB');\r\n reject(false);\r\n };\r\n });\r\n }\r\n /**\r\n * Attempts closing indexed db if this.db set;\r\n */\r\n closeIndexedDB() {\r\n if (!this.db)\r\n return;\r\n this.db.close();\r\n this.db = null;\r\n }\r\n openIndexedDB() {\r\n return new Promise((resolve) => {\r\n if (this.db) {\r\n resolve(this.db);\r\n return;\r\n }\r\n const request = indexedDB.open(this.DB_NAME, this.DB_version_num);\r\n request.onblocked = (event) => {\r\n console.log('blocked ...', event); // in my case this was triggering\r\n event.target.result.close(); // so close the connection and it worked\r\n };\r\n request.onupgradeneeded = (event) => {\r\n const db = event.target.result;\r\n if (!db.objectStoreNames.contains(this.STORE_NAME)) {\r\n db.createObjectStore(this.STORE_NAME, { keyPath: 'key' });\r\n }\r\n };\r\n request.onsuccess = (event) => {\r\n const db = event.target.result;\r\n this.db = db;\r\n resolve(db);\r\n };\r\n request.onerror = (event) => {\r\n console.error('Error opening IndexedDB:', event);\r\n resolve(null);\r\n };\r\n });\r\n }\r\n /**\r\n * Fetches from indexed db the value at the key provided from this.store_name\r\n * @param audSrcEntry_key\r\n * @returns\r\n */\r\n async getFromIndexedDB(key) {\r\n let db = this.db;\r\n if (!db)\r\n db = await this.openIndexedDB();\r\n if (!db)\r\n return null;\r\n return new Promise((resolve) => {\r\n if (!db)\r\n return null;\r\n const transaction = db.transaction([this.STORE_NAME], 'readonly');\r\n const objectStore = transaction.objectStore(this.STORE_NAME);\r\n const request = objectStore.get(key);\r\n request.onsuccess = (event) => {\r\n try {\r\n if (event.target.result) {\r\n const data = event.target.result.data;\r\n resolve(data);\r\n }\r\n else {\r\n resolve(null);\r\n }\r\n }\r\n catch (e) {\r\n resolve(null);\r\n }\r\n };\r\n request.onerror = (event) => {\r\n console.error('Error fetching data:', event);\r\n resolve(null);\r\n };\r\n });\r\n }\r\n /**\r\n * Returns all entries in the store\r\n * @returns array of { key, data }\r\n */\r\n async listEntries() {\r\n const db = await this.openIndexedDB();\r\n if (!db)\r\n return [];\r\n return new Promise((resolve) => {\r\n const tx = db.transaction([this.STORE_NAME], 'readonly');\r\n const store = tx.objectStore(this.STORE_NAME);\r\n const result = [];\r\n const request = store.openCursor();\r\n request.onsuccess = (event) => {\r\n const cursor = event.target.result;\r\n if (cursor) {\r\n result.push({ key: cursor.key, data: cursor.value.data });\r\n cursor.continue();\r\n }\r\n else {\r\n resolve(result);\r\n }\r\n };\r\n request.onerror = () => {\r\n resolve(result); // fail silently\r\n };\r\n });\r\n }\r\n}\r\n//# sourceMappingURL=IndexedDBInterface.js.map","// video-cache-coordinator.ts\r\nimport { indexedDB_interface } from './IndexedDBInterface';\r\nexport class VideoCacheCoordinator {\r\n constructor() {\r\n this.maxCacheSizeBytes = 1000000000; // default 1 GB\r\n this.db = new indexedDB_interface('videoCache');\r\n }\r\n setMaxCacheSize(bytes) {\r\n this.maxCacheSizeBytes = bytes;\r\n }\r\n getMaxCacheSize() {\r\n return this.maxCacheSizeBytes;\r\n }\r\n metadataKey(uuid) {\r\n return `${uuid}_meta`;\r\n }\r\n blobKey(uuid) {\r\n return `${uuid}_blob`;\r\n }\r\n async storeVideo(uuid, blob, url) {\r\n const metadata = {\r\n uuid,\r\n sizeBytes: blob.size,\r\n lastAccessed: Date.now(),\r\n url,\r\n };\r\n // Store metadata and blob\r\n await this.db.storeInIndexedDB(this.metadataKey(uuid), metadata);\r\n await this.db.storeInIndexedDB(this.blobKey(uuid), blob);\r\n await this.evictIfNeeded();\r\n }\r\n async getVideo(uuid) {\r\n const metadata = await this.db.getFromIndexedDB(this.metadataKey(uuid));\r\n if (!metadata)\r\n return null;\r\n // Update last accessed\r\n metadata.lastAccessed = Date.now();\r\n await this.db.storeInIndexedDB(this.metadataKey(uuid), metadata);\r\n return this.db.getFromIndexedDB(this.blobKey(uuid));\r\n }\r\n async listVideos() {\r\n // IndexedDB wrapper doesn’t give a `getAllKeys` method, so we can store metadata as key = uuid_meta\r\n // For simplicity, scan all entries in the store\r\n const allEntries = await this.db.listEntries();\r\n // Filter for metadata entries\r\n const videoMetas = allEntries\r\n .filter((entry) => entry.key.endsWith('_meta'))\r\n .map((entry) => entry.data);\r\n return videoMetas;\r\n }\r\n async removeVideo(uuid) {\r\n await this.db.removeFromIndexedDB(this.metadataKey(uuid));\r\n await this.db.removeFromIndexedDB(this.blobKey(uuid));\r\n }\r\n async evictIfNeeded() {\r\n const videos = await this.listVideos();\r\n let totalSize = videos.reduce((acc, v) => acc + v.sizeBytes, 0);\r\n if (totalSize <= this.maxCacheSizeBytes)\r\n return;\r\n // Evict LRU\r\n videos.sort((a, b) => a.lastAccessed - b.lastAccessed);\r\n for (const video of videos) {\r\n await this.removeVideo(video.uuid);\r\n totalSize -= video.sizeBytes;\r\n if (totalSize <= this.maxCacheSizeBytes)\r\n break;\r\n }\r\n }\r\n async isCached(uuid) {\r\n const metadata = await this.db.getFromIndexedDB(this.metadataKey(uuid));\r\n return !!metadata;\r\n }\r\n}\r\n//# sourceMappingURL=VideoCacheCoordinator.js.map","import { WebPlugin } from '@capacitor/core';\r\nimport { VideoCacheCoordinator } from './VideoCacheCoordinator';\r\nexport class STRTVWeb extends WebPlugin {\r\n constructor() {\r\n super(...arguments);\r\n this.cache_coord = new VideoCacheCoordinator();\r\n }\r\n async echo(options) {\r\n console.log('ECHO', options);\r\n return options;\r\n }\r\n async play_video(options) {\r\n if (!options.video_player)\r\n return { success: false };\r\n const video_player = options.video_player;\r\n // Try to get video from cache\r\n const blob = await this.cache_coord.getVideo(options.uuid);\r\n let url = options.url;\r\n if (blob)\r\n url = URL.createObjectURL(blob); // updating url with local cache url\r\n video_player.src = url;\r\n video_player.loop = !!options.loop;\r\n await video_player.play();\r\n // if (!blob && options.url) {\r\n // this.preload_video({ uuid: options.uuid, url: options.url });\r\n // }\r\n return { success: true };\r\n }\r\n async pause_video(options) {\r\n if (!options.video_player)\r\n return { success: false };\r\n options.video_player.pause();\r\n return { success: true };\r\n }\r\n async stop_video(options) {\r\n if (!options.video_player)\r\n return { success: false };\r\n options.video_player.src = '';\r\n options.video_player.load();\r\n options.video_player.pause();\r\n return { success: true };\r\n }\r\n async resume_video(options) {\r\n if (!options.video_player)\r\n return { success: false };\r\n options.video_player.play();\r\n return { success: true };\r\n }\r\n async seek_video(options) {\r\n if (!options.video_player)\r\n return { success: false };\r\n options.video_player.currentTime = options.position_ms / 1000;\r\n return { success: true };\r\n }\r\n async is_video_playing() {\r\n return { playing: false };\r\n }\r\n async preload_video(options) {\r\n try {\r\n if (await this.cache_coord.isCached(options.uuid))\r\n return { success: true };\r\n const resp = await fetch(options.url);\r\n const blob = await resp.blob();\r\n await this.cache_coord.storeVideo(options.uuid, blob, options.url);\r\n return { success: true };\r\n }\r\n catch (err) {\r\n console.error('Preload failed', err);\r\n return { success: false };\r\n }\r\n }\r\n async list_cached_videos() {\r\n const videos = await this.cache_coord.listVideos();\r\n return {\r\n value: videos.map((v) => ({\r\n uuid: v.uuid,\r\n url: v.url || '',\r\n size_bytes: v.sizeBytes,\r\n last_accessed: v.lastAccessed,\r\n })),\r\n };\r\n }\r\n async evict_videos(options) {\r\n try {\r\n for (const uuid of options.uuids) {\r\n await this.cache_coord.removeVideo(uuid);\r\n }\r\n return { success: true };\r\n }\r\n catch (err) {\r\n console.error('Eviction failed', err);\r\n return { success: false };\r\n }\r\n }\r\n async get_storage_stats() {\r\n const videos = await this.cache_coord.listVideos();\r\n const used_bytes_videos = videos.reduce((acc, v) => acc + v.sizeBytes, 0);\r\n return {\r\n available_bytes: this.cache_coord.getMaxCacheSize() - used_bytes_videos,\r\n total_bytes: this.cache_coord.getMaxCacheSize(),\r\n used_bytes_videos,\r\n used_bytes_app: 0,\r\n };\r\n }\r\n async set_max_cache_size(options) {\r\n this.cache_coord.setMaxCacheSize(options.max_bytes);\r\n return { success: false };\r\n }\r\n}\r\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import Capacitor
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Please read the Capacitor iOS Plugin Development Guide
|
|
6
|
+
* here: https://capacitorjs.com/docs/plugins/ios
|
|
7
|
+
*/
|
|
8
|
+
@objc(STRTVPlugin)
|
|
9
|
+
public class STRTVPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
10
|
+
public let identifier = "STRTVPlugin"
|
|
11
|
+
public let jsName = "STRTV"
|
|
12
|
+
public let pluginMethods: [CAPPluginMethod] = [
|
|
13
|
+
CAPPluginMethod(name: "echo", returnType: CAPPluginReturnPromise)
|
|
14
|
+
]
|
|
15
|
+
private let implementation = STRTV()
|
|
16
|
+
|
|
17
|
+
@objc func echo(_ call: CAPPluginCall) {
|
|
18
|
+
let value = call.getString("value") ?? ""
|
|
19
|
+
call.resolve([
|
|
20
|
+
"value": implementation.echo(value)
|
|
21
|
+
])
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import XCTest
|
|
2
|
+
@testable import STRTVPlugin
|
|
3
|
+
|
|
4
|
+
class STRTVTests: XCTestCase {
|
|
5
|
+
func testEcho() {
|
|
6
|
+
// This is an example of a functional test case for a plugin.
|
|
7
|
+
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
|
8
|
+
|
|
9
|
+
let implementation = STRTV()
|
|
10
|
+
let value = "Hello, World!"
|
|
11
|
+
let result = implementation.echo(value)
|
|
12
|
+
|
|
13
|
+
XCTAssertEqual(value, result)
|
|
14
|
+
}
|
|
15
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "str-native-video-player",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Allows for native video player functionality, fetching and storing videos from a CDN, switching between the playback of these videos with cross fade and preloading functionality",
|
|
5
|
+
"main": "dist/plugin.cjs.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"types": "dist/esm/index.d.ts",
|
|
8
|
+
"unpkg": "dist/plugin.js",
|
|
9
|
+
"files": [
|
|
10
|
+
"android/src/main/",
|
|
11
|
+
"android/build.gradle",
|
|
12
|
+
"dist/",
|
|
13
|
+
"ios/Sources",
|
|
14
|
+
"ios/Tests",
|
|
15
|
+
"Package.swift",
|
|
16
|
+
"StrNativeVideoPlayer.podspec"
|
|
17
|
+
],
|
|
18
|
+
"author": "Lucas McKamey",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/Lucasmac23/STRTV-Plugin.git.git"
|
|
23
|
+
},
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/Lucasmac23/STRTV-Plugin.git/issues"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"capacitor",
|
|
29
|
+
"plugin",
|
|
30
|
+
"native"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"verify": "npm run verify:ios && npm run verify:android && npm run verify:web",
|
|
34
|
+
"verify:ios": "xcodebuild -scheme StrNativeVideoPlayer -destination generic/platform=iOS",
|
|
35
|
+
"verify:android": "cd android && ./gradlew clean build test && cd ..",
|
|
36
|
+
"verify:web": "npm run build",
|
|
37
|
+
"lint": "npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint",
|
|
38
|
+
"fmt": "npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format",
|
|
39
|
+
"eslint": "eslint . --ext ts",
|
|
40
|
+
"prettier": "prettier \"**/*.{css,html,ts,js,java}\" --plugin=prettier-plugin-java",
|
|
41
|
+
"swiftlint": "node-swiftlint",
|
|
42
|
+
"docgen": "docgen --api STRTVPlugin --output-readme README.md --output-json dist/docs.json",
|
|
43
|
+
"build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs",
|
|
44
|
+
"clean": "rimraf ./dist",
|
|
45
|
+
"watch": "tsc --watch",
|
|
46
|
+
"prepublishOnly": "npm run build"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@capacitor/android": "^7.0.0",
|
|
50
|
+
"@capacitor/core": "^7.0.0",
|
|
51
|
+
"@capacitor/docgen": "^0.3.0",
|
|
52
|
+
"@capacitor/ios": "^7.0.0",
|
|
53
|
+
"@ionic/eslint-config": "^0.4.0",
|
|
54
|
+
"@ionic/prettier-config": "^4.0.0",
|
|
55
|
+
"@ionic/swiftlint-config": "^2.0.0",
|
|
56
|
+
"eslint": "^8.57.0",
|
|
57
|
+
"prettier": "^3.4.2",
|
|
58
|
+
"prettier-plugin-java": "^2.6.6",
|
|
59
|
+
"rimraf": "^6.0.1",
|
|
60
|
+
"rollup": "^4.30.1",
|
|
61
|
+
"swiftlint": "^2.0.0",
|
|
62
|
+
"typescript": "~4.1.5"
|
|
63
|
+
},
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"@capacitor/core": ">=7.0.0"
|
|
66
|
+
},
|
|
67
|
+
"prettier": "@ionic/prettier-config",
|
|
68
|
+
"swiftlint": "@ionic/swiftlint-config",
|
|
69
|
+
"eslintConfig": {
|
|
70
|
+
"extends": "@ionic/eslint-config/recommended"
|
|
71
|
+
},
|
|
72
|
+
"capacitor": {
|
|
73
|
+
"ios": {
|
|
74
|
+
"src": "ios"
|
|
75
|
+
},
|
|
76
|
+
"android": {
|
|
77
|
+
"src": "android"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|