VulpesOS/assets/webapps/camera.gaiamobile.org/js/controllers/media.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

151 lines
No EOL
5.1 KiB
JavaScript

define([
'require',
'exports',
'module',
'debug',
'lib/bind-all'
], function (require, exports, module) {
'use strict';
var debug = require('debug')('controller:media');
var bindAll = require('lib/bind-all');
module.exports = function (app) {
return new MediaController(app);
};
module.exports.MediaController = MediaController;
function MediaController(app) {
bindAll(this);
this.app = app;
this.require = app.require;
this.settings = app.settings;
this.bindEvents();
this.configure();
debug('initialized');
}
MediaController.prototype.bindEvents = function () {
this.app.on('storage:itemdeleted', this.onItemDeleted);
this.app.on('previewgallery:deletevideo', this.onItemDeleted);
this.app.on('previewgallery:deletepicture', this.onItemDeleted);
this.app.on('storage:changed', this.onStorageChanged);
this.app.on('newmedia', this.onNewMedia);
this.app.on('hidden', this.onHidden);
this.app.on('lazyloaded', this.configured);
var self = this;
this.app.once('capture', function () {
var lib = [
'lib/create-thumbnail-image',
'lib/prepare-preview-blob'
];
self.require(lib, function () {
});
});
debug('events bound');
};
MediaController.prototype.configure = function () {
this.items = [];
this.currentItem = null;
var dpr = window.devicePixelRatio;
this.thumbnailSize = {
width: this.settings.previewGallery.get('thumbnailWidth') * dpr,
height: this.settings.previewGallery.get('thumbnailHeight') * dpr
};
this.configured();
};
MediaController.prototype.configured = function () {
this.app.emit('media:configured', this.items);
};
MediaController.prototype.onNewMedia = function (item) {
if (this.app.activity.pick) {
return;
}
var self = this;
if (item.isVideo) {
addNewMedia(item);
} else {
this.require(['lib/prepare-preview-blob'], function (preparePreview) {
preparePreview(item.blob, function (metadata) {
metadata.blob = item.blob;
metadata.filepath = item.filepath;
addNewMedia(metadata);
});
});
}
function addNewMedia(item) {
self.items.unshift(item);
self.updateThumbnail();
}
};
MediaController.prototype.onStorageChanged = function (status) {
if (status === 'unavailable') {
this.configure();
this.updateThumbnail();
}
};
MediaController.prototype.onHidden = function () {
if (this.app.inSecureMode) {
this.configure();
this.updateThumbnail();
}
};
MediaController.prototype.updateThumbnail = function () {
var media = this.items[0] || null;
if (media === this.currentItem) {
return;
}
if (media === null) {
this.app.emit('newthumbnail', null);
return;
}
var blob;
var metadata = {
rotation: media.rotation,
mirrored: media.mirrored
};
if (media.isVideo) {
blob = media.poster.blob;
metadata.width = media.poster.width;
metadata.height = media.poster.height;
} else {
if (media.preview) {
var fullRatio = media.width / media.height;
var previewRatio = media.preview.width / media.preview.height;
if (Math.abs(fullRatio - previewRatio) < 0.01) {
blob = media.blob.slice(media.preview.start, media.preview.end, 'image/jpeg');
metadata.width = media.preview.width;
metadata.height = media.preview.height;
}
}
if (!blob) {
blob = media.blob;
metadata.width = media.width;
metadata.height = media.height;
}
}
var self = this;
this.require(['lib/create-thumbnail-image'], function (createThumbnailImage) {
createThumbnailImage(blob, metadata, self.thumbnailSize, thumb => {
self.currentItem = media;
self.app.emit('newthumbnail', thumb);
});
});
};
MediaController.prototype.onItemDeleted = function (data) {
var deleteIdx = -1;
var deletedFilepath = typeof data === 'object' ? data.path : data;
for (var n = 0; n < this.items.length; n++) {
if (this.items[n].filepath === deletedFilepath) {
deleteIdx = n;
break;
}
}
if (n === this.items.length) {
return;
}
var item = this.items[deleteIdx];
if (item.resizing) {
return;
}
this.items.splice(deleteIdx, 1);
this.updateThumbnail();
this.app.emit('media:deleted');
};
});