From b42d563888482547070985ed9b21685d4c237434 Mon Sep 17 00:00:00 2001 From: Olivier Lando Date: Wed, 21 Aug 2024 18:30:57 +0200 Subject: [PATCH] Add download() method --- CHANGELOG.md | 4 ++++ README.md | 5 +++++ index.ts | 36 ++++++++++++++++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f56a4e..4e35188 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All changes to this project will be documented in this file. +## [1.2.33] - 2024-08-21 + +- Add `download()` method + ## [1.2.32] - 2024-07-16 - Add `isFullScreen` in `fullscreenchange` event diff --git a/README.md b/README.md index 623008c..97c5804 100644 --- a/README.md +++ b/README.md @@ -429,6 +429,11 @@ Retrieve the playback rate. Check whether the video is a live stream. +**`download(filename?: string): void`** + +Download the video. If a filename is not provided, the default name 'video.mp4' will be used. +An exception will be thrown if the video cannot be downloaded. + **`destroy()`** Destroy the player instance. diff --git a/index.ts b/index.ts index 6f3f047..b9773dc 100644 --- a/index.ts +++ b/index.ts @@ -376,6 +376,26 @@ export class PlayerSdk { getLoop(callback?: (loop: boolean) => void): Promise { return this.postMessage({ message: "getLoop" }, callback); } + download(filename?: string) { + this.postMessage({ message: "getMp4Url" }, (res) => { + if (!res) { + throw new Error("This video is not downloadable"); + } + fetch(res as string).then((response) => { + response.blob().then((blob) => { + const url = URL.createObjectURL(blob); + + const link = document.createElement("a"); + link.href = url; + link.download = filename || "video.mp4"; + link.target = "_blank"; + link.click(); + + URL.revokeObjectURL(url); + }); + }); + }); + } getVideoSize( callback?: (size: { width: number; height: number }) => void ): Promise<{ width: number; height: number }> { @@ -638,6 +658,22 @@ export class PlayerSdk { }); } + private appendQueryParamIfMissing = ( + url: string, + name: string, + value: string + ): string => { + const urlObj = new URL(url, document.location.href); + const urlSearchParams = new URLSearchParams(urlObj.search); + if (urlSearchParams.has(name)) { + return url; + } + + urlSearchParams.append(name, value); + urlObj.search = urlSearchParams.toString(); + return urlObj.toString(); + }; + private makeId(length: number) { const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; diff --git a/package-lock.json b/package-lock.json index 332665e..50f0c76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@api.video/player-sdk", - "version": "1.2.31", + "version": "1.2.33", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@api.video/player-sdk", - "version": "1.2.31", + "version": "1.2.33", "license": "MIT", "dependencies": { "core-js": "^3.8.3", diff --git a/package.json b/package.json index d967143..34303ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@api.video/player-sdk", - "version": "1.2.32", + "version": "1.2.33", "description": "api.video player SDK", "repository": { "type": "git",