mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
bump dev version
This commit is contained in:
parent
6daced8387
commit
48a576778f
28 changed files with 443 additions and 326 deletions
25
dashboard-ui/thirdparty/apiclient/apiclient.js
vendored
25
dashboard-ui/thirdparty/apiclient/apiclient.js
vendored
|
@ -148,11 +148,14 @@
|
|||
}
|
||||
|
||||
if (includeAuthorization !== false) {
|
||||
|
||||
var currentServerInfo = self.serverInfo();
|
||||
|
||||
if (clientName) {
|
||||
|
||||
var auth = 'MediaBrowser Client="' + clientName + '", Device="' + deviceName + '", DeviceId="' + deviceId + '", Version="' + applicationVersion + '"';
|
||||
|
||||
var userId = serverInfo.UserId;
|
||||
var userId = currentServerInfo.UserId;
|
||||
|
||||
if (userId) {
|
||||
auth += ', UserId="' + userId + '"';
|
||||
|
@ -163,7 +166,7 @@
|
|||
};
|
||||
}
|
||||
|
||||
var accessToken = serverInfo.AccessToken;
|
||||
var accessToken = currentServerInfo.AccessToken;
|
||||
|
||||
if (accessToken) {
|
||||
request.headers['X-MediaBrowser-Token'] = accessToken;
|
||||
|
@ -184,10 +187,12 @@
|
|||
|
||||
var newConnectionMode;
|
||||
|
||||
if (connectionMode == MediaBrowser.ConnectionMode.Local && serverInfo.RemoteAddress) {
|
||||
var currentServerInfo = self.serverInfo();
|
||||
|
||||
if (connectionMode == MediaBrowser.ConnectionMode.Local && currentServerInfo.RemoteAddress) {
|
||||
newConnectionMode = MediaBrowser.ConnectionMode.Remote;
|
||||
}
|
||||
else if (connectionMode == MediaBrowser.ConnectionMode.Remote && serverInfo.LocalAddress) {
|
||||
else if (connectionMode == MediaBrowser.ConnectionMode.Remote && currentServerInfo.LocalAddress) {
|
||||
newConnectionMode = MediaBrowser.ConnectionMode.Local;
|
||||
}
|
||||
else {
|
||||
|
@ -199,9 +204,7 @@
|
|||
|
||||
function tryReconnectInternal(deferred, connectionMode, currentRetryCount) {
|
||||
|
||||
var url = connectionMode == MediaBrowser.ConnectionMode.Local ?
|
||||
self.serverInfo().LocalAddress :
|
||||
self.serverInfo().RemoteAddress;
|
||||
var url = MediaBrowser.ServerInfo.getServerAddress(self.serverInfo(), connectionMode);
|
||||
|
||||
logger.log("Attempting reconnection to " + url);
|
||||
|
||||
|
@ -258,9 +261,7 @@
|
|||
|
||||
if (replaceUrl) {
|
||||
|
||||
var baseUrl = self.connectionMode == MediaBrowser.ConnectionMode.Local ?
|
||||
self.serverInfo().LocalAddress :
|
||||
self.serverInfo().RemoteAddress;
|
||||
var baseUrl = MediaBrowser.ServerInfo.getServerAddress(self.serverInfo(), self.connectionMode);
|
||||
|
||||
request.url = replaceServerAddress(request.url, baseUrl);
|
||||
}
|
||||
|
@ -379,7 +380,7 @@
|
|||
|
||||
self.openWebSocket = function () {
|
||||
|
||||
var accessToken = serverInfo.AccessToken;
|
||||
var accessToken = self.serverInfo().AccessToken;
|
||||
|
||||
if (!accessToken) {
|
||||
throw new Error("Cannot open web socket without access token.");
|
||||
|
@ -578,7 +579,7 @@
|
|||
self.setAuthenticationInfo(null, null);
|
||||
};
|
||||
|
||||
if (serverInfo.AccessToken) {
|
||||
if (self.serverInfo().AccessToken) {
|
||||
var url = self.getUrl("Sessions/Logout");
|
||||
|
||||
return self.ajax({
|
||||
|
|
|
@ -176,7 +176,7 @@
|
|||
|
||||
if (!apiClient) {
|
||||
|
||||
var url = self.getServerAddress(server, connectionMode);
|
||||
var url = MediaBrowser.ServerInfo.getServerAddress(server, connectionMode);
|
||||
|
||||
apiClient = new MediaBrowser.ApiClient(logger, url, appName, appVersion, deviceName, deviceId);
|
||||
|
||||
|
@ -339,7 +339,7 @@
|
|||
throw new Error("credentials.ConnectUserId cannot be null");
|
||||
}
|
||||
|
||||
var url = self.getServerAddress(server, connectionMode);
|
||||
var url = MediaBrowser.ServerInfo.getServerAddress(server, connectionMode);
|
||||
|
||||
url += "/Connect/Exchange?format=json&ConnectUserId=" + credentials.ConnectUserId;
|
||||
|
||||
|
@ -367,7 +367,7 @@
|
|||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
|
||||
var url = self.getServerAddress(server, connectionMode);
|
||||
var url = MediaBrowser.ServerInfo.getServerAddress(server, connectionMode);
|
||||
|
||||
AjaxApi.ajax({
|
||||
|
||||
|
@ -663,7 +663,7 @@
|
|||
function findServers() {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
ServerDiscovery.findServers(2000).done(function (foundServers) {
|
||||
ServerDiscovery.findServers(2500).done(function (foundServers) {
|
||||
|
||||
var servers = foundServers.map(function (foundServer) {
|
||||
|
||||
|
@ -710,26 +710,15 @@
|
|||
logger.log('Begin connect');
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
var isResolved = false;
|
||||
|
||||
if (capabilities.SupportsOfflineAccess) {
|
||||
if (!NetworkStatus.isNetworkAvailable()) {
|
||||
self.getAvailableServers().done(function (servers) {
|
||||
|
||||
deferred.resolveWith(null, [self.getOffineResult()]);
|
||||
isResolved = true;
|
||||
}
|
||||
}
|
||||
self.connectToServers(servers).done(function (result) {
|
||||
|
||||
if (!isResolved) {
|
||||
self.getAvailableServers().done(function (servers) {
|
||||
deferred.resolveWith(null, [result]);
|
||||
|
||||
self.connectToServers(servers).done(function (result) {
|
||||
|
||||
deferred.resolveWith(null, [result]);
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
|
@ -813,8 +802,7 @@
|
|||
if (tests.indexOf(MediaBrowser.ConnectionMode.Local) == -1) { tests.push(MediaBrowser.ConnectionMode.Local); }
|
||||
if (tests.indexOf(MediaBrowser.ConnectionMode.Remote) == -1) { tests.push(MediaBrowser.ConnectionMode.Remote); }
|
||||
|
||||
var isLocalNetworkAvailable = NetworkStatus.isAnyLocalNetworkAvailable();
|
||||
var sendWakeOnLan = server.WakeOnLanInfos && server.WakeOnLanInfos.length && isLocalNetworkAvailable;
|
||||
var sendWakeOnLan = server.WakeOnLanInfos && server.WakeOnLanInfos.length;
|
||||
|
||||
if (sendWakeOnLan) {
|
||||
beginWakeServer(server);
|
||||
|
@ -822,7 +810,7 @@
|
|||
|
||||
var wakeOnLanSendTime = new Date().getTime();
|
||||
|
||||
testNextConnectionMode(tests, 0, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
|
||||
testNextConnectionMode(tests, 0, server, wakeOnLanSendTime, options, deferred);
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
|
@ -832,7 +820,7 @@
|
|||
return (str1 || '').toLowerCase() == (str2 || '').toLowerCase();
|
||||
}
|
||||
|
||||
function testNextConnectionMode(tests, index, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred) {
|
||||
function testNextConnectionMode(tests, index, server, wakeOnLanSendTime, options, deferred) {
|
||||
|
||||
if (index >= tests.length) {
|
||||
|
||||
|
@ -842,16 +830,13 @@
|
|||
}
|
||||
|
||||
var mode = tests[index];
|
||||
var address = self.getServerAddress(server, mode);
|
||||
var address = MediaBrowser.ServerInfo.getServerAddress(server, mode);
|
||||
var enableRetry = false;
|
||||
var skipTest = false;
|
||||
var timeout = defaultTimeout;
|
||||
|
||||
if (mode == MediaBrowser.ConnectionMode.Local) {
|
||||
|
||||
if (!isLocalNetworkAvailable) {
|
||||
skipTest = true;
|
||||
}
|
||||
enableRetry = true;
|
||||
timeout = 5000;
|
||||
}
|
||||
|
@ -865,7 +850,7 @@
|
|||
}
|
||||
|
||||
if (skipTest || !address) {
|
||||
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
|
||||
testNextConnectionMode(tests, index + 1, server, wakeOnLanSendTime, options, deferred);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -886,10 +871,10 @@
|
|||
|
||||
// TODO: Implement delay and retry
|
||||
|
||||
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
|
||||
testNextConnectionMode(tests, index + 1, server, wakeOnLanSendTime, options, deferred);
|
||||
|
||||
} else {
|
||||
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
|
||||
testNextConnectionMode(tests, index + 1, server, wakeOnLanSendTime, options, deferred);
|
||||
|
||||
}
|
||||
});
|
||||
|
@ -949,7 +934,7 @@
|
|||
MediaBrowser.ConnectionState.ServerSignIn;
|
||||
|
||||
result.Servers.push(server);
|
||||
result.ApiClient.enableAutomaticNetworking(server, connectionMode, self.getServerAddress(server, connectionMode));
|
||||
result.ApiClient.enableAutomaticNetworking(server, connectionMode, MediaBrowser.ServerInfo.getServerAddress(server, connectionMode));
|
||||
|
||||
if (result.State == MediaBrowser.ConnectionState.SignedIn) {
|
||||
afterConnected(result.ApiClient, options);
|
||||
|
@ -960,20 +945,6 @@
|
|||
Events.trigger(self, 'connected', [result]);
|
||||
}
|
||||
|
||||
self.getServerAddress = function (server, mode) {
|
||||
|
||||
switch (mode) {
|
||||
case MediaBrowser.ConnectionMode.Local:
|
||||
return server.LocalAddress;
|
||||
case MediaBrowser.ConnectionMode.Manual:
|
||||
return server.ManualAddress;
|
||||
case MediaBrowser.ConnectionMode.Remote:
|
||||
return server.RemoteAddress;
|
||||
default:
|
||||
return server.ManualAddress || server.LocalAddress || server.RemoteAddress;
|
||||
}
|
||||
};
|
||||
|
||||
function normalizeAddress(address) {
|
||||
|
||||
if (address.toLowerCase().indexOf('http') != 0) {
|
||||
|
|
17
dashboard-ui/thirdparty/apiclient/credentials.js
vendored
17
dashboard-ui/thirdparty/apiclient/credentials.js
vendored
|
@ -94,4 +94,21 @@
|
|||
};
|
||||
};
|
||||
|
||||
globalScope.MediaBrowser.ServerInfo = {
|
||||
|
||||
getServerAddress: function (server, mode) {
|
||||
|
||||
switch (mode) {
|
||||
case MediaBrowser.ConnectionMode.Local:
|
||||
return server.LocalAddress;
|
||||
case MediaBrowser.ConnectionMode.Manual:
|
||||
return server.ManualAddress;
|
||||
case MediaBrowser.ConnectionMode.Remote:
|
||||
return server.RemoteAddress;
|
||||
default:
|
||||
return server.ManualAddress || server.LocalAddress || server.RemoteAddress;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
})(window, window.JSON);
|
|
@ -12,23 +12,97 @@
|
|||
//AndroidFullScreen.isSupported();
|
||||
|
||||
//// Is immersive mode supported?
|
||||
//AndroidFullScreen.isImmersiveModeSupported(successFunction, errorFunction);
|
||||
//AndroidFullScreen.isImmersiveModeSupported(onSuccess, onError);
|
||||
|
||||
//// The width of the screen in immersive mode
|
||||
//AndroidFullScreen.immersiveWidth(trace, errorFunction);
|
||||
//AndroidFullScreen.immersiveWidth(trace, onError);
|
||||
|
||||
//// The height of the screen in immersive mode
|
||||
//AndroidFullScreen.immersiveHeight(trace, errorFunction);
|
||||
//AndroidFullScreen.immersiveHeight(trace, onError);
|
||||
|
||||
//// Hide system UI until user interacts
|
||||
//AndroidFullScreen.leanMode(successFunction, errorFunction);
|
||||
//AndroidFullScreen.leanMode(onSuccess, onError);
|
||||
|
||||
//// Show system UI
|
||||
//AndroidFullScreen.showSystemUI(successFunction, errorFunction);
|
||||
//AndroidFullScreen.showSystemUI(onSuccess, onError);
|
||||
|
||||
//// Extend your app underneath the system UI (Android 4.4+ only)
|
||||
//AndroidFullScreen.showUnderSystemUI(successFunction, errorFunction);
|
||||
//AndroidFullScreen.showUnderSystemUI(onSuccess, onError);
|
||||
|
||||
//// Hide system UI and keep it hidden (Android 4.4+ only)
|
||||
//AndroidFullScreen.immersiveMode(successFunction, errorFunction);
|
||||
//AndroidFullScreen.immersiveMode(onSuccess, onError);
|
||||
|
||||
var currentPlayer;
|
||||
|
||||
function onPlaybackStart(e, state) {
|
||||
|
||||
var player = this;
|
||||
|
||||
if (player.isLocalPlayer && state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') {
|
||||
AndroidFullScreen.immersiveMode(onSuccess, onError);
|
||||
}
|
||||
}
|
||||
|
||||
function onPlaybackStopped(e, state) {
|
||||
|
||||
var player = this;
|
||||
|
||||
if (player.isLocalPlayer && state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') {
|
||||
AndroidFullScreen.showSystemUI(onSuccess, onError);
|
||||
}
|
||||
}
|
||||
|
||||
function bindToPlayer(player) {
|
||||
|
||||
releaseCurrentPlayer();
|
||||
|
||||
currentPlayer = player;
|
||||
|
||||
if (!player.isLocalPlayer) {
|
||||
return;
|
||||
}
|
||||
|
||||
$(player).on('playbackstart.fullscreen', onPlaybackStart)
|
||||
.on('playbackstop.fullscreen', onPlaybackStopped);
|
||||
}
|
||||
|
||||
function releaseCurrentPlayer() {
|
||||
|
||||
if (currentPlayer) {
|
||||
|
||||
$(currentPlayer).off('.fullscreen');
|
||||
}
|
||||
}
|
||||
|
||||
function updateFromSetting(leaveFullScreen) {
|
||||
|
||||
if (AppSettings.enableFullScreen()) {
|
||||
AndroidFullScreen.immersiveMode(onSuccess, onError);
|
||||
}
|
||||
else if (leaveFullScreen) {
|
||||
AndroidFullScreen.showSystemUI(onSuccess, onError);
|
||||
}
|
||||
}
|
||||
|
||||
Dashboard.ready(function () {
|
||||
|
||||
console.log('binding fullscreen to MediaController');
|
||||
|
||||
$(MediaController).on('playerchange', function () {
|
||||
|
||||
bindToPlayer(MediaController.getCurrentPlayer());
|
||||
});
|
||||
|
||||
bindToPlayer(MediaController.getCurrentPlayer());
|
||||
|
||||
updateFromSetting(false);
|
||||
|
||||
$(AppSettings).on('settingupdated', function (e, key) {
|
||||
|
||||
if (key == 'enableFullScreen') {
|
||||
updateFromSetting(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
})();
|
136
dashboard-ui/thirdparty/cordova/chromecast.js
vendored
136
dashboard-ui/thirdparty/cordova/chromecast.js
vendored
|
@ -6,6 +6,7 @@
|
|||
var currentPairedDeviceId;
|
||||
var currentDeviceFriendlyName;
|
||||
var currentWebAppSession;
|
||||
var currentDevice;
|
||||
|
||||
function chromecastPlayer() {
|
||||
|
||||
|
@ -312,6 +313,10 @@
|
|||
};
|
||||
|
||||
self.seek = function (position) {
|
||||
|
||||
position = parseInt(position);
|
||||
position = position / 10000000;
|
||||
|
||||
sendMessageToDevice({
|
||||
options: {
|
||||
position: position
|
||||
|
@ -441,18 +446,38 @@
|
|||
}
|
||||
}
|
||||
|
||||
function onSessionConnected(device, session) {
|
||||
function handleMessage(message) {
|
||||
// message could be either a string or an object
|
||||
if (typeof message === 'string') {
|
||||
onMessage(JSON.parse(message));
|
||||
} else {
|
||||
onMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
function handleSessionDisconnect() {
|
||||
console.log("session disconnected");
|
||||
|
||||
cleanupSession();
|
||||
MediaController.removeActivePlayer(PlayerName);
|
||||
}
|
||||
|
||||
function setupWebAppSession(device, session) {
|
||||
|
||||
// hold on to a reference
|
||||
currentWebAppSession = session.acquire();
|
||||
|
||||
session.connect().success(function () {
|
||||
currentWebAppSession.on('message', handleMessage);
|
||||
currentWebAppSession.on('disconnect', handleSessionDisconnect);
|
||||
|
||||
currentWebAppSession.connect().success(function () {
|
||||
|
||||
console.log('session.connect succeeded');
|
||||
|
||||
MediaController.setActivePlayer(PlayerName, convertDeviceToTarget(device));
|
||||
currentDeviceFriendlyName = device.getFriendlyName();
|
||||
currentPairedDeviceId = device.getId();
|
||||
currentDevice = device;
|
||||
|
||||
$(castPlayer).trigger('connect');
|
||||
|
||||
|
@ -460,34 +485,32 @@
|
|||
options: {},
|
||||
command: 'Identify'
|
||||
});
|
||||
});
|
||||
|
||||
session.on('message', function (message) {
|
||||
// message could be either a string or an object
|
||||
if (typeof message === 'string') {
|
||||
onMessage(JSON.parse(message));
|
||||
} else {
|
||||
onMessage(message);
|
||||
}
|
||||
});
|
||||
|
||||
session.on('disconnect', function () {
|
||||
|
||||
console.log("session disconnected");
|
||||
|
||||
if (currentPairedDeviceId == device.getId()) {
|
||||
onDisconnected();
|
||||
MediaController.removeActivePlayer(PlayerName);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}).error(handleSessionError);
|
||||
}
|
||||
|
||||
function onDisconnected() {
|
||||
function handleSessionError() {
|
||||
cleanupSession();
|
||||
}
|
||||
|
||||
function cleanupSession() {
|
||||
|
||||
var session = currentWebAppSession;
|
||||
|
||||
if (session) {
|
||||
// Clean up listeners
|
||||
session.off("message");
|
||||
session.off("disconnect");
|
||||
|
||||
// Release session to free up memory
|
||||
session.disconnect();
|
||||
session.release();
|
||||
}
|
||||
|
||||
currentWebAppSession = null;
|
||||
currentPairedDeviceId = null;
|
||||
currentDeviceFriendlyName = null;
|
||||
currentDevice = null;
|
||||
}
|
||||
|
||||
function launchWebApp(device) {
|
||||
|
@ -497,7 +520,7 @@
|
|||
device.getWebAppLauncher().joinWebApp(ApplicationID).success(function (session) {
|
||||
|
||||
console.log('joinWebApp success. calling onSessionConnected');
|
||||
onSessionConnected(device, session);
|
||||
setupWebAppSession(device, session);
|
||||
|
||||
}).error(function (err) {
|
||||
|
||||
|
@ -506,7 +529,7 @@
|
|||
device.getWebAppLauncher().launchWebApp(ApplicationID).success(function (session) {
|
||||
|
||||
console.log('launchWebApp success. calling onSessionConnected');
|
||||
onSessionConnected(device, session);
|
||||
setupWebAppSession(device, session);
|
||||
|
||||
}).error(function (err1) {
|
||||
|
||||
|
@ -533,46 +556,18 @@
|
|||
}, 0);
|
||||
}
|
||||
|
||||
var boundHandlers = [];
|
||||
|
||||
self.tryPair = function (target) {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
|
||||
var manager = ConnectSDK.discoveryManager;
|
||||
|
||||
var device = manager.getDeviceList().filter(function (d) {
|
||||
var device = ConnectSDK.discoveryManager.getDeviceList().filter(function (d) {
|
||||
|
||||
return d.getId() == target.id;
|
||||
})[0];
|
||||
|
||||
if (device) {
|
||||
|
||||
var deviceId = device.getId();
|
||||
currentPairingDeviceId = deviceId;
|
||||
|
||||
console.log('Will attempt to connect to Chromecast');
|
||||
|
||||
if (device.isReady()) {
|
||||
console.log('Device is already ready, calling onDeviceReady');
|
||||
onDeviceReady(device);
|
||||
} else {
|
||||
|
||||
console.log('Binding device ready handler');
|
||||
|
||||
if (boundHandlers.indexOf(deviceId) == -1) {
|
||||
|
||||
boundHandlers.push(deviceId);
|
||||
device.on("ready", function () {
|
||||
console.log('device.ready fired');
|
||||
onDeviceReady(device);
|
||||
});
|
||||
}
|
||||
|
||||
console.log('Calling device.connect');
|
||||
device.connect();
|
||||
}
|
||||
//deferred.resolve();
|
||||
self.tryPairWithDevice(device, deferred);
|
||||
|
||||
} else {
|
||||
deferred.reject();
|
||||
|
@ -581,6 +576,34 @@
|
|||
return deferred.promise();
|
||||
};
|
||||
|
||||
self.tryPairWithDevice = function (device, deferred) {
|
||||
|
||||
var deviceId = device.getId();
|
||||
currentPairingDeviceId = deviceId;
|
||||
|
||||
console.log('Will attempt to connect to Chromecast');
|
||||
|
||||
if (device.isReady()) {
|
||||
console.log('Device is already ready, calling onDeviceReady');
|
||||
onDeviceReady(device);
|
||||
} else {
|
||||
|
||||
console.log('Binding device ready handler');
|
||||
|
||||
device.on("ready", function () {
|
||||
console.log('device.ready fired');
|
||||
onDeviceReady(device);
|
||||
});
|
||||
|
||||
device.on("disconnect", function () {
|
||||
device.off("ready");
|
||||
});
|
||||
|
||||
console.log('Calling device.connect');
|
||||
device.connect();
|
||||
}
|
||||
};
|
||||
|
||||
$(MediaController).on('playerchange', function (e, newPlayer, newTarget) {
|
||||
|
||||
if (currentPairedDeviceId) {
|
||||
|
@ -588,7 +611,6 @@
|
|||
if (currentWebAppSession) {
|
||||
console.log('Disconnecting from chromecast');
|
||||
currentWebAppSession.disconnect();
|
||||
onDisconnected();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
var updatedProducts = [];
|
||||
|
||||
var unlockAlias = "premium features";
|
||||
|
||||
function updateProductInfo(p) {
|
||||
|
||||
updatedProducts = updatedProducts.filter(function (r) {
|
||||
|
@ -11,6 +13,26 @@
|
|||
updatedProducts.push(p);
|
||||
}
|
||||
|
||||
function getProduct(alias) {
|
||||
var products = updatedProducts.filter(function (r) {
|
||||
return r.alias == alias;
|
||||
});
|
||||
|
||||
return products.length ? products[0] : null;
|
||||
}
|
||||
|
||||
function hasPurchased(alias) {
|
||||
var product = getProduct(alias);
|
||||
|
||||
return product != null && product.owned;
|
||||
}
|
||||
|
||||
function isPurchaseAvailable(alias) {
|
||||
var product = getProduct(alias);
|
||||
|
||||
return product != null && product.canPurchase;
|
||||
}
|
||||
|
||||
function isAndroid() {
|
||||
|
||||
var platform = (device.platform || '').toLowerCase();
|
||||
|
@ -29,7 +51,7 @@
|
|||
validateFeature({
|
||||
|
||||
id: 'appunlock',
|
||||
alias: "premium features"
|
||||
alias: unlockAlias
|
||||
|
||||
}, deferred);
|
||||
}
|
||||
|
@ -45,7 +67,7 @@
|
|||
validateFeature({
|
||||
|
||||
id: 'premiumunlock',
|
||||
alias: "premium features"
|
||||
alias: unlockAlias
|
||||
|
||||
}, deferred);
|
||||
}
|
||||
|
@ -61,7 +83,7 @@
|
|||
validateFeature({
|
||||
|
||||
id: 'premiumunlock',
|
||||
alias: "premium features"
|
||||
alias: unlockAlias
|
||||
|
||||
}, deferred);
|
||||
}
|
||||
|
@ -78,24 +100,20 @@
|
|||
|
||||
function validateFeature(info, deferred) {
|
||||
|
||||
var products = updatedProducts.filter(function (r) {
|
||||
return r.alias == info.alias;
|
||||
});
|
||||
|
||||
var product = products.length ? products[0] : null;
|
||||
|
||||
if (product && product.owned) {
|
||||
if (hasPurchased(info.alias)) {
|
||||
deferred.resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
var productInfo = {
|
||||
enableSupporterUnlock: isAndroid(),
|
||||
enableAppUnlock: product != null && product.canPurchase
|
||||
enableAppUnlock: isPurchaseAvailable(info.alias)
|
||||
};
|
||||
|
||||
var prefix = isAndroid() ? 'android' : 'ios';
|
||||
|
||||
// Get supporter status
|
||||
getRegistrationInfo('appunlock', productInfo.enableSupporterUnlock).done(function (registrationInfo) {
|
||||
getRegistrationInfo(prefix + 'appunlock', productInfo.enableSupporterUnlock).done(function (registrationInfo) {
|
||||
|
||||
if (registrationInfo.IsRegistered) {
|
||||
deferred.resolve();
|
||||
|
@ -267,38 +285,32 @@
|
|||
|
||||
function initializeStore() {
|
||||
|
||||
if (isAndroid()) {
|
||||
return;
|
||||
}
|
||||
// Let's set a pretty high verbosity level, so that we see a lot of stuff
|
||||
// in the console (reassuring us that something is happening).
|
||||
store.verbosity = store.INFO;
|
||||
|
||||
store.validator = validateProduct;
|
||||
|
||||
if (isAndroid) {
|
||||
store.register({
|
||||
id: "premiumunlock",
|
||||
alias: "premium features",
|
||||
type: store.NON_CONSUMABLE
|
||||
});
|
||||
} else {
|
||||
|
||||
// iOS
|
||||
store.register({
|
||||
id: "appunlock",
|
||||
alias: "premium features",
|
||||
type: store.NON_CONSUMABLE
|
||||
});
|
||||
}
|
||||
// iOS
|
||||
store.register({
|
||||
id: "appunlock",
|
||||
alias: unlockAlias,
|
||||
type: store.NON_CONSUMABLE
|
||||
});
|
||||
|
||||
// When purchase of the full version is approved,
|
||||
// show some logs and finish the transaction.
|
||||
store.when("premium feautres").approved(function (order) {
|
||||
store.when(unlockAlias).approved(function (order) {
|
||||
log('You just unlocked the FULL VERSION!');
|
||||
order.finish();
|
||||
});
|
||||
|
||||
// The play button can only be accessed when the user
|
||||
// owns the full version.
|
||||
store.when("premium feautres").updated(function (product) {
|
||||
store.when(unlockAlias).updated(function (product) {
|
||||
|
||||
updateProductInfo(product);
|
||||
});
|
||||
|
@ -309,11 +321,11 @@
|
|||
store.ready(function () {
|
||||
|
||||
console.log("Store ready");
|
||||
|
||||
// After we've done our setup, we tell the store to do
|
||||
// it's first refresh. Nothing will happen if we do not call store.refresh()
|
||||
store.refresh();
|
||||
});
|
||||
|
||||
// After we've done our setup, we tell the store to do
|
||||
// it's first refresh. Nothing will happen if we do not call store.refresh()
|
||||
store.refresh();
|
||||
}
|
||||
|
||||
// We must wait for the "deviceready" event to fire
|
||||
|
|
|
@ -48,25 +48,23 @@
|
|||
return deferred.promise();
|
||||
}
|
||||
|
||||
var isTimedOut = false;
|
||||
var timeout;
|
||||
var socketId;
|
||||
|
||||
function onTimerExpired() {
|
||||
deferred.resolveWith(null, [servers]);
|
||||
|
||||
if (socketId) {
|
||||
chrome.sockets.udp.onReceive.removeListener(onReceive);
|
||||
closeSocket(socketId);
|
||||
}
|
||||
}
|
||||
|
||||
function startTimer() {
|
||||
|
||||
console.log('starting udp receive timer with timeout ms: ' + timeoutMs);
|
||||
|
||||
timeout = setTimeout(function () {
|
||||
|
||||
isTimedOut = true;
|
||||
deferred.resolveWith(null, [servers]);
|
||||
|
||||
if (socketId) {
|
||||
chrome.sockets.udp.onReceive.removeListener(onReceive);
|
||||
closeSocket(socketId);
|
||||
}
|
||||
|
||||
}, timeoutMs);
|
||||
timeout = setTimeout(onTimerExpired, timeoutMs);
|
||||
}
|
||||
|
||||
function onReceive(info) {
|
||||
|
@ -98,48 +96,42 @@
|
|||
|
||||
var port = 7359;
|
||||
console.log('chrome.sockets.udp.create');
|
||||
|
||||
startTimer();
|
||||
|
||||
chrome.sockets.udp.create(function (createInfo) {
|
||||
|
||||
if (!createInfo) {
|
||||
console.log('create fail');
|
||||
deferred.resolveWith(null, [servers]);
|
||||
return;
|
||||
}
|
||||
if (!createInfo.socketId) {
|
||||
console.log('create fail');
|
||||
deferred.resolveWith(null, [servers]);
|
||||
return;
|
||||
}
|
||||
|
||||
socketId = createInfo.socketId;
|
||||
|
||||
console.log('chrome.sockets.udp.bind');
|
||||
|
||||
chrome.sockets.udp.bind(createInfo.socketId, '0.0.0.0', 0, function (bindResult) {
|
||||
|
||||
if (getResultCode(bindResult) != 0) {
|
||||
console.log('bind fail: ' + bindResult);
|
||||
deferred.resolveWith(null, [servers]);
|
||||
closeSocket(createInfo.socketId);
|
||||
return;
|
||||
}
|
||||
|
||||
var data = stringToArrayBuffer('who is EmbyServer?');
|
||||
|
||||
console.log('chrome.sockets.udp.send');
|
||||
|
||||
chrome.sockets.udp.send(createInfo.socketId, data, '255.255.255.255', port, function (sendResult) {
|
||||
|
||||
if (getResultCode(sendResult) != 0) {
|
||||
console.log('send fail: ' + sendResult);
|
||||
deferred.resolveWith(null, [servers]);
|
||||
closeSocket(createInfo.socketId);
|
||||
|
||||
} else {
|
||||
|
||||
console.log('sendTo: success ' + port);
|
||||
|
||||
startTimer();
|
||||
chrome.sockets.udp.onReceive.addListener(onReceive);
|
||||
console.log('sendTo: success ' + port);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -163,10 +155,10 @@
|
|||
|
||||
}).fail(function () {
|
||||
|
||||
deferred.reject();
|
||||
deferred.resolveWith(null, [[]]);
|
||||
});
|
||||
} catch (err) {
|
||||
deferred.reject();
|
||||
deferred.resolveWith(null, [[]]);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
10
dashboard-ui/thirdparty/jquery.unveil-custom.js
vendored
10
dashboard-ui/thirdparty/jquery.unveil-custom.js
vendored
|
@ -15,12 +15,10 @@
|
|||
|
||||
function getThreshold() {
|
||||
|
||||
if (window.AppInfo && AppInfo.hasLowImageBandwidth) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Test search before setting to 0
|
||||
return 100;
|
||||
// If less than 100, the search window ends up not getting images
|
||||
// If less than 200, this happens on the home page
|
||||
// Need to fix those before this can be set to 0
|
||||
return 200;
|
||||
}
|
||||
|
||||
$.fn.unveil = function () {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue