jellyfin-web/dashboard-ui/components/apphost.js
2016-08-26 13:24:04 -04:00

190 lines
4.9 KiB
JavaScript

define(['appStorage', 'browser'], function (appStorage, browser) {
function getDeviceProfile() {
// TODO
return null;
}
function getCapabilities() {
var caps = {
PlayableMediaTypes: ['Audio', 'Video'],
SupportsPersistentIdentifier: false,
DeviceProfile: getDeviceProfile()
};
return caps;
}
function generateDeviceId() {
return new Promise(function (resolve, reject) {
require(["cryptojs-sha1"], function () {
var keys = [];
keys.push(navigator.userAgent);
keys.push(new Date().getTime());
resolve(CryptoJS.SHA1(keys.join('|')).toString());
});
});
}
function getDeviceId() {
var key = '_deviceId2';
var deviceId = appStorage.getItem(key);
if (deviceId) {
return Promise.resolve(deviceId);
} else {
return generateDeviceId().then(function (deviceId) {
appStorage.setItem(key, deviceId);
return deviceId;
});
}
}
function getDeviceName() {
var deviceName;
if (browser.tizen) {
deviceName = "Samsung Smart TV";
} else if (browser.web0S) {
deviceName = "LG Smart TV";
} else if (browser.operaTv) {
deviceName = "Opera TV";
} else if (browser.xboxOne) {
deviceName = "Xbox One";
} else if (browser.ps4) {
deviceName = "Sony PS4";
} else if (browser.chrome) {
deviceName = "Chrome";
} else if (browser.edge) {
deviceName = "Edge";
} else if (browser.firefox) {
deviceName = "Firefox";
} else if (browser.msie) {
deviceName = "Internet Explorer";
} else {
deviceName = "Web Browser";
}
if (browser.version) {
deviceName += " " + browser.version;
}
if (browser.ipad) {
deviceName += " Ipad";
} else if (browser.iphone) {
deviceName += " Iphone";
} else if (browser.android) {
deviceName += " Android";
}
return deviceName;
}
function supportsVoiceInput() {
if (browser.tv) {
return false;
}
return window.SpeechRecognition ||
window.webkitSpeechRecognition ||
window.mozSpeechRecognition ||
window.oSpeechRecognition ||
window.msSpeechRecognition;
}
var appInfo;
var version = window.dashboardVersion || '3.0';
return {
getWindowState: function () {
return document.windowState || 'Normal';
},
setWindowState: function (state) {
alert('setWindowState is not supported and should not be called');
},
exit: function () {
if (browser.tizen) {
try {
tizen.application.getCurrentApplication().exit();
} catch (err) {
console.log('error closing application: ' + err);
}
return;
}
window.close();
},
supports: function (command) {
var features = [
'filedownload',
'sharing',
'externalpremium'
];
if (browser.operaTv || browser.tizen || browser.web0s) {
features.push('exit');
} else {
features.push('exitmenu');
}
if (!browser.operaTv) {
features.push('externallinks');
}
if (supportsVoiceInput()) {
features.push('voiceinput');
}
var userAgent = navigator.userAgent.toLowerCase();
if (!browser.mobile || userAgent.indexOf('msapphost') != -1) {
features.push('htmlaudioautoplay');
features.push('htmlvideoautoplay');
}
if (window.SyncRegistered) {
//features.push('sync');
}
return features.indexOf(command.toLowerCase()) != -1;
},
unlockedFeatures: function () {
var features = [];
features.push('playback');
return features;
},
appInfo: function () {
if (appInfo) {
return Promise.resolve(appInfo);
}
return getDeviceId().then(function (deviceId) {
appInfo = {
deviceId: deviceId,
deviceName: getDeviceName(),
appName: 'Emby Mobile',
appVersion: version
};
return appInfo;
});
},
capabilities: getCapabilities,
moreIcon: browser.safari || browser.edge ? 'dots-horiz' : 'dots-vert'
};
});