From 22eb703c6571a9e03aec87d58d3c0948c06f2231 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 15 Sep 2014 23:33:30 -0400 Subject: [PATCH] fixes #295 - Add play to vlc option --- dashboard-ui/css/fonts/gotham-book.woff | Bin 62035 -> 0 bytes dashboard-ui/css/fonts/mblogo.eot | Bin 0 -> 8874 bytes dashboard-ui/css/fonts/mblogo.ttf | Bin 0 -> 8732 bytes dashboard-ui/css/fonts/mblogo.woff | Bin 0 -> 3108 bytes dashboard-ui/css/librarybrowser.css | 3 +- dashboard-ui/css/librarymenu.css | 6 +- dashboard-ui/css/site.css | 7 +- dashboard-ui/mypreferenceswebclient.html | 10 + dashboard-ui/scripts/extensions.js | 40 -- dashboard-ui/scripts/externalplayer.js | 411 ++++++++++++++++++ dashboard-ui/scripts/librarybrowser.js | 13 +- dashboard-ui/scripts/librarylist.js | 16 + dashboard-ui/scripts/librarymenu.js | 2 +- .../scripts/mypreferenceswebclient.js | 24 + dashboard-ui/scripts/userprofilespage.js | 2 +- .../thirdparty/mediabrowser.apiclient.js | 72 ++- 16 files changed, 545 insertions(+), 61 deletions(-) delete mode 100644 dashboard-ui/css/fonts/gotham-book.woff create mode 100644 dashboard-ui/css/fonts/mblogo.eot create mode 100644 dashboard-ui/css/fonts/mblogo.ttf create mode 100644 dashboard-ui/css/fonts/mblogo.woff create mode 100644 dashboard-ui/scripts/externalplayer.js diff --git a/dashboard-ui/css/fonts/gotham-book.woff b/dashboard-ui/css/fonts/gotham-book.woff deleted file mode 100644 index 9b7e60f4c306a50cc830a1a381b1a4176f37516d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62035 zcmV)iK%&2QPew*hR8&s@0P<4+3;+NC0rV6A00000000000000000000000000000( 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

qNiUA@`Yr$EJC#cI*_N#C)%eT$fk4i96+x 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 diff --git a/dashboard-ui/css/fonts/mblogo.eot b/dashboard-ui/css/fonts/mblogo.eot new file mode 100644 index 0000000000000000000000000000000000000000..4067fab007bdf2d9f492650cbbfe1d1fee2af8fa GIT binary patch literal 8874 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 literal 0 HcmV?d00001 diff --git a/dashboard-ui/css/fonts/mblogo.ttf b/dashboard-ui/css/fonts/mblogo.ttf new file mode 100644 index 0000000000000000000000000000000000000000..212e67c4043c57a4c33fa57d28048aab97cca5dd GIT binary patch literal 8732 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 literal 0 HcmV?d00001 diff --git a/dashboard-ui/css/fonts/mblogo.woff b/dashboard-ui/css/fonts/mblogo.woff new file mode 100644 index 0000000000000000000000000000000000000000..86e8833068a3880e57a6a3d508a40cb3521e25bb GIT binary patch literal 3108 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 Mx)K27X^>UmKldql+5i9m literal 0 HcmV?d00001 diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index 4fe5844dc1..0f876d605c 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -566,7 +566,8 @@ a.itemTag:hover { .libraryPanelHeader { margin: 5px 0 15px 0; font-size: 15px; - font-family: Gotham; + font-family: MBLogo; + font-weight: 200; } .libraryPanelHeader a { diff --git a/dashboard-ui/css/librarymenu.css b/dashboard-ui/css/librarymenu.css index 2b44988f82..3be58fb6ba 100644 --- a/dashboard-ui/css/librarymenu.css +++ b/dashboard-ui/css/librarymenu.css @@ -135,7 +135,11 @@ padding-left: 0 !important; margin-left: -8px; cursor: default; - font-family: Gotham; +} + +.logoLibraryMenuButtonText { + font-family: MBLogo; + font-weight: 200; } .viewMenuBar { diff --git a/dashboard-ui/css/site.css b/dashboard-ui/css/site.css index 5aed1f4409..1e0af4be05 100644 --- a/dashboard-ui/css/site.css +++ b/dashboard-ui/css/site.css @@ -62,10 +62,11 @@ } @font-face { - font-family: 'Gotham'; + font-family: 'MBLogo'; font-style: normal; - font-weight: 300; - src: local('Gotham'), url(fonts/gotham-book.woff) format('woff'); + font-weight: 200; + src: url('fonts/mblogo.eot'); + src: url('fonts/mblogo.eot?#iefix') format('embedded-opentype'), url('fonts/mblogo.woff') format('woff'), url('fonts/mblogo.ttf') format('truetype'); } * { diff --git a/dashboard-ui/mypreferenceswebclient.html b/dashboard-ui/mypreferenceswebclient.html index f2805bf8e0..14f4bb8253 100644 --- a/dashboard-ui/mypreferenceswebclient.html +++ b/dashboard-ui/mypreferenceswebclient.html @@ -108,6 +108,16 @@ +

+
+ ${LabelExternalPlayers} + + +
+
${LabelExternalPlayersHelp}
+
+ +
  • diff --git a/dashboard-ui/scripts/extensions.js b/dashboard-ui/scripts/extensions.js index c819ecbae0..46b9949732 100644 --- a/dashboard-ui/scripts/extensions.js +++ b/dashboard-ui/scripts/extensions.js @@ -525,44 +525,4 @@ function ticks_to_human(str) { } }; -})(window); - -(function (window) { - - function myStore(defaultObject) { - - var self = this; - self.localData = {}; - - self.setItem = function (name, value) { - - if (defaultObject) { - defaultObject.setItem(name, value); - } else { - self.localData[name] = value; - } - }; - - self.getItem = function (name) { - - if (defaultObject) { - return defaultObject.getItem(name); - } - - return self.localData[name]; - }; - - self.removeItem = function (name) { - - if (defaultObject) { - defaultObject.removeItem(name); - } else { - self.localData[name] = null; - } - }; - } - - window.store = new myStore(window.localStorage); - window.sessionStore = new myStore(window.sessionStorage); - })(window); \ No newline at end of file diff --git a/dashboard-ui/scripts/externalplayer.js b/dashboard-ui/scripts/externalplayer.js new file mode 100644 index 0000000000..a87ec01c03 --- /dev/null +++ b/dashboard-ui/scripts/externalplayer.js @@ -0,0 +1,411 @@ +(function (window, store) { + + function getExternalPlayers() { + return JSON.parse(store.getItem('externalplayers') || '[]'); + } + + function getUrl(player, item) { + + return 'vlc://http://www.google.com'; + + } + + function getCodecLimits() { + + return { + + maxVideoAudioChannels: 6, + maxAudioChannels: 2, + maxVideoLevel: 50, + maxWidth: 1920, + maxHeight: 1080, + maxSampleRate: 48000 + + }; + } + + function canDirectStream(mediaType, mediaSource, maxBitrate) { + + // If bitrate is unknown don't direct stream + if (!mediaSource.Bitrate || mediaSource.Bitrate > maxBitrate) { + return false; + } + + var codecLimits = getCodecLimits(); + + if (mediaType == "Audio") { + + return true; + } + else if (mediaType == "Video") { + + var videoStream = mediaSource.MediaStreams.filter(function (s) { + + return s.Type == 'Video'; + + })[0]; + + if (!videoStream) { + return false; + } + + return mediaSource.Protocol == 'File'; + } + + throw new Error('Unrecognized MediaType'); + } + + function canPlayAudioStreamDirect(audioStream, isVideo) { + + var audioCodec = (audioStream.Codec || '').toLowerCase().replace('-', ''); + + if (audioCodec.indexOf('aac') == -1 && + audioCodec.indexOf('mp3') == -1 && + audioCodec.indexOf('mpeg') == -1) { + + return false; + } + + var codecLimits = getCodecLimits(); + + var maxChannels = isVideo ? codecLimits.maxVideoAudioChannels : codecLimits.maxAudioChannels; + + if (!audioStream.Channels || audioStream.Channels > maxChannels) { + return false; + } + + if (!audioStream.SampleRate || audioStream.SampleRate > codecLimits.maxSampleRate) { + return false; + } + + var bitrate = audioStream.BitRate; + if (!bitrate) { + return false; + } + + if (isVideo) { + + if (audioCodec.indexOf('aac') != -1 && bitrate > 768000) { + return false; + } + if (audioCodec.indexOf('mp3') != -1 || audioCodec.indexOf('mpeg') != -1) { + if (bitrate > 320000) { + return false; + } + } + + } else { + if (bitrate > 320000) { + return false; + } + } + + return true; + } + + function isSupportedCodec(mediaType, mediaSource) { + + if (mediaType == "Audio") { + return false; + } + else if (mediaType == "Video") { + + return mediaSource.MediaStreams.filter(function (m) { + + return m.Type == "Video" && (m.Codec || '').toLowerCase() == 'h264'; + + }).length > 0; + } + + throw new Error('Unrecognized MediaType'); + } + + function getStreamByIndex(streams, type, index) { + return streams.filter(function (s) { + + return s.Type == type && s.Index == index; + + })[0]; + } + + function getMediaSourceInfo(item, maxBitrate, mediaSourceId, audioStreamIndex, subtitleStreamIndex) { + + var sources = item.MediaSources.filter(function (m) { + + m.audioStream = mediaSourceId == m.Id && audioStreamIndex != null ? + getStreamByIndex(m.MediaStreams, 'Audio', audioStreamIndex) : + getStreamByIndex(m.MediaStreams, 'Audio', m.DefaultAudioStreamIndex); + + if (item.MediaType == "Audio" && !m.audioStream) { + m.audioStream = m.MediaStreams.filter(function (s) { + return s.Type == 'Audio'; + })[0]; + } + + m.subtitleStream = mediaSourceId == m.Id && subtitleStreamIndex != null ? + getStreamByIndex(m.MediaStreams, 'Subtitle', subtitleStreamIndex) : + getStreamByIndex(m.MediaStreams, 'Subtitle', m.DefaultSubtitleStreamIndex); + + return !mediaSourceId || m.Id == mediaSourceId; + + }); + + // Find first one that can be direct streamed + var source = sources.filter(function (m) { + + var audioStream = m.audioStream; + + if (!audioStream || !canPlayAudioStreamDirect(audioStream, item.MediaType == 'Video')) { + return false; + } + + if (m.subtitleStream) { + return false; + } + + return canDirectStream(item.MediaType, m, maxBitrate, audioStream); + + })[0]; + + if (source) { + return { + mediaSource: source, + isStatic: true, + streamContainer: source.Container + }; + } + + // Find first one with supported codec + source = sources.filter(function (m) { + + return isSupportedCodec(item.MediaType, m); + + })[0]; + + source = source || sources[0]; + + var container = item.MediaType == 'Audio' ? 'mp3' : 'm3u8'; + + // Default to first one + return { + mediaSource: source, + isStatic: false, + streamContainer: container + }; + } + + function getStreamInfo(serverAddress, deviceId, item, startPositionTicks, maxBitrate, mediaSourceId, audioStreamIndex, subtitleStreamIndex) { + + var mediaSourceInfo = getMediaSourceInfo(item, maxBitrate, mediaSourceId, audioStreamIndex, subtitleStreamIndex); + + var url = getStreamUrl(serverAddress, deviceId, item.MediaType, item.Id, mediaSourceInfo, startPositionTicks, maxBitrate); + + if (mediaSourceInfo.subtitleStream) { + url += "&SubtitleStreamIndex=" + mediaSourceInfo.Index; + } + + mediaSourceInfo.url = url; + + return mediaSourceInfo; + } + + function getStreamUrl(serverAddress, deviceId, mediaType, itemId, mediaSourceInfo, startPositionTicks, maxBitrate) { + + var url; + + var codecLimits = getCodecLimits(); + + if (mediaType == 'Audio') { + + url = serverAddress + '/mediabrowser/audio/' + itemId + '/stream.' + mediaSourceInfo.streamContainer; + + url += '?mediasourceid=' + mediaSourceInfo.mediaSource.Id; + + if (mediaSourceInfo.isStatic) { + url += '&static=true'; + + } else { + + url += '&maxaudiochannels=' + codecLimits.maxAudioChannels; + + if (startPositionTicks) { + url += '&startTimeTicks=' + startPositionTicks.toString(); + } + + if (maxBitrate) { + url += '&audiobitrate=' + Math.min(maxBitrate, 320000).toString(); + } + + url += '&deviceId=' + deviceId; + } + + return url; + + } + else if (mediaType == 'Video') { + + if (mediaSourceInfo.isStatic) { + url = serverAddress + '/mediabrowser/videos/' + itemId + '/stream.' + mediaSourceInfo.streamContainer + '?static=true'; + } + else { + url = serverAddress + '/mediabrowser/videos/' + itemId + '/stream.' + mediaSourceInfo.streamContainer + '?static=false'; + } + + url += '&maxaudiochannels=' + codecLimits.maxVideoAudioChannels; + + if (maxBitrate) { + + var audioRate = 320000; + url += '&audiobitrate=' + audioRate.toString(); + url += '&videobitrate=' + (maxBitrate - audioRate).toString(); + } + + url += '&profile=high'; + url += '&level=41'; + + url += '&maxwidth=' + codecLimits.maxWidth; + url += '&maxheight=' + codecLimits.maxHeight; + + url += '&videoCodec=h264'; + url += '&audioCodec=aac'; + + url += '&mediasourceid=' + mediaSourceInfo.mediaSource.Id; + url += '&deviceId=' + deviceId; + + return url; + } + + throw new Error('Unrecognized MediaType'); + } + + function getVideoUrl(item) { + + var maxBitrate = parseInt(store.getItem('preferredVideoBitrate') || '') || 1500000; + + var info = getStreamInfo(ApiClient.serverAddress(), ApiClient.deviceId(), item, null, maxBitrate); + + return info.url; + } + + function getPlayerUrl(item, player) { + + return player.scheme.replace('{0}', getVideoUrl(item)); + } + + function showPostPlayMenu(item, userId) { + + $('.externalPlayerPostPlayFlyout').popup("close").remove(); + + var html = '
    '; + + html += '
      '; + html += '
    • ' + Globalize.translate('HeaderExternalPlayerPlayback') + '
    • '; + html += '
    '; + + html += '
    '; + + if (item.RunTimeTicks) { + html += '
    '; + html += ''; + html += ''; + html += '
    ' + Globalize.translate('OptionMarkWatchedHelp') + '
    '; + html += '
    '; + + html += '
    '; + } + + html += ''; + + html += '
    '; + + html += '
    '; + + $(document.body).append(html); + + var elem = $('.externalPlayerPostPlayFlyout').popup({}).trigger('create').popup("open").on("popupafterclose", function () { + + $(this).off("popupafterclose").remove(); + + }); + + $('.btnDone', elem).on('click', function () { + + $('.externalPlayerPostPlayFlyout').popup("close").remove(); + + ApiClient.stopActiveEncodings(); + + if ($('#chkMarkWatched', elem).checked()) { + + ApiClient.markPlayed(userId, item.Id, new Date()); + + } + }); + + } + + function closePlayMenu() { + $('.externalPlayerFlyout').popup("close").remove(); + } + + function showMenuForItem(item, userId) { + + closePlayMenu(); + + var html = '
    '; + + html += '
      '; + html += '
    • ' + Globalize.translate('HeaderSelectExternalPlayer') + '
    • '; + html += '
    '; + + html += '
    '; + + html += getExternalPlayers().map(function (p) { + + return '' + p.name + ''; + + }).join(''); + + html += '
    '; + + html += '
    '; + + $(document.body).append(html); + + var elem = $('.externalPlayerFlyout').popup({}).trigger('create').popup("open").on("popupafterclose", function () { + + $(this).off("popupafterclose").remove(); + + }); + + $('.btnExternalPlayer', elem).on('click', function () { + + closePlayMenu(); + + setTimeout(function () { + + showPostPlayMenu(item, userId); + }, 500); + }); + } + + function showPlayMenu(itemId) { + + var userId = Dashboard.getCurrentUserId(); + + ApiClient.getItem(userId, itemId).done(function (item) { + + setTimeout(function () { + + showMenuForItem(item, userId); + }, 500); + }); + } + + window.ExternalPlayer = { + + getUrl: getUrl, + getExternalPlayers: getExternalPlayers, + showMenu: showPlayMenu + }; + +})(window, window.store); \ No newline at end of file diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index 11ef46dc0f..163d0e53ac 100644 --- a/dashboard-ui/scripts/librarybrowser.js +++ b/dashboard-ui/scripts/librarybrowser.js @@ -238,9 +238,14 @@ showPlayMenu: function (positionTo, itemId, itemType, isFolder, mediaType, resumePositionTicks, showAddToPlaylist) { + var externalPlayers = ExternalPlayer.getExternalPlayers(); + if (!resumePositionTicks && mediaType != "Audio" && !isFolder) { - MediaController.play(itemId); - return; + + if (!externalPlayers.length || mediaType != "Video") { + MediaController.play(itemId); + return; + } } $('.playFlyout').popup("close").remove(); @@ -252,6 +257,10 @@ html += '
  • ' + Globalize.translate('ButtonPlay') + '
  • '; + if (!isFolder && externalPlayers.length) { + html += '
  • ' + Globalize.translate('ButtonPlayExternalPlayer') + '
  • '; + } + if (resumePositionTicks) { html += '
  • ' + Globalize.translate('ButtonResume') + '
  • '; } diff --git a/dashboard-ui/scripts/librarylist.js b/dashboard-ui/scripts/librarylist.js index a89d90ab97..1b607d1b49 100644 --- a/dashboard-ui/scripts/librarylist.js +++ b/dashboard-ui/scripts/librarylist.js @@ -234,6 +234,17 @@ return false; } + function onExternalPlayerButtonClick() { + + closeContextMenu(); + + var id = this.getAttribute('data-itemid'); + + ExternalPlayer.showMenu(id); + + return false; + } + function onPlayAllFromHereButtonClick() { var index = this.getAttribute('data-index'); @@ -358,6 +369,10 @@ } } + if (mediaType == 'Video' && ExternalPlayer.getExternalPlayers().length) { + html += '
  • ' + Globalize.translate('ButtonPlayExternalPlayer') + '
  • '; + } + if (playbackPositionTicks && mediaType != "Audio") { html += '
  • ' + Globalize.translate('ButtonResume') + '
  • '; } @@ -405,6 +420,7 @@ $('.btnRemoveFromPlaylist', elem).on('click', onRemoveFromPlaylistButtonClick); $('.btnPlayAllFromHere', elem).on('click', onPlayAllFromHereButtonClick); $('.btnQueueAllFromHere', elem).on('click', onQueueAllFromHereButtonClick); + $('.btnExternalPlayer', elem).on('click', onExternalPlayerButtonClick); }); } diff --git a/dashboard-ui/scripts/librarymenu.js b/dashboard-ui/scripts/librarymenu.js index 2042c0b446..84c9278bd0 100644 --- a/dashboard-ui/scripts/librarymenu.js +++ b/dashboard-ui/scripts/librarymenu.js @@ -332,7 +332,7 @@ //} else if ($(page).hasClass('allLibraryPage') || $(page).hasClass('type-interior')) { - $('.libraryMenuButtonText').html('MEDIABROWSER'); + $('.libraryMenuButtonText').html('MEDIABROWSER'); } } diff --git a/dashboard-ui/scripts/mypreferenceswebclient.js b/dashboard-ui/scripts/mypreferenceswebclient.js index d936e793ce..f6d90710a5 100644 --- a/dashboard-ui/scripts/mypreferenceswebclient.js +++ b/dashboard-ui/scripts/mypreferenceswebclient.js @@ -2,6 +2,19 @@ function loadForm(page, userId, displayPreferences) { + var externalPlayers = JSON.parse(store.getItem('externalplayers') || '[]'); + + $('.chkExternalPlayer', page).each(function () { + + var chk = this; + chk.checked = externalPlayers.filter(function (p) { + + return p.name == chk.getAttribute('data-name'); + + }).length > 0; + + }).checkboxradio('refresh'); + $('#selectThemeSong', page).val(store.getItem('enableThemeSongs-' + userId) || '').selectmenu("refresh"); $('#selectBackdrop', page).val(store.getItem('enableBackdrops-' + userId) || '').selectmenu("refresh"); @@ -36,6 +49,17 @@ Dashboard.showLoadingMsg(); + var externalPlayers = $('.chkExternalPlayer:checked', page).get().map(function (i) { + + return { + name: i.getAttribute('data-name'), + scheme: i.getAttribute('data-scheme') + }; + + }); + + store.setItem('externalplayers', JSON.stringify(externalPlayers)); + var userId = getParameterByName('userId') || Dashboard.getCurrentUserId(); ApiClient.getDisplayPreferences('home', userId, 'webclient').done(function (result) { diff --git a/dashboard-ui/scripts/userprofilespage.js b/dashboard-ui/scripts/userprofilespage.js index 455847d2ba..8886d59d57 100644 --- a/dashboard-ui/scripts/userprofilespage.js +++ b/dashboard-ui/scripts/userprofilespage.js @@ -38,7 +38,7 @@ var html = '
    '; html += '
      '; - html += '
    • Menu
    • '; + html += '
    • ' + Globalize.translate('HeaderMenu') + '
    • '; html += '
    • ' + Globalize.translate('ButtonDelete') + '
    • '; diff --git a/dashboard-ui/thirdparty/mediabrowser.apiclient.js b/dashboard-ui/thirdparty/mediabrowser.apiclient.js index a78c50c165..fa69dfa290 100644 --- a/dashboard-ui/thirdparty/mediabrowser.apiclient.js +++ b/dashboard-ui/thirdparty/mediabrowser.apiclient.js @@ -1,8 +1,59 @@ -if (!window.MediaBrowser) { +(function (window) { + + function myStore(defaultObject) { + + var self = this; + self.localData = {}; + + var isDefaultAvailable; + + if (defaultObject) { + try { + defaultObject.setItem('_test', '0'); + isDefaultAvailable = true; + } catch (e) { + + } + } + + self.setItem = function (name, value) { + + if (isDefaultAvailable) { + defaultObject.setItem(name, value); + } else { + self.localData[name] = value; + } + }; + + self.getItem = function (name) { + + if (isDefaultAvailable) { + return defaultObject.getItem(name); + } + + return self.localData[name]; + }; + + self.removeItem = function (name) { + + if (isDefaultAvailable) { + defaultObject.removeItem(name); + } else { + self.localData[name] = null; + } + }; + } + + window.store = new myStore(window.localStorage); + window.sessionStore = new myStore(window.sessionStorage); + +})(window); + +if (!window.MediaBrowser) { window.MediaBrowser = {}; } -MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, window, FileReader, localStorage) { +MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, window, FileReader, store) { function generateDeviceId() { @@ -13,17 +64,14 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi var randomId = ''; - if (localStorage) { + // Since the above is not guaranteed to be unique per device, add a little more + randomId = store.getItem('randomId'); - // Since the above is not guaranteed to be unique per device, add a little more - randomId = localStorage.getItem('randomId'); + if (!randomId) { - if (!randomId) { + randomId = new Date().getTime(); - randomId = new Date().getTime(); - - localStorage.setItem('randomId', randomId.toString()); - } + store.setItem('randomId', randomId.toString()); } keys.push(randomId); @@ -70,7 +118,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi return currentUserId; }; - self.accessToken = function() { + self.accessToken = function () { return accessToken; }; @@ -3226,7 +3274,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi }; -}(jQuery, navigator, window.JSON, window.WebSocket, setTimeout, window, window.FileReader, window.localStorage); +}(jQuery, navigator, window.JSON, window.WebSocket, setTimeout, window, window.FileReader, window.store); /** * Provides a friendly way to create an api client instance using information from the browser's current url