From 4534b0fdb115c6f79f34e518e9d22be89e345429 Mon Sep 17 00:00:00 2001 From: Daniel Silhavy Date: Tue, 9 Aug 2022 09:59:06 +0200 Subject: [PATCH] Add ua-parser-js to enable reliable browser name and version parsing (#4001) --- package-lock.json | 15 ++++++++++----- package.json | 3 ++- src/core/Utils.js | 12 ++++++++++++ src/streaming/controllers/CatchupController.js | 5 +++-- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index e8b7eb361b..bf4952a478 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dashjs", - "version": "4.4.1", + "version": "4.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -10868,6 +10868,12 @@ "is-number": "^7.0.0" } }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -16111,10 +16117,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", + "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==" }, "uc.micro": { "version": "1.0.6", diff --git a/package.json b/package.json index 296a26beac..ac967e0328 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,8 @@ "fast-deep-equal": "2.0.1", "html-entities": "^1.2.1", "imsc": "^1.0.2", - "localforage": "^1.7.1" + "localforage": "^1.7.1", + "ua-parser-js": "^1.0.2" }, "repository": { "type": "git", diff --git a/src/core/Utils.js b/src/core/Utils.js index aa7002e1dc..59962fdd1b 100644 --- a/src/core/Utils.js +++ b/src/core/Utils.js @@ -35,6 +35,7 @@ */ import path from 'path-browserify' +import { UAParser } from 'ua-parser-js' class Utils { static mixin(dest, source, copy) { @@ -175,6 +176,17 @@ class Utils { return targetUrl } } + + static parseUserAgent(ua = null) { + try { + const uaString = ua === null ? typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '' : ''; + + return UAParser(uaString); + } + catch(e) { + return {}; + } + } } export default Utils; diff --git a/src/streaming/controllers/CatchupController.js b/src/streaming/controllers/CatchupController.js index eb9c0a900b..8488117d5a 100644 --- a/src/streaming/controllers/CatchupController.js +++ b/src/streaming/controllers/CatchupController.js @@ -35,6 +35,7 @@ import Constants from '../constants/Constants'; import MediaPlayerEvents from '../MediaPlayerEvents'; import Events from '../../core/events/Events'; import MetricsConstants from '../constants/MetricsConstants'; +import Utils from '../../core/Utils'; function CatchupController() { const context = this.context; @@ -115,8 +116,8 @@ function CatchupController() { isCatchupSeekInProgress = false; // Detect safari browser (special behavior for low latency streams) - const ua = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : ''; - const isSafari = /safari/.test(ua) && !/chrome/.test(ua); + const ua = Utils.parseUserAgent(); + const isSafari = ua && ua.browser && ua.browser.name && ua.browser.name.toLowerCase() === 'safari'; minPlaybackRateChange = isSafari ? 0.25 : 0.02; }