mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update javascript connection manager to latest feature set
This commit is contained in:
parent
12e5298463
commit
f7bb1a627d
11 changed files with 494 additions and 217 deletions
|
@ -1026,7 +1026,8 @@
|
|||
AudioStreamIndex: mediaSource.DefaultAudioStreamIndex,
|
||||
deviceId: ApiClient.deviceId(),
|
||||
Static: false,
|
||||
mediaSourceId: mediaSource.Id
|
||||
mediaSourceId: mediaSource.Id,
|
||||
api_key: ApiClient.accessToken()
|
||||
};
|
||||
|
||||
if (selectedSubtitleStream && (!self.supportsSubtitleStreamExternally(selectedSubtitleStream) || !self.supportsTextTracks())) {
|
||||
|
@ -1147,7 +1148,8 @@
|
|||
|
||||
var textStream = textStreams[i];
|
||||
var textStreamUrl = ApiClient.getUrl('Videos/' + item.Id + '/' + mediaSource.Id + '/Subtitles/' + textStream.Index + '/Stream.vtt', {
|
||||
startPositionTicks: (startPosition || 0)
|
||||
startPositionTicks: (startPosition || 0),
|
||||
api_key: ApiClient.accessToken()
|
||||
});
|
||||
|
||||
var defaultAttribute = textStream.Index == mediaSource.DefaultSubtitleStreamIndex ? ' default' : '';
|
||||
|
|
|
@ -1293,7 +1293,8 @@
|
|||
audioBitrate: 128000,
|
||||
StartTimeTicks: startPositionTicks,
|
||||
mediaSourceId: mediaSource.Id,
|
||||
deviceId: ApiClient.deviceId()
|
||||
deviceId: ApiClient.deviceId(),
|
||||
api_key: ApiClient.accessToken()
|
||||
};
|
||||
|
||||
var sourceContainer = (mediaSource.Container || '').toLowerCase();
|
||||
|
|
|
@ -337,7 +337,7 @@
|
|||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
ConnectionManager.getServers().done(function (servers) {
|
||||
ConnectionManager.getAvailableServers().done(function (servers) {
|
||||
|
||||
renderServers(page, servers);
|
||||
|
||||
|
|
|
@ -1336,7 +1336,7 @@ var Dashboard = {
|
|||
SupportsPersistentIdentifier: false
|
||||
};
|
||||
|
||||
window.ConnectionManager = new MediaBrowser.ConnectionManager(jQuery, Logger, credentialProvider, appName, appVersion, deviceName, deviceId, capabilities);
|
||||
window.ConnectionManager = new MediaBrowser.ConnectionManager(Logger, credentialProvider, appName, appVersion, deviceName, deviceId, capabilities);
|
||||
|
||||
if (Dashboard.isConnectMode()) {
|
||||
|
||||
|
@ -1347,7 +1347,7 @@ var Dashboard = {
|
|||
|
||||
if (!Dashboard.isServerlessPage()) {
|
||||
if (Dashboard.serverAddress() && Dashboard.getCurrentUserId() && Dashboard.getAccessToken()) {
|
||||
window.ApiClient = new MediaBrowser.ApiClient(jQuery, Logger, Dashboard.serverAddress(), appName, appVersion, deviceName, deviceId, capabilities);
|
||||
window.ApiClient = new MediaBrowser.ApiClient(Logger, Dashboard.serverAddress(), appName, appVersion, deviceName, deviceId, capabilities);
|
||||
|
||||
ApiClient.setCurrentUserId(Dashboard.getCurrentUserId(), Dashboard.getAccessToken());
|
||||
|
||||
|
@ -1362,7 +1362,7 @@ var Dashboard = {
|
|||
|
||||
} else {
|
||||
|
||||
window.ApiClient = new MediaBrowser.ApiClient(jQuery, Logger, Dashboard.serverAddress(), appName, appVersion, deviceName, deviceId, capabilities);
|
||||
window.ApiClient = new MediaBrowser.ApiClient(Logger, Dashboard.serverAddress(), appName, appVersion, deviceName, deviceId, capabilities);
|
||||
|
||||
ApiClient.setCurrentUserId(Dashboard.getCurrentUserId(), Dashboard.getAccessToken());
|
||||
|
||||
|
|
16
dashboard-ui/thirdparty/apiclient/ajax.js
vendored
Normal file
16
dashboard-ui/thirdparty/apiclient/ajax.js
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
(function (globalScope) {
|
||||
|
||||
globalScope.AjaxApi = {
|
||||
|
||||
param: function(params) {
|
||||
return jQuery.param(params);
|
||||
},
|
||||
|
||||
ajax: function(request) {
|
||||
|
||||
return jQuery.ajax(request);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
})(window);
|
|
@ -14,10 +14,11 @@
|
|||
|
||||
globalScope.MediaBrowser.ConnectionMode = {
|
||||
Local: 0,
|
||||
Remote: 1
|
||||
Remote: 1,
|
||||
Manual: 2
|
||||
};
|
||||
|
||||
globalScope.MediaBrowser.ConnectionManager = function ($, logger, credentialProvider, appName, appVersion, deviceName, deviceId, capabilities) {
|
||||
globalScope.MediaBrowser.ConnectionManager = function (logger, credentialProvider, appName, appVersion, deviceName, deviceId, capabilities) {
|
||||
|
||||
logger.log('Begin MediaBrowser.ConnectionManager constructor');
|
||||
|
||||
|
@ -63,10 +64,14 @@
|
|||
|
||||
function tryConnect(url, timeout) {
|
||||
|
||||
return $.ajax({
|
||||
url += "/system/info/public";
|
||||
|
||||
logger.log('tryConnect url: ' + url);
|
||||
|
||||
return AjaxApi.ajax({
|
||||
|
||||
type: "GET",
|
||||
url: url + "/system/info/public",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
|
||||
timeout: timeout || 15000
|
||||
|
@ -116,7 +121,7 @@
|
|||
updateServerInfo(server, systemInfo);
|
||||
|
||||
apiClient.serverInfo(server);
|
||||
$(self).trigger('apiclientcreated', [apiClient]);
|
||||
Events.trigger(self, 'apiclientcreated', [apiClient]);
|
||||
|
||||
if (enableAutomaticNetworking) {
|
||||
self.connectToServer(server);
|
||||
|
@ -125,10 +130,10 @@
|
|||
|
||||
};
|
||||
|
||||
function onConnectAuthenticated(user) {
|
||||
function onConnectUserSignIn(user) {
|
||||
|
||||
connectUser = user;
|
||||
$(self).trigger('connectusersignedin', [user]);
|
||||
Events.trigger(self, 'connectusersignedin', [user]);
|
||||
}
|
||||
|
||||
function getOrAddApiClient(server, connectionMode) {
|
||||
|
@ -139,38 +144,35 @@
|
|||
|
||||
var url = connectionMode == MediaBrowser.ConnectionMode.Local ? server.LocalAddress : server.RemoteAddress;
|
||||
|
||||
apiClient = new MediaBrowser.ApiClient($, logger, url, appName, appVersion, deviceName, deviceId, capabilities);
|
||||
apiClient = new MediaBrowser.ApiClient(logger, url, appName, appVersion, deviceName, deviceId, capabilities);
|
||||
|
||||
apiClients.push(apiClient);
|
||||
|
||||
apiClient.serverInfo(server);
|
||||
|
||||
$(apiClient).on('authenticated', function (e, result) {
|
||||
onLocalAuthenticated(this, result, true);
|
||||
Events.on(apiClient, 'authenticated', function (e, result) {
|
||||
onAuthenticated(this, result, {}, true);
|
||||
});
|
||||
|
||||
$(self).trigger('apiclientcreated', [apiClient]);
|
||||
|
||||
Events.trigger(self, 'apiclientcreated', [apiClient]);
|
||||
}
|
||||
|
||||
if (!server.AccessToken) {
|
||||
|
||||
apiClient.clearAuthenticationInfo();
|
||||
}
|
||||
else {
|
||||
if (server.AccessToken) {
|
||||
|
||||
apiClient.setAuthenticationInfo(server.AccessToken, server.UserId);
|
||||
}
|
||||
else {
|
||||
|
||||
apiClient.clearAuthenticationInfo();
|
||||
}
|
||||
|
||||
logger.log('returning instance from getOrAddApiClient');
|
||||
return apiClient;
|
||||
}
|
||||
|
||||
function onLocalAuthenticated(apiClient, result, saveCredentials) {
|
||||
|
||||
apiClient.getSystemInfo().done(function (systemInfo) {
|
||||
function onAuthenticated(apiClient, result, options, saveCredentials) {
|
||||
|
||||
var server = apiClient.serverInfo;
|
||||
updateServerInfo(server, systemInfo);
|
||||
|
||||
var credentials = credentialProvider.credentials();
|
||||
|
||||
|
@ -185,42 +187,61 @@
|
|||
}
|
||||
|
||||
credentials.addOrUpdateServer(credentials.servers, server);
|
||||
saveUserInfoIntoCredentials(server, result.User);
|
||||
credentialProvider.credentials(credentials);
|
||||
|
||||
ensureWebSocket(apiClient);
|
||||
afterConnected(apiClient, options);
|
||||
|
||||
onLocalUserSignIn(result.User);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function ensureWebSocket(apiClient) {
|
||||
function saveUserInfoIntoCredentials(server, user) {
|
||||
|
||||
//ServerUserInfo info = new ServerUserInfo();
|
||||
//info.setIsSignedInOffline(true);
|
||||
//info.setId(user.getId());
|
||||
|
||||
//// Record user info here
|
||||
//server.AddOrUpdate(info);
|
||||
}
|
||||
|
||||
function afterConnected(apiClient, options) {
|
||||
|
||||
options = options || {};
|
||||
|
||||
if (options.reportCapabilities !== false) {
|
||||
apiClient.reportCapabilities(capabilities);
|
||||
}
|
||||
|
||||
if (options.enableWebSocket !== false) {
|
||||
if (!apiClient.isWebSocketOpenOrConnecting && apiClient.isWebSocketSupported()) {
|
||||
logger.log('calling apiClient.openWebSocket');
|
||||
|
||||
apiClient.openWebSocket();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onLocalUserSignIn(user) {
|
||||
|
||||
$(self).trigger('localusersignedin', [user]);
|
||||
Events.trigger(self, 'localusersignedin', [user]);
|
||||
}
|
||||
|
||||
function ensureConnectUser(credentials) {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
if (connectUser && connectUser.Id == credentials.ConnectUserId) {
|
||||
deferred.resolveWith(null, [[]]);
|
||||
}
|
||||
|
||||
else if (credentials.ConnectAccessToken && credentials.ConnectUserId) {
|
||||
else if (credentials.ConnectUserId && credentials.ConnectAccessToken) {
|
||||
|
||||
connectUser = null;
|
||||
|
||||
getConnectUser(credentials.ConnectUserId, credentials.ConnectAccessToken).done(function (user) {
|
||||
|
||||
onConnectAuthenticated(user);
|
||||
onConnectUserSignIn(user);
|
||||
deferred.resolveWith(null, [[]]);
|
||||
|
||||
}).fail(function () {
|
||||
|
@ -245,7 +266,7 @@
|
|||
|
||||
var url = "https://connect.mediabrowser.tv/service/user?id=" + userId;
|
||||
|
||||
return $.ajax({
|
||||
return AjaxApi.ajax({
|
||||
type: "GET",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
|
@ -270,7 +291,7 @@
|
|||
|
||||
url += "/Connect/Exchange?format=json&ConnectUserId=" + credentials.ConnectUserId;
|
||||
|
||||
return $.ajax({
|
||||
return AjaxApi.ajax({
|
||||
type: "GET",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
|
@ -292,11 +313,11 @@
|
|||
|
||||
function validateAuthentication(server, connectionMode) {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
var url = connectionMode == MediaBrowser.ConnectionMode.Local ? server.LocalAddress : server.RemoteAddress;
|
||||
|
||||
$.ajax({
|
||||
AjaxApi.ajax({
|
||||
|
||||
type: "GET",
|
||||
url: url + "/system/info",
|
||||
|
@ -311,7 +332,7 @@
|
|||
|
||||
if (server.UserId) {
|
||||
|
||||
$.ajax({
|
||||
AjaxApi.ajax({
|
||||
|
||||
type: "GET",
|
||||
url: url + "/users/" + server.UserId,
|
||||
|
@ -374,7 +395,7 @@
|
|||
|
||||
self.user = function () {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
var localUser;
|
||||
|
||||
|
@ -433,7 +454,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
return $.when(promises).done(function () {
|
||||
return Deferred.when(promises).done(function () {
|
||||
|
||||
var credentials = credentialProvider.credentials();
|
||||
|
||||
|
@ -442,9 +463,18 @@
|
|||
});
|
||||
|
||||
for (var j = 0, numServers = servers.length; j < numServers; j++) {
|
||||
servers[j].UserId = null;
|
||||
servers[j].AccessToken = null;
|
||||
servers[j].ExchangeToken = null;
|
||||
|
||||
var server = servers[j];
|
||||
server.UserId = null;
|
||||
server.AccessToken = null;
|
||||
server.ExchangeToken = null;
|
||||
|
||||
var serverUsers = server.Users || [];
|
||||
|
||||
for (var k = 0, numUsers = serverUsers.length; k < numUsers; k++) {
|
||||
|
||||
serverUsers[k].IsSignedInOffline = false;
|
||||
}
|
||||
}
|
||||
|
||||
credentials.servers = servers;
|
||||
|
@ -453,9 +483,10 @@
|
|||
|
||||
credentialProvider.credentials(credentials);
|
||||
|
||||
if (connectUser) {
|
||||
connectUser = null;
|
||||
|
||||
$(self).trigger('signedout');
|
||||
Events.trigger(self, 'connectusersignedout');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -463,7 +494,7 @@
|
|||
|
||||
logger.log('Begin getConnectServers');
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
if (!self.connectToken() || !self.connectUserId()) {
|
||||
deferred.resolveWith(null, [[]]);
|
||||
|
@ -472,7 +503,7 @@
|
|||
|
||||
var url = "https://connect.mediabrowser.tv/service/servers?userId=" + self.connectUserId();
|
||||
|
||||
$.ajax({
|
||||
AjaxApi.ajax({
|
||||
type: "GET",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
|
@ -505,15 +536,15 @@
|
|||
return deferred.promise();
|
||||
}
|
||||
|
||||
self.getServers = function () {
|
||||
self.getAvailableServers = function () {
|
||||
|
||||
logger.log('Begin getServers');
|
||||
logger.log('Begin getAvailableServers');
|
||||
|
||||
// Clone the array
|
||||
var credentials = credentialProvider.credentials();
|
||||
var servers = credentials.servers.slice(0);
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
getConnectServers().done(function (result) {
|
||||
|
||||
|
@ -537,9 +568,19 @@
|
|||
|
||||
logger.log('Begin connect');
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
var isResolved = false;
|
||||
|
||||
self.getServers().done(function (servers) {
|
||||
if (capabilities.SupportsOfflineAccess) {
|
||||
if (!NetworkStatus.isNetworkAvailable()) {
|
||||
|
||||
deferred.resolveWith(null, [self.getOffineResult()]);
|
||||
isResolved = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isResolved) {
|
||||
self.getAvailableServers().done(function (servers) {
|
||||
|
||||
self.connectToServers(servers).done(function (result) {
|
||||
|
||||
|
@ -547,13 +588,21 @@
|
|||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
|
||||
self.getOffineResult = function () {
|
||||
|
||||
// TODO: Implement
|
||||
};
|
||||
|
||||
self.connectToServers = function (servers) {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
logger.log('Begin connectToServers, with ' + servers.length + ' servers');
|
||||
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
if (servers.length == 1) {
|
||||
|
||||
|
@ -566,19 +615,17 @@
|
|||
MediaBrowser.ConnectionState.ServerSelection;
|
||||
}
|
||||
|
||||
logger.log('resolving connectToServers with result.State: ' + result.State);
|
||||
deferred.resolveWith(null, [result]);
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
// Find the first server with a saved access token
|
||||
var currentServer = servers.filter(function (s) {
|
||||
return s.AccessToken;
|
||||
})[0];
|
||||
|
||||
if (currentServer) {
|
||||
self.connectToServer(currentServer).done(function (result) {
|
||||
var firstServer = servers[0];
|
||||
// See if we have any saved credentials and can auto sign in
|
||||
if (firstServer) {
|
||||
self.connectToServer(firstServer).done(function (result) {
|
||||
|
||||
if (result.State == MediaBrowser.ConnectionState.SignedIn) {
|
||||
|
||||
|
@ -608,15 +655,141 @@
|
|||
return deferred.promise();
|
||||
};
|
||||
|
||||
self.connectToServer = function (server) {
|
||||
function beginWakeServer(server) {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
}
|
||||
|
||||
function onLocalServerTokenValidationDone(connectionMode, credentials) {
|
||||
self.connectToServer = function (server, options) {
|
||||
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
var tests = [];
|
||||
|
||||
if (server.LastConnectionMode) {
|
||||
tests.push(server.LastConnectionMode);
|
||||
}
|
||||
if (tests.indexOf(MediaBrowser.ConnectionMode.Manual) == -1) { tests.push(MediaBrowser.ConnectionMode.Manual); }
|
||||
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;
|
||||
|
||||
if (sendWakeOnLan) {
|
||||
beginWakeServer(server);
|
||||
}
|
||||
|
||||
var wakeOnLanSendTime = new Date().getTime();
|
||||
|
||||
testNextConnectionMode(tests, 0, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
|
||||
function stringEqualsIgnoreCase(str1, str2) {
|
||||
|
||||
return (str1 || '').toLowerCase() == (str2 || '').toLowerCase();
|
||||
}
|
||||
|
||||
function testNextConnectionMode(tests, index, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred) {
|
||||
|
||||
if (index >= tests.length) {
|
||||
|
||||
OnFailedConnection(response);
|
||||
return;
|
||||
}
|
||||
|
||||
var mode = tests[index];
|
||||
var address = self.getServerAddress(server, mode);
|
||||
var enableRetry = false;
|
||||
var skipTest = false;
|
||||
var timeout = 15000;
|
||||
|
||||
if (mode == MediaBrowser.ConnectionMode.Local) {
|
||||
|
||||
if (!isLocalNetworkAvailable) {
|
||||
skipTest = true;
|
||||
}
|
||||
enableRetry = true;
|
||||
timeout = 5000;
|
||||
}
|
||||
|
||||
else if (mode == MediaBrowser.ConnectionMode.Manual) {
|
||||
|
||||
if (stringEqualsIgnoreCase(address, server.LocalAddress) ||
|
||||
stringEqualsIgnoreCase(address, server.RemoteAddress)) {
|
||||
skipTest = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (skipTest || !address) {
|
||||
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
|
||||
return;
|
||||
}
|
||||
|
||||
tryConnect(address, timeout).done(function (result) {
|
||||
|
||||
onSuccessfulConnection(server, result, mode, options, deferred);
|
||||
|
||||
}).fail(function () {
|
||||
|
||||
if (enableRetry) {
|
||||
|
||||
var sleepTime = 10000 - (new Date().getTime() - wakeOnLanSendTime);
|
||||
|
||||
// TODO: Implement delay and retry
|
||||
|
||||
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
|
||||
});
|
||||
}
|
||||
|
||||
function onSuccessfulConnection(server, systemInfo, connectionMode, options, deferred) {
|
||||
|
||||
var credentials = credentialProvider.credentials();
|
||||
|
||||
if (credentials.ConnectAccessToken) {
|
||||
|
||||
ensureConnectUser(credentials).done(function () {
|
||||
|
||||
if (server.ExchangeToken) {
|
||||
addAuthenticationInfoFromConnect(server, connectionMode, credentials).always(function () {
|
||||
|
||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, true, options, deferred);
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, true, options, deferred);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, true, options, deferred);
|
||||
}
|
||||
}
|
||||
|
||||
function afterConnectValidated(server, credentials, systemInfo, connectionMode, verifyLocalAuthentication, options, deferred) {
|
||||
|
||||
if (verifyLocalAuthentication && server.AccessToken) {
|
||||
|
||||
validateAuthentication(server, connectionMode).done(function () {
|
||||
|
||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, false, options, deferred);
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
updateServerInfo(server, systemInfo);
|
||||
|
||||
credentialProvider.addOrUpdateServer(credentials.servers, server);
|
||||
server.DateLastAccessed = new Date().getTime();
|
||||
|
||||
server.LastConnectionMode = connectionMode;
|
||||
credentialProvider.addOrUpdateServer(credentials.servers, server);
|
||||
credentialProvider.credentials(credentials);
|
||||
|
||||
var result = {
|
||||
|
@ -628,99 +801,30 @@
|
|||
MediaBrowser.ConnectionState.SignedIn :
|
||||
MediaBrowser.ConnectionState.ServerSignIn;
|
||||
|
||||
result.Servers.push(server);
|
||||
result.ApiClient.enableAutomaticNetworking(server, connectionMode);
|
||||
|
||||
if (result.State == MediaBrowser.ConnectionState.SignedIn) {
|
||||
ensureWebSocket(result.ApiClient);
|
||||
afterConnected(result.ApiClient, options);
|
||||
}
|
||||
|
||||
result.Servers.push(server);
|
||||
|
||||
deferred.resolveWith(null, [result]);
|
||||
|
||||
$(self).trigger('connected', [result]);
|
||||
Events.trigger(self, 'connected', [result]);
|
||||
}
|
||||
|
||||
function onExchangeTokenDone(connectionMode, credentials) {
|
||||
self.getServerAddress = function (server, mode) {
|
||||
|
||||
if (server.AccessToken) {
|
||||
validateAuthentication(server, connectionMode).always(function() {
|
||||
|
||||
onLocalServerTokenValidationDone(connectionMode, credentials);
|
||||
});
|
||||
} else {
|
||||
onLocalServerTokenValidationDone(connectionMode, credentials);
|
||||
switch (mode) {
|
||||
case MediaBrowser.ConnectionMode.Local:
|
||||
return server.LocalAddress;
|
||||
case MediaBrowser.ConnectionMode.Manual:
|
||||
return server.ManualAddress;
|
||||
case MediaBrowser.ConnectionMode.Remote:
|
||||
return server.RemoteAddress;
|
||||
default:
|
||||
throw new Error("Unexpected ConnectionMode");
|
||||
}
|
||||
}
|
||||
|
||||
function onEnsureConnectUserDone(connectionMode, credentials) {
|
||||
|
||||
if (credentials.ConnectUserId && credentials.ConnectAccessToken && server.ExchangeToken) {
|
||||
|
||||
addAuthenticationInfoFromConnect(server, connectionMode, credentials).always(function() {
|
||||
|
||||
onExchangeTokenDone(connectionMode, credentials);
|
||||
});
|
||||
|
||||
} else {
|
||||
onExchangeTokenDone(connectionMode, credentials);
|
||||
}
|
||||
}
|
||||
|
||||
function onRemoteTestDone(systemInfo, connectionMode) {
|
||||
|
||||
if (systemInfo == null) {
|
||||
|
||||
resolveWithFailure(deferred);
|
||||
return;
|
||||
}
|
||||
|
||||
updateServerInfo(server, systemInfo);
|
||||
server.LastConnectionMode = connectionMode;
|
||||
var credentials = credentialProvider.credentials();
|
||||
|
||||
if (credentials.ConnectUserId && credentials.ConnectAccessToken) {
|
||||
ensureConnectUser(credentials).always(function() {
|
||||
onEnsureConnectUserDone(connectionMode, credentials);
|
||||
});
|
||||
} else {
|
||||
onEnsureConnectUserDone(connectionMode, credentials);
|
||||
}
|
||||
}
|
||||
|
||||
function onLocalTestDone(systemInfo, connectionMode) {
|
||||
|
||||
if (!systemInfo && server.RemoteAddress) {
|
||||
|
||||
// Try to connect to the local address
|
||||
tryConnect(server.RemoteAddress).done(function (result) {
|
||||
|
||||
onRemoteTestDone(result, MediaBrowser.ConnectionMode.Remote);
|
||||
|
||||
}).fail(function() {
|
||||
onRemoteTestDone();
|
||||
});
|
||||
|
||||
} else {
|
||||
onRemoteTestDone(systemInfo, connectionMode);
|
||||
}
|
||||
}
|
||||
|
||||
if (server.LocalAddress) {
|
||||
|
||||
//onLocalTestDone();
|
||||
// Try to connect to the local address
|
||||
tryConnect(server.LocalAddress, 5000).done(function (result) {
|
||||
onLocalTestDone(result, MediaBrowser.ConnectionMode.Local);
|
||||
}).fail(function () {
|
||||
onLocalTestDone();
|
||||
});
|
||||
|
||||
} else {
|
||||
onLocalTestDone();
|
||||
}
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
|
||||
self.connectToAddress = function (address) {
|
||||
|
@ -729,11 +833,16 @@
|
|||
address = "http://" + address;
|
||||
}
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
tryConnect(address).done(function (publicInfo) {
|
||||
tryConnect(address, 15000).done(function (publicInfo) {
|
||||
|
||||
var server = {};
|
||||
logger.log('connectToAddress ' + address + ' succeeded');
|
||||
|
||||
var server = {
|
||||
ManualAddress: address,
|
||||
LastConnectionMode: MediaBrowser.ConnectionMode.Manual
|
||||
};
|
||||
updateServerInfo(server, publicInfo);
|
||||
|
||||
self.connectToServer(server).done(function (result) {
|
||||
|
@ -747,6 +856,7 @@
|
|||
|
||||
}).fail(function () {
|
||||
|
||||
logger.log('connectToAddress ' + address + ' failed');
|
||||
resolveWithFailure(deferred);
|
||||
});
|
||||
|
||||
|
@ -764,7 +874,7 @@
|
|||
|
||||
var md5 = self.getConnectPasswordHash(password);
|
||||
|
||||
return $.ajax({
|
||||
return AjaxApi.ajax({
|
||||
type: "POST",
|
||||
url: "https://connect.mediabrowser.tv/service/user/authenticate",
|
||||
data: {
|
||||
|
@ -786,7 +896,7 @@
|
|||
|
||||
credentialProvider.credentials(credentials);
|
||||
|
||||
onConnectAuthenticated(result.User);
|
||||
onConnectUserSignIn(result.User);
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -825,7 +935,7 @@
|
|||
|
||||
var url = "https://connect.mediabrowser.tv/service/servers?userId=" + self.connectUserId() + "&status=Waiting";
|
||||
|
||||
return $.ajax({
|
||||
return AjaxApi.ajax({
|
||||
type: "GET",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
|
@ -851,7 +961,7 @@
|
|||
|
||||
var url = "https://connect.mediabrowser.tv/service/serverAuthorizations?serverId=" + serverId + "&userId=" + self.connectUserId();
|
||||
|
||||
return $.ajax({
|
||||
return AjaxApi.ajax({
|
||||
type: "DELETE",
|
||||
url: url,
|
||||
headers: {
|
||||
|
@ -886,7 +996,7 @@
|
|||
|
||||
var url = "https://connect.mediabrowser.tv/service/serverAuthorizations?serverId=" + serverId + "&userId=" + self.connectUserId();
|
||||
|
||||
return $.ajax({
|
||||
return AjaxApi.ajax({
|
||||
type: "DELETE",
|
||||
url: url,
|
||||
headers: {
|
||||
|
@ -911,7 +1021,7 @@
|
|||
|
||||
var url = "https://connect.mediabrowser.tv/service/ServerAuthorizations/accept?serverId=" + serverId + "&userId=" + self.connectUserId();
|
||||
|
||||
return $.ajax({
|
||||
return AjaxApi.ajax({
|
||||
type: "GET",
|
||||
url: url,
|
||||
headers: {
|
||||
|
@ -925,4 +1035,4 @@
|
|||
return self;
|
||||
};
|
||||
|
||||
})(window, window.jQuery, window.Logger);
|
||||
})(window, window.Logger);
|
16
dashboard-ui/thirdparty/apiclient/deferred.js
vendored
Normal file
16
dashboard-ui/thirdparty/apiclient/deferred.js
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
(function (globalScope) {
|
||||
|
||||
globalScope.Deferred = {
|
||||
|
||||
Deferred: function () {
|
||||
return jQuery.Deferred();
|
||||
},
|
||||
|
||||
when: function (promises) {
|
||||
|
||||
return jQuery.when(promises);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
})(window);
|
101
dashboard-ui/thirdparty/apiclient/deferredAlt.js
vendored
Normal file
101
dashboard-ui/thirdparty/apiclient/deferredAlt.js
vendored
Normal file
|
@ -0,0 +1,101 @@
|
|||
(function (globalScope) {
|
||||
|
||||
globalScope.Deferred = {
|
||||
|
||||
Deferred: function () {
|
||||
|
||||
var self = this;
|
||||
var done = [];
|
||||
var fail = [];
|
||||
var always = [];
|
||||
var isOk = false;
|
||||
var isDone = false;
|
||||
var resolveScope;
|
||||
var resolveArgs;
|
||||
|
||||
self.promise = function () {
|
||||
return this;
|
||||
};
|
||||
|
||||
self.done = function (fn) {
|
||||
if (isDone && isOk) {
|
||||
fn.apply(resolveScope || {}, resolveArgs);
|
||||
}
|
||||
else {
|
||||
done.push(fn);
|
||||
}
|
||||
return self;
|
||||
};
|
||||
|
||||
self.fail = function (fn) {
|
||||
|
||||
if (isDone && !isOk) {
|
||||
fn.apply(resolveScope || {}, resolveArgs);
|
||||
}
|
||||
else {
|
||||
fail.push(fn);
|
||||
}
|
||||
return self;
|
||||
};
|
||||
|
||||
self.always = function (fn) {
|
||||
if (isDone) {
|
||||
fn.apply(resolveScope || {}, resolveArgs);
|
||||
}
|
||||
else {
|
||||
always.push(fn);
|
||||
}
|
||||
return self;
|
||||
};
|
||||
|
||||
self.resolveWith = function (scope, args) {
|
||||
resolveScope = scope;
|
||||
resolveArgs = args;
|
||||
isOk = true;
|
||||
isDone = true;
|
||||
self.trigger();
|
||||
};
|
||||
|
||||
self.rejectWith = function (scope, args) {
|
||||
resolveScope = scope;
|
||||
resolveArgs = args;
|
||||
isOk = true;
|
||||
isDone = true;
|
||||
self.trigger();
|
||||
};
|
||||
|
||||
self.trigger = function () {
|
||||
|
||||
var i, length;
|
||||
|
||||
if (isOk) {
|
||||
var doneClone = done.splice(0);
|
||||
for (i = 0, length = doneClone.length; i < length; i++) {
|
||||
|
||||
doneClone[i].apply(resolveScope || {}, resolveArgs);
|
||||
}
|
||||
}
|
||||
else {
|
||||
var failClone = fail.splice(0);
|
||||
for (i = 0, length = failClone.length; i < length; i++) {
|
||||
|
||||
failClone[i].apply(resolveScope || {}, resolveArgs);
|
||||
}
|
||||
}
|
||||
|
||||
var alwaysClone = fail.splice(0);
|
||||
for (i = 0, length = alwaysClone.length; i < length; i++) {
|
||||
|
||||
alwaysClone[i].apply(resolveScope || {}, resolveArgs);
|
||||
}
|
||||
};
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
when: function(promises) {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
})(window);
|
23
dashboard-ui/thirdparty/apiclient/events.js
vendored
Normal file
23
dashboard-ui/thirdparty/apiclient/events.js
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
(function (globalScope) {
|
||||
|
||||
globalScope.Events = {
|
||||
|
||||
on: function (obj, eventName, fn) {
|
||||
|
||||
Logger.log('event.on ' + eventName);
|
||||
jQuery(obj).on(eventName, fn);
|
||||
},
|
||||
|
||||
off: function (obj, eventName, fn) {
|
||||
|
||||
Logger.log('event.off ' + eventName);
|
||||
jQuery(obj).off(eventName, fn);
|
||||
},
|
||||
|
||||
trigger: function (obj, eventName, params) {
|
||||
Logger.log('event.trigger ' + eventName);
|
||||
jQuery(obj).trigger('eventName', params);
|
||||
}
|
||||
};
|
||||
|
||||
})(window);
|
|
@ -10,7 +10,7 @@
|
|||
* @param {String} clientName
|
||||
* @param {String} applicationVersion
|
||||
*/
|
||||
globalScope.MediaBrowser.ApiClient = function ($, logger, serverAddress, clientName, applicationVersion, deviceName, deviceId, capabilities) {
|
||||
globalScope.MediaBrowser.ApiClient = function (logger, serverAddress, clientName, applicationVersion, deviceName, deviceId, capabilities) {
|
||||
|
||||
if (!serverAddress) {
|
||||
throw new Error("Must supply a serverAddress");
|
||||
|
@ -40,7 +40,7 @@
|
|||
serverAddress = val;
|
||||
|
||||
if (changed) {
|
||||
$(this).trigger('serveraddresschanged');
|
||||
Events.trigger(this, 'serveraddresschanged');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -96,13 +96,13 @@
|
|||
name = name.split('&').join('-');
|
||||
name = name.split('?').join('-');
|
||||
|
||||
var val = $.param({ name: name });
|
||||
var val = AjaxApi.param({ name: name });
|
||||
return val.substring(val.indexOf('=') + 1).replace("'", '%27');
|
||||
};
|
||||
|
||||
function onRequestFail(e) {
|
||||
|
||||
$(self).trigger('requestfail', [
|
||||
Events.trigger(self, 'requestfail', [
|
||||
{
|
||||
url: this.url,
|
||||
status: e.status,
|
||||
|
@ -112,7 +112,7 @@
|
|||
|
||||
function onRetryRequestFail(request) {
|
||||
|
||||
$(self).trigger('requestfail', [
|
||||
Events.trigger(self, 'requestfail', [
|
||||
{
|
||||
url: request.url
|
||||
}]);
|
||||
|
@ -148,10 +148,10 @@
|
|||
|
||||
if (!self.enableAutomaticNetwork || !self.serverInfo() || self.connectionMode == null) {
|
||||
logger.log('Requesting url without automatic networking: ' + request.url);
|
||||
return $.ajax(request).fail(onRequestFail);
|
||||
return AjaxApi.ajax(request).fail(onRequestFail);
|
||||
}
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
self.ajaxWithFailover(request, deferred, true);
|
||||
return deferred.promise();
|
||||
};
|
||||
|
@ -181,7 +181,7 @@
|
|||
|
||||
logger.log("Attempting reconnection to " + url);
|
||||
|
||||
$.ajax({
|
||||
AjaxApi.ajax({
|
||||
|
||||
type: "GET",
|
||||
url: url + "/system/info/public",
|
||||
|
@ -218,7 +218,7 @@
|
|||
|
||||
function tryReconnect() {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
setTimeout(function () {
|
||||
tryReconnectInternal(deferred, self.connectionMode, 0);
|
||||
}, 500);
|
||||
|
@ -245,7 +245,7 @@
|
|||
|
||||
request.timeout = 15000;
|
||||
|
||||
$.ajax(request).done(function (response) {
|
||||
AjaxApi.ajax(request).done(function (response) {
|
||||
|
||||
deferred.resolve(response, 0);
|
||||
|
||||
|
@ -309,7 +309,7 @@
|
|||
var url = serverAddress + "/" + name;
|
||||
|
||||
if (params) {
|
||||
url += "?" + $.param(params);
|
||||
url += "?" + AjaxApi.param(params);
|
||||
}
|
||||
|
||||
return url;
|
||||
|
@ -317,6 +317,8 @@
|
|||
|
||||
self.enableAutomaticNetworking = function (server, connectionMode) {
|
||||
|
||||
logger.log('Begin enableAutomaticNetworking');
|
||||
|
||||
self.serverInfo(server);
|
||||
self.connectionMode = connectionMode;
|
||||
self.enableAutomaticNetwork = true;
|
||||
|
@ -325,6 +327,7 @@
|
|||
self.serverInfo().LocalAddress :
|
||||
self.serverInfo().RemoteAddress;
|
||||
|
||||
logger.log('Setting server address to ' + url);
|
||||
self.serverAddress(url);
|
||||
};
|
||||
|
||||
|
@ -341,7 +344,7 @@
|
|||
webSocket.onmessage = function (msg) {
|
||||
|
||||
msg = JSON.parse(msg.data);
|
||||
$(self).trigger("websocketmessage", [msg]);
|
||||
Events.trigger(self, 'websocketmessage', [msg]);
|
||||
};
|
||||
|
||||
webSocket.onopen = function () {
|
||||
|
@ -353,18 +356,18 @@
|
|||
|
||||
self.reportCapabilities(capabilities);
|
||||
|
||||
$(self).trigger("websocketopen");
|
||||
Events.trigger(self, 'websocketopen');
|
||||
|
||||
}, 500);
|
||||
};
|
||||
webSocket.onerror = function () {
|
||||
setTimeout(function () {
|
||||
$(self).trigger("websocketerror");
|
||||
Events.trigger(self, 'websocketerror');
|
||||
}, 0);
|
||||
};
|
||||
webSocket.onclose = function () {
|
||||
setTimeout(function () {
|
||||
$(self).trigger("websocketclose");
|
||||
Events.trigger(self, 'websocketclose');
|
||||
}, 0);
|
||||
};
|
||||
};
|
||||
|
@ -521,7 +524,7 @@
|
|||
}).done(done);
|
||||
}
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
deferred.resolveWith(null, []);
|
||||
return deferred.promise().done(done);
|
||||
};
|
||||
|
@ -1637,7 +1640,7 @@
|
|||
*/
|
||||
self.getAvailablePlugins = function (options) {
|
||||
|
||||
options = $.extend({}, options || {});
|
||||
options = options || {};
|
||||
options.PackageType = "UserInstalled";
|
||||
|
||||
var url = self.getUrl("Packages", options);
|
||||
|
@ -1980,7 +1983,7 @@
|
|||
throw new Error("File must be an image.");
|
||||
}
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
var reader = new FileReader();
|
||||
|
||||
|
@ -2042,7 +2045,7 @@
|
|||
|
||||
url += "/" + imageType;
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
var reader = new FileReader();
|
||||
|
||||
|
@ -2461,7 +2464,7 @@
|
|||
}).done(function (result) {
|
||||
|
||||
|
||||
$(self).trigger('authenticated', [result]);
|
||||
Events.trigger(self, 'authenticated', [result]);
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -3224,7 +3227,7 @@
|
|||
|
||||
if (self.isWebSocketOpen()) {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
var msg = JSON.stringify(options);
|
||||
|
||||
|
@ -3257,7 +3260,7 @@
|
|||
|
||||
if (self.isWebSocketOpen()) {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
var msg = JSON.stringify(options);
|
||||
|
||||
|
@ -3290,7 +3293,7 @@
|
|||
|
||||
if (self.isWebSocketOpen()) {
|
||||
|
||||
var deferred = $.Deferred();
|
||||
var deferred = Deferred.Deferred();
|
||||
|
||||
var msg = JSON.stringify(options);
|
||||
|
||||
|
|
7
dashboard-ui/thirdparty/apiclient/network.js
vendored
7
dashboard-ui/thirdparty/apiclient/network.js
vendored
|
@ -4,7 +4,7 @@
|
|||
|
||||
var self = this;
|
||||
|
||||
self.isOnline = function () {
|
||||
self.isNetworkAvailable = function () {
|
||||
|
||||
var online = navigator.onLine;
|
||||
|
||||
|
@ -14,6 +14,11 @@
|
|||
|
||||
return online;
|
||||
};
|
||||
|
||||
self.isAnyLocalNetworkAvailable = function () {
|
||||
|
||||
return self.isNetworkAvailable();
|
||||
};
|
||||
}
|
||||
|
||||
globalScope.NetworkStatus = new networkStatus();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue