framo
Advanced tools
Comparing version 0.0.10 to 0.0.11
@@ -1,1600 +0,5 @@ | ||
var __create = Object.create; | ||
var __defProp = Object.defineProperty; | ||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
var __getOwnPropNames = Object.getOwnPropertyNames; | ||
var __getProtoOf = Object.getPrototypeOf; | ||
var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true}); | ||
var __commonJS = (cb, mod) => function __require() { | ||
return mod || (0, cb[Object.keys(cb)[0]])((mod = {exports: {}}).exports, mod), mod.exports; | ||
}; | ||
var __export = (target, all) => { | ||
for (var name in all) | ||
__defProp(target, name, {get: all[name], enumerable: true}); | ||
}; | ||
var __reExport = (target, module2, desc) => { | ||
if (module2 && typeof module2 === "object" || typeof module2 === "function") { | ||
for (let key of __getOwnPropNames(module2)) | ||
if (!__hasOwnProp.call(target, key) && key !== "default") | ||
__defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable}); | ||
} | ||
return target; | ||
}; | ||
var __toModule = (module2) => { | ||
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2); | ||
}; | ||
var __async = (__this, __arguments, generator) => { | ||
return new Promise((resolve, reject) => { | ||
var fulfilled = (value) => { | ||
try { | ||
step(generator.next(value)); | ||
} catch (e) { | ||
reject(e); | ||
} | ||
}; | ||
var rejected = (value) => { | ||
try { | ||
step(generator.throw(value)); | ||
} catch (e) { | ||
reject(e); | ||
} | ||
}; | ||
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); | ||
step((generator = generator.apply(__this, __arguments)).next()); | ||
}); | ||
}; | ||
// node_modules/rxjs/node_modules/tslib/tslib.js | ||
var require_tslib = __commonJS({ | ||
"node_modules/rxjs/node_modules/tslib/tslib.js"(exports, module2) { | ||
var __extends2; | ||
var __assign2; | ||
var __rest2; | ||
var __decorate2; | ||
var __param2; | ||
var __metadata2; | ||
var __awaiter2; | ||
var __generator2; | ||
var __exportStar2; | ||
var __values2; | ||
var __read2; | ||
var __spread2; | ||
var __spreadArrays2; | ||
var __spreadArray2; | ||
var __await2; | ||
var __asyncGenerator2; | ||
var __asyncDelegator2; | ||
var __asyncValues2; | ||
var __makeTemplateObject2; | ||
var __importStar2; | ||
var __importDefault2; | ||
var __classPrivateFieldGet2; | ||
var __classPrivateFieldSet2; | ||
var __createBinding2; | ||
(function(factory) { | ||
var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; | ||
if (typeof define === "function" && define.amd) { | ||
define("tslib", ["exports"], function(exports2) { | ||
factory(createExporter(root, createExporter(exports2))); | ||
}); | ||
} else if (typeof module2 === "object" && typeof module2.exports === "object") { | ||
factory(createExporter(root, createExporter(module2.exports))); | ||
} else { | ||
factory(createExporter(root)); | ||
} | ||
function createExporter(exports2, previous) { | ||
if (exports2 !== root) { | ||
if (typeof Object.create === "function") { | ||
Object.defineProperty(exports2, "__esModule", {value: true}); | ||
} else { | ||
exports2.__esModule = true; | ||
} | ||
} | ||
return function(id, v) { | ||
return exports2[id] = previous ? previous(id, v) : v; | ||
}; | ||
} | ||
})(function(exporter) { | ||
var extendStatics = Object.setPrototypeOf || {__proto__: []} instanceof Array && function(d, b) { | ||
d.__proto__ = b; | ||
} || function(d, b) { | ||
for (var p in b) | ||
if (Object.prototype.hasOwnProperty.call(b, p)) | ||
d[p] = b[p]; | ||
}; | ||
__extends2 = function(d, b) { | ||
if (typeof b !== "function" && b !== null) | ||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); | ||
extendStatics(d, b); | ||
function __() { | ||
this.constructor = d; | ||
} | ||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | ||
}; | ||
__assign2 = Object.assign || function(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) | ||
if (Object.prototype.hasOwnProperty.call(s, p)) | ||
t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
__rest2 = function(s, e) { | ||
var t = {}; | ||
for (var p in s) | ||
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
}; | ||
__decorate2 = function(decorators, target, key, desc) { | ||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; | ||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") | ||
r = Reflect.decorate(decorators, target, key, desc); | ||
else | ||
for (var i = decorators.length - 1; i >= 0; i--) | ||
if (d = decorators[i]) | ||
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; | ||
return c > 3 && r && Object.defineProperty(target, key, r), r; | ||
}; | ||
__param2 = function(paramIndex, decorator) { | ||
return function(target, key) { | ||
decorator(target, key, paramIndex); | ||
}; | ||
}; | ||
__metadata2 = function(metadataKey, metadataValue) { | ||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") | ||
return Reflect.metadata(metadataKey, metadataValue); | ||
}; | ||
__awaiter2 = function(thisArg, _arguments, P, generator) { | ||
function adopt(value) { | ||
return value instanceof P ? value : new P(function(resolve) { | ||
resolve(value); | ||
}); | ||
} | ||
return new (P || (P = Promise))(function(resolve, reject) { | ||
function fulfilled(value) { | ||
try { | ||
step(generator.next(value)); | ||
} catch (e) { | ||
reject(e); | ||
} | ||
} | ||
function rejected(value) { | ||
try { | ||
step(generator["throw"](value)); | ||
} catch (e) { | ||
reject(e); | ||
} | ||
} | ||
function step(result) { | ||
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); | ||
} | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
__generator2 = function(thisArg, body) { | ||
var _ = {label: 0, sent: function() { | ||
if (t[0] & 1) | ||
throw t[1]; | ||
return t[1]; | ||
}, trys: [], ops: []}, f, y, t, g; | ||
return g = {next: verb(0), "throw": verb(1), "return": verb(2)}, typeof Symbol === "function" && (g[Symbol.iterator] = function() { | ||
return this; | ||
}), g; | ||
function verb(n) { | ||
return function(v) { | ||
return step([n, v]); | ||
}; | ||
} | ||
function step(op) { | ||
if (f) | ||
throw new TypeError("Generator is already executing."); | ||
while (_) | ||
try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) | ||
return t; | ||
if (y = 0, t) | ||
op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: | ||
case 1: | ||
t = op; | ||
break; | ||
case 4: | ||
_.label++; | ||
return {value: op[1], done: false}; | ||
case 5: | ||
_.label++; | ||
y = op[1]; | ||
op = [0]; | ||
continue; | ||
case 7: | ||
op = _.ops.pop(); | ||
_.trys.pop(); | ||
continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { | ||
_ = 0; | ||
continue; | ||
} | ||
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { | ||
_.label = op[1]; | ||
break; | ||
} | ||
if (op[0] === 6 && _.label < t[1]) { | ||
_.label = t[1]; | ||
t = op; | ||
break; | ||
} | ||
if (t && _.label < t[2]) { | ||
_.label = t[2]; | ||
_.ops.push(op); | ||
break; | ||
} | ||
if (t[2]) | ||
_.ops.pop(); | ||
_.trys.pop(); | ||
continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { | ||
op = [6, e]; | ||
y = 0; | ||
} finally { | ||
f = t = 0; | ||
} | ||
if (op[0] & 5) | ||
throw op[1]; | ||
return {value: op[0] ? op[1] : void 0, done: true}; | ||
} | ||
}; | ||
__exportStar2 = function(m, o) { | ||
for (var p in m) | ||
if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) | ||
__createBinding2(o, m, p); | ||
}; | ||
__createBinding2 = Object.create ? function(o, m, k, k2) { | ||
if (k2 === void 0) | ||
k2 = k; | ||
Object.defineProperty(o, k2, {enumerable: true, get: function() { | ||
return m[k]; | ||
}}); | ||
} : function(o, m, k, k2) { | ||
if (k2 === void 0) | ||
k2 = k; | ||
o[k2] = m[k]; | ||
}; | ||
__values2 = function(o) { | ||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; | ||
if (m) | ||
return m.call(o); | ||
if (o && typeof o.length === "number") | ||
return { | ||
next: function() { | ||
if (o && i >= o.length) | ||
o = void 0; | ||
return {value: o && o[i++], done: !o}; | ||
} | ||
}; | ||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); | ||
}; | ||
__read2 = function(o, n) { | ||
var m = typeof Symbol === "function" && o[Symbol.iterator]; | ||
if (!m) | ||
return o; | ||
var i = m.call(o), r, ar = [], e; | ||
try { | ||
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) | ||
ar.push(r.value); | ||
} catch (error) { | ||
e = {error}; | ||
} finally { | ||
try { | ||
if (r && !r.done && (m = i["return"])) | ||
m.call(i); | ||
} finally { | ||
if (e) | ||
throw e.error; | ||
} | ||
} | ||
return ar; | ||
}; | ||
__spread2 = function() { | ||
for (var ar = [], i = 0; i < arguments.length; i++) | ||
ar = ar.concat(__read2(arguments[i])); | ||
return ar; | ||
}; | ||
__spreadArrays2 = function() { | ||
for (var s = 0, i = 0, il = arguments.length; i < il; i++) | ||
s += arguments[i].length; | ||
for (var r = Array(s), k = 0, i = 0; i < il; i++) | ||
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) | ||
r[k] = a[j]; | ||
return r; | ||
}; | ||
__spreadArray2 = function(to, from) { | ||
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) | ||
to[j] = from[i]; | ||
return to; | ||
}; | ||
__await2 = function(v) { | ||
return this instanceof __await2 ? (this.v = v, this) : new __await2(v); | ||
}; | ||
__asyncGenerator2 = function(thisArg, _arguments, generator) { | ||
if (!Symbol.asyncIterator) | ||
throw new TypeError("Symbol.asyncIterator is not defined."); | ||
var g = generator.apply(thisArg, _arguments || []), i, q = []; | ||
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { | ||
return this; | ||
}, i; | ||
function verb(n) { | ||
if (g[n]) | ||
i[n] = function(v) { | ||
return new Promise(function(a, b) { | ||
q.push([n, v, a, b]) > 1 || resume(n, v); | ||
}); | ||
}; | ||
} | ||
function resume(n, v) { | ||
try { | ||
step(g[n](v)); | ||
} catch (e) { | ||
settle(q[0][3], e); | ||
} | ||
} | ||
function step(r) { | ||
r.value instanceof __await2 ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); | ||
} | ||
function fulfill(value) { | ||
resume("next", value); | ||
} | ||
function reject(value) { | ||
resume("throw", value); | ||
} | ||
function settle(f, v) { | ||
if (f(v), q.shift(), q.length) | ||
resume(q[0][0], q[0][1]); | ||
} | ||
}; | ||
__asyncDelegator2 = function(o) { | ||
var i, p; | ||
return i = {}, verb("next"), verb("throw", function(e) { | ||
throw e; | ||
}), verb("return"), i[Symbol.iterator] = function() { | ||
return this; | ||
}, i; | ||
function verb(n, f) { | ||
i[n] = o[n] ? function(v) { | ||
return (p = !p) ? {value: __await2(o[n](v)), done: n === "return"} : f ? f(v) : v; | ||
} : f; | ||
} | ||
}; | ||
__asyncValues2 = function(o) { | ||
if (!Symbol.asyncIterator) | ||
throw new TypeError("Symbol.asyncIterator is not defined."); | ||
var m = o[Symbol.asyncIterator], i; | ||
return m ? m.call(o) : (o = typeof __values2 === "function" ? __values2(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { | ||
return this; | ||
}, i); | ||
function verb(n) { | ||
i[n] = o[n] && function(v) { | ||
return new Promise(function(resolve, reject) { | ||
v = o[n](v), settle(resolve, reject, v.done, v.value); | ||
}); | ||
}; | ||
} | ||
function settle(resolve, reject, d, v) { | ||
Promise.resolve(v).then(function(v2) { | ||
resolve({value: v2, done: d}); | ||
}, reject); | ||
} | ||
}; | ||
__makeTemplateObject2 = function(cooked, raw) { | ||
if (Object.defineProperty) { | ||
Object.defineProperty(cooked, "raw", {value: raw}); | ||
} else { | ||
cooked.raw = raw; | ||
} | ||
return cooked; | ||
}; | ||
var __setModuleDefault = Object.create ? function(o, v) { | ||
Object.defineProperty(o, "default", {enumerable: true, value: v}); | ||
} : function(o, v) { | ||
o["default"] = v; | ||
}; | ||
__importStar2 = function(mod) { | ||
if (mod && mod.__esModule) | ||
return mod; | ||
var result = {}; | ||
if (mod != null) { | ||
for (var k in mod) | ||
if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) | ||
__createBinding2(result, mod, k); | ||
} | ||
__setModuleDefault(result, mod); | ||
return result; | ||
}; | ||
__importDefault2 = function(mod) { | ||
return mod && mod.__esModule ? mod : {"default": mod}; | ||
}; | ||
__classPrivateFieldGet2 = function(receiver, privateMap) { | ||
if (!privateMap.has(receiver)) { | ||
throw new TypeError("attempted to get private field on non-instance"); | ||
} | ||
return privateMap.get(receiver); | ||
}; | ||
__classPrivateFieldSet2 = function(receiver, privateMap, value) { | ||
if (!privateMap.has(receiver)) { | ||
throw new TypeError("attempted to set private field on non-instance"); | ||
} | ||
privateMap.set(receiver, value); | ||
return value; | ||
}; | ||
exporter("__extends", __extends2); | ||
exporter("__assign", __assign2); | ||
exporter("__rest", __rest2); | ||
exporter("__decorate", __decorate2); | ||
exporter("__param", __param2); | ||
exporter("__metadata", __metadata2); | ||
exporter("__awaiter", __awaiter2); | ||
exporter("__generator", __generator2); | ||
exporter("__exportStar", __exportStar2); | ||
exporter("__createBinding", __createBinding2); | ||
exporter("__values", __values2); | ||
exporter("__read", __read2); | ||
exporter("__spread", __spread2); | ||
exporter("__spreadArrays", __spreadArrays2); | ||
exporter("__spreadArray", __spreadArray2); | ||
exporter("__await", __await2); | ||
exporter("__asyncGenerator", __asyncGenerator2); | ||
exporter("__asyncDelegator", __asyncDelegator2); | ||
exporter("__asyncValues", __asyncValues2); | ||
exporter("__makeTemplateObject", __makeTemplateObject2); | ||
exporter("__importStar", __importStar2); | ||
exporter("__importDefault", __importDefault2); | ||
exporter("__classPrivateFieldGet", __classPrivateFieldGet2); | ||
exporter("__classPrivateFieldSet", __classPrivateFieldSet2); | ||
}); | ||
} | ||
}); | ||
// src/browser.ts | ||
__markAsModule(exports); | ||
__export(exports, { | ||
FilmstripOrientation: () => FilmstripOrientation, | ||
Framo: () => Framo, | ||
FramoImageExtension: () => FramoImageExtension | ||
}); | ||
// src/constants/constants.ts | ||
var ERROR_MESSAGES = { | ||
FRAMO_NOT_INITIALIZED: "Framo has not been initialized. Please call initializeFramo before using any of the features", | ||
MEDIAINFO_COULD_NOT_LOAD: "Unable to fetch total frames: MediaInfo could not load", | ||
MEDIAINFO_COULD_NOT_ANALYZE_VIDEO: "Unable to analyze video", | ||
NO_FRAMERATE_IN_MEDIAINFO: "No framerate in mediainfo", | ||
COULD_EXTRACT_FRAMERATE_PROPERLY: "Could not extract framerate number properly" | ||
}; | ||
var REGEX = { | ||
ONLY_NUMBER: /[\d.+]+/g | ||
}; | ||
// node_modules/rxjs/node_modules/tslib/modules/index.js | ||
var import_tslib = __toModule(require_tslib()); | ||
var { | ||
__extends, | ||
__assign, | ||
__rest, | ||
__decorate, | ||
__param, | ||
__metadata, | ||
__awaiter, | ||
__generator, | ||
__exportStar, | ||
__createBinding, | ||
__values, | ||
__read, | ||
__spread, | ||
__spreadArrays, | ||
__spreadArray, | ||
__await, | ||
__asyncGenerator, | ||
__asyncDelegator, | ||
__asyncValues, | ||
__makeTemplateObject, | ||
__importStar, | ||
__importDefault, | ||
__classPrivateFieldGet, | ||
__classPrivateFieldSet | ||
} = import_tslib.default; | ||
// node_modules/rxjs/dist/esm5/internal/util/isFunction.js | ||
function isFunction(value) { | ||
return typeof value === "function"; | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js | ||
function createErrorClass(createImpl) { | ||
var _super = function(instance) { | ||
Error.call(instance); | ||
instance.stack = new Error().stack; | ||
}; | ||
var ctorFunc = createImpl(_super); | ||
ctorFunc.prototype = Object.create(Error.prototype); | ||
ctorFunc.prototype.constructor = ctorFunc; | ||
return ctorFunc; | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js | ||
var UnsubscriptionError = createErrorClass(function(_super) { | ||
return function UnsubscriptionErrorImpl(errors) { | ||
_super(this); | ||
this.message = errors ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function(err, i) { | ||
return i + 1 + ") " + err.toString(); | ||
}).join("\n ") : ""; | ||
this.name = "UnsubscriptionError"; | ||
this.errors = errors; | ||
}; | ||
}); | ||
// node_modules/rxjs/dist/esm5/internal/util/arrRemove.js | ||
function arrRemove(arr, item) { | ||
if (arr) { | ||
var index = arr.indexOf(item); | ||
0 <= index && arr.splice(index, 1); | ||
} | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/Subscription.js | ||
var Subscription = function() { | ||
function Subscription2(initialTeardown) { | ||
this.initialTeardown = initialTeardown; | ||
this.closed = false; | ||
this._parentage = null; | ||
this._teardowns = null; | ||
} | ||
Subscription2.prototype.unsubscribe = function() { | ||
var e_1, _a, e_2, _b; | ||
var errors; | ||
if (!this.closed) { | ||
this.closed = true; | ||
var _parentage = this._parentage; | ||
if (_parentage) { | ||
this._parentage = null; | ||
if (Array.isArray(_parentage)) { | ||
try { | ||
for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) { | ||
var parent_1 = _parentage_1_1.value; | ||
parent_1.remove(this); | ||
} | ||
} catch (e_1_1) { | ||
e_1 = {error: e_1_1}; | ||
} finally { | ||
try { | ||
if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) | ||
_a.call(_parentage_1); | ||
} finally { | ||
if (e_1) | ||
throw e_1.error; | ||
} | ||
} | ||
} else { | ||
_parentage.remove(this); | ||
} | ||
} | ||
var initialTeardown = this.initialTeardown; | ||
if (isFunction(initialTeardown)) { | ||
try { | ||
initialTeardown(); | ||
} catch (e) { | ||
errors = e instanceof UnsubscriptionError ? e.errors : [e]; | ||
} | ||
} | ||
var _teardowns = this._teardowns; | ||
if (_teardowns) { | ||
this._teardowns = null; | ||
try { | ||
for (var _teardowns_1 = __values(_teardowns), _teardowns_1_1 = _teardowns_1.next(); !_teardowns_1_1.done; _teardowns_1_1 = _teardowns_1.next()) { | ||
var teardown_1 = _teardowns_1_1.value; | ||
try { | ||
execTeardown(teardown_1); | ||
} catch (err) { | ||
errors = errors !== null && errors !== void 0 ? errors : []; | ||
if (err instanceof UnsubscriptionError) { | ||
errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors)); | ||
} else { | ||
errors.push(err); | ||
} | ||
} | ||
} | ||
} catch (e_2_1) { | ||
e_2 = {error: e_2_1}; | ||
} finally { | ||
try { | ||
if (_teardowns_1_1 && !_teardowns_1_1.done && (_b = _teardowns_1.return)) | ||
_b.call(_teardowns_1); | ||
} finally { | ||
if (e_2) | ||
throw e_2.error; | ||
} | ||
} | ||
} | ||
if (errors) { | ||
throw new UnsubscriptionError(errors); | ||
} | ||
} | ||
}; | ||
Subscription2.prototype.add = function(teardown) { | ||
var _a; | ||
if (teardown && teardown !== this) { | ||
if (this.closed) { | ||
execTeardown(teardown); | ||
} else { | ||
if (teardown instanceof Subscription2) { | ||
if (teardown.closed || teardown._hasParent(this)) { | ||
return; | ||
} | ||
teardown._addParent(this); | ||
} | ||
(this._teardowns = (_a = this._teardowns) !== null && _a !== void 0 ? _a : []).push(teardown); | ||
} | ||
} | ||
}; | ||
Subscription2.prototype._hasParent = function(parent) { | ||
var _parentage = this._parentage; | ||
return _parentage === parent || Array.isArray(_parentage) && _parentage.includes(parent); | ||
}; | ||
Subscription2.prototype._addParent = function(parent) { | ||
var _parentage = this._parentage; | ||
this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent; | ||
}; | ||
Subscription2.prototype._removeParent = function(parent) { | ||
var _parentage = this._parentage; | ||
if (_parentage === parent) { | ||
this._parentage = null; | ||
} else if (Array.isArray(_parentage)) { | ||
arrRemove(_parentage, parent); | ||
} | ||
}; | ||
Subscription2.prototype.remove = function(teardown) { | ||
var _teardowns = this._teardowns; | ||
_teardowns && arrRemove(_teardowns, teardown); | ||
if (teardown instanceof Subscription2) { | ||
teardown._removeParent(this); | ||
} | ||
}; | ||
Subscription2.EMPTY = function() { | ||
var empty = new Subscription2(); | ||
empty.closed = true; | ||
return empty; | ||
}(); | ||
return Subscription2; | ||
}(); | ||
var EMPTY_SUBSCRIPTION = Subscription.EMPTY; | ||
function isSubscription(value) { | ||
return value instanceof Subscription || value && "closed" in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe); | ||
} | ||
function execTeardown(teardown) { | ||
if (isFunction(teardown)) { | ||
teardown(); | ||
} else { | ||
teardown.unsubscribe(); | ||
} | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/config.js | ||
var config = { | ||
onUnhandledError: null, | ||
onStoppedNotification: null, | ||
Promise: void 0, | ||
useDeprecatedSynchronousErrorHandling: false, | ||
useDeprecatedNextContext: false | ||
}; | ||
// node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js | ||
var timeoutProvider = { | ||
setTimeout: function() { | ||
var args = []; | ||
for (var _i = 0; _i < arguments.length; _i++) { | ||
args[_i] = arguments[_i]; | ||
} | ||
var delegate = timeoutProvider.delegate; | ||
return ((delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) || setTimeout).apply(void 0, __spreadArray([], __read(args))); | ||
}, | ||
clearTimeout: function(handle) { | ||
var delegate = timeoutProvider.delegate; | ||
return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle); | ||
}, | ||
delegate: void 0 | ||
}; | ||
// node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js | ||
function reportUnhandledError(err) { | ||
timeoutProvider.setTimeout(function() { | ||
var onUnhandledError = config.onUnhandledError; | ||
if (onUnhandledError) { | ||
onUnhandledError(err); | ||
} else { | ||
throw err; | ||
} | ||
}); | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/util/noop.js | ||
function noop() { | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/NotificationFactories.js | ||
var COMPLETE_NOTIFICATION = function() { | ||
return createNotification("C", void 0, void 0); | ||
}(); | ||
function errorNotification(error) { | ||
return createNotification("E", void 0, error); | ||
} | ||
function nextNotification(value) { | ||
return createNotification("N", value, void 0); | ||
} | ||
function createNotification(kind, value, error) { | ||
return { | ||
kind, | ||
value, | ||
error | ||
}; | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/Subscriber.js | ||
var Subscriber = function(_super) { | ||
__extends(Subscriber2, _super); | ||
function Subscriber2(destination) { | ||
var _this = _super.call(this) || this; | ||
_this.isStopped = false; | ||
if (destination) { | ||
_this.destination = destination; | ||
if (isSubscription(destination)) { | ||
destination.add(_this); | ||
} | ||
} else { | ||
_this.destination = EMPTY_OBSERVER; | ||
} | ||
return _this; | ||
} | ||
Subscriber2.create = function(next, error, complete) { | ||
return new SafeSubscriber(next, error, complete); | ||
}; | ||
Subscriber2.prototype.next = function(value) { | ||
if (this.isStopped) { | ||
handleStoppedNotification(nextNotification(value), this); | ||
} else { | ||
this._next(value); | ||
} | ||
}; | ||
Subscriber2.prototype.error = function(err) { | ||
if (this.isStopped) { | ||
handleStoppedNotification(errorNotification(err), this); | ||
} else { | ||
this.isStopped = true; | ||
this._error(err); | ||
} | ||
}; | ||
Subscriber2.prototype.complete = function() { | ||
if (this.isStopped) { | ||
handleStoppedNotification(COMPLETE_NOTIFICATION, this); | ||
} else { | ||
this.isStopped = true; | ||
this._complete(); | ||
} | ||
}; | ||
Subscriber2.prototype.unsubscribe = function() { | ||
if (!this.closed) { | ||
this.isStopped = true; | ||
_super.prototype.unsubscribe.call(this); | ||
this.destination = null; | ||
} | ||
}; | ||
Subscriber2.prototype._next = function(value) { | ||
this.destination.next(value); | ||
}; | ||
Subscriber2.prototype._error = function(err) { | ||
try { | ||
this.destination.error(err); | ||
} finally { | ||
this.unsubscribe(); | ||
} | ||
}; | ||
Subscriber2.prototype._complete = function() { | ||
try { | ||
this.destination.complete(); | ||
} finally { | ||
this.unsubscribe(); | ||
} | ||
}; | ||
return Subscriber2; | ||
}(Subscription); | ||
var SafeSubscriber = function(_super) { | ||
__extends(SafeSubscriber2, _super); | ||
function SafeSubscriber2(observerOrNext, error, complete) { | ||
var _this = _super.call(this) || this; | ||
var next; | ||
if (isFunction(observerOrNext)) { | ||
next = observerOrNext; | ||
} else if (observerOrNext) { | ||
next = observerOrNext.next, error = observerOrNext.error, complete = observerOrNext.complete; | ||
var context_1; | ||
if (_this && config.useDeprecatedNextContext) { | ||
context_1 = Object.create(observerOrNext); | ||
context_1.unsubscribe = function() { | ||
return _this.unsubscribe(); | ||
}; | ||
} else { | ||
context_1 = observerOrNext; | ||
} | ||
next = next === null || next === void 0 ? void 0 : next.bind(context_1); | ||
error = error === null || error === void 0 ? void 0 : error.bind(context_1); | ||
complete = complete === null || complete === void 0 ? void 0 : complete.bind(context_1); | ||
} | ||
_this.destination = { | ||
next: next ? wrapForErrorHandling(next, _this) : noop, | ||
error: wrapForErrorHandling(error !== null && error !== void 0 ? error : defaultErrorHandler, _this), | ||
complete: complete ? wrapForErrorHandling(complete, _this) : noop | ||
}; | ||
return _this; | ||
} | ||
return SafeSubscriber2; | ||
}(Subscriber); | ||
function wrapForErrorHandling(handler, instance) { | ||
return function() { | ||
var args = []; | ||
for (var _i = 0; _i < arguments.length; _i++) { | ||
args[_i] = arguments[_i]; | ||
} | ||
try { | ||
handler.apply(void 0, __spreadArray([], __read(args))); | ||
} catch (err) { | ||
if (config.useDeprecatedSynchronousErrorHandling) { | ||
if (instance._syncErrorHack_isSubscribing) { | ||
instance.__syncError = err; | ||
} else { | ||
throw err; | ||
} | ||
} else { | ||
reportUnhandledError(err); | ||
} | ||
} | ||
}; | ||
} | ||
function defaultErrorHandler(err) { | ||
throw err; | ||
} | ||
function handleStoppedNotification(notification, subscriber) { | ||
var onStoppedNotification = config.onStoppedNotification; | ||
onStoppedNotification && timeoutProvider.setTimeout(function() { | ||
return onStoppedNotification(notification, subscriber); | ||
}); | ||
} | ||
var EMPTY_OBSERVER = { | ||
closed: true, | ||
next: noop, | ||
error: defaultErrorHandler, | ||
complete: noop | ||
}; | ||
// node_modules/rxjs/dist/esm5/internal/symbol/observable.js | ||
var observable = function() { | ||
return typeof Symbol === "function" && Symbol.observable || "@@observable"; | ||
}(); | ||
// node_modules/rxjs/dist/esm5/internal/util/identity.js | ||
function identity(x) { | ||
return x; | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/util/pipe.js | ||
function pipeFromArray(fns) { | ||
if (fns.length === 0) { | ||
return identity; | ||
} | ||
if (fns.length === 1) { | ||
return fns[0]; | ||
} | ||
return function piped(input) { | ||
return fns.reduce(function(prev, fn) { | ||
return fn(prev); | ||
}, input); | ||
}; | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/Observable.js | ||
var Observable = function() { | ||
function Observable2(subscribe) { | ||
if (subscribe) { | ||
this._subscribe = subscribe; | ||
} | ||
} | ||
Observable2.prototype.lift = function(operator) { | ||
var observable2 = new Observable2(); | ||
observable2.source = this; | ||
observable2.operator = operator; | ||
return observable2; | ||
}; | ||
Observable2.prototype.subscribe = function(observerOrNext, error, complete) { | ||
var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete); | ||
if (config.useDeprecatedSynchronousErrorHandling) { | ||
this._deprecatedSyncErrorSubscribe(subscriber); | ||
} else { | ||
var _a = this, operator = _a.operator, source = _a.source; | ||
subscriber.add(operator ? operator.call(subscriber, source) : source ? this._subscribe(subscriber) : this._trySubscribe(subscriber)); | ||
} | ||
return subscriber; | ||
}; | ||
Observable2.prototype._deprecatedSyncErrorSubscribe = function(subscriber) { | ||
var localSubscriber = subscriber; | ||
localSubscriber._syncErrorHack_isSubscribing = true; | ||
var operator = this.operator; | ||
if (operator) { | ||
subscriber.add(operator.call(subscriber, this.source)); | ||
} else { | ||
try { | ||
subscriber.add(this._subscribe(subscriber)); | ||
} catch (err) { | ||
localSubscriber.__syncError = err; | ||
} | ||
} | ||
var dest = localSubscriber; | ||
while (dest) { | ||
if ("__syncError" in dest) { | ||
try { | ||
throw dest.__syncError; | ||
} finally { | ||
subscriber.unsubscribe(); | ||
} | ||
} | ||
dest = dest.destination; | ||
} | ||
localSubscriber._syncErrorHack_isSubscribing = false; | ||
}; | ||
Observable2.prototype._trySubscribe = function(sink) { | ||
try { | ||
return this._subscribe(sink); | ||
} catch (err) { | ||
sink.error(err); | ||
} | ||
}; | ||
Observable2.prototype.forEach = function(next, promiseCtor) { | ||
var _this = this; | ||
promiseCtor = getPromiseCtor(promiseCtor); | ||
return new promiseCtor(function(resolve, reject) { | ||
var subscription; | ||
subscription = _this.subscribe(function(value) { | ||
try { | ||
next(value); | ||
} catch (err) { | ||
reject(err); | ||
subscription === null || subscription === void 0 ? void 0 : subscription.unsubscribe(); | ||
} | ||
}, reject, resolve); | ||
}); | ||
}; | ||
Observable2.prototype._subscribe = function(subscriber) { | ||
var _a; | ||
return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber); | ||
}; | ||
Observable2.prototype[observable] = function() { | ||
return this; | ||
}; | ||
Observable2.prototype.pipe = function() { | ||
var operations = []; | ||
for (var _i = 0; _i < arguments.length; _i++) { | ||
operations[_i] = arguments[_i]; | ||
} | ||
return operations.length ? pipeFromArray(operations)(this) : this; | ||
}; | ||
Observable2.prototype.toPromise = function(promiseCtor) { | ||
var _this = this; | ||
promiseCtor = getPromiseCtor(promiseCtor); | ||
return new promiseCtor(function(resolve, reject) { | ||
var value; | ||
_this.subscribe(function(x) { | ||
return value = x; | ||
}, function(err) { | ||
return reject(err); | ||
}, function() { | ||
return resolve(value); | ||
}); | ||
}); | ||
}; | ||
Observable2.create = function(subscribe) { | ||
return new Observable2(subscribe); | ||
}; | ||
return Observable2; | ||
}(); | ||
function getPromiseCtor(promiseCtor) { | ||
var _a; | ||
return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise; | ||
} | ||
function isObserver(value) { | ||
return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete); | ||
} | ||
function isSubscriber(value) { | ||
return value && value instanceof Subscriber || isObserver(value) && isSubscription(value); | ||
} | ||
// node_modules/rxjs/dist/esm5/internal/util/ObjectUnsubscribedError.js | ||
var ObjectUnsubscribedError = createErrorClass(function(_super) { | ||
return function ObjectUnsubscribedErrorImpl() { | ||
_super(this); | ||
this.name = "ObjectUnsubscribedError"; | ||
this.message = "object unsubscribed"; | ||
}; | ||
}); | ||
// node_modules/rxjs/dist/esm5/internal/Subject.js | ||
var Subject = function(_super) { | ||
__extends(Subject2, _super); | ||
function Subject2() { | ||
var _this = _super.call(this) || this; | ||
_this.closed = false; | ||
_this.observers = []; | ||
_this.isStopped = false; | ||
_this.hasError = false; | ||
_this.thrownError = null; | ||
return _this; | ||
} | ||
Subject2.prototype.lift = function(operator) { | ||
var subject = new AnonymousSubject(this, this); | ||
subject.operator = operator; | ||
return subject; | ||
}; | ||
Subject2.prototype._throwIfClosed = function() { | ||
if (this.closed) { | ||
throw new ObjectUnsubscribedError(); | ||
} | ||
}; | ||
Subject2.prototype.next = function(value) { | ||
var e_1, _a; | ||
this._throwIfClosed(); | ||
if (!this.isStopped) { | ||
var copy = this.observers.slice(); | ||
try { | ||
for (var copy_1 = __values(copy), copy_1_1 = copy_1.next(); !copy_1_1.done; copy_1_1 = copy_1.next()) { | ||
var observer = copy_1_1.value; | ||
observer.next(value); | ||
} | ||
} catch (e_1_1) { | ||
e_1 = {error: e_1_1}; | ||
} finally { | ||
try { | ||
if (copy_1_1 && !copy_1_1.done && (_a = copy_1.return)) | ||
_a.call(copy_1); | ||
} finally { | ||
if (e_1) | ||
throw e_1.error; | ||
} | ||
} | ||
} | ||
}; | ||
Subject2.prototype.error = function(err) { | ||
this._throwIfClosed(); | ||
if (!this.isStopped) { | ||
this.hasError = this.isStopped = true; | ||
this.thrownError = err; | ||
var observers = this.observers; | ||
while (observers.length) { | ||
observers.shift().error(err); | ||
} | ||
} | ||
}; | ||
Subject2.prototype.complete = function() { | ||
this._throwIfClosed(); | ||
if (!this.isStopped) { | ||
this.isStopped = true; | ||
var observers = this.observers; | ||
while (observers.length) { | ||
observers.shift().complete(); | ||
} | ||
} | ||
}; | ||
Subject2.prototype.unsubscribe = function() { | ||
this.isStopped = this.closed = true; | ||
this.observers = null; | ||
}; | ||
Object.defineProperty(Subject2.prototype, "observed", { | ||
get: function() { | ||
var _a; | ||
return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0; | ||
}, | ||
enumerable: false, | ||
configurable: true | ||
}); | ||
Subject2.prototype._trySubscribe = function(subscriber) { | ||
this._throwIfClosed(); | ||
return _super.prototype._trySubscribe.call(this, subscriber); | ||
}; | ||
Subject2.prototype._subscribe = function(subscriber) { | ||
this._throwIfClosed(); | ||
this._checkFinalizedStatuses(subscriber); | ||
return this._innerSubscribe(subscriber); | ||
}; | ||
Subject2.prototype._innerSubscribe = function(subscriber) { | ||
var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers; | ||
return hasError || isStopped ? EMPTY_SUBSCRIPTION : (observers.push(subscriber), new Subscription(function() { | ||
return arrRemove(observers, subscriber); | ||
})); | ||
}; | ||
Subject2.prototype._checkFinalizedStatuses = function(subscriber) { | ||
var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped; | ||
if (hasError) { | ||
subscriber.error(thrownError); | ||
} else if (isStopped) { | ||
subscriber.complete(); | ||
} | ||
}; | ||
Subject2.prototype.asObservable = function() { | ||
var observable2 = new Observable(); | ||
observable2.source = this; | ||
return observable2; | ||
}; | ||
Subject2.create = function(destination, source) { | ||
return new AnonymousSubject(destination, source); | ||
}; | ||
return Subject2; | ||
}(Observable); | ||
var AnonymousSubject = function(_super) { | ||
__extends(AnonymousSubject2, _super); | ||
function AnonymousSubject2(destination, source) { | ||
var _this = _super.call(this) || this; | ||
_this.destination = destination; | ||
_this.source = source; | ||
return _this; | ||
} | ||
AnonymousSubject2.prototype.next = function(value) { | ||
var _a, _b; | ||
(_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value); | ||
}; | ||
AnonymousSubject2.prototype.error = function(err) { | ||
var _a, _b; | ||
(_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err); | ||
}; | ||
AnonymousSubject2.prototype.complete = function() { | ||
var _a, _b; | ||
(_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a); | ||
}; | ||
AnonymousSubject2.prototype._subscribe = function(subscriber) { | ||
var _a, _b; | ||
return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION; | ||
}; | ||
return AnonymousSubject2; | ||
}(Subject); | ||
// src/stores/scripts.ts | ||
var ScriptNames; | ||
(function(ScriptNames2) { | ||
ScriptNames2["FFMPEG"] = "ffmpeg"; | ||
ScriptNames2["MEDIAINFO"] = "mediainfo"; | ||
})(ScriptNames || (ScriptNames = {})); | ||
var ScriptStore = [ | ||
{ | ||
name: ScriptNames.FFMPEG, | ||
src: "https://unpkg.com/@ffmpeg/ffmpeg@0.10.0/dist/ffmpeg.min.js" | ||
}, | ||
{ | ||
name: ScriptNames.MEDIAINFO, | ||
src: "https://unpkg.com/mediainfo.js/dist/mediainfo.min.js" | ||
} | ||
]; | ||
// src/services/script-loader.service.ts | ||
var LoadStatus; | ||
(function(LoadStatus2) { | ||
LoadStatus2["AlreadyLoaded"] = "Already Loaded"; | ||
LoadStatus2["Loaded"] = "Loaded"; | ||
})(LoadStatus || (LoadStatus = {})); | ||
var ScriptService = class { | ||
constructor() { | ||
this.scripts = {}; | ||
ScriptStore.forEach((script) => { | ||
this.scripts[script.name] = { | ||
loaded: false, | ||
src: script.src | ||
}; | ||
}); | ||
} | ||
load(...scripts) { | ||
const promises = []; | ||
scripts.forEach((script) => promises.push(this.loadScript(script))); | ||
return Promise.all(promises); | ||
} | ||
loadScript(name) { | ||
return new Promise((resolve) => { | ||
if (this.scripts[name].loaded) { | ||
const response = { | ||
script: name, | ||
loaded: true, | ||
status: LoadStatus.AlreadyLoaded | ||
}; | ||
resolve(response); | ||
} else { | ||
const script = document.createElement("script"); | ||
script.type = "text/javascript"; | ||
script.src = this.scripts[name].src; | ||
script.onload = () => { | ||
this.scripts[name].loaded = true; | ||
const response = { | ||
script: name, | ||
loaded: true, | ||
status: LoadStatus.Loaded | ||
}; | ||
resolve(response); | ||
}; | ||
script.onerror = (error) => { | ||
console.error(error); | ||
const response = { | ||
script: name, | ||
loaded: false, | ||
status: LoadStatus.Loaded | ||
}; | ||
resolve(response); | ||
}; | ||
document.getElementsByTagName("head")[0].appendChild(script); | ||
} | ||
}); | ||
} | ||
}; | ||
// src/services/ffmpeg.service.ts | ||
var scripService = new ScriptService(); | ||
var FfmpegService = class extends EventTarget { | ||
constructor() { | ||
super(...arguments); | ||
this.isReady = false; | ||
this.progress = new Subject(); | ||
this.ready = new Subject(); | ||
this.initializeFramo = () => __async(this, null, function* () { | ||
yield this.initializeFfmpeg(); | ||
yield this.initializeMediaInfo(); | ||
this.isReady = true; | ||
this.emitReadyState(); | ||
}); | ||
this.initializeFfmpeg = () => __async(this, null, function* () { | ||
yield scripService.loadScript(ScriptNames.FFMPEG); | ||
this.ffmpeg = FFmpeg.createFFmpeg({ | ||
log: true | ||
}); | ||
yield this.ffmpeg.load(); | ||
this.initializeProgressForwarding(); | ||
}); | ||
this.initializeMediaInfo = () => __async(this, null, function* () { | ||
try { | ||
yield scripService.loadScript(ScriptNames.MEDIAINFO); | ||
const opts = {chunkSize: 256 * 1024, coverData: false, format: "object"}; | ||
this.mediainfo = yield new MediaInfo(opts); | ||
} catch (error) { | ||
throw new Error(`${ERROR_MESSAGES.MEDIAINFO_COULD_NOT_LOAD}: ${error}`); | ||
} | ||
}); | ||
this.fetchFile = (filename, file) => __async(this, null, function* () { | ||
const fileAsUint8Array = yield FFmpeg.fetchFile(file); | ||
yield this.ffmpeg.FS("writeFile", filename, fileAsUint8Array); | ||
return new Blob([fileAsUint8Array]); | ||
}); | ||
this.emitReadyState = () => { | ||
this.ready.next(); | ||
}; | ||
this.getMediaInfo = (fileBlob) => __async(this, null, function* () { | ||
const getSize = () => fileBlob.size; | ||
const readChunk = (chunkSize, offset) => new Promise((resolve, reject) => { | ||
const reader = new FileReader(); | ||
reader.onload = (event) => { | ||
var _a; | ||
if ((_a = event.target) == null ? void 0 : _a.error) { | ||
reject(event.target.error); | ||
} | ||
resolve(new Uint8Array(event.target.result)); | ||
}; | ||
reader.readAsArrayBuffer(fileBlob.slice(offset, offset + chunkSize)); | ||
}); | ||
try { | ||
const result = yield this.mediainfo.analyzeData(getSize, readChunk); | ||
return result; | ||
} catch (error) { | ||
throw new Error(ERROR_MESSAGES.MEDIAINFO_COULD_NOT_ANALYZE_VIDEO); | ||
} | ||
}); | ||
} | ||
static getInstance() { | ||
if (!FfmpegService.instance) { | ||
FfmpegService.instance = new FfmpegService(); | ||
} | ||
return FfmpegService.instance; | ||
} | ||
initializeProgressForwarding() { | ||
this.ffmpeg.setProgress((progress) => { | ||
this.progress.next(progress); | ||
}); | ||
} | ||
}; | ||
// src/models/filmstrip.model.ts | ||
var FilmstripOrientation; | ||
(function(FilmstripOrientation2) { | ||
FilmstripOrientation2["HORIZONTAL"] = "horizontal"; | ||
FilmstripOrientation2["VERTICAL"] = "vertical"; | ||
})(FilmstripOrientation || (FilmstripOrientation = {})); | ||
// src/utility/utility.ts | ||
var Utility = class { | ||
static getScale(dimensions) { | ||
var _a, _b; | ||
if (!dimensions.height && !dimensions.width) { | ||
return ""; | ||
} | ||
return `scale=${(_a = dimensions.width) != null ? _a : -2}:${(_b = dimensions.height) != null ? _b : -2}`; | ||
} | ||
static getFrameCount(mediainfoResult) { | ||
var _a, _b, _c; | ||
return (_c = parseInt((_b = (_a = mediainfoResult.media) == null ? void 0 : _a.track[0]) == null ? void 0 : _b.FrameCount, 10)) != null ? _c : 0; | ||
} | ||
static getVideoDuration(mediainfoResult) { | ||
var _a, _b, _c; | ||
return (_c = parseFloat((_b = (_a = mediainfoResult.media) == null ? void 0 : _a.track[0]) == null ? void 0 : _b.Duration)) != null ? _c : 0; | ||
} | ||
static parseMediainfoResultForFramerate(mediainfoResult) { | ||
const positionOfFramerate = mediainfoResult.indexOf("Framerate:"); | ||
if (positionOfFramerate === -1) { | ||
throw new Error(ERROR_MESSAGES.NO_FRAMERATE_IN_MEDIAINFO); | ||
} | ||
const positionOfNewLinePostFramerate = mediainfoResult.indexOf("\n", positionOfFramerate); | ||
const framerateInString = mediainfoResult.substring(positionOfFramerate, positionOfNewLinePostFramerate); | ||
const framerateArray = framerateInString.match(REGEX.ONLY_NUMBER); | ||
if (!framerateArray || framerateArray.length === 0) { | ||
throw new Error(ERROR_MESSAGES.COULD_EXTRACT_FRAMERATE_PROPERLY); | ||
} | ||
const framerate = parseFloat(framerateArray[0]); | ||
return framerate; | ||
} | ||
static getOutputFilename(index, extension) { | ||
return `out_${index}_${Date.now()}.${extension}`; | ||
} | ||
static getFilmstripTileString(totalFramesInFilmstrip, orientation) { | ||
if (orientation === FilmstripOrientation.HORIZONTAL) { | ||
return `tile=${totalFramesInFilmstrip}x1`; | ||
} else { | ||
return `tile=1x${totalFramesInFilmstrip}`; | ||
} | ||
} | ||
}; | ||
// src/services/filmstrip.service.ts | ||
var FilmstripService = class { | ||
constructor() { | ||
this.ffmpegService = FfmpegService.getInstance(); | ||
this.makeFilmstrip = (config2) => __async(this, null, function* () { | ||
try { | ||
const fileBlob = yield this.ffmpegService.fetchFile(config2.filename, config2.file); | ||
const mediainfo = yield this.ffmpegService.getMediaInfo(fileBlob); | ||
const {parameters, outputFilename} = this.getParameters(config2, mediainfo); | ||
yield this.ffmpegService.ffmpeg.run(...parameters); | ||
const data = this.ffmpegService.ffmpeg.FS("readFile", outputFilename); | ||
return new Blob([data.buffer]); | ||
} catch (error) { | ||
throw new Error(error); | ||
} | ||
}); | ||
this.getParameters = (config2, mediainfo) => { | ||
const auxillaryParameters = ["-y"]; | ||
let parametersResponse = { | ||
parameters: [], | ||
outputFilename: "" | ||
}; | ||
parametersResponse = this.getTimeIntervalBasedParameters(config2, mediainfo); | ||
const response = { | ||
parameters: [...parametersResponse.parameters, ...auxillaryParameters], | ||
outputFilename: parametersResponse.outputFilename | ||
}; | ||
return response; | ||
}; | ||
this.getTimeIntervalBasedParameters = (config2, mediainfo) => { | ||
const outputFilename = Utility.getOutputFilename(1, config2.outputExtension); | ||
const duration = Utility.getVideoDuration(mediainfo); | ||
const totalFramesInFilmstrip = Math.floor(duration / config2.timeInterval); | ||
const selectTime = `select=not(mod(n\\,${config2.timeInterval})),`; | ||
const scale = config2.resolution ? `${Utility.getScale(config2.resolution)},` : ""; | ||
const tiles = Utility.getFilmstripTileString(totalFramesInFilmstrip, config2.orientation); | ||
const vfString = `${selectTime}${scale}${tiles}`; | ||
const inParameters = ["-i", config2.filename, "-frames", "1", "-vf", vfString]; | ||
const outParameters = [outputFilename]; | ||
const response = { | ||
parameters: [...inParameters, ...outParameters], | ||
outputFilename | ||
}; | ||
return response; | ||
}; | ||
} | ||
static getInstance() { | ||
if (!FilmstripService.instance) { | ||
FilmstripService.instance = new FilmstripService(); | ||
} | ||
return FilmstripService.instance; | ||
} | ||
}; | ||
// src/services/frame-extractor.service.ts | ||
var outputFilePrefix = "out"; | ||
var outputFileDigits = 6; | ||
var FrameExtractorService = class { | ||
constructor() { | ||
this.ffmpegService = FfmpegService.getInstance(); | ||
this.extractFrames = (config2) => __async(this, null, function* () { | ||
try { | ||
const fileBlob = yield this.ffmpegService.fetchFile(config2.filename, config2.file); | ||
const {parameters, outputFilenames} = yield this.getParameters(config2, fileBlob); | ||
yield this.ffmpegService.ffmpeg.run(...parameters); | ||
const blobs = outputFilenames.map((filename) => { | ||
const data = this.ffmpegService.ffmpeg.FS("readFile", filename); | ||
return new Blob([data.buffer]); | ||
}); | ||
return blobs; | ||
} catch (error) { | ||
throw new Error(error); | ||
} | ||
}); | ||
} | ||
static getInstance() { | ||
if (!FrameExtractorService.instance) { | ||
FrameExtractorService.instance = new FrameExtractorService(); | ||
} | ||
return FrameExtractorService.instance; | ||
} | ||
getParameters(config2, fileBlob) { | ||
return __async(this, null, function* () { | ||
const auxillaryParameters = ["-y"]; | ||
let parametersResponse = { | ||
parameters: [], | ||
outputFilenames: [] | ||
}; | ||
if (config2.timePoints) { | ||
parametersResponse = this.getTimeBasedParameters(config2); | ||
} else if (config2.timeInterval) { | ||
parametersResponse = yield this.getIntervalBasedParameters(config2, fileBlob); | ||
} | ||
const response = { | ||
parameters: [...parametersResponse.parameters, ...auxillaryParameters], | ||
outputFilenames: parametersResponse.outputFilenames | ||
}; | ||
return response; | ||
}); | ||
} | ||
getTimeBasedParameters(config2) { | ||
var _a; | ||
const inParameters = []; | ||
const outParameters = []; | ||
const outputFilenames = []; | ||
const scale = config2.resolution ? Utility.getScale(config2.resolution) : ""; | ||
(_a = config2.timePoints) == null ? void 0 : _a.forEach((timePoint, index) => { | ||
inParameters.push(...this.getSingleTimeBasedParameter(timePoint, config2.filename)); | ||
const outputFilename = Utility.getOutputFilename(index, config2.outputExtension); | ||
outputFilenames.push(outputFilename); | ||
outParameters.push(...this.getOutputMappingParameter(index, outputFilename, scale)); | ||
}); | ||
const response = { | ||
parameters: [...inParameters, ...outParameters], | ||
outputFilenames | ||
}; | ||
return response; | ||
} | ||
getSingleTimeBasedParameter(time, filename) { | ||
return ["-ss", `${time}`, "-i", filename]; | ||
} | ||
getOutputMappingParameter(index, outputFilename, scale) { | ||
const outputMapping = ["-map", `${index}:v`, "-frames:v", "1"]; | ||
if (scale) { | ||
outputMapping.push(...["-vf", scale]); | ||
} | ||
outputMapping.push(outputFilename); | ||
return outputMapping; | ||
} | ||
getOutputFilenameForIntervalBasedParameters(index, extension) { | ||
const filenumber = index.toString().padStart(outputFileDigits, "0"); | ||
return `out_${filenumber}.${extension}`; | ||
} | ||
getIntervalBasedParameters(config2, fileBlob) { | ||
return __async(this, null, function* () { | ||
const mediainfo = yield this.ffmpegService.getMediaInfo(fileBlob); | ||
const videoDuration = Utility.getVideoDuration(mediainfo); | ||
const frameCount = Utility.getFrameCount(mediainfo); | ||
console.log(frameCount); | ||
const interval = config2.timeInterval; | ||
const rate = (1 / interval).toFixed(2); | ||
const scale = config2.resolution ? Utility.getScale(config2.resolution) : ""; | ||
const inParameters = this.getInParametersForIntervalBasedExtraction(config2.filename, rate, scale); | ||
const outParameters = [`out_%0${outputFileDigits}d.${config2.outputExtension}`]; | ||
const outputFilenames = []; | ||
for (let i = interval, j = 1; i <= videoDuration; i += interval, j++) { | ||
const outputFilename = this.getOutputFilenameForIntervalBasedParameters(j, config2.outputExtension); | ||
outputFilenames.push(outputFilename); | ||
} | ||
const response = { | ||
parameters: [...inParameters, ...outParameters], | ||
outputFilenames | ||
}; | ||
return response; | ||
}); | ||
} | ||
getVideoDuration(fileBlob) { | ||
return new Promise((resolve, reject) => { | ||
const video = document.createElement("video"); | ||
video.preload = "metadata"; | ||
video.onloadedmetadata = () => { | ||
window.URL.revokeObjectURL(video.src); | ||
resolve(video.duration); | ||
}; | ||
video.onerror = (error) => { | ||
reject(error); | ||
}; | ||
video.src = URL.createObjectURL(fileBlob); | ||
}); | ||
} | ||
getOutputFilenamesForIntervalBasedParameters(interval, videoDuration, extension) { | ||
const filenames = []; | ||
const numberOfFrames = videoDuration / interval; | ||
for (let i = 1; i <= numberOfFrames; i++) { | ||
const filenumber = i.toString().padStart(outputFileDigits, "0"); | ||
filenames.push(`${outputFilePrefix}_${filenumber}.${extension}`); | ||
} | ||
return filenames; | ||
} | ||
getInParametersForIntervalBasedExtraction(filename, rate, scale) { | ||
const inParameters = ["-i", filename, "-vf"]; | ||
if (scale) { | ||
inParameters.push(`fps=${rate},${scale}`); | ||
} else { | ||
inParameters.push(`fps=${rate}`); | ||
} | ||
return inParameters; | ||
} | ||
}; | ||
// src/main.ts | ||
var Main = class { | ||
constructor() { | ||
this.ffmpegService = FfmpegService.getInstance(); | ||
this.frameExtractorService = FrameExtractorService.getInstance(); | ||
this.filmstripService = FilmstripService.getInstance(); | ||
this.initializeFramo = () => this.ffmpegService.initializeFramo(); | ||
this.extractFrames = (config2) => this.frameExtractorService.extractFrames(config2); | ||
this.makeFilmstrip = (config2) => this.filmstripService.makeFilmstrip(config2); | ||
} | ||
initializationGuard() { | ||
if (!this.ffmpegService.isReady) { | ||
throw new Error(ERROR_MESSAGES.FRAMO_NOT_INITIALIZED); | ||
} | ||
return this; | ||
} | ||
}; | ||
// src/models/generic.model.ts | ||
var FramoImageExtension; | ||
(function(FramoImageExtension2) { | ||
FramoImageExtension2["JPEG"] = "jpeg"; | ||
FramoImageExtension2["JPG"] = "jpg"; | ||
FramoImageExtension2["PNG"] = "png"; | ||
FramoImageExtension2["BMP"] = "bmp"; | ||
})(FramoImageExtension || (FramoImageExtension = {})); | ||
// src/browser.ts | ||
var Framo = class { | ||
constructor() { | ||
this._ffmpegService = FfmpegService.getInstance(); | ||
this._main = new Main(); | ||
this.initializeFramo = () => this._main.initializeFramo(); | ||
this.extractFrames = (config2) => this._main.initializationGuard().extractFrames(config2); | ||
this.makeFilmstrip = (config2) => this._main.initializationGuard().makeFilmstrip(config2); | ||
this.progress = this._ffmpegService.progress; | ||
this.ready = this._ffmpegService.ready; | ||
} | ||
}; | ||
var __create=Object.create,__defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __markAsModule=target=>__defProp(target,"__esModule",{value:!0});var __commonJS=(cb,mod)=>function(){return mod||(0,cb[Object.keys(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports},__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__reExport=(target,module2,desc)=>{if(module2&&typeof module2=="object"||typeof module2=="function")for(let key of __getOwnPropNames(module2))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module2[key],enumerable:!(desc=__getOwnPropDesc(module2,key))||desc.enumerable});return target},__toModule=module2=>__reExport(__markAsModule(__defProp(module2!=null?__create(__getProtoOf(module2)):{},"default",module2&&module2.__esModule&&"default"in module2?{get:()=>module2.default,enumerable:!0}:{value:module2,enumerable:!0})),module2);var __async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())});var require_tslib=__commonJS({"node_modules/rxjs/node_modules/tslib/tslib.js"(exports,module2){var __extends2,__assign2,__rest2,__decorate2,__param2,__metadata2,__awaiter2,__generator2,__exportStar2,__values2,__read2,__spread2,__spreadArrays2,__spreadArray2,__await2,__asyncGenerator2,__asyncDelegator2,__asyncValues2,__makeTemplateObject2,__importStar2,__importDefault2,__classPrivateFieldGet2,__classPrivateFieldSet2,__createBinding2;(function(factory){var root=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(exports2){factory(createExporter(root,createExporter(exports2)))}):typeof module2=="object"&&typeof module2.exports=="object"?factory(createExporter(root,createExporter(module2.exports))):factory(createExporter(root));function createExporter(exports2,previous){return exports2!==root&&(typeof Object.create=="function"?Object.defineProperty(exports2,"__esModule",{value:!0}):exports2.__esModule=!0),function(id,v){return exports2[id]=previous?previous(id,v):v}}})(function(exporter){var extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b}||function(d,b){for(var p in b)Object.prototype.hasOwnProperty.call(b,p)&&(d[p]=b[p])};__extends2=function(d,b){if(typeof b!="function"&&b!==null)throw new TypeError("Class extends value "+String(b)+" is not a constructor or null");extendStatics(d,b);function __(){this.constructor=d}d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __)},__assign2=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++){s=arguments[i];for(var p in s)Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p])}return t},__rest2=function(s,e){var t={};for(var p in s)Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0&&(t[p]=s[p]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i=0,p=Object.getOwnPropertySymbols(s);i<p.length;i++)e.indexOf(p[i])<0&&Object.prototype.propertyIsEnumerable.call(s,p[i])&&(t[p[i]]=s[p[i]]);return t},__decorate2=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r},__param2=function(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}},__metadata2=function(metadataKey,metadataValue){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(metadataKey,metadataValue)},__awaiter2=function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve){resolve(value)})}return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})},__generator2=function(thisArg,body){var _={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},f,y,t,g;return g={next:verb(0),throw:verb(1),return:verb(2)},typeof Symbol=="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");for(;_;)try{if(f=1,y&&(t=op[0]&2?y.return:op[0]?y.throw||((t=y.return)&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;switch(y=0,t&&(op=[op[0]&2,t.value]),op[0]){case 0:case 1:t=op;break;case 4:return _.label++,{value:op[1],done:!1};case 5:_.label++,y=op[1],op=[0];continue;case 7:op=_.ops.pop(),_.trys.pop();continue;default:if(t=_.trys,!(t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1],t=op;break}if(t&&_.label<t[2]){_.label=t[2],_.ops.push(op);break}t[2]&&_.ops.pop(),_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e],y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:!0}}},__exportStar2=function(m,o){for(var p in m)p!=="default"&&!Object.prototype.hasOwnProperty.call(o,p)&&__createBinding2(o,m,p)},__createBinding2=Object.create?function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}:function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]},__values2=function(o){var s=typeof Symbol=="function"&&Symbol.iterator,m=s&&o[s],i=0;if(m)return m.call(o);if(o&&typeof o.length=="number")return{next:function(){return o&&i>=o.length&&(o=void 0),{value:o&&o[i++],done:!o}}};throw new TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")},__read2=function(o,n){var m=typeof Symbol=="function"&&o[Symbol.iterator];if(!m)return o;var i=m.call(o),r,ar=[],e;try{for(;(n===void 0||n-- >0)&&!(r=i.next()).done;)ar.push(r.value)}catch(error){e={error}}finally{try{r&&!r.done&&(m=i.return)&&m.call(i)}finally{if(e)throw e.error}}return ar},__spread2=function(){for(var ar=[],i=0;i<arguments.length;i++)ar=ar.concat(__read2(arguments[i]));return ar},__spreadArrays2=function(){for(var s=0,i=0,il=arguments.length;i<il;i++)s+=arguments[i].length;for(var r=Array(s),k=0,i=0;i<il;i++)for(var a=arguments[i],j=0,jl=a.length;j<jl;j++,k++)r[k]=a[j];return r},__spreadArray2=function(to,from){for(var i=0,il=from.length,j=to.length;i<il;i++,j++)to[j]=from[i];return to},__await2=function(v){return this instanceof __await2?(this.v=v,this):new __await2(v)},__asyncGenerator2=function(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g=generator.apply(thisArg,_arguments||[]),i,q=[];return i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i;function verb(n){g[n]&&(i[n]=function(v){return new Promise(function(a,b){q.push([n,v,a,b])>1||resume(n,v)})})}function resume(n,v){try{step(g[n](v))}catch(e){settle(q[0][3],e)}}function step(r){r.value instanceof __await2?Promise.resolve(r.value.v).then(fulfill,reject):settle(q[0][2],r)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f,v){f(v),q.shift(),q.length&&resume(q[0][0],q[0][1])}},__asyncDelegator2=function(o){var i,p;return i={},verb("next"),verb("throw",function(e){throw e}),verb("return"),i[Symbol.iterator]=function(){return this},i;function verb(n,f){i[n]=o[n]?function(v){return(p=!p)?{value:__await2(o[n](v)),done:n==="return"}:f?f(v):v}:f}},__asyncValues2=function(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m=o[Symbol.asyncIterator],i;return m?m.call(o):(o=typeof __values2=="function"?__values2(o):o[Symbol.iterator](),i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i);function verb(n){i[n]=o[n]&&function(v){return new Promise(function(resolve,reject){v=o[n](v),settle(resolve,reject,v.done,v.value)})}}function settle(resolve,reject,d,v){Promise.resolve(v).then(function(v2){resolve({value:v2,done:d})},reject)}},__makeTemplateObject2=function(cooked,raw){return Object.defineProperty?Object.defineProperty(cooked,"raw",{value:raw}):cooked.raw=raw,cooked};var __setModuleDefault=Object.create?function(o,v){Object.defineProperty(o,"default",{enumerable:!0,value:v})}:function(o,v){o.default=v};__importStar2=function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)k!=="default"&&Object.prototype.hasOwnProperty.call(mod,k)&&__createBinding2(result,mod,k);return __setModuleDefault(result,mod),result},__importDefault2=function(mod){return mod&&mod.__esModule?mod:{default:mod}},__classPrivateFieldGet2=function(receiver,privateMap){if(!privateMap.has(receiver))throw new TypeError("attempted to get private field on non-instance");return privateMap.get(receiver)},__classPrivateFieldSet2=function(receiver,privateMap,value){if(!privateMap.has(receiver))throw new TypeError("attempted to set private field on non-instance");return privateMap.set(receiver,value),value},exporter("__extends",__extends2),exporter("__assign",__assign2),exporter("__rest",__rest2),exporter("__decorate",__decorate2),exporter("__param",__param2),exporter("__metadata",__metadata2),exporter("__awaiter",__awaiter2),exporter("__generator",__generator2),exporter("__exportStar",__exportStar2),exporter("__createBinding",__createBinding2),exporter("__values",__values2),exporter("__read",__read2),exporter("__spread",__spread2),exporter("__spreadArrays",__spreadArrays2),exporter("__spreadArray",__spreadArray2),exporter("__await",__await2),exporter("__asyncGenerator",__asyncGenerator2),exporter("__asyncDelegator",__asyncDelegator2),exporter("__asyncValues",__asyncValues2),exporter("__makeTemplateObject",__makeTemplateObject2),exporter("__importStar",__importStar2),exporter("__importDefault",__importDefault2),exporter("__classPrivateFieldGet",__classPrivateFieldGet2),exporter("__classPrivateFieldSet",__classPrivateFieldSet2)})}});__markAsModule(exports);__export(exports,{FilmstripOrientation:()=>FilmstripOrientation,Framo:()=>Framo,FramoImageExtension:()=>FramoImageExtension});var ERROR_MESSAGES={FRAMO_NOT_INITIALIZED:"Framo has not been initialized. Please call initializeFramo before using any of the features",MEDIAINFO_COULD_NOT_LOAD:"Unable to fetch total frames: MediaInfo could not load",MEDIAINFO_COULD_NOT_ANALYZE_VIDEO:"Unable to analyze video",NO_FRAMERATE_IN_MEDIAINFO:"No framerate in mediainfo",COULD_EXTRACT_FRAMERATE_PROPERLY:"Could not extract framerate number properly"},REGEX={ONLY_NUMBER:/[\d.+]+/g};var import_tslib=__toModule(require_tslib()),{__extends,__assign,__rest,__decorate,__param,__metadata,__awaiter,__generator,__exportStar,__createBinding,__values,__read,__spread,__spreadArrays,__spreadArray,__await,__asyncGenerator,__asyncDelegator,__asyncValues,__makeTemplateObject,__importStar,__importDefault,__classPrivateFieldGet,__classPrivateFieldSet}=import_tslib.default;function isFunction(value){return typeof value=="function"}function createErrorClass(createImpl){var _super=function(instance){Error.call(instance),instance.stack=new Error().stack},ctorFunc=createImpl(_super);return ctorFunc.prototype=Object.create(Error.prototype),ctorFunc.prototype.constructor=ctorFunc,ctorFunc}var UnsubscriptionError=createErrorClass(function(_super){return function(errors){_super(this),this.message=errors?errors.length+` errors occurred during unsubscription: | ||
`+errors.map(function(err,i){return i+1+") "+err.toString()}).join(` | ||
`):"",this.name="UnsubscriptionError",this.errors=errors}});function arrRemove(arr,item){if(arr){var index=arr.indexOf(item);0<=index&&arr.splice(index,1)}}var Subscription=function(){function Subscription2(initialTeardown){this.initialTeardown=initialTeardown,this.closed=!1,this._parentage=null,this._teardowns=null}return Subscription2.prototype.unsubscribe=function(){var e_1,_a,e_2,_b,errors;if(!this.closed){this.closed=!0;var _parentage=this._parentage;if(_parentage)if(this._parentage=null,Array.isArray(_parentage))try{for(var _parentage_1=__values(_parentage),_parentage_1_1=_parentage_1.next();!_parentage_1_1.done;_parentage_1_1=_parentage_1.next()){var parent_1=_parentage_1_1.value;parent_1.remove(this)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_parentage_1_1&&!_parentage_1_1.done&&(_a=_parentage_1.return)&&_a.call(_parentage_1)}finally{if(e_1)throw e_1.error}}else _parentage.remove(this);var initialTeardown=this.initialTeardown;if(isFunction(initialTeardown))try{initialTeardown()}catch(e){errors=e instanceof UnsubscriptionError?e.errors:[e]}var _teardowns=this._teardowns;if(_teardowns){this._teardowns=null;try{for(var _teardowns_1=__values(_teardowns),_teardowns_1_1=_teardowns_1.next();!_teardowns_1_1.done;_teardowns_1_1=_teardowns_1.next()){var teardown_1=_teardowns_1_1.value;try{execTeardown(teardown_1)}catch(err){errors=errors!=null?errors:[],err instanceof UnsubscriptionError?errors=__spreadArray(__spreadArray([],__read(errors)),__read(err.errors)):errors.push(err)}}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_teardowns_1_1&&!_teardowns_1_1.done&&(_b=_teardowns_1.return)&&_b.call(_teardowns_1)}finally{if(e_2)throw e_2.error}}}if(errors)throw new UnsubscriptionError(errors)}},Subscription2.prototype.add=function(teardown){var _a;if(teardown&&teardown!==this)if(this.closed)execTeardown(teardown);else{if(teardown instanceof Subscription2){if(teardown.closed||teardown._hasParent(this))return;teardown._addParent(this)}(this._teardowns=(_a=this._teardowns)!==null&&_a!==void 0?_a:[]).push(teardown)}},Subscription2.prototype._hasParent=function(parent){var _parentage=this._parentage;return _parentage===parent||Array.isArray(_parentage)&&_parentage.includes(parent)},Subscription2.prototype._addParent=function(parent){var _parentage=this._parentage;this._parentage=Array.isArray(_parentage)?(_parentage.push(parent),_parentage):_parentage?[_parentage,parent]:parent},Subscription2.prototype._removeParent=function(parent){var _parentage=this._parentage;_parentage===parent?this._parentage=null:Array.isArray(_parentage)&&arrRemove(_parentage,parent)},Subscription2.prototype.remove=function(teardown){var _teardowns=this._teardowns;_teardowns&&arrRemove(_teardowns,teardown),teardown instanceof Subscription2&&teardown._removeParent(this)},Subscription2.EMPTY=function(){var empty=new Subscription2;return empty.closed=!0,empty}(),Subscription2}();var EMPTY_SUBSCRIPTION=Subscription.EMPTY;function isSubscription(value){return value instanceof Subscription||value&&"closed"in value&&isFunction(value.remove)&&isFunction(value.add)&&isFunction(value.unsubscribe)}function execTeardown(teardown){isFunction(teardown)?teardown():teardown.unsubscribe()}var config={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var timeoutProvider={setTimeout:function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];var delegate=timeoutProvider.delegate;return((delegate==null?void 0:delegate.setTimeout)||setTimeout).apply(void 0,__spreadArray([],__read(args)))},clearTimeout:function(handle){var delegate=timeoutProvider.delegate;return((delegate==null?void 0:delegate.clearTimeout)||clearTimeout)(handle)},delegate:void 0};function reportUnhandledError(err){timeoutProvider.setTimeout(function(){var onUnhandledError=config.onUnhandledError;if(onUnhandledError)onUnhandledError(err);else throw err})}function noop(){}var COMPLETE_NOTIFICATION=function(){return createNotification("C",void 0,void 0)}();function errorNotification(error){return createNotification("E",void 0,error)}function nextNotification(value){return createNotification("N",value,void 0)}function createNotification(kind,value,error){return{kind,value,error}}var Subscriber=function(_super){__extends(Subscriber2,_super);function Subscriber2(destination){var _this=_super.call(this)||this;return _this.isStopped=!1,destination?(_this.destination=destination,isSubscription(destination)&&destination.add(_this)):_this.destination=EMPTY_OBSERVER,_this}return Subscriber2.create=function(next,error,complete){return new SafeSubscriber(next,error,complete)},Subscriber2.prototype.next=function(value){this.isStopped?handleStoppedNotification(nextNotification(value),this):this._next(value)},Subscriber2.prototype.error=function(err){this.isStopped?handleStoppedNotification(errorNotification(err),this):(this.isStopped=!0,this._error(err))},Subscriber2.prototype.complete=function(){this.isStopped?handleStoppedNotification(COMPLETE_NOTIFICATION,this):(this.isStopped=!0,this._complete())},Subscriber2.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,_super.prototype.unsubscribe.call(this),this.destination=null)},Subscriber2.prototype._next=function(value){this.destination.next(value)},Subscriber2.prototype._error=function(err){try{this.destination.error(err)}finally{this.unsubscribe()}},Subscriber2.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},Subscriber2}(Subscription);var SafeSubscriber=function(_super){__extends(SafeSubscriber2,_super);function SafeSubscriber2(observerOrNext,error,complete){var _this=_super.call(this)||this,next;if(isFunction(observerOrNext))next=observerOrNext;else if(observerOrNext){next=observerOrNext.next,error=observerOrNext.error,complete=observerOrNext.complete;var context_1;_this&&config.useDeprecatedNextContext?(context_1=Object.create(observerOrNext),context_1.unsubscribe=function(){return _this.unsubscribe()}):context_1=observerOrNext,next=next==null?void 0:next.bind(context_1),error=error==null?void 0:error.bind(context_1),complete=complete==null?void 0:complete.bind(context_1)}return _this.destination={next:next?wrapForErrorHandling(next,_this):noop,error:wrapForErrorHandling(error!=null?error:defaultErrorHandler,_this),complete:complete?wrapForErrorHandling(complete,_this):noop},_this}return SafeSubscriber2}(Subscriber);function wrapForErrorHandling(handler,instance){return function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];try{handler.apply(void 0,__spreadArray([],__read(args)))}catch(err){if(config.useDeprecatedSynchronousErrorHandling)if(instance._syncErrorHack_isSubscribing)instance.__syncError=err;else throw err;else reportUnhandledError(err)}}}function defaultErrorHandler(err){throw err}function handleStoppedNotification(notification,subscriber){var onStoppedNotification=config.onStoppedNotification;onStoppedNotification&&timeoutProvider.setTimeout(function(){return onStoppedNotification(notification,subscriber)})}var EMPTY_OBSERVER={closed:!0,next:noop,error:defaultErrorHandler,complete:noop};var observable=function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"}();function identity(x){return x}function pipeFromArray(fns){return fns.length===0?identity:fns.length===1?fns[0]:function(input){return fns.reduce(function(prev,fn){return fn(prev)},input)}}var Observable=function(){function Observable2(subscribe){subscribe&&(this._subscribe=subscribe)}return Observable2.prototype.lift=function(operator){var observable2=new Observable2;return observable2.source=this,observable2.operator=operator,observable2},Observable2.prototype.subscribe=function(observerOrNext,error,complete){var subscriber=isSubscriber(observerOrNext)?observerOrNext:new SafeSubscriber(observerOrNext,error,complete);if(config.useDeprecatedSynchronousErrorHandling)this._deprecatedSyncErrorSubscribe(subscriber);else{var _a=this,operator=_a.operator,source=_a.source;subscriber.add(operator?operator.call(subscriber,source):source?this._subscribe(subscriber):this._trySubscribe(subscriber))}return subscriber},Observable2.prototype._deprecatedSyncErrorSubscribe=function(subscriber){var localSubscriber=subscriber;localSubscriber._syncErrorHack_isSubscribing=!0;var operator=this.operator;if(operator)subscriber.add(operator.call(subscriber,this.source));else try{subscriber.add(this._subscribe(subscriber))}catch(err){localSubscriber.__syncError=err}for(var dest=localSubscriber;dest;){if("__syncError"in dest)try{throw dest.__syncError}finally{subscriber.unsubscribe()}dest=dest.destination}localSubscriber._syncErrorHack_isSubscribing=!1},Observable2.prototype._trySubscribe=function(sink){try{return this._subscribe(sink)}catch(err){sink.error(err)}},Observable2.prototype.forEach=function(next,promiseCtor){var _this=this;return promiseCtor=getPromiseCtor(promiseCtor),new promiseCtor(function(resolve,reject){var subscription;subscription=_this.subscribe(function(value){try{next(value)}catch(err){reject(err),subscription==null||subscription.unsubscribe()}},reject,resolve)})},Observable2.prototype._subscribe=function(subscriber){var _a;return(_a=this.source)===null||_a===void 0?void 0:_a.subscribe(subscriber)},Observable2.prototype[observable]=function(){return this},Observable2.prototype.pipe=function(){for(var operations=[],_i=0;_i<arguments.length;_i++)operations[_i]=arguments[_i];return operations.length?pipeFromArray(operations)(this):this},Observable2.prototype.toPromise=function(promiseCtor){var _this=this;return promiseCtor=getPromiseCtor(promiseCtor),new promiseCtor(function(resolve,reject){var value;_this.subscribe(function(x){return value=x},function(err){return reject(err)},function(){return resolve(value)})})},Observable2.create=function(subscribe){return new Observable2(subscribe)},Observable2}();function getPromiseCtor(promiseCtor){var _a;return(_a=promiseCtor!=null?promiseCtor:config.Promise)!==null&&_a!==void 0?_a:Promise}function isObserver(value){return value&&isFunction(value.next)&&isFunction(value.error)&&isFunction(value.complete)}function isSubscriber(value){return value&&value instanceof Subscriber||isObserver(value)&&isSubscription(value)}var ObjectUnsubscribedError=createErrorClass(function(_super){return function(){_super(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"}});var Subject=function(_super){__extends(Subject2,_super);function Subject2(){var _this=_super.call(this)||this;return _this.closed=!1,_this.observers=[],_this.isStopped=!1,_this.hasError=!1,_this.thrownError=null,_this}return Subject2.prototype.lift=function(operator){var subject=new AnonymousSubject(this,this);return subject.operator=operator,subject},Subject2.prototype._throwIfClosed=function(){if(this.closed)throw new ObjectUnsubscribedError},Subject2.prototype.next=function(value){var e_1,_a;if(this._throwIfClosed(),!this.isStopped){var copy=this.observers.slice();try{for(var copy_1=__values(copy),copy_1_1=copy_1.next();!copy_1_1.done;copy_1_1=copy_1.next()){var observer=copy_1_1.value;observer.next(value)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{copy_1_1&&!copy_1_1.done&&(_a=copy_1.return)&&_a.call(copy_1)}finally{if(e_1)throw e_1.error}}}},Subject2.prototype.error=function(err){if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=err;for(var observers=this.observers;observers.length;)observers.shift().error(err)}},Subject2.prototype.complete=function(){if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;for(var observers=this.observers;observers.length;)observers.shift().complete()}},Subject2.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=null},Object.defineProperty(Subject2.prototype,"observed",{get:function(){var _a;return((_a=this.observers)===null||_a===void 0?void 0:_a.length)>0},enumerable:!1,configurable:!0}),Subject2.prototype._trySubscribe=function(subscriber){return this._throwIfClosed(),_super.prototype._trySubscribe.call(this,subscriber)},Subject2.prototype._subscribe=function(subscriber){return this._throwIfClosed(),this._checkFinalizedStatuses(subscriber),this._innerSubscribe(subscriber)},Subject2.prototype._innerSubscribe=function(subscriber){var _a=this,hasError=_a.hasError,isStopped=_a.isStopped,observers=_a.observers;return hasError||isStopped?EMPTY_SUBSCRIPTION:(observers.push(subscriber),new Subscription(function(){return arrRemove(observers,subscriber)}))},Subject2.prototype._checkFinalizedStatuses=function(subscriber){var _a=this,hasError=_a.hasError,thrownError=_a.thrownError,isStopped=_a.isStopped;hasError?subscriber.error(thrownError):isStopped&&subscriber.complete()},Subject2.prototype.asObservable=function(){var observable2=new Observable;return observable2.source=this,observable2},Subject2.create=function(destination,source){return new AnonymousSubject(destination,source)},Subject2}(Observable);var AnonymousSubject=function(_super){__extends(AnonymousSubject2,_super);function AnonymousSubject2(destination,source){var _this=_super.call(this)||this;return _this.destination=destination,_this.source=source,_this}return AnonymousSubject2.prototype.next=function(value){var _a,_b;(_b=(_a=this.destination)===null||_a===void 0?void 0:_a.next)===null||_b===void 0||_b.call(_a,value)},AnonymousSubject2.prototype.error=function(err){var _a,_b;(_b=(_a=this.destination)===null||_a===void 0?void 0:_a.error)===null||_b===void 0||_b.call(_a,err)},AnonymousSubject2.prototype.complete=function(){var _a,_b;(_b=(_a=this.destination)===null||_a===void 0?void 0:_a.complete)===null||_b===void 0||_b.call(_a)},AnonymousSubject2.prototype._subscribe=function(subscriber){var _a,_b;return(_b=(_a=this.source)===null||_a===void 0?void 0:_a.subscribe(subscriber))!==null&&_b!==void 0?_b:EMPTY_SUBSCRIPTION},AnonymousSubject2}(Subject);var ScriptNames;(function(ScriptNames2){ScriptNames2.FFMPEG="ffmpeg",ScriptNames2.MEDIAINFO="mediainfo"})(ScriptNames||(ScriptNames={}));var ScriptStore=[{name:ScriptNames.FFMPEG,src:"https://unpkg.com/@ffmpeg/ffmpeg@0.10.0/dist/ffmpeg.min.js"},{name:ScriptNames.MEDIAINFO,src:"https://unpkg.com/mediainfo.js/dist/mediainfo.min.js"}];var LoadStatus;(function(LoadStatus2){LoadStatus2.AlreadyLoaded="Already Loaded",LoadStatus2.Loaded="Loaded"})(LoadStatus||(LoadStatus={}));var ScriptService=class{constructor(){this.scripts={};ScriptStore.forEach(script=>{this.scripts[script.name]={loaded:!1,src:script.src}})}load(...scripts){let promises=[];return scripts.forEach(script=>promises.push(this.loadScript(script))),Promise.all(promises)}loadScript(name){return new Promise(resolve=>{if(this.scripts[name].loaded){let response={script:name,loaded:!0,status:LoadStatus.AlreadyLoaded};resolve(response)}else{let script=document.createElement("script");script.type="text/javascript",script.src=this.scripts[name].src,script.onload=()=>{this.scripts[name].loaded=!0;let response={script:name,loaded:!0,status:LoadStatus.Loaded};resolve(response)},script.onerror=error=>{console.error(error);let response={script:name,loaded:!1,status:LoadStatus.Loaded};resolve(response)},document.getElementsByTagName("head")[0].appendChild(script)}})}};var scripService=new ScriptService,FfmpegService=class extends EventTarget{constructor(){super(...arguments);this.isReady=!1;this.progress=new Subject;this.ready=new Subject;this.initializeFramo=()=>__async(this,null,function*(){yield this.initializeFfmpeg(),yield this.initializeMediaInfo(),this.isReady=!0,this.emitReadyState()});this.initializeFfmpeg=()=>__async(this,null,function*(){yield scripService.loadScript(ScriptNames.FFMPEG),this.ffmpeg=FFmpeg.createFFmpeg({log:!0}),yield this.ffmpeg.load(),this.initializeProgressForwarding()});this.initializeMediaInfo=()=>__async(this,null,function*(){try{yield scripService.loadScript(ScriptNames.MEDIAINFO);let opts={chunkSize:256*1024,coverData:!1,format:"object"};this.mediainfo=yield new MediaInfo(opts)}catch(error){throw new Error(`${ERROR_MESSAGES.MEDIAINFO_COULD_NOT_LOAD}: ${error}`)}});this.fetchFile=(filename,file)=>__async(this,null,function*(){let fileAsUint8Array=yield FFmpeg.fetchFile(file);return yield this.ffmpeg.FS("writeFile",filename,fileAsUint8Array),new Blob([fileAsUint8Array])});this.emitReadyState=()=>{this.ready.next()};this.getMediaInfo=fileBlob=>__async(this,null,function*(){let getSize=()=>fileBlob.size,readChunk=(chunkSize,offset)=>new Promise((resolve,reject)=>{let reader=new FileReader;reader.onload=event=>{var _a;((_a=event.target)==null?void 0:_a.error)&&reject(event.target.error),resolve(new Uint8Array(event.target.result))},reader.readAsArrayBuffer(fileBlob.slice(offset,offset+chunkSize))});try{return yield this.mediainfo.analyzeData(getSize,readChunk)}catch(error){throw new Error(ERROR_MESSAGES.MEDIAINFO_COULD_NOT_ANALYZE_VIDEO)}})}static getInstance(){return FfmpegService.instance||(FfmpegService.instance=new FfmpegService),FfmpegService.instance}initializeProgressForwarding(){this.ffmpeg.setProgress(progress=>{this.progress.next(progress)})}};var FilmstripOrientation;(function(FilmstripOrientation2){FilmstripOrientation2.HORIZONTAL="horizontal",FilmstripOrientation2.VERTICAL="vertical"})(FilmstripOrientation||(FilmstripOrientation={}));var Utility=class{static getScale(dimensions){var _a,_b;return!dimensions.height&&!dimensions.width?"":`scale=${(_a=dimensions.width)!=null?_a:-2}:${(_b=dimensions.height)!=null?_b:-2}`}static getFrameCount(mediainfoResult){var _a,_b,_c;return(_c=parseInt((_b=(_a=mediainfoResult.media)==null?void 0:_a.track[0])==null?void 0:_b.FrameCount,10))!=null?_c:0}static getVideoDuration(mediainfoResult){var _a,_b,_c;return(_c=parseFloat((_b=(_a=mediainfoResult.media)==null?void 0:_a.track[0])==null?void 0:_b.Duration))!=null?_c:0}static parseMediainfoResultForFramerate(mediainfoResult){let positionOfFramerate=mediainfoResult.indexOf("Framerate:");if(positionOfFramerate===-1)throw new Error(ERROR_MESSAGES.NO_FRAMERATE_IN_MEDIAINFO);let positionOfNewLinePostFramerate=mediainfoResult.indexOf(` | ||
`,positionOfFramerate),framerateArray=mediainfoResult.substring(positionOfFramerate,positionOfNewLinePostFramerate).match(REGEX.ONLY_NUMBER);if(!framerateArray||framerateArray.length===0)throw new Error(ERROR_MESSAGES.COULD_EXTRACT_FRAMERATE_PROPERLY);return parseFloat(framerateArray[0])}static getOutputFilename(index,extension){return`out_${index}_${Date.now()}.${extension}`}static getFilmstripTileString(totalFramesInFilmstrip,orientation){return orientation===FilmstripOrientation.HORIZONTAL?`tile=${totalFramesInFilmstrip}x1`:`tile=1x${totalFramesInFilmstrip}`}};var FilmstripService=class{constructor(){this.ffmpegService=FfmpegService.getInstance();this.makeFilmstrip=config2=>__async(this,null,function*(){try{let fileBlob=yield this.ffmpegService.fetchFile(config2.filename,config2.file),mediainfo=yield this.ffmpegService.getMediaInfo(fileBlob),{parameters,outputFilename}=this.getParameters(config2,mediainfo);yield this.ffmpegService.ffmpeg.run(...parameters);let data=this.ffmpegService.ffmpeg.FS("readFile",outputFilename);return new Blob([data.buffer])}catch(error){throw new Error(error)}});this.getParameters=(config2,mediainfo)=>{let auxillaryParameters=["-y"],parametersResponse={parameters:[],outputFilename:""};return parametersResponse=this.getTimeIntervalBasedParameters(config2,mediainfo),{parameters:[...parametersResponse.parameters,...auxillaryParameters],outputFilename:parametersResponse.outputFilename}};this.getTimeIntervalBasedParameters=(config2,mediainfo)=>{let outputFilename=Utility.getOutputFilename(1,config2.outputExtension),duration=Utility.getVideoDuration(mediainfo),totalFramesInFilmstrip=Math.floor(duration/config2.timeInterval),selectTime=`select=not(mod(n\\,${config2.timeInterval})),`,scale=config2.resolution?`${Utility.getScale(config2.resolution)},`:"",tiles=Utility.getFilmstripTileString(totalFramesInFilmstrip,config2.orientation),vfString=`${selectTime}${scale}${tiles}`,inParameters=["-i",config2.filename,"-frames","1","-vf",vfString],outParameters=[outputFilename];return{parameters:[...inParameters,...outParameters],outputFilename}}}static getInstance(){return FilmstripService.instance||(FilmstripService.instance=new FilmstripService),FilmstripService.instance}};var outputFilePrefix="out",outputFileDigits=6,FrameExtractorService=class{constructor(){this.ffmpegService=FfmpegService.getInstance();this.extractFrames=config2=>__async(this,null,function*(){try{let fileBlob=yield this.ffmpegService.fetchFile(config2.filename,config2.file),{parameters,outputFilenames}=yield this.getParameters(config2,fileBlob);return yield this.ffmpegService.ffmpeg.run(...parameters),outputFilenames.map(filename=>{let data=this.ffmpegService.ffmpeg.FS("readFile",filename);return new Blob([data.buffer])})}catch(error){throw new Error(error)}})}static getInstance(){return FrameExtractorService.instance||(FrameExtractorService.instance=new FrameExtractorService),FrameExtractorService.instance}getParameters(config2,fileBlob){return __async(this,null,function*(){let auxillaryParameters=["-y"],parametersResponse={parameters:[],outputFilenames:[]};return config2.timePoints?parametersResponse=this.getTimeBasedParameters(config2):config2.timeInterval&&(parametersResponse=yield this.getIntervalBasedParameters(config2,fileBlob)),{parameters:[...parametersResponse.parameters,...auxillaryParameters],outputFilenames:parametersResponse.outputFilenames}})}getTimeBasedParameters(config2){var _a;let inParameters=[],outParameters=[],outputFilenames=[],scale=config2.resolution?Utility.getScale(config2.resolution):"";return(_a=config2.timePoints)==null||_a.forEach((timePoint,index)=>{inParameters.push(...this.getSingleTimeBasedParameter(timePoint,config2.filename));let outputFilename=Utility.getOutputFilename(index,config2.outputExtension);outputFilenames.push(outputFilename),outParameters.push(...this.getOutputMappingParameter(index,outputFilename,scale))}),{parameters:[...inParameters,...outParameters],outputFilenames}}getSingleTimeBasedParameter(time,filename){return["-ss",`${time}`,"-i",filename]}getOutputMappingParameter(index,outputFilename,scale){let outputMapping=["-map",`${index}:v`,"-frames:v","1"];return scale&&outputMapping.push("-vf",scale),outputMapping.push(outputFilename),outputMapping}getOutputFilenameForIntervalBasedParameters(index,extension){return`out_${index.toString().padStart(outputFileDigits,"0")}.${extension}`}getIntervalBasedParameters(config2,fileBlob){return __async(this,null,function*(){let mediainfo=yield this.ffmpegService.getMediaInfo(fileBlob),videoDuration=Utility.getVideoDuration(mediainfo),frameCount=Utility.getFrameCount(mediainfo);console.log(frameCount);let interval=config2.timeInterval,rate=(1/interval).toFixed(2),scale=config2.resolution?Utility.getScale(config2.resolution):"",inParameters=this.getInParametersForIntervalBasedExtraction(config2.filename,rate,scale),outParameters=[`out_%0${outputFileDigits}d.${config2.outputExtension}`],outputFilenames=[];for(let i=interval,j=1;i<=videoDuration;i+=interval,j++){let outputFilename=this.getOutputFilenameForIntervalBasedParameters(j,config2.outputExtension);outputFilenames.push(outputFilename)}return{parameters:[...inParameters,...outParameters],outputFilenames}})}getVideoDuration(fileBlob){return new Promise((resolve,reject)=>{let video=document.createElement("video");video.preload="metadata",video.onloadedmetadata=()=>{window.URL.revokeObjectURL(video.src),resolve(video.duration)},video.onerror=error=>{reject(error)},video.src=URL.createObjectURL(fileBlob)})}getOutputFilenamesForIntervalBasedParameters(interval,videoDuration,extension){let filenames=[],numberOfFrames=videoDuration/interval;for(let i=1;i<=numberOfFrames;i++){let filenumber=i.toString().padStart(outputFileDigits,"0");filenames.push(`${outputFilePrefix}_${filenumber}.${extension}`)}return filenames}getInParametersForIntervalBasedExtraction(filename,rate,scale){let inParameters=["-i",filename,"-vf"];return scale?inParameters.push(`fps=${rate},${scale}`):inParameters.push(`fps=${rate}`),inParameters}};var Main=class{constructor(){this.ffmpegService=FfmpegService.getInstance();this.frameExtractorService=FrameExtractorService.getInstance();this.filmstripService=FilmstripService.getInstance();this.initializeFramo=()=>this.ffmpegService.initializeFramo();this.extractFrames=config2=>this.frameExtractorService.extractFrames(config2);this.makeFilmstrip=config2=>this.filmstripService.makeFilmstrip(config2)}initializationGuard(){if(!this.ffmpegService.isReady)throw new Error(ERROR_MESSAGES.FRAMO_NOT_INITIALIZED);return this}};var FramoImageExtension;(function(FramoImageExtension2){FramoImageExtension2.JPEG="jpeg",FramoImageExtension2.JPG="jpg",FramoImageExtension2.PNG="png",FramoImageExtension2.BMP="bmp"})(FramoImageExtension||(FramoImageExtension={}));var Framo=class{constructor(){this._ffmpegService=FfmpegService.getInstance();this._main=new Main;this.initializeFramo=()=>this._main.initializeFramo();this.extractFrames=config2=>this._main.initializationGuard().extractFrames(config2);this.makeFilmstrip=config2=>this._main.initializationGuard().makeFilmstrip(config2);this.progress=this._ffmpegService.progress;this.ready=this._ffmpegService.ready}}; | ||
/*! ***************************************************************************** | ||
@@ -1601,0 +6,0 @@ Copyright (c) Microsoft Corporation. |
{ | ||
"name": "framo", | ||
"version": "0.0.10", | ||
"version": "0.0.11", | ||
"description": "Awesome out-of-the-box media features with zero-config client-side processing and Typescript support", | ||
@@ -34,3 +34,3 @@ "author": "Aditya Krishnan <adityakrshnn@gmail.com>", | ||
"bp": "npm run lint && npm run build && npm run esbuild-browser && npm run docs", | ||
"esbuild-browser": "esbuild src/browser.ts --bundle --minify --target=es6 --format=cjs --outfile=dist/esbuild/browser.js", | ||
"esbuild-browser": "esbuild src/browser.ts --bundle --minify-whitespace --minify-syntax --target=es6 --format=cjs --outfile=dist/esbuild/browser.js", | ||
"esbuild-browser:dev": "esbuild src/browser.ts --bundle --target=es6 --format=cjs --outfile=dist/esbuild/browser.js", | ||
@@ -37,0 +37,0 @@ "esbuild-browser:watch": "esbuild src/browser.ts --bundle --target=es6 --format=cjs --watch --outfile=dist/esbuild/browser.js", |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
97906
898