mirror of
https://github.com/DanielnetoDotCom/YouPHPTube
synced 2025-10-05 02:39:46 +02:00
This commit is contained in:
parent
cb46edfe52
commit
1aae4c9c1b
35 changed files with 725 additions and 181 deletions
17
node_modules/.package-lock.json
generated
vendored
17
node_modules/.package-lock.json
generated
vendored
|
@ -721,6 +721,17 @@
|
||||||
"unidragger": "^3.0.0"
|
"unidragger": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/flickity-bg-lazyload": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/flickity-bg-lazyload/-/flickity-bg-lazyload-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-il5f8gi0GHNGv0mU+rpEfEAnv1VBpYYRKMVsgmFR5hblBlhT6VaQltKTjc8irTgU8lNOdEuaGavW/AE0QzjSMg==",
|
||||||
|
"dependencies": {
|
||||||
|
"fizzy-ui-utils": "^3.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"flickity": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/fontawesome-free": {
|
"node_modules/fontawesome-free": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/fontawesome-free/-/fontawesome-free-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/fontawesome-free/-/fontawesome-free-1.0.4.tgz",
|
||||||
|
@ -746,9 +757,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/hls.js": {
|
"node_modules/hls.js": {
|
||||||
"version": "1.4.5",
|
"version": "1.4.7",
|
||||||
"resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.4.7.tgz",
|
||||||
"integrity": "sha512-xb7IiSM9apU3tJWb5rdSStobXPNJJykHTwSy7JnLF5y/kLJXWjoR/fEpNBlwYxkKcDiiSfO9SQI8yFravZJxIg=="
|
"integrity": "sha512-dvwJXLlYES6wb7DR42uuTrio5sUTsIoWbuNeQS4xHMqfVBZ0KAlJlBmjFAo4s20/0XRhsMjWf5bx0kq5Lgvv1w=="
|
||||||
},
|
},
|
||||||
"node_modules/ieee754": {
|
"node_modules/ieee754": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
|
|
19
node_modules/flickity-bg-lazyload/.eslintrc.js
generated
vendored
Normal file
19
node_modules/flickity-bg-lazyload/.eslintrc.js
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
module.exports = {
|
||||||
|
plugins: [ 'metafizzy' ],
|
||||||
|
extends: 'plugin:metafizzy/browser',
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
commonjs: true,
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 2018,
|
||||||
|
},
|
||||||
|
globals: {
|
||||||
|
Flickity: 'readonly',
|
||||||
|
QUnit: 'readonly',
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
'prefer-object-spread': 'error',
|
||||||
|
},
|
||||||
|
ignorePatterns: [ 'bower_components' ],
|
||||||
|
};
|
1
node_modules/flickity-bg-lazyload/.nvmrc
generated
vendored
Normal file
1
node_modules/flickity-bg-lazyload/.nvmrc
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
16
|
86
node_modules/flickity-bg-lazyload/README.md
generated
vendored
Normal file
86
node_modules/flickity-bg-lazyload/README.md
generated
vendored
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
# Flickity background lazyload
|
||||||
|
|
||||||
|
Lazyload background images of selected cells.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Add `bg-lazyload.js` to your scripts.
|
||||||
|
|
||||||
|
### Download
|
||||||
|
|
||||||
|
[bg-lazyload.js](https://unpkg.com/flickity-bg-lazyload@1/bg-lazyload.js)
|
||||||
|
|
||||||
|
### CDN
|
||||||
|
|
||||||
|
``` html
|
||||||
|
<script src="https://unpkg.com/flickity-bg-lazyload@1/bg-lazyload.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Package managers
|
||||||
|
|
||||||
|
npm: `npm install flickity-bg-lazyload`
|
||||||
|
|
||||||
|
Bower: `bower install flickity-bg-lazyload`
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Set `data-flickity-bg-lazyload` attribute of the cell to the background image's url.
|
||||||
|
|
||||||
|
``` html
|
||||||
|
<div class="carousel">
|
||||||
|
<div class="carousel-cell" data-flickity-bg-lazyload="oranges.jpg"></div>
|
||||||
|
<div class="carousel-cell" data-flickity-bg-lazyload="submerge.jpg"></div>
|
||||||
|
<div class="carousel-cell" data-flickity-bg-lazyload="cat-nose.jpg"></div>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
Set `bgLazyLoad` option.
|
||||||
|
|
||||||
|
``` js
|
||||||
|
// lazyloads background image of selected cell
|
||||||
|
// jQuery
|
||||||
|
var $carousel = $('.carousel').flickity({
|
||||||
|
bgLazyLoad: true
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
``` js
|
||||||
|
// vanilla JS
|
||||||
|
var flkty = new Flickity( '.carousel', {
|
||||||
|
bgLazyLoad: true
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Set `bgLazyLoad` to a number to load images in adjacent cells.
|
||||||
|
|
||||||
|
``` js
|
||||||
|
bgLazyLoad: 2
|
||||||
|
// load background images in selected cell
|
||||||
|
// and next 2 cells
|
||||||
|
// and previous 2 cells
|
||||||
|
```
|
||||||
|
|
||||||
|
### Webpack & Browserify
|
||||||
|
|
||||||
|
``` js
|
||||||
|
var Flickity = require('flickity-bg-lazyload');
|
||||||
|
|
||||||
|
var flkty = new Flickity( '.carousel', {
|
||||||
|
bgLazyLoad: true
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### RequireJS
|
||||||
|
|
||||||
|
``` js
|
||||||
|
requirejs( [ 'path/to/flickity-bg-lazyload' ], function( Flickity ) {
|
||||||
|
var flkty = new Flickity( '.carousel', {
|
||||||
|
bgLazyLoad: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
By [Metafizzy 🌈🐻](https://metafizzy.co)
|
106
node_modules/flickity-bg-lazyload/bg-lazyload.js
generated
vendored
Normal file
106
node_modules/flickity-bg-lazyload/bg-lazyload.js
generated
vendored
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
/**
|
||||||
|
* Flickity background lazyload v2.0.0
|
||||||
|
* lazyload background cell images
|
||||||
|
*/
|
||||||
|
|
||||||
|
( function( window, factory ) {
|
||||||
|
// universal module definition
|
||||||
|
if ( typeof module == 'object' && module.exports ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = factory(
|
||||||
|
require('flickity'),
|
||||||
|
require('fizzy-ui-utils'),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// browser global
|
||||||
|
factory(
|
||||||
|
window.Flickity,
|
||||||
|
window.fizzyUIUtils,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}( window, function factory( Flickity, utils ) {
|
||||||
|
|
||||||
|
Flickity.create.bgLazyLoad = function() {
|
||||||
|
this.on( 'select', this.bgLazyLoad );
|
||||||
|
};
|
||||||
|
|
||||||
|
let proto = Flickity.prototype;
|
||||||
|
|
||||||
|
const bgLazyloadAttr = 'data-flickity-bg-lazyload';
|
||||||
|
|
||||||
|
proto.bgLazyLoad = function() {
|
||||||
|
let lazyLoad = this.options.bgLazyLoad;
|
||||||
|
if ( !lazyLoad ) return;
|
||||||
|
|
||||||
|
// get adjacent cells, use lazyLoad option for adjacent count
|
||||||
|
let adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;
|
||||||
|
let cellElems = this.getAdjacentCellElements( adjCount );
|
||||||
|
|
||||||
|
cellElems.forEach( ( cellElem ) => {
|
||||||
|
this.bgLazyLoadElem( cellElem );
|
||||||
|
// select lazy elems in cell
|
||||||
|
let children = cellElem.querySelectorAll(`[${bgLazyloadAttr}]`);
|
||||||
|
for ( let child of children ) {
|
||||||
|
this.bgLazyLoadElem( child );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
};
|
||||||
|
|
||||||
|
proto.bgLazyLoadElem = function( elem ) {
|
||||||
|
let attr = elem.getAttribute( bgLazyloadAttr );
|
||||||
|
if ( !attr ) return;
|
||||||
|
|
||||||
|
let onComplete = ( event ) => {
|
||||||
|
this.dispatchEvent( 'bgLazyLoad', event, elem );
|
||||||
|
};
|
||||||
|
new BgLazyLoader( elem, attr, onComplete );
|
||||||
|
};
|
||||||
|
|
||||||
|
// -------------------------- LazyBGLoader -------------------------- //
|
||||||
|
|
||||||
|
// class to handle loading images
|
||||||
|
function BgLazyLoader( elem, url, onComplete ) {
|
||||||
|
this.element = elem;
|
||||||
|
this.url = url;
|
||||||
|
this.img = new Image();
|
||||||
|
this.onComplete = onComplete;
|
||||||
|
this.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
BgLazyLoader.prototype.handleEvent = utils.handleEvent;
|
||||||
|
|
||||||
|
BgLazyLoader.prototype.load = function() {
|
||||||
|
this.img.addEventListener( 'load', this );
|
||||||
|
this.img.addEventListener( 'error', this );
|
||||||
|
// load image
|
||||||
|
this.img.src = this.url;
|
||||||
|
// remove attr
|
||||||
|
this.element.removeAttribute( bgLazyloadAttr );
|
||||||
|
};
|
||||||
|
|
||||||
|
BgLazyLoader.prototype.onload = function( event ) {
|
||||||
|
this.element.style.backgroundImage = `url("${this.url}")`;
|
||||||
|
this.complete( event, 'flickity-bg-lazyloaded' );
|
||||||
|
};
|
||||||
|
|
||||||
|
BgLazyLoader.prototype.onerror = function( event ) {
|
||||||
|
this.complete( event, 'flickity-bg-lazyerror' );
|
||||||
|
};
|
||||||
|
|
||||||
|
BgLazyLoader.prototype.complete = function( event, className ) {
|
||||||
|
// unbind events
|
||||||
|
this.img.removeEventListener( 'load', this );
|
||||||
|
this.img.removeEventListener( 'error', this );
|
||||||
|
|
||||||
|
this.element.classList.add( className );
|
||||||
|
this.onComplete( event );
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----- ----- //
|
||||||
|
|
||||||
|
Flickity.BgLazyLoader = BgLazyLoader;
|
||||||
|
|
||||||
|
return Flickity;
|
||||||
|
|
||||||
|
} ) );
|
31
node_modules/flickity-bg-lazyload/bower.json
generated
vendored
Normal file
31
node_modules/flickity-bg-lazyload/bower.json
generated
vendored
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"name": "flickity-bg-lazyload",
|
||||||
|
"description": "Flickity lazyload background images",
|
||||||
|
"main": "bg-lazyload.js",
|
||||||
|
"dependencies": {
|
||||||
|
"flickity": "^3.0.0",
|
||||||
|
"fizzy-ui-utils": "^3.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"flickity",
|
||||||
|
"background",
|
||||||
|
"lazyload",
|
||||||
|
"image"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"homepage": "https://github.com/metafizzy/flickity-bg-lazyload",
|
||||||
|
"authors": [
|
||||||
|
"David DeSandro"
|
||||||
|
],
|
||||||
|
"ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"test",
|
||||||
|
"tests",
|
||||||
|
"sandbox",
|
||||||
|
"package.json"
|
||||||
|
]
|
||||||
|
}
|
40
node_modules/flickity-bg-lazyload/package.json
generated
vendored
Normal file
40
node_modules/flickity-bg-lazyload/package.json
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
"name": "flickity-bg-lazyload",
|
||||||
|
"version": "2.0.0",
|
||||||
|
"description": "Flickity lazyload background images",
|
||||||
|
"main": "bg-lazyload.js",
|
||||||
|
"peerDependencies": {
|
||||||
|
"flickity": "^3.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"fizzy-ui-utils": "^3.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "^8.10.0",
|
||||||
|
"eslint-plugin-metafizzy": "^2.0.1",
|
||||||
|
"qunit": "^2.18.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "npm run lint",
|
||||||
|
"lint": "npx eslint ."
|
||||||
|
},
|
||||||
|
"directories": {
|
||||||
|
"test": "test"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/metafizzy/flickity-bg-lazyload.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"flickity",
|
||||||
|
"lazyload",
|
||||||
|
"background",
|
||||||
|
"image"
|
||||||
|
],
|
||||||
|
"author": "David DeSandro",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/metafizzy/flickity-bg-lazyload/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/metafizzy/flickity-bg-lazyload#readme"
|
||||||
|
}
|
73
node_modules/flickity-bg-lazyload/sandbox/single.html
generated
vendored
Normal file
73
node_modules/flickity-bg-lazyload/sandbox/single.html
generated
vendored
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width" />
|
||||||
|
|
||||||
|
<title>Flickity bgLazyLoad</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../node_modules/flickity/css/flickity.css" media="screen" />
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.carousel {
|
||||||
|
border: 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell {
|
||||||
|
width: 80%;
|
||||||
|
max-width: 500px;
|
||||||
|
margin-right: 10px;
|
||||||
|
height: 400px;
|
||||||
|
background-color: #DDD;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>Flickity bgLazyLoad</h1>
|
||||||
|
|
||||||
|
<div class="carousel">
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/r8p3Xgq.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/q9zO6tw.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/bwy74ok.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/hODreXI.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/UORFJ3w.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/bAZWoqx.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/PgmEBSB.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/aboaFoB.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/LkmcILl.jpg"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- dependencies -->
|
||||||
|
<script src="../node_modules/get-size/get-size.js"></script>
|
||||||
|
<script src="../node_modules/ev-emitter/ev-emitter.js"></script>
|
||||||
|
<script src="../node_modules/fizzy-ui-utils/utils.js"></script>
|
||||||
|
<script src="../node_modules/unidragger/unidragger.js"></script>
|
||||||
|
<!-- Flickity source -->
|
||||||
|
<script src="../node_modules/flickity/js/cell.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/slide.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/animate.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/core.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/drag.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/prev-next-button.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/page-dots.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/player.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/add-remove-cell.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/lazyload.js"></script>
|
||||||
|
|
||||||
|
<script src="../bg-lazyload.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
let flkty = new Flickity( '.carousel', {
|
||||||
|
bgLazyLoad: true
|
||||||
|
});
|
||||||
|
|
||||||
|
flkty.on( 'bgLazyLoad', function( event, elem ) {
|
||||||
|
console.log( event.type, elem );
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
80
node_modules/flickity-bg-lazyload/test/index.html
generated
vendored
Normal file
80
node_modules/flickity-bg-lazyload/test/index.html
generated
vendored
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width" />
|
||||||
|
|
||||||
|
<title>Flickity bg lazyLoad</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../node_modules/qunit/qunit/qunit.css" media="screen" />
|
||||||
|
<link rel="stylesheet" href="../node_modules/flickity/css/flickity.css" media="screen" />
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carousel {
|
||||||
|
border: 1px solid;
|
||||||
|
width: 400px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carousel .cell {
|
||||||
|
width: 100%;
|
||||||
|
height: 100px;
|
||||||
|
background: #F09;
|
||||||
|
font-size: 40px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- dependencies -->
|
||||||
|
<script src="../node_modules/get-size/get-size.js"></script>
|
||||||
|
<script src="../node_modules/ev-emitter/ev-emitter.js"></script>
|
||||||
|
<script src="../node_modules/fizzy-ui-utils/utils.js"></script>
|
||||||
|
<script src="../node_modules/unidragger/unidragger.js"></script>
|
||||||
|
<!-- Flickity source -->
|
||||||
|
<script src="../node_modules/flickity/js/cell.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/slide.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/animate.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/core.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/drag.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/prev-next-button.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/page-dots.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/player.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/add-remove-cell.js"></script>
|
||||||
|
<script src="../node_modules/flickity/js/lazyload.js"></script>
|
||||||
|
|
||||||
|
<script src="../node_modules/qunit/qunit/qunit.js"></script>
|
||||||
|
|
||||||
|
<script src="../bg-lazyload.js"></script>
|
||||||
|
<!-- turn off accessibility for these tests, causing bugs with dragging tests -->
|
||||||
|
<script>
|
||||||
|
Flickity.defaults.accessibility = false;
|
||||||
|
</script>
|
||||||
|
<!-- unit tests -->
|
||||||
|
<script src="test-bg-lazyload.js"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="qunit"></div>
|
||||||
|
|
||||||
|
<h2>bgLazyLoad</h2>
|
||||||
|
<div class="carousel carousel--bg-lazyload">
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/r8p3Xgq.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/q9zO6tw.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/bwy74ok.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/hODreXI.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/UORFJ3w.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/bAZWoqx.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/PgmEBSB.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/aboaFoB.jpg"></div>
|
||||||
|
<div class="cell" data-flickity-bg-lazyload="https://i.imgur.com/LkmcILl.jpg"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
28
node_modules/flickity-bg-lazyload/test/test-bg-lazyload.js
generated
vendored
Normal file
28
node_modules/flickity-bg-lazyload/test/test-bg-lazyload.js
generated
vendored
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
QUnit.test( 'bgLazyLoad', function( assert ) {
|
||||||
|
|
||||||
|
let done = assert.async();
|
||||||
|
|
||||||
|
let carousel = document.querySelector('.carousel--bg-lazyload');
|
||||||
|
let flkty = new Flickity( carousel, {
|
||||||
|
bgLazyLoad: 1,
|
||||||
|
} );
|
||||||
|
|
||||||
|
let loadCount = 0;
|
||||||
|
flkty.on( 'bgLazyLoad', function( event, elem ) {
|
||||||
|
loadCount++;
|
||||||
|
|
||||||
|
assert.equal( event.type, 'load', 'event.type == load' );
|
||||||
|
assert.ok( elem, 'elem argument there' );
|
||||||
|
|
||||||
|
// after first 2 have loaded, select 7th cell
|
||||||
|
if ( loadCount === 2 ) {
|
||||||
|
flkty.select( 6 );
|
||||||
|
}
|
||||||
|
if ( loadCount === 5 ) {
|
||||||
|
let loadedImgs = carousel.querySelectorAll('.flickity-bg-lazyloaded');
|
||||||
|
assert.equal( loadedImgs.length, '5', 'only 5 images loaded' );
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
100
node_modules/hls.js/dist/hls.js
generated
vendored
100
node_modules/hls.js/dist/hls.js
generated
vendored
|
@ -539,7 +539,7 @@
|
||||||
// Some browsers don't allow to use bind on console object anyway
|
// Some browsers don't allow to use bind on console object anyway
|
||||||
// fallback to default if needed
|
// fallback to default if needed
|
||||||
try {
|
try {
|
||||||
exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.4.5");
|
exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.4.7");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
exportedLogger = fakeLogger;
|
exportedLogger = fakeLogger;
|
||||||
}
|
}
|
||||||
|
@ -5773,14 +5773,17 @@
|
||||||
var _data$frag, _data$context2;
|
var _data$frag, _data$context2;
|
||||||
// Search for next level to retry
|
// Search for next level to retry
|
||||||
var nextLevel = -1;
|
var nextLevel = -1;
|
||||||
var levels = hls.levels;
|
var levels = hls.levels,
|
||||||
|
loadLevel = hls.loadLevel,
|
||||||
|
minAutoLevel = hls.minAutoLevel,
|
||||||
|
maxAutoLevel = hls.maxAutoLevel;
|
||||||
var fragErrorType = (_data$frag = data.frag) == null ? void 0 : _data$frag.type;
|
var fragErrorType = (_data$frag = data.frag) == null ? void 0 : _data$frag.type;
|
||||||
var _ref = (_data$context2 = data.context) != null ? _data$context2 : {},
|
var _ref = (_data$context2 = data.context) != null ? _data$context2 : {},
|
||||||
playlistErrorType = _ref.type,
|
playlistErrorType = _ref.type,
|
||||||
playlistErrorGroupId = _ref.groupId;
|
playlistErrorGroupId = _ref.groupId;
|
||||||
for (var i = levels.length; i--;) {
|
for (var i = levels.length; i--;) {
|
||||||
var candidate = (i + hls.loadLevel) % levels.length;
|
var candidate = (i + loadLevel) % levels.length;
|
||||||
if (candidate !== hls.loadLevel && levels[candidate].loadError === 0) {
|
if (candidate !== loadLevel && candidate >= minAutoLevel && candidate <= maxAutoLevel && levels[candidate].loadError === 0) {
|
||||||
var levelCandidate = levels[candidate];
|
var levelCandidate = levels[candidate];
|
||||||
// Skip level switch if GAP tag is found in next level at same position
|
// Skip level switch if GAP tag is found in next level at same position
|
||||||
if (data.details === ErrorDetails.FRAG_GAP && data.frag) {
|
if (data.details === ErrorDetails.FRAG_GAP && data.frag) {
|
||||||
|
@ -9658,6 +9661,8 @@
|
||||||
} else {
|
} else {
|
||||||
logger.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
|
logger.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
|
||||||
}
|
}
|
||||||
|
} else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
|
||||||
|
this.state = State.WAITING_LEVEL;
|
||||||
} else {
|
} else {
|
||||||
this.state = State.ERROR;
|
this.state = State.ERROR;
|
||||||
}
|
}
|
||||||
|
@ -18027,14 +18032,7 @@
|
||||||
var startOffset = data.startOffset,
|
var startOffset = data.startOffset,
|
||||||
endOffset = data.endOffset;
|
endOffset = data.endOffset;
|
||||||
if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {
|
if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {
|
||||||
var currentTrackId = this.currentTrackId,
|
var endOffsetSubtitles = endOffset - 1;
|
||||||
levels = this.levels;
|
|
||||||
if (!levels.length || !levels[currentTrackId] || !levels[currentTrackId].details) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var trackDetails = levels[currentTrackId].details;
|
|
||||||
var targetDuration = trackDetails.targetduration;
|
|
||||||
var endOffsetSubtitles = endOffset - targetDuration;
|
|
||||||
if (endOffsetSubtitles <= 0) {
|
if (endOffsetSubtitles <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -18228,17 +18226,14 @@
|
||||||
if (!levels.length || !track || !track.details) {
|
if (!levels.length || !track || !track.details) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expand range of subs loaded by one target-duration in either direction to make up for misaligned playlists
|
|
||||||
var trackDetails = track.details;
|
|
||||||
var targetDuration = trackDetails.targetduration;
|
|
||||||
var config = this.config;
|
var config = this.config;
|
||||||
var currentTime = this.getLoadPosition();
|
var currentTime = this.getLoadPosition();
|
||||||
var bufferedInfo = BufferHelper.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], currentTime - targetDuration, config.maxBufferHole);
|
var bufferedInfo = BufferHelper.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], currentTime, config.maxBufferHole);
|
||||||
var targetBufferTime = bufferedInfo.end,
|
var targetBufferTime = bufferedInfo.end,
|
||||||
bufferLen = bufferedInfo.len;
|
bufferLen = bufferedInfo.len;
|
||||||
var mainBufferInfo = this.getFwdBufferInfo(this.media, PlaylistLevelType.MAIN);
|
var mainBufferInfo = this.getFwdBufferInfo(this.media, PlaylistLevelType.MAIN);
|
||||||
var maxBufLen = this.getMaxBufferLength(mainBufferInfo == null ? void 0 : mainBufferInfo.len) + targetDuration;
|
var trackDetails = track.details;
|
||||||
|
var maxBufLen = this.getMaxBufferLength(mainBufferInfo == null ? void 0 : mainBufferInfo.len) + trackDetails.levelTargetDuration;
|
||||||
if (bufferLen > maxBufLen) {
|
if (bufferLen > maxBufLen) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -18248,8 +18243,9 @@
|
||||||
var foundFrag = null;
|
var foundFrag = null;
|
||||||
var fragPrevious = this.fragPrevious;
|
var fragPrevious = this.fragPrevious;
|
||||||
if (targetBufferTime < end) {
|
if (targetBufferTime < end) {
|
||||||
var maxFragLookUpTolerance = config.maxFragLookUpTolerance;
|
var tolerance = config.maxFragLookUpTolerance;
|
||||||
foundFrag = findFragmentByPTS(fragPrevious, fragments, Math.max(fragments[0].start, targetBufferTime), maxFragLookUpTolerance);
|
var lookupTolerance = targetBufferTime > end - tolerance ? 0 : tolerance;
|
||||||
|
foundFrag = findFragmentByPTS(fragPrevious, fragments, Math.max(fragments[0].start, targetBufferTime), lookupTolerance);
|
||||||
if (!foundFrag && fragPrevious && fragPrevious.start < fragments[0].start) {
|
if (!foundFrag && fragPrevious && fragPrevious.start < fragments[0].start) {
|
||||||
foundFrag = fragments[0];
|
foundFrag = fragments[0];
|
||||||
}
|
}
|
||||||
|
@ -18260,6 +18256,14 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
foundFrag = this.mapToInitFragWhenRequired(foundFrag);
|
foundFrag = this.mapToInitFragWhenRequired(foundFrag);
|
||||||
|
if (foundFrag.sn !== 'initSegment') {
|
||||||
|
// Load earlier fragment in same discontinuity to make up for misaligned playlists and cues that extend beyond end of segment
|
||||||
|
var curSNIdx = foundFrag.sn - trackDetails.startSN;
|
||||||
|
var prevFrag = fragments[curSNIdx - 1];
|
||||||
|
if (prevFrag && prevFrag.cc === foundFrag.cc && this.fragmentTracker.getState(prevFrag) === FragmentState.NOT_LOADED) {
|
||||||
|
foundFrag = prevFrag;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED) {
|
if (this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED) {
|
||||||
// only load if fragment is not loaded
|
// only load if fragment is not loaded
|
||||||
this.loadFragment(foundFrag, track, targetBufferTime);
|
this.loadFragment(foundFrag, track, targetBufferTime);
|
||||||
|
@ -21639,7 +21643,7 @@
|
||||||
// Uint8Array.prototype.reduce is not implemented in IE11
|
// Uint8Array.prototype.reduce is not implemented in IE11
|
||||||
var vttLines = utf8ArrayToStr(new Uint8Array(vttByteArray)).trim().replace(LINEBREAKS, '\n').split('\n');
|
var vttLines = utf8ArrayToStr(new Uint8Array(vttByteArray)).trim().replace(LINEBREAKS, '\n').split('\n');
|
||||||
var cues = [];
|
var cues = [];
|
||||||
var init90kHz = toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale);
|
var init90kHz = initPTS ? toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale) : 0;
|
||||||
var cueTime = '00:00.000';
|
var cueTime = '00:00.000';
|
||||||
var timestampMapMPEGTS = 0;
|
var timestampMapMPEGTS = 0;
|
||||||
var timestampMapLOCAL = 0;
|
var timestampMapLOCAL = 0;
|
||||||
|
@ -21663,6 +21667,10 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (webVttMpegTsMapOffset) {
|
if (webVttMpegTsMapOffset) {
|
||||||
|
if (!initPTS) {
|
||||||
|
parsingError = new Error('Missing initPTS for VTT MPEGTS');
|
||||||
|
return;
|
||||||
|
}
|
||||||
// If we have MPEGTS, offset = presentation time + discontinuity offset
|
// If we have MPEGTS, offset = presentation time + discontinuity offset
|
||||||
cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;
|
cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;
|
||||||
}
|
}
|
||||||
|
@ -22153,7 +22161,7 @@
|
||||||
this.captionsTracks = {};
|
this.captionsTracks = {};
|
||||||
this.nonNativeCaptionsTracks = {};
|
this.nonNativeCaptionsTracks = {};
|
||||||
this.textTracks = [];
|
this.textTracks = [];
|
||||||
this.unparsedVttFrags = this.unparsedVttFrags || [];
|
this.unparsedVttFrags = [];
|
||||||
this.initPTS = [];
|
this.initPTS = [];
|
||||||
if (this.cea608Parser1 && this.cea608Parser2) {
|
if (this.cea608Parser1 && this.cea608Parser2) {
|
||||||
this.cea608Parser1.reset();
|
this.cea608Parser1.reset();
|
||||||
|
@ -22295,24 +22303,9 @@
|
||||||
_proto.onFragLoaded = function onFragLoaded(event, data) {
|
_proto.onFragLoaded = function onFragLoaded(event, data) {
|
||||||
var frag = data.frag,
|
var frag = data.frag,
|
||||||
payload = data.payload;
|
payload = data.payload;
|
||||||
var initPTS = this.initPTS,
|
|
||||||
unparsedVttFrags = this.unparsedVttFrags;
|
|
||||||
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
||||||
// If fragment is subtitle type, parse as WebVTT.
|
// If fragment is subtitle type, parse as WebVTT.
|
||||||
if (payload.byteLength) {
|
if (payload.byteLength) {
|
||||||
// We need an initial synchronisation PTS. Store fragments as long as none has arrived.
|
|
||||||
if (!initPTS[frag.cc]) {
|
|
||||||
unparsedVttFrags.push(data);
|
|
||||||
if (initPTS.length) {
|
|
||||||
// finish unsuccessfully, otherwise the subtitle-stream-controller could be blocked from loading new frags.
|
|
||||||
this.hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
|
||||||
success: false,
|
|
||||||
frag: frag,
|
|
||||||
error: new Error('Missing initial subtitle PTS')
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var decryptData = frag.decryptdata;
|
var decryptData = frag.decryptdata;
|
||||||
// fragment after decryption has a stats object
|
// fragment after decryption has a stats object
|
||||||
var decrypted = ('stats' in data);
|
var decrypted = ('stats' in data);
|
||||||
|
@ -22331,7 +22324,7 @@
|
||||||
if (trackPlaylistMedia && trackPlaylistMedia.textCodec === IMSC1_CODEC) {
|
if (trackPlaylistMedia && trackPlaylistMedia.textCodec === IMSC1_CODEC) {
|
||||||
this._parseIMSC1(frag, payload);
|
this._parseIMSC1(frag, payload);
|
||||||
} else {
|
} else {
|
||||||
this._parseVTTs(frag, payload, vttCCs);
|
this._parseVTTs(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -22362,22 +22355,40 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
_proto._parseVTTs = function _parseVTTs(frag, payload, vttCCs) {
|
_proto._parseVTTs = function _parseVTTs(data) {
|
||||||
var _frag$initSegment,
|
var _frag$initSegment,
|
||||||
_this5 = this;
|
_this5 = this;
|
||||||
|
var frag = data.frag,
|
||||||
|
payload = data.payload;
|
||||||
|
// We need an initial synchronisation PTS. Store fragments as long as none has arrived
|
||||||
|
var initPTS = this.initPTS,
|
||||||
|
unparsedVttFrags = this.unparsedVttFrags;
|
||||||
|
var maxAvCC = initPTS.length - 1;
|
||||||
|
if (!initPTS[frag.cc] && maxAvCC === -1) {
|
||||||
|
unparsedVttFrags.push(data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
var hls = this.hls;
|
var hls = this.hls;
|
||||||
// Parse the WebVTT file contents.
|
// Parse the WebVTT file contents.
|
||||||
var payloadWebVTT = (_frag$initSegment = frag.initSegment) != null && _frag$initSegment.data ? appendUint8Array(frag.initSegment.data, new Uint8Array(payload)) : payload;
|
var payloadWebVTT = (_frag$initSegment = frag.initSegment) != null && _frag$initSegment.data ? appendUint8Array(frag.initSegment.data, new Uint8Array(payload)) : payload;
|
||||||
parseWebVTT(payloadWebVTT, this.initPTS[frag.cc], vttCCs, frag.cc, frag.start, function (cues) {
|
parseWebVTT(payloadWebVTT, this.initPTS[frag.cc], this.vttCCs, frag.cc, frag.start, function (cues) {
|
||||||
_this5._appendCues(cues, frag.level);
|
_this5._appendCues(cues, frag.level);
|
||||||
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
||||||
success: true,
|
success: true,
|
||||||
frag: frag
|
frag: frag
|
||||||
});
|
});
|
||||||
}, function (error) {
|
}, function (error) {
|
||||||
_this5._fallbackToIMSC1(frag, payload);
|
var missingInitPTS = error.message === 'Missing initPTS for VTT MPEGTS';
|
||||||
|
if (missingInitPTS) {
|
||||||
|
unparsedVttFrags.push(data);
|
||||||
|
} else {
|
||||||
|
_this5._fallbackToIMSC1(frag, payload);
|
||||||
|
}
|
||||||
// Something went wrong while parsing. Trigger event with success false.
|
// Something went wrong while parsing. Trigger event with success false.
|
||||||
logger.log("Failed to parse VTT cue: " + error);
|
logger.log("Failed to parse VTT cue: " + error);
|
||||||
|
if (missingInitPTS && maxAvCC > frag.cc) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
||||||
success: false,
|
success: false,
|
||||||
frag: frag,
|
frag: frag,
|
||||||
|
@ -22428,10 +22439,6 @@
|
||||||
_proto.onFragDecrypted = function onFragDecrypted(event, data) {
|
_proto.onFragDecrypted = function onFragDecrypted(event, data) {
|
||||||
var frag = data.frag;
|
var frag = data.frag;
|
||||||
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
||||||
if (!this.initPTS[frag.cc]) {
|
|
||||||
this.unparsedVttFrags.push(data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.onFragLoaded(Events.FRAG_LOADED, data);
|
this.onFragLoaded(Events.FRAG_LOADED, data);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -24622,6 +24629,7 @@
|
||||||
var stats = this.stats;
|
var stats = this.stats;
|
||||||
stats.loading.first = 0;
|
stats.loading.first = 0;
|
||||||
stats.loaded = 0;
|
stats.loaded = 0;
|
||||||
|
stats.aborted = false;
|
||||||
var xhrSetup = this.xhrSetup;
|
var xhrSetup = this.xhrSetup;
|
||||||
if (xhrSetup) {
|
if (xhrSetup) {
|
||||||
Promise.resolve().then(function () {
|
Promise.resolve().then(function () {
|
||||||
|
@ -26252,7 +26260,7 @@
|
||||||
* Get the video-dev/hls.js package version.
|
* Get the video-dev/hls.js package version.
|
||||||
*/
|
*/
|
||||||
function get() {
|
function get() {
|
||||||
return "1.4.5";
|
return "1.4.7";
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
key: "Events",
|
key: "Events",
|
||||||
|
|
2
node_modules/hls.js/dist/hls.js.map
generated
vendored
2
node_modules/hls.js/dist/hls.js.map
generated
vendored
File diff suppressed because one or more lines are too long
16
node_modules/hls.js/dist/hls.light.js
generated
vendored
16
node_modules/hls.js/dist/hls.light.js
generated
vendored
|
@ -508,7 +508,7 @@
|
||||||
// Some browsers don't allow to use bind on console object anyway
|
// Some browsers don't allow to use bind on console object anyway
|
||||||
// fallback to default if needed
|
// fallback to default if needed
|
||||||
try {
|
try {
|
||||||
exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.4.5");
|
exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.4.7");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
exportedLogger = fakeLogger;
|
exportedLogger = fakeLogger;
|
||||||
}
|
}
|
||||||
|
@ -5264,14 +5264,17 @@
|
||||||
var _data$frag, _data$context2;
|
var _data$frag, _data$context2;
|
||||||
// Search for next level to retry
|
// Search for next level to retry
|
||||||
var nextLevel = -1;
|
var nextLevel = -1;
|
||||||
var levels = hls.levels;
|
var levels = hls.levels,
|
||||||
|
loadLevel = hls.loadLevel,
|
||||||
|
minAutoLevel = hls.minAutoLevel,
|
||||||
|
maxAutoLevel = hls.maxAutoLevel;
|
||||||
var fragErrorType = (_data$frag = data.frag) == null ? void 0 : _data$frag.type;
|
var fragErrorType = (_data$frag = data.frag) == null ? void 0 : _data$frag.type;
|
||||||
var _ref = (_data$context2 = data.context) != null ? _data$context2 : {},
|
var _ref = (_data$context2 = data.context) != null ? _data$context2 : {},
|
||||||
playlistErrorType = _ref.type,
|
playlistErrorType = _ref.type,
|
||||||
playlistErrorGroupId = _ref.groupId;
|
playlistErrorGroupId = _ref.groupId;
|
||||||
for (var i = levels.length; i--;) {
|
for (var i = levels.length; i--;) {
|
||||||
var candidate = (i + hls.loadLevel) % levels.length;
|
var candidate = (i + loadLevel) % levels.length;
|
||||||
if (candidate !== hls.loadLevel && levels[candidate].loadError === 0) {
|
if (candidate !== loadLevel && candidate >= minAutoLevel && candidate <= maxAutoLevel && levels[candidate].loadError === 0) {
|
||||||
var levelCandidate = levels[candidate];
|
var levelCandidate = levels[candidate];
|
||||||
// Skip level switch if GAP tag is found in next level at same position
|
// Skip level switch if GAP tag is found in next level at same position
|
||||||
if (data.details === ErrorDetails.FRAG_GAP && data.frag) {
|
if (data.details === ErrorDetails.FRAG_GAP && data.frag) {
|
||||||
|
@ -9111,6 +9114,8 @@
|
||||||
} else {
|
} else {
|
||||||
logger.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
|
logger.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
|
||||||
}
|
}
|
||||||
|
} else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
|
||||||
|
this.state = State.WAITING_LEVEL;
|
||||||
} else {
|
} else {
|
||||||
this.state = State.ERROR;
|
this.state = State.ERROR;
|
||||||
}
|
}
|
||||||
|
@ -17641,6 +17646,7 @@
|
||||||
var stats = this.stats;
|
var stats = this.stats;
|
||||||
stats.loading.first = 0;
|
stats.loading.first = 0;
|
||||||
stats.loaded = 0;
|
stats.loaded = 0;
|
||||||
|
stats.aborted = false;
|
||||||
var xhrSetup = this.xhrSetup;
|
var xhrSetup = this.xhrSetup;
|
||||||
if (xhrSetup) {
|
if (xhrSetup) {
|
||||||
Promise.resolve().then(function () {
|
Promise.resolve().then(function () {
|
||||||
|
@ -19225,7 +19231,7 @@
|
||||||
* Get the video-dev/hls.js package version.
|
* Get the video-dev/hls.js package version.
|
||||||
*/
|
*/
|
||||||
function get() {
|
function get() {
|
||||||
return "1.4.5";
|
return "1.4.7";
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
key: "Events",
|
key: "Events",
|
||||||
|
|
2
node_modules/hls.js/dist/hls.light.js.map
generated
vendored
2
node_modules/hls.js/dist/hls.light.js.map
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/hls.js/dist/hls.light.min.js
generated
vendored
2
node_modules/hls.js/dist/hls.light.min.js
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/hls.js/dist/hls.light.min.js.map
generated
vendored
2
node_modules/hls.js/dist/hls.light.min.js.map
generated
vendored
File diff suppressed because one or more lines are too long
18
node_modules/hls.js/dist/hls.light.mjs
generated
vendored
18
node_modules/hls.js/dist/hls.light.mjs
generated
vendored
|
@ -402,7 +402,7 @@ function enableLogs(debugConfig, id) {
|
||||||
// Some browsers don't allow to use bind on console object anyway
|
// Some browsers don't allow to use bind on console object anyway
|
||||||
// fallback to default if needed
|
// fallback to default if needed
|
||||||
try {
|
try {
|
||||||
exportedLogger.log(`Debug logs enabled for "${id}" in hls.js version ${"1.4.5"}`);
|
exportedLogger.log(`Debug logs enabled for "${id}" in hls.js version ${"1.4.7"}`);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
exportedLogger = fakeLogger;
|
exportedLogger = fakeLogger;
|
||||||
}
|
}
|
||||||
|
@ -5019,15 +5019,20 @@ class ErrorController {
|
||||||
var _data$frag, _data$context2;
|
var _data$frag, _data$context2;
|
||||||
// Search for next level to retry
|
// Search for next level to retry
|
||||||
let nextLevel = -1;
|
let nextLevel = -1;
|
||||||
const levels = hls.levels;
|
const {
|
||||||
|
levels,
|
||||||
|
loadLevel,
|
||||||
|
minAutoLevel,
|
||||||
|
maxAutoLevel
|
||||||
|
} = hls;
|
||||||
const fragErrorType = (_data$frag = data.frag) == null ? void 0 : _data$frag.type;
|
const fragErrorType = (_data$frag = data.frag) == null ? void 0 : _data$frag.type;
|
||||||
const {
|
const {
|
||||||
type: playlistErrorType,
|
type: playlistErrorType,
|
||||||
groupId: playlistErrorGroupId
|
groupId: playlistErrorGroupId
|
||||||
} = (_data$context2 = data.context) != null ? _data$context2 : {};
|
} = (_data$context2 = data.context) != null ? _data$context2 : {};
|
||||||
for (let i = levels.length; i--;) {
|
for (let i = levels.length; i--;) {
|
||||||
const candidate = (i + hls.loadLevel) % levels.length;
|
const candidate = (i + loadLevel) % levels.length;
|
||||||
if (candidate !== hls.loadLevel && levels[candidate].loadError === 0) {
|
if (candidate !== loadLevel && candidate >= minAutoLevel && candidate <= maxAutoLevel && levels[candidate].loadError === 0) {
|
||||||
const levelCandidate = levels[candidate];
|
const levelCandidate = levels[candidate];
|
||||||
// Skip level switch if GAP tag is found in next level at same position
|
// Skip level switch if GAP tag is found in next level at same position
|
||||||
if (data.details === ErrorDetails.FRAG_GAP && data.frag) {
|
if (data.details === ErrorDetails.FRAG_GAP && data.frag) {
|
||||||
|
@ -8829,6 +8834,8 @@ class BaseStreamController extends TaskLoop {
|
||||||
} else {
|
} else {
|
||||||
logger.warn(`${data.details} reached or exceeded max retry (${retryCount})`);
|
logger.warn(`${data.details} reached or exceeded max retry (${retryCount})`);
|
||||||
}
|
}
|
||||||
|
} else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
|
||||||
|
this.state = State.WAITING_LEVEL;
|
||||||
} else {
|
} else {
|
||||||
this.state = State.ERROR;
|
this.state = State.ERROR;
|
||||||
}
|
}
|
||||||
|
@ -17247,6 +17254,7 @@ class XhrLoader {
|
||||||
const stats = this.stats;
|
const stats = this.stats;
|
||||||
stats.loading.first = 0;
|
stats.loading.first = 0;
|
||||||
stats.loaded = 0;
|
stats.loaded = 0;
|
||||||
|
stats.aborted = false;
|
||||||
const xhrSetup = this.xhrSetup;
|
const xhrSetup = this.xhrSetup;
|
||||||
if (xhrSetup) {
|
if (xhrSetup) {
|
||||||
Promise.resolve().then(() => {
|
Promise.resolve().then(() => {
|
||||||
|
@ -18074,7 +18082,7 @@ class Hls {
|
||||||
* Get the video-dev/hls.js package version.
|
* Get the video-dev/hls.js package version.
|
||||||
*/
|
*/
|
||||||
static get version() {
|
static get version() {
|
||||||
return "1.4.5";
|
return "1.4.7";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
2
node_modules/hls.js/dist/hls.light.mjs.map
generated
vendored
2
node_modules/hls.js/dist/hls.light.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/hls.js/dist/hls.min.js
generated
vendored
2
node_modules/hls.js/dist/hls.min.js
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/hls.js/dist/hls.min.js.map
generated
vendored
2
node_modules/hls.js/dist/hls.min.js.map
generated
vendored
File diff suppressed because one or more lines are too long
112
node_modules/hls.js/dist/hls.mjs
generated
vendored
112
node_modules/hls.js/dist/hls.mjs
generated
vendored
|
@ -402,7 +402,7 @@ function enableLogs(debugConfig, id) {
|
||||||
// Some browsers don't allow to use bind on console object anyway
|
// Some browsers don't allow to use bind on console object anyway
|
||||||
// fallback to default if needed
|
// fallback to default if needed
|
||||||
try {
|
try {
|
||||||
exportedLogger.log(`Debug logs enabled for "${id}" in hls.js version ${"1.4.5"}`);
|
exportedLogger.log(`Debug logs enabled for "${id}" in hls.js version ${"1.4.7"}`);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
exportedLogger = fakeLogger;
|
exportedLogger = fakeLogger;
|
||||||
}
|
}
|
||||||
|
@ -5486,15 +5486,20 @@ class ErrorController {
|
||||||
var _data$frag, _data$context2;
|
var _data$frag, _data$context2;
|
||||||
// Search for next level to retry
|
// Search for next level to retry
|
||||||
let nextLevel = -1;
|
let nextLevel = -1;
|
||||||
const levels = hls.levels;
|
const {
|
||||||
|
levels,
|
||||||
|
loadLevel,
|
||||||
|
minAutoLevel,
|
||||||
|
maxAutoLevel
|
||||||
|
} = hls;
|
||||||
const fragErrorType = (_data$frag = data.frag) == null ? void 0 : _data$frag.type;
|
const fragErrorType = (_data$frag = data.frag) == null ? void 0 : _data$frag.type;
|
||||||
const {
|
const {
|
||||||
type: playlistErrorType,
|
type: playlistErrorType,
|
||||||
groupId: playlistErrorGroupId
|
groupId: playlistErrorGroupId
|
||||||
} = (_data$context2 = data.context) != null ? _data$context2 : {};
|
} = (_data$context2 = data.context) != null ? _data$context2 : {};
|
||||||
for (let i = levels.length; i--;) {
|
for (let i = levels.length; i--;) {
|
||||||
const candidate = (i + hls.loadLevel) % levels.length;
|
const candidate = (i + loadLevel) % levels.length;
|
||||||
if (candidate !== hls.loadLevel && levels[candidate].loadError === 0) {
|
if (candidate !== loadLevel && candidate >= minAutoLevel && candidate <= maxAutoLevel && levels[candidate].loadError === 0) {
|
||||||
const levelCandidate = levels[candidate];
|
const levelCandidate = levels[candidate];
|
||||||
// Skip level switch if GAP tag is found in next level at same position
|
// Skip level switch if GAP tag is found in next level at same position
|
||||||
if (data.details === ErrorDetails.FRAG_GAP && data.frag) {
|
if (data.details === ErrorDetails.FRAG_GAP && data.frag) {
|
||||||
|
@ -9334,6 +9339,8 @@ class BaseStreamController extends TaskLoop {
|
||||||
} else {
|
} else {
|
||||||
logger.warn(`${data.details} reached or exceeded max retry (${retryCount})`);
|
logger.warn(`${data.details} reached or exceeded max retry (${retryCount})`);
|
||||||
}
|
}
|
||||||
|
} else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
|
||||||
|
this.state = State.WAITING_LEVEL;
|
||||||
} else {
|
} else {
|
||||||
this.state = State.ERROR;
|
this.state = State.ERROR;
|
||||||
}
|
}
|
||||||
|
@ -17600,16 +17607,7 @@ class SubtitleStreamController extends BaseStreamController {
|
||||||
endOffset
|
endOffset
|
||||||
} = data;
|
} = data;
|
||||||
if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {
|
if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {
|
||||||
const {
|
const endOffsetSubtitles = endOffset - 1;
|
||||||
currentTrackId,
|
|
||||||
levels
|
|
||||||
} = this;
|
|
||||||
if (!levels.length || !levels[currentTrackId] || !levels[currentTrackId].details) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const trackDetails = levels[currentTrackId].details;
|
|
||||||
const targetDuration = trackDetails.targetduration;
|
|
||||||
const endOffsetSubtitles = endOffset - targetDuration;
|
|
||||||
if (endOffsetSubtitles <= 0) {
|
if (endOffsetSubtitles <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -17805,21 +17803,18 @@ class SubtitleStreamController extends BaseStreamController {
|
||||||
if (!levels.length || !track || !track.details) {
|
if (!levels.length || !track || !track.details) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expand range of subs loaded by one target-duration in either direction to make up for misaligned playlists
|
|
||||||
const trackDetails = track.details;
|
|
||||||
const targetDuration = trackDetails.targetduration;
|
|
||||||
const {
|
const {
|
||||||
config
|
config
|
||||||
} = this;
|
} = this;
|
||||||
const currentTime = this.getLoadPosition();
|
const currentTime = this.getLoadPosition();
|
||||||
const bufferedInfo = BufferHelper.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], currentTime - targetDuration, config.maxBufferHole);
|
const bufferedInfo = BufferHelper.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], currentTime, config.maxBufferHole);
|
||||||
const {
|
const {
|
||||||
end: targetBufferTime,
|
end: targetBufferTime,
|
||||||
len: bufferLen
|
len: bufferLen
|
||||||
} = bufferedInfo;
|
} = bufferedInfo;
|
||||||
const mainBufferInfo = this.getFwdBufferInfo(this.media, PlaylistLevelType.MAIN);
|
const mainBufferInfo = this.getFwdBufferInfo(this.media, PlaylistLevelType.MAIN);
|
||||||
const maxBufLen = this.getMaxBufferLength(mainBufferInfo == null ? void 0 : mainBufferInfo.len) + targetDuration;
|
const trackDetails = track.details;
|
||||||
|
const maxBufLen = this.getMaxBufferLength(mainBufferInfo == null ? void 0 : mainBufferInfo.len) + trackDetails.levelTargetDuration;
|
||||||
if (bufferLen > maxBufLen) {
|
if (bufferLen > maxBufLen) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -17829,10 +17824,9 @@ class SubtitleStreamController extends BaseStreamController {
|
||||||
let foundFrag = null;
|
let foundFrag = null;
|
||||||
const fragPrevious = this.fragPrevious;
|
const fragPrevious = this.fragPrevious;
|
||||||
if (targetBufferTime < end) {
|
if (targetBufferTime < end) {
|
||||||
const {
|
const tolerance = config.maxFragLookUpTolerance;
|
||||||
maxFragLookUpTolerance
|
const lookupTolerance = targetBufferTime > end - tolerance ? 0 : tolerance;
|
||||||
} = config;
|
foundFrag = findFragmentByPTS(fragPrevious, fragments, Math.max(fragments[0].start, targetBufferTime), lookupTolerance);
|
||||||
foundFrag = findFragmentByPTS(fragPrevious, fragments, Math.max(fragments[0].start, targetBufferTime), maxFragLookUpTolerance);
|
|
||||||
if (!foundFrag && fragPrevious && fragPrevious.start < fragments[0].start) {
|
if (!foundFrag && fragPrevious && fragPrevious.start < fragments[0].start) {
|
||||||
foundFrag = fragments[0];
|
foundFrag = fragments[0];
|
||||||
}
|
}
|
||||||
|
@ -17843,6 +17837,14 @@ class SubtitleStreamController extends BaseStreamController {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
foundFrag = this.mapToInitFragWhenRequired(foundFrag);
|
foundFrag = this.mapToInitFragWhenRequired(foundFrag);
|
||||||
|
if (foundFrag.sn !== 'initSegment') {
|
||||||
|
// Load earlier fragment in same discontinuity to make up for misaligned playlists and cues that extend beyond end of segment
|
||||||
|
const curSNIdx = foundFrag.sn - trackDetails.startSN;
|
||||||
|
const prevFrag = fragments[curSNIdx - 1];
|
||||||
|
if (prevFrag && prevFrag.cc === foundFrag.cc && this.fragmentTracker.getState(prevFrag) === FragmentState.NOT_LOADED) {
|
||||||
|
foundFrag = prevFrag;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED) {
|
if (this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED) {
|
||||||
// only load if fragment is not loaded
|
// only load if fragment is not loaded
|
||||||
this.loadFragment(foundFrag, track, targetBufferTime);
|
this.loadFragment(foundFrag, track, targetBufferTime);
|
||||||
|
@ -21186,7 +21188,7 @@ function parseWebVTT(vttByteArray, initPTS, vttCCs, cc, timeOffset, callBack, er
|
||||||
// Uint8Array.prototype.reduce is not implemented in IE11
|
// Uint8Array.prototype.reduce is not implemented in IE11
|
||||||
const vttLines = utf8ArrayToStr(new Uint8Array(vttByteArray)).trim().replace(LINEBREAKS, '\n').split('\n');
|
const vttLines = utf8ArrayToStr(new Uint8Array(vttByteArray)).trim().replace(LINEBREAKS, '\n').split('\n');
|
||||||
const cues = [];
|
const cues = [];
|
||||||
const init90kHz = toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale);
|
const init90kHz = initPTS ? toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale) : 0;
|
||||||
let cueTime = '00:00.000';
|
let cueTime = '00:00.000';
|
||||||
let timestampMapMPEGTS = 0;
|
let timestampMapMPEGTS = 0;
|
||||||
let timestampMapLOCAL = 0;
|
let timestampMapLOCAL = 0;
|
||||||
|
@ -21210,6 +21212,10 @@ function parseWebVTT(vttByteArray, initPTS, vttCCs, cc, timeOffset, callBack, er
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (webVttMpegTsMapOffset) {
|
if (webVttMpegTsMapOffset) {
|
||||||
|
if (!initPTS) {
|
||||||
|
parsingError = new Error('Missing initPTS for VTT MPEGTS');
|
||||||
|
return;
|
||||||
|
}
|
||||||
// If we have MPEGTS, offset = presentation time + discontinuity offset
|
// If we have MPEGTS, offset = presentation time + discontinuity offset
|
||||||
cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;
|
cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;
|
||||||
}
|
}
|
||||||
|
@ -21705,7 +21711,7 @@ class TimelineController {
|
||||||
this.captionsTracks = {};
|
this.captionsTracks = {};
|
||||||
this.nonNativeCaptionsTracks = {};
|
this.nonNativeCaptionsTracks = {};
|
||||||
this.textTracks = [];
|
this.textTracks = [];
|
||||||
this.unparsedVttFrags = this.unparsedVttFrags || [];
|
this.unparsedVttFrags = [];
|
||||||
this.initPTS = [];
|
this.initPTS = [];
|
||||||
if (this.cea608Parser1 && this.cea608Parser2) {
|
if (this.cea608Parser1 && this.cea608Parser2) {
|
||||||
this.cea608Parser1.reset();
|
this.cea608Parser1.reset();
|
||||||
|
@ -21849,26 +21855,9 @@ class TimelineController {
|
||||||
frag,
|
frag,
|
||||||
payload
|
payload
|
||||||
} = data;
|
} = data;
|
||||||
const {
|
|
||||||
initPTS,
|
|
||||||
unparsedVttFrags
|
|
||||||
} = this;
|
|
||||||
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
||||||
// If fragment is subtitle type, parse as WebVTT.
|
// If fragment is subtitle type, parse as WebVTT.
|
||||||
if (payload.byteLength) {
|
if (payload.byteLength) {
|
||||||
// We need an initial synchronisation PTS. Store fragments as long as none has arrived.
|
|
||||||
if (!initPTS[frag.cc]) {
|
|
||||||
unparsedVttFrags.push(data);
|
|
||||||
if (initPTS.length) {
|
|
||||||
// finish unsuccessfully, otherwise the subtitle-stream-controller could be blocked from loading new frags.
|
|
||||||
this.hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
|
||||||
success: false,
|
|
||||||
frag,
|
|
||||||
error: new Error('Missing initial subtitle PTS')
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const decryptData = frag.decryptdata;
|
const decryptData = frag.decryptdata;
|
||||||
// fragment after decryption has a stats object
|
// fragment after decryption has a stats object
|
||||||
const decrypted = ('stats' in data);
|
const decrypted = ('stats' in data);
|
||||||
|
@ -21887,7 +21876,7 @@ class TimelineController {
|
||||||
if (trackPlaylistMedia && trackPlaylistMedia.textCodec === IMSC1_CODEC) {
|
if (trackPlaylistMedia && trackPlaylistMedia.textCodec === IMSC1_CODEC) {
|
||||||
this._parseIMSC1(frag, payload);
|
this._parseIMSC1(frag, payload);
|
||||||
} else {
|
} else {
|
||||||
this._parseVTTs(frag, payload, vttCCs);
|
this._parseVTTs(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -21917,21 +21906,43 @@ class TimelineController {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
_parseVTTs(frag, payload, vttCCs) {
|
_parseVTTs(data) {
|
||||||
var _frag$initSegment;
|
var _frag$initSegment;
|
||||||
|
const {
|
||||||
|
frag,
|
||||||
|
payload
|
||||||
|
} = data;
|
||||||
|
// We need an initial synchronisation PTS. Store fragments as long as none has arrived
|
||||||
|
const {
|
||||||
|
initPTS,
|
||||||
|
unparsedVttFrags
|
||||||
|
} = this;
|
||||||
|
const maxAvCC = initPTS.length - 1;
|
||||||
|
if (!initPTS[frag.cc] && maxAvCC === -1) {
|
||||||
|
unparsedVttFrags.push(data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
const hls = this.hls;
|
const hls = this.hls;
|
||||||
// Parse the WebVTT file contents.
|
// Parse the WebVTT file contents.
|
||||||
const payloadWebVTT = (_frag$initSegment = frag.initSegment) != null && _frag$initSegment.data ? appendUint8Array(frag.initSegment.data, new Uint8Array(payload)) : payload;
|
const payloadWebVTT = (_frag$initSegment = frag.initSegment) != null && _frag$initSegment.data ? appendUint8Array(frag.initSegment.data, new Uint8Array(payload)) : payload;
|
||||||
parseWebVTT(payloadWebVTT, this.initPTS[frag.cc], vttCCs, frag.cc, frag.start, cues => {
|
parseWebVTT(payloadWebVTT, this.initPTS[frag.cc], this.vttCCs, frag.cc, frag.start, cues => {
|
||||||
this._appendCues(cues, frag.level);
|
this._appendCues(cues, frag.level);
|
||||||
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
||||||
success: true,
|
success: true,
|
||||||
frag: frag
|
frag: frag
|
||||||
});
|
});
|
||||||
}, error => {
|
}, error => {
|
||||||
this._fallbackToIMSC1(frag, payload);
|
const missingInitPTS = error.message === 'Missing initPTS for VTT MPEGTS';
|
||||||
|
if (missingInitPTS) {
|
||||||
|
unparsedVttFrags.push(data);
|
||||||
|
} else {
|
||||||
|
this._fallbackToIMSC1(frag, payload);
|
||||||
|
}
|
||||||
// Something went wrong while parsing. Trigger event with success false.
|
// Something went wrong while parsing. Trigger event with success false.
|
||||||
logger.log(`Failed to parse VTT cue: ${error}`);
|
logger.log(`Failed to parse VTT cue: ${error}`);
|
||||||
|
if (missingInitPTS && maxAvCC > frag.cc) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
||||||
success: false,
|
success: false,
|
||||||
frag: frag,
|
frag: frag,
|
||||||
|
@ -21981,10 +21992,6 @@ class TimelineController {
|
||||||
frag
|
frag
|
||||||
} = data;
|
} = data;
|
||||||
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
||||||
if (!this.initPTS[frag.cc]) {
|
|
||||||
this.unparsedVttFrags.push(data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.onFragLoaded(Events.FRAG_LOADED, data);
|
this.onFragLoaded(Events.FRAG_LOADED, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24117,6 +24124,7 @@ class XhrLoader {
|
||||||
const stats = this.stats;
|
const stats = this.stats;
|
||||||
stats.loading.first = 0;
|
stats.loading.first = 0;
|
||||||
stats.loaded = 0;
|
stats.loaded = 0;
|
||||||
|
stats.aborted = false;
|
||||||
const xhrSetup = this.xhrSetup;
|
const xhrSetup = this.xhrSetup;
|
||||||
if (xhrSetup) {
|
if (xhrSetup) {
|
||||||
Promise.resolve().then(() => {
|
Promise.resolve().then(() => {
|
||||||
|
@ -24988,7 +24996,7 @@ class Hls {
|
||||||
* Get the video-dev/hls.js package version.
|
* Get the video-dev/hls.js package version.
|
||||||
*/
|
*/
|
||||||
static get version() {
|
static get version() {
|
||||||
return "1.4.5";
|
return "1.4.7";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
2
node_modules/hls.js/dist/hls.mjs.map
generated
vendored
2
node_modules/hls.js/dist/hls.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/hls.js/dist/hls.worker.js
generated
vendored
2
node_modules/hls.js/dist/hls.worker.js
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/hls.js/package.json
generated
vendored
2
node_modules/hls.js/package.json
generated
vendored
|
@ -129,5 +129,5 @@
|
||||||
"url-toolkit": "2.2.5",
|
"url-toolkit": "2.2.5",
|
||||||
"wrangler": "2.20.0"
|
"wrangler": "2.20.0"
|
||||||
},
|
},
|
||||||
"version": "1.4.5"
|
"version": "1.4.7"
|
||||||
}
|
}
|
||||||
|
|
4
node_modules/hls.js/src/controller/base-stream-controller.ts
generated
vendored
4
node_modules/hls.js/src/controller/base-stream-controller.ts
generated
vendored
|
@ -1530,6 +1530,10 @@ export default class BaseStreamController
|
||||||
`${data.details} reached or exceeded max retry (${retryCount})`
|
`${data.details} reached or exceeded max retry (${retryCount})`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} else if (
|
||||||
|
errorAction?.action === NetworkErrorAction.SendAlternateToPenaltyBox
|
||||||
|
) {
|
||||||
|
this.state = State.WAITING_LEVEL;
|
||||||
} else {
|
} else {
|
||||||
this.state = State.ERROR;
|
this.state = State.ERROR;
|
||||||
}
|
}
|
||||||
|
|
8
node_modules/hls.js/src/controller/error-controller.ts
generated
vendored
8
node_modules/hls.js/src/controller/error-controller.ts
generated
vendored
|
@ -330,14 +330,16 @@ export default class ErrorController implements NetworkComponentAPI {
|
||||||
if (hls.autoLevelEnabled) {
|
if (hls.autoLevelEnabled) {
|
||||||
// Search for next level to retry
|
// Search for next level to retry
|
||||||
let nextLevel = -1;
|
let nextLevel = -1;
|
||||||
const levels = hls.levels;
|
const { levels, loadLevel, minAutoLevel, maxAutoLevel } = hls;
|
||||||
const fragErrorType = data.frag?.type;
|
const fragErrorType = data.frag?.type;
|
||||||
const { type: playlistErrorType, groupId: playlistErrorGroupId } =
|
const { type: playlistErrorType, groupId: playlistErrorGroupId } =
|
||||||
data.context ?? {};
|
data.context ?? {};
|
||||||
for (let i = levels.length; i--; ) {
|
for (let i = levels.length; i--; ) {
|
||||||
const candidate = (i + hls.loadLevel) % levels.length;
|
const candidate = (i + loadLevel) % levels.length;
|
||||||
if (
|
if (
|
||||||
candidate !== hls.loadLevel &&
|
candidate !== loadLevel &&
|
||||||
|
candidate >= minAutoLevel &&
|
||||||
|
candidate <= maxAutoLevel &&
|
||||||
levels[candidate].loadError === 0
|
levels[candidate].loadError === 0
|
||||||
) {
|
) {
|
||||||
const levelCandidate = levels[candidate];
|
const levelCandidate = levels[candidate];
|
||||||
|
|
41
node_modules/hls.js/src/controller/subtitle-stream-controller.ts
generated
vendored
41
node_modules/hls.js/src/controller/subtitle-stream-controller.ts
generated
vendored
|
@ -165,17 +165,7 @@ export class SubtitleStreamController
|
||||||
onBufferFlushing(event: Events.BUFFER_FLUSHING, data: BufferFlushingData) {
|
onBufferFlushing(event: Events.BUFFER_FLUSHING, data: BufferFlushingData) {
|
||||||
const { startOffset, endOffset } = data;
|
const { startOffset, endOffset } = data;
|
||||||
if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {
|
if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {
|
||||||
const { currentTrackId, levels } = this;
|
const endOffsetSubtitles = endOffset - 1;
|
||||||
if (
|
|
||||||
!levels.length ||
|
|
||||||
!levels[currentTrackId] ||
|
|
||||||
!levels[currentTrackId].details
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const trackDetails = levels[currentTrackId].details as LevelDetails;
|
|
||||||
const targetDuration = trackDetails.targetduration;
|
|
||||||
const endOffsetSubtitles = endOffset - targetDuration;
|
|
||||||
if (endOffsetSubtitles <= 0) {
|
if (endOffsetSubtitles <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -408,15 +398,11 @@ export class SubtitleStreamController
|
||||||
if (!levels.length || !track || !track.details) {
|
if (!levels.length || !track || !track.details) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expand range of subs loaded by one target-duration in either direction to make up for misaligned playlists
|
|
||||||
const trackDetails = track.details as LevelDetails;
|
|
||||||
const targetDuration = trackDetails.targetduration;
|
|
||||||
const { config } = this;
|
const { config } = this;
|
||||||
const currentTime = this.getLoadPosition();
|
const currentTime = this.getLoadPosition();
|
||||||
const bufferedInfo = BufferHelper.bufferedInfo(
|
const bufferedInfo = BufferHelper.bufferedInfo(
|
||||||
this.tracksBuffered[this.currentTrackId] || [],
|
this.tracksBuffered[this.currentTrackId] || [],
|
||||||
currentTime - targetDuration,
|
currentTime,
|
||||||
config.maxBufferHole
|
config.maxBufferHole
|
||||||
);
|
);
|
||||||
const { end: targetBufferTime, len: bufferLen } = bufferedInfo;
|
const { end: targetBufferTime, len: bufferLen } = bufferedInfo;
|
||||||
|
@ -425,8 +411,10 @@ export class SubtitleStreamController
|
||||||
this.media,
|
this.media,
|
||||||
PlaylistLevelType.MAIN
|
PlaylistLevelType.MAIN
|
||||||
);
|
);
|
||||||
|
const trackDetails = track.details as LevelDetails;
|
||||||
const maxBufLen =
|
const maxBufLen =
|
||||||
this.getMaxBufferLength(mainBufferInfo?.len) + targetDuration;
|
this.getMaxBufferLength(mainBufferInfo?.len) +
|
||||||
|
trackDetails.levelTargetDuration;
|
||||||
|
|
||||||
if (bufferLen > maxBufLen) {
|
if (bufferLen > maxBufLen) {
|
||||||
return;
|
return;
|
||||||
|
@ -438,12 +426,14 @@ export class SubtitleStreamController
|
||||||
let foundFrag: Fragment | null = null;
|
let foundFrag: Fragment | null = null;
|
||||||
const fragPrevious = this.fragPrevious;
|
const fragPrevious = this.fragPrevious;
|
||||||
if (targetBufferTime < end) {
|
if (targetBufferTime < end) {
|
||||||
const { maxFragLookUpTolerance } = config;
|
const tolerance = config.maxFragLookUpTolerance;
|
||||||
|
const lookupTolerance =
|
||||||
|
targetBufferTime > end - tolerance ? 0 : tolerance;
|
||||||
foundFrag = findFragmentByPTS(
|
foundFrag = findFragmentByPTS(
|
||||||
fragPrevious,
|
fragPrevious,
|
||||||
fragments,
|
fragments,
|
||||||
Math.max(fragments[0].start, targetBufferTime),
|
Math.max(fragments[0].start, targetBufferTime),
|
||||||
maxFragLookUpTolerance
|
lookupTolerance
|
||||||
);
|
);
|
||||||
if (
|
if (
|
||||||
!foundFrag &&
|
!foundFrag &&
|
||||||
|
@ -458,8 +448,19 @@ export class SubtitleStreamController
|
||||||
if (!foundFrag) {
|
if (!foundFrag) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foundFrag = this.mapToInitFragWhenRequired(foundFrag) as Fragment;
|
foundFrag = this.mapToInitFragWhenRequired(foundFrag) as Fragment;
|
||||||
|
if (foundFrag.sn !== 'initSegment') {
|
||||||
|
// Load earlier fragment in same discontinuity to make up for misaligned playlists and cues that extend beyond end of segment
|
||||||
|
const curSNIdx = foundFrag.sn - trackDetails.startSN;
|
||||||
|
const prevFrag = fragments[curSNIdx - 1];
|
||||||
|
if (
|
||||||
|
prevFrag &&
|
||||||
|
prevFrag.cc === foundFrag.cc &&
|
||||||
|
this.fragmentTracker.getState(prevFrag) === FragmentState.NOT_LOADED
|
||||||
|
) {
|
||||||
|
foundFrag = prevFrag;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED
|
this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED
|
||||||
) {
|
) {
|
||||||
|
|
47
node_modules/hls.js/src/controller/timeline-controller.ts
generated
vendored
47
node_modules/hls.js/src/controller/timeline-controller.ts
generated
vendored
|
@ -304,7 +304,7 @@ export class TimelineController implements ComponentAPI {
|
||||||
this.captionsTracks = {};
|
this.captionsTracks = {};
|
||||||
this.nonNativeCaptionsTracks = {};
|
this.nonNativeCaptionsTracks = {};
|
||||||
this.textTracks = [];
|
this.textTracks = [];
|
||||||
this.unparsedVttFrags = this.unparsedVttFrags || [];
|
this.unparsedVttFrags = [];
|
||||||
this.initPTS = [];
|
this.initPTS = [];
|
||||||
if (this.cea608Parser1 && this.cea608Parser2) {
|
if (this.cea608Parser1 && this.cea608Parser2) {
|
||||||
this.cea608Parser1.reset();
|
this.cea608Parser1.reset();
|
||||||
|
@ -477,24 +477,9 @@ export class TimelineController implements ComponentAPI {
|
||||||
data: FragDecryptedData | FragLoadedData
|
data: FragDecryptedData | FragLoadedData
|
||||||
) {
|
) {
|
||||||
const { frag, payload } = data;
|
const { frag, payload } = data;
|
||||||
const { initPTS, unparsedVttFrags } = this;
|
|
||||||
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
||||||
// If fragment is subtitle type, parse as WebVTT.
|
// If fragment is subtitle type, parse as WebVTT.
|
||||||
if (payload.byteLength) {
|
if (payload.byteLength) {
|
||||||
// We need an initial synchronisation PTS. Store fragments as long as none has arrived.
|
|
||||||
if (!initPTS[frag.cc]) {
|
|
||||||
unparsedVttFrags.push(data);
|
|
||||||
if (initPTS.length) {
|
|
||||||
// finish unsuccessfully, otherwise the subtitle-stream-controller could be blocked from loading new frags.
|
|
||||||
this.hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
|
||||||
success: false,
|
|
||||||
frag,
|
|
||||||
error: new Error('Missing initial subtitle PTS'),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const decryptData = frag.decryptdata;
|
const decryptData = frag.decryptdata;
|
||||||
// fragment after decryption has a stats object
|
// fragment after decryption has a stats object
|
||||||
const decrypted = 'stats' in data;
|
const decrypted = 'stats' in data;
|
||||||
|
@ -516,7 +501,7 @@ export class TimelineController implements ComponentAPI {
|
||||||
) {
|
) {
|
||||||
this._parseIMSC1(frag, payload);
|
this._parseIMSC1(frag, payload);
|
||||||
} else {
|
} else {
|
||||||
this._parseVTTs(frag, payload, vttCCs);
|
this._parseVTTs(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -553,7 +538,16 @@ export class TimelineController implements ComponentAPI {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _parseVTTs(frag: Fragment, payload: ArrayBuffer, vttCCs: any) {
|
private _parseVTTs(data: FragDecryptedData | FragLoadedData) {
|
||||||
|
const { frag, payload } = data;
|
||||||
|
// We need an initial synchronisation PTS. Store fragments as long as none has arrived
|
||||||
|
const { initPTS, unparsedVttFrags } = this;
|
||||||
|
const maxAvCC = initPTS.length - 1;
|
||||||
|
if (!initPTS[frag.cc] && maxAvCC === -1) {
|
||||||
|
unparsedVttFrags.push(data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const hls = this.hls;
|
const hls = this.hls;
|
||||||
// Parse the WebVTT file contents.
|
// Parse the WebVTT file contents.
|
||||||
const payloadWebVTT = frag.initSegment?.data
|
const payloadWebVTT = frag.initSegment?.data
|
||||||
|
@ -562,7 +556,7 @@ export class TimelineController implements ComponentAPI {
|
||||||
parseWebVTT(
|
parseWebVTT(
|
||||||
payloadWebVTT,
|
payloadWebVTT,
|
||||||
this.initPTS[frag.cc],
|
this.initPTS[frag.cc],
|
||||||
vttCCs,
|
this.vttCCs,
|
||||||
frag.cc,
|
frag.cc,
|
||||||
frag.start,
|
frag.start,
|
||||||
(cues) => {
|
(cues) => {
|
||||||
|
@ -573,9 +567,18 @@ export class TimelineController implements ComponentAPI {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
(error) => {
|
(error) => {
|
||||||
this._fallbackToIMSC1(frag, payload);
|
const missingInitPTS =
|
||||||
|
error.message === 'Missing initPTS for VTT MPEGTS';
|
||||||
|
if (missingInitPTS) {
|
||||||
|
unparsedVttFrags.push(data);
|
||||||
|
} else {
|
||||||
|
this._fallbackToIMSC1(frag, payload);
|
||||||
|
}
|
||||||
// Something went wrong while parsing. Trigger event with success false.
|
// Something went wrong while parsing. Trigger event with success false.
|
||||||
logger.log(`Failed to parse VTT cue: ${error}`);
|
logger.log(`Failed to parse VTT cue: ${error}`);
|
||||||
|
if (missingInitPTS && maxAvCC > frag.cc) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
|
||||||
success: false,
|
success: false,
|
||||||
frag: frag,
|
frag: frag,
|
||||||
|
@ -631,10 +634,6 @@ export class TimelineController implements ComponentAPI {
|
||||||
) {
|
) {
|
||||||
const { frag } = data;
|
const { frag } = data;
|
||||||
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
if (frag.type === PlaylistLevelType.SUBTITLE) {
|
||||||
if (!this.initPTS[frag.cc]) {
|
|
||||||
this.unparsedVttFrags.push(data as unknown as FragLoadedData);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.onFragLoaded(Events.FRAG_LOADED, data as unknown as FragLoadedData);
|
this.onFragLoaded(Events.FRAG_LOADED, data as unknown as FragLoadedData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
14
node_modules/hls.js/src/utils/webvtt-parser.ts
generated
vendored
14
node_modules/hls.js/src/utils/webvtt-parser.ts
generated
vendored
|
@ -92,7 +92,7 @@ const calculateOffset = function (vttCCs: VTTCCs, cc, presentationTime) {
|
||||||
|
|
||||||
export function parseWebVTT(
|
export function parseWebVTT(
|
||||||
vttByteArray: ArrayBuffer,
|
vttByteArray: ArrayBuffer,
|
||||||
initPTS: RationalTimestamp,
|
initPTS: RationalTimestamp | undefined,
|
||||||
vttCCs: VTTCCs,
|
vttCCs: VTTCCs,
|
||||||
cc: number,
|
cc: number,
|
||||||
timeOffset: number,
|
timeOffset: number,
|
||||||
|
@ -107,10 +107,9 @@ export function parseWebVTT(
|
||||||
.replace(LINEBREAKS, '\n')
|
.replace(LINEBREAKS, '\n')
|
||||||
.split('\n');
|
.split('\n');
|
||||||
const cues: VTTCue[] = [];
|
const cues: VTTCue[] = [];
|
||||||
const init90kHz = toMpegTsClockFromTimescale(
|
const init90kHz = initPTS
|
||||||
initPTS.baseTime,
|
? toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale)
|
||||||
initPTS.timescale
|
: 0;
|
||||||
);
|
|
||||||
let cueTime = '00:00.000';
|
let cueTime = '00:00.000';
|
||||||
let timestampMapMPEGTS = 0;
|
let timestampMapMPEGTS = 0;
|
||||||
let timestampMapLOCAL = 0;
|
let timestampMapLOCAL = 0;
|
||||||
|
@ -134,8 +133,11 @@ export function parseWebVTT(
|
||||||
calculateOffset(vttCCs, cc, webVttMpegTsMapOffset);
|
calculateOffset(vttCCs, cc, webVttMpegTsMapOffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (webVttMpegTsMapOffset) {
|
if (webVttMpegTsMapOffset) {
|
||||||
|
if (!initPTS) {
|
||||||
|
parsingError = new Error('Missing initPTS for VTT MPEGTS');
|
||||||
|
return;
|
||||||
|
}
|
||||||
// If we have MPEGTS, offset = presentation time + discontinuity offset
|
// If we have MPEGTS, offset = presentation time + discontinuity offset
|
||||||
cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;
|
cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;
|
||||||
}
|
}
|
||||||
|
|
1
node_modules/hls.js/src/utils/xhr-loader.ts
generated
vendored
1
node_modules/hls.js/src/utils/xhr-loader.ts
generated
vendored
|
@ -86,6 +86,7 @@ class XhrLoader implements Loader<LoaderContext> {
|
||||||
const stats = this.stats;
|
const stats = this.stats;
|
||||||
stats.loading.first = 0;
|
stats.loading.first = 0;
|
||||||
stats.loaded = 0;
|
stats.loaded = 0;
|
||||||
|
stats.aborted = false;
|
||||||
const xhrSetup = this.xhrSetup;
|
const xhrSetup = this.xhrSetup;
|
||||||
|
|
||||||
if (xhrSetup) {
|
if (xhrSetup) {
|
||||||
|
|
|
@ -1531,7 +1531,7 @@ if (!class_exists('Video')) {
|
||||||
|
|
||||||
if(!empty($max_duration_in_seconds)){
|
if(!empty($max_duration_in_seconds)){
|
||||||
$max_duration_in_seconds = intval($max_duration_in_seconds);
|
$max_duration_in_seconds = intval($max_duration_in_seconds);
|
||||||
$sql .= " AND duration_in_seconds <= {$max_duration_in_seconds} ";
|
$sql .= " AND duration_in_seconds IS NOT NULL AND duration_in_seconds <= {$max_duration_in_seconds} AND duration_in_seconds > 0 ";
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql .= AVideoPlugin::getVideoWhereClause();
|
$sql .= AVideoPlugin::getVideoWhereClause();
|
||||||
|
@ -2014,7 +2014,7 @@ if (!class_exists('Video')) {
|
||||||
|
|
||||||
if(!empty($max_duration_in_seconds)){
|
if(!empty($max_duration_in_seconds)){
|
||||||
$max_duration_in_seconds = intval($max_duration_in_seconds);
|
$max_duration_in_seconds = intval($max_duration_in_seconds);
|
||||||
$sql .= " AND duration_in_seconds <= {$max_duration_in_seconds} ";
|
$sql .= " AND duration_in_seconds IS NOT NULL AND duration_in_seconds <= {$max_duration_in_seconds} AND duration_in_seconds > 0 ";
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql .= AVideoPlugin::getVideoWhereClause();
|
$sql .= AVideoPlugin::getVideoWhereClause();
|
||||||
|
@ -2213,7 +2213,7 @@ if (!class_exists('Video')) {
|
||||||
|
|
||||||
if(!empty($max_duration_in_seconds)){
|
if(!empty($max_duration_in_seconds)){
|
||||||
$max_duration_in_seconds = intval($max_duration_in_seconds);
|
$max_duration_in_seconds = intval($max_duration_in_seconds);
|
||||||
$sql .= " AND duration_in_seconds <= {$max_duration_in_seconds} ";
|
$sql .= " AND duration_in_seconds IS NOT NULL AND duration_in_seconds <= {$max_duration_in_seconds} AND duration_in_seconds > 0 ";
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql .= AVideoPlugin::getVideoWhereClause();
|
$sql .= AVideoPlugin::getVideoWhereClause();
|
||||||
|
|
20
package-lock.json
generated
20
package-lock.json
generated
|
@ -14,6 +14,7 @@
|
||||||
"dexie": "^3.2.4",
|
"dexie": "^3.2.4",
|
||||||
"dom-walk": "^0.1.2",
|
"dom-walk": "^0.1.2",
|
||||||
"flickity": "^3.0.0",
|
"flickity": "^3.0.0",
|
||||||
|
"flickity-bg-lazyload": "^2.0.0",
|
||||||
"fontawesome-free": "^1.0.4",
|
"fontawesome-free": "^1.0.4",
|
||||||
"hls.js": "^1.4.7",
|
"hls.js": "^1.4.7",
|
||||||
"infinite-scroll": "^4.0.1",
|
"infinite-scroll": "^4.0.1",
|
||||||
|
@ -761,6 +762,17 @@
|
||||||
"unidragger": "^3.0.0"
|
"unidragger": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/flickity-bg-lazyload": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/flickity-bg-lazyload/-/flickity-bg-lazyload-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-il5f8gi0GHNGv0mU+rpEfEAnv1VBpYYRKMVsgmFR5hblBlhT6VaQltKTjc8irTgU8lNOdEuaGavW/AE0QzjSMg==",
|
||||||
|
"dependencies": {
|
||||||
|
"fizzy-ui-utils": "^3.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"flickity": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/fontawesome-free": {
|
"node_modules/fontawesome-free": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/fontawesome-free/-/fontawesome-free-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/fontawesome-free/-/fontawesome-free-1.0.4.tgz",
|
||||||
|
@ -2722,6 +2734,14 @@
|
||||||
"unidragger": "^3.0.0"
|
"unidragger": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"flickity-bg-lazyload": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/flickity-bg-lazyload/-/flickity-bg-lazyload-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-il5f8gi0GHNGv0mU+rpEfEAnv1VBpYYRKMVsgmFR5hblBlhT6VaQltKTjc8irTgU8lNOdEuaGavW/AE0QzjSMg==",
|
||||||
|
"requires": {
|
||||||
|
"fizzy-ui-utils": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"fontawesome-free": {
|
"fontawesome-free": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/fontawesome-free/-/fontawesome-free-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/fontawesome-free/-/fontawesome-free-1.0.4.tgz",
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
"dexie": "^3.2.4",
|
"dexie": "^3.2.4",
|
||||||
"dom-walk": "^0.1.2",
|
"dom-walk": "^0.1.2",
|
||||||
"flickity": "^3.0.0",
|
"flickity": "^3.0.0",
|
||||||
|
"flickity-bg-lazyload": "^2.0.0",
|
||||||
"fontawesome-free": "^1.0.4",
|
"fontawesome-free": "^1.0.4",
|
||||||
"hls.js": "^1.4.7",
|
"hls.js": "^1.4.7",
|
||||||
"infinite-scroll": "^4.0.1",
|
"infinite-scroll": "^4.0.1",
|
||||||
|
|
|
@ -156,11 +156,14 @@ if ($removeAnimation) {
|
||||||
function populateCarouselPlayer(video) {
|
function populateCarouselPlayer(video) {
|
||||||
var $carouselPlayer = $('#ShortsPlayer');
|
var $carouselPlayer = $('#ShortsPlayer');
|
||||||
var newCarouselCell = $('<div>').addClass('carousel-cell');
|
var newCarouselCell = $('<div>').addClass('carousel-cell');
|
||||||
var newCarouselCellContent = $('<div>').addClass('carousel-cell-content').attr('data-video-url', video.videoLink).css('background-image', 'url(' + video.images.posterLandscapeThumbs + ')');
|
var newCarouselCellContent = $('<div>')
|
||||||
|
.addClass('carousel-cell-content')
|
||||||
|
.attr('data-flickity-bg-lazyload', video.images.poster);
|
||||||
newCarouselCellContent.append($('<strong>').text(video.title));
|
newCarouselCellContent.append($('<strong>').text(video.title));
|
||||||
newCarouselCell.append(newCarouselCellContent);
|
newCarouselCell.append(newCarouselCellContent);
|
||||||
$carouselPlayer.flickity('append', newCarouselCell);
|
$carouselPlayer.flickity('append', newCarouselCell);
|
||||||
}
|
}
|
||||||
|
|
||||||
var isSettling = false;
|
var isSettling = false;
|
||||||
var timeoutId = null;
|
var timeoutId = null;
|
||||||
|
|
||||||
|
@ -172,6 +175,7 @@ if ($removeAnimation) {
|
||||||
contain: true,
|
contain: true,
|
||||||
pageDots: false,
|
pageDots: false,
|
||||||
initialIndex: initialIndex,
|
initialIndex: initialIndex,
|
||||||
|
bgLazyLoad: true
|
||||||
});
|
});
|
||||||
|
|
||||||
$carouselPlayer.on('settle.flickity', function(event, index) {
|
$carouselPlayer.on('settle.flickity', function(event, index) {
|
||||||
|
|
|
@ -64,6 +64,7 @@
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script src="<?php echo getURL('node_modules/flickity/dist/flickity.pkgd.min.js'); ?>" type="text/javascript"></script>
|
<script src="<?php echo getURL('node_modules/flickity/dist/flickity.pkgd.min.js'); ?>" type="text/javascript"></script>
|
||||||
|
<script src="<?php echo getURL('node_modules/flickity-bg-lazyload/bg-lazyload.js'); ?>" type="text/javascript"></script>
|
||||||
<h3 class="galleryTitle"><i class="fas fa-layer-group"></i> <?php echo __('Shorts'); ?></h3>
|
<h3 class="galleryTitle"><i class="fas fa-layer-group"></i> <?php echo __('Shorts'); ?></h3>
|
||||||
|
|
||||||
<!-- Flickity HTML init -->
|
<!-- Flickity HTML init -->
|
||||||
|
@ -97,13 +98,16 @@
|
||||||
}
|
}
|
||||||
shortVideos.push(video);
|
shortVideos.push(video);
|
||||||
populateCarouselPlayer(video);
|
populateCarouselPlayer(video);
|
||||||
imageUrl = video.images.posterLandscapeThumbs;
|
imageUrl = video.images.poster;
|
||||||
var newCarouselCell = $('<div>').addClass('carousel-cell');
|
var newCarouselCell = $('<div>').addClass('carousel-cell');
|
||||||
var newCarouselCellContent = $('<div>').addClass('carousel-cell-content').css('background-image', 'url(' + imageUrl + ')');
|
var newCarouselCellContent = $('<div>')
|
||||||
|
.addClass('carousel-cell-content')
|
||||||
|
.attr('data-flickity-bg-lazyload', imageUrl);
|
||||||
newCarouselCellContent.append($('<strong>').text(video.title));
|
newCarouselCellContent.append($('<strong>').text(video.title));
|
||||||
newCarouselCell.append(newCarouselCellContent);
|
newCarouselCell.append(newCarouselCellContent);
|
||||||
// append the new cell to the carousel
|
// append the new cell to the carousel
|
||||||
$carousel.flickity('append', newCarouselCell);
|
$carousel.flickity('append', newCarouselCell);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
isLoadingShorts = false;
|
isLoadingShorts = false;
|
||||||
|
@ -115,7 +119,8 @@
|
||||||
var $carousel = $('#Shorts');
|
var $carousel = $('#Shorts');
|
||||||
|
|
||||||
$carousel.flickity({
|
$carousel.flickity({
|
||||||
groupCells: true
|
groupCells: true,
|
||||||
|
bgLazyLoad: true
|
||||||
});
|
});
|
||||||
|
|
||||||
$carousel.on('scroll.flickity', function(event, progress) {
|
$carousel.on('scroll.flickity', function(event, progress) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue