diff --git a/dashboard-ui/scripts/mediaplayer-video.js b/dashboard-ui/scripts/mediaplayer-video.js index 708716f822..699af162c4 100644 --- a/dashboard-ui/scripts/mediaplayer-video.js +++ b/dashboard-ui/scripts/mediaplayer-video.js @@ -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' : ''; diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js index 1886ba67de..842da57f91 100644 --- a/dashboard-ui/scripts/mediaplayer.js +++ b/dashboard-ui/scripts/mediaplayer.js @@ -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(); diff --git a/dashboard-ui/scripts/selectserver.js b/dashboard-ui/scripts/selectserver.js index bd77d4b065..da15d18246 100644 --- a/dashboard-ui/scripts/selectserver.js +++ b/dashboard-ui/scripts/selectserver.js @@ -337,7 +337,7 @@ Dashboard.showLoadingMsg(); - ConnectionManager.getServers().done(function (servers) { + ConnectionManager.getAvailableServers().done(function (servers) { renderServers(page, servers); diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 020b5ad3b1..7a0d6f2de1 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -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()); diff --git a/dashboard-ui/thirdparty/apiclient/ajax.js b/dashboard-ui/thirdparty/apiclient/ajax.js new file mode 100644 index 0000000000..cf739d6695 --- /dev/null +++ b/dashboard-ui/thirdparty/apiclient/ajax.js @@ -0,0 +1,16 @@ +(function (globalScope) { + + globalScope.AjaxApi = { + + param: function(params) { + return jQuery.param(params); + }, + + ajax: function(request) { + + return jQuery.ajax(request); + } + + }; + +})(window); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/apiclient/connectionmanager.js b/dashboard-ui/thirdparty/apiclient/connectionmanager.js index 9a55f9a423..5080c4c6e9 100644 --- a/dashboard-ui/thirdparty/apiclient/connectionmanager.js +++ b/dashboard-ui/thirdparty/apiclient/connectionmanager.js @@ -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,88 +144,104 @@ 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) { + function onAuthenticated(apiClient, result, options, saveCredentials) { - apiClient.getSystemInfo().done(function (systemInfo) { + var server = apiClient.serverInfo; - var server = apiClient.serverInfo; - updateServerInfo(server, systemInfo); + var credentials = credentialProvider.credentials(); - var credentials = credentialProvider.credentials(); + server.DateLastAccessed = new Date().getTime(); - server.DateLastAccessed = new Date().getTime(); + if (saveCredentials) { + server.UserId = result.User.Id; + server.AccessToken = result.AccessToken; + } else { + server.UserId = null; + server.AccessToken = null; + } - if (saveCredentials) { - server.UserId = result.User.Id; - server.AccessToken = result.AccessToken; - } else { - server.UserId = null; - server.AccessToken = null; - } + credentials.addOrUpdateServer(credentials.servers, server); + saveUserInfoIntoCredentials(server, result.User); + credentialProvider.credentials(credentials); - credentials.addOrUpdateServer(credentials.servers, server); - credentialProvider.credentials(credentials); + afterConnected(apiClient, options); - ensureWebSocket(apiClient); - - onLocalUserSignIn(result.User); - - }); + onLocalUserSignIn(result.User); } - function ensureWebSocket(apiClient) { + function saveUserInfoIntoCredentials(server, user) { - if (!apiClient.isWebSocketOpenOrConnecting && apiClient.isWebSocketSupported()) { - apiClient.openWebSocket(); + //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); - connectUser = null; - - $(self).trigger('signedout'); + if (connectUser) { + connectUser = null; + 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,23 +568,41 @@ 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()) { - self.connectToServers(servers).done(function (result) { + deferred.resolveWith(null, [self.getOffineResult()]); + isResolved = true; + } + } - deferred.resolveWith(null, [result]); + if (!isResolved) { + self.getAvailableServers().done(function (servers) { + self.connectToServers(servers).done(function (result) { + + deferred.resolveWith(null, [result]); + + }); }); - }); + } 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,132 +655,194 @@ return deferred.promise(); }; - self.connectToServer = function (server) { + function beginWakeServer(server) { - var deferred = $.Deferred(); + } - function onLocalServerTokenValidationDone(connectionMode, credentials) { + self.connectToServer = function (server, options) { - credentialProvider.addOrUpdateServer(credentials.servers, server); - server.DateLastAccessed = new Date().getTime(); + var deferred = Deferred.Deferred(); - credentialProvider.credentials(credentials); + var tests = []; - var result = { - Servers: [] - }; + 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); } - result.ApiClient = getOrAddApiClient(server, connectionMode); - result.State = server.AccessToken ? - MediaBrowser.ConnectionState.SignedIn : - MediaBrowser.ConnectionState.ServerSignIn; + var isLocalNetworkAvailable = NetworkStatus.isAnyLocalNetworkAvailable(); + var sendWakeOnLan = server.WakeOnLanInfos && server.WakeOnLanInfos.length && isLocalNetworkAvailable; - result.ApiClient.enableAutomaticNetworking(server, connectionMode); - - if (result.State == MediaBrowser.ConnectionState.SignedIn) { - ensureWebSocket(result.ApiClient); - } - - result.Servers.push(server); - - deferred.resolveWith(null, [result]); - - $(self).trigger('connected', [result]); + if (sendWakeOnLan) { + beginWakeServer(server); } - function onExchangeTokenDone(connectionMode, credentials) { + var wakeOnLanSendTime = new Date().getTime(); - if (server.AccessToken) { - validateAuthentication(server, connectionMode).always(function() { - - onLocalServerTokenValidationDone(connectionMode, credentials); - }); - } else { - onLocalServerTokenValidationDone(connectionMode, credentials); - } - } - - 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(); - } + 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); + + server.DateLastAccessed = new Date().getTime(); + server.LastConnectionMode = connectionMode; + credentialProvider.addOrUpdateServer(credentials.servers, server); + credentialProvider.credentials(credentials); + + var result = { + Servers: [] + }; + + result.ApiClient = getOrAddApiClient(server, connectionMode); + result.State = server.AccessToken ? + MediaBrowser.ConnectionState.SignedIn : + MediaBrowser.ConnectionState.ServerSignIn; + + result.Servers.push(server); + result.ApiClient.enableAutomaticNetworking(server, connectionMode); + + if (result.State == MediaBrowser.ConnectionState.SignedIn) { + afterConnected(result.ApiClient, options); + } + + deferred.resolveWith(null, [result]); + + 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: + throw new Error("Unexpected ConnectionMode"); + } + }; + self.connectToAddress = function (address) { if (address.toLowerCase().indexOf('http') != 0) { 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); \ No newline at end of file +})(window, window.Logger); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/apiclient/deferred.js b/dashboard-ui/thirdparty/apiclient/deferred.js new file mode 100644 index 0000000000..e5f2ef27ac --- /dev/null +++ b/dashboard-ui/thirdparty/apiclient/deferred.js @@ -0,0 +1,16 @@ +(function (globalScope) { + + globalScope.Deferred = { + + Deferred: function () { + return jQuery.Deferred(); + }, + + when: function (promises) { + + return jQuery.when(promises); + } + + }; + +})(window); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/apiclient/deferredAlt.js b/dashboard-ui/thirdparty/apiclient/deferredAlt.js new file mode 100644 index 0000000000..80987fc0ef --- /dev/null +++ b/dashboard-ui/thirdparty/apiclient/deferredAlt.js @@ -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); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/apiclient/events.js b/dashboard-ui/thirdparty/apiclient/events.js new file mode 100644 index 0000000000..754f5525bc --- /dev/null +++ b/dashboard-ui/thirdparty/apiclient/events.js @@ -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); \ No newline at end of file diff --git a/dashboard-ui/thirdparty/apiclient/mediabrowser.apiclient.js b/dashboard-ui/thirdparty/apiclient/mediabrowser.apiclient.js index d4b4512919..b51bde8785 100644 --- a/dashboard-ui/thirdparty/apiclient/mediabrowser.apiclient.js +++ b/dashboard-ui/thirdparty/apiclient/mediabrowser.apiclient.js @@ -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); diff --git a/dashboard-ui/thirdparty/apiclient/network.js b/dashboard-ui/thirdparty/apiclient/network.js index 04f0bf8550..664072c827 100644 --- a/dashboard-ui/thirdparty/apiclient/network.js +++ b/dashboard-ui/thirdparty/apiclient/network.js @@ -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();